{"notes":[{"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":""}]},{"id":"classic-cnns/resnet","category":"classic-cnns","legacyPath":"classic-cnns/1512-resnet","legacySlug":"1512-resnet","legacyPaths":[],"title":"ResNet","subtitle":"Un réseau convolutif de 100 couches","author":"Z. Yuan","paperDate":"2015-12-10","publishedOn":"2024-08-08","paperTitle":"Deep Residual Learning for Image Recognition","paperUrl":"https://arxiv.org/abs/1512.03385","bibliography":{"title":"Deep Residual Learning for Image Recognition","authors":["Kaiming He","Xiangyu Zhang","Shaoqing Ren","Jian Sun"],"url":"https://arxiv.org/abs/1512.03385","pdfUrl":"https://arxiv.org/pdf/1512.03385","codeUrl":null,"preprint":{"id":"1512.03385","submittedOn":"2015-12-10","url":"https://arxiv.org/abs/1512.03385"},"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://doi.org/10.1109/cvpr.2016.90"},"citation":"@misc{classiccnnsresnet2015,\n  title = {{Deep Residual Learning for Image Recognition}},\n  author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},\n  year = {2015},\n  eprint = {1512.03385},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.03385}\n}\n","citationPath":"/content/papers/citations/classic-cnns/resnet.cf4014e8baae.bib"},"thumbnail":{"src":"/content/papers/assets/b8fe87fe757249ea6d7bb667fef3196754b9f80e28bf842a69b540ca94585d08.jpg","width":1224,"height":408},"locale":"fr","path":"/content/papers/fr/classic-cnns/resnet.2cc70ebed590.md","headings":[{"id":"définition-du-problème","text":"Définition du problème","depth":2},{"id":"résolution-du-problème","text":"Résolution du problème","depth":2},{"id":"quest-ce-quun-résidu-","text":"Qu'est-ce qu'un résidu ?","depth":3},{"id":"apprentissage-résiduel","text":"Apprentissage résiduel","depth":3},{"id":"blocs-résiduels","text":"Blocs résiduels","depth":3},{"id":"architecture-du-réseau","text":"Architecture du réseau","depth":3},{"id":"configuration-des-paramètres","text":"Configuration des paramètres","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"resnet-18-contre-resnet-34","text":"ResNet-18 contre ResNet-34","depth":3},{"id":"blocs-goulots-pour-les-réseaux-plus-profonds","text":"Blocs goulots pour les réseaux plus profonds","depth":3},{"id":"résultats-sur-imagenet","text":"Résultats sur ImageNet","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/vgg","relation":"background","topic":"Entraîner des réseaux convolutifs plus profonds"},{"id":"classic-cnns/densenet","relation":"next","topic":"Entraîner des réseaux convolutifs plus profonds"}]},{"id":"classic-cnns/highway-networks","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Highway Networks","subtitle":"À la veille des réseaux résiduels","author":"Z. Yuan","paperDate":"2015-05-03","publishedOn":"2025-11-03","world":"external/highway-networks","paperTitle":"Highway Networks","paperUrl":"https://arxiv.org/abs/1505.00387","bibliography":{"title":"Highway Networks","authors":["Rupesh Kumar Srivastava","Klaus Greff","Jürgen Schmidhuber"],"url":"https://arxiv.org/abs/1505.00387","pdfUrl":"https://arxiv.org/pdf/1505.00387v2","codeUrl":null,"preprint":{"id":"1505.00387","submittedOn":"2015-05-03","url":"https://arxiv.org/abs/1505.00387"},"publication":null,"citation":"@misc{classiccnnshighwaynetworks2015,\n  title = {{Highway Networks}},\n  author = {Rupesh Kumar Srivastava and Klaus Greff and Jürgen Schmidhuber},\n  year = {2015},\n  eprint = {1505.00387},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1505.00387}\n}\n","citationPath":"/content/papers/citations/classic-cnns/highway-networks.f7d3ef9547ef.bib"},"thumbnail":{"src":"/content/papers/assets/2cef37bd2a2388f57a76965431810cb86f976db701ba1647b75c81c9a59ac779.png","width":1344,"height":360},"locale":"fr","path":"/content/papers/fr/classic-cnns/highway-networks.a558a3a30685.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":"ajouter-deux-portes","text":"Ajouter deux portes","depth":3},{"id":"pencher-dabord-vers-le-passage-direct","text":"Pencher d'abord vers le « passage direct »","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"plus-profond-plus-facile-à-entraîner","text":"Plus profond, plus facile à entraîner ?","depth":3},{"id":"facile-à-entraîner-soit-et-la-précision","text":"Facile à entraîner, soit ; et la précision ?","depth":3},{"id":"quont-appris-les-portes","text":"Qu'ont appris les portes ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"referenced","topic":""}]},{"id":"classic-cnns/inception-v4","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Inception-v4","subtitle":"Beaucoup plus rapide, un peu plus précis","author":"Z. Yuan","paperDate":"2016-02-23","publishedOn":"2026-01-27","world":"external/inception-v4","paperTitle":"Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning","paperUrl":"https://arxiv.org/abs/1602.07261","bibliography":{"title":"Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning","authors":["Christian Szegedy","Sergey Ioffe","Vincent Vanhoucke","Alex Alemi"],"url":"https://arxiv.org/abs/1602.07261","pdfUrl":"https://arxiv.org/pdf/1602.07261v2","codeUrl":null,"preprint":{"id":"1602.07261","submittedOn":"2016-02-23","url":"https://arxiv.org/abs/1602.07261"},"publication":null,"citation":"@misc{classiccnnsinceptionv42016,\n  title = {{Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning}},\n  author = {Christian Szegedy and Sergey Ioffe and Vincent Vanhoucke and Alex Alemi},\n  year = {2016},\n  eprint = {1602.07261},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1602.07261}\n}\n","citationPath":"/content/papers/citations/classic-cnns/inception-v4.ed8e0294ae0b.bib"},"thumbnail":{"src":"/content/papers/assets/cc8335c4ba4672514d3dd5e9953719d52b4f8fdd0af994c76722874543fcb864.png","width":666,"height":656},"locale":"fr","path":"/content/papers/fr/classic-cnns/inception-v4.bc2e80dd34b2.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":"se-délester-de-lhéritage-inception-v4","text":"Se délester de l'héritage : Inception-v4","depth":3},{"id":"lentrée-en-matière","text":"L'entrée en matière","depth":3},{"id":"brancher-le-résidu-dans-inception","text":"Brancher le résidu dans Inception","depth":3},{"id":"réduire-le-résidu-pour-stabiliser-lentraînement","text":"Réduire le résidu pour stabiliser l'entraînement","depth":3},{"id":"réglages-dentraînement","text":"Réglages d'entraînement","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"le-résidu-accélère-nettement-lentraînement","text":"Le résidu accélère nettement l'entraînement","depth":3},{"id":"résultats-des-modèles-uniques","text":"Résultats des modèles uniques","depth":3},{"id":"ensembles","text":"Ensembles","depth":3},{"id":"les-connexions-résiduelles-sont-elles-indispensables","text":"Les connexions résiduelles sont-elles « indispensables » ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v3","relation":"referenced","topic":""},{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""}]}],"text":"ResNet a rendu entraînable un réseau de 152 couches et remporté l'ILSVRC 2015. Pourtant, sur CIFAR-10, le ResNet de 1202 couches de l'article d'origine obtient 7,93 % d'erreur, moins bien que les 6,61 % du modèle à 110 couches.\n\nLes connexions résiduelles permettent d'approfondir les réseaux, mais à mille couches, un nouveau problème apparaît.\n\nEn mars 2016, la même équipe, Kaiming He, Xiangyu Zhang, Shaoqing Ren et Jian Sun, publie cet article, présenté ensuite à l'ECCV 2016. Cette fois, les auteurs reviennent à l'unité résiduelle pour en écrire les équations de propagation, y cherchent le trajet le plus fluide pour le signal, puis modifient l'unité en conséquence. Une fois l'unité modifiée, un ResNet de 1001 couches atteint 4,62 % d'erreur sur CIFAR-10.\n\nCette nouvelle version est souvent appelée par la suite ResNet v2, ou pre-activation ResNet.\n\n\n> [!TIP]\n> \n> Pour la conception d'origine de ResNet, vous pouvez commencer par notre note :\n> \n> - **[[15.12] ResNet : Un réseau convolutif de 100 couches](/blog/papers/classic-cnns/resnet)**\n\n\n## Définir le problème\n\nÉcrivons d'abord l'unité résiduelle d'origine sous une forme générale. L'entrée de la $l$-ième unité est $x_l$ :\n\n$$\ny_l = h(x_l) + \\mathcal{F}(x_l, \\mathcal{W}_l), \\qquad x_{l+1} = f(y_l)\n$$\n\n$\\mathcal{F}$ est la fonction résiduelle, par exemple deux couches de convolution $3\\times3$ ; $h$ est l'opération appliquée sur le raccourci ; $f$ est l'opération qui suit l'addition. Dans le ResNet d'origine, $h(x_l) = x_l$ est une application identité, et $f$ une ReLU.\n\n[![À gauche, deux unités résiduelles. (a) original : x_l descend directement ; la branche de droite enchaîne weight, BN, ReLU, weight, BN, puis s'additionne au raccourci avant une ReLU qui donne x_l+1. (b) proposed : la branche de droite enchaîne BN, ReLU, weight, BN, ReLU, weight, et l'addition donne directement x_l+1. Dans les deux cas, le raccourci est dessiné comme une épaisse flèche grise. À droite, les courbes d'entraînement d'un ResNet de 1001 couches sur CIFAR-10 : en jaune, original (erreur 7,61 %), en bleu, proposed (erreur 4,92 %) ; en pointillés, la perte d'entraînement, en trait plein, l'erreur de test ; la perte d'entraînement bleue baisse bien plus vite dès le début](/content/papers/assets/7eda4acdde3019e92c5b44f59917b1e493a5b11b5b8a63280d03b15787934ef5.png)](/content/papers/assets/7eda4acdde3019e92c5b44f59917b1e493a5b11b5b8a63280d03b15787934ef5.png)\n\n*Figure 1 de l'article, extraite de la [**page 2 du PDF v3**](https://arxiv.org/pdf/1603.05027v3#page=2). À gauche : (a) l'unité résiduelle d'origine, (b) l'unité résiduelle proposée par l'article ; la flèche grise indique le chemin où l'information circule le plus facilement. À droite : courbes d'entraînement d'un ResNet de 1001 couches sur CIFAR-10 ; en pointillés, la perte d'entraînement (axe de gauche), en trait plein, l'erreur de test (axe de droite).*\n\nLes courbes de droite mettent le problème sous nos yeux : à 1001 couches dans les deux cas, la conception d'origine voit sa perte baisser très lentement au début de l'entraînement et termine avec 7,61 % d'erreur de test ; la conception modifiée descend vite dès le départ et termine à 4,92 %.\n\nLes deux unités de gauche utilisent exactement les mêmes composants ; seul l'ordre change. Dans l'original, la ReLU vient après l'addition et pèse sur le raccourci ; la nouvelle conception place la BN et la ReLU avant les couches de poids, et ne fait rien après l'addition. Le raccourci gris ne traverse donc plus aucune opération, d'un bout à l'autre.\n\nPourquoi est-ce important ? L'argument des auteurs part de l'hypothèse que $h$ et $f$ sont tous deux des applications identité.\n\n## Résoudre le problème\n\n### Deux applications identité\n\nSi $f$ est lui aussi une application identité, $x_{l+1} = y_l$, et l'équation précédente devient :\n\n$$\nx_{l+1} = x_l + \\mathcal{F}(x_l, \\mathcal{W}_l)\n$$\n\nEn développant jusqu'à une unité $L$ plus profonde :\n\n$$\nx_L = x_l + \\sum_{i=l}^{L-1} \\mathcal{F}(x_i, \\mathcal{W}_i)\n$$\n\nCette équation dit que toute caractéristique profonde $x_L$ est égale à une caractéristique moins profonde $x_l$, plus les sorties de toutes les fonctions résiduelles intermédiaires. Dans un réseau ordinaire, au contraire, $x_L$ résulte d'une suite de multiplications matricielles, à peu près $\\prod_i W_i\\, x_0$ (en ignorant BN et ReLU). D'un côté, une somme ; de l'autre, un produit.\n\nIl en va de même pour la rétropropagation. Notons $\\mathcal{E}$ la perte ; par la règle de dérivation en chaîne :\n\n$$\n\\frac{\\partial \\mathcal{E}}{\\partial x_l}\n= \\frac{\\partial \\mathcal{E}}{\\partial x_L}\\frac{\\partial x_L}{\\partial x_l}\n= \\frac{\\partial \\mathcal{E}}{\\partial x_L}\\left(1 + \\frac{\\partial}{\\partial x_l}\\sum_{i=l}^{L-1}\\mathcal{F}(x_i, \\mathcal{W}_i)\\right)\n$$\n\nLe 1 entre parenthèses transmet $\\partial\\mathcal{E}/\\partial x_L$ directement au $x_l$ peu profond, sans traverser aucune couche de poids. L'autre terme traverse les couches de poids, mais il a peu de chances de valoir exactement $-1$ pour chaque exemple d'un lot et d'annuler toute la parenthèse. Même avec des poids très petits, le gradient ne disparaît donc pas.\n\nCes deux belles propriétés reposent sur deux conditions : le raccourci $h$ est une application identité, et l'opération $f$ qui suit l'addition aussi. Dit dans les termes de la figure : sur la flèche grise, aucune opération autre que l'addition n'est permise.\n\nLes auteurs vérifient ensuite les deux conditions séparément : d'abord en modifiant le raccourci $h$, puis l'opération $f$ qui suit l'addition.\n\n### Que se passe-t-il si l'on charge le raccourci ?\n\nLa façon la plus simple de le dégrader est de multiplier le raccourci par une constante $\\lambda_l$ : $h(x_l) = \\lambda_l x_l$. En développant de la même manière, l'équation de rétropropagation devient :\n\n$$\n\\frac{\\partial \\mathcal{E}}{\\partial x_l}\n= \\frac{\\partial \\mathcal{E}}{\\partial x_L}\\left(\\prod_{i=l}^{L-1}\\lambda_i + \\frac{\\partial}{\\partial x_l}\\sum_{i=l}^{L-1}\\hat{\\mathcal{F}}(x_i, \\mathcal{W}_i)\\right)\n$$\n\n$\\hat{\\mathcal{F}}$ absorbe ces constantes. Le 1 d'origine est devenu un produit de $\\lambda$. Dans un réseau très profond, il suffit que tous les $\\lambda$ soient supérieurs à 1 pour que ce terme explose exponentiellement, ou inférieurs à 1 pour qu'il s'évanouisse exponentiellement ; le gradient doit alors passer par les couches de poids.\n\nResNet-110 compte 54 unités résiduelles. Rendons les fonctions résiduelles très petites pour n'observer que l'effet du raccourci :\n\n```python\nimport torch\n\ntorch.manual_seed(0)\nD, units = 64, 54                                       # ResNet-110 compte 54 unités résiduelles\nWs = [torch.randn(D, D) * 0.01 for _ in range(units)]   # fonctions résiduelles volontairement très petites\n\nfor lam in (1.0, 0.9, 0.5, 1.1):\n    x0 = torch.randn(D, requires_grad=True)\n    x = x0\n    for W in Ws:\n        x = lam * x + torch.relu(x) @ W                 # raccourci multiplié par λ\n    x.sum().backward()\n    print(f\"λ = {lam} : gradient revenu à la première couche environ {x0.grad.abs().mean().item():.3g}, λ^54 = {lam ** units:.3g}\")\n```\n\n```text\nλ = 1.0 : gradient revenu à la première couche environ 0.954, λ^54 = 1\nλ = 0.9 : gradient revenu à la première couche environ 0.00322, λ^54 = 0.00338\nλ = 0.5 : gradient revenu à la première couche environ 5.67e-17, λ^54 = 5.55e-17\nλ = 1.1 : gradient revenu à la première couche environ 162, λ^54 = 172\n```\n\nLe gradient vaut presque exactement $\\lambda^{54}$. $\\lambda = 0.9$ semble n'être qu'une remise de 10 %, mais après 54 unités, il ne reste que trois millièmes ; avec $\\lambda = 0.5$, on tombe à $10^{-17}$. Avec un raccourci plus complexe, comme une porte ou une convolution $1\\times1$, le produit porte sur les dérivées de chaque raccourci, et le signal peut tout autant être bloqué.\n\nLes auteurs comparent ensuite concrètement plusieurs raccourcis sur le ResNet-110 de CIFAR-10 :\n\n[![Six unités résiduelles, dont la branche de droite enchaîne toujours 3x3 conv, ReLU, 3x3 conv ; seul le raccourci change : (a) original, sans aucune opération ; (b) constant scaling, avec une multiplication par 0,5 sur le raccourci et sur la branche ; (c) exclusive gating, où une porte calculée par 1x1 conv et sigmoïde multiplie la branche, tandis que le raccourci est multiplié par 1 moins la porte ; (d) shortcut-only gating, où seul le raccourci est multiplié par 1 moins la porte ; (e) conv shortcut, avec une 1x1 conv sur le raccourci ; (f) dropout shortcut, avec un dropout sur le raccourci. Dans chaque unité, l'addition est suivie d'une ReLU](/content/papers/assets/7710a267ec379977c4b41b07fbb2532dd44111584b6c0542b7ce9e96556e4f13.png)](/content/papers/assets/7710a267ec379977c4b41b07fbb2532dd44111584b6c0542b7ce9e96556e4f13.png)\n\n*Figure 2 de l'article, extraite de la [**page 5 du PDF v3**](https://arxiv.org/pdf/1603.05027v3#page=5). Les différents raccourcis utilisés dans la Table 1. Par souci de simplicité, la BN qui suit chaque couche de poids n'est pas représentée.*\n\n| Raccourci | Coefficient sur le raccourci | Coefficient sur la branche $\\mathcal{F}$ | Taux d'erreur |\n| --- | --- | --- | ---: |\n| (a) Raccourci identité d'origine | 1 | 1 | **6,61 %** |\n| (b) Mise à l'échelle constante | 0 | 1 | Échec (équivaut à un réseau ordinaire) |\n| (b) Mise à l'échelle constante | 0,5 | 1 | Échec |\n| (b) Mise à l'échelle constante | 0,5 | 0,5 | 12,35 % |\n| (c) Porte exclusive, $b_g$ initialisé à $-6$ | $1-g(x)$ | $g(x)$ | 8,70 % |\n| (c) Porte exclusive, $b_g$ initialisé entre 0 et $-5$ | $1-g(x)$ | $g(x)$ | Échec |\n| (d) Porte sur le raccourci seul, $b_g$ initialisé à 0 | $1-g(x)$ | 1 | 12,86 % |\n| (d) Porte sur le raccourci seul, $b_g$ initialisé à $-6$ | $1-g(x)$ | 1 | 6,91 % |\n| (e) Raccourci par convolution $1\\times1$ | Convolution $1\\times1$ | 1 | 12,22 % |\n| (f) Raccourci avec dropout | Dropout 0,5 | 1 | Échec |\n\n*Tableau : quelques lignes extraites de la Table 1 de l'article. Ensemble de test de CIFAR-10, ResNet-110, médiane de cinq entraînements ; un taux d'erreur supérieur à 20 % est noté « échec ». Dans cette série d'expériences, l'addition est encore suivie d'une ReLU.*\n\nQuelques points à relever :\n\n- **Mise à l'échelle constante de 0,5** : si la branche n'est pas mise à l'échelle, l'entraînement échoue ; si la branche est aussi multipliée par 0,5 (ce qui ressemble à un Highway aux portes figées), le réseau converge, mais avec 12,35 % d'erreur, près du double de la référence.\n- **La porte exclusive** est l'approche des Highway Networks. L'initialisation du biais de la porte y est déterminante ; les auteurs cherchent entre 0 et $-10$, et la meilleure valeur, $-6$, n'atteint que 8,70 %.\n- **Avec une porte sur le raccourci seul**, un biais initialisé à $-6$ rend $1-g(x)$ proche de 1 : le raccourci est presque une application identité, et le résultat, 6,91 %, est aussi le plus proche de la référence.\n- **Le raccourci par convolution $1\\times1$** fonctionnait bien sur le ResNet d'origine à 34 couches (l'option C de l'article de ResNet), mais avec 54 unités empilées, il tombe à 12,22 %. Les auteurs observent un phénomène similaire sur le ResNet-101 d'ImageNet.\n- **Le raccourci avec dropout** revient statistiquement à multiplier le raccourci par son espérance, 0,5, et bloque le signal comme la mise à l'échelle constante.\n\n\n> [!TIP]\n> \n> Pour l'origine de la porte exclusive, vous pouvez consulter notre note :\n> \n> - **[[15.05] Highway Networks : À la veille des réseaux résiduels](/blog/papers/classic-cnns/highway-networks)**\n\n\nPortes et convolutions $1\\times1$ ajoutent des paramètres et devraient en théorie être plus expressives ; avec une porte sur le raccourci seul ou une convolution $1\\times1$, l'espace des solutions contient encore le raccourci identité, qu'il suffirait d'apprendre. Pourtant, leur erreur d'**entraînement** est plus élevée. La dégradation vient donc de l'optimisation ; l'expressivité n'y est pour rien.\n\n### Où placer la ReLU qui suit l'addition ?\n\nDans la série d'expériences précédente, l'opération $f$ qui suit l'addition était encore une ReLU ; le raisonnement n'y était donc qu'approximativement valable. Reste à traiter $f$.\n\nPour faire de $f$ une application identité, il n'y a pas d'autre moyen que de réorganiser la place de la ReLU et de la BN. Les auteurs essaient les dispositions suivantes :\n\n[![Cinq unités résiduelles aux composants identiques, dans un ordre différent. (a) original : weight, BN, ReLU, weight, BN, puis ReLU après l'addition. (b) BN after addition : weight, BN, ReLU, weight, puis BN et ReLU après l'addition. (c) ReLU before addition : weight, BN, ReLU, weight, BN, ReLU, puis l'addition. (d) ReLU-only pre-activation : ReLU, weight, BN, ReLU, weight, BN, puis l'addition. (e) full pre-activation : BN, ReLU, weight, BN, ReLU, weight, puis l'addition](/content/papers/assets/f032506b6dda998779a8abf2fee9cbf44371ac4a2c4ebf8c93d834286bbb7501.png)](/content/papers/assets/f032506b6dda998779a8abf2fee9cbf44371ac4a2c4ebf8c93d834286bbb7501.png)\n\n*Figure 4 de l'article, extraite de la [**page 8 du PDF v3**](https://arxiv.org/pdf/1603.05027v3#page=8). Les différentes positions de l'activation utilisées dans la Table 2 ; toutes les unités ont les mêmes composants, seul l'ordre change.*\n\n| Disposition | ResNet-110 | ResNet-164 |\n| --- | ---: | ---: |\n| (a) Unité résiduelle d'origine | 6,61 % | 5,93 % |\n| (b) BN après l'addition | 8,17 % | 6,50 % |\n| (c) ReLU avant l'addition | 7,84 % | 6,14 % |\n| (d) ReLU seule placée en tête | 6,71 % | 5,91 % |\n| (e) Préactivation complète | **6,37 %** | **5,46 %** |\n\n*Tableau : extrait de la Table 2 de l'article. Taux d'erreur sur l'ensemble de test de CIFAR-10. ResNet-164 utilise une structure en goulot d'étranglement ($1\\times1$, $3\\times3$, $1\\times1$), dont le coût est proche de celui d'une unité à deux couches $3\\times3$.*\n\n**(b) BN après l'addition** est l'expérience inverse : $f$ contient alors la BN et la ReLU. Le résultat est nettement moins bon. La BN modifie désormais le signal du raccourci, et la perte peine à baisser au début de l'entraînement.\n\n**(c) ReLU avant l'addition** est la façon la plus directe de faire de $f$ une application identité, et le résultat est lui aussi moins bon. Le problème : avec une ReLU en fin de branche, la sortie de la fonction résiduelle ne peut jamais être négative. Intuitivement, un « résidu » devrait pouvoir être positif ou négatif ; s'il ne peut être que positif, le signal ne fait qu'augmenter de façon monotone. Regardons ce que donnent les deux dispositions après dix unités empilées :\n\n```python\nimport torch\nimport torch.nn as nn\n\ntorch.manual_seed(0)\nc = 16\n\ndef relu_before_add():          # Fig. 4(c) : ReLU déplacée avant l'addition\n    return nn.Sequential(nn.Conv2d(c, c, 3, padding=1), nn.BatchNorm2d(c), nn.ReLU(),\n                         nn.Conv2d(c, c, 3, padding=1), nn.BatchNorm2d(c), nn.ReLU())\n\ndef full_preact():              # Fig. 4(e) : BN et ReLU placées avant les couches de poids\n    return nn.Sequential(nn.BatchNorm2d(c), nn.ReLU(), nn.Conv2d(c, c, 3, padding=1),\n                         nn.BatchNorm2d(c), nn.ReLU(), nn.Conv2d(c, c, 3, padding=1))\n\nx0 = torch.randn(8, c, 16, 16)\nfor name, make in [(\"ReLU avant l'addition\", relu_before_add), (\"préactivation complète\", full_preact)]:\n    x, lows, means = x0, [], []\n    for unit in range(10):\n        r = make()(x)\n        lows.append(r.min().item())\n        x = x + r\n        means.append(x.mean().item())\n    print(f\"{name} : minimum du résidu {min(lows):.2f} ; moyenne de la sortie {means[0]:.2f} → {means[4]:.2f} → {means[9]:.2f}\")\n```\n\n```text\nReLU avant l'addition : minimum du résidu 0.00 ; moyenne de la sortie 0.38 → 1.97 → 3.96\npréactivation complète : minimum du résidu -2.33 ; moyenne de la sortie -0.01 → 0.07 → 0.09\n```\n\nAvec la ReLU avant l'addition, le résidu vaut au minimum 0, et chaque unité ajoutée fait monter la moyenne d'un cran ; avec la préactivation, le résidu prend des valeurs positives et négatives, et la moyenne reste proche de 0.\n\n### Changer de point de vue : la préactivation\n\nLes deux dispositions restantes découlent d'un changement de perspective.\n\nDans la conception d'origine, l'activation $f$ qui suit l'addition affecte à la fois les deux voies de l'unité suivante :\n\n$$\ny_{l+1} = f(y_l) + \\mathcal{F}(f(y_l), \\mathcal{W}_{l+1})\n$$\n\nSi cette activation n'agit que sur la branche résiduelle, sans que le raccourci la traverse :\n\n$$\ny_{l+1} = y_l + \\mathcal{F}(\\hat{f}(y_l), \\mathcal{W}_{l+1})\n$$\n\nEn changeant de notation, on obtient $x_{l+1} = x_l + \\mathcal{F}(\\hat{f}(x_l), \\mathcal{W}_l)$. Plus rien ne suit l'addition, et $f$ devient une application identité ; ce qui était « l'activation de sortie de l'unité précédente » devient « l'activation d'entrée de l'unité suivante ».\n\n[![Schéma en trois colonnes. (a) L'unité résiduelle d'origine, avec un act. après l'addition, qui affecte à la fois le raccourci et la branche de l'unité suivante. (b) L'act. qui suit l'addition n'est placé que sur la branche menant aux poids (encadré en rouge), et le raccourci le contourne. (c) Après un nouveau découpage des frontières entre unités, cela équivaut à une unité résiduelle à préactivation, où chaque unité applique act. avant weight, sans aucune opération après l'addition](/content/papers/assets/1a7a520a803ed65de475f2ee4bc5ade9b1833de9aefd758c5ef57153e5d087d2.png)](/content/papers/assets/1a7a520a803ed65de475f2ee4bc5ade9b1833de9aefd758c5ef57153e5d087d2.png)\n\n*Figure 5 de l'article, extraite de la [**page 10 du PDF v3**](https://arxiv.org/pdf/1603.05027v3#page=10). N'appliquer l'activation qui suit l'addition qu'à la branche des poids équivaut à construire une unité résiduelle à préactivation.*\n\nLe passage de (b) à (c) dans la figure n'est qu'un nouveau découpage des frontières entre unités. Les auteurs soulignent aussi que cette distinction entre « avant » et « après » n'a de sens que dans une structure à branches avec addition ; un réseau ordinaire de $N$ couches compte $N-1$ activations, et qu'on les appelle préactivations ou postactivations ne change rien.\n\nDans cette logique, la disposition (d) de la Figure 4, qui ne déplace que la ReLU en tête, donne des résultats proches de la conception d'origine ; selon l'hypothèse des auteurs, cette ReLU, non associée à une BN, ne profite pas des bienfaits de la BN. La disposition (e), qui place à la fois la BN et la ReLU avant les couches de poids, améliore nettement les résultats. C'est l'unité proposée par l'article.\n\n## Discussion\n\n### Plus c'est profond, plus l'écart se creuse\n\n| Jeu de données | Réseau | Unité d'origine | Préactivation |\n| --- | --- | ---: | ---: |\n| CIFAR-10 | ResNet-110 (une couche par unité) | 9,90 % | 8,91 % |\n| CIFAR-10 | ResNet-110 | 6,61 % | 6,37 % |\n| CIFAR-10 | ResNet-164 | 5,93 % | 5,46 % |\n| CIFAR-10 | ResNet-1001 | 7,61 % | **4,92 %** |\n| CIFAR-100 | ResNet-164 | 25,16 % | 24,33 % |\n| CIFAR-100 | ResNet-1001 | 27,82 % | **22,71 %** |\n\n*Tableau : extrait de la Table 3 de l'article. ResNet-1001 a une structure en goulot d'étranglement, avec 333 unités résiduelles au total, 111 pour chaque taille de carte de caractéristiques.*\n\nLa préactivation fait mieux dans tous les cas, et l'écart grandit avec la profondeur : à 1001 couches, CIFAR-10 passe de 7,61 % à 4,92 %, et CIFAR-100 de 27,82 % à 22,71 %.\n\nSelon les auteurs, le bénéfice vient de deux sources.\n\n**D'abord, une optimisation plus facile.** C'est le plus visible à 1001 couches (Figure 1, à droite). Quand $f$ est une ReLU, les signaux négatifs sont tronqués ; avec beaucoup d'unités, les équations précédentes ne sont plus une bonne approximation. Le réseau de 164 couches en souffre beaucoup moins : au début de l'entraînement, la courbe accuse un léger contretemps, puis se rétablit vite. En surveillant les réponses du réseau, les auteurs constatent qu'après un certain temps d'entraînement, les poids s'ajustent de sorte que $y_l$ soit le plus souvent supérieur à 0, si bien que la ReLU tronque rarement quelque chose ; $x_l$, issu de la ReLU précédente, est déjà positif ou nul, et $y_l$ ne devient négatif que lorsque $\\mathcal{F}$ prend une grande valeur négative. À mille couches, la troncature devient bien plus fréquente.\n\n**Ensuite, moins de surapprentissage.** À la convergence, la version à préactivation a une perte d'entraînement légèrement plus élevée, mais une erreur de test plus basse. Les auteurs l'attribuent à l'effet régularisateur de la BN : dans l'unité d'origine, le signal normalisé par la BN est aussitôt additionné au raccourci, si bien que la couche de poids suivante reçoit en fait un signal non normalisé ; dans la version à préactivation, l'entrée de chaque couche de poids passe d'abord par une BN.\n\n### Comparaison avec d'autres méthodes\n\nSur CIFAR, le ResNet-1001 des auteurs atteint 4,92 % sur CIFAR-10 (médiane de cinq essais), et 4,62 % avec une taille de lot de 64 ; sur CIFAR-100, il atteint 22,71 %. Les auteurs précisent que ces résultats ne doivent rien à un réglage particulier de la largeur ou de la taille des filtres, ni à des régularisations comme le dropout, très efficaces sur les petits jeux de données : ils reposent seulement sur une profondeur accrue.\n\nSur ImageNet, les auteurs relèvent d'abord un détail d'évaluation : le ResNet d'origine était entraîné en ramenant le petit côté de l'image entre 256 et 480, mais testé sur un recadrage de $224\\times224$ pris dans une image dont le petit côté mesure 256, ce qui le désavantage. Ils testent donc cette fois sur un recadrage de $320\\times320$ pris dans une image dont le petit côté mesure 320 ; ResNet étant entièrement convolutif, il accepte directement des entrées plus grandes, et cette taille est proche des 299 d'Inception-v3.\n\n| Méthode | Augmentation des données | Erreur top-1 | Erreur top-5 |\n| --- | --- | ---: | ---: |\n| ResNet-152, unité d'origine | Échelle | 21,3 % | 5,5 % |\n| ResNet-152, préactivation | Échelle | 21,1 % | 5,5 % |\n| ResNet-200, unité d'origine | Échelle | 21,8 % | 6,0 % |\n| ResNet-200, préactivation | Échelle | 20,7 % | 5,3 % |\n| ResNet-200, préactivation | Échelle + rapport d'aspect | **20,1 %** | **4,8 %** |\n| Inception-v3 | Échelle + rapport d'aspect | 21,2 % | 5,6 % |\n\n*Tableau : extrait de la Table 5 de l'article. Ensemble de validation de l'ILSVRC 2012, recadrage unique ; les ResNet sont entraînés en $224\\times224$ et testés en $320\\times320$, Inception-v3 est entraîné et testé en $299\\times299$.*\n\nPassé à la préactivation, ResNet-152 ne progresse que de 21,3 % à 21,1 %, car il ne souffrait pas d'un problème de généralisation marqué. Le cas de ResNet-200 est différent : avec l'unité d'origine, son erreur de 21,8 % est pire que celle de ResNet-152, alors que son erreur d'entraînement est plus basse ; autrement dit, il surapprend. Avec la préactivation, il atteint 20,7 %, mieux que les deux ResNet-152.\n\nLes auteurs ont aussi entraîné jusqu'au bout, sur le ResNet-101 d'ImageNet, la version « BN après l'addition » : son erreur en recadrage unique est de 24,6 % / 7,5 %, moins bonne que les 23,6 % / 7,1 % de l'original, ce qui concorde avec les résultats sur CIFAR.\n\n\n> [!TIP]\n> \n> Les auteurs mentionnent aussi Inception-ResNet-v2, contemporain de leur travail, et s'attendent à ce que leurs conclusions lui soient également utiles :\n> \n> - **[[16.02] Inception-v4 : Beaucoup plus rapide, un peu plus précis](/blog/papers/classic-cnns/inception-v4)**\n\n\nCôté calcul, la complexité du modèle est proportionnelle à sa profondeur : 1001 couches coûtent environ dix fois plus que 100. Sur CIFAR, l'entraînement de ResNet-1001 prend environ 27 heures sur deux GPU ; sur ImageNet, celui de ResNet-200 prend environ trois semaines sur huit GPU.\n\n## Conclusion\n\nLa conclusion de cet article tient en une phrase : garder le raccourci propre. Sur le raccourci, ni multiplication par une constante, ni porte, ni convolution, ni dropout ; après l'addition, ni ReLU ni BN. Ainsi, en propagation avant comme en rétropropagation, le signal peut aller directement de n'importe quelle unité à n'importe quelle autre.\n\nEn pratique, la modification est minime : avancer la BN et la ReLU dans la branche résiduelle, et ne rien faire après l'addition. Pour entraîner un ResNet très profond, ou quand le modèle commence à surapprendre, essayez en priorité la version à préactivation ; pour des réseaux moins profonds, les deux versions se valent à peu près.\n\nLe principe « ne rien mettre sur le raccourci » a de nouveau été débattu quelques années plus tard, à propos de la LayerNorm du Transformer ; si cela vous intéresse, poursuivez avec la note sur [Pre-LN](/blog/papers/transformers/pre-ln).\n","imageSizes":{"/content/papers/assets/7eda4acdde3019e92c5b44f59917b1e493a5b11b5b8a63280d03b15787934ef5.png":{"width":967,"height":469},"/content/papers/assets/7710a267ec379977c4b41b07fbb2532dd44111584b6c0542b7ce9e96556e4f13.png":{"width":690,"height":659},"/content/papers/assets/f032506b6dda998779a8abf2fee9cbf44371ac4a2c4ebf8c93d834286bbb7501.png":{"width":965,"height":466},"/content/papers/assets/1a7a520a803ed65de475f2ee4bc5ade9b1833de9aefd758c5ef57153e5d087d2.png":{"width":967,"height":546}}}
