gpt4 book ai didi

deep-learning - 理解 Pytorch 中的梯度

转载 作者:行者123 更新时间:2023-12-05 03:01:46 25 4
gpt4 key购买 nike

我有一些 Pytorch 代码演示了 Pytorch 中的梯度计算,但我对计算的内容及其使用方式感到非常困惑。本帖here演示了它的用法,但就反向传播算法而言,它对我来说没有意义。查看下面示例中 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

最佳答案

反向传播基于计算导数的链式法则。这意味着梯度是从尾部到头部逐步计算的,并且总是传递回上一步(“上一步”w.r.t. 到前面的前向传递)。

对于标量输出,该过程通过假设梯度为 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.

那么这里发生了什么?

  1. 该过程使用 d(c)/d(c) = 1 启动。
  2. 然后将之前的梯度计算为 d(c)/d(b) = 5 并与下游梯度(在本例中为 1)相乘,即 5 * 1 = 5
  3. 再次将之前的梯度计算为 d(b)/d(a) = 2*a = 2 并再次与下游梯度相乘(5 在这个例),即 2 * 5 = 10
  4. 因此,我们得出初始张量 a 的梯度值为 10

现在实际上计算的是 d(c)/d(a),这就是它的全部内容。它是 c 相对于 a 的梯度,因此没有使用“目标损失”的概念(即使损失为零并不意味着梯度必须是;由优化器决定进入正确的(下坡)方向并在损失变得足够小时停止)。

关于deep-learning - 理解 Pytorch 中的梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55543786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com