我原本以為 attention 算完關聯分數之後,就差不多可以直接進到下一層了。後來才發現,真正的流程比這更細緻。
在 self-attention 裡,每個 token 會先透過不同的矩陣變成 Q、K、V:
X → 乘 Wq 得到 Q
X → 乘 Wk 得到 K
X → 乘 Wv 得到 V
其中 Q 和 K 負責算 token 之間的關聯分數。數學上大概是:
QKᵀ → softmax → attention scores A
所以 attention scores 不是直接拿去乘 Wᵛ。比較精準的說法是:原本的 token vectors 先乘上 Wᵛ 得到 V,接著 attention scores 再去加權混合 V:
V = XWᵛ
Attention Output = AV
完整一點可以寫成:
Attention(X) = softmax(QKᵀ / √d) V
也就是說,attention output 可以理解成:每個 token 看完上下文之後,重新整理出來的新表示。
GPT-2 small 有 12 個 heads,每個 head 會各自產生一份比較小的 output。假設原本 token vector 是 768 維,那每個 head 大約是:
768 / 12 = 64 維
所以 12 個 head 會各自產生 64 維的結果,最後再接起來:
64 × 12 = 768 維
這就是 concatenation。直覺上,這有點像是 12 組不同的觀察結果,最後被合併成一份完整報告。
但這還不是 transformer block 的結束。attention output 接著還會進入 MLP。MLP 不是讓 token 互相看,而是針對每個 token 自己做更深一層的加工。GPT-2 裡面的 MLP 大概是:
768 維 → Linear 放大到 3072 維 → GELU → Linear 壓回 768 維
數學上可以簡化成:
MLP(x) = GELU(xW₁ + b₁)W₂ + b₂
所以我現在比較能理解 transformer block 的分工:
Attention:讓 token 彼此交換資訊
MLP:讓每個 token 消化與加工資訊
如果用一句話總結,attention 像是在看上下文,MLP 則是在理解與整理剛剛看到的東西。這也讓我更明白,LLM 不是單純查表或比對文字,而是一層一層地把 token vector 轉換成越來越有語意的表示。
我現在比較能理解 MLP 裡面的 activation 是什麼了。
一開始我以為 MLP 只是把 attention output 再拿去乘幾個矩陣,算出下一個 token vector。但如果只有矩陣乘法,其實不管疊幾層,本質上都還是線性變換,可以被合併成一個更大的矩陣。
例如:
xW₁W₂W₃
其實還是可以看成:
xW
所以如果沒有 activation,MLP 的表達能力會很有限。它只是把向量從一個空間轉到另一個空間,還沒有真正產生複雜的判斷。
activation 的作用,就是在兩層 linear 之間加入一個非線性的「篩選」步驟:
x → Linear → Activation → Linear → output
以 GPT-2 常見的 GELU 來說,MLP 可以簡化成:
MLP(x) = GELU(xW₁ + b₁)W₂ + b₂
這裡的 GELU 就是 activation。它會根據數值大小,決定哪些特徵要比較完整地通過,哪些特徵要被壓低。直覺上,ReLU 比較像硬開關,而 GELU 比較像柔性開關。
所以我現在會把 MLP 理解成「消化資訊」的地方,而 activation 就是消化過程裡的關鍵機制。Attention 先讓 token 去看上下文、收集資訊;MLP 再把這些資訊展開、篩選、加工,最後整理回原本的 vector 維度。
簡單整理:
Attention:讓 token 看其他 token,取得上下文資訊
MLP:消化與加工 attention 得到的資訊
Activation:MLP 裡負責非線性篩選與判斷的核心步驟
這讓我更能理解,LLM 不是單純一層一層乘矩陣而已。真正讓模型能表達複雜模式的關鍵之一,就是在矩陣變換之間加入 activation,讓原本線性的向量運算產生非線性的判斷能力。
原本看到這個式子:
MLP(x) = GELU(xW₁ + b₁)W₂ + b₂
我會直覺把它想成只是幾個矩陣相乘。但其實裡面可以拆成兩個階段。
第一階段是 expansion:
xW₁ + b₁
W₁ 是 expansion weight,負責把原本的 token vector 展開到更高維度。
b₁ 是 expansion bias,負責在展開後加上一個偏移量。
以 GPT-2 small 來說,就是大概把 768 維展開到 3072 維:
768 → 3072
接著會經過 GELU activation,做非線性的篩選與加工。
第二階段是 projection 或 contraction:
GELU(...)W₂ + b₂
W₂ 負責把 3072 維再壓回 768 維。
b₂ 則是壓回原維度時的 bias。
所以比較精準地說:
W₁、b₁:展開資訊
W₂、b₂:整理並壓回資訊
GELU:中間的非線性篩選
這也讓我意識到,LLM 花巨額成本訓練出來的,不只是 embeddings table,也不只是 attention 裡面的 Wq、Wk、Wv。每一層 MLP 裡的 W₁、b₁、W₂、b₂,也都是非常重要的模型參數。
而且 MLP 的參數量其實很大。以 GPT-2 small 的一層 MLP 來看:
W₁: 768 × 3072
W₂: 3072 × 768
光這兩個矩陣就已經有數百萬個 weight。再乘上很多層 transformer block,參數量就變得非常可觀。
所以我現在會把 LLM 的訓練理解成:模型不是在寫死規則,而是在大量文字資料中,慢慢調整這些矩陣與 bias。它學到的語言知識、語意關聯、上下文模式,最後都被壓縮進這些參數裡。
簡單來說:
Attention 參數:決定 token 要看誰
MLP 參數:決定看完之後怎麼加工與理解
各家 LLM 真正昂貴的地方,就是訓練出這一整套龐大的參數系統。它們看起來只是 W 和 b,但背後其實是大量語料、算力、時間與工程成本壓縮出來的結果。