语义分割不平衡数据的损失函数
医学类影像的语义分割为何使用Tversky及Focal Loss等,mIOU为什么不能作为损失函数。
前言
近期在做Kaggle的 CZII 竞赛,按照以往的经验,觉得损失函数是一个重要的部分。以前没仔细探究过如何按照指定指标设计损失函数。
什么是不可微,什么是平滑函数?
这一次是一个语义分割损失函数入门,或许你也会得到一些启发设计出自己的损失函数。
Tversky Loss
Tversky Loss 是 Dice Loss 的一种推广形式,专门用于处理语义分割任务中的类别不平衡问题。它引入了两个参数 α 和 β,用于对假阳性(False Positives, FP)和假阴性(False Negatives, FN)赋予不同的权重:

- True Positives (TP):预测与真实分割区域的重叠部分。
- False Positives (FP):预测超出真实区域的部分。
- False Negatives (FN):真实区域中未被预测到的部分。
- 参数 α 和 β 控制 FP 和 FN 的相对重要性:
Tversky Loss 如何解决类别不平衡问题:
- 在分割任务中,小区域(如肿瘤、病变)通常比背景像素数量少得多。通过调整 α 和 β,Tversky Loss 可以更关注减少小区域的 FN 或 FP,避免少数类被多数类(如背景)淹没。
Focal Loss:
Focal Loss 专为分类和分割任务中的类别不平衡问题设计,它通过减少易分类样本对损失的贡献来解决该问题:

- pt:模型对真实类别的预测概率。
- γ:聚焦参数,用于控制对易分类样本的惩罚力度。
- α:类别平衡因子(可选)。
当 γ>0时,(1−pt)^γ 会减少易分类样本(pt≈1)对损失的贡献,使模型更关注难分类样本(pt≈0)。
Focal Loss 如何解决类别不平衡问题:
- 多数类通常在训练中占主导地位,因为它们的预测更容易分类。Focal Loss 通过减少这些易分类样本的损失贡献,使模型优先学习难分类(少数类)区域。
解决语义分割中类别不平衡问题的常见方法
- 损失函数的选择:
- 使用类别加权损失函数,例如加权交叉熵或 Dice Loss。
- Tversky Loss 和 Focal Loss 对于强调少数类非常有效。
- 数据增强:
- 通过随机裁剪、翻转或合成数据增加少数类的样本数量。
- 针对少数类区域进行特定的增强,以提高模型的鲁棒性。
- 基于小块的训练:
- 将模型训练在更小的图像块上,而不是整幅图像,确保每个块内的类别分布更平衡。
- 类别平衡:
- 按类别频率的倒数对损失进行加权。
- 使用过采样或欠采样方法,确保少数类在训练中有足够的代表性。
- 模型结构改进:
- 引入注意力机制或多尺度特征提取模块,捕获少数类的细节信息。
- 后处理:
- 使用条件随机场(CRF)或其他平滑技术优化少数类的预测结果。
一些不能用作损失函数的评估指标
某些评估指标虽然在分割性能评估中非常常用,但不能直接作为损失函数,因为它们不可微且无法产生梯度。例如:
- 平均交并比(mIoU):
- 计算预测分割与真实分割的重叠比例。
- 由于涉及离散集合操作(如交集和并集),无法进行梯度计算。
- 像素准确率:
- 计算正确分类像素的比例。
- 对部分重叠不敏感,且二分类结果无法定义梯度。
- Hausdorff 距离:
- 评估预测边界与真实边界之间的最大距离。需要非可微操作(如最大值和最小值计算)。
为什么某些函数不可微?(无法作为Loss)
可微性 是指函数在某点是否存在导数。如果函数在某点的导数不存在,则称该函数在该点不可微。不可微的原因通常有以下几种:
1. 函数在某点不连续
如果函数在某点不连续,那么它一定不可微。例如:

函数在 x=0 不连续,因此不可微。
2. 函数在某点有尖锐拐角
如果函数在某点存在尖锐的拐角(斜率发生突变),则在该点不可微。例如,绝对值函数 f(x)=∣x∣ 在 x=0 的图像有一个尖角,其导数左右极限不相等:

