【问题标题】:Loss does not decrease after modifying prediction with torch.floor()使用 torch.floor() 修改预测后损失不会减少
【发布时间】:2020-07-22 03:50:16
【问题描述】:

对于下面的代码,损失减少了。

loss_function=nn.MSELoss()
loss=loss_function(pred,label)

但是,如果我将 pred 更改为 floor 函数,损失将完全保持不变。我检查了opt.step()之后的参数,它们没有改变。

loss_function=nn.MSELoss()
loss=loss_function(torch.floor(pred),label)

为什么会发生这种情况? 我的猜测:这个torch.floor(pred) 操作破坏了计算图。其他“真正的”数学运算,例如 pred*3(例如)不会破坏计算图。

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    它没有破坏计算图,梯度为零,所以你的步骤没有效果。

    考虑下面显示的 floor(x) 图。请注意,该函数是不连续的,因此在技术上它在整数上是不可微的。此外,对于每个可微分点,它都是一个平面函数。 换句话说,导数为零几乎无处不在 PyTorch 只是简单地将 floor 的梯度指定为零,因为除了引发异常之外别无选择。这意味着,无论损失值如何,损失函数的梯度 w.r.t.您的参数将为零(遵循链式规则/反向传播)。因此,任何基于梯度下降的优化都不会影响模型参数。

    (图片来源:Wikipedia

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 2019-10-26
      • 2020-06-06
      • 1970-01-01
      • 2020-10-02
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多