0

我正在尝试在 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,我尝试使用第二层的输出来克隆原始网络。我不确定这是否是正确的方法。

我确实对我的方法有一些疑问,因为与没有添加术语相比,结果性能稍微差一些,尽管它应该会稍微好一些:

  1. 我获得 mlp 网络第二层输出的方法是否有效?
  2. 什么时候loss.backward()调用可以正确计算梯度(包括新术语)?
4

0 回答 0