一文读懂信息量、信息熵、相对熵(KL散度)和交叉熵

        在人工智能深度学习的应用中,损失函数绝对是模型网络学习质量的关键。我们使用损失函数来表示的真实值与预测值之间的距离,进而指导模型的收敛方向。对于标量来说,我们能够很容易想到使用方差来描述误差。那么,如何表示向量之间的误差呢?

        交叉熵(cross-entropy)就是用来描述向量之间的误差的损失函数,首先来看它的公式:

                            H(P, Q) = -\sum P(x_{i})log[Q(x_{i})]

        很多人工智能初学者可能觉得这个公式不太好理解,不像方差公式那样简单易懂。要理解这个公式,我们需要先从信息量化的概念开始。

一、【信息量】

        信息是可以量化的吗?答案是肯定的。例如,有两条消息,第一条是“明天太阳会升起”,第二条是“明天会有日食”,这两条消息那一条的信息量更大呢?显然是后者。太阳每天都会升起,也就是“明天太阳会升起”的概率是100%,所以第一条消息其实是一句废话,没有包含任何信息量;再看第二条,日食是一个非常低概率的事件,一个低概率事件的发生显然包含了更多的信息,因此第二条消息的信息量就远高于第一条消息。至此我们可以总结出信息量的一些特征:

        1.非常可能发生的事件信息量比较少,并且在极端情况下,确保能够发生的事件应该没有信息量。

        2.较不可能发生的事件具有更高的信息量。

        那么信息如何量化呢?设想投掷一枚质地均匀的硬币,两面向上的可能性相等,现在要以消息的形式告诉别人投掷的结果,这条消息包含多少信息量呢?答案是1bit,我们只需要一位二进制数就可以表示投硬币的结果,并且无论这条消息中写了多少内容多少个字,其信息量始终只有1个比特。

        将情况再进行扩展,现在有一个天气预报软件来向你预告明天的天气,假设有且仅有8种不同的天气,且他们每一个在明天出现的概率是相同的1/8,那么这条天气预报消息就包含了3bits的信息量,即用3位二进制数对8种不同的天气进行编码。并且无论这条天气预报中写了多少内容多少个字,其信息量始终只有3个比特。

扫描二维码关注公众号,回复: 14672056 查看本文章

        通过以上两个例子我们已经可以简单的理解信息量的概念了。那么如果硬币的质地不均匀导致两面向上的概率不一样、明天这8种天气出现的概率不同,这时消息的信息量又该如何表示呢?结合上文所说的信息量的特征,我们知道信息量与该事件发生的概率紧密相关,且为负相关。由此引出计算信息量的公式:

                一个事件X = x发生的概率为P(x),那么它的信息量为:I(x) = -log[P(x)]     (1)

        其中,当log以2为底时,I(x)的单位为比特(bits)或者香农(shannons);当log以e为底时,I(x)的单位为奈特(nats) 。

        回到上面的例子。我们假设硬币的质地不均,正面朝上的概率是0.7,反面朝上的概率是0.3,那么“正面朝上”这条消息的信息量即为I(heads) = -log(0.7),结果是0.51bits(或0.36nats),“反面朝上”的信息量为1.74bits(或1.204nats)。又假设明天各项天气出现的概率如下表所示,那么“明天是晴天”这条消息的信息量为1.51bits(或1.05nats),“明天有中雨”的信息量为4.64bits(或3.21nats)。

天气 晴天 多云 阴天 阵雨 小雨 中雨 大雨 雷暴
出现概率 35% 35% 10% 10% 4% 4% 1% 1%

二、【信息熵】

        上文所述的I(x)描述了单条信息所包含的信息量,那么如何量化表示整个概率分布中的不确定性的总量呢?我们发现,单条信息不仅信息量与其所表示事件的概率相关,其出现的概率也与其所表示事件的概率有关联。例如上文中投掷硬币正面朝上的概率为0.7,则“正面朝上”这条信息出现的概率也是对应的0.7;明天是晴天的概率为0.35,天气预报发出“明天是晴天”这条预告信息的概率也是对应的0.35。由此我们可以引入数学期望的概念来对整个概率分布中的不确定性的总量进行量化,记为香农熵(Shannon entropy),计算公式如下:

                H(P)=E_{x\sim P}[I(x)]=-\sum P(x_{i})logP(x_{i})                (2)

        H(P)的单位同样与log的底数有关。当log以2为底时,单位为比特(bits)或者香农(shannons);当log以e为底时,单位为奈特(nats) 。从公式来看,香农熵即为描述一个概率分布为P(x)的事件X的消息所包含信息量的数学期望。

        下图为X服从0-1分布时,香农熵与p之间的图像。我们可以看出随着p值趋于0或1时,即某事件发生与否的确定性不断增加时,香农熵的值会减小,直到事件完全确定时减为0;在p值为0.5时,即不确定性最大时,香农熵也取得最大值1。

        

        现在回到先前的例子,带入公式(2)可以得出:不均匀硬币的投掷结果这条消息的香农熵为0.88bits,即这条消息的真正有用信息量为0.88bits,比这条消息的实际信息量1bit要少;明天的天气预报的香农熵为2.23bits,也比这条消息的实际信息量3bit要少。

        如果我们改变编码方式会产生怎样的结果呢?如下表所示,我们根据概率为各种天气建立哈夫曼编码。这种编码方式使得天气预报消息的平均信息量从3bits降低到了2.33bits。虽然哈夫曼编码已经是最佳编码方式,但是距离2.23bits的香农熵还是有着0.1bits的差距,也就是说消息中包含了0.1bits的无用信息。要解释产生这种差距的原因,就需要引入相对熵的概念。

