Zbieżność wag sieci neuronowej

10

Doszedłem do sytuacji, w której wagi mojej sieci neuronowej nie są zbieżne nawet po 500 iteracjach. Moja sieć neuronowa zawiera 1 warstwę wejściową, 1 warstwę ukrytą i 1 warstwę wyjściową. Są to około 230 węzłów w warstwie wejściowej, 9 węzłów w warstwie ukrytej i 1 węzeł wyjściowy w warstwie wyjściowej. Chciałem wiedzieć, czy zrobię warunek wczesnego zatrzymania (powiedzmy, że zatrzymam trening sieci neuronowej po 100 iteracjach). Jaki będzie to miało wpływ na model?

Chciałeś również wiedzieć, jaki jest branżowy standard pracy, jeśli wagi w sieci neuronowej nie są zbieżne?

Uczeń
źródło
Czy twoje dane są odpowiednio znormalizowane? Jest to zwykle powód takiego zachowania.
sashkello
Zwykle liczba neuronów w ukrytej warstwie powinna być tego samego rozmiaru, co w warstwie wejściowej. Myślę, że 9 neuronów jest zdecydowanie za małe. Czy próbowałeś zwiększyć do 200-300 neuronów?
ThiS
@sashkello Tak Dane są poprawnie znormalizowane.
Uczeń
1
@juampa Nie ma powodu, aby mieć 9 węzłów w ukrytej warstwie. uważaliśmy, że posiadanie większej liczby węzłów w ukrytej warstwie zwiększy złożoność sieci i przepełni dane.
Uczeń
3
Musisz podać nieco więcej wyjaśnień. Jaki problem rozwiązujesz? Ile masz punktów danych treningowych? Co masz na myśli mówiąc, że nie zbiegasz się? - czy masz na myśli tylko to, że wyniki (na zestawie treningowym) są złe, lub że twoje masy nie są zbieżne ... jeśli zbieżność masy jest konieczna, musisz zastosować niższy wskaźnik uczenia się lub zwężający się wskaźnik uczenia się. Możesz także użyć regresji logistycznej / liniowej jako linii podstawowej. wreszcie, jak skorelowane są twoje dane wejściowe? Jeśli są bardzo skorelowane, normalizacja nie będzie wystarczająca i należy rozważyć diagonalizację (inaczej PCA).
seanv507

Odpowiedzi:

13

Istnieje szereg pytań, które należy zadać:

  • czy masz odpowiednią liczbę neuronów w każdej warstwie
  • czy korzystasz z odpowiednich rodzajów funkcji przesyłania?
  • czy używasz odpowiedniego rodzaju algorytmu uczenia się?
  • czy masz wystarczająco dużą próbkę?
  • czy możesz potwierdzić, że twoje próbki mają ze sobą odpowiednie relacje, aby uzyskać informacje? (niepotrzebne, o odpowiednich wymiarach itp.)

Co możesz dać na drodze efemeryd? Czy możesz nam powiedzieć coś o naturze danych?

Możesz zrobić wzmocnione gradientem drzewo sieci neuronowych.

Zapytałeś, co się stanie, jeśli przestaniesz wcześnie.

Możesz spróbować sam. Uruchom 300x, gdy zaczynasz od losowo zainicjowanych wag, a następnie zatrzymaj się na określonej liczbie iteracji, powiedzmy 100. W tym momencie obliczyć błąd zespołu, błąd podzbioru szkolenia i błąd zestawu testowego. Powtarzać. Po uzyskaniu 300 wartości określających błąd można uzyskać obraz rozkładu błędów, biorąc pod uwagę 100 iteracji uczenia się. Jeśli chcesz, możesz następnie wypróbować ten rozkład w kilku innych wartościach uczenia się. Sugeruję iteracje 200, 500 i 1000. To da ci wyobrażenie o tym, jak twój SNR zmienia się w czasie. Wykres SNR vs iteracja może dać ci wyobrażenie o „klifach” lub „wystarczająco dobrym”. Czasami są klify, w których zawodzi błąd. Czasami błąd jest akceptowalny w tym momencie.

System potrzebuje „względnie prostych” danych lub „całkiem niezłego” szczęścia, aby system stale zbierał się w mniej niż 100 iteracjach. Oba nie dotyczą powtarzalności ani nie są uogólnialne.

