Školení agenta, aby zvládl piškvorky prostřednictvím sebehraní | od Sébastien Gilbert | září 2023


Softwarového agenta hra překvapivě nikdy neomrzí.

Ach! základní škola! To byla doba, kdy jsme se naučili cenné dovednosti, jako je gramotnost, aritmetika a optimální hraní piškvorek.

fotka od Slunovrat Hannan na Unsplash

Zahrát si se svým kamarádem zápas piškvorky, aniž by vás chytil učitel, je umění. Musíte diskrétně podat herní list pod stolem a přitom působit dojmem, že věnujete předmětu pozornost. Zábava byla pravděpodobně více o tajné operaci než o hře samotné.

Nemůžeme naučit softwarového agenta umění vyhnout se přistižení ve třídě, ale můžeme vycvičit agenta, aby zvládl hru?

V mém předchozím příspěvku jsme studovali agenta, který se učí hru SoučetTo100 prostřednictvím vlastní hry. Byla to snadná hra, která nám umožnila zobrazit hodnotu stavu, což nám pomohlo vybudovat intuici o tom, jak se agent hru učí. Pomocí piškvorek řešíme mnohem větší stavový prostor.

Kód Pythonu najdete v toto úložiště. Skript, který provádí školení, je learn_tictactoe.sh:

#!/bin/bash
deklarovat -i NUMBER_OF_GAMES=30000
deklarovat -i NUMBER_OF_EPOCHS=5

exportovat PYTHONPATH='./'

python preprocessing/generate_positions_expectations.py \
--outputDirectory=./learn_tictactoe/output_tictactoe_generate_positions_expectations_level0 \
--hra=tictaktoe \
--numberOfGames=$NUMBER_OF_GAMES \
--gamma=0,95 \
--randomSeed=1 \
--agentArchitecture=Žádný \
--agentFilepath=Žádný \
--opponentArchitecture=Žádný \
--opponentFilepath=Žádný \
--epsilons="[1.0]" \
--teplota=0

dataset_filepath="./learn_tictactoe/output_tictactoe_generate_positions_expectations_level0/dataset.csv"

python train/train_agent.py \
$dataset_filepath \
--outputDirectory="./learn_tictactoe/output_tictactoe_train_agent_level1" \
--hra=tictaktoe \
--randomSeed=0 \
--validationRatio=0,2 \
--batchSize=64 \
--architecture=SaintAndre_1024 \
--dropoutRatio=0,5 \
--learningRate=0,0001 \
--weightDecay=0,00001 \
--numberOfEpochs=$NUMBER_OF_EPOCHS \
--startingNeuralNetworkFilepath=Žádný

pro úroveň v {1..16}
dělat
dataset_filepath="./learn_tictactoe/output_tictactoe_generate_positions_expectations_level${level}/dataset.csv"
python preprocessing/generate_positions_expectations.py \
--outputDirectory="./learn_tictactoe/output_tictactoe_generate_positions_expectations_level${level}" \
--hra=tictaktoe \
--numberOfGames=$NUMBER_OF_GAMES \
--gamma=0,95 \
--randomSeed=0 \
--agentArchitecture=SaintAndre_1024 \
--agentFilepath="./learn_tictactoe/output_tictactoe_train_agent_level${level}/SaintAndre_1024.pth" \
--opponentArchitecture=SaintAndre_1024 \
--opponentFilepath="./learn_tictactoe/output_tictactoe_train_agent_level${level}/SaintAndre_1024.pth" \
--epsilons="[0,5, 0,5, 0,1]" \
--teplota=0

