{"notes":[{"id":"classic-cnns/wide-resnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Wide ResNet","subtitle":"Plus large, pas plus profond","author":"Z. Yuan","paperDate":"2016-05-23","publishedOn":"2024-02-14","world":"external/wide-resnet","paperTitle":"Wide Residual Networks","paperUrl":"https://arxiv.org/abs/1605.07146","bibliography":{"title":"Wide Residual Networks","authors":["Sergey Zagoruyko","Nikos Komodakis"],"url":"https://arxiv.org/abs/1605.07146","pdfUrl":"https://arxiv.org/pdf/1605.07146v4","codeUrl":null,"preprint":{"id":"1605.07146","submittedOn":"2016-05-23","url":"https://arxiv.org/abs/1605.07146"},"publication":{"venue":"BMVC","year":2016,"kind":"conference","url":"https://doi.org/10.5244/C.30.87"},"citation":"@misc{classiccnnswideresnet2016,\n  title = {{Wide Residual Networks}},\n  author = {Sergey Zagoruyko and Nikos Komodakis},\n  year = {2016},\n  eprint = {1605.07146},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1605.07146}\n}\n","citationPath":"/content/papers/citations/classic-cnns/wide-resnet.2e42de74f658.bib"},"thumbnail":{"src":"/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png","width":1400,"height":500},"locale":"fr","path":"/content/papers/fr/classic-cnns/wide-resnet.695ffb96d3d8.md","headings":[{"id":"définir-le-problème","text":"Définir le problème","depth":2},{"id":"des-resnet-de-plus-en-plus-minces","text":"Des ResNet de plus en plus minces","depth":3},{"id":"un-raccourci-trop-facile","text":"Un raccourci trop facile","depth":3},{"id":"les-réseaux-minces-et-profonds-ne-vont-pas-vite-non-plus","text":"Les réseaux minces et profonds ne vont pas vite non plus","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"ce-que-lon-peut-modifier","text":"Ce que l'on peut modifier","depth":3},{"id":"wrn-n-k","text":"WRN-n-k","depth":3},{"id":"que-mettre-dans-le-bloc","text":"Que mettre dans le bloc ?","depth":3},{"id":"un-dropout-dans-le-bloc","text":"Un dropout dans le bloc","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"répartir-largeur-et-profondeur","text":"Répartir largeur et profondeur","depth":3},{"id":"face-aux-resnet-à-mille-couches","text":"Face aux ResNet à mille couches","depth":3},{"id":"les-réseaux-larges-vont-plus-vite","text":"Les réseaux larges vont plus vite","depth":3},{"id":"leffet-du-dropout","text":"L'effet du dropout","depth":3},{"id":"sur-imagenet-élargir-la-couche-du-milieu","text":"Sur ImageNet, élargir la couche du milieu","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""},{"id":"classic-cnns/stochastic-depth","relation":"referenced","topic":""}]},{"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":"2024-01-11","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":{"venue":"ECCV","year":2016,"kind":"conference","url":"https://doi.org/10.1007/978-3-319-46493-0_38"},"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.ee56b2c91f36.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/stochastic-depth","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Stochastic Depth","subtitle":"Cette couche a pris sa journée","author":"Z. Yuan","paperDate":"2016-03-30","publishedOn":"2024-01-24","world":"external/stochastic-depth","paperTitle":"Deep Networks with Stochastic Depth","paperUrl":"https://arxiv.org/abs/1603.09382","bibliography":{"title":"Deep Networks with Stochastic Depth","authors":["Gao Huang","Yu Sun","Zhuang Liu","Daniel Sedra","Kilian Weinberger"],"url":"https://arxiv.org/abs/1603.09382","pdfUrl":"https://arxiv.org/pdf/1603.09382v3","codeUrl":null,"preprint":{"id":"1603.09382","submittedOn":"2016-03-30","url":"https://arxiv.org/abs/1603.09382"},"publication":{"venue":"ECCV","year":2016,"kind":"conference","url":"https://doi.org/10.1007/978-3-319-46493-0_39"},"citation":"@misc{classiccnnsstochasticdepth2016,\n  title = {{Deep Networks with Stochastic Depth}},\n  author = {Gao Huang and Yu Sun and Zhuang Liu and Daniel Sedra and Kilian Weinberger},\n  year = {2016},\n  eprint = {1603.09382},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1603.09382}\n}\n","citationPath":"/content/papers/citations/classic-cnns/stochastic-depth.3716109ef477.bib"},"thumbnail":{"src":"/content/papers/assets/620e6ddf909f1f405e38b6055bd732ae4c4b7c208f147e00b870a56642020c02.png","width":963,"height":339},"locale":"fr","path":"/content/papers/fr/classic-cnns/stochastic-depth.1085acb8e04f.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":"des-blocs-absents-au-hasard","text":"Des blocs absents au hasard","depth":3},{"id":"les-premières-couches-sont-plus-souvent-présentes","text":"Les premières couches sont plus souvent présentes","depth":3},{"id":"au-test-multiplier-par-la-probabilité-de-survie","text":"Au test, multiplier par la probabilité de survie","depth":3},{"id":"pourquoi-ça-marche","text":"Pourquoi ça marche ?","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"taux-derreur-et-temps-dentraînement","text":"Taux d'erreur et temps d'entraînement","depth":3},{"id":"mille-deux-cents-couches","text":"Mille deux cents couches","depth":3},{"id":"pas-de-victoire-sur-imagenet","text":"Pas de victoire sur ImageNet","depth":3},{"id":"le-gradient-est-il-vraiment-plus-fort","text":"Le gradient est-il vraiment plus fort ?","depth":3},{"id":"quelle-probabilité-de-survie-choisir","text":"Quelle probabilité de survie choisir ?","depth":3},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"referenced","topic":""},{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""},{"id":"classic-cnns/densenet","relation":"referenced","topic":""}]}],"text":"Au premier semestre 2016, le nombre de couches des ResNet ne cesse de grimper.\n\nLes auteurs de ResNet passent l'unité résiduelle en préactivation et entraînent un réseau de 1001 couches sur CIFAR-10 ; à la même époque, Stochastic Depth empile lui aussi 1202 couches.\n\n\n> [!TIP]\n> \n> Ces deux travaux ont chacun leur note, que vous pouvez lire d'abord :\n> \n> - **[[16.03] ResNet v2 : Le raccourci doit rester propre](/blog/papers/classic-cnns/resnet-v2)**\n> - **[[16.03] Stochastic Depth : Cette couche a pris sa journée](/blog/papers/classic-cnns/stochastic-depth)**\n\n\nPlus de couches donnent bien de meilleurs résultats, mais coûtent de plus en plus cher. En passant de 110 à 1001 couches, le ResNet à préactivation voit son erreur sur CIFAR-10 baisser de 6,37 % à 4,92 %. Neuf fois plus de couches, pour moins d'un point et demi de pourcentage d'erreur en moins ; le temps d'entraînement s'allonge lui aussi.\n\nÀ l'École des Ponts ParisTech, Sergey Zagoruyko et Nikos Komodakis prennent le problème dans l'autre sens. Un ResNet doit-il vraiment être aussi mince ?\n\nIls rendent le réseau plus large et moins profond.\n\n## Définir le problème\n\n### Des ResNet de plus en plus minces\n\nÀ la conception, les auteurs de ResNet privilégient des réseaux minces et profonds, et consacrent les paramètres économisés à davantage de couches. Le bloc en goulot d'étranglement (bottleneck) venu ensuite réduit d'abord la dimension avec une convolution $1\\times1$, applique la convolution $3\\times3$, puis remonte la dimension, ce qui amincit encore un peu chaque bloc.\n\nDans le ResNet utilisé sur CIFAR, les trois étages n'ont que 16, 32 et 64 canaux. VGG et Inception, qui l'ont précédé, sont tous bien plus larges.\n\n### Un raccourci trop facile\n\nLes auteurs soulignent que le raccourci identité, qui permet d'entraîner ResNet jusqu'à plus de mille couches, est en même temps sa faiblesse.\n\nLe gradient peut remonter tout du long par le raccourci, et rien ne l'oblige à passer par les poids de la branche résiduelle. À l'issue de l'entraînement, il se peut que seuls quelques blocs aient appris quelque chose d'utile, ou que de nombreux blocs n'apportent chacun qu'une toute petite contribution. Les auteurs appellent ce phénomène *diminishing feature reuse*.\n\nIls invoquent Stochastic Depth à l'appui. Désactiver au hasard des blocs résiduels entiers pendant l'entraînement, loin de nuire, améliore le réseau, ce qui, à leurs yeux, montre que beaucoup de blocs ne faisaient pas grand-chose.\n\n### Les réseaux minces et profonds ne vont pas vite non plus\n\nLes GPU excellent à traiter de gros tenseurs d'un seul coup, alors qu'un réseau mince et profond est une longue suite de petites convolutions qu'il faut calculer couche après couche, chacune attendant la précédente. Dans le résumé, les auteurs notent que chaque fraction de point de précision gagnée exige presque de doubler le nombre de couches, si bien que l'entraînement devient de plus en plus lent.\n\nLes auteurs veulent donc savoir s'il vaut mieux consacrer les mêmes paramètres à la profondeur ou à la largeur. Quelle largeur faut-il donner à un ResNet ?\n\n## Résoudre le problème\n\n### Ce que l'on peut modifier\n\nLes auteurs partent du bloc à préactivation de ResNet v2, où chaque convolution est précédée d'une BN et d'une ReLU. Pour rendre un bloc résiduel plus expressif, il existe en gros trois façons de faire :\n\n1. Mettre davantage de couches de convolution dans le bloc.\n2. Élargir les convolutions, avec plus de canaux.\n3. Agrandir les noyaux de convolution.\n\nLa troisième est écartée d'emblée, car les travaux sur VGG et sur la série Inception ont déjà montré l'efficacité des petits noyaux $3\\times3$. Pour les deux autres, les auteurs introduisent un facteur pour chacune. Le **facteur d'approfondissement $l$** est le nombre de couches de convolution d'un bloc, et le **facteur d'élargissement $k$** le coefficient qui multiplie le nombre de canaux. Le bloc d'origine correspond à $l=2$, $k=1$.\n\n[![Schéma de quatre blocs résiduels ; dans chacun, le raccourci gris est à gauche et la branche résiduelle à droite, les deux s'additionnant en bas. (a) basic : deux conv3x3 ; (b) bottleneck : conv1x1, conv3x3, conv1x1, la conv3x3 du milieu étant plus étroite ; (c) basic-wide : deux conv3x3 plus larges ; (d) wide-dropout : une couche de dropout prise entre deux conv3x3 plus larges](/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png)](/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png)\n\n*Figure 1 de l'article, extraite de la [**page 2 du PDF v4**](https://arxiv.org/pdf/1605.07146v4#page=2). Les quatre blocs résiduels utilisés dans l'article ; chaque convolution est précédée d'une BN et d'une ReLU, omises sur la figure.*\n\nLa largeur des rectangles représente le nombre de canaux. (a) est le bloc basic d'origine, et (c) a la même structure, avec ses deux convolutions élargies. Le bottleneck (b) est l'outil dont ResNet se sert pour amincir le réseau, à l'opposé de l'élargissement étudié ici ; les auteurs l'écartent donc et partent toujours du bloc basic. (d) ajoute un dropout entre les deux convolutions ; nous y reviendrons plus loin.\n\n### WRN-n-k\n\nLe squelette du réseau reprend la conception de ResNet v2 sur CIFAR, avec pour seul ajout le facteur d'élargissement $k$ :\n\n| Groupe | Taille de sortie | Contenu |\n| --- | --- | --- |\n| conv1 | $32\\times32$ | Convolution $3\\times3$, 16 canaux |\n| conv2 | $32\\times32$ | $N$ blocs, chacun de deux convolutions $3\\times3$, $16k$ canaux |\n| conv3 | $16\\times16$ | $N$ blocs, $32k$ canaux |\n| conv4 | $8\\times8$ | $N$ blocs, $64k$ canaux |\n| avg-pool | $1\\times1$ | Pooling moyen $8\\times8$, suivi de la couche de classification |\n\n*Tableau : d'après la Table 1 de l'article. La première couche de conv3 et de conv4 divise par deux la taille de la carte de caractéristiques ; $k=1$ correspond au ResNet à préactivation d'origine.*\n\nLes auteurs notent un réseau **WRN-$n$-$k$**, où $n$ est le nombre total de couches de convolution et $k$ le facteur d'élargissement. Le code officiel impose $n=6N+4$ ; WRN-28-10 est donc un réseau à $N=4$ blocs par groupe, dont le nombre de canaux est multiplié par 10.\n\nL'effet de $k$ sur le nombre de paramètres est quadratique. Une convolution $3\\times3$ à $C$ canaux en entrée et en sortie compte $9C^2$ poids ; doubler le nombre de canaux quadruple les poids. Construisons quelques réseaux d'après le tableau, et comptons leurs paramètres :\n\n```python\nimport torch.nn as nn\n\nclass Block(nn.Module):\n    \"\"\"BN-ReLU-conv3×3-BN-ReLU-conv3×3 ; quand la forme change, le raccourci passe par une convolution 1×1\"\"\"\n    def __init__(self, cin, cout, stride):\n        super().__init__()\n        self.body = nn.Sequential(\n            nn.BatchNorm2d(cin), nn.ReLU(), nn.Conv2d(cin, cout, 3, stride, 1, bias=False),\n            nn.BatchNorm2d(cout), nn.ReLU(), nn.Conv2d(cout, cout, 3, 1, 1, bias=False))\n        self.shortcut = (nn.Identity() if cin == cout and stride == 1\n                         else nn.Conv2d(cin, cout, 1, stride, bias=False))\n\n    def forward(self, x):\n        return self.shortcut(x) + self.body(x)\n\ndef wrn(n, k, num_classes=10):\n    N = (n - 4) // 6                       # nombre de blocs par groupe\n    widths = [16 * k, 32 * k, 64 * k]\n    layers, cin = [nn.Conv2d(3, 16, 3, 1, 1, bias=False)], 16\n    for width, stride in zip(widths, (1, 2, 2)):\n        for i in range(N):\n            layers.append(Block(cin, width, stride if i == 0 else 1))\n            cin = width\n    layers += [nn.BatchNorm2d(cin), nn.ReLU(), nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(cin, num_classes)]\n    return nn.Sequential(*layers)\n\nfor n, k in [(40, 1), (40, 2), (40, 4), (16, 8), (22, 8), (28, 10)]:\n    params = sum(p.numel() for p in wrn(n, k).parameters())\n    print(f\"WRN-{n}-{k} : {(n - 4) // 6} blocs par groupe, canaux {16*k}/{32*k}/{64*k}, paramètres {params / 1e6:.1f}M\")\n```\n\n```text\nWRN-40-1 : 6 blocs par groupe, canaux 16/32/64, paramètres 0.6M\nWRN-40-2 : 6 blocs par groupe, canaux 32/64/128, paramètres 2.2M\nWRN-40-4 : 6 blocs par groupe, canaux 64/128/256, paramètres 8.9M\nWRN-16-8 : 2 blocs par groupe, canaux 128/256/512, paramètres 11.0M\nWRN-22-8 : 3 blocs par groupe, canaux 128/256/512, paramètres 17.2M\nWRN-28-10 : 4 blocs par groupe, canaux 160/320/640, paramètres 36.5M\n```\n\nCes chiffres correspondent aux nombres de paramètres des tableaux de l'article. À 40 couches, quand $k$ passe de 1 à 2 puis à 4, les paramètres passent de 0,6 M à 2,2 M puis à 8,9 M, soit environ quatre fois plus à chaque étape. À l'inverse, avec seulement 16 couches, WRN-16-8 a déjà plus de paramètres que WRN-40-4 et ses 40 couches.\n\n### Que mettre dans le bloc ?\n\nFaut-il y mêler quelques convolutions $1\\times1$, comme NiN ? Les auteurs notent $B(M)$ la structure d'un bloc, où $M$ est la liste des tailles de noyau de ses couches de convolution. Par exemple, $B(3,3)$ est le bloc basic d'origine, et $B(3,1,3)$ insère une couche $1\\times1$ entre les deux couches $3\\times3$.\n\nCette série d'expériences utilise toujours $k=2$, ajuste le nombre de couches pour garder des nombres de paramètres proches, et retient la médiane de 5 entraînements sur CIFAR-10 :\n\n| Bloc | Profondeur | Paramètres | Une époque (s) | Erreur CIFAR-10 |\n| --- | ---: | ---: | ---: | ---: |\n| $B(1,3,1)$ | 40 | 1,4 M | 85,8 | 6,06 % |\n| $B(3,1)$ | 40 | 1,2 M | 67,5 | 5,78 % |\n| $B(1,3)$ | 40 | 1,3 M | 72,2 | 6,42 % |\n| $B(3,1,1)$ | 40 | 1,3 M | 82,2 | 5,86 % |\n| **$B(3,3)$** | 28 | 1,5 M | 67,5 | **5,73 %** |\n| $B(3,1,3)$ | 22 | 1,1 M | 59,9 | 5,78 % |\n\n*Tableau : extrait de la Table 2 de l'article.*\n\n$B(3,3)$ est le meilleur, mais de peu ; $B(3,1)$ et $B(3,1,3)$, qui ont moins de paramètres, font presque aussi bien. Les auteurs en concluent que des blocs aux nombres de paramètres proches donnent des résultats à peu près équivalents, et s'en tiennent désormais aux convolutions $3\\times3$.\n\nCombien de couches mettre dans un bloc ? Les auteurs fixent le nombre total de couches et le nombre de paramètres de WRN-40-2 (2,2 M), et ne font varier que le nombre de couches $l$ de chaque bloc :\n\n| $l$ | 1 | 2 | 3 | 4 |\n| --- | ---: | ---: | ---: | ---: |\n| Erreur CIFAR-10 | 6,69 % | **5,43 %** | 5,65 % | 5,93 % |\n\n*Tableau : extrait de la Table 3 de l'article.*\n\nÀ nombre total de couches fixé, plus $l$ est grand, moins il y a de blocs, et moins il y a de connexions résiduelles. Les auteurs supposent que $l=3$ et $l=4$ font moins bien parce qu'avec moins de connexions résiduelles, le réseau devient plus difficile à optimiser ; avec une seule couche, $l=1$ est encore nettement moins bon. Deux couches, c'est juste ce qu'il faut, soit précisément le $B(3,3)$ d'origine.\n\nAprès ce tour d'horizon, la conception interne du bloc revient à son point de départ ; il ne reste plus à modifier que la largeur $k$.\n\n### Un dropout dans le bloc\n\nUne fois le réseau élargi, les paramètres explosent, et il faut régulariser. La BN a elle-même un effet régularisateur, mais elle va généralement de pair avec une forte augmentation des données, dont les auteurs ne veulent pas dépendre.\n\nIls ajoutent un dropout entre les deux convolutions du bloc, après la ReLU, comme sur la Figure 1(d). En code, il suffit d'ajouter un `nn.Dropout` après la deuxième ReLU du `Block` précédent :\n\n```python\n        self.body = nn.Sequential(\n            nn.BatchNorm2d(cin), nn.ReLU(), nn.Conv2d(cin, cout, 3, stride, 1, bias=False),\n            nn.BatchNorm2d(cout), nn.ReLU(), nn.Dropout(0.3),   # entre les deux convolutions\n            nn.Conv2d(cout, cout, 3, 1, 1, bias=False))\n```\n\nResNet v2 avait lui aussi essayé le dropout dans le bloc résiduel, mais sur le raccourci, et les résultats s'étaient dégradés. Ici, le dropout ne touche que la branche résiduelle, et le raccourci reste propre. La probabilité est fixée par validation croisée, à 0,3 pour CIFAR et à 0,4 pour SVHN.\n\n## Discussion\n\nHors ImageNet, toutes les expériences prennent pour référence le ResNet à préactivation. CIFAR-10 et CIFAR-100 se composent de petites images couleur de $32\\times32$, avec chacun 50 000 images d'entraînement et 10 000 de test, réparties respectivement en 10 et 100 classes ; l'augmentation des données se limite au retournement horizontal et au recadrage aléatoire. SVHN rassemble des numéros de maison photographiés par Street View, environ 600 000 images, sans aucune augmentation.\n\n### Répartir largeur et profondeur\n\n| Profondeur | $k$ | Paramètres | CIFAR-10 | CIFAR-100 |\n| ---: | ---: | ---: | ---: | ---: |\n| 40 | 1 | 0,6 M | 6,85 % | 30,89 % |\n| 40 | 2 | 2,2 M | 5,33 % | 26,04 % |\n| 40 | 4 | 8,9 M | 4,97 % | 22,89 % |\n| 40 | 8 | 35,7 M | 4,66 % | – |\n| 28 | 10 | 36,5 M | **4,17 %** | 20,50 % |\n| 28 | 12 | 52,5 M | 4,33 % | **20,43 %** |\n| 22 | 8 | 17,2 M | 4,38 % | 21,22 % |\n| 22 | 10 | 26,8 M | 4,44 % | 20,75 % |\n| 16 | 8 | 11,0 M | 4,81 % | 22,07 % |\n| 16 | 10 | 17,1 M | 4,56 % | 21,59 % |\n\n*Tableau : extrait de la Table 4 de l'article ; taux d'erreur en test sur CIFAR, images prétraitées par blanchiment ZCA.*\n\nFixons d'abord la profondeur. Pour les réseaux de 40, 22 et 16 couches, plus $k$ est grand, plus l'erreur est basse, dans l'ensemble. La seule petite exception concerne le réseau de 22 couches, quand on passe de $k=8$ à $k=10$ ; l'erreur sur CIFAR-10 remonte alors légèrement de 4,38 % à 4,44 %, tandis que celle sur CIFAR-100 continue de baisser.\n\nFixons ensuite la largeur. À $k=8$, passer de 16 à 22 couches améliore les résultats, mais passer à 40 couches les dégrade, et WRN-40-8 fait moins bien que WRN-22-8. WRN-40-8 compte 35,7 M de paramètres ; selon les auteurs, quand on augmente à la fois la profondeur et la largeur, il faut, au-delà d'un certain nombre de paramètres, une régularisation plus forte.\n\n### Face aux ResNet à mille couches\n\nVient ensuite la confrontation directe avec les meilleurs réseaux minces et profonds de l'époque. Cette série d'expériences passe à une simple normalisation moyenne/écart-type, comme le prétraitement des articles de la famille ResNet, et aucun réseau n'utilise de dropout :\n\n| Réseau | Profondeur-$k$ | Paramètres | CIFAR-10 | CIFAR-100 |\n| --- | --- | ---: | ---: | ---: |\n| ResNet d'origine | 110 | 1,7 M | 6,43 % | 25,16 % |\n| ResNet d'origine | 1202 | 10,2 M | 7,93 % | 27,82 % |\n| Stochastic Depth | 1202 | 10,2 M | 4,91 % | – |\n| ResNet à préactivation | 164 | 1,7 M | 5,46 % | 24,33 % |\n| ResNet à préactivation | 1001 | 10,2 M | 4,92 % (4,64 %) | 22,71 % |\n| WRN | 40-4 | 8,9 M | 4,53 % | 21,18 % |\n| WRN | 16-8 | 11,0 M | 4,27 % | 20,43 % |\n| WRN | 28-10 | 36,5 M | **4,00 %** | **19,25 %** |\n\n*Tableau : extrait de la Table 5 de l'article. Entre parenthèses, le résultat de ResNet v2 entraîné avec une taille de lot de 64 ; tous les autres chiffres utilisent une taille de lot de 128.*\n\nWRN-40-4 et ResNet-1001 ont des nombres de paramètres comparables (8,9 M et 10,2 M), mais le premier n'a qu'un vingt-cinquième des couches du second, et l'emporte sur les deux jeux de données. Les auteurs en déduisent qu'à cette échelle de paramètres, la profondeur n'apporte aucun effet régularisateur de plus que la largeur.\n\nWRN-28-10 a 3,6 fois plus de paramètres que ResNet-1001. À l'époque, on pensait couramment que la profondeur a un effet régularisateur et que la largeur pousse au surapprentissage ; d'après cette idée, il aurait dû surapprendre. En réalité, à taille de lot égale, il l'emporte de 0,92 point de pourcentage sur CIFAR-10 et de 3,46 points sur CIFAR-100.\n\n### Les réseaux larges vont plus vite\n\n[![Diagramme en barres, temps (ms) en ordonnée. À gauche, deux barres bleues pour les réseaux minces et profonds : 164 couches, 85 ms ; mille couches, 512 ms. À droite, trois barres rouges pour les réseaux larges : WRN-40-4, 68 ms ; WRN-16-10, 164 ms ; WRN-28-10, 312 ms. Le taux d'erreur en test sur CIFAR-10 est indiqué à côté de chaque barre](/content/papers/assets/a243b50be60b82d957c92fa85eab5061afe10a86de40a8855c992996066803b0.png)](/content/papers/assets/a243b50be60b82d957c92fa85eab5061afe10a86de40a8855c992996066803b0.png)\n\n*Figure 4 de l'article, extraite de la [**page 12 du PDF v4**](https://arxiv.org/pdf/1605.07146v4#page=12). Durée d'une propagation avant et arrière avec une taille de lot de 32 (Titan X, cuDNN v5). L'axe horizontal indique la profondeur, ou profondeur-$k$.*\n\nEn bleu les réseaux minces et profonds, en rouge les réseaux larges. Le ResNet mince à mille couches met 512 ms par lot (mille couches qui font la queue, impossible d'aller vite), alors que WRN-40-4, de précision comparable, n'en demande que 68, soit plus de sept fois plus rapide. Le plus précis, WRN-28-10, a plusieurs fois plus de paramètres, et reste pourtant 1,6 fois plus rapide que le réseau à mille couches.\n\nL'écart vient de la propriété des GPU évoquée plus haut. Une couche de convolution large traite d'un coup un gros bloc de tenseur et exploite à plein le calcul parallèle du GPU ; un réseau mince et profond aligne mille petites convolutions, et chaque couche doit attendre que la précédente ait fini.\n\n### L'effet du dropout\n\n| Profondeur | $k$ | Dropout | CIFAR-10 | CIFAR-100 | SVHN |\n| ---: | ---: | :---: | ---: | ---: | ---: |\n| 16 | 4 | | 5,02 % | 24,03 % | 1,85 % |\n| 16 | 4 | ✓ | 5,24 % | 23,91 % | 1,64 % |\n| 28 | 10 | | 4,00 % | 19,25 % | – |\n| 28 | 10 | ✓ | **3,89 %** | **18,85 %** | – |\n| 52 | 1 | | 6,43 % | 29,89 % | 2,08 % |\n| 52 | 1 | ✓ | 6,28 % | 29,78 % | 1,70 % |\n\n*Tableau : extrait de la Table 6 de l'article ; prétraitement moyenne/écart-type, médiane de 5 entraînements pour les chiffres de CIFAR.*\n\nSur CIFAR, le gain reste modeste. Avec le dropout, WRN-28-10 perd 0,11 point de pourcentage d'erreur sur CIFAR-10 et 0,4 point sur CIFAR-100 ; WRN-16-4, qui a moins de paramètres, fait même légèrement moins bien sur CIFAR-10.\n\nSur SVHN, l'effet devient net, avec un gain de 0,2 à 0,4 point de pourcentage pour les réseaux larges comme pour les minces. SVHN n'utilise aucune augmentation des données ; selon les auteurs, la BN y surapprend, et sans dropout, la perte d'entraînement descend à des valeurs très basses.\n\nLes auteurs remarquent aussi qu'après la première baisse du taux d'apprentissage, la perte et l'erreur de validation remontent soudain ensemble et oscillent à un niveau élevé jusqu'à la baisse suivante. Ils en identifient la cause, le weight decay, mais le réduire fait nettement chuter la précision. Dans la plupart des cas, le dropout fait en partie disparaître ce phénomène.\n\nLes auteurs ont aussi rassemblé les meilleurs résultats en modèle unique sur chaque jeu de données. WRN-40-10 avec dropout atteint 3,8 % et 18,3 % sur CIFAR-10 et CIFAR-100, et WRN-16-8 avec dropout 1,54 % sur SVHN.\n\n### Sur ImageNet, élargir la couche du milieu\n\nSur ImageNet, les auteurs commencent par élargir de 1,5 à 3 fois des réseaux à blocs basic comme ResNet-18 et ResNet-34. L'élargissement reste efficace, et des réseaux aux nombres de paramètres comparables atteignent des précisions semblables, même quand leur profondeur varie du simple au double. Mais ces réseaux comptent facilement plusieurs dizaines de millions, voire plus de cent millions de paramètres, et font toujours moins bien que des réseaux en goulot d'étranglement qui en ont bien moins. Par exemple, WRN-34 élargi deux fois compte 86,0 M de paramètres pour une erreur top-1 de 23,39 %, alors que ResNet-101 atteint 22,44 % avec seulement 44,5 M de paramètres.\n\nLes auteurs supposent que le goulot d'étranglement convient peut-être mieux à ImageNet, ou bien que cette tâche demande un réseau plus profond. Ils repartent donc de ResNet-50 et n'élargissent, d'un facteur deux, que la convolution $3\\times3$ au milieu du goulot d'étranglement, ce qui donne WRN-50-2-bottleneck :\n\n| Réseau | Erreur top-1 | Erreur top-5 | Paramètres | Temps par lot (ms) |\n| --- | ---: | ---: | ---: | ---: |\n| ResNet-50 | 24,01 % | 7,02 % | 25,6 M | 49 |\n| ResNet-101 | 22,44 % | 6,21 % | 44,5 M | 82 |\n| ResNet-152 | 22,16 % | 6,16 % | 60,2 M | 115 |\n| **WRN-50-2-bottleneck** | **21,9 %** | **6,03 %** | 68,9 M | 93 |\n| pre-ResNet-200 | 21,66 % | 5,79 % | 64,7 M | 154 |\n\n*Tableau : extrait de la Table 8 de l'article ; recadrage unique sur l'ensemble de validation de l'ILSVRC-2012, temps mesuré avec une taille de lot de 16.*\n\nAvec seulement 50 couches, WRN-50-2 bat ResNet-152 et va plus vite que lui ; face au ResNet à préactivation de 200 couches, son erreur est légèrement plus élevée, mais il ne lui faut que 93 ms par lot, contre 154 ms. Les auteurs reconnaissent aussi franchement que des réseaux en goulot d'étranglement plus grands demandent une machine à 8 GPU pour être entraînés, et qu'ils ne les ont pas essayés.\n\nCe réseau est le `wide_resnet50_2` de torchvision. Comparons son dernier bloc à celui de ResNet-50 :\n\n```python\nfrom torchvision.models import resnet50, wide_resnet50_2\n\nfor name, build in [(\"ResNet-50\", resnet50), (\"Wide ResNet-50-2\", wide_resnet50_2)]:\n    model = build(weights=None)\n    last = model.layer4[-1]\n    widths = (last.conv1.in_channels, last.conv2.in_channels, last.conv3.out_channels)\n    params = sum(p.numel() for p in model.parameters())\n    print(f\"{name} : dernier bloc {widths[0]}-{widths[1]}-{widths[2]}, paramètres {params / 1e6:.1f}M\")\n```\n\n```text\nResNet-50 : dernier bloc 2048-512-2048, paramètres 25.6M\nWide ResNet-50-2 : dernier bloc 2048-1024-2048, paramètres 68.9M\n```\n\nL'entrée et la sortie du bloc gardent 2048 canaux ; seule la couche du milieu passe de 512 à 1024. Le nombre de paramètres est lui aussi identique à celui du tableau de l'article.\n\nLes auteurs ont également participé au concours de détection d'objets COCO 2016 avec WRN-34-2, à 34 couches et élargi deux fois ; en modèle unique, il y obtient 35,2 mAP, devant des modèles dont le backbone est ResNet-152 ou Inception-v4.\n\n## Conclusion\n\nRevenons à la question de départ. Un ResNet doit-il vraiment être aussi mince ? La réponse de cet article est non. Sur CIFAR, consacrer les mêmes paramètres à la largeur rapporte plus que les consacrer à la profondeur ; un WRN de 16 couches bat déjà le ResNet à mille couches, avec un entraînement plusieurs fois plus rapide. Dans un ResNet à mille couches, bon nombre de couches semblent tirer au flanc.\n\nCette conclusion repose surtout sur CIFAR. Sur ImageNet, les auteurs ne sont pas allés au-delà de 50 couches, pour une raison très terre à terre, puisque des réseaux plus grands exigent une machine à 8 GPU pour être entraînés.\n\nWRN est ensuite devenu l'un des backbones les plus courants sur CIFAR ; l'apprentissage semi-supervisé [FixMatch](https://arxiv.org/abs/2001.07685), par exemple, utilise WRN-28-2. La prochaine fois que vous croiserez ce nom dans un article, vous saurez qu'il s'agit d'un réseau de 28 couches élargi deux fois.\n","imageSizes":{"/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png":{"width":1400,"height":500},"/content/papers/assets/a243b50be60b82d957c92fa85eab5061afe10a86de40a8855c992996066803b0.png":{"width":459,"height":542}}}
