Создание шахматного двигателя, машинного обучения или традиционного двигателя?

17

Я заядлый шахматист и программист. Я бы сказал, что игра в шахматы и программирование - это две вещи, которые я трачу на себя больше всего времени. Естественно, я хочу создать свой собственный движок и, в конечном счете, бот Lichess.

В связи с сокрушительной эффективностью AlphaZero против Stockfish в прошлом году я подумывал о том, стоит ли мне создавать этот механизм с машинным обучением (какой-то тип нейронной сети, возможно, с использованием Tensorflow) или с традиционными эвристиками с жестким кодом.

Я менее знаком с нейронными сетями, чем другие виды жесткого кодирования. Тем не менее, это может быть хорошим способом научиться работать с нейронными сетями.

Еще одна вещь, которую я рассматриваю, - важно ли, какой язык я использую для кодирования движка. Я знаю, что многие шахматные движки используют C ++, который я никогда раньше не использовал. Я использовал другие языки на основе Си, которые делают много того же самого, с главным образом изменяющимся синтаксисом. Я наиболее знаком со Swift и Javascript, но также знаком с Python и чувствую, что он может помочь мне.

Итак, с точки зрения создания самого сильного шахматного движка, я должен пойти нейронной сети или жестко закодированы?

Дэвид Шопен
источник
4
Они являются ключом к новым движкам ИИ - не столько NN, сколько обучение с подкреплением. RL - сложная тема, но в Интернете есть хорошие вводные ресурсы, такие как лекции Дэвида Сильвера RL в UCL (слайды на его веб-сайте и лекции на YouTube. Он работал с Deepmind и традиционно освещал альфа в последней лекции. Возможно, вы могли бы разработать интересный AI двигатель без NN, использующий жестко закодированную эвристику и RL. Вот так и начался alphago!
asac - Восстановите Monica
Это не шахматы, но недавняя книга «Глубокое обучение и игровой процесс» показывает, как использовать NN для игрового движка. Альфа-Го и Альфа-Ноль похожи под капотом.
Джон Коулман
Учитывая ваш опыт работы с Python, возможно, стоит взглянуть на Нима
Даррен Х
Если вы хотите попробовать NN, это интересно: arxiv.org/abs/1509.01549 На github также есть код :)
Ant
@ Не забывайте, что жираф никогда не был очень сильным по сравнению с топовыми двигателями. (~ 2800 эло)
Оскар Смит,

Ответы:

8

Первый шаг: определите свои цели / причины

Я думаю, что это преобладающий фактор. Какой из них лучше всего подходит вам? (Выберите только один )

  1. Вы хотите получить удовольствие от увлекательной задачи по программированию
  2. Вы хотите создать очень хороший шахматный движок
  3. Вы хотите узнать о том, как работают шахматные движки
  4. Вы хотите изучать / практиковать навыки кодирования
  5. Вы хотите изучить / реализовать концепции / теорию информатики (например, машинное обучение)
  6. (Другой)

ИМО - это «бросить монетку» за все, кроме 2. Для всех остальных вы достигнете своей цели, выберете ли вы ML или жесткое кодирование. Однако вы, вероятно, хотите сравнение между вариантами, чтобы помочь вам принять решение.

Чехол для жесткого кодирования

Игра в шахматы (как человек) предполагает логическое мышление. Вы исследуете пространство возможных действий, которые вы и противник можете предпринять. Это породило область, называемую теорией игр, которая содержит теоретические основы для анализа игр в целом.

Если вам нравится работать с деталями и быть конкретным и рассуждать о вещах, то это может сработать для вас. Для сравнения, машинное обучение включает в себя гораздо больше алгоритмов «черного ящика», которые являются нечеткими и непрозрачными. Вы не знаете точно, что происходит.

Кроме того, я полагаю, вам будет легче "выяснить это самостоятельно", если вы пойдете по пути жесткого программирования, а не по машинному обучению. Меньше копирующего материала, который вы не до конца понимаете.

Кейс для машинного обучения

