ja wykonywania regresji logistycznej w MATLAB z uregulowania L2 na danych tekstowych. Mój program działa dobrze w przypadku małych zestawów danych. W przypadku większych zestawów działa nieprzerwanie.MATLAB fminunc() nie wypełnia dla dużych zestawów danych. Prace dla mniejszych
Widziałem potencjalnie zduplikowane pytanie (matlab fminunc not quitting (running indefinitely)). W tym pytaniu koszt początkowego teta był NaN i w konsoli pojawił się błąd. Dla mojej implementacji otrzymuję rzeczywisty koszt i nie ma błędu, nawet jeśli szczegółowe parametry są przekazywane do fminunc(). Dlatego uważam, że to pytanie może nie być duplikatem.
Potrzebuję pomocy w skalowaniu go do większych zestawów. Rozmiar danych treningowych, nad którymi obecnie pracuję, to około 10k * 12k (10 tys. Plików tekstowych zawierających łącznie 12 tys. Słów). Tak więc mam m = 10k przykładów treningowych i funkcji n = 12k.
Moja funkcja kosztu jest zdefiniowany następująco:
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
ja wykonywania optymalizacji korzystania fminunc Matlaba funkcji(). Parametry mijam do fminunc() są:
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);
Używam tego kodu na maszynie z tymi specyfikacjami:
funkcjaMacbook Pro i7 2.8GHz/8GB RAM/MATLAB R2011b
Koszt wydaje się zachowywać poprawnie. Dla początkowego teta otrzymuję akceptowalne wartości J i gradientu.
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
Program trwa bardzo długo. Rozpocząłem profilowanie utrzymując MAX_ITR = 1 dla fminunc(). W pojedynczej iteracji program nie zakończył wykonywania nawet po upływie kilku godzin. Moje pytania to:
Czy robię coś nie tak matematycznie?
Czy mogę używać innych optymalizator zamiast fminunc()? Gdy LargeScale = on, fminunc() wykorzystuje algorytmy regionu zaufania.
Czy problem ten klaster skalę i nie powinien być uruchomiony na jednym komputerze?
Wszelkie inne ogólne wskazówki zostaną docenione. Dzięki!
To pomogło rozwiązać problem: udało mi się uzyskać tej pracy, ustawiając flagę LargeScale na 'off' w fminunc(). Z tego co wiem, LargeScale = 'on' wykorzystuje algorytmy regionu zaufania, a utrzymywanie go w stanie 'off' wykorzystuje metody quasi-newtonowe. Używanie quasi-newtonowskich metod i przekazywanie gradientu działało o wiele szybciej dla tego konkretnego problemu i dawało bardzo dobre wyniki.
Problem jest dość mały, nigdzie w pobliżu skali klastrów. Używanie solver ogólnego przeznaczenia, takiego jak 'fminunc', jest jednak przesadą. Prawdopodobnie lepiej jest użyć innego rozwiązania. Czy zastanawiałeś się nad innymi metodami (np. Liniowym SVM, który znany jest z doskonałej wydajności w przypadku klasyfikacji tekstu)? Aby dać ci wyobrażenie, niewielki problem, taki jak ten, może zostać rozwiązany w ciągu kilku sekund za pomocą liniowej maszyny SVM. –
Dobrze, tryb profilowania/debugowania z pewnością spowolni go. Czy próbowałeś ustawić opcję ''Display'' na'' iter'' używając 'optimset'? zobaczyć, co robi 'fminunc'? Na małych zestawach danych, w których działa, co to jest "exitflag" opisujące warunki wyjścia? Ponadto, dlaczego masz równanie liniowe w swojej funkcji kosztu? Można to zastąpić funkcją anonimową (http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html) ('g = @ (z) 1 ./ (1 + exp (- z)) ') lub całkowicie usunięty (' h = 1 ./ (1 + exp (-X * theta)) '). – horchler
@MarcClaesen Dzięki Marc. Chciałem specjalnie wypróbować regresję logistyczną tego problemu. Wspomniałeś, że lepiej będzie, jeśli spróbuję innego solvera. Czy poleciłbyś w tym celu jakiś konkretny solver? –