1. 前言
这篇博客讨论分类问题的误差损失函数。对于二分类问题,真值标签记为
y
i
=
{
0
,
1
}
y_i=\{0,1\}
yi={0,1}。对于多分类问题,真值标签记为
y
i
=
(
0
,
.
.
.
,
0
,
1
,
0
,
.
.
.
,
0
)
T
y_i=(0,...,0,1,0,...,0)^T
yi=(0,...,0,1,0,...,0)T。在该向量中,只允许有一个
1
1
1出现。这种标记方法记为One-Hot
向量。对于二分类问题,使用Sigmoid
函数做输出。对于多分类问题,使用Softmax
做输出。这是分类问题约定俗成的基本知识。
2. 从MSE损失函数到Cross-Entropy损失函数
Cross-Entropy
的讲解可以参考这篇博客。首先讨论二分类问题。设第
i
i
i个物体的标签是
y
i
=
{
0
,
1
}
y_i=\{0,1\}
yi={0,1}。
y
i
=
1
y_i=1
yi=1表示该物体属于
A
A
A类,
y
i
=
0
y_i=0
yi=0表示该物体不属于
A
A
A类。假定我们训练一个网络用语预测该物体的分类,预测结果是
p
i
∈
[
0
,
1
]
p_i\in[0,1]
pi∈[0,1]。怎样设计一个损失函数,让网络正确完成分类任务呢?可以直观地设计一个MSE
损失函数:
L m s e , i = 1 2 ( y i − p i ) 2 L_{mse,i} = \frac{1}{2}(y_i - p_i)^2 Lmse,i=21(yi−pi)2
假定网络经过一个全连接层预测出
p
i
p_i
pi的,那么
p
i
=
σ
(
W
x
+
b
)
p_i = \sigma(Wx+b)
pi=σ(Wx+b)。对于二分类问题,要规范输出分布在
[
0
,
1
]
[0,1]
[0,1]之间,所以需要使用Sigmoid
函数,即函数
σ
(
⋅
)
\sigma(\cdot)
σ(⋅)是Sigmoid
函数。训练网络需要对误差做反向传播,即需要计算偏导数
∂
L
m
s
e
,
i
/
∂
W
{\partial L_{mse,i}}/{\partial W}
∂Lmse,i/∂W:
∂ L m s e , i / ∂ W = ( y i − p i ) σ ′ ( W x + b ) x {\partial L_{mse,i}}/{\partial W} = (y_i-p_i)\sigma '(Wx+b)x ∂Lmse,i/∂W=(yi−pi)σ′(Wx+b)x
Sigmoid
函数的导数很有特点:
σ
′
(
x
)
=
σ
(
x
)
⋅
(
1
−
σ
(
x
)
)
\sigma'(x)=\sigma(x)\cdot(1-\sigma(x))
σ′(x)=σ(x)⋅(1−σ(x)),于是上式可以写为下式:
∂
L
m
s
e
,
i
/
∂
W
=
(
y
i
−
p
i
)
σ
(
W
x
+
b
)
⋅
(
1
−
σ
(
W
x
+
b
)
)
x
{\partial L_{mse,i}}/{\partial W} = (y_i-p_i)\sigma(Wx+b)\cdot(1-\sigma(Wx+b))x
∂Lmse,i/∂W=(yi−pi)σ(Wx+b)⋅(1−σ(Wx+b))x
∂
L
m
s
e
,
i
/
∂
W
=
(
y
i
−
p
i
)
p
i
(
1
−
p
i
)
x
{\partial L_{mse,i}}/{\partial W} = (y_i-p_i)p_i(1-p_i)x
∂Lmse,i/∂W=(yi−pi)pi(1−pi)x
可以发现,当 σ ( W x + b ) = 0 , 1 \sigma(Wx+b)=0,1 σ(Wx+b)=0,1的时候,偏导数会等于零,造成梯度消失。在网络训练的初始阶段,因为参数是随机初始化的,所以 W x + b Wx+b Wx+b很可能会输出一些很大或者很小的数值,就这会造成 σ ( W x + b ) \sigma(Wx+b) σ(Wx+b)接近于零或者一,使得梯度消失,造成网络训练的困难。
因此分类问题不会去使用MSE
损失函数。研究者们则采用Cross-Entropy
损失函数。具体原因下面会有讨论。它的定义如下所示:
L c e , i = − [ y i log ( p i ) + ( 1 − y i ) log ( 1 − p i ) ] L_{ce,i} = -[y_i\log(p_i) +(1-y_i)\log(1-p_i)] Lce,i=−[yilog(pi)+(1−yi)log(1−pi)]
初次看到这种形式会觉得奇怪。我做一些说明。当
y
i
=
1
y_i=1
yi=1的时候,即该目标属于
A
A
A类,此时损失函数变为:
L
c
e
,
i
=
−
log
(
p
i
)
L_{ce,i}=-\log(p_i)
Lce,i=−log(pi)。为了使
L
c
e
,
i
→
0
L_{ce,i}\rightarrow 0
Lce,i→0,
p
i
→
1
p_i\rightarrow 1
pi→1。同理,当
y
i
=
0
y_i=0
yi=0的时候,即该目标不属于
A
A
A类,此时损失函数变为:
:
L
c
e
,
i
=
−
l
o
g
(
1
−
p
i
)
:L_{ce,i}=-log(1-p_i)
:Lce,i=−log(1−pi)。为了使
L
c
e
,
i
→
0
L_{ce,i}\rightarrow 0
Lce,i→0,
p
i
→
0
p_i\rightarrow 0
pi→0。因此Cross-Entropy
损失函数是有意义的。
好的,接下来计算反向传播的偏导数。为了方便理解,这里分情况讨论问题。
当 y i = 1 y_i=1 yi=1的时候, L c e , i = − log ( p i ) L_{ce,i}=-\log(p_i) Lce,i=−log(pi)。偏导数 ∂ L c e , i / ∂ W {\partial L_{ce,i}}/{\partial W} ∂Lce,i/∂W是:
∂ L c e , i / ∂ W = − 1 / p i ⋅ p i ( 1 − p i ) x = − ( 1 − p i ) x {\partial L_{ce,i}}/{\partial W}=-{1}/{p_i}\cdot p_i(1-p_i)x=-(1-p_i)x ∂Lce,i/∂W=−1/pi⋅pi(1−pi)x=−(1−pi)x
当 y i = 0 y_i=0 yi=0的时候, L c e , i = − l o g ( 1 − p i ) L_{ce,i}=-log(1-p_i) Lce,i=−log(1−pi)。偏导数 ∂ L c e , i / ∂ W {\partial L_{ce,i}}/{\partial W} ∂Lce,i/∂W是:
∂ L c e , i / ∂ W = 1 / ( 1 − p i ) ⋅ p i ( 1 − p i ) x = − ( 0 − p i ) x {\partial L_{ce,i}}/{\partial W}=1/(1-p_i)\cdot p_i(1-p_i)x = -(0-p_i)x ∂Lce,i/∂W=1/(1−pi)⋅pi(1−pi)x=−(0−pi)x
统一上述的推导,我们可以得到:
∂ L c e , i / ∂ W = − ( y i − p i ) x {\partial L_{ce,i}}/{\partial W}= -(y_i-p_i)x ∂Lce,i/∂W=−(yi−pi)x
从这个偏导数可以看出,它非常简洁,避免了使用Sigmoid
带来的梯度消失问题。然而Cross-Entropy
函数在用于多分类问题的时候,会出现一些问题,可以参考这篇博客。
3. 从Cross-Entropy损失函数到Focal Loss损失函数
Focal Loss
的讲解可以参考这篇博客和知乎笔记。Focal Loss
主要解决分类问题中,正负样本不均衡的现象。还是以二分类问题作说明。设总数据集的损失函数是
L
L
L,使用Cross-Entropy
后,它可以表示为:
L = ∑ i = 1 N L c e , i = ∑ i = 1 N − [ y i log ( p i ) + ( 1 − y i ) log ( 1 − p i ) ] L=\sum_{i=1}^N L_{ce,i}=\sum_{i=1}^N -[y_i\log(p_i) +(1-y_i)\log(1-p_i)] L=∑i=1NLce,i=∑i=1N−[yilog(pi)+(1−yi)log(1−pi)]
记正样本的个数是 N p N_p Np,负样本的个数是 N n N_n Nn,有 N p + N n = N N_p+N_n=N Np+Nn=N。 L L L可以改写为:
L = L p + L n = ∑ i = 1 N p − l o g ( p i ) + ∑ j = 1 N n − log ( 1 − p j ) L=L_p+L_n=\sum_{i=1}^{N_p} -log(p_i) + \sum_{j=1}^{N_n}-\log(1-p_j) L=Lp+Ln=∑i=1Np−log(pi)+∑j=1Nn−log(1−pj)
假设正样本的数量远大于负样本的数量,那么对于训练器而言,最小化
L
p
L_p
Lp的重要性远远大于最小化
L
n
L_n
Ln。于是训练器可能会拼命地减小
L
p
L_p
Lp而去忽视
L
n
L_n
Ln,这就会造成负样本识别率很低。比如,我们设计一个癌症分类算法。数据集中是正常人群远大于患病人群的,但是显然我们只去关心识别病患的准确率,而不是正常人的准确率。所以Cross-Entropy
会面临困境。同理,当负样本的数量远大于正样本数量的时候,同样的问题也会出现。
为了解决这个问题,Focal Loss
便应运而生。
先总结一下Cross-Entropy
的表达式:
L c e , i = { − log ( p i ) , y i = 1 − log ( 1 − p i ) , y i = 0 L_{ce,i}=\left\{ \begin{aligned} &-\log(p_i),&y_i=1 \\ &-\log(1-p_i), &y_i=0\\ \end{aligned} \right. Lce,i={−log(pi),−log(1−pi),yi=1yi=0
先来看第一个修改版本:
L a , i = { − α log ( p i ) , y i = 1 − ( 1 − α ) log ( 1 − p i ) , y i = 0 L_{a,i}=\left\{ \begin{aligned} &-\alpha\log(p_i),&y_i=1 \\ &-(1-\alpha)\log(1-p_i), &y_i=0\\ \end{aligned} \right. La,i={−αlog(pi),−(1−α)log(1−pi),yi=1yi=0
参数 α ∈ ( 0 , 1 ) \alpha \in(0,1) α∈(0,1)用于衡量正负样本之间的权重。如果 α → 0 \alpha \rightarrow 0 α→0,表示正样本的误差不重要,而负样本的误差很重要。同理,如果 α → 1 \alpha \rightarrow 1 α→1,表示正样本的误差很重要。参数 α \alpha α的引用解决了正负样本之间不均衡的情况。 α \alpha α应该跟正负样本之间的数量比例相关。如果正样本和负样本的比例是 3 : 1 3:1 3:1的话, α = 1 / 4 = 0.25 \alpha=1/4=0.25 α=1/4=0.25。
在分类问题中,除了解决正负样本不均衡的情况,还需要解决容易样本/困难样本的不均衡的情况。还是以正样本举例子。对于容易分类的正样本,网络的输出很容易到达 p i = 0.9 p_i=0.9 pi=0.9;然而对于困难分类的正样本,网络的输出可能仅仅是 p i = 0.5 p_i=0.5 pi=0.5,或者更低。如果数据集中容易的样本数远大于困难样本,网格更偏向于处理容易分类的样本。
为了解决这个问题,Focal Loss
的完整表述如下所示:
L f o c a l , i = { − α ( 1 − p i ) γ log ( p i ) , y i = 1 − ( 1 − α ) p i γ log ( 1 − p i ) , y i = 0 L_{focal,i}=\left\{ \begin{aligned} &-\alpha(1-p_i)^\gamma\log(p_i),&y_i=1 \\ &-(1-\alpha)p_i^\gamma\log(1-p_i), &y_i=0\\ \end{aligned} \right. Lfocal,i={−α(1−pi)γlog(pi),−(1−α)piγlog(1−pi),yi=1yi=0
γ
\gamma
γ是权重因子。为了便于理解,咱们先把上述公式中的
α
\alpha
α去掉。令
γ
=
2
\gamma=2
γ=2。对于一个容易分类的正样本,网络的输出是
p
i
=
0.9
p_i=0.9
pi=0.9,它的Cross-Entropy
误差是
−
log
(
0.9
)
=
0.105
-\log(0.9)=0.105
−log(0.9)=0.105。它的Focal loss
误差是
−
0.
1
2
log
(
0.9
)
=
0.00105
-0.1^2\log(0.9)=0.00105
−0.12log(0.9)=0.00105,缩小了100倍。可见
γ
>
1
\gamma>1
γ>1会削弱容易分类样本的损失函数。因此实际分类中会让
γ
>
1
\gamma>1
γ>1。
最后看一下Focal-Loss
函数的反向传播的求导过程。在这里就简单分析一个情况吧。当
y
i
=
1
y_i=1
yi=1的时候,
L
f
o
c
a
l
,
i
=
−
α
(
1
−
p
i
)
γ
log
(
p
i
)
L_{focal,i}=-\alpha(1-p_i)^\gamma\log(p_i)
Lfocal,i=−α(1−pi)γlog(pi)。偏导数
∂
L
f
o
c
a
l
,
i
/
∂
W
{\partial L_{focal,i}}/{\partial W}
∂Lfocal,i/∂W是:
∂
L
f
o
c
a
l
,
i
/
∂
W
=
α
γ
(
1
−
p
i
)
γ
−
1
log
(
p
i
)
⋅
p
i
(
1
−
p
i
)
−
α
(
1
−
p
i
)
γ
⋅
p
i
−
1
⋅
p
i
(
1
−
p
i
)
{\partial L_{focal,i}}/{\partial W}=\alpha\gamma(1-p_i)^{\gamma-1}\log(p_i)\cdot p_i(1-p_i) -\alpha(1-p_i)^\gamma\cdot p_i^{-1}\cdot p_i(1-p_i)
∂Lfocal,i/∂W=αγ(1−pi)γ−1log(pi)⋅pi(1−pi)−α(1−pi)γ⋅pi−1⋅pi(1−pi)
∂
L
f
o
c
a
l
,
i
/
∂
W
=
α
γ
(
1
−
p
i
)
γ
log
(
p
i
)
p
i
−
α
(
1
−
p
i
)
γ
+
1
{\partial L_{focal,i}}/{\partial W}=\alpha\gamma(1-p_i)^\gamma\log(p_i)p_i-\alpha(1-p_i)^{\gamma+1}
∂Lfocal,i/∂W=αγ(1−pi)γlog(pi)pi−α(1−pi)γ+1
按照之前的分析,Focal Loss
不会在网络训练的初始阶段出现梯度消失情况。
4. 多目标分类
在讲解Circle Loss
之前,咱们先做点热身,讨论一下多分类情况。首先多分类输出是用SoftMax
函数,一般情况下多分类问题的误差损失函数依然是Cross-Entropy
函数。记样本的总数为
N
N
N个,分类目标是
A
1
,
.
.
.
,
A
M
A_1,...,A_M
A1,...,AM,分类目标个数是
M
M
M个。对于第
i
i
i个样本来说,网络的输出是
p
i
,
0
,
.
.
.
,
p
i
,
M
p_{i,0},...,p_{i,M}
pi,0,...,pi,M。记网络在SoftMax
层之前的输出是
q
i
,
0
,
.
.
.
,
q
i
,
M
q_{i,0},...,q_{i,M}
qi,0,...,qi,M。
q
i
,
k
=
W
k
x
i
+
b
k
q_{i,k}=W_kx_i+b_k
qi,k=Wkxi+bk。根据SoftMax
定义,
p
i
,
k
p_{i,k}
pi,k的计算方式如下所示:
p i , k = exp ( q i , k ) / ∑ j M exp ( q i , j ) p_{i,k}=\exp(q_{i,k})/\sum_j^M\exp(q_{i,j}) pi,k=exp(qi,k)/∑jMexp(qi,j)
在
p
i
,
0
,
.
.
.
,
p
i
,
M
p_{i,0},...,p_{i,M}
pi,0,...,pi,M中,如果
p
i
,
a
p_{i,a}
pi,a是其中最大的,那么第
i
i
i个样本属于第
a
a
a类。接下来讨论多分类情况下的Cross-Entropy
损失函数。设
y
i
,
0
,
.
.
.
,
y
i
,
M
y_{i,0},...,y_{i,M}
yi,0,...,yi,M是
p
i
,
0
,
.
.
.
,
p
i
,
M
p_{i,0},...,p_{i,M}
pi,0,...,pi,M对应的真值标签。按照刚才这个例子,只有
y
i
,
a
=
1
y_{i,a}=1
yi,a=1,对于其他的则都是零。关于第
i
i
i个样本的Cross-Entropy
损失函数定义如下所示:
L c e , i = − ∑ j M y i , j log ( p i , j ) L_{ce,i}=-\sum_{j}^M y_{i,j}\log(p_{i,j}) Lce,i=−∑jMyi,jlog(pi,j)
总误差函数则定义为:
L = ∑ i N L c e , i = − ∑ i N ∑ j M y i , j log ( p i , j ) L=\sum_i^N L_{ce,i} = -\sum_i^N\sum_{j}^M y_{i,j}\log(p_{i,j}) L=∑iNLce,i=−∑iN∑jMyi,jlog(pi,j)
迁移上一节学习到的Focal Loss
知识,多分类的Focal Loss
误差损失函数如下所示:
L f o c a l , i = − ∑ j M α j ⋅ ( 1 − p i , j ) γ j ⋅ y i , j log ( p i , j ) L_{focal,i}=-\sum_{j}^M \alpha_j\cdot (1-p_{i,j})^{\gamma_j}\cdot y_{i,j}\log(p_{i,j}) Lfocal,i=−∑jMαj⋅(1−pi,j)γj⋅yi,jlog(pi,j)
其中
∑
i
=
1
M
α
i
=
1
\sum_{i=1}^M\alpha_i=1
∑i=1Mαi=1。使用SoftMax
后,Cross-Entropy
损失函数的导数形式也是比较简单的。这里就不做推到啦。如果对于第
i
i
i个样本,它的分类真值是第
k
k
k类,那么
L
f
o
c
a
l
,
i
L_{focal,i}
Lfocal,i可以变形为:
L f o c a l , i = − α k ⋅ ( 1 − p i , k ) γ k ⋅ log ( p i , j ) L_{focal,i}=- \alpha_k\cdot (1-p_{i,k})^{\gamma_k}\cdot \log(p_{i,j}) Lfocal,i=−αk⋅(1−pi,k)γk⋅log(pi,j)
Cross-Entropy
损失函数就变为如下所示:
L c e , i = − log ( p i , k ) L_{ce,i}=-\log(p_{i,k}) Lce,i=−log(pi,k)
看上去这些公式都很简洁的。
我们做个小扩展哈。对于二分类问题,激活函数是Sigmoid
函数,即
p
i
=
σ
(
W
x
i
+
b
)
p_{i}=\sigma(Wx_i+b)
pi=σ(Wxi+b)。
L
c
e
,
i
L_{ce,i}
Lce,i可以进一步写为:
L c e , i = − log ( 1 / ( 1 + exp [ − ( W x i + b ) ] ) ) = log ( 1 + exp [ − ( W x i + b ) ] ) L_{ce,i}=-\log(1/(1+\exp[-(Wx_i+b)]))=\log(1+\exp[-(Wx_i+b)]) Lce,i=−log(1/(1+exp[−(Wxi+b)]))=log(1+exp[−(Wxi+b)])
请记住这种误差表述形式: L i = log ( 1 + exp ( Δ ) ) L_i=\log(1+\exp(\Delta)) Li=log(1+exp(Δ))这种形式。 Δ \Delta Δ是一个复杂的表达式,在后续会接着讨论。
5. 从Cross-Entropy损失函数到Circle Loss
Circle Loss
是一篇CVPR2020
的文章。原文太复杂了,不方便我等小白阅读。在这篇博客,咱只讨论一个多分类情况。一共有
M
M
M个类别,标记为
A
1
,
.
.
.
,
A
M
A_1,...,A_M
A1,...,AM。还是以第
i
i
i个样本为例子,假定它的标签是
A
k
A_k
Ak。SoftMax
的函数标记为
S
(
⋅
)
S(\cdot)
S(⋅)。网络的输出是
O
i
=
S
(
W
x
i
+
b
)
O_i=S(Wx_i+b)
Oi=S(Wxi+b),其中
O
i
∈
R
M
O_i\in \textbf R^M
Oi∈RM。
一切都正常。接下来咱讨论类内(Within Class
)和类间(Between Class
)的概念。学过模式识别的话,对这个概念不会太陌生。假定大家都理解这个概念哈。在多分类问题中,类内和类间如何去定义呢?
我不想说得太抽象。我会举两个例子。
例子一:基于欧式空间对类内类间的定义。第
i
i
i个样本的标签是
A
k
A_k
Ak,one-hot
形式表示的话就是
1
k
=
(
0
,
.
.
.
,
0
,
1
,
0
,
.
.
.
,
0
)
T
1_k=(0,...,0,1,0,...,0)^T
1k=(0,...,0,1,0,...,0)T,
1
1
1唯一地出现在第
k
k
k列。类内距离定义为:
s
p
(
i
)
=
∥
O
i
−
1
k
∥
2
s_p(i)=\Vert O_i - 1_k\Vert_2
sp(i)=∥Oi−1k∥2。类间距离定义为:
s
n
j
(
i
)
=
∥
O
i
−
1
j
∥
2
(
j
≠
k
)
s_n^j(i)=\Vert O_i - 1_j\Vert_2(j\not= k)
snj(i)=∥Oi−1j∥2(j=k)。距离度量换成马氏距离/曼哈顿距离都是可以的。
例子二:基于余弦/向量积对类内类间的定义。对于两个单位向量,常常用它们之间的夹角来衡量两单位向量之间的相似性。它们之间的夹角正比于余弦夹角,而余弦夹角就是两向量的向量积。因此可以用向量积度量单位向量间的相似性。 1 k 1_k 1k是单位向量。 O i O_i Oi不一定。使用正交化处理一下: O i = O i / ∥ O i ∥ 2 O_i=O_i/\Vert O_i\Vert_2 Oi=Oi/∥Oi∥2。类内距离定义为: s p ( i ) = O i T 1 k s_p(i)=O_i^T1_k sp(i)=OiT1k。类间距离定义为: s n j ( i ) = O i T 1 j ( j ≠ k ) s_n^j(i)=O_i^T1_j(j\not= k) snj(i)=OiT1j(j=k)。
注释:对于基于欧式空间对类内类间的定义,输出值趋于零表示两个类越接近;对于基于余弦/向量积对类内类间的定义,输出值区域1表示两个类越接近。正好是相反的。
在Circle Loss
这篇论文中,作者倾向于使用基于余弦/向量积对类内类间的定义。这种使用可追溯到一些经典的人脸检测的损失函数设计论文。这里不去细讲。下面的讨论以基于余弦/向量积对类内类间的定义为主。
一切都还好。对于多分类问题,自然是希望网络的输出 O i O_i Oi尽可能地接近真值 1 k 1_k 1k,并尽可能地远离其他类 1 j ( j ≠ k ) 1_j(j\not= k) 1j(j=k)。翻译成数学语言,就是 s p ( i ) → 1 s_p(i) \rightarrow 1 sp(i)→1, s n j ( i ) → 0 ( j = 1 , . . . , M ; j ≠ i ) s_n^j(i) \rightarrow 0(j=1,...,M;j\not = i) snj(i)→0(j=1,...,M;j=i)。
前方高能。Circle Loss
提出一个统一的(Unified
)误差函数模型,如下所示:
L u n , i = log ( 1 + ∑ j ≠ i M exp [ γ ( s n j ( i ) − s p ( i ) + m ) ] ) L_{un,i} = \log(1+\sum_{j\not=i}^M\exp[\gamma(s_n^j(i)-s_p(i)+m)]) Lun,i=log(1+∑j=iMexp[γ(snj(i)−sp(i)+m)])
初次看到这个表达式无疑会一脸懵比。但是我们注意到它属于
L
i
=
log
(
1
+
exp
(
Δ
)
)
L_i=\log(1+\exp(\Delta))
Li=log(1+exp(Δ))这一类型,进而就知道它是SoftMax
和Cross-Entropy
的公式推导最终的形式。貌似
(
s
n
j
(
i
)
−
s
p
(
i
)
+
m
)
(s_n^j(i)-s_p(i)+m)
(snj(i)−sp(i)+m)这种奇怪的形式让人难以接受。
我们顺藤摸瓜想一想。训练器的最终目的是让
L
u
n
,
i
→
0
L_{un,i}\rightarrow 0
Lun,i→0,这等价于
(
s
n
j
(
i
)
−
s
p
(
i
)
+
m
)
→
−
∞
(s_n^j(i)-s_p(i)+m) \rightarrow -\infty
(snj(i)−sp(i)+m)→−∞。对于余弦距离来说,这肯定是达不到的。自然是期望
s
p
(
i
)
→
1
s_p(i) \rightarrow 1
sp(i)→1,
s
n
j
(
i
)
→
0
(
j
=
1
,
.
.
.
,
M
;
j
≠
i
)
s_n^j(i) \rightarrow 0(j=1,...,M;j\not = i)
snj(i)→0(j=1,...,M;j=i)。此时达到最小:
(
s
n
j
(
i
)
−
s
p
(
i
)
+
m
)
≥
(
−
1
+
m
)
(s_n^j(i)-s_p(i)+m) \geq (-1+m)
(snj(i)−sp(i)+m)≥(−1+m)。从数学角度讲,
m
m
m的设置貌似没什么意义,就放在哪里不去管它(想象一下QQ
中摊手那个表情)。
γ
\gamma
γ就是个普通的调节系数。至此,
L
u
n
,
i
L_{un,i}
Lun,i的结构算是理清楚了。
论文对 L u n , i L_{un,i} Lun,i做了一个简单的变形:
L u n , i = log ( 1 + ∑ j ≠ i M exp [ γ ( s n j ( i ) + m ) ] ⋅ exp [ − γ s p ( i ) ] ) L_{un,i} = \log(1+\sum_{j\not=i}^M\exp[\gamma(s_n^j(i)+m)]\cdot\exp[-\gamma s_p(i)]) Lun,i=log(1+∑j=iMexp[γ(snj(i)+m)]⋅exp[−γsp(i)])
该变形等价于一种AM-SoftMax
形式:
L u n , i = − log { exp ( γ ( s p ( i ) − m ) ) / [ exp ( γ ( s p ( i ) − m ) ) + ∑ j ≠ i M exp ( γ s n j ( i ) ) ] } L_{un,i}=-\log\{\exp(\gamma(s_p(i)-m))/[\exp(\gamma(s_p(i)-m))+\sum_{j\not=i}^M\exp(\gamma s_n^j(i))]\} Lun,i=−log{exp(γ(sp(i)−m))/[exp(γ(sp(i)−m))+∑j=iMexp(γsnj(i))]}
这种形式有点像是
−
log
(
S
o
f
t
M
a
x
)
-\log(SoftMax)
−log(SoftMax)。这体现了作者提出误差函数模型的统一性。它既可以转换为SoftMax
,也能转化为Triple Loss
(这篇博客没有列出来),一统江湖。
作者给出的Circle Loss
的Form-A
如下所示:
L c i r c , i = log ( 1 + ∑ j ≠ i M exp [ γ α n j s n j ( i ) ] ⋅ exp [ − γ α p s p ( i ) ] ) L_{circ,i} = \log(1+\sum_{j\not=i}^M\exp[\gamma\alpha_n^js_n^j(i)]\cdot\exp[-\gamma \alpha_p s_p(i)]) Lcirc,i=log(1+∑j=iMexp[γαnjsnj(i)]⋅exp[−γαpsp(i)])
跟 L u n , i L_{un,i} Lun,i多了些 α \alpha α类的参数。这些参数的定义如下所示:
α
n
j
=
[
O
n
−
s
n
j
(
i
)
]
+
\alpha_n^j = [O_n - s_n^j(i)]_+
αnj=[On−snj(i)]+
α
p
=
[
O
p
−
s
p
(
i
)
]
+
\alpha_p = [O_p-s_p(i)]_+
αp=[Op−sp(i)]+
参数 O n O_n On和 O p O_p Op是对应 s n j ( i ) s_n^j(i) snj(i)和 s p ( i ) s_p(i) sp(i)的优化后的理想值,即 O n = 0 O_n=0 On=0和 O p = 1 O_p=1 Op=1。
作者然后给出Circle Loss
的Form-B
如下所示:
L c i r c , i = log ( 1 + ∑ j ≠ i M exp [ γ α n j ( s n j ( i ) − Δ n ) ] ⋅ exp [ − γ α p ( s p ( i ) − Δ p ) ] ) L_{circ,i} = \log(1+\sum_{j\not=i}^M\exp[\gamma\alpha_n^j(s_n^j(i)-\Delta_n)]\cdot\exp[-\gamma \alpha_p (s_p(i)-\Delta_p)]) Lcirc,i=log(1+∑j=iMexp[γαnj(snj(i)−Δn)]⋅exp[−γαp(sp(i)−Δp)])
Δ n \Delta_n Δn和 Δ p \Delta_p Δp是自己设置的阈值参数。
Circle Loss
这篇论文的理论还是挺深的。这篇博客只是做一个入门的导读分析。Circle Loss
背后的理论有时间再去详细分析吧。
6. 结语
一点一点去研究深度学习的理论吧。慢慢来。