本文始发于个人公众号:TechFlow,原创不易,求个关注
今天这篇文章和大家聊聊机器学习领域的熵。
我在看paper的时候发现对于交叉熵的理解又有些遗忘,复习了一下之后,又有了一些新的认识。故写下本文和大家分享。
熵这个概念应用非常广泛,我个人认为比较经典的一个应用是在热力学当中,反应一个系统的混乱程度。根据热力学第二定律,一个孤立系统的熵不会减少。比如一盒乒乓球,如果把盒子掀翻了,乒乓球散出来,它的熵增加了。如果要将熵减小,那么必须要对这个系统做功,也就是说需要有外力来将散落的乒乓球放回盒子里,否则乒乓球的分布只会越来越散乱。
开创了信息论的香农大佬灵光一闪,既然自然界微观宏观的问题都有熵,那么信息应该也有。于是他开创性地将熵这个概念引入信息论领域,和热力学的概念类似,信息论当中的熵指的是信息量的混乱程度,也可以理解成信息量的大小。
信息量
举个简单的例子,以下两个句子,哪一个句子的信息量更大呢?
- 我今天没中彩票
- 我今天中彩票了
从文本上来看,这两句话的字数一致,描述的事件也基本一致,但是显然第二句话的信息量要比第一句大得多,原因也很简单,因为中彩票的概率要比不中彩票低得多。
相信大家也都明白了,一个信息传递的事件发生的概率越低,它的信息量越大。我们用对数函数来量化一个事件的信息量:
I ( X ) = − l o g ( P ( X ) ) I(X)=-log(P(X)) I(X)=−log(P(X))
因为一个事件发生的概率取值范围在0到1之间,所以log(p(X))的范围是负无穷到0,我们加一个负号将它变成正值。画成函数大概是下面这个样子:
信息熵
我们上面的公式定义的是信息量,但是这里有一个问题,我们定义的只是事件X的一种结果的信息量。对于一个事件来说,它可能的结果可能不止一种。我们希望定义整个事件的信息量,其实也很好办,我们算下整个事件信息量的期望即可,这个期望就是信息熵。
期望的公式我们应该都还记得:
E ( X ) = ∑ P ( X ) X E(X)=\sum P(X)X E(X)=∑P(X)X
我们套入信息量的公式可以得到信息熵H(x):
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=1∑nP(xi)log(P(xi))
相对熵(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=1∑nP(xi)log(Q(xi)P(xi))
如果把 ∑ i = 1 n x i \sum_{i=1}^nx_i ∑i=1nxi看成是一个事件的所有结果,那 x i x_i xi可以理解成一个事件的一个结果。那么所有的 P ( x i ) P(x_i) P(xi)和 Q ( x i ) Q(x_i) Q(xi)就可以看成是两个关于事件X的概率分布。 P ( x i ) P(x_i) P(xi)样本真实的分布,我们可以求到。而 Q ( x i ) Q(x_i) Q(xi)是我们模型产出的分布。KL散度越小,表示这两个分布越接近,说明模型的效果越好。
光看上面的KL散度公式可能会云里雾里,不明白为什么能反应P和Q两个分布的相似度。因为这个公式少了两个限制条件:
∑ i = 1 n P ( x i ) = 1 , ∑ i = 1 n Q ( x i ) = 1 \sum_{i=1}^nP(x_i)=1, \quad \sum_{i=1}^nQ(x_i)=1 i=1∑nP(xi)=1,i=1∑nQ(xi)=1
对于单个 P ( x i ) P(x_i) P(xi)来说,当然 Q ( x i ) Q(x_i) Q(xi)越大 P ( x i ) l o g ( P ( x i ) Q ( x i ) ) P(x_i)log(\frac{P(x_i)}{Q(x_i)}) P(xi)log(Q(xi)P(xi))越小。但由于所有的 Q ( x i ) Q(x_i) Q(xi)的和是1,当前的i取的值大了,其他的i取的值就要小。
我们先来直观地感受一下,再来证明。
我们假设 x i x_i xi只有0和1两个取值,也就是一个事件只有发生或者不发生。我们再假设 P ( x = 0 ) = P ( x = 1 ) = 0.5 P(x=0)=P(x=1)=0.5 P(x=0)=P(x=1)=0.5,我们画一下 P ( x i ) l o g ( P ( x i ) Q ( x i ) ) P(x_i)log(\frac{P(x_i)}{Q(x_i)}) P(xi)log(Q(xi)P(xi))的图像:
和我们预料的一样,函数随着 Q ( x i ) Q(x_i) Q(xi)的递增而递减。但是这只是一个x的取值,别忘了,我们相对熵计算的是整个分布,那我们加上另一个x的取值会发生什么呢?
从函数图像上,我们很容易看出,当Q(x)=0.5的时候,KL散度取最小值,最小值为0。我们对上面的公式做一个变形:
D K L ( P ∣ ∣ Q ) = ∑ i = 1 n P ( x i ) l o g ( P ( x i ) Q ( x i ) ) = ∑ i = 1 n P ( x i ) l o g ( P ( x i ) ) − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) D_{KL}(P||Q)= \sum_{i=1}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)})=\sum_{i=1}^nP(x_i)log(P(x_i)) - \sum_{i=1}^nP(x_i)log(Q(x_i)) DKL(