Gradientenabstieg Python?
def function(x):
return x**2
def ableitung_function(x):
return 2*x
x = 20
epochen = 15
for i in range(epochen):
ableitung = ableitung_function(x)
print(":____:")
print(ableitung)
print(x)
print(":____:")
lernrate = 0.1
x_new = x-(lernrate*ableitung)
x = x_new
Ist mein Gradientenabstieg korrekt? Meiner Meinung nach liefert es gute Ergebnisse, aber wenn ich eine Funktion wie z.b. x^3 und die Ableitung 3*x^2 benutze läuft alles falsch und wo brauche ich meine Funktion 'function'?
LG
4 Antworten
Der Code ist schon korrekt, die Schrittweite aber viel zu klein bei so einem Startwert (kannst dir ja die spaßeshalber mal dir Sprungweite mitloggen). Die eigentliche Funktion brauchst du in der Tat nur, wenn du die eigentlichen Funktionswerte berechnen willst.
Plotte dir doch mal f(x)=x^3 und schau dir an, ob du da zu einem globalen Minimum konvergieren würdest.
Ein sinnvoller Benchmark (vorausgesetzt du portierst deinen GD auf mehrere Dimensionen) wäre bspw die Rosenbrock Funktion.
Die eigentliche Funktion brauchst du in der Tat nur, wenn du die eigentlichen Funktionswerte berechnen willst.
Die aber unwichtig für den Gradientenabstieg sind oder?
x^3 ist nicht convex und deswegen wirst du kein globales minimum damit finden - x wird immer kleiner werden und das immer schnelller. Die einzige ausnahme ist, wenn x in in einem epoch genau 0 ist, denn dann ist auch die ableitung 0.
Was ist denn das für ein Algorithmus? Sieht nach einer verunglückten Newton-Iteration aus.
https://de.wikipedia.org/wiki/Newtonverfahren
Dort findet sich auch die richtige Formel:
x_new = x - funktion(x) / ableitung_funktion(x)
Am einfachste ist es,
x = x - function(x) / ableitung_function(x)
als einen Iterationsschritt hinzuschreiben. Oder etwas ausführlicher
for i in range(epochen):
ableitung = ableitung_function(x)
funktion = function(x)
print(":____:")
print(funktion)
print(":____:")
print(ableitung)
print(x)
print(":____:")
x_new = x - funktion / ableitung
x = x_new
function(x) ist eine Funktion, funktion ist eine Variable
Sieht nach einer verunglückten Newton-Iteration aus.
ich habe das von YouTube 😂
x ist zu hoch, lernrate zu hoch, epochen zu klein.
Nimm dir mal das Buch "Neuronale Netze selbst programmieren" von Tariq Rashid.
Da wird ein kleines Modell für die MNIST-Daten from scratch entwickelt.
Sofern ich dein Ansinnen richtig verstanden habe.
Und wie würde man den Code für den Gradientenabstieg ändern?