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

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

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

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

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


person caw    schedule 15.04.2009    source источник
comment
Спасибо за ваши ответы. Я понял, что играть в шахматы по нейросетям сложно или невозможно. Но вторая часть моего вопроса заключалась в следующем: как вы кодируете нейронную сеть (например, мою конфигурацию)? Понятия не имею, поэтому с нетерпением жду предложений.   -  person caw    schedule 17.04.2009
comment
Проверьте это: chesscircle.net / форумы /!   -  person Spider    schedule 20.05.2011
comment
По этому поводу должен быть обновленный ответ, поскольку SOTA значительно изменилась с 2009 года! Конечно, можно научиться играть в шахматы, используя глубокий NL, смешанный с обучением с подкреплением!   -  person Keir Simmons    schedule 02.03.2017
comment
@KeirSimmons Вы можете опубликовать его или добавить награду.   -  person Bernhard Barker    schedule 29.11.2017
comment
Я хочу отметить, что один нейрон, указывающий на игрока, который должен двигаться, - не лучшая идея, вы столкнетесь с некоторой проблемой, потому что оценка досок будет неравной. Я предлагаю вам инвертировать все значение доски, если это черный ход, чтобы он не рассматривал черное и белое, а скорее игрока и оппонента.   -  person Super Toto    schedule 03.07.2020


Ответы (9)


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

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

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

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

person Varkhan    schedule 15.04.2009
comment
Но TD-Gammon тоже научился играть в нарды, используя только нейронную сеть. Так что это должно как-то работать, не так ли? - person caw; 16.04.2009
comment
Blackgammon сильно отличается от Chess ... в нем сложность правил и широкое разветвление возможностей заменяются случайностью. Но NN очень хорошо справляются со статистическим прогнозированием, а не с обрезкой дерева возможных решений. - person Varkhan; 16.04.2009
comment
Непрерывность не была бы проблемой при наличии достаточного количества внутренних узлов (для задней сети NN) и обучающих данных. Проблема в том, что количество узлов и требуемое количество обучения сделали бы это невыполнимым. Я согласен, что NN - плохое решение проблемы. - person geofftnz; 16.04.2009
comment
Вы бы сказали, что невозможно играть в шахматы с использованием искусственных нейронных сетей, по крайней мере, с использованием моей сетевой конфигурации? - person caw; 16.04.2009
comment
Скажем так, я был бы удивлен, если бы вам удалось заставить его играть правильно. NN очень хорошо подходят для задач числовой фильтрации, когда вам нужно принимать решения на основе некоторых числовых и полунепрерывных данных. Они плохо работают с символьными дискретными данными, такими как конфигурации плат. - person Varkhan; 17.04.2009
comment
Хорошо спасибо! Таким образом, это, вероятно, не сработает. Но все же я хотел бы это проверить. Так что я был бы очень рад некоторым советам или примерам кодирования. - person caw; 17.04.2009
comment
Проголосуйте против, потому что ответ касается только сетей с прямой связью. Сегодня существуют десятки различных моделей. Например, сверточные нейронные сети должны работать для распознавания образов в шахматах, что может дать вам решения для некоторых конфигураций. В конце концов, рекуррентные нейронные сети завершены и, следовательно, теоретически могут играть в шахматы. - person Benedikt S. Vogler; 28.02.2017
comment
Alpha Zero и Leela Zero, основанные на NN и превосходящие все классические шахматные движки, доказывают, что этот ответ неверен. - person user1066278; 21.05.2020

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

person siemanko    schedule 25.07.2016
comment
;) они начали с шахмат, потом сделали го, используя в основном ту же архитектуру NN - person user613326; 05.12.2018

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

Изменить: я написал это в 2010 году, а теперь, в 2020 году, Stockfish NNUE сделал это. Сеть оптимизирована и обучена на [классической Stockfish] оценке миллионов позиций при умеренной глубине поиска, а затем используется в качестве статического оценщика, и в своих начальных тестах они получили улучшение на 80 единиц при использовании этого статического оценщика вместо прежнего. one (или, что то же самое, elo с чуть меньшим процессорным временем). Так что да, это действительно работает, и вам даже не нужно обучать сеть на большой глубине поиска, как я изначально предлагал: умеренной глубины поиска достаточно, но ключ в том, чтобы использовать многие миллионы позиций.

person Silas S. Brown    schedule 16.05.2010
comment
Проблема с этим подходом заключается в том, что если вы используете минимаксную и альфа-бета эвристику сокращения, вы уже признаете, что ваша NN уступает вашему оценщику. Теперь я согласен, что это круто - просто играть в шахматы с NN, практической пользы (за исключением опыта, который вы получите) будет не много. - person Atilla Filiz; 11.07.2016
comment
@AtillaFiliz Нет. Руководство (написанное программистом) оценщик + глубокий поиск используется для обучения NN в надежде, что NN + неглубокий поиск превзойдет ручной оценщик + неглубокий поиск. Если это работает, то NN лучше, чем ручной оценщик. - person maaartinus; 03.10.2016

Это возможно, но ни в коем случае не тривиально.

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

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

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

person sma    schedule 28.02.2017

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

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

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

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

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

person Daniel Brückner    schedule 15.04.2009
comment
Нейронная сеть должна оценивать только позицию. Остальные функции вычисляют все возможные ходы. Затем для каждого хода результирующая позиция передается нейронной сети, которая дает числовое значение в качестве оценки. Например, белые предпочтут ход, ведущий к 4,5, чем -6,2. - person caw; 16.04.2009
comment
Как указал Вархан, эта функция оценки будет очень волнистой, и ее очень сложно представить с помощью ИНС. - person Daniel Brückner; 16.04.2009
comment
Я тоже не умею программировать крестики-нолики. Мне не хватает ноу-хау. Поэтому я спросил здесь, как реализовать такую ​​нейронную сеть. На мой взгляд, нейронная сеть - вещь довольно абстрактная. Я могу представить, как это будет работать, но я понятия не имею, как это кодировать. Так что я надеюсь, что кто-то здесь может мне помочь. - person caw; 16.04.2009

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

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

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

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

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

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

person geofftnz    schedule 15.04.2009
comment
Спасибо. Я это уже проверял. Это сработает, но вам понадобится невообразимое количество обучающих данных, как вы уже писали. В шахматах существует примерно 2,28x10 ^ 46 возможных позиций, поэтому у вас никогда не будет достаточно тренировочных данных для каждой позиции. - person caw; 16.04.2009
comment
Да, хотя идея нейронной сети заключается в том, что она должна быть способной к обобщению с учетом ограниченного обучающего набора. Многое зависит от сложности функции, которую вы пытаетесь реализовать, что в случае с шахматами будет безумием. - person geofftnz; 17.04.2009
comment
Хорошо, вы меня убедили. Но как бы вы могли его закодировать? Я бы с удовольствием его протестировал, хотя теперь я знаю, что мой движок никогда не будет профессиональным игроком. - person caw; 17.04.2009

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

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

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

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

person Community    schedule 24.06.2011

Прочтите blondie24: http://www.amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838.

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

person emyr666    schedule 22.07.2011

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

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

person Steve Pierce    schedule 06.12.2010
comment
Проголосовано против - какое отношение это имеет к вопросу о нейронных сетях? - person Arafangion; 24.06.2011