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?
źródło
Odpowiedzi:
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 )
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.
źródło
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:
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.
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:
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.
źródło
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).
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/
źródło
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.
źródło