在训练像素分割神经网络(例如全卷积网络)时,您如何决定使用交叉熵损失函数与 Dice 系数损失函数?
我意识到这是一个简短的问题,但不太确定要提供哪些其他信息。我查看了一堆关于这两个损失函数的文档,但无法直观地了解何时使用其中一个。
在训练像素分割神经网络(例如全卷积网络)时,您如何决定使用交叉熵损失函数与 Dice 系数损失函数?
我意识到这是一个简短的问题,但不太确定要提供哪些其他信息。我查看了一堆关于这两个损失函数的文档,但无法直观地了解何时使用其中一个。
使用交叉熵而不是骰子系数或类似的 IoU 度量的一个令人信服的原因是梯度更好。
logits 的交叉熵梯度类似于,其中是 softmax 输出,是目标。同时,如果我们尝试将骰子系数写成可微分形式:或,那么得到的梯度 wrt会更难看:和。很容易想象和都很小的情况,梯度会爆炸到某个巨大的值。一般来说,训练似乎会变得更加不稳定。
人们尝试直接使用骰子系数或 IoU 的主要原因是实际目标是最大化这些指标,而交叉熵只是一个更容易使用反向传播最大化的代理。此外,Dice 系数通过设计在类不平衡问题上表现更好:
但是,通常只需通过为每个类分配损失乘数来解决类不平衡问题,这样网络就很容易忽略不经常出现的类,因此在这些情况下是否真的需要 Dice 系数尚不清楚。
我将从交叉熵损失开始,这似乎是训练分割网络的标准损失,除非有一个真正令人信服的理由使用 Dice 系数。
正如@shimao 和@cherub 所总结的那样,不能先验地判断哪一个在特定数据集上会更好地工作。正确的方法是尝试两者并比较结果。另外,请注意,当涉及到分割时, “比较结果”并不容易:基于 IoU 的度量(如骰子系数)仅涵盖分割质量的某些方面;在某些应用中,需要使用不同的测量方法,例如平均表面距离或Hausdorff 表面距离。如您所见,即使选择正确的质量指标也不是一件容易的事,更不用说选择最佳成本函数了。
我个人对骰子系数有很好的经验;当涉及到类不平衡时,它确实很奇怪(某些部分占用的像素/体素比其他部分少)。另一方面,训练误差曲线变得一团糟:它完全没有给我关于收敛的信息,所以在这方面交叉熵获胜。当然,无论如何,这可以/应该通过检查验证错误来绕过。
我建议您在面对类不平衡数据集时使用 Dice loss,例如,这在医学领域很常见。此外,Dice loss 在论文“V-Net:Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation”中被引入,并且在该工作中作者指出,Dice loss 在样本重新加权的情况下比 mutinomial 逻辑损失更有效