Pourquoi se propager dans le temps dans un RNN?

14

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

Frobot
la source
Une direction intéressante pour entreprendre cette recherche serait de comparer les résultats que vous avez obtenus sur votre problème avec les repères publiés dans la littérature sur les problèmes RNN standard. Cela ferait un article vraiment cool.
Sycorax dit Réintégrer Monica
Votre "Mise à jour: j'ai ajouté une réponse" a remplacé la modification précédente par votre description d'architecture et une illustration. Est-ce exprès?
amibe dit Réintégrer Monica
Oui, je l'ai retiré car il ne semblait pas vraiment pertinent pour la question réelle et cela prenait beaucoup de place, mais je peux l'ajouter si cela aide
Frobot
Eh bien, les gens semblent avoir d'énormes problèmes avec la compréhension de votre architecture, donc je suppose que toutes les explications supplémentaires sont utiles. Vous pouvez l'ajouter à votre réponse au lieu de votre question, si vous préférez.
amibe dit Reinstate Monica

Réponses:

4

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.

Frobot
la source
Merci pour votre mise à jour. Dans la source de cette dernière image, il dit ceci à propos du paramètre un à un : "Mode de traitement vanille sans RNN, de l'entrée de taille fixe à la sortie de taille fixe (par exemple, la classification des images)." Voilà donc ce que nous disions. Si c'est comme vous l'avez décrit, il n'a pas d'état et ce n'est pas un RNN. "Propagation vers l'avant via une seule entrée avant la propagation vers l'arrière" - je l'appellerais un ANN. Mais ceux-ci ne fonctionneraient pas aussi bien avec du texte, donc quelque chose se passe et je ne sais pas quoi parce que je n'ai pas le code
ragulpr
Je n'ai pas lu cette partie et vous avez raison. Le modèle que j'utilise est en fait le "plusieurs à plusieurs" à l'extrême droite. J'ai supposé que dans la section "un à un", il y en avait vraiment beaucoup qui étaient tous connectés et le dessin ne faisait rien. mais c'est en fait l'une des options à l'extrême droite que je n'ai pas remarquée (c'est étrange d'avoir celle-là dans un blog sur les RNN, alors j'ai supposé qu'elles étaient toutes récurrentes). Je vais modifier cette partie de la réponse pour donner plus de sens
Frobot
J'ai imaginé que c'était le cas, c'est pourquoi j'ai insisté pour voir votre fonction de perte. S'il est beaucoup à beaucoup votre perte est semblable à et il est identique d' un RNN et vous êtes propagation / inputing la séquence entière mais tronquer juste BPTT vous ie » d calculer la partie rouge dans mon message mais ne pas reconsidérer davantage. error=t(yt-y^t)2
ragulpr
Ma fonction de perte ne résume pas avec le temps. Je prends une entrée, j'obtiens une sortie, puis je calcule une perte et je mets à jour les poids, puis je passe à t + 1, donc il n'y a rien à résumer. J'ajouterai la fonction de perte exacte au message d'origine
Frobot
Postez votre code, je ne fais plus de suppositions, c'est idiot.
ragulpr
2

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

errort=(yty^t)2

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:

errort=2(yty^t)y^t

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:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

Avec le taux d'apprentissage une étape d'apprentissage est alors: [ ~ a ~ b ~ c ][ a b c ] + δ ( y t - y t ) y tδ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt

error=t(yty^t)2

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.

ht Statefull

Votre modèle: sans état - état caché reconstruit à chaque étape apatride edit2: 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.

