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

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

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

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

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

Ответы [ 9 ]

10 голосов
/ 26 июля 2016

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

9 голосов
/ 16 мая 2010

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

4 голосов
/ 28 февраля 2017

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

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

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

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

4 голосов
/ 16 апреля 2009

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

Ваши варианты, как я их вижу:

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

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

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

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

4 голосов
/ 16 апреля 2009

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

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

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

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

4 голосов
/ 16 апреля 2009

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

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

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

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

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

1 голос
/ 22 июля 2011

Читайте blondie24: http://www.amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838.

Это касается шашек, а не шахмат, но принципы те же.

1 голос
/ 06 декабря 2010

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

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

0 голосов
/ 24 июня 2011

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

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

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

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

...