ML Atlas

Machine Learning von Grund auf · Lektion 1.6 · 7 von 33 fertigen Lektionen · 10 Min.

Gradientenabstieg: Lernen in kleinen Schritten

Kurz gesagt

Der Gradientenabstieg findet gute Parameter, indem er auf dem Fehler immer wieder bergab geht. Die Lernrate entscheidet über Erfolg oder Absturz.

Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Aus Lektion 1.5: Lineare Regression: eine Gerade anpassen Die Steigung ist auf null festgelegt. Welcher Achsenabschnitt liefert den kleinsten MSE?

Antwort anzeigen

Richtige Antwort: Der Mittelwert aller Zielwerte im Datensatz

Bei einer waagerechten Geraden ist der quadratische Fehler am Mittelwert am kleinsten, deshalb ist der Mittelwert die natürliche Baseline in der Regression.

Aus Lektion 1.4: Nächste Nachbarn: das einfachste Modell Warum standardisiert man die Messwerte meist vor kNN?

Antwort anzeigen

Richtige Antwort: Weil ein Messwert in großen Einheiten, etwa Gramm, die anderen übertönt

Der Abstand addiert die Unterschiede der Messwerte. Masse in Tausenden Gramm überdeckt den Schnabel in Millimetern: mit vier Messwerten 76,7 % ohne Skalierung und 96,1 % nach dem Standardisieren.

In der letzten Lektion hat uns eine Formel die beste Gerade auf einen Schlag geliefert. Ein neuronales Netz mit Millionen von Gewichten hat aber keine solche Formel. Wie kann ein Computer gute Werte für Millionen von Stellschrauben finden, wenn ihm niemand sagen kann, wo die beste Einstellung liegt? Die Antwort ist fast peinlich einfach: Er ertastet, wo es bergab geht, und macht einen kleinen Schritt. Dann noch einen. Probier es zuerst selbst aus, bevor du die Erklärung liest.

Erst vorhersagen, dann prüfen Zur Wahl stehen vier Lernraten (Schrittlängen): 0,01; 0,1; 0,8 und 1,1. Welche liefert nach 5 Schritten den niedrigsten Verlust (die Zahl, die sagt, wie sehr das Modell danebenliegt)?
Wie sicher bist du?

Interaktives Labor

Dieses interaktive Labor läuft im Browser mit aktiviertem JavaScript. Der Text drumherum beschreibt, was es zeigt.

Antwort anzeigen

Richtige Antwort: 0,8

Nach 5 Schritten beträgt der Verlust 24468 (η = 0,01), 6595 (0,1), 4043 (0,8) und 159823 (1,1); das Minimum liegt bei 3890. Bei 0,8 ist der Schritt groß, springt aber noch nicht über das Tal hinaus. Bei 1,1 überspringt jeder Schritt es so weit, dass der Verlust wächst.

Probier es aus

  • Wähl eine kleine Lernrate und drück ein paarmal auf Schritt. Beobachte, wie sich die Gerade bei jedem Schritt ein wenig bewegt und die Verlustkurve langsam sinkt.
  • Drück auf Ausführen und lass es laufen. Landet die Gerade nahe an der Gerade nach der Methode der kleinsten Quadrate aus der vorigen Lektion?
  • Fang mit der größten Lernrate neu an und drück wieder auf „Schritt“. Sieh dir die Verlustkurve an: Statt zu fallen, steigt sie, und die Gerade schwingt wild hin und her. Das ist Divergenz.
  • Probier die Lernraten dazwischen aus und finde die größte, bei der der Verlust noch gleichmäßig fällt.

Die Idee in einfachen Worten

Stell dir vor, du stehst in dichtem Nebel an einem Hang. Du willst ins Tal, siehst aber nur einen Meter weit. Eine vernünftige Strategie: mit den Füßen den Boden abtasten, die Richtung finden, in der es am steilsten abwärts geht, einen Schritt dorthin machen und das wiederholen. Die ganze Landschaft siehst du nie, und trotzdem kommst du Schritt für Schritt tiefer.

Beim maschinellen Lernen ist die „Landschaft“ der Fehler des Modells. Jedes mögliche Paar aus Steigung und Achsenabschnitt ist ein Ort auf der Karte, und die Höhe an diesem Ort ist die mittlere quadratische Abweichung aus Lektion 3. Der Talboden ist die beste Gerade. Der Gradientenabstieg ist der Spaziergang im Nebel: irgendwo anfangen, messen, in welche Richtung der Fehler sinkt, die Parameter ein wenig in diese Richtung verschieben und das wiederholen, bis der Fehler nicht mehr fällt.

