Optymalizacja systemów

Transkrypt

Optymalizacja systemów
Optymalizacja systemów
Laboratorium - problem detekcji twarzy
autorzy: A. Gonczarek, J.M. Tomczak, S. Zaręba, P. Klukowski
Cel zadania
Celem zadania jest zapoznanie się z gradientowymi algorytmami optymalizacji w zastosowaniu do
uczenia modelu regresji logistycznej oraz zaimplementowanie rozwiązania w środowisku MATLAB.
Detekcja twarzy jako problem klasyfikacji
Problem detekcji twarzy na obrazie polega na zaklasyfikowaniu wybranych fragmentów obrazu jako
twarzy człowieka. Korzystając z techniki okna przesuwnego (ang. shifting window ) obraz dzielony
jest na prostokąty, na których dokonywana jest klasyfikacja. Każdy wyszczególniony fragment obrazu opisany jest za pomocą wektora cech φ = (φ1 . . . φD )T otrzymanych za pomocą deskrytporów
HOG (ang. Histogram of Oriented Gradients).1 Dla każdego fragmentu obrazu należy rozwiązać
problem klasyfikacji z dwoma klasami y ∈ {0, 1}, polegający na przypisaniu fragmentowi obrazu
etykiety twarzy, y = 1, lub braku twarzy, y = 0.
Zdefiniujmy prawdopodobieństwo wystąpienia twarzy na zadanym fragmencie obrazu reprezentowanym przez cechy φ za pomocą sigmoidalnej funkcji logistycznej:
p(y = 1|φ, w) = σ(wT φ),
(1)
gdzie w oznacza D-wymiarowy wektor parametrów, sigmoidalna funkcja logistyczna:
σ(a) =
1
.
1 + exp(−a)
(2)
Klasyfikacja zadanego fragmentu odbywa się poprzez sprawdzenie, czy prawdopodobieństwo
wystąpienia twarzy jest większe niż zadana wartość progowa θ ∈ [0, 1]:
y∗ =

