首页 > 解决方案 > 总和的梯度是否等于pytorch中神经网络的梯度总和?

问题描述

假设我有下面的代码,我想计算 L 的雅可比,这是 Pytorch 中的神经网络做出的预测,L 的大小为 nx1,其中 n 是小批量中的样本数。为了避免L(n个条目)的每个条目的for循环来计算小批量中每个样本的雅可比,我发现一些代码只是将神经网络(L)相对于输入的n个预测相加,然后计算总和的梯度。首先,我不明白为什么总和的梯度与 pytorch 架构中每个样本的梯度总和相同。其次,我尝试了 sum 和 for 循环,结果不同。可能是由于数值近似还是因为总和没有意义?

代码如下,其中两个函数都属于 nn.module:

def forward(self, x):
        with torch.set_grad_enabled(True):
            def function(x,t):
                 self.n = n = x.shape[1]//2

                 qqd = x.requires_grad_(True)
                 L = self._lagrangian(qqd).sum()
                 J = grad(L, qqd, create_graph=True)[0]

        
def _lagrangian(self, qqd):
    x = F.softplus(self.fc1(qqd))
    x = F.softplus(self.fc2(x))
    x = F.softplus(self.fc3(x))
    L = self.fc_last(x)
    return L

标签: pythontensorflowneural-networkpytorch

解决方案


我认为应该,这只是一个玩具示例

w = torch.tensor([2.], requires_grad=True)
x1 = torch.tensor([3.], requires_grad=True)
x2 = torch.tensor([4.], requires_grad=True)
y = w * a + w * b
y.backward() # calculate gradient

返回

>>> w.grad
tensor([7.])

推荐阅读