Ročníkový projekt · FMFI UK

PyTorch Game Agent Návrh, tréning a súťaženie

Reinforcement learning a neurónové siete aplikované na hranie jednoduchej videohry — od DQN agenta pre Snake až po kompletný CNN + MCTS self-play pipeline v súťažnom prostredí Kaggle Hungry Geese.

PyTorch · CUDA DQN CNN Policy-Value MCTS Self-play Kaggle
102 iterácií self-play 1,74 M tréningových pozícií 65,7 h tréningu 13 400 riadkov kódu
01
Projekt

Špecifikácia projektu

Názov projektu
PyTorch Game Agent: Návrh, tréning a súťažné porovnanie
Študent
Dávid Moniš · david5.monis@gmail.com
Školiteľ
RNDr. Andrej Lúčny, PhD. · lucny@fmph.uniba.sk
Téma
Reinforcement learning a neurónové siete aplikované na hranie jednoduchej videohry so súťažením na Kaggle.
Špecifikácia (Cieľ)
Projekt je rozdelený do dvoch nadväzujúcich fáz. Prvá fáza sa zameriava na návrh a implementáciu DQN agenta pre hru Snake vrátane kompletného tréningového ekosystému v PyTorch. Druhá fáza nadväzuje rozšírením riešenia na multi-agentové prostredie Kaggle Hungry Geese, kde je cieľom adaptovať agenta na nové pravidlá a dosiahnuť merateľné výsledky v súťažnom hodnotení.
Zdrojový kód projektu
GitHub – DavidMonis / RocnikovyProjekt
README
Návod na spustenie tréningu a testovania
02
Fáza 1 · Snake

Krátky opis hry

Hra je variácia klasického Snake, navrhnutá ako prostredie pre reinforcement learning. Agent sa v každom kroku rozhoduje na základe lokálnych informácií o nebezpečenstve, aktuálnom smere pohybu a relatívnej polohe potravy. Jeho cieľom je efektívne navigovať mriežku, vyhýbať sa kolíziám so stenami a vlastným telom a dlhodobo maximalizovať skóre.

Správanie hada nie je explicitne naprogramované – agent sa učí stratégiu postupne prostredníctvom skúseností, odmien a penalizácií. Pomocou Deep Q-Learningu dokáže plánovať pohyb, prispôsobovať sa rastúcej dĺžke tela a zlepšovať svoje rozhodnutia s narastajúcim počtom odohraných epizód.

Projekt nepredstavuje len výslednú hru, ale kompletný tréningový ekosystém zahŕňajúci definíciu stavového priestoru, množinu akcií, návrh reward funkcie, neurónovú sieť, tréningovú logiku, ukladanie modelov a vizualizáciu učenia v reálnom čase.

Screenshot 1
Herné rozhranie počas behu agenta
Screenshot 2
Prostredie určené pre reinforcement learning
03
Stav projektu

Čo je už hotové

  • Plne funkčná manuálna verzia hry Snake v knižnici pygame.
  • Samostatné RL prostredie s definovaným stavovým priestorom, akciami a reward funkciou.
  • Implementácia DQN neurónovej siete v PyTorch (Linear_QNet).
  • Tréningová logika s oddeleným short/long memory tréningom.
  • Ukladanie a opätovné načítanie natrénovaných váh modelu.
  • Vizualizácia priebehu učenia – skóre a priemerné skóre v čase.
  • Skripty na testovanie a kontrolu uložených modelov.
  • Vygenerované videá porovnania agentov a timelapse tréningu.
  • Pripravené podklady pre rozšírenie na súťažné prostredie Kaggle.
04
Fáza 1 · Výstupy

Evidencia a výsledky

Nižšie sú ukážky výsledkov tréningu. Videá demonštrujú rozdiely medzi natrénovaným agentom v rôznych fázach učenia a časový priebeh tréningu.

Porovnanie 3 úrovní hadov

TimeLapse tréningu

Uložené váhy modelu

smartSnake.pth (GitHub)

05
Fáza 2 · Súťaž

Kaggle Hungry Geese

CNN Policy-Value MCTS Self-play PyTorch · CUDA

Druhá fáza projektu nahradila DQN agenta kompletným AI pipeline pre Kaggle Hungry Geese – verziu hry Snake pre štyroch hráčov, v ktorej sa po opustení jedného okraja hracej plochy hráč objaví na opačnej strane. Hra vyžaduje modelovanie súperov, dlhodobé plánovanie a okamžitú reakciu na nebezpečné kolízie. Vznikol vlastný simulátor herného prostredia, CNN policy-value sieť, vlastný MCTS a self-play tréning s replay bufferom.

