Учим искусственный интеллект играть в Doom

Вся эта статья – это путешествие по Deep Learning , с использованием платформы VizDoom.  Моя цель – создать бота для игры Doom, который будет просто самым смертоносным в так  называемой среде Deathmatch(«смертельный бой; бой насмерть» ). Дальше я расскажу вам о начальном процессе установки Teano, основах глубокого изучения, а также о настройке среды VizDoom.

VizDoom – не единственная платформа, которая создана для обучения с подкреплением (англ. reinforcement learning), но именно она проведет  нас по замечательному и сложному миру искусственного интеллекта.

Как только наша среда будет правильно настроена, мы погрузимся в обучение с подкреплением, запустим некоторые базовые примеры, а затем, используя некоторые методы оптимизации, повысим производительность нашего бота.

Image 1. Бот выбирает цель. Я думаю ты будешь мертв.

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

Прежде чем приступать к настройке среды, давайте я вам сначала расскажу что такое обучение с подкреплением, как оно работает, и почему это нам  интересно.Обучение с подкреплением (англ. reinforcement learning) — один из способов машинного обучения, в ходе которого испытуемая система (агент) обучается, взаимодействуя с некоторой средой. Другими словами, бот обучается без учителя, но в тоже время мы даем ему советы как бы мы хотели, чтобы он сделал. Ну мое объяснение конечно не 100% правильное, поэтому если хотите прочитайте в вики. Мы не говорим нашему искусственному интеллекту что делать(ведь это уже будет считаться обучением с учителем), а как бы подсказываем ему некоторые действия(например  убить монстров или остаться в живых).

Чтобы знать куда двигаться и выбрать правильное направление, мы должны знать насколько хорошо работает наша сеть. Ну а для этого мы должны периодически сравнивать ее с идеалом. Поэтому сначала нужно создать систему оценок.

Безымянный

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

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

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

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

На данный момент, хоть мы до конца и не можем понять как ИИ принимает решения, мы все же можем изучить основные принципы системы.

Для начала,  давайте представим, что вместо Doom мы хотим создать AI, который должен истреблять Flappy Bird.  Суть игры состоит в том, что игрок с помощью касаний экрана должен контролировать полёт птицы между рядами зелёных труб, не задевая их. Поэтому  нашему ИИ мы должны дать только 2 инструкции: рывок вверх и при отсутствии рывков птица падает из-за силы тяжести.

Для управления ИИ мы создадим простую скоринговую систему, где [Crash: -1,000, pipe-pass: +5]. Мы как бы “поощряем” наш ИИ(искусственный интеллект) за проход между трубами и “наказываем”  за крушение. Ну а теперь, когда настройка завершена, мы начинаем обучать наш ИИ, используя любую(по выбору) сетевую архитектуру.

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

Устанавливаем VizDoom

В отличие от многих других инструментов, я могу с уверенностью сказать, что установка VizDoom довольно проста.  Чтобы все это заработало, вам понадобится«ZDoom»( порт (расширение движка) для компьютерной игры Doom) со всеми его зависимостями. Я буду показывать  процесс установки на Linux. Счастливые обладатели Windows и OSX могут прочитать все на github, где процесс установки очень хорошо объясняется.

Для начала создадим рабочий каталог для нашего ИИ:

$ mkdir ~/AI_Projects

$ cd AI_Projects

Этот каталог очень вам поможет в будущем, когда вы начнете работать над все новыми и новыми ИИ-проектами. После того как вы перейдете в этот каталог можно начинать работать с репозиторием ViZDoom:

$ git clone https://github.com/Marqt/ViZDoom.git

После того  как  вы склонируете репозиторий  в папке AI  должен появиться  каталог VizDoom. Переходите туда:

$ cd ViZDoom

Прежде чем мы начнем обучать нашего бота нужно установить как зависимости ZDoom, так и основные инструменты для работы с искусственным интеллектом.

Зависимости ZDoom

