Quelle est la différence entre la descente de gradient basée sur la quantité de mouvement et la descente de gradient accélérée de Nesterov?

48

Ainsi, la descente de gradient basée sur la quantité de mouvement fonctionne comme suit:

v=self.momentummlrg

où est la mise à jour précédente du poids, et est le gradient actuel par rapport aux paramètres , est le taux d'apprentissage et est une constante.mgplrself.momentum

pnew=p+v=p+self.momentummlrg

et la descente de gradient accélérée de Nesterov fonctionne comme suit:

pnew=p+self.momentumvlrg

qui équivaut à:

pnew=p+self.momentum(self.momentummlrg)lrg

ou

pnew=p+self.momentum2m(1+self.momentum)lrg

source: https://github.com/fchollet/keras/blob/master/keras/optimizers.py

Il me semble donc que la descente de gradient accélérée de Nesterov ne fait que donner plus de poids au terme lr * g au terme m de changement de poids perméable m (par rapport à un vieil élan normal). Cette interprétation est-elle correcte?

Cidre
la source
7
Est-ce que vous demander de taper serait trop demander? LATEX
Rodrigo de Azevedo

Réponses:

35

La réponse d'Arech à propos de l'élan Nesterov est correcte, mais le code fait essentiellement la même chose. Ainsi, à cet égard, la méthode Nesterov donne plus de poids au terme et moins au terme .vlrgv

Pour illustrer la raison pour laquelle la mise en œuvre de Keras est correcte, je vais emprunter l' exemple de Geoffrey Hinton .
entrez la description de l'image ici

La méthode Nesterov adopte l'approche "pari-> correction". Le vecteur brun est (pari / saut), le vecteur rouge est (correction), et le vecteur vert est (où nous devrions en fait passer à). est la fonction de dégradé.
v=mvlr(w+mv)
w=w+v
mvlr(w+mv)mvlr(w+mv)()

Le code semble différent car il se déplace par le vecteur brun au lieu du vecteur vert , car la méthode Nesterov ne nécessite que l’évaluation de au lieu de . Par conséquent, à chaque étape, nous voulons(w+mv)=:g(w)

  1. revenir à l'endroit où nous étions(10)
  2. suivez le vecteur vert là où nous devrions être(02)
  3. faire un autre pari(23)

Le code de Keras écrit en abrégé est , et nous faisons quelques calculsp=p+m(mvlrg)lrg

p=pmv+mv+m(mvlrg)lrg=pmv+mvlrg+m(mvlrg)=pmv+(mvlrg)+m(mvlrg)

et c’est exactement . En réalité, le code original prend un chemin plus court . 1023123

La valeur estimée réelle (vecteur vert) doit être , qui doit être proche de lorsque l’apprentissage converge.pmvp

dontloo
la source
2
@youkaichao essayez ceci youtube.com/watch?v=LdkkZglLZ0Q
dontloo
13

Il me semble que l'on a déjà répondu à la question du PO, mais j'essaierais de donner une autre explication (intuitive, espérons-le) sur l'élan et la différence entre Classical Momentum (CM) et Nesterov's Accelerated Gradient (NAG).


tl; dr
Il suffit de passer à l'image à la fin.
Le raisonnement de NAG_ball est un autre élément important, mais je ne suis pas sûr que ce serait facile à comprendre sans tout le reste.



CM et NAG sont les deux méthodes permettant de choisir le vecteur suivant dans l’espace des paramètres, afin de trouver le minimum d’une fonction .θf(θ)

Dans d'autres nouvelles, ces deux bals sensibles se sont récemment manifestés:
CM_ball NAG_ball

