Różnica funkcji aktywacyjnych w sieciach neuronowych ogólnie

15

Badałem typy funkcji aktywacyjnych dla sieci neuronowych. Same funkcje są dość proste, ale różnica w aplikacji nie jest do końca jasna.

Rozsądne jest rozróżnienie funkcji typu logicznego i liniowego, w zależności od pożądanego wyjścia binarnego / ciągłego, ale jaka jest przewaga funkcji sigmoidalnej nad prostą funkcją liniową?

ReLU jest dla mnie szczególnie trudne do zrozumienia, na przykład: po co używać funkcji, która zachowuje się liniowo w przypadku pozytywnych danych wejściowych, ale jest „płaska” w przypadku negatywów? Jaka jest intuicja? A może to tylko prosta próba błędu, nic więcej?

Hendrik
źródło

Odpowiedzi:

16

Podobne pytanie zostało zadane w CV: Kompleksowa lista funkcji aktywacyjnych w sieciach neuronowych z zaletami / wadami .

Kopiuję poniżej jedną z odpowiedzi:

Jedna taka lista, choć niezbyt wyczerpująca: http://cs231n.github.io/neural-networks-1/

Często używane funkcje aktywacji

Każda funkcja aktywacji (lub nieliniowość ) pobiera jedną liczbę i wykonuje na niej pewną stałą operację matematyczną. W praktyce istnieje kilka funkcji aktywacyjnych:

wprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutaj

Po lewej: Nieliniowość sigmoidalna powoduje zmiażdżenie liczb rzeczywistych w zakresie od [0,1] Po prawej: Nieliniowość sigmoidalna zmiażdży liczby rzeczywiste w zakresie od [-1,1].

Sigmoid. Nieliniowość sigmoidalna ma postać matematyczną i jest pokazana na powyższym obrazku po lewej stronie. Jak wspomniano w poprzedniej sekcji, przyjmuje liczbę o wartościach rzeczywistych i „zgniata” ją w zakresie od 0 do 1. W szczególności duże liczby ujemne stają się 0, a duże liczby dodatnie - 1. Funkcja sigmoidalna była często używana w przeszłości ponieważ ma niezłą interpretację jako szybkość odpalania neuronu: od całkowitego odpalenia (0) do pełnego nasycenia przy założonej maksymalnej częstotliwości (1). W praktyce sigmoidalna nieliniowość ostatnio popadła w niełaskę i jest rzadko używana. Ma dwie główne wady:σ(x)=1/(1+mi-x)

  • Sigmoidy nasycają i zabijają gradienty . Bardzo niepożądaną właściwością esicy neuronu jest to, że gdy aktywacja neuronu nasyca się na ogonie 0 lub 1, gradient w tych regionach jest prawie zerowy. Przypomnij sobie, że podczas propagacji wstecznej ten (lokalny) gradient zostanie pomnożony przez gradient wyniku tej bramki dla całego celu. Dlatego jeśli lokalny gradient jest bardzo mały, skutecznie „zabije” gradient i prawie żaden sygnał nie przepłynie przez neuron do jego wag i rekurencyjnie do jego danych. Ponadto należy zachować szczególną ostrożność podczas inicjowania ciężaru neuronów esowatych, aby zapobiec nasyceniu. Na przykład, jeśli początkowe ciężary są zbyt duże, wówczas większość neuronów zostanie nasycona, a sieć prawie się nie nauczy.
  • Wyjścia sigmoidalne nie są wyśrodkowane na zero . Jest to niepożądane, ponieważ neurony w późniejszych warstwach przetwarzania w sieci neuronowej (więcej o tym wkrótce) otrzymywałyby dane, które nie są wyśrodkowane. Ma to wpływ na dynamikę podczas opadania gradientu, ponieważ jeśli dane wchodzące do neuronu są zawsze dodatnie (np. elementarnie w )), to gradient na wagach będzie podczas propagacji wstecznej stanie się albo wszystkie są dodatnie lub wszystkie ujemne (w zależności od gradientu całego wyrażenia x>0fa=wT.x+bwfa). Może to wprowadzić niepożądaną dynamikę zygzakowatą w aktualizacjach gradientu dla odważników. Należy jednak zauważyć, że po dodaniu tych gradientów do partii danych ostateczna aktualizacja wag może mieć zmienne znaki, co nieco łagodzi ten problem. Jest to zatem niedogodność, ale ma mniej poważne konsekwencje w porównaniu do powyższego problemu z nasyconą aktywacją.

