Skip to content

Supervised learning

bskiba edited this page Jun 8, 2015 · 19 revisions

Uczenie z nadzorem

Niniejsza strona zawiera podsumowanie wyników uzyskanych dla agenta grającego w grę "kowboje" z wykorzystaniem sieci neuronowej wytrenowanej na przygotowanym wcześniej zbiorze treningowym.

Dane treningowe

Dane treningowe dla sieci neuronowej zostały wygenerowane poprzez rozgrywanie gier pomiędzy botami wykorzystującymi różne algorytmy. W trakcie rozgrywki zapisywany był stan gry i strategia wybierana przez gracza 0, oraz wartość funkcji oceniającej dla tego ruchu.

Opis stanu gry

W skład zapisywanego opisu stanu gry wchodziły informacje na temat tego, czy przeciwnicy żyją, ile kto ma nabojów oraz kto bronił się w poprzedniej rundzie. Dokładny format opisu był następujący

pole możliwe wartości
czy przeciwnik1 żyje True/False
czy przeciwnik2 żyje True/False
ile nabojów ma agent 0, 1, 2, 3
ile nabojów ma przeciwnik1 -1, 0, 1, 2, 3
ile nabojów ma przeciwnik2 -1, 0, 1, 2, 3
czy agent bronił się poprzednio True/False
czy przeciwnik1 bronił się poprzednio True/False
czy przeciwnik1 bronił się poprzednio True/False

Wybrana strategia

Dla uproszczenia przedstawiania stanu gry i procesu nauki sieci ustalone zostało, że agent używający sieci będzie zawsze graczem 0. Decyzja ta wynika z faktu, ze łatwiej wtedy nauczyć się agentowi przykładowo żeby nie strzelać do siebie, wystarczy, że nauczy się, że nie należy wykonywać ruchu STRZEL0. Można by włączyć numer gracza jako zmienną do całej procedury uczenia, jednak zdecydowaliśmy, że byłoby to niepotrzebne skomplikowanie nie dodające wartości.

W związku z tym, że agent jest zawsze graczem 0, uczy się on także tylko na strategiach gracza 0.

Mapowanie wartości

Dla użytku sieci neuronowej wartości na jej wejściu muszą być typu float. Wartości nieliczbowe zostały więc zmapowane następującą funkcją:

wartość mapowanie
True 0
False 1
DODGE 0
LOAD 1
SHOOT0 2
SHOOT1 3
SHOOT2 4

Funkcja nagrody

Funkcja nagrody za daną strategię jest analogiczna jak w uczeniu ze wzmocnieniem.

REWARD_KILL = 5
REWARD_LOAD = 3
REWARD_DODGE_SUCCESSFUL = 2
REWARD_NEGATE_SHOTS = 1
REWARD_DODGE_UNSUCCESSFUL = 0
REWARD_SHOOT_DODGER = 0
REWARD_SHOOT_A_CORPSE = -1
REWARD_DIE = -3 (sumowana z nagrodą za konkretny ruch)
REWARD_SUICIDE = -3

Proces generowania danych

W celu wygenrowania danych treningowych wybierani byli gracze, których rozgrywka będzie źródłem danych treningowych. Następnie była rozgrywana określona liczba partii między nimi i zapisywane dane, które zostały opisane powyżej. Rozgrywka była przerywana zgodnie z zasadami lub gdy ginął gracz 0, który jest, jak wcześniej wspominialiśmy, źródłem informacji o strategiach.

Zapisywane dane

Załóżmy, że mamy następującą sytuację:

  • Żyją wszyscy gracze.
  • Gracz 0 ma 1 pocisk.
  • Pozostali gracze mają po 0 pocisków.
  • W poprzedniej turze nikt się nie bronił.
  • Gracz 0 wykonuje akcję SHOOT1
  • Pozostali gracze wykonują akcję DODGE

Zapis stanu:
0, 0 (wszyscy przeciwnicy żyją), 1, 0, 0 (liczba pocisków), 0, 0, 0 (nikt się nie bronił)

Zapis strategii:
3 (SHOOT1)

Funkcja nagrody:
0 (zastrzelenie unikającego gracza)

Ostateczny zapis:
0, 0, 1, 0, 0, 0, 0, 0, 3, 0

Plik z wygenerowanymi danymi treningowymi zawiera pewną (zależną od liczby przeprowadzonych gier i ich przebiegu) liczbę linijek tej właśnie postaci.

Uczenie sieci

Wejściem sieci było połączenie stanu gry i strategii, wyjściem funkcja oceniająca.

Jako że proces uczenia sieci jest długotrwały, przetestowana została ograniczona liczba konfiguracji sieci.

Wspólne parametry sieci:

input_size: 9
output_size: 1
hidden_size: 15
training_epochs: 200

Cztery testowane sieci miały następujące konfiguracje danych treningowych:

Sieć 1:

learn: random_bot vs random_bot
training_games_count: 5000
learn_samples_count: 14830 

Sieć 2:

learn: avg_best_bot vs good_rnd_bot
training_games_count: 5000
learn_samples_count:  12479

Sieć 3:

learn: thinking_bot
training_games_count: 1000
learn_samples_count:  25501

Sieć 4:

learn: mixed (rnd + avg_best + thinking)
training_games_count: 11000
learn_samples_count: 52810

Schemat działania gracza

Gracz wykorzystujący sieć do podejmowania decyzji otrzymuje dane na temat aktualnego stanu gry. Następnie dla każdej strategii s sprawdza jaką funkcję oceny otrzymuje na wyjściu sieci, jeżeli na wejściu poda aktualny stan i strategię s. Mając te dane, wybiera strategię o najwyższej funkcji nagrody, lub jeżeli jest kilka takich strategii, losuje jedną z nich.

Proces testowania

Nauczony agent rozgrywał określoną ilość gier z wybranymi botami, w których liczone były punkty. Wynik ostateczny agenta to procent maksymalnej liczby punktów które mógł teoretycznie zdobyć wygrywając wszystkie gry. Każda z wytrenowanych sieci została przetestowane na różnych konfiguracjach przeciwników.

Otrzymane wyniki