Tworzenie silnika szachowego, uczenie maszynowe vs. tradycyjny silnik?


17

Jestem zapalonym szachistą i programistą komputerowym. Powiedziałbym, że gra w szachy i programowanie to dwie rzeczy, na które spędzam najwięcej czasu. Oczywiście chcę stworzyć własny silnik, a ostatecznie bota Lichess.

W związku z miażdżącą wydajnością AlphaZero w stosunku do Sztokfiszy w ubiegłym roku, zastanawiam się, czy powinienem stworzyć ten silnik z uczeniem maszynowym (pewnego rodzaju sieć neuronowa, być może z wykorzystaniem Tensorflow), czy tradycyjną heurystyką z twardym kodowaniem.

Jestem mniej zaznajomiony z sieciami neuronowymi niż inne rodzaje kodowania na stałe. Mimo to może to być dla mnie dobry sposób na naukę pracy z sieciami neuronowymi.

Inną rzeczą, którą rozważam, jest to, czy ważne jest, jakiego języka używam do kodowania silnika. Wiem, że wiele silników szachowych używa C ++, z których nigdy wcześniej nie korzystałem. Użyłem innych języków opartych na języku C, które wykonują wiele takich samych rzeczy, z różną składnią. Najbardziej znam Swift i Javascript, ale znam też Pythona i czuję, że może to dla mnie załatwić sprawę.

Więc jeśli chodzi o stworzenie najsilniejszego możliwego silnika szachowego, czy powinienem przejść do sieci neuronowej, czy na stałe?


4
Kluczem do nowych silników AI jest nie tyle NN, co uczenie się przez wzmocnienie. RL jest złożonym tematem, ale istnieją dobre zasoby wprowadzające online, takie jak wykłady RL Davida Silvera na UCL (slajdy na jego stronie internetowej i wykłady na YouTube. Pracował z Deepmind i tradycyjnie omawiał alphago w ostatnim wykładzie. Prawdopodobnie mógłbyś opracować ciekawą sztuczną inteligencję silnik bez NN z wykorzystaniem heurystyk zakodowanych na sztywno i RL. Tak zaczął się Alphago!
asac

To nie są szachy, ale ostatnia książka „Deep Learning and the Game Go” pokazuje, jak używać NN do silnika gry. Alpha-Go i Alpha-Zero są podobne pod maską.
John Coleman

Biorąc pod uwagę twoje doświadczenie w Pythonie, warto spojrzeć na Nima
Darrena H

Jeśli chcesz spróbować w NN, jest to interesujące: arxiv.org/abs/1509.01549 Istnieje również kod na github :)
Ant

@Należy pamiętać, że Giraffe nigdy nie była bardzo silna w porównaniu do najlepszych silników. (~ 2800 elo)
Oscar Smith

Odpowiedzi:


8

Pierwszy krok: Określ swoje cele / powody

Myślę, że jest to czynnik dominujący. Który z tych najlepiej ci pasuje? (Wybierz tylko jeden )

  1. Chcesz cieszyć się zabawnym, trudnym zadaniem kodowania
  2. Chcesz stworzyć wyjątkowo dobry silnik szachowy
  3. Chcesz dowiedzieć się, jak działają silniki szachowe
  4. Chcesz się uczyć / ćwiczyć umiejętności kodowania
  5. Chcesz się uczyć / wdrażać koncepcje / teorię informatyki (np. Uczenie maszynowe)
  6. (Inny)

IMO jest w stanie „rzucić monetą” za wszystko oprócz 2. Dla wszystkich pozostałych osiągniesz swój cel, niezależnie od tego, czy wybierzesz ML, czy kodowanie. Prawdopodobnie chcesz jednak porównać wybrane opcje, aby pomóc Ci podjąć decyzję.

Sprawa do zakodowania na stałe

Gra w szachy (jako człowiek) wymaga logicznego myślenia. Badasz przestrzeń możliwych działań, które możesz podjąć Ty i przeciwnik. Spowodowało to powstanie pola zwanego teorią gier, która zawiera teoretyczne ramy do ogólnej analizy gier.

Jeśli lubisz pracować ze szczegółami, być konkretnym i zastanawiać się nad rzeczami, może to działać dobrze dla Ciebie. Dla porównania, uczenie maszynowe obejmuje znacznie więcej algorytmów „czarnej skrzynki”, które są rozmyte i nieprzejrzyste. Nie wiesz dokładnie, co się dzieje.

Sądzę też, że łatwiej ci będzie „samemu to rozgryźć”, jeśli wybierzesz twardą ścieżkę niż uczenie maszynowe. Mniej wklejania kopii, których nie do końca rozumiesz.

