5: Czym są Sieci Neuronowe - część 2

Proces treningu sieci neuronowej polega na zautomatyzowanym dopasowywaniu jej wag, tak by coraz lepiej rozwiązywała ona zadania jakiegoś określonego rodzaju.
Sieci uczą się na dużej bazie treningowych przykładów. Tym, do czego dążymy, nie jest jednak, by zapamiętywały one rozwiązania konkretnych zadań, ale by umiały “uchwycić istotę” całej dziedziny. Wagi przed rozpoczęciem treningu inicjalizowane są w sposób całkowicie przypadkowy. Następnie są lekko modyfikowane tak, by odpowiedzi udzielane przez sieć były coraz bliższe prawidłowym. Podczas nauki bardzo ważne jest dobranie odpowiedniego parametru decydującego o tempie zbliżania się do oczekiwanych odpowiedzi. Jeżeli sieć od razu zaczęłaby bezbłędnie rozwiązywać początkowe treningowe zadania, to miałaby małe szanse, że dobrze dostosuje się do rozwiązywania całej klasy problemów z danej dziedziny. Potwierdził to szereg eksperymentów. Istnieją trzy podstawowe rodzaje trenowania sieci, z których każdy stosowany jest w innych sytuacjach: nauka z nadzorem, nauka bez nadzoru i nauka ze wzmocnieniem.
Uczenie z nadzorem możemy zastosować, jeżeli dysponujemy ogromnym zbiorem zawierającym zarówno dane wejściowe, jak i odpowiadające tym danym rozwiązania zadań, które będziemy podczas nauki stawiać przed siecią. Przykładem może być ogromny zestaw fotografii różnych zwierząt, z których każda posiada “etykietę” z informacją o tym, jakie zwierzę się na niej znajduje. Wytrenowana sieć powinna na fotografiach, których w danych treningowych nie było, umieć skutecznie rozpoznawać te gatunki, które w danych treningowych występowały. Typowy proces nauki sieci w takich sytuacjach składa się z wielu kroków, z których każdy posiada następujące fazy:
  • Wrzucenie do neuronów warstwy wejściowej przykładowych danych (fotografia, pomiary meteorologiczne, dane ekonomiczne).
  • Wyliczenie wartości neuronów w kolejnych warstwach aż do warstwy wyjściowej.
  • Porównanie wyjścia sieci z poprawną odpowiedzią (na przykład z etykietą opisującą gatunek zwierzęcia albo ze znanym faktem dotyczącym warunków pogodowych).
  • Zautomatyzowana, minimalna modyfikacja wag sieci zaczynając od połączeń najbliższych wyjściu, a kończąc na połączeniach najbliższych wejściu, tak by odpowiedź lekko zbliżyła się do poprawnej.
Iteracyjnie, na coraz to nowych zestawach danych, wielokrotnie powtarzając proces korygowania wag, sieć powoli modyfikuje się i zbliża do najlepszego dopasowania do danej dziedziny. Na koniec skuteczność sieci sprawdzana jest na dużej próbie danych, które nie pojawiły się w danych szkoleniowych. Jeśli sieć pomimo długotrwałego treningu nadal źle rozwiązuje problemy, do których jest przeznaczona, wówczas informatyk zmienia jej architekturę czy parametry nauki i rozpoczyna trening od początku. Człowiek potrafi się uczyć na w sumie stosunkowo niewielkiej liczbie przykładów. Sztuczne sieci neuronowe do treningu potrzebują ogromnych zbiorów danych.
Drugim rodzajem uczenia sieci jest nauka bez nadzoru. Ma ona zastosowanie wtedy, kiedy posiadamy wielkie zbiory danych, jednak bez żadnego opisu. Komputer sam uczy się grupować je na jakieś kategorie, nie “wiedząc” jednak, jak ma te kategorie nazwać. Przykładami zastosowań może być grupowanie zachowań użytkowników portali społecznościowych tak, by dobrać dla nich odpowiednie reklamy. Innym zastosowaniem może być wykrywanie oszustw finansowych lub prania brudnych pieniędzy na podstawie analizy transakcji bankowych. Komputer dokonuje podziału użytkowników portali czy posiadaczy rachunków bankowych na pewne grupy i wtedy ekspert przygląda się tym podziałom i na przykład zwraca uwagę na bardzo dziwne zachowanie jakiegoś klienta banku. Inny ekspert może zadecydować, by kierować do jakiejś grupy czytelników portalu reklamę obuwia albo wózków dziecięcych.
Trzeci rodzaj nauki to nauka ze wzmocnieniem. Stosuje się ją w sytuacjach, gdy nie dysponujemy zbiorami zadań treningowych, jednak mamy możliwość uzyskiwania szybkich, automatycznych odpowiedzi ze strony środowiska. Metoda ta ma szczególne zastosowanie w grach komputerowych, a także wśród bardziej praktycznych dziedzin, na przykład w robotyce, w chemii organicznej czy w zautomatyzowanym rozdzielaniu pracy procesów informatycznych. Uczenie to polega na czerpaniu wiedzy i korygowaniu wag sieci w procesie bezpośredniej i automatycznej interakcji systemu informatycznego ze środowiskiem. Na przykład, jeśli system kontrolujący sieć neuronową będącą najważniejszym elementem aplikacji grającej w jakąś grę widzi, że ta ma tendencję do wybierania złych zagrań, prowadzących do utraty punktów, wówczas wagi wykorzystywanej sieci zostają zmienione tak, by prawdopodobieństwo takich zagrań zmalało. Jeśli aplikacja wygrywa, wzmacniane są te elementy, które wpływają na wybór dobrych zagrań.

