Объяснение настройки параметров Unity ML-агентов

искусственный интеллект Unity3D

Эта статья была впервые опубликована на:Уокер ИИ

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

Все содержание этой статьи относится к официальной документации Unity ML-агентов (адрес:GitHub.com/unity-tech N…

1. Настройки параметров обучения

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

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

Конкретный адрес документа:GitHub.com/unity-tech N…

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

2. Общие конфигурации тренажера

  • trainer_type: (default = ppo) Этот параметр определяет, какой алгоритм обучения агента используется.В настоящее время поддерживаются только Proximal Policy Gradient (PPO, в частности PPO2 версии OpenAI), Soft Actor-Critic (SAC) и MA-POCA. Первые два — это просто алгоритмы обучения с одним агентом. Примечание. После изменения алгоритма обучения не забудьте позже настроить соответствующие параметры. Для разных алгоритмов следующие параметры часто имеют разные области применения и не являются бесшовными. Это будет подробно объяснено ниже.

  • summary_freq: (default = 50000) Этот параметр определяет, через сколько шагов (шагов) мы начинаем записывать нашу тренировочную статистику.

  • time_horizon: (default = 64) Этот параметр определяет количество шагов, после которых собранные данные опыта будут помещены в буфер опыта. Это количество также определяет, сколько выборок шаг-пост используется для обучения ожидаемому вознаграждению за текущее действие. Проще говоря, чем больше это значение, тем ближе вы к истинному выигрышу эпизода и, следовательно, тем меньше отклонение. Но поскольку для обновления ожидаемого вознаграждения за действие требуется одна игра, этот процесс довольно длительный и может сильно различаться от игры к игре. Между раундами выполнение одного и того же действия может привести к совершенно разным преимуществам (поскольку действие на самом деле может вообще не иметь такого большого влияния на игру), что приведет к большей дисперсии. И наоборот, если число выбранных вами шагов слишком мало, окончательная оценка вознаграждения может иметь большое отклонение, но может привести к небольшой дисперсии. По сути, это то же самое, что классическая простая модель сложной модели (переоснащение и недообучение) в машинном обучении, которая требует баланса между дисперсией и смещением.Официальная рекомендация заключается в том, что, когда ваша среда слишком велика (выполнение шага занимает слишком много времени) или установленные вами награды относительно интенсивны, вы можете установить это значение ниже, в противном случае вам нужно увеличить его. Например, в задачах с очень редкими наградами, таких как футбольные матчи, значение параметра, установленное в примере документа, равно 1000.. Обратите внимание, что этот параметр определяет количество шагов выборки, а также связан с такими параметрами, как размер партии, размер буфера и эпоха. Связь между этими параметрами будет объяснена позже, когда эти параметры будут упоминаться.Общий диапазон: 32 - 2048

  • max_steps: (default = 500000) Этот параметр определяет, сколько шагов будет выполнено в этой обучающей задаче. Если у вас есть несколько агентов с одним и тем же действием, каждый из их шагов будет включен в общее количество шагов; аналогично, если у вас есть несколько сред, работающих на нескольких серверах параллельно, интеллект во всех средах Общее количество шагов, предпринятых принимается во внимание тело. Поэтому при параллельном обучении многоагентных алгоритмов обязательно установите это значение больше.Общий диапазон: 5e5 - 1e7

  • keep_checkpoints: (default = 5) Этот параметр определяет, сколько контрольных точек, сгенерированных во время обучения, сохраняется, каждая из которых генерируется после количества шагов checkpoint_interval.

  • checkpoint_interval: (по умолчанию =500000) Как упоминалось ранее, этот параметр определяет, через сколько шагов ваша модель будет хранить узел.

  • init_path: (по умолчанию = None) Этот параметр определяет, будет ли ваша модель продолжать обучение с ранее обученной точки хранения модели. Необходимо указать точное местоположение модели, скажем,./models/{run-id}/{behavior_name}. На самом деле, во время обучения достаточно использовать параметр --initialize-from CLI, чтобы разрешить всем задачам обучения продолжить обучение с одной и той же модели хранения. по одному обязательно).Редко используемый

  • многопоточный: (по умолчанию =false) Включите функцию многопоточности Python, чтобы сохранить модель во время обучения, чтобы ввод-вывод не занимал слишком много времени.Официальная рекомендация — максимально избегать использования этой функции, когда включена функция самостоятельного воспроизведения.

