W poprzednim artykule „Wprowadzenie do klasyfikacji i regresji logistycznej” nakreśliłem matematyczne podstawy algorytmu regresji logistycznej, którego zadaniem jest rozdzielenie rzeczy w przykładzie treningowym poprzez obliczenie granicy decyzyjnej.
Granica decyzyjna może być opisana równaniem. Podobnie jak w regresji liniowej, algorytm regresji logistycznej będzie w stanie znaleźć najlepsze parametry, aby granica decyzyjna faktycznie poprawnie rozdzielała punkty danych. W tym artykule zobaczymy, jak obliczyć te parametry.
Załóżmy, że mamy ogólny zbiór treningowy
(x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), kropki, (x^{(m)}, y^{(m)}) \}
złożone z m przykładów treningowych, gdzie (x^{(1)}, y^{(1)}) jest 1. przykładem i tak dalej. Dokładniej, x^{(m)} jest zmienną wejściową m-tego przykładu, a y^{(m)} jest jego zmienną wyjściową. Ponieważ jest to problem klasyfikacyjny, każdy przykład ma oczywiście zmienną wyjściową y ograniczoną między 0 a 1. Innymi słowy, y leży w przedziale {0,1}.
Każdy przykład jest reprezentowany jak zwykle przez jego wektor cech
vec{x} = \begin{bmatrix} x_0 \ x_1 \dots \ x_n \end{bmatrix}
gdzie x_0 = 1 (ta sama stara sztuczka). Jest to przykład ogólny, nie znamy dokładnej liczby cech.
Wreszcie mamy funkcję hipotezy dla regresji logistycznej, jak widać w poprzednim artykule:
h_theta(x) = \frac{1}{1 + e^{theta^{top} x}}
Naszym zadaniem jest teraz wybranie najlepszych parametrów \theta w powyższym równaniu, biorąc pod uwagę bieżący zestaw treningowy, w celu zminimalizowania błędów. Pamiętaj, że \theta nie jest pojedynczym parametrem: rozszerza się do równania granicy decyzyjnej, która może być linią lub bardziej złożoną formułą (z większą liczbą \theta do odgadnięcia).
Postępowanie jest podobne do tego, co zrobiliśmy dla regresji liniowej: zdefiniuj funkcję kosztu i spróbuj znaleźć najlepsze możliwe wartości każdego \theta poprzez minimalizację wyjścia funkcji kosztu. Minimalizacja będzie wykonywana przez algorytm zstępujący gradientowy, którego zadaniem jest parsowanie danych wyjściowych funkcji kosztu, aż znajdzie najniższy punkt minimalny.
Funkcja kosztu używana w regresji liniowej nie zadziała tutaj
Możesz pamiętać oryginalną funkcję kosztu J(™theta) używaną w regresji liniowej. Już teraz mogę Ci powiedzieć, że nie zadziała ona tutaj z regresją logistyczną. Gdybyś spróbował użyć funkcji kosztu regresji liniowej do wygenerowania J(\theta) w problemie regresji logistycznej, skończyłbyś z funkcją niewypukłą: wykresem o dziwnym kształcie bez łatwego do znalezienia minimalnego punktu globalnego, jak widać na poniższym rysunku.
Ten dziwny wynik wynika z tego, że w regresji logistycznej mamy dookoła funkcję sigmoidalną, która jest nieliniowa (czyli nie jest linią). Z J(ą) przedstawioną na rysunku 1. algorytm zejścia gradientowego może utknąć w punkcie lokalnego minimum. Dlatego wciąż potrzebujemy zgrabnej funkcji wypukłej, tak jak w przypadku regresji liniowej: funkcji w kształcie miseczki, która ułatwia pracę funkcji zstępującej gradientu w celu zbiegania do optymalnego punktu minimalnego.
Poprawiona funkcja kosztu dla regresji logistycznej
Powróćmy na chwilę do funkcji kosztu, której używaliśmy w regresji liniowej:
J(vec{theta}) = \frac{1}{2m} \sum_{i=1}^{m} (h_theta(x^{(i)}) – y^{(i)})^2
którą można przepisać w nieco inny sposób:
J(\vec{theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_theta(x^{(i)}) – y^{(i)})^2
Nie stało się nic strasznego: Po prostu przeniosłem \frac{1}{2} obok części sumującej. Teraz uczyńmy ją bardziej ogólną, definiując nową funkcję
\mathrm{Cost}(h_theta(x^{(i)}),y^{(i)}) = \frac{1}{2}(h_theta(x^{(i)}) – y^{(i)})^2
Słowem, funkcję \mathrm{Cost}, która przyjmuje na wejściu dwa parametry: h_theta(x^{(i)}) jako funkcję hipotezy oraz y^{(i)} jako wyjście. Możesz myśleć o tym jako o koszcie, jaki algorytm musi ponieść, jeśli dokona predykcji h_theta(x^{(i)}), podczas gdy rzeczywista etykieta była y^{(i)}.
Z tym nowym elementem układanki mogę przepisać funkcję kosztu dla regresji liniowej w następujący sposób:
J(_theta) = _dfrac{1}{m} \^sum_{i=1}^m ^mathrm{Cost}(h_theta(x^{(i)}),y^{(i)})
Wiemy jednak, że funkcja kosztu regresji liniowej nie może być stosowana w problemach regresji logistycznej. O co więc w tym wszystkim chodzi? Otóż okazuje się, że dla regresji logistycznej musimy po prostu znaleźć inną funkcję kosztu, natomiast część sumacyjna pozostaje bez zmian.
Funkcja kosztu regresji logistycznej
Dla regresji logistycznej funkcja \mathrm{Cost} jest zdefiniowana jako:
\mathrm{Cost}(h_theta(x),y) = \begin{cases}-\log(h_theta(x)) & \tekst{if y = 1} \\-\log(1-h_\theta(x)) & \text{if y = 0} \end{cases}
Indeksy i zostały usunięte dla przejrzystości. Innymi słowy jest to koszt, jaki płaci algorytm, jeśli przewiduje wartość h_theta(x), podczas gdy rzeczywistą etykietą kosztu okazuje się być y. Używając tej funkcji nadamy wypukłość funkcji, którą algorytm zstępujący gradientu musi przetworzyć, co zostało omówione powyżej. Istnieje również dowód matematyczny na to, co jest poza zakresem tego kursu wprowadzającego.
W przypadku y = 1, wyjście (tj. koszt do zapłacenia) zbliża się do 0 jak h_theta(x) zbliża się do 1. I odwrotnie, koszt zapłaty rośnie do nieskończoności, gdy h_theta(x) zbliża się do 0. Widać to wyraźnie na wykresie 2. poniżej, po lewej stronie. Jest to pożądana własność: chcemy mieć większą karę, gdy algorytm przewiduje coś odległego od rzeczywistej wartości. Jeśli etykietą jest y = 1, ale algorytm przewiduje h_theta(x) = 0, wynik jest całkowicie błędny.
Odwrotnie, ta sama intuicja ma zastosowanie, gdy y = 0, przedstawiona na wykresie 2. poniżej, prawa strona. Większe kary, gdy etykietą jest y = 0, ale algorytm przewiduje h_theta(x) = 1.
Dodatkowe optymalizacje funkcji kosztu
To, co właśnie widzieliśmy, to dosłowna wersja funkcji kosztu dla regresji logistycznej. Możemy ją skompaktować do postaci jednoliniowego wyrażenia: pomoże to uniknąć nudnych instrukcji if/else podczas przekształcania wzoru w algorytm.
Funkcja kosztu {Cost}(h_theta(x),y) = -y \log(h_theta(x)) – (1 – y) \log(1-h_theta(x))
Dowód: spróbuj zastąpić y przez 0 i 1, a skończysz z dwoma kawałkami oryginalnej funkcji.
Po wprowadzeniu optymalizacji funkcję kosztu regresji logistycznej można przepisać jako:
begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) = – ^dfrac{1}{m} \\\end{align}
Przesunąłem znak minus na zewnątrz, aby uniknąć dodatkowych nawiasów.
Połączenie funkcji kosztu i zejścia gradientowego
Co nam zostało? Mamy funkcję hipotezy i funkcję kosztu: prawie skończyliśmy. Teraz czas na znalezienie najlepszych wartości parametrów funkcji kosztu, lub innymi słowy na zminimalizowanie funkcji kosztu poprzez uruchomienie algorytmu zstępowania gradientowego. Procedura jest identyczna jak ta, którą wykonaliśmy dla regresji liniowej.
W bardziej formalnym ujęciu, chcemy zminimalizować funkcję kosztu:
W ten sposób otrzymamy zestaw parametrów \theta, najlepszych (tj. z mniejszym błędem). Gdy to zrobimy, będziemy gotowi do przewidywań na nowych przykładach wejściowych z ich cechami x, używając nowych \theta w funkcji hipotezy:
h_theta(x) = \frac{1}{1 + e^{theta^{top} x}}
Gdzie h_theta(x) jest wyjściem, przewidywaniem, lub jeszcze prawdopodobieństwem, że y = 1.
Sposób, w jaki będziemy minimalizować funkcję kosztu jest przez użycie zejścia gradientowego. Dobrą wiadomością jest to, że procedura jest w 99% identyczna z tym, co zrobiliśmy dla regresji liniowej.
Aby zminimalizować funkcję kosztu, musimy uruchomić funkcję zejścia gradientowego na każdym parametrze:
begin{align} \{powtarzaj aż do zbieżności} \theta_j & := \theta_j – \alpha \frac{partial}{\partial \theta_j} J(\theta) \text{} \end{align}
Pamiętaj, aby jednocześnie aktualizować wszystkie \theta_j, tak jak zrobiliśmy to w odpowiedniku regresji liniowej: jeśli masz n cech, czyli wektor cech \vec{theta} = , wszystkie te parametry muszą być aktualizowane jednocześnie w każdej iteracji:
\begin{align} \text{powtarzać aż do zbieżności \{} \theta_0 & := \cdots \theta_1 & := \cdots \cdots \theta_n & := \cdots \ \text{} \end{align}
Wracając do algorytmu, oszczędzę Ci obliczania zniechęcającej pochodnej \frac{partial}{\theta_j} J(\theta), która przyjmuje postać:
\frac{partial}{\partial \theta_j} J(\theta) = \dfrac{1}{m} \^sum_{i=1}^{m} (h_theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Pętlę powyżej można więc przepisać jako:
begin{align} \tekst{powtarzaj aż do zbieżności} \theta_j & := \theta_j – \alpha \dfrac{1}{m} \sum_{i=1}^{m} (h_theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Zaskakująco wygląda to identycznie jak w przypadku regresji liniowej wielorakiej. Zmieniła się jednak definicja hipotezy h_theta(x): dla regresji liniowej mieliśmy h_theta(x) = \theta^{\top}{x}, natomiast dla regresji logistycznej mamy h_theta(x) = \frac{1}{1 + e^{theta^{\top} x}}.
Od teraz możesz zastosować te same techniki do optymalizacji algorytmu zejścia gradientowego, które widzieliśmy dla regresji liniowej, aby upewnić się, że konwersja do punktu minimalnego działa poprawnie. W następnym rozdziale zagłębię się w kilka zaawansowanych sztuczek optymalizacyjnych, a także w definiowanie i unikanie problemu nadmiernego dopasowania.
.