8 minut Czytania

Czym są autoenkodery i jak działają? Przewodnik po algorytmach przekształcania danych w zastosowaniu do kompresji cz.1

Autoenkodery zyskały na znaczeniu jako technologia, która wspomaga systemy komputerowe w efektywniejszym rozwiązywaniu problemów związanych z kompresją danych. W artykule szczegółowo wyjaśnimy, czym są autoenkodery, jak działają oraz omówimy ich najpopularniejsze zastosowania. Przyjrzymy się również procesowi kodowania i rekonstrukcji danych, który leży u podstaw działania tych algorytmów przekształcania danych.

Zapraszamy do lektury!

Co to jest autoenkoder?

Autoenkoder to model sztucznej sieci neuronowej wykorzystywany w zadaniach związanych z kompresją, rekonstrukcją i generowaniem danych. Autoenkodery są zaprojektowane i wytrenowane do odwzorowywania danych wejściowych na dane wyjściowe. Przykładowo, mając obraz odręcznie napisanej liery, autoenkoder najpierw koduje ten obraz do utajonej reprezentacji o mniejszej liczbie wymiarów, a następnie dekoduje tę reprezentację z powrotem do obrazu.

Model uczy się kompresować dane, jednocześnie starając się zminimalizować błąd rekonstrukcji pomiędzy oryginalnym a zrekonstruowanym obrazem.

Autoenkodery – podstawy budowy

Autoenkoder to sztuczna sieć neuronowa składająca się z mniejszych, współpracujących ze sobą sieci, znanych jako koder i dekoder. W najprostszej wersji jest on zbudowany na bazie pojedynczej pary koder-dekoder.

Autoenkodery w najprostrzej wersji zbudowanej z pojedynczej pary koder - dekoder.

Koder (ang. encoder)

W procesie przetwarzania danych koder w autoenkoderze stosuje warstwy konwolucyjne, zwane także warstwami splotowymi. Warstwy te pełnią istotną rolę w analizie danych wejściowych, stosując filtry, które uwydatniają istotne cechy tych danych. Dzięki warstwom konwolucyjnym, koder jest w stanie efektywnie wyodrębnić najważniejsze informacje i zredukować zbędne detale. Ułatwia to dalsze przetwarzanie w przestrzeni ukrytej.

Za pomocą funkcji redukujących, takich jak Dense() w bibliotece Keras, koder zmniejsza wymiarowość danych. Jednocześnie łączy je z przestrzenią ukrytą, w której model stara się przechować reprezentację najistotniejszych cech.

Ważne! Opis ten jest uproszczeniem. Należy podkreślić, że architektura kodera, w tym dobór funkcji aktywacji i liczba warstw ukrytych, powinna być dostosowana do specyfiki konkretnego problemu, nad którym pracujemy.

Zastosowanie warstw splotowych w kodowaniu umożliwia efektywne przetwarzanie danych, szczególnie w zadaniach związanych z analizą obrazów. W takich sytuacjach istotne jest wyodrębnienie cech, takich jak krawędzie, tekstury czy inne elementy charakterystyczne dla danej próbki.

Dekoder (ang. decoder)

Odpowiada za dekompresję danych i ich jak najwierniejsze odtworzenie w postaci wyjściowej. W odróżnieniu od kodera, dekoder korzysta z warstw konwolucyjnych transponowanych (często określanych jako warstwy dekonwolucyjne). W przypadku architektury dekodera zazwyczaj stosuje się strukturę odwrotną do tej używanej w kodowaniu. Pozwala to odbudować dane z reprezentacji ukrytej.

Wiele popularnych bibliotek do uczenia maszynowego, takich jak NumPy czy Keras, wymaga, aby liczba wejść kodera była równa liczbie wyjść dekodera. Wówczas proces rekonstrukcji jest zgodny z pierwotnym celem autoenkodera – dokładnym odtworzeniem danych wejściowych.

W praktyce zarówno koder, jak i dekoder, są często trenowani równocześnie. Model jest uczony na podstawie wyjścia dekodera, które jest przekazywane z powrotem na wejście enkodera. Pozwala to na wielokrotne selekcjonowanie cech i doskonalenie procesu rekonstrukcji.

