Capsule Networks (CapsNet)
Les réseaux à capsules (CapsNets) encodent chaque partie sous forme de vecteur dont la longueur représente sa probabilité et la direction, sa pose ; les capsules sont reliées par un routage dynamique.
Les réseaux à capsules (CapsNets) sont des réseaux de neurones constitués de capsules, petits groupes de neurones dont la sortie est un vecteur plutôt qu’un simple nombre. La longueur du vecteur d’une capsule représente la probabilité de présence d’une entité, comme un chiffre, un œil ou une roue ; sa direction encode les paramètres d’instanciation de cette entité : position, taille, orientation, épaisseur du trait et autres propriétés de pose et de déformation. Geoffrey Hinton, Alex Krizhevsky et Sida Wang ont présenté les capsules dans un article de 2011 sur les autoencodeurs transformants ; Sara Sabour, Nicholas Frosst et Hinton en ont fait un classifieur fonctionnel dans Routage dynamique entre capsules, présenté à NIPS 2017, qui relie les capsules de couches successives au moyen d’un algorithme itératif appelé routage par accord.
Pourquoi les capsules remplacent le max pooling#
Un réseau de neurones convolutif (CNN) détecte des caractéristiques au moyen d’activations scalaires et réduit souvent ses cartes de caractéristiques avec le max pooling, qui conserve la réponse la plus forte dans chaque fenêtre et oublie sa position dans celle-ci. La détection tolère ainsi les petits décalages, mais un réseau qui vérifie uniquement la présence de différentes parties peut accepter un visage dont la bouche se trouve au-dessus des yeux — le problème dit de Picasso. Hinton défendait l’équivariance plutôt que l’invariance : lorsqu’un objet se déplace ou tourne, le vecteur d’une capsule devrait tourner avec lui, tandis que sa longueur, qui représente la probabilité d’existence de l’objet, reste identique. Les capsules qui apprennent ainsi le point de vue nécessitent moins d’augmentation de données qu’un CNN pour reconnaître des objets sous de nouveaux angles.
Ultralytics YOLO26 conserve les positions des objets sans capsules : cinq convolutions de stride 2 réduisent son entrée à une résolution de 1/32, et son unique bloc de max pooling, SPPF, applique trois fois de suite un pooling de stride 1 avec une fenêtre de 5 x 5, élargissant le champ réceptif sans réduire la grille à partir de laquelle sa tête de détection effectue ses prédictions.
Fonctionnement du routage dynamique#
Chaque capsule d’une couche inférieure multiplie sa sortie par une matrice de poids apprise afin de prédire la sortie de chaque capsule de la couche supérieure. Le routage détermine ensuite quelle part de la sortie de chaque capsule enfant atteint chaque capsule parent. Un softmax appliqué aux logits de routage, initialisés à zéro, produit des coefficients de couplage qui répartissent la sortie de chaque enfant entre les parents. Chaque parent additionne les prédictions pondérées par ces coefficients et applique la fonction squash, qui conserve la direction du vecteur et ramène sa longueur dans l’intervalle de 0 à 1. Le produit scalaire entre chaque prédiction et la nouvelle sortie du parent est ajouté au logit ; les enfants transmettent donc davantage de leur sortie aux parents dont ils ont prédit l’état :
import torch
torch.manual_seed(0)
# 6 capsules enfants prédisent chacune une pose 8D pour 2 capsules parents
predictions = 0.2 * torch.randn(6, 2, 8)
pose = 0.5 * torch.randn(8)
predictions[:4, 0] = pose + 0.05 * torch.randn(4, 8) # les enfants 0 à 3 s’accordent sur le parent 0
logits = torch.zeros(6, 2)
for _ in range(3): # routage par accord, 3 itérations comme dans l’article
coupling = logits.softmax(dim=1) # chaque enfant répartit son vote entre les parents
s = (coupling.unsqueeze(-1) * predictions).sum(dim=0)
squared = s.square().sum(dim=-1, keepdim=True)
parents = squared / (1 + squared) * s / squared.sqrt() # squash : longueur dans [0, 1)
logits = logits + (predictions * parents).sum(dim=-1) # l’accord augmente le logit
print(coupling[:, 0].round(decimals=2))
print(parents.norm(dim=-1).round(decimals=2))Le résultat affiché est tensor([0.9700, 0.9700, 0.9700, 0.9700, 0.5700, 0.4700]) et tensor([0.9800, 0.1500]). Après trois itérations, les quatre enfants qui s’accordent transmettent 97 % de leur sortie au parent 0, les deux autres restent proches d’une répartition équilibrée, et la longueur du vecteur du parent 0 atteint 0.98, tandis que celle du parent 1, qui n’a reçu que des votes dispersés, reste à 0.15. Le routage ressemble au mécanisme d’attention d’un Transformer exécuté dans le sens inverse : le softmax s’applique aux parents auxquels un enfant peut contribuer, de sorte que les parents se disputent la sortie de chaque enfant.
CapsNet de 2017 et ses résultats#
Le réseau d’origine est peu profond : une convolution dotée de 256 noyaux de taille 9 x 9 alimente PrimaryCaps, une couche de capsules convolutives qui transforme un chiffre de 28 x 28 en 32 x 6 x 6 = 1 152 capsules de huit dimensions ; le routage les relie à DigitCaps, qui contient une capsule de 16 dimensions par classe. L’entraînement combine une fonction de perte à marge sur les longueurs des capsules, qui pousse la longueur au-dessus de 0.9 pour les chiffres présents et en dessous de 0.1 pour les autres, avec un décodeur qui reconstruit l’image à partir de la capsule du chiffre correct, ainsi qu’un terme de régularisation de type autoencodeur, pondéré par 0.0005. La perturbation de l’une des 16 dimensions et le décodage du résultat modifient une seule propriété, comme l’échelle, l’épaisseur du trait, l’inclinaison ou la largeur ; les sorties des capsules sont ainsi plus faciles à examiner que les activations d’un CNN, un objectif partagé avec l’IA explicable.
Avec 8,2 millions de paramètres contre 35,4 millions pour un CNN de référence, CapsNet a atteint un taux d’erreur de test de 0,25 % sur MNIST, contre 0,39 % pour le modèle de référence, et de 5,2 % contre 8,1 % sur MultiMNIST, constitué de paires de chiffres dont les boîtes englobantes se chevauchent à 80 % en moyenne. Entraîné uniquement sur des chiffres MNIST décalés de deux pixels au maximum, il a obtenu un score de 79 % sur affNIST, qui contient les mêmes chiffres soumis à des transformations affines aléatoires, tandis qu’un CNN ayant un nombre de paramètres comparable a obtenu 66 %. Sur CIFAR-10, un ensemble de sept CapsNets a atteint un taux d’erreur de 10,6 %, comparable à celui des CNN lors de leurs premières applications à ce jeu de données ; les auteurs ont attribué l’écart aux capsules qui tentaient de tenir compte d’arrière-plans encombrés.
Limites et modèles de capsules ultérieurs#
Le routage effectue plusieurs itérations sur chaque paire de capsules enfant et parent ; les besoins en calcul et en mémoire augmentent donc rapidement avec la taille des images et le nombre de classes. Les réseaux à capsules n’ont jamais égalé les CNN ni les Transformers de vision sur les grands benchmarks de classification d’images, comme ImageNet. Des chercheurs les ont appliqués à l’analyse d’images médicales, par exemple pour classifier des types de tumeurs cérébrales à partir d’IRM, où les jeux de données d’entraînement sont de petite taille.
Les capsules matricielles avec routage EM, présentées par Hinton, Sabour et Frosst à ICLR 2018, ont remplacé les vecteurs de pose par des matrices de pose 4 x 4 et utilisé l’espérance-maximisation pour le routage ; sur le benchmark smallNORB, constitué de jouets photographiés sous de nombreux angles, elles ont réduit de 45 % les erreurs de test par rapport aux précédents résultats de pointe et ont mieux résisté aux attaques adverses en boîte blanche qu’un CNN de référence. Des autoencodeurs à capsules empilées ont suivi en 2019 et ont appris des capsules sans étiquettes ; dans sa proposition GLOM de 2021, Hinton représente les mêmes hiérarchies partie-tout comme des îlots de vecteurs d’intégration concordants, sans aucun routage dynamique.










