我有一些离线经验:(s,a,r,s'),它们是由启发式生成的。我想在培训SAC代理时使用这些工具。在使用saving_experiences时,使用示例SAC准备数据时会出现错误。这是一个colab,其中的问题暴露在pendulum V0环境中。我从错误消息中了解到,SAC需要一些“权重”(有时是“不”?!)除了作为离线数据生成的体验之外。我能否仅使用SAC的离线体验(s,a,r,s')?
谢谢。
发布于 2021-03-08 03:33:48
看一下您共享的saving_experiences文件,当您将这些离线体验加载到rllib中时,它会创建SampleBatch对象,这是使用梯度方法训练代理时向代理(至少对于策略外代理)呈现数据的方式。
“权重”指的是样本的优先级权重,并将用于重要性采样加权优先级体验回放(如果感兴趣,请查看PrioritzedReplayBuffer类here )。如果您不太关心权重,您应该能够将所有这些都设置为1.0。
您应该能够使用具有SAC的(s, a, r, s')的离线体验,但是,您可能需要将数据格式化为适当的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' -->将这些设置为时间步长是否标记episode'agent_index'的结束--> 0(如果是单智能体,否则您将需要index)'eps_id' -->这是一个占位符剧集ID (我不认为在训练期间使用过它),可以设置为"0",etc.'unroll_id' -->这是步数,例如etc.'weights',"1",0 -->这些是重要性采样的权重。如果您不关心这一点,您可以将它们设置为1.0.希望这能帮到你--祝你好运!
https://stackoverflow.com/questions/65772439
复制相似问题