骰子系数损失函数与交叉熵

机器算法验证 神经网络 损失函数 交叉熵
2022-01-15 11:17:35

在训练像素分割神经网络(例如全卷积网络)时,您如何决定使用交叉熵损失函数与 Dice 系数损失函数?

我意识到这是一个简短的问题,但不太确定要提供哪些其他信息。我查看了一堆关于这两个损失函数的文档,但无法直观地了解何时使用其中一个。

3个回答

使用交叉熵而不是骰子系数或类似的 IoU 度量的一个令人信服的原因是梯度更好。

logits 的交叉熵梯度类似于,其中是 softmax 输出,是目标。同时,如果我们尝试将骰子系数写成可​​微分形式:,那么得到的梯度 wrt会更难看:很容易想象都很小的情况,梯度会爆炸到某个巨大的值。一般来说,训练似乎会变得更加不稳定。ptpt2ptp2+t22ptp+tp2t(t2p2)(p2+t2)22t2(p+t)2pt


人们尝试直接使用骰子系数或 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 逻辑损失更有效