Das Ziel ist simpel: Finde das Minimum einer Funktion. Stell dir vor, du stehst bei dichtem Nebel auf einem Berg und willst ins Tal. Du ertastest mit dem Fuß das steilste Gefälle und machst einen Schritt in die entgegengesetzte Richtung (bergab). Genau das macht der Algorithmus mathematisch.
Die Mathematik
Nehmen wir als Zielfunktion ein Polynom vierten Grades. Das ist etwas komplexer als eine simple Parabel und besitzt mehrere Extrema.
$$f(x) = \frac{1}{4}x^4 - x^3 - 2x^2 + 2$$Um das Gefälle an einem bestimmten Punkt $x$ zu berechnen, bilden wir die erste Ableitung:
$$f'(x) = x^3 - 3x^2 - 4x$$Die Mechanik des Gradientenabstiegs liegt in der Update-Regel. Wir starten bei einem zufälligen $x_0$ und aktualisieren den Wert iterativ:
$$x_{n+1} = x_n - \gamma \cdot f'(x_n)$$Der Faktor $\gamma$ (Gamma) ist die Lernrate (Learning Rate). Sie bestimmt die Schrittweite. Ist sie zu groß, schießen wir über das Tal hinaus. Ist sie zu klein, braucht der Algorithmus extrem lange, um anzukommen.
Die Implementierung in Python
Der theoretische Unterbau lässt sich direkt in ein kurzes Python-Skript übersetzen. Wir starten bei einem Wert von $x = 6$ und tasten uns an das Minimum heran.
def f(x):
return 0.25 * x**4 - x**3 - 2 * x**2 + 2
def df(x):
return x**3 - 3 * x**2 - 4 * x
def gradient_descent(start_x, learning_rate, epochs):
x = start_x
for i in range(epochs):
gradient = df(x)
x = x - learning_rate * gradient
# Logge jeden 5. Schritt zur Kontrolle
if i % 5 == 0:
print(f"Epoche {i:2d} | x = {x:.5f} | f(x) = {f(x):.5f}")
return xDOWNLOAD: Vollständiges Skript
Wenn du dieses Skript ausführst, siehst du, wie sich der Wert für x iterativ der 4 nähert. Rechnest du die Nullstellen der Ableitung analytisch nach ($x^3 - 3x^2 - 4x = 0$), bestätigst du exakt dieses Ergebnis: Bei $x = 4$ liegt das gesuchte Minimum.
Starte Gradientenabstieg bei x = 6.0
----------------------------------------
Epoche 0 | x = 5.16000 | f(x) = -11.40865
Epoche 5 | x = 4.24923 | f(x) = -29.33141
Epoche 10 | x = 4.07437 | f(x) = -29.94345
Epoche 15 | x = 4.02369 | f(x) = -29.99435
Epoche 20 | x = 4.00770 | f(x) = -29.99941
Epoche 25 | x = 4.00251 | f(x) = -29.99994
Epoche 30 | x = 4.00082 | f(x) = -29.99999
----------------------------------------
Globales Minimum gefunden bei x ≈ 4.00034Schatzsuche
Um das Verfahren zu verdeutlichen, habe ich ein kleines Spiel vorbereitet, das im Brwoser läuft.
Buchempfehlung zum Weiterlesen
Dieser Artikel basiert in Teilen auf meinen Notizen zu dem hervorragenden Buch von Andrew W. Trask. Wer Deep Learning nicht nur anwenden, sondern die Mechanik dahinter wirklich von Grund auf verstehen möchte (und das ganz ohne schwere Mathematik oder Blackbox-Frameworks), dem sei dieses Buch wärmstens ans Herz gelegt:
Andrew W. Trask Neuronale Netze und Deep Learning kapieren: Der einfache Praxiseinstieg mit Beispielen in Python
(Originaltitel: Grokking Deep Learning) mitp-Verlag, ISBN: 978-3-7475-0015-6

Kommentare