Š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
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.
Č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.
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.
Kaggle Hungry Geese
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.
- 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.
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.
Interaktívna schéma siete. Prejdite kurzorom (na mobile ťuknite) na ľubovoľnú vrstvu — zobrazí sa jej popis, rozmery a počet parametrov.
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)
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.
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.
P(N) · P(S) · P(E) · P(W)
Cross-entropy loss vs. počty návštev MCTS
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
Iterácia 1 — začiatok
Iterácia 102 — koniec
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 boty | 1,695 | 1,370 | 0,365 | 0,630 | 12 423,8 | 12 488,4 |
| balanced (2 my + 2 Goose) | 3,168 | 1,833 | 0,153 | 0,847 | 12 650,6 | 17 144,2 |
| stress (1 my + 3 Goose) | 3,600 | 2,133 | 0,013 | 0,987 | 11 004,6 | 17 316,3 |
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.
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ý).
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í.
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.