Tanh Nieliniowość tanh pokazano na powyższym obrazku po prawej stronie. Zgniata liczbę rzeczywistą do zakresu [-1, 1]. Podobnie jak sigmoidalny neuron, jego aktywacje są nasycone, ale w przeciwieństwie do sigmoidalnego neuronu jego moc wyjściowa jest zerowa. Dlatego w praktyce nieliniowość tanh jest zawsze preferowana w stosunku do nieliniowości sigmoidalnej. Zauważ także, że neuron tanh jest po prostu skalowanym neuronem esowatym, w szczególności następujące: .tanh(x)=2)σ(2)x)-1

wprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutaj

Po lewej: funkcja aktywacji rektyfikowanej jednostki liniowej (ReLU), która wynosi zero, gdy x <0, a następnie liniowa ze spadkiem 1, gdy x> 0. Po prawej: Wykres z Kriżewskiego i in. (pdf) dokument wskazujący na 6-krotną poprawę konwergencji z jednostką ReLU w porównaniu z jednostką tanh.

ReLU. Prostowana jednostka liniowa stała się bardzo popularna w ciągu ostatnich kilku lat. Oblicza funkcję . Innymi słowy, aktywacja jest po prostu progowana na zero (patrz zdjęcie powyżej po lewej). Istnieje kilka zalet i wad korzystania z ReLU:fa(x)=max(0,x)

  • (+) Stwierdzono, że znacznie przyspiesza (np. Współczynnik 6 w Kriżewskim i wsp. ) Zbieżność stochastycznego spadku gradientu w porównaniu z funkcjami sigmoid / tanh. Twierdzi się, że wynika to z jego liniowej, nienasyconej formy.
  • (+) W porównaniu do neuronów tanh / sigmoidalnych, które wymagają drogich operacji (wykładnicze itp.), ReLU można wdrożyć, po prostu progując macierz aktywacji na zero.
  • (-) Niestety jednostki ReLU mogą być kruche podczas treningu i mogą „umrzeć”. Na przykład duży gradient przepływający przez neuron ReLU może spowodować aktualizację wag w taki sposób, że neuron nigdy więcej się nie aktywuje w żadnym punkcie danych. Jeśli tak się stanie, gradient przepływający przez jednostkę będzie na zawsze wynosił zero od tego momentu. Oznacza to, że jednostki ReLU mogą nieodwracalnie umrzeć podczas treningu, ponieważ mogą zostać zrzucone z rozmaitości danych. Na przykład może się okazać, że nawet 40% twojej sieci może być „martwe” (tj. Neurony, które nigdy nie aktywują się w całym zestawie danych treningowych), jeśli szybkość uczenia się jest ustawiona zbyt wysoko. Przy odpowiednim ustawieniu szybkości uczenia się jest to rzadziej problem.

Nieszczelne ReLU. Nieszczelne ReLU to jedna z prób rozwiązania problemu „umierania ReLU”. Zamiast funkcji wynoszącej zero, gdy x <0, nieszczelna ReLU będzie miała małe ujemne nachylenie (około 0,01 lub więcej). Oznacza to, że funkcja oblicza gdzie jest małą stałą. Niektóre osoby zgłaszają sukces dzięki tej formie funkcji aktywacji, ale wyniki nie zawsze są spójne. Nachylenie w regionie ujemnym można również przekształcić w parametr każdego neuronu, jak widać w neuronach PReLU, wprowadzonych w Delving Deep into Rectifiers , przez Kaiming He i in., 2015. Jednak spójność korzyści między zadaniami jest obecnie niejasny.fa(x)=1(x<0)(αx)+1(x> =0)(x)α

wprowadź opis zdjęcia tutaj

