Gradients synthétiques - quel est l'avantage pratique?

8

Je peux voir deux raisons d'utiliser des dégradés synthétiques dans RNN:

  1. Pour accélérer l'entraînement, en corrigeant immédiatement chaque couche avec le gradient prévu
  2. Pour pouvoir apprendre des séquences plus longues

Je vois des problèmes avec les deux. Veuillez noter que j'aime vraiment les dégradés synthétiques et je voudrais les implémenter. Mais je dois comprendre où ma piste de pensée est incorrecte.

Je vais maintenant montrer pourquoi les points 1 et 2 ne semblent pas être bénéfiques, et j'ai besoin que vous me corrigiez, s'ils sont réellement bénéfiques:


Point 1:

Les dégradés synthétiques nous disent que nous pouvons compter sur un autre "mini-réseau d'assistance" (appelé DNI) pour informer notre couche actuelle des gradients qui arriveront d'en haut, même pendant la propulsion avant.

Cependant, de tels gradients ne viendront que plusieurs opérations plus tard. La même quantité de Backprop devra être faite que sans DNI, sauf que maintenant nous devons également former notre DNI.

L'ajout de cette asyncronisité ne devrait pas faire en sorte que les couches s'entraînent plus rapidement que lors de la séquence prop traditionnelle "verrouillée" fwdprop -> full back prop, car le même nombre de calculs doit être effectué par le périphérique. C'est juste que les calculs seront glissés dans le temps

Cela me fait penser que le point 1) ne fonctionnera pas. Le simple ajout de SG entre chaque couche ne devrait pas améliorer la vitesse d'entraînement.

Point 2:

Ok, que diriez-vous d'ajouter SG uniquement sur la dernière couche pour prédire le "gradient du futur" et seulement si c'est le dernier pas de temps pendant l'hélice avant .

De cette façon, même si notre LSTM doit cesser de prédire et doit se propager à rebours, il peut toujours prédire le gradient futur qu'il aurait reçu (avec l'aide de DNI assis sur le dernier pas de temps).


Envisagez plusieurs sessions de formation (session A, session B):

fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ----> stop et bkprop!

fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ----> stop et bkprop!

Nous venons de forcer notre réseau à "analyser" 6 pas de temps en deux moitiés: 3 pas de temps, puis encore 3 pas de temps.

Remarquez, nous avons notre DNI assis à la toute fin de la "Session A" et prédisant "quel gradient j'obtiendrai à partir du début de la Session B (à partir du futur)". Pour cette raison, timestep_3A sera équipé d'un gradient "qui proviendrait de timestep_1B", donc en effet, les corrections effectuées pendant A seront plus fiables.

Mais salut! Ces « gradients synthétiques » prévus seront très faible (négligeable) de toute façon - après tout, c'est la raison pour laquelle nous commençons une nouvelle backprop séance B . N'étaient-ils pas trop petits, nous analyserions simplement les 6 pas de temps dans une seule "session A" bkprop longue.

Par conséquent, je pense que le point 2) ne devrait pas non plus être avantageux. L'ajout de SG sur le dernier pas de temps de fwdprop permet d'entraîner efficacement des séquences plus longues, mais les gradients disparaissants ne sont allés nulle part.


D'accord. Peut-être pouvons-nous bénéficier de la formation "session A" , "session B" etc. sur des machines séparées? Mais en quoi est-ce différent de simplement s'entraîner avec les minibatches habituels en parallèle? Gardez à l'esprit, a été mentionné au point 2: les choses sont aggravées par la session A prédisant des gradients qui disparaissent de toute façon.

Question: Veuillez m'aider à comprendre les avantages du dégradé synthétique, car les 2 points ci-dessus ne semblent pas être bénéfiques

