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感谢您的解释!这回答了我的问题。尽管如此,对
向后
的精确计算有一个全面而深刻的数学定义是非常有帮助的。