deklarovat -i další_úroveň=$((úroveň + 1))
python train/train_agent.py \
"./learn_tictactoe/output_tictactoe_generate_positions_expectations_level${level}/dataset.csv" \
--outputDirectory="./learn_tictactoe/output_tictactoe_train_agent_level${next_level}" \
--hra=tictaktoe \
--randomSeed=0 \
--validationRatio=0,2 \
--batchSize=64 \
--architecture=SaintAndre_1024 \
--dropoutRatio=0,5 \
--learningRate=0,0001 \
--weightDecay=0,00001 \
--numberOfEpochs=$NUMBER_OF_EPOCHS \
--startingNeuralNetworkFilepath="./learn_tictactoe/output_tictactoe_train_agent_level${level}/SaintAndre_1024.pth"

Hotovo

Skript prochází voláním dvou programů:

Učení hry agentem probíhá prostřednictvím cyklu generování zápasů a školení, aby bylo možné předpovědět výsledek zápasu ze stavu hry:

Obrázek 1: Cyklus generování zápasů a trénování neuronové sítě. Obrázek od autora.

Cyklus začíná simulací zápasů mezi náhodnými hráči, tj. hráči, kteří si náhodně vybírají ze seznamu legálních akcí v daném herním stavu.

Proč generujeme zápasy hrané náhodně?

Tento projekt je o učení se vlastní hrou, takže agentovi nemůžeme poskytnout žádné a priori informace jak hrát. V prvním cyklu, protože agent nemá ponětí o dobrých nebo špatných tahech, musí být shody generovány náhodnou hrou.

Obrázek 2 ukazuje příklad zápasu mezi náhodnými hráči:

Obrázek 2: Příklad náhodně hraného tic-tac-toe zápasu. Obrázek od autora.

Jaké ponaučení se můžeme naučit sledováním tohoto zápasu? Z pohledu hráče „X“ můžeme předpokládat, že se jedná o příklad špatné hry, protože skončila prohrou. Nevíme, který tah(y) je/jsou odpovědné za porážku, takže to budeme předpokládat všechna rozhodnutí vytvořené hráčem 'X' byly špatné. Pokud byla některá rozhodnutí dobrá, vsadili jsme na statistiku (ostatní simulace by mohly projít podobným stavem), abychom napravili jejich předpokládanou hodnotu stavu.

Poslední akce hráče 'X' má hodnotu -1. Ostatní akce obdrží diskontovanou zápornou hodnotu, která se geometricky snižuje o faktor γ (gama) ∈ [0, 1], když se vracíme k prvnímu tahu.

Obrázek 3: Cílové hodnoty pro herní stavy. Obrázek od autora.

Státy ze zápasů, které vedly k výhře, obdrží podobné kladné diskontované hodnoty. Stavy vylosované z losování mají hodnotu nula. Agent zaujímá pohled jak prvního, tak druhého hráče.

Hra uvádí jako tenzory

Potřebujeme reprezentaci tenzoru pro herní stav. Použijeme tenzor [2x3x3], kde první rozměr představuje kanály (0 pro 'X' a 1 pro 'O') a další dva rozměry jsou řádky a sloupce. Obsazení čtverce (řádek, sloupec) je zakódováno jako 1 v položce (kanál, řádek, sloupec).

Obrázek 4: Reprezentace herního stavu pomocí tenzoru [2x3x3]. Obrázek od autora.

Dvojice (stavový tenzor, cílová hodnota) získané generováním shod tvoří datovou sadu, na které bude neuronová síť trénovat v každém kole. Datový soubor je vytvořen na začátku cyklu s využitím poznatků, ke kterým došlo v předchozích kolech. Zatímco první kolo generuje čistě náhodnou hru, další generují postupně realističtější zápasy.

Vložení náhody do hry

První kolo generování zápasů je proti náhodným hráčům. Následující kola se postaví agentovi proti sobě (proto „sebehra“). Agent je vybaven regresní neuronovou sítí vycvičenou k předpovídání výsledku zápasu, což mu umožňuje zvolit právní žalobu, která přinese nejvyšší očekávanou hodnotu. Pro podporu rozmanitosti agent vybírá akce na základě epsilon-chtivého algoritmu: s pravděpodobností (1-ε) je vybrána nejlepší akce; jinak bude vybrána náhodná akce.

