损失函数

原文链接:https://www.yuque.com/yahei/hey-yahei/target_function

目标函数(target function)、损失函数(loss function)、代价函数(cost function)是一个东西~
目标函数是一个用来衡量模型预测结果与实际结果(通常称为Ground Truth)之间差距的一个函数,在深度学习中,训练模型通常就是指以最小化该差距为目标进行反向传播和更新参数。
参考:

  • 《卷积神经网络——深度学习实践手册(2017.05)》Chap9
  • torch.nn#loss-function

分类任务

记某分类任务共 N N N 个训练样本,
网络最后的分类层第i个样本的输入特征为 x i x_i xi
真实标记为 y i ∈ 1 , 2 , . . . , C y_i \in {1,2,...,C} yi1,2,...,C (C为类别总数),
网络最终输出预测结果(指示每种分类的可能性) h = ( h 1 , h 2 , . . . , h C ) T h = (h_1, h_2, ..., h_C)^T h=(h1,h2,...,hC)T

sigmoid和softmax

两者都是分类任务常用的归一化函数,用来归一化模型最后输出的特征向量,得到每个分类的预测概率。

sigmoid函数

也称为logistic函数。
sigmoid函数除了输出预测概率之外,也可以用来作为激活函数,在relu出现之前就是常见的激活函数,此外最近比较流行的swish激活函数也是基于sigmoid的;同时,由于sigmoid可以方便地得到二分类的预测概率,通常也用来进行某些“打分”,比如SE模块就用sigmoid函数来为特征图的各个通道打分,进而作为权重来实现注意力机制。
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+ez1
损失函数_第1张图片

  • 输出范围为(0, 1),恰好可以作为概率输出
  • σ ( 0 ) = 0.5 \sigma(0)=0.5 σ(0)=0.5,当z增大时 σ ( z ) \sigma(z) σ(z)迅速增大并收敛于1,相反,当z减小时 σ ( z ) \sigma(z) σ(z)迅速减小并收敛于0
  • 不仅可导,而且导数很容易计算

$$\begin{aligned}
\sigma’(z)
&= \frac{e{-z}}{(1+e{-z})^2} \
&= \frac{1}{1+e{-z}}(1-\frac{1}{1+e{-z}}) \
&= \sigma(z) \cdot (1-\sigma(z))

\end{aligned}$$

  • 但sigmoid是典型的饱和函数,当 ∣ z ∣ |z| z比较大时, σ ( z ) → 0 \sigma(z) \rightarrow 0 σ(z)0,这是不利于训练的,详细讨论可以参考《梯度消失与梯度爆炸 - ReLU | Hey~YaHei!》,此处就不再赘述

softmax函数

参考:

  • 如何防止softmax函数上溢出(overflow)和下溢出(underflow) | learnhard
  • 关于Softmax函数的三个问题 | 简书, 牧世


s o f t m a x ( h i ) = e h i ∑ j = 1 C e h j softmax(h_i) = \frac{e^{h_i}}{\sum_{j=1}^C e^{h_j}} softmax(hi)=j=1Cehjehi

  • 显然 ∑ i = 1 C s o f t m a x ( h i ) = 1 \sum_{i=1}^{C} softmax(h_i) = 1 i=1Csoftmax(hi)=1,可以作为每个分类的预测概率
  • softmax可以看作是sigmoid的多分类版本
    C = 2 C=2 C=2时,跟sigmoid其实是等价的,只不过同时输出两个概率罢了
  • 溢出问题**
    1. 什么是溢出?
      计算机数值的表示范围是有限的,如果超出范围则称为“溢出”,大于最大值称为“上溢出”,小于最小值称为“下溢出”——对于有符号数,下溢出往往是被舍入为0;
    2. softmax溢出
      为简单起见,假设 h 0 = h 1 = . . . = h C = c h_0=h_1=...=h_C=c h0=h1=...=hC=c
      按照softmax的数学定义,应该有 s o f t m a x ( h 0 ) = s o f t m a x ( h 1 ) = . . . = s o f t m a x ( h C ) = 1 C softmax(h_0)=softmax(h_1)=...=softmax(h_C)=\frac{1}{C} softmax(h0)=softmax(h1)=...=softmax(hC)=C1
      但当 ∣ c ∣ |c| c非常大时,存在一些极端情况:
      1. 如果 c > 0 c>0 c>0 e c e^c ec将非常大,甚至超出浮点数值的表示范围
      2. 如果 c < 0 c<0 c<0 e c e^c ec将非常小,以至于因为下溢出出现 e c = 0 e^c=0 ec=0致使softmax分母为0
    3. 如何解决溢出

