小白科研笔记:从MSE Loss到Cross-Entropy Loss到Focal Loss再到Circle Loss

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(yipi)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=(yipi)σ(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=(yipi)σ(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=(yipi)pi(1pi)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)+(1yi)log(1pi)]

初次看到这种形式会觉得奇怪。我做一些说明。当 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,i0 p i → 1 p_i\rightarrow 1 pi1。同理,当 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(1pi)。为了使 L c e , i → 0 L_{ce,i}\rightarrow 0 Lce,i0 p i → 0 p_i\rightarrow 0 pi0。因此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/pipi(1pi)x=(1pi)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(1pi)。偏导数 ∂ 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/(1pi)pi(1pi)x=(0pi)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=(yipi)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)+(1yi)log(1pi)]

记正样本的个数是 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=1Nplog(pi)+j=1Nnlog(1pj)

假设正样本的数量远大于负样本的数量,那么对于训练器而言,最小化 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(1pi),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(1pi),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={α(1pi)γlog(pi),(1α)piγlog(1pi),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=α(1pi)γ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=αγ(1pi)γ1log(pi)pi(1pi)α(1pi)γpi1pi(1pi)
∂ 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=αγ(1pi)γlog(pi)piα(1pi)γ+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=iNjMyi,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(1pi,j)γjyi,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(1pi,k)γklog(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 AkSoftMax的函数标记为 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 OiRM

一切都正常。接下来咱讨论类内(Within Class)和类间(Between Class)的概念。学过模式识别的话,对这个概念不会太陌生。假定大家都理解这个概念哈。在多分类问题中,类内和类间如何去定义呢?

我不想说得太抽象。我会举两个例子。

例子一:基于欧式空间对类内类间的定义。第 i i i个样本的标签是 A k A_k Akone-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)=Oi1k2。类间距离定义为: 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)=Oi1j2(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/Oi2。类内距离定义为: 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(Δ))这一类型,进而就知道它是SoftMaxCross-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,i0,这等价于 ( 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 LossForm-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=[Onsnj(i)]+
α p = [ O p − s p ( i ) ] + \alpha_p = [O_p-s_p(i)]_+ αp=[Opsp(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 LossForm-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. 结语

一点一点去研究深度学习的理论吧。慢慢来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值