"Les réseaux de Hopfield sont tout ce dont vous avez besoin" en J (partie 1)

Nous allons implémenter les fonctions proposées dans le papier "Hopfield network is all you need", papier génial qui offre une excellente introduction aux réseaux de Hopfield contemporain.

Le lien vers l'article en question : Hopfield Networks is All You Need

Fonctions d'utilité générale

Afin de faciliter l'implémentation des équations des réseaux de Hopfield, nous allons écrire quelques verbes qui nous serons utiles tout au long de notre cheminement.

rndw

rnd=: ?@#&0
rndw=: (+/\%+/)@[ I. rnd@]

Ce verbe est expliqué ici :  https://code.jsoftware.com/wiki/Fifty_Shades_of_J/Chapter_28 . Il permet de générer des nombres aléatoire suivant une certaine distribution. Littéralement "weighted random".

Exemple:

   100 0 rndw 10
0 0 0 0 0 0 0 0 0 0
   50 50 rndw 10
0 0 0 1 1 1 1 1 0 1

 dot

dot =: +/ . *

Il s'agit de la multiplication matricielle. Plus d'informations ici : https://aplwiki.com/wiki/Inner_Product et ici https://en.wikipedia.org/wiki/Dot_product (en)  et ici https://fr.wikipedia.org/wiki/Produit_matriciel (fr)

Exemple:

  (i.2 3) dot (i. 3 2)
10 13
28 40

Conversion de données binaires en bipolaires

tobipolar=: [: <: 2 * ]
tobinary =: tobipolar^:_1

Nous utiliserons au début de l’implémentation des réseaux de hopfield des données binaires (on parle de motifs dans le cadre des réseaux de Hopfield), composées de 1 et de 0. L'algorithme canonique de Hopfield utilise des données polaires, ou chaque 0 est remplacé par -1. Il convient donc de définir deux verbes qui permettent de passer de l'un à l'autre. Notez l'utilisation de ^:-1 pour exprimer la "négation" du premier verbe. 

Exemple:

   tobipolar 0 1 0 0 0 1
_1 1 _1 _1 _1 1
   tobinary _1 1 _1 _1 _1 1
0 1 0 0 0 1

Affichage des motifs

format =: '.#'{~ 0&<

Ce verbe est compatible avec des données binaires comme bipolaires. Il permet d'afficher de manière un peu  plus agréable les motifs.

Exemple:

Nletter
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1
0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0
0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0
0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0
0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0
0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 1 0 0
0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0
0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   format Nletter
                   
######       #######
 ######        ####
   #####        ##  
   ######       ##  
   #######      ##  
   #######      ##  
   #######      ##  
   ### ####     ##  
   ###  ####    ##  
   ###    ####  ##  
   ###    ####  ##  
   ###    ##### ##  
   ###     #######  
   ###      ######  
   ###       #####  
   ###        ####  
   ###        ####  
  #####        ###  

A suivre

Nous disposons à présent de tout ce dont nous aurons besoin pour implémenter les équations du papier "Hopfield network is all you need", ce que nous ferons dans un article ultérieur.

Commentaires