3. Далее идет подробная настройка некоторых общих гиперпараметров (гиперпараметров)

  • гиперпараметры → Learning_rate: (по умолчанию =3e-4), этот параметр определяет скорость обучения градиентного спуска. Когда значение слишком велико, обучение становится нестабильным (вознаграждение не может постоянно расти и часто сильно колеблется).Общий диапазон: 1e-5 - 1e-3

  • гиперпараметры → размер пакета: этот параметр определяет, сколько шагов (состояние, действие, вознаграждение...) кортежи состояния используются для обучения при каждом обновлении параметров.Примечание. Этот параметр всегда должен быть дробной частью от размера_буфера (поскольку на самом деле программа сначала разделит размер буфера на пакеты, равные размеру пакета. Таким образом, размер_буфера всегда должен делиться на размер_пакета).). Для обучающей задачи в пространстве непрерывного действия этот параметр должен быть установлен на уровне выше 1000 (поскольку в пространстве действия нужно как можно больше отсчетов для получения разных данных), если это дискретное пространство, то это значение часто устанавливается между от десятков до нескольких сотен (в зависимости от размера вашего поля действия).Общие диапазоны: (непрерывный — PPO) 512–5120; (непрерывный — SAC) 128–1024 (дискретный, PPO и SAC): 32–512.

  • гиперпараметры → размер буфера: (default = 10240 for PPO and 50000для САК). PPO: для алгоритма PPO программа не начнет цикл обучения, пока количество шагов в buffer_size не будет заполнено. Затем, как упоминалось выше, после сбора достаточного количества кортежей состояния buffer_size каждый раз мы делим состояние в буфере на пакеты buffer/batch_size, а затем выполняем обучение и обновление параметров для каждого пакета.Этот процесс повторяет эпоху (эпоха также является суперпараметром ) раз.Таким образом, после каждой выборки buffer_size параметры будут обновляться num_epoch * раз буфера/пакета.. Обычно больший размер буфера дает более стабильный результат обучения. SAC: для алгоритма SACОбычно пул опыта в несколько тысяч раз превышает продолжительность установленного эпизода, что позволяет тренироваться, используя как более старые, так и более свежие образцы. Общий диапазон: (PPO) 2048 - 409600, (SAC) 50000 - 1000000

  • гиперпараметры → Learning_rate_schedule: (по умолчанию =linear for PPO and constantдля SAC) Этот параметр определяет, следует ли использовать снижение скорости обучения для стабилизации обучения.Два дополнительных режима являются линейными и постоянными, первый будет линейно уменьшать вашу скорость обучения, последний не изменится.. Вообще говоря, чем больше скорость обучения, тем нестабильнее обучение, а чем меньше скорость обучения, тем дольше обучение не сходится. Поэтому, используя снижение скорости обучения, сначала используйте большую скорость обучения, чтобы быстро найти направление экстремальной точки, а затем постепенно уменьшайте скорость обучения, чтобы стабилизировать обучение вблизи экстремального значения без раскачивания вперед и назад.Официальная рекомендация — включить линейный режим для PPO и выполнить линейный декремент для достижения более высокой скорости сходимости. Для SAC рекомендуется поддерживать постоянную скорость обучения.

