在蒙特祖玛的复仇中模拟成功的轨迹被证明是不成功的

人工智能 强化学习 开放式 奖励 健身房
2021-11-08 03:23:26

我在 OpenAI 的健身房中编写了代码来模拟 Montezuma's Revenge 中的随机游戏,其中代理从动作空间中随机采样动作并尝试玩游戏。对我而言,成功定义为代理至少能够成功检索密钥(获得 100 的奖励)的情况。这种情况我转储到一个泡菜文件中。当我让它运行一天左右时,我得到了 44 个成功的案例。这是我用来生成训练集的代码:

import numpy
import gym
import cma
import random
import time
import pickle as pkl

env   = gym.make('MontezumaRevenge-ram-v0')

observation = env.reset()

#print(observation)
#print(env.action_space.sample())

obs_dict    = []
action_dict = []
success_ctr = 0

for i in range(0, 1000000):
    print('Reward for episode',i+1)
    done = False
    rew = 0
    action_list = []
    obs_list    = []
    while not done:
        action = env.action_space.sample()
        observation, reward, done, _ = env.step(action)
        action_list.append(action)
        obs_list.append(observation)

        rew += reward
        env.render()
        time.sleep(0.01)
        if done:
            env.reset()
            if rew > 0:
                success_ctr += 1
                print(action_list)
                action_dict.append(action_list)
                obs_dict.append(obs_list)
                pkl.dump(obs_dict, open("obslist.pkl", "wb"))
                pkl.dump(action_dict, open("action.pkl", "wb"))

    print(rew)
    time.sleep(1)

try:
    print(obs_dict.shape)
except:
    pass

print("Took key:", success_ctr)

我从生成的 pickle 文件中加载了成功案例,并使用这些完全相同的案例模拟了代理的播放。但是,代理从来没有收到 100 的奖励。我不明白为什么会这样。在网上搜索了一下,这可能是因为游戏中的噪音。所以,在运行每一集之前,我给了一个睡眠时间。不过,还是不行。有人可以解释为什么会这样吗?并建议一种我可以用来生成训练集的方法?

2个回答

time.sleep()这段代码到底有什么意义?我真的不明白,你只是停止执行程序0.01秒,这将如何影响模拟器?它不是并行运行的,它在您调用env.step函数时执行模拟的一个步骤并返回下一个状态和奖励。在这里调用 sleep 函数只会减慢程序的速度。

重复成功轨迹失败的原因可能是环境不是静止的。这意味着环境中有敌人或障碍物在移动。如果你只是重复一次成功的轨迹,一旦敌人和障碍物可能处于不同的位置,代理就会死亡。之所以第一次成功,是因为代理运气好。这些仍然是有效的学习轨迹,因为它们是成功的。代理应该学习为什么这些轨迹成功的原因(特征),而不是学习轨迹本身,因为如您所见,它们不能很好地概括。

由于环境中存在一些随机性,因此纯粹记住胜利的轨迹是行不通的。你必须记住每条轨迹才能让它发挥作用,而且它们的数量是无限的。

因此,您需要为您的学习模型添加某种偏差 - 即,当您的 pickle 文件中的观察结果与当前观察结果不匹配时该怎么办。

您当前的设置非常适合基于案例的推理 (CBR) 方法。CBR 的想法是你有一个观察-动作对的记忆库,当你看到一个新的观察时,你会查找记忆库,看看当前的观察是否以前见过。如果是这样,请执行该操作。有趣的部分是没有直接匹配的观察结果,但有一些是相似的。在这种情况下,您选择最相似的。可以通过多种方式计算相似度,并且取决于数据类型。本文将提供一个良好的开端:https ://alumni.media.mit.edu/~jorkin/generals/papers/Kolodner_case_based_reasoning.pdf