Dlaczego myślisz w kategoriach zbieżności wag, a nie błędu poniżej określonego progu. Czy słyszałeś kiedyś o paradoksie głosowania? ( link ) Kiedy masz cykliczne interakcje w swoim systemie (takie jak informacje zwrotne w sieciach neuronowych), możesz mieć paradoksy głosowania - zmiany powiązane. Nie wiem, czy same wagi są wystarczającym wskaźnikiem konwergencji sieci.

Możesz myśleć o ciężarach jako o przestrzeni. Ma więcej niż 3 wymiary, ale wciąż jest przestrzenią. W „środku ciężkości” tej przestrzeni znajduje się region „najlepiej dopasowany”. Daleko od środka ciężkości jest mniej dobre dopasowanie. Możesz myśleć o bieżącym ustawieniu swoich ciężarów jako o pojedynczym punkcie w tej przestrzeni.

Teraz nie wiesz, gdzie właściwie jest „dobro”. To, co masz, to lokalny „stok”. Możesz wykonać zniżanie gradientu w kierunku lokalnego „lepszego”, biorąc pod uwagę, gdzie jest teraz twój punkt. Nie mówi ci „uniwersalny” lepiej, ale lokalny jest lepszy niż nic.

Zaczynasz iterować, idąc w dół w kierunku doliny lepszości. Iterujesz, dopóki nie pomyślisz, że skończyłeś. Może wartość twoich ciężarów jest duża. Może odbijają się wszędzie. Może obliczenia „trwają zbyt długo”. Chcesz to zrobić

Skąd więc wiesz, czy to, gdzie jesteś, jest „wystarczająco dobre”?

Oto szybki test, który możesz wykonać:

Weź 30 jednolitych losowych podzbiorów danych (na przykład kilka procent danych) i ponownie przeszkol w nich sieć. Powinno być znacznie szybciej. Obserwuj, jak długo trwa ich konwergencja i porównaj go z historią zbieżności dużego zestawu. Przetestuj błąd sieci dla wszystkich danych w tych podzbiorach i zobacz, jak ten rozkład błędów wypada w porównaniu z dużym błędem. Teraz zwiększ rozmiary podzbiorów do 5% danych i powtórz. Zobacz, czego Cię to uczy.

Jest to wariacja na temat optymalizacji roju cząstek (patrz odnośnik) wzorowana na tym, jak pszczoły miodne podejmują decyzje na podstawie badań.

Zapytałeś, co się stanie, jeśli wagi się nie zbiegną.

Sieci neuronowe są jednym narzędziem. Nie są jedynym narzędziem. Są inni. Chciałbym użyć jednego z nich.

Pracuję w kategoriach kryteriów informacyjnych, więc patrzę zarówno na wagi (liczbę parametrów), jak i na błąd. Możesz spróbować jednego z nich.

Istnieje kilka rodzajów przetwarzania wstępnego, które mogą być przydatne. Wyśrodkuj i skaluj. Obracaj za pomocą głównych komponentów. Jeśli spojrzysz na wartości własne w głównych komponentach, możesz użyć reguł wykresu skree do oszacowania wymiaru danych. Zmniejszenie wymiaru może poprawić konwergencję. Jeśli wiesz coś na temat „fizyki leżącej u podstaw”, możesz wygładzić lub przefiltrować dane w celu usunięcia szumu. Czasami konwergencja dotyczy hałasu w systemie.

Uważam, że idea wykrywania skompresowanego jest interesująca. Może umożliwić radykalne podpróbkowanie niektórych systemów bez utraty uogólnienia. Przyjrzałbym się niektórym statystykom ponownego próbkowania bootstrap i rozkładom twoich danych, aby ustalić, czy i na jakim poziomie podpróbkowania zestaw szkoleniowy staje się reprezentatywny. To daje ci pewną miarę „zdrowia” twoich danych.

Czasami dobrze, że się nie zbiegają

Czy słyszałeś kiedyś o paradoksie głosowania? Możesz myśleć o tym jak o większej liczbie kuzynów do dwukierunkowego impasu. To jest pętla. W paradoksie głosowania dla 2 osób pierwsza osoba chce kandydata „A”, a druga kandydata „B” (lub nie-A lub podobnego). Ważną częścią jest to, że możesz myśleć o tym jak o pętli.