4. Далее вводятся гиперпараметры некоторых часто используемых сетевых моделей.

  • twork_settings → скрытые_юниты:(по умолчанию=128) Этот параметр определяет количество нейронов в скрытом слое вашей обучающей сети или его размерность. Размер этого значения определяет способность нейронной сети выражать игровое состояние. Проще говоря, большие скрытые слои, как правило, имеют лучшую выразительность для больших пространств наблюдения. Таким образом, это значение должно увеличиваться по мере увеличения размера пространства для просмотра.Общий диапазон: 32 - 512

  • network_settings → num_layers: (по умолчанию =2) Этот параметр определяет количество слоев в вашей обучающей сети. Чем выше число, тем глубже будет ваша модель. Хотя многослойное наложение может улучшить способность модели выражать окружающую среду. Однако чем глубже модель, тем лучше, слишком глубокие слои часто вызывают проблему исчезновения градиента и замедляют скорость обучения. Рекомендуется сначала увеличить hidden_unitys, а затем увеличить этот параметр.Общий диапазон: 1 - 3

  • network_settings → нормализовать: (по умолчанию =false) Этот параметр определяет, нормализует ли модель входные векторы наблюдения. Конкретная формула примерно (наблюдения - среднее) / стандартное отклонение, где среднее значение и стандартное отклонение - среднее значение и стандартное отклонение наблюдения соответственно. Официальная рекомендация заключается в том, что для сложных задач с непрерывным пространством действий использование нормализации может быть полезным, но использование нормализации для простых дискретных задач может иметь негативные последствия.

  • network_settings → vis_encode_type: (по умолчанию = простой)Этот параметр определяет структуру вашего кодировщика. Обратите внимание, что ppo или sac — это просто обучающая архитектура, при использовании ppo для разных задач требуются разные кодировщики. Например, в карточной игре вы можете обрабатывать все векторы наблюдения обычными полносвязными слоями, но если это экшн-игра, вашим наблюдением может быть картинка, то вам лучше использовать CNN в качестве кодировщика извлечения признаков. Этот параметр позволяет вам выбрать, какой кодировщик использовать.simple— двухслойная сверточная сеть;Nature CNNиспользоватьHuman Level Reinforcement LearningРеализация этой статьи **; в ресенте используется архитектура IMPALA RESNET**, которая характеризуется сильной способностью извлекать шаблоны и градиенты не так легко исчезают.match3Это структура CNN, более подходящая для карточных игр, которая характеризуется меньшей структурой, но может захватывать информацию о представлении пустого пространства.fully_connectedЭто однослойный полносвязный слой. Каждый метод кодирования имеет нижнюю границу минимального входного размера из-за соответствия требованиям размера ядра свертки. Например, простая минимальная поддержка 20 * 20; минимальная поддержка nature_cnn 36 * 36; минимальная поддержка повторной отправки 15 *.

15, минимальная поддержка match3 5*5, примечание:Использование match3 для обработки очень больших входных данных может замедлить обучение.

  • network_settings → contioning_type: (по умолчанию = гипер) Этот параметр определяет, использовать ли гиперсеть для обработки информации о цели задачи. Гиперсеть имеет много параметров, при использовании гиперсети уменьшите количество слоев скрытой сети.

5. Trainer-specific Configurations

Далее мы вводим специализированные параметры для различных алгоритмов обучения.

5.1 Конфигурации, специфичные для PPO (параметры, специфичные для PPO)

  • beta: (default = 5.0e-3)Этот параметр определяет силу члена регуляризации энтропии, который побуждает к изучению стратегий диверсификации. Проще говоря, энтропийная регуляризация обычно используется для обогащения нашей функции политики для изучения различных политик и действий.Мы используем расхождение KL для измерения сходства между новой и старой политиками и увеличиваем энтропию, чтобы сделать политику действий более случайной. Другими словами, чем больше бета-версия, тем больше поощряется исследование. Настройка этого параметра должна сочетаться с энтропией и вознаграждением в TensorBoard. Когда ваша энтропия падает, награда по-прежнему не улучшается, затем увеличьте бета-версию, чтобы энтропия сохранялась на некоторое время дольше.Общий диапазон: 1e-4 - 1e-2

  • epsilon: (default = 0.2)Этот параметр определяет скорость обновления политики. Этот параметр является диапазоном отсечения в документе ppo 2. Этот диапазон ограничивает диапазон отклонения каждого обновления параметра, чтобы гарантировать, что ppo может продолжать обучение, полагаясь на выборку важности в качестве метода политики. Можно обнаружить, что чем больше эпсилон, тем меньше изменяется параметр тета нашей старой стратегии. Это делает обучение более стабильным, но приводит к более медленной конвергенции.Общий диапазон: 0,1 - 0,3

  • lambd: (по умолчанию = 0,95) Согласно официальной документации, этот параметр определяет, насколько наш алгоритм зависит от предполагаемого значения вознаграждения и насколько зависит от фактического значения вознаграждения. На самом деле эта ламбада относится к лямбде гиперпараметра в методе GAE. Метод GAE является преимуществом, обычно используемым в градиентном спуске политики, который используется для обновления и управления величиной обновления политики в направлении градиента. Метод GAE представляет собой просто средневзвешенное значение TD(0), TD(1) до бесконечности TD (т. е. выборка методом Монте-Карло). Значение лямбда находится в диапазоне от 0 до 1. Когда лямбда равна 0, это оценка TD (0), а когда лямбда равна 1, это выборка Монте-Карло.Общий диапазон: 0,9 - 0,95

  • num_epoch: (по умолчанию = 3) Этот параметр определяет, сколько раз выполняется каждое обновление градиентного спуска. Подробности смотрите в разделе о размере буфера выше.Общий диапазон: 3 - 10