s o f t m a x ( h i ) = e h i − M ∑ j = 1 C e h j − M softmax(h_i) = \frac{e^{h_i - M}}{\sum^C_{j=1} e^{h_j - M}} softmax(hi)=j=1CehjMehiM
其中 M = m a x ( h 0 , h 1 , . . . , h C ) M=max(h_0,h_1, ..., h_C) M=max(h0,h1,...,hC)

1. 显然$$h_j-M \leq 0$$,不可能出现上溢出
1. 下溢出不可避免,但分母中至少有一项$$e^{h_j - M} = e^0 = 1$$,避免了分母为0的情况
  • 为什么要以e为底?
    事实上用其他底数也可以;
    但以e为底的指数导数比较简洁, ( e z ) ′ = e z (e^z)'=e^z (ez)=ez,所以sigmoid和softmax就选用了e作为底数

交叉熵(cross entropy)

目前分类任务最常用的损失函数;
L c e = − 1 N ∑ i y i l o g ( h i ) L_{ce} = - \frac{1}{N} \sum_i y_i log (h_i) Lce=N1iyilog(hi)
如果是用独热码表示,则 L c e = − 1 N l o g ( h c l a s s ) L_{ce} = -\frac{1}{N} log (h_{class}) Lce=N1log(hclass)

把softmax和交叉熵结合起来,
L s o f t m a x − c e = − 1 N ∑ i = 1 N y i l o g ( e h y i ∑ j = 1 C e h j ) L_{softmax-ce} = -\frac{1}{N} \sum_{i=1}^N y_i log( \frac{e^{h_{y_i}}}{\sum_{j=1}^C e^{h_j}} ) Lsoftmaxce=N1i=1Nyilog(j=1Cehjehyi)
如果是独热码表示,则 L s o f t m a x − c e = − 1 N l o g ( e h c l a s s ∑ j = 1 C e h j ) = − 1 N ( h c l a s s − l o g ( ∑ j = 1 C e h j ) ) L_{softmax-ce} = - \frac{1}{N} log (\frac{e^{h_{class}}}{\sum_{j=1}^C e^{h_j}}) = -\frac{1}{N} (h_{class} - log (\sum^C_{j=1} e^{h_j})) Lsoftmaxce=N1log(j=1Cehjehclass)=N1(hclasslog(j=1Cehj))

除了交叉熵,我们通常还能听到信息熵、相对熵——

信息熵 交叉熵 相对熵
含义 又称“香农熵”,用来衡量序列里信息的丰富程度 衡量两个序列之间的差距,通常用作损失函数 又称“KL散度”,用来衡量两个序列在分布上的差距,也可以作为损失函数
表示

|
|
|

合页(hinge)

主要在SVM中广泛使用,有时也用于神经网络模型;
设计理念为“对错误越大的样本施加越严重的惩罚”;
一般在分类任务中,交叉熵效果要略优于合页
L h i n g e = 1 N ∑ i = 1 N m a x ( 0 , 1 − h y i ) L_{hinge} = \frac{1}{N} \sum_{i=1}^N max(0, 1-h_{y_i}) Lhinge=N1i=1Nmax(0,1hyi)

坡道(ramp)

