身为一个菜鸡,我经常在数据处理过程中,遇到比较两个样本是否符合同一分布,以及两个模型之间是否相似之类的问题。也是在这个过程中,我才逐渐知道有个东西叫KL散度(divergence),在这里记录一下。
其实在阅读一些文献的时候就见到过这个名词的身影,查阅了一些资料和博客知道,这个名词来源于信息论,来衡量信息的丢失,拓展一下就可以比较两个系统的相似性或者两个样本之间的分布是否一致;在这里先梳理一下信息论的一些基本的概念。
熵
比较基本的,我们知道一个事件的熵可以表示为,
表示这个事件发生的概率。如果一个系统,或者样本由m个事件构成,则这个系统或者样本的熵就定义为所有事件的熵的加和,也就是
。
KL散度(相对熵)
从上面对系统或者样本熵的定义我们可以很自然地想到,如果一个系统Q与另一个系统P是相似的,那么对于事件i来说,它在Q发生的概率与在P发生的概率是基本一致的,熵也是一致的;那么如果有很多个这样的事件组成了Q和P,总体的熵又是一致的,则可以认为这两个系统是相似的。用数学表达就是
此时是以系统P作为比较的基准,将事件i在Q系统中的信息量减去在P系统中的信息量,在乘上(因为以P为基准,乘上概率就是为了求期望)。
上式可以继续写作
根据吉布斯不等式,最后的这个式子是大于等于0的,越接近0,表示Q、P越相似。
值得注意的是,式子中的后半部分是系统P的熵,是个定值,所以我们只需要关注前半部分的
,只需要最小化它就可以达到两个系统之间最好的相似度。而这个有个名字叫做交叉熵
,熟悉神经网络的小伙伴一定不陌生,这常常用来作为网络输出与实际的损失函数,但实际的应用中需要对这个式子进行适当的变形,在这里可以简单举个例子。
应用
假如我们希望训练一个神经网络,使得它能和人脑一样可以很好地判断出一张图片是不是猫咪,问题简化成下面流程:
输入一个图片x,经过网络的一系列操作最终输出一个值y。对于人脑而言,这个y要么是0(不是猫)要么是1(是猫);而对于训练的神经网络来说,输出的y是一个介于[0,1]的概率值,它只能告诉我们这张图有多像猫。那么问题来了,我们想不断训练不断提升这个神经网络,使得它可以像人脑一样很好地工作,换句话说就是希望人脑和神经网路这两个系统可以很相似,那么就有
,根据流程图所示我们可以将其改为
;因为我们此时将人脑作为基准系统P,那么对于人脑来说输入值
要么为0,要么为1;而对于一个优秀的神经网路来说,当人脑给出不是猫(0)的判断时,它也会给出一个逼近0的概率
,反之逼近概率1的
。那么可以将上式改写为
,而这个式子就变得很熟悉了,是一个很常见的损失函数。
毕竟我也是个小菜鸡,里面可能存在一些错误的地方,有大佬看见了可以麻烦斧正一下(也许甚至没人看。。。)。大家也可以看一下视频资料https://www.bilibili.com/video/BV15V411W7VB,全文的大致是这个视频的笔记。