3

Je suis nouveau dans les réseaux de neurones. J'ai essayé d'implémenter un réseau à deux couches pour apprendre la fonction XOR en utilisant l'algorithme de rétropropagation. La couche cachée a 2 unités et la couche de sortie a 1 unité. Toutes les unités utilisent la fonction d'activation sigmoïde. J'initialise les poids entre -1 et +1 et ai un biais de +1.MLP ne pas entraîner XOR correctement

Le problème est que le réseau apprend la fonction très petit nombre de fois lorsqu'il est réinitialisé à partir de zéro en utilisant d'autres valeurs aléatoires de poids. Il apprend les autres fonctions booléennes (AND, OR) en un très petit nombre d'itérations, presque chaque fois pour presque tous les poids assignés aléatoirement. Le problème est avec la fonction XOR - elle ne converge pas vers des valeurs optimales pour certaines valeurs de poids aléatoires. J'utilise la descente de gradient stochastique, backpropagation pour l'apprentissage.

Mon code: http://ideone.com/IYPW2N

code de fonction de sortie de calcul de couche cachée:

public double computeOutput(double[] input){ 
    this.input = input; 
    output = bias+w[0]*input[0] + w[1]*input[1]; 
    output = 1/(1+Math.pow(Math.E, -output));  
    return output; 
} 

Compute Erreur Code de fonction:

public double computeError(double w, double outputUnitError){ 
    error = (output)*(1-output)*(outputUnitError*w); 
    return error;   
} 

erreurs de fixation pour les unités cachées:

public void fixError(){ 
    for(int i=0;i<input.length;++i) w[i] += n*error*input[i]; 
} 

fonction de sortie de calcul de l'unité de sortie:

public void computeOutput(double[] input) { 
    this.input = input; 
    output = bias+input[0]*w[0]+input[1]*w[1]; 
    output = 1/(1+Math.pow(Math.E, -output)); 
} 

la fonction de l'unité de sortie computeError:

public void computeError(double t){ 
    this.t = t; 
    error = (output)*(1-output)*(t-output); 
} 

fonction de l'unité de sortie fixError (mise à jour des poids):

public void fixError() {  
    for(int i=0;i<w.length;++i) w[i] += n*error*input[i]; 
} 

Le code arrête la formation dès comme dans toute itération, tous les exemples sont classés correctement. Il s'arrête autrement lorsque le nombre d'itérations dépasse 90k.

Le taux d'apprentissage est défini sur 0,05. Si la valeur de l'unité de sortie est supérieure à 0,5, il est compté comme +1, sinon un 0.

Exemples de formation:

static Example[] examples = { 
     new Example(new double[]{0, 0}, 0), 
     new Example(new double[]{0, 1}, 1), 
     new Example(new double[]{1, 0}, 1), 
     new Example(new double[]{1, 1}, 0) 
}; 

sortie de code:

Iterations > 90000, stop... 
Displaying outputs for all examples... 
0.018861254512881773 
0.7270271284494716 
0.5007550527204925 
0.5024353957353963 

Training complete. No of iterations = 45076 
Displaying outputs for all examples... 
0.3944511789979849 
0.5033004761575361 
0.5008283246200929 
0.2865272493546562 

Training complete. No of iterations = 39707 
Displaying outputs for all examples... 
0.39455754434259843 
0.5008762488126696 
0.5029579167912538 
0.28715696580224176 

Iterations > 90000, stop... 
Displaying outputs for all examples... 
0.43116164638530535 
0.32096730276984053 
0.9758219334403757 
0.32228953888593287 

J'ai essayé plusieurs valeurs pour le taux d'apprentissage et a augmenté le nombre d'unités de couche cachées, mais il n'apprend pas encore XOR.

Veuillez me corriger si je me trompe ou s'il y a un bug dans l'implémentation.

J'ai vérifié d'autres threads mais je n'ai pas trouvé de solution satisfaisante à mon problème.

Répondre

0

Vous êtes également supposé apprendre le biais aussi, tandis que votre code suppose que le biais est constant (vous devriez avoir le poids connecté à la polarisation). Sans biais, vous ne serez pas capable d'apprendre XOR.

+0

J'ai corrigé le code. Maintenant, si j'utilise deux unités cachées (1 unité de polarisation), le code converge presque en poids aléatoire de 80% demandes 3 unités cachées (1 unité de polarisation), près de 90% 4 unités cachées, près de 99% Est-ce que cela semble bon, ou devrait-il aller 100% dans le premier cas? – CodeWriter

+0

Nouveau code - http://ideone.com/xjCIWA – CodeWriter

+0

et où est la polarisation dans la couche de sortie? – lejlot