Warum es funktioniert

Die Richtung des steilsten Anstiegs einer Funktion gibt ihr Gradient an – eine Liste von Ableitungen, eine pro Parameter, die sagt, wie stark der Fehler wachsen würde, wenn man diesen Parameter ein Stück erhöht. Geh in die Gegenrichtung, und der Fehler sinkt. Für jeden Parameter w sieht ein Schritt so aus:

w ← w − η · ∂L/∂w

Dabei ist L der Verlust (der Fehler, den wir minimieren), ∂L/∂w gibt an, wie stark der Verlust auf w reagiert, und η (der griechische Buchstabe Eta) ist die Lernrate, die die Schrittgröße festlegt. Wo der Hang steil ist, werden die Schritte groß; nahe am Boden wird der Hang flacher, und die Schritte schrumpfen von selbst.

Alles hängt von der Lernrate ab. Ist sie zu klein, ist jeder Schritt winzig, und der Weg dauert ewig. Ist sie genau richtig, fällt der Fehler schnell und pendelt sich nahe dem Minimum ein. Ist sie zu groß, schießt jeder Schritt über das Tal hinaus und landet höher am gegenüberliegenden Hang; der nächste Schritt schießt noch weiter hinaus, und der Fehler wächst ohne Grenze. Das nennt man Divergenz, und sie ist der häufigste Grund, warum ein Trainingslauf „explodiert“.

Das Schöne an der Methode: Sie braucht nur eines, nämlich den Gradienten an der aktuellen Position. Eine Formel für die Lösung braucht sie nicht, und sie funktioniert für zwei Parameter genauso wie für zwei Milliarden. Deshalb ist sie der Motor hinter fast jedem neuronalen Netz, auch hinter den Sprachmodellen aus Lektion 12. In der Praxis schätzt man den Gradienten meist auf einem kleinen zufälligen Stapel (Mini-Batch) von Beispielen statt auf allen; das macht jeden Schritt billiger und verrauschter, funktioniert aber erstaunlich gut.

Häufiger Fehler

Wenn der Verlust plötzlich in die Höhe schießt oder zu „NaN“ (Not a Number, keine Zahl) wird, vermuten Anfänger oft einen Fehler im Code. Viel häufiger ist schlicht die Lernrate zu groß. Die Abhilfe ist, sie zu senken, nicht das Modell neu zu schreiben. Der umgekehrte Fehler ist weniger sichtbar: eine Lernrate, die so klein ist, dass der Verlust beim Trainingsende noch fällt, sodass das Modell schlechter aussieht, als es sein könnte. Eine verwandte Falle sind Merkmale mit sehr unterschiedlichen Skalen – etwa das Alter in Jahren neben dem Einkommen in Euro –, die das Tal in eine lange, enge Schlucht verwandeln, in der keine einzelne Lernrate für alle Richtungen passt. Die Merkmale vorher zu skalieren, macht den Weg viel leichter.

Jetzt haben wir beide Hälften des Lernrezepts: eine Bewertung und einen Weg, sie zu verbessern. In der nächsten Lektion setzen wir sie für eine neue Art von Frage ein – nicht „wie viel?“, sondern „welches?“.

Quiz

Drei Fragen zur Selbstkontrolle. Wähle eine Antwort oder klappe die Lösung unter der Frage auf. Mit der Tastatur: Pfeiltasten wählen, Enter oder Leertaste bestätigt.

1. Was sagt der Gradient dem Algorithmus bei jedem Schritt?
Antwort anzeigen

Richtige Antwort: In welche Richtung und wie steil der Verlust gerade ansteigt

Der Gradient zeigt bergauf, also senkt ein Schritt gegen ihn den Verlust, aber er beschreibt nur die Umgebung des aktuellen Punkts.

2. Der Verlust steigt mit jedem Schritt weiter. Was ist die wahrscheinlichste Ursache?
Antwort anzeigen

Richtige Antwort: Die Lernrate ist zu groß, sodass jeder Schritt über das Minimum hinausschießt

Mit zu großen Schritten springen die Parameter jedes Mal über das Tal hinweg auf einen höheren Punkt, und der Fehler wächst.

3. Warum nutzt man für neuronale Netze den Gradientenabstieg statt einer exakten Formel?
Antwort anzeigen

Richtige Antwort: Meist gibt es keine Formel für die besten Parameter, den Gradienten kann man aber berechnen

Der Gradientenabstieg braucht nur die Steigung des Verlusts am aktuellen Punkt, und die ist selbst für Modelle mit Milliarden von Parametern verfügbar.

