Ist meine Umsetzung der stochastic gradient descent korrekt?
Ich versuche mich zu entwickeln stochastic gradient descent, aber ich weiß nicht, ob es 100% korrekt ist.
- Die Kosten erzeugt, die durch meine stochastic gradient descent Algorithmus ist manchmal sehr weit von dem durch Sie erzeugten FMINUC oder Batch gradient descent.
- während batch gradient descent Kosten konvergieren, wenn ich ein learning rate alpha von 0,2, bin ich gezwungen, mich zu setzen, einen Lern-rate-alpha 0,0001 für meine Stochastik-Umsetzung für es nicht zu divergieren. Ist das normal?
Hier sind einige Ergebnisse, die ich mit einem Trainingssatz von 10.000 Elemente und num_iter = 100 oder 500
FMINUC :
Iteration #100 | Cost: 5.147056e-001
BACTH GRADIENT DESCENT 500 ITER
Iteration #500 - Cost = 5.535241e-001
STOCHASTIC GRADIENT DESCENT 100 ITER
Iteration #100 - Cost = 5.683117e-001 % First time I launched
Iteration #100 - Cost = 7.047196e-001 % Second time I launched
Gradient-descent-Implementierung für Logistische regression
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
[J, gradJ] = lrCostFunction(theta, X, y, lambda);
theta = theta - alpha * gradJ;
J_history(iter) = J;
fprintf('Iteration #%d - Cost = %d... \r\n',iter, J_history(iter));
end
Stochastic gradient descent-Implementierung für Logistische regression
% number of training examples
m = length(y);
% STEP1 : we shuffle the data
data = [y, X];
data = data(randperm(size(data,1)),:);
y = data(:,1);
X = data(:,2:end);
for iter = 1:num_iters
for i = 1:m
x = X(i,:); % Select one example
[J, gradJ] = lrCostFunction(theta, x, y(i,:), lambda);
theta = theta - alpha * gradJ;
end
J_history(iter) = J;
fprintf('Iteration #%d - Cost = %d... \r\n',iter, J);
end
Für Referenz, hier ist die Logistische regression die Kosten-Funktion in meinem Beispiel
function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y); % number of training examples
% We calculate J
hypothesis = sigmoid(X*theta);
costFun = (-y.*log(hypothesis) - (1-y).*log(1-hypothesis));
J = (1/m) * sum(costFun) + (lambda/(2*m))*sum(theta(2:length(theta)).^2);
% We calculate grad using the partial derivatives
beta = (hypothesis-y);
grad = (1/m)*(X'*beta);
temp = theta;
temp(1) = 0; % because we don't add anything for j = 0
grad = grad + (lambda/m)*temp;
grad = grad(:);
end
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese ist ziemlich ok. Wenn Sie besorgt über die Auswahl der geeigneten Lern-rate
alpha
, Sie sollten denke über die Anwendung eines Linie Suche Methode.Linie Suche ist eine Methode, die wählt, eine optimale lernraten für Gradienten-Abstieg in jeder iteration, die ist besser als die Verwendung von festen Lern-rate während des gesamten Optimierungsprozesses. Optimalen Wert für die learning-rate
alpha
ist eine, die lokal (aus der aktuellentheta
in Richtung des negativen Gradienten) minimiert Kosten-Funktion.Bei jeder iteration der gradient descent, starten Sie von der learning rate
alpha = 0
und erhöhen Sie allmählichalpha
durch den festen SchrittdeltaAlpha = 0.01
zum Beispiel. Neuberechnung der Parametertheta
und bewerten die Kosten-Funktion. Da die Kostenfunktion ist konvex, durch eine Erhöhungalpha
(das ist, durch verschieben in Richtung des negativen Gradienten) Kosten-Funktion wird der erste start ab, und dann (irgendwann) steigt. In diesem moment stoppen Sie die Zeile suchen, und nehmen Sie die Letztealpha
vor Kosten-Funktion zu steigen begannen. Aktualisieren Sie nun die Parametertheta
mit, dassalpha
. Im Falle, dass die Kosten-Funktion nicht anfängt zu erhöhen, halt beialpha = 1
.Hinweis: Für große Regularisierung Faktoren (
lambda = 100
,lambda = 1000
) ist es möglich, dassdeltaAlpha
ist zu groß und das Gefälle Abstieg unterscheidet. Wenn das der Fall ist, verringern SiedeltaAlpha
10-mal (deltaAlpha = 0.001
,deltaAlpha = 0.0001
), bis Sie die entsprechendedeltaAlpha
für die Gradienten-Abstieg konvergiert.Auch, sollten Sie sich Gedanken über die Verwendung von einige abschließende Bedingung andere, als die Anzahl der Iterationen, z.B. bei der Differenz zwischen den Anschaffungskosten Funktionen in zwei aufeinander folgenden Iterationen wird klein genug (weniger als einige
epsilon
).Gibt es einen Grund für den geringen Wert der learning rate. Kurz, wenn das lernen Preise zu verringern, die mit einer angemessenen rate, und unter relativ milden Annahmen, stochastic gradient descent konvergiert fast sicher auf einen Globale minimum, wenn die Zielfunktion ist konvex oder pseudoconvex, und sonst konvergiert fast sicher auf einen lokales minimum. Dies ist in der Tat eine Folge der Robbins-Siegmund theorem.
Die learning-rate ist immer zwischen 0 bis 1. Wenn Sie die learning-rate sehr hoch ist, dann folgt das gewünschte, in geringerem Umfang, weil zu überspringen. So nehmen Sie eine kleine lernraten auch wenn es mehr Zeit in Anspruch nimmt. Das Endergebnis wird Sie mehr überzeugen.