Как запрограммировать нейронную сеть для шахмат?

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

Мой подход заключается в создании сети из 385 нейронов: на доске шесть уникальных шахматных фигур и 64 поля. Поэтому для каждого поля мы берем 6 нейронов (1 для каждой части). Если есть белый кусок, входное значение равно 1. Если есть черная деталь, значение равно -1. И если в этом поле нет такого фрагмента, значение равно 0. В дополнение к этому должен быть 1 нейрон для перемещения игрока. Если это белый поворот, входное значение равно 1, и если он черный, значение равно -1.

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

Итак, было бы здорово, если бы вы могли помочь мне внедрить нейронную сеть в язык кодирования (лучше всего было бы Delphi, иначе псевдокод). Спасибо заранее!

Ответ 1

Был там, сделал это. Поскольку в вашей задаче нет непрерывности (значение позиции не тесно связано с другой позицией с 1 изменением значения одного входа), очень мало шансов, что NN будет работать. И это никогда не было в моих экспериментах.

Я бы предпочел увидеть смоделированную систему отжига с специальной эвристикой (которой там много), чтобы оценить значение позиции...

Однако, если вы настроены на использование NN, это относительно легко представить. Общий NN представляет собой просто график, причем каждый node является нейроном. Каждый нейрон имеет текущее значение активации и формулу перехода для вычисления следующего значения активации на основе входных значений, то есть значений активации всех узлов, которые имеют ссылку на него.

Более классический NN, то есть с входным слоем, выходной слой, идентичные нейроны для каждого уровня и без зависимости от времени, может быть представлен в виде массива входных узлов, массива выходных узлов и связанный граф узлов, соединяющих их. Каждый node имеет текущее значение активации и список узлов, к которым он переходит. Вычисление выходного значения - это просто установка активирования входных нейронов на входные значения и повторение каждого последующего слоя поочередно, вычисление значений активации из предыдущего уровня с использованием формулы перехода. Когда вы достигли последнего (выходного) уровня, у вас есть результат.

Ответ 2

В случае, если кто-то случайно найдет эту страницу. Учитывая то, что мы знаем сейчас, то, что предлагает ОП, почти наверняка возможно. Фактически нам удалось сделать это для игры с гораздо большим пространством состояний - Go (https://deepmind.com/research/case-studies/alphago-the-story-so-far).

Ответ 3

Я не понимаю, почему у вас не может быть нейронной сети для статического оценщика, если вы также делаете классический мини-макс-просмотр с альфа-бета-обрезкой. Многие шахматные двигатели используют минимакс с помощью статического оценщика Braindead, который просто добавляет части или что-то еще; это не имеет большого значения, если у вас достаточно минимаксных уровней. Я не знаю, сколько улучшится сеть, но там немного потерять. Тем не менее, обучение было бы сложным. Я бы предложил использовать движок, который смотрит вперед на многие ходы (и загружает множество CPU и т.д.), Чтобы обучить оценщика движку, который смотрит вперед на меньшее количество ходов. Таким образом, вы получите двигатель, который не займет столько же CPU (надеюсь).

Ответ 4

Что вам нужно для обучения ANN - это что-то вроде backpropagation learning или какой-то формы генетический алгоритм. Но шахматы - такая сложная игра, что маловероятно, что простой ANN научится играть в нее - даже больше, если процесс обучения не контролируется.

Кроме того, ваш вопрос ничего не говорит о количестве слоев. Вы хотите использовать 385 входных нейронов для кодирования текущей ситуации. Но как вы хотите решить, что делать? На нейрон в поле? Побеждает сильнейшее возбуждение? Но часто бывает более одного возможного шага.

Далее вам понадобятся несколько скрытых слоев - функции, которые могут быть представлены с помощью ввода и выходного слоя без скрытого слоя, действительно ограничены.

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

Я пытался построить и обучить ANN, чтобы играть на Tic-tac-toe, когда мне было 16 лет или около того... и я потерпел неудачу. Я бы предложил сначала попробовать такую ​​простую игру.

Ответ 5

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

Ваши параметры, которые я вижу, следующие:

  • Разработайте некоторую эвристическую функцию для оценки состояния платы и обучения сети. Но это вызывает вопрос о том, зачем использовать ANN вообще, когда вы можете просто использовать свою эвристику.

  • Используйте некоторые статистические показатели, такие как "Сколько игр было выиграно белым или черным из этой конфигурации платы?", что даст вам значение пригодности между белым или черным. Трудность заключается в количестве данных обучения, необходимых для размера вашего проблемного пространства.

Со вторым вариантом вы всегда можете кормить его последовательностями досок от игр гроссмейстера и надеяться, что для разработки решения для ANN достаточно покрытия.

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

Ответ 6

Возможно, но не тривиально каким-либо образом.

https://erikbern.com/2014/11/29/deep-learning-for-chess/

Чтобы тренировать свою оценочную функцию, он использовал много вычислительной мощности для этого.

Подводя итог, вы можете сделать это следующим образом. Ваша оценочная функция является прямым NN. Пусть матричные вычисления приводят к скалярному результату, оценивающему, насколько хорош ход. Входным вектором для сети является состояние платы, представленное всеми частями на доске, поэтому скажем, что белая пешка 1, белый рыцарь равен 2... и пустое пространство равно 0. Примерный входной вектор состояния платы - это просто последовательность из 0 -12-х годов. Эта оценка может быть подготовлена ​​с использованием игр-гроссмейстеров (например, доступна в базе данных fics) для многих игр, что минимизирует потерю между тем, что говорят текущие параметры, - это самая высокая оценка и то, что сделали гроссмейстеры (которые должны иметь самую высокую оценку). Это, конечно, предполагает, что ход гроссмейстера правильный и оптимальный.

Ответ 7

Пришел сюда, чтобы сказать, что сказал Силас. Используя минимаксный алгоритм, вы можете ожидать, что сможете смотреть вперед N движений. Используя обрезку альфа-бета, вы можете расширить это до теоретически 2 * N ходов, но более реалистично 3 * N/4 движения. Нейронные сети действительно подходят здесь.

Возможно, хотя можно использовать генетический алгоритм.

Ответ 8

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

Выходной слой должен (в некотором роде) передать кусок для перемещения и местоположение для перемещения.

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

Сделайте так, чтобы они играли друг с другом, сохраняли лучшую горстку, кроссовер и мутировали лучшие соединения, чтобы повторно заполнить пул.