Kari
la source
Pourquoi pensez-vous que cela n'accélérera pas la formation? La seule justification que je vois est la simple affirmation que cela "ne devrait pas améliorer la vitesse d'entraînement" mais vous ne donnez pas votre raisonnement. De plus, ce que vous entendez par «étape 1)» n'est pas clair, car vous n'avez décrit aucune étape dans la question. Dans tous les cas, le document démontre qu'il fournit des accélérations. Les données dépassent la théorie tous les jours. Avez-vous lu le journal?
DW
Les données battent la théorie tous les jours, je suis d'accord, mais le meilleur contre-exemple que je puisse faire est celui des GPU par rapport aux CPU. Partout, les gens continuent de dire que le GPU exécute des ordres de grandeur plus rapidement que le CPU et fournissent des comparaisons. Cependant, un processeur multithread correctement codé n'est que 2 à 3 fois plus lent que son GPU de même catégorie et est moins cher que le GPU. larsjuhljensen.wordpress.com/2011/01/28/… Encore une fois, je ne vais pas contre les dégradés synthétiques, - ils semblent géniaux, c'est juste jusqu'à ce que je puisse obtenir une réponse à mon message, je ne pourrai pas me reposer: D
Kari
Je ne suis pas sûr qu'un article de blog de 7 ans sur BLAST soit terriblement pertinent ici.
DW
Ce que j'essaie de dire, c'est "qu'il existe des moyens de faire en sorte que le parallélisme semble meilleur qu'il ne pourrait l'être", dans tous les scénarios
Kari

Réponses:

2

Mais salut! Ces "gradients synthétiques" prévus seront de toute façon très petits (négligeables) - après tout, c'est pourquoi nous commençons une nouvelle session backprop B. N'étaient-ils pas trop petits, nous analyserions simplement les 6 pas de temps en une seule longue session bkprop "session A ".

-Ce n'est pas nécessairement correct. Nous tronquons et démarrons généralement un nouveau backprop en raison de contraintes matérielles, telles que la mémoire ou la vitesse de calcul. Le gradient de fuite peut être amélioré par d'autres moyens, tels que la normalisation du gradient - augmenter le vecteur de gradient s'il devient trop petit au-delà de certaines couches, ou réduire si il est sur le point d'exploser. Ou même en utilisant la normalisation par lots


Il est important de comprendre comment mettre à jour n'importe quel module DNI. Pour clarifier les choses, considérons un exemple de réseau avec plusieurs couches et 3 modules DNI:

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

Le DNI_0 est toujours entraîné avec un gradient synthétique provenant de DNI_3 (traversant Layer_2 et Layer_1 bien sûr), implantant plusieurs couches plus loin.

De même, le DNI_3 est toujours entraîné avec un gradient synthétique provenant de DNI_5

DNI_0 ou DNI_3 ne verront jamais le vrai gradient, car le vrai grad est fourni uniquement à DNI_5 , et pas plus tôt.

Pour ceux qui ont encore du mal à les comprendre, lisez cet impressionnant article de blog , partie 3

Les calques antérieurs devront se contenter de dégradés synthétiques, car eux ou leur DNI ne verront jamais le "vrai dégradé".


Concernant la formation en parallèle avec des minibatches au lieu de la parallélisation via des notes synthétiques:

Les séquences plus longues sont plus précises que les minibatches, mais les minibatches ajoutent un effet de régulation . Mais, étant donné une certaine technique pour empêcher le gradient d'exploser ou de disparaître, la formation de séquences plus longues peut fournir un bien meilleur aperçu du contexte du problème. C'est parce que le réseau déduit la sortie après avoir considéré une séquence d'entrée plus longue, donc le résultat est plus rationnel.

Pour la comparaison des avantages accordés par SG, reportez-vous aux diagrammes page 6 du document , pouvant principalement résoudre des séquences plus longues, ce qui me semble le plus bénéfique (nous pouvons déjà paralléliser via Minibatches de toute façon, et donc SG ne devrait pas accélérer la lorsqu’il est exécuté sur la même machine - même si nous ne propageons en effet que jusqu’au DNI suivant).


Cependant, plus nous avons de modules DNI, plus le signal doit être bruyant. Il peut donc être utile de former les couches et DNI par le backprop hérité, et seulement après que certaines époques se soient écoulées, nous commençons à utiliser le bootstrap DNI discuté ci-dessus.