W książce Deep Learning i modelowanie generatywne David Foster wskazuje, że biblioteka Keras umożliwia zamknięcie pełnego cyklu modelu w zaledwie trzech linijkach (pseudo)kodu:

model_input = encoder_input
model_output = decoder(encoder_output)
self.model = Model(model_input, model_output)

Dzięki temu podejściu proces trenowania i poprawiania wydajności autoenkodera staje się bardzo efektywny, a kod pozostaje czytelny i zwięzły.

Jak działa autoenkoder? Zrozumienie procesu kompresji danych

Autoencoder działa na zasadzie przetwarzania danych w dwóch krokach. W pierwszym etapie, znanym jako enkodowanie, model przekształca dane wejściowe w przestrzeń o niższej liczbie wymiarów (tzw. kodowanie), co pozwala na uzyskanie ich skompresowanej reprezentacji. Następnie, w etapie dekodowania, model rekonstruuje dane wyjściowe, starając się przywrócić je do pierwotnej postaci. Kluczowym celem autoenkodera jest minimalizacja błędu rekonstrukcji – różnicy między danymi wejściowymi a wyjściowymi, co pozwala na naukę najbardziej istotnych cech danych. Autoenkodery, poprzez osadzanie reprezentacji cech obiektów, mogą działać na przestrzeniach o wielu wymiarach.

Ważne! Choć teoretycznie nie ma ścisłego ograniczenia dotyczącego liczby warstw ukrytych w autoenkoderze, zaleca się, aby nie było ich zbyt wiele! Zbyt duża liczba warstw może prowadzić do różnych problemów, takich jak spowolnienie procesu uczenia modelu, niewystarczające zasoby pamięciowe oraz pogarszająca się dokładność obliczeń. Zjawisko to jest znane jako przekleństwo wymiarowości i polega na wzroście prawdopodobieństwa wystąpienia błędów obliczeniowych wraz z każdą dodatkową warstwą ukrytą w modelu.

Aurélien Géron w swojej książce Uczenie Maszynowe z użyciem Scikit-Learn i TensorFlow opisuje, jak losowy wybór punktu w dwuwymiarowym kwadracie jednostkowym prowadzi do bardzo małej szansy na znalezienie się w odległości mniejszej niż 0,001 od brzegu (zaledwie 0,4%). Jednak w przestrzeni o tysiącu wymiarów ta szansa wzrasta do ponad 99,999999%.

Ten przykład ilustruje, jak przy zwiększającej się liczbie wymiarów przestrzeń staje się coraz mniej „gęsta”, a modele muszą nauczyć się efektywnie nawigować po tej przestrzeni.

Co to jest funkcja straty? Kodowanie i rekonstrukcja krok po kroku

W przykładowym przypadku, który pokazany jest na poniższej grafice, gdzie mamy 4 cechy (warstwa wejściowa), autoenkoder przekształca je do 3 cech (warstwa ukryta), a następnie rekonstruuje je z powrotem do 4 cech (warstwa wyjściowa). Dane na wyjściu często nazywane są rekonstrukcjami, ponieważ dekoder stara się jak najdokładniej odwzorować dane wejściowe.

Model działania autoenkodera, gdzie po lewej są 4 cechy (warstwa wejściowa), autoenkoder przekształca je do 3 cech (warstwa ukryta), a następnie rekonstruuje je z powrotem do 4 cech (warstwa wyjściowa).

Funkcja straty (znana również jako strata rekonstrukcji) ma na celu karanie modelu, gdy rekonstrukcja danych wyjściowych odbiega od danych wejściowych. Jak w przykładzie z 4 cechami, które muszą zostać skompresowane do 3 cech w warstwie ukrytej, autoenkoder musi znaleźć wzorce i najważniejsze cechy w danych, aby zachować ich esencję. Dobra reprezentacja pośrednia nie tylko wychwytuje te wzorce, ale także umożliwia pełną dekompresję danych przez dekoder.

Warto zauważyć, że autoenkodery mają podobną strukturę do MLP (Multi Layer Perceptron), który posiada tę samą liczbę warstw na wyjściu, co na wejściu.

Jeśli zaimplementujemy niepełny autoenkoder (np. tylko koder bez dekodera), otrzymujemy model, który pozwala na redukcję wymiarów danych, co może być przydatne w zadaniach takich jak kompresja czy ekstrakcja cech.