Sprawa uczenia maszynowego

Urodzenie stworzenia i obserwowanie, jak zaczyna żyć własnym życiem, może być ekscytujące. Podczas gdy kodowanie polega na precyzji i szczegółowości, uczenie maszynowe jest elastyczne. Zabierz trochę neuronów, a wynik prawdopodobnie będzie podobny.

Kodowanie polega na studiowaniu szachów. Uczenie maszynowe polega na badaniu stworzonego stworzenia.

A uczenie maszynowe to oczywiście bardzo gorący temat.

Wybór języka dla zakodowanych na stałe

Nie jestem pewien, co rozumiesz przez „inne języki oparte na języku C”. C ++ to jedyny główny język, który jest podobny do C. Zaletą C / C ++ jest to, że są szybkie . Mimo że inne języki nadrabiały zaległości na przestrzeni lat, C ++ wciąż daje im szansę na swoje pieniądze.

C ++ nie jest łatwe. Osiągniesz doskonałą wydajność dzięki bardziej nowoczesnym językom kompilowanym, takim jak Rust, Golang lub Swift. Ale nie powinno być o wiele gorzej, jeśli wybierzesz język JIT. Czyli nie używać tłumacza CPython ; użyj IronPython lub Jython lub Node, C # lub Java.

Programowanie GPU wymaga innego podejścia i odradzałbym to w tym momencie.

Wybór języka do uczenia maszynowego

Problem z TensorFlow polega na tym, że jest on bardzo niski. Chodzi bardziej o pisanie algorytmów do łamania liczb (które można wyposażyć w sprzęt równoległy) niż o interfejs przeznaczony do uczenia maszynowego.

Oczywiście może to być wspaniałe doświadczenie edukacyjne! Z pewnością warto dzisiaj się uczyć. Możesz jednak zacząć od Keras lub PyTorch.


1
To fenomenalna odpowiedź, naprawdę uderza we wszystkie punkty, o których wspomniałem. Trudno powiedzieć, dlaczego dokładnie chcę stworzyć silnik. Realistycznie rzecz biorąc, prawdopodobnie nie będę konkurował ze Sztokfiszem, Komodo i Leelą (w końcu jestem tylko studentem). Mimo to fajnie byłoby zobaczyć, jak moja praca opiera się na innych silnikach i nie jest miażdżona za każdym razem. Nawet jeśli moim głównym założeniem jest stworzenie silnego silnika, prawdopodobnie nauczę się nowego języka programowania i poprawię swoją wiedzę szachową jako produkt uboczny tworzenia silnika.
David Chopin

1
Myślę, że przede wszystkim chcę czegoś, co mogę zrobić, pielęgnować i dostroić w dłuższej perspektywie. Chcę również projektu, który obiektywnie powie mi, jak dobry jest mój kod (wygrane / losowania / przegrane, ELO itp.).
David Chopin

1
To bardzo interesująca odpowiedź, ale czy poważnie polecasz Node zamiast Cpython ze względu na problemy z wydajnością ?
Evpok

> „C ++ to jedyny język głównego nurtu podobny do C.” DO#? Rdza? Jawa? Istnieje wiele języków, które są co najmniej „podobne do C”
Maaark

Wziąłem „jak C” jako skompilowany, wysoce zoptymalizowany, zaimplementowany na maszynie język ze składnią w stylu C. Wszystkie języki C #, Java i PHP używają maszyn wirtualnych, z kodem skompilowanym do opcodów, a nie dla kodu bajtowego specyficznego dla procesora (a kompilacja PHP jest całkowicie przejrzysta, podobnie jak Python i Bash). A Rust nie jest głównym nurtem. Pod tym względem tylko C ++ jest „podobny do C”, pomimo dzielenia stylów składni z kilkoma innymi głównymi językami.
Ghedipunk

24

Jeśli próbujesz stworzyć najsilniejszy możliwy silnik, koniecznie wybierz silniki NN.

Tradycyjne silniki są świetne - Sztokfisz jest prawdopodobnie najsilniejszym silnikiem na świecie pod względem konsensusu równego sprzętu - ale trudno je napisać. Silniki te nie dotarły tam, gdzie były z dnia na dzień; zajęli lata pracy. Na przykład sztokfisz zyskuje na popularności od sześciu lat . Jeśli zaczniesz od zera, szybko nie zbliżysz się do wytrzymałości Sztokfisza; w rzeczywistości prawdopodobnie zatrzymasz kilkaset elo z miejsca, w którym obecnie jest Sztokfisz. Dla porównania jednymi z najsilniejszych obecnie silników jednego autora są Ethereal , Laser i Xiphos (zaniedbuję Houdini i Fire, ponieważ nie są open source). Wszystkie te silniki są znacznie słabsze niż Sztokfisz.