0 h Celkový čas self-play tréningu (102 iterácií)
0 M Vygenerovaných tréningových pozícií
0 Odohraných self-play hier (100 za iteráciu)
0 h Externá evaluácia agenta (4+ dní)
  • Generovanie self-play hier77 %
  • Interná evaluácia checkpointov23 %
  • Gradient tréning siete< 1 %

Zaujímavosť: Samotný gradient tréning siete zaberá len 0,2 h z celkových 65,7 h — teda menej ako 1 % celkového času. Väčšina šla na generovanie self-play hier (77 %) a internú evaluáciu checkpointov (23 %). Toto rozloženie je typické pre self-play systémy, kde je generovanie dát rádovo nákladnejšie ako aktualizácia váh siete.

06
Fáza 2 · Pipeline

Architektúra a tréning

Vývoj architektúry

Finálna podoba siete nevznikla naraz — prešla niekoľkými výrazne odlišnými generáciami. Na začiatku stála jednoduchá plne prepojená sieť s jednou skrytou vrstvou, určená na overenie, či model vôbec dokáže spracovať vstup a vrátiť použiteľné akcie. Ukázalo sa, že to funguje, no hra Hungry Geese je priestorový problém — a plne prepojená vrstva priestorové vzťahy nevyužíva efektívne.

Preto sa architektúra vyvíjala postupne: pribudla druhá skrytá vrstva pre zachytenie zložitejších vzťahov, potom konvolučné vrstvy (CNN) pre priestorové príznaky mriežky, neskôr sa za CNN pridala flatten vrstva kombinujúca priestorové príznaky so skalárnym vstupom. Posledným a najdôležitejším krokom bolo rozdelenie výstupnej časti na dve nezávislé hlavy — policy a value — čo umožnilo plnohodnotnú integráciu s MCTS a zásadne zvýšilo kvalitu tréningu.

Neurónová sieť

Finálny model je CNN policy-value sieť s dvoma výstupnými hlavami. Predikuje pravdepodobnosti akcií (policy) aj hodnotu aktuálnej pozície (value), čo umožňuje efektívne kombinovanie s MCTS bez nutnosti dohrávať každú hru do konca.

PolicyValueNet · interaktívna schéma
Herná plocha 6 × 7 × 11 Conv2d + ReLU 6 → 32 · 3×3 circular padding [32 × 7 × 11] Conv2d + ReLU 32 → 64 · 3×3 circular padding [64 × 7 × 11] Flatten · 4 928 Skaláry 13 hodnôt Concat · 4 941 Dense + ReLU 4 941 → 256 1,27 M parametrov Policy head 256 → 4 · Softmax P(N)·P(S)·P(E)·P(W) Value head 256 → 1 · Tanh MSE · [−1, 1]
PolicyValueNet

Interaktívna schéma siete. Prejdite kurzorom (na mobile ťuknite) na ľubovoľnú vrstvu — zobrazí sa jej popis, rozmery a počet parametrov.

Spolu 1 286 693 parametrov (~1,29 M) · definícia: network.py + config.py
Vstup — priestorový
6 kanálov × 7 × 11 — každý kanál je binárna maska hernej plochy:
vlastné telo · hlavy súperov · telá súperov · chvosty súperov · jedlo · nebezpečné polia (políčka, kam môže v ďalšom kroku vstúpiť hlava súpera)
Vstup — skalárny (13 hodnôt)
Dĺžky všetkých 4 husí · alive flagy 3 súperov · hunger tick (krokov do hladovej smrti) · aktuálny krok hry · posledná akcia agenta (one-hot, 4 hodnoty)
Tieto hodnoty nie sú kódovateľné do mriežky — nesú globálny kontext hry. Vstupujú priamo do dense vrstvy po zkonkatenovaní s výstupom CNN.
Konvolučné vrstvy
Conv2d 6 → 32, 3×3, circular padding + ReLU
Conv2d 32 → 64, 3×3, circular padding + ReLU → Flatten (4 928)
Circular padding odráža toroidálnu topológiu hracej plochy: pravý okraj susedí s ľavým, horný so spodným. Bežný zero-padding by na okrajoch vytváral falošné „steny", ktoré v hre neexistujú. Circular convolutions toto priamo modelujú — sieť vidí vzťahy cez okraje mapy rovnako ako vo vnútri mriežky.
Dense vrstva
4 941 → 256, ReLU — vstup tvorí concat CNN výstupu (4 928) a 13 skalárov. Táto vrstva kombinuje priestorové príznaky z konvolúcií s globálnym kontextom hry.
Výstupné hlavy
Policy head 256 → 4, Softmax
P(N) · P(S) · P(E) · P(W)
Cross-entropy loss vs. počty návštev MCTS
Value head 256 → 1, Tanh
Hodnota pozície [−1, 1]
MSE loss vs. finálne umiestnenie

