350 likes | 489 Views
Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową. Magda Kusiak Karol Walędzik. Plan prezentacji. Przypomnienie pierwotnych pomysłów Zmiany w koncepcji AI Zastosowane usprawnienia algorytmu alfa-beta Wyniki nauki, wersja 1 Algorytm ewolucyjny Wyniki nauki, wersja 2.
E N D
Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową Magda Kusiak Karol Walędzik
Plan prezentacji • Przypomnienie pierwotnych pomysłów • Zmiany w koncepcji AI • Zastosowane usprawnienia algorytmu alfa-beta • Wyniki nauki, wersja 1 • Algorytm ewolucyjny • Wyniki nauki, wersja 2
Problem na przykładzie Go 9x9 • Rząd drzewa to 81 w pierwszym ruchu, w kolejnych maleje • Zdecydowanie zbyt dużo, aby klasyczny algorytm alfa-beta działał w rozsądnym czasie • Zastosowanie usprawnień algorytmu alfa-beta • Konieczność wybrania niewielkiej liczby sensownych ruchów i przeglądania ich w kolejności od najlepszych
Pierwszy pomysł na AI • Dwie sieci neuronowe • Każdemu ruchowi możliwemu w danej sytuacji przyporządkowuje wartość określającą, jak korzystny jest ten ruch • Ocenia pozycję, próbując przewidzieć, jaki będzie podział planszy po zakończeniu gry
Aktualna wersja pomysłu • Zaimplementowana jest sieć proponująca ruchy • Jako heurystykę wykorzystujemy algorytm Bouzy’ego • Uzupełniliśmy uczenie pierwszej sieci o elementy algorytmu ewolucyjnego • Umożliwiliśmy wykorzystanie przez program grający różnych sieci, zależnie od etapu gry i koloru wykonującego ruch • Zastanawiamy się nad sensem używania drugiej sieci jako heurystyki
Konstrukcja sieci proponującej ruchy • Na ogół go jest grą bardzo lokalną – sytuacja rozwija się w niewielkich regionach planszy • Czasem jednak pojawiają się zagrania, które zmieniają globalny układ sił na planszy • Obie te rzeczy trzeba uwzględnić przy budowie sieci
Topologia sieci • 162 neurony wejściowe – po 2 na każde pole • 9 x 5 neuronów, każda piątka zbiera informacje z jednego regionu planszy + 10 neuronów zbierających kontekst globalny • 9 x 5 neuronów, każda piątka połączona z odpowiednią piątką z poprzedniej warstwy i 10 neuronami globalnymi + 15 neuronów połączonych z całą poprzednią warstwą • 81 neuronów wyjściowych
Usprawnienia algorytmu alfa-beta: Transposition Tables • Wykorzystanie faktu, że często ta sama pozycja na planszy analizowana jest przez algorytm alfa-beta obcięć wielokrotnie • Informacje o napotkanych wcześniej pozycjach są przechowywane w tablicy hashującej (hash table) • Dla każdej pozycji przechowujemy jej wartość, najlepszy ruch oraz głębokość, na jaką przeszukano drzewo, żeby znaleźć ten ruch • Czasem wynikiem przeszukania jest tylko górne lub dolne szacowanie wartości pozycji – jest to także wartościowa informacja
Transposition tables - kolizje • Dostęp do transposition tables musi być szybki, nieakceptowalny jest narzut na dynamiczne przydzielanie pamięci, dlatego pod każdym indeksem znajduje się tylko jeden element • Co zrobić, gdy pojawi się kolizja • Zawsze zastępować dotychczasowy element nowym • Zastępować element tylko wtedy, gdy nowy został wygenerowany w wyniku głębszego przeszukiwania • Rozwiązanie pośrednie: zastępowanie elementu nowym, jeśli nowy powstał w wyniku głębszego przeszukiwania, lub jeśli stary długo nie był przydatny
Transposition tables - wariacje • Pomysł: dla każdej pozycji zamiast jednego najlepszego ruchu przechowywać wszystkie ruchy wygenerowane przez sieć neuronową wraz z ich wartościami • Wada: narzut pamięciowy ograniczenie liczby możliwych do przechowania pozycji • Zaleta: uniknięcie konieczności ponownego, potencjalnie kosztownego generowania dużej liczby ruchów • Po wstępnych testach w celu oszacowania częstotliwości kolizji i zajętości pamięci, zdecydowaliśmy się jednak na klasyczne transposition tables
Usprawnienia algorytmu alfa-beta: Aspiration Search • Wykorzystywane w komplecie z iterative deepening • Pierwsze przeszukiwanie odbywa się z oknem (-∞,+∞) • W kolejnych przeszukiwaniach wykorzystujemy wynik poprzedniej iteracji • Środkiem nowego węższego okna jest wynik poprzedniego przeszukiwania • Jeśli wynik przeszukiwania wypadnie poza okno, konieczna jest ponowna analiza z rozszerzonym (pełnym) oknem
Aspiration search - problemy • Niebezpieczna dla niektórych implementacji algorytmu może być niestabilność • Przykład • Przeszukujemy drzewo z oknem (α, β) i przekraczamy górny kraniec przedziału • Przeszukujemy ponownie z oknem (β-1, +∞) i przekraczamy dolny kraniec przedziału • Przeszukujemy ponownie z oknem (-∞, β) i przekraczamy górny kraniec • itd… • Nasze rozwiązanie: • Rozszerzamy zawsze okno w obie strony
Usprawnienia algorytmu alfa-beta: History Heuristic • Podejście oparte na założeniu, że ruch dostatecznie dobry w danej pozycji, będzie prawdopodobnie dobry także w większości innych pozycji w pewnym otoczeniu – założenie to jest szczególnie naturalne w Go • Za otoczenie uznajemy wszystkie pozycje analizowane w jednym wywołaniu pełnego algorytmu alfa-beta obcięć • Za dostatecznie dobry ruch uznajemy ruch o najwyższej ocenie lub powodujący obcięcie • Za każdym razem, gdy dany ruch okaże się najlepszym jaki można wykonać lub spowoduje obcięcie, zwiększana jest jego wartość
Usprawnienia algorytmu alfa-beta: History Heuristic • Wartość ta wykorzystywana jest do sortowania ruchów do analizy (w naszym przypadku po zsumowaniu z ocenami wygenerowanymi przez sieć) • Wartość ruchu powinna być zwiększana proporcjonalnie do głębokości przeszukiwania, które wykazało, że jest on najlepszym z możliwych – sugeruje się przyjęcie wartości 2d, gdzie d – głębokość analizy
Usprawnienia algorytmu alfa-beta: History Heuristic • Zalety: • w prosty i naturalny sposób koryguje błędy w posortowaniu propozycji ruchów przez sieć neuronową • Zaniedbywalny narzut pamięciowy • Wady: • Narzut czasowy na każdorazowe sortowanie listy ruchów • Pomijalne zyski w przypadku bardzo skutecznego działania generatora ruchów
Nauka sieci – generowanie wzorców uczących • Program korzysta z GNU Go • Rozegranie fragmentu gry • Siła obu graczy jest losowo wybierana z zadanego przedziału • Po rozegraniu części gry GNU Go proponuje kilkanaście najlepszych ruchów wraz z ich ocenami • Zaproponowane ruchy są zapisywane do XMLa i potem wykorzystywane w nauce sieci
Sposób oceny nauki • Sprawdzamy, jak się ma ocena najlepszego ruchu zaproponowanego przez sieć do oceny najlepszego w danej sytuacji ruchu zaproponowanego przez GNU Go • Jeśli ten stosunek jest niższy od pewnego współczynnika (0.6), to znaczy, że sieć źle zaproponowała najlepszy ruch • Dotychczasowe wyniki sugerują, że albo kryterium wysokości 0.6 jest za silne albo jest jeszcze gorzej...
Sposób oceny nauki – inny pomysł • Rozsądna wartość progu silnie uzależniona od rozrzutu wartości kilku najlepszych ruchów, więc może: • uznawajmy za próg wartość proporcjonalną do średniej (mediany?) wartości n najlepszych/wszystkich ruchów zaproponowanych przez GNU Go
Sposób oceny nauki – jeszcze inny pomysł • Najważniejsze, żeby najlepszy w danej sytuacji ruch w ogóle znalazł się wśród zaproponowanych przez sieć • Pomysł: Zamiast sprawdzać, czy najlepszy zaproponowany ruch jest odpowiednio dobry, sprawdzajmy, czy rzeczywiście najlepszy ruch nie został odrzucony przez sieć
Wyniki nie są zadowalające • Prawdopodobnie sieć zatrzymuje się w jednym z minimów lokalnych • Stąd pomysł na uzupełnienie nauki prostym algorytmem ewolucyjnym
Algorytm ewolucyjny – ogólny schemat • Utwórz N (6) sieci. • Ucz sieci przez pewną liczbę (300) epok. • Okresowo (co 100 epok) sprawdzaj wyniki sieci i usuwaj najsłabsze, dopóki jest więcej niż N/2 sieci. • Sklonuj najlepsze sieci, dokonując mutacji (aby znów mieć N sieci). • Wróć do punktu 2.
Selekcja • Oblicz błąd dla każdej sieci • Posortuj sieci według malejącego błędu • Usuń najsłabszą sieć • Usuń wszystkie sieci o błędzie większym niż UnfitnessFactor * błąd najlepszej sieci
Mutacja • Mutuj z pewnym prawdopodobieństwem (domyślnie 0.25) parametry uczenia • Mutuj z pewnym prawdopodobieństwem (domyślnie 0.15) współczynniki funkcji aktywacji • Mutuj każdą niestałą wagę (domyślnie prawdopodobieństwo mutacji wagi to 0.25) • Jeśli nie zaszło (1) ani (2), mutacja wag zachodzi z prawdopodobieństwem 1 • W.p.p. mutacja wag zachodzi z pewnym prawdopodobieństwem (domyślnie 0.5)
Obserwacje • Wyniki są lepsze dla mniejszych prawdopodobieństw mutacji • Zdecydowanie lepsze wyniki, jeśli współczynniki funkcji aktywacji nie mutują • Najlepsze wyniki są osiągane, gdy współczynniki funkcji aktywacji w dwóch pierwszych warstwach są wysokie, a w trzeciej - niskie • Stała ucząca i moment maleją w miarę ewolucji • Algorytm ewolucyjny pomaga, ale wyniki nadal nie są zadowalające
Za mała sieć? • Wyniki sugerują, że sieć może mieć za mało połączeń • Testowaliśmy sieć, w której do warstw ukrytych dodano po 10 neuronów zbierających kontekst globalny
Obserwacje • Sieć osiągnęła najlepszy wynik z dotychczasowych • 4625 błędów na 15000 elementów zbioru uczącego • 894 błędy na 2000 elementów zbioru testującego • Wyniki nadal nie są zadowalające...