Gym Retro / Stable-базовые линии не останавливают итерацию после выполнения условия

#python #artificial-intelligence #reinforcement-learning #openai-gym #stable-baselines

#python #искусственный интеллект #подкрепление-обучение #openai-gym #стабильные базовые показатели

Вопрос:

Я пытаюсь использовать Gym Retro и Stable-базовые уровни, чтобы обучить бота играть в Super Mario Bros. Кажется, все работает, за исключением того, что кажется, что среда на самом деле не завершается / не сбрасывается, когда должна. Размер файлов BK2, которые он записывает, превышает 500 КБ, преобразование в видео занимает около 20 минут, а видео длится около 2 часов. Само видео начинается примерно с трех минут игрового процесса с искусственным интеллектом, но после того, как оно теряет все три жизни, оно остается на титульном экране, пока не начнется воспроизведение демо. Я почти уверен, что демонстрация подбирается функциями вознаграждения, поэтому она мешает обучению. Я также обеспокоен тем, что это значительно замедляет обучение, поскольку ему приходится сидеть 2 часа дополнительного «игрового процесса». Вот как выглядит мой файл сценария:

 {
  "done": {
    "condition": "any",
    "variables": {
      "lives": {
        "op": "equal",
        "reference": -1
      },
      "time": {
        "op": "equal",
        "reference": 0
      }
    }
  },
  "reward": {
    "variables": {
        "xscrollHi": {
        "reward": 10
      },
      "playerx": {
        "reward": 0.1
      },
      "coins": {
        "reward": 10
      }
    }
  }
}
 

Я проверил с помощью инструмента пользовательского интерфейса интеграции, что переменные Done и Did-End переключаются на yes при выполнении любого из условий выполнения. И на всякий случай вот соответствующий код Python:

 env = DummyVecEnv([lambda: retro.make("SuperMarioBros-Nes", state="Level1-1.state", scenario="training", record="/gdrive/MyDrive/530_project")])
#model = PPO2(CnnPolicy, env, verbose=1)
for i in range(24):
  model = PPO2.load(filePath   "/"   fileName)
  model.set_env(env)
  model.learn(total_timesteps=time_steps, log_interval=1000, reset_num_timesteps=False)
  model.save(filePath   "/"   fileName)
  print("done with iteration ", i)
  del model 
 

Если вы хотите просмотреть весь блокнот Python, вот ссылка: https://colab.research.google.com/drive/1ThxDqjeNQh3rNEXYqlXJQ6tn3W2TPK7k?usp=sharing

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

Ответ №1:

Если кто-нибудь найдет это с этой проблемой, я вроде как нашел ответ. Я неправильно понял, что такое total_timesteps . Похоже, что на самом деле это ограничение по времени для каждого запуска. Я установил это примерно так, сколько времени требуется для истечения времени на одну жизнь, чтобы оно эффективно работало, но все равно немного подергано.

Ответ №2:

Вам не нужно загружать и удалять модель каждого эпизода. Временные интервалы в learn() соответствуют общим временным интервалам для обучения по всем эпизодам. Если вы хотите ограничить длину эпизода -> вы можете использовать TimeLimit оболочку gym.

ваш код может выглядеть следующим образом:

 from gym.wrappers.time_limit import TimeLimit
time_steps = 1000000
episode_length = 500

env = DummyVecEnv([lambda: TimeLimit('your_mario_env_config...', 
                                      max_episode_steps=episode_length)])
model = PPO2(CnnPolicy, env, verbose=1)
model.learn(total_timesteps=time_steps, log_interval=1000, reset_num_timesteps=False)
model.save(filePath   "/"   fileName)
 

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