论文:《Trading convexity for scalability(2006)》
合页损失函数对噪声的抵抗能力较差,非凸损失函数的引入可以很好的解决这个问题;
而坡道损失函数、Tukey’s biweight损失函数分别是分类任务、回归任务中非凸损失函数的代表,又称“鲁棒损失函数”;
它们在误差较大的区域进行截断,使得较大的误差不会大程度地影响整个误差函数;
但其非凸性质在传统机器学习中难以优化,但得益于神经网络模型的训练机制,这点非凸性质不成问题:
L r a m p − l o s s = L h i n g e − l o s s − 1 N ∑ i = 1 N m a x ( 0 , s − h y i ) L_{ramp-loss} = L_{hinge-loss} - \frac{1}{N} \sum_{i=1}^N max(0, s-h_{y_i}) Lramploss=LhingelossN1i=1Nmax(0,shyi)
展开为:
L r a m p − l o s s = 1 N ∑ i = 1 N ( m a x ( 0 , 1 − h y i ) − m a x ( 0 , s − h y i ) ) L_{ramp-loss} = \frac{1}{N} \sum_{i=1}^N ( max(0, 1-h_{y_i}) - max(0, s-h_{y_i}) ) Lramploss=N1i=1N(max(0,1hyi)max(0,shyi))
其中,s指定了截断点的位置,如下图所示(s=-0.5)——
损失函数_第2张图片
此外,论文《Robust Truncated Hinge Loss Support Vector Machines(2007) 》经过理论推导指出,一般设置 s = − 1 C − 1 s = - \frac{1}{C-1} s=C11

交叉熵的变体

基于交叉熵设计的新型损失函数,考虑了增加类间距离、减少类内差异等不同要素,提升网络学习特征的判别能力;

大间隔交叉熵(large-margin softmax):
论文:《Large-Margin Softmax Loss for Convolutional Neural Networks(2017)》

首先考虑传统的交叉熵损失函数,根据 h = W T x i h=W^T x_i h=WTxi 将其展开为——
L s o f t m a x − l o s s = − 1 N ∑ i = 1 N l o g ( e W y i T x i ∑ j = 1 C e W j T x i ) L_{softmax-loss} = -\frac{1}{N} \sum_{i=1}^N log( \frac{ e^{ W^T_{y_i} x_i } }{ \sum_{j=1}^C e^{ W^T_j x_i } } ) Lsoftmaxloss=N1i=1Nlog(j=1CeWjTxieWyiTxi)
根据内积定义进一步展开为——
L s o f t m a x − l o s s = − 1 N ∑ i = 1 N l o g ( e ∣ ∣ W y i ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( θ y i ) ∑ j = 1 C e ∣ ∣ W j ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( θ j ) ) L_{softmax-loss} = -\frac{1}{N} \sum_{i=1}^N log( \frac{ e^{ ||W_{y_i}|| ||x_i|| cos(\theta_{y_i}) } }{ \sum_{j=1}^C e^{ ||W_j|| ||x_i|| cos(\theta_j) } } ) Lsoftmaxloss=N1i=1Nlog(j=1CeWjxicos(θj)eWyixicos(θyi))
比如二分类,传统交叉熵使得学到的参数满足 W 1 T x i > W 2 T x i W_1^T x_i > W_2^T x_i W1Txi>W2Txi,也即
∣ ∣ W 1 ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( θ 1 ) > ∣ ∣ W 2 ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( θ 2 ) ||W_1|| ||x_i|| cos(\theta_1) > ||W_2|| ||x_i|| cos(\theta_2) W1xicos(θ1)>W2xicos(θ2)
大间隔交叉熵则在上式的基础上,引入超参数m拉开两个分类的差距,即——
∣ ∣ W 1 ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( m θ 1 ) > ∣ ∣ W 2 ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( θ 2 ) , 0 < = θ 1 < = π m 且 m ∈ N + ||W_1|| ||x_i|| cos(m \theta_1) > ||W_2|| ||x_i|| cos(\theta_2), 0<= \theta_1 <= \frac{\pi}{m} 且 m \in N^+ W1xicos(mθ1)>W2xicos(θ2),0<=θ1<=mπmN+
m起到控制间隔大小的作用,m越大,类间间隔(即差距)越大,类间分类的置信度越大;当 m = 1 m=1 m=1 时将退化为传统交叉熵

