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) :
(j'ai essayé de faire mon algorithme le plus facilement modulable à de nouvelles entrées).
Code js : Sélectionner tout - Visualiser dans une fenêtre à part
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");
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 : )
Ici, j'obtiens la convergence des poids à [-3, -3, 5, 3], l'algorithme fonctionne donc.
Code js : Sélectionner tout - Visualiser dans une fenêtre à part
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},
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
Partager