在机器学习中,经常用交叉熵来衡量预测值与真实值之间的差距,要想真正理解交叉熵,我们要依次了解信息量、熵、相对熵,交叉熵实际上是相对熵的一部分。不要被这些字眼吓到,实际上我们一步步看下来还是很容易理解的。
1、信息量。
首先我们来了解信息量,有以下两个事件
事件A:巴西队进入了2018世界杯决赛圈。
事件B:中国队进入了2018世界杯决赛圈。
直觉上来看,事件B带来的信息量更多,因为事件B发生的概率比事件A发生的概率小。由此我们可知,一个事件的信息量是与其发生的概率相关的,而且,如果一个事件发生的概率越小,当其发生了,带来的信息量就越大。假设X为一离散型随机变量,
X
=
x
0
X=x_0
X=x0的概率表示为
p
(
x
0
)
p(x_0)
p(x0),那么
x
0
x_0
x0的信息量为:
I ( x 0 ) = − l o g ( p ( x 0 ) ) I(x_0)=-log(p(x_0)) I(x0)=−log(p(x0)) 这里的对数一般取自然对数e
2、熵
理解了信息量之后,这里给出熵的一个理解:熵是信息量的期望。
怎么理解呢?一个事件可能有多种状态,而每一种状态都有一种可能性,举例:
事件 | 概率 |
---|---|
电脑正常开机 | 0.7 |
电脑坏掉了 | 0.2 |
电脑蓝屏了 | 0.1 |
对于电脑的三种状态事件,我们都可以求出一个信息量,那么熵即是这些信息量的期望。熵定义如下:
H ( x ) = − ∑ i = 1 3 p ( x i ) l o g ( p ( x i ) ) H(x)=-\sum_{i=1}^3p(x_i)log(p(x_i)) H(x)=−∑i=13p(xi)log(p(xi))
通俗的表示,如果有n中状态,那么熵可以表示为:
H ( x ) = − ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) H(x)=-\sum_{i=1}^np(x_i)log(p(x_i)) H(x)=−∑i=1np(xi)log(p(xi))
当n=2时,我们可以将熵简化为:
H ( x ) = − ∑ i = 1 2 p ( x i ) l o g ( p ( x i ) ) H(x)=-\sum_{i=1}^2p(x_i)log(p(x_i)) H(x)=−∑i=12p(xi)log(p(xi))
= − p ( x i ) l o g ( p ( x i ) ) − ( 1 − p ( x i ) ) l o g ( 1 − p ( x i ) ) =-p(x_i)log(p(x_i))-(1-p(x_i))log(1-p(x_i)) =−p(xi)log(p(xi))−(1−p(xi))log(1−p(xi))
3、相对熵(即KL散度)
相对熵可以用来衡量同一随机变量的两种分布之间的差距。以机器学习中的三分类问题为例,假设一个样本的真实标签为1(属于1这一类),使用onehot表示即为 [ 0 , 1 , 0 ] [0,1,0] [0,1,0],则这一样本的真实分布为 p = [ 0 , 1 , 0 ] p=[0,1,0] p=[0,1,0],我们对这一个样本预测的结果表示为 q = [ 0.1 , 0.7 , 0.2 ] q=[0.1,0.7,0.2] q=[0.1,0.7,0.2],那么我们衡量 p 与 , ( x ) p与,(x) p与,(x)的差异,就可以使用相对熵(即KL散度)。
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) ) D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(\frac{p(x_i)}{q(x_i)}) DKL(p∣∣q)=∑i=1np(xi)log(q(xi)p(xi))
n代表所有的类别数,在这个例子中n=3
这里的相对熵的计算针对的是一个样本,如果共有m个样本,则总的相对熵为:
∑ j = 1 m ∑ i = 1 n p ( x i j ) l o g ( p ( x i j ) q ( x i j ) ) \sum_{j=1}^m\sum_{i=1}^np(x_{ij})log(\frac{p(x_{ij})}{q(x_{ij})}) ∑j=1m∑i=1np(xij)log(q(xij)p(xij))
4、交叉熵
还是以一个样本为例,将交叉熵进行改写:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) ) D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(\frac{p(x_i)}{q(x_i)}) DKL(p∣∣q)=∑i=1np(xi)log(q(xi)p(xi))
= ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) =\sum_{i=1}^np(x_i)log(p(x_i))-\sum_{i=1}^np(x_i)log(q(x_i)) =∑i=1np(xi)log(p(xi))−∑i=1np(xi)log(q(xi))
其实我们可以看出,第一项 ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) \sum_{i=1}^np(x_i)log(p(x_i)) ∑i=1np(xi)log(p(xi))=-H(p(x))
因为真实值的分布我们是知道的,所以这一项是个常数值。
而第二项
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
-\sum_{i=1}^np(x_i)log(q(x_i))
−∑i=1np(xi)log(q(xi))就是交叉熵。同样,这里的n是类别总数。
假设样本数为m,则m个样本的交叉熵为:
∑ j = 1 m ∑ i = 1 n − p ( x i j ) l o g ( q ( x i j ) ) \sum_{j=1}^m\sum_{i=1}^n-p(x_{ij})log(q(x_{ij})) ∑j=1m∑i=1n−p(xij)log(q(xij))
对于二分类问题,交叉熵可以简化为:
− ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) -\sum_{i=1}^np(x_i)log(q(x_i)) −∑i=1np(xi)log(q(xi))
= − p ( x i ) l o g ( q ( x i ) ) − ( 1 − p ( x i ) ) l o g ( 1 − q ( x i ) ) =-p(x_i)log(q(x_i))-(1-p(x_i))log(1-q(x_i)) =−p(xi)log(q(xi))−(1−p(xi))log(1−q(xi))
这里说一下对数损失函数,对数损失函数是交叉熵损失函数对应于二分类问题时的特殊形式,就是上式所对应的形式。
5、单标签多分类与多标签分类中的交叉熵
在第4部分举得例子中,是单标签分类,一个样本只能属于一种类别, ∑ i = 1 n p ( x i ) = 1 \sum_{i=1}^np(x_i)=1 ∑i=1np(xi)=1。
但在多标签分类中,一个样本可能属于多种类别,多种类别是相互独立的,所以 ∑ i = 1 n p ( x i ) \sum_{i=1}^np(x_i) ∑i=1np(xi)一般是不等于1的。
这个时候,每一种类别都计算一次对数损失函数,总的交叉熵是将每个类别计算的对数损失相加。
∑ i = 1 n − p ( x i ) l o g ( q ( x i ) ) − ( 1 − p ( x i ) ) l o g ( 1 − q ( x i ) ) \sum_{i=1}^n-p(x_i)log(q(x_i))-(1-p(x_i))log(1-q(x_i)) ∑i=1n−p(xi)log(q(xi))−(1−p(xi))log(1−q(xi))
当然,上式计算的仍然是一个样本的交叉熵。
m个样本的交叉熵为
∑ j = 1 m ∑ i = 1 n − p ( x i j ) l o g ( q ( x i j ) ) − ( 1 − p ( x i j ) ) l o g ( 1 − q ( x i j ) ) \sum_{j=1}^m\sum_{i=1}^n-p(x_{ij})log(q(x_{ij}))-(1-p(x_{ij}))log(1-q(x_{ij})) ∑j=1m∑i=1n−p(xij)log(q(xij))−(1−p(xij))log(1−q(xij))