假设我有自定义损失函数,并且我想在神经网络的帮助下拟合某些微分方程的解。因此,在每次前向传递中,我都会计算神经网络的输出,然后通过采用 MSE 和我想要拟合感知器的预期方程来计算损失。
现在我的疑问是:我应该使用grad(loss)反向loss.backward()传播来计算和更新我的梯度吗?
我知道,在使用 loss.backward() 时,我必须用 Variable 包装我的张量,并且必须为我想要获取损失梯度的变量设置 require_grad = True 。
所以我的问题是:
grad(loss)还需要任何此类显式参数来识别梯度计算的变量?如果您能解释这两种方法的实际含义,那就更好了,因为每当我试图在网上找到它时,我都会被很多与我的项目不太相关的东西轰炸。
我无法理解grad_outputs中选项的概念含义torch.autograd.grad。
文档说:
\n\n\n\n
grad_outputs应该是一个长度匹配输出的序列,其中包含雅可比向量积中的 \xe2\x80\x9cvector\xe2\x80\x9d ,通常是每个输出的预先计算的梯度。如果输出不\xe2\x80\x99trequire_grad,则梯度可以是None)。
我发现这个描述相当神秘。雅可比向量积到底是什么意思?我知道雅可比行列式是什么,但不确定它们在这里意味着什么:元素方式、矩阵乘积,还是其他什么?我无法从下面的例子中看出。
\n为什么“向量”要加引号?事实上,在下面的示例中,当 是向量时我会收到错误grad_outputs,但当它是矩阵时则不会。
>>> x = torch.tensor([1.,2.,3.,4.], requires_grad=True)\n>>> y = torch.outer(x, x)\nRun 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.]),)\nRun 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)