Ставим зависимости:

$ sudo apt-get install build-essential zlib1g-dev libsdl2-dev libjpeg-dev nasm tar libbz2-dev libgtk2.0-dev cmake git libfluidsynth-dev libgme-dev libopenal-dev timidity libwildmidi-dev

Зависимости Python 2 и Python 3

$ sudo apt-get install python-pip python3-pip

$ pip install numpy #пакет для Python2

$ pip3 install numpy #пакет для Python3

Библиотеки  Boost

$ sudo apt-get install libboost-all-dev

$ sudo apt-get install liblua5.1-dev

Эти шаги скопированы из Git репозитория. Правда у меня не получилось получить библиотеку Boost и все необходимые зависимости для Python3 (я работал с Python2).

Ну и наконец запускайте  cmake внутри каталога VizDoom:

$ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_PYTHON=ON -DBUILD_JAVA=ON -DBUILD_LUA=ON

make

Есть еще один метод и он (как по мне) самый простой. Поставить vizdoom можно еще при помощи pip:

$ sudo pip install vizdoom

Теперь, когда у нас установлена стабильная версия ViZDoom, нам нужно идти вперед и установить все оставшиеся библиотеки для работы с искусственным  интеллектом. В этом примере будет использоваться как Theano так и  Tensorflow, но вы можете использовать другую платформу  глубокого обучения (например Caffe).

Давайте начнем установку Theano:

$ sudo pip install Theano

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

Внутри каталога ViZDoom  перейдите в папку examples/python:

$ cd examples/python

И запустите следующую команду:

$ python learning_theano.py

Данная команда запустит процесс обучения и начнет тренировать ваш ИИ, чтобы он выполнил простую задачу –  убил беззащитного демона NPC. В зависимости от мощности железа и  установлена ли CUDA,  это может занять от 15 минут до часа (или 2). По мере прохождения обучения вы сможете увидеть четкую тенденцию улучшения работы вашего ИИ.

Ниже приведена таблица с оценками за каждую эпоху(каждая эпоха содержит 2000 отдельных эпизодов).

Безымянный

 

Производительность нашего ИИ довольно “стандартная”. Бот конечно выполнял свою задачу, но нижние оценки нас совсем не устраивают. Есть очень много способов улучшения производительности нашей нейронной сети. Один из способов заключается в том, чтобы активно уменьшать скорость обучения. Сокращение скорости обучения не позволяет сети «тренироваться» из оптимальной конфигурации, а даст ей возможность улучшать свои показатели.

Я покажу вам как это работает. Но сначала нужно создать новую копию учебного приложения:

$ cd ~/VizDoom/examples/python

$ cp learning_theano.py leaning_step_theano.py

В строке 26 в новом приложении мы добавим константу, которая будет уменьшать нашу скорость обучения.

learning_step = 0.1

Затем в цикле “for epoch” добавьте следующее условие.

if epoch % 5:
learning_rate = learning_step*learning_rate

Хоть это и не самая элегантная часть кода, зато она гарантирует, что каждые 5 эпох мы понижаем скорость обучения.  Ниже я привел серию графиков, показывающих разницу в производительности между 3 агентами ИИ, прошедшими обучение с использованием неизменной программы learning_theano.py,  которую мы запускали с самого начала,  и 3 агентов ИИ, прошедших обучение с уже замедленной скоростью.

graph1

graph2

graph3

Чтобы обеспечить объективность эксперимента, 6 индивидуальных агентов ИИ прошли обучение с использованием одинакового количества эпох и эпизодов. Как вы уже заметили, особых изменений не было (кроме того условия if), которое и замедлило скорость обучения. Но даже такая, казалось бы маленькая модификация,  существенно увеличила производительность нашего бота. В таблице ниже я приведу сравнительные оценки. И они говорят о явном преимуществе  метода ступенчатого обучения (с замедлением скорости каждые 5 эпох).

Безымянный