使用torch.floor()修改预测后,损失不会减少

时间:2020-07-21 17:41:35

标签: pytorch

对于以下代码,损失减少。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这不会破坏计算图,渐变为零,因此您的步骤无效。

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

enter image description here (图片来源:Wikipedia