Broyden–Fletcher–Goldfarb–Shanno – AI Tutorial 4

Poprzedni post z cyku.

Miało być o racjonalnych decyzjach ale podjąłem takową dzisiaj i będzie o czymś innym.

Wróćmy jeszcze do uczenia maszynowego i wprowadźmy kilka usprawnień.
Na początek zobaczmy dane na jakich będziemy pracować. (X – 0, gwiazdka – 1).

raw

Pierwszą zmianą będzie użycie innej metody minimalizowania. Gradient prosty jest prosty i tu w zasadzie kończą się jego zalety. Jednakże zamiast samemu implementować inny mechanizm skorzystajmy z tego co dostarcza biblioteka do obliczeń symbolicznych SymPy.
Wybór padł na algorytm Broyden–Fletcher–Goldfarb–Shanno. Nie będę go opisywać gdyż nie jest to blog o analizie numerycznej (jeszcze nie ( ͡° ͜ʖ ͡°) ).
Przegląd innych metod minimalizacji jest dostępny w dokumentacji.
Użycie jest bardzo proste, wystarczy zaimportować odpowiednią funkcję.

from scipy.optimize import fmin_bfgs

A następnie wywołać ją, przekazując jej funkcję do zoptymalizowania oraz miejsce od którego zacząć:

theta = fmin_bfgs(J, initialTheta)

Znajomość pochodnych nie jest konieczna, wystarczy nam sama funkcja J

#ostatecznie uznałem, że tak będzie czytelniej
def single_penalty(Theta, x, y):
    return -np.log(h(Theta, x)) if y == 1 else -np.log(1-h(Theta, x))                
        
def J(Theta):
    sum = 0.
    for i in range(m):
        sum += single_penalty(Theta, TrainingData[i,:], Y[i])
    return sum/m

Funkcja fmin_bfgs wypisze nam jak przebiegła optymalizacja oraz zwróci nam wynik (poszukiwane przez nas \theta )Np:

Optimization terminated successfully.
Current function value: 0.000002
Iterations: 30
Function evaluations: 487
Gradient evaluations: 37

Takie podejście do sprawy daje nam komfort swobodnych eksperymentów z funkcjami g_\theta(x) i J(\theta). Zacznijmy od najprostszej wersji hipotezy:
g_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2

Możemy się spodziewać, że dla testowych danych trudno będzie poprowadzić sensownie prostą linię. I tak jest w istocie.

1

Wygląda źle, ale nie oczekiwaliśmy niczego innego. Dodajmy jeden wyraz do hipotezy.

g_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2

2

Eeee nie. Coś się zaczęło co prawda „wyginać” ale daleko nam do celu. Kolejne dwa wyrazy:

g_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2 + \theta_4 x_1^2 + \theta_5 x_2^2

3Znacznie lepiej. 3 kolejne okręgi (od środka) oznaczają kolejno P(y=1) = 1%, P(y=1) = 50%, P(y=1) = 99%. Im będą bliżej siebie, tym bardziej wyraźna granica decyzji i mniej obszarów niepewności. Czy dodanie kolejnego wyrazu może coś poprawić? Sprawdźmy

g_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2 + \theta_4 x_1^2 + \theta_5 x_2^2 + \theta_6 x_1^2x_2^2

4

Kształt zmienił się zdecydowanie, obszar niepewności również. Czy jest to lepsze dopasowanie niż poprzednio to już kwestia dyskusyjna. Faktem jest jednak że algorytm wytrenował się poprawnie do podanych danych. Dodajmy jeszcze coś.

g_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2 + \theta_4 x_1^2 + \theta_5 x_2^2 + \theta_6 x_1^2x_2^2 + \theta_7 x_1^2 x_2 + \theta_8 x_1 x_2^2

5

Sytuacja jest podobna. Ostatni krzyk rozpaczy, dodajemy trzecie potęgi.

g_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2 + \theta_4 x_1^2 + \theta_5 x_2^2 + \theta_6 x_1^2x_2^2 + \theta_7 x_1^2 x_2 + \theta_8 x_1 x_2^2 + \theta_9 x_1^3 + \theta_{10} x_2^3

6
Wystarczy. Dodawanie kolejnych potęg nic nie wnosi, a wręcz może zaszkodzić. W przyszłości poznamy mechanizm zniechęcania do wykorzystywania zbyt skomplikowanych krzywych.

Podsumowanie

Teraz już na pewno odstawiamy na bok (tymczasowo) uczenie maszynowe i przechodzimy do czegoś innego. O tym jak znaleźć drogę w labiryncie już niedługo.

Całość kodu

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s