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.
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.
Wähle eine Antwort und wie sicher du bist.
Antworte, um das Labor freizuschalten.
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.
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 Faktor1 − 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.
Notebook herunterladen (.ipynb). Öffne es in Jupyter oder lade es in Google Colab hoch; fehlende Daten lädt es selbst.
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
NaNheiß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.
War das hilfreich?
Danke! Das hilft uns, besser zu werden.
Mehr im Atlas
Einträge der Enzyklopädie zu den Ideen dieser Lektion: