6: AlphaGo

W grudniu 2015 w środowisku graczy go zaczęła krążyć informacja, że pewna angielska firma stworzyła program, który pokonał 5:0 trzykrotnego Mistrza Europy, mieszkającego we Francji Chińczyka Fana Hui.
Wszystkie partie rozgrywane były bez handicapów. Informacja została oficjalnie potwierdzona pod koniec stycznia 2016. Mimo, że istniały już wtedy programy o sile około 5 dan, to do poziomu Fana Hui, czyli 8 dan, sporo im jeszcze brakowało. Wiadomość była więc sensacyjna i pokazała, że informatykom zajmującym się komputerowym go udało się przekroczyć kolejną barierę. Mówiono też, że być może dojdzie do pojedynku tego programu z najbardziej utytułowanym graczem ostatnich dekad, Koreańczykiem Lee Sedolem. Przypuszczenia te potwierdziły się, kiedy w lutym 2016 roku pięciorundowy pojedynek został ostatecznie zapowiedziany. Nieco wcześniej dowiedzieliśmy się dzięki publikacji w “Nature”, że program, który pokonał mistrza Europy, stworzony został przez DeepMind - wykupiony przez Google startup zajmujący się wykorzystaniem Sztucznej Inteligencji w grach. Artykuł dość dokładnie opisywał architekturę i sposób uczenia się programu, który nazwany został AlphaGo. Tymczasem cały goistyczny świat, jak i ogromne grono specjalistów od Sztucznej Inteligencji z niecierpliwością wyczekiwały pojedynku z Lee Sedolem. W sieci pojawiały się analizy partii między programem i Fanem Hui. Trwały dyskusje, jakie program ma szanse na zwycięstwo z jeszcze silniejszym przeciwnikiem.
Przed pojedynkiem, który miał się odbyć w hotelu “Four Seasons” w Seulu, koreański arcymistrz wydawał się być bardzo pewny siebie. Dokładnie przeanalizował partie rozegrane przez Fana Hui i uznał, że mistrz Europy popełnił w nich wiele błędów. Nisko ocenił też poziom gry AlphaGo. Nie wiedział jednak być może o tym, że na przestrzeni trzech miesięcy, które oddzielały pojedynek z Londynu od pojedynku w Seulu, program rozegrał kilka milionów partii treningowych z samym sobą, nieustannie podnosząc precyzję własnych sieci neuronowych. Dodatkowo programiści usunęli kilka usterek w algorytmie.
Pojedynek odbył się między 9 i 15 marca 2016 roku. Był bez wątpienia największym wydarzeniem sportów umysłowych XXI wieku. W samych Chinach oglądało go na żywo 60 milionów widzów. W Korei został potraktowany jako doniosłe, narodowe wydarzenie i był transmitowany w telewizji i na ulicznych telebimach. Również w Japonii obejrzało go online kilka milionów osób. W Europie i Stanach Zjednoczonych ponad 100 tysięcy. Program pokonał Lee Sedola 4:1 wygrywając trzy pierwsze gry, przegrywając czwartą i wygrywając ostatnią. Mieszanina smutku i ekscytacji była chyba dość powszechnym odczuciem pośród milionów miłośników go na całym świecie.
Przejdźmy do tego, jak działał stworzony przez DeepMind program AlphaGo. Bazował on na algorytmie MCTS wspieranym przez cztery wytrenowane w dwuetapowym procesie nauki niezależne sieci neuronowe. Były to trzy sieci odpowiedzialne za szacowanie wartości legalnych zagrań: szybkie - “tree policy” i “rollout policy” oraz dokładna “policy network”. Istniała też sieć “value network”, która dokonywała bezpośrednich ocen wartości pozycji w liściach drzewa MCTS. Kroki każdej iteracji MCTS wyglądały następująco:
  • Na etapie wyboru ścieżki program dla każdego dziecka węzła, w którym podejmował decyzję, uwzględniał:
    • wskazania sieci “policy network”, która odpowiadała za szacowanie ruchów dostępnych w pozycji znajdującej się w każdym odwiedzanym węźle,
    • uśrednione wyniki losowych rozgrywek biegnących od liści poddrzewa aż do końca gry,
    • uśrednione po wszystkich liściach poddrzewa wskazania sieci “value network” (wskazania te liczone były z tą samą wagą, co wyniki losowych rozgrywek),
    • liczbę odwiedzin każdego z tych dzieci.
  • Na etapie ekspansji, która następowała dopiero po czterdziestu odwiedzinach liścia, program dodawał do drzewa nowy liść, w którym tworzył tablicę legalnych zagrań (w stanie gry reprezentowanym przez ten liść) i inicjował ją wartościami szybkiej “tree policy”, po czym uruchamiał losową rozgrywkę. Ekspansja mogła nastąpić również w dowolnym węźle ścieżki, jeżeli wynikałoby to ze wzoru balansującego eksplorację i eksploatację. Wówczas obok istniejących dzieci dodawany był liść drzewa.
  • Na etapie losowej rozgrywki wykorzystywał szybką “rollout policy” do generowania losowych ruchów z rozkładem prawdopodobieństwa podpowiadanym przez tą sieć - rozgrywki kończyły się, gdy każdemu z graczy pozostawały jednopunktowe oczy.
  • Równolegle, w czasie, gdy toczyły się losowe rozgrywki, AlphaGo wyliczał wartość “value network”, którą zapisywał w liściu, oraz wartości precyzyjnej “policy network”, które zastępowały te wstępnie zainicjowanej przez “tree policy”.
  • Na etapie propagacji wstecznej od liścia ku korzeniowi drzewa do statystyk węzłów dodawana była wartość wyliczona przez “value network” i wynik losowej rozgrywki, a liczba odwiedzin węzłów powiększana była o 1.
