Inicjalizacja wagi CNN Xaviera

14

W niektórych samouczkach stwierdziłem, że inicjalizacja wagi „Xaviera” (papier: Zrozumienie trudności w uczeniu głębokich sieci neuronowych ze sprzężeniem zwrotnym ) jest skutecznym sposobem inicjalizacji wag sieci neuronowych.

W przypadku w pełni połączonych warstw w tych samouczkach obowiązywała zasada:

Var(W)=2nin+nout,simpler alternative:Var(W)=1nin

gdzie to wariancja wag dla warstwy, zainicjowana rozkładem normalnym, a , to ilość neuronów w warstwie rodzicielskiej i w bieżącej warstwie.Var(W)ninnout

Czy istnieją podobne ogólne zasady dotyczące warstw splotowych?

Usiłuję wymyślić, co byłoby najlepsze, aby zainicjować wagi warstwy splotowej. Np. W warstwie, w której kształt ma kształt (5, 5, 3, 8), więc rozmiar jądra to 5x5, filtrowanie trzech kanałów wejściowych (wejście RGB) i tworzenie 8map cech ... czy można by uznać 3za ilość neuronów wejściowych? A może 75 = 5*5*3dlatego, że dane wejściowe to 5x5łatki dla każdego kanału kolorów?

Zaakceptowałbym obie, konkretną odpowiedź wyjaśniającą problem lub bardziej „ogólną” odpowiedź wyjaśniającą ogólny proces znajdowania właściwej inicjalizacji wag i najlepiej łączenia źródeł.

daniel451
źródło

Odpowiedzi:

13

W takim przypadku ilość neuronów powinna wynosić 5*5*3.

Uważam, że jest to szczególnie przydatne w przypadku warstw splotowych. Często działa również równomierny rozkład w przedziale . [c/(in+out),c/(in+out)]

Jest implementowany jako opcja w prawie wszystkich bibliotekach sieci neuronowych. Tutaj możesz znaleźć kod źródłowy implementacji Keras inicjalizacji Xaviera Glorota.

dontloo
źródło
1
Hmm .. czy masz jakieś dodatkowe porady? Np. Jedna z moich sieci ma w pełni połączoną warstwę z 480 000 neuronów. Jeśli zastosuję inicjalizację Xaviera, otrzymam wariancję około a moja sieć po prostu uczy się dziwnych wzorców interferencji. Wydaje mi się, że mieści się w lokalnym minimum. Mam na myśli, że ciężary są wtedy naprawdę małe. Przeważnie uczę się rozsądnie z czymś w przedziale czasowym . Jakieś pomysły na ten temat? Myślę, że inicjalizacja Xaviera nie dotyczy naprawdę dużych warstw? 1106[0.1,0.01]
daniel451
@ascenator przepraszam, nie wiem wiele o tym, jak zmieniają się ciężary podczas treningu. czasem dziwne wyniki mogą wynikać ze zbyt dużych / małych wskaźników uczenia się.
dontloo
Wiele bibliotek DL przyjmuje parametr odchylenia standardowego, a nie wariacji wariancji, jako parametr swoich metod generowania liczb losowych. Tak więc dla wariancji potrzebujesz standardowego odchylenia , co może wyjaśnić twoje wyniki. 106103
eric.mitchell,
0

Popieram tutaj odpowiedź Erica. Biorę również „sqrt” tego terminu, a nie tylko ten termin. Mimo to podłączenie sigmoidu głęboko w sieć do wyjścia „RelU” ... może spowodować zatrzymanie treningu. Wynika to z nieograniczonej mocy wyjściowej „Relu”, która może sprawić, że gradient sigmoid spadnie do zera i nie nastąpi uczenie. Tak więc w przypadkach mam współczynnik „scaleDown” dla mojej sieci, który będzie ważył odchylenie inicjalizacji o ten czynnik. Kontynuuję empiryczne dostrajanie wag, dopóki nie nastąpi nauka. Prostym sposobem na znalezienie jest zapisanie modelu natychmiast po 1 iteracji i sprawdzenie wyjścia RELU (podłączonego do sigmoid). Kontynuuj dostrajanie wag, aż wyjście RELU będzie rozsądne. A następnie użyj tych ciężarów do treningu. To dobry początek. Jeśli po kilku iteracjach nadal się zapada, zważ je nieco więcej, aż osiągniesz stabilność. To tylko hack, którego użyłem. Dla mnie to zadziałało. Więc dzielę się swoim doświadczeniem. Różne rzeczy działają w różnych konfiguracjach.

Więc powodzenia!

Sarnath K.
źródło