Das Wichtigste

  • Der Gradientenabstieg verbessert Parameter, indem er immer wieder gegen den Gradienten des Verlusts schreitet.
  • Die Lernrate bestimmt die Schrittgröße: zu klein ist langsam, zu groß divergiert.
  • Ein explodierender Verlust bedeutet meist eine zu hohe Lernrate, keinen kaputten Code.
  • Die Methode braucht nur den Gradienten und skaliert daher von zwei Parametern bis zu Milliarden.

Tiefer: Formel, Code, Praxis

Die Mathematik

Nimm die Gerade ŷ = b + w·z mit dem Verlust L(w, b) = (1/n) · Σ (yᵢ − b − w·zᵢ)². Sein Gradient ist ∂L/∂w = −2 · mean(r · z) und ∂L/∂b = −2 · mean(r), wobei r = y − ŷ die Residuen sind. Ein Schritt lautet w ← w − η·∂L/∂w und b ← b − η·∂L/∂b.

Ist das Merkmal standardisiert (mean(z) = 0, mean(z²) = 1), stören sich die beiden Richtungen nicht. Jeder Schritt verkleinert dann den Abstand zum besten w und b um den Faktor 1 − 2η.

  • 0 < η < 1: Der Abstand schrumpft, und der Verlust fällt bis zum Minimum. Je näher η an 0,5 liegt, desto schneller.
  • η > 1: Der Faktor 1 − 2η liegt unter −1, sein Betrag also über 1, jeder Schritt schießt weiter über das Ziel hinaus, und der Verlust wächst ohne Grenze.
  • Ohne Standardisierung hängt der sichere Bereich von η von der Skala des Merkmals ab, ein Wert passt also nicht mehr für jede Richtung.
Im Code (Python)

Der Verlust des Labs nach 5 Schritten ab w = b = 0, für vier Lernraten, auf standardisiertem BMI (Diabetes-Daten):

import numpy as np
from sklearn.datasets import load_diabetes

X, y = load_diabetes(return_X_y=True, as_frame=True, scaled=False)
bmi = X["bmi"].to_numpy()
z = (bmi - bmi.mean()) / bmi.std()  # standardisierter BMI, wie im Lab
mse = lambda w, b: np.mean((y - (b + w * z)) ** 2)
for lr in [0.01, 0.1, 0.8, 1.1]:
    w, b = 0.0, 0.0  # Start im Ursprung
    for _ in range(5):  # fünf Full-Batch-Schritte
        r = y - (b + w * z)
        w, b = w + lr * 2 * np.mean(r * z), b + lr * 2 * np.mean(r)
    print(f"lr {lr}: loss after 5 steps {mse(w, b):.0f}")
w_best, b_best = np.polyfit(z, y, 1)
print(f"minimum: {mse(w_best, b_best):.0f}")

Ausgabe

lr 0.01: loss after 5 steps 24468
lr 0.1: loss after 5 steps 6595
lr 0.8: loss after 5 steps 4043
lr 1.1: loss after 5 steps 159823
minimum: 3890

Das Minimum, 3890, ist der MSE der Geraden der kleinsten Quadrate aus Lektion 3. Bei lr = 0.8 beträgt der Faktor |1 − 1.6| = 0.6 pro Schritt und schlägt damit 0,9 bei lr = 0.1. Bei lr = 1.1 sind es 1,2, der Verlust wächst also.

Für die Praxis
  • Standardisiere numerische Merkmale vor dem Gradientenabstieg. So werden die Höhenlinien der Verlustfunktion runder, und eine Lernrate passt für alle Richtungen.
  • Zeichne den Verlust immer gegen den Schritt. Ein glattes Fallen ist gesund. Ein Anstieg oder NaN heißt fast immer, dass die Lernrate zu groß ist: Verkleinere sie um den Faktor 10 und versuche es erneut.
  • Höre nicht nur nach einer festen Schrittzahl auf. Stoppe auch, wenn sich der Verlust kaum noch ändert, und prüfe, ob er wirklich flach geworden ist und nicht nur dahinkriecht.
  • Wenn du einen Gradienten von Hand schreibst, vergleiche ihn an ein paar Punkten mit einer Finite-Differenzen-Schätzung, bevor du einem langen Lauf traust.
  • Wenn es eine geschlossene Form gibt, wie bei der linearen Regression, nutze sie. Der Gradientenabstieg verdient sich seinen Platz bei Modellen, für die es keine solche Formel gibt.

Mehr im Atlas

Einträge der Enzyklopädie zu den Ideen dieser Lektion: