Simulation de réseau de Hopfield

1. Introduction

L'apprentissage automatique peut être défini comme l'ensemble des méthodes qui permettent à un automate de faire quelque chose pour lequel il n'a pas été programmé explicitement. Cela veut dire, par exemple, parvenir à identifier des tumeurs sur une radiographie sans qu'une méthode explicite de calcul ne soit utilisée.

Dans un tel cas, il faut tout de même entraîner l'automate, mais sans lui indiquer quelles règles utiliser. Par contre, il y a des règles implicites : le choix des cas pour l'entraînement, la réponse qu'on fournit, le coût de l'erreur, etc.

On appelle apprentissage supervisé une situation où le jeu d'entraînement vient avec la classification attendue (tumeur ou pas de tumeur, par exemple). Il existe aussi un apprentissage non supervisé, où c’est à l'automate de détecter lui-même les corrélations ou regroupements. Ici, nous nous concentrerons sur la première approche.

Modèle de Hopfield

John Joseph Hopfield (1933 -- ) est un physicien de la matière condensée qui s'est intéressé, dans les années 1970, à des problèmes biologiques et a publié, en 1982, un modèle de réseaux de neurones simplifié, basé sur le modèle de Hebb.

Rapidement, le modèle de Hopfield a été déployé pour l'étude des systèmes complexes, entre autres, et à des questions liées à l'entreposage d'information. Le modèle de Hopfield ramène les neurones à deux états : actif (si le neurone reçoit un influx électrique supérieur à un seuil donné) et inactif. La réponse des neurones est donc une fonction non-linéaire de la somme des entrées, c'est-à-dire du poids de la force des synapses qui relient ces neurones.

Le réseau de Hopfield est un réseau non-dirigé d'éléments dans deux états : \( +1 \) (actif) ou \( -1 \) (inactif). Ceci permet de réécrire le problème comme celui d'un ensemble de spins d'Ising dont l'interaction est donnée par \( w_{ij} \). L'objectif de ce modèle n'est pas d'identifier des corrélations, mais simplement d'étudier comment on peut emmagasiner et retrouver l'information.

Pour reproduire le modèle de Hebb, Hopfield ajoute un seuil à l'interaction d'Ising : un spin \( S_i \) passe à \( +1 \) seulement si la somme des interactions sur ce spin est supérieure à un seuil d'activation \( A_i \). La règle d'évolution, si l'on pose le seuil \( A_i = 0 \) pour tous les \( i \), est donc simplement :

\[ S_i(t+1) = \begin{cases} +1 & \text{si } \sum_{j \neq i} w_{ij} S_j(t) > 0 \\ -1 & \text{si } \sum_{j \neq i} w_{ij} S_j(t) \leq 0 \end{cases} \]

Une différence plus importante avec le modèle d'Ising est le fait que la constante d'interaction, le poids \( w_{ij} \), n'est pas fixe, mais évolue. En effet, ce modèle tente de reproduire la façon dont l'information est stockée dans le cerveau : l'évolution des poids synaptiques va permettre de renforcer l'apprentissage d'une information, définie par l'orientation des spins : \( \{S\} \).

Pour ce faire, on doit entraîner les synapses : \[ \Delta w_{ij} = \eta S_i S_j \] où \( \eta > 0 \) représente le taux d'apprentissage.

Ce processus d'apprentissage est répété pour une série de \( P \) patrons binaires (\( +1, -1 \)) de longueur \( N \), qui représentent le nombre de neurones : \( \xi^1, \dots, \xi^P \). Par exemple, le patron \( \xi^1 = 1011\cdots 1 \) indique l'état des neurones pour le patron numéro 1.

À la fin de la période d'apprentissage, la mémoire du réseau correspondra à : \[ w_{ij} = \frac{1}{N} \sum_{\alpha=1}^{P} \xi_i^{\alpha} \xi_j^{\alpha} \] où le facteur \( \frac{1}{N} \) correspond au taux d'apprentissage \( \eta = \frac{1}{N} \).

Une fois les patrons appris, on doit pouvoir les retrouver en entrant une configuration de spins proche d'une des solutions, mais qui contient des erreurs.

Exemple : un patron unique

Considérons l'apprentissage d'un seul patron :

Si, lorsqu'on évalue la valeur des spins à \( t'' = t+2 \), le système ne change pas par rapport à \( t' = t+1 \), c'est-à-dire \( \{S\}_{t+2} = \{S\}_{t+1} \), alors le système est stable.

On peut aussi avoir une solution cyclique donnée par : \[ \{S\}_1, \{S\}_1, \{S\}_3, \{S\}_3, \cdots, \{S\}_1 \]

L'information est emmagasinée dans ce réseau d'interactions, \( w_{ij} \) : \[ w_{ij} = \frac{1}{N} \xi_i \xi_j \]

Dans ce cas, la dynamique du système aura la forme : \[ S_i' = \mathrm{sgn} \left( \xi_i \cdot \frac{1}{N} \sum_j \xi_j S_j \right) \]

où l'on peut définir le terme de recouvrement comme : \[ m = \frac{1}{N} \sum_j \xi_j S_j \] et donc : \[ S_i' = \mathrm{sgn}(\xi_i m) \]

