# Réseau neuronal à capsules

Un réseau neuronal à capsules, abrégé CapsNet, est un type de réseau de neurones artificiels du domaine de l'apprentissage automatique dont l'architecture est basée sur celle d'un réseau neuronal convolutif (CNN) mais qui permet une meilleure modélisation relationnelle des motifs extraits par les opérations de convolution. Cette nouvelle approche est une tentative de mimétiser encore plus le fonctionnement des neurones biologiques mais aussi de répondre aux déficiences naturelles du CNN, à savoir que les motifs reconnus par les opérations de convolution sont indépendants les uns des autres et qu'il est ainsi facile de tromper un CNN.
Comme pour le CNN, l'objectif principal de cette architecture est l'étude, la compréhension et la classification d'images. Les différentes opérations du réseau vont extraire des caractéristiques spatiales de l'image étudiée, comme des formes ou des motifs mais aussi les mettre en relation les uns par rapport aux autres afin de proposer ce qui est illustré dans l'image.
Le principal ajout de CapsNet par rapport au CNN vient de l'ajout de structures nommées « capsules » consistant au rassemblement de plusieurs opérations de convolution en un vecteur afin d'apprendre et de décrire des motifs plus complexes qu'une simple opération de convolution ne pourrait le faire. L'enchaînement de couches de capsules permet quant à lui de décrire les relations spatiales des motifs reconnus par la couche de capsules précédente en liant les capsules similaires grâce au nouvel algorithme dit de routing.

## Historique

La première conceptualisation de capsules au sein d'un réseau neuronal date de 2011 par les travaux de Geoffrey E. Hinton et son équipe dans le cadre d'auto-encodeur. Ces travaux sont déjà motivés à résoudre les problèmes d'invariance du CNN, notamment à la translation via son opération de pooling, ce qui entraîne de la perte d'informations, que ce soit en réduisant la quantité de détails à gérer pour les couches suivantes mais aussi en faisant disparaître des connaissances sur la position des motifs reconnus. Pour résoudre cela, les capsules vont chercher à encapsuler les résultats d'opérations internes plus complexes qu'une simple convolution et générer des vecteurs aux caractères plus informatifs.
En 2017, Sara Sabour et al. proposent une version moderne de l'architecture du réseau neuronal à capsules en proposant d'utiliser des opérations de convolution aussi à l'intérieur des capsules ainsi qu'un algorithme de routing pour mieux lier les capsules entre elles au moment de la rétropropagation durant l'entraînement du réseau. De plus, là où les travaux de capsules dans des auto-encodeurs avaient pour but la reconstruction d'image, dans ces derniers travaux, le réseau développé peut être découpé en deux parties, une première de classification et une seconde de reconstruction qui sert aussi à régulariser l'entraînement.

## Capsule

Une capsule est un ensemble de neurones de même type liés sous forme de vecteur. Le type de ces neurones peut aussi bien être un simple scalaire que le résultat d'un opération de convolution$^,$. Là où l'activation, ou probabilité d'observation, d'un neurone artificiel traditionnel s'exprime par la valeur du scalaire à sa sortie, l'activation d'une capsule est représentée par la norme de son vecteur. L'activation des différents neurones composant le vecteur d'une capsule vont quant à eux représenter divers attributs du motif reconnu, comme sa position, sa taille ou encore son orientation.
Deux types de couche de capsules peuvent être dénombrés. Le premier type, nommé PrimaryCaps propose des capsules procédant à des opérations de convolutions et qui ont ainsi pour but d'extraire des motifs complexes et leurs attributs à reconnaître dans l'image passée en entrée du réseau. Le second type, nommé DigitCaps, termine le réseau et effectue des opérations semblables à une couche entièrement connectée et produit en sortie un nombre de vecteur égal au nombre de classe que le réseau doit reconnaître étant donné que le vecteur ayant la plus grande norme représente la classification de l'image d'entrée.
Les capsules d'une couche supérieure prennent les sorties des capsules de la couche inférieure et vont se lier aux capsules formant des clusters, c'est-à-dire les capsules ayant des activations similaires pour une même image d'entrée. Les capsules d'une couche supérieure vont ainsi assembler et mettre en relation les différentes caractéristiques spatiales extraites par les capsules des couches inférieures.
C'est grâce aux différentes particularités des capsules que certains problèmes des CNNs sont résolus. Pour un CNN, la reconnaissance d'un visage dans une image, par exemple, se fait uniquement par l'activation de différents résultats de convolution qui reconnaitront pour l'un un œil, l'autre un nez et un dernier une bouche, peu importe leur position dans l'image à cause de l'invariance à la translation produite par le pooling, mais aussi de la position des yeux par rapport au nez, par rapport à la bouche. Un CNN reconnaitra donc un visage dans une image s'il identifie un œil en bas à droite de l'image, un nez en son centre et une bouche en haut à gauche par exemple. À l'inverse, grâce aux propriétés des capsules, un CapsNet, en plus de lui aussi identifier la présence des différentes parties du visage, estimera, grâce aux valeurs des vecteurs des capsules, la taille, la position et l'orientation de ces différentes parties, mais aussi leur position les uns par rapport aux autres grâce à l'enchaînement de couches de capsules et n'identifiera ainsi un visage que si les yeux sont reconnus au dessus du nez, lui-même au dessus de la bouche.

## Algorithme de routing par accord

