Gradientenabstieg -- Entlang der steilsten Richtung absteigen
Dieses Kapitel implementiert den Gradientenabstieg von Grund auf und verwendet ihn, um eine lineare Regression anzupassen.Dies ist der mathematische Prototyp der gesamten KI-Trainingsschleife.
Konzeptanalyse
Kernformel
\[ \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) \]Die vierstufige Trainingsschleife
Vorwärtspropagation
Ausgabe vorhersagen
Verlust berechnen
Abweichung messen
Gradient berechnen
Backpropagation
Parameter aktualisieren
θ -= η·∇J
Auswirkung der Lernrate
| Lernrate | Wirkung |
|---|---|
| Zu klein | Konvergiert extrem langsam und benötigt viele Schritte |
| Moderat | Konvergiert reibungslos und schnell |
| Zu groß | Schwingt oder divergiert sogar |
Praxisbeispiel
Den Berg an einem nebligen Tag hinabsteigen
An einem nebligen Tag, an dem du deine Hand nicht vor deinem Gesicht sehen kannst, musst du den Berg hinabsteigen. Die Strategie für jeden Schritt:
Fühle die steilste Richtung unter deinen Füßen → Mache einen kleinen Schritt in die steilste Richtung bergab → Halte an → Fühle erneut → Mache einen weiteren kleinen Schritt → Wiederhole.
Das ist Gradientenabstieg: Fühlen = Berechnen des Gradienten, einen kleinen Schritt machen = Parameter aktualisieren, Anhalten = nächste Iteration.
Python-Praxisübung
Beispiel
# Daten generieren y = 3x + 2 + Rauschen
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 3 * X + 2 + np.random.normal(0, 2, 100)
# Gradientenabstieg von Grund auf implementieren
w, b = 0.0, 0.0
lr, n_iter = 0.01, 200
losses = []
for i in range(n_iter):
y_pred = w * X + b
loss = np.mean((y_pred - y) ** 2)
losses.append(loss)
# Gradient
dw = 2 * np.mean((y_pred - y) * X)
db = 2 * np.mean(y_pred - y)
# Aktualisieren
w -= lr * dw
b -= lr * db
print(f"BEISPIEL-Ergebnis des Gradientenabstiegs:")
print(f"Tatsächlich: w=3.0, b=2.0")
print(f"Angepasst: w={w:.4f}, b={b:.4f}")
print(fAnfänglicher Verlust: {losses[0]:.2f} → Endgültiger Verlust: {losses[-1]:.2f})
EXAMPLE 梯度下降结果: 真实: w=3.0, b=2.0 拟合: w=2.9874, b=2.2835 初始损失: 79.69 → 最终损失: 3.91
Verlustabstiegskurve
Anwendungsszenarien in der KI
Der mathematische Prototyp der PyTorch-Trainingsschleife
Alle Trainingsschleifen des Deep Learning folgen demselben Muster, nämlich dem Gradientenabstieg:
① optimizer.zero_grad() → den Gradienten-Cache auf null setzen; ② loss = model(x) → Vorwärtspropagation; ③ loss.backward() → Backpropagation zur Berechnung der Gradienten; ④ optimizer.step() → Parameter-Update θ -= η·∇J durchführen.
Sobald du diese vierstufige Schleife verstehst, verstehst du die zentrale Trainingslogik aller Deep-Learning-Frameworks.
Die Lernrate ist der wichtigste Hyperparameter
Lernrate zu groß → Verlust schwingt oder divergiert sogar; Lernrate zu klein → Konvergenz ist extrem langsam und kann in lokalen Optima stecken bleiben. Lernraten-Scheduling (Step, Cosine Annealing, Warmup) ist eine unverzichtbare Technik für das Training großer Modelle — das GPT-3-Training verwendete eine lineare Warmup- + Cosine-Decay-Strategie.
Abwägung der SGD-Batchgröße
Full-Batch-GD: verwendet alle Daten zur Berechnung exakter Gradienten, langsam aber stabil; SGD (batch_size=1): betrachtet jeweils nur eine Stichprobe, schnell aber die Gradientenschätzungen sind verrauscht; Mini-Batch-SGD: ein Kompromiss (batch_size=32/64/128), mit moderatem Rauschen, was tatsächlich hilft, lokale Optima zu verlassen — das ist die Standardpraxis beim Training in der Praxis.
Grenzen des Gradientenabstiegs
Gradientenabstieg findet Punkte, an denen der Gradient null ist — diese können globale Optima, lokale Optima oder Sattelpunkte sein. In hochdimensionalen Räumen sind Sattelpunkte weitaus häufiger als lokale Optima: Ein Punkt ist in manchen Richtungen ein Minimum und in anderen ein Maximum. Adaptive Optimierer wie Adam können Sattelpunkte effektiver verlassen.
Weitere Erweiterungen