🎤 PyTorch-Karaoke oder wie man aufhört, optimizer.zero_grad() zu vergessen

Viele Anfänger im Deep Learning scheitern nicht an komplexen Netzarchitekturen, sondern an der banalen Boilerplate von PyTorch. Die Reihenfolge der Aufrufe in der Trainingsschleife ist etwas, das man immer wieder googeln muss, bis es sich ins Unterbewusstsein eingebrannt hat.

Vergessen, das Modell in den train()-Modus zu versetzen? Falsche Gewichte wegen Dropout/BatchNorm erhalten.
zero_grad() vergessen? Herzlichen Glückwunsch, die Gradienten akkumulieren sich, das Training geht den Bach runter.
step() vor backward() gesetzt? Naja, ihr wisst schon.

Bin auf ein Video gestoßen, das gleichzeitig zwei Gefühle auslöst: extremen Fremdscham und Respekt.
Ein Typ in Unterhosen mit Mikrofon mitten im Chaos hat einfach die 5 Schritte der Backpropagation auf eine Melodie gelegt, die man nicht mehr aus dem Kopf bekommt.
Als ob das besser funktioniert als 10 Stunden langweilige Vorträge von Experten, die von Folien ablesen.

Für die, die nicht mitbekommen haben, erinnere ich an die einzig richtige Reihenfolge, die man sich ins Unterbewusstsein tätowieren sollte (oder das Lied lernen):

1️⃣ model.train() — Modell in den Trainingsmodus versetzen.
2️⃣ y_pred = model(x) — Forward Pass.
3️⃣ loss = loss_fn(y_pred, y) — Berechnen, wie sehr wir falsch lagen.
4️⃣ optimizer.zero_grad() — Gradienten vor dem nächsten Schritt zurücksetzen, sonst akkumulieren sie und ihr fliegt ins All.
5️⃣ loss.backward() — Gradienten berechnen (Rückwärtspropagation).
6️⃣ optimizer.step() — Schritt mit dem Optimierer machen.

Wünschte mir noch eine Version für TensorFlow, aber da müsste man wohl eine Oper in drei Akten schreiben, nur um Variablen zu initialisieren 🌚

#nur_zum_spaß