Le réseau de Boltzmann a été introduite en 1984 par Ackley, Seijnowski et Hinton. Ce réseau est une extension originale de Hopfield et peut être considéré comme étant une variante probabiliste de celui-ci. C’est un réseau récurrent mais qui a la particularité d’inclure une couche cachée. Malgré la présence de cette couche le réseau est tout de même capable d’apprendre un comportement désiré.
L’idée des créateurs du réseau est d’essayer de résoudre deux problèmes du réseau de Hopfield :
La présentation de ce réseau sera plus succinte que les autres car j'ai eu beaucoup de mal à trouver une bonne description de la machine de Boltzmann. D'autre part, j'ai eu énormément de problèmes avant d'arriver à obtenir des convergences correctes que cela soit en terme d'erreurs et surtout en temps de calcul.
Le réseau est composé de neurones connectés par des connexions complètes et symétriques.
Contrairement au réseau de Hopfield, l'activation est liée à une fonction stochastique:
.
T varie de 1 à 8 par courbe décroissante après la sortie à 0
Cette formule repose sur le rapport de Gibbs-Boltzmann. Pa / Pb = e -(Ea - Eb) / kT, k constante de Boltzmann.
On remarque à partir du dessin que lorsque T -> 0, la fonction approche 1/2 ,le comportement devient le même que pour un réseau de Hopfield. Plus la température tend vers 0, plus on peut considérer que le réseau est déterministe.
On peut de plus montrer une propriété assez intéressante, c'est à dire que la différence d'énergie provoquée dans le réseau correspond à la somme des entrées au neurone.
Par contre, il est assez difficile à ce niveau de montrer que l'énergie globale diminue au cours du temps. Pour cela, il suffit de se reporter aux propriétés relatives au recuit simulé.
Le but du recuit dans cet algorithme est d’éviter les minimum locaux au profits d’un minimum plus global. Pour illustrer ce propos, prenons l’exemple d’une bille qui oscille sur une pente. Dans le premier cas, si on laisse tomber la bille, elle va osciller au fond du « bol » avant de se stabiliser au fond de celui-ci.
Si dans un deuxième cas, notre bille descend une pente avec une remontée, elle peut s’y arrêter et tomber dans un minimum local.
Cependant, en lançant notre bille de plus haut on aurait éviter le minimum local. Mais trop d’énergie n’est pas une bonne solution, car sous cette énergie, elle pourrait quitter le creux (minimum global) pour aller se nicher dans un autre (minimum local).
La bonne stratégie consiste alors à:
Cette technique est similaire à celle utilisée en sidérurgie pour refroidir le métal. En effet lors du refroidissement de l’acier, les atomes s’organisent en structures cristallines. Si la vitesse de refroidissement est rapide, le métal sera fragile. Pour éviter de fragiliser le métal, on effectue un refroidissement par palier qui permet d’éviter les contraintes imposées à un refroidissement rapide. On descend donc la température, puis on attend un certain temps avant de refroidir encore. Le nombre de paliers et leurs paramètres (température, durée) correspond à un programme de recuit.
Essayons donc d’appliquer ce principe à notre réseau. En effet, chaque neurone du réseau se comporte de façon aléatoire. Il existe donc une probabilité non nulle que le système soit dans un état donné ceci quelque soit son énergie. A des températures élevées ; ce qui implique alors par exemple p[s = 1] = 0.9; le système peut donc se trouver dans tous les états avec une probabilité proche. En revanche, plus on descend la température, moins on a de chance d’accepter un état de haute énergie. Cette méthode consiste donc a soumettre le réseau à une forte température puis de la réduire par paliers. A chaque niveau, on laisse évoluer le système un certain temps de telle sorte qu’il visite un maximum d’états possibles à cette température. Plus la température baisse plus in diminuera ce nombre d’états. A une température proche de 0 le système doit se trouver dans un minimum global du système. Cependant, pour arriver à ce résultat il faut avoir utiliser de bons paliers. Hinton et Seijnowski donnent un exemple de paliers de recuit pour un réseau à 43 neurones :
Température | 40 | 35 | 30 | 25 | 20 | 15 | 10 |
Itérations | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
Le principe général consiste à dicter au système la probabilité de ces états. On essaye donc d’imposer une forte probabilité à ces états et une probabilité très faible aux autres. De ce fait, si l’on veut inciter le système à atteindre un état, il tendra à atteindre cet état. On essaye donc de remédier au problème du réseau de Hopfield et ses états poubelle.
L'apprentissage
La méthode d’apprentissage consiste en gros à imposer des contraintes particulières sur les neurones visibles tandis que les neurones cachés restent libres. On alterne donc deux phases :
En fin d’apprentissage, les états désirés auront globalement vu leur probabilité augmenter.
La phase contrainte consiste à fixer l’activation des neurones visibles à chacun des exemples et de mesurer la probabilité de coactivation entre tous les neurones du réseau. Cela se fait en soumettant le réseau à plusieurs recuits simulés tout en gardant les neurones visibles fixés. La fréquence des états observés est ensuite calculée, ce qui peut être considéré comme une estimation de leur probabilité réelle.
Au contraire, au cours de la phase libre, on mesure la probabilité de coactivation des neurones sans contrainte. Ces deux mesures de probabilité de coactivation sont utilisées pour l’ajustement des poids :
Nous allons quelque peu modifier cette règle de modification des poids afin d’améliorer un peu les résultats sur les bases difficiles à apprendre.
La phase de généralisation
La phase de généralisation effectue seulement une phase de recuit libre. En effet, on ne peut pas imposer les sorties, le recuit libre permet de fournir une valeur. Bien sûr, les poids ne sont pas ajustés au cours de cette phase. Si les paliers ont bien été définis alors cette phase ne doit comporter aucune difficulté.
Plusieurs algorithmes ont été présentés dans la littérature. A ce moment, on peut présenter deux algorithmes différents de la machine de Boltzmann. Les deux ont été testés et certains résultats ont pu être extrait de ces réseaux. En faisant un petit melting-pot des deux algorithmes, on arrive à des algorithmes hybrides qui sont loin de donner des mauvais résultats.
Voici en premier lieu un algorithme de calcul d'une sortie:
Dans tous les calculs d'ajustement des poids, on considére qu'il n'y a pas d'auto-activation des neurones entre eux.
Algorithme No 1
Par ailleurs, dans ce réseau, on peut éliminer la récurrence au niveau des entrées, ce qui élimine les liaisons vers les entrées.
La modification des poids s'effectue de la façon suivante:
Poids[i, j] = Poids[i,j] + (Co_occurence_figée - Co_occurence_libre) / Température * Coefficient_d_ajustement.
Algorithme No 2
Les calculs de généralisation ou de calcul d'érreurs sont identiques au premier algorithme.
Résumé des Algorithmes
Voici une liste des réseaux utilisés avec leur particularités:
Bien sur les paliers ne sont plus les mêmes pour chacun des réseaux surtout au niveau de l'influence de la température dans la modification des poids.
Le réseau de Boltzmann donne en général de meilleurs résultats que la rétro-propagation. Malheureusement, il a le gros problème d’être assez instable. Du fait d’un comportement aléatoire, il peut donner des résultats très bons sur un essais et très mauvais sur l’autre. Par exemple en généralisation sur apprentissage, on prend les mêmes exemples que l’on ré-injecte environ une vingtaine de fois dans l’algorithme de restitution afin d’en tirer une moyenne des erreurs. Mais on arrive souvent à des cas sur Lenses tels que :
De ce fait, il faut prendre beaucoup de recul avec les résultats présentés ici. Tout ceci dépend fortement des paliers de recuit choisis. On remarque d’ailleurs que les bases à initialisation des poids à 0 sont beaucoup plus stables dans le sens où la variance d’erreur est moins forte entre les différentes itérations. Les paliers utilisés sont (Boltzmann 1 2 3):
et pour Boltzmann 4-5:
Du fait du temps très important des calculs voici un exemple de résultats sur les 5 types de réseaux avec Lenses, qui on le rappelle est une très mauvaise base.
Les résultats descendent quand même aux alentour de 13% dans une architecture 5-3-3 avec l’algorithme numéro 2.
C’est d’ailleurs l’algorithme 2 qui semble donner les meilleurs résultats.
Les bases semblent donner de très bons résultats vis-à-vis des autres bases. Cependant, une variation plus intelligente des paliers permettrait sans doute de ramener les erreurs pour Vote et Bupa à un niveau plus raisonnable. Les bases Mushroom et Chess sont trop grosses et laissent entrevoir les problèmes de cet algorithme : le temps de calcul est beaucoup trop important. En outre, il ne faut pas oublier que d’un essai à un autre les résultats peuvent varier de façon importante, car l’attribution des poids est aléatoire tout aussi bien que l’activation. Les résultats présentés ici semblent assez statistiques pour Lenses et Iris (testés un grand nombre de fois) et peut être un peu moins pour Bupa et Vote. En effet, sont les premiers résultats que l’on a obtenu avec les mêmes paliers (architecture 1 couche cachée avec 3 neurones) que Lenses. C’est pour cette raison que l’on pense pouvoir faire mieux.
Les paramètres additionnels utilisés ici sont :
Une modification du premier et des deux derniers paramètres ne font que modifier la variance des résultats (pas toujours de façon importante), à l’opposé le coefficient d’apprentissage semble jouer un rôle mineur.
Malgré tout, ce réseau posséde le gros inconvénient d'être très lent.