Focal Loss
- Kullback-Leibler Divergence(相对熵)
- NLL Loss
- Cross Entropy Loss
- Balanced Cross Entropy Loss
- Focal Loss
- 应用场景:
- 1、车道检测与分类
Kullback-Leibler Divergence(相对熵)
KL散度(Kullback-Leibler Divergence
,也称相对熵)用来衡量两个分布之间的偏差,其可以用下面数学公式描述:
D K L ( p ( x ) , q ( x ) ) = ∑ i N p i ( x ) l o g ( p i ( x ) q i ( x ) ) = ∑ i N p i ( x ) l o g p i ( x ) − p i ( x ) l o g q i ( x ) = − H ( p ) + H ( p , q ) \begin{align} D_{KL}(p(x),q(x)) &= \sum_i^N p_i(x) \mathrm{log} \left(\frac{p_i(x)}{q_i(x)}\right)\\ &=\sum_i^N p_i(x) \mathrm{log}{p_i(x)}-p_i(x) \mathrm{log}{q_i(x)}\\ &= -H(p)+H(p,q) \end{align} DKL(p(x),q(x))=i∑Npi(x)log(qi(x)pi(x))=i∑Npi(x)logpi(x)−pi(x)logqi(x)=−H(p)+H(p,q)
NLL Loss
Cross Entropy Loss
上面公式中的 C E ( p , q ) CE(p,q) CE(p,q) 即为交叉熵 (Cross-Entropy)
函数,通常在机器学习中, p ( x ) p(x) p(x) 表示为目标分布(可以理解为label
), q ( x ) q(x) q(x) 表示模型输出分布(可以理解为prediction
),监督学习的目标是尽可能使得 q ( x ) q(x) q(x) 接近 p ( x ) p(x) p(x) 从而达到最佳性能,即 q ( x ) q(x) q(x) 和 p ( x ) p(x) p(x) 偏差越大,KL散度值越大,当两者分布相等时,KL散度为零,同时目标分布确定时 p ( x ) p(x) p(x) 分布的熵 H ( p ) H(p) H(p) 也是确定的,因此通过KL散度进行优化等价于通过交叉熵进行优化。
C E _ l o s s ( p , q ) = − ∑ i N p i ( x ) l o g q i ( x ) CE\_loss(p,q)=- \sum_i^N p_i(x) \mathrm{log}{q_i(x)} CE_loss(p,q)=−i∑Npi(x)logqi(x)
如何计算交叉熵?
以二分类为例:这里有1个样本, y y y表示真实值, y ^ \hat{y} y^表示预测为1的概率值,
y y y | y ^ \hat{y} y^ | |
---|---|---|
sample 1 | 0 | 0.1 |
C E l o s s = − ( 0 ∗ l o g ( 1 − 0.1 ) + 1 ∗ l o g ( 0.1 ) ) = 2.3025 \begin{align} CE_{loss} &= -\left(0*\mathrm{log}(1-0.1) +1*\mathrm{log}(0.1) \right)\\ &= 2.3025 \end{align} CEloss=−(0∗log(1−0.1)+1∗log(0.1))=2.3025
使用代码验证如下:
import torch
import math
print(-(0*math.log(0.9)+1*math.log(0.1)))BCE_loss = torch.nn.BCELoss()
target = torch.tensor([0]).float()
output = torch.tensor([0.9]).float()
print(BCE_loss(output, target))
同理,接入对于一个三分类(多分类)任务,一个样本的预测值为 ( 0.1 , 0.3 , 0.6 ) (0.1, 0.3,0.6) (0.1,0.3,0.6),其对应的 gt 为 (0, 0, 1),则其交叉熵损失为: − ( l o g ( 1 − 0.1 ) + l o g ( 1 − 0.3 ) + l o g ( 0.6 ) ) -(log(1-0.1)+log(1-0.3)+log(0.6)) −(log(1−0.1)+log(1−0.3)+log(0.6)),但torch.nn.CrossEntropyLoss()
的计算方式略显不同(它是 softmax+log+NLLLoss的合体)。
Balanced Cross Entropy Loss
在多类别数据中,如果某类别之间分布不均衡,直接训练会导致模型过多关注样本比例较多的类别,而在样本比例较少的类别上分类性能不足,因此Balanced Cross Entropy Loss提出是为了缓解这个问题,其根据每个类别在数据中的分布比例进行加权,数学表达式如下:
B a l n a c e d C E _ l o s s ( p , q ) = − ∑ i N α i p i ( x ) l o g q i ( x ) BalnacedCE\_loss(p,q)=-\sum_i^N \alpha_i p_i(x) \mathrm{log}{q_i(x)} BalnacedCE_loss(p,q)=−i∑Nαipi(x)logqi(x)
Focal Loss
尽管引入Balanced Cross Entropy Loss缓解了类别分布不均衡的问题,但模型对每种类别的分类能力往往是不同的,因此训练模型的时候就需要模型重点关注难分样本的特征,其数学表达式为:
F o c a l _ l o s s ( p , q ) = − ∑ i N α i ( 1 − p i ( x ) ) γ l o g q i ( x ) Focal\_loss(p,q)=-\sum_i^N \alpha_i(1- p_i(x))^{\gamma} \mathrm{log}{q_i(x)} Focal_loss(p,q)=−i∑Nαi(1−pi(x))γlogqi(x)
其中 α i \alpha_i αi 是类别均衡系数, γ > 0 \gamma>0 γ>0,从公式中可以看到,当 p i ( x ) ⟶ 1 p_i(x) \longrightarrow 1 pi(x)⟶1 表明该样本被分类正确的概率越大,易区分样本,则其对应的loss所占的权重更低,反之则是难分类样本其loss权重更大。