Selbst implementierter Gradientenabstieg zum Anpassen einer Geraden

Ohne sklearn Gradientenabstieg von Grund auf verwenden, um \(y = wx + b\) anzupassen, und Schritt für Schritt beobachten, wie der Verlust abnimmt.

Nach Abschluss dieses Falls werden Sie verstehen:Es ist keine geschlossene Lösung erforderlich; solange Sie den Gradienten berechnen können, konvergieren die Parameter automatisch zu den optimalen Werten.


Einführung in den Alltag

Basketball-Wurftraining — jedes Mal den Winkel ein wenig anpassen

Sie stehen hinter der Dreierlinie und werfen. Der erste Wurf geht nach links — passen Sie das nächste Mal ein wenig nach rechts an. Der zweite Wurf geht nach rechts — stellen Sie wieder ein wenig nach links nach. Nach jedem Wurf werfen Sie einen Blick auf die Abweichung und passen Ihre Haltung in die Richtung an, die die Abweichung verringert.

Beim maschinellen Lernen ist das Training genau dasselbe: Nachdem Sie die vorhergesagten Werte berechnet haben, betrachten Sie jedes Mal die Abweichung von den wahren Werten (den Verlust) und passen dann die Parameter in die Richtung an, die die Abweichung verringert (Gradientenabstieg). Wiederholen Sie das ein paar Hundert Mal, und die Haltung sitzt.


Intuitive Vorstellung

Unser Ziel ist es, eine Gerade \(y = wx + b\) zu finden, die so nah wie möglich durch alle Datenpunkte verläuft. \(w\) ist die Steigung, \(b\) ist der Achsenabschnitt, Verlust = der Durchschnitt der quadrierten vertikalen Abstände aller Punkte zur Geraden (MSE).

Wenn wir bei \(w=0, b=0\) beginnen, ist die Gerade flach und der Verlust groß. Der Gradientenabstieg sagt uns: "w sollte erhöht werden, und b sollte ebenfalls erhöht werden", und wir folgen. Nach 100 Wiederholungen verläuft die Gerade durch die Datenpunkte.


Mathematische Definition

\[ L(w, b) = \frac{1}{n}\sum_{i=1}^{n}(wx_i + b - y_i)^2 \] \[ \frac{\partial L}{\partial w} = \frac{2}{n}\sum_{i=1}^{n}(wx_i + b - y_i) \cdot x_i, \quad \frac{\partial L}{\partial b} = \frac{2}{n}\sum_{i=1}^{n}(wx_i + b - y_i) \] \[ w \leftarrow w - \eta \cdot \frac{\partial L}{\partial w}, \quad b \leftarrow b - \eta \cdot \frac{\partial L}{\partial b} \]

Praktische Python-Übung

Beispiel

import numpy as np
np.random.seed(0)

# Erzeuge verrauschte lineare Daten: wahres y = 2x + 1
n = 60
x = np.random.uniform(-3, 3, n)
y = 2 * x + 1 + np.random.randn(60) * 0.8

# Gradientenfunktion manuell herleiten (partielle Ableitungen nach w bzw. b bilden)
def compute_gradients(w, b, x, y):
    y_pred = w * x + b
    error = y_pred - y          # Vorhergesagter Wert - wahrer Wert
    dw = np.mean(2 * error * x) # dL/dw
    db = np.mean(2 * error)     # dL/db
    return dw, db

# Hauptschleife des Gradientenabstiegs
w, b = 0.0, 0.0     # Anfangsparameter absichtlich auf 0 setzen
lr = 0.05
epochs = 100

print("BEISPIEL Gradientenabstiegsprozess (wahre Werte w=2, b=1):")
for epoch in range(epochs):
    y_pred = w * x + b
    loss = np.mean((y_pred - y) ** 2)
    dw, db = compute_gradients(w, b, x, y)
    w -= lr * dw
    b -= lr * db
    if epoch % 20 == 0:
        print(f" Epoche {epoch:3d} Verlust={loss:.4f} w={w:.3f} b={b:.3f}")

print(f"\nBEISPIEL Endstand: w={w:.3f}, b={b:.3f} (wahre Werte w=2, b=1)")
print(f"Angepasste Gerade: y = {w:.2f}x + {b:.2f}")
EXAMPLE 梯度下降过程 (真实值 w=2, b=1):
  epoch   0  loss=13.4515  w=0.790  b=0.057
  epoch  20  loss=0.9165  w=1.868  b=0.785
  epoch  40  loss=0.7316  w=1.949  b=0.918
  epoch  60  loss=0.7083  w=1.971  b=0.956
  epoch  80  loss=0.7055  w=1.977  b=0.967
  epoch 100  loss=0.7052  w=1.979  b=0.970

EXAMPLE 最终: w=1.979, b=0.970  (真实 w=2, b=1)
拟合直线: y = 1.98x + 0.97

Anwendungsszenarien in der KI

Das Code-Gerüst dieses Falls ist die Vorlage für jedes Training im Deep Learning: Vorwärtsberechnung der vorhergesagten Werte → Verlust berechnen → Backpropagation, um Gradienten zu erhalten → Parameter aktualisieren → wiederholen. In PyTorch automatisieren optimizer.step() und loss.backward() diesen Prozess.

Weitere Erweiterungen