Skip to main content

Использование вложений в OpenAI Five

Автор статьи - Tambet Matiisen, ссылка на оригинал: THE USE OF EMBEDDINGS IN OPENAI FIVE. Перевод опубликован с разрешения автора.

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

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

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

Какие вложения?

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

вложения

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

word_vectors

Изображение предоставлено: Mikolov et al. 2013. Лингвистические закономерности в представлении слов в непрерывном пространстве.

Сеть OpenAI Five

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

network_architecture_augmented

Изображение предоставлено: OpenAI.

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

Верхняя часть сети на рисунке обрабатывает наблюдения. Он объединяет данные из разных источников и передает все в одну ячейку LSTM. Выход этой ячейки LSTM используется нижней частью сети для создания действий. Короче говоря, это так просто - обрабатывать наблюдения, передавать их в LSTM и производить действия. Конечно, дьявол кроется в деталях, и это то, что мы собираемся рассмотреть в следующих разделах.

Вложения в наблюдения

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

image5
image6

Изображение предоставлено: OpenAI.

Следующая диаграмма суммирует обработку, примененную к атрибутам одной единицы.

image10

Изображение предоставлено: OpenAI.

В левом верхнем углу вы видите, что каждая единица закодирована как вложение. Это полностью имеет смысл, потому что каждый из 116 героев Dota 2 может быть классифицирован по-разному:

  • Основной признак: сила, ловкость, интеллект.
  • Тип атаки: дальний или ближний.
  • Роль: перенос, блокировка, поддержка полосы движения, инициатор, джанглер, поддержка, долговечность, нукер, толкатель, побег.

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

Но вложения используются не только для типов юнитов, они также используются для модификаторов, способностей и предметов.

image11

Изображение предоставлено: OpenAI.

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

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

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

image12

Изображение предоставлено: OpenAI.

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

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

Вложения в действия

Пространство действий Dota 2 оценивается в 170 000 различных действий. Это включает в себя обычные действия, такие как перемещение и атака, но также использование способностей, использование предметов, улучшение вашей статистики и так далее. Не все действия доступны на каждом временном шаге - возможно, у вас еще нет этой конкретной способности или предмета в вашем инвентаре. Тем не менее есть примерно 1000 различных действий, которые вы могли бы потенциально использовать. Кроме того, многие из этих действий имеют параметры, такие как область, куда вы хотите переместиться, или враг, на которого вы хотите нацелиться. Опять же, у OpenAI есть хорошая визуализация пространства действий в их блоге.

image1
image9

Изображение предоставлено: OpenAI.

Это создает огромную проблему исследования для RL, потому что первоначально агент начинает с попытки случайных действий. Наивным подходом будет вывод результатов для всех 170 000 действий и ограничение softmax до 1000 активных в настоящее время действий. Но OpenAI решил это аккуратно с помощью вложений и softmax переменной длины.

image4

Изображение предоставлено: OpenAI.

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

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

u= (0, -190)
v= (190, 0)

dot product:
uv=iuivi= 0

cosine similarity:
cosθ=uv||u||||v||= 0

cosine distance:
1cosθ= 1

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

Я представляю, как на самом деле работает выбор действий, так это то, что LSTM создает нечто, что в принципе можно было бы назвать «вектором намерений». Например, если вы находитесь в затруднительном положении и у вас действительно низкий уровень здоровья, то это будет что-то вроде «убирайся отсюда». Это намерение сопоставляется с доступными действиями и дает высокий балл, если оно соответствует одному из действий. Например, оба действия «перемещение» и «телепорт» могут быть хорошо согласованы с намерением «убраться отсюда». Телепорт может быть немного лучше выровнен, потому что вас не может преследовать враг, поэтому он дает более высокий счет и более высокую вероятность после softmax. Но если телепортация в данный момент недоступна, тогда это вложение не соответствует и «перемещение» имеет, вероятно, наивысшую оценку и вероятность.

Некоторые действия имеют параметры, такие как назначение или цель. Все они смоделированы простым способом с Softmax. Например, координаты X и Y дискретизируются в диапазоны вместо использования непрерывных выходов и гауссовского распределения. Я предполагаю, что softmax лучше обрабатывает мультимодальные дистрибутивы . Важным наблюдением здесь является то, что результаты действия, по-видимому, не моделируют совместное распределение между действием и его целью. Я считаю, что это не проблема, потому что все выходы действия обусловлены выходом LSTM. Поэтому вывод LSTM уже кодирует «намерение», и эти уровни FC просто декодируют различные аспекты этого «намерения» - действие и его цель.

Но моя любимая часть - то, как OpenAI Five управляет таргетингом. Помните те странные кусочки из результатов наблюдений юнитов? Они представлены синим цветом на диаграмме, что означает, что они на единицу. Эти векторы называются «ключами внимания юнитов» и соответствуют «намерению» LSTM производить оценки для каждого юнита. Эти баллы проходят через softmax и определяют юнит для атаки. Снова softmax принимается за наблюдаемые единицы, так же, как действие softmax принимается за доступные действия.

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

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

Заключительные слова

После анализа сети OpenAI Five становится ясно, что большая часть сети предназначена для восприятия (предварительной обработки наблюдений) и управления двигателем (декодирования действий). Вся стратегия и тактика должны лежать в одном месте - LSTM из 1024 единиц.

image8

Изображение предоставлено: OpenAI.

Я думаю, что удивительно, что одна относительно простая математическая конструкция может производить такое сложное поведение. Или, я не знаю, может, это говорит о сложности игры в Dota 2? Краткосрочная тактика в сочетании с быстрым временем реакции побеждает долгосрочную стратегию?

Спасибо Яану Ару, Танелю Пярнамаа, Роману Рингу и Даниэлю Майоралу за глубокие комментарии и обсуждения.