Używam tensorflow do pisania prostych sieci neuronowych w celu trochę badań i miałem wiele problemów z wagami „nan” podczas treningu. Próbowałem wielu różnych rozwiązań, takich jak zmiana optymalizatora, zmiana utraty, rozmiaru danych itp., Ale bezskutecznie. Wreszcie zauważyłem, że zmiana współczynnika uczenia się spowodowała niewiarygodną różnicę w moich wagach.
Przy zastosowaniu współczynnika uczenia się wynoszącego 0,001 (który uważałem za dość konserwatywny) funkcja minimalizacji faktycznie wykładniczo zwiększyłaby stratę. Po jednej epoce strata mogła wzrosnąć z liczby w tysiącach do trylionów, a następnie do nieskończoności („nan”). Kiedy obniżyłem wskaźnik uczenia się do 0,0001, wszystko działało dobrze.
1) Dlaczego pojedynczy rząd wielkości ma taki efekt?
2) Dlaczego funkcja minimalizacji dosłownie wykonuje przeciwieństwo swojej funkcji i maksymalizuje straty? Wydaje mi się, że to nie powinno się zdarzyć, bez względu na tempo uczenia się.
Odpowiedzi:
Pomocny może okazać się rozdział 8 głębokiego uczenia się . W nim autorzy omawiają szkolenie modeli sieci neuronowych. To bardzo skomplikowane, więc nie dziwię się, że masz trudności.
Jedną z możliwości (oprócz błędu użytkownika) jest to, że twój problem jest wysoce nieuzasadniony. Metody zejścia gradientu używają tylko pierwszej pochodnej (gradientu) informacji podczas obliczania aktualizacji. Może to powodować problemy, gdy druga pochodna (Hesjan) jest źle uwarunkowana.
Cytowanie autorów:
Autorzy przedstawiają proste wyprowadzenie, aby pokazać, że tak może być. Korzystając z opadania gradientu, funkcja kosztu powinna się zmienić (w drugim rzędzie) o
gdziesol jest gradientem, H. jest Hesjan i ε to współczynnik uczenia się. Oczywiście, jeśli drugie instrumenty pochodne są duże, pierwszy okres może zastąpić drugi, a funkcja kosztu wzrośnie, a nie zmniejszy. Ponieważ pierwszy i drugi termin różnią się skalą zε , jednym ze sposobów rozwiązania tego problemu jest ograniczenie ε (chociaż oczywiście może to skutkować zbyt wolnym uczeniem się).
źródło
Są dwa główne powody. Po pierwsze, nie używasz tych samych danych w pierwszym kroku niż w drugim. Jeśli w pierwszym kroku model pozna te wartości i spadnie do lokalnego minimum, istnieje duże prawdopodobieństwo, że przyniesie większe straty dla nowych wartości.
Drugim powodem jest kształt funkcji kosztu. Próbujesz zminimalizować wartość małymi krokami, długość tych kroków jest podana przez dwa czynniki: gradient i szybkość uczenia się. Obraz twojej funkcji jest jak x ^ 2. Jeśli twoje wartości są bliskie 0, gradient będzie mały, niż gdyby dalej, ale jeśli twoja szybkość uczenia się jest duża, zamiast zbliżyć się do 0, faktycznie zwiększasz błąd, ponieważ twój nowy punkt oparty na gradacji i wskaźnik uczenia się jest wyższy od 0 niż w poprzednim kroku. I może się to zdarzyć kilka razy.
Spójrz na ten link: http://www.statisticsviews.com/details/feature/5722691/Getting-to-the-Bottom-of-Regression-with-Gradient-Descent.html
Jeśli zobaczysz cyfry z alfa 0,01 i alfa 0,12, zobaczysz, jak na pierwszej cyfrze szybkość uczenia się jest mała, a więc gradient zbliża się do minimum, ale w drugim przypadku szybkość uczenia się jest tak duża, że gradient się przesuwa dalej na każdym kroku.
źródło