{"notes":[{"id":"transformers/pre-ln","category":"transformers","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Pre-LN Transformer","subtitle":"Plus besoin d'échauffement","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":"fr","path":"/content/papers/fr/transformers/pre-ln.b0c55ecc8c17.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"deux-dispositions","text":"Deux dispositions","depth":3},{"id":"léchauffement-est-il-si-important","text":"L'échauffement est-il si important ?","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"regarder-linstant-de-linitialisation","text":"Regarder l'instant de l'initialisation","depth":3},{"id":"première-étape-quelle-est-lamplitude-du-signal-sur-le-tronc","text":"Première étape : quelle est l'amplitude du signal sur le tronc ?","depth":3},{"id":"deuxième-étape-layernorm-divise-le-gradient-par-la-taille-de-lentrée","text":"Deuxième étape : LayerNorm divise le gradient par la taille de l'entrée","depth":3},{"id":"troisième-étape-relier-les-deux","text":"Troisième étape : relier les deux","depth":3},{"id":"mesurer-pour-de-vrai","text":"Mesurer pour de vrai","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"traduction-sans-échauffement-et-plus-vite","text":"Traduction : sans échauffement, et plus vite","depth":3},{"id":"bert-40-de-gagné","text":"BERT : 40 % de gagné","depth":3},{"id":"conclusion","text":"Conclusion","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":"Le début d'un nouveau monde","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":"fr","path":"/content/papers/fr/transformers/transformer.eaacef08d3ba.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"architecture-du-modèle","text":"Architecture du modèle","depth":3},{"id":"entrée-du-modèle","text":"Entrée du modèle","depth":3},{"id":"encodage-positionnel","text":"Encodage positionnel","depth":3},{"id":"auto-attention","text":"Auto-attention","depth":3},{"id":"attention-multi-têtes","text":"Attention multi-têtes","depth":3},{"id":"attention-croisée","text":"Attention croisée","depth":3},{"id":"réseau-feed-forward","text":"Réseau feed-forward","depth":3},{"id":"normalisation-de-couche","text":"Normalisation de couche","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"pourquoi-utiliser-lauto-attention-","text":"Pourquoi utiliser l'auto-attention ?","depth":3},{"id":"résultats-en-traduction-automatique","text":"Résultats en traduction automatique","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"transformers/flashattention","relation":"next","topic":"Mémoire et calcul de l’attention"},{"id":"transformers/bert","relation":"next","topic":"Préentraînement des représentations bidirectionnelles"},{"id":"transformers/gpt_1","relation":"next","topic":"Du préentraînement à l’apprentissage en contexte"}]},{"id":"transformers/sparse-transformer","category":"transformers","legacyPath":"transformers/1904-sparse-transformer","legacySlug":"1904-sparse-transformer","legacyPaths":[],"title":"Sparse Transformer","subtitle":"Une attention clairsemée","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":"fr","path":"/content/papers/fr/transformers/sparse-transformer.382e4f782bb6.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"les-toutes-premières-couches","text":"Les toutes premières couches","depth":3},{"id":"les-couches-19-et-20","text":"Les couches 19 et 20","depth":3},{"id":"quelques-autres-couches","text":"Quelques autres couches","depth":3},{"id":"les-couches-64-à-128","text":"Les couches 64 à 128","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"première-idée--un-pas-fixe","text":"Première idée : un pas fixe","depth":3},{"id":"deuxième-idée--des-indices-fixes","text":"Deuxième idée : des indices fixes","depth":3},{"id":"attention-modifiée","text":"Attention modifiée","depth":3},{"id":"dautres-optimisations","text":"D'autres optimisations","depth":3},{"id":"configuration-de-lentraînement","text":"Configuration de l'entraînement","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"cifar-10","text":"CIFAR-10","depth":3},{"id":"enwik8","text":"EnWik8","depth":3},{"id":"imagenet-64--64","text":"ImageNet 64 × 64","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"transformers/longformer","relation":"comparison","topic":"Coût de l’attention sur les longues séquences"},{"id":"transformers/bigbird","relation":"comparison","topic":"Coût de l’attention sur les longues séquences"}]},{"id":"classic-cnns/resnet-v2","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ResNet v2","subtitle":"Le raccourci doit rester propre","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":"fr","path":"/content/papers/fr/classic-cnns/resnet-v2.1e2cdeb3e2c3.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"deux-applications-identité","text":"Deux applications identité","depth":3},{"id":"que-se-passe-t-il-si-lon-charge-le-raccourci","text":"Que se passe-t-il si l'on charge le raccourci ?","depth":3},{"id":"où-placer-la-relu-qui-suit-laddition","text":"Où placer la ReLU qui suit l'addition ?","depth":3},{"id":"changer-de-point-de-vue-la-préactivation","text":"Changer de point de vue : la préactivation","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"plus-cest-profond-plus-lécart-se-creuse","text":"Plus c'est profond, plus l'écart se creuse","depth":3},{"id":"comparaison-avec-dautres-méthodes","text":"Comparaison avec d'autres méthodes","depth":3},{"id":"conclusion","text":"Conclusion","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":"L'entraînement des Transformers obéit à une curieuse habitude : impossible de fixer le taux d'apprentissage dès le départ.\n\nLe Transformer d'origine suit ce calendrier : pendant les 4000 premières étapes, le taux d'apprentissage monte lentement d'une valeur proche de 0 jusqu'à son maximum, puis décroît progressivement. Cette montée s'appelle **l'échauffement du taux d'apprentissage** (*warm-up*). Les réseaux convolutifs commencent généralement avec un taux d'apprentissage assez élevé, qu'ils réduisent peu à peu ; seuls des cas particuliers, comme l'entraînement avec de très grands lots, demandent un échauffement. Les Transformers, eux, en ont besoin presque à chaque fois.\n\nL'échauffement est contraignant. Il ralentit l'entraînement et ajoute deux hyperparamètres à régler, le taux d'apprentissage maximal et le nombre d'étapes d'échauffement, auxquels le résultat final est très sensible. Pour un grand modèle comme BERT, chaque configuration essayée coûte cher.\n\nPourquoi les Transformers ne peuvent-ils pas se passer d'échauffement ? En février 2020, Ruibin Xiong, Yunchang Yang, Di He et leurs collègues de l'Académie chinoise des sciences, de l'université de Pékin, de Microsoft Research Asia et de l'université de Nankai publient cet article, présenté ensuite à l'ICML 2020. Leur réponse : le problème vient de la position de LayerNorm.\n\n\n> [!TIP]\n> \n> Pour la structure de chaque sous-couche du Transformer d'origine, vous pouvez commencer par notre note ; dans sa section sur LayerNorm, elle mentionne aussi qu'on distingue, selon la position de LayerNorm, les variantes Norm-First et Norm-Last :\n> \n> - **[[17.06] Transformer : Le début d'un nouveau monde](/blog/papers/transformers/transformer)**\n\n\n## Définir le problème\n\n### Deux dispositions\n\nChaque couche d'un Transformer comporte deux sous-couches : l'auto-attention et le réseau feed-forward (FFN). Chaque sous-couche a une connexion résiduelle et une LayerNorm. Ces trois éléments peuvent être ordonnés de différentes façons :\n\n[![Deux couches de Transformer côte à côte. (a) L'entrée x_l passe par Multi-Head Attention, s'additionne au raccourci, puis passe par Layer Norm ; elle passe ensuite par FFN, s'additionne au raccourci et repasse par Layer Norm, ce qui donne x_l+1. (b) L'entrée x_l passe d'abord par Layer Norm, puis par Multi-Head Attention, et s'additionne au raccourci ; vient ensuite Layer Norm, puis FFN, puis l'addition au raccourci, ce qui donne x_l+1. Dans les deux cas, le raccourci est dessiné comme une épaisse flèche grise](/content/papers/assets/f44d59bcadead95b9b93a42fc681bc473b038c13ed0c5c9e1effc7ee90409fc3.png)](/content/papers/assets/f44d59bcadead95b9b93a42fc681bc473b038c13ed0c5c9e1effc7ee90409fc3.png)\n\n*Figure 1 de l'article, extraite de la [**page 2 du PDF v2**](https://arxiv.org/pdf/2002.04745v2#page=2). (a) Couche de Post-LN Transformer ; (b) couche de Pre-LN Transformer.*\n\nÀ gauche, l'approche du Transformer d'origine et de BERT : sous-couche, addition résiduelle, puis LayerNorm, dans cet ordre. La LayerNorm se trouve **entre** les blocs résiduels ; les auteurs appellent cette disposition **Post-LN**. Pour la sous-couche FFN, par exemple :\n\n$$\nx_{l+1} = \\mathrm{LN}\\big(x + \\mathrm{FFN}(x)\\big)\n$$\n\nÀ droite, la LayerNorm est déplacée dans la branche résiduelle, **avant** la sous-couche ; c'est la disposition **Pre-LN** :\n\n$$\nx_{l+1} = x + \\mathrm{FFN}\\big(\\mathrm{LN}(x)\\big)\n$$\n\nDans Pre-LN, le tronc ne comporte que des additions ; comme il n'est jamais normalisé en chemin, il faut ajouter une LayerNorm finale avant la sortie.\n\nPre-LN était déjà utilisé avant cet article : le modèle de langage de Baevski et Auli et le [Sparse Transformer](/blog/papers/transformers/sparse-transformer) d'OpenAI l'adoptent, et des outils de traduction comme tensor2tensor et OpenNMT l'implémentent ; Wang et al. ont même constaté que Pre-LN fait mieux que Post-LN quand le nombre de couches augmente. Mais tous ces travaux conservaient l'échauffement dans leur procédure d'entraînement.\n\n### L'échauffement est-il si important ?\n\nLes auteurs commencent par vérifier l'effet de l'échauffement avec un Post-LN Transformer, sur la tâche de traduction allemand-anglais d'IWSLT14. Le calendrier d'échauffement est :\n\n$$\n\\mathrm{lr}(t) = \\frac{t}{T_{\\text{warmup}}}\\,\\mathrm{lr}_{\\max}, \\quad t \\le T_{\\text{warmup}}\n$$\n\nsuivi d'une décroissance en racine carrée inverse. Ils entraînent le modèle avec Adam et avec un SGD ordinaire, et comparent les résultats avec ou sans échauffement, et selon sa durée :\n\n[![Deux groupes de graphiques en courbes, tous avec les époques en abscisse. (a) Entraînement avec Adam : à gauche la perte de validation, à droite le BLEU. Les deux courbes en pointillés sans échauffement plafonnent à une perte d'environ 7 et un BLEU inférieur à 10 ; la courbe orange, avec 500 étapes d'échauffement et un taux maximal de 1e-3, est elle aussi très mauvaise ; les deux courbes avec 4000 étapes d'échauffement descendent à une perte d'environ 4 et montent au-delà de 30 en BLEU. (b) Entraînement avec SGD : avec échauffement, la perte descend de 10 à une valeur entre 6 et 7, pour un BLEU d'environ 7 ; sans échauffement, la perte reste au-dessus de 8,5 et le BLEU est proche de 0](/content/papers/assets/82e2f8ace58e613addf613e637786b7479429ee4db56d81756a47b8554ff3968.png)](/content/papers/assets/82e2f8ace58e613addf613e637786b7479429ee4db56d81756a47b8554ff3968.png)\n\n*Figure 2 de l'article, extraite de la [**page 4 du PDF v2**](https://arxiv.org/pdf/2002.04745v2#page=4). Perte de validation et BLEU sur IWSLT14 allemand-anglais : (a) avec Adam, (b) avec SGD.*\n\nLes résultats sont nets :\n\n- **Sans échauffement, l'entraînement échoue.** Avec Adam et sans échauffement, le BLEU n'est que de 8,45, contre environ 34 pour les modèles avec échauffement. SGD fait déjà bien moins bien qu'Adam, mais la tendance est la même : sans échauffement, le BLEU dépasse à peine 0 en 15 époques.\n- **La durée de l'échauffement compte aussi beaucoup.** Avec seulement 500 étapes d'échauffement, les taux d'apprentissage maximaux de 5e-4 et 1e-3 donnent respectivement un BLEU de 31,16 et de 2,77.\n\nLe rôle de l'échauffement avait déjà été expliqué auparavant. Les auteurs de RAdam estiment que l'échauffement sert à réduire, au début de l'entraînement, la variance du taux d'apprentissage adaptatif d'Adam. Mais ici, SGD a lui aussi besoin d'échauffement ; les auteurs en concluent que le bénéfice de l'échauffement ne tient pas à un optimiseur particulier, et qu'il faut en chercher la cause dans le modèle lui-même.\n\n## Résoudre le problème\n\n### Regarder l'instant de l'initialisation\n\nL'échauffement ne concerne que les quelques milliers de premières étapes ; les auteurs se concentrent donc sur l'initialisation : au moment où le réseau vient d'être construit et où tous les paramètres sont aléatoires, à quoi ressemble le gradient ?\n\nIls l'analysent avec la théorie du champ moyen, moyennant quelques simplifications : une attention à une seule tête ; des matrices de poids toutes de taille $d\\times d$, avec l'initialisation de Xavier ; $W^Q$ et $W^K$ initialisés à 0, pour que l'attention soit uniforme au départ ; et des vecteurs d'entrée supposés gaussiens.\n\nL'analyse se fait en trois étapes : d'abord l'amplitude des couches cachées, puis la manière dont LayerNorm traite le gradient, enfin la réunion des deux.\n\n### Première étape : quelle est l'amplitude du signal sur le tronc ?\n\nPost-LN applique une LayerNorm à la fin de chaque couche ; la norme de sortie de chaque couche reste donc autour de $\\sqrt{d}$. Les auteurs regardent plutôt $x^{\\text{post},5}$, juste avant la dernière normalisation, c'est-à-dire le vecteur obtenu en ajoutant le résidu à la sortie du FFN. Dans Pre-LN, le tronc n'est pas normalisé, et chaque couche y ajoute quelque chose. Les auteurs démontrent que :\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\nPour Post-LN, l'amplitude est la même à chaque couche ; pour Pre-LN, elle croît linéairement avec le nombre de couches. Reproduisons la configuration simplifiée de l'article pour le vérifier :\n\n```python\nimport torch\nimport torch.nn.functional as F\n\ntorch.manual_seed(0)\nd, n, L = 512, 8, 12                       # dimension cachée, longueur de séquence, nombre de couches\nln = lambda v: F.layer_norm(v, (d,))\nxavier = lambda: torch.randn(d, d) / d ** 0.5   # Xavier : matrice d×d, variance 2/(d+d) = 1/d\n\ndef attention(h, Wv):                      # simplification de l'article : W_Q = W_K = 0, attention uniforme\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 : normalisation après l'addition\n    x3 = ln(x_post + attention(x_post, Wv))\n    x5 = x3 + ffn(x3, W1, W2)\n    x_post = ln(x5)\n    # Pre-LN : normalisation avant la sous-couche, addition directe sur le tronc\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\"après la couche {l:2d} : Post-LN ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = {post:.2f}   \"\n              f\"Pre-LN ‖x‖²/d = {pre:5.2f} (plage théorique {1 + l / 2:.1f} à {1 + 3 * l / 2:.1f})\")\n```\n\n```text\naprès la couche  1 : Post-LN ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.51   Pre-LN ‖x‖²/d =  1.62 (plage théorique 1.5 à 2.5)\naprès la couche  2 : Post-LN ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.41   Pre-LN ‖x‖²/d =  2.27 (plage théorique 2.0 à 4.0)\naprès la couche  4 : Post-LN ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.55   Pre-LN ‖x‖²/d =  4.41 (plage théorique 3.0 à 7.0)\naprès la couche  8 : Post-LN ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.54   Pre-LN ‖x‖²/d =  9.73 (plage théorique 5.0 à 13.0)\naprès la couche 12 : Post-LN ‖x⁽ᵖᵒˢᵗ,⁵⁾‖²/d = 1.32   Pre-LN ‖x‖²/d = 15.44 (plage théorique 7.0 à 19.0)\n```\n\nPost-LN reste autour de 1,5 (il ne s'agit que d'un tirage, avec donc quelques fluctuations) ; Pre-LN augmente couche après couche, en restant toujours dans la plage théorique.\n\nD'où vient le $\\tfrac{3}{2}$ ? $x^{\\text{post},3}$ vient de passer par LayerNorm, et sa norme au carré vaut $d$. Il traverse ensuite le FFN : après multiplication par $W^1$, initialisé selon Xavier, chaque élément a une variance de 1 ; la ReLU en supprime la moitié, et la norme au carré tombe à $d/2$ ; la multiplication par $W^2$ la laisse à $d/2$. L'addition des deux donne $d + d/2 = \\tfrac{3}{2}d$. Dans Pre-LN, chaque couche ajoute aussi au moins ces $d/2$ du FFN : c'est le $l/2$ de la borne inférieure.\n\n### Deuxième étape : LayerNorm divise le gradient par la taille de l'entrée\n\nLayerNorm soustrait la moyenne de l'entrée et divise par l'écart-type. Si l'entrée est multipliée par $k$, la sortie ne change pas ; à l'inverse, la dérivée de la sortie par rapport à l'entrée est donc divisée par $k$. Les auteurs l'écrivent ainsi :\n\n$$\n\\big\\|J_{\\mathrm{LN}}(x)\\big\\|_2 = O\\!\\left(\\frac{\\sqrt{d}}{\\|x\\|_2}\\right)\n$$\n\n$J_{\\mathrm{LN}}$ est la matrice jacobienne de LayerNorm. Calculons-la directement :\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                                          # même direction, longueur multipliée par k\n    J = jacobian(lambda v: F.layer_norm(v, (d,)), x)   # jacobienne de LayerNorm par rapport à l'entrée, de forme [d, d]\n    print(f\"‖x‖ = {x.norm():6.1f}   norme spectrale de la jacobienne = {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   norme spectrale de la jacobienne = 1.0651   √d / ‖x‖ = 1.0647\n‖x‖ =   30.1   norme spectrale de la jacobienne = 0.5325   √d / ‖x‖ = 0.5323\n‖x‖ =   60.1   norme spectrale de la jacobienne = 0.2663   √d / ‖x‖ = 0.2662\n‖x‖ =  120.2   norme spectrale de la jacobienne = 0.1331   √d / ‖x‖ = 0.1331\n```\n\nChaque fois que la longueur de l'entrée double, la jacobienne est divisée par deux, en suivant presque exactement $\\sqrt{d}/\\|x\\|$. Quand le gradient remonte à travers une LayerNorm, il est multiplié par cette jacobienne : plus l'entrée est grande, plus le gradient renvoyé est petit.\n\n### Troisième étape : relier les deux\n\nEn reliant les deux premières étapes, on obtient le théorème principal de l'article. Les auteurs analysent la seconde matrice de poids $W^{2,L}$ du dernier FFN, et concluent (sous une condition vérifiée avec forte probabilité) :\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\nLe raisonnement est le suivant. Dans Post-LN, l'entrée de la dernière LayerNorm est $x^{\\text{post},5}$, d'amplitude fixe autour de $\\sqrt{3d/2}$, indépendante du nombre de couches ; le gradient de la dernière couche est donc lui aussi indépendant du nombre de couches. Dans Pre-LN, l'entrée de la LayerNorm finale est le tronc, accumulé tout au long du réseau, dont le carré de la norme croît linéairement avec le nombre de couches $L$ et dont la norme est de l'ordre de $\\sqrt{L}$ ; en la traversant, le gradient est divisé par $\\sqrt{L}$.\n\nLes auteurs proposent aussi une extension préliminaire de l'analyse, avec cette conclusion : dans Post-LN, plus un paramètre est proche de la couche de sortie, plus son gradient est grand, et il diminue à mesure qu'on se rapproche de l'entrée ; dans Pre-LN, le gradient est à peu près le même dans toutes les couches.\n\n### Mesurer pour de vrai\n\nLa théorie repose sur de nombreuses simplifications ; les auteurs la vérifient sur des modèles réels. Ils confirment d'abord la propriété de concentration de la norme des couches cachées, puis mesurent le gradient :\n\n[![Quatre graphiques. (a) et (b) sont des diagrammes en barres de l'amplitude du gradient de W1 et W2 dans le FFN de chaque couche d'un Transformer à 6 couches d'encodeur et 6 couches de décodeur : en bleu, Pre-LN (à l'initialisation), dont la hauteur varie peu d'une couche à l'autre ; en orange, Post-LN (à l'initialisation), qui croît avec les couches et culmine à la couche 6 ; en vert, Post-LN (après échauffement), presque nul. (c) Le gradient de W2 dans la dernière couche de Pre-LN diminue quand le nombre total de couches passe de 6 à 14, de 0,3 à environ 0,13. (d) Le gradient de W2 dans la dernière couche de Post-LN reste autour de 1,6, quel que soit le nombre de couches](/content/papers/assets/1365260baf3a0bcbf5df3b21d3b56df47b2abd8ebd257a7c0472af1a24dd360a.png)](/content/papers/assets/1365260baf3a0bcbf5df3b21d3b56df47b2abd8ebd257a7c0472af1a24dd360a.png)\n\n*Figure 3 de l'article, extraite de la [**page 7 du PDF v2**](https://arxiv.org/pdf/2002.04745v2#page=7). (a)(b) Amplitude du gradient des poids du FFN de chaque couche d'un Transformer 6-6 ; (c)(d) amplitude du gradient de $W^2$ dans la dernière couche, pour des modèles de différentes tailles. Chaque expérience est répétée avec dix graines aléatoires.*\n\nLes mesures concordent avec la théorie :\n\n- Les deux graphiques de droite : quelle que soit la taille du modèle, le gradient de la dernière couche de Post-LN reste autour de 1,6 ; celui de Pre-LN diminue quand le nombre de couches augmente.\n- Les deux graphiques de gauche : le gradient de Post-LN augmente de la couche 1 à la couche 6, et c'est la couche la plus proche de la sortie qui a le gradient le plus grand ; les écarts entre couches sont bien plus faibles pour Pre-LN.\n\nÀ l'initialisation, les paramètres de Post-LN proches de la sortie ont donc un gradient très grand. Appliquer d'emblée un taux d'apprentissage élevé donne alors des pas de mise à jour trop grands, et l'entraînement devient instable. L'échauffement permet justement d'éviter cette phase : on attend que le gradient ait diminué avant de monter le taux d'apprentissage. Sur la figure, les barres vertes (Post-LN après échauffement) sont presque toutes à 0 : le gradient a effectivement beaucoup diminué.\n\nLes auteurs ont aussi essayé d'entraîner Post-LN sans échauffement, avec un petit taux d'apprentissage fixe de 1e-4 du début à la fin. Le modèle s'entraîne alors jusqu'à un certain point, mais converge beaucoup plus lentement.\n\nÀ l'inverse, puisque le gradient de Pre-LN se tient bien dès l'initialisation, Pre-LN devrait pouvoir se passer d'échauffement.\n\n## Discussion\n\n### Traduction : sans échauffement, et plus vite\n\nLes auteurs vérifient cela sur deux tâches de traduction :\n\n- **IWSLT14 allemand-anglais** : 6 couches d'encodeur et 6 couches de décodeur, embeddings de dimension 512, FFN de 1024, 4 têtes d'attention.\n- **WMT14 anglais-allemand** : configuration Transformer base, environ 4,5 millions de paires de phrases parallèles.\n\nPost-LN suit l'article d'origine, avec 4000 étapes d'échauffement puis une décroissance en racine carrée inverse. Pre-LN n'utilise aucun échauffement : sur IWSLT14, le taux d'apprentissage part de 5e-4 et est multiplié par 0,1 à la 8e époque ; sur WMT14, il part de 7e-4 ou de 1,5e-3 selon l'expérience, décroît à la 6e époque, puis suit une décroissance en racine carrée inverse. Les deux dispositions ont le même taux d'apprentissage maximal. Comme RAdam prétend permettre de supprimer l'échauffement, les auteurs l'incluent aussi dans la comparaison sur IWSLT14.\n\n[![Quatre graphiques en courbes, tous avec les époques en abscisse. (a) et (b) montrent la perte de validation et le BLEU sur IWSLT14 : les courbes rouge et orange de Pre-LN (avec Adam ou RAdam, toutes deux sans échauffement) descendent très bas dès les premières époques, et le BLEU dépasse vite 30 ; la courbe verte de Post-LN avec Adam et échauffement, ainsi que la bleue de Post-LN avec RAdam sans échauffement, montent plus lentement et ne rattrapent les autres qu'à la fin. (c) et (d) montrent la perte de validation et le BLEU sur WMT14 : avec les deux taux d'apprentissage, Pre-LN converge plus tôt que le Post-LN correspondant, et tous finissent autour de 26 en BLEU](/content/papers/assets/26ae58e24cef2c40c73b93b2c17d74d07d2a6fafe71d071e70ed0a490d9d585f.png)](/content/papers/assets/26ae58e24cef2c40c73b93b2c17d74d07d2a6fafe71d071e70ed0a490d9d585f.png)\n\n*Figure 4 de l'article, extraite de la [**page 8 du PDF v2**](https://arxiv.org/pdf/2002.04745v2#page=8). Perte de validation et BLEU sur IWSLT14 allemand-anglais (a, b) et WMT14 anglais-allemand (c, d).*\n\nTrois observations :\n\n1. **L'échauffement n'est plus nécessaire.** Sur IWSLT14, Pre-LN sans échauffement finit avec un BLEU d'environ 34 et une perte de validation d'environ 4, comparables à ceux de Post-LN avec échauffement.\n2. **La convergence est plus rapide.** Sur IWSLT14, Pre-LN atteint à la 9e époque le niveau de Post-LN à la 15e ; il en va de même sur WMT14.\n3. **La position de LayerNorm compte davantage que l'optimiseur.** RAdam permet bien d'entraîner Post-LN sans échauffement ; mais une fois passé à Pre-LN, RAdam ou Adam, cela ne fait presque aucune différence.\n\nLes auteurs signalent aussi qu'avec des hyperparamètres bien réglés (taux d'apprentissage initial de 7,5e-4, dropout de 0,3, etc.), Pre-LN atteint 35,5 de BLEU en test sur IWSLT14.\n\n### BERT : 40 % de gagné\n\nLe préentraînement utilise BERT base (12 couches, dimension cachée de 768, 12 têtes), sur la Wikipédia anglaise et un BookCorpus collecté par les auteurs eux-mêmes, soit environ 3,4 milliards de mots au total.\n\nLe Post-LN BERT suit la configuration de l'article d'origine : 10 000 étapes d'échauffement, avec un taux d'apprentissage maximal de 1e-4. Les auteurs ont essayé de porter le taux d'apprentissage de Post-LN à 3e-4, et l'entraînement a aussitôt divergé. Le Pre-LN BERT, lui, n'utilise pas d'échauffement et part de 3e-4 avec une décroissance linéaire.\n\n[![Trois graphiques en courbes, avec en abscisse le nombre d'étapes de préentraînement (en milliers). (a) Perte de validation de BERT : la courbe orange de Pre-LN est dès le début sous la courbe bleue en pointillés de Post-LN ; les deux descendent à peu près parallèlement, et Pre-LN atteint 1,69 vers 500 000 étapes, quand Post-LN n'y parvient que vers 700 000 étapes. (b) Précision sur MRPC et (c) précision sur RTE : à chaque stade du préentraînement, Pre-LN fait mieux que Post-LN, avec un écart surtout marqué au début du préentraînement](/content/papers/assets/9707b62474bc0eba4a5ff16f9578eb437856e931b5127793ec370b6a1b0d0a06.png)](/content/papers/assets/9707b62474bc0eba4a5ff16f9578eb437856e931b5127793ec370b6a1b0d0a06.png)\n\n*Figure 5 de l'article, extraite de la [**page 8 du PDF v2**](https://arxiv.org/pdf/2002.04745v2#page=8). (a) Perte de validation du préentraînement de BERT ; (b)(c) précision après affinage sur MRPC et RTE des modèles pris à différents stades du préentraînement ; les barres d'erreur indiquent l'intervalle de confiance à 95 % sur six affinages.*\n\nPost-LN doit être entraîné jusqu'à 700k étapes pour que sa perte de validation tombe à 1,69 ; Pre-LN y parvient dès 500k étapes, soit environ 40 % plus vite. Les 200k étapes économisées dépassent de loin les 10k étapes de l'échauffement lui-même ; la rapidité ne vient donc pas seulement de la suppression de l'échauffement, mais surtout de ce que Pre-LN supporte un taux d'apprentissage bien plus élevé.\n\nQuand on affine sur MRPC et RTE des modèles pris à différents stades, Pre-LN converge aussi plus vite sur les tâches en aval.\n\n## Conclusion\n\nCet article remonte d'une habitude d'ingénierie à sa cause architecturale : à l'initialisation, les paramètres de Post-LN proches de la sortie ont un gradient très grand, qu'il faut contourner par un échauffement ; si l'on déplace la LayerNorm dans la branche résiduelle, avant la sous-couche, le gradient de la dernière couche est réduit d'un facteur $1/\\sqrt{L}$ par l'amplitude du tronc, et les gradients des différentes couches sont plus homogènes ; l'échauffement peut alors être supprimé, et le taux d'apprentissage peut même être augmenté.\n\nIl faut garder en tête la portée de l'analyse théorique : elle ne porte que sur l'instant de l'initialisation, avec des simplifications comme l'attention uniforme et une tête unique ; quant à la partie « plus on est proche de la sortie dans Post-LN, plus le gradient est grand », les auteurs la présentent eux-mêmes comme un résultat préliminaire, appuyé surtout par les mesures de la Figure 3.\n\nL'idée de « déplacer la normalisation dans la branche pour garder le raccourci propre » est déjà apparue avec les réseaux convolutifs ; GPT-2 a lui aussi déplacé la LayerNorm à l'entrée de chaque sous-couche :\n\n\n> [!TIP]\n> \n> - **[[16.03] ResNet v2 : Le raccourci doit rester propre](/blog/papers/classic-cnns/resnet-v2)**\n> - **[[19.02] GPT-2 : Quarante-huit couches de décodeur](/blog/papers/transformers/gpt_2)**\n\n\nSi vous entraînez un Transformer depuis zéro, la recommandation de cet article est simple : placez la LayerNorm avant la sous-couche, et n'oubliez pas d'ajouter une LayerNorm finale avant la sortie. À l'échelle des expériences de l'article, le modèle s'entraîne ainsi sans échauffement, et le taux d'apprentissage peut même être un peu plus élevé.\n\nPre-LN est ensuite devenu la disposition par défaut de nombreux grands modèles de langage, mais cette disposition a aussi un coût. La première étape le laisse déjà voir : la norme au carré du tronc croît linéairement avec le nombre de couches, alors que chaque couche y ajoute à peu près la même quantité ; plus une couche est tardive, plus son influence relative sur le tronc est faible. En 2021, [NormFormer](https://arxiv.org/abs/2110.09456) signale que, pendant le préentraînement avec Pre-LN, le gradient des premières couches est bien plus grand que celui des dernières, et ajoute quelques normalisations dans chaque couche ; en 2022, [DeepNet](https://arxiv.org/abs/2203.00555) revient au contraire à Post-LN pour le remanier, avec l'ambition de garder à la fois les performances de Post-LN et la stabilité de Pre-LN, et pousse le Transformer jusqu'à mille couches.\n\nOù placer la LayerNorm ? Le sujet n'est pas clos ; nous aurons l'occasion d'y revenir.\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}}}