完整定义:
L l a r g e − m a r g i n − s o f t m a x − l o s s = − 1 N l o g ( e ∣ ∣ W y i ∣ ∣ ∣ ∣ x i ∣ ∣ ϕ ( θ y i ) e ∣ ∣ W y i ∣ ∣ ∣ ∣ x i ∣ ∣ ϕ ( θ y i ) + ∑ j ≠ y i e ∣ ∣ W j ∣ ∣ ∣ ∣ x i ∣ ∣ c o s ( θ j ) ) L_{large-margin-softmax-loss} = -\frac{1}{N} log( \frac{ e^{ ||W_{y_i}|| ||x_i|| \phi(\theta_{y_i}) } }{ e^{ ||W_{y_i}|| ||x_i|| \phi(\theta_{y_i}) + \sum_{j \ne y_i} e^{ ||W_j|| ||x_i|| cos(\theta_j) } } } ) Llargemarginsoftmaxloss=N1log(eWyixiϕ(θyi)+j=yieWjxicos(θj)eWyixiϕ(θyi))
其中,KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \phi(\theta) =…
式中 D ( θ ) D(\theta) D(θ) 只需满足“单调递减”,且 D ( π m ) = c o s ( π m ) D(\frac{\pi}{m}) = cos(\frac{\pi}{m}) D(mπ)=cos(mπ) 即可;
为了简化网络前向和反向计算,论文推荐了一种具体的形式如下——
ϕ ( θ ) = ( − 1 ) k c o s ( m θ ) − 2 k , θ ∈ [ k π m , ( k + 1 ) π m ] \phi(\theta) = (-1)^k cos(m \theta) - 2k, \theta \in [\frac{k \pi}{m}, \frac{(k+1)\pi}{m}] ϕ(θ)=(1)kcos(mθ)2k,θ[mkπ,m(k+1)π]
其中,k为整数且满足 k ∈ [ 0 , m − 1 ] k \in [0, m-1] k[0,m1]

二分类情况下的比较——
损失函数_第3张图片

此时训练目标要比传统交叉熵损失函数更加困难;
不过好处是可以起到防止模型过拟合的作用;
在分类性能方面,大间隔交叉熵要优于传统交叉熵和合页;

中心损失函数(center loss function):
论文:《A Discriminative Feature Learning Approach for Deep Face Recognition(2016)》

中心损失函数定义:
L c e n t e r − l o s s = 1 2 ∑ i = 1 N ∣ ∣ x i c y i ∣ ∣ 2 2 L_{center-loss} = \frac{1}{2} \sum_{i=1}^N ||x_i c_{y_i} ||^2_2 Lcenterloss=21i=1Nxicyi22
其中, c y i c_{y_i} cyi 为第 y i y_i yi 类所有深度特征的均值(中心);
这将迫使样本与中心不要距离太远,否则加大惩罚;

中心损失函数只考虑了类内差异,所以通常要与考虑类间举例的损失函数(如交叉熵)配合使用,变化为——
L f i n a l = L c r o s s − e n t r o p y − l o s s + λ L c e n t e r − l o s s ( h , y i ) L_{final} = L_{cross-entropy-loss} + \lambda L_{center-loss}(h, y_i) Lfinal=Lcrossentropyloss+λLcenterloss(h,yi)
展开为——
L f i n a l = − 1 N ∑ i = 1 N l o g ( e h y i ∑ j = 1 C e h j ) + λ 2 ∑ i = 1 N ∣ ∣ x i − c y i ∣ ∣ 2 2 L_{final} = -\frac{1}{N} \sum_{i=1}^N log ( \frac{e^{h_{y_i}}}{\sum_{j=1}^C e^{h_j}} ) + \frac{\lambda}{2} \sum_{i=1}^N ||x_i - c_{y_i} ||^2_2 Lfinal=N1i=1Nlog(j=1Cehjehyi)+2λi=1Nxicyi22
式中, λ \lambda λ 为两个损失函数之间的权衡因子, λ \lambda λ越大类内差异占整个目标函数的比重越大;

中心损失函数搭配传统交叉熵函数在分类性能上优于单独的传统交叉熵;
尤其在人脸识别任务上有较大的提升

回归任务

回归任务通常用残差衡量预测值和真实值的靠近程度;
记回归问题第i个输入特征 x i x_i xi
真实标记为 y i = ( y 1 , y 2 , . . . , y M ) T y^i = (y_1, y_2, ..., y_M)^T yi=(y1,y2,...,yM)T,M为标记向量的总维度;
预测值为 y ^ i \hat{y}^i y^i
l t i = y t i − y ^ t i l^i_t = y^i_t - \hat{y}^i_t lti=ytiy^ti 表示样本i上预测值与真实值在第t维上的预测误差;