Il s’avère (en fonction du comportement observé des balles et de l’article sur l’importance de l’initialisation et de l’élan dans l’apprentissage en profondeur , qui décrit à la fois CM et NAG dans la section 2) que chaque balle se comporte exactement comme l’une de ces méthodes , et nous les appellerions donc "CM_ball" et "NAG_ball":
(NAG_ball sourit, car il a récemment regardé la fin de la Lecture 6c - La méthode de l'élan, de Geoffrey Hinton avec Nitish Srivastava et Kevin Swersky , et croit donc plus que jamais que son comportement conduit à trouver un minimum plus rapidement.)

Voici comment les balles se comportent:

  • Au lieu de rouler comme des balles normales, ils sautent entre des points dans l’espace paramétrique.
    Soit le ième emplacement d' une balle dans l'espace des paramètres, et le ième saut de la balle . Ensuite, sauter entre les points de l’espace des paramètres peut être décrit par .θttvttθt=θt1+vt
  • Non seulement ils sautent au lieu de rouler, mais leurs sauts sont spéciaux: chaque saut est en fait un double saut, qui est la composition de deux sauts: vt
    • Momentum Jump - Saut qui utilise l’élan de , le dernier double saut. Une petite fraction de la quantité de mouvement de est perdue en raison du frottement avec l'air. Soit la fraction de l’élan qui reste (les balles sont assez aérodynamiques, donc habituellement ). Ensuite, le saut momentum est égal à . (Dans CM et NAG, est un hyperparamètre appelé "coefficient de momentum".)vt1
      vt1
      μ0.9μ<1μvt1
      μ
    • Slope Jump - un saut qui me rappelle le résultat de mettre une balle normale sur une surface - la balle commence à rouler dans la direction de la pente la plus raide, tandis que plus la pente est raide, plus l'accélération est grande.
      De la même manière, le saut de pente est dirigé dans la direction de la pente la plus raide (la direction opposée à la pente), et plus la pente est grande, plus le saut est important.
      Le Slope Jump dépend également de , du niveau d’empressement de la balle (naturellement, ): plus la balle est impatiente, plus le Slope Jump est avancé. (En CM et en NAG, est un hyperparamètre appelé "taux d’apprentissage".) Soitϵϵ>0
      ϵ
      gêtre le dégradé dans la position de départ du saut de pente. Alors, le saut en pente est égal à .ϵg
  • Donc, pour les deux balles, le double saut est égal à: La seule différence entre les balles est l'ordre des deux sauts dans le double saut.
    vt=μvt1ϵg
  • CM_ball ne pensait pas que cela importait, alors il décida de toujours commencer par le Slope Jump.
    Ainsi, le double saut de CM_ball est:
    vt=μvt1ϵf(θt1)
  • En revanche, NAG_ball a réfléchi pendant un certain temps, puis a décidé de toujours commencer par le Momentum Jump.
    Par conséquent, le double saut de NAG_ball est:

    vt=μvt1ϵf(θt1+μvt1)

    Le raisonnement de NAG_ball

    • Quel que soit le saut qui vient en premier, mon Momentum Jump serait le même.
      Je devrais donc considérer la situation comme si j’avais déjà fait mon saut en vitesse et que je suis sur le point de faire mon saut en pente.
    • Maintenant, mon concept de saut en pente va commencer à partir d’ici, mais je peux choisir de calculer ce que sera mon saut en pente comme s’il avait commencé avant le saut momentané, ou comme s’il débutait ici.
    • En pensant de cette façon, on voit clairement que ce dernier est meilleur, car généralement, la pente en un point vous indique approximativement la direction allant de à un minimum (avec la magnitude relativement correcte), tandis que la pente en l’autre point est moins susceptible de vous indiquer la direction allant de au minimum (avec une magnitude relativement correcte).θθθ

Enfin, hier, j'ai eu la chance d'observer chacune des balles sauter dans un espace paramétrique à une dimension.
Je pense que regarder leurs positions changeantes dans l'espace des paramètres n'aiderait pas beaucoup à gagner de l'intuition, car cet espace est une ligne.
Donc, au lieu de cela, j'ai dessiné pour chaque balle un graphe à 2 dimensions dans lequel l'axe horizontal est . Ensuite, j'ai dessiné aide d'un pinceau noir, et j'ai également dessiné chaque balle dans ses premières positions, ainsi que des chiffres pour montrer l'ordre chronologique des positions. Enfin, j'ai dessiné des flèches vertes pour indiquer la distance dans l'espace des paramètres (c'est-à-dire la distance horizontale dans le graphique) de chaque saut Momentum et saut de pente.θ
f(θ)7

Exemple CM_ball vs NAG_ball


Annexe 1 - Une démonstration du raisonnement de NAG_ball

Dans ce gif hypnotisant d’ Alec Radford , vous pouvez voir que NAG fonctionne sans doute mieux que CM ("Momentum" dans le gif).
(Le minimum correspond à l'endroit où se trouve l'étoile et les courbes sont des lignes de contour . Pour une explication des lignes de contour et de leur raison d'être perpendiculaires au dégradé, voir les vidéos 1 et 2 de la légendaire 3Blue1Brown .)

NAG mieux que CM (Momentum)

L'analyse d'un moment spécifique démontre le raisonnement de NAG_ball:

CM vs NAG dans un moment précis

  • La (longue) flèche pourpre est la sous-étape de l’élan.
  • La flèche rouge transparente est la sous-étape du dégradé si elle commence avant la sous-étape de la quantité de mouvement.
  • La flèche noire est la sous-étape du dégradé si elle commence après la sous-étape de la quantité de mouvement.
  • CM se retrouverait dans la cible de la flèche rouge foncé.
  • NAG se retrouverait dans la cible de la flèche noire.

Annexe 2 - choses que j'ai inventées (pour l'intuition)

  • CM_ball
  • NAG_ball
  • Double saut
  • Saut de Momentum
  • Momentum perdu en raison de la friction avec l'air
  • Saut en pente
  • Aventure d'un ballon
  • Moi observant les couilles hier

Annexe 3 - Termes que je n'ai pas inventés

Oren Milman
la source
1
Je trouve la partie de "Voici comment les balles se comportent: ..." à "pour vous diriger dans la direction allant de θ au minimum (avec la magnitude relativement correcte)". excellent comme explication de la différence.
Poete Maudit
12

Je ne pense pas.

Il existe une bonne description des propriétés de Nesterov Momentum (ou Nesterov Accelerated Gradient) dans, par exemple, Sutskever, Martens et al. "Sur l'importance de l'initialisation et de l'élan dans l'apprentissage en profondeur" 2013 .

La différence principale réside dans l’impulsion classique; vous corrigez d’abord votre vélocité, puis vous effectuez un grand pas en fonction de cette vélocité (puis vous répétez); sur le nouvel emplacement (puis répétez).

Moment classique:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) )
W(t+1) = W(t) + vW(t+1)

