#reinforcement-learning #openai-gym
#обучение с подкреплением #openai-тренажерный зал
Вопрос:
Я заметил, что базовый класс Env
(из gym) содержит поле класса с именем metadata
. Это поле, по-видимому, используется для указания способа визуализации среды. Например, в случае среды metadata
FrozenLake определяется как
metadata = {'render.modes': ['human', 'ansi']}
Однако это свойство / поле metadata
никогда не используется в этом файле. Например, в этом же примере у render
метода есть параметр, в котором вы можете указать режим рендеринга (и render
метод даже не проверяет, что значение, переданное этому параметру, находится в поле metadata
class), поэтому я не уверен, зачем нам это metadata
поле.
Итак, зачем нам это поле metadata
? Используется ли оно для чего-то еще, кроме указания «режимов» рендеринга среды? Если да, то где?
Ответ №1:
Я постараюсь быть как можно более простым. Я провел несколько испытаний, и, насколько я понимаю, рендеринг имеет 2 режима, human
ansi
которые обрабатывают вывод на консоль.(прилагается скриншот моей консоли). В человеческом режиме (по умолчанию) выводом будут SFFF, FHFH с цветовой меткой текущего наблюдения (для удобства пользователя) … и т. Д., А в режиме ansi вы будете выводить байтообразные объекты, в которых не выполняется кодирование, декодирование или перевод новой строки, например nSFFF n x1b [41mF x1b[0mHFH.
Комментарии:
1. Это не объясняет, зачем нам нужно свойство класса
metadata
. Обратите внимание, что в моем ответе я говорю, что это свойство, по- видимому , никогда не используется внутри класса и что у методаrender
есть параметрmode
, который вы можете указать.
Ответ №2:
Прежде всего, я не являюсь сопровождающим / участником репозитория OpenAir gym. Поэтому все, что приведено ниже, взято из моего собственного расследования, поскольку я задавался тем же вопросом. Поэтому у команды OpenAI Gym были другие причины для включения свойства метаданных, кроме тех, которые я описал ниже.
TLDR
metadata
Атрибут описывает некоторую дополнительную информацию о среде тренажерного зала-классе, которая не нужна во время тренировки, но полезна при выполнении:
- Тесты на Python.
- Использование утилит тренажерного зала.
- Утилиты параллельного обучения.
- и т.д.
Более подробный ответ
Первое, на что следует обратить внимание, это то, что (в большинстве сред) metadata
атрибут определяется перед конструктором класса. Это означает, что это атрибут класса, который является общим для всех экземпляров класса. Это было сделано, поскольку оно не предназначено для использования во время тренировки, но хранит некоторую дополнительную информацию о классе среды, которую можно использовать в других тестовых или тренажерных утилитах (вот почему оно называется метаданными).
Я думаю, это можно увидеть, немного углубившись в кодовую базу и проверив, где используются метаданные. При поиске в коде мы видим, что метаданные среды frozen lake используются в двух местах:
Сценарий env_test
Здесь render.modes
метаданные используются в gym/envs/tests/test_env.py скрипт для проверки того, все ли возможные методы визуализации в данной среде работают должным образом:
for mode in env.metadata.get('render.modes', []):
env.render(mode=mode)
Сценарий video_recorder
Второе место, где render.modes
используются метаданные, — это gym/wrappers/monitoring/video_recorder.py . Здесь оно используется для проверки, доступен ли режим визуализации в среде тренажерного зала, который можно записать с помощью видеомагнитофона.
if 'rgb_array' not in modes:
if 'ansi' in modes:
self.ansi_mode = True
else:
logger.info('Disabling video recorder because {} neither supports video mode "rgb_array" nor "ansi".'.format(env))
# Whoops, turns out we shouldn't be enabled after all
self.enabled = False
return
Другим примером метаданных, которые здесь используются, являются video.frames_per_second
метаданные.
Другой возможный вариант использования
Как упоминалось выше, в большинстве сред метаданные определяются как атрибут класса. Делая это, мы можем убедиться, что если атрибут изменен в одном из экземпляров, все остальные экземпляры также знают об этом изменении. Это может быть удобно, когда вы, например, хотите использовать MPI для обучения агента в нескольких параллельных средах тренажерного зала одновременно. Вы могли бы, например, обновить частоту всех экземпляров сразу.
Заключение
Судя по приведенному выше исследованию, я думаю, что метаданные хранят дополнительную информацию о среде тренажерного зала-классе, которая не используется во время тренировки, но которая, например, может быть использована во время:
- Тесты на Python.
- Другие утилиты для тренажерного зала.
- Утилиты параллельного обучения.
- и т.д.
Вы, конечно, можете также хранить ту же информацию в виде отдельных атрибутов в экземпляре, но я думаю, что, поскольку она не используется во время обучения, правильнее хранить ее как metadata
атрибут класса.