{"notes":[{"id":"transformers/pre-ln","category":"transformers","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Pre-LN Transformer","subtitle":"不用暖身了","author":"Z. Yuan","paperDate":"2020-02-12","publishedOn":"2026-03-18","world":"external/transformer-layernorm","paperTitle":"On Layer Normalization in the Transformer Architecture","paperUrl":"https://arxiv.org/abs/2002.04745","bibliography":{"title":"On Layer Normalization in the Transformer Architecture","authors":["Ruibin Xiong","Yunchang Yang","Di He","Kai Zheng","Shuxin Zheng","Chen Xing","Huishuai Zhang","Yanyan Lan","Liwei Wang","Tie-Yan Liu"],"url":"https://arxiv.org/abs/2002.04745","pdfUrl":"https://arxiv.org/pdf/2002.04745v2","codeUrl":null,"preprint":{"id":"2002.04745","submittedOn":"2020-02-12","url":"https://arxiv.org/abs/2002.04745"},"publication":null,"citation":"@misc{transformerspreln2020,\n  title = {{On Layer Normalization in the Transformer Architecture}},\n  author = {Ruibin Xiong and Yunchang Yang and Di He and Kai Zheng and Shuxin Zheng and Chen Xing and Huishuai Zhang and Yanyan Lan and Liwei Wang and Tie-Yan Liu},\n  year = {2020},\n  eprint = {2002.04745},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2002.04745}\n}\n","citationPath":"/content/papers/citations/transformers/pre-ln.419d25cfd84b.bib"},"thumbnail":{"src":"/content/papers/assets/f44d59bcadead95b9b93a42fc681bc473b038c13ed0c5c9e1effc7ee90409fc3.png","width":436,"height":531},"locale":"zh-hant","path":"/content/papers/zh-hant/transformers/pre-ln.33713d08cac6.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"兩種擺法","text":"兩種擺法","depth":3},{"id":"暖身到底多重要","text":"暖身到底多重要？","depth":3},{"id":"解決問題","text":"解決問題","depth":2},{"id":"看初始化那一刻","text":"看初始化那一刻","depth":3},{"id":"第一步主幹上的訊號有多大","text":"第一步：主幹上的訊號有多大？","depth":3},{"id":"第二步layernorm-會把梯度除以輸入的大小","text":"第二步：LayerNorm 會把梯度除以輸入的大小","depth":3},{"id":"第三步接起來","text":"第三步：接起來","depth":3},{"id":"實際量一次","text":"實際量一次","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"翻譯不暖身還更快","text":"翻譯：不暖身，還更快","depth":3},{"id":"bert省下四成","text":"BERT：省下四成","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"transformers/transformer","relation":"referenced","topic":""},{"id":"transformers/sparse-transformer","relation":"referenced","topic":""},{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""}]},{"id":"transformers/transformer","category":"transformers","legacyPath":"transformers/1706-transformer","legacySlug":"1706-transformer","legacyPaths":[],"title":"Transformer","subtitle":"新世界的起點","author":"Z. Yuan","paperDate":"2017-06-12","publishedOn":"2024-05-05","paperTitle":"Attention Is All You Need","paperUrl":"https://arxiv.org/abs/1706.03762","bibliography":{"title":"Attention Is All You Need","authors":["Ashish Vaswani","Noam Shazeer","Niki Parmar","Jakob Uszkoreit","Llion Jones","Aidan N. Gomez","Lukasz Kaiser","Illia Polosukhin"],"url":"https://arxiv.org/abs/1706.03762","pdfUrl":"https://arxiv.org/pdf/1706.03762","codeUrl":null,"preprint":{"id":"1706.03762","submittedOn":"2017-06-12","url":"https://arxiv.org/abs/1706.03762"},"publication":{"venue":"NeurIPS (NIPS)","year":2017,"kind":"conference","url":"https://proceedings.neurips.cc/paper_files/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html"},"citation":"@misc{transformerstransformer2017,\n  title = {{Attention Is All You Need}},\n  author = {Ashish Vaswani and Noam Shazeer and Niki Parmar and Jakob Uszkoreit and Llion Jones and Aidan N. Gomez and Lukasz Kaiser and Illia Polosukhin},\n  year = {2017},\n  eprint = {1706.03762},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1706.03762}\n}\n","citationPath":"/content/papers/citations/transformers/transformer.86c0068d96fd.bib"},"thumbnail":{"src":"/content/papers/assets/29a55cb05497bdd9bbb3f3a96b7ed6656fda3552fa6a0fa5eb29e8e899c1acc1.jpg","width":756,"height":1080},"locale":"zh-hant","path":"/content/papers/zh-hant/transformers/transformer.4bcaf5a33aae.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"解決問題","text":"解決問題","depth":2},{"id":"模型設計","text":"模型設計","depth":3},{"id":"輸入層","text":"輸入層","depth":3},{"id":"位置編碼","text":"位置編碼","depth":3},{"id":"自注意力機制","text":"自注意力機制","depth":3},{"id":"多頭注意力機制","text":"多頭注意力機制","depth":3},{"id":"跨注意力機制","text":"跨注意力機制","depth":3},{"id":"feed-forward-網路","text":"Feed-Forward 網路","depth":3},{"id":"layer-normalization","text":"Layer Normalization","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"為什麼要用自注意力機制","text":"為什麼要用自注意力機制？","depth":3},{"id":"實驗結果機器翻譯","text":"實驗結果：機器翻譯","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"transformers/flashattention","relation":"next","topic":"注意力的記憶體與計算成本"},{"id":"transformers/bert","relation":"next","topic":"雙向語言表徵的預訓練"},{"id":"transformers/gpt_1","relation":"next","topic":"從語言預訓練到情境學習"}]},{"id":"transformers/sparse-transformer","category":"transformers","legacyPath":"transformers/1904-sparse-transformer","legacySlug":"1904-sparse-transformer","legacyPaths":[],"title":"Sparse Transformer","subtitle":"稀疏注意力機制","author":"Z. Yuan","paperDate":"2019-04-23","publishedOn":"2024-06-09","paperTitle":"Generating Long Sequences with Sparse Transformers","paperUrl":"https://arxiv.org/abs/1904.10509","bibliography":{"title":"Generating Long Sequences with Sparse Transformers","authors":["Rewon Child","Scott Gray","Alec Radford","Ilya Sutskever"],"url":"https://arxiv.org/abs/1904.10509","pdfUrl":"https://arxiv.org/pdf/1904.10509","codeUrl":null,"preprint":{"id":"1904.10509","submittedOn":"2019-04-23","url":"https://arxiv.org/abs/1904.10509"},"publication":null,"citation":"@misc{transformerssparsetransformer2019,\n  title = {{Generating Long Sequences with Sparse Transformers}},\n  author = {Rewon Child and Scott Gray and Alec Radford and Ilya Sutskever},\n  year = {2019},\n  eprint = {1904.10509},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1904.10509}\n}\n","citationPath":"/content/papers/citations/transformers/sparse-transformer.961330a17a72.bib"},"thumbnail":{"src":"/content/papers/assets/847fd8e03beeb4395ae629700c5daaf1fa75dd302949008b9c248f7d77a8f9bc.jpg","width":1392,"height":694},"locale":"zh-hant","path":"/content/papers/zh-hant/transformers/sparse-transformer.c01fd33e9562.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"最前面的幾層","text":"最前面的幾層","depth":3},{"id":"第-1920-層","text":"第 19~20 層","depth":3},{"id":"不特定幾層","text":"不特定幾層","depth":3},{"id":"第-64128-層","text":"第 64~128 層","depth":3},{"id":"解決問題","text":"解決問題","depth":2},{"id":"解題思路-1-固定步長","text":"解題思路 1: 固定步長","depth":3},{"id":"解題思路-2-固定特定-index-的-token","text":"解題思路 2: 固定特定 Index 的 Token","depth":3},{"id":"修改後注意力機制","text":"修改後注意力機制","depth":3},{"id":"其他優化","text":"其他優化","depth":3},{"id":"訓練設定","text":"訓練設定","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"cifar-10","text":"CIFAR-10","depth":3},{"id":"enwik8","text":"EnWik8","depth":3},{"id":"imagenet-64x64","text":"ImageNet 64x64","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"transformers/longformer","relation":"comparison","topic":"長序列注意力的計算取捨"},{"id":"transformers/bigbird","relation":"comparison","topic":"長序列注意力的計算取捨"}]},{"id":"classic-cnns/resnet-v2","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ResNet v2","subtitle":"捷徑要乾淨","author":"Z. Yuan","paperDate":"2016-03-16","publishedOn":"2026-02-14","world":"external/resnet-v2","paperTitle":"Identity Mappings in Deep Residual Networks","paperUrl":"https://arxiv.org/abs/1603.05027","bibliography":{"title":"Identity Mappings in Deep Residual Networks","authors":["Kaiming He","Xiangyu Zhang","Shaoqing Ren","Jian Sun"],"url":"https://arxiv.org/abs/1603.05027","pdfUrl":"https://arxiv.org/pdf/1603.05027v3","codeUrl":null,"preprint":{"id":"1603.05027","submittedOn":"2016-03-16","url":"https://arxiv.org/abs/1603.05027"},"publication":null,"citation":"@misc{classiccnnsresnetv22016,\n  title = {{Identity Mappings in Deep Residual Networks}},\n  author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},\n  year = {2016},\n  eprint = {1603.05027},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1603.05027}\n}\n","citationPath":"/content/papers/citations/classic-cnns/resnet-v2.3d311a21e308.bib"},"thumbnail":{"src":"/content/papers/assets/7eda4acdde3019e92c5b44f59917b1e493a5b11b5b8a63280d03b15787934ef5.png","width":967,"height":469},"locale":"zh-hant","path":"/content/papers/zh-hant/classic-cnns/resnet-v2.63e5bb8d2aec.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"解決問題","text":"解決問題","depth":2},{"id":"兩個恆等映射","text":"兩個恆等映射","depth":3},{"id":"捷徑上多一點東西會怎樣","text":"捷徑上多一點東西會怎樣？","depth":3},{"id":"相加之後的-relu-該放哪","text":"相加之後的 ReLU 該放哪？","depth":3},{"id":"換個角度看pre-activation","text":"換個角度看：pre-activation","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"越深差距越大","text":"越深，差距越大","depth":3},{"id":"和其他方法比","text":"和其他方法比","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"referenced","topic":""},{"id":"classic-cnns/highway-networks","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v4","relation":"referenced","topic":""}]}],"text":"訓練 Transformer 有一個奇怪的習慣：學習率不能一開始就設好。\n\n原始的 Transformer 論文用的排程是這樣的：前 4000 步，學習率從接近 0 慢慢爬升到最大值，之後再逐步衰減。這段爬升叫做**學習率暖身**（warm-up）。卷積網路通常一開始就用比較大的學習率，再慢慢調小；只有像超大批次訓練這類特殊情況，才需要暖身。Transformer 卻幾乎每次都要。\n\n暖身很麻煩。它讓訓練變慢，又多了兩個要調的超參數：最大學習率和暖身步數，而且最後的成績對這兩個值很敏感。訓練 BERT 這種大模型時，每試一組設定都很貴。\n\n為什麼 Transformer 非暖身不可？2020 年 2 月，中國科學院、北京大學、微軟亞洲研究院與南開大學的 Ruibin Xiong、Yunchang Yang、Di He 等人放出這篇論文，後來發表在 ICML 2020。他們的答案是：問題出在 LayerNorm 放的位置。\n\n\n> [!TIP]\n> \n> 原始 Transformer 每個子層的結構，可以先看我們的筆記；那篇筆記在 LayerNorm 一節也提到，LayerNorm 的位置還可以再區分 Norm-First 與 Norm-Last：\n> \n> - **[[17.06] Transformer：新世界的起點](/blog/papers/transformers/transformer)**\n\n\n## 定義問題\n\n### 兩種擺法\n\nTransformer 的每一層有兩個子層：自注意力和前饋網路（FFN）。每個子層都有殘差連接，也都有 LayerNorm。三樣東西的順序，可以有不同的排法：\n\n[![左右兩個 Transformer 層的示意圖。(a) 輸入 x_l 經過 Multi-Head Attention，與捷徑相加後做 Layer Norm；再經過 FFN，與捷徑相加後再做 Layer Norm，得到 x_l+1。(b) 輸入 x_l 先做 Layer Norm，再進 Multi-Head Attention，與捷徑相加；接著先 Layer Norm，再進 FFN，再與捷徑相加，得到 x_l+1。兩邊的捷徑都畫成灰色粗箭頭](/content/papers/assets/f44d59bcadead95b9b93a42fc681bc473b038c13ed0c5c9e1effc7ee90409fc3.png)](/content/papers/assets/f44d59bcadead95b9b93a42fc681bc473b038c13ed0c5c9e1effc7ee90409fc3.png)\n\n*原論文 Figure 1，取自 [**v2 PDF 第 2 頁**](https://arxiv.org/pdf/2002.04745v2#page=2)。(a) Post-LN Transformer 層；(b) Pre-LN Transformer 層。*\n\n左邊是原始 Transformer 和 BERT 的做法：子層、殘差相加、LayerNorm，依序進行。LayerNorm 放在殘差區塊**之間**，作者把它叫做 **Post-LN**。以 FFN 子層為例：\n\n$$\nx_{l+1} = \\mathrm{LN}\\big(x + \\mathrm{FFN}(x)\\big)\n$$\n\n右邊把 LayerNorm 搬進殘差分支裡，放在子層**之前**，叫做 **Pre-LN**：\n\n$$\nx_{l+1} = x + \\mathrm{FFN}\\big(\\mathrm{LN}(x)\\big)\n$$\n\nPre-LN 的主幹上只有相加；因為主幹一路沒有正規化，最後輸出前還要再補一層 LayerNorm。\n\nPre-LN 在這篇論文之前就有人用了：Baevski 與 Auli 的語言模型、OpenAI 的 [Sparse Transformer](/blog/papers/transformers/sparse-transformer) 都採用它，tensor2tensor、OpenNMT 等翻譯工具也有實作；Wang 等人還發現，層數變多時 Pre-LN 比 Post-LN 好。不過這些工作的訓練流程裡，暖身都還留著。\n\n### 暖身到底多重要？\n\n作者先在 IWSLT14 德翻英的翻譯任務上，用 Post-LN Transformer 確認暖身的影響。暖身的排程是：\n\n$$\n\\mathrm{lr}(t) = \\frac{t}{T_{\\text{warmup}}}\\,\\mathrm{lr}_{\\max}, \\quad t \\le T_{\\text{warmup}}\n$$\n\n之後接逆平方根衰減。他們分別用 Adam 和一般的 SGD 訓練，比較有沒有暖身、暖身多久：\n\n[![兩組折線圖，橫軸都是 epoch。(a) 用 Adam 訓練：左邊是驗證損失，右邊是 BLEU。沒有暖身的兩條虛線，損失停在 7 左右、BLEU 不到 10；暖身 500 步、最大學習率 1e-3 的橘線也很差；暖身 4000 步的兩條線，損失降到約 4、BLEU 升到 30 以上。(b) 用 SGD 訓練：有暖身時損失從 10 降到 6 到 7 之間，BLEU 約 7；沒有暖身時損失停在 8.5 以上，BLEU 接近 0](/content/papers/assets/82e2f8ace58e613addf613e637786b7479429ee4db56d81756a47b8554ff3968.png)](/content/papers/assets/82e2f8ace58e613addf613e637786b7479429ee4db56d81756a47b8554ff3968.png)\n\n*原論文 Figure 2，取自 [**v2 PDF 第 4 頁**](https://arxiv.org/pdf/2002.04745v2#page=4)。IWSLT14 德翻英的驗證損失與 BLEU：(a) 用 Adam，(b) 用 SGD。*\n\n結果很明確：\n\n- **不暖身就訓練不起來**。用 Adam、不暖身，BLEU 只有 8.45；有暖身的模型大約 34。SGD 的成績本來就比 Adam 差很多，但趨勢一樣：不暖身時，15 個 epoch 裡 BLEU 只比 0 高一點點。\n- **暖身多久也很敏感**。暖身只有 500 步時，最大學習率 5e-4 和 1e-3 的 BLEU 分別只有 31.16 和 2.77。\n\n之前也有人解釋過暖身的作用。RAdam 的作者認為，暖身是在訓練初期壓低 Adam 自適應學習率的變異數。但這裡 SGD 一樣需要暖身，所以作者認為暖身的好處跟特定的最佳化器無關，原因要往模型本身找。\n\n## 解決問題\n\n### 看初始化那一刻\n\n暖身只發生在最開始的幾千步，所以作者把焦點放在初始化：網路剛建好、參數都是隨機值的時候，梯度長什麼樣子？\n\n他們用平均場理論來分析，並做了幾個簡化：只用單頭注意力；所有權重矩陣都是 $d\\times d$，用 Xavier 初始化；注意力的 $W^Q$、$W^K$ 初始化為 0，讓注意力在一開始是均勻分布；輸入向量也當成高斯分布。\n\n分析分三步：先看隱藏層的大小，再看 LayerNorm 怎麼處理梯度，最後把兩者接起來。\n\n### 第一步：主幹上的訊號有多大？\n\nPost-LN 每一層最後都做 LayerNorm，所以每層輸出的範數固定在 $\\sqrt{d}$ 左右。作者改看最後一次正規化之前的 $x^{\\text{post},5}$，也就是 FFN 輸出加上殘差之後的向量。Pre-LN 的主幹沒有正規化，每一層都往上加東西。作者證明：\n\n$$\n\\mathbb{E}\\big\\|x^{\\text{post},5}_{l}\\big\\|_2^2 = \\tfrac{3}{2}d, \\qquad\n\\Big(1+\\tfrac{l}{2}\\Big)d \\le \\mathbb{E}\\big\\|x^{\\text{pre}}_{l}\\big\\|_2^2 \\le \\Big(1+\\tfrac{3l}{2}\\Big)d\n$$\n\nPost-LN 每一層都一樣大；Pre-LN 隨著層數線性長大。我們照論文的簡化設定跑一次，看看是不是這樣：\n\n```python\nimport torch\nimport torch.nn.functional as F\n\ntorch.manual_seed(0)\nd, n, L = 512, 8, 12                       # 隱藏維度、序列長度、層數\nln = lambda v: F.layer_norm(v, (d,))\nxavier = lambda: torch.randn(d, d) / d ** 0.5   # Xavier：d×d 的矩陣，變異數 2/(d+d) = 1/d\n\ndef attention(h, Wv):                      # 論文的簡化設定：W_Q = W_K = 0，注意力是均勻分布\n    return (h @ Wv).mean(dim=0, keepdim=True).expand_as(h)\n\ndef ffn(h, W1, W2):\n    return F.relu(h @ W1) @ W2\n\nx_post = x_pre = torch.randn(n, d)\nfor l in range(1, L + 1):\n    Wv, W1, W2 = xavier(), xavier(), xavier()\n    # Post-LN：相加之後正規化\n    x3 = ln(x_post + attention(x_post, Wv))\n    x5 = x3 + ffn(x3, W1, W2)\n    x_post = ln(x5)\n    # Pre-LN：先正規化再進子層，主幹直接相加\n    x_mid = x_pre + attention(ln(x_pre), Wv)\n    x_pre = x_mid + ffn(ln(x_mid), W1, W2)\n    if l in (1, 2, 4, 8, 12):\n        post = (x5 ** 2).sum(1).mean() / d\n        pre = (x_pre ** 2).sum(1).mean() / d\n        print(f\"第 {l:2d} 層後：Post-LN 的 ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = {post:.2f}   \"\n              f\"Pre-LN 的 ‖x‖²/d = {pre:5.2f}（理論範圍 {1 + l / 2:.1f}～{1 + 3 * l / 2:.1f}）\")\n```\n\n```text\n第  1 層後：Post-LN 的 ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.51   Pre-LN 的 ‖x‖²/d =  1.62（理論範圍 1.5～2.5）\n第  2 層後：Post-LN 的 ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.41   Pre-LN 的 ‖x‖²/d =  2.27（理論範圍 2.0～4.0）\n第  4 層後：Post-LN 的 ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.55   Pre-LN 的 ‖x‖²/d =  4.41（理論範圍 3.0～7.0）\n第  8 層後：Post-LN 的 ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.54   Pre-LN 的 ‖x‖²/d =  9.73（理論範圍 5.0～13.0）\n第 12 層後：Post-LN 的 ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.32   Pre-LN 的 ‖x‖²/d = 15.44（理論範圍 7.0～19.0）\n```\n\nPost-LN 一直在 1.5 附近（這只是一次抽樣，會有一點起伏）；Pre-LN 一層層往上長，而且都落在理論範圍裡。\n\n$\\tfrac{3}{2}$ 是怎麼來的？$x^{\\text{post},3}$ 剛做完 LayerNorm，平方範數是 $d$。它經過 FFN：乘上 Xavier 初始化的 $W^1$ 之後，每個元素的變異數是 1；ReLU 砍掉一半，平方範數剩 $d/2$；再乘上 $W^2$，還是 $d/2$。兩者相加，就是 $d + d/2 = \\tfrac{3}{2}d$。Pre-LN 每一層也會加進至少 FFN 的那 $d/2$，這就是下限裡的 $l/2$。\n\n### 第二步：LayerNorm 會把梯度除以輸入的大小\n\nLayerNorm 把輸入減掉平均、除以標準差。輸入放大 $k$ 倍，輸出不變；所以反過來，輸出對輸入的導數會縮小 $k$ 倍。作者把這件事寫成：\n\n$$\n\\big\\|J_{\\mathrm{LN}}(x)\\big\\|_2 = O\\!\\left(\\frac{\\sqrt{d}}{\\|x\\|_2}\\right)\n$$\n\n$J_{\\mathrm{LN}}$ 是 LayerNorm 的 Jacobian 矩陣。直接算一次：\n\n```python\nimport torch\nimport torch.nn.functional as F\nfrom torch.autograd.functional import jacobian\n\ntorch.manual_seed(0)\nd = 256\nz = torch.randn(d)\nfor k in (1, 2, 4, 8):\n    x = k * z                                          # 同一個方向，長度放大 k 倍\n    J = jacobian(lambda v: F.layer_norm(v, (d,)), x)   # LayerNorm 對輸入的 Jacobian，形狀 [d, d]\n    print(f\"‖x‖ = {x.norm():6.1f}   Jacobian 的譜範數 = {torch.linalg.matrix_norm(J, ord=2):.4f}\"\n          f\"   √d / ‖x‖ = {d ** 0.5 / x.norm():.4f}\")\n```\n\n```text\n‖x‖ =   15.0   Jacobian 的譜範數 = 1.0651   √d / ‖x‖ = 1.0647\n‖x‖ =   30.1   Jacobian 的譜範數 = 0.5325   √d / ‖x‖ = 0.5323\n‖x‖ =   60.1   Jacobian 的譜範數 = 0.2663   √d / ‖x‖ = 0.2662\n‖x‖ =  120.2   Jacobian 的譜範數 = 0.1331   √d / ‖x‖ = 0.1331\n```\n\n輸入長度每加倍一次，Jacobian 就減半，和 $\\sqrt{d}/\\|x\\|$ 幾乎一模一樣。梯度往回傳經過 LayerNorm 時，就是乘上這個 Jacobian：輸入越大，傳回去的梯度越小。\n\n### 第三步：接起來\n\n把前兩步接在一起，就是這篇論文的主要定理。作者分析的是最後一層 FFN 的第二個權重矩陣 $W^{2,L}$，結論是（在一個高機率的條件下）：\n\n$$\n\\text{Post-LN：}\\left\\|\\frac{\\partial \\tilde{\\mathcal{L}}}{\\partial W^{2,L}}\\right\\|_F \\le O\\big(d\\sqrt{\\ln d}\\big), \\qquad\n\\text{Pre-LN：}\\left\\|\\frac{\\partial \\tilde{\\mathcal{L}}}{\\partial W^{2,L}}\\right\\|_F \\le O\\left(d\\sqrt{\\frac{\\ln d}{L}}\\right)\n$$\n\n道理是這樣的。Post-LN 最後一層 LayerNorm 的輸入是 $x^{\\text{post},5}$，大小固定在 $\\sqrt{3d/2}$ 左右，和層數無關，所以最後一層的梯度也和層數無關。Pre-LN 最後那層 LayerNorm 的輸入是一路累加上來的主幹，平方範數隨層數 $L$ 線性成長，範數大約是 $\\sqrt{L}$ 的量級；梯度經過它，就被除以 $\\sqrt{L}$。\n\n作者還做了一些初步的推廣分析，結論是：Post-LN 越靠近輸出層的參數，梯度越大，越往輸入端越小；Pre-LN 各層的梯度大致相同。\n\n### 實際量一次\n\n理論做了不少簡化，作者用真實的模型檢查。他們先確認隱藏層範數的集中性質成立，再量梯度：\n\n[![四張圖。(a)(b) 是 6 層編碼器、6 層解碼器的 Transformer 中，每一層 FFN 的 W1 與 W2 的梯度大小長條圖：藍色 Pre-LN（初始化時）各層的高度變化不大；橘色 Post-LN（初始化時）隨層數遞增，第 6 層最高；綠色 Post-LN（暖身之後）幾乎是 0。(c) Pre-LN 最後一層 W2 的梯度隨總層數從 6 增加到 14 而下降，從 0.3 降到約 0.13。(d) Post-LN 最後一層 W2 的梯度維持在 1.6 左右，不隨層數改變](/content/papers/assets/1365260baf3a0bcbf5df3b21d3b56df47b2abd8ebd257a7c0472af1a24dd360a.png)](/content/papers/assets/1365260baf3a0bcbf5df3b21d3b56df47b2abd8ebd257a7c0472af1a24dd360a.png)\n\n*原論文 Figure 3，取自 [**v2 PDF 第 7 頁**](https://arxiv.org/pdf/2002.04745v2#page=7)。(a)(b) 6-6 層 Transformer 各層 FFN 權重的梯度大小；(c)(d) 不同大小的模型中，最後一層 $W^2$ 的梯度大小。每組實驗用十個隨機種子重複。*\n\n和理論對得起來：\n\n- 右邊兩張：Post-LN 最後一層的梯度不管模型多大，都在 1.6 左右；Pre-LN 隨著層數變多而下降。\n- 左邊兩張：Post-LN 的梯度從第 1 層到第 6 層一路變大，最靠近輸出的那層最大；Pre-LN 各層的差異小得多。\n\n所以 Post-LN 在初始化時，靠近輸出的參數梯度很大。這時直接用大的學習率，更新步伐就會太大，訓練不穩定。暖身正好避開了這段：等梯度變小了，才把學習率調上去。圖上綠色的長條（Post-LN 暖身之後）幾乎都是 0，梯度確實已經小很多了。\n\n作者另外試了不暖身、全程用固定的小學習率 1e-4 訓練 Post-LN。這樣也能把模型訓練到一定程度，但收斂慢得多。\n\n反過來看，Pre-LN 在初始化時梯度就很規矩，那它應該可以拿掉暖身。\n\n## 討論\n\n### 翻譯：不暖身，還更快\n\n作者在兩個翻譯任務上驗證：\n\n- **IWSLT14 德翻英**：6 層編碼器、6 層解碼器，嵌入維度 512，FFN 1024，4 個注意力頭。\n- **WMT14 英翻德**：Transformer base 的設定，約 450 萬組平行句對。\n\nPost-LN 照原始論文暖身 4000 步，再接逆平方根衰減。Pre-LN 完全不暖身：IWSLT14 從 5e-4 開始，第 8 個 epoch 乘上 0.1；WMT14 分別從 7e-4 和 1.5e-3 開始，第 6 個 epoch 衰減，之後接逆平方根衰減。兩者的最大學習率設成一樣。RAdam 號稱可以拿掉暖身，作者也在 IWSLT14 上一起比較。\n\n[![四張折線圖，橫軸都是 epoch。(a)(b) 是 IWSLT14 的驗證損失與 BLEU：Pre-LN（不論 Adam 或 RAdam、都不暖身）的紅線與橘線在前幾個 epoch 就降到很低、BLEU 很快升到 30 以上；Post-LN 用 Adam 加暖身的綠線，以及用 RAdam 不暖身的藍線，都爬得比較慢，最後才追上。(c)(d) 是 WMT14 的驗證損失與 BLEU：兩種學習率的 Pre-LN 都比對應的 Post-LN 更早收斂，最後 BLEU 都在 26 左右](/content/papers/assets/26ae58e24cef2c40c73b93b2c17d74d07d2a6fafe71d071e70ed0a490d9d585f.png)](/content/papers/assets/26ae58e24cef2c40c73b93b2c17d74d07d2a6fafe71d071e70ed0a490d9d585f.png)\n\n*原論文 Figure 4，取自 [**v2 PDF 第 8 頁**](https://arxiv.org/pdf/2002.04745v2#page=8)。IWSLT14 德翻英（a、b）與 WMT14 英翻德（c、d）的驗證損失與 BLEU。*\n\n三個觀察：\n\n1. **暖身不再必要**。IWSLT14 上，不暖身的 Pre-LN 最後 BLEU 約 34、驗證損失約 4，和暖身的 Post-LN 相當。\n2. **收斂更快**。IWSLT14 上，Pre-LN 第 9 個 epoch 的表現，和 Post-LN 第 15 個 epoch 差不多；WMT14 也有類似的情況。\n3. **LayerNorm 的位置比最佳化器更重要**。RAdam 確實能讓 Post-LN 不暖身也訓練得起來；可是換成 Pre-LN 之後，用 RAdam 還是 Adam 幾乎沒有差別。\n\n作者也提到，如果把超參數調好（初始學習率 7.5e-4、dropout 0.3 等），Pre-LN 在 IWSLT14 上可以做到 35.5 的測試 BLEU。\n\n### BERT：省下四成\n\n預訓練用的是 BERT base（12 層、隱藏維度 768、12 個頭），資料是英文維基百科加上作者自己收集的 BookCorpus，總共約 34 億字。\n\nPost-LN BERT 照原論文的設定：暖身 10,000 步，最大學習率 1e-4。作者試過把 Post-LN 的學習率提高到 3e-4，訓練直接發散。Pre-LN BERT 則不暖身，從 3e-4 開始線性衰減。\n\n[![三張折線圖，橫軸都是預訓練步數（千步）。(a) BERT 的驗證損失：橘色 Pre-LN 從一開始就低於藍色虛線的 Post-LN，兩條線大致平行下降，Pre-LN 約在 500 千步降到 1.69，Post-LN 要到約 700 千步。(b) MRPC 準確率與 (c) RTE 準確率：各個預訓練階段的 Pre-LN 都高於 Post-LN，差距在預訓練初期最明顯](/content/papers/assets/9707b62474bc0eba4a5ff16f9578eb437856e931b5127793ec370b6a1b0d0a06.png)](/content/papers/assets/9707b62474bc0eba4a5ff16f9578eb437856e931b5127793ec370b6a1b0d0a06.png)\n\n*原論文 Figure 5，取自 [**v2 PDF 第 8 頁**](https://arxiv.org/pdf/2002.04745v2#page=8)。(a) BERT 預訓練的驗證損失；(b)(c) 不同預訓練階段的模型在 MRPC、RTE 上微調後的準確率，誤差線是六次微調的 95% 信賴區間。*\n\nPost-LN 要訓練到第 700k 步，驗證損失才降到 1.69；Pre-LN 第 500k 步就到了，大約快了 40%。省下的 200k 步，遠多於暖身本身的 10k 步，所以快的原因不只是少了暖身，更在於 Pre-LN 撐得住大得多的學習率。\n\n拿不同階段的模型去微調 MRPC 和 RTE，Pre-LN 在下游任務上也收斂得比較快。\n\n## 結論\n\n這篇論文把一個工程上的習慣，追到了架構上的原因：Post-LN 在初始化時，靠近輸出的參數梯度很大，必須用暖身避開；把 LayerNorm 搬進殘差分支、放在子層之前，最後一層的梯度會被主幹的大小按 $1/\\sqrt{L}$ 縮小，各層的梯度也比較平均，暖身就可以拿掉，學習率還能開得更大。\n\n要記得理論分析的範圍：它看的是初始化那一刻，又做了均勻注意力、單頭這些簡化；「Post-LN 越靠近輸出梯度越大」那部分，作者自己也標成初步結果，主要靠 Figure 3 的實測支持。\n\n「把正規化搬進分支、讓捷徑保持乾淨」的想法，在卷積網路上也出現過；GPT-2 也把 LayerNorm 移到了每個子層的輸入處：\n\n\n> [!TIP]\n> \n> - **[[16.03] ResNet v2：捷徑要乾淨](/blog/papers/classic-cnns/resnet-v2)**\n> - **[[19.02] GPT-2：四十八層解碼器](/blog/papers/transformers/gpt_2)**\n\n\n如果你要從頭訓練 Transformer，這篇的建議很直接：LayerNorm 放在子層前面，輸出前記得再補一層 LayerNorm。在論文的實驗規模裡，這樣不暖身也訓練得起來，學習率還能開大一點。\n\nPre-LN 後來成了很多大型語言模型的預設擺法，但它也有代價。從第一步的結果就看得出來：主幹的平方範數隨層數線性成長，每一層加進去的量卻差不多，越後面的層，對主幹的相對影響就越小。2021 年的 [NormFormer](https://arxiv.org/abs/2110.09456) 指出 Pre-LN 預訓練時前面幾層的梯度比後面大得多，在每層多加了幾個正規化；2022 年的 [DeepNet](https://arxiv.org/abs/2203.00555) 則回頭改造 Post-LN，想同時保留 Post-LN 的表現和 Pre-LN 的穩定，把 Transformer 推到一千層。\n\nLayerNorm 到底該擺哪裡，這個題目還沒結束，之後有機會我們再來聊。\n","imageSizes":{"/content/papers/assets/f44d59bcadead95b9b93a42fc681bc473b038c13ed0c5c9e1effc7ee90409fc3.png":{"width":436,"height":531},"/content/papers/assets/82e2f8ace58e613addf613e637786b7479429ee4db56d81756a47b8554ff3968.png":{"width":1348,"height":391},"/content/papers/assets/1365260baf3a0bcbf5df3b21d3b56df47b2abd8ebd257a7c0472af1a24dd360a.png":{"width":1332,"height":263},"/content/papers/assets/26ae58e24cef2c40c73b93b2c17d74d07d2a6fafe71d071e70ed0a490d9d585f.png":{"width":1342,"height":276},"/content/papers/assets/9707b62474bc0eba4a5ff16f9578eb437856e931b5127793ec370b6a1b0d0a06.png":{"width":1011,"height":369}}}
