Я заядлый шахматист и программист. Я бы сказал, что игра в шахматы и программирование - это две вещи, которые я трачу на себя больше всего времени. Естественно, я хочу создать свой собственный движок и, в конечном счете, бот Lichess.
В связи с сокрушительной эффективностью AlphaZero против Stockfish в прошлом году я подумывал о том, стоит ли мне создавать этот механизм с машинным обучением (какой-то тип нейронной сети, возможно, с использованием Tensorflow) или с традиционными эвристиками с жестким кодом.
Я менее знаком с нейронными сетями, чем другие виды жесткого кодирования. Тем не менее, это может быть хорошим способом научиться работать с нейронными сетями.
Еще одна вещь, которую я рассматриваю, - важно ли, какой язык я использую для кодирования движка. Я знаю, что многие шахматные движки используют C ++, который я никогда раньше не использовал. Я использовал другие языки на основе Си, которые делают много того же самого, с главным образом изменяющимся синтаксисом. Я наиболее знаком со Swift и Javascript, но также знаком с Python и чувствую, что он может помочь мне.
Итак, с точки зрения создания самого сильного шахматного движка, я должен пойти нейронной сети или жестко закодированы?
источник
Ответы:
Первый шаг: определите свои цели / причины
Я думаю, что это преобладающий фактор. Какой из них лучше всего подходит вам? (Выберите только один )
ИМО - это «бросить монетку» за все, кроме 2. Для всех остальных вы достигнете своей цели, выберете ли вы ML или жесткое кодирование. Однако вы, вероятно, хотите сравнение между вариантами, чтобы помочь вам принять решение.
Чехол для жесткого кодирования
Игра в шахматы (как человек) предполагает логическое мышление. Вы исследуете пространство возможных действий, которые вы и противник можете предпринять. Это породило область, называемую теорией игр, которая содержит теоретические основы для анализа игр в целом.
Если вам нравится работать с деталями и быть конкретным и рассуждать о вещах, то это может сработать для вас. Для сравнения, машинное обучение включает в себя гораздо больше алгоритмов «черного ящика», которые являются нечеткими и непрозрачными. Вы не знаете точно, что происходит.
Кроме того, я полагаю, вам будет легче "выяснить это самостоятельно", если вы пойдете по пути жесткого программирования, а не по машинному обучению. Меньше копирующего материала, который вы не до конца понимаете.
Кейс для машинного обучения
Может быть захватывающим родить создание и наблюдать, как оно берет свою собственную жизнь. В то время как жесткое программирование - это точность и детализация, машинное обучение является гибким. Уберите несколько нейронов, и результат, вероятно, будет похожим.
Жесткое программирование - это изучение шахмат. Машинное обучение - это изучение созданного вами существа.
И машинное обучение, конечно, очень горячая тема.
Выбор языка для жестко запрограммированных
Я не уверен, что вы подразумеваете под "другими языками на основе Си". C ++ - единственный основной язык, похожий на C. Преимущество C / C ++ в том, что они быстрые . Несмотря на то, что другие языки догнали за эти годы, C ++ по-прежнему дает им возможность заработать деньги.
С ++ не так просто. Вы получите отличную производительность от более современных скомпилированных языков, таких как Rust, Golang или Swift. Но это не должно быть намного хуже, если вы выбираете язык JIT. Т.е. не используйте интерпретатор CPython ; используйте IronPython или Jython, или Node, или C # или Java.
Программирование на GPU требует другого подхода, и я бы посоветовал против этого на данном этапе.
Выбор языка для машинного обучения
Проблема с TensorFlow в том, что он очень низкого уровня. Речь идет больше о написании алгоритмов сжатия чисел (которые можно перенести на параллельное оборудование), чем об интерфейсе, предназначенном для машинного обучения.
Конечно, это может быть отличным опытом обучения! И, безусловно, очень стоит учиться сегодня. Однако вы можете начать с Keras или PyTorch.
источник
Если вы пытаетесь создать самый мощный двигатель, обязательно используйте двигатели NN.
Традиционные двигатели хороши - Stockfish, возможно, по-прежнему является самым мощным двигателем на планете с согласованным аппаратным обеспечением, но их трудно написать. Эти двигатели не получили, где они были в одночасье; они заняли годы и годы работы. Например, вяленая рыба неуклонно набирает обороты в течение шести лет . Если вы начнете с нуля, вы быстро не достигнете силы Stockfish; на самом деле вы, вероятно, остановите несколько сотен эло от того места, где сейчас находится Stockfish. Для сравнения, на данный момент наиболее сильными движками с одним автором являются Ethereal , Laser и Xiphos (я пренебрегаю Houdini & Fire, поскольку они не имеют открытого исходного кода). Эти двигатели все значительно слабее, чем Stockfish.
Почему они намного слабее? Две причины:
На этом уровне разработка движка отнимает много вычислительных ресурсов. Что вы делаете, это просматриваете свой код и выявляете идею, которая может получить успех. Примером идеи является то, что «если мы знаем, что это движение, вероятно, хорошо, не ищите ветви, которые обращают вспять это движение» (если это не имеет смысла для вас, это означает, что также будет высокая кривая обучения). Затем вы пишете патч, который реализует идею, и тестируете модифицированный движок по сравнению с предыдущей версией. На этом уровне требуются десятки тысяч игр, чтобы получить достаточно большой размер выборки, чтобы определить, эффективен ли патч. Игра в эти игры требует огромных вычислительных ресурсов. Stockfish имеет доступ к супер-аппаратному обеспечению: на момент написания статьи испытательный полигон Stockfish Fishtestingработает с 1038 ядрами. Для сравнения типичный настольный компьютер может иметь 4-8 ядер.
Другая причина в том, что Stockfish поддерживается многими мозгами. На момент написания статьи было проверено 8 патчей от 5 человек. Если вы посмотрите историю патчей, вы найдете гораздо больше разработчиков, которые написали патчи. Я не знаю, сколько активных разработчиков Stockfish, но, конечно,> 20.
С другой стороны, двигатели NN (относительно) легко достигают силы, значительно превышающей Ethereal / Laser / Xiphos. Убедитесь сами в последнем турнире Top Chess Engine Championship . Ethereal / Laser / Xiphos находятся в Лиге 1, что достаточно правдоподобно, но двигатели в высшем дивизионе (Дивизион P):
Последние три движка - AllieStein, Stoofvlees и ScorpioNN - это небольшие совместные проекты людей, которые, насколько я знаю, такие же энтузиасты, как вы, а не разработчики, работающие полный рабочий день. Они набрали силу Div P менее чем за два года попыток (все эти двигатели NN появились только после AlphaZero). Для сравнения, в недавней истории компьютерных шахмат был только один человек, который когда-либо писал традиционный движок, который самостоятельно успешно конкурировал с Stockfish & Komodo (Роберт Гударт, автор Houdini).
Это правда, что у вас, вероятно, не будет аппаратного обеспечения, чтобы конкурировать с Lc0, но Lc0 потребляет столько вычислительных мощностей, потому что это «нулевой» движок - он должен играть в шахматы без каких-либо человеческих знаний, кроме правил. Вам не нужно использовать ту же методологию. Вы можете использовать, например, методологию Штейна, которая использует контролируемое обучение. Возможно, это даже лучше, чем "ноль" - ведь в суперфинале играет AllieStein, а не Lc0.
В итоге: если ваша цель - конкурировать с лучшими двигателями в мире, у вас гораздо больше шансов добиться успеха с двигателями NN, чем с традиционными.
источник
Не выбирайте NN, если у вас нет доступа к нелепым (несколько сотен Nvidia V100). Обучение NN играть в шахматы требует очень много оборудования. Посмотрите, как люди, участвующие в Lc0, обучают более 200 миллионов игр. Поскольку у вас, вероятно, будут проблемы с доступом к оборудованию (вы можете попробовать получить его в Google Colabatory , но только с этим обучение будет очень медленным).
Редактировать: Использование NN. При контролируемом обучении вы МОЖЕТЕ обойтись только с Google Colab и, возможно, одним сильным GPU (2080, 2080Ti, Radeon VII).
Python и Javascript, вероятно, слишком медленные для сильного шахматного движка. Я не использовал Swift, но он, вероятно, не понравится платформам, отличным от macOS, поэтому, вероятно, лучше использовать C или C ++. Вы также можете использовать Rust, но он имеет много функций безопасности, которые раздражают, и вам не нужно, что может раздражать. Также будет сложнее получить из этого хорошую производительность, поскольку некоторые низкоуровневые оптимизации сложно выполнить. Конечно, вы всегда можете написать это в сборке, но это, вероятно, будет слишком много работы. см. https://www.chessprogramming.org/Languages/
источник
Я построил чисто игрушечный шахматный движок, используя: шахматы на питоне, было очень приятно не самому кодировать правила игры и просто сосредоточиться на логике; однако число позиций, которые я смог оценить в секунду, очень мало. Это может быть хорошей отправной точкой.
источник