天气 晴天 多云 阴天 阵雨 小雨 中雨 大雨 雷暴
哈夫曼编码 1 01 001 0001 00001 000001 0000001 0000000

 三、【相对熵】       

        我们对上述例子中的天气情况进行了哈夫曼编码,从概率的角度出发:晴天编码为1bit,也就是在编码时我们假设晴天出现的概率为1/2;多云编码为2bits,也就是我们假设出现多云天气的概率为1/2^{2}=1/4。以此类推,我们可以得出哈夫曼编码下对应的概率分布,如下表所示

天气 晴天 多云 阴天 阵雨 小雨 中雨 大雨 雷暴
哈夫曼编码 1 01 001 0001 00001 000001 0000001 0000000
编码概率(P) 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/128
实际概率(Q) 35% 35% 10% 10% 4% 4% 1% 1%

        编码的概率分布与实际的概率分布并不相同,这就是误差产生的原因。我们将实际的概率分布记为P,将哈夫曼编码的概率分布记为Q。为了量化衡量这两个独立的概率分布之间的误差,我们引入相对熵的概念又名KL散度(Kullback-Leibler(KL) divergence),计算公式如下:

                D_{KL}(P\parallel Q)=E_{x\sim P}[log\frac{P(x)}{Q(x)}]=E_{x\sim P}[logP(x)-logQ(x)]

                                       =\sum P(x_{i})[logP(x_{i}) - logQ(x_{i})]

                                       =\sum P(x_{i})logP(x_{i})-\sum P(x_{i})logQ(x_{i})

                                       =-H(P)-\sum P(x_{i})logQ(x_{i})                         (3)

        将上面的例子带入公式(3)进行计算,就得出了哈夫曼编码的概率分布与实际的概率分布的KL散度为0.1bits,也就是这两个概率分布之间的误差为0.1bits。

四、【交叉熵】

        有了前面信息量、信息熵和相对熵的概念,现在再来理解交叉熵的概念就比较容易了。我们再来看交叉熵的公式:

                H(P, Q) = -\sum P(x_{i})log[Q(x_{i})]               (4)

        观察上文中KL散度的计算公式我们可以发现,后半部分即为交叉熵的计算公式。至此,可将交叉熵的公式写为:

                H(P,Q)=H(P)+D_{KL}(P\parallel Q)                (5) 

        当log底数为2时,交叉熵即为用非真实分布Q来表示真实分布P的平均编码长度。在实际使用中计算这个公式时,我们经常会遇到 0log0 这个表达式。按照惯例,在信息论中,该表达式被处理为:lim_{x\rightarrow 0}xlogx=0

        下面举一个实际应用中的例子来说明交叉熵的使用。下图是MNIST手写数字库中的一张图片,下表展示了该图片的标签向量值与迭代中两次不同的预测得到的预测向量。

代表数字 0 1 2 3 4 5 6 7 8 9
标签向量(P) 0 0 0 0 0 0 0 0 0 1
预测向量1(Q1) 0.02 0.11 0.07 0.05 0.01 0.02 0.01 0.22 0.36 0.13
预测向量2(Q2) 0.01 0.05 0.01 0.01 0.01 0.02 0.01 0.07 0.12 0.69

        第一次预测的结果为8,显然不正确。第二次得到了正确的预测结果。将标签向量看做实际分布P,令预测向量1分布为Q1,预测向量2分布为Q2,带入公式(4)计算出其交叉熵:

        H(P,Q1) =2.0402

        H(P, Q2)=0.3711

        我们可以直观的看出第一次预测错误,交叉熵值非常大,也就是说预测向量1与标签向量之间的误差很大;第二次预测的交叉熵值较小,说明预测向量2与标签向量之间的误差较小。交叉熵的值与预测的准确性呈负相关,因此可用交叉熵作为迭代训练中的损失函数。

        经过前面对信息量、信息熵、相对熵和交叉熵的学习,现在我们就能够直观地理解作为损失函数的交叉熵是如何描述向量之间的误差的了。

参考资料:

1. 视频 Entropy, Cross-Entropy and KL-Divergence

    作者:Aurélien Géron

    来源:https://www.youtube.com/watch?v=ErfnhcEV1O8

2. 《DEEP LEARNING 深度学习》,人民邮电出版社

     作者:Ian Goodfellow & Yoshua Bengio & Aaron Courville

猜你喜欢

转载自blog.csdn.net/ClarkCC/article/details/122330615