Sieci neuronowe: jakiej funkcji kosztu użyć?


49

Używam TensorFlow do eksperymentów głównie z sieciami neuronowymi. Chociaż przeprowadziłem już dość eksperymentów (problem XOR, MNIST, niektóre rzeczy związane z regresją ...), mam problem z wybraniem „właściwej” funkcji kosztu dla konkretnych problemów, ponieważ ogólnie można mnie uznać za początkującego.

Przed przyjściem do TensorFlow kodowałem niektóre w pełni połączone MLP i niektóre sieci rekurencyjne samodzielnie za pomocą Pythona i NumPy, ale przede wszystkim miałem problemy, w których wystarczający był prosty błąd kwadratu i prosty gradient.

Ponieważ jednak TensorFlow oferuje całkiem sporo samych funkcji kosztów, a także tworzenie niestandardowych funkcji kosztów, chciałbym wiedzieć, czy istnieje jakiś samouczek dla funkcji kosztów w sieciach neuronowych? (Już zrobiłem około połowy oficjalnych samouczków TensorFlow, ale tak naprawdę nie wyjaśniają, dlaczego do określonych problemów wykorzystywane są określone funkcje kosztów lub uczniowie - przynajmniej nie dla początkujących)

Aby podać kilka przykładów:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Wydaje mi się, że stosuje ona funkcję softmax na obu wejściach, tak że suma jednego wektora wynosi 1. Ale czym dokładnie jest entropia krzyżowa z logami? Myślałem, że sumuje wartości i oblicza entropię krzyżową ... więc jakiś pomiar metryczny ?! Czy nie byłoby tak samo, gdybym znormalizował dane wyjściowe, podsumował je i wziął do kwadratu błąd? Dodatkowo, dlaczego jest to używane np. Do MNIST (lub nawet o wiele trudniejszych problemów)? Kiedy chcę sklasyfikować jak 10, a może nawet 1000 klas, czy sumowanie wartości całkowicie nie niszczy informacji o tym, która klasa faktycznie była wynikiem?

cost = tf.nn.l2_loss(vector)

Po co to? Myślałem, że utrata L2 jest właściwie kwadratem błędu, ale API TensorFlow mówi, że jego wejście to tylko jeden tensor. W ogóle nie ma pomysłu ?!

Poza tym dość często widziałem to dla entropii krzyżowej :

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... ale dlaczego to jest używane? Czy strata w entropii krzyżowej nie jest matematycznie następująca:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Gdzie jest (1 - y_train) * log(1 - y_output)część w większości przykładów TensorFlow? Nie brakuje?


Odpowiedzi: Wiem, że to pytanie jest dość otwarte, ale nie spodziewam się uzyskać 10 stron z każdą szczegółową funkcją każdego problemu / kosztu. Potrzebuję tylko krótkiego podsumowania, kiedy użyć której funkcji kosztu (ogólnie lub w TensorFlow, nie ma dla mnie większego znaczenia) i wyjaśnienia na ten temat. I / lub niektóre źródła dla początkujących;)


1
Dobre pytanie. Witamy na stronie :)
Dawny33

2
Zazwyczaj MSE jest brany do regresji, a Cross-Entropy do klasyfikacji. Klasyfikacja Figure of Merit (CFM) została wprowadzona przez Hampshire i Waibel w „Nowatorskiej funkcji celu dla lepszego rozpoznawania fonemów za pomocą sieci neuronowych z opóźnieniem czasowym”. Jeśli dobrze to pamiętam, wyjaśniają również, dlaczego zaprojektowali CFM tak, jak oni.
Martin Thoma,

1
Myślę, że redukcja_trybu (y_train * tf.log (y_output)) jest często używana, ponieważ jest to dość powszechny przykład „prostej sprawy”. Będzie działał sumując błąd każdej partii, co oznacza, że ​​twój błąd podwoi koszt (i wielkość gradientu), jeśli twoja partia_wymiarów podwoi się. Prosta zmiana na redukcję_meanu przynajmniej uczyni debugowanie i zabawę ustawieniami bardziej zrozumiałymi, moim zdaniem.
neuron

Odpowiedzi:


34

Ta odpowiedź dotyczy ogólnych funkcji kosztów, niezwiązanych z TensorFlow, i w większości dotyczy „części wyjaśnienia tego tematu” pytania.

W większości przykładów / samouczków, których użyłem, funkcja kosztów była nieco arbitralna. Chodziło raczej o zapoznanie czytelnika z konkretną metodą, a nie z funkcją kosztu. Nie powinno Cię to powstrzymywać przed zapoznaniem się z samouczkiem, aby zapoznać się z narzędziami, ale moja odpowiedź powinna pomóc ci w wyborze funkcji kosztu własnych problemów.

