Od kilku lat jesteśmy świadkami gwałtownego przełomu w dziedzinie sztucznej inteligencji, mówiąc dokładnej: generatywnej sztucznej inteligencji (ang. Generative Artificial intelligence, GenAI). Pojawiło się wiele narzędzi o olbrzymich i ciągle rosnących możliwościach w rozmaitych dziedzinach. GenAI jest w stanie rozmawiać jak człowiek, tłumaczyć teksty, pisać artykuły i pisma procesowe, tworzyć kod programów, analizować dane, generować prognozy, malować obrazy i ogólnie mówiąc: zastępować żywą inteligencję. Wszystko to z każdym miesiącem robi coraz lepiej – czasem zdumiewająco dobrze. Narzuca się pytanie: Jak ona to robi?
Spróbujemy odpowiedzieć na to pytanie na przykładzie stosunkowo prostej, łatwej do zrozumienia i nadal używanej metody. Zobaczymy, jaka jest zasada działania autokodera wariancyjnego (ang. Variational Autoencoder, VAE). Poniżej widzimy ilustrację działania VAE – oczywiście utworzoną przez GenAI, a w dalszej części artykułu krok po kroku opiszemy zasadę jego działania.

Ilustracja VAE
Pierwszy krok to wychwycenie wzorców i zależności między cechami obiektów lub zjawisk. Rzeczy ze świata rzeczywistego mają bardzo wiele cech. Co ważne, cechy te są ze sobą powiązane. Dobrym przykładem takiego powiązania są proporcje ludzkiego ciała, pięknie przedstawione na sławnym rysunku Leonardo da Vinci.

Człowiek witruwiański, Leonardo da Vinci, autor zdjęcia Luc Viatour / https://Lucnix.be
Mówiąc w pewnym uproszczeniu, na podstawie wzrostu, masy ciała, wieku i płci człowieka jesteśmy w stanie trafnie określić np. długość kciuka (oczywiście z pewnymi wyjątkami). Jeśli jakaś maszyna ma wygenerować realistyczny rysunek człowieka, to musi uwzględniać tego typu związki.
Występowanie powiązań między cechami jest powszechne: powiązane ze sobą są oceny różnych produktów dokonywane przez klientów, kursy akcji różnych przedsiębiorstw, wskaźniki makroekonomiczne, sprzedaż produktów, czy parametry procesu technologicznego. W najprostszym przypadku taki związek jest liniowy, tak jak na rysunku poniżej.

Liniowy związek między zmiennymi
Na wykresie powyżej widzimy silny związek między dwiema wielkościami – mogłyby to być np. ciśnienie i temperatura w pewnym procesie. Patrząc na wykres, możemy powiedzieć, że do opisania procesu nie potrzeba obu zmiennych – wystarczyłoby mierzyć nową zmienną wzdłuż osi oznaczonej na wykresie pomarańczowym kolorem. To, co pozostanie, to losowy, nieistotny szum. Wartości nowej zmiennej obliczamy jako sumę oryginalnych cech pomnożonych przez współczynniki. Współczynniki dobieramy tak, aby odtworzyć nachylenie pomarańczowej prostej na wykresie.
W ten sposób działa analiza składowych głównych: jedna z najpopularniejszych analiz wielowymiarowych. Od lat stosuje się ją z dobrym skutkiem w bardzo wielu dziedzinach: od nauk społecznych do sterowania procesami wsadowymi w przemyśle farmaceutycznym. Jednak świat nie jest zbudowany z kulek i sprężynek, a do jego realistycznego opisania potrzebujemy zależności nieliniowych. I tu na pomoc przychodzą nam sieci neuronowe, a konkretnie autokoder (ang. autoencoder).