Pętle są ważne w sieciach neuronowych. Sprzężenie zwrotne. Rekurencja Dzięki temu perceptron był w stanie rozwiązać problemy podobne do XOR. Tworzy pętle, a czasami pętle mogą zachowywać się jak paradoks głosowania, w którym będą się zmieniać wagi, jeśli będziesz miał nieskończoną liczbę iteracji. Nie są przeznaczone do zbieżności, ponieważ to nie indywidualna waga ma znaczenie, ale interakcja ciężarów w pętli.

Uwaga:

Problemem może być użycie tylko 500 iteracji. Miałem NN, gdzie 10 000 iteracji było ledwo wystarczające. Liczba iteracji, aby być „wystarczającą”, zależy, jak już wskazałem, od danych, topologii NN, funkcji przesyłania węzłów, funkcji uczenia / szkolenia, a nawet sprzętu komputerowego. Musisz dobrze zrozumieć, w jaki sposób wszystkie one wchodzą w interakcję z twoją iteracją, zanim powiesz, że było „wystarczająco” lub „zbyt wiele” iteracji. Należy również wziąć pod uwagę inne kwestie, takie jak czas, budżet i to, co chcesz zrobić z NN po zakończeniu szkolenia.

Chen, RB, Chang, SP, Wang, W. i Wong, WK, (2011, wrzesień). Optymalne projekty eksperymentalne za pomocą metod optymalizacji roju cząstek (przedruk), Źródło: 25 marca 2012 r., Http://www.math.ntu.edu.tw/~mathlib/preprint/2011-03.pdf

EngrStudent
źródło
2

Trudno mi powiedzieć, jaki może być twój problem. Jednym z punktów do rozważenia jest konkretna implementacja, której używasz. Konkretnie, jaki algorytm optymalizacji. Jeśli połączenie sieci zajmuje dużo czasu, a używasz jakiejś formy stochastycznego spadku gradientu (lub mini-partii), być może sieć znajduje się na płaskowyżu (region, w którym funkcja energii / błędu jest bardzo płaska tak że gradienty są bardzo niskie, a zatem zbieżne).

Jeśli tak, sprawdź wielkość gradientów, aby sprawdzić, czy tak jest. Istnieje wiele różnych technik radzenia sobie z tym problemem, takich jak dodanie impetu do gradientu.

Aby zapoznać się ze szczegółowym przeglądem technik i sztuczek związanych z handlem, zapoznaj się z (koniecznie przeczytaj) artykułem Yanna LeCuna .

jpmuc
źródło
1

Upewnij się, że twoje gradienty nie przekraczają limitów lub możliwe, że gradienty stają się zerowe. Jest to powszechnie znane jako eksplodowanie gradientów i znikanie problemów z gradientami.

Jednym z możliwych rozwiązań jest użycie adaptacyjnego optymalizatora, takiego jak AdaGrad lub Adam.

Napotkałem podobny problem podczas szkolenia prostej sieci neuronowej, kiedy zaczynałem pracę z sieciami neuronowymi.

Kilka referencji: https://en.wikipedia.org/wiki/Vanishing_gradient_problem https://www.youtube.com/watch?v=VuamhbEWEWA

Yeshwanth Venkatesha
źródło
0

Miałem wiele zestawów danych, które zbiegały się powoli - prawdopodobnie dlatego, że dane wejściowe były wysoce skorelowane.

Napisałem własny analizator C ++ NN i dzięki nim mogę zmieniać szybkość uczenia się dla każdej wagi. Dla każdej wagi na każdej krawędzi robię dwie rzeczy, które pomagają niektórym.

Najpierw mnożę każdy wskaźnik uczenia się przez równomiernie rozłożoną liczbę losową z [0,1]. Zgaduję, że to pomaga w problemie z korelacją.

Inną sztuczką jest to, że porównuję bieżący gradient z poprzednim gradientem na każdej krawędzi. Jeśli gradient nieznacznie obniżył się procentowo, to mnożę szybkość uczenia się dla tej krawędzi przez maksymalnie 5.

Nie mam żadnego konkretnego uzasadnienia dla żadnej z tych sztuczek, ale wydają się one działać całkiem dobrze.

Mam nadzieję że to pomoże.

Bill Davy
źródło