zoukankan      html  css  js  c++  java
  • Bug: Torch.argmax() 导致梯度没有回传

    因为argmax函数不能求导,也就不会有梯度

    backward的反向传播的梯度到loss是终止了

    其实也很容易看出这个问题,如果最后一步使用了argmax,loss的属性 requires_grad=False,直接调用backward会提示你需要给loss增加梯度属性,但这“治表不治本 ”

    网上有两个ref参考

    https://discuss.pytorch.org/t/torch-argmax-cause-loss-backward-dont-work/64782/2

    https://discuss.pytorch.org/t/backpropagation-issue-when-using-argmax/100335/6

    以及 TORCH.TENSOR.GRAD 的文档 

    This attribute is None by default and becomes a Tensor the first time a call to backward() computes gradients for self. The attribute will then contain the gradients computed and future calls to backward() will accumulate (add) gradients into it.

    这段话说明了梯度的两个特点:一是第一次调用backward才会计算梯度,之前是None,二是梯度是可以累加的,如果没有手动清掉的话

    补充:

    知乎直接给我推了这个问题...: 怎么克服神经网络训练中argmax的不可导性

    不过通常来说还是loss设计有问题,比如我本该用回归loss用成了分类loss,才被迫使用argmax

  • 相关阅读:
    poj1862---变形虫(贪心)
    poj1833---字典序算法
    poj1799---解析几何
    poj1665
    poj1663---纯粹找规律
    poj1658
    poj1657---chessboard
    poj1656---数黑格子
    poj1617---columnar encryption
    查找两个文件的相同之处,不同之处
  • 原文地址:https://www.cnblogs.com/lfri/p/15552933.html
Copyright © 2011-2022 走看看