De cette façon, le premier DNI acquerra au moins une certaine idée de ce à quoi s'attendre au début de la formation. C'est parce que les DNI suivants ne sont pas eux-mêmes sûrs de ce à quoi ressemble le véritable gradient, lorsque la formation commence, donc au début, ils conseilleront le gradient "poubelle" à toute personne assise plus tôt qu'eux.

N'oubliez pas que les auteurs ont également expérimenté la prédiction des entrées réelles pour chaque couche.


Si vos couches ont un backprop coûteux (peut-être que vous avez la normalisation par lots ou certaines fonctions d'activation fantaisistes), la correction avec DNI pourrait être beaucoup moins chère, une fois qu'elle est suffisamment bien formée. N'oubliez pas que DNI n'est pas gratuit - il nécessite une multiplication matricielle et ne fournira probablement pas beaucoup d'accélération sur une simple couche dense.


Les minibatches nous donnent de l'accélération (via la parallélisation) et nous donnent également la régularisation. Les dégradés synthétiques nous permettent de mieux déduire en travaillant avec des séquences plus longues et un gradient (potentiellement) moins cher. Dans l'ensemble, c'est un système très puissant.

Kari
la source
0

Les gradients synthétiques accélèrent l'entraînement, non pas en réduisant le nombre d'époques nécessaires ou en accélérant la convergence de la descente de gradient, mais plutôt en accélérant le calcul de chaque époque. Le gradient synthétique est plus rapide à calculer que le gradient réel (le calcul du gradient synthétique est plus rapide que la rétropropagation), de sorte que chaque itération de descente de gradient peut être calculée plus rapidement.

DW
la source
D'après ma compréhension, dans le temps, les gradients ne devraient pas atteindre le DNI plus rapidement, c'est juste qu'ils sont maintenant glissés dans le temps et calculés de manière asynchrone pendant que l'hélice vers l'avant se produit. Le DNI devra encore obtenir le vrai gradient pour former lui - même . Ainsi, les dégradés synthétiques devraient nécessiter le même nombre de calculs à effectuer en parallèle que lors du BPTT standard. Est-ce correct?
Kari
Il n'y aurait donc pas d'accélération en introduisant simplement le SG entre les couches. Oui, nous obtenons le gradient prédictif immédiat de la DNI, mais pour chacune de ces prédictions, nous devrons finalement payer le prix par propagation arrière complète asynchrone vers cette DNI, un peu plus tard
Kari
@Kari, non, cela ne me semble pas juste. Si vous avez besoin du même nombre d'itérations, mais que chaque itération prend désormais 50% de temps en moins sur le GPU, le calcul résultant sera effectué plus tôt. Même si vous avez besoin de 10% d'itérations / d'époques supplémentaires (parce que les dégradés sont retardés ou que les dégradés synthétiques ne correspondent pas parfaitement aux dégradés réels), c'est toujours une victoire: l'accélération de pouvoir calculer le gradient synthétique plus rapidement que le gradient réel l'emporte sur les autres effets. Vous semblez convaincu que cela ne peut pas aider, mais les données du document montrent que cela aide.
DW
Hm, eh bien par exemple, nous avons 4 couches assis après notre DNI; En backprop normal, nous aurions 4 échanges "en avant" entre les couches, puis 4 "échanges en arrière", et pendant ce temps, le système est verrouillé. Avec DNI, nous pouvons immédiatement corriger nos poids, mais nous devrons obtenir de vrais gradients plus tard, mais maintenant, le système n'est pas verrouillé, ce qui permet entre-temps de faire passer plus de passes vers l'avant. Mais nous devons encore le vrai gradient d'avant à notre DNI ... Pour obtenir et restituer ce gradient à DNI cela prendra 100% du temps (même 4 pas en avant, même 4 pas en arrière).
Kari
C'est juste que notre DNI dit "bien, donnez-leur quand c'est possible, plus tard", mais nous avons quand même dû payer le prix fort, donc je ne vois pas l'augmentation des performances. Je suis d'accord, les articles montrent d'excellents résultats, mais comment se fait-il? Nous pouvons déjà entraîner des minibatches en parallèle de toute façon: /
Kari