Leçon 2 — La convolution : détecter un motif partout dans l'image
Le problème que la convolution résout
Reprenons le tenseur de la leçon 1 : 150 528 nombres. Si l'on branche dessus une couche de neurones classique, chaque neurone doit avoir un poids par entrée. Avec seulement mille neurones dans cette première couche, on obtient plus de 150 millions de paramètres, pour une seule couche.
Ce n'est pas seulement trop coûteux. C'est surtout absurde, pour deux raisons.
Premièrement, la position est traitée comme une identité. Un neurone qui a appris à repérer un contour vertical au pixel (30, 40) n'en sait strictement rien au pixel (150, 200) : ce sont d'autres poids, appris séparément. Il faudrait donc réapprendre chaque motif à chaque emplacement possible.
Deuxièmement, la structure spatiale est détruite. Une couche pleinement connectée voit une liste de 150 528 nombres sans savoir lesquels sont voisins. Or dans une image, le voisinage est l'information essentielle : un pixel n'a de sens que par rapport à ceux qui l'entourent.
L'idée : un petit filtre qu'on promène
La convolution renverse le raisonnement. Au lieu d'un neurone par position, on définit un petit filtre — typiquement 3 × 3 — et on le fait glisser sur toute l'image.
À chaque position, on multiplie les neuf valeurs du filtre par les neuf pixels sous le filtre, on additionne, et on écrit le résultat dans une nouvelle grille. Cette grille de sortie s'appelle une carte d'activation : elle indique, pour chaque endroit de l'image, à quel point le motif du filtre y est présent.
Deux conséquences majeures découlent de ce simple changement.
Le nombre de paramètres s'écroule. Un filtre de 3 × 3 sur trois canaux, c'est 27 poids et un biais. Trente-deux filtres de ce type font moins de 900 paramètres, contre 150 millions pour la couche pleinement connectée équivalente. Le facteur est de l'ordre de cent mille.
L'invariance par translation est acquise par construction. Comme c'est le même filtre qui balaie toute l'image, un motif détecté en haut à gauche est détecté à l'identique en bas à droite. On n'a pas besoin d'apprendre le motif à chaque emplacement, et on n'a pas besoin de montrer l'objet à toutes les positions dans les données d'entraînement.
C'est ce qu'on appelle le partage de poids, et c'est l'idée centrale de la vision moderne.
Ce que les filtres apprennent réellement
Les 27 poids d'un filtre ne sont pas choisis : ils sont appris par descente de gradient, exactement comme n'importe quel autre paramètre.
Ce qui est remarquable, c'est ce qu'ils deviennent. Quand on visualise les filtres de la première couche d'un réseau entraîné, on retrouve toujours à peu près les mêmes choses : des détecteurs de contours dans différentes orientations, des transitions de couleur, des taches. Personne ne les a programmés, et ils ressemblent étrangement aux filtres que les ingénieurs concevaient à la main avant 2012 — et aussi à ce que fait le cortex visuel primaire chez les mammifères.
Plus haut dans le réseau, cela devient plus intéressant.
| Profondeur | Ce que les filtres détectent |
|---|---|
| Couche 1 | contours, orientations, transitions de couleur |
| Couches 2-3 | coins, textures, motifs répétés |
| Couches intermédiaires | parties d'objets : une roue, un œil, une poignée |
| Couches profondes | objets entiers et configurations |
Cette hiérarchie émerge sans supervision intermédiaire. On n'a jamais dit au réseau « apprends d'abord les contours ». On lui a seulement donné des images et des étiquettes finales, et cette organisation est la solution qu'il a trouvée.
C'est aussi ce qui rend le transfer learning si efficace en vision : les contours et les textures sont utiles pour reconnaître n'importe quoi, donc les premières couches d'un modèle entraîné sur des photographies d'animaux servent aussi bien pour inspecter des soudures.
Le sous-échantillonnage et le champ récepteur
Un filtre de 3 × 3 ne voit que neuf pixels. Comment un réseau finit-il par percevoir un objet entier ?
Par accumulation. Une couche de convolution regarde 3 × 3 pixels de l'entrée. La couche suivante regarde 3 × 3 valeurs de la carte d'activation précédente, chacune résumant déjà 3 × 3 pixels : elle perçoit donc indirectement une zone de 5 × 5. Cette zone d'influence s'appelle le champ récepteur, et elle grandit avec la profondeur.
Pour l'agrandir plus vite, on intercale du sous-échantillonnage — le pooling. L'opération la plus courante prend chaque bloc de 2 × 2 et ne garde que la valeur maximale, ce qui divise par deux la hauteur et la largeur. Trois opérations de ce type ramènent une carte de 224 pixels à 28, et le champ récepteur des couches suivantes couvre alors une large partie de l'image.
Le sous-échantillonnage apporte trois choses : un champ récepteur qui croît vite, un coût de calcul qui baisse, et une tolérance aux petits déplacements, puisqu'un motif légèrement décalé donne le même maximum.
Il jette de l'information de localisation précise. Pour de la classification, cela n'a pas d'importance : savoir où exactement se trouve le chat n'intéresse personne. Pour de la segmentation, où l'on veut une réponse par pixel, c'est un problème, et les architectures dédiées comme U-Net sont précisément conçues pour récupérer cette précision perdue. Voir la leçon 4.
L'anatomie d'un réseau convolutif
Assemblé, un réseau de vision classique ressemble à ceci :
La partie convolutive est le dorsal : elle transforme les pixels en une représentation compacte et riche. La partie finale est la tête : elle traduit cette représentation en la réponse demandée.
Cette séparation a une conséquence très pratique. En transfer learning, on garde le dorsal et on remplace la tête. Un dorsal entraîné sur des millions d'images produit des représentations excellentes ; il ne reste qu'à entraîner une petite tête sur vos quelques centaines d'images annotées.
Ce que la convolution ne fait pas
Il vaut mieux le savoir avant d'être surpris en production.
Elle n'est pas invariante à la rotation. Un filtre qui détecte un contour vertical ne détecte pas le même contour incliné à 45 degrés ; il faut un autre filtre. Si vos objets peuvent apparaître dans n'importe quelle orientation, il faut le prévoir par augmentation de données.
Elle n'est pas invariante à l'échelle. Un motif deux fois plus grand n'active pas le même filtre. Les architectures modernes traitent l'image à plusieurs résolutions pour compenser.
Elle ne raisonne pas sur les relations. Un réseau convolutif détecte très bien la présence d'un œil, d'un nez et d'une bouche. Qu'ils soient disposés correctement les uns par rapport aux autres n'est capté qu'indirectement, par les couches profondes, et de façon imparfaite. C'est une des raisons pour lesquelles les images générées présentaient longtemps des visages aux éléments mal agencés.
À retenir
- Une couche pleinement connectée sur une image coûte des centaines de millions de paramètres et détruit la structure spatiale.
- La convolution glisse un petit filtre partagé sur toute l'image : cent mille fois moins de paramètres, et l'invariance par translation par construction.
- Les filtres sont appris, et la première couche retrouve systématiquement des détecteurs de contours.
- Une hiérarchie de représentations émerge sans supervision intermédiaire ; c'est le fondement du transfer learning en vision.
- Le sous-échantillonnage agrandit le champ récepteur et réduit le coût, au prix de la précision de localisation.
- La convolution n'est pas invariante à la rotation ni à l'échelle, et ne raisonne pas sur les relations entre parties.
Leçon suivante — Les tâches de vision : classer, détecter, segmenter, suivre →