交叉熵

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 结合起来使用,原因在于两者结合求偏导数会比不结合更加简单。