首先纠正一个问题,在之前的内容里不止一次提到两个函数:
- L ( θ ) L(\theta) L(θ),即loss function,损失函数
- C ( y , y ^ ) C(y,\hat y) C(y,y^),即cost function,代价函数
我们的推理建立在 L ( θ ) = ∑ C ( y , y ^ ) L(\theta)=\sum C(y,\hat y) L(θ)=∑C(y,y^)的基础上,即 C C C是针对一个样本的, L L L是针对一组样本的,最终的目标是寻找一个能使 L L L最小的 θ \theta θ
然而上面的定义是有问题的,标准定义如下:
- 损失函数(loss function) L ( y , y ^ ) L(y,\hat y) L(y,y^)定义在单个样本上的,算的是一个样本的误差
- 代价函数(cost function) C ( θ ) C(\theta) C(θ)定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均
可以发现正确的定义和我们之前所使用的恰好相反,但是无伤大雅,因为这只是命名上的差异罢了,说白了都是自己折腾自己,在不同的领域相同的东西也有不同的叫法,只要保证在推理过程中的统一就可以了(当然,符合约定俗成的规矩也很重要,但是在理解层面并不影响),所以在以下的内容中改用为标准定义
损失函数是用于衡量模型所作出的预测离真实值(Ground Truth)之间的偏离程度,并没有一种万能的损失函数能够适用于所有的机器学习任务,所以在这里我们需要知道每一种损失函数的优点和局限性,才能更好的利用它们去解决实际的问题。损失函数大致可分为两种:回归损失(针对连续型变量)和分类损失(针对离散型变量)
KL散度(相对熵)
Kullback-Leibler散度(KL散度)用于估计两个分布的相似性,定义如下:
D K L ( P ∣ Q ) = ∑ x i p x i log ( p x i q x i ) D_{KL}(P|Q)=\sum_{x_i}p_{x_i}\log\bigl(\frac{p_{x_i}}{q_{x_i}}\bigr) DKL(P∣Q)=xi∑pxilog(qxipxi)
注意哈,从公式就能看出来 D K L ( P ∣ Q ) ≠ D K L ( Q ∣ P ) D_{KL}(P|Q)\neq D_{KL}(Q|P) DKL(P∣Q)=DKL(Q∣P),KL散度并不是一个对称的loss
其中 P P P和 Q Q Q分别是两个概率分布, x i x_i xi表示在这个系统中不同的状态
在深度学习领域中, P P P一般指样本在训练集中的概率分布(这是一个真实分布), Q Q Q一般指样本在网络预测结果中的概率分布(这是一个近似分布),利用KL散度,我们可以精确地计算出当我们近似一个分布与另一个分布时损失了多少信息
KL散度是非负的,当 Q Q Q越接近 P P P,KL散度就越小,只有当 P P P与 Q Q Q处处相等时才会等于0
Entropy 熵/信息熵
在物理学有一个概念,就是熵,它表示一个热力学系统的无序程度。为了解决对信息的量化度量问题,香农在1948年提出了“信息熵”的概念,它使用对数函数表示对不确定性的测量。熵越高,表示能传输的信息越多,熵越少,表示传输的信息越少,我们可以直接将熵理解为信息量。
按照香农的理论,熵背后的原理是:任何信息都存在冗余,并且冗余大小与信息中每个符号(数字、字母或单词)的出现概率(或者说不确定性)有关。概率大,出现机会多,则不确定性小,这个关系就用对数函数来表征。
在机器学习专题中已经提到过信息熵,在这里我们使用样本和训练集来表述即可:
-
信息熵,也叫熵,衡量由一组样本 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\} {(x1,y1),(x2,y2),⋯,(xm,ym)}构成的训练集 D D D整体的不确定性:
E n t ( D ) = − ∑ x i ∈ D p x i log 2 p x i Ent(D)=-\sum_{x_i\in D}p_{x_i}\log_2 p_{x_i} Ent(D)=−xi∈D∑pxilog2pxi
Cross-Entropy 交叉熵
从上面的定义可以看出, E n t ( D ) Ent(D) Ent(D)是利用真实结果(ground truth)计算出来的,其中的 p x i p_{x_i} pxi是训练集反映的真实分布,设其为 P P P
当我们使用网络对某个样本进行分类时,网络预测结果的呈现形式也是一个概率分布(比如经过softmax激活函数后),设其为 Q Q Q,我们希望这个分布和真实分布 P P P越相似越好,考虑上文提到的KL散度,可以进行以下的变形:
D K L ( P ∣ Q ) = ∑ x i ∈ D p x i log ( p x i q x i ) = ∑ x i ∈ D p x i log p x i − ∑ x i ∈ D p x i log q x i = − E n t ( D ) + [ − ∑ x i ∈ D p x i log q x i ] \begin{aligned}D_{KL}(P|Q)&=\sum_{x_i\in D}p_{x_i}\log\bigl(\frac{p_{x_i}}{q_{x_i}}\bigr)\\&=\sum_{x_i\in D}p_{x_i}\log p_{x_i}-\sum_{x_i\in D}p_{x_i}\log q_{x_i}\\&=-Ent(D)+\Bigl[-\sum_{x_i\in D}p_{x_i}\log q_{x_i}\Bigr]\end{aligned} DKL(P∣Q)=xi∈D∑pxilog(qxipxi)=xi∈D∑pxilogpxi−xi∈D∑pxilogqxi=−Ent(D)+[−xi∈D∑pxilogqxi]
而对于训练集来说, E n t ( D ) Ent(D) Ent(D)是个定值,因此,分布 P P P和 Q Q Q的相似程度随 − ∑ x i ∈ D p x i log q x i -\sum_{x_i\in D}p_{x_i}\log q_{x_i} −∑xi∈Dpxilogqxi的变化而变化,于是,我们将它定义为交叉熵:
H ( P , Q ) = − ∑ x i ∈ D p x i log q x i H(P,Q)=-\sum_{x_i\in D}p_{x_i}\log q_{x_i} H(P,Q)=−xi∈D∑pxilogqxi
同时得到KL散度与信息熵、交叉熵之间的关系:
KL散度值=交叉熵-信息熵
交叉熵和kl散度在很多情况下是一样的,即交叉熵从和KL散度描述的数据性质是一样的,但是交叉熵计算起来很简单,因为不需要计算信息熵,因此交叉熵使用更加广泛
由于这个损失函数比较重要哈,因此举个简单的例子来算一下交叉熵:
考虑一个三分类问题,ground truth的概率分布为 p x = [ 1 0 0 ] p_x=\begin{bmatrix}1 \\0 \\0\end{bmatrix} px= 100
-
若预测结果的概率分布为 q x = [ 0.5 0.4 0.1 ] q_x=\begin{bmatrix}0.5 \\0.4 \\0.1\end{bmatrix} qx= 0.50.40.1 ,则:
H ( p x , q x ) = − ( 1 ⋅ log 0.5 + 0 ⋅ log 0.4 + 0 ⋅ log 0.1 ) ≈ 0.3 H(p_x,q_x)=-\bigl(1\cdot\log 0.5+0\cdot\log0.4+0\cdot\log0.1\bigr)\approx0.3 H(px,qx)=−(1⋅log0.5+0⋅log0.4+0⋅log0.1)≈0.3
-
若预测结果的概率分布为 q x = [ 0.8 0.1 0.1 ] q_x=\begin{bmatrix}0.8 \\0.1 \\0.1\end{bmatrix} qx= 0.80.10.1 ,则:
H ( p x , q x ) = − ( 1 ⋅ log 0.8 + 0 ⋅ log 0.1 + 0 ⋅ log 0.1 ) ≈ 0.1 H(p_x,q_x)=-\bigl(1\cdot\log 0.8+0\cdot\log0.1+0\cdot\log0.1\bigr)\approx0.1 H(px,qx)=−(1⋅log0.8+0⋅log0.1+0⋅log0.1)≈0.1
从直观上可以看到第二个预测的结果要优于第一个,并且通过计算交叉熵,结果和我们的判断也是一致的,那么,我们的最终目标就是优化我们的神经网络,使计算出的交叉熵最小,这就是交叉熵损失的基本思想。