我目前正在 Pytorch 中构建一个需要多个自定义层的模型。我只定义了前向方法,因此没有定义后向方法。该模型似乎运行良好,并且优化器能够使用各层的梯度进行更新。然而,我看到很多人定义了落后的方法,我想知道我是否遗漏了一些东西。
为什么您可能需要定义向后传递?
在极少数情况下,您应该在 PyTorch 中实现自己的后向函数。这是因为 PyTorch 的 autograd 功能负责计算绝大多数操作的梯度。
最明显的例外是
您有一个不能表示为其他可微函数的有限组合的函数(例如,如果您需要不完整的伽马函数,您可能需要编写自己的前向和后向函数,使用 numpy 和/或查找表)。
您希望加快特别复杂表达式的计算速度,在应用链式法则后可以大大简化梯度。
对于前向前向算法或局部贪婪监督等局部学习方法,有必要禁用完全后向传递(即回到模型输入)。然而,大多数局部学习方法使用缩短的(单层)后向传递来计算相对于前一层输出的逐层梯度。