Идеальный вход для нейронной сети для игровых шашек
Я новичок в нейронных сетях, и я проектирую нейронную сеть с прямой связью, чтобы научиться играть в шашки. В качестве входных данных должна быть дана доска, а выходные данные должны дать шанс выиграть и проиграть. Но как может быть идеальное преобразование доски шашек в ряд чисел для ввода? На каждом квадрате есть 32 возможных квадрата и 5 различных вариантов (король или кусок белого или черного игрока и свободная позиция). Если я предоставлю единицу ввода для каждого возможного значения для каждого квадрата, это будет 32 * 5. Другой вариант:
Free Position: 0 0
Piece of white: 0 0.5 && King Piece of white: 0 1
Piece of black: 0.5 1 && King Piece of black: 1 0
В этом случае длина ввода будет всего 64, но я не уверен, какой из них даст лучший результат?
4 ответа
Я испробовал все возможности и интуитивно понятно, что могу сказать, что самая замечательная идея - разделить все возможности для всех квадратов. Таким образом, бетон:
0 0 0: free
1 0 0: white piece
0 0 1: black piece
1 1 0: white king
0 1 1: black king
Также возможно улучшить другие параметры ситуации в игре, такие как количество фигур под угрозой или количество возможностей для прыжка.
В случае, если кто-то все еще интересуется этой темой - я предлагаю кодировать доску шашек 32-мерным вектором. Недавно я обучил CNN в базе данных экспертов по шашкам и смог достичь удивительно высокого уровня игры без поиска, чем-то похожего (я подозреваю) на контролируемый этап обучения, который Deepmind использовал для предварительной подготовки AlphaGo. Я представлял свои входные данные в виде сетки 8x4, с записями в наборе [-3, -1, 0, 1, 3], соответствующими противостоящему королю, противостоящему контролеру, пустому, собственному контролеру, собственному королю, репрезентативно. Таким образом, вместо того, чтобы кодировать плату с помощью 160-мерного вектора, где каждое измерение соответствует комбинации местоположения и части, входное пространство может быть уменьшено до 32-мерного вектора, где каждое местоположение платы представлено уникальным измерением, а часть на это местоположение кодируется набором действительных чисел - это делается без потери информации.
Более интересный вопрос, по крайней мере, на мой взгляд, какой выходной кодировки является наиболее благоприятным для обучения. Один из вариантов - это закодировать его так же, как ввод. Я бы посоветовал против этого, обнаружив, что упрощение выходного кодирования для местоположения (части для перемещения) и направления (вдоль которой нужно перемещать эту часть) намного более выгодно для обучения. Хотя причины этого, вероятно, более тонкие, я подозреваю, что это связано с огромным пространством состояний шашек (что-то вроде 50^20 вариантов досок). Учитывая, что цель нашей прогностической модели состоит в том, чтобы принять входные данные, содержащие огромное количество возможных состояний, и произвести один выход (т. Е. Переместиться) из (максимум) 48 возможностей (12 штук, умноженных на 4 возможных направления, исключая скачки), главный приоритет в архитектуре нейронной сети должен соответствовать сложности входного и выходного пространства в реальной игре. Имея это в виду, я решил закодировать выходной сигнал как матрицу 32 x 4, где каждая строка представляет местоположение платы, а каждый столбец представляет направление. Во время обучения я просто развернул это в 128-мерный закодированный вектор с одной горячей точкой (используя argmax активаций softmax). Обратите внимание, что это выходное кодирование пригодно для многих недопустимых ходов для данной доски (например, отходит от доски от краев и углов, перемещается в занятые места и т. Д.) - мы надеемся, что нейронная сеть сможет научиться правильной игре при большом достаточно тренировочного набора. Я обнаружил, что CNN проделал замечательную работу по изучению правильных ходов.
Я написал больше об этом проекте на http://chrislarson1.github.io/blog.
Я делал такие вещи с Крестики-нолики. Есть несколько способов представить это. Одним из наиболее распространенных для TTT является вход и выход, которые представляют весь размер платы. В TTT это становится 9 x скрытыми x 9. Ввод -1 для X, 0 для none, 1 для O. Тогда вход в нейронную сеть является текущим состоянием платы. Результатом является желаемый ход. Независимо от того, какой выходной нейрон обладает наибольшей активацией, это будет движение.
Обучение распространению не будет работать здесь хорошо, потому что у вас не будет конечного тренировочного набора. Что-то вроде имитации отжига, PSO или чего-либо с функцией оценки было бы идеально. Было бы здорово противопоставить сети друг другу для оценки.
Это работало несколько хорошо для ТТТ. Я не уверен, как это будет работать для шашек. Шахматы, скорее всего, уничтожат его. Для Go это, вероятно, будет бесполезно.
Проблема в том, что нейронная сеть будет изучать скороговорки только в фиксированном месте. Например, прыжок противника в верхнем левом углу будет совершенно другой ситуацией, чем прыжок кого-то в левом нижнем углу. Это должно быть изучено отдельно.
Возможно, лучше будет представлять точное состояние доски в позиции независимым способом. Это потребует некоторых мыслей. Например, вы можете сообщить, какие существуют возможности "прыжка". Какие существуют возможности для продвижения к королевскому квадрату и т. Д., И позволяют сети учиться расставлять приоритеты.
Пожалуйста, смотрите этот тезис Blondie24 стр. 46, там есть описание ввода для нейронной сети.