pkuCactus / BDCN

The code for the CVPR2019 paper Bi-Directional Cascade Network for Perceptual Edge Detection
MIT License
345 stars 75 forks source link

关于损失形式的一个疑惑 #47

Closed lartpang closed 3 years ago

lartpang commented 3 years ago

您好。机缘巧合看到您的论文。在阅读其中的损失相关的内容的时候,我思考了这样一个问题:

本文的设计期望不同的尺度可以生成具有差异性的预测效果。 公式4中的分析是基于预测结果直接相加后得到的整体预测与原始真值计算损失的情况。这种情况下,各层之间的梯度是没有差异的。应为毕竟是权重为1的加和。如果这里使用带权重的加和,那么梯度也就不一样了。指定的权重则成了为比例值。 但当我看到后面给出的新损失的计算形式,即公式9的时候,我觉得,这里公式4所假设的情况,似乎并不是最合适。作为对比,更合适的应该是分开计算损失后加和的形式。 后者的计算实际上涉及到两种可能,即需要考虑各层真值的构造方式。

  1. 如果仅仅利用其它层的预测值并截断梯度的话,那么各层的真值不同,就可以获得更近似于本文需求的监督状态。
  2. 如果对其它层的梯度仍然保留的话,那情况就更复杂了。对于一层的预测,其梯度不仅和当前层预测有关,和其它层的预测同样相关。 按照后文使用交叉熵损失时,那么其它层对当前层预测的梯度,就需要通过其它层损失对各层真值部分求偏导数获得(这里的真值实际上是非二值的,因为利用了其它层的预测图来近似构造)。这与当前层损失直接对预测部分偏导形式不同(当前层损失通过链式法则,从本层的近似真值传递的梯度是无法流向本层的预测的)。所以显然,不同层的梯度同样是不同的。

不知思考是否正确,希望得到您的解答。

pkuCactus commented 3 years ago

您好,非常高兴你对我们的工作感兴趣,也提出了很有见解的问题。你的理解1是正确的,正如我们在文章中分析的一样,对于公式4我们对于每一层计算的梯度都是一样的,为了解决这个问题,我们提出了公式5的计算方式,并且其它层的结果在后面计算损失函数的时候会进行detach,也就是每层都只是利用其它层的预测结果,而不会对他们进行梯度计算,从而实现对每层实施层特定的监督。

lartpang commented 3 years ago

OK,感谢您的回复解答了我的疑惑!

我找到了代码中的这部分,是直接将detach后的其它层预测加到了特定层的输出来构造输出,同时使用原始的的真值监督。

https://github.com/pkuCactus/BDCN/blob/2c81e7370579bcf3f7fa6def2ac5a798a108952f/bdcn.py#L165-L176