Główne zastosowania autoenkoderów

Autoenkodery znajdują szerokie zastosowanie w różnych dziedzinach analizy danych i sztucznej inteligencji. Oto niektóre z ich najważniejszych zastosowań:

  1. Redukcja wymiarowości – gdy liczba neuronów w warstwie ukrytej jest mniejsza niż liczba danych wejściowych, sieć musi „upchnąć” informacje w mniejszej liczbie neuronów. Dzięki temu autoenkodery stanowią skuteczny sposób na redukcję wymiarowości danych, co jest szczególnie użyteczne w analizie dużych zbiorów danych oraz w kompresji danych.
  2. Klasyfikacja, gdy dane wejściowe pochodzą tylko z jednej klasy – model uczy się rekonstruować dane z tej klasy, a następnie można ocenić, jak bardzo zrekonstruowane dane różnią się od oryginalnych, co pozwala na określenie, czy nowe dane należą do tej klasy.
  3. Wykrywanie anomalii – ponieważ anomalie występują rzadko, trenując autoenkoder na normalnych danych, model nie powinien nauczyć się ich rekonstruować. Dzięki temu łatwo wykryć nietypowe przypadki, ponieważ błąd rekonstrukcji dla anomalii będzie znacznie wyższy niż dla danych normalnych.
  4. Generowanie nowych cech – autoenkodery z większą liczbą warstw ukrytych mogą generować nowe cechy, które mogą być użyteczne w dalszej analizie. Można je wykorzystać do wzbogacenia zbioru cech, szczególnie w kontekście uczenia maszynowego.
  5. Generowanie nowych danych przypominających dane uczące – dodając odpowiednie szumy losowe do środkowej warstwy ukrytej, autoenkodery mogą być wykorzystane do generowania nowych danych, które przypominają dane, na których model był trenowany. Przykładem może być generowanie nowych obrazów, tekstów lub dźwięków, które mają podobne cechy do oryginalnych próbek.
  6. Systemy rekomendacyjne – autoenkodery są używane w systemach rekomendacyjnych, np. do rekomendowania filmów lub produktów. Model uczy się reprezentacji, która pozwala przewidzieć, jak klienci oceniali różne produkty (np. filmy, książki), co umożliwia generowanie trafnych rekomendacji.
  7. Inne zastosowania – autoenkodery mogą być wykorzystywane w wielu innych dziedzinach, takich jak:
    • rozpoznawanie obrazów,
    • przetwarzanie języka naturalnego,
    • kompresja obrazów i dźwięków,
    • redukcja hałasu w obrazach (denoising).

Dzięki swojej wszechstronności, autoenkodery stanowią fundament wielu innowacyjnych rozwiązań w sztucznej inteligencji, które zyskują na popularności w różnych branżach.

Klasyfikacja autoenkoderów

Autoenkodery mogą być klasyfikowane na różne sposoby. Jednym podejściem jest podział na autoenkodery niedopełnione (ang. undercompleted autoencoders) oraz autoenkodery przepełnione (ang. overcompleted autoencoders).

  • Autoenkodery niedopełnione – liczba warstw ukrytych jest mniejsza niż liczba danych wejściowych.
  • Autoenkodery przepełnione – liczba warstw ukrytych jest większa niż liczba danych wejściowych, co pozwala modelowi na przechowywanie większej ilości informacji w warstwie ukrytej.

Według innego, popularnego kryterum dzielimy autoenkodery na deterministyczne i probabilistyczne.

Deterministyczne autoenkodery

To takie, w których proces kodowania i dekodowania danych jest z góry określony i nie zawiera elementów losowości. Oznacza to, że dla tych samych danych wejściowych, sieć zawsze wygeneruje te same dane wyjściowe. W takich modelach nie wprowadza się żadnej losowości ani zmienności w trakcie uczenia, co sprawia, że proces rekonstrukcji danych jest przewidywalny.

Autoenkodery probabilistyczne

Umożliwiają generowanie nowych danych na podstawie probabilistycznej przestrzeni latentnej. Są szeroko stosowane w generatywnej sztucznej inteligencji.

To oczywiście nie wszystkie rodzaje. W kolejnym wpisie szerzej omówimy najczęstszych typach autoenkoderów i ich zastosowaniach w uczeniu maszynowym.