交叉熵
0x00 信息量
熵是一个很重要的概念。首先来了解一下信息量的概念。信息量大小可以参考个人感觉,粗略来讲,__某时间A的信息量大小和其发生的概率成反比__。这个还是很好理解的,比方说“高考取消”这件事给人带来的信息量就比较大。当然不同的人对这件事的感受不一样,但是如果把信息量和概率联系起来就能做运算。
假设X是一个离散型随机变量,其取值集合为χ,概率分布函数p(x)=Pr(X=x),x∈χ,则定义事件 X = x_0 的信息量为:
$$ I(x_0) = -log(p(x_0)) $$
0x01 熵
假设某个事件A有n多种可能的情况,每种情况一种概率,那么A带来的信息量有多大呢?用数学上的期望来表示似乎恰到好处。而熵就定义成 _表示所有信息量的期望__。
$$ H(X) = -\sum{i=1}^{n}{p(x_i)log(p(x_i))} $$
对于二分问题,其取值只有两种可能,对于这类问题,熵的计算方式可以化简为如下算式:
$$ H(X) = -p(x_i)log(p(x_i)) - (1-p(x_i))log(1-p(x_i)) $$
0x02 相对熵(KL散度)
在机器学习中,常常需要衡量两个分布的差异。比如,用P(X)描述样本的真实分布,用Q(X)描述模型预测的分布。这里引入一个 KL散度 的定义
$$ D_{KL}(p|q) = \sum_{i=1}^{n}{p(x_i)log(\frac{p(x_i)}{q(x_i)})} $$
其中,n为事件的所有可能性。D_KL 的值越小,表明两个分布越接近。
需要注意的是,KL散度不具有对称性,也就是说 $D_{KL}(p|q) \not ={D_{KL}(q|p)}$。但是一般来说,两个分布的KL散度越小,分布就越相似(自己和自己的KL散度为0)。
KL散度计算问题
虽然看起来KL散度就这么简单一公式,但毕竟任意一个分布 $p_i$ 或者 $q_i$ 并不能保证其概率一定大于0呀。当其中任意一者出现0,问题就来了。
- 当 $p_i = 0$ 时。$\lim_{p\to 0}{p\log{p}} = 0$
- 当 $p_i \not ={0}$ 但是 $q_i = 0$ 时。这个时候认为 $D_{KL}(p|q)=\infty$
$p_i$ 或 $q_i$ 取0的问题,在用代码计算上不至于太难解决,只要保证每一项都能加上一个足够小的非零正数即可。
0x03 交叉熵
将上面提到的KL散度公式进一步变形
$$ D_{KL}(p|q) = \sum_{i=1}^{n}{p(x_i)log(p(x_i))} - \sum_{i=1}^{n}{ p(x_i)log(q(x_i)) } = -H(p(x)) - \sum_{i=1}^{n}{p(x_i)log(q(x_i))} $$
前半部分恰好是p的熵,后半部分定义为“交叉熵”。因为前半部分的值保持不变,因此只需要关注交叉熵。
交叉熵的公式定义
$$ H(p,q) = -\sum_{i=1}^{n}{p(x_i)log(q(x_i))} $$
0x04 例子
举个图像分类的例子,假设有一张图片,图片中描述的物体是一只狗
对应的标签和模型输出的预测值为:
category | dog | cat | duck |
---|---|---|---|
Label | 1 | 0 | 0 |
Predicts | 0.7 | 0.2 | 0.1 |
假设使用自然对数,可以知道此时的交叉熵为 H(p,q) = -1*log(0.7) − 0*log(0.2) − 0*log(0.1) = 0.357
现在又假设有一张图片
那么现在,对应的标签和模型输出的预测值为(注意概率之和不一定为1):
category | dog | cat | duck |
---|---|---|---|
Label | 0 | 1 | 1 |
Predicts | 0.2 | 0.8 | 0.5 |
还是使用自然对数,可以知道此时的交叉熵为 H(p,q) = −0*log(0.2) − 1*log(0.8) − 1*log(0.5) = 0.916
0x05
在实际应用中,交叉熵会和 Softmax
结合起来使用,原因在于两者结合求偏导数会比不结合更加简单。