Seltsames Verhalten mit Adam Optimizer beim zu langen Training

11

Ich versuche, ein einzelnes Perzeptron (1000 Eingabeeinheiten, 1 Ausgabe, keine versteckten Ebenen) auf 64 zufällig generierten Datenpunkten zu trainieren. Ich verwende Pytorch mit dem Adam-Optimierer:

import torch
from torch.autograd import Variable

torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1

x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))

model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
  y_pred = model(x)
  loss = loss_fn(y_pred, y)

  print(t, loss.data[0])

  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

Zunächst nimmt der Verlust erwartungsgemäß schnell ab:

(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)

Bei etwa 300 Iterationen erreicht der Fehler nahe Null:

(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)

Dies dauert einige tausend Iterationen. Nach zu langem Training steigt der Fehler jedoch wieder an:

(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)

Warum passiert das?

Bai Li
quelle
Ich denke nicht, dass Überanpassung es erklärt - der Trainingsverlust steigt, nicht der Validierungsverlust. Dies geschieht beispielsweise nicht bei Verwendung von SGD, sondern nur bei Adam.
Bai Li
Das Modell hat 1000 Parameter und es gibt nur 1 Datenpunkt, daher sollte das Modell genau zu den Daten passen und der Verlust sollte Null sein.
Bai Li
Oh, tut mir leid, du hast recht. Es gibt 64 Datenpunkte.
Bai Li
Es gibt 64 Datenpunkte (dh Einschränkungen) und 1000 Parameter, sodass es möglich ist, Auswahlmöglichkeiten für die Parameter zu finden, sodass der Fehler Null ist (und dies ist analytisch einfach durchzuführen). Meine Frage ist, warum Adam das nicht findet.
Bai Li
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Bai Li

Antworten:

19

Diese kleine Instabilität am Ende der Konvergenz ist ein Merkmal von Adam (und RMSProp), da es die mittleren Gradientengrößen über die letzten Schritte schätzt und durch diese dividiert.

10- -1010- -5

Dies macht Adam für Ihr Problem weniger stabil und schlechter als einen grundlegenderen Gradientenabstieg, vorausgesetzt, Sie möchten so numerisch nahe an den Verlust Null heranreichen, wie es die Berechnungen für Ihr Problem zulassen.

In der Praxis bei Deep-Learning-Problemen kommt man der Konvergenz nicht so nahe (und bei einigen Regularisierungstechniken wie dem frühen Stoppen möchte man sowieso nicht), so dass es normalerweise kein praktisches Problem für die Arten von Problemen ist, die auftreten Adam wurde entworfen für.

Sie können dies tatsächlich für RMSProp in einem Vergleich verschiedener Optimierer sehen (RMSProp ist die schwarze Linie - beobachten Sie die letzten Schritte, sobald sie das Ziel erreichen):

Geben Sie hier die Bildbeschreibung ein

Sie können Adam stabiler machen und der tatsächlichen Konvergenz näher kommen, indem Sie die Lernrate verringern. Z.B

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

lr=1e-510- -7

Neil Slater
quelle
Dies ist eine spektakuläre Visualisierung, Neil. Was sind die tatsächlichen Abmessungen? Was bedeuten x und y? Sind die Frames Delta t oder n Epochen pro Frame? Ich vermute, der Stern ist das globale Optimum in einer topografischen Darstellung der Disparität (Fehler) in Bezug auf zwei ausgewählte Parameter. Ist meine Vermutung richtig?
Douglas Daseeco
Es ist nicht meine Visualisierung, Sie werden es an vielen Stellen finden. Die Dimensionen sind willkürliche Einheiten von Eingabeparametern für eine Testfunktion, und das Diagramm zeigt Konturlinien für diese Funktion (wiederum in willkürlichen Einheiten, vermutlich so skaliert, dass NN in Ordnung funktioniert). Jeder Rahmen ist ein Schritt zur Gewichtsaktualisierung. Es ist wahrscheinlich gleichbedeutend mit einem Mini-Batch-Update, und aufgrund des Verhaltens von SGD erwarte ich, dass es tatsächlich genau mit dem wahren Gradienten der Testfunktion gelöst wird - dh es gibt keinen Datensatz oder keine Stichprobe.
Neil Slater
1

Der Grund ist genau wie in der anderen Antwort erwähnt, mit einem großartigen Vorschlag, eine kleinere Lernrate zu verwenden, um dieses Problem bei kleinen Gradienten zu vermeiden.

Ich kann mir ein paar Ansätze vorstellen:

  1. Sie können die Farbverläufe mit einer Ober- / Untergrenze abschneiden, dies garantiert jedoch keine Konvergenz und kann zu einem Trainingsstillstand führen, indem Sie in einigen lokalen Minima gefangen werden und niemals aus dieser herauskommen.

  2. Trainiere mit einer höheren Losgröße, mehr Epochen und einer verfallenen Lernrate. Jetzt habe ich keinen praktischen Beweis dafür, dass das Erhöhen einer Chargengröße zu besseren Verläufen führt, aber nach dem, was ich bei ähnlichen Problemen beobachtet hatte, hat dies fast immer geholfen.

Ich bin sicher, dass es andere Methoden gibt (wie zyklische Lernrate usw.), die versuchen, basierend auf Statistiken eine optimale Lernrate zu finden.

Sanjay Krishna
quelle