我正在使用 stable_baselines3 库,当我发现一些我没有想到的东西时。
这里有一个简单的代码来重现该问题:
import gymnasium as gym
from stable_baselines3 import DQN
env = gym.make("CartPole-v1")
model = DQN("MlpPolicy", env, verbose=0, stats_window_size=100_000)
model.learn(total_timesteps=100_000)
看看最后一集奖励:
print(model.ep_info_buffer[-1])
{“r”:409.0,“l”:409,“t”:54.87983}
但是如果我使用以下代码评估模型:
obs, info = env.reset()
total_reward = 0
while True:
action, _states = model.predict(obs, deterministic=True)
obs, reward, terminated, truncated, info = env.step(action)
total_reward = total_reward + reward
if terminated or truncated:
obs, info = env.reset()
break
print("total_reward {}".format(total_reward))
总奖励196.0
我得到了不同的奖励,这是我没有预料到的。
我期望得到与 model.ep_info_buffer[-1] 中相同的 409。
为什么会有这样的差异? .ep_info_buffer 与每集奖励不同吗?
您正在将训练过程最后一集的奖励与使用训练模型的一集的奖励进行比较。最终的奖励可能会有所不同,因为:
(图片取自《强化学习:Barto 和 Sutton 的介绍》)
但是在训练之后,您将使用经过训练的模型来生成无需进行任何探索的剧集,因为您正在使用
deterministic=True
。即使您没有使用 deterministic=True
,它也不一定会像训练期间那样选择操作(例如,它可以在训练期间使用 ε-greedy,并且可能在预测期间使用 ε-soft)。
训练期间每集结束时环境重置的状态可能与您稍后使用
env.reset()
重置时获得的状态不匹配。稳定基线 API 似乎并不能对此做出任何保证,因此您不应该假设任何事情。在这种环境的情况下,似乎存在一些来自这里的随机性。
在某些情况下,环境本身是随机的。这意味着当您应用某个操作时,结果状态本身可能是不确定的。 CarPole-v1 环境似乎并非如此,但更一般地说,您不能假设所有环境都是相似的。