Výstupné hlavy — výber loss funkcií

Policy head predikuje distribúciu pravdepodobností nad 4 akciami: P(N) — sever, P(S) — juh, P(E) — východ, P(W) — západ. Trénovacím cieľom sú normalizované počty návštev z MCTS (tzv. soft targets) — sieť sa učí napodobniť rozhodnutia plánovacej fázy MCTS, nie len okamžitú akciu. Na tréning distribúcie je prirodzenou voľbou cross-entropy loss, ktorá priamo penalizuje každú odchýlku od cieľovej distribúcie a je štandardom pri klasifikačných úlohách.

Value head predikuje skalárnu hodnotu pozície v rozsahu [−1, 1], kde −1 zodpovedá najhoršiemu umiestneniu (prvý vypadnutý) a +1 víťazstvu. Keďže ide o regresnú úlohu s jednou výstupnou hodnotou, MSE loss je prirodzenou voľbou — penalizuje odchýlky na druhú mocninu, vďaka čomu sú veľké chyby trestané výrazne silnejšie ako malé, a funguje symetricky pre príliš optimistické aj príliš pesimistické odhady.

Monte Carlo Tree Search

Samotný forward pass siete je krátkozraký — na základe aktuálneho stavu hry vráti distribúciu akcií bez akéhokoľvek pohľadu do budúcnosti. Práve tu nastupuje MCTS: nad sieťou sa stavia implicitný prehľadávací strom, kde každý uzol reprezentuje stav hry a každá hrana jednu z možných akcií.

Prehľadávanie riadi PUCT formula, ktorá balancuje exploráciu nových vetiev (prioritizovanú na základe policy headu) a exploitáciu sľubných línií (na základe doterajších výsledkov simulácií). Na listových uzloch sa pozícia ohodnotí pomocou value headu — bez nutnosti dohrávať hru až do konca. Súperove ťahy vo vnútri stromu sú aproximované jednou politikou — počas tréningu a submission NN politikou, pri internej evaluácii rule-based agentom.

MCTS plní v projekte dvojitú rolu. Počas tréningu generuje kvalitnejšie tréningové dáta než čisto greedy policy — agent sa učí z plánovaných rozhodnutí, nie len z okamžitých reakcií siete. Pri inferencii poskytuje reálny lookahead, ktorý výrazne zvyšuje hraciu silu oproti samotnému forward passu. Práve preto bolo rozdelenie siete na dve hlavy nevyhnutné: policy head dáva MCTS informované priory pre výber vetiev stromu, value head hodnotí pozície na listoch — spolu vytvárajú základ pre efektívne plánovanie bez explicitného dohrávanie hier do konca. Počet simulácií sa líši podľa kontextu: 32 pri generovaní tréningových hier (rýchlosť), 64 pri internej evaluácii a 128 pri finálnom submission (maximálna hracia sila v rámci ~1 s na ťah).

Priebeh tréningu

Tréning prebiehal v niekoľkých postupne náročnejších fázach, pričom cieľom bolo vybudovať agenta schopného čeliť rôznorodým súperom — od jednoduchých pravidlových botov až po plnohodnotné MCTS agenty.

Fáza 1 — Základ na botoch

Prvé iterácie prebiehali výhradne proti jednoduchým rule-based botom (stupid_bot, clever_bot, smart_bot). Tento prístup bol zámerný: sieť musela najskôr zvládnuť základné prežitie, navigáciu a zbieranie jedla predtým, než dostala silnejších súperov. Výsledky raných iterácií to potvrdzujú — agent sa naučil hrať solídne práve v prostredí jednoduchých botov.

Fáza 2 — Postupné zvyšovanie obťažnosti

Postupne sa pridávali silnejší boti a neskôr NN agenty reprezentované staršími checkpointmi z predchádzajúcich tréningových iterácií. Dôležitou súčasťou bola rotácia hráčskych pozícií: každý agent hral zo všetkých 4 pozícií na mriežke, čím sa zabránilo naučeniu pozičných predsudkov. Podiel NN agentov sa postupne zvyšoval na úkor botov, no rule-based boti nikdy nevymizli úplne — ich prítomnosť bránila katastrofickému zabudaniu základných stratégií naučených v prvej fáze.

Fáza 3 — Self-play s MCTS

