Apprentissage d'un perceptron multicouches
Bonjour,
J'ai des difficultés à implémenter le perceptron multicouches.
J'essaye d'apprendre la fonction xor.
J'ai donc 2 neurones d'entrée, 2 neurones cachés et 1 neurone de sortie.
j'ai pris ε = 1, la fonction sigmoide comme fonction de transfert et j'itère 100 fois.
ma base est la suivante:
0 0 -> 0
1 0 -> 1
0 1 -> 1
1 1 -> 0
j'ai implémenté l'algorithme en c++ à partir du pseudo code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
Algorithme de rétropropagation du gradient :
Initialiser aléatoirement les coefficients wij dans [-0.5 ; 0.5]
Répéter
Prendre un exemple (x, c) de S
Calculer la sortie o
Pour toute cellule de sortie i
δi = σ(yi) ∗ (ci − oi) = oi ∗ (1 − oi) ∗ (ci − oi)
Fin Pour
Pour chaque couche de q − 1 à 1
Pour chaque cellule i de la couche courante
δi = σ(yi) ∗ [Σ(k ∈ Succ(i)) (δk ∗ wki)]
= oi ∗ (1 − oi) ∗ [Σ(k ∈ Succ(i)) (δk ∗ wki)]
Fin Pour
Fin Pour
Pour tout poids wij
wij = wij + ε ∗ δi ∗ xij
Fin Pour
Fin Répéter |
avec la légende suivante:
Citation:
Notations :
• n cellules
• Cellules désignées par un indice i, 0 ≤ i < n
• p cellules de sortie
• k indice d ’une cellule de sortie
• ck : sortie attendue pour la cellule de sortie k avec l ’entrée x
• ok : sortie calculée pour la cellule de sortie k avec l ’entrée x
• xij : entrée associée au lien entre cellule I vers cellule j
• wij : coefficient synaptique associé au lien entre cellule i vers cellule j
• Succ(i) : ensemble des cellules qui prennent comme entrée la sortie de la
cellule i.
• Pred(i) : ensemble des cellules dont la sortie est une entrée de la cellule i.
• yi : entrée totale de la cellule i : yi = Σ(j ∈ Pred(i)) (wij ∗ xij)
• oi : sortie de la cellule I : oi = σ(yi)
Lorsque je passe des entrées à mon réseau (après apprentissage), j'obtiens des valeurs de sorties qui convergent vers 0.5, au lieu de 1 ou 0.
Est-ce que le problème viendrait de mes paramètres ou est-ce que l'algorithme sur lequel je me suis basé est incorrect?
Merci d'avance.