2

Au sein d'un réseau de neurones pendant la phase d'apprentissage, deux mécanismes se produisent. Feedforward et Backpropagation. Prenons un exemple d'opération XOR.Que se passe-t-il après rétropropagation dans la phase d'apprentissage au sein de Neural Network?

A B Q 
0 0 0 
0 1 1 
1 0 1 
1 1 0 

Pour la première passe (0,0-> 0) feedforward a lieu, alors rétropropagation happens.After cette étape les coefficients de pondération sont recalculées.
Que se passe-t-il maintenant?

Question-1: Encore une fois la même entrée 0,0 est feedforward avec les nouveaux poids calculés (pendant la rétropropagation) et ensuite backprogated jusqu'à ce que l'erreur devienne nill? Si oui, que se passe-t-il si l'erreur n'est jamais nulle? Ce qui m'amène à la question suivante.

Question-2: Quand l'apprentissage de la passe suivante (0,1-> 1) se produira-t-il?

Question-3: Supposons que les poids finis pour la 1ère passe sont 10.3, -2.3,5.5. La deuxième passe (0,1-> 1) commence l'anticipation avec les poids finis de la première passe?


Si je dois décrire via le code qui le code suivant serait correct

Code commun pour les options ci-dessous

averageErrorUntilLearn = 0.002; 
inputs = [ 
[0, 0], 
[0, 1], 
[1, 0], 
[1, 1] 
]; 
outputs = [0, 1, 1, 0]; 
inputNeurons = 2; 
hiddenLayers = 1; 
outputNeurons = 1; 

//initialize the Neural Net 
neuralNetObj = NeuralNet(); 
neuralNetObj.createTopology(inputNeurons, hiddenLayers, outputNeurons); 
weightsForTheNetwork = randomWeights(); 


Question 3 Les poids de scénarios calculés dans chaque passe est envoyé à la passe suivante

Question 1 Chaque passage est de scénarios calculé avec ses propres poids jusqu'à ce qu'il atteigne l'apprentissage souhaité, puis les poids sont envoyés en bas de la nouvelle passe

//learn 
for i in range(0,len(input)): 
    while (averageError > averageErrorUntilLearn): 
     console.log("Current Pass-" + i); 
     neuralNetObj.learningParams(inputs[i], outputs[i]); 
     neuralNetObj.initializeWeights(weightsForTheNetwork); 
     neuralNetObj.feedforward(); 
     neuralNetObj.backPropagate(); 
     weightsForTheNetwork = neuralNetObj.getNewWeights(); 
     averageError = neuralNetObj.getAverageError(); 


Ou suis-je complète mal ici et aucun des scénarios ci-dessus sont vrai?

Répondre

0

1) Oui, l'étape backprop continuera à mettre à jour les poids jusqu'à ce que l'étape feedforward ait une erreur 0. Indépendamment du fait qu'il atteigne ou non une erreur 0, vous devez définir un critère d'arrêt pour lui indiquer quand arrêter. Le plus simple est de définir un nombre fixe d'itérations à entraîner. C'est une bonne façon simple de commencer. Les vrais problèmes utiliseront quelque chose de plus sophistiqué, comme la vérification périodique de la précision lors d'une étape de validation séparée et l'arrêt lorsque la précision cesse de s'améliorer. Cependant, utilisez simplement un nombre fixe d'itérations pour un problème XOR. C'est à vous de décider et de lui dire quels sont les critères d'arrêt.