Jeśli chcesz uzyskać odpowiedzi dotyczące Cross-Entropy, Logit, norm L2 lub czegoś innego, radzę, abyś zamieścił wiele bardziej szczegółowych pytań. Zwiększy to prawdopodobieństwo, że ktoś o określonej wiedzy zobaczy Twoje pytanie.


Wybór właściwej funkcji kosztów dla osiągnięcia pożądanego rezultatu jest krytycznym punktem problemów w uczeniu maszynowym. Podstawowym podejściem, jeśli nie wiesz dokładnie, czego chcesz od swojej metody, jest użycie Mean Square Error (Wikipedia) dla problemów z regresją i Procent błędu dla problemów z klasyfikacją. Jeśli jednak chcesz uzyskać dobre wyniki swojej metody, musisz zdefiniować dobre , a tym samym zdefiniować odpowiednią funkcję kosztów. Wynika to zarówno z wiedzy o domenie (jakie są twoje dane, co próbujesz osiągnąć), jak i wiedzy o narzędziach do Twojej dyspozycji.

Nie wierzę, że mogę poprowadzić cię przez funkcje kosztów już zaimplementowane w TensorFlow, ponieważ mam bardzo małą wiedzę na temat tego narzędzia, ale mogę dać ci przykład, jak pisać i oceniać różne funkcje kosztów.


xnf(xn){0,1}

Nf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn)

p(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn)

p(yn=1|xn)=0.5

p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0, następująca funkcja nie ma problemu opisanego w poprzednim akapicie:

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn)

Powinno to ilustrować, że w celu zoptymalizowania tej samej rzeczy , odsetka błędów, różne definicje mogą dawać różne wyniki, jeśli łatwiej jest je zrozumieć, obliczeniowo.

ABAB


Zobaczmy teraz, jak funkcja różnych kosztów może mierzyć różne koncepcje. W kontekście wyszukiwania informacji, podobnie jak w wyszukiwaniu Google (jeśli zignorujemy ranking), chcemy, aby zwrócone wyniki były

  • mają wysoką precyzję , nie zwracają nieistotnych informacji
  • mieć wysoki poziom wycofania , zwracać jak najwięcej trafnych wyników, jak to możliwe
  • Precyzja i przywołanie (Wikipedia)

Zauważ, że jeśli twój algorytm zwróci wszystko , zwróci każdy możliwy możliwy wynik, a zatem będzie miał wysoką pamięć, ale będzie miał bardzo niską precyzję. Z drugiej strony, jeśli zwróci tylko jeden element, ten, który jest najbardziej pewny, jest istotny, będzie miał wysoką precyzję, ale niski przywołanie.

FF1Fββ

  • β>1
  • β<1

W takim scenariuszu wybranie funkcji kosztu oznacza wybór kompromisu, który powinien wykonać algorytm .

Innym często podnoszonym przykładem jest przypadek diagnozy medycznej. Możesz wybrać funkcję kosztu, która będzie karać więcej fałszywych negatywów lub fałszywych trafień w zależności od tego, co jest preferowane:

  • Bardziej zdrowi ludzie są klasyfikowani jako chorzy (ale wtedy możemy leczyć zdrowych ludzi, co jest kosztowne i może im zaszkodzić, jeśli w rzeczywistości nie są chorzy)
  • Więcej chorych zostało sklasyfikowanych jako zdrowe (ale wtedy mogą umrzeć bez leczenia)

Podsumowując, zdefiniowanie funkcji kosztu oznacza określenie celu algorytmu. Algorytm określa, jak się tam dostać.


Uwaga dodatkowa: Niektóre funkcje kosztów mają dobre algorytmy na drodze do osiągnięcia swoich celów. Na przykład istnieje dobry sposób na minimalizację utraty zawiasu (Wikipedia) , rozwiązując podwójny problem w SVM (Wikipedia)


10

Aby odpowiedzieć na twoje pytanie dotyczące entropii krzyża, zauważysz, że oba z tych, o których wspomniałeś, są tym samym.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

y_trainy_output

Drugie równanie, o którym wspomniałeś, jest bardziej ogólnym wariantem obejmującym wiele klas

-tf.reduce_sum(y_train * tf.log(y_output)) to to samo co pisanie

ntrain_problog(out_prob)

n


4

BLUF: iteracyjna próba i błąd z podzbiorem danych i matplotlib.

Długa odpowiedź:

Mój zespół jeszcze niedawno zmagał się z tym samym pytaniem. Wszystkie odpowiedzi tutaj są świetne, ale chciałem podzielić się z wami moją „odpowiedzią dla początkujących” na kontekst i jako punkt wyjścia dla osób, które dopiero zaczynają uczenie maszynowe.

