Как обучить искусственную нейронную сеть играть в Diablo 2 с помощью визуального ввода? - PullRequest
129 голосов
/ 01 июля 2011

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

Я остановился на Diablo 2. Таким образом, игра ведется в режиме реального времени с изометрической точки зрения, когда игрок управляет одним аватаром, на котором находится камера.

Чтобы сделать вещи более конкретными, задача состоит в том, чтобы получить у вашего персонажа x очков опыта, не снижая его здоровье до 0, где очки опыта набираются за убийство монстров. Вот пример игрового процесса:

here

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

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

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

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

UPDATE (04/27/12):

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

Тем не менее, мы ищем более ценные данные, особенно в отношении проблемы выбора действий в реальном времени и способа кодирования цветных изображений для обработки ANN: -)

UPDATE (10/21/15):

Только что вспомнил, что задал этот вопрос задним числом, и подумал, что должен упомянуть, что это уже не сумасшедшая идея. Со времени моего последнего обновления DeepMind опубликовал свой документ о том, как заставить нейронные сети играть в игры atari с помощью визуальных входов . Действительно, единственное, что мешает мне использовать их архитектуру для игры, ограниченную часть Diablo 2, - это отсутствие доступа к основному игровому движку. Рендеринг на экран с последующим перенаправлением в сеть слишком медленный, чтобы тренироваться за разумное время. Таким образом, мы, вероятно, не увидим, как этот бот будет играть в Diablo 2 в ближайшее время, но только потому, что он будет играть что-то с открытым исходным кодом или с доступом через API к цели рендеринга. (возможно, землетрясение?)

Ответы [ 7 ]

51 голосов
/ 03 июля 2011

Я вижу, что вы беспокоитесь о том, как обучать ANN, но этот проект скрывает сложность , о которой вы могли не знать. Распознавание объектов / персонажей в компьютерных играх с помощью обработки изображений это очень сложная задача (не сказать, сумасшедший для игр FPS и RPG). Я не сомневаюсь в ваших навыках, и я также не говорю, что это невозможно, но вы можете легко потратить в 10 раз больше времени на распознавание материала, чем на реализацию самого ANN (при условии, что у вас уже есть опыт работы с digital). обработка изображений техники).

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

Я помню, что кто-то еще искал советы по другому, но как-то похожему проекту не так давно. Это стоит проверить.

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

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

Другой метод , который работает в игре, включает манипулирование информацией рендеринга. Все объекты игры должны быть выведены на экран. Это означает, что местоположения всех 3D-объектов в конечном итоге будут отправлены на видеокарту для обработки. Будьте готовы к серьезной отладке.

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

41 голосов
/ 28 декабря 2013

ОБНОВЛЕНИЕ 2018-07-26: Вот и все!Сейчас мы приближаемся к тому моменту, когда эта игра станет решаемой!Используя OpenAI и основанную на игре DotA 2, команда может создать ИИ, который сможет победить полупрофессиональных геймеров в игре 5 на 5 .Если вы знаете DotA 2, вы знаете, что эта игра очень похожа на Diablo-подобные игры с точки зрения механики, но можно утверждать, что она еще сложнее из-за командной игры.

Как и ожидалось, это былодостигнуто благодаря последним достижениям в обучении подкреплению с глубоким обучением, а также с использованием открытых игровых сред, таких как OpenAI, что облегчает разработку ИИ, поскольку вы получаете аккуратный API, а также потому, что вы можете ускорить игру (ИИ играл в эквиваленте 180 летгеймплея против себя каждый день!).

5 августа 2018 года (через 10 дней!) планируется сразить этого ИИ с топовыми игроками DotA 2.Если это сработает, ожидайте большую революцию, возможно, не такую ​​медийную, как решение игры в Го, но, тем не менее, она станет огромной вехой для игрового ИИ!

