Bonjour,

Je me suis amusé à créer un réseau de neurones dans l'espoir de le faire jouer au TicTacToe (morpion). Avec un mécanisme d'aprentissage basé sur une propagation de correction d'erreur.

J'ai suivi les instructions présentes sur le site suivant pour le concevoir: http://colinfahey.com/neural_network..._learning.html.

J'ai commencé par testé avec une porte Xor avec 1 couche de 4 neurones et ça a l'air de fonctionner.

J'ai tendance à travailler par étape et avant de faire jouer Brain (le nom que j'ai donné à mon réseau de neurone), j'ai souhaité d'abord qu'il apprenne à positionner son coup dans une case vide. Et oui, il ne sais pas qu'il n'a pas le droit de jouer dans une case vide. Et là ça ne fonctionne pas.

Solution qui ne me plaît pas:

Finalement, j'ai trouvé une solution de rechange, mais elle ne me plaît pas. En gros, je voulais que quand Brain fait une erreur on lui dise qu'il à fait quelque chose d'interdit. Mais j'ai l'impression que la méthode d'apprentissage dois être bien plus assistée: on doit exprimer à Brain, pour le cas de jeu présent, l'ensemble des positions possibles et des positions impossibles.

par exemple, si en entrée on a cela:

In = { X O X; . . O; . . . }

et en sortie,

Out = { 9 2 1; 3 2 1; 5 6 7}

Brain va choisir la valeur maximale pour définir la case sélectionné, donc la première case qui est déjà occupée. On va faire une étape d'apprentissage pour l'ensemble des cases. Ainsi on choisit l'erreur comme la valeur de sortie moins la valeur désirée (0 quand c'est interdit et 9 quand c'est possible). Puis en envoyant l'erreur:

Error = {9 2 1; -6 -7 1; -4 -3 -2}

Par apprentissage, la sortie devient automatiquement:

Out_new = {0 0 0; 9 9 0; 9 9 9}

Tests qui ne fonctionnent pas

1) Dans mon idée, je voulais annoncé à Brain qu'il avait fait une erreur, alors j'ai considéré que l'erreur envoyée est constante:

Error = {1 0 0; 0 0 0; 0 0 0}

Ainsi, pour ce cas, seule une cellule devrait être impactée. Le résultat est que comme le système ne se stabilise pas par l'apprentissage, les nombres ont tendance à tendre vers - infini, mais aussi les écarts entre les différentes cases est faible.

Out_new = {-102.1 -102.2 -102.3; -102.0 -102.3 -102.4; -102.2; -102.3; -102.2}

Ainsi, si il y a la moindre étape d'apprentissage après, les valeurs seront facilement modifiée et l'ordre ne sera plus respecté. J'ai fait joué Brain contre un placement aléatoire (le but du jeu pour Brain consiste à sélectionner une case vide) en réinitialisant le mécanisme aléatoire pour que les parties soient identiques. Brain, se retrouve bloqué entre deux méthodes de placements alternativement.

2) pour éviter le problème de la divergence vers l'infini, j'ai aussi testé le cas où on choisit l'erreur en fonction de la valeur désiré et de la valeur courante. Cela dit, je me suis aperçu rapidement des limites: que ce passe t'il si toutes les valeurs sont inférieure à cette valeur désirée?

Out = {-9 -2 -7; -5 -4 -6; -5 -4 -5}

La sélection de Brain sera la 2eme case (la plus grande valeur: -2), avec l'apprentissage, la correction fera que (-2) deviendra la valeur désirée (0 qui désigne une case pleine).

Out_new = {-9 0 -7; -5 -4 -6; -5 -4 -5}

Finalement, la sélection de Brain restera la même case (la valeur la plus grande).

En bref, je ne sais pas comment m'en sortir: la méthode de correction d'erreur est elle compatible avec ce que je tente de faire? y a t-il un raisonnement que j'ai raté? y a t-il d'autres méthodes que la correction d'erreur qui puisse satisfaire mon cas?

Je vous remercie d'avance pour votre aide.