Der Algorithmus für den Gradientenabstieg konvergiert nicht

8

Ich versuche, ein wenig Code für den Gradienten-Abstiegsalgorithmus zu schreiben, der in der Stanford Machine Learning-Vorlesung erläutert wurde ( Vortrag 2 um ca. 25:00 ). Unten ist die Implementierung, die ich zuerst verwendet habe, und ich denke, dass sie korrekt von der Vorlesung kopiert wurde, aber sie konvergiert nicht, wenn ich große Zahlen ( >8 ) zum Trainingssatz hinzufüge.

Ich gebe eine Zahl X ein, und die point (X,X) wird dem Trainingssatz hinzugefügt. Im Moment versuche ich nur, dass es konvergiert zu y=ax+b wo a=1=theta\[1\] und% Code%. Der Trainingssatz ist das Array b=0=theta\[0\] und x , wobei y ein Punkt ist.

%Vor%

einige der Ergebnisse, die ich bekomme: Ich gebe eine Zahl ein, es läuft (x[i],y[i]) einige Male, dann train()

%Vor%

Ein Beispiel dafür, dass es divergiert, nachdem es display() passiert hat:

%Vor%

Ich habe versucht, die vorgeschlagene Lösung hier zu skalieren Schritt und endete mit ähnlichen Ergebnissen. Was mache ich falsch?

    
howardh 16.10.2011, 08:45
quelle

5 Antworten

9

Ihre Implementierung ist gut. Im Allgemeinen kann der stochastische Gradientenabfall abweichen, wenn & agr; zu groß ist. Was Sie mit einem großen Dataset machen würden, ist eine zufällige Stichprobe von vernünftiger Größe, finden Sie α, das Ihnen die besten Ergebnisse gibt, und verwenden Sie es dann für den Rest.

    
Don Reba 16.10.2011, 14:34
quelle
3

Ich habe das gleiche Problem (wenn auch in Java) erlebt, weil meine Lernrate zu groß war.
Kurz gesagt, ich benutzte α = 0.001 und ich musste es auf 0.000001 schieben, um die tatsächliche Konvergenz zu sehen Natürlich sind diese Werte mit Ihrem Datensatz verknüpft.

    
MonoThreaded 03.03.2014 10:05
quelle
1

Wenn Ihre Kostenfunktion sich erhöht oder verringert, haben Sie normalerweise einen zu großen Wert für alpha . Was alpha benutzt du?

Beginne mit einem alpha = 0.001 und schau, ob das konvergiert? Wenn nicht, versuchen Sie verschiedene alphas (0.003, 0.01, 0.03, 0.1, 0.3, 1) und finden Sie eine, die schnell konvergiert.

Die Skalierung der Daten (Normalisierung) hilft Ihnen nicht mit nur einer Funktion (Ihre theta[1] ), da die Normalisierung nur für 2+ -Features (multivariate lineare Regression) gilt.

Denken Sie auch daran, dass Sie für eine kleine Anzahl von Funktionen die normale Gleichung verwenden können, um die richtige Antwort zu erhalten.

    
Robotic Cat 20.10.2011 15:08
quelle
0

Wenn ich Sie richtig verstehe, hat Ihr Trainingssatz am Rand einer Linie nur einen Gradienten ungleich null? Wenn Sie nicht an der Linie beginnen (tatsächlich genau an einem Ihrer Trainingspunkte beginnen), werden Sie die Linie nicht finden. Sie sind immer an einem lokalen Minimum.

    
MartyTPS 16.10.2011 14:22
quelle
0

Verwenden Sie die Backtracking-Zeilensuche, um die Konvergenz zu gewährleisten. Es ist sehr einfach zu implementieren. Siehe Stephen Boyd, Convex Optimization als Referenz. Sie können einige Standard-Alpha, Beta-Werte für die Backtracking-Liniensuche wählen, zum Beispiel 0,3 und 0,8.

    
CSStudent 22.04.2016 06:19
quelle