首页 > 解决方案 > Rllib 离线 SAC 的数据准备

问题描述

我有一些离线体验: (s, a, r, s') 是用启发式方法生成的。我想在训练 SAC 代理时使用这些。使用示例save_experiences准备我的数据在与 SAC 一起使用时会出现错误。这是一个colab,其中暴露了 pendulum-v0 环境的问题。我从错误消息中了解到,除了作为离线数据生成的体验之外,SAC 还期待一些“权重”(有时是“不”?!)。我可以在 SAC 中仅使用离线体验(s、a、r、s')吗?

谢谢。

标签: pythonrayrllib

解决方案


查看您共享的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对象(实际上只是一个字典包装器)之前添加以下键/值对:

  1. 'obs'-->s
  2. 'actions'-->a
  3. rewards-->r
  4. 'new_obs'-->s'
  5. 'dones'--> 设置这些时间步是否标志着一个情节的结束
  6. 'agent_index'--> 0(如果是单代理,则需要索引)
  7. 'eps_id'--> 这是一个占位符剧集 ID(我认为它在训练期间从未使用过),可以设置为"0""1"
  8. 'unroll_id'--> 这是步骤编号,例如0,1等。
  9. 'weights'--> 这些是重要性采样的权重。如果您不关心这一点,您可以将它们设置为1.0.

希望这有帮助,祝你好运!


推荐阅读