Lorsque \( \xi = \{S\} \), on a \( m = 1 \) et on retrouve un état stable, ou, dans un contexte dynamique, un état stationnaire. Même chose si \( m = -1 \) et \( \{S\} = -\xi \).

Si \( m > 0 \), les itérations ne peuvent que faire augmenter \( m \). Idem lorsque \( m < 0 \) : les itérations ne font que faire décroître \( m \).

On peut, dans ces conditions, conclure que ces états stationnaires sont des attracteurs de la dynamique.

Préparation des images

Voir le code
Voici ce que j'ai choisi pour ma part :

Mise en place du réseau (un seul pattern)

Voir le code

Préparation des graphiques

Voir le code

Simulation dynamique du réseau

Voir le code
Simulation du réseau de Hopfield pour un seul pattern

Cas général

Que se passe-t-il lorsque l'on veut mémoriser plusieurs patrons ? Dans ce cas, la matrice de poids n'est qu'une superposition des patrons uniques :

\[ \begin{split} \sum_{j \neq i} w_{ij} \xi_j^{\beta} &= \frac{1}{N} \sum_{j \neq i} \sum_{\alpha = 1}^{P} \xi_i^{\alpha} \xi_j^{\alpha} \xi_j^{\beta} \\ &= \xi_i^{\beta} + \frac{1}{N} \sum_{j \neq i} \sum_{\alpha \neq \beta}^{P} \xi_i^{\alpha} \xi_j^{\alpha} \xi_j^{\beta} \\ &= \xi_i^{\beta} \left( 1 + \frac{1}{N} \sum_{j \neq i} \sum_{\alpha \neq \beta}^{P} \xi_i^{\alpha} \xi_i^{\beta} \xi_j^{\alpha} \xi_j^{\beta} \right) \end{split} \]

Le dernier terme est appelé le terme d'interférence. Lorsque celui-ci est plus grand que \( -1 \) pour tous les \( i \), alors le \( \beta \)-ième patron est dans un état stationnaire :

\[ \xi_i^{\beta} = \mathrm{sign} \left( \sum_j w_{ij} \xi_j^{\beta} \right) \]

S'il y a trop de patrons à stocker, la mémoire déborde, les patrons font de l'interférence et le système commence à oublier.

Généralisation de l'exemple simple

Voir le code

Fonctions de mesure : recouvrement, distance de Hamming, énergie

Pour éttofer l'analyse, plusieurs fonctions sont définies pour mesurer la proximité entre l’état courant du réseau et les motifs mémorisés. Le recouvrement quantifie la corrélation entre deux états, la distance de Hamming normalisée indique la proportion de bits différents, et l’énergie donne une mesure globale de stabilité du modèle énergétique du réseau. Ces fonctions permettent d’évaluer l’évolution de la dynamique vers un attracteur mémorisé (ici une image).
Voir le code

Initialisation d’un état perturbé

Pour tester la capacité de récupération du réseau, on sélectionne l’un des motifs et on introduit un bruit aléatoire en inversant un certain pourcentage de ses pixels. Cet état bruité servira de point de départ pour la dynamique du réseau. On calcule ensuite les énergies associées aux motifs mémorisés, lesquelles serviront de référence pour l’analyse comparative.
Voir le code

Visualisation des états et des métriques

La figure matplotlib est structurée en quatre sous-parties. L’état courant du réseau est affiché sous forme d’image. Les trois autres graphiques montrent respectivement l’évolution du recouvrement avec chaque motif, la distance de Hamming et les valeurs d’énergie. Cette visualisation simultanée permet de suivre en temps réel la convergence de l’état vers un attracteur.
Voir le code

Simulation dynamique du réseau

La mise à jour asynchrone du réseau est implémentée dans une boucle d’animation. À chaque image de l’animation, plusieurs neurones sont mis à jour selon la règle de Hopfield : chaque neurone est influencé par le champ local généré par ses connexions pondérées. L’état de chaque pixel est mis à jour en conséquence. À chaque étape, l’affichage est actualisé pour refléter les nouvelles valeurs de l’image, du recouvrement, des distances de Hamming et des énergies.
Voir le code
Simulation du réseau de Hopfield pour plusieurs patterns

Les limites du modèle de Hopfield

Le réseau de Hopfield a ses avantages, mais il est aussi connu pour ses limites. Dans mon cas, il semble qu’on ne puisse stocker que trois images différentes, ce qui est assez faible — mais ce n’est pas surprenant. Ces réseaux ont plusieurs contraintes bien connues :

  1. Capacité de mémoire : D’après Hopfield, un réseau ne peut stocker que jusqu’à 0,15 N motifs (avec N le nombre de neurones). Des recherches plus récentes affinent ce chiffre à m < (0,5 N) / log N. Si on dépasse cette limite, le réseau « oublie » de manière brutale.
  2. Motifs trop proches : Deux images apprises ne doivent pas se ressembler trop. Si elles diffèrent de moins de 25 %, le réseau peut les confondre.
  3. Meilleur apprentissage avec des motifs différents : Plus les images sont différentes (ou « orthogonales »), mieux le réseau les retient.
  4. Apparition de faux souvenirs : Parfois, le réseau stabilise sur des états qui ne correspondent à rien de ce qui a été appris.
  5. Symétrie des poids wij : Les connexions entre neurones doivent être symétriques pour que le réseau fonctionne correctement. Ce n’est pas très réaliste biologiquement parlant.