語言模型預測什麼
機率延續引擎
語言模型接收一個 token 序列,並為下一個 token 指派一個機率分佈。輸入 the cat sat on the,它會輸出整個詞彙表的機率:mat、floor、couch 的機率高;xylophone、Tuesday 的機率低。
對該分佈進行抽樣、附加一個 token,並回饋給它:這個迴圈一次生成一個 token 的文字。自迴歸生成,因每個步驟回歸於其自身先前輸出而得名。
三個數字定義語言模型
詞彙大小 (V)。 模型能產生的不同 token 數量。ANDREA-12M 使用了 4,353 個 token;ANDREA-120M 使用 8,449 個。
上下文窗口 (T)。 一次前向傳遞中能容納的 token 數量。ANDREA 模型使用 T = 1,024。
參數數量 (P)。 內部有多少學習到的權重。12M、120M 和 480M 以 P 命名一個模型家族。
三個成員的家族
| 變體 | d_model | 注意力頭 | 層數 | 上下文 | 參數 |
|---|---|---|---|---|---|
| ANDREA-12M | 384 | 12 | 6 | 1024 | 12.8M |
| ANDREA-120M | 768 | 12 | 12 | 1024 | ~120M |
| ANDREA-480M | 1536 | 24 | 16 | 1024 | ~480M |
三個可擴展的旋鈕:d_model(每個內部向量的寬度)、n_layer(堆疊的 Transformer 區塊的深度)、n_head(並行的注意力投影)。詞彙與上下文在整個系列中保持固定。
閱讀系列表格
為什麼小模型重要
限制即解放
擁有數千億參數的大型語言模型需要數千個 GPU、專有資料集,以及企業預算。很少人能訓練一個。很少人能修復一個。
單一 GPU 上的小型語言模型顛覆了這一切。任何擁有 4090(或 3060)的人都能從開放資料重現 ANDREA。訓練配方即模型卡。開放程式碼、開放權重、開放資料;在 72 小時的運算中擁有完整出處。
容量 vs 品質
較小的模型無法記憶其訓練語料庫。ANDREA-12M 擁有 12.8M 參數,缺乏儲存事實內容的容量;它學習回合結構、詞彙分佈,以及回應形狀。ANDREA-120M 擁有 10 倍容量,學習事實回憶、多段落連貫性,以及領域廣度(透過外部評分驗證,在生物學與訊號處理樣本上達 9.5/10)。
重點: 容量設定了上限。課程決定是否達到上限。活動 14-23 涵蓋課程。 [TITLE decoder_only/]
三種 Transformer 變體
編碼器、解碼器、兩者皆有
原始 Transformer (Vaswani et al., 2017) 提供了編碼器與解碼器,結合用於翻譯。三種架構脈絡源自該論文:
僅編碼器 (BERT 脈絡)。雙向注意力,無因果遮罩。針對分類優化,而非生成。訓練期間,一個 token 能看到其過去與未來。
編碼器-解碼器 (T5, BART)。編碼器讀取輸入;解碼器生成輸出,透過跨注意力機制關注編碼器。用於翻譯、摘要。
僅解碼器 (GPT, ANDREA)。因果遮罩:每個 token 僅看到其過去的 token。訓練以預測下一個 token。生成免費;訓練與推論共享相同的正向傳遞。
為什麼僅解碼器在一張 GPU 上勝出
三個原因:
1. 單一目標。 下一個 token 預測適用於任何文字。不需要成對的來源/目標。
2. 訓練與推論對稱性。 相同的正向傳遞,無需特殊的生成邏輯。
3. 記憶體簡潔性。 無交叉注意力;一疊層;一個激活流。
ANDREA 繼承了來自 microGPT 的僅解碼器選擇,而 microGPT 繼承自 nanoGPT,nanoGPT 繼承自 GPT-2。這條血統保持標準;改變的生命在於分詞、訓練基礎設施與課程。
為何 ANDREA 使用僅解碼器
什麼能放入 24 GB
每個參數的位元組數
RTX 4090 配備 24 GB VRAM。ANDREA-12M 訓練使用了 1.4 GB。ANDREA-120M 使用了大幅更多的空間。這差距來自簡單的記憶體會計練習:訓練期間每個參數在記憶體中出現多次。
對於每個參數,訓練會保留:
- 權重本身 (1× 權重)
- Adam 第一矩 (m):與權重相同形狀 (1× 權重)
- Adam 第二矩 (v):與權重相同形狀 (1× 權重)
- 梯度:與權重相同形狀 (1× 權重)
- 激活值與臨時變數:~2-4× 權重 (依批次與上下文而異)
總計:~6-8× 權重數量,以精度決定位元組大小。
精度會放大一切
| 精度 | 每參數位元組 | 120M 權重總計 | 備註 |
|---|---|---|---|
| FP32 | 4 | 480 MB | 基準;最安全、最慢 |
| FP16 | 2 | 240 MB | cuBLAS,記憶體減半 |
| FP8 E4M3 | 1 | 120 MB | Tensor cores,NaN 風險 |
訓練時完整足跡需乘以 6-8 倍。ANDREA-120M 在 FP16 下舒適訓練(~2 GB 用於權重 + 優化器 + 梯度);FP8 E4M3 在 RTX 4090 tensor cores 上將訓練時間減半。
活動 13 (grow_a_language_model_precision) 詳細說明了 FP 精度的權衡取捨。
調整 ANDREA-120M 的優化器狀態大小
二十五個活動
兩個半部
本課程清楚地分成兩部分。第一半涵蓋 microGPT 教導該領域的內容:一個可在單一 GPU 上運行的 transformer。第二半涵蓋 ANDREA 的實際貢獻:一個能夠學習的課程。
半部 1:單一 GPU 上的 Transformer(活動 2-13)
| # | 活動 | 節奏 |
|---|---|---|
| 2 | Harris 語素分詞器 | 分布分割,256+N+1 詞彙 |
| 3 | 分詞器飲食對齊 | 飽和點,為何 12M 浪費 63.6% |
| 4 | 嵌入與位置 | 學習的 token + 位置查詢 |
| 5 | 縮放點積注意力 | Q·Kᵀ/√d,因果遮罩,softmax |
| 6 | 多頭注意力 | 頭部分割,平行投影 |
| 7 | Transformer 區塊 | MLP,殘差,層歸一化 |
| 8 | 交叉熵與困惑度 | 對數似然,SMMA 損失 |
| 9 | 自訂 CUDA 中的反向傳播 | 鏈式法則橫跨 microgpt_cuda.cu |
| 10 | AdamW | 分離權重衰減;為何傳統 Adam 失效 |
| 11 | LR 預熱 + 餘弦衰減 | 2000 步階梯;為何瞬間峰值毀掉 120M |
| 12 | 梯度裁剪 | 全局 L2 範數;3 個 CUDA 核心 |
| 13 | FP32 / FP16 / FP8 E4M3 | 精度權衡;張量核心 |
下半部:一個會學習的課程(活動 14-24)
| # | 活動 | 擊敗點 |
|---|---|---|
| 14 | 多臂老虎機 | UCB1, 探索 vs 利用 |
| 15 | 階段式骰子控制 | 7/14/21/28/42 階段, 1d3/1d4 骰子 |
| 16 | 獎勵歸因 & EMA | 每來源損失 EMA, 1000× 縮放 |
| 17 | 來源底線 & 紀元懲罰 | 1/(1+epochs) 防止記憶化 |
| 18 | 覆蓋獎勵 | 文件級追蹤, 1.3× 新鮮度 |
| 19 | 課程暖身 | 前 20K 步驟先用 7 聊天/散文來源 |
| 20 | 依形狀過濾,而非字符 | has_system_prompt_shape() |
| 21 | 相干閘控早期停止 | bigram/trigram/word/char 自動停止 |
| 22 | 檢查點、恢復、信號 | 格式、SIGTERM/SIGUSR1、loss.json 連續性 |
| 23 | 樣本審核與外部評分 | 閱讀執行、9.5/10 領域 |
| 24 | 從 microGPT 到 ANDREA-120M | v1 崩潰、v2 修復、v2.5 修補、v3 潤色 |
另外一個伴侶:geometry_of_andrea 將每一層視為幾何(嵌入空間、注意力作為投影、損失表面、bandit 作為離散單純形的行走)。
建議順序
活動 2-13 將建構一個可運作的 transformer。如果您之前訓練過 transformer,可跳至下半部;好奇心來襲時再回來。
每個活動盡可能獨立成章。數學參照會以名稱提及先前的活動(見活動 5:scaled dot-product attention)。程式碼參照指向 ~/git/uncloseai-cli/ 中的 microgpt/microgpt_cuda.cu & microgpt/training_proxy.py。