Как закодировать искусственную нейронную сеть (Tic-tac-toe)?
Я хочу играть в Tic-tac-toe, используя искусственную нейронную сеть. Моя конфигурация для сети выглядит следующим образом:
Для каждого из 9 полей я использую 2 входных нейрона. Итак, у меня есть 18 входных нейронов, конечно. Для каждого поля у меня есть 1 входной нейрон для части 1-го и 1-го нейрона для части 2-го игрока. В дополнение к этому у меня есть 1 выходной нейрон, который дает оценку текущей позиции платы. Чем выше выходное значение, тем лучше положение для игрока 1. Чем ниже оно, тем лучше для игрока 2.
Но моя проблема: как я могу закодировать эту нейронную сеть? Моя идея заключалась в использовании массива [1-18] для входных нейронов. Значениями этого массива являются входные веса. Я бы прошел через массив, используя цикл. Когда активируется нейрон, я добавляю вес к выходному значению. Таким образом, выходное значение представляет собой сумму весов активированных входных нейронов:
Output = SUM(ActivatedInputNeurons)
Как вы думаете, это хороший способ программирования сети? У вас есть идеи?
Надеюсь, ты поможешь мне. Спасибо заранее!
Ответы
Ответ 1
Ну, у вас есть входной слой из 18 нейронов и выходной слой из 1 нейрона. Это нормально. Тем не менее, вам нужно дать вашей нейронной сети возможность вставить эти данные в отношения. Для этого вам нужен хотя бы один промежуточный слой. Я бы предложил использовать 9 нейронов в промежуточном слое. Каждый из них должен быть подключен к каждому входному нейрону, а выходной нейрон должен быть подключен к каждому промежуточному. Каждое такое соединение имеет вес, и каждый нейрон имеет уровень активации.
Затем вы проходите через все нейроны, слой за раз. Входной уровень только активируется с состоянием платы. Для всех дальнейших нейронов вы проходите все соответствующие соединения и суммируете по продукту связанного уровня активации нейронов и веса соединения. Наконец, вы вычисляете уровень активации, применяя сигмоидную функцию к этой сумме.
Это принцип работы. Теперь вам нужно обучить эту сеть, чтобы получить лучшие результаты. Для этого есть несколько алгоритмов, вам придется делать некоторые поисковые запросы и чтение. Наконец, вы можете настроить количество нейронов и слоев, когда результаты не будут достаточно убедительными. Например, вы можете уменьшить входной слой до 9 нейронов и активировать их с +1 для X и -1 для O. Возможно, добавление другого промежуточного слоя дает лучшие результаты или увеличение числа нейронов слоя.
Ответ 2
Я не особенно понимаю, как вы ожидаете получить осмысленное резюме ситуации платы из одного выходного нейрона. Я бы больше посмотрел на:
I I I O O O
I I I x O O O
I I I O O O
9 input neurons 9 output neurons
в полностью подключенной сети, то есть 81 вес. Затем тренируйте выходные нейроны относительно относительной желательности игры в этом положении.
Ответ 3
Я думаю, что вы должны внедрить традиционный канал ANN для передачи данных с использованием передаточных функций, поскольку это позволяет вам обучать его, распространение. Код для них обычно заканчивается несколькими строками кода, примерно так:
SetupInputs();
for (l = 1 .. layers.count)
for (i = 0 .. layers[l].count)
sum = 0
for (j = 0 .. layers[l-1].count)
sum += layers[l-1][j] * weights[l-1][j]
layers[l][i] = TransferFunction(sum)
Ответ 4
Посмотрите на мой проект Tic. Я решил эту проблему как с нейронной сетью, так и с генетическим алгоритмом. Исходный код свободно доступен.
http://www.roncemer.com/tic-tac-toe-an-experiment-in-machine-learning
Ответ 5
Это отличный стартовый проект для кодирования AI, но придумывание полного решения будет большим ответом для SO.
Как и в большинстве программ, я рекомендую использовать объектно-ориентированный дизайн. Например: Определите класс Neuron
, который имеет входы, весы и функцию вывода. Затем создайте несколько из этих объектов Neuron
для создания вашей сети.
См. статью wikipedia в искусственных нейронных сетях для хорошей отправной точки.
Удачи с кодом! Звучит очень весело.
Ответ 6
После добавления весов вам нужно нормализовать сумму, используя функцию, обычно люди используют TANH, если вы хотите разрешить отрицательные числа.
изменить
Вот реализация java многослойного персептрона, над которым я работал несколько лет назад. этот был использован для шашек, но с меньшим количеством входов вы можете использовать его и для шашек.
Кроме того, вам нужно, вероятно, выяснить способ научить его побеждать, но это еще одна проблема.
Ответ 7
Это не прямой ответ на ваш вопрос, но вы должны взглянуть на следующий фреймворк/инструмент: SNNS или его аналог Java JavaNNS. Я уверен, что там вы найдете ответ на свой вопрос.
Ответ 8
Вы сэкономите время, если используете библиотеку нейронной сети, такую как FANN или Neuroph.
Один из способов кодирования вашего ввода - 9 входных нейронов. Выход также хорош для 9 нейронов. То, что я не вижу в других повторах, - это размер скрытого слоя. Я полагаю, вы собираетесь использовать MLP с традиционными 3 слоями. Размер скрытого слоя всегда тайна. Я бы попробовал 10 скрытых нейронов.
Если передаточная функция является сигмовидной, вы можете кодировать вход следующим образом:
0.0 - O плеер.
1.0 - X-плеер.
0.5 - Пусто.
Выход ANN будет 9 действительных чисел. В этом случае некоторые из ячеек будут заняты уже. Вы можете найти самое высокое выходное значение, которое соответствует пустой ячейке.