ragulpr
la source
1
Merci pour votre réponse. Je pense que vous avez peut-être mal compris ce que je fais. Dans la propagation vers l'avant, je ne fais qu'une étape, de sorte que dans la propagation arrière, ce n'est également qu'une étape. Je ne transmets pas la propagation sur plusieurs entrées dans la séquence d'apprentissage. Je vois ce que vous entendez par une direction brute qui est suffisamment agrégée pour permettre l'apprentissage, mais j'ai vérifié mes gradients avec des gradients calculés numériquement et ils correspondent à plus de 10 décimales. L'hélice arrière fonctionne bien. J'utilise la perte d'entropie croisée.
Frobot
1
Je travaille à prendre mon même modèle et à le recycler avec BPTT alors que nous parlons pour avoir une comparaison claire. J'ai également formé un modèle utilisant cet algorithme "en une seule étape" pour prédire si un prix des actions augmentera ou baissera le lendemain, ce qui obtient une précision décente, donc j'aurai deux modèles différents pour comparer BPTT vs prop step back.
Frobot
Si vous ne propagez qu'une seule étape vers l'avant, n'est-ce pas un ANN à deux couches avec une entrée de caractéristique de la dernière étape vers la première couche, une entrée de caractéristique vers l'étape actuelle sur la deuxième couche mais qui a les mêmes poids / paramètres pour les deux couches? Je m'attendrais à des résultats similaires ou mieux avec un ANN qui prend en comptey^t+1=F(Xt,Xt-1)c'est-à-dire qui utilise une fenêtre de temps fixe de taille 2. Si elle ne fait avancer qu'une étape, peut-elle apprendre des dépendances à long terme?
ragulpr
1
J'utilise une fenêtre coulissante de taille 1, mais les résultats sont très différents de la création d'une fenêtre coulissante de taille 2 ANN avec des entrées (xt, xt − 1). Je peux délibérément le laisser surdimensionner lors de l'apprentissage d'un énorme corps de texte et il peut reproduire le texte entier avec 0 erreurs, ce qui nécessite de connaître des dépendances à long terme qui seraient impossibles si vous n'aviez que (xt, xt − 1) en entrée. la seule question qui me reste est de savoir si l'utilisation de BPTT permettrait aux dépendances de s'allonger, mais honnêtement, cela ne ressemble pas à cela.
Frobot
Regardez mon article mis à jour. Votre architecture n'est pas un RNN, elle est sans état, donc les dépendances à long terme qui ne sont pas explicitement intégrées dans les fonctionnalités ne peuvent pas être apprises. Les prédictions précédentes n'influencent pas les prédictions futures. Vous pouvez voir cela comme siy^t-2y^t=0pour votre architecture. BPTT est en théorie identique à BP mais exécuté sur une architecture RNN donc vous ne pouvez pas mais je vois ce que vous voulez dire, et la réponse est non. Ce serait vraiment intéressant de voir des expériences sur RNN avec état mais seulement sur BPTT à un pas si ^^
ragulpr
1

"Déplier dans le temps" est simplement une application de la règle de la chaîne,

F(g(X),h(X),m(X))X=FggX+FhhX+FmmX

La sortie d'un RNN au pas de temps t, 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 tpour 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 θune(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.

Matthew Hampsey
la source
Je comprends pourquoi vous vous propagez dans le temps dans un RNN traditionnel. J'essaie de comprendre pourquoi un RNN traditionnel utilise plusieurs entrées à la fois pour la formation, alors que l'utilisation d'une seule à la fois est beaucoup plus simple et fonctionne également
Frobot
Le seul sens dans lequel vous pouvez alimenter plusieurs entrées à la fois dans un RNN est de fournir plusieurs exemples de formation, dans le cadre d'un lot. La taille du lot est arbitraire et la convergence est garantie pour n'importe quelle taille, mais des tailles de lot plus élevées peuvent conduire à des estimations de gradient plus précises et à une convergence plus rapide.
Matthew Hampsey
Ce n'est pas ce que je voulais dire par "entrées multiples à la fois". Je ne l'ai pas très bien formulé. Je voulais dire que vous vous propagiez généralement par plusieurs entrées dans la séquence d'entraînement, puis que vous vous propagiez en arrière à travers toutes, puis mettiez à jour les poids. La question est donc de savoir pourquoi la propagation à travers une séquence entière lorsque vous effectuez une seule entrée à la fois est beaucoup plus facile et fonctionne toujours
Frobot
Je pense que des éclaircissements sont nécessaires ici. Lorsque vous dites «entrées», faites-vous référence à plusieurs exemples de formation ou faites-vous référence à plusieurs pas de temps dans un seul exemple de formation?
Matthew Hampsey
1
Je posterai une réponse à cette question d'ici la fin de la journée. J'ai fini de faire une version BPTT, il suffit de m'entraîner et de comparer. Après cela, si vous voulez toujours voir du code, faites-moi savoir ce que vous voulez voir et je suppose que je pourrais toujours le poster
Frobot