ML Atlas

06 · Sieci · 5 min czytania · Interaktywne · aktualizacja

Czym jest pojemność (capacity) sieci neuronowej i jak wpływa na przeuczenie?

W skrócie

Pojemność sieci to zakres funkcji, jakie może ona odwzorować. Za mała nie uchwyci wzorca, duża zapamięta nawet losowe etykiety, a mimo to potrafi uogólniać.

Co to jest

Pojemność (ang. capacity) sieci neuronowej to miara tego, jak bogaty zbiór funkcji sieć może odwzorować, dobierając wagi. Rośnie z liczbą neuronów, warstw i parametrów. Sieć o zbyt małej pojemności nie dopasuje się nawet do danych treningowych (niedouczenie), sieć o dużej pojemności dopasuje się do prawie wszystkiego, łącznie z szumem. Pojemność to górna granica możliwości modelu, a nie opis tego, czego model faktycznie się nauczy.

Intuicja: pojemność to rozmiar „słownika” funkcji, z którego trening wybiera jedną. Mała sieć ma słownik ubogi i musi uogólniać, bo nie ma jak zapamiętać szczegółów. Duża sieć ma słownik tak bogaty, że mieści w nim funkcję przechodzącą dokładnie przez każdy punkt treningowy, nawet bezsensowny.

Klasyczna teoria uczenia mówi, że model o pojemności znacznie większej niż ilość danych powinien się przeuczać. Współczesne sieci są często właśnie takie, mają więcej parametrów niż przykładów, a mimo to uogólniają dobrze. Ten pozorny paradoks jest jednym z centralnych tematów teorii uczenia głębokiego.

Mechanizm — dlaczego tak działa

Pojemność można rozumieć na kilka sposobów. Pojemność reprezentacyjna mówi, jakie funkcje sieć może przedstawić. Z ReLU każdy neuron dokłada możliwość jednego „zgięcia” funkcji, więc liczba liniowych kawałków, z których składa się funkcja sieci, rośnie z szerokością, a z głębokością może rosnąć nawet wykładniczo. Twierdzenie o uniwersalnej aproksymacji mówi, że przy dostatecznej szerokości sieć przybliży dowolną funkcję ciągłą.

Formalne miary, takie jak wymiar Vapnika–Chervonenkisa, mierzą, ile punktów model potrafi dowolnie podzielić na klasy. Dla sieci z W wagami rosną one mniej więcej jak W (z czynnikami logarytmicznymi i zależnością od głębokości). Klasyczne granice uogólnienia oparte na tych miarach są dla dużych sieci puste: ograniczają błąd testowy z góry wartością przekraczającą 100%, czyli nie mówią nic.

Pojemność efektywna to to, co sieć faktycznie może osiągnąć danym algorytmem treningu w danym czasie. Spadek gradientu startujący z małych losowych wag nie przeszukuje całego słownika równomiernie. Ma wbudowaną preferencję (tzw. niejawną regularyzację) dla funkcji gładkich i prostych, które dobrze pasują do danych. Wczesne zatrzymanie, regularyzacja L2, dropout i augmentacja dodatkowo ograniczają pojemność efektywną bez zmiany architektury.

Zhang i in. (2017) pokazali, że typowe sieci konwolucyjne potrafią bezbłędnie zapamiętać zbiór obrazów z losowo przetasowanymi etykietami. Ta sama architektura na prawdziwych etykietach uogólnia dobrze. Wniosek: sama liczba parametrów nie wyjaśnia uogólnienia, bo ta sama sieć raz uczy się wzorca, a raz zapamiętuje szum. Decydują struktura danych i przebieg optymalizacji.

Z tym łączy się zjawisko podwójnego zejścia: gdy pojemność rośnie, błąd testowy najpierw maleje, potem rośnie w okolicy progu, w którym model ledwo mieści dane treningowe, a po jego przekroczeniu znowu maleje. Klasyczna krzywa w kształcie litery U jest tylko pierwszą częścią tej historii. Zjawisko jest dobrze udokumentowane, ale jego wyrazistość zależy od szumu w etykietach i regularyzacji.

Na przykładzie

