對應原題(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_proj vs w1/w3/w2),且 w1/w3 誰是 gate 常被搞反。搞反了不會報錯,只會安靜地變笨。
  • Pre-LN 不是絕對的。Gemma 2 用了 pre+post 兩層 norm;這塊仍在演進。
  • 這些都不是能後天改的。要換 norm 或激活就得重訓。

🧪 我實際套用的紀錄

  • 2026-09-20:從面試題庫展開,尚未實際套用。

🔗 相關