35
Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową Magda Kusiak Karol Walędzik

Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

  • Upload
    matt

  • View
    30

  • Download
    1

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Magda KusiakKarol Walędzik

Page 2: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 3: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 4: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Pierwszy pomysł na AI

Dwie sieci neuronowe1. Każdemu ruchowi możliwemu w danej

sytuacji przyporządkowuje wartość określającą, jak korzystny jest ten ruch

2. Ocenia pozycję, próbując przewidzieć, jaki będzie podział planszy po zakończeniu gry

Page 5: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 6: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 7: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Podział planszy na regiony

Page 8: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Topologia sieci

1. 162 neurony wejściowe – po 2 na każde pole

2. 9 x 5 neuronów, każda piątka zbiera informacje z jednego regionu planszy + 10 neuronów zbierających kontekst globalny

3. 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ą

4. 81 neuronów wyjściowych

Page 9: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 10: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 11: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 12: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 13: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 14: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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ść

Page 15: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 16: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 17: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 18: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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...

Page 19: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 20: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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ć

Page 21: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Wyniki nauki – zbiór uczący

0

2000

4000

6000

8000

10000

12000

14000

16000

0 500 1000 1500 2000 2500 3000 3500 4000

0

0,5

1

1,5

2

2,5

3

3,5

WrongChoices MSE

Page 22: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Wyniki nauki – zbiór testujący

0

200

400

600

800

1000

1200

1400

1600

1800

2000

0 500 1000 1500 2000 2500 3000 3500 4000

WrongChoices

1,9

1,91

1,92

1,93

1,94

1,95

1,96

1,97

1,98

1,99

2

MSE

WrongChoices MSE

Page 23: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 24: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Algorytm ewolucyjny – ogólny schemat

1. Utwórz N (6) sieci.

2. Ucz sieci przez pewną liczbę (300) epok.

3. Okresowo (co 100 epok) sprawdzaj wyniki sieci i usuwaj najsłabsze, dopóki jest więcej niż N/2 sieci.

4. Sklonuj najlepsze sieci, dokonując mutacji (aby znów mieć N sieci).

5. Wróć do punktu 2.

Page 25: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Selekcja

1. Oblicz błąd dla każdej sieci

2. Posortuj sieci według malejącego błędu

3. Usuń najsłabszą sieć

4. Usuń wszystkie sieci o błędzie większym niż UnfitnessFactor * błąd najlepszej sieci

Page 26: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Mutacja1. Mutuj z pewnym prawdopodobieństwem (domyślnie

0.25) parametry uczenia

2. Mutuj z pewnym prawdopodobieństwem (domyślnie 0.15) współczynniki funkcji aktywacji

3. Mutuj każdą niestałą wagę (domyślnie prawdopodobieństwo mutacji wagi to 0.25)

a) Jeśli nie zaszło (1) ani (2), mutacja wag zachodzi z prawdopodobieństwem 1

b) W.p.p. mutacja wag zachodzi z pewnym prawdopodobieństwem (domyślnie 0.5)

Page 27: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Wyniki nauki – zbiór uczący

0

2000

4000

6000

8000

10000

12000

14000

0 500 1000 1500 2000

0

0,5

1

1,5

2

2,5

3

WrongChoices MSE

Page 28: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Wyniki nauki – zbiór testujący

0

200

400

600

800

1000

1200

1400

1600

1800

0 500 1000 1500 2000

0

0,05

0,1

0,15

0,2

0,25

0,3

0,35

WrongChoices MSE

Page 29: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 30: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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

Page 31: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Wyniki na zbiorze uczącym

0

2000

4000

6000

8000

10000

12000

14000

0 500 1000 1500 2000

0

0,5

1

1,5

2

2,5

WrongChoices MSE

Page 32: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Wyniki na zbiorze testującym

0

200

400

600

800

1000

1200

1400

1600

1800

0 500 1000 1500 2000

0

0,05

0,1

0,15

0,2

0,25

0,3

0,35

WrongChoices MSE

Page 33: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Porównanie z mniejszą siecią

0

200

400

600

800

1000

1200

1400

1600

1800

0 500 1000 1500 2000

0

0,05

0,1

0,15

0,2

0,25

0,3

0,35

WrongChoices - bigger net WrongChoices - smaller net

MSE - bigger net MSE - smaller net

Page 34: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

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...

Page 35: Problem wstępnego sortowania ruchów w programie grającym w grę dwuosobową

Dziękujemy za uwagę