Dans un réseau de neurones récurrent, vous propagez généralement la propagation en plusieurs étapes, "déroulez" le réseau, puis la propagation en arrière sur la séquence d'entrées.
Pourquoi ne mettez-vous pas simplement à jour les poids après chaque étape individuelle de la séquence? (l'équivalent de l'utilisation d'une longueur de troncature de 1, il n'y a donc rien à dérouler) Cela élimine complètement le problème de gradient de fuite, simplifie considérablement l'algorithme, réduirait probablement les chances de rester coincé dans les minima locaux et, surtout, semble fonctionner correctement. . J'ai formé un modèle de cette façon pour générer du texte et les résultats semblaient comparables aux résultats que j'ai vus des modèles formés par BPTT. Je ne suis confus là-dessus que parce que chaque tutoriel sur les RNN que j'ai vu dit d'utiliser BPTT, presque comme s'il était nécessaire pour un apprentissage correct, ce qui n'est pas le cas.
Mise à jour: j'ai ajouté une réponse
Réponses:
Edit: J'ai fait une grosse erreur en comparant les deux méthodes et je dois changer ma réponse. Il s'avère que je le faisais, juste en se propageant sur le pas de temps actuel, commence réellement à apprendre plus rapidement. Les mises à jour rapides apprennent très rapidement les modèles les plus élémentaires. Mais sur un ensemble de données plus important et avec un temps de formation plus long, BPTT arrive en tête. Je testais un petit échantillon pour seulement quelques époques et je supposais que celui qui gagnerait la course serait le vainqueur. Mais cela m'a conduit à une découverte intéressante. Si vous commencez votre entraînement à se propager en un seul pas de temps, puis passez à BPTT et augmentez lentement la distance de propagation, vous obtenez une convergence plus rapide.
la source
Un RNN est un réseau neuronal profond (DNN) où chaque couche peut prendre une nouvelle entrée mais avoir les mêmes paramètres. BPT est un mot fantaisie pour Back Propagation sur un tel réseau qui est lui-même un mot fantaisie pour Gradient Descent.
Dire que le RNN de y t dans chaque étape et e r r o r t = ( y t - y t ) 2y^t
Afin d'apprendre les poids, nous avons besoin de gradients pour que la fonction réponde à la question "dans quelle mesure un changement de paramètre affecte-t-il la fonction de perte?" et déplacer les paramètres dans la direction donnée par:
C'est-à-dire que nous avons un DNN où nous obtenons des commentaires sur la qualité de la prédiction à chaque couche. Puisqu'un changement de paramètre changera chaque couche dans le DNN (pas de temps) et chaque couche contribue aux sorties à venir, cela doit être pris en compte.
Prenez un simple réseau à une couche neurone pour voir ceci de manière semi-explicite:
Avec le taux d'apprentissage une étape d'apprentissage est alors: [ ~ a ~ b ~ c ] ← [ a b c ] + δ ( y t - y t ) ∇ y tδ
Peut-être que chaque étape contribuera alors à une direction brute qui est suffisante en agrégation? Cela pourrait expliquer vos résultats, mais je serais vraiment intéressé d'en savoir plus sur votre méthode / fonction de perte! Serait également intéressé par une comparaison avec un ANN à deux fenêtres fenêtrées.
edit4: Après avoir lu les commentaires, il semble que votre architecture ne soit pas un RNN.
Votre modèle: sans état - état caché reconstruit à chaque étapeedit2: ajout de références aux DNN edit3: correction de gradstep et quelques notations edit5: correction de l'interprétation de votre modèle après votre réponse / clarification.la source
"Déplier dans le temps" est simplement une application de la règle de la chaîne,
La sortie d'un RNN au pas de tempst , Ht est fonction des paramètres θ , l'entrée Xt et l'état précédent, Ht - 1 (notez qu'à la place Ht peut être transformé à nouveau au pas de temps t pour obtenir la sortie, ce n'est pas important ici). Rappelez-vous l'objectif de la descente du gradient: étant donné une fonction d'erreurL , regardons notre erreur pour l'exemple (ou les exemples) en cours, puis ajustons θ de telle manière que, étant donné le même exemple, notre erreur serait réduite.
Comment exactementθ contribuer à notre erreur actuelle? Nous avons pris une somme pondérée avec notre entrée actuelle,Xt , nous devons donc effectuer une rétropropagation via l'entrée pour trouver ∇θa ( xt, θ ) , pour savoir comment ajuster θ . Mais notre erreur est aussi le résultat d'une contribution deHt - 1 , qui était également fonction de θ , droite? Nous devons donc découvrir∇θHt - 1 , qui était fonction de Xt - 1 , θ et Ht - 2 . MaisHt - 2 était également une fonction une fonction de θ . Etc.
la source