6. Reward Signals

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

6.1 Extrinsic Rewards

  • внешний → сила: (по умолчанию = 1,0) Этот параметр определяет силу сигнала вознаграждения внешней среды, полученного моделью.Общий диапазон: 1,00

  • внешний → гамма: (по умолчанию = 0,99) Этот параметр определяет скорость затухания долгосрочного вознаграждения. Проще говоря, присоединившаяся к нам модель получила вознаграждение в размере 100 на определенном шаге, так какой должна быть наша награда за предыдущий шаг? Если на предыдущем шаге нет другого вознаграждения, то наш доход на предыдущем шаге должен быть равен gamma * 100 = 99. Точно так же доход на предыдущем шаге равен gamma^2 * 100 и так далее. Интуитивно гамма близка к единице, поэтому более поздние выигрыши также могут быть связаны с более ранними действиями. С другой стороны, изучение стратегий действий будет больше зависеть от краткосрочных вознаграждений. Для заданий, в которых награды разрежены и для получения одной награды необходимо выполнить ряд действий, обязательно устанавливайте это значение ближе к единице, и наоборот.Общий диапазон: 0,8 - 0,995

6.2 Intrinsic Reward

  • любопытство → сила: (по умолчанию = 1,0) Этот параметр определяет силу вознаграждения за любопытство. Это соотношение необходимо отрегулировать до уровня, при котором вознаграждение за любопытство не перевешивает сигнал внешнего вознаграждения и не является слишком тривиальным по сравнению с внешним вознаграждением.Общий диапазон: 0,001 - 0,1

  • любопытство → гамма: (по умолчанию = 0,99) Как упоминалось ранее, этот параметр определяет скорость уменьшения будущих наград. См. выше.

  • любопытство → network_settings: этот параметр в основном используется для определения измерения скрытого уровня модели ICM. Ни слишком большой, ни слишком маленький. (64-256)

  • любопытство → скорость обучения: (по умолчанию = 0,99) Этот параметр определяет скорость обучения вашей модели ICM. Слишком большая скорость обучения приведет к нестабильному обучению, а слишком маленькая скорость обучения приведет к медленной сходимости.Общий диапазон: 1e-5 - 1e-3

7. Memory-enhanced Agents Using Recurrent Neural Networks

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

  • network_settings → memory → memory_size: (по умолчанию = 128)Этот параметр определяет размер скрытых слоев вашей сети LSTM. Это значение должно быть четным числом. Размер зависит от сложности вашего состояния. Лучше быть достаточно взрослым, чтобы научиться запоминать предыдущие ситуации.Общий диапазон: 32 - 256

  • network_settings → memory → sequence_length: (по умолчанию = 64)Этот параметр определяет, сколько раз ваша сеть памяти зацикливается RNN или длину последовательности. Чтобы иметь возможность тренироваться на таких длинных последовательностях, наш накопленный опыт также должен быть таким длинным. Так что, по моему мнению, этот параметр должен быть меньше, чем значение time_horizon, хотя в документе это ясно не сказано. Кроме того, если это число установлено слишком маленьким, то он может не запомнить слишком много вещей, и наоборот, если оно слишком велико, обучение будет очень медленным.

7.2 При использовании сети памяти необходимо обратить внимание на следующие моменты.

  • Сеть LSTM плохо работает с задачами непрерывного пространства действия, и официальная рекомендация состоит в том, чтобы больше использовать ее для задач дискретного пространства действия.

  • Добавление слоя RNN увеличит сложность нейронной сети, поэтому обязательно умеренно уменьшите количество слоев в нейронной сети.

  • Не забудьте установить memory_size равным четному числу.

8. Настройки параметров самостоятельного воспроизведения

Этот раздел самостоятельной игры необходимо использовать только во время состязательного обучения.Если есть только один агент или между несколькими агентами нет значимого взаимодействия, этот параметр не нужно устанавливать. Unity ml-agent также использует добавленный параметр самостоятельной игры, чтобы запустить собственный модуль обучения состязательности.

