Flappy Bird, культовая, но удивительно простая игра, доставляющая много разочарований.

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

Я довольно быстро разочаровался в игре. Итак, я подумал, что если я не смогу играть в эту игру…

Я напишу что-нибудь, чтобы воспроизвести это.

Так как я это сделал?

Я решил создать сверточную глубокую q-нейронную сеть и обучаю ее с помощью обучения с подкреплением, чтобы играть в игру так долго, как я могу. (На самом деле Deep Q-сети были тем, что Google Deep Mind использовал для игры в Atari breakout.) Я использовал Pygame для создания реальной игры Flappy Bird и построил свои нейронные сети в Jupyter Notebooks .

Игровая среда 🎮

Я предпочитаю кодировать среду Flappy Bird с помощью Pygame, модуля python, предназначенного для создания игр.

Я нашел много Pygame версий Flappy Bird на Github и остановился на этой одной.

Я использовал спрайты и другие визуальные эффекты в своем проекте вместе с некоторым кодом для игры, который я настроил в соответствии со своими потребностями.

Я реализовал вознаграждение для нейронной сети, когда птица выжила немного дольше (0,1), а когда она прошла через трубу (1), я также применил штраф (-1 ) на случай смерти птицы. Обо всем этом я расскажу позже, когда буду обсуждать мою реализацию обучения с подкреплением.

А теперь перейдем к сути задачи ...

Базовая сеть 💻

Как работает обучение с подкреплением? 📚

Обучение с подкреплением - это обучение агента лучшему взаимодействию со своей средой. Агенты выполняют действия в среде, что приводит к различным сценариям, называемым состояниями.

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

Цель агента - максимизировать общее вознаграждение, полученное за один эпизод, т.е. все состояния с самого начала начального состояния до конца состояния терминала . На основе этого цикла обратной связи агент может разработать работающую политику.

Подводя итог…

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

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

Если вы не читали мою статью о типах машинного обучения, прочтите ее здесь, чтобы узнать больше!

Что такое сверточные сети? 🦾

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

CNN состоят из четырех основных уровней:

  • Сверточный слой - этот слой отвечает за идентификацию функций на изображении.

Представьте себе фонарик (также известный как фильтр), охватывающий входное изображение, каждая секция, на которую светит фонарик, является воспринимающим полем. фильтр также содержит массив весов, которые умножаются на значения пикселей. в рецептивном поле. Расчеты суммируются и образуют карту функций.

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

ReLU применяет функцию активации

f (х) = макс (0, х)

Это означает, что все отрицательные срабатывания заменяются на ноль.

relu (x) = x, если x ≥ 0

иначе 0, если x ‹0

  • Уровень объединения - создан для уменьшения параметра входных входных данных (концентрирует входную информацию).

Это слой понижающей дискретизации, где фильтр применяется к входному тому, возвращая наибольшее число в каждом section, проходит фильтр. Например, если бы в подобласти были значения 0, 1, 3, 6, слой объединения упростил бы эту подобласть только до самого высокого значение 6.

  • Связанный слой - финальная стандартная нейронная сеть прямой связи.

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

Обучение сети игре Flappy Bird 🎓

Что такое жадная политика Эпсилон? 🎲

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

Решающее значение имеет выбор разведки и эксплуатации. Какой процент времени наш алгоритм должен пробовать новые направления по сравнению с получением известных наград?

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

# Epsilon-greedy policy
# Under each probability (epsilon) we either take a random action
# or we select an action with the highest value
# more exploration in start and less later on (epsilon value)
def epsilon_g(est, epsilon, num_action): 
    def policy(state):
       #If a random float number is less than the epsilon, 
       #return a  random number corresponding to an action
        if random.random() < epsilon: 
            return random.randint(0, num_action - 1) # Exploration
       #Otherwise, send the state into the algorithm
       #return the best known action based on predictions
        else: 
            q_values = est.predict(state)
            return torch.argmax(q_values).item() # Exploitation
    return policy

Настройка состояний ввода ⌨️

Наряду с настройкой политики epsilon-greedy, есть и другие небольшие приготовления, такие как генерация случайного начального числа для алгоритма, настройка игровой среды.

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

Примечание. Изображения отправляются в CNN в формате оттенков серого.

# State made from stiching 4 images
# One image is not enough info, use four adjacent steps
pic = torch.from_numpy(pic)
state = torch.cat(tuple(pic for _ in range(4)))[None, :, :, :] 
#When I only have the first frame, I'll just repeat the first one 4x

Обучение модели 💡

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

Тестирование сети и игра в Flappy Bird 🏆

После более чем 18-часового обучения моей сети (со многими компьютерными сбоями) я вытащил свою последнюю сохраненную модель (которую я назвал Цинна) и проиграл несколько эпизодов, чтобы увидеть выступление Цинны. Я наконец смог набрать 250 баллов в Flappy Bird с моим алгоритмом!

Другие приложения ⚙️

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

Их основные способности:

  1. Группировать ~ сортируйте похожие объекты и группируйте их вместе.
  2. Распознавать ~ понимать объекты на изображении.
  3. Классифицируйте ~ классифицируйте визуальные элементы объекта и отсортируйте их по категориям.

Вот несколько примеров возможных применений CNN:

  • Здравоохранение - точный медицинский анализ изображений.
  • Реклама - персонализированная реклама на основе данных.
  • Document Reader - анализ почерка, сканирование чьего-либо письма.
  • Распознавание лиц - детализация лица человека.
  • Климат - лучшее понимание погодных условий
  • Автономные автомобили - обнаружение объектов в беспилотных автомобилях.

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

Вот несколько примеров возможных применений обучения с подкреплением:

  • Контроль светофора - решите проблему пробок на дорогах.
  • Робототехника - научите робота узнавать действия по видео.
  • Химия - оптимизация химических реакций для выявления основных механизмов.
  • Конфигурация веб-системы - настройка параметров и тонкая настройка системы.
  • Рекламные объявления - показ наиболее релевантной для зрителей рекламы.
  • Автономные транспортные средства - ускорение циклов разработки (то, что меня действительно интересует)

Ключевые выводы 📌

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

Мне понравилось писать код для этого проекта, и я надеюсь, что вам понравилось работать с ним! Я рекомендую вам попробовать это и написать свои собственные проекты с помощью машинного обучения!

Если вы хотите читать больше статей в будущем, подпишитесь на мою учетную запись!

А пока не стесняйтесь обращаться ко мне по адресу [email protected] или связываться со мной в LinkedIn.

Вы также можете прочитать мою ежемесячную рассылку здесь!

Или посетите мой личный сайт, чтобы увидеть мое полное портфолио здесь!

До следующего раза! 👋