Question

D'abord une question théorique et une pratique.

La rétropropagation de Neural est le calcul des dérivées des poids ou le calcul des nouveaux poids (qui est, les poids initiaux moins les dérivés de poids fois le taux d'apprentissage - simplifié)?

Il pourrait bien être une question de sémantique, mais néanmoins important.

De plus, si quelqu'un est familier avec la flamme, la classe nn

gradInput = module:backward(input, gradOutput)

est gradinput le jeu de poids pour le prochain passage vers l'avant ou est-il les dérivés des poids de la passe avant précédente?

Merci!

Était-ce utile?

La solution

J'utilise la torche pendant quelques mois maintenant, mais je vais lui donner un coup (excuses si elles sont incorrectes).

Oui, un poids $ w $ est mis à jour comme suit:

$$ w_ {new} = {w_ old} - \ gamma \ partial E / \ W_ partielle {old} $$

où $ \ gamma $ est votre taux d'apprentissage et $ E $ est l'erreur calculée en utilisant quelque chose comme criterion:forward(output,target). Le critère pourrait être, par exemple, nn.MSECriterion().

Pour calculer \ partial $ E / \ $ W partielle dont vous avez besoin $ \ E / \ y gradOutput = criterion:backward(output,target) de $ partielle partielle (respect gradient à la sortie), ainsi que la input d'entrée au filet-à-dire vos $ X $ (par exemple des données d'image ) pour générer l'ensemble récursif d'équations qui se multiplient avec gradOutput.

model:backward(input, gradOutput) sert donc à mettre à jour les poids afin qu'ils soient prêts pour la prochaine model:forward(input) car il génère un grand tenseur dérivé $ DE / dW_ {old} $.

Il est ensuite combiné à un optimisateur tel que optim.sgd en utilisant optimMethod et les anciens poids $ W_ {old} $ pour générer les nouveaux poids dans la première équation. Bien sûr, vous pouvez simplement mettre à jour les poids sans Optimiseur avec model:updateParameters(learningRate) mais vous manquez des choses utiles comme l'élan, la carie poids etc.

A obtenu côté peu suivi, mais il espère que cela aide.

Autres conseils

Dans la vue simple, peut-être cela suffira: la méthode de backward() est utilisé pour la formation d'un réseau de neurones avec rétropropagation; calculer la y d'entrée x de sortie donnée en utilisant la méthode de forward() de votre réseau, trouver l'erreur de la sortie de votre cible en utilisant le criterion que vous avez défini (par exemple log-vraisemblance négative, etc.). Maintenant, s'il n'y avait qu'une seule couche de réseau, vous pouvez simplement utiliser ces erreurs entre la couche de sortie et la cible à mettre à jour les poids dans cette couche unique. Lorsque vous avez plus d'une couche (ou une structure plus complexe), vous pouvez mettre à jour les couches une à la fois, chaque fois que le calcul de l'erreur dans que couche (plus la couche de sortie), puis en utilisant cette erreur mettre à jour des poids pour une couche précédente. C'est backpropogation. Pour cela, vous avez évidemment besoin d'une certaine façon de cartographier l'erreur dans le répertoire $ de sortie \ Delta $ y $ sur \ Delta x $ en utilisant le même état (état du modèle et l'entrée $ a.k.a. x $). Ainsi, le procédé de backward() est essentiellement sous la forme: $$ f: (x, \ Delta y) \ rightarrow \ Delta x $$

Pour la même complet, un procédé de forward() peut être représentée comme suit: $$ f: x \ rightarrow y $$ Par ailleurs, si l'état précédent persiste de y, tout ce que vous devez calculer est $ \ Delta $ y, donc, parler de façon équivalente, un forward() peut aussi être représentée comme suit: $$ f: (x, y) \ rightarrow \ Delta y $$

Ce formulaire peut être facilement comparé à la méthode backward(), et il est facile de voir pourquoi il est appelé en tant que telle.

Licencié sous: CC-BY-SA avec attribution
scroll top