Transformer 是現在 LLM 的基礎架構,有許多 Youtuber 或是文章都有詳細的介紹。這篇主要紀錄 Q, K & V 矩陣中容易不懂的地方,抱括來源、運算過程等等。
Dimensions
首先我們要先清楚知道在這些矩陣中有哪些維度。
name | description |
---|
n_vocab (V) | vocab size (字典共有多少字) |
n_embed (d) | embedding size (字經過 embed 之後有多少維度) |
n_L (L) | length of sequence input (輸入有多少字) |
在真正實作時, L 會是有多少 token,我們先假設現在一個字就是一個 token。
Matrix 整理
Weight Matrices
Name | Shape | Used In | Description |
---|
WE | RV×d | Embedding layer | Maps input token IDs to dense vectors (word embeddings). |
WQ | Rd×d | Self-attention | Projects hidden state to Query vectors. |
WK | Rd×d | Self-attention | Projects hidden state to Key vectors. |
WV | Rd×d | Self-attention | Projects hidden state to Value vectors. |
WU | Rd×V | Output layer | Maps final hidden state to vocabulary logits. Often WU=WE⊤. |
Single Head Attention
先預設一個字就是一個 token,輸入 "I love to" 之後,會先經過 embed 變成三個向量 i.e. L=3。這裡先標記成 E1, E2 & E3。實際矩陣會長得像這樣:
X=E1E2E3∈R3×d
這個 Input Embedding Matrix X 我們會拿著它去算出 Q, K & V 矩陣。 XWQ=Q 實際運作如下:
E1E2E33×d[WQ]d×d=[Q]3×d
至於 K 和 V 都是同樣的道理,只是 weight matrix 裡面實際的 weight 有所不同。
Attention
Z=Attention(Q,K,V)=softmax(dkQK⊤)V
實際上計算時,softmax 與 dk1 並不影響 dimension 這裡先不解釋。
Q=q11q21q31⋯⋯⋯q1dq2dq3d,K⊤=k11⋮k1dk21⋮k2dk31⋮k3d
QK⊤ 的 output 意思是字與字之間的相關程度。
Ilovetoq11q21q31⋯⋯⋯q1dq2dq3d×k11⋮k1dk21⋮k2dk31⋮k3d=a11a21a31a12a22a32a13a23a33
在新的 R=3×3 的矩陣中,以 a12 舉例,它代表 "I" 與 "love" 的關係程度。數字越大,代表這兩個字的關係程度越高。
(QK⊤)V=a11a21a31a12a22a32a13a23a33v11v21v31⋯⋯⋯v1dv2dv3d=z11z21z31⋯⋯⋯z1dz2dz3d=Z1Z2Z3=Z
這個 Z 就是最後的 output。如此,所有 Z 向量就包含了所有上下文的資訊。實際運作時,會再加上 masking,使得 Z1 包含 "I" 的資訊,Z2 包含 "I love" 的資訊,Z3 包含 "I love to" 的資訊。
Predicting
在 pretrain 時,還有一個 weight matrix - WU∈Rd×V ,會用來預測下一個 token。
logits=Z−1WU
更仔細點說:
[z31z32⋯z3d]u11⋮uV1⋯⋱⋯u1d⋮uVd=v1⋮vV
其中 v1 代表 token 編號為 1 的機率,v2 代表 token 編號為 2 的機率,以此類推。 Model 會根據這些機率來預測下一個 token。
Multi Head Attention
進入 Multi Head Attention 之前,先來看看 single head 中沒有用到的 weight matrix (*) 。
Weight Matrices
Name | Shape | Used In | Description |
---|
WE | RV×d | Embedding layer | Maps input token IDs to dense vectors (word embeddings). |
*WQ | Rd×dq | Self-attention (each head) | Projects hidden state to Query vectors. |
*WK | Rd×dk | Self-attention (each head) | Projects hidden state to Key vectors. |
*WV | Rd×dv | Self-attention (each head) | Projects hidden state to Value vectors. |
*WO | Rhdv×d | Multi-head attention | Combines concatenated head outputs into a unified vector (often hdv=d). |
WU | Rd×V | Output layer | Maps final hidden state to vocabulary logits. Often WU=WE⊤. |
通常 dq, dv 和 dk 是一樣的,都是 dhead,也就是說如果 dq=dk=dv=dhead=hd 其中 h 就是 head 的數量。
Weigth Matrices in Multi Head
Multi head 的概念其實不難,就是把 Weight Matrices 分成 h 個矩陣,希望可以抓到 token 之間不同面向的注意力。
先假設 h=5 那麼 WQ 就會從原本的 Rd×d 變成 Rd×5d。並且總共有 h 個 WQ。
原始的
WQ=w11⋮wd1⋯⋱⋯w1d⋮wdd
會變成
w11⋮wd1⋯⋱⋯w1d⋮wd,5dw1,5d+1⋮wd,5d+1⋯⋱⋯w1,2∗5d⋮wd,2∗5d⋯
並且每個 head 的 weight matrix 都是 d×hd 的矩陣。
Q, K & V in Multi Head
在 multi head 中,所有的計算都是跟 single head 一樣,除了 matrices 的維度。
Q,K,V∈Rd×hdZ=(QK⊤)V∈RL×hd
接著把所有的 head 的 Zi 拼在一起就可以得到 Zconcat,Zconcat⋅ZO 就是最後的 output Zfinal。
Zfinal=Zconcat⋅WO, where WO∈Rd×d
Zfinal 就是我們在 single head 中提到的 Z 了。拿著這個 Z 就可以預測下一個 token。
Feed Forward Layer
Feed Forward Layer (FFN) 就是在 Attention 做完之後,讓 Z 在經過幾次 neural network。因為原始的 self-attention layer 其實只是 input 的線性組合,加入 FFN 可以增加整個 Language Model 的深度。
Name | Shape | Used In | Description |
---|
WE | RV×d | Embedding layer | Maps input token IDs to dense vectors (word embeddings). |
WQ | Rd×dq | Self-attention (each head) | Projects hidden state to Query vectors. |
WK | Rd×dk | Self-attention (each head) | Projects hidden state to Key vectors. |
WV | Rd×dv | Self-attention (each head) | Projects hidden state to Value vectors. |
WO | Rhdv×d | Multi-head attention | Combines concatenated head outputs into a unified vector (often hdv=d). |
*W1 | Rd×dff | Feedforward layer | First linear layer in the MLP (expands dimensionality). |
*W2 | Rdff×d | Feedforward layer | Second linear layer in the MLP (compresses back to d). |
WU | Rd×V | Output layer | Maps final hidden state to vocabulary logits. Often WU=WE⊤. |
FFN 會被 appied 在 self-attention 之後:
Input -> Self-attention -> Add & Norm -> Feedforward -> Add & Norm -> Next Layer ...
先假設我們 Multi Head 的結論 Zfinal 還不是最後解,將 Zfinal 視為 Zattn,接著 Zattn 會經過 FFN。
Zfinal=FFN(Zattn), where Zfinal∈RL×d,Zattn∈RL×d
Layer Example
假設我們的 FFN 有兩層,分別為 W1 & W2。那麼:
[Zattn]L×d×[W1]d×dff=[Zff]L×dff
Zff 代表中間的 hidden state。接著再經過:
[Zff]L×dff×[W2]dff×d=[Zfinal]L×d
就會得到 Zfinal,即可預測下一個 token。

Dimension of Hidden Layer
Hidden Layer 的維度其實不是一個定值,只要經過所有 layer 後,維度與 WU 對上,並且可以算出 next token 即可。只是大部分 WO 都是 WE⊤ 因此會希望 FFN 的輸出維度 ∈RL×d 也就是維度跟進入 FFN 之前一樣( i.e. 經過 FFN 維度不變就對了)
複習 predict next token:
[Zfinal]L×d×[WU]d×V=v1v2⋮vV
如上:希望 Zattn 轉為 Zfinal 之後維度保持一致。這也是為什麼 W1∈Rd×dff 而 W2∈Rdff×d:
[W1]d×dff×[W2]dff×d=[Wff]d×d
可以確保進入 FFN 後維度不變。