有没有办法在pytorch中使用外部损失函数?
Is there a way to use an external loss function in pytorch?
pytorch 神经网络的典型骨架有一个 forward() 方法,然后我们根据前向传递的输出计算损失,并在该损失上调用 backward() 来更新梯度。如果我的损失是由外部决定的(例如通过某些 RL 环境中的 运行 模拟)怎么办?我还能以这种方式利用这种典型结构吗?
- 这可能有点愚蠢,因为我们不再确切知道每个输出元素对损失的影响有多大,但也许有一些我不知道的诡计。否则我不确定神经网络如何与其他 RL 算法结合使用。
谢谢!
在这种情况下,我认为从损失计算中提取正向传播(你的政策?)是最简单的。这是因为(正如您所注意到的)在大多数情况下,您需要(从您的环境中)获得一个状态,然后计算一个动作(本质上是前向传递),然后将该动作反馈给环境以获得奖励/损失从你的环境。
当然,一旦你计算了一个动作,你就可以在前向传递中调用你的环境,然后计算结果损失。但是为什么要打扰呢?一旦你在你的环境中采取几个步骤直到你获得奖励/损失,它会变得更加复杂(尽管可能)。
我建议您看一下以下 RL 示例,了解在 openAI gym 中应用策略梯度:https://github.com/pytorch/examples/blob/master/reinforcement_learning/reinforce.py#L43
基本思想是:
- 创建一个接受状态和 returns 的策略(作为
nn.module
)
随机策略
- 将策略的计算和策略中的动作采样包装到一个函数中。
- 重复调用此函数以在您的环境中采取步骤,记录操作和奖励。
- 一集结束后,注册奖励并仅在现在执行反向传播和梯度更新。
虽然此示例特定于 REINFORCE,但构建代码的一般思想适用于其他 RL 算法。此外,您会在同一存储库中找到另外两个示例。
希望这对您有所帮助。
pytorch 神经网络的典型骨架有一个 forward() 方法,然后我们根据前向传递的输出计算损失,并在该损失上调用 backward() 来更新梯度。如果我的损失是由外部决定的(例如通过某些 RL 环境中的 运行 模拟)怎么办?我还能以这种方式利用这种典型结构吗?
- 这可能有点愚蠢,因为我们不再确切知道每个输出元素对损失的影响有多大,但也许有一些我不知道的诡计。否则我不确定神经网络如何与其他 RL 算法结合使用。
谢谢!
在这种情况下,我认为从损失计算中提取正向传播(你的政策?)是最简单的。这是因为(正如您所注意到的)在大多数情况下,您需要(从您的环境中)获得一个状态,然后计算一个动作(本质上是前向传递),然后将该动作反馈给环境以获得奖励/损失从你的环境。
当然,一旦你计算了一个动作,你就可以在前向传递中调用你的环境,然后计算结果损失。但是为什么要打扰呢?一旦你在你的环境中采取几个步骤直到你获得奖励/损失,它会变得更加复杂(尽管可能)。
我建议您看一下以下 RL 示例,了解在 openAI gym 中应用策略梯度:https://github.com/pytorch/examples/blob/master/reinforcement_learning/reinforce.py#L43
基本思想是:
- 创建一个接受状态和 returns 的策略(作为
nn.module
) 随机策略 - 将策略的计算和策略中的动作采样包装到一个函数中。
- 重复调用此函数以在您的环境中采取步骤,记录操作和奖励。
- 一集结束后,注册奖励并仅在现在执行反向传播和梯度更新。
虽然此示例特定于 REINFORCE,但构建代码的一般思想适用于其他 RL 算法。此外,您会在同一存储库中找到另外两个示例。
希望这对您有所帮助。