V záverečnej fáze tvorili väčšinu súperov MCTS agenty z novších iterácií, doplnené NN agentmi a malým podielom botov. Batch size bol nastavený na 50 000 tréningových vzoriek. Každá iterácia mala pevné poradie: najprv sa odohral celý blok self-play hier, nové vzorky sa zaradili do replay buffra a až potom prebehla tréningová fáza na aktualizovanom buffri. Sieť sa tak každú iteráciu učila na najčerstvejších dostupných skúsenostiach.

Takýto postup je efektívny z niekoľkých dôvodov. Curriculum learning — postupné zvyšovanie obťažnosti — zabezpečuje, že sieť nezačína v prostredí, kde dostáva výhradne negatívnu spätnú väzbu a nemá sa z čoho učiť. Diverzita súperov bráni preoptimalizovaniu na jeden typ správania a buduje robustnejšiu stratégiu. Self-play garantuje, že agent sa vždy cvičí proti protivníkovi na porovnateľnej úrovni, čo je oveľa efektívnejšie ako fixní boti.

Evaluácia

Interná evaluácia — porovnávanie nových checkpointov so staršími navzájom — tvorila 23 % celkového tréningového času. Finálna externá evaluácia (porovnanie proti Goose Loose v troch scenároch, každý po 100 hrách s rotáciou pozícií) trvala viac ako 100 hodín nepretržitého behu (viac ako 4 dni vkuse; jedno kompletné bežanie všetkých troch scenárov trvalo v priemere ~36 hodín). Spoľahlivá validácia v stochastickej multi-agentovej hre vyžaduje veľký počet hier, aby výsledky neboli skreslené štatistickým šumom. Tréning bol výpočtovo náročný, no časovo najnákladnejšou etapou projektu bola práve evaluácia.

Výsledky tréningu

Priebeh tréningu · 102 iterácií

Iterácia 1 — začiatok

Priemerné prežitie79 krokov
Dĺžka husi1,25 článkov

Iterácia 102 — koniec

Priemerné prežitie177 krokov
Dĺžka husi5,50 článkov
07
Fáza 2 · Benchmark

Externé hodnotenie vs. Goose Loose

Finálny agent bol porovnaný s verejným agentom Goose Loose v troch scenároch po 100 hrách s rotáciou pozícií.

Scenár Avg place (môj) Avg place (Goose) Win rate (môj) Win rate (Goose) Kaggle skóre (môj) Kaggle skóre (Goose)
direct duel + 2 boty1,6951,3700,3650,63012 423,812 488,4
balanced (2 my + 2 Goose)3,1681,8330,1530,84712 650,617 144,2
stress (1 my + 3 Goose)3,6002,1330,0130,98711 004,617 316,3
Win rate podľa scenára
Môj agent Goose Loose

Avg placement: nižšie = lepšie (1,0 = prvé miesto). Win rate zahŕňa zdieľané víťazstvá a je normalizovaný na počet hier, nie na počet kópií agenta.

Výsledky potvrdzujú, že Goose Loose konzistentne prevyšuje môjho agenta vo všetkých troch scenároch. Miera rozdielu rastie úmerne s podielom Goose Loose agentov v hre: v scenári direct duel obaja súperia primárne proti slabším rule-based botom, čo vedie k tesnejším umiestneniam (1,695 vs 1,370). V balanced scenári nahradia Goose Loose agenti oba boty a konkurenčný tlak sa zdvojnásobí — priemerné umiestnenie môjho agenta klesá na 3,168. V stress scenári stojí jeden môj agent proti trom kópiám Goose Loose; pre akéhokoľvek jednotlivého agenta čeliaceho trom silnejším súperom súčasne je umiestnenie blízko 4,0 štatisticky predvídateľný výsledok — môj agent dosiahol 3,60. Kaggle skóre (surová odmena kódujúca prežité kroky a dĺžku tela) potvrdzuje rovnaký trend: kým Goose Loose si drží stabilne vysoké hodnoty naprieč všetkými scenármi, skóre môjho agenta v stress scenári výrazne klesá, čo odráža skôr skrátené prežitie než zhoršenú kvalitu hry.

08
Fáza 2 · Demo

Ukážky hier – Hungry Geese

Záznamy hier finálneho agenta v rôznych herných scenároch, nahrané lokálne pomocou pygame vizualizátora.

Vývoj agenta — 4 iterácie naraz (Hry 1–4)

Štyri okná súčasne — rovnaký seed, rovnakí súperi (clever: 1 (zelený), smart: 2 (žltý), stupid bot: 3 (ružový)), rôzna iterácia. Ľavý horný: iter_0010  ·  Pravý horný: iter_0030  ·  Ľavý dolný: iter_0060  ·  Pravý dolný: iter_0100. Vidieť ako sa agent s každou iteráciou učí prežívať dlhšie a lepšie reagovať.