ОБНОВЛЕНИЕ 2017-01: С момента успеха AlphaGo эта область очень быстро продвигается, и существуют новые платформы, облегчающие разработку алгоритмов машинного обучения в играх почти каждый месяц.Вот список последних, которые я нашел:

  • Вселенная OpenAI : платформа для игры практически в любую игру с использованием машинного обучения .API находится в Python, и он запускает игры в среде удаленного рабочего стола VNC, поэтому он может захватывать изображения любой игры!Вероятно, вы можете использовать Universe для игры в Diablo II с помощью алгоритма машинного обучения!
  • Тренажерный зал OpenAI : аналогично Universe, но специально ориентирован на алгоритмы обучения с подкреплением (поэтому это своего рода обобщение используемой платформыот AlphaGo, но гораздо больше игр).В Udemy существует курс , посвященный применению машинного обучения в играх типа Breakout или Doom с использованием OpenAI Gym.
  • TorchCraft : мост между Torch (структура машинного обучения) и StarCraft: Brood War.
  • pyGTA5 : проект по созданию в GTA5 автомобилей с автоматическим управлением, используя только снимки экрана (с большим количеством видео онлайн).

Очень захватывающие времена!

ВАЖНОЕ ОБНОВЛЕНИЕ (2016-06): Как отмечает OP, эта проблема обучения искусственных сетейиграть в игры, используя только визуальные входы, в настоящее время занимаются несколько серьезных организаций, с довольно многообещающими результатами, такими как DeepMind Deep-Qlearning-Network (DQN) .

И теперь, если вы хотитечтобы принять вызов следующего уровня, вы можете использовать одну из платформ для разработки игр AI vision , таких как ViZDoom , высоко оптимизированную платформу (7000 fps) для обучения сетейиграть Doom Using только визуальные входы:

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

И результаты весьма впечатляющие, смотрите видео на их веб-странице и хороший учебник (в Python) здесь!

Существует также аналогичный проект для Quake 3 Arena, который называется Quagents , который также обеспечивает легкий доступ API к основным игровым данным, но вы можете отказаться от него и просто использоватьскриншоты и API только для управления вашим агентом.

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

  • высокая производительность реализация игр (вы можете генерировать больше поколений данных / игр / обучения за меньшее времячтобы ваши алгоритмы обучения могли сходиться быстрее!).
  • простой и отзывчивый API для управления вашими агентами (т. Е. Если вы попытаетесь использовать человеческие ресурсы для управления игрой, некоторые из ваших команд могут быть потеряны, поэтому вы также столкнетесь с ненадежностью ваши выводы ...).
  • простая настройка пользовательских сценариев .
  • настраиваемый рендеринг (может быть полезно для "упрощения" изображений, которые вы получаете для облегчения обработки)
  • синхронизированная («пошаговая») игра (поэтому вам не нужен ваш алгоритм для работы в реальном времени, это значительно снижает сложность).
  • дополнительные удобные функции, такие как кроссплатформенная совместимость, ретро-совместимость (вы не рискуете, чтобы ваш бот больше не работал с игрой, когда выходит новое обновление игры) и т. Д.

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

Итак, приступайте к работе и сделайте нас лучшими ИИ-ботами за всю историю;)


Старый пост , описывающий технические проблемы разработки ИИ, основанные только на визуальных входах:

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

Первая проблема, как указывалось выше, заключается в представлении состояния игры : вы не можете представить полное состояние одним изображением, вам нужно поддерживать какое-то запоминание (здоровье, но также предметы экипировки и предметы, доступные для использования, квесты и цели и т. Д.). Чтобы получить такую ​​информацию, у вас есть два способа: либо получить прямой доступ к игровым данным, что является наиболее надежным и простым; или вы можете создать абстрактное представление этой информации, реализовав несколько простых процедур (открыть инвентарь, сделать снимок экрана, извлечь данные). Конечно, при извлечении данных из скриншота вы должны будете ввести какую-то контролируемую процедуру (которую вы определили полностью) или неконтролируемую (с помощью алгоритма машинного обучения, но тогда это значительно увеличит сложность ...). Для неконтролируемого машинного обучения вам нужно будет использовать совсем недавний вид алгоритмов, называемых алгоритмами структурного обучения (которые изучают структуру данных, а не то, как их классифицировать или предсказать значение). Одним из таких алгоритмов является Рекурсивная нейронная сеть (не путать с Рекуррентной нейронной сетью) Ричарда Сошера: http://techtalks.tv/talks/54422/

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

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

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

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

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

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

