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

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

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

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

here

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

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

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

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

ОБНОВЛЕНИЕ (04/27/12):

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

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

ОБНОВЛЕНИЕ (10/21/15):

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

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

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

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