Ich führe logistische Regression in MATLAB mit L2 Regularisierung auf Textdaten. Mein Programm funktioniert gut für kleine Datensätze. Bei größeren Sets läuft es unendlich weiter.MATLAB fminunc() wird für große Datasets nicht abgeschlossen. Funktioniert für kleinere
Ich habe die potenziell doppelte Frage (matlab fminunc not quitting (running indefinitely)) gesehen. In dieser Frage waren die Kosten für das anfängliche Theta NaN und es wurde ein Fehler in der Konsole ausgegeben. Für meine Implementierung bekomme ich einen echten Wert und es gibt keinen Fehler, selbst wenn ausführliche Parameter an fminunc() übergeben werden. Daher glaube ich, dass diese Frage kein Duplikat ist.
Ich brauche Hilfe bei der Skalierung zu größeren Sets. Die Größe der Trainingsdaten, an denen ich gerade arbeite, beträgt ungefähr 10k * 12k (10k Textdateien kumulativ mit 12k Wörtern). Also habe ich m = 10k Trainingsbeispiele und n = 12k Features.
Meine Kostenfunktion wird wie folgt definiert:
function [J gradient] = costFunction(X, y, lambda, theta)
[m n] = size(X);
g = inline('1.0 ./ (1.0 + exp(-z))');
h = g(X*theta);
J =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h))+ (lambda/(2*m))*norm(theta(2:end))^2;
gradient(1) = (1/m)*sum((h-y) .* X(:,1));
for i = 2:n
gradient(i) = (1/m)*sum((h-y) .* X(:,i)) - (lambda/m)*theta(i);
end
end
Ich Durchführung Optimierung MATLAB fminunc() Funktion. Die Parameter I fminunc() übergeben sind:
options = optimset('LargeScale', 'on', 'GradObj', 'on', 'MaxIter', MAX_ITR);
theta0 = zeros(n, 1);
[optTheta, functionVal, exitFlag] = fminunc(@(t) costFunction(X, y, lambda, t), theta0, options);
ich auf einer Maschine diesen Code leite mit diesen Spezifikationen:
Macbook Pro i7 2.8GHz/8GB RAM/MATLAB R2011b
Die Kostenfunktion scheint richtig zu verhalten. Für das Anfangs-Theta bekomme ich akzeptable Werte von J und Gradient.
K>> theta0 = zeros(n, 1);
K>> [j g] = costFunction(X, y, lambda, theta0);
K>> j
j =
0.6931
K>> max(g)
ans =
0.4082
K>> min(g)
ans =
-2.7021e-05
Das Programm dauert unglaublich lange zu laufen. Ich begann Profiling zu halten MAX_ITR = 1 für fminunc(). Bei einer einzelnen Iteration wurde die Ausführung des Programms auch nach einigen Stunden nicht abgeschlossen. Meine Fragen sind:
Mache ich etwas mathematisch falsch?
Sollte ich anstelle von fminunc() einen anderen Optimierer verwenden? Wenn LargeScale = on ist, verwendet fminunc() Vertrauensbereichsalgorithmen.
Ist dieses Problem Cluster-Skala und sollte nicht auf einer einzigen Maschine ausgeführt werden?
Alle anderen allgemeinen Tipps werden geschätzt. Vielen Dank!
Dies trug dazu bei, das Problem zu lösen: ich in der Lage war (diese Funktion zu erhalten, indem die groß Flagge auf ‚off‘ in fminunc Einstellung). Soweit ich weiß, verwendet LargeScale = 'on' Trust-Region-Algorithmen, während 'Off' Quasi-Newton-Methoden verwendet. Quasi-Newton-Methoden zu verwenden und den Gradienten zu übergeben, hat bei diesem speziellen Problem viel schneller geklappt und sehr gute Ergebnisse gebracht.
Das Problem ist ziemlich klein, nicht annähernd Cluster-Skala. Die Verwendung eines Allzwecklösers wie 'fminunc' ist jedoch übertrieben. Sie sind wahrscheinlich besser dran mit einem anderen Solver. Haben Sie andere Methoden in Betracht gezogen (z. B. lineare SVM, von der bekannt ist, dass sie für die Textklassifizierung sehr gut geeignet ist)? Um Ihnen eine Idee zu geben, kann ein kleines Problem wie dieses in Sekundenschnelle mit linearer SVM gelöst werden. –
Nun, Profiling/Debug-Modus wird sicherlich verlangsamen. Haben Sie versucht, die ''Display''-Option auf' iter' zu setzen, indem Sie 'optimset' verwenden? um zu sehen, was "fminunc" macht? Auf den kleinen Datensätzen, wo es funktioniert, was beschreibt die Exit-Bedingung? Warum haben Sie eine Inline-Gleichung in Ihrer Kostenfunktion? Dies könnte durch eine [anonyme Funktion] (http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html) ersetzt werden ('g = @ (z) 1 ./ (1 + exp (- z)) ') oder ganz entfernt (' h = 1 ./ (1 + exp (-X * Theta)) '). – horchler
@MarcClaesen Danke Marc. Ich wollte speziell die logistische Regression für dieses Problem versuchen. Du hast erwähnt, dass es vielleicht besser ist, dass ich einen anderen Solver versuche. Würden Sie einen bestimmten Solver für diesen Zweck empfehlen? –