Удачи, и если это сработает, обязательно опубликуйте статью, вы наверняка прославитесь решением такой сложной практической задачи!

26 голосов
/ 01 июля 2011

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

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

Кроме того, существует проблема масштаба.Задача, которую вы предлагаете, просто слишком сложна, чтобы учиться в любое разумное времяВы должны увидеть aigamedev.com о том, как работает игровой ИИ.Искусственные нейронные сети успешно использовались в некоторых играх, но очень ограниченным образом.Игровой ИИ сложен и зачастую дорог в разработке.Если бы существовал общий подход к построению функциональных нейронных сетей, отрасль, скорее всего, воспользовалась бы им.Я рекомендую вам начать с гораздо более простых примеров, таких как крестики-нолики.

17 голосов
/ 03 июля 2011

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

http://code.google.com/p/bwapi/

1 голос
/ 20 января 2012

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

Тогда попробуйте придумать самый простой геймплей Diablo II, возможно, варвар.Затем сначала сделайте все просто, как в акте I, только в первой области.

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

После того, как вы решите эти отдельные, более «простые» задачи, вы можете использовать «основной» ANN, чтобы решить, какой подчиненный ANN активировать.

Что касается обучения, я вижу только три варианта: вы можетеиспользуйте эволюционный метод, описанный выше, но затем вам нужно вручную выбрать «победителей», если вы не написали для этого целую отдельную программу.Вы могли бы заставить сети «смотреть», как кто-то играет.Здесь они научатся подражать игроку или группе стилей игрока.Сеть пытается предсказать следующее действие игрока, получает подкрепление для правильного предположения и т. Д. Если вы на самом деле получаете ANN, то вы хотите, чтобы это можно было сделать с помощью видеоигры, нет необходимости в реальном живом геймплее.Наконец, вы можете позволить сети играть в игру, имея вражеские смерти, повышение уровня, восстановление здоровья и т. Д. В качестве положительного подкрепления и смерти игрока, потерянного здоровья и т. Д. В качестве отрицательного подкрепления.Но, видя, что даже простая сеть требует тысячи конкретных обучающих шагов для изучения даже простых задач, вам понадобится много терпения для этого.

В целом ваш проект очень амбициозен.Но я, например, думаю, что это «теоретически можно сделать», если уделить достаточно времени.

Надеюсь, это поможет и удачи!

1 голос
/ 04 июля 2011

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

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

1 голос
/ 01 июля 2011

Хорошо, если предположить, что в любой момент вы можете сгенерировать набор «результатов» (может включать вероятности) из набора всех возможных «ходов», и что в игре есть некоторое представление о последовательности (например, вы можете играть на уровне X). снова и снова), вы можете начать с N нейронных сетей со случайными весами, и каждая из них будет играть в игру следующим образом:

1) Для каждого возможного «движения» составьте список возможных «результатов» (с соответствующими вероятностями) 2) Для каждого результата используйте свою нейронную сеть, чтобы определить соответствующую «ценность» (балл) «результата» (например, число от -1 до 1, 1 - наилучший возможный результат, -1 - наихудший) 3) Выберите «ход», ведущий к наибольшему количеству проб *. 4) Если движение привело к «выигрышу» или «проигрышу», остановитесь, в противном случае вернитесь к шагу 1.

Через определенное количество времени (или «победа» / «проигрыш») оцените, насколько близка нейронная сеть к «цели» (это, вероятно, потребует знания предметной области). Затем отбросьте 50% (или какой-либо другой процент) NN, которые находятся дальше всего от цели, выполните кроссовер / мутацию верхних 50% и снова запустите новый набор NN. Продолжайте движение, пока не выйдет удовлетворительный NN.

...