Breakout-v0, Breakout-v4, BreakoutNoFrameskip-v4和BreakoutDeterministic-v4的区别
-
v0
和v4
是环境执行输入action
的区别(即env.step(action)
):- 带有
v0
的环境会有25%
的概率执行上一个action
,75%
的概率执行输入的action
。 v4
表示100%
执行输入的action
,不会重复上一个action
。
- 带有
-
注意:以上解释仅适用于
atari
环境。在普通的cart-pole
等环境中,v0
与v1
等后缀的含义是根据环境而变化的。
NoFrameskip
和Deterministic
是环境输出下一帧画面时的区别(即obs, reward, done, info = env.step(action)
):- 带有
NoFrameskip
的env
表示没有跳帧,环境会顺序地输出游戏中的每一帧游戏画面。 - 带有
Deterministic
的env
表示每4
帧才输出一张游戏中的画面(即跳过3帧)。 - 游戏名后面什么都不带的(如
Breakout-v0
),会随机从(2, 5)
中采样一个跳帧数量。
- 带有
-
在训练
agent
时,如果想让环境跳帧,建议直接使用make_atari()
函数对环境进行包装 make_atari() 源代码。env = gym.make(env_id) assert 'NoFrameskip' in env.spec.id env = NoopResetEnv(env, noop_max=30) env = MaxAndSkipEnv(env, skip=4)
从源码中我们可以看出,该函数是先定义原始
atari
环境中带有NoFrameskip
的环境,然后使用atari_wrappers
中的MaxAndSkipEnv()
进行包装 (MaxAndSkipEnv() 源代码),包装后的env
便会执行跳帧操作。
此时,使用MaxAndSkipEnv()
包装后的环境在跳帧时,一个action
会被执行多帧(取决于跳帧数量),并且每帧获取的reward
也会被累加至下一次画面输出。
此外,跳帧时,输出画面是从每n帧
中的最后2帧
的像素值中的最大值
来组成一张图片(即比较最后2帧的每一个对应位置的像素值,然后取较大的那个像素)。因为在Atari游戏中,有些画面是仅在奇数帧出现的,因此要对最后两帧取最大值。
个人总结:不要轻易使用带有跳帧操作的原始环境,尽量使用NoFrameskip
的环境,然后使用make_atari()
进行包装,实现跳帧操作。此外,尽量使用v4
环境,减少执行action
的随机性。
参考链接
Atari游戏的图片预处理
Downsampling, FrameStack等技巧。
FrameStack 源代码 以及 英文原理讲解 , 中文原理解释