L'algorithme de routing par accord constitue l'algorithme de rétropropagation entre les couches de capsules. Il s'agit d'un algorithme itératif qui a pour but de lier les capsules de couches inférieures avec celles de couches supérieures si l'activation des vecteurs de ces dernières est plus importante lorsqu'elles reçoivent les sorties des premières. L'algorithme a donc des conséquences similaires à un mécanisme d'attention que l'on peut retrouver dans d'autres architectures d'apprentissage profond en permettant aux capsules de couches supérieures ou bien de s'intéresser à certaines capsules de la couche inférieure ou bien de les ignorer.
Le vecteur ${\hat {u}}_{j|i}$ d'une capsule $j$ à partir du vecteur de sortie d'une capsule $i$ de la couche précédente $u_{i}$ est calculée à l'aide d'une matrice de translation et de rotation $W_{ij}$ :
${\widehat {u}}_{j|i}=W_{ij}*u_{i}$.
Le vecteur de sortie $s_{j}$ d'une capsule $j$ est donc la somme des vecteurs ${\hat {u}}_{j|i}$ avec les $i$ capsules de la couche précédente associés à un coefficient $c_{i}j$ :
$s_{j}=\sum _{i}c_{ij}*{\hat {u}}_{j|i}$.
Là où la matrice de poids $W_{i}j$ est entraîné normalement à partir de l'algorithme de rétropropagation du gradient, la matrice de poids $c_{i}j$ est quant à elle entraînée à partir de l'algorithme de routing par accord :
avec $b_{i}j$ représentant la probabilité qu'une capsule $i$ de couche $l$ soit connectées avec une capsule $j$ de couche $l+1$. La valeur de ce paramètre est mise à jour selon un nombre d'itération $r$ fixé au début de l'entraînement dont la valeur est souvent de 3$^,$. La fonction softmax sur le paramètre $b_{i}j$ est calculée :
$softmax(b_{ij})={\frac {\exp(b_{ij})}{\sum _{k}\exp(b_{ik})}}$.
Une nouvelle fonction d'activation spécifique aux capsules a aussi été développé afin que la norme du vecteur les composant soit comprise entre 0 et 1 :
$squash(s_{j})={\frac {\left\vert \left\vert s_{j}\right\vert \right\vert ^{2}}{1+\left\vert \left\vert s_{j}\right\vert \right\vert ^{2}}}*{\frac {s_{j}}{\left\vert \left\vert s_{j}\right\vert \right\vert }}$.

## Architecture

L'architecture moderne d'un réseau neuronal à capsules garde son comportement d'auto-encodeur de ses premiers travaux. Elle est bien composée de deux parties, une première faisant office d'encodeur et de classifieur et une seconde de décodeur et de reconstruction.
La partie encodeur est généralement composée d'une première étape constituée de plusieurs couches de convolution afin d'extraire les premiers motifs et caractéristiques spatiales de l'image d'entrée et qui serviront à la deuxième étape composée d'une ou plusieurs couches de PrimaryCaps afin d'apprendre des motifs plus complexes et les mettre en relation grâce à l'algorithme de routing. La dernière étape, constituée d'une couche de DigitCaps, sert à la classification du réseau mais constitue aussi le point d'entrée de la partie décodeur.
La partie décodeur récupère la valeur d'une des capsules de la couche DigitCaps de l'encodeur, durant l'entraînement, il s'agit de la capsule associée à la bonne classe de l'image d'entrée, en dehors de l'entraînement, on choisit la capsule qui a été choisie pour la classification, à savoir celle avec la plus grande norme. Il s'agit ensuite d'appliquer dessus un enchaînement, soit de couches entièrement connectées, soit de couches de déconvolution afin de calculer une sortie à la dimensionnalité égale à celle de l'image d'entrée. Le but de cette partie de décodeur est de faire en sorte que la sortie soit l'image d'entrée reconstruite à partir de la capsule choisie$^,$.

## Entraînement

La partie encodeur du réseau de neurone à capsules suit un entraînement supervisé étant donné que l'on doit connaître la classe associée à l'image d'entrée. La partie décodeur quant à elle, à l'instar d'un auto-encodeur, est entraîné de manière non supervisée puisqu'on demande uniquement au réseau de reconstruire l'image d'entrée, sans label associé.
La fonction de perte de la partie encodeur, marge loss, peut elle aussi être décomposée en deux parties, une première qui est calculée lorsque la bonne capsule obtient la norme la plus grande mais où sa probabilité de classification est tout de même inférieure à une valeur arbitraire fixée $m^{+}$. L'autre partie est calculée dans le cas où la mauvaise capsule a été choisie avec une probabilité supérieure à une valeur $m^{-}$ :
$L_{k}=\underbrace {T_{k}*max(0,m^{+}-\left\vert \left\vert v_{k}\right\vert \right\vert )^{2}} _{Bonne\ Classification}+\alpha *\underbrace {(1-T_{k})*max(0,\left\vert \left\vert v_{k}\right\vert \right\vert -m^{-})^{2}} _{Mauvaise\ Classification}\ \ \ \ \ T_{k}={\begin{cases}1,&{\text{capsule de classe }}k{\text{ est présente}}\\0,&{\text{sinon}}\end{cases}}$
avec α le traditionnel pas d'apprentissage.
La fonction de perte de la partie décodeur est quant à elle un simple calcul de l'erreur quadratique entre l'image d'entrée et l'image reconstruite en sortie et fait aussi office de régularisation afin de mieux aider le réseau à classifier la bonne capsule.
Ces deux fonctions de perte sont pondérées de sorte que le poids de la partie décodeur ne représente que 0,000 5 % de l'erreur globale du réseau au moment de la rétropropagation.