Salvador Dalis Antwort erklärt bereits die Unterschiede zwischen einigen gängigen Methoden (z. B. Optimierern), aber ich würde versuchen, sie noch näher zu erläutern.
(Beachten Sie, dass unsere Antworten in einigen Punkten nicht übereinstimmen, insbesondere in Bezug auf ADAGRAD.)
Klassischer Impuls (CM) gegen Nesterovs beschleunigten Gradienten (NAG)
(Hauptsächlich basierend auf Abschnitt 2 in der Arbeit über die Bedeutung von Initialisierung und Dynamik beim tiefen Lernen .)
Jeder Schritt in CM und NAG besteht tatsächlich aus zwei Unterschritten:
- Ein Impulsunterschritt - Dies ist einfach ein Bruchteil (normalerweise im Bereich
[0.9,1)
) des letzten Schritts.
- Ein gradientenabhängiger Teilschritt - Dies ist wie der übliche Schritt bei SGD - er ist das Produkt aus der Lernrate und dem dem Gradienten entgegengesetzten Vektor, während der Gradient dort berechnet wird, wo dieser Teilschritt beginnt.
CM nimmt zuerst den Gradientenunterschritt, während NAG zuerst den Impulsunterschritt nimmt.
Hier ist eine Demonstration aus einer Antwort über die Intuition für CM und NAG :
NAG scheint also besser zu sein (zumindest im Bild), aber warum?
Das Wichtigste ist, dass es keine Rolle spielt, wann der Momentum-Teilschritt kommt - es wäre so oder so dasselbe. Daher können wir uns genauso gut verhalten, wenn der Momentum-Teilschritt bereits ausgeführt wurde.
Die Frage ist also tatsächlich: Unter der Annahme, dass der Gradiententeilschritt nach dem Impulsunterschritt ausgeführt wird, sollten wir den Gradiententeilschritt so berechnen, als ob er an der Position vor oder nach dem Impulsunterschritt begonnen hätte?
"Danach" scheint die richtige Antwort zu sein, da im Allgemeinen der Gradient an einem bestimmten Punkt θ
ungefähr in die Richtung von θ
einem Minimum (mit der relativ richtigen Größe) zeigt, während der Gradient an einem anderen Punkt Sie weniger wahrscheinlich zeigt die Richtung von θ
bis zu einem Minimum (mit der relativ richtigen Größe).
Hier ist eine Demonstration (aus dem GIF unten):
- Das Minimum ist, wo sich der Stern befindet, und die Kurven sind Konturlinien . (Eine Erklärung zu Konturlinien und warum sie senkrecht zum Farbverlauf stehen, finden Sie in den Videos 1 und 2 des legendären 3Blue1Brown .)
- Der (lange) lila Pfeil ist der Impulsunterschritt.
- Der transparente rote Pfeil ist der Gradienten-Unterschritt, wenn er vor dem Impuls-Unterschritt beginnt.
- Der schwarze Pfeil ist der Gradienten-Unterschritt, wenn er nach dem Impuls-Unterschritt beginnt.
- CM würde im Ziel des dunkelroten Pfeils landen.
- NAG würde im Ziel des schwarzen Pfeils landen.
Beachten Sie, dass dieses Argument, warum NAG besser ist, unabhängig davon ist, ob der Algorithmus nahe an einem Minimum liegt.
Im Allgemeinen haben sowohl NAG als auch CM häufig das Problem, mehr Schwung zu sammeln, als für sie gut ist. Wenn sie also die Richtung ändern sollten, haben sie eine peinliche "Reaktionszeit". Der von uns erläuterte Vorteil von NAG gegenüber CM verhindert das Problem nicht, sondern macht die "Reaktionszeit" von NAG nur weniger peinlich (aber immer noch peinlich).
Dieses Problem der "Reaktionszeit" wird im GIF von Alec Radford (der in Salvador Dalis Antwort erschien ) wunderbar demonstriert :
ADAGRAD
( Hauptsächlich basierend auf Abschnitt 2.2.2 in ADADELTA: Eine adaptive Lernratenmethode (das ursprüngliche ADADELTA-Papier), da ich finde, dass es viel zugänglicher ist als adaptive subgradiente Methoden für Online-Lernen und stochastische Optimierung (das ursprüngliche ADAGRAD-Papier).)
In SGD ist der Schritt gegeben durch - learning_rate * gradient
, während learning_rate
es sich um einen Hyperparameter handelt.
ADAGRAD hat auch einen learning_rate
Hyperparameter, aber die tatsächliche Lernrate für jede Komponente des Gradienten wird einzeln berechnet.
Die i
-te Komponente des t
-ten Schritts ist gegeben durch:
learning_rate
- --------------------------------------- * gradient_i_t
norm((gradient_i_1, ..., gradient_i_t))
während:
gradient_i_k
ist die i
-te Komponente des Gradienten im k
-ten Schritt
(gradient_i_1, ..., gradient_i_t)
ist ein Vektor mit t
Komponenten. Dies ist (zumindest für mich) nicht intuitiv, dass die Konstruktion eines solchen Vektors sinnvoll ist, aber genau das tut der Algorithmus (konzeptionell).
norm(vector)
ist die eukldische Norm (auch bekannt als l2
Norm) von vector
, die unser intuitiver Begriff der Länge von ist vector
.
- Verwirrenderweise wird in ADAGRAD (wie auch in einigen anderen Methoden) der Ausdruck, der mit
gradient_i_t
(in diesem Fall learning_rate / norm(...)
) multipliziert wird, oft als "Lernrate" bezeichnet (tatsächlich habe ich ihn im vorherigen Absatz "die tatsächliche Lernrate" genannt ). Ich denke, das liegt daran, dass in SGD der learning_rate
Hyperparameter und dieser Ausdruck ein und dasselbe sind.
- In einer realen Implementierung würde dem Nenner eine Konstante hinzugefügt, um eine Division durch Null zu verhindern.
ZB wenn:
- Die
i
-te Komponente des Gradienten im ersten Schritt ist1.15
- Die
i
-te Komponente des Gradienten im zweiten Schritt ist1.35
- Die
i
-te Komponente des Gradienten im dritten Schritt ist0.9
Dann ist die Norm von (1.15, 1.35, 0.9)
die Länge der gelben Linie, die ist :
sqrt(1.15^2 + 1.35^2 + 0.9^2) = 1.989
.
Und so ist die i
-te Komponente des dritten Schritts:- learning_rate / 1.989 * 0.9
Beachten Sie zwei Dinge über die i
-te Komponente des Schritts:
- Es ist proportional zu
learning_rate
.
- Bei den Berechnungen steigt die Norm und damit die Lernrate.
Dies bedeutet, dass ADAGRAD empfindlich auf die Wahl des Hyperparameters reagiert learning_rate
.
Außerdem kann es sein, dass die Schritte nach einiger Zeit so klein werden, dass ADAGRAD praktisch stecken bleibt.
ADADELTA und RMSProp
Aus dem ADADELTA-Papier :
Die in diesem Artikel vorgestellte Idee wurde von ADAGRAD abgeleitet, um die beiden Hauptnachteile der Methode zu verbessern: 1) den kontinuierlichen Rückgang der Lernraten während des Trainings und 2) die Notwendigkeit einer manuell ausgewählten globalen Lernrate.
Das Papier erklärt dann eine Verbesserung, die den ersten Nachteil angehen soll:
Anstatt die Summe der quadratischen Gradienten über die gesamte Zeit zu akkumulieren, haben wir das Fenster vergangener Gradienten, die akkumuliert werden, auf eine feste Größe w
[...] beschränkt. Dies stellt sicher, dass das Lernen auch nach vielen Iterationen von Aktualisierungen weiter Fortschritte macht.
Da das Speichern w
vorheriger quadratischer Gradienten ineffizient ist, implementieren unsere Methoden diese Akkumulation als exponentiell abfallenden Durchschnitt der quadratischen Gradienten.
Mit "exponentiell abfallendem Durchschnitt der quadratischen Gradienten" bedeutet das Papier, dass i
wir für jeden einen gewichteten Durchschnitt aller quadratischen i
-ten Komponenten aller berechneten Gradienten berechnen.
Das Gewicht jeder quadratischen i
Komponente ist größer als das Gewicht der quadratischen i
Komponente im vorherigen Schritt.
Dies ist eine Annäherung an ein Fenster mit einer Größe, w
da die Gewichte in früheren Schritten sehr klein sind.
(Wenn ich an einen exponentiell abfallenden Durchschnitt denke, stelle ich mir gerne die Spur eines Kometen vor , die immer dunkler wird, je weiter sie vom Kometen entfernt ist:
)
Wenn Sie nur diese Änderung an ADAGRAD vornehmen, erhalten Sie RMSProp, eine Methode, die Geoff Hinton in Vorlesung 6e seiner Coursera-Klasse vorgeschlagen hat .
In RMSProp ist die i
-te Komponente des t
-ten Schritts also gegeben durch:
learning_rate
- ------------------------------------------------ * gradient_i_t
sqrt(exp_decay_avg_of_squared_grads_i + epsilon)
während:
epsilon
ist ein Hyperparameter, der eine Division durch Null verhindert.
exp_decay_avg_of_squared_grads_i
ist ein exponentiell abfallender Durchschnitt der quadratischen i
Komponenten aller berechneten Gradienten (einschließlich gradient_i_t
).
Wie bereits erwähnt, zielt ADADELTA auch darauf ab, den learning_rate
Hyperparameter loszuwerden. Es muss also mehr los sein.
In ADADELTA ist die i
-te Komponente des t
-ten Schritts gegeben durch:
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)
- ------------------------------------------------ * gradient_i_t
sqrt(exp_decay_avg_of_squared_grads_i + epsilon)
während exp_decay_avg_of_squared_steps_i
ist ein exponentiell abfallender Durchschnitt der quadratischen i
-ten Komponenten aller berechneten Schritte (bis zum t-1
-ten Schritt).
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)
ist dem Impuls etwas ähnlich und wirkt laut dem Papier "als Beschleunigungsterm". (Das Papier gibt auch einen weiteren Grund an, warum es hinzugefügt wurde, aber meine Antwort ist bereits zu lang. Wenn Sie also neugierig sind, lesen Sie Abschnitt 3.2.)
Adam
(Hauptsächlich basierend auf Adam: Eine Methode zur stochastischen Optimierung , dem Original-Adam-Papier.)
Adam ist die Abkürzung für Adaptive Moment Estimation ( eine Erklärung zum Namen finden Sie in dieser Antwort ).
Die i
-te Komponente des t
-ten Schritts ist gegeben durch:
learning_rate
- ------------------------------------------------ * exp_decay_avg_of_grads_i
sqrt(exp_decay_avg_of_squared_grads_i) + epsilon
während:
exp_decay_avg_of_grads_i
ist ein exponentiell abfallender Durchschnitt der i
-ten Komponenten aller berechneten Gradienten (einschließlich gradient_i_t
).
- Tatsächlich werden beide
exp_decay_avg_of_grads_i
und exp_decay_avg_of_squared_grads_i
auch korrigiert, um eine Tendenz zu berücksichtigen 0
(mehr dazu in Abschnitt 3 des Dokuments und auch in stats.stackexchange ).
Beachten Sie, dass Adam einen exponentiell abfallenden Durchschnitt der i
-ten Komponenten der Gradienten verwendet, wobei die meisten SGD- Methoden die i
-te Komponente des aktuellen Gradienten verwenden. Dies führt dazu, dass sich Adam wie ein "schwerer Ball mit Reibung" verhält, wie in dem Artikel GANs erläutert, die durch eine Zwei-Zeitskalen-Aktualisierungsregel trainiert wurden, die zu einem lokalen Nash-Gleichgewicht konvergieren .
In dieser Antwort erfahren Sie mehr darüber, wie sich Adams impulsartiges Verhalten von dem üblichen impulsartigen Verhalten unterscheidet.