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?
perceptron
pytorch
Bai Li
quelle
quelle
Antworten:
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.
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):
Sie können Adam stabiler machen und der tatsächlichen Konvergenz näher kommen, indem Sie die Lernrate verringern. Z.B
lr=1e-5
quelle
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:
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.
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.
quelle