Przejdźmy teraz do skrótowego omówienia szczególnej odmiany sieci neuronowych, jakimi są sieci konwolucyjne. Pierwotnym ich zastosowaniem była analiza obrazu i od takiego przykładu zacznę. Wyobraźmy sobie, że wejściem sieci jest obraz o rozmiarach 600x400 pikseli. A zatem warstwa wejściowa ma 240 000 neuronów. Załóżmy dalej, że w pierwszej warstwie ukrytej też mamy tyle samo neuronów, czyli 240 000. Co by było, gdyby sieć miała tradycyjną architekturę, a więc połączenia każdy z każdym między neuronami kolejnych warstw? Ile wag łączyłoby warstwę wejściową z pierwszą warstwą ukrytą? Odpowiedź może lekko szokować: 57 600 000 000, czyli ponad pięćdziesiąt miliardów! Takiej liczby wag z całą pewnością nie da się wytrenować w sensownym czasie, a i liczba przykładów treningowych musiałaby być wprost astronomiczna. Dlatego do tego typu zastosowań jak rozpoznawanie i analiza obrazu zaczęto używać sieci o zupełnie odmiennej architekturze, których wagi pogrupowane są w tak zwane filtry. Filtr to zestaw niewielkiej liczby wag łączących powierzchnię jednej warstwy z powierzchnią następnej. Aktualnie najczęściej wykorzystywane są filtry o rozmiarach 3x3 (czyli grupujące 9 wag) lub 5x5 (grupujące 25 wag). Wróćmy do naszego przykładu z obrazkiem 600x400, na którym pokażę działanie filtra o rozmiarach 3x3. W sieci konwolucyjnej do neuronu pierwszej warstwy ukrytej o współrzędnych (2,2) prowadzić będą połączenia idące wyłącznie od dziewięciu neuronów warstwy wejściowej: z “odpowiadającego” mu neuronu o współrzędnych (2,2) oraz z ośmiu jego “sąsiadów”: (1,1), (1,2), (1,3), (2,1), (2,3), (3,1), (3,2) i (3,3). Podobnie do neuronu pierwszej warstwy ukrytej o współrzędnych (3,2) prowadzą połączenia od dziewięciu neuronów warstwy wejściowej o współrzędnych (2,1), (2,2), (2,3), (3,1), (3,2), (3,3), (4,1), (4,2) i (4,3). I tak dalej. Z każdą taką dziewiątką neuronów wiążemy ten sam zestaw dziewięciu wag. Ten zestaw wag to właśnie filtr.
Przejdźmy teraz do trochę trudniejszego przypadku. Wyobraźmy sobie, że na wejściu mamy kolorową fotografię o wymiarach 600x400, którą reprezentujemy jako trzy powierzchnie 600x400. Każda powierzchnia odpowiada intensywności jednej z barw podstawowych: czerwonej, zielonej lub niebieskiej. Możemy sobie wyobrazić, że są one umieszczone jedna nad drugą. Do każdego neuronu pierwszej warstwy ukrytej prowadzić będą połączenia idące od dziewięciu neuronów z każdej powierzchni warstwy wejściowej, a więc w sumie 27 połączeń. Filtr, jakiego będziemy potrzebować do tych połączeń, będzie mieć 27 wag. Mówimy, że taki filtr ma dodatkowy wymiar – głębokość, która w takim przypadku wynosi trzy, zaś pełne wymiary filtra to 3x3x3. Utrudnijmy rzecz jeszcze bardziej. Okazuje się, że sieci konwolucyjne działają lepiej, jeśli w warstwach ukrytych mają dużo powierzchni. Przyjmijmy, że w pierwszej warstwie ukrytej będziemy chcieli mieć 192 powierzchnie. Wówczas konieczne będzie użycie 192 filtrów. Pierwszy filtr o wymiarach 3x3x3 łączyć będzie wycinki 3x3 wszystkich powierzchni warstwy wejściowej z neuronami pierwszej powierzchni pierwszej warstwy ukrytej. Drugi łączyć będzie wycinki 3x3 wszystkich powierzchni warstwy wejściowej z neuronami drugiej powierzchni pierwszej warstwy ukrytej. I tak dalej. Głębokość każdego filtra równa się liczbie powierzchni w warstwie, z której prowadzi. Liczba filtrów łączących warstwy odpowiada z kolei liczbie powierzchni w warstwie, do której następuje przepływ danych.
Architektura sieci konwolucyjnej przeważnie składa się z kilkunastu do kilkudziesięciu warstw konwolucyjnych, kilku tak zwanych “warstw redukcji”, kilku warstw stosujących połączenia “każdy z każdym”, wreszcie z warstwy wyjściowej. Warstwa wejściowa składa się z kilku do kilkudziesięciu powierzchni. Dalsze konwolucyjne warstwy, działające zgodnie z opisem z poprzedniego akapitu, składają się z ponad stu powierzchni każda. Warstwy redukcji, w miarę zbliżania się do wyjścia sieci, mają coraz mniejsze wymiary (ich działanie polega na pobieraniu z warstwy poprzedniej lokalnie maksymalnych wartości sąsiadujących ze sobą neuronów). Jeszcze bliżej wyjścia mamy warstwy stosujące połączenia każdy z każdym. Na koniec w warstwie wyjściowej często stosuje się funkcje sigmoidalne - by zobrazować, na przykład, prawdopodobieństwo jakiegoś zdarzenia.
Wejściem sieci konwolucyjnej może być obraz, zapis dźwięku albo, jak zobaczymy w następnym wpisie, reprezentacja sytuacji na planszy, zaś wyjściem jest odpowiedź na jakieś pytanie dotyczące wejścia. Sieci konwolucyjne znajdują zastosowanie głównie w takich dziedzinach, jak zaawansowane rozpoznawanie i zaawansowana analiza obrazu, obróbka dźwięku czy rozpoznawanie mowy. W przypadku komputerowych programów grających w gry logiczne w ostatnich kilku latach zaczęto je wykorzystywać na dwa sposoby:
  • jako narzędzia do wstępnej selekcji kandydatów - przez wskazanie kilku najlepszych lub przez oszacowanie wartości wszystkich możliwych zagrań,
  • oraz do oceny danej sytuacji – czyli tego, kto ma większe szanse na wygraną.
Obydwa te problemy są w jakiś sposób ze sobą powiązane, nie można ich jednak utożsamiać.
W programie AlphaGo to właśnie sieci konwolucyjne stały się decydującym wsparciem dla algorytmu MCTS. Jednocześnie MCTS okazał się najlepszym wsparciem dla treningu tych sieci. O tym wszystkim opowiem w następnym wpisie.

Komentarze