對應原題(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 嗎

項目算式參數
Embedding131,072,000
每層 Attention(4 個方陣)67,108,864
每層 FFN(gate/up/down)135,266,304
每層 2 個 RMSNorm8,192
每層小計202,383,360
× 32 層6,476,267,520
Final norm4,096
LM head131,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