Dlaczego są tak słabsi? Dwa powody:

  1. Na tym poziomie opracowanie silnika wymaga dużej mocy obliczeniowej. To, co robisz, to przeglądanie kodu i identyfikowanie pomysłu, który mógłby zyskać elo. Przykładowym pomysłem jest: „jeśli wiemy, że ten ruch jest prawdopodobnie dobry, nie szukaj gałęzi, które odwracają ten ruch” (jeśli nie ma to dla ciebie sensu, oznacza to, że będzie też wysoka krzywa uczenia się). Następnie piszesz łatkę implementującą ten pomysł i testujesz zmodyfikowany silnik w stosunku do poprzedniej wersji. Na tym poziomie potrzeba dziesiątek tysięcy gier, aby uzyskać wystarczająco duży rozmiar próbki, aby stwierdzić, czy łatka jest skuteczna. Granie w te gry wymaga ogromnej mocy obliczeniowej. Sztokfisz ma dostęp do super sprzętu: w chwili pisania tego artykułu testuje się testowanie ryb Sztokfiszdziała z 1038 rdzeniami. Dla porównania typowy komputer stacjonarny może mieć 4-8 rdzeni.

  2. Innym powodem jest to, że Sztokfisz jest wspierany przez wiele mózgów. W chwili pisania tego tekstu testowanych jest 5 łatek napisanych przez 5 osób. Jeśli przejrzysz historię łat, znajdziesz o wiele więcej programistów, którzy napisali łatki. Nie wiem, ilu jest aktywnych programistów Sztokfiszów, ale na pewno jest to> 20.

Z drugiej strony silniki NN (stosunkowo) łatwo osiągają siłę znacznie przewyższającą Ethereal / Laser / Xiphos. Przekonaj się w najnowszym turnieju Top Chess Engine Championship . Ethereal / Laser / Xiphos są w League 1, co jest dość wiarygodne, ale silniki w najwyższej lidze (Division P) to:

  • Sztokfisz (tradycyjny silnik wspierany przez społeczność, działa z testowaniem ryb)
  • Komodo (komercyjny tradycyjny silnik, ma pełnoetatowych programistów)
  • Komodo MCTS (komercyjny półtradycyjny silnik, ma pełnoetatowych programistów)
  • Houdini (tradycyjny silnik komercyjny, to jednoosobowy wysiłek, nie był aktualizowany od dwóch lat)
  • Leela Chess Zero (wspierany przez społeczność silnik NN, działa z analogiem Fishtestingu, czyli mnóstwem sprzętu)
  • AllieStein (2-osobowy silnik NN)
  • Stoofvlees (silnik NN)
  • ScorpioNN (silnik NN)

Ostatnie trzy silniki - AllieStein, Stoofvlees i ScorpioNN - wszystkie są niewielką współpracą osób, które, o ile mi wiadomo, są entuzjastami takimi jak Ty, a nie pełnoetatowymi programistami. Osiągnęli siłę Div P po niespełna dwóch latach prób (wszystkie te silniki NN pojawiły się dopiero po AlphaZero). Dla porównania, w najnowszej historii szachów komputerowych była tylko jedna osoba, która kiedykolwiek napisała tradycyjny silnik, który z powodzeniem konkurował ze Sztokfiszem i Komodo (Robert Houdart, autor Houdini).

To prawda, że ​​prawdopodobnie nie będziesz mieć sprzętu do konkurowania z Lc0, ale Lc0 pobiera tak dużą moc obliczeniową, ponieważ jest to silnik „zerowy” - ma grać w szachy bez jakiejkolwiek ludzkiej wiedzy, z wyjątkiem reguł. Nie musisz używać tej samej metodologii. Możesz użyć np. Metodologii Stein, która wykorzystuje nadzorowane uczenie się. Jest to prawdopodobnie nawet lepsze niż „zero” - w końcu to AllieStein gra w superfinale, a nie Lc0.

Rezultat jest następujący: jeśli Twoim celem jest konkurowanie z najlepszymi silnikami na świecie, znacznie częściej odniesiesz sukces z silnikami NN niż z silnikami tradycyjnymi.


6
Może wspomnę o drugiej stronie twojego wniosku: jeśli twoim celem jest pogłębienie zrozumienia szachów podczas programowania, wybierz tradycyjny.
blues

