序言:為了幫助更多人理解,我們將分成若干小節來講解大型語言模型(LLM)的真實工作原理,從零開始,不需額外知識儲備,只需初中數學基礎(懂加法和乘法就行)。本文包含理解 LLM 所需的全部知識和概念,是完全自包含的(不依賴外部資料)。我們首先將在紙上構建一個簡單的生成式大語言模型,然後逐步剖析每一步細節,幫助你掌握現代人工智慧語言模型(LLM)和 Transformer 架構。文中去掉了所有複雜術語和機器學習專業名詞,簡化為純粹的數字乘法與加法表達。當然我們並沒有捨棄細節,會在文中適當位置指出相關術語,以便你能與其他專業內容建立關聯。
從懂得加法/乘法數學運算到搞清當今最先進的AI模型,意味著我們需要覆蓋大量內容。這不是一個玩具版的LLM解釋——有心人理論上可以從中重建一個現代LLM。我刪去了一切多餘的字句,因此整篇知識並不適合快速瀏覽式閱讀。
(關注並訂閱作者,您將能及時收到作者的最新更新、行業內最新技術動態以及實際動手實踐的經驗分享。)
本文全部內容將涵蓋下列15個要點:
-
一個簡單的神經網路
-
這些神經網路模型是如何訓練的?
-
模型是如何生成輸出語言的?
-
是什麼讓LLM模型效果如此出色?
-
嵌入(Embedding)
-
子詞分詞器
-
自注意力
-
Softmax
-
殘差連線
-
層歸一化
-
Dropout
-
多頭注意力
-
位置嵌入
-
GPT架構
-
Transformer架構
我們開始吧。
首先要提到的是,神經網路只能接收數字作為輸入,並輸出數字。毫無例外,魔法的關鍵在於如何將使用者的一切輸入內容(文字、影像、影片、聲音)轉換為數字,以及對神經網路的輸出數字進行解釋以達到目的。最後,我們自己構建一個神經網路,使其接收你提供的輸入並給出你想要的輸出(基於你選擇的輸出解碼方式)。讓我們來看看如何從加法和乘法這些基本運算原理出發,實現人工智慧語言模型 Llama 3.1 能力的效果。
構建一個簡單的神經網路:
我們先來搞清楚一個可以對物體進行分類的簡單神經網路是怎樣的存在,這是講述我們要設計的神經網路的任務背景:
• 用顏色(RGB)和體積(毫升)來描述將被神經網路識別的物體
• 要求神經網路準確分辨出物體到底是:“葉子”還是“花朵”
下圖是用數字來代表“葉子”和“花朵”的示例:
葉子的顏色由 RGB 值 (32, 107, 56) 表示,體積為 11.2 毫升。花朵的顏色由 RGB 值 (241, 200, 4) 表示,體積為 59.5 毫升。圖中這些資料用於訓練神經網路,讓它學會根據“顏色”和“體積”來識別葉子和花朵。
現在我們就構建一個神經網路來完成這個分類任務。我們先確定輸入/輸出的格式和對輸出結果的解釋方式。上圖中的葉子(Leaf)和花朵(Flower)已經用數字來表示了,所以可以直接傳遞給神經網路中的神經元。由於神經網路只能輸出數字,因此我們還需要對神經網路輸出的數字進行定義(即什麼樣的數字代表神經網路識別出的物體型別,是“葉子”還是“花朵”,因為神經網路本身無法直接輸出“葉子”和“花朵”這兩個名稱來告訴我們分類結果)。因此,我們需要定義一個解釋方案,將輸出的數字對應到物體類別上:
• 如果設計的神經網路只有一個輸出神經元,可以透過正數或負數來代表識別出的物體類別。當該神經元輸出正數時,我們就認為神經網路識別出該物體是“葉子”;如果輸出的是負數,則表示識別出的物體是“花朵”。
• 另外,也可以設計具有兩個輸出神經元的神經網路,用這兩個神經元分別代表不同的物體類別。例如:約定第一個神經元代表“葉子”,第二個神經元代表“花朵”。當神經網路的第一個神經元輸出的數字大於第二個神經元輸出的數字時,我們就說神經網路識別出當前的物體是“葉子”;反之,當第一個神經元輸出的數字小於第二個神經元輸出的數字時,我們就說神經網路識別出的當前物體是“花朵”。
這兩種方案都可以讓神經網路識別物體是“葉子”還是“花朵”。但本文我們選擇第二種方案,因為它的結構更容易適應後面我們要講解的內容。以下是根據第二種方案設計出來的神經網路。讓我們詳細分析它:
圖中的圓圈代表神經網路中的神經元,每一豎排代表網路的一層。所有的資料從第一層進入,然後逐層逐個做乘法和加法計算,經過隱藏層(三個神經元),最終到達輸出層(兩個神經元),我們根據最後一層的兩個神經元輸出的數值來預測當前識別出的是什麼物體。注意圖中的箭頭和數字,以及它們之間的乘法與加法關係。
藍色圓圈中的計算如下:(32 * 0.10) + (107 * -0.29) + (56 * -0.07) + (11.2 * 0.46) = -26.6
一些行話(專業名詞):
• 神經元/節點:帶數字的圓圈
• 權重:箭頭線上標註的數字
• 層:一組(排)神經元稱為一層。可以將這個網路看作有三層:4個神經元的輸入層、3個神經元的中間層和2個神經元的輸出層。
要計算網路的預測/輸出(稱為“前向傳播”),從左側開始。把“葉子”代表的數字填入到第一層的神經元中。要前進到下一層,將圓圈中的數字與對應神經元的權重相乘並相加。我們演示了藍色和橙色圓圈的計算。執行整個網路後,輸出層第一個數字較大,因此我們可以解釋為“網路將這些(RGB, Vol)值分類為葉子”。經過良好訓練的網路可以處理各種(RGB, Vol)輸入並正確分類物體。
這個神經網路模型本身對“葉子”、“花朵”或(RGB, Vol)沒有任何概念(即它不理解“葉子”和“花朵”是什麼)。它被設計出來只是為了接收4個數字並輸出2個數字。我們規定4個輸入數字代表物體的顏色值和體積,同時也規定2個輸出神經元的值如何對應“葉子”和“花朵”。最終,網路的權重是透過訓練過程自動調整得到的,以確保模型能夠接收輸入數字並輸出符合我們解釋的結果。
一個有趣的副作用是,也可以用這個神經網路來預測未來一小時的天氣情況。我們將例如:雲量和溼度等表示成4個不同的數字值作為輸入,並將神經網路的最後輸出解釋為“1小時內晴天”或“1小時內下雨”。如果這個神經網路的權重校準良好,網路就可以同時完成分類葉子/花朵和預測天氣的任務。我們的神經網路只是輸出了兩個數字,而這兩個數字到底代表什麼意思則完全取決於你對它的定義。例如:這兩個數字可以代表對物體進行分類的結果或者預測天氣等。
編寫本小節時,為了讓更多人理解,我省略了以下的一些技術術語。即使忽略這些術語,您依然可以理解神經網路的基本概念:
• 啟用層:
神經網路通常有一層“啟用層”,它對每個節點的計算結果應用一個非線性函式,以增強網路處理複雜情況的能力。一個常見的啟用函式是 ReLU,它會將負數設為零,而正數保持不變。例如,在上例中,我們可以將隱藏層中的負數替換為零,然後再傳遞到下一層計算。沒有啟用層時,網路中的所有加法和乘法可以簡化為單層。例如,綠色節點的輸出可以直接寫成 RGB 的加權和,不需要隱藏層。啟用層的非線性特性使得神經網路能夠處理更復雜的模式。
• 偏置:
神經網路中的每個節點通常還關聯一個“偏置”值,這個值會加到節點的加權和結果中,用於調整輸出。例如,如果頂層藍色節點的偏置是 0.25,那麼計算公式變成:(32 * 0.10) + (107 * -0.29) + (56 * -0.07) + (11.2 * 0.46) + 0.25 = -26.35。偏置使得網路可以更靈活地擬合資料,“引數”通常指模型中的這些權重和偏置值。
• Softmax:
在輸出層,我們通常希望將結果轉化為機率。Softmax 函式是一種常用的方法,它能將所有輸出數值轉換為機率分佈(總和為 1)。Softmax 會將每個輸出數值的指數除以所有輸出值的指數和,使得輸出層的結果可以被解讀為各分類的機率。例如,如果 Softmax 處理後的值為 0.8 和 0.2,那麼這表示 80% 的機率是“葉子”,20% 的機率是“花朵”。
未完待續…