1,
jeśli p(y = 1|φ, w) ­ θ,
0,
w przeciwnym przypadku.
(3)
Klasyfikator w tak podanej postaci nazywa się regresją logistyczną.
1
Sposób otrzymania deksryptorów nie jest istotny dla zadania i jest pominięty w opracowaniu. Zainteresowanych
odsyłamy do Wikipedii, gdzie można znaleźć odnośniki do prac źródłowych http://en.wikipedia.org/wiki/
Histogram_of_oriented_gradients.
1
Uczenie modelu jako problem optymalizacji
Dla tak określonego problemu detekcji twarzy kluczowym aspektem jest wyznaczenie parametrów
w, czyli nauczenie modelu. Zakładamy, że dysponujemy zbiorem treningowym D = {φn , yn }N
n=1 ,
tj. zestawem fragmentów obrazów reprezentowanym przez cechy HOG wraz z etykietą yn ∈ {0, 1},
czy na fragmencie widnieje twarz, czy nie.
W celu uczenia modelu wykorzystamy metodę maksymalnej wiarygodności (ang. maximum
likelihood ). Wprowadźmy następujące oznaczenie:
σn ≡ σ(wT φn ).
(4)
Zmienna losowa y jest zmienną binarną, dlatego funkcja wiarygodności przyjmuje następującą
postać:
p(D|w) =
N
Y
σnyn (1 − σn )1−yn .
(5)
n=1
Biorąc ujemny logarytm otrzymujemy:
− ln p(D|w) = −
N X
yn ln σn + (1 − yn ) ln(1 − σn ) .
(6)
n=1
Zadanie wyznaczenia wartości parametrów minimalizujących negatywny logarytm funkcji wiarygodności jest zadaniem optymalizacji bez ograniczeń:
minimalizuj (po w)
− ln p(D|w)
Zauważmy, że postać σn zależy od parametrów w, co uniemożliwia wyznaczenia analitycznego
rozwiązania (6). Dlatego należy posłużyć się rozwiązaniem numerycznym. W tym celu zastosujemy
gradientowe algorytmy optymalizacji.
Algorytm gradientu prostego
Oznaczmy naszą funkcję celu jako F (w) = − ln p(D|w). Algorytm gradientu prostego przedstawiono poniżej. Aby móc go zastosować należy wyznaczyć gradient ∇w F (w).
2
Algorithm 1: Algorytm gradientu prostego
Wejście : Punkt startowy x0 ∈ domF , dokładność ε, krok η
Wyjście: Punkt optymalny x dla funkcji F
1
x ←− x0 ;
2
while kx − xold k2 ­ ε do
3
xold ←− x;
4
∆x ←− −∇x F (x);
5
x ←− x + η∆x;
6
end
Algorytm BFGS
Szybszą alternatywą dla algorytmu gradientu prostego może być algorytm BFGS (Broyden Fletcher Goldfarb Shanno). Należy on do rodziny algorytmów quasi-newtonowskich, co oznacza, że
prócz informacji o gradiencie wykorzystuje również aproksymację hesjanu, stosując następującą
rekurencyjną poprawkę przybliżającą odwrócony hesjan:
B−1 ←− B−1 +
sT g + gT B−1 g
(sT g)2
ssT
−
B−1 gsT + sgT B−1
,
sT g
(7)
gdzie g i s oznaczają odpowiednio różnicę gradientów między kolejnymi punktami i wektor o jaki
nastąpiło przesunięcie (patrz algorytm 3).
Ponadto algorytm BFGS w każdym kroku stosuje dodatkową procedurę optymalizacji w
kierunku (ang. line search), aby wyznaczyć optymalny krok η, tj.
η ← arg min F (x + η∆x).
η
(8)
Jako procedurę optymalizacji w kierunku można zastosowac algorytm backtracking line search
opisany poniżej.
Algorithm 2: Procedura backtracking line search
Wejście : Punkt x, kierunek ∆x, gradient ∇x F (x), początkowy krok η0 , parametry
α ∈ (0, 0.5), β ∈ (0, 1)
Wyjście: Optymalny krok η
1
η ←− η0 ;
2
while F (x + η∆x) ­ F (x) + α∇x F (x)T ∆x do
3
4
η ←− βη;
end
Poniżej przedstawiono algorytm BFGS. Algorytm został zaimplementowany w pliku BFGS.m.
3
Algorithm 3: Algorytm BFGS
Wejście : Punkt startowy x0 ∈ domF , dokładność ε
Wyjście: Punkt optymalny x dla funkcji F
1
x ←− x0 ;
2
B−1 ←− I;
3
while kx − xold k2 ­ ε do
4
xold ←− x;
5
∇old
x F (x) ←− ∇x F (x);
6
∆x ←− −B−1 ∇x F (x);
7
Wyznacz optymalny krok η stosując procedurę backtracking line search;
8
x ←− x + η∆x;
9
g ←− ∇x F (x) − ∇old
x F (x);
10
s ←− η∆x;
11
Popraw B−1 stosując wzór (7);
12
end
Implementacja w środowisku Matlab
W Matlabie funkcję celu do algorytmu optymalizacji przekazuje się przez tzw. wskaźnik na funkcję,
aby algorytm mógł ją wywoływać. Przykładowo dla funkcji zależnej od kilku argumentów:
[L,grad] = f(arg1,arg2,arg3,arg4)
możemy zdefiniować wskaźnik na funkcję poleceniem:
obj f=@(arg1,arg2)(f(arg1,arg2,value3,value4))
Wtedy zmienną obj f możemy przekazać jako argument do innej funkcji, a wywołanie
obj f(value1,value2)
jest równoznaczne z
f(value1,value2,value3,value4)
Mając zdefiniowany wskaźnik na funkcję można go wykorzystać we własnej implementacji algorytmów gradientu prostego oraz BFGS, jak również przekazać go do implementacji dostępnych w
środowisku Matlab, które są dostępne pod postacią funkcji fminunc(f obj,x0). Jej specyfikację
można znaleźć na stronie http://www.mathworks.com/help/optim/ug/fminunc.html. Funkcja
pobiera jako argument wskaźnik na funkcję w postaci przedstawionej powyżej (f obj) oraz punkt
początkowy procesu optymalizacji (x 0).
4
Testowanie poprawności działania
Do sprawdzania poprawności działania zaproponowanych rozwiązań służy funkcja main w pliku
main.m.
W pliku main.m nie wolno czegokolwiek zmieniać ani dopisywać.
Zadanie do wykonania (5 pkt.)
Po zaprezentowaniu działającego programu, prowadzący zadaje do kilku pytań kontrolnych mających na celu sprawdzenie poziomu zrozumienia zaimplementowanego w zadaniu kodu. Punkty są
przyzwanane wyłącznie na podstawie udzielonych odpowiedzi, co oznacza że samo zaimplementowanie kodu, bez jego zrozumienia, nie gwarantuje uzyskania punktów.
1. Zaimplementować funkcję sigmoidalną (2) w pliku sigmoid.m.
2. Wyznaczyć gradient funkcji celu (6), następnie zaimplementować jej wartość oraz wartość
gradientu w pliku logistic cost function.m.
3. Zaimplementować funkcję wyznaczającą wartości parametrów w za pomocą algorytmu gradientu prostego w pliku gradient descent.m. Funkcja dodatkowo ma zwracać wartości funkcji celu dla każdej iteracji algorytmu.
4. Zaimplementować funkcję wprowadzającą rekurencyjną poprawkę na przybliżony hesjan (7)
w pliku hessian update.m.
5. Zaimplementować procedurę backtracking line search w pliku line search.m.
6. Uzupełnić plik matlabBFGS przy użyciu funkcji fminunc.
Efekt końcowy działania klasyfikatora nauczonego metodą gradientu prostego powinien być
taki, jak na Rysunku 1.
UWAGA! Wszelkie nazwy funkcji i zmiennych w plikach *.m muszą pozostać zachowane.
Zmiana jakichkolwiek nazw i dodanie fragmentów kodu poza wskazanymi miejscami skutkować
będzie otrzymaniem 0 pkt.
Pytania kontrolne (5 pkt.)
Prowadzący zadaje do kilku pytań kontrolnych osobie oddającej zadanie. Lista przykładowych
pytań:
5
Rysunek 1: Wynik poprawnie działającego zadania.
1. Wyznaczyć pochodną sigmoidalnej funkcji logistycznej. Zapisać ją jedynie przy pomocy wartości funkcji sigmoidalnej σ(a).
2. Wyznaczyć gradient funkcji celu (6).
3. Co to są algorytmy gradientowe? Jakich wymagają własności od funkcji celu? Podać dwa
przykłady algorytmów gradientowych.
4. Za co odpowiada η w algorytmie gradientu prostego? Jak zachowuje się algorytm dla małych
i dużych wartości tego parametru?
5. Kiedy algorytm gradientu prostego będzie zbieżny, a kiedy nie? Odpowiedź uzasadnić graficznie (narysować).
6. Co to znaczy, że algorytm jest quasi-newtonowski? Co aproksymuje macierz B w algorytmie
BFGS?
7. Czym algorytm BFGS różni się od algorytmu Newtona? Który z nich będzie działał szybciej
dla funkcji o dużej liczbie zmiennych i dlaczego?
8. Jakie mogą być inne warunki stopu kończące działanie algorytmu? Wymienić trzy różne. Czy
można je ze sobą łączyć?
6
9. Do ustalenia jakiego parametru w algorytmie BFGS wykorzystuje się algorytm optymalizacji w kierunku? Co to daje? Czy można zastosować tę procedurę w algorytmie gradientu
prostego?
10. Dlaczego przedstawiony algorytm BFGS jest szybszy od algorytmu gradientu prostego? Wymienić i uzasadnić dwa powody.
7

Podobne dokumenty