上文主要介绍了回归任务中常用的几个损失函数,本文则主要介绍分类任务中的损失函数。
为了与回归任务的损失函数形式相统一,此处仅考虑某一条数据的损失函数。
在分类任务中,假设一共有
n
n
n个类别。该数据的真实值
Y
Y
Y一般用独热编码(只有某一位为1,其余都是0的向量)表示,
Y
=
(
0
,
0
,
?
?
,
0
,
1
,
0
,
?
?
,
0
)
Y=(0,0,\cdots,0,1,0,\cdots,0)
Y=(0,0,?,0,1,0,?,0),其中只有第
k
k
k维为1,其它维都是0,表示该数据的真实类别为第
k
k
k类。该数据的预测值用
Y
^
\widehat{Y}
Y
表示,
Y
^
=
(
y
^
1
,
y
^
2
,
?
?
,
y
^
n
)
\widehat{Y}=(\widehat{y}_{1},\widehat{y}_{2},\cdots,\widehat{y}_{n})
Y
=(y
?1?,y
?2?,?,y
?n?),其中
y
^
i
\widehat{y}_{i}
y
?i?表示预测该数据属于第
i
i
i类的概率。由于是概率,所以
?
i
∈
Z
,
1
≤
i
≤
n
\forall i \in \mathbb{Z},1\leq i \leq n
?i∈Z,1≤i≤n,下式成立:
{
0
≤
y
^
i
≤
1
∑
i
=
1
n
y
^
i
=
1
\begin{cases} 0\leq\widehat{y}_{i}\leq1\\ \sum_{i=1}^n\widehat{y}_{i}=1\\ \end{cases}
{0≤y
?i?≤1∑i=1n?y
?i?=1?
本质上,分类任务任务中的损失函数也是量化两个向量 Y Y Y与 Y ^ \widehat{Y} Y 之间的差距。那么是否可以套用回归任务中的损失函数呢?我们套用MAE的公式看看。
M A E ( Y , Y ^ ) = 1 n ∑ i = 1 n ∣ y i ? y ^ i ∣ ≤ 1 n ∑ i = 1 n 1 = 1 MAE(Y,\widehat{Y})=\frac{1}{n}\sum_{i=1}^n |y_i-\widehat{y}_i|\leq\frac{1}{n}\sum_{i=1}^n{1}=1 MAE(Y,Y )=n1?∑i=1n?∣yi??y ?i?∣≤n1?∑i=1n?1=1
会发现MAE的值始终落在 [ 0 , 1 ] [0,1] [0,1]中。我们希望损失函数展现出更大的弹性,当预测概率与真实结果概率差异越大时,给与更大的损失惩罚。所以我们要重新推导一套针对概率分布的损失函数。
交叉熵,英文为cross entropy。公式为
L
o
s
s
(
Y
,
Y
^
)
=
?
∑
i
=
1
n
y
i
l
o
g
y
^
i
=
?
l
o
g
y
^
k
Loss(Y,\widehat{Y})=-\sum_{i=1}^n y_i log\widehat{y}_i=-log\widehat{y}_k
Loss(Y,Y
)=?∑i=1n?yi?logy
?i?=?logy
?k?
该公式可以从两个角度来理解,分别是最大似然的角度和信息论的角度。
假设一个箱子里有 n n n种类型的球,我们不能打开箱子,只能通过有放回地取出其中的球(简称采样),现在我们要根据采样结果估计这些球在箱子中的比例。假设我们估计的第 i i i种类型的球的比例为 y ^ i \widehat{y}_i y ?i?。
假设我们现在抽球,第一次抽到了1类球,第二次抽到了2类球,第三次又抽到了1类球。那么这个事件在我们的估计中发生的概率为 y ^ 1 2 y ^ 2 \widehat{y}_1^2 \widehat{y}_2 y ?12?y ?2?。一般地,假设我们用 y i y_i yi?表示第 i i i类球抽到的次数,那么事件 Y = ( y 1 , y 2 , ? ? , y n ) Y=(y_1,y_2,\cdots,y_n) Y=(y1?,y2?,?,yn?)在我们的估计中发生的概率为 ∑ i = 1 n y ^ i y i \sum_{i=1}^n \widehat{y}_i^{y_i} ∑i=1n?y ?iyi??。(这里假定已知抽出球的顺序,若不知道顺序,则需要乘以一些组合数,由于组合数为常数,可以忽略。)
最大似然的思想假定已经发生的事情就是概率最大的事情。按照该思想,就是要使得 ∑ i = 1 n y ^ i y i \sum_{i=1}^n \widehat{y}_i^{y_i} ∑i=1n?y ?iyi??最大化。为了方便计算,这里不妨对该式取对数(底数无所谓,取底数为2或者e都可以),即为 ∑ i = 1 n y i l o g 2 y ^ i \sum_{i=1}^n y_i log_2 \widehat{y}_i ∑i=1n?yi?log2?y ?i?。那么使得该式最大的 Y ^ = ( y ^ 1 , y ^ 2 , ? ? , y ^ n ) \widehat{Y}=(\widehat{y}_{1},\widehat{y}_{2},\cdots,\widehat{y}_{n}) Y =(y ?1?,y ?2?,?,y ?n?)就是我们根据采样求出的最有可能的每类球的比例。
损失函数要求最小化,而不是最大化,故需要在 ∑ i = 1 n y i l o g 2 y ^ i \sum_{i=1}^n y_i log_2 \widehat{y}_i ∑i=1n?yi?log2?y ?i?前加个负号,变成 ? ∑ i = 1 n y i l o g 2 y ^ i -\sum_{i=1}^n y_i log_2 \widehat{y}_i ?∑i=1n?yi?log2?y ?i?,且取负号之后该式刚好非负,这就是大名鼎鼎的交叉熵。在分类任务中,我们已经知道 Y Y Y,相当于已经有了采样结果,那么需要通过最小化损失函数,使得 Y ^ \widehat{Y} Y 更加逼近真实情况。如果已知该实例的分类结果属于第 k k k类,那么上面的损失函数还可以化简,变成 ? l o g 2 y ^ k -log_2\widehat{y}_k ?log2?y ?k?。
可能有人会问,既然我们已经知道该实例属于第 k k k类,那为什么不直接求出 y ^ k = 1 \widehat{y}_k=1 y ?k?=1,其余都为0。为什么要通过损失函数绕这么大一个圈子来求。这是因为我们的损失函数是用在神经网络中的, y ^ i \widehat{y}_i y ?i?是通过一系列复杂的表达式求出来的,我们在使 y ^ k \widehat{y}_k y ?k?靠近1的过程中,其实是在训练神经网络中的一些参数,使神经网络在遇到其它不知道真实分类结果的时候也能给出正确分类。而且由于噪声的存在,我们不能只顾这一个实例,如果把这个例子训练得很好,可能在别的例子中也不一定能达到很好的效果,所以要通过一个损失函数来量化我们的训练结果与真实结果之间的差距,这样才能顾全大局,训练出使得全局最优的参数。
因为可以从最大似然的角度推出该公式,所以交叉熵损失函数又可以称为负对数似然(NLL)损失函数。
信息论是研究信息的产生、传输、存储、处理和度量的数学理论,是信息论之父香农提出的一套理论。这里简单介绍一些基本概念,然后推出我们的交叉熵损失函数。
若一个事件A发生的概率为 p p p,则A的信息量的定义为 l o g 2 1 p = ? l o g 2 p log_2\frac{1}{p}=-log_2p log2?p1?=?log2?p。该函数在 p ∈ [ 0 , 1 ] p\in[0,1] p∈[0,1]时单调递减且恒为非负。这个定义比较符合直觉,一个发生概率越小的事件发生了所带来的信息量肯定是更多的。一个发生概率很大的事件发生了,大家也不会感到奇怪,因为信息量比较小。
信息熵是一个信息带来的不确定性,也可以理解为一个信息的信息量。对于一个信息来说,可能会传达 n n n种事件。而一个信息的信息量,其实就是各种可能发生的事件的信息量的数学期望。公式为
? ∑ i = 1 n p i l o g 2 p i -\sum_{i=1}^np_ilog_2p_i ?∑i=1n?pi?log2?pi?
信息论中,信息熵也代表着对信息编码所需要的最短平均编码长度,而这种编码方式是根据信息的概率分布编码的。在这种编码方式下,一个事件的编码长度与其信息量相等。一个事件发生概率越高,其信息量越小,编码长度也越短,只有这样才能降低平均编码长度。
为了方便理解,举个具体的例子。一个选择题有四个选项ABCD,假设我们想要传输它的答案(只能用0和1传输),则需要一套编码方式。假设我们用(00,01,10,11)表示(A,B,C,D),则这套编码方式的平均编码长度就是2。假设这道题选ABCD的概率均为 1 4 \frac{1}{4} 41?,那么这道题选ABCD的信息量均为2,该选择题的信息熵也为2。但是,如果这道题选ABCD的概率分别为 ( 1 4 , 1 8 , 1 2 , 1 8 ) (\frac{1}{4},\frac{1}{8},\frac{1}{2},\frac{1}{8}) (41?,81?,21?,81?),此时该选择题的信息量为1.75,那么其实存在一种更好的编码方式——用(10,110,0,111)来表示(A,B,C,D)。(此处的编码刚好为哈夫曼编码。)此时每个选项的编码长度刚好与其信息量相等,平均编码长度也达到了最小值1.75,恰好等于该选择题的信息熵。
要使得信息的编码长度最短,其精髓在于赋予概率较大的事件以较短的编码长度,赋予概率较小的事件以较大的编码长度。而研究表明,编码长度等于信息量时,会使得信息的平均编码长度最短。(虽然在实际应用中,编码长度须为整数,但是在理论研究中,编码长度不一定要是整数。)
根据事件的发生概率(信息量)来编码,会使得平均编码长度最短,那如果不按照这种方式编码呢?假设我们有一个概率分布 ( q 1 , q 2 , ? ? , q n ) (q_1,q_2,\cdots,q_n) (q1?,q2?,?,qn?),用 ( ? l o g 2 q 1 , ? l o g 2 q 2 , ? ? , ? l o g 2 q n ) (-log_2q_1,-log_2q2,\cdots,-log_2q_n) (?log2?q1?,?log2?q2,?,?log2?qn?)作为每一个事件的编码长度,那么平均编码长度为 ? ∑ i = 1 n p i l o g 2 q i -\sum_{i=1}^np_ilog_2q_i ?∑i=1n?pi?log2?qi?。该式即为交叉熵。交叉熵代表了用非真实分布来编码某个信息所需要的平均编码长度。而当 q i = p i ( 1 ≤ i ≤ n ) q_i=p_i(1\leq i\leq n) qi?=pi?(1≤i≤n)时,交叉熵取到最小值,此时的值即为该信息的信息熵,也即最短平均编码长度。
回到我们的损失函数上面来。交叉熵看起来说的是编码长度,但其实也可以衡量两个概率分布之间的相似性。平均编码长度越短,就代表两个概率分布越接近。需要注意的是,交叉熵并不是一个对称的度量,交换 p i p_i pi?和 q i q_i qi?的位置不会得到相同的结果。我们取 p i p_i pi?为真实的分布, q i q_i qi?为预测的分布。在神经网络中, p i p_i pi?对应的就是 y i y_i yi?,是我们的真实标签,而 q i q_i qi?对应的则是 y ^ i \widehat{y}_i y ?i?,是预测的结果。所以我们的交叉熵损失函数即为 ? ∑ i = 1 n y i l o g 2 y ^ i -\sum_{i=1}^n y_i log_2\widehat{y}_i ?∑i=1n?yi?log2?y ?i?。
KL散度(Kullback-Leibler散度),又称为相对熵,公式为 ∑ i = 1 n y i l o g 2 y i y ^ i = ? l o g y ^ k \sum_{i=1}^ny_ilog_2\frac{y_i}{\widehat{y}_i}=-log\widehat{y}_k ∑i=1n?yi?log2?y ?i?yi??=?logy ?k?
在真实标签确定的情况下,KL散度和交叉熵损失函数其实是一样的。
在信息论中,KL散度表示基于不同概率分布所需的额外编码长度。
假设有两个分布 P ( x ) P(x) P(x)和 Q ( x ) Q(x) Q(x),根据信息论的知识,P的最小编码长度为 ? ∑ P ( x ) l o g 2 P ( x ) -\sum P(x)log_2P(x) ?∑P(x)log2?P(x),基于概率分布Q来编码P的编码长度为 ? ∑ P ( x ) l o g 2 Q ( x ) -\sum P(x)log_2Q(x) ?∑P(x)log2?Q(x)(此处即为交叉熵),那么基于Q的编码来编码来自P的样本平均额外增加的长度为 ? ∑ P ( x ) l o g 2 Q ( x ) + ∑ P ( x ) l o g 2 P ( x ) = ∑ P ( x ) l o g 2 P ( x ) Q ( x ) -\sum P(x)log_2Q(x)+\sum P(x)log_2P(x)=\sum P(x)log_2\frac{P(x)}{Q(x)} ?∑P(x)log2?Q(x)+∑P(x)log2?P(x)=∑P(x)log2?Q(x)P(x)?,这个值即为KL散度。由于KL散度=交叉熵-信息熵,所以KL散度又被称为相对熵。当 P ( x ) P(x) P(x)为常数分布时,信息熵为0,所以KL散度此时等于交叉熵。
KL散度可以衡量两个概率分布之间的接近程度。KL散度越小,表示两个概率分布越接近。KL散度是一个非对称度量,为了解决非对称的问题,又提出了JS散度。
余弦相似度损失函数(Cosine Similarity Loss)的公式为 1 ? y ^ k ∣ Y ^ ∣ 1-\frac{\widehat{y}_k}{|\widehat{Y}|} 1?∣Y ∣y ?k??
我们来推导一下这个公式。
根据向量的点积公式 Y ? Y ^ = ∣ Y ∣ ∣ Y ^ ∣ c o s θ Y\cdot\widehat{Y}=|Y||\widehat{Y}|cos\theta Y?Y =∣Y∣∣Y ∣cosθ,有
c o s θ = Y ? Y ^ ∣ Y ∣ ∣ Y ^ ∣ cos\theta=\frac{Y\cdot\widehat{Y}}{|Y||\widehat{Y}|} cosθ=∣Y∣∣Y ∣Y?Y ?
由于 Y Y Y只有第 k k k维为1,其余都为0,并且 ∣ Y ∣ = 1 |Y|=1 ∣Y∣=1,于是有
c o s θ = Y ? Y ^ ∣ Y ^ ∣ = y ^ k ∣ Y ^ ∣ cos\theta=\frac{Y\cdot\widehat{Y}}{|\widehat{Y}|}=\frac{\widehat{y}_k}{|\widehat{Y}|} cosθ=∣Y ∣Y?Y ?=∣Y ∣y ?k??
θ \theta θ表示 Y Y Y与 Y ^ \widehat{Y} Y 之间的角度,角度越小表示这两个向量越接近。为了使角度为0时,损失函数也为0,所以我们用 1 ? c o s θ 1-cos\theta 1?cosθ作为损失函数。
在实际应用中,交叉熵是使用最为广泛的损失函数。本文从最大似然和信息论两个角度推导出了交叉熵损失函数。同时又介绍了KL散度和余弦相似度损失函数。