Ссылаться на(GitHub.com/unity-tech N…

  • Trainer_steps и призрачные шаги: Прежде чем понять параметр самостоятельной игры, нам нужно понять две концепции: train_steps и ghost_steps. В состязательном обучении нам часто нужно зафиксировать параметры некоторых агентов и позволить им выступать в качестве противников для обучения наших агентов определенным шагам.Тогда количество шагов, сделанных нашими обучающими агентами, равно train_steps, а количество шагов, сделанных этими противниками с фиксированными параметрами, равно ghost_steps, Почему эти два значения должны учитываться отдельно? Потому что некоторые игры не являются асимметричной тренировкой (асимметричная игра), например, когда мы тренируем сценарий 2 на 1, в это время обучающая команда состоит из 2 агентов, а противник может быть 1 агентом. В этом случае train_steps будет расти в два раза быстрее, чем ghost_steps,Потому что когда мы считаем шаги, мы всегда вычисляем сумму. После понимания этих двух понятий будет намного понятнее смотреть на следующие настройки параметров, иначе вы запутаетесь.

  • save_steps: это значение определяет наши обучающие агенты.Каждые шаги тренера save_steps будут хранить параметр текущей политики. Кроме того, если save_steps достаточно велико, например, мы изменили save_steps в предыдущем примере на 20480, то перед сохранением снимка параметры будут обновлены не менее 80 раз, так что кривая сложности между каждым снимком будет круче. , делая Нестабильность увеличивается с каждой тренировкой, но может привести к лучшим конечным результатам и повышению производительности при выполнении сложных задач.

  • team_change и swap_steps: Только что мы обсудили, что такое шаги тренера и шаги призрака. Теперь давайте посмотрим, как эти два значения определяют, как часто мы меняем наших противников во время состязательной тренировки. Параметр team_change — это параметр, определяющий, сколько раз мы хотим обучить один и тот же обучающий агент. Например, теперь у нас есть две команды, красная и синяя.Если мы установим team_change=10000, красная команда будет тренироваться 10 000 шагов тренера, прежде чем наступит очередь синей команды. А swap_steps определяет, сколько раз нам нужно менять соперников при смене команды. Используя приведенный выше пример, это снимок прошлого красной команды, сталкивающейся с несколькими разными синими командами во время этих 10 000 шагов тренера. Вот простая формула для расчета этого отношения,Предположим, что теперь мы установили смену команды на t, и тогда количество раз, которое мы хотим поменять противниками, равно x, и в нашей команде есть агенты a1, а в команде противника есть агенты a2, тогда наш swap_steps = (a2/a1) * ( t/x), если это симметричная игра, приведенную выше формулу можно упростить до t/x. Видно, что team_changes и swap_steps совместно определяют частоту смены противников.Чем выше частота, тем больше противников мы можем встретить с разными уровнями и стратегиями, как мы проанализировали ранее, чтобы узнать больше вещей. вызвало проблему нестабильности обучения и сложной сходимости параметров. Но политики, изученные каждым обучающимся агентом, могут быть более не ограниченными определенным противником, более общими и не подходящими.

  • play_against_latest_model_ratio: (default = 0.5) Этот параметр определяет вероятность того, что вы будете играть против вашей текущей модели. Чем более вероятно это значение, тем легче бороться с вашей текущей стратегией и тем меньше вероятность того, что вы будете бороться со своими прошлыми моментальными снимками.

behaviors:
  SoccerTwos: #游戏的名字
    trainer_type: ppo #选定使用何种训练算法
    hyperparameters: #PPO算法的超参数设置
      batch_size: 2048 
      buffer_size: 20480 # buffer大小必须是batch大小的整数倍,这里是十倍
      learning_rate: 0.0003
      beta: 0.005  #熵正则的超参数
      epsilon: 0.2 #PPO算法的clip范围
      lambd: 0.95  #GAE算法的lambda
      num_epoch: 8 #每次更新训练多少次
      learning_rate_schedule: linear #学习率衰减方式,这里是线性衰减
    network_settings: #处理observation信息的网络结构设置
      normalize: false 
      hidden_units: 256
      num_layers: 2
      vis_encode_type: simple 
    reward_signals: #奖励超参数设置
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5 #一共保留最近的五个checkpoint
    checkpoint_interval: 100000 #每100000个timestep保存一个checkpoint
    max_steps: 50000000 #最多训练这么多不(注意,这是多个agent加起来的值)
    time_horizon: 1000
    summary_freq: 5000 
    threaded: false # 是否使用线程,在使用self-play功能时最好关掉
    self_play: #self-play相关参数设定
      save_steps: 50000
      team_change: 250000
      swap_steps: 2000
      window: 10 #一共保留十个过去过去的snapshot
      play_against_latest_model_ratio: 0.5
      initial_elo: 1200.0 

PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!