EDIT : voir édition en bas...

Bonjour,

J'ai commencé à m'intéresser aux intelligences artificielles depuis peu, tout particulièrement celles qui peuvent s'appuyer sur un réseau de neurones.

J'ai donc créé, en C++, ma propre classe pour représenter un réseau de neurones multi-couches, et surtout, pour calculer un gradient d'erreur sur un exemple d'entrée et de cible.
J'applique ensuite l'une des méthodes d'apprentissage utilisée dans le cadre de l'apprentissage par renforcement, en l'occurrence, l'algorithme d'apprentissage est le suivant :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Initialiser un vecteur e de la taille du nombre de paramètres du réseau.
Pour chaque couple (entrée-cible) :
    Calculer le gradient d'erreur.
    e <-- alpha * e + gradient
    paramètres <-- paramètres + lambda * e
et je recommence un certain nombre de fois la boucle.
(Comme vous le voyez, je ne me déplace pas immédiatement selon la direction du gradient, j'introduis une certaine inertie avec le vecteur e, ce qui me permet d'éviter certains problèmes de minima locaux)

J'ai testé ceci avec un simple réseau à 2 entrées et une sorties et les opérateurs logiques de base.
AND et OR passent sans souci, mais évidemment, ça bloque au niveau du XOR et je ne comprends pas pourquoi...

Dans le cas du XOR, quelque soient les paramètres alpha, lambda, le nombre d'itérations, ou encore le nombre de neurones cachés voire de couches de neurones cachées, j'obtiens à chaque fois des valeurs extrêmement proches pour les 4 entrés possibles...

D'où peut venir ce problème ?

Si vous souhaitez du code, notamment le calcul du gradient, je peux vous en fournir autant que vous voulez (mais bon courage, j'ai été assez verbeux niveau noms de fonctions/variables et avare en commentaire ).
Les fonctions d'activations sont des sigmoïdes, pour information.


Merci d'avance à quiconque aura la patience de m'apporter une quelconque aide !

EDIT : J'ai l'air bête... Il s'agissait (évidemment) d'une erreur de frappe de ma part dans l'algorithme de rétropropagation... J'arrive maintenant à obtenir des résultats corrects, même s'il me faut pour cela beaucoup d'itérations et un facteur d'apprentissage très faible.