Я пишу простую игрушечную игру, целью которой является обучение глубокой нейронной сети. Правила игры примерно следующие:
- В игре есть доска, состоящая из шестиугольных ячеек.
- Оба игрока имеют одинаковую коллекцию фигур, которую они могут свободно размещать на доске.
- Размещая различные типы фигур, начисляйте очки (или уменьшайте очки противника) в зависимости от их положения и конфигурации друг против друга.
- Тот, у кого больше очков, побеждает.
Существуют дополнительные правила (о поворотах, количестве и типах фигур и т. Д.), Но они не важны в контексте этого вопроса. Я хочу разработать глубокую нейронную сеть, которая может многократно учиться, играя против себя. Мои вопросы касаются представления ввода и вывода. Особенно:
- Так как структура кусочков имеет значение, я подумал иметь по крайней мере несколько сверточных слоев. Плата может быть разного размера, но в принципе очень мала (6х10 в моих тестах, ее можно увеличить на несколько ячеек). Имеет ли это смысл? Какой вид пула я могу использовать?
- Как представить обе стороны? В этой статье о го, авторы используют две входные матрицы, одну для белых камней и одну для черных камней. Может ли это работать и в этом случае? Но помните, у меня есть разные типы кусков, скажем, A, B, C и D. Должен ли я использовать входные матрицы 2x4? Это кажется очень редким и малоэффективным для меня. Боюсь, что это будет слишком разреженно для сверточных слоев.
- Я подумал, что результатом может быть распределение вероятностей по матрице, представляющей позиции на доске, плюс отдельный массив вероятностей, указывающий, какую часть играть. Тем не менее, мне также нужно представлять способность проходить терн, что очень важно. Как я могу сделать это, не разбавляя его значение среди других вероятностей?
- И самое главное , нужно ли применять только выигрышные или проигрышные ходы? Внедрить выигрышные ходы легко, потому что я просто установил желаемые вероятности равными 1. Но что я могу сделать при проигрыше? Установить вероятность перемещения на 0, а все остальные на то же значение? Кроме того, имеет ли смысл приводить ходы к окончательной разнице в баллах, даже если это противоречит значению результатов, которые являются примерно вероятностями?
Кроме того, я разработал игровой движок в node.js, намереваясь использовать Synaptic в качестве фреймворка, но я не уверен, что он может работать с сверточными сетями (я сомневаюсь, что есть способ исправить веса, связанные с локальными полями восприятия). Какой-нибудь совет относительно других библиотек, которые совместимы с узлом?
Ответы:
Чтобы представить куски, вы должны иметь возможность использовать одну матрицу ввода. Просто назначьте целое число для разных типов частей. Белые камни могут быть положительными целыми числами, а черные - отрицательными.
Вы можете использовать сигмоид для достоверности положения доски и линейную активацию для идентификатора фигуры. проход был бы другим выходом сигмоида. Я не думаю , что вам придется беспокоиться о пройти разбавляется. Так как это такое ценное действие, оценка будет сильно зависеть от результата прохода и будет иметь большой градиент. Если вам нужно выбрать действие прохода с высокой частотой для целей обучения подкреплению, то просто приписывайте проходу более высокую вероятность действию в вашей функции случайного выбора.
Окончательная разница в баллах оказывает большое влияние на желательность ходов. Большая разница баллов должна привести к значительному влиянию на функцию. Поэтому вы можете захотеть включить величину разницы очков в свою функцию потерь.
Это тип работы, которую выполняет Deep Q Learning. Возможно, вы тоже захотите посмотреть на это.
источник
Вам не нужны конфорные слои, поскольку вы не вводите изображение в качестве входных данных (см. Ниже). Кроме того, вы можете попробовать использовать изображение доски (с различными фигурами, имеющими разные формы). Это тоже может сработать. Затем я бы выбрал 2 слоя для конвоя, шаг 1, размер ядра равен половине куска. Я бы попробовал это с одним максимальным пулом.
В отличие от другого ответа, я бы предложил использовать 3D-тензор в качестве входных данных с количеством каналов, равным разным частям. Два других равных измерения будут соответствовать количеству ячеек на доске. Различные преобразования в вашей NN не смогут отличить несколько целых чисел очень хорошо. Вот почему лучше иметь горячее кодирование типов фигур.
Я бы использовал только вектор с n + 1 компонентами для вывода: n для всех возможных ходов и 1 для прохода. Он будет кодировать ожидаемое вознаграждение за каждый ход, а не вероятность.
Не уверен, что ты имеешь в виду, применяя ходы. Но когда вы собираетесь обучать его чему-то похожему на Q-learning, имеет смысл совершать совершенно случайные движения время от времени с определенной вероятностью (скажем, в 10% случаев). Поиск https://en.wikipedia.org/wiki/Reinforcement_learning
источник