對應原題(Common ‧ LLM Internals)
- Why is LayerNorm placed pre-block in modern transformers, and what is RMSNorm?
- Explain SwiGLU and why gated activations replaced ReLU/GELU in modern LLM MLP blocks. — Asked at: Meta
🎯 什麼情境該想到我
當你「在讀模型 config 看到 rms_norm_eps、intermediate_size: 11008 這種數字卻不知道為什麼」的時候。這一頁講的是 2017 原始 Transformer 到今天 Llama 之間,那些沒人特別宣傳但每家都改了的東西。
⚙️ 怎麼用(機制)
一、Post-LN → Pre-LN
| 公式 | 殘差路徑 | |
|---|---|---|
| Post-LN(原始 Transformer, 2017) | 每層都被 LN 「切斷」一次 | |
| Pre-LN(GPT-2 起的標準) | 乾淨的恆等捷徑,從頭通到尾 |
為什麼改:Post-LN 的梯度要穿過每一層的 LayerNorm 才能往回傳。Xiong et al. (2020) 分析出 Post-LN 在初始化時靠近輸出層的梯度遠大於底層,深了就爆。所以 Post-LN 模型必須配 learning-rate warmup,而且對 warmup 步數很敏感——這在大模型訓練上是災難(一次失敗燒掉幾十萬美金)。
Pre-LN 的殘差是純加法,梯度可以無損直達底層:
那個 1 就是訓練穩定的來源。代價:
- 收斂後的品質略遜於調好的 Post-LN(有時被稱為 representation collapse——深層的更新量相對變小)
- 最後一層之後必須補一個 final norm,否則輸出尺度會隨深度漂走
面試答法:「Pre-LN 犧牲了一點最終品質,換到訓練穩定性與對超參數的不敏感。在你只能訓一次的規模下,這個交易是壓倒性的。」
(後續還有 Sandwich-LN、DeepNorm 等折衷方案,目的都是想兩邊都要。)
二、LayerNorm → RMSNorm
LayerNorm(Ba et al., 2016)做兩件事:
RMSNorm(Zhang & Sennrich, 2019)只做 re-scale:
拿掉了:減均值、bias 項。
為什麼可以拿掉:論文的論點是 LayerNorm 的成功主要來自 re-scaling 不變性,re-centering 貢獻不大。實驗上品質相當,而運算省了——論文回報執行時間減少 7%–64%(視模型與實作而定)。
省的不只是那幾個 FLOPs:少一次 reduction(求均值)就少一次跨執行緒同步,在 GPU 上這比算術本身貴。
class RMSNorm(nn.Module):
def __init__(self, d, eps=1e-6):
super().__init__()
self.g = nn.Parameter(torch.ones(d))
self.eps = eps
def forward(self, x):
# ★ 一定要在 fp32 算,fp16 下平方和容易溢位
dtype = x.dtype
x = x.float()
x = x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)
return (x.to(dtype) * self.g)今天 Llama、Qwen、Mistral、Gemma 全是 Pre-RMSNorm。
三、FFN:ReLU → GELU → SwiGLU
原始 FFN:
SwiGLU(Shazeer, 2020, GLU Variants Improve Transformer):
其中 ; 時就是 SiLU(Llama 用的)。
def swiglu_ffn(x, W_gate, W_up, W_down):
return (F.silu(x @ W_gate) * (x @ W_up)) @ W_down★ 三個矩陣,不是兩個 —— 這是必考的細節。
為什麼 從 變成
多了一個矩陣,參數量會從 變 。為了公平比較,把 縮成 ,參數量回到 。
驗算 Llama-2-7B: → → 向上取到 256 的倍數 = 11008。
這正是 config 裡的 intermediate_size。那個看起來很隨機的數字就是這樣來的。
為什麼門控有效
是乘法交互。純 ReLU/GELU 網路每一路都是獨立的加權和再過激活;門控讓一路的輸出調變另一路,等於網路可以學「在什麼條件下讓這個訊號通過」。
關於「為什麼」的誠實答案:Shazeer 論文的結語很有名——
“We offer no explanation as to why these architectures seem to work; we attribute their success, as all else, to divine benevolence.”
面試時值得原樣引用:它是實證勝出的,理論解釋至今不完整。 承認這點比硬掰一個機率論解釋更有說服力。
現代 LLM 層的完整樣貌
x ──┬────────────────────────────────┐
└─▶ RMSNorm ─▶ Attention(RoPE) ──┴─▶ + ──┬──────────────────┐
└─▶ RMSNorm ─▶ SwiGLU ─┴─▶ +
最後再接一個 final RMSNorm,然後 LM head。
⚠️ 注意 / 什麼時候不適用
- RMSNorm 要在 fp32 算。bf16 下平方和的累積誤差會咬人,fp16 更慘(可能溢位)。HF 的實作都有明確 upcast。
eps不能亂改。Llama 是1e-6、有些模型是1e-5。改了等於換了一個模型,推論框架設錯會靜默掉品質。- RMSNorm 沒有 bias。移植權重時漏了這件事會出現形狀對得上但結果全錯。
- SwiGLU 的三個矩陣名稱各家不同(
gate_proj/up_proj/down_projvsw1/w3/w2),且w1/w3誰是 gate 常被搞反。搞反了不會報錯,只會安靜地變笨。 - Pre-LN 不是絕對的。Gemma 2 用了 pre+post 兩層 norm;這塊仍在演進。
- 這些都不是能後天改的。要換 norm 或激活就得重訓。
🧪 我實際套用的紀錄
- 2026-09-20:從面試題庫展開,尚未實際套用。
🔗 相關
- 注意力機制 —— 同一層裡的另一半
- 混合專家 MoE —— 被複製成多份的就是這裡的 SwiGLU FFN
- 位置編碼與 RoPE —— 現代層的第三個改動
- GPU 記憶體估算 —— 直接決定參數量