Maxout . Zaproponowano inne typy jednostek, które nie mają postaci funkcjonalnej której nieliniowość jest stosowana do iloczynu kropkowego między wagami a danymi. Stosunkowo popularnym wyborem jest neuron Maxout (wprowadzony niedawno przez Goodfellow i in. ), Który uogólnia ReLU i jego nieszczelną wersję. Neuron Maxout oblicza funkcję . Zauważ, że zarówno ReLU, jak i Leaky ReLU są szczególnym przypadkiem tego formularza (na przykład dla ReLU mamyfa(wT.x+b)max(w1T.x+b1,w2)T.x+b2))w1,b1=0). Dlatego neuron Maxout cieszy się wszystkimi zaletami jednostki ReLU (liniowy reżim działania, brak nasycenia) i nie ma swoich wad (umierający ReLU). Jednak w przeciwieństwie do neuronów ReLU podwaja liczbę parametrów dla każdego pojedynczego neuronu, co prowadzi do dużej całkowitej liczby parametrów.

To kończy naszą dyskusję na temat najczęstszych rodzajów neuronów i ich funkcji aktywacyjnych. Ostatnim komentarzem jest bardzo rzadkie mieszanie i łączenie różnych typów neuronów w tej samej sieci, chociaż nie ma z tym podstawowego problemu.

TLDR : „ Jakiego typu neuronu powinienem użyć? ” Użyj nieliniowości ReLU, uważaj na szybkość uczenia się i ewentualnie monitoruj ułamek „martwych” jednostek w sieci. Jeśli dotyczy to Ciebie, wypróbuj Leaky ReLU lub Maxout. Nigdy nie używaj sigmoidu. Spróbuj tanh, ale spodziewaj się, że będzie działać gorzej niż ReLU / Maxout.


Licencja:


Licencja MIT (MIT)

Prawa autorskie (c) 2015 Andrej Karpathy

Niniejszym udziela się bezpłatnie każdej osobie, która otrzymuje kopię tego oprogramowania i powiązanych plików dokumentacji („Oprogramowanie”), do czynienia z Oprogramowaniem bez ograniczeń, w tym między innymi prawa do używania, kopiowania, modyfikowania, łączenia , publikować, rozpowszechniać, udzielać podlicencji i / lub sprzedawać kopie Oprogramowania oraz zezwalać na to osobom, którym Oprogramowanie zostało dostarczone, z zastrzeżeniem następujących warunków:

Powyższa informacja o prawach autorskich i niniejsza informacja o pozwoleniu będą zawarte we wszystkich kopiach lub znacznych częściach Oprogramowania.

OPROGRAMOWANIE JEST DOSTARCZANE „W STANIE, W JAKIM JEST”, BEZ ŻADNEJ GWARANCJI, WYRAŹNEJ LUB DOROZUMIANEJ, W TYM, ALE NIE OGRANICZONE DO GWARANCJI PRZYDATNOŚCI HANDLOWEJ, PRZYDATNOŚCI DO OKREŚLONEGO CELU I NARUSZENIA. W ŻADNYM WYPADKU AUTORZY LUB POSIADACZE PRAW AUTORSKICH NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK ROSZCZENIE, SZKODY LUB INNE ODPOWIEDZIALNOŚCI, NAWET W DZIAŁANIU UMOWY, TORTU LUB INNYCH INNYCH DZIAŁALNOŚCI, WYNIKAJĄCE Z, LUB ZWIĄZANE Z OPROGRAMOWANIEM LUB WYKORZYSTANIEM LUB INNYMI OKREŚLENIAMI OPROGRAMOWANIE.*

Franck Dernoncourt
źródło
Dzięki, to podsumowanie daje pewien wgląd, ale, szczerze mówiąc, wciąż nie jestem w stanie zrozumieć niektórych szczegółów intuicyjnie (np. Dlaczego ReLU „znacznie przyspiesza konwergencję SGD”), a przede wszystkim: który wybrać? Na podstawie wniosku, Maxout jest najlepszy i to już koniec. Ale poza tym, że Maxout nie jest zaimplementowany w najpopularniejszych pakietach (na przykład w Keras), wydaje mi się rozsądne, że przynajmniej w ostatniej warstwie należy umieścić inne typy (na przykład sigmoid dla dwuklasyfikacji).
Hendrik,