05 · Bez nadzoru · 4 min czytania · aktualizacja
Czym jest autoenkoder i do czego służy w uczeniu maszynowym?
W skrócie
Autoenkoder to sieć, która uczy się odtwarzać własne wejście przez wąskie gardło. Kod w gardle to skompresowany opis danych, nieliniowe uogólnienie PCA.
Co to jest
Autoenkoder to sieć neuronowa trenowana tak, by na wyjściu odtworzyć to, co dostała na wejściu, przy czym po drodze dane muszą przejść przez wąskie gardło — warstwę o małej liczbie neuronów. Część przed gardłem to koder (encoder), który ściska dane do krótkiego kodu; część za gardłem to dekoder, który próbuje z tego kodu odbudować oryginał. Etykiety nie są potrzebne: celem jest samo wejście.
Intuicja: masz opisać zdjęcie twarzy ośmioma liczbami tak, by ktoś inny mógł je z nich narysować. Nie zapiszesz pikseli — musisz wymyślić, co jest istotne: kształt twarzy, oświetlenie, uśmiech. Autoenkoder sam znajduje taki kompaktowy opis, bo tylko on pozwala zmniejszyć błąd odtworzenia.
Mechanizm — dlaczego tak działa
Strata to zwykle błąd średniokwadratowy między wejściem a odtworzeniem (albo entropia krzyżowa dla danych w przedziale 0–1). Bez wąskiego gardła sieć nauczyłaby się trywialnej identyczności i niczego ciekawego by nie wiedziała. Gardło wymusza kompresję: sieć musi zachować te cechy danych, które najbardziej zmniejszają błąd, a zgubić resztę.
Związek z PCA jest ścisły. Autoenkoder z jedną warstwą ukrytą, liniowymi aktywacjami i stratą kwadratową uczy się — w optimum — tej samej podprzestrzeni co PCA z tyloma składowymi, ile neuronów ma gardło. Dodanie nieliniowych aktywacji i kolejnych warstw pozwala opisywać zakrzywione rozmaitości, na których leżą dane, czego PCA nie potrafi. Za to tracisz gwarancje: optymalizacja jest niewypukła, wynik zależy od inicjalizacji, a sieć może się przeuczyć.
Przeuczenie wygląda tu tak: zbyt pojemny autoenkoder zapamiętuje przykłady treningowe, zamiast uchwycić ogólną strukturę — błąd treningowy spada, a testowy nie. Dlatego powstały warianty z dodatkowym ograniczeniem. Odszumiający dostaje wejście z zakłóceniami, a ma odtworzyć czysty oryginał — musi więc nauczyć się, jak wyglądają typowe dane. Rzadki karze za zbyt wiele aktywnych neuronów naraz. Wariacyjny (VAE) wymusza, by kody układały się zgodnie z rozkładem normalnym, co pozwala generować nowe przykłady.
Zastosowania wynikają z tej samej idei. Kod z gardła to cechy do innych modeli lub do wizualizacji. Błąd odtworzenia to detektor anomalii: sieć wytrenowana na typowych danych źle odtwarza przypadki nietypowe. Dekoder z wariantu wariacyjnego to model generatywny. A pomysł „zamaskuj część wejścia i odtwórz” stał się jednym z filarów uczenia samonadzorowanego.
Na przykładzie
Zbiór Digits: 1797 cyfr 8×8, piksele przeskalowane do 0–1, podział 1257 obrazów treningowych i 540 testowych. Punkt odniesienia: zastąpienie każdego obrazu średnim obrazem daje błąd średniokwadratowy 0,0739 na zbiorze testowym. PCA z 2 składowymi: 0,0528. Autoenkoder z warstwami ukrytymi 64–2–64 (aktywacja tanh), czyli z kodem z 2 liczb: 0,0390. Przy kodzie z 8 liczb: PCA 0,0245, autoenkoder z warstwami 64–8–64 (tanh) 0,0136 — prawie dwa razy mniejszy błąd przy tej samej długości kodu.
Dwie przestrogi z tego samego eksperymentu. Pierwsza: z domyślnym, wczesnym kryterium zatrzymania autoenkoder z warstwami 128–8–128 (ReLU) osiągnął 0,0268, czyli gorzej niż PCA; dopiero dłuższy trening obniżył błąd do 0,0204. Nieliniowa sieć ma większe możliwości, ale trzeba je wytrenować. Druga: głębszy model z warstwami 256–64–8–64–256 zszedł na zbiorze treningowym do 0,0063, a na testowym tylko do 0,0203 — trzy razy więcej. To przeuczenie na zaledwie 1257 obrazach.
Dane: Digits (ręcznie pisane cyfry 8×8)
W praktyce
- W PyTorch: koder i dekoder jako dwa
nn.Sequential, stratann.MSELoss()lubnn.BCELoss(), cel = wejście. Dla obrazów zamiast warstw gęstych używa się splotowych. - W scikit-learn prosty autoenkoder da się zbudować z
MLPRegressordopasowanego jakofit(X, X), ale kod z gardła trzeba wyciągnąć ręcznie zcoefs_. - Porównaj zawsze z PCA o tej samej liczbie składowych — jeśli autoenkoder nie wygrywa na zbiorze testowym, nie ma po co go używać.
- Monitoruj błąd walidacyjny i stosuj wczesne zatrzymanie; przy małych danych zmniejsz sieć albo dodaj szum na wejściu.
- Do wykrywania anomalii trenuj wyłącznie na danych typowych i ustaw próg błędu odtworzenia na zbiorze walidacyjnym.
- Typowy błąd: zbyt szerokie gardło — sieć kopiuje wejście i kod nie niesie żadnej kompresji.
Najczęstsze pytania
- Czym różni się autoenkoder od PCA?
- PCA to liniowy rzut z rozwiązaniem w zamkniętej postaci, szybki i deterministyczny. Autoenkoder z nieliniowymi warstwami potrafi opisać zakrzywioną strukturę danych i zwykle daje mniejszy błąd odtworzenia przy tej samej długości kodu, ale wymaga treningu, strojenia i większej liczby danych.
- Czy autoenkoder może generować nowe dane?
- Zwykły autoenkoder słabo, bo przestrzeń kodów ma dziury — losowy kod często daje bezsensowny obraz. Do generowania służy autoenkoder wariacyjny (VAE), który wymusza regularny, ciągły rozkład kodów.
- Jak wykryć anomalie autoenkoderem?
- Trenujesz sieć tylko na normalnych przykładach. Przypadek, który jest do nich niepodobny, zostanie odtworzony słabo, więc duży błąd odtworzenia sygnalizuje anomalię. Próg ustala się na danych walidacyjnych, np. jako wysoki percentyl błędu dla normalnych przykładów.
Źródła
- Hinton G. E., Salakhutdinov R. R., „Reducing the Dimensionality of Data with Neural Networks”, Science 313(5786), 2006.
- Goodfellow I., Bengio Y., Courville A., „Deep Learning”, MIT Press 2016, rozdz. 14 (Autoencoders).
- Vincent P., Larochelle H., Bengio Y., Manzagol P.-A., „Extracting and Composing Robust Features with Denoising Autoencoders”, ICML 2008.
- Kingma D. P., Welling M., „Auto-Encoding Variational Bayes”, arXiv:1312.6114, 2013.
- Baldi P., Hornik K., „Neural networks and principal component analysis: Learning from examples without local minima”, Neural Networks 2(1), 1989.