左右导数不相等,因此在 x=0不可微。
3. 函数在某点的斜率趋于无穷大
如果函数在某点的斜率趋于无穷大(即导数不存在有限值),则函数在该点不可微。例如:

在 x=0 处的导数趋于无穷,因此不可微。
4. 离散操作导致不可微
某些函数涉及离散操作(例如取整、最大值、最小值),这些操作在数学上通常不可微。例如:
- max(a,b)
- round(x)
- argmax(x)
这些函数在定义上没有平滑的导数。
示例为什么 mIoU(Mean Intersection over Union)不可微?
在语义分割中,mIoU(Mean Intersection over Union) 是一个常用的评价指标,用于衡量预测结果与真实标签的重叠程度。它定义如下:

其中:
- TPc:类别 c 的真正例(True Positives)。
- FPc:类别 c 的假正例(False Positives)。
- FNc:类别 c 的假负例(False Negatives)。
- mIoU:对所有类别 C 的 IoU 的平均值:

为什么 mIoU 不可微?
mIoU 是基于 离散计数 的指标,主要由 TP、FP、FN 的值决定,而这些值是离散的,因此 mIoU 本质上是不可微的。
具体原因如下:
- 离散操作的不可微性mIoU 的计算依赖于离散的预测类别(例如,通过 argmax 获取预测类别),这种离散操作会导致函数不可微。预测值 y^hat 通常是连续概率分布(通过 softmax 得到),而通过 argmax 转化为离散标签时,argmax 不可微,因为它在输入上没有连续的梯度变化。离散的 TP、FP、FN 是基于像素计数的结果,不具有梯度。
- 分段不连续性mIoU 的值会因为像素的预测结果发生剧烈变化。例如,如果一个像素的预测从错误变为正确(假负转为真正例),TP、FP、FN 会突然跳变,导致 mIoU 的值不连续。
- 计数操作的非光滑性计数操作(如计算 TP、FP、FN)是非光滑的,不能直接对输入的连续值进行求导。
细节说明
假设我们有一个二分类问题,真实标签 y 和预测标签 y^hat 分别如下:
- 真实标签 y:

- 预测标签 y^hat:

步骤 1:离散化
预测结果通过 argmax转化为离散类别:

步骤 2:计算 TP、FP 和 FN
- 对于类别 1:
- TP1=2(正确预测为 1 的像素数)。
- FP1=0(错误预测为 1 的像素数)。
- FN1=0(真实为 1 但未预测为 1 的像素数)。
步骤 3:计算 IoU
对于类别 1 的 IoU:

为什么不可微?
1. 离散化的不可微性
在步骤 1 中,argmax 操作将连续值(概率)转化为离散值(类别标签),这个过程是不可微的。比如,当预测值从 0.8 稍微变化到 0.7 时,结果仍为 1,但梯度无法反映这种变化。
2. 梯度消失或跳跃
在计数过程中,像素值要么被归为 TP,要么不被归为 TP。这种二值化导致梯度的突然变化或消失,无法为模型参数提供连续的更新方向。
3. 非连续的指标函数
mIoU 是由多个非连续操作组合而成(例如计数、加法和除法),整体函数也因此不可微。
如何解决 mIoU 的不可微性?
为了解决 mIoU 作为损失函数时的不可微问题,常用以下方法:
1. 平滑近似 IoU
通过引入连续的数学公式,近似离散的 IoU。例如:

其中:
- y^hat 是模型预测的连续概率值(不经过 argmax)。
- y 是真实标签。
2. 基于 Dice 的近似
Dice 系数是 IoU 的平滑近似形式,可以定义为:

它的梯度是连续的,可以用于反向传播。
3. 替代指标
对于训练,直接使用可微的损失函数(如 Cross-Entropy 或 Dice Loss);对于评估,使用不可微的 mIoU 进行最终性能测量。
不可微性在深度学习中的问题
在深度学习中,损失函数和模型需要是可微的,以便通过反向传播算法计算梯度并更新参数。如果某些操作不可微,则会出现以下问题:
- 梯度不存在: 无法计算损失函数相对于模型参数的变化率,优化过程无法继续。
- 优化停滞: 即使损失函数中只有部分不可微点,优化算法在这些点可能会陷入停滞。
- 梯度不稳定: 在尖角处,梯度的方向可能不稳定,导致模型参数更新不稳定。