Может быть захватывающим родить создание и наблюдать, как оно берет свою собственную жизнь. В то время как жесткое программирование - это точность и детализация, машинное обучение является гибким. Уберите несколько нейронов, и результат, вероятно, будет похожим.

Жесткое программирование - это изучение шахмат. Машинное обучение - это изучение созданного вами существа.

И машинное обучение, конечно, очень горячая тема.

Выбор языка для жестко запрограммированных

Я не уверен, что вы подразумеваете под "другими языками на основе Си". C ++ - единственный основной язык, похожий на C. Преимущество C / C ++ в том, что они быстрые . Несмотря на то, что другие языки догнали за эти годы, C ++ по-прежнему дает им возможность заработать деньги.

С ++ не так просто. Вы получите отличную производительность от более современных скомпилированных языков, таких как Rust, Golang или Swift. Но это не должно быть намного хуже, если вы выбираете язык JIT. Т.е. не используйте интерпретатор CPython ; используйте IronPython или Jython, или Node, или C # или Java.

Программирование на GPU требует другого подхода, и я бы посоветовал против этого на данном этапе.

Выбор языка для машинного обучения

Проблема с TensorFlow в том, что он очень низкого уровня. Речь идет больше о написании алгоритмов сжатия чисел (которые можно перенести на параллельное оборудование), чем об интерфейсе, предназначенном для машинного обучения.

Конечно, это может быть отличным опытом обучения! И, безусловно, очень стоит учиться сегодня. Однако вы можете начать с Keras или PyTorch.

Artelius
источник
1
Это феноменальный ответ, действительно поражающий все пункты, которые я упомянул. Трудно сказать, почему именно я хочу сделать двигатель. Реально, я, вероятно, не буду конкурировать с такими как Stockfish, Komodo и Leela (я всего лишь студент колледжа). Тем не менее, было бы забавно видеть, как моя работа противостоит другим двигателям, а не ломается каждый раз. Даже если моя основная цель - создать сильный двигатель, я, вероятно, выучу новый язык программирования и улучшу свои шахматные знания как побочный продукт создания двигателя.
Дэвид Шопен
1
Я думаю, больше всего на свете я хочу что-то, что я могу сделать, воспитать и подстроить в долгосрочной перспективе. Я также хочу проект, который объективно скажет мне, насколько хорош мой код (Wins / Draws / Losses, ELO и т. Д.).
Дэвид Шопен
1
Это очень интересный ответ, но серьезно ли вы рекомендуете Node over Cpython для повышения производительности ?
Евпок
> «C ++ - единственный основной язык, похожий на C.» C #? Ржавчина? Джава? Есть много языков, которые по крайней мере "что-то вроде C"
Maaark
Я взял «как C» как скомпилированный, высоко оптимизированный, реализованный на машине язык с синтаксисом в стиле C. C #, Java и PHP используют виртуальные машины, причем их код компилируется в коды операций, а не в специфичный для процессора байт-код (а компиляция PHP полностью прозрачна, как Python и Bash). И Руст не мейнстрим. В этом отношении только C ++ «похож на C», несмотря на то, что разделяет стили синтаксиса с несколькими другими основными языками.
Ghedipunk
24

Если вы пытаетесь создать самый мощный двигатель, обязательно используйте двигатели NN.

Традиционные двигатели хороши - Stockfish, возможно, по-прежнему является самым мощным двигателем на планете с согласованным аппаратным обеспечением, но их трудно написать. Эти двигатели не получили, где они были в одночасье; они заняли годы и годы работы. Например, вяленая рыба неуклонно набирает обороты в течение шести лет . Если вы начнете с нуля, вы быстро не достигнете силы Stockfish; на самом деле вы, вероятно, остановите несколько сотен эло от того места, где сейчас находится Stockfish. Для сравнения, на данный момент наиболее сильными движками с одним автором являются Ethereal , Laser и Xiphos (я пренебрегаю Houdini & Fire, поскольку они не имеют открытого исходного кода). Эти двигатели все значительно слабее, чем Stockfish.

