2012-11-29 24 views
8

Używam sieci neuronowej zbudowanej z 4 neuronów wejściowych, 1 ukrytej warstwy zbudowanej z 20 neuronów i warstwy wyjściowej 7 neuronów.Sieć neuronowa z tanh niewłaściwym nasyceniem ze znormalizowanymi danymi

Próbuję wyszkolić go na algorytm bcd do 7 segmentów. Moje dane normalizuje 0 -1 i 1 to 1.

Gdy ocena błąd wyjścia nastąpi, neuron nasyca źle. Jeśli żądanym wyjściem jest 1, a rzeczywistym wyjściem jest -1, błąd wynosi 1-(-1)= 2.

Po pomnożeniu przez pochodną funkcji aktywacji error*(1-output)*(1+output), błąd staje się prawie 0 Z powodu 2*(1-(-1)*(1-1).

Jak mogę uniknąć tego błędu nasycenia?

+0

Więc to może być po prostu nie moja domena ale nie mam bladego pojęcia, jak to jest możliwe, aby rozwiązać ten z podanych informacji.Nie wiem też, czy "tan" to literówka czy hiperboliczna styczna. – djechlin

+0

tanh jest hangboliczny styczny :) – PVJ

Odpowiedz

7

Nasycenie asymptotami funkcji aktywacji jest częstym problemem z sieciami neuronowymi. Jeśli spojrzysz na wykres funkcji, to nie jest zaskoczeniem: są prawie płaskie, co oznacza, że ​​pierwsza pochodna jest (prawie) 0. Sieć nie może się więcej nauczyć.

Prostym rozwiązaniem jest przeskalowanie funkcji aktywacji, aby uniknąć tego problemu. Na przykład, w tanh() funkcji aktywacji (mój ulubiony), to zaleca się stosowanie następujących funkcji aktywacji, gdy sygnał wyjściowy jest {-1, 1}

f(x) = 1.7159 * tanh(2/3 * x) 

W związku z tym pochodna

f'(x) = 1.14393 * (1- tanh(2/3 * x)) 

To zmusi gradienty do najbardziej nieliniowego zakresu wartości i przyspieszy proces uczenia. Dla wszystkich szczegółów polecam czytanie wspaniałego papieru Yanna LeCun'a: Efficient Back-Prop. W przypadku aktywacji funkcji tanh) (, błąd zostanie obliczona jako

error = 2/3 * (1.7159 - output^2) * (teacher - output) 
+2

Pochodna jest błędna, powinna być: 'f '(x) = 1,14393 * (1-sza^2 (2/3 * x))' => 'f' (x) = 0,6667 * 1,7159 * (1 - tanh (2/3 * x)) * (1 + tanh (2/3 * x))) ' => f '(x) = 0,6667/1,7159 * (1,7159 - 1,7159 * tanh (2/3 * x)) * (1,7159 + 1,7159 * tanh (2/3 * x)) ' => 'f' (x) = 0,6667/1,7159 * (1,7159 - f (x)) * (1,7159 + f (x)) ' –

+0

Sprawdziłem pochodną numerycznie https://github.com/hughperkins/ClConvolve/blob/master/notes/numericbackprop.gnumeric, a Twoje formuły są poprawne Fukuzawa. –

2

Jest to możliwe bez względu na to, z jakiej funkcji korzystasz. Pochodna z definicji będzie wynosić zero, gdy wyjście osiągnie jedną z dwóch skrajności. Minęło trochę czasu, odkąd pracowałem z Artificial Neural Networks, ale jeśli dobrze pamiętam, to (między innymi) jest jednym z ograniczeń stosowania prostego algorytmu propagacji wstecznej.

Można dodać Momentum factor aby upewnić się, że jest jakaś korekta opiera się wcześniejsze doświadczenia, nawet gdy pochodna jest równa zero.

Można też trenować go przez epoki, gdzie gromadzą wartości delta dla ciężarów przed wykonaniem rzeczywistego aktualizacji (w porównaniu do jego aktualizacji każdej iteracji). To również łagodzi warunki, w których wartości delta oscylują pomiędzy dwiema wartościami.

Nie może być bardziej zaawansowane metody, takie jak metody drugiego rzędu dla pleców propagacji, które złagodzą ten konkretny problem.

Jednakże, należy pamiętać, że tanh osiąga -1 albo +1 w nieskończoności, a problem jest czysto teoretyczna.

0

nie całkowicie pewien, czy mam poprawnie czyta pytanie, ale jeśli tak, to należy skalować swoje wejścia i cele między 0,9 i -0.9 które mogłyby pomóc swoim pochodne być bardziej rozsądny.

+0

@danelliotster Możesz edytować swoją odpowiedź, aby pokazać, jak będzie wyglądać pochodna. Uspokoiłem się w pośpiechu. Nie mogę tego teraz cofnąć, chyba że jest edycja. –

Powiązane problemy