Ableitungen und Gradienten
Die Ableitung sagt, wie sich eine Größe ändert, wenn man an einer Schraube dreht. Warum das der ganze Lernvorgang eines neuronalen Netzes ist.
Die Idee
Stellen Sie sich einen Mischpultregler vor. Sie schieben ihn ein Stück nach oben und hören, ob es besser klingt. Die Ableitung ist genau diese Beobachtung, nur exakt: wie viel besser oder schlechter wird das Ergebnis je Millimeter Reglerweg.
Ein Modell hat keine zwölf Regler, sondern Milliarden. Der Gradient ist die Liste aller dieser Empfindlichkeiten auf einmal.
Wozu es gut ist
Lernen heißt in der KI nichts anderes als: alle Regler ein winziges Stück in die Richtung schieben, die das Ergebnis verbessert, und das einige Millionen Mal wiederholen. Ohne Ableitung wüsste man nicht, in welche Richtung.
Die drei Begriffe
| Begriff | Was er ist | Wo er vorkommt |
|---|---|---|
| Ableitung | Änderungsrate einer Funktion mit einer Variablen | Lernrate, Aktivierungsfunktionen |
| Partielle Ableitung | Änderungsrate nach einer von vielen Variablen | Einfluss eines einzelnen Gewichts |
| Gradient | Der Vektor aller partiellen Ableitungen | Der Schritt im Training |
Was man mit numerischer Ableitung prüfen kann
Vor der ersten eigenen Schicht lohnt ein Gradient-Check: die analytische Ableitung gegen eine numerische Näherung halten.
import numpy as np
def f(w):
return float((w ** 2).sum()) # Verlust: Summe der Quadrate
def grad_analytic(w):
return 2 * w # von Hand abgeleitet
def grad_numeric(w, eps=1e-5):
out = np.zeros_like(w)
for i in range(w.size):
up, down = w.copy(), w.copy()
up[i] += eps; down[i] -= eps
# Zentraler Differenzenquotient: Fehler O(eps^2) statt O(eps).
out[i] = (f(up) - f(down)) / (2 * eps)
return out
w = np.array([1.5, -2.0, 0.25])
print(np.abs(grad_analytic(w) - grad_numeric(w)).max()) # ~1e-10Typische Fehler
- Zu großes
epsbeim numerischen Check: dann dominiert der Näherungsfehler. - Zu kleines
eps: dann dominiert die Auslöschung in Gleitkomma. - Den Gradienten nach dem Optimiererschritt lesen statt davor.
- Vergessen, den Gradienten zwischen zwei Durchläufen auf null zu setzen.
Die Kettenregel
Aus dieser Produktform folgt unmittelbar das zentrale Problem tiefer Netze.
Liegt jeder Faktor im Mittel bei 0,8, ist das Produkt über 50 Schichten
0,8^50 ≈ 1,4e-5: der Gradient verschwindet. Liegt er bei 1,2, ist es
1,2^50 ≈ 9100: er explodiert.
Durchgerechnet
Netz aus zwei Schichten, a = σ(w₁x), y = w₂a, Verlust L = (y − t)².
Mit x = 1, w₁ = 0,5, w₂ = 2, t = 1 und σ als Sigmoid:
z = w₁x = 0,5,a = σ(0,5) = 0,6225y = w₂a = 1,2450,L = (1,2450 − 1)² = 0,0600∂L/∂y = 2(y − t) = 0,4900∂L/∂w₂ = ∂L/∂y · a = 0,4900 × 0,6225 = 0,3050∂L/∂a = ∂L/∂y · w₂ = 0,4900 × 2 = 0,9800σ'(z) = a(1 − a) = 0,6225 × 0,3775 = 0,2350∂L/∂w₁ = ∂L/∂a · σ'(z) · x = 0,9800 × 0,2350 × 1 = 0,2303
Der Gradient der ersten Schicht ist bereits um den Faktor σ'(z) = 0,235
gedämpft. Nach zehn solchen Schichten wäre er auf 0,235^10 ≈ 5e-7 gefallen.
Genau deshalb ist heute ReLU statt Sigmoid der Normalfall, siehe
Aktivierungsfunktionen.
Aufwand
Automatische Differenzierung im Rückwärtsmodus kostet in der Größenordnung das Doppelte des Vorwärtsdurchlaufs, benötigt aber Speicher für alle Zwischenaktivierungen. Für ein Transformer-Modell ist dieser Aktivierungsspeicher oft größer als die Gewichte selbst: der Grund für Gradient Checkpointing, bei dem Zwischenwerte verworfen und im Rückwärtsweg neu berechnet werden.
Passende Kurse und Quellen
Mathematics for Machine Learning
Genau die Mathematik, die maschinelles Lernen braucht, ohne den Rest. Lineare Algebra, Analysis und Wahrscheinlichkeit in einem Band, frei als PDF.
Für alle, die genau die Mathematik wollen, die maschinelles Lernen braucht, und nicht mehr.