Chcesz dążyć do funkcji kosztów, która jest płynna i wypukła dla twojego określonego wyboru algorytmu i zestawu danych. To dlatego, że chcesz, aby Twój algorytm mógł pewnie i skutecznie dostosowywać wagi, aby ostatecznie osiągnąć globalne minimum tej funkcji kosztów. Jeśli funkcja kosztu jest „wyboista” z lokalnymi maksymalnymi i minimalnymi wartościami i / lub nie ma globalnego minimum, wówczas algorytm może mieć trudności z konwergencją; jego ciężary mogą po prostu skakać po całym miejscu, ostatecznie nie dając dokładnych i / lub spójnych prognoz.

Na przykład, jeśli używasz regresji liniowej do przewidywania czyjejś wagi (liczba rzeczywista, w funtach) na podstawie ich wzrostu (liczba rzeczywista, w calach) i wieku (liczba rzeczywista, w latach), wówczas funkcja kosztu błędu średniego kwadratu powinna wynosić ładna, gładka, wypukła krzywa. Twój algorytm nie będzie miał problemów z konwergencją.

Ale powiedz zamiast tego, że używasz algorytmu regresji logistycznej dla problemu klasyfikacji binarnej, takiego jak przewidywanie płci osoby na podstawie tego, czy dana osoba kupiła pieluchy w ciągu ostatnich 30 dni i czy dana osoba kupiła piwo w ciągu ostatnich 30 dni. W takim przypadku średni błąd kwadratu może nie dać gładkiej wypukłej powierzchni, co może być niekorzystne dla treningu. I powiedziałbyś to eksperymentalnie.

Możesz zacząć od uruchomienia wersji próbnej przy użyciu MSE i małej i prostej próbki danych lub próbnych danych wygenerowanych dla tego eksperymentu. Wizualizuj, co się dzieje z matplotlib (lub dowolnym innym rozwiązaniem do drukowania). Czy wynikowa krzywa błędu jest gładka i wypukła? Spróbuj ponownie z dodatkową zmienną wejściową ... czy uzyskana powierzchnia jest nadal gładka i wypukła? Dzięki temu eksperymentowi możesz odkryć, że chociaż MSE nie pasuje do twojego problemu / rozwiązania, entropia krzyżowa daje ci gładki wypukły kształt, który lepiej pasuje do twoich potrzeb. Możesz więc wypróbować to na większym próbnym zbiorze danych i sprawdzić, czy hipoteza nadal się utrzymuje. A jeśli tak, to możesz wypróbować go z pełnym zestawem treningowym kilka razy i zobaczyć, jak sobie radzi i czy konsekwentnie dostarcza podobne modele. Jeśli nie, wybierz inną funkcję kosztów i powtórz proces.

Ten rodzaj wysoce iteracyjnego procesu prób i błędów działa całkiem dobrze dla mnie i mojego zespołu początkujących badaczy danych i pozwala nam skupić się na poszukiwaniu rozwiązań naszych pytań bez konieczności zagłębiania się w teorię matematyczną stojącą za wyborem funkcji kosztów i optymalizacja modelu.

Oczywiście wiele z tych prób i błędów zostało już popełnionych przez innych ludzi, dlatego też wykorzystujemy wiedzę publiczną, aby pomóc nam w filtrowaniu naszych wyborów, co może być dobrą funkcją kosztową na wczesnym etapie procesu. Na przykład, entropia krzyżowa jest ogólnie dobrym wyborem dla problemów z klasyfikacją, niezależnie od tego, czy jest to klasyfikacja binarna z regresją logistyczną jak w powyższym przykładzie, czy bardziej skomplikowana klasyfikacja wieloznakowa z warstwą softmax jako wyjściem. Podczas gdy MSE jest dobrym pierwszym wyborem dla problemów z regresją liniową, w których poszukujesz prognozy skalarnej zamiast prawdopodobieństwa przynależności do znanej kategorii ze znanego zestawu możliwych kategorii, w którym to przypadku zamiast warstwy softmax jako wyjścia, „ d może mieć po prostu ważoną sumę danych wejściowych plus odchylenie bez funkcji aktywacji.

Mam nadzieję, że ta odpowiedź pomoże innym początkującym użytkownikom, nie będąc zbyt uproszczonym i oczywistym.


3

Przesłanie twojego pytania

Gdzie jest część (1-y_train) * log (1-y_output) w większości przykładów TensorFlow? Nie brakuje?

Odpowiedź jest taka, że ​​większość funkcji wyjściowych to softmax. Oznacza to, że niekoniecznie musisz redukować wszystkie prawdopodobieństwa w niewłaściwych przypadkach, ponieważ zostaną one automatycznie zmniejszone, gdy zwiększysz prawdopodobieństwo właściwego

Na przykład:

przed optymalizacją

y_output = [0.2, 0.2, 0.6] i y_train = [0, 0, 1]

po optymalizacji

y_output = [0.15, 0.15, 0.7] i y_train = [0, 0, 1]

zauważ tutaj, że chociaż właśnie zwiększyliśmy trzeci termin, wszystkie pozostałe warunki zostaną automatycznie zmniejszone

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.