Alors que l’impulsion de Nesterov est la suivante:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) + momentum.*vW(t) )
W(t+1) = W(t) + vW(t+1)

En fait, cela fait une énorme différence dans la pratique ...

Arech
la source
5

Ajouté: un cours de Stanford sur les réseaux de neurones, cs231n , donne encore une autre forme d'étapes:

v = mu * v_prev - learning_rate * gradient(x)   # GD + momentum
v_nesterov = v + mu * (v - v_prev)              # keep going, extrapolate
x += v_nesterov

Voici la vvélocité aka step aka state, et muest un facteur de quantité de mouvement, typiquement 0,9 ou plus. ( v, xet learning_ratepeuvent être de très longs vecteurs; avec numpy, le code est le même.)

vdans la première ligne est gradient descente avec élan; v_nesterovextrapole, continue. Par exemple, avec mu = 0.9,

v_prev  v   --> v_nesterov
---------------
 0  10  -->  19
10   0  -->  -9
10  10  -->  10
10  20  -->  29

La description suivante comporte 3 termes: le
terme 1 seul correspond à une descente de pente simple (GD),
1 + 2 correspondant à GD + quantité de mouvement,
1 + 2 + 3 à Nesterov GD.

Nesterov GD est généralement décrit comme une alternance des étapes de mouvement et des étapes de gradient :xtytytxt+1

yt=xt+m(xtxt1) - moment, prédicteur - gradient
xt+1=yt+h g(yt)

où est le gradient négatif et est stepize, ou taux d'apprentissage.gtf(yt)h

Combinez ces deux équations en une seule fois en , les points auxquels les gradients sont évalués, en branchant la deuxième équation dans la première, et réorganisez les termes:yt

yt+1=yt
+ h gt - gradient - pas de moment - moment de gradient
+ m (ytyt1)
+ m h (gtgt1)

Le dernier terme est la différence entre GD avec un élan simple et GD avec un élan Nesterov.


On pourrait utiliser des termes de moment distincts, par exemple et : - le moment de pas - moment de gradientmmgrad
+ m (ytyt1)
+ mgrad h (gtgt1)

Puis donne l’élan clair, Nesterov. amplifie le bruit (les gradients peuvent être très bruyants), est un filtre de lissage IIR.mgrad=0mgrad=m
mgrad>0
mgrad.1

Soit dit en passant, la quantité de mouvement et le pas peuvent varier avec le temps, et , ou par composant (descente de coordonnées ada *), ou les deux, davantage de méthodes que de cas de test.mtht


Un complot comparant l’élan clair avec l’impulsion Nesterov sur un cas de test 2d simple, :
(x/[cond,1]100)+ripple×sin(πx)

entrez la description de l'image ici

denis
la source