Obrázek 5 ukazuje vývoj ověřovacích ztrát v pěti epochách pro maximálně 17 tréninkových kol:

Obrázek 5: Vývoj ztráty ověření pro různá čísla tréninkových kol. Obrázek od autora.

Můžeme vidět, že prvních několik tréninkových kol ukazuje rychlý pokles ztráty ověřování a poté se zdá, že existuje plató kolem střední ztráty na druhou chybu 0,2. Tento trend ukazuje, že agentova regresní neuronová síť se z daného herního stavu zdokonaluje v předpovídání výsledku zápasu hraného proti sobě samému. Vzhledem k tomu, že akce obou hráčů nejsou deterministické, existuje omezení předvídatelnosti výsledku zápasu. To vysvětluje, proč se ztráta ověření po některých kolech přestane zlepšovat.

Zlepšení z kola na kolo

S hrou SoučetTo100, mohli bychom reprezentovat stav na 1D mřížce. Pomocí piškvorek však nemůžeme přímo zobrazit vývoj hodnoty stavu. Jedna věc, kterou můžeme udělat pro měření zlepšení, je postavit agenta proti předchozí verzi a sledovat rozdíl mezi výhrami a prohrami.

Pokud použijeme ε = 0,5 pro první akci obou hráčů a ε = 0,1 pro zbytek zápasu, při 1000 zápasech na srovnání, dostaneme toto:

Obrázek 6: Porovnání agenta s jeho předchozí verzí. Obrázek od autora.

Počet výher převyšoval počet proher (ukazuje zlepšení) do 10 tréninkových kol. Poté se agent kolo od kola nezlepšoval.

Je čas vidět, jak náš agent hraje piškvorky!

Jednou z užitečných funkcí regresní neuronové sítě je možnost zobrazení agentova hodnocení každého legálního kroku. Pojďme si zahrát hru proti agentovi a ukázat, jak posuzuje své možnosti.

Ruční přehrávání

Agent začne hrát 'X':

Obrázek 7: Zápas proti agentovi s vyhodnocením akcí. Obrázek od autora.

Tak se necháte brutálně rozdrtit bezduchou mašinkou piškvorek!

Jakmile jsem dal 'O' do (1, 0) čtverce, očekávaný výnos se zvýšil z 0,142 na 0,419 a můj osud byl zpečetěn.

Podívejme se, jak to dělá, když agent hraje druhý:

Obrázek 8: Zápas hraný proti agentovi s vyhodnocením akcí. Obrázek od autora.

Nespadlo to do pasti a zápas byl remízový.

Zápasy proti náhodnému hráči

Kdybychom simulovat velký počet zápasů proti náhodnému hráči, dostaneme toto:

Obrázek 9: Výsledky 1000 zápasů proti náhodnému hráči. Obrázek od autora.

Z 1000 zápasů (agent hrál první polovinu zápasů) vyhrál 950 zápasů, nikoho neprohrál a bylo 50 remíz. Není to důkaz, že náš agent hraje optimálně, ale určitě dosáhl slušné úrovně hry.

V návaznosti na Školení agenta, aby zvládl jednoduchou hru prostřednictvím vlastní hry kde bylo snadné hru rozlousknout a stavový prostor byl malý, použili jsme stejnou techniku k zvládnutí piškvorek. I když je to stále problém na hraní, stavový prostor tic-tac-toe je dostatečně velký na to, aby agentova regresní neuronová síť našla vzory ve stavových tenzorech. Tyto vzory umožňují zobecnění pro neviditelné tenzory stavu.

Kód je k dispozici v tomto úložišti. Vyzkoušejte to a dejte mi vědět, co si myslíte!



Odkaz na zdroj

zanechte odpověď

Vaše e-mailová adresa nebude zveřejněna. Povinná pole jsou označena *

Můžete použít tyto HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

cs_CZCzech