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 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");
(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 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},
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