Finálny agent vs. Goose Loose (Hra 5)

Finálny MCTS agent (submission.py) v priamom súboji so silným verejným agentom Goose Loose. Toto je najbližší variant k reálnemu Kaggle hodnoteniu. stupid_bot: 0 (modrý)  ·  smart_bot: 1 (zelený)  ·  MCTS: 2 (žltý)  ·  Goose Loose: 3 (ružový).

MCTS vs. NN agenti (Hra 6)

Jeden MCTS agent (submission.py) proti trom lacným NN agentom bez stromového prehľadávania. Obe strany používajú tú istú neurónovú sieť — rozdiel je iba v tom, či sieť dostane čas na MCTS, alebo rozhoduje priamym forward passom. MCTS: 0 (modrý)  ·  NN priamy: 1 (zelený)  ·  NN priamy: 2 (žltý)  ·  NN priamy: 3 (ružový).

MCTS vs. MCTS (Hra 7)

Štyri kópie finálneho agenta hrajú navzájom — čistý self-play scenár. Všetci štyria používajú plný MCTS s 128 simuláciami. Hra ukazuje správanie agenta keď čelí rovnako silným protivníkom. MCTS: 0 (modrý)  ·  MCTS: 1 (zelený)  ·  MCTS: 2 (žltý)  ·  MCTS: 3 (ružový).

09
Zhrnutie

Záver

Finálny MCTS agent nedokázal prekonať Goose Loose — agenta, ktorý získal zlatú medailu v Kaggle súťaži Hungry Geese a bol vyvinutý tímom 5 skúsených špecialistov. Ak sa však pozriem na finančné, vedomostné a časové zdroje, ktoré som mal k dispozícii, výsledok je pozoruhodne blízko tomu, čo vytvorila odborná skupina s oveľa väčšou infraštruktúrou. Tento projekt ukazuje, ako ďaleko sa dá zájsť s dôslednou metodikou, aj keď pracujete sami a s obmedzenými prostriedkami. Napriek rozsahu projektu — 4 754 riadkov produkčného kódu v 24 súboroch, 5 406 riadkov testov v 18 testovacích súboroch, celkovo 13 400 riadkov — to nestačilo na prekonanie expertných riešení s väčšou výpočtovou kapacitou a rokmi skúseností.

0 Riadkov produkčného kódu (24 súborov)
0 Riadkov testov (18 testovacích súborov)
0 Riadkov kódu celkovo
0 Súborov v projekte

Najcennejším výsledkom nie je samotný výkon agenta, ale porozumenie celému procesu: návrh architektúry a voľba loss funkcií, curriculum learning a self-play dynamika, integrácia MCTS s neurónovou sieťou, metodológia evaluácie v stochastickej multi-agentovej hre — to sú zručnosti a skúsenosti prenositeľné ďaleko za hranice tejto konkrétnej súťaže. Projekt zároveň ukázal, aký zásadný je rozdiel medzi funkčným agentom a skutočne špičkovým súťažným riešením: nestačí dobrý nápad, vyžaduje to výpočtový výkon, veľké množstvo dát, precíznu simuláciu a dlhodobé ladenie každého detailu.

Ďalšie smerovanie

Projekt má prirodzené pokračovanie v oblasti hernej AI: ďalšia Kaggle súťaž, v ktorej by nazbierané skúsenosti — tréningová infraštruktúra, spôsob evaluácie, vývoj architektúry — tvorili solídny štartovací bod oproti začínaniu od nuly.

Zaujímavejším a dnes prakticky relevantnejším smerom je posun k dominantnej oblasti súčasného strojového učenia: veľkým jazykovým modelom (LLM). Open-source modely ako Llama alebo Qwen otvárajú možnosť vlastného fine-tuningu — prispôsobenia predtrénovaného modelu na konkrétnu úlohu alebo doménu. Vedomosti nazbierané v tomto projekte sú priamo prenositeľné: pochopenie tréningových dynamík, dôležitosť kvality a rozmanitosti dát, návrh a kombinácia loss funkcií, evaluačná disciplína a systematické opakovanie experimentov. Všetky tieto princípy platia rovnako pri tréningu herného agenta ako pri fine-tuningu jazykového modelu.

Bol by to prirodzený a logický krok: od zábavy a hernej časti neurónových sietí k dnes prakticky najvyužívanejšej a najpopulárnejšej oblasti AI — a so základmi, ktoré tento projekt poskytol, by bol taký posun oveľa menej strmý, než sa zdá na prvý pohľad.