一個小到能從頭到尾攤開檢查的 Transformer
此速度約 12 分鐘
步驟 1/35
1/35 · 先看結果 · 先看同一句話最後要走到哪裡。機率分布:「eats」後面最可能接 corn 94%, grass 2.6%, . 2.4%。
先看結果1/1
先看同一句話最後要走到哪裡
「the pig eats」下一個 token:corn
這一頁拆的是現代 LLM 常用的 decoder-only Transformer:它只反覆做一件事——看著一段文字,猜下一個 token。原始 Transformer 還包含 encoder 與 cross-attention;這裡聚焦 GPT 類模型的主幹。先不拆機器:輸入「the pig eats」,它選的是 corn,把握 94%。
接下來主線沿用這句話;少數另標出的對照實驗才會換句子。我們會把每個 token 變成一列 48 個數字,讓 attention 在列之間搬資訊,最後從「eats」那一列讀出下一個 token。畫面有時只放大一列,但模型始終保留完整的 4 × 48 句子矩陣。
這一頁用到的名詞,一句話一個
- token
- 模型能讀寫的離散單位。這一頁一個英文單字就是一個 token;真實 tokenizer 常有數萬到十多萬項,可能切出短詞、詞片段、標點或單一字元。以英文為主學出的 tokenizer,處理同樣內容時中文常會用掉較多 token,但依 tokenizer 而異。模型先看到 token id,再用它查向量。
- corpus 語料庫
- 專門整理好、準備拿來訓練模型的資料集合。原始網頁、書籍或程式碼經過授權判斷、解析、篩選、去重與配比後,才成為訓練語料。可以把原始資料想成剛買回來的食材,corpus 則是洗好、挑好並按比例備好的食材。
- embedding 詞向量
- 一張表,每個 token 對應一串學來的數字。相似用法與角色常在向量幾何中形成結構,但單一詞向量不等於完整、固定的字義。
- residual stream
- 貫穿整個模型的一條加總。每一層不是取代它,而是往同樣寬度的向量加上一筆修改;這條捷徑也替梯度保留較直接的回程,降低深層網路難以訓練的風險。
- attention
- 每個位置對前面每個位置打一個分數,正規化成權重,再照權重把它們的資訊加權平均搬過來。它是模型裡唯一能讓位置之間交換資訊的機制。
- Q、K、V
- 同一個向量乘上三張不同的矩陣。Query 是「我在找什麼」,Key 是「我是什麼」,Value 是「找到我的話要拿走什麼」。分數由 Q 和 K 決定,搬走的是 V。
- 因果遮罩 causal mask
- 每個位置只准看自己和前面。在這種 next-token 訓練裡若拿掉它,模型可以直接偷看右邊的答案,學到的就無法用在正常的自回歸生成。
- 多頭 multi-head
- 同一層裡跑好幾組 attention,各自在自己的子空間裡比對;結果接起來後經 W^O 投影,等價於每個 head 分別映射回 residual stream 再相加。多頭讓幾個子空間可以平行比對不同的東西;單一 head 也不是只會一招,它的行為隨輸入而變。
- FFN(Feed-Forward Network)
- 每個位置各自通過一次的兩層小網路,中間先變寬再變窄。它不看別的位置。它是模型儲存與轉換知識的重要一塊,但知識並不只放在這裡——詞向量、attention 和 residual stream 的表示裡都有。
- LayerNorm
- 把一個位置的向量重新置中、縮放,再用學來的 γ、β 調整各維度,讓每個 block 收到較可預期的尺度,通常能讓深層模型更穩定地訓練。
- logits
- softmax 之前的原始分數,每個 token 一個,可正可負。只看分數差:像排名差距,全體一起加 10 分也不會改變 softmax。
- softmax
- 把一排分數變成一排加起來等於 1 的機率。差距越大,最高的那個越接近 1。
- temperature 溫度
- 在 softmax 前把 logits 除以溫度 τ。τ < 1 會拉大差距,τ > 1 會抹平差距。數值與抽樣分布會改變,但正溫度不改 token 的排序,因此純 greedy decoding 仍選同一個 argmax;模型權重也不會改。
- greedy decoding
- 每一步都直接選機率最高的 token,不做隨機抽樣。相同模型與 prompt 因而會得到相同續寫,但局部最佳不保證整段文字最佳。
- 交叉熵 cross-entropy
- 訓練用的分數:−log(模型給正確答案的機率)。答對且有把握代價接近 0,答錯又很有把握代價非常大。
- nat
- 交叉熵的單位(用自然對數)。loss = 1.79 nats 大約等於「平均在 6 個選項裡亂猜」。
- 梯度 gradient
- 每個權重增加一點時,loss 會以多快的速度上升或下降。梯度指向上升最快的方向,optimizer 通常往反方向更新;四萬個權重就有四萬個梯度,可由一次 backward 一起算出來。
- in-context learning
- 規則可以在權重裡,但這次的具體答案從當下輸入讀出。某個配對即使訓練中偶然出現過,也沒有被存成穩定事實;模型學到的是如何利用 prompt。
- context window 上下文視窗
- 一次能處理的 token 數上限。這個玩具模型由 20 列位置表直接限制;使用 RoPE 等方法的真實模型未必有同一張表,上限還受訓練長度、attention 成本、記憶體與部署設定影響。視窗內容只屬於本次呼叫,推論不會改動權重。
- KV cache
- 存下舊位置的 Key、Value 向量,生成下一個 token 時只算新位置,再讓新 Q 比對快取的 K。它精確省下重算,代價是記憶體隨 context 成長;不是資料庫的 key→value 對照表。
- logit lens
- 把中途的 residual stream 通過 Final LayerNorm 與輸出矩陣,暫時讀成 token 機率。能觀察答案如何變化,但中間層沒被直接訓練成可這樣解讀。
空白鍵播放/暫停,← → 逐步。