Я использовал TensorFlow2.0, чтобы обучить ИИ играть в змейку.

искусственный интеллект

В последнее время я стал одержим ретро-играми, и я помню, как играл в «Змейку», которой я был очарован, когда был ребенком, и это было действительно весело. Теперь, когда на дворе 2019 год, все кажется другим, чем раньше. Например, мы можем использовать ИИ для игры в го и использовать ИИ для автоматического вождения. Может ли ИИ научиться играть в змейку самостоятельно? Конечно, да! !

Давайте посмотрим на наш эффект:

идеи

Пусть ИИ научится есть змей, тогда сначала нам нужно определить игровую среду. Некоторые люди скажут, что использование pygame или gtk для создания интерфейса на самом деле слишком сложно Я не стал ждать, пока создам ИИ, но предполагается, что на игровой интерфейс будет потрачено много времени. Мы можем решить эту проблему напрямую с OpenCV! Примерный код выглядит следующим образом:

Как заставить ИИ учиться

Так как же сообщить ИИ правила игры в змею? Другими словами, сообщите ИИ:

  • вы не можете есть сами;
  • Вы не можете коснуться стены;
  • Вы вознаграждены за опоздание к красной еде.

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

  1. Во-первых, давайте позволим ИИ учиться в небольшой среде;
  2. Затем постепенно расширяйте пластину;
  3. Наконец, посмотрите окончательный эффект на шахматной доске фиксированного размера.

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

Как видно из картинки это одна из ссылок.Вы можете видеть, что максимальная длина нашей жадной змейки может достигать 9, что на самом деле очень хорошо.Число рядом с ней показывает, что она убила себя 1841 раз, но он все еще силен в жизни. .

Процесс всего алгоритма модели также очень ясен, Вкратце, шаги следующие:

  • Прежде всего определяем общее количество перевоплощений.Мир непостоянен и перевоплощения есть.Умереть можно до 50000 раз,каждый раз давая вам 8 жизней.Как научиться,можно решить что делать если съешь змей ;
  • В каждой реинкарнации мы записываем позицию каждой попытки и заносим ее в свой Мемерий, чтобы наша жадная змея могла двигаться так же кокетливо, как Цай Сюкунь;
  • Наконец, после смерти каждой реинкарнации используйте эти воспоминания для обучения нашей Qnetwork;
  • Таким образом, Qnetwork становится все сильнее и сильнее, потому что он запомнил все успешные попытки и неудачные попытки, в следующий раз руководство будет более мощным, и время каждой реинкарнации в конце концов будет больше, так что это не так. как приземление Будды. .

Сборка QNetwork

Для такого рода проблем это на самом деле процесс принятия решений в соответствии с окружающей средой, который можно изучить с помощью обучения с подкреплением, но в качестве модели прогнозирования следующего пространства действий нам все еще нужно построить DNN, чтобы соответствовать, учиться на данных, чтобы предсказать следующий Закон одношагового действия также является ядром. Наша сборка QNetwork использует TensorFlow 2.0 и построена с помощью Keras NN API. Можно сказать, что это очень модно. Основной код построения QNetwork выглядит следующим образом:

class QNetwork:

    def __init__(self,input_shape, hidden_units, output_size, learning_rate=0.01):
        self.input_shape = input_shape
        hidden_units_1, hidden_units_2, hidden_units_3 = hidden_units
        self.model = tf.keras.Sequential([
            tf.keras.layers.Dense(units=hidden_units_1, input_dim=input_shape, activation=tf.nn.relu),
            tf.keras.layers.Dense(units=hidden_units_2, activation=tf.nn.relu),
            tf.keras.layers.Dense(units=hidden_units_3, activation=tf.nn.relu),
            tf.keras.layers.Dense(units=output_size, activation=tf.keras.activations.linear)
        ])

        self.model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate), loss='mse',metrics=['accuracy'])
        
    def predict(self, state, batch_size=1):
        return self.model.predict(state, batch_size)
    
    def train(self, states, action_values, batch_size):
        self.model.fit(states, action_values, batch_size=batch_size, verbose=0, epochs=1)

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

обучение с подкреплением

Можем посмотреть лог всего тренировочного процесса:

Можно видеть, что примерно после 5000 эпизодов оценка может постепенно увеличиваться, что указывает на то, что сеть более удобна при управлении следующим движением змеи. Также из самой гифки тренировки видно, что максимальная длина нашей жадной змейки теперь может достигать 13. Только представьте, по мере увеличения шахматной доски и усиления модели жадная змейка станет очень-очень длинной? как превзойти предел человеческих существ, чтобы играть в жадных змей? ? Подождем - увидим! !

Тренировка не завершена, но вы можете видеть, что эта позиция все еще очень кокетлива! !

Show Time

Наконец, пришло время для нашего шоу ИИ! ! ! Давайте передадим сцену Змеиному ИИ! ! ! ! Снейк, давай!

Эта позиция еще очень кокетливая! После ночи тренировок и более 30 000 перевоплощений наша прожорливая змея, наконец, может держать себя в вертикальном положении в пределах длины 28. Я думаю, что она должна быть сильнее, чем многие подростки-инвалиды. . как я. .

Подводя итог проблемам и неразрешимым мертвым точкам нашего обучения с подкреплением:

  • Хотя модель обучения с подкреплением может обрабатывать 99% ситуаций, независимо от того, какая сцена, будет 1% ситуаций, которые никогда раньше не видели.Высока вероятность того, что ИИ не знает, как принимать решения в это время, и очень вероятно, что это будет дурак. , наша жадная змея неплоха, но если она используется в автоматическом вождении принятия решений, то решение - видеть непосредственно Маркса;
  • Хотя мы можем усложнить модель без проводов, после двух недель экспериментов мы обнаружили, что чем сложнее модель, тем сильнее ИИ;
  • Что еще более непонятно, так это то, что дело не в том, что чем длиннее эпизод, тем сильнее ИИ.В этот период мы обнаружили, что он имеет пиковый момент, наивысший средний балл составляет 188 баллов, что эквивалентно его максимальная длина может достигать 40 шагов, заинтересованные Мои друзья приходят, чтобы изменить нашу жадную змею и посмотреть, насколько мощной может быть жадная змея Ай, которую вы можете обучить, и может ли она быть такой же стабильной, как Альфа-собака;
  • Снейк не может предсказать границу, то есть, если наша модель работает на шахматной доске, большей, чем обучаемая им среда, она не сможет точно предсказать границу, поэтому мы позволяем ему начинать обучение с маленькой шахматной доски и постепенно увеличить размер шахматной доски Причина, но даже в этом случае он не может точно найти пищу под доской любого размера и избежать границ.

Code

В конце концов, весь код для этого урока в основном состоит из 4 вещей:

  • Игровая среда, эта игровая среда не исходит от openai, мы создаем ее с помощью opencv;
  • Построение модели и обучающий код TensorFlow2.0;
  • Учебный код обучения с подкреплением;
  • Код для запуска ИИ для игры в Снейка.

Все коды можно найти на платформе MANA AI, платформе кода AI, которая ориентирована на обмен высоким качеством и поддерживается профессиональной командой:

Мана Любовь. Коды Таланта/Любви_ достойный...