W naszym wcześniejszym poście, zagłębiliśmy się w powody używania funkcji sigmoidalnej dla Regresji Logistycznej zamiast normalnej funkcji liniowej. W tym poście, będziemy kontynuować dzielenie się na temat funkcji kosztu.
Funkcja kosztu jest ważna, ponieważ daje nam błędy naszych przewidywań, a następnie, jest potrzebna dla naszego algorytmu uczenia. Konkretnie, chcemy zminimalizować błędy naszych przewidywań, tj. zminimalizować funkcję kosztu. Idealnie, jeśli wszystkie nasze błędy są równe zeru, przypomina to grę w rzutki, w której wszystkie nasze rzutki trafiają w dziesiątkę. Z drugiej strony argumentu, jeśli nasze błędy są bardzo wysokie, oznacza to, że nasze przewidywane wartości brakuje wszystkie prawdziwe obserwowane wartości, tj. nasze rzutki są w ogóle brakuje bull’s-eye.
Chociaż chcemy mieć zero błędów podczas uruchamiania naszej funkcji kosztu z naszych hipotetycznych wartości (idealne przewidywanie dla każdej wartości), to może nie być dobry scenariusz, biorąc pod uwagę, że może to prowadzić do zjawiska zwanego „wysoka wariancja”. Poruszymy więcej na ten temat w późniejszych pismach.
Powracając do formułowania funkcji straty, typową funkcją straty byłoby zminimalizowanie sumy kwadratów błędów, tj.
Ta funkcja może jednak powodować powstawanie wielu lokalnych optimów podczas procesu optymalizacji, co oznacza, że Twoje zoptymalizowane rozwiązanie może nie być najbardziej zoptymalizowane (istnieje szansa, że może istnieć lepsze rozwiązanie). W idealnej sytuacji chcemy, aby zoptymalizowane rozwiązanie było minimum globalnym, a nie minimum lokalnym.
Jak widać na powyższym wykresie, moglibyśmy niechcący zainicjalizować parametry i optymalizować je do minimum lokalnego, nie osiągając „prawdziwego” minimum globalnego. Dlatego też wspomniana funkcja straty nie byłaby dla nas idealna do zastosowania.
Jaka zatem mogłaby być nasza funkcja straty?
Jedną z funkcji straty powszechnie stosowaną w regresji logistycznej jest ta:
Uważaj, że użyłem funkcji kosztu i straty zamiennie, ale dla tych, którzy są przyzwyczajeni do wykładów Andrew Ng, „funkcja straty” jest dla pojedynczego przykładu szkoleniowego, podczas gdy „funkcja kosztu” bierze średnią ze wszystkich przykładów szkoleniowych.
Aby zobaczyć, dlaczego ta funkcja straty ma sens: Zakładając y = 1, i skupiając się na górnym równaniu, -log(h⊖(x)), chcemy, aby było ono bardzo ujemne, ponieważ jest to funkcja straty (Przypomnijmy, że chcemy zminimalizować funkcję straty jako cel). W rezultacie, h⊖(x) będzie duże. Należy jednak pamiętać, że h⊖(x) jest ograniczone do maksymalnej wartości 1 z powodu funkcji sigmoidalnej ograniczającej szacowaną wartość hipotezy od 0 do 1:
h⊖(x) = ŷ = σ(z)
Stąd, gdy y=1, mamy funkcję straty zminimalizowaną do ekstremum, gdy ŷ = 1. Doskonała prognoza, która ma małą lub żadną stratę/koszt poniesiony.
Odwrotnie, jeśli y = 0, i skupiając się na dolnej części równania, -log(1- h⊖(x)). Chcemy, aby było to bardzo ujemne ze względu na nasz cel minimalizacji strat. W rezultacie, 1- h⊖(x) będzie bardzo duże, a konsekwencją tego będzie to, że h⊖(x) będzie bardzo małe. Przypomnijmy jednak, że h⊖(x) jest ograniczone do minimalnej wartości 0 z powodu funkcji sigmoidalnej, która sprawia, że szacowana wartość hipotezy zawiera się w przedziale od 0 do 1.
Stąd, gdy y=0, mamy funkcję straty zminimalizowaną do ekstremum, gdy ŷ = 0. Idealna predykcja, która ma małą lub żadną stratę/koszt poniesiony.
Odpowiednie wykresy zilustrują powyższe punkty:
whereby i idzie od 1 do m dla m przykładów treningowych.
W AI i Machine Learning , będzie wiele notacji rzucanych wokół i byłoby pomocne, aby uzyskać ich sens.
Podczas szkolenia modelu regresji logistyki, mamy na celu znalezienie parametrów, „w” i „b”, który minimalizuje całkowitą funkcję kosztów. W następnym artykule, dotkniemy kolejnego ważnego segmentu, Gradient Descent.
W numpy, możemy zakodować funkcję kosztu w następujący sposób:
import numpy as npcost = (-1/m) * np.sum(Y*np.log(A) + (1-Y)*(np.log(1-A)))
W celu wyjaśnienia:
- np.sum sums over the elements of the array (Y*np.log(A) + (1-Y)*(np.log(1-A)), co w tym przypadku byłoby sumą nad wszystkimi przykładami treningowymi. Czytaj więcej tutaj.
- np.log przyjmuje log naturalny, element mądry do elementów w tablicy. Zobacz więcej tutaj.
- „*” bierze elementy jednej tablicy i mnoży je, element po elemencie, do elementów innej tablicy. To nie jest mnożenie macierzowe, które ma wymóg kształtu z obu tablic: Liczba kolumn pierwszej tablicy musi być równa wierszom drugiej tablicy.
.