前言
為什么我們使用chatgpt問一個問題,回答時,他是一個字或者一個詞一個詞的蹦出來,感覺是有個人在輸入,顯得很高級,其實這這一個詞一個詞蹦不是為了高級感,而是他的實現原理決定的,下面我們看下為什么是一個一個蹦出來的
?
大模型的本質
特斯拉前AI總監Andrej Karpathy將大語言模型簡單的描述為: 大模型的本質就是兩個文件,一個是參數文件,一個是包含運行這些參數的代碼文件。
參數文件是組成整個神經網絡的權重,代碼文件是用來運行這個神經網絡的代碼,可以是C或者其他任何編程語言寫的,當然目前主要都是Python
?
那么接下來的問題就是:參數從哪里來?
這就引到了模型訓練。
本質上來說,大模型訓練就是對互聯網數據進行有損壓縮(大約10TB文本),需要一個巨大的GPU集群來完成。
以700億參數的Llama 2(Facebook開源的羊駝大模型)為例,就需要6000塊GPU,然后花上12天得到一個大約140GB的“壓縮文件”,整個過程耗費大約200萬美元。
而有了“壓縮文件”,模型就等于靠這些數據對世界形成了理解。
大模型是如何工作的
簡單來說,大模型的工作原理就是依靠這些壓縮數據的神經網絡對所給序列中的下一個單詞進行預測。
?
比如我們問將“中 華 人民 ”輸入進去后,請大模型補充完整,可以想象是分散在整個網絡中的十億、上百億參數依靠神經元相互連接,順著這種連接就找到了下一個連接的詞,然后給出概率,比如“共和國(97%)”,就形成了“中華人民共和國”的完整句子。然后繼續將“中華人民共和國”作為輸入,繼續依·靠神經元相互連接,順著這種連接就找到了下一個連接的詞,然后給出概率,比如“中華人民共和國 成立于1949年(98%)”.
根據維基百科我們可以看到中華人民共和國出現了571次,概率非常大,實際上大模型就是對給出序列的下一個詞的概率預測
?
這就是為什么我們剛才講大語言模型都是一個詞一個詞的蹦了,你可以理解大模型就是一個很牛逼的成語接龍大師
?
那么大模型又是如何訓練,并預測下一個詞的呢?
?
神經網絡
看到“神經網絡”幾個字就覺得復雜了不往下看了,別緊張,一點都不復雜,讓我們繼續看。
歷史上,科學家一直希望模擬人的大腦,造出可以思考的機器。人為什么能夠思考?科學家發現,原因在于人體的神經網絡。
?
?外部刺激通過神經末梢,轉化為電信號,轉導到神經細胞(又叫神經元)。
?無數神經元構成神經中樞。
?神經中樞綜合各種信號,、做出判斷。
?人體根據神經中樞的指令,對外部刺激做出反應。
感知器
最簡單的神經網絡“感知器”,早在1957年就被發明,并使用了.直到今天還在用
上圖的圓圈就代表一個感知器。它接受多個輸入(x1,x2,x3...),產生一個輸出(output),好比神經末梢感受各種外部環境的變化,最后產生電信號。
為了簡化模型,我們約定每種輸入只有兩種可能:1 或 0。如果所有輸入都是1,表示各種條件都成立,輸出就是1;如果所有輸入都是0,表示條件都不成立,輸出就是0。
?
下面來看一個例子。最近剛上映一部好萊塢大片,張三拿不定主意。周末要不要去看電影.
決定他要不要去看電影有三個因素(特征)。
?天氣:周末是否晴天?
?價格:票價是否可承受?
?女朋友:能否找到女朋友一起去?
這就構成一個感知器。上面三個因素就是外部輸入,最后的決定就是感知器的輸出。如果三個因素都是 Yes(使用1表示),輸出就是1(去看電影);如果都是 No(使用0表示),輸出就是0(不去看電影)。
?
權重和閾值
那么:如果某些因素成立,另一些因素不成立,輸出是什么?比如,周末是好天氣,票價也不貴,但是張三找不到女朋友,他還會不會去看電影呢?
現實中,各種因素很少具有同等重要性:某些因素是決定性因素,另一些因素是次要因素。因此,可以給這些因素指定權重(weight),代表它們不同的重要性。
?天氣:權重為8
?價格:權重為4
?女朋友:權重為4
上面的權重表示,天氣是決定性因素,女朋友和價格都是次要因素。
?
如果三個因素都為1,它們乘以權重的總和就是 8 + 4 + 4 = 16。
如果天氣和價格因素為1,女朋友因素為0,總和就變為 8 + 0 + 4 = 12。
這時,還需要指定一個閾值(threshold)。如果總和大于閾值,感知器輸出1,否則輸出0。假定閾值為8,那么 12 > 8,小明決定去看電影。閾值的高低代表了意愿的強烈,閾值越低就表示越想去,越高就越不想去。
這就是一個包含了輸入層、隱藏層、輸出層、權重的一個非常簡單的神經網絡例子。當然實際場景會比這個更復雜,對于神經網絡小白來說,已有了一個感性的認識.
?
上面圖中的連接是神經元中最重要的東西。每一個連接上都有一個權重。
上面我們自定義了幾個因素的權重
?天氣:權重為8
?價格:權重為4
?女朋友:權重為4
但是實際情況,這個權重我們只是初始化了一個值,通過大量的數據進行訓練,然后不斷的調整得到的權重值.例如隨機利用1萬人的習慣數據,他們是否都是天氣好的時候去看電影,沒女朋友的時候不去看電影等等.這個權重值就是經過訓練不斷更新得到的.這樣就可以預測張三會不會去看電影
?
這就是一個簡單的神經網絡,一個神經網絡的訓練過程就是讓權重的值調整到最佳,以使得整個網絡的預測效果最好。最終的訓練結果可能是“女朋友”這個權重占98,其他都是次要的
?
玩一玩神經網絡
上面我們講的都是一些簡單的例子,下面我們看一個簡單神經網絡在線演示和實驗的平臺
TenforFlow Playground 又名 TensorFlow 游樂場,是一個用來圖形化教學的簡單神經網絡在線演示和實驗的平臺,非常強大且極其易用。如果您已經有一部分神經網絡知識,使用此工具,可以快速體驗一個算法工程師的調參工作。
在線體驗地址: http://playground.tensorflow.org/
開源github地址:https://github.com/tensorflow/playground?
?
下圖可簡單理解為,正在訓練1萬人,以天氣、價格、女朋友這三個特征,進行訓練,判斷什么情況下會,人們會去看電影、什么情況下不會去看電影
上圖標明了該頁面上每個部分的含義,剛開始不用全部都理解,感興趣再去研究每部分都是干嘛的,下面列了理解該頁面的一些解釋。
?
1.運行控制區,這里主要對算法執行進行控制,可以啟動、暫停和重置
2.迭代次數展示區,這里展示當前算法執行到了哪一次迭代
3.超參數選擇區,這里可以調整算法的一些超參數,不同的超參能解決不同的算法問題,得到不同的效果
4.數據集調整區,數據集定義了我們要解決怎樣的問題,數據集是機器學習最為重要的一環,
5.特征向量選擇,從數據集中抓取出的可以用來被訓練的特征值
6.神經網絡區域,算法工程師構建的用于數據擬合的網絡
7.預測結果區,展示此算法的預測結果
?
一些名詞解釋
?參數:通常是指網絡中可以通過訓練數據自動學習和調整的那些數值,例如權重(weights)和偏置(biases)。這些參數是模型在學習過程中不斷調整的,以便更好地預測或分類數據。
?超參數:則是指那些控制訓練過程本身的參數。不同于模型參數,超參數通常是在訓練開始之前設置的,并且在訓練過程中保持不變。換句話說,超參數是用來定義模型結構(例如有多少層、每層有多少個神經元)和控制訓練過程(例如學習速率、訓練輪數)的高級設置。
?線性:指的是一種直接比例關系,即輸出直接隨輸入按固定比例變化。用通俗的話說,就像你加速汽車,速度的增加與你踩油門的力度成正比。比如,假設你的工資是按小時計算的,這時候工資(輸出)和工作時間(輸入)之間就是線性關系。
?非線性:則是指輸出和輸入之間的關系不是直接比例的,即輸出不會直接隨輸入按固定比例變化。通俗來說,就像你對一只橡皮筋施力,開始時很容易拉長,但越往后拉越難,力的增加和橡皮筋的伸長之間就是非線性關系。在現實生活中,很多復雜的現象(如天氣變化)都是非線性的。
?激活函數:在神經網絡中用來引入非線性因素,使得網絡能夠學習和模擬復雜的輸入與輸出之間的關系。簡單來說,激活函數就像是決定神經元是否應該被激活(即對信息做出反應)的開關。例如,ReLU(Rectified Linear Unit,修正線性單元)激活函數是一種常用的激活函數,它的作用是:如果輸入是正數就原樣輸出,如果是負數就輸出0。這樣的非線性特性讓神經網絡能夠處理更加復雜和抽象的任務,比如圖像識別和語言處理。
?學習率:是在訓練神經網絡時用來控制模型學習進度的一個參數。簡單講就是每次給權重添加多少值,如果加的越多,容易學習過頭,如果加的太低,學習次數就會變多
?正則化:是一種用于避免模型過擬合的技術,可以理解為給模型訓練加上一種約束或者懲罰。
?正則率:(通常用λ表示)則是控制正則化強度的參數。正則率的值越大,對模型復雜度的懲罰就越重,模型就越傾向于更加簡單,但過高的正則率可能導致模型過于簡單,無法捕捉數據的關鍵特征,即欠擬合。因此,選擇合適的正則率是保持模型泛化能力和擬合能力之間平衡的關鍵。
?
特別注意:不是學習的越精準、越沒瑕疵越好,過度擬合或導致誤判
?
神經網絡的學習過程本質上就是在學習數據的分布
?
Transformer架構(深度學習模型)
有了上面的感性理解后,讓我們稍微加一點點難度,理解一下Transformer架構。
目前絕大多數的開源大模型都是基于Transformer架構的。Transformer架構自2017年由Vaswani等人在論文《Attention is All You Need》中提出以來,迅速成為自然語言處理(NLP)領域的主流架構,廣泛應用于各種任務,如機器翻譯、文本生成、問答系統等等。Transformer模型的核心創新是自注意力機制(Self-Attention Mechanism),這使得模型能夠在處理序列數據時,有效地捕捉序列內各元素之間的關系,無論它們在序列中的位置如何遠近。
1、向量、矩陣
講Transformer之前,先回憶一下高中知識:向量、矩陣
向量相加得到另一個向量,可以理解為兩條向量一共走了多少路徑,的直線距離
向量相乘,可以看成向量B在向量A的垂線上的正射投影和向量A的長度的乘積
矩陣其實就是多維向量組,如圖就是3個向量組成的1個矩陣
?
矩陣相乘,請查看動畫演示
?http://matrixmultiplication.xyz/?
?
感興趣并想深入研究的同學,可以自行溫習一下向量、向量的加、乘法、三角函數、矩陣、線性代數等基礎知識。有以上幾張圖的基本理解就完全足夠理解下面我們即將要講的大模型核心架構Transformer了。
?
2、Transformer架構圖
下圖就是一個Transformer的架構圖,現在讓我們看Transformer時如何實現訓練的
從下往上大致分為這樣一個流程,樣本文字轉數字向量--->增加位置信息--->自身的語義關系學習---->數字縮放(歸一化)---->輸出概率---->對應的文字。下面讓我們逐一的來看每一層都做了什么。
3、訓練文字的token化與嵌入向量
?
對輸入的文本進行token的數字轉換,每個字對應一個從編碼庫中標記出來的一個token向量.得到一個4行x64列的這么一個矩陣,每一行代表了1個token(1個token其實就是一個向量,chatgpt按token收費,其中的token就是這個意思),每列代表了這個token在不同語義下的1個數字
?
是如何標記的呢,實際上是通過一張超級大的編碼字典表中查找到的.
目前常用的是openai開源的向量查找表庫tiktoken
?https://github.com/openai/tiktoken?
?
為什么有多列呢?因為每個字可能存在多種意思,例如“思”字, 你是什么意思?我沒什么意思,就是意思意思,每個思字是不同含義的.
?
?輸入:樣本訓練文本。
?輸出:token化的詞嵌入向量矩陣。
?
4、位置信息編碼
經過token化和嵌入向量得到的數據矩陣還不能給模型訓練.
例如,張麻子正在打李麻子,這句話中,通過token化嵌入向量后,不明確“麻子”這個詞指代的是哪個麻子,所以需要進行位置編碼,需要讓我們在訓練的過程中即知道token、又知道語義,還需知道位置,怎么引入位置呢?
?
?
當添加位置信息編碼時,不可能像咱們現在這樣,每個位置的編碼是整數順序大小的,我們這里只有“中華人民”四個字,所以是1、2、3、4的位置編碼,如果我們有1萬字,位置編碼就會很大,導致向量比較分散,如何解決呢?
sin,cos正好可以拿來做位置編碼,因為正弦、余弦的值永遠都在-1~1之間
奇數位置:sin(f(x))
偶數位置:cos(f(x))
?
token矩陣與位置編碼矩陣相加,得到的矩陣就可以丟給模型去訓練了
?
?輸入:詞嵌入向量矩陣。
?輸出:通過增加位置編碼后,得到可訓練的帶位置信息的向量矩陣。
?
5、自注意力機制
注意:這一小節是核心,這一小節是核心,這一小節是核心
漢字的序順并不定一影閱響讀
1.自注意力層讓模型能夠在處理一個單詞時考慮到句子中的其他單詞。這使得模型能夠捕捉單詞之間的關系,比如代詞和它所指代的名詞。
例子:在處理句子"漢字的序順并不定一影閱響讀"時,自注意力層會幫助模型理解"序"和"順"的關系。
想象一下,你正在一個聚會上,周圍有很多人在聊天。你的大腦會自動地選擇性地聽某些人的話,這取決于你認為誰的話對當前的對話最重要或最有趣。也就是說,即便所有的聲音都進入了你的耳朵,你的大腦還是會“關注”某些特定的聲音或信息。這個過程,就有點像自注意力機制在做的事情。
?
在自然語言處理(NLP)中,當我們給模型輸入一個句子,比如:“我愛吃蘋果”,模型的目標可能是理解這個句子的意思,或者翻譯成另一種語言。自注意力機制允許模型在處理每個詞(比如“蘋果”)時,不僅考慮這個詞本身,還要考慮它與句子中其他詞的關系。模型會“關注”句子中的每個詞,然后根據這些詞之間的關系來決定哪些詞是更重要的。
自注意力機制會為句子中的每個詞生成一個“權重”,這個權重反映了當前處理的詞對句子中其他詞的關注程度。比如,在處理“蘋果”這個詞時,模型可能會給“吃”這個詞分配更高的權重,因為這兩個詞之間有直接的關系。通過這種方式,模型就可以更好地理解每個詞在句子中的作用,進而更好地理解整個句子的意思。回到前面的句子“漢字的序順并不定一影閱響讀”,看下圖,“順”字跟句子中其他字之間都會生成一個關系權重,經過大量的訓練,“順”字對“序”字的權重最大。
簡單來說,自注意力就是模型在處理信息時,能夠“自己決定”去關注哪些相關的信息,這樣做可以幫助模型更好地理解和處理數據。
?
如何實現的呢?自注意力機制的核心思想是讓每個輸入元素(如一個詞)能夠關注到其他輸入元素,從而捕捉到序列中的全局依賴關系。矩陣乘法在自注意力機制中起到了關鍵作用,使用矩陣相乘,找到位置相似的向量,即最終得到比較合理的權重值
矩陣相乘后,值越大說明詞與詞之間的關注度越高
大致的訓練過程是這樣的:“順”字對“序”字的關注度,是在訓練的過程中不斷的調整向量坐標(權重),以達到最佳效果
自注意力層實際上做了兩件事,1是計算詞與詞之間的關注度權重,同時加權求和后輸出新的矩陣(預測出的詞的得分矩陣)
計算詞與詞之間的關注度權重(Attention Scores):自注意力機制首先會計算序列中每個詞對于其他所有詞的關注度權重。這個過程通常涉及將輸入序列的每個元素(例如,每個詞)轉換成三個向量:查詢(Query)、鍵(Key)和值(Value),通過計算查詢向量與鍵向量之間的相似度(通常是點積或某種歸一化形式的點積),來得出這些權重。這些權重表明了序列中每個元素對其他元素的重要性程度。
?
加權求和后輸出新的矩陣:一旦計算出關注度權重,自注意力機制會使用這些權重對值(Value)向量進行加權求和,以生成每個位置新的表示。這個過程實質上是根據每個元素對序列中其他元素的關注度,重新組合了原始信息。這樣,輸出的新矩陣中的每個元素都融合了整個序列的信息,反映了序列內部的復雜依賴關系。
?
?輸入:一個表示序列的矩陣 ( X )。
?線性變換:生成查詢(Q)、鍵(K)、和值(V)矩陣。
?注意力計算:并計算詞之間的關注度權重。
?輸出:通過注意力權重對值矩陣 ( V ) 進行加權求和,得到自注意力機制的輸出矩陣。
6、 歸一化注意力分數
歸一化是一種將數據按照一定規則縮放到一個特定范圍(通常是0到1之間或者是-1到1之間)的過程。這個過程可以幫助我們在處理數據時,減少數據之間因為量綱(單位大小)不同帶來的影響,使得數據之間的比較或者計算更加公平和合理。同時提高訓練速度和穩定性
?
歸一化后的注意力分數可以被解釋為概率,表示一個詞關注另一個詞的程度。
?
神經網絡的學習過程本質上是在學習數據的分布,如果沒有進行歸一化的處理,那么每一批次的訓練數據的分布是不一樣的,
?從大的方向上來看,神經網絡則需要在這多個分布當中找到平衡點
?從小的方向上來看 ,由于每層的網絡輸入數據分布在不斷地變化 ,那么會導致每層網絡都在找平衡點,顯然網絡就變得難以收斂。
下圖中,我們可以看到數據歸一化后的效果。 原始值(藍色)現在以零(紅色)為中心。 這確保了所有特征值現在都處于相同的比例。
例子說明歸一化:
再舉個簡單的例子,假設一個班級里有5個學生參加了一次考試,分數分別是
學生A=90分
學生B=80分
學生C=70分
學生D=60分
學生E=50分
這個分數比較大,對于如果我們想將這些分數歸一化到0到1之間,我們可以將每個學生的分數減去最低分50分,然后再除以最高分和最低分的差值,即40分(90-50)。這樣,90分就變成了1((90-50)/40),50分就變成了0((50-50)/40),其他分數也會相應轉換到0到1之間的某個值。這個過程就是歸一化。通過歸一化,我們可以更直觀地看出每個學生的成績在班級中的相對位置。
7、 前饋神經網絡
通過以上步驟,輸出的內容基本都是向量矩陣,都是線性的,并且每個詞都是獨立處理的,單詞之間沒有信息的交換,然而,前饋神經網絡可以訪問之前由頭注意力復制的任何信息。前饋層由神經元組成,這些神經元是可以計算其輸入加權和的數學函數。前饋層之所以強大,是因為它有大量的連接。例如,GPT-3 的前饋層要大得多:輸出層有 12288 個神經元(對應模型的 12288 維詞向量),隱藏層有 49152 個神經元。
?
自注意力機制:在這一步,每個詞會觀察周圍的詞,以找出與自己相關的上下文信息。
前饋神經網絡:在這一步,每個詞會根據自己收集到的上下文信息,進行信息的整合和處理。
在數學和物理學中,非線性是指任何不遵循加法原理(輸出不是輸入的直接倍數)或者乘法原理(系統的響應不是輸入的簡單線性組合)的現象。
?
8、 訓練與推理
以上訓練過程實際上就是我們文章開頭提到的“大模型訓練就是對互聯網數據進行有損壓縮”的有損壓縮的過程。
?訓練:是指使用大量的數據對模型進行學習和優化的過程。在這個過程中,模型學習數據中的模式、特征、規律等,調整自身的參數以盡可能準確地對各種輸入做出預測或輸出。
?推理:則是在訓練完成后,將新的數據輸入到已訓練好的模型中,讓模型基于其學到的知識和模式進行計算、分析并給出相應的輸出或預測結果。可以說訓練是讓模型具備能力,而推理是運用這種能力來處理具體的任務和問題。
?
其實上面我們只講了大模型訓練的過程,沒有講推理的過程,推理的過程跟訓練的過程大致相同,相差就是訓練的過程是沉淀結果,推理是直接計算完成之后輸出,并沉淀結果。感興趣的同學可以自己下來,我們網上經常看到的Transformer架構圖如下,左邊是輸入,右邊是輸出,可以看出輸入、輸出的中間部分基本是相同的
我們可以簡單理解左邊部分時訓練的過程、右邊部分時推理的過程.時間關系,推理的過程咱們先不講了,感興趣的同學可以下去看看
審核編輯 黃宇
-
神經網絡
+關注
關注
42文章
4771瀏覽量
100766 -
大模型
+關注
關注
2文章
2450瀏覽量
2707
發布評論請先 登錄
相關推薦
評論