Réseau de neurones : boucle infinie lors de l'apprentissage d'un perceptron
Je me renseigne actuellement sur les réseaux de neurones. Après diverses recherches et plusieurs cours (y compris celui sur ce site), j'avoue avoir plusieurs lacunes : je comprend la théorie sur les perceptrons (donc un seul neurone) mais plus de mal à partir de plusieurs neurones, mais là n'est pas la question. Actuellement, je m'appuie sur un cours PDF disponible ici : http://www.touzet.org/Claude/Web-Fac...rtificiels.pdf (pour le moment je le trouve bien expliqué). Je suis en train de réaliser le TP 3 "Perceptron" (page 38). J'ai donc réalisé l'algorithme suivant (en HTML/Javascript) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| "use strict";
var base = [[[-1, -1], -1], [[-1, 1], -1], [[1, -1], -1], [[1, 1], 1]],
p = {poids: [0, 0], seuil: 0, pas: 1},
fin = 0,
i = 0;
function signe(nbr) {
if (nbr > 0) {return 1;} else {return -1;}
}
while (fin < base.length) {
var a = p.seuil, d = base[i][1], e = base[i][0];
for (var j = 0, c = p.poids.length; j < c; j++) {
a += e[j] * p.poids[j];
}
var x = signe(a);
if (x == d) {
fin += 1;
} else {
fin = 0;
for (var j = 0, c = p.poids.length; j < c; j++) {
p.poids[j] = p.poids[j] + p.pas * (d - x) * e[j];
}
}
i = (i + 1) % base.length;
console.log(JSON.stringify(p.poids));
console.log(i + " TEST");
}
console.log("DONE"); |
(j'ai essayé de faire mon algorithme le plus facilement modulable à de nouvelles entrées).
Les données entrées pour l'apprentissage sont dans la variable "base". Chaque entrée est décrite comme suit : [[Valeur 1, Valeur 2], Résultat Attendu].
Ici les données entrées sont celles de la table ET et elles convergent vers les poids [2,2], ce qui fonctionne, pas mal.
(vous pouvez tester l'algorithme avec les valeurs de l'exemple précédent en modifiant les lignes 2 et 3 de l'algorithme ci-haut par celles suivantes : )
Code:
1 2
| var base = [[[1, -1, 1, -1], 1], [[1, 1, 1, 1], 1], [[1, 1, 1, -1], -1], [[1, -1, -1, 1], -1]],
p = {poids: [0, 0, 0, 0], seuil: 0, pas: 1}, |
Ici, j'obtiens la convergence des poids à [-3, -3, 5, 3], l'algorithme fonctionne donc.
Le problème, c'est que pour certains poids initiaux, l'algorithme ne converge pas (par exemple pour la porte ET (premier extrait de code), si en poids on met [2,1] cela ne fonctionne pas ; la porte OU ne converge pas si les poids initiaux sont [0,0] ...).
N'ayant pas entendu ce genre de problèmes dans le cours, je pense donc qu'il s'agit d'une erreur de mon algorithme ... Mais où ? Si vous avez des pistes de réflexion je veux bien :) Merci ! Je précise cependant que je viens de finir un bac S spécialité ISN (Informatique & Sciences du Numérique) donc si vous pourriez rester simple (ou plutôt accessible) dans vos explications ça serait super sympa :)