Почему они намного слабее? Две причины:

  1. На этом уровне разработка движка отнимает много вычислительных ресурсов. Что вы делаете, это просматриваете свой код и выявляете идею, которая может получить успех. Примером идеи является то, что «если мы знаем, что это движение, вероятно, хорошо, не ищите ветви, которые обращают вспять это движение» (если это не имеет смысла для вас, это означает, что также будет высокая кривая обучения). Затем вы пишете патч, который реализует идею, и тестируете модифицированный движок по сравнению с предыдущей версией. На этом уровне требуются десятки тысяч игр, чтобы получить достаточно большой размер выборки, чтобы определить, эффективен ли патч. Игра в эти игры требует огромных вычислительных ресурсов. Stockfish имеет доступ к супер-аппаратному обеспечению: на момент написания статьи испытательный полигон Stockfish Fishtestingработает с 1038 ядрами. Для сравнения типичный настольный компьютер может иметь 4-8 ядер.

  2. Другая причина в том, что Stockfish поддерживается многими мозгами. На момент написания статьи было проверено 8 патчей от 5 человек. Если вы посмотрите историю патчей, вы найдете гораздо больше разработчиков, которые написали патчи. Я не знаю, сколько активных разработчиков Stockfish, но, конечно,> 20.

С другой стороны, двигатели NN (относительно) легко достигают силы, значительно превышающей Ethereal / Laser / Xiphos. Убедитесь сами в последнем турнире Top Chess Engine Championship . Ethereal / Laser / Xiphos находятся в Лиге 1, что достаточно правдоподобно, но двигатели в высшем дивизионе (Дивизион P):

  • Stockfish (традиционный движок, поддерживаемый сообществом, работает с Fishtesting)
  • Komodo (коммерческий традиционный движок, есть штатные разработчики)
  • Komodo MCTS (коммерческий полу-традиционный движок, имеет штатных разработчиков)
  • Houdini (коммерческий традиционный движок, работа одного человека, не обновлялась в течение двух лет)
  • Leela Chess Zero (поддерживаемый сообществом NN-движок, работает с аналогом Fishtesting или тонны аппаратного обеспечения)
  • AllieStein (2-х человек NN двигатель)
  • Stoofvlees (двигатель NN)
  • ScorpioNN (двигатель NN)

Последние три движка - AllieStein, Stoofvlees и ScorpioNN - это небольшие совместные проекты людей, которые, насколько я знаю, такие же энтузиасты, как вы, а не разработчики, работающие полный рабочий день. Они набрали силу Div P менее чем за два года попыток (все эти двигатели NN появились только после AlphaZero). Для сравнения, в недавней истории компьютерных шахмат был только один человек, который когда-либо писал традиционный движок, который самостоятельно успешно конкурировал с Stockfish & Komodo (Роберт Гударт, автор Houdini).

Это правда, что у вас, вероятно, не будет аппаратного обеспечения, чтобы конкурировать с Lc0, но Lc0 потребляет столько вычислительных мощностей, потому что это «нулевой» движок - он должен играть в шахматы без каких-либо человеческих знаний, кроме правил. Вам не нужно использовать ту же методологию. Вы можете использовать, например, методологию Штейна, которая использует контролируемое обучение. Возможно, это даже лучше, чем "ноль" - ведь в суперфинале играет AllieStein, а не Lc0.

В итоге: если ваша цель - конкурировать с лучшими двигателями в мире, у вас гораздо больше шансов добиться успеха с двигателями NN, чем с традиционными.

