【问题标题】:Understanding Gradient in Pytorch理解 Pytorch 中的渐变
【发布时间】:2019-08-27 20:28:36
【问题描述】:

我有一些 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

【问题讨论】:

    标签: deep-learning pytorch


    【解决方案1】:

    反向传播基于计算导数的链式法则。这意味着梯度是从尾部到头部逐步计算的,并且总是传递回上一步(“上一个”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 的梯度,因此没有使用“目标损失”的概念(即使损失为零也不意味着梯度必须是;这取决于优化器步入正确的(下坡)方向,一旦损失足够小就停止)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 2018-08-15
      • 2019-07-10
      • 2021-11-18
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多