Для чего нам нужно поле «метаданные» среды тренажерного зала?

#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 атрибут класса.