завлекать
источник
6
Возможно, упомяните другую сторону вашего заключения: если ваша цель состоит в том, чтобы углубить ваше понимание шахмат во время программирования, переходите к традиционному.
блюз
1
Я согласен с вашим выводом, но я бы также рекомендовал использовать недавнюю сеть с мощным движком (с разрешения конечно) в качестве отправной точки, а не начинать с нуля (но продолжайте в некотором смысле, отличном от "тренировка через самостоятельное воспроизведение и обновление"). веса », добавляя или удаляя слои, добавляя входные объекты, требуя дополнительных выходных данных и т. д.). Я не могу вспомнить, является ли Lc0 одиночной или двухголовой, но я считаю, что 3-х головная ( ijcai.org/proceedings/2018/0523.pdf ) в настоящее время не реализована никакими шахматными движками и может в конечном итоге улучшить состояние -искусство.
Стивен Джексон
Я думаю, что поиск Алли делает его сильнее против более слабых движков (KMCST, Stoofvlees), а не сети Стейна.
я '
@blues Я думаю, что программирование шахматного движка на самом деле не делает человека лучшим игроком в шахматы - за исключением Ларри Кауфмана (одного из разработчиков Komodo), ни один из лучших движков не назвал игроков разработчиками, или их разработчики не стали титулованные игроки.
Очарование
@me 'это возможно, но Leelenstein - это сеть Stein, использующая бинарный файл Lc0, и это хорошо сделано на чемпионате по компьютерным шахматам chess.com, поэтому сети Stein, по крайней мере, сопоставимы с сетями Lc0.
Очарование
9

Итак, с точки зрения создания самого сильного шахматного движка, я должен пойти нейронной сети или жестко закодированы?

Не выбирайте NN, если у вас нет доступа к нелепым (несколько сотен Nvidia V100). Обучение NN играть в шахматы требует очень много оборудования. Посмотрите, как люди, участвующие в Lc0, обучают более 200 миллионов игр. Поскольку у вас, вероятно, будут проблемы с доступом к оборудованию (вы можете попробовать получить его в Google Colabatory , но только с этим обучение будет очень медленным).

Редактировать: Использование NN. При контролируемом обучении вы МОЖЕТЕ обойтись только с Google Colab и, возможно, одним сильным GPU (2080, 2080Ti, Radeon VII).

Еще одна вещь, которую я рассматриваю, - важно ли, какой язык я использую для кодирования движка. Я знаю, что многие шахматные движки используют C ++, который я никогда раньше не использовал. Я использовал другие языки на основе Си, которые делают много того же самого, с главным образом изменяющимся синтаксисом. Я наиболее знаком со Swift и Javascript, но также знаком с Python и чувствую, что он может помочь мне.

Python и Javascript, вероятно, слишком медленные для сильного шахматного движка. Я не использовал Swift, но он, вероятно, не понравится платформам, отличным от macOS, поэтому, вероятно, лучше использовать C или C ++. Вы также можете использовать Rust, но он имеет много функций безопасности, которые раздражают, и вам не нужно, что может раздражать. Также будет сложнее получить из этого хорошую производительность, поскольку некоторые низкоуровневые оптимизации сложно выполнить. Конечно, вы всегда можете написать это в сборке, но это, вероятно, будет слишком много работы. см. https://www.chessprogramming.org/Languages/

мне'
источник
1
Круто, спасибо огромное за информацию! Вероятно, я попытаюсь создать API, который будет занимать позицию FEN и выводить рассчитанный ход. Я считаю, что это лучший способ интеграции с ботами Lichess.
Дэвид Шопен
1
Это вариант для реализации другого механизма NN, который просто использует сеть lc0?
RemcoGerlich
1
@RemcoGerlich, насколько я понимаю, движки NN используют две вещи: двоичную и нейронную сеть. Написание двоичного файла не легкое, но обучение нейронной сети относительно легкое. В этом смысле производные Lc0 уже существуют - такими производными являются Leelenstein & Deus X (aka. Fat Fritz).
Очарование
@RemcoGerlich, в таком случае это не будет другой движок, это будет механизм Ic0 с другой оболочкой / интерфейсом / чем угодно.
Петерис
3

Я построил чисто игрушечный шахматный движок, используя: шахматы на питоне, было очень приятно не самому кодировать правила игры и просто сосредоточиться на логике; однако число позиций, которые я смог оценить в секунду, очень мало. Это может быть хорошей отправной точкой.

Akavall
источник