Gradientenabstieg Python?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

https://en.m.wikipedia.org/wiki/Rosenbrock_function


Muenze3006co 
Fragesteller
 05.07.2021, 22:38

Vielen dank!

0
Muenze3006co 
Fragesteller
 05.07.2021, 22:40
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?

0

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)


Muenze3006co 
Fragesteller
 05.07.2021, 21:08
Sieht nach einer verunglückten Newton-Iteration aus.

ich habe das von YouTube 😂

0
Muenze3006co 
Fragesteller
 05.07.2021, 21:10

Und wie würde man den Code für den Gradientenabstieg ändern?

0
tunik123  05.07.2021, 21:22
@Muenze3006co

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

2

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.

Woher ich das weiß:eigene Erfahrung