2013-05-22 10 views
5

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:

funkcja
Macbook 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:

  1. Czy robię coś nie tak matematycznie?

  2. Czy mogę używać innych optymalizator zamiast fminunc()? Gdy LargeScale = on, fminunc() wykorzystuje algorytmy regionu zaufania.

  3. 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.


+1

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. –

+0

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

+0

@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? –

Odpowiedz

0

Oto moja rada:

-Set flaga Matlab pokazać wyjście debugowania podczas biegu. Jeśli nie tylko wydrukować w funkcji kosztu, koszt, który pozwoli Ci monitorować liczbę iteracji i błąd.

A po drugie, co jest bardzo ważne:

Twój problem jest illposed lub tak powiedzieć underdetermined. Masz przestrzeń o wielkości 12k i podajesz tylko 10k przykładów, co oznacza, że ​​dla nieograniczonej optymalizacji odpowiedź brzmi: -Inf. Aby zrobić szybki przykład, dlaczego tak jest, twój problem wygląda następująco: Zminimalizuj x + y + z, biorąc pod uwagę, że x + y-z = 2. Przestrzeń cechowa 3, spanowana przestrzeń wektorowa - 1d. Sugeruję użycie PCA lub CCA, aby zmniejszyć wymiarowość plików tekstowych, zachowując ich odmianę aż do 99%. Zapewni to prawdopodobnie przestrzeń cechową ~ 100-200dim.

PS: Wystarczy wskazać, że problem jest bardzo ograniczony z powodu wymogu rozmiaru klastra, który zwykle wynosi 1kk + punkty danych i że fminunc w ogóle nie jest przesadą, a LIBSVM nie ma z tym nic wspólnego, ponieważ fminunc jest po prostu optymalizator kwadratowy, a LIBSVM to klasyfikator. Aby wyczyścić LIBSVM używa czegoś podobnego do fminunc tylko z inną funkcją celu.

+0

Podczas gdy PCA (lub lepsze dla tekstu, skalowanie dziennika + SVD + L2-normalizacja) może pomóc, nie ma problemu z zastosowaniem regularyzowanego LogReg do tego rodzaju problemu. W rzeczywistości w NLP n_features >> n_samples nie jest w żadnym razie wyjątkowe. OP ma błąd w swoim kodzie. –

+0

skalowanie logów + normalizacja SVD + L2 nie jest w żadnym wypadku procedurą redukcji wymiarów. Po drugie w NLP, gdzie n_features >> n_samples, co robisz, jeśli nie redukujesz przestrzeni cech, to klasyfikujesz się w podwójnej przestrzeni, aby problem nie został źle narzucony. A problem powstaje głównie dlatego, że optymalizacja jest nieograniczona, jak wskazałem na przykładzie, który zgodziłbyś się nie da się rozwiązać? –

+0

* Obcięty * SVD, oczywiście, i to całkiem niezły efekt. czerwony. metoda, gdy funkcje mają boolowskie lub małe częstotliwości; nazywa się LSA w literaturze. OP robi regularyzowane LR, co powinno rozwiązać problem w pierwotnym. Podejrzewam, że brak rzadkich struktur danych jest przyczyną zabijania wydajności. –

0

Oto, co podejrzewam, że jest problem, na podstawie mojego doświadczenia z tego typu problem. Używasz gęstej reprezentacji dla X zamiast jednej sparse. Widać również typowy efekt w klasyfikacji tekstu, że liczba terminów rośnie w przybliżeniu liniowo wraz z liczbą próbek. W efekcie koszt mnożenia macierzy X*theta rośnie proporcjonalnie do liczby próbek.

W przeciwieństwie do tego, reprezentacja rzetelnej macierzy rzadkiej tylko iteruje nad niezerowymi elementami, aby wykonać mnożenie macierzy, która zazwyczaj jest w przybliżeniu stała dla każdego dokumentu, jeśli mają one odpowiednio stałą długość, powodując liniowe zamiast kwadratowego spowolnienie w liczba próbek.

Nie jestem guru Matlaba, ale wiem, że ma on sparse matrix package, więc spróbuj go użyć.

1

Udało mi się to zadziałać, 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.

Powiązane problemy