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

Pytorch 使用torch.floor()修改预测后,损失不会减少,pytorch,Pytorch,对于以下代码,损失将减少 loss_function=nn.MSELoss() loss=loss_function(pred,label) 但是,如果我通过floor功能更改pred,则损失保持完全不变。我在opt.step()之后检查了参数,它们没有改变 loss_function=nn.MSELoss() loss=loss_function(torch.floor(pred),label) 为什么会发生这种情况? 我猜:这个torch.floor(pred)操作破坏了计算图。其他“真

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

loss_function=nn.MSELoss()
loss=loss_function(pred,label)
但是,如果我通过
floor
功能更改pred,则损失保持完全不变。我在
opt.step()
之后检查了参数,它们没有改变

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

它不会破坏计算图形,梯度为零,因此您的步骤没有效果

考虑如下所示的楼层(x)图。注意,函数是不连续的,所以从技术上讲,它在整数上是不可微的。而且,对于每个可微的点,它都是一个平坦函数换句话说,几乎所有地方的导数都是零。PyTorch只是简单地将地板的坡度分配到所有地方都是零,因为除了提出一个例外,实在没有其他选择。这意味着,无论损失值如何,损失函数w.r.t.的梯度都将为零(遵循链式规则/backprop)。因此,任何基于梯度下降的优化都不会对模型参数产生影响

(图片来源:)