ML Atlas

06 · Sieci · 4 min czytania · Interaktywne · aktualizacja

Czym jest dropout w sieciach neuronowych i dlaczego zapobiega przeuczeniu?

W skrócie

Dropout w czasie treningu losowo wyłącza część neuronów, więc sieć nie może polegać na pojedynczych połączeniach i lepiej uogólnia na nowe dane.

Co to jest

Dropout to technika regularyzacji sieci neuronowych, w której podczas treningu każdy neuron danej warstwy jest w każdym kroku niezależnie wyłączany (jego wyjście zerowane) z prawdopodobieństwem p, typowo od 0,1 do 0,5. W czasie predykcji wszystkie neurony działają. Dzięki temu sieć nie może opierać decyzji na kilku wyspecjalizowanych neuronach i musi rozłożyć wiedzę na wiele niezależnych ścieżek.

Intuicja: zespół, w którym każdego dnia losowo połowa osób jest na urlopie. Nikt nie może być jedynym, kto zna ważny proces, bo jutro go zabraknie. Wiedza musi być powielona i zrozumiała dla wielu. Taki zespół jest odporniejszy na niespodzianki, choć każdego dnia pracuje nieco wolniej.

Dropout zaproponowali Hinton i współpracownicy w 2012 roku, a pełny opis opublikowali Srivastava i in. w 2014. Technika była kluczowym elementem pierwszych dużych sukcesów sieci konwolucyjnych w rozpoznawaniu obrazów. Dziś w transformerach stosuje się ją w mniejszej dawce, a w największych modelach językowych bywa całkiem wyłączana, bo przy ogromnej ilości danych przeuczenie jest mniejszym problemem.

Mechanizm — dlaczego tak działa

Przeuczona sieć często tworzy współzależności między neuronami (co-adaptation): neuron A ma sens tylko w połączeniu z konkretnym błędem neuronu B, który go koryguje. Takie układy dobrze pasują do zbioru treningowego, ale są kruche. Gdy w każdym kroku dowolny neuron może zniknąć, takie układy przestają się opłacać. Każdy neuron musi samodzielnie wykrywać coś użytecznego.

Drugie spojrzenie: dropout to tani zespół modeli. Każda maska wyłączeń wyznacza inną „podsieć”, a sieć z n neuronami ma 2ⁿ możliwych podsieci, które współdzielą wagi. Trening z dropoutem uczy ogromną liczbę takich podsieci naraz, po jednym kroku na każdą. W predykcji pełna sieć przybliża uśrednienie ich wszystkich. Uśrednianie wielu modeli zmniejsza wariancję, co jest klasycznym sposobem na lepsze uogólnienie.

Żeby uśrednienie się zgadzało, skala aktywacji w treningu i predykcji musi być taka sama. Współczesne biblioteki stosują inverted dropout: w treningu pozostałe neurony mnoży się przez 1/(1 − p). Wartość oczekiwana każdej aktywacji jest wtedy taka sama jak bez dropoutu, a w predykcji nie trzeba niczego zmieniać.

Dropout dodaje szum do gradientu, więc trening trwa dłużej, a strata treningowa jest wyższa i bardziej poszarpana. Tak ma być: regularyzacja celowo utrudnia dopasowanie do zbioru treningowego. Zbyt duże p prowadzi do niedouczenia, a w małych sieciach dropout może zabrać pojemność, której model potrzebuje.

Ograniczenia: dropout współpracuje słabo z normalizacją wsadową, bo zmienia statystyki aktywacji między treningiem a predykcją. W sieciach konwolucyjnych zerowanie pojedynczych pikseli map cech niewiele daje, bo sąsiednie piksele niosą prawie tę samą informację, dlatego stosuje się wersje zerujące całe kanały.

Na przykładzie

Warstwa ma cztery aktywacje: 0,8; 0,2; 0,5; 1,0, ich suma to 2,5. Przy p = 0,5 wylosowano maskę (1, 0, 0, 1). Po zastosowaniu inverted dropout zostają wartości 1,6; 0; 0; 2,0, czyli suma 3,6. Pojedynczy krok jest więc mocno zaszumiony, ale średnia po wszystkich 16 możliwych maskach wynosi dokładnie 2,5: w oczekiwaniu sygnał się nie zmienia.

