相关疑难解决方法(0)

autograd.grad 和 autograd.backward 之间的区别?

假设我有自定义损失函数,并且我想在神经网络的帮助下拟合某些微分方程的解。因此,在每次前向传递中,我都会计算神经网络的输出,然后通过采用 MSE 和我想要拟合感知器的预期方程来计算损失。

现在我的疑问是:我应该使用grad(loss)反向loss.backward()传播来计算和更新我的梯度吗?

我知道,在使用 loss.backward() 时,我必须用 Variable 包装我的张量,并且必须为我想要获取损失梯度的变量设置 require_grad = True 。

所以我的问题是:

  • 是否grad(loss)还需要任何此类显式参数来识别梯度计算的变量?
  • 它实际上是如何计算梯度的?
  • 哪种方法更好?
  • 在实际场景中两者的主要区别是什么?

如果您能解释这两种方法的实际含义,那就更好了,因为每当我试图在网上找到它时,我都会被很多与我的项目不太相关的东西轰炸。

gradient backpropagation gradient-descent pytorch autograd

13
推荐指数
2
解决办法
7599
查看次数

PyTorch 的 torch.autograd.grad 中 grad_outputs 的含义

我无法理解grad_outputs中选项的概念含义torch.autograd.grad

\n

文档说:

\n
\n

grad_outputs应该是一个长度匹配输出的序列,其中包含雅可比向量积中的 \xe2\x80\x9cvector\xe2\x80\x9d ,通常是每个输出的预先计算的梯度。如果输出不\xe2\x80\x99t require_grad,则梯度可以是None)。

\n
\n

我发现这个描述相当神秘。雅可比向量积到底是什么意思?我知道雅可比行列式是什么,但不确定它们在这里意味着什么元素方式、矩阵乘积,还是其他什么?我无法从下面的例子中看出。

\n

为什么“向量”要加引号?事实上,在下面的示例中,当 是向量时我会收到错误grad_outputs,但当它是矩阵时则不会。

\n
>>> x = torch.tensor([1.,2.,3.,4.], requires_grad=True)\n>>> y = torch.outer(x, x)\n
Run Code Online (Sandbox Code Playgroud)\n

为什么我们会观察到以下输出;它是如何计算的?

\n
>>> y\ntensor([[ 1.,  2.,  3.,  4.],\n        [ 2.,  4.,  6.,  8.],\n        [ 3.,  6.,  9., 12.],\n        [ 4.,  8., 12., 16.]], grad_fn=<MulBackward0>)\n\n>>> torch.autograd.grad(y, x, grad_outputs=torch.ones_like(y))\n(tensor([20., 20., 20., 20.]),)\n
Run Code Online (Sandbox Code Playgroud)\n

然而,为什么会出现这个错误呢?

\n
>>> torch.autograd.grad(y, x, grad_outputs=torch.ones_like(x))  \n …
Run Code Online (Sandbox Code Playgroud)

pytorch autograd

8
推荐指数
1
解决办法
6374
查看次数