1
Zgadzam się z twoją konkluzją, ale zalecałbym również wykorzystanie najnowszej sieci z silnego silnika (za zgodą oczywiście) jako punktu wyjścia, zamiast zaczynać od zera (ale kontynuować w sposób inny niż „trenuj poprzez samodzielną grę i aktualizację” wagi ”, dodając lub usuwając warstwy, dodając funkcje wejściowe, wymagając dodatkowych wyników itp.). Nie pamiętam, czy Lc0 jest pojedynczą, czy podwójną głowicą, ale uważam, że 3 głowy ( ijcai.org/proceedings/2018/0523.pdf ) nie są obecnie wdrażane przez żaden silnik szachowy i mogą ostatecznie poprawić stan -Sztuka.
Steven Jackson

Myślę, że wyszukiwanie Allie czyni ją silniejszą przeciwko słabszym silnikom (KMCST, Stoofvlees), a nie sieci Stein.
ja „

@blues Myślę, że programowanie silnika szachowego tak naprawdę nie czyni z niego lepszego szachisty - z wyjątkiem Larry'ego Kaufmana (jednego z twórców Komodo), żaden z najlepszych silników nie wyróżniał się tytułami graczy jako deweloperzy, a ich twórcy nie stali się utytułowani gracze.
Allure

@me 'jest to możliwe, ale Leelenstein jest siecią Stein używającą pliku binarnego Lc0, i jest dobrze zrobione na komputerowych mistrzostwach szachowych chess.com, więc sieci Stein są co najmniej porównywalne z sieciami Lc0.
Allure

9

Więc jeśli chodzi o stworzenie najsilniejszego możliwego silnika szachowego, czy powinienem przejść do sieci neuronowej, czy na stałe?

Nie wybieraj NN, chyba że masz dostęp do śmiesznych (Kilkaset Nvidii V100). Szkolenie NN do gry w szachy wymaga tak dużego sprzętu. Zobacz, jak ludzie biorący udział w Lc0 trenują ponad 200 milionów gier. Ponieważ prawdopodobnie będziesz miał problemy z dostępem do sprzętu (możesz spróbować zdobyć go w Google Colabatory , ale tylko z tym, trening będzie bardzo wolny).

Edycja: Korzystanie z NN Dzięki nadzorowanemu uczeniu się MOŻESZ uciec od samego Google Colab i być może jednego silnego GPU (2080, 2080 Ti, Radeon VII).

Inną rzeczą, którą rozważam, jest to, czy ważne jest, jakiego języka używam do kodowania silnika. Wiem, że wiele silników szachowych używa C ++, z których nigdy wcześniej nie korzystałem. Użyłem innych języków opartych na języku C, które wykonują wiele takich samych rzeczy, z różną składnią. Najbardziej znam Swift i Javascript, ale znam też Pythona i czuję, że może to dla mnie załatwić sprawę.

Python i JavaScript są prawdopodobnie zbyt wolne, aby stworzyć silny silnik szachowy. Nie korzystałem z Swift, ale prawdopodobnie nie polubi platform innych niż macOS, więc prawdopodobnie lepiej jest używać C lub C ++. Możesz również użyć Rust, ale ma wiele funkcji bezpieczeństwa, które denerwują i tak naprawdę nie potrzebujesz, co może być denerwujące. Trudniej będzie również uzyskać z tego dobrą wydajność, ponieważ trudne są pewne optymalizacje na niskim poziomie. Oczywiście zawsze możesz napisać to w asemblerze, ale to prawdopodobnie będzie zbyt dużo pracy. patrz https://www.chessprogramming.org/Languages/


1
Świetnie, dziękuję za informacje! Prawdopodobnie spróbuję utworzyć interfejs API, który przyjmuje pozycję FEN i generuje obliczony ruch. Myślę, że to najlepszy sposób na integrację z botami Lichess.
David Chopin


1
Czy jest to opcja zaimplementowania innego silnika NN, który korzysta tylko z sieci LC0?
RemcoGerlich,

1
@RemcoGerlich, jak rozumiem, silniki NN używają dwóch rzeczy: binarnej i sieci neuronowej. Pisanie pliku binarnego nie jest łatwe, ale szkolenie sieci neuronowej jest stosunkowo łatwe. W tym sensie już istnieją pochodne Lc0 - Leelenstein i Deus X (alias Fat Fritz) są takimi pochodnymi.
Allure

@RemcoGerlich w tym przypadku nie byłby to naprawdę inny silnik, byłby to silnik Ic0 z innym opakowaniem / interfejsem / czymkolwiek.
Peteris

3

Zbudowałem silnik gry w szachy wyłącznie z wykorzystaniem: szachów pythonowych . Naprawdę miło było nie kodować reguł gry i skupić się na logice; jednak liczba pozycji, które udało mi się ocenić na sekundę, jest bardzo niska. To może być dobry punkt wyjścia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.