Přehled
Nejsem zrovna velký šachista, ale když jsem viděl úspěch enginů jako je Stockfish, chtěl jsem zkusit, jestli dokážu postavit něco, co by hrálo šachy líp než já. Očividně se mi to povedlo, protože mě poráží na plné čáře.
Výsledky
Při hře proti enginům se známým Elo dosahuje můj engine úrovně 1600 Elo (při tempu 20+0.1s). Jasně, není to žádný prvotřídní engine, ale vzhledem k tomu, že fakt nejsem šachista, jsem s výsledkem nadmíru spokojený.
Hledání nejlepšího tahu zvládne na mém MacBooku Pro M1 prohledat necelé 3 miliony pozic za sekundu. To číslo se možná nezdá nijak úžasné, ale když vezmeme v úvahu, že to zahrnuje i průchod neuronovou sítí, tak to vůbec není špatný výsledek.
Detaily projektu
Engine v sobě kombinuje neuronovou síť a algoritmus Monte Carlo Tree Search (MCTS). Prohledávání stromu vyhodnocuje možné tahy, ale protože je jich zkrátka moc, dostane se v rozumném čase jen do určité hloubky. A přesně tady přichází na řadu neuronová síť. Když prohledávání narazí na list stronu (tzn. "prohledali jsme dostatečně hluboko"), neuronová síť danou pozici vyhodnotí a přidělí jí skóre podle toho, jak je pro daného hráče výhodná.
Neuronová síť využívá architekturu NNUE. Jde o poměrně malou síť, která dokáže velmi rychle vyhodnocovat vstupy, které se od sebe liší jen minimálně. Síť je natrénovaná na datasetu z Lichess, který obsahuje miliony pozic a jejich ohodnocení. Učila se tak předpovídat skóre pozice čistě na základě rozestavení figurek a toho, kdo je zrovna na tahu.
Aby bylo prohledávání stromu efektivnější, implementoval jsem různé optimalizace jako třeba transposition tables, move ordering a alfa-beta prořezávání.
Pro zrychlení chodu neuronové sítě jsem využil kvantizaci. Ta snižuje přesnost vah a aktivací, což umožňuje mnohem rychlejší výpočty bez nějaké zásadní ztráty na přesnosti. Samotná inference pak běžela v C++ pomocí vlastnoručně napsaného kódu pro načítání kvantizovaných vah a výpočet dopředného průchodu (forward pass).
Použité technologie
- C++
- Python
- PyTorch
- NumPy