Python PyTorch autograd:自定义函数梯度的维数?
问题摘要:在自定义函数的向后传递中,输入和输出的维度是如何处理的? 根据,自定义函数的基本结构如下所示:Python PyTorch autograd:自定义函数梯度的维数?,python,pytorch,autograd,Python,Pytorch,Autograd,问题摘要:在自定义函数的向后传递中,输入和输出的维度是如何处理的? 根据,自定义函数的基本结构如下所示: class MyFunc(torch.autograd.Function): @staticmethod def forward(ctx, input): # f(x) = e^x result = input.exp() ctx.save_for_backward(result) return result @st
class MyFunc(torch.autograd.Function):
@staticmethod
def forward(ctx, input): # f(x) = e^x
result = input.exp()
ctx.save_for_backward(result)
return result
@staticmethod
def backward(ctx, grad_output): # df(x) = e^x
result, = ctx.saved_tensors
return grad_output * result
对于单个输入和输出维度,这是非常好的,工作起来很有魅力。但对于更高的维度,向后传递变得令人困惑。显然,PyTorch只接受向后
的结果,该结果与向前
的结果具有相同的维度(对于相同的输入)。返回错误的形状会产生运行时错误:函数MyFunc在索引0处返回无效的渐变-得到[*],但预期形状与[*]
兼容。所以我想知道:反向计算实际上是什么?
它不是一个雅可比矩阵?例如,当我有一个函数f(x)=(f_1(x_1,…,x_n),…,f_k(x_1,…,x_n))
带有n
输入和k
输出,我希望梯度计算会产生一个维度k*n
的雅可比矩阵。然而,PyTorch实现只需要一个维度n
的向量。那么,向后的结果实际上意味着什么,它不可能是雅可比矩阵
它不处理批次吗?此外,如果我想通过此函数推送一批输入向量,例如批量大小为b
的维度b*n
的输入,该怎么办。然后,期望梯度也具有形状b*n
,而不是类似b*k*n
。它甚至打算考虑用自定义函数处理批处理吗?
这些问题似乎都没有在手册中提到,而且提供的答案非常简单,根本没有帮助。可能隐藏在某个地方的公式更详细地解释了所提供的
函数接口的背景,但我还没有找到它们。它不存储/返回雅可比矩阵(我想这与内存有关)
从训练的角度来看,我们不需要雅可比矩阵来更新参数/进一步反向传播
对于更新参数,我们只需要dL/dy_j
,j感谢您的解释!这回答了我的问题。尽管如此,对向后
的精确计算有一个全面而深刻的数学定义是非常有帮助的。