Na zbiorze Digits 8×8 (1347 obrazków treningowych, 450 testowych, standaryzowane piksele) wytrenowano MLPClassifier z jedną warstwą ukrytą o rosnącej szerokości (random_state=0). Z 1 neuronem (85 parametrów) trafność wynosi 32,1% na zbiorze treningowym i 29,1% na testowym, z 2 neuronami odpowiednio 75,2% i 73,8%, z 4: 96,1% i 87,3%, z 8: 99,9% i 93,3%. Od 16 neuronów (1210 parametrów) zbiór treningowy jest dopasowany w 100%, a wynik testowy dalej rośnie: 96,0% przy 16, 98,0% przy 32, 97,6% przy 256 neuronach i 19 210 parametrach. Wzrost pojemności grubo powyżej liczby przykładów nie zepsuł uogólnienia.

Potem etykiety treningowe losowo przetasowano, niszcząc jakikolwiek związek obrazka z cyfrą, i wyłączono regularyzację L2. Sieć z 16 neuronami dopasowała tylko 42,5% losowych etykiet. Sieć z 64 neuronami (4810 parametrów) zapamiętała wszystkie 1347 losowych etykiet bezbłędnie, ale na zbiorze testowym trafiała w 9,8% przypadków, czyli na poziomie zgadywania. Zapamiętanie szumu zajęło jej 2138 epok, wobec 172 epok na prawdziwych etykietach: sieć może zapamiętać szum, ale prawdziwy wzorzec uczy się znacznie łatwiej.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: zabawkowa demonstracja: 30 zaszumionych punktów dopasowanych do p losowych cech ReLU; błąd testowy rośnie do szczytu 1,52 przy p = n = 30, a potem znowu spada do 0,073 przy 1000 cech (rozwiązanie o najmniejszej normie).

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

W praktyce

  • Liczbę parametrów sprawdzisz w PyTorch przez sum(p.numel() for p in model.parameters()), a w scikit-learn sumując rozmiary coefs_ i intercepts_.
  • Diagnoza: jeśli model nie osiąga niskiej straty nawet na zbiorze treningowym, zwiększ pojemność; jeśli luka między treningiem a walidacją jest duża, dodaj regularyzację lub dane, zanim zmniejszysz sieć.
  • Częsta strategia: wybrać sieć nieco za dużą i kontrolować pojemność efektywną przez wczesne zatrzymanie (early_stopping=True), alpha (L2) w scikit-learn lub weight_decay i dropout w PyTorch.
  • Test zdrowego rozsądku: model powinien umieć przeuczyć się na jednym małym batchu; jeśli nie potrafi, w kodzie jest błąd, a nie za mała pojemność.
  • Krzywe walidacyjne (validation_curve w scikit-learn) dla szerokości warstwy pokazują, od którego momentu dalsze powiększanie przestaje pomagać.

Najczęstsze pytania

Czy więcej parametrów zawsze oznacza przeuczenie?
Nie. Duże sieci często uogólniają lepiej niż średnie, zwłaszcza z regularyzacją i wczesnym zatrzymaniem. Przeuczenie zależy od relacji pojemności efektywnej do ilości i jakości danych, a nie od samej liczby parametrów.
Szersza czy głębsza sieć?
Głębokość pozwala wielokrotnie wykorzystywać cechy z niższych warstw i dla wielu funkcji wymaga wykładniczo mniej neuronów niż płytka szeroka sieć. Głębsze sieci trudniej jednak trenować, dlatego potrzebują normalizacji i połączeń rezydualnych.
Jak zmierzyć pojemność w praktyce?
Najprościej empirycznie: sprawdzić, jaką część zbioru treningowego model potrafi dopasować, także z losowymi etykietami. Formalne miary, jak wymiar VC, są dla dużych sieci zbyt pesymistyczne, by służyć do wyboru architektury.

Źródła

  • Zhang C., Bengio S., Hardt M., Recht B., Vinyals O., „Understanding deep learning requires rethinking generalization”, ICLR 2017.
  • Belkin M., Hsu D., Ma S., Mandal S., „Reconciling modern machine-learning practice and the classical bias–variance trade-off”, PNAS 116(32), 2019, s. 15849–15854.
  • Goodfellow I., Bengio Y., Courville A., „Deep Learning”, MIT Press, 2016, podrozdz. 5.2 „Capacity, Overfitting and Underfitting”.
  • Bartlett P. L., Harvey N., Liaw C., Mehrabian A., „Nearly-tight VC-dimension and Pseudodimension Bounds for Piecewise Linear Neural Networks”, Journal of Machine Learning Research 20(63), 2019, s. 1–17.

Zobacz też