Jak walczyć z niedopasowaniem w głębokiej sieci neuronowej

50

Kiedy zaczynałem od sztucznych sieci neuronowych (NN), pomyślałem, że będę musiał walczyć z nadmiernym dopasowaniem jako głównym problemem. Ale w praktyce nie mogę nawet sprawić, aby mój NN przekroczył barierę 20% poziomu błędu. Nie mogę nawet pobić mojego wyniku w losowym lesie!

Szukam bardzo ogólnych lub niezbyt ogólnych wskazówek, co należy zrobić, aby NN zaczął rejestrować trendy w danych.

Do implementacji NN używam Theano Stacked Auto Encoder z kodem z samouczka, który działa świetnie (poziom błędu poniżej 5%) do klasyfikacji zestawu danych MNIST. Jest to perceptron wielowarstwowy, z warstwą softmax na górze, a każdy ukryty później jest wstępnie trenowany jako autoencoder (w pełni opisany w samouczku , rozdział 8). Istnieje ~ 50 funkcji wejściowych i ~ 10 klas wyjściowych. NN ma neurony esicy i wszystkie dane są znormalizowane do [0,1]. Próbowałem wielu różnych konfiguracji: liczba ukrytych warstw i neuronów w nich (100-> 100-> 100, 60-> 60-> 60, 60-> 30-> 15 itd.), Różne uczenie się i szkolenie wstępne stawki itp.

A najlepsze, co mogę uzyskać, to 20% poziom błędu w zestawie sprawdzania poprawności i 40% poziom błędu w zestawie testowym.

Z drugiej strony, kiedy próbuję użyć Losowego lasu (od scikit-learn), łatwo uzyskuję 12% poziom błędu w zestawie sprawdzania poprawności i 25% (!) W zestawie testowym.

Jak to możliwe, że moje głębokie NN ze wstępnym treningiem zachowuje się tak źle? Co powinienem spróbować

izhak
źródło

Odpowiedzi:

34

Problem z głębokimi sieciami polega na tym, że mają one wiele hiperparametrów do dostrojenia i bardzo małą przestrzeń rozwiązania. Tak więc znalezienie dobrych jest bardziej sztuką niż inżynierią. Zacznę od pracy z samouczkiem i zabawy z jego parametrami, aby zobaczyć, jak zmieniają się wyniki - daje to dobrą intuicję (choć nie formalne wyjaśnienie) na temat zależności między parametrami a wynikami (zarówno końcowymi, jak i pośrednimi).

Również bardzo przydatne okazały się następujące dokumenty:

Oba opisują RBM, ale ogólnie zawierają pewne spostrzeżenia na temat głębokich sieci. Na przykład jednym z kluczowych punktów jest konieczność debugowania sieci pod względem warstw - jeśli poprzednia warstwa nie zapewnia dobrej reprezentacji funkcji, kolejne warstwy nie mają prawie szansy na jej naprawienie.

przyjaciel
źródło
14

Podczas gdy odpowiedź ffriend daje doskonałe wskazówki, aby dowiedzieć się więcej o tym, jak sieci neuronowe mogą być (niezwykle) trudne do dostrojenia właściwie, pomyślałem, że pomocne może być podanie kilku konkretnych technik, które są obecnie stosowane w najbardziej wydajnych architekturach klasyfikacyjnych w sieci neuronowej literatura.

Rektyfikowane aktywacje liniowe

Pierwszą rzeczą, która może pomóc w twoim przypadku, jest przełączenie funkcji aktywacji modelu z logistycznej sigmoid - - na rektyfikowany liniowy (aka relu) - .f(z)=(1+ez)1f(z)=max(0,z)

Aktywacja relu ma dwie duże zalety:

  • jego wyjście to prawdziwe zero (nie tylko niewielka wartość bliska zeru) dla iz0
  • jego pochodna jest stała, albo 0 dla albo 1 dla .z0z>0

Sieć jednostek relu zasadniczo działa jak zespół wykładniczo wielu sieci liniowych, ponieważ jednostki, które odbierają wejściowe są zasadniczo „wyłączone” (ich wyjście wynosi 0), podczas gdy jednostki, które otrzymują wejściowe zapadają się w jedną liniową model dla tego wejścia. Ważne są również stałe pochodne, ponieważ głęboka sieć z aktywacjami relu pozwala uniknąć problemu znikania gradientu i może być trenowana bez wstępnego szkolenia warstwowego.z0z>0

Zobacz „Deep Sparse Rectifier Neural Networks” Glorot, Bordes i Bengio ( http://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf ), aby uzyskać dobry artykuł na te tematy.

Spadkowicz

Wiele grup badawczych w ciągu ostatnich kilku lat opowiadało się za wykorzystaniem „porzucania” w sieciach klasyfikatorów, aby uniknąć przetrenowania. (Zobacz na przykład „Dropout: Prosty sposób zapobiegania nadmiernemu dopasowaniu sieci neuronowych” Srivastava, Hinton, Krizhevsky, Sutskever i Salakhutdinov http://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf ) W W trakcie treningu niektóre stałe proporcje jednostek w danej warstwie są losowo ustawiane na 0 dla każdego wejścia przetwarzanego przez sieć. Zmusza to jednostki, które nie są ustawione na 0, do „uzupełnienia” „brakujących” jednostek. Upadek wydaje się być niezwykle skutecznym regulatorem dla modeli sieci neuronowych w zadaniach klasyfikacyjnych. Zobacz artykuł na ten temat na blogu pod adresem http: // fastml.

lmjohns3
źródło
7
Ale pytanie dotyczy niedopasowania, a nie nadmiernego dopasowania.
Valentas,
8

Być może zainteresuje Cię następujący artykuł naukowców z Microsoft Research:

Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun: Deep Residual Learning for Recognition on arxiv, 2015.

Mieli podobne problemy jak ty:

Gdy głębsze sieci są w stanie rozpocząć konwergencję, ujawniono problem degradacji: wraz ze wzrostem głębokości sieci dokładność zostaje nasycona (co może być nieoczekiwane), a następnie gwałtownie spada. Nieoczekiwanie taka degradacja nie jest spowodowana nadmiernym dopasowaniem, a dodanie większej liczby warstw do odpowiednio głębokiego modelu prowadzi do wyższego błędu treningu , jak podano w [11, 42] i dokładnie zweryfikowano w naszych eksperymentach.

Aby rozwiązać problem, wykorzystali architekturę pominięcia. Dzięki temu przeszkolili bardzo głębokie sieci (1202 warstwy) i osiągnęli najlepszy wynik w konkursie ILSVRC 2015.

Martin Thoma
źródło
Dziękuję za ans, bierzesz pod uwagę znikający problem z gradientem, jeśli w przypadku, gdy acc walidacji jest wyższy niż acc treningowy, co należy zrobić? Może się to zdarzyć w przypadku niewielkiej liczby danych w zestawie Val, ale czasami nie zależy to od zestawu Val. Pytam, czy jest jakiś inny powód, dla którego val acc jest wyższy niż acc treningowy?
Sudip Das