Как обучить искусственную нейронную сеть игре в Diablo 2 с помощью визуального ввода?

139

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

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

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

Вот

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

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

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

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

ОБНОВЛЕНИЕ (27.04.12):

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

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

ОБНОВЛЕНИЕ (21.10.15):

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

зергилорд
источник
1
Ознакомьтесь с этой статьей. : D ri.cmu.edu/pub_files/pub2/pomerleau_dean_1992_1/…
zergylord 01
Большое различие между задачей о вождении в статье и в игре состоит в том, что в задаче о вождении визуальный ввод представляет собой достаточно полное представление состояния: если препятствие справа - поверните налево, если препятствие слева - поверните верно. Однако в игре вам часто приходится принимать решения, основываясь на вещах, которые не отображаются на экране. Каждый раз, когда вы входите в магазин, он может выглядеть одинаково, но вам нужно покупать разные предметы.
Don Reba
1
Насколько я помню, Diablo 2 использует легко извлекаемые листы спрайтов. Должно быть довольно просто привязать объекты (игрока, врагов и т. Д.) К списку связанных спрайтов. Это не решает проблему скрытия объектов друг от друга, но это только начало.
Райан Дженкинс,
@zergylord Было бы полезно, если бы вы могли сказать, насколько твердо вы хотите придерживаться своих критериев: а) играть в Diablo 2 и б) использовать пиксели, нарисованные на экране, в качестве вашего единственного источника ввода. Если вы хотите облегчить себе жизнь, думаю, вам придется немного расслабить одного (или обоих) из них - готовы ли вы это сделать?
Stompchicken 05
1
Голосование за закрытие слишком широкое.
Чиро Сантилли 郝海东 冠状 病 六四 事件

Ответы:

55

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

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

Я помню, что недавно кто-то пришел за советом по другому, но в чем-то похожему проекту . Стоит это проверить.

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

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

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

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

Карлфиллип
источник
43

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

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

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

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

  • OpenAI's Universe : платформа для практически любой игры с использованием машинного обучения . 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 ) .

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

болтливый
источник
27

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

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

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

Дон Реба
источник
Справедливо. Почти все, что напоминает сеть, можно назвать ИНС, но это вряд ли приведет к предметному обсуждению. :)
Don Reba
Хе да ... Мне следовало объяснить мою мотивацию более подробно. Я знаю, что есть более эффективные способы создания игровых ИИ, но я делаю это, чтобы расширить границы симулятора ИНС, который я обновлял. См .: stanford.edu/group/pdplab/pdphandbook
zergylord 01
1
В любом случае, Дон Реба прав, я тоже не думаю, что можно будет изучить стратегию чего-то вроде Diablo без включения большого количества предварительных знаний и извлечения полезных функций, на которых может быть основан подход обучения с подкреплением. На современных компьютерах будет очень сложно, если не невозможно, просто учиться на видеовходе.
ahans 01
18

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

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

тстрамер
источник
2

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

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

громкий
источник
2
Поскольку я знаком с игрой Diablo II, я могу сказать, что в ней используется 256 цветов (если в каком-то режиме не используется высокий или истинный цвет). Он также интенсивно использует спрайты для отображения различных объектов. Если вы можете извлечь некоторые спрайты (даже со скриншота), вы можете обучить свой инструмент распознавать объекты на основе спрайта (например, выпавшее «Незначительное лечебное зелье» всегда будет выглядеть одинаково). Однако, если я углублюсь в особенности Diablo II, возникнет и больше вопросов. Удачи
Ивайло Славов
1

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

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

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

тстрамер
источник
Ах, добавить GA в микс, интересно. К сожалению, поскольку у меня сеть фактически отправляет нажатия клавиш / движения мыши как действия, мне понадобится один физический компьютер на сеть>. <Другая проблема заключается в том, что пространство состояний среды не дискретно (ну, технически это так, но очень мелкое зерно). Например, представьте возможный результат, связанный с щелчком мыши: персонаж под управлением сети может двигаться или атаковать, но враги также могут двигаться, и в окружающей среде будут пиксельные отличия от таких вещей, как тени и погодные эффекты. .
zergylord 01
Что ж, с моей точки зрения, с нейронной сетью можно сделать очень много. Похоже, что в лучшем случае его можно было бы использовать как обучаемую эвристическую функцию некоторого понятия дискретного пространства состояний. Чтобы учесть изменчивость противника, вам, вероятно, придется использовать какую-то другую эвристику, а затем вы могли бы использовать ее для создания набора возможных состояний результата для каждого хода с соответствующими вероятностями. Кроме того, пока существует статическое представление о начальной и конечной конфигурации, вы можете просто запускать каждую нейронную сеть по очереди.
tstramer 01
1

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

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

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

Как только вы позаботитесь об этих отдельных, «более простых» задачах, вы можете использовать «главную» ИНС, чтобы решить, какую вспомогательную ИНС активировать.

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

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

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

Винсент Кортеманш
источник