Gradientenabstieg Python?

4 Antworten

Vom Beitragsersteller 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


verreisterNutzer  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)


verreisterNutzer  05.07.2021, 21:10

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

0
tunik123  05.07.2021, 21:22
@verreisterNutzer

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
verreisterNutzer  05.07.2021, 21:08
Sieht nach einer verunglückten Newton-Iteration aus.

ich habe das von YouTube 😂

0

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