選讀:用數值追一次 Transformer 計算
這篇是〈Transformer 是什麼?先看一次回答的計算流程〉的選讀計算拆解。想先掌握各步驟在做什麼,可先回全貌章;這裡才逐項看數值與固定規則。
前幾章分別看了:文字切成 token、用編號查到數值、帶入位置,以及把前文的數值混進來。這些步驟放在一起,最後怎麼得到下一個 token 的候選分數?
本章沿用「歡迎各」與「分工各」,追最後的「各」。先看路線:準備文字的數值 → 一層層處理 → 最後換成候選分數。
Transformer 是一種安排模型 (Model) 內部計算的架構 (Architecture):它把「結合不同位置的資訊」和「加工每個位置的數值」組成一層,再把多層接起來。前一層的結果,就是下一層的材料。
這張圖追的是逐步接續文字的路徑。它每次只看已提供的內容;產生一個新 token 後,再把它接入前文,繼續下一次計算。
起點:「各」還沒結合前文,兩次的值相同
嵌入向量 (Embedding Vector) 是編號查表得到的一串數值。位置編碼 (Positional Encoding) 則把所在位置也變成計算材料。本例先把兩者相加:
| 文字 | 查表值 | 加的位置值 | 這次的開始值 |
|---|---|---|---|
| 歡迎 | [2, 0] | [0, 0] | [2, 0] |
| 分工 | [0, 2] | [0, 0] | [0, 2] |
| 各 | [1, 0] | [0, 1] | [1, 1] |
選「歡迎」或「分工」,「各」都從 [1, 1] 開始。不同的是第一個位置的數值;接下來,它才會影響「各」。這裡的位置表只供本例追算,並非上一章的位置表或所有架構的做法。
一層裡做什麼?先交流,再各自加工
第一件事:讓不同位置的資訊一起參與。 前一章的注意力 (Attention) 就是這一步:算出各位置的混合份量,再按份量加總。本例在「各」的位置能使用前文和「各」本身;在第一個位置則不能回頭偷看後面的「各」。
第二件事:把混合結果加回這層輸入。 「各」原先的 [1, 1] 不會直接被混合結果取代,而是和它相加。這種讓輸入繞過一段運算、再與結果相加的接法,稱為殘差連接 (Residual Connection)。它提供一條直接傳遞數值的路徑,不代表查表得到的數值永遠不變。
第三件事:各位置再各自經過一個小型網路。 它用固定的權重 (Weight) 加工這個位置的數值,不在這一步讀其他位置;計算方式承接神經網路章的「乘上權重、加總、再轉換」。這部分稱為前饋網路 (Feed-forward Network)。加工結果也加回它收到的輸入,得到這層的輸出。
另外,在混合和加工前,本例都會先整理數值尺度:把接下來這段運算要用的值縮放到較穩定的尺度,同時保留各欄數值的相對比例。相加後的結果仍可能變大。這裡使用的是正規化 (Normalization) 的一種做法。它不是把值轉成機率,也不是另一份前文。
因此一層不是「又查一次 token 表」,而是加工上一份向量 (Vector)。這串數值已經帶著前面計算造成的改變。
接兩層:第一層的結果往哪裡去?
先看「歡迎各」的末位置。下表是活動實際算出的結果,顯示到小數三位:
| 追「各」 | 數值 |
|---|---|
| 第一層收到的輸入 | [1, 1] |
| 第一層混合結果 | [1.098, 0.763] |
| 加回輸入 | [2.098, 1.763] |
| 逐位置加工結果 | [0.173, 0] |
| 再相加,第一層完成 | [2.271, 1.763] |
| 第二層收到的輸入 | [2.271, 1.763] |
| 第二層完成 | [3.809, 2.419] |
第二層接的是 [2.271, 1.763],不會重設回查表值 [1, 0]。前文那個位置也經過第一層,第二層混合使用的,是兩個位置各自更新後的值。
接多層,就能讓後面的運算使用前面已處理的資訊。這不表示每層必然對應「字義、文法、推理」這些固定工作,也不能只憑層數判定模型比較好。
最後:把這串數值換成候選分數
兩層完成後,末位置的數值再整理尺度。本例得到 [1.194, 0.758],接到一個固定計分規則:第一個數值乘 2 是「位」的分數;第二個數值乘 2 是「自」的分數。
| 前文 | 最後整理後的「各」 | 「位」分數 | 「自」分數 |
|---|---|---|---|
| 歡迎 | [1.194, 0.758] | 2.387 | 1.517 |
| 分工 | [0.758, 1.194] | 1.517 | 2.387 |
分數 (Score) 還不是機率 (Probability);後面還要把整份候選分數轉成機率,再選出下一個 token。本章停在分數,以便看清前文的改變如何一路傳到計分。
注意:畫面先四捨五入,內部用完整精度計算,所以用表內小數手算可能差 0.001。
親手只換前文:第一層變了,第二層會跟著變嗎?
「各」的位置與開始值都固定。先看「歡迎+各」,再只改成「分工+各」:追第一層的輸出、第二層的輸入,最後看候選分數。
只換前文,追「各」經過兩層的數值與最後分數。手機可切換「追數值/看候選」。本章練習全在瀏覽器本機實算,沒有下載或呼叫模型。
這次沒有改嵌入表 (Embedding Table)、權重或其他參數 (Parameter),只是用同一套規則處理不同輸入;這是推論 (Inference) 的計算,不是訓練 (Training)。要讓規則真正從資料學到適合的數值,回看訓練章。
活動裡的數字,具體怎麼算?
若想逐項驗算,固定規則如下。這些規則只是實驗的設計,不需要背下來才能理解接線:
- 整理尺度:對 [a, b] 算 r = √((a² + b²) / 2 + 0.000001),再得到 [a/r, b/r]。這叫均方根正規化 (RMSNorm);例如 [2, 0] 會接近 [1.414, 0]。零向量仍是零,沒有減去平均值。
- 混合份量:先整理各位置尺度,兩欄相加作為查詢 (Query) 與鍵 (Key),相乘得到配對分數,再用 Softmax 轉成份量。值 (Value) 保留整理後的兩欄;按份量相加。「各」第一層給前文約 23.657%、自己約 76.343%。這些百分比是混合份量,不是「位/自」的機率。
- 加回這層輸入後,再整理尺度為 [u, v]。本例小型網路算 [max(0, u−v), max(0, v−u)]:負值設為零,其餘保留,這個轉換是 ReLU。再加回加工前、尚未整理尺度的那份輸入。
- 兩層都照這些規則實算,最後整理末位置尺度,套用上述乘 2 的計分規則。第二層的注意力份量也重新計算,不沿用第一層百分比。
Transformer 都是在接續文字嗎?
不是。上面採用只看已提供內容、逐步接續文字的解碼器 (Decoder) 路徑,常見的生成式大型語言模型 (Large Language Model, LLM) 採用這一類。
另有編碼器 (Encoder):各位置可以結合整份已提供的輸入,適合用來分析句子或抽取資訊;也有把編碼器與解碼器接起來的架構,例如先處理一段原文,再逐步生成譯文。它們仍使用注意力等組件,但接線與可讀取的位置不同。
Transformer 是架構,LLM 是語言模型的一類;人工智慧 (Artificial Intelligence, AI) 還包含前面介紹過的其他任務與方法,不能把三者畫上等號。
〈上下文視窗為什麼有上限?〉接著看:當一次送進來的位置愈來愈多,這些計算需要付出什麼成本?
參考:原始 Transformer:注意力、逐位置網路、殘差與輸出計分、RMSNorm:整理數值尺度的一種方法、Hugging Face:三種 Transformer 架構的分工(2026-10-06 查核)。本章實驗是固定構造計算,不是任何已訓練模型的實作或測量。