l1、l2、Tukey’s biweight损失函数如下图所示——
损失函数_第4张图片

L1

L l 1 − l o s s = 1 N ∑ i = 1 N ∑ t = 1 M ∣ l T i ∣ L_{l_1-loss} = \frac{1}{N} \sum_{i=1}^N \sum_{t=1}^M |l^i_T| Ll1loss=N1i=1Nt=1MlTi

L2(MSE)

L l 2 − l o s s = 1 N ∑ i = 1 N ∑ t = 1 M ( l T i ) 2 L_{l_2-loss} = \frac{1}{N} \sum_{i=1}^N \sum_{t=1}^M (l^i_T)^2 Ll2loss=N1i=1Nt=1M(lTi)2
一般l1和l2在回归精度上所差无几,但一些情况下l2会略优于l1;
l2收敛略快于l1;

SmoothL1

参考:《请问 faster RCNN 和 SSD 中为什么用smooth L1 loss,和L2有什么区别? - 尹相楠的回答 | 知乎》
smooth ⁡ L 1 ( l T i ) = { 0.5 ( l T i ) 2  if  ∣ l T i ∣ < 1 ∣ l T i ∣ − 0.5  otherwise  \operatorname{smooth}_{L_{1}}(l^i_T)=\left\{\begin{array}{ll} 0.5 (l^i_T)^{2} & \text { if }|l^i_T|<1 \\ |l^i_T|-0.5 & \text { otherwise } \end{array}\right. smoothL1(lTi)={0.5(lTi)2lTi0.5 if lTi<1 otherwise 
损失函数_第5张图片
L1的导数为常量 ± 1 \pm1 ±1,训练后期预测结果与ground truth相差较小,在学习率不变的前提下,模型难以收敛到更优的位置;
L2的导数为 2 x 2x 2x,训练前期预测结果与ground truth相差较大,此时梯度偏大,致使训练不稳定;
而SmoothL1相当于L1和L2的结合,在绝对值较小的部分使用L2,在绝对值较大的部分使用L1,解决了上述两个问题。

Tukey’s biweight

论文:《Robust Optimization for Deep Regression(2015)》
非凸损失函数,定义:
L T u k e y ′ s − b i w e i g h t s − l o s s = { c 2 6 N ∑ i = 1 N ∑ t = 1 M [ 1 − ( 1 − ( l t i c ) 2 ) 3 ] , ∣ l t i ∣ < = c c 2 M 6 , ∣ l t i ∣ > c L_{Tukey's-biweights-loss} = \begin{cases} \frac{c^2}{6N} \sum_{i=1}^N \sum_{t=1}^M [1-(1-(\frac{l^i_t}{c})^2)^3] , & |l^i_t| <= c\\ \frac{c^2 M}{6}, & |l^i_t| > c \end{cases} LTukeysbiweightsloss={6Nc2i=1Nt=1M[1(1(clti)2)3],6c2M,lti<=clti>c
其中,常数c指定了函数拐点,通常取 c = 4.6851 c=4.6851 c=4.6851,此时该损失函数可以与l2在最小化符合标准正态分布的残差类似的回归效果

分布估计:KL散度

实际问题往往不能简单划为回归任务或者分类任务。
如年龄估计中,经常会表达“看起来30岁左右”;
此时通常采用一个“标记的分布”来描述,如均值为30的一个正态分布;
此外,在头部倾斜角度估计、多标记分类、图像语义分割等问题上也存在类似的问题;

通常先将h转化为一个合法的分布(比如用softmax函数);
用KL散度(Kullback-Leibler divergence)来衡量真实标记和预测分布的误差,此时也称为KL损失:
L K L − l o s s = ∑ k y k l o g y k y ^ k L_{KL-loss} = \sum_k y_k log \frac{y_k}{\hat{y}_k} LKLloss=kyklogy^kyk
因为 y k y_k yk是已知的常量(真实标记),上式等价为:
L K L − l o s s = − ∑ k y k l o g y ^ k L_{KL-loss} = - \sum_k y_k log \hat{y}_k LKLloss=kyklogy^k

你可能感兴趣的:(损失函数)