我正在尝试在 stable-baselines3 中实现对 ppo 算法损失函数的补充。为此,我收集了状态 s(t-10) 和 s(t+1) 的额外观察结果,作为 rollout_buffer 的一部分,我可以在 ppo.py 中的 PPO 类的训练函数中访问它们。
我使用 3-layer-mlp 作为我的网络架构,需要第二层的输出供三元组(s(t-α), s(t), s(t+1))
使用它们来计算 L = max(d(s(t+1) , s(t)) − d(s(t+1) , s(t−α)) + γ, 0)
,其中 d 是 L2 距离。
最后我想将这个术语添加到旧的损失中,所以loss = loss + 0.3 * L
这是我的实现,从第 242 行的原始损失开始:
loss = policy_loss + self.ent_coef * entropy_loss + self.vf_coef * value_loss
###############################
net1 = nn.Sequential(*list(self.policy.mlp_extractor.policy_net.children())[:-1])
L_losses = []
a = 0
obs = rollout_data.observations
obs_alpha = rollout_data.observations_alpha
obs_plusone = rollout_data.observations_plusone
inds = rollout_data.inds
for i in inds:
if i > alpha: # only use observations for which L can be calculated
fs_t = net1(obs[a])
fs_talpha = net1(obs_alpha[a])
fs_tone = net1(obs_plusone[a])
L = max(
th.norm(th.subtract(fs_tone, fs_t)) - th.norm(th.subtract(fs_tone, fs_talpha)) + 1.0, 0.0)
L_losses.append(L)
else:
L_losses.append(0)
a += 1
L_loss = th.mean(th.FloatTensor(L_losses))
loss += 0.3 * L_loss
因此,对于 net1,我尝试使用第二层的输出来克隆原始网络。我不确定这是否是正确的方法。
我确实对我的方法有一些疑问,因为与没有添加术语相比,结果性能稍微差一些,尽管它应该会稍微好一些:
- 我获得 mlp 网络第二层输出的方法是否有效?
- 什么时候
loss.backward()
调用可以正确计算梯度(包括新术语)?