一、交叉熵损失函数原理
1.信息量
信息的定义是用来消除随机不确定性的东西。也就是说衡量信息的大小是看信息消除不确定性东西的程度。信息量的大小与信息发生的概率成反比。
设某一时间发生的概率为P(x),其信息量表示为:
I
(
x
)
=
−
l
o
g
(
P
(
x
)
)
I(x)=-log(P(x))
I(x)=−log(P(x))
其中
I
(
x
)
I(x)
I(x)表示信息量,这里
l
o
g
log
log表示以e为底的自然对数。
2.交叉熵
信息熵:也称为熵,用来表示所有信息量的期望。
期望是试验中每次可能结果的概率乘以其结果的总和。
信息熵可以表示为(这里的
X
X
X是一个离散型随机变量):
H
(
X
)
=
−
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
P
(
x
i
)
)
(
X
=
x
1
,
x
2
,
x
3
.
.
.
,
x
n
)
H(X)=-\sum_{i=1}^n P(x_i)log(P(x_i)) (X=x_1,x_2,x_3...,x_n)
H(X)=−i=1∑nP(xi)log(P(xi))(X=x1,x2,x3...,xn)
对于0-1分布问题:设某一时间发生的概率为
P
(
x
)
P(x)
P(x),则另一事件发生的概率为
1
−
P
(
x
)
1-P(x)
1−P(x)。计算熵的公式可以简化如下:
H
(
X
)
=
−
∑
n
=
1
n
P
(
x
i
l
o
g
(
P
(
x
i
)
)
)
=
−
[
P
(
x
)
l
o
g
(
P
(
x
)
)
+
(
1
−
P
(
x
)
)
l
o
g
(
1
−
P
(
x
)
)
]
=
−
P
(
x
)
l
o
g
(
P
(
x
)
)
−
(
1
−
P
(
x
)
)
l
o
g
(
1
−
P
(
x
)
)
H(X)=-\sum_{n=1}^nP(x_ilog(P(x_i)))\\ =-[P(x)log(P(x))+(1-P(x))log(1-P(x))]\\=-P(x)log(P(x))-(1-P(x))log(1-P(x))
H(X)=−n=1∑nP(xilog(P(xi)))=−[P(x)log(P(x))+(1−P(x))log(1−P(x))]=−P(x)log(P(x))−(1−P(x))log(1−P(x))
相对熵(KL)散度:如果对于随机变量X有两个单独的概率分布 P ( x ) P(x) P(x)和 Q ( x ) Q(x) Q(x),那我们就可以用KL散度来衡量着两个概率分布之间的差异。
在机器学习中,我们常用
P
(
x
)
P(x)
P(x)来表示样本的真实分布,
Q
(
x
)
Q(x)
Q(x)来表示模型预测的分布。
D
K
L
(
P
∣
∣
Q
)
=
∑
i
=
0
n
P
(
x
i
)
l
o
g
(
P
(
x
i
)
Q
(
x
i
)
)
)
D_{KL}(P||Q)=\sum_{i=0}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)}))
DKL(P∣∣Q)=i=0∑nP(xi)log(Q(xi)P(xi)))
例如在三分类任务中,
X
X
X的真实分布
P
(
x
)
=
[
1
,
0
,
0
]
P(x)=[1,0,0]
P(x)=[1,0,0],预测分布为
Q
(
x
)
=
[
0.7
,
0.2
,
0.1
]
Q(x)=[0.7,0.2,0.1]
Q(x)=[0.7,0.2,0.1],计算
X
X
X的KL散度?
KL散度越小,表示
P
(
x
)
P(x)
P(x)与
Q
(
x
)
Q(x)
Q(x)的分布更加接近,可以通过反复训练
Q
(
x
)
Q(x)
Q(x)来接近
P
(
x
)
P(x)
P(x)。
交叉熵: 交叉熵 = KL散度 + 信息熵
公式推导: 先将KL散度公式拆开
前者
H
(
p
(
x
)
)
H(p(x))
H(p(x))表示信息熵,后者即为交叉熵。
交叉熵公式表示为:
在机器学习中,输入数据与标签常常已经确定,真实概率分布
P
(
x
)
P(x)
P(x)也就确定。所以信息熵变成了常量。
交
叉
熵
=
K
L
散
度
+
常
量
(
信
息
熵
)
交叉熵=KL散度+常量(信息熵)
交叉熵=KL散度+常量(信息熵)
由于KL散度的值表示真实概率分布
P
(
x
)
P(x)
P(x)与预测概率分布
Q
(
x
)
Q(x)
Q(x)之间的差异。值越小表示预测值越接近真实值。所以我们需要最小化
K
L
散
度
KL散度
KL散度。交叉熵这里也有相同的作用,所以机器学习中常常使用交叉熵损失函数来计算loss。
二、Focal Loss函数
通过上面部分已了解交叉熵损失函数。二分类损失函数公式如下:
其中
y
y
y为真实样本的标签,
y
′
y'
y′为经过sigmoid的预测输出(取值在[0,1]之间)。
普通的交叉熵对正样本而言,输出概率越大,损失越小。对负样本而言:输出概率越小,损失越小。
问题来了:此时的损失函数在大量样本的简单迭代中比较缓慢且可能无法优化至最优。
作者由此提出Focal Loss函数:
控制易分类样本和难分类样本的权重
可以看看有什么不同?在原有基础上添加了一个因子。若 γ > 0 \gamma>0 γ>0,则降低了易分类样本对loss的贡献。使得模型更加关注于难分类样本。
例如分类任务,样本A属于类别1的概率为0.9,属于易分类样本。样本B属于类别2的概率为0.56,属于难分类样本。也就是某个类的概率越大,其越容易分类。
解决类别不平衡问题
在原有基础上再添加平衡因子
α
\alpha
α,可以用来平衡正负样本本身的数量不均问题。
这里的两个参数
α
\alpha
α和
γ
\gamma
γ协调来控制,文章作者采用
α
=
0.25
,
γ
=
2
\alpha=0.25,\gamma=2
α=0.25,γ=2时效果最好。
三、总结
one-stage和two-stage的表现差异主要原因是大量前背景类别不平衡导致,以此提出Focal Loss。
作者设计了一个简单密集型网络RetinaNet,采用Focal Loss函数来训练,在保证速度的同时达到了精度最优,验证了效果。
Two-Stage算法,在产生region proposal阶段,通过score筛选和nms筛选过滤掉了大量的负样本,然后在分类、回归阶段又固定了正负样本比例(1:3),或者通过OHEM技巧使得前景和背景相对平衡。类别不平衡的问题并不明显,算法精度得以保证。
One-Stage算法需要产生超大量的预选框,训练被大量负样本所主导,Focal Loss对此种情况卓有成效。
参考:
[1].剖析 Focal Loss 损失函数: 消除类别不平衡+挖掘难分样本
[2].交叉熵损失函数原理详解
[3].Focal loss详解及其实现