Mas*_* Hu 3 deep-learning pytorch
我有一些 Pytorch 代码演示了 Pytorch 中的梯度计算,但我完全困惑计算了什么以及如何使用它。这篇文章演示了它的用法,但就反向传播算法而言,它对我来说没有意义。看看下面示例中 in1 和 in2 的梯度,我意识到 in1 和 in2 的梯度是损失函数的导数,但我的理解是更新还需要考虑实际损失值?损失值用在哪里?我在这里错过了什么吗?
in1 = torch.randn(2,2,requires_grad=True)
in2 = torch.randn(2,2,requires_grad=True)
target = torch.randn(2,2)
l1 = torch.nn.L1Loss()
l2 = torch.nn.MSELoss()
out1 = l1(in1,target)
out2 = l2(in2,target)
out1.backward()
out2.backward()
in1.grad
in2.grad
Run Code Online (Sandbox Code Playgroud)
反向传播基于计算导数的链式法则。这意味着梯度是从尾部到头部逐步计算的,并且总是传递回上一步(“前一个”相对于前一个前向传递)。
对于标量输出,通过假设启动该过程的梯度d (out1) / d (out1) = 1
来启动该过程。如果您调用backward
(非标量)张量,则需要提供初始梯度,因为它并不明确。
让我们看一个涉及更多步骤来计算输出的示例:
a = torch.tensor(1., requires_grad=True)
b = a**2
c = 5*b
c.backward()
print(a.grad) # Prints: 10.
Run Code Online (Sandbox Code Playgroud)
那么这里会发生什么呢?
d(c)/d(c) = 1
。d(c)/d(b) = 5
并乘以下游梯度(1
在本例中),即5 * 1 = 5
。d(b)/d(a) = 2*a = 2
并再次乘以下游梯度(5
在本例中),即2 * 5 = 10
。10
初始张量的梯度值a
。现在实际上这已经计算出来了d(c)/d(a)
,这就是它的全部内容。c
它是关于 的梯度a
,因此不使用“目标损失”的概念(即使损失为零,也不意味着梯度必须为零;这取决于优化器进入正确的(下坡)方向并在损失足够小时停止)。
归档时间: |
|
查看次数: |
1542 次 |
最近记录: |