语义分割任务可以看作像素级的分类任务,在设计基于语义分割的深度学习架构时,尤其是在伪装目标分割的特殊场景下,损失/目标函数的选择非常关键,会直接影响到算法的学习过程,进而影响到模型的收敛速度、分割准确度。
目前,语义分割种常用的损失函数包括cross entropy, generalized dice coefficient, focal loss 等。
逐像素的交叉熵是语义分割中最常用的一种损失函数,一般用来量化两个概率分布之间的差异。
(1)对于二分类的情况,其公式如下:
L = 1 N ∑ i − [ y i ⋅ l o g ( p i ) + ( 1 − y i ) ⋅ l o g ( 1 − p i ) ] L=\frac{1}{N} \sum_i -[y_i \cdot log(p_i)+(1-y_i) \cdot log(1-p_i)] L=N1i∑−[yi⋅log(pi)+(1−yi)⋅log(1−pi)]
其中:
(2)对于多分类的情况
L = − 1 N ∑ i ∑ c = 1 M y i c l o g ( p i c ) L=- \frac{1}{N} \sum_i \sum_{c=1}^M y_{ic}log(p_{ic}) L=−N1i∑c=1∑Myiclog(pic)
其中:
多分类的情况实际上是对二分类的扩展。
Dice Loss最先由V-Net文章中被提出,目的是为了增强网络对于医学影像中细小结构的分割能力,解决在学习过程中损失函数陷入局部最小值,导致前景区域特征丢失的问题。
Dice系数是一种度量集合相似度的函数,通常用于计算两个样本的相似度,取值范围在[0, 1]:
s = 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ s=\frac{2 \lvert X \cap Y \rvert}{\lvert X \rvert + \lvert Y \rvert} s=∣X∣+∣Y∣2∣X∩Y∣
其中, ∣ X ∩ Y ∣ \lvert X \cap Y \rvert ∣X∩Y∣是X和Y集合的交集的元素个数, ∣ X ∣ \lvert X \rvert ∣X∣和 ∣ Y ∣ \lvert Y \rvert ∣Y∣分别表示X和Y的元素的个数。分子系数为2,是因为分母中存在重复计算X和Y之间的共同元素的原因。
Dice越大则表示两个集合的元素之间越相似,也就说明模型训练得越好。
Dice Loss:
d = 1 − 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ d=1-\frac{2 \lvert X \cap Y \rvert}{\lvert X \rvert + \lvert Y \rvert} d=1−∣X∣+∣Y∣2∣X∩Y∣
为了避免分子被0除和减少过拟合,一般会在分子分母上同时加一个常数:
d = 1 − 2 ∣ X ∩ Y ∣ + ϵ ∣ X ∣ + ∣ Y ∣ + ϵ d=1-\frac{2 \lvert X \cap Y \rvert + \epsilon}{\lvert X \rvert + \lvert Y \rvert + \epsilon} d=1−∣X∣+∣Y∣+ϵ2∣X∩Y∣+ϵ
(1)交叉熵损失函数的优点在于交叉熵值关于logits的梯度计算形式类似于p-t,其中,p代表softmax输出的预测值,t代表真实标签。而dice-coefficient的loss值为 2 p t p 2 + t 2 \frac{2pt}{p^2+t^2} p2+t22pt或 2 p t p + t \frac{2pt}{p+t} p+t2pt,其关于p的梯度形式很复杂: 2 t ( t 2 − p 2 ) ( p 2 + t 2 ) 2 \frac{2t(t^2-p^2)}{{(p^2+t^2)}^2} (p2+t2)22t(t2−p2)或 2 t 2 ( p + t ) 2 \frac{2t^2}{{(p+t)}^2} (p+t)22t2。当p和t的值都很小时,计算得到的梯度值可能会非常大,导致训练更加不稳定。
(2)采用Dice-coefficient的原因在于分割的最终目标就是使IOU和dice-coefficient最大,而交叉熵仅是一种代理函数。
(3)为什么Dice-coefficient对于类别不均衡问题,效果可能更好?
图像分割任务中,softmax 交叉熵loss 是对每一个像素点进行类别预测,然后平均所有的像素点. 其本质上仍是对图片的每个像素进行平等的学习,这就导致如果图像上的多种类别存在不平衡时,模型的训练会由最主流的类别所主导. 网络更偏向于对主流类别的学习,而降低了对非主流类别的特征提取能力.
而Dice loss 通过预测和GT的交集除以它们的总体像素进行计算,将一个类别的所有像素作为一个整体进行考量,而且计算交集在总体中的比例,所以不会受大量主流像素的影响,能够提取更好的效果.
实际中,dice loss 往往与 bce loss (binary cross entropy loss)结合使用,以提升模型训练的稳定性.
focal loss是何恺明团队为了解决one-stage目标检测中类别不平衡(class imbalance)的问题而提出的一种损失函数。类别不平衡问题是指在对一张图像进行目标检测时,需要评估 1 0 4 10^4 104至 1 0 5 10^5 105个侯选位置,但是其中只有少数位置包含目标对象。这导致了两个问题:
(1)训练效率低。将样本分为positive和negative两类,由于大部分位置都是negative样本,使用交叉熵损失函数进行计算时,negative样本的贡献远大于positive样本,从而不利于整个目标函数的收敛。
(2)大部分negative样本位于背景区,只有极少的negative样本位于前景和背景的过渡区。位于背景区的negative样本分类相对容易,称为easy negative样本。easy negative样本在训练时对应的score很大,loss很小。在梯度下降法对模型参数进行更新时,easy negative样本对参数收敛作用有限。从而导致hard negative样本很难得到更新,效果不佳。
focal loss论文中认为,导致上述两个问题的原因在于传统的交叉熵损失函数只关注了positive \ negative样本,而没有区分easy \ hard样本。所以在传统交叉熵损失的基础上引入了调制因子 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt)γ,公式如下:
F L ( p t ) = − ( 1 − p t ) γ l o g ( p t ) FL(p_t)=-(1-p_t)^\gamma log(p_t) FL(pt)=−(1−pt)γlog(pt)
p t = { p , if y = 1 1 − p , otherwise p_t= \begin{cases} p, & \text {if $y=1$} \\ 1-p, & \text{otherwise} \end{cases} pt={p,1−p,if y=1otherwise
其中, y ∈ { ± 1 } y \in \lbrace \pm1 \rbrace y∈{±1}代表真实标签。 p ∈ [ 0 , 1 ] p \in [0, 1] p∈[0,1]代表模型对于标签y=1的估计概率。
注意到focal loss有两个性质:
(1)当一个样本被错误分类时, p t p_t pt的值很小,调制因子接近于1,loss不受影响;当 p t → 1 p_t \rightarrow 1 pt→1时,因子接近于0,降低分类正确的样本的权重。
(2)超参数 γ \gamma γ可以灵活调整调制因子的作用。当 γ = 0 \gamma = 0 γ=0时,FL相当于传统的交叉熵损失;当 γ \gamma γ增加时,调制因子的作用也会增加。
整体而言,调制因子 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt)γ降低了easy样本对于损失值的贡献,并且增加了被错误分类的样本在损失函数中的权重。
Trick:
一般在初始化参数的时候,会让最后一层分类层每个类别服从等概分布,但是由于negative样本非常多,等概之后明显增加了negative样本在训练时的loss,导致训练初期不稳定。好的做法是让最后一层的分布符合正样本相对负样本的分布。