有没有办法在pytorch中使用外部损失函数?

时间:2017-07-22 20:00:18

标签: neural-network deep-learning reinforcement-learning pytorch

pytorch神经网络的典型骨架有一个forward()方法,然后我们根据前向传递的输出计算损失,然后对该损失调用backward()来更新渐变。如果我的损失是在外部确定的(例如在某些RL环境中运行模拟),该怎么办?我还能以这种方式利用这种典型的结构吗?

  • 这可能有点愚蠢,因为我们不再确切地知道每个输出元素对损失有多大影响,但也许有一些我不知道的诡计。否则我不确定神经网络如何与其他RL算法结合使用。

谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,我最容易从损失计算中抽象出前向传递(您的策略?)。这是因为(正如您所注意到的)在大多数情况下,您需要获取状态(来自您的环境),然后计算操作(基本上是前向传递),然后将该操作反馈给环境以获得奖励/损失来自你的环境。

当然,一旦计算出一个动作然后计算结果损失,你就可以在前向传递中调用你的环境。但为什么要这么麻烦?一旦你在你的环境中采取了几个步骤,直到你获得奖励/损失,它将变得更加复杂(尽管可能)。

我建议你看一下以下RL示例,了解openAI gym中政策渐变的应用:https://github.com/pytorch/examples/blob/master/reinforcement_learning/reinforce.py#L43

基本思想是:

  • 创建一个接受状态并返回的策略(作为{{1}}) 随机政策
  • 将策略的计算和策略中的操作采样包装到一个函数中。
  • 反复调用此功能以在您的环境中执行步骤,记录操作和奖励。
  • 一集完成后,注册奖励并立即执行反向传播和渐变更新。

虽然此示例特定于REINFORCE,但构造代码的一般概念适用于其他RL算法。此外,您还可以在同一个回购中找到另外两个示例。

希望这会有所帮助。