2) Vous ne souhaitez pas vous entraîner plusieurs fois sur une instance (par exemple 0,0-> 0), puis passer à une instance différente. Si vous entraînez une instance à la fois, passez en première instance une fois (étapes forward et backprop), puis l'instance suivante, et ainsi de suite jusqu'à la fin des données d'entraînement. Puis recommencez au début et réexécutez chaque instance. De cette façon, il entrelace la formation pour chaque cas représenté dans les données d'apprentissage. Comme l'a dit @Maxim, il est plus courant de s'entraîner par lots. Dans un lot, il fera simultanément toutes les passes en avant et collectera toutes les suppositions du réseau sur les réponses. Ensuite, il calcule l'erreur pour chaque instance du lot, et backpropagate une fois pour corriger l'erreur moyenne sur toutes les instances du lot. Par conséquent, il apprend comment traiter tous les cas dans le lot simultanément. C'est plus rapide que de faire une instance à la fois, mais le réseau devrait être capable d'apprendre le problème de toute façon. Le point important ici est qu'il apprend en même temps sur tous les cas dans les données de formation, plutôt que sur un par un.

3) Oui, une fois que vous aurez fait l'étape backprop, les mises à jour seront appliquées aux poids, et la prochaine étape d'entraînement utilisera les nouveaux poids.

+0

1) Backprop ne se limite pas « lorsque l'erreur est égal à 0 », on « arrête » lorsque gradient est égal à 0, l'erreur peut être arbitraire. 2) C'est en fait l'inverse - l'utilisation du "batch complet" est la bonne façon de former un réseau neuronal, et les mini-batchs ou instances uniques sont des approximations stochastiques, introduites principalement pour l'efficacité de calcul, mais le fait qu'ils apprennent encore "de toute façon" est un problème mathématique non trivial (alors que l'apprentissage sur l'ensemble de l'ensemble de la formation est trivial pour justifier mathématiquement). – lejlot

1

La passe avant-arrière est une étape d'apprentissage, qui calcule les gradients qui seront ensuite utilisés pour ajuster les poids par une méthode d'approximation (SGD, RMSProp, Adam, etc.).

Ce que vous décrivez est l'apprentissage une entrée à la fois, qui est une passe en avant-arrière est fait pour (0,0->0), puis une passe en avant-arrière pour (0,1->1) et ainsi de suite. Chaque étape fonctionne avec des poids calculés à l'étape précédente et ne sait pas quelles étaient les données avant cela.

Dans la pratique, cependant, la formation se fait habituellement dans lots, qui est le réseau prend une étape pour le lot [(0,0->0), (0,1->1)], puis pour le lot suivant et ainsi de suite. L'ordre est aléatoire, de sorte que les lots peuvent être formés différemment. Dans certains modèles, chaque lot suivant est pris au hasard, il est donc possible que la même entrée soit envoyée au réseau plusieurs fois de suite, mais pas très probable. Mais la méthode habituelle est la suivante: mélangez toutes les données d'entraînement (4 exemples dans votre cas) et répétez-les toutes par lots. Puis répétez.

Dans de rares cas, le lot contient toutes les données d'entraînement, ce qui signifie essentiellement qu'il s'agit d'une descente de gradient ordinaire (pas stochastique). Dans ce cas, chaque étape prendra les mêmes entrées encore et encore.En résumé: vous êtes libre de nourrir le réseau dans l'ordre que vous voulez, mais généralement les gens le font dans un ordre aléatoire. De plus, l'erreur ne devient jamais exactement nulle, donc vous arrêtez juste après un certain nombre d'itérations.

+0

Ainsi, pour un lot [(0,0-> 0), (0,1-> 1)], la passe avant-arrière se produit. Ensuite, pour le lot suivant [(1,0-> 1), (1 , 1-> 0)] une autre passe avant-arrière arrive. J'ai encore du mal à comprendre comment cela fonctionne. Je n'ai que deux entrées qui signifient que chaque passe doit encore arriver sur une seule valeur de caractéristique (0,0) dans ce cas, même si j'envoie les données par lots. –

+0

Je peux voir que l'apprentissage par lot vous rend confus, mais c'est important. Deux entrées ou plus vont simultanément dans le réseau, dans une matrice. Tout ce que vous pouvez faire avec une seule entrée peut également être fait avec une matrice. En raison de la parallélisation, il est exécuté plus rapidement que un par un, et mieux pour les dégradés. – Maxim