大家好。我正在努力通过两种实现方式来理解行为,并且希望有人能提供一些线索。 因此,我有2种算法:HER(具有一定自我监督功能的RL)和HAC(分层RL)。选择环境并放置。
HAC的工作原理的快速摘要:两个级别(高和低),高级别生成了目标(x,y,z),机器人末端执行器必须移动到该目标。低层以目标为目标对环境起作用。高级别每H步生成一个新目标。
在HER中,第一个历元的渲染看起来会随着缓慢的移动而变得平滑(例如故意探索) 在HAC中,仅执行50次迭代(1个时期= 2000次迭代)后,高级模型始终输出最大动作(1、1、1,-1、1)。知道是什么原因造成的吗? 经过更多的训练后,它开始输出其他动作,但大多数动作仍是最大的。它极大地阻碍了探索,并且显然无法收敛。 为了进行比较,HER在40分钟内收敛到> 80%的准确度。在48小时内,HAC有时会上升60%。 任何帮助是极大的赞赏。 使用的体系结构是DDPG或TD3(取决于我要使用的版本)。以下是一些有助于选择操作的代码:
mu_v = self.actor(states, goals)
actions = mu_v.data.detach().cpu().numpy()
actions += np.random.normal(0, self.max_action * self.expl_noise, size=actions.shape)
actions = np.clip(actions, self.action_clips[0], self.action_clips[1])
return actions
演员模型定义
class Actor(nn.Module):
def __init__(self, obs_size, goal_size, act_size, action_bounds, offset):
super(Actor, self).__init__()
self.net = nn.Sequential(
# state + goal
nn.Linear(obs_size + goal_size, HID_SIZE),
nn.ReLU(),
nn.Linear(HID_SIZE, HID_SIZE),
nn.ReLU(),
nn.Linear(HID_SIZE, HID_SIZE),
nn.ReLU(),
nn.Linear(HID_SIZE, act_size),
nn.Tanh()
)
self.action_bounds = nn.Parameter(action_bounds, requires_grad=False)
self.offset = nn.Parameter(offset, requires_grad=False)
def forward(self, state, goal):
return (self.net(torch.cat([state, goal], dim=1)) * self.action_bounds) + self.offset
我不知道要添加什么其他信息,但是随着人们提出问题,我将编辑此部分。非常感谢您的帮助!
答案 0 :(得分:0)
解决方案是增加tanh饱和度损失。基本上添加actor的预激活输出的L2范数。
actor_loss_v += self.hparams.action_l2 * logits.pow(2).mean()