Na zbiorze Digits 8×8 wzięto tylko 200 obrazków treningowych i sieć z dwiema warstwami ukrytymi po 512 neuronów, około 300 tysięcy parametrów, wyraźnie za dużo na tę ilość danych. Po 500 krokach Adama każda wersja klasyfikuje zbiór treningowy bezbłędnie. Na 450 obrazkach testowych sieć bez dropoutu osiąga średnio 93,8% (pięć ziaren, 93,3–94,2%), z p = 0,2 osiąga 94,1%, a z p = 0,5 osiąga 94,6% (94,0–95,1%). Strata testowa spada z 0,37 do 0,30. Efekt jest prawdziwy, ale skromny: około czterech błędów mniej na 450. Dropout to pomoc, nie cudowny lek na zbyt małą próbę.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: sieć 64 → 64 → 10 uczona na 299 cyfrach z dropoutem p = 0; 0,2; 0,5; 0,8: bez dropoutu po 30 epokach trening 100%, test 93,3%; najlepszy wynik (p = 0,5, 93,6%) to tylko 1 cyfra więcej z 359, a p = 0,8 zmniejsza lukę, obniżając obie trafności.

Dane: Digits (ręcznie pisane cyfry 8×8)

W praktyce

  • PyTorch: nn.Dropout(p=0.5) po aktywacji w warstwach gęstych; nn.Dropout2d zeruje całe kanały w sieciach konwolucyjnych. scikit-learn w MLPClassifier nie oferuje dropoutu, zamiast niego ma regularyzację L2 (alpha).
  • Zawsze przełączaj model.train() i model.eval(); dropout w trybie ewaluacji to najczęstszy błąd i powód „losowych” predykcji.
  • Typowe wartości: 0,5 w dużych warstwach gęstych, 0,1–0,3 w transformerach i blokach z normalizacją, 0,1–0,2 na wejściu, jeśli w ogóle.
  • Dropout w predykcji włączony celowo (Monte Carlo dropout) daje rozrzut wyników, który można traktować jako przybliżoną miarę niepewności modelu.
  • Najpierw sprawdź, czy model w ogóle się przeucza (luka między stratą treningową a walidacyjną); jeśli nie, dropout tylko spowolni trening.

Najczęstsze pytania

Jaką wartość p wybrać?
Dla warstw gęstych klasycznym punktem startu jest 0,5, dla nowoczesnych architektur raczej 0,1. Traktuj p jak każdy hiperparametr i dobieraj na zbiorze walidacyjnym. Uwaga: w PyTorch p to prawdopodobieństwo wyłączenia, a w niektórych opisach podaje się prawdopodobieństwo zachowania.
Dlaczego strata treningowa z dropoutem jest wyższa niż walidacyjna?
Bo w treningu sieć działa okaleczona, a w walidacji pełną mocą. To normalne i nie oznacza błędu. Do diagnozy przeuczenia porównuj stratę walidacyjną w czasie, a nie bezpośrednio z treningową.
Czy dropout zastępuje inne formy regularyzacji?
Nie. Dobrze łączy się z regularyzacją L2 wag, wczesnym zatrzymaniem i augmentacją danych. Żadna z tych technik nie zastąpi jednak większej ilości danych.

Źródła

  • Srivastava N., Hinton G., Krizhevsky A., Sutskever I., Salakhutdinov R., „Dropout: A Simple Way to Prevent Neural Networks from Overfitting”, Journal of Machine Learning Research 15, 2014, s. 1929–1958.
  • Hinton G. E. i in., „Improving neural networks by preventing co-adaptation of feature detectors”, arXiv:1207.0580, 2012.
  • Gal Y., Ghahramani Z., „Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning”, ICML 2016.
  • Goodfellow I., Bengio Y., Courville A., „Deep Learning”, MIT Press, 2016, podrozdz. 7.12 „Dropout”.
  • Dokumentacja PyTorch, torch.nn.Dropout: https://pytorch.org/docs/stable/generated/torch.nn.Dropout.html

Zobacz też