對應原題(Common ‧ LLM Internals;Anthropic)
- Walk me through what happens, tensor by tensor, in one forward pass of a decoder-only transformer. — Asked at: Anthropic
- What are the key components of a Transformer model and why does each matter? — Asked at: Anthropic
- Walk me through matrix manipulations relevant to LLM architectures. — Asked at: Anthropic
🎯 什麼情境該想到我
當你「各個零件都懂了,但串不起來」的時候。這一頁是 A 區所有筆記的裝配圖——每個步驟都連到對應的深入頁。
⚙️ 怎麼用(逐步追形狀)
以 Llama-2-7B 為例,符號: = batch、 = 序列長度。
vocab V = 32,000 d_model = 4,096 層數 L = 32
heads h = 32 d_head = 128 d_ff = 11,008
0. 分詞
"知識庫怎麼建" ──tokenizer──▶ ids: (B, N) int64
→ 深入:分詞與 BPE(中文在這裡可能就吃掉 3 倍 token)
1. Embedding 查表
ids (B, N) ──▶ E[ids] ──▶ x: (B, N, 4096) bf16
E 是 (32000, 4096) 的矩陣。這步沒有矩陣乘法,只是查表。
→ 注意:現代模型不在這裡加位置編碼(Llama、Qwen 都是),位置在每層的 attention 裡才進來。
2. 進入第 層(重複 32 次)
2a. Attention 前的 RMSNorm
x (B,N,4096) ──▶ RMSNorm ──▶ x̂: (B,N,4096)
形狀不變,只是把每個 token 的向量縮放到固定的 RMS。殘差 x 本身不動(Pre-LN 的關鍵)。
→ 深入:正規化與激活函式
2b. Q / K / V 投影
x̂ (B,N,4096) @ W_Q (4096,4096) ──▶ Q: (B,N,4096)
x̂ @ W_K ──▶ K: (B,N,4096)
x̂ @ W_V ──▶ V: (B,N,4096)
reshape 成多頭:
(B, N, 4096) ──▶ (B, N, 32, 128) ──▶ transpose ──▶ (B, 32, N, 128)
h d_head B h N d_head
Llama-2-7B 是 MHA(
num_key_value_heads = 32)。70B 才是 GQA(KV 頭只有 8),那時 K/V 的形狀是(B, 8, N, 128)。
→ 深入:注意力機制
2c. RoPE 旋轉
Q: (B,32,N,128) ──rotate──▶ Q: (B,32,N,128) 形狀不變
K: (B,32,N,128) ──rotate──▶ K: (B,32,N,128)
只轉 Q 和 K,不轉 V。 依每個 token 的絕對位置 旋轉,但內積只留下相對距離。
→ 深入:位置編碼與 RoPE
2d. 注意力計算
Q (B,32,N,128) @ Kᵀ (B,32,128,N) ──▶ scores: (B, 32, N, N) ← ★ 平方項在這
scores / √128 ──▶ + causal mask ──▶ softmax ──▶ attn: (B,32,N,N)
attn @ V (B,32,N,128) ──▶ out: (B, 32, N, 128)
時 scores 是 (B, 32, 4096, 4096)——單一 batch 單層就 1 GB(bf16)。
FlashAttention 的全部價值就是讓這個張量從不存在於 HBM。
→ 深入:FlashAttention
推論時:K、V 被寫進 cache,下一步只算新 token 的那一列。
→ 深入:KV Cache
2e. 輸出投影 + 殘差
out (B,32,N,128) ──merge heads──▶ (B,N,4096) @ W_O (4096,4096) ──▶ (B,N,4096)
x = x + 上面的結果 ← 殘差
2f. FFN 前的 RMSNorm
x ──▶ RMSNorm ──▶ x̂: (B,N,4096)
2g. SwiGLU FFN
x̂ @ W_gate (4096,11008) ──▶ (B,N,11008) ──SiLU──▶ gate
x̂ @ W_up (4096,11008) ──▶ (B,N,11008) up
gate ⊙ up ──▶ (B,N,11008) ← elementwise 相乘
@ W_down (11008,4096) ──▶ (B,N,4096)
x = x + 上面的結果 ← 殘差
升維 → 門控 → 降維。 這裡是每層參數量最大的地方(約佔 2/3)。
→ 深入:正規化與激活函式;MoE 版本見 混合專家 MoE
3. 最終 norm + LM head
x (B,N,4096) ──▶ final RMSNorm ──▶ (B,N,4096)
@ W_lm (4096, 32000) ──▶ logits: (B, N, 32000)
Llama 2 沒有做 embedding tying(
W_lm ≠ Eᵀ),所以 embedding 那 131M 參數被算了兩次。很多小模型會 tie 來省參數。
4. 取下一個 token
logits[:, -1, :] (B, 32000) ──▶ temperature / top-k / top-p ──▶ softmax ──▶ 抽樣
訓練時用全部 個位置算 cross-entropy(每個位置預測下一個 token);
推論時只用最後一個位置。
→ 深入:取樣與解碼策略
★ 驗算:參數量真的是 6.74B 嗎
| 項目 | 算式 | 參數 |
|---|---|---|
| Embedding | 131,072,000 | |
| 每層 Attention(4 個方陣) | 67,108,864 | |
| 每層 FFN(gate/up/down) | 135,266,304 | |
| 每層 2 個 RMSNorm | 8,192 | |
| 每層小計 | 202,383,360 | |
| × 32 層 | 6,476,267,520 | |
| Final norm | 4,096 | |
| LM head | 131,072,000 | |
| 合計 | 6,738,415,616 ≈ 6.74B ✅ |
和官方數字完全對上。 這個驗算值得自己跑一次——它逼你把每個矩陣的形狀都想清楚,而且面試時能當場推導比背誦有說服力得多。
兩個觀察:
- FFN 佔 67%(135M/202M)。這是為什麼 MoE 選擇複製 FFN 而不是 attention。
- Embedding + LM head 佔 3.9%。但在小模型(如 1B)上這比例會飆到 20% 以上——這是小模型常做 embedding tying 的原因。
⚠️ 注意 / 什麼時候不適用
- 訓練與推論的形狀完全不同。訓練是
(B, N, ...)全序列並行;推論的 decode 階段是(B, 1, ...),計算特性因此天差地別(見 Prefill 與 Decode)。用訓練的直覺推論服務效能會錯得離譜。 - 這是 Llama 系的配方,不是唯一解。GPT-2(LayerNorm + GELU + learned PE)、Gemma(多加 post-norm)、DeepSeek(MLA + MoE)都不一樣。面試時先確認對方問的是哪一種。
- 實際實作有大量融合。QKV 常被合成一個矩陣乘法、norm 與後續運算會被融成單一 kernel。上面的分解是概念上的,不是 kernel 的真實邊界。
- 形狀對了不代表對。轉置、head 的切分順序、RoPE 的 interleave vs half-split 這些細節錯了都不會報錯,只會輸出垃圾。
🧪 我實際套用的紀錄
- 2026-09-20:從面試題庫展開。待辦:拿一個開源模型的 config 自己重跑一次參數量驗算。
🔗 相關
依序深入:分詞與 BPE → 注意力機制 → 位置編碼與 RoPE → FlashAttention → 正規化與激活函式 → 取樣與解碼策略
推論視角:KV Cache、Prefill 與 Decode
變體:混合專家 MoE