#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 шагов.