Zur Vorbereitung schauen wir uns in dieser Lehreinheit an, wie man mit PyTorch Variablen optimieren kann.
Vorbereitung 1: Optimierung mit PyTorch
Arbeiten Sie die folgenden offiziellen Guides durch:
Praxisaufgabe 1: Testfunktionen für Optimierer
PyTorch implementiert bereits jede Menge Optimierer vor: (torch.optim). Um einen Einblick zu bekommen was für mögliche Stärken und Schwächen eine Wahl eines Optimierers mit sich bringen kann, gibt es sog. künstliche Landschaften.
Wiki: Testfunctions for Optimization
Aufgaben:
Praxisaufgabe 2: Adam Optimizer
In der vorigen Aufgabe haben wir ein paar Optimizer an einem einfachen Beispiel getestet & wir haben den Effekt einer Learning Rate-Änderung untersucht. In dieser Aufgabe möchten wir die Beobachtungen einer
aktuellen Arbeit nachvollziehen, nämlich das der Adam-Optimizer selbstständig Learning Rate-Änderungen unternimmt. (Also, dass die Magnitude der angewandten Änderungen sich über die Zeit ändert.) Konkret werden wir zuerst die Funktion eines Optimierers nachbauen, sodass ihre Implementierung im Prinzip anstelle der vorgefertigten
torch.optim
Klasse verwendet werden kann. Danach untersuchen wir das Verhalten dieses Optimierers bei zufälligen Gradienten.
Ein Optimierer aus torch.optim
benötigt drei Methoden (siehe "Learning PyTorch with Examples"):
- die Initialisierung (zur Speicherung aller Hyperparameter) und insbesondere der zu optimierenden Parameter. Diese können inplace verändert werden
optimizer.zero_grad()
, um Gradienteninformation zu löschenoptimizer.step()
, um Parameter mithilfe der internen Gradienten zu verändern. Im einfachsten Fall werden diese gewichtet mit der Learning addiert.
Aufgaben:
- (Optional): Implementieren Sie den Adam-Optimierer nach & vergleichen Sie das Ergebnis Ihrer mit dem der vorgefertigten Klasse
torch.optim.Adam
. Die Gradienten \(g_t\) erhalten Sie wie vorher auch durch loss.backward()
und werden in den Parameter-Attributen param.grad
gespeichert. - Als nächstes führen wir folgendes Experiment durch:
- Wir starten mit einem Parametervektor aus \(\mathbb{R}^d\) und weisen diesem in jeweils \(n\) Schritten zufällige Normalverteilte Gradienten zu.
- In jedem Schritt wenden wir Adam an und messen die Magnitude der tatsächlichen Veränderung (also die Länge der Distanz \(\theta_t - \theta_{t-1}\).
- Plotten Sie diese Größe für Adam und SGD für etwa \(1000\) zufällige Optimierungsschritte und verschiedene Hyperparameter.
- Können Sie die Beobachtung des Papers bestätigen, dass Adam selbstständig Learning Rate Änderungen durchführt?