Une réseau de Hopfield est un réseau récurrent de neurones artificiels. Chaque neurones est décrit par une seule variable $x$, régie par l'équation
$$\frac{dx(t)}{dt} = -\frac{x(t)}{\tau} + I(t),$$La stimulation $I(t)$ provient des neurones voisins. Une matrice $W$ définit la force de couplage entre deux neurones. Pour $N$ neurones, la matrice $W$ sera de taille $N \times N$. On suppose que la stimulation des neurones est saturée. Le réseau est décrit par le système de $N$ équations différentielles
$$\frac{d\mathbf{x}(t)}{dt} = -\frac{\mathbf{x}(t)}{\tau} + W \arctan(a \mathbf{x}),$$avec $\mathbf{x} \in \mathbb{R}^N$, et où le terme $W \arctan(a \mathbf{x})$ s'entend comme le produit de la matrice $W$ et du vecteur $\arctan(a \mathbf{x})$.
Note: une formulation en temps discret et états discrets est aussi possible.
On stocke de l'information (mémoire) en stabilisant les états à mémoriser. Selon les conditions initiales, le système convergera vers l'un ou l'autre des états stables. L'apprentissage hebbien est une façon d'entraîner un réseau de neurones à mémoriser des états donnés.
function sol = hopfield(W,ics) % HOPFIELD Recurrent artificial network % sol = hopfield(W,ic) solution du reseaux de Hopfield avec la matrice de % connexion W et les conditions initiales ICS. La matrice de connexion W % est carree de taille (NxM)^2. Les conditions initiales ICS doivent etre % de taille NxM.
function W = hebbianLearning(p) % HEBBIANLEARNING Regle d'apprentissage de Hebb % W = hebbianLearning(p) renvoie une matrice de connexion W basee sur la % regle d'apprentissage de Hebb pour un jeu de pattern d'apprentissage P % pour un reseau de Hopfield. P est un tableau NxM, ou N est le nombre de % neurones du reseau et M le nombre de patterns a memoriser. La matrice W % est de taille NxN. % % La regle de Hebb est inspiree du concept "Neurons that fire together, % wire together". Les connexions W(i,j) sont renforcees si les patterns % aux position i et j sont semblables.
function p = jpg2vect(filename) % JPG2VECT transforme une image JPG RGB en vecteur normalise pour le reseau % de Hopfield. FILENAME est le nom d'un fichier JPG et P est un vecteur % colonne de taille (NxM), si l'image est de taille NxM.
A l'aide des codes jpg2vect, hebbianLearning et hopfield, entraînez un réseau de Hopfield à mémoriser les trois images pontcanal_small, campagne_small et ville_small.
Utilisez jpg2vect pour générer trois vecteurs colonnes stockés dans une matrice p = [p1, p2, p3];
. Générez la matrice W = hebbianLearning(p);
et lancez une simulation sol = hopfield(W,ics);
, où ics
est une matrice n x m représentant une image (prenez par exemple ics = reshape(p1-0.4+0.8*rand(1600,1),40,40);
). Ici, n x m = 40 x 40. Le réseau de Hopfield devrait converger vers l'image la plus "proche".
Ajoutez une image de votre choix aux images déjà apprises. L'image doit être du même format que les trois images de départ, c.-à-d. une image JPG de taille 40 x 40 pixels. La fonction jpg2vect convertit une image couleur en niveaux de gris en extrayant le canal R (rouge) de l'image.
Implémentez une fonction energie qui calcule la fonction énergie le long des trajectoires du réseau.
function E = energie(x,W,tau,a) % ENERGIE fonction energie du reseau de Hopfield % E = energie(x,W,tau,a) prend en parametre une trajectoire X du reseau de Hopfield, % la matrice W de connectivite et les parametre du systeme TAU et A. X est une matrice % NxT et W une matrice NxN, avec N le nombre de neurones dans le reseau et T le nombre % de points temporels ou la trajectoire a ete calculee.
La fonction énergie est $$E = - \frac{1}{2} \mathbf{v}^* W \mathbf{v} + \sum_{j=1}^N \frac{1}{\tau} \int_0^{v_j} \frac{\tan(v)}{a} dv$$ où $\mathbf{v} = \arctan(a \mathbf{x})$. Vous pouvez calculer l'intégrale numériquement à l'aide de la fonction integral, ou bien utiliser la primitive suivante
$$\int \tan(x)dx = - \ln[|\cos(x)|].$$Calculez diverses trajectoires du réseau de Hopfield et affichez l'évolution énergie. Confirmez que E est décroissante.