Schemat autokodera
W autokoderze cechy obiektów podajemy na wejścia sztucznych neuronów. Na rysunku powyżej mamy 10 cech, które stanowią wejście dla 5 neuronów. Każdy z tych neuronów oblicza swoją wartość wyjściową, używając pewnej ogólnej funkcji. W szczególności może to być suma wartości cech pomnożonych przez tzw. wagi i obłożona pewną funkcją nieliniową. Tak obliczone wyjścia wchodzą na wejścia kolejnej warstwy. W naszym przypadku są to dwa neurony, które na swoim wyjściu generują dwie nowe zmienne. Można je określić jako zmienne ukryte. W ten sposób dokonujemy kompresji danych lub zmniejszenia liczby wymiarów: zaczęliśmy od 10 cech, a na wyjściu mamy już tylko 2.
Prawa część sieci odwraca tę transformację – zaczynamy od zmiennych ukrytych i dostajemy wyjścia autokodera. Powinny one odtworzyć wartości oryginalnych cech. Parametry obliczeń we wszystkich neuronach są dopasowywane tak, aby błąd odtworzenia był jak najmniejszy – na tym właśnie polega uczenie sieci.
W praktyce stosuje się bardziej złożone architektury niż przedstawiona powyżej: z większą liczbą zmiennych ukrytych, koderem i dekoderem zawierającym wiele warstw, no i zazwyczaj mamy więcej wejść niż 10.
Autokoder może mieć wiele zastosowań – np. w wykrywaniu awarii, nadużyć, ataków cybernetycznych czy wizualizacji złożonych procesów. Można go też użyć do generowania nowych danych zgodnych ze wzorcem danych, na których został nauczony. Jeśli podamy rozsądne wartości zmiennych ukrytych i przepuścimy je przez dekoder, to powinniśmy dostać nowe obiekty zgodne ze wzorcem, tzn. podobne do wykorzystanych w uczeniu, ale nie tożsame z żadnym z nich.
W rzeczywistość robi się to inaczej, stosując bardzo pomysłową sztuczkę. Otóż koder zamiast wyznaczać konkretne wartości znajduje parametry rozkładu normalnego: średnią i wariancję. W przypadku sieci na rysunku powyżej dostajemy dwa rozkłady. Ze znalezionych przez koder rozkładów losujemy wartości i wstawiamy je na wejście dekodera. Dzięki temu bardzo łatwo możemy generować nowe obiekty, podobne, ale nie dokładnie takie sam jak już istniejące. Dodatkowo architektura ta jest lepsza pod względem technicznym, m.in. łatwiej ją nauczyć i reprezentacja, którą dostajemy jest lepsza.
Taką sieć nazywamy autokoderem wariancyjnym (ang. Variational Autoencoder, VAE). Ma on wiele wariantów, np. dostosowanych do przetwarzania obrazów, umożliwiających tworzenie nowych, realistycznych obrazów. Autokoder wariancyjny sprawdza się w wykrywaniu anomalii także dlatego, że umożliwia sprawdzenie, dlaczego dany przypadek został uznany za nietypowy.
Ciekawym zastosowaniem autokodera jest tworzenie dodatkowych klatek poprawiających płynność obrazu (https://www.nvidia.com/en-us/geforce/news/dlss3-ai-powered-neural-graphics-innovations/, niestety nie udało mi się dotrzeć do informacji, jaka wersja autokodera jest tam używana).
Autokoder ilustruje sposób działania generatywnej sztucznej inteligencji: zaczynamy od znalezienia wzorców w danych, ucząc model na danych o rzeczywistych obiektach lub zdarzeniach, potem używamy tego modelu do tworzenia nowych obiektów. Zauważmy, że w całej procedurze nie ma etapu sprawdzania, czy wynik jest rozsądny. W kompletnych rozwiązaniach stosuje się liczne sposoby zapewnienia poprawności, niemniej jednak nadal pozostaje to odpowiedzialnością człowieka korzystającego z GenAI i często gdzieś małym literkami jest napisane coś w rodzaju: AI can make mistakes – trzeba o tym pamiętać!
Źródło:
Chollet F., Deep Learning with Python, wyd. II, 2021 Manning Publications Co.
Autor: Tomasz Demski, dyrektor ds. rozwoju w StatSoft