Ostatecznie jako zagranie mające pojawić się w partii z człowiekiem wybierany był ten ruch, który odpowiadał najczęściej odwiedzanemu węzłowi bezpośrednio pod korzeniem drzewa. Wart podkreślenia jest fakt, że AlphaGo podczas swoich pojedynków, wybierając swoje ruchy, analizował tysiące razy mniej pozycji niż Deep Blue podczas partii z Kasparowem. Nie działał na zasadzie “brutalnej siły”, a dzięki wykorzystaniu sieci neuronowych i MCTS analizował sytuacje na planszy w sposób zdecydowanie bardziej przypominający ten, w jaki robi to człowiek.
“Policy network” była głęboką siecią konwolucyjną, której architekturę zarysuję poniżej. Odpowiadała ona za szacowanie rozkładu prawdopodobieństwa po wszystkich legalnych ruchach w danej sytuacji, że znajduje się tam zagranie, które wybrane by było przez ludzkiego mistrza.
“Tree policy” była lekką siecią działającą przynajmniej kilkaset razy szybciej niż “policy network”. Szybkość działania okupiona była wyraźnym zmniejszeniem precyzji podpowiadanych ruchów. Jej rolą było wstępne oszacowanie zagrań dostępnych w nowo dodanym liściu, od których startowały losowe symulacje, zanim “policy network” nie wyceniła dokładniej ich wartości.
“Rollout policy” była najszybsza. Działała tysiąc pięćset razy szybciej od “policy network”, była jednak najmniej precyzyjna ze wszystkich sieci odpowiedzialnych za szacowanie zagrań. Ta sieć wykorzystywana była w losowych rozgrywkach biegnących od liścia aż do końca partii.
“Value network” była głęboką siecią konwolucyjną. Architekturą i szybkością działania przypominała ona “policy network”, jednak posiadała inne wyjście, o czym piszę poniżej. Dokonywała bezpośrednich ocen wartości pozycji w liściach drzewa MCTS. Zespół DeepMind przeprowadził szereg testów, czy lepsza jest wycena pozycji bazująca na “value network” czy na losowej rozgrywce i ostatecznie program uwzględniał oba te wskazania z równymi wagami.
By AlphaGo mógł osiągnąć swój nadzwyczajnie wysoki poziom gry, jego sieci neuronowe musiały wcześniej zostać odpowiednio wytrenowane. Odbyło się to w dwuetapowym procesie.
Pierwszą fazą było wytrenowanie “pod nadzorem” sieci odpowiedzialnych za szacowanie prawdopodobieństw zagrań, a więc “policy network”, “tree policy” i “rollout policy”. “Policy network” była wyraźnie bardziej precyzyjna we wstępnej selekcji kandydatów od wszystkich stworzonych wcześniej rozwiązań opartych o sieci neuronowe. Zawdzięczała to zarówno lepszej architekturze, a także lepszym, bo uwzględniającym najnowsze osiągnięcia, szczegółowym technikom uczenia sieci. Wytrenowana była “pod nadzorem” na 30 milionach pozycji ze 160 tysięcy partii rozegranych przez graczy o sile powyżej 5 dan na serwerze KGS. Tymczasem “tree policy” i “rollout policy” zostały wytrenowane na 8 milionach pozycji z 50 tysięcy partii z serwera Tygem. Ponieważ plansza do go jest idealnie symetryczna, to podczas nauki wszystkie pozycje rotowane były na osiem możliwych sposobów. Dzięki temu sieć przyzwyczajała się do rozpoznawania sytuacji obróconych czy lustrzanie odbitych i uzyskiwała więcej treningowych przykładów.
Druga faza treningu bazowała na nauce “ze wzmocnieniem”. Jej głównym celem było wytrenowanie “value network”. AlphaGo grał sam ze sobą partie wykorzystując wytrenowane wcześniej “policy network”, “tree policy” i “rollout policy” oraz sieć “value network”, której wagi początkowo zainicjowano przypadkowymi wartościami. Równocześnie z treningiem “value network” podnoszona była jakość “policy network”. “Tree policy” i “rollout policy” nie były już trenowane. Celem, do którego w procesie nauki dążyła “policy network”, było coraz dokładniejsze “odgadywanie” ruchów, jakie pojawiały się w zwycięskich rozgrywkach, a więc mocniejszych niż jej poprzednie wskazania. Celem “value network” było “odgadnięcie” wyniku partii, który był zapisywany po jej rozegraniu. Na partie rozgrywane z użyciem tego algorytmu składały się silne zagrania, a więc ich wyniki silniej korelowały z poprawnymi wycenami pozycji. “Policy network” w fazie “nauki ze wzmocnieniem” trenowana była na milionie dwustu osiemdziesięciu tysiącach gier, które AlphaGo rozegrał sama ze sobą. Do treningu ze wzmocnieniem “value network” wykorzystano trzydzieści milionów pozycji wylosowanych spośród ponad półtora miliarda, jakie pojawiły się w takich grach. Ostatecznie do pojedynku z Fanem Hui wykorzystana została wersja “policy network” wytrenowana wyłącznie na przykładowych partiach z KGS. Wersja “policy network” trenowana na rozgrywkach programu z samym sobą odegrała jednak ogromną rolę przy wytrenowaniu “value network”. Dalszy trening, którego szczegółów technicznych niestety nie znamy, umożliwił pokonanie Lee Sedola.
Zarówno “policy network”, jak i “value network” były głębokimi sieciami konwolucyjnymi, gdzie warstwa wejściowa miała odpowiednio 48 powierzchni o wymiarach 19x19 dla “policy network” oraz 49 powierzchni o wymiarach 19x19 dla “value network”. Warstwy ukryte, których było 13, miały po 192 powierzchnie. Warstwa wyjściowa “policy network” była kwadratem 19x19 odpowiadającym planszy do go i ilustrującym rozkład prawdopodobieństwa, że na konkretnym skrzyżowaniu znajduje się zagranie, jakie wybrałby bardzo silny gracz. Wyjście “value network” stanowił pojedynczy neuron, który przyjmował wartości z przedziału (-1, 1), gdzie “-1” oznaczało “na pewno przegram”, “1” oznaczało “na pewno wygram”, zaś wartości bliskie zeru odpowiadały ocenie, że gra jest wyrównana.
Warto tu dodać, co znajdowało się na 48 powierzchniach warstw wejściowych “policy network”, jak i “value network”. Otóż pierwsze trzy powierzchnie odpowiadały kolejno: własnym kamieniom na planszy, kamieniom przeciwnika na planszy, pustym skrzyżowaniom na planszy. Zawsze wartość zero oznaczała, że coś nie występuje, a 1, że występuje. Następna powierzchnia wypełniona była samymi jedynkami. Kolejna samymi zerami. Obie odgrywały ważną rolę w procesach zachodzących w warstwach ukrytych. Następne osiem powierzchni odpowiadało temu, jak dawno został postawiony kamień na konkretnym skrzyżowaniu: pierwsza oznaczała kamień postawiony w ostatnim ruchu, druga w przedostatnim, wreszcie ósma kamień postawiony osiem zagrań wstecz. Kolejne osiem powierzchni odpowiadało oddechom. Na pierwszej oznaczono kamienie posiadające jeden oddech, na drugiej dwa oddechy, wreszcie na ósmej te kamienie, które miały osiem lub więcej oddechów. Osiem następnych odpowiadało liczbie kamieni przeciwnika, które można zbić jednym ruchem, grając na danym polu. I tak, pierwsza powierzchnia oznaczała punkty, gdzie zbijamy pojedynczy kamień przeciwnika, druga, gdzie zbijamy dwa kamienie, wreszcie ósma, gdzie zbijamy osiem lub więcej kamieni. Kolejne osiem powierzchni, analogicznie do poprzednich mówiło, ile własnych kamieni ratujemy przed zbiciem. Osiem dalszych powierzchni mówiło, ile oddechów posiadać będzie nasz łańcuch bądź kamień, jeśli zagramy w danym punkcie. I tak, pierwsza powierzchnia zaznaczała zagrania, po których będziemy mieć jeden oddech, druga – dwa oddechy, ósma - osiem lub więcej oddechów. Kolejna powierzchnia mówiła, czy zagranie w danym punkcie łapie jakiś kamień w działającą drabinkę. Następna, czy zagranie jest skuteczną ucieczką z drabinki. Wreszcie czterdziesta ósma oznaczała jedynkami legalne zagrania gracza, który wykonywał ruch. Czterdziesta dziewiąta była wykorzystywana tylko przez “value network” i miała informację, czy gracz, który wykonuje ruch, jest czarny (chodziło o uwzględnienie komi).
Początkowo zdziwiło mnie dodanie w “value network” i “policy network” powierzchni z zaznaczonymi legalnymi zagraniami. Przecież w węzłach drzewa MCTS i tak zagrania nielegalne nie mogłyby się znaleźć. Myślę, że użyto tego, by zwiększyć precyzję oszacowania ruchów legalnych, gdyż po niewielkiej liczbie przebiegów treningu sieć uczyła się kojarzyć zera na tej powierzchni z zagraniami, których w ogóle nie warto rozpatrywać.
Przypomnijmy, że wariant MCTS użyty w AlphaGo korzystał też z dwóch innych sieci: “tree policy” i “rollout policy”. Miały one na wejściach dodatkowe informacje: czy dany ruch wstawia jakiś łańcuch w atari, czy ucieka z atari, czy pasuje do jakiegoś wzorca nakade, czy znajduje się w odległości nie większej niż 8 (mierzonej w metryce miejskiej) od poprzedniego ruchu, czy pasuje do kilkudziesięciu tysięcy wzorców względem poprzedniego ruchu. “Tree policy” korzystała jeszcze z trzech innych informacji: czy ruch nie stawia własnego kamienia w atari, jaka jest jego odległość od ostatniego zagrania, czy miejsce, gdzie wykonywane jest zagranie, pasuje do któregoś z kilkudziesięciu tysięcy wzorców. Obie te sieci były płytkie i wyliczały wartości bardzo szybko.
AlphaGo na pewno nie był programem o bardzo prostej architekturze, ale nie był też bardzo skomplikowany. Swój sukces zawdzięczał przełomowym technologiom uczenia i ogromnym mocom obliczeniowym serwerów Google, na których sieci mogły się trenować dzięki milionom pojedynków, jakie program rozgrywał sam ze sobą. W następnym wpisie opowiem, jak znacznie upraszczając architekturę i metodologię treningu, DeepMind stworzył program o kilka poziomów silniejszy od AlphaGo.

Komentarze