python - 总和的梯度是否等于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
解决方案
我认为应该,这只是一个玩具示例
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.])
推荐阅读
- android - Android - Firebase 推送通知后端显示错误
- linux - 如何在 Linux 上构建同时构建 32 位和 64 位代码的 gcc 编译器
- unity3d - AR 对象与相机一起移动
- python - 尝试使用 Python 模块 (web3) 时出现“读取超时”错误
- sas - SAS 中的日期和间隔
- asp.net - 为 ASP.NET MVC 硬编码一个角色(外部数据库)并添加一个 Windows Authenticated Users
- azure-cognitive-search - Azure 搜索中搜索查询的执行时间/指标数据
- python - 暂停 GUI Python 程序
- linux - 在 sed 命令中使用变量
- java - 查找二进制 jat 的源 jar