我有一些离线体验: (s, a, r, s') 是用启发式方法生成的。我想在训练 SAC 代理时使用这些。使用示例save_experiences准备我的数据在与 SAC 一起使用时会出现错误。这是一个colab,其中暴露了 pendulum-v0 环境的问题。我从错误消息中了解到,除了作为离线数据生成的体验之外,SAC 还期待一些“权重”(有时是“不”?!)。我可以在 SAC 中仅使用离线体验(s、a、r、s')吗?
谢谢。
我有一些离线体验: (s, a, r, s') 是用启发式方法生成的。我想在训练 SAC 代理时使用这些。使用示例save_experiences准备我的数据在与 SAC 一起使用时会出现错误。这是一个colab,其中暴露了 pendulum-v0 环境的问题。我从错误消息中了解到,除了作为离线数据生成的体验之外,SAC 还期待一些“权重”(有时是“不”?!)。我可以在 SAC 中仅使用离线体验(s、a、r、s')吗?
谢谢。
查看您共享的saving_experiences
文件,看起来当您将这些离线体验加载到rllib
中时,它会创建SampleBatch
对象,这就是在使用梯度方法训练代理时将数据呈现给代理(至少对于非策略代理)的方式。
“权重”是指样本的优先权重,将用于重要性采样加权的优先体验重放(如果有兴趣,请查看此处PrioritzedReplayBuffer
的课程)。如果您不太关心加权它们,您应该能够将它们全部设置为。1.0
您应该能够仅(s, a, r, s')
通过 SAC 使用离线体验,但是,您可能需要将数据格式化为适当的格式SampleBatch
,例如使用下面的代码片段:
from ray.rllib.policy.sample_batch import SampleBatch, MultiAgentBatch
# Initialize SampleBatch
rllib_batch_dict = {"obs": s, "actions": a, "rewards": r, "new_obs": s`,
"dones": np.array([False for i in range(len(s))],
"weights": np.ones((len(s)), "eps_id": episode_ids,
"unroll_id": episode_steps, "agent_index": np.zeros(len(s))} # Where your data is stored in (s, a, r, s`)
# Wrap your dictionary in a SampleBatch wrapper
rllib_batch = SampleBatch(rllib_batch_dict)
# If you still get errors, try wrapping this in a MultiAgentSampleBatch
marl_batch_dict = {"0": rllib_batch}
marl_batch = MultiAgentSampleBatch(marl_batch_dict)
对于“t”,我认为这只是情节中样本的时间步长,例如,如果是第一步,则为 0,如果是第二步,则为 1,依此类推。(s, a, r, s
也许您可以在创建)` 数据时跟踪这一点?
最后,不确定您是否需要这个,但您也可以尝试SampleBatch
手动创建一个,然后在MultiAgentSampleBatch
需要时将其包装在一个中。为此,您只需要遵循上面的代码,然后在创建SampleBatch
对象(实际上只是一个字典包装器)之前添加以下键/值对:
'obs'
-->s
'actions'
-->a
rewards
-->r
'new_obs'
-->s'
'dones'
--> 设置这些时间步是否标志着一个情节的结束'agent_index'
--> 0(如果是单代理,则需要索引)'eps_id'
--> 这是一个占位符剧集 ID(我认为它在训练期间从未使用过),可以设置为"0"
等"1"
。'unroll_id'
--> 这是步骤编号,例如0
,1
等。'weights'
--> 这些是重要性采样的权重。如果您不关心这一点,您可以将它们设置为1.0
.希望这有帮助,祝你好运!