我有一些离线体验: (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'-->arewards-->r'new_obs'-->s''dones'--> 设置这些时间步是否标志着一个情节的结束'agent_index'--> 0(如果是单代理,则需要索引)'eps_id'--> 这是一个占位符剧集 ID(我认为它在训练期间从未使用过),可以设置为"0"等"1"。'unroll_id'--> 这是步骤编号,例如0,1等。'weights'--> 这些是重要性采样的权重。如果您不关心这一点,您可以将它们设置为1.0.希望这有帮助,祝你好运!