【熵系列-3】相对熵(或者 KL散度)

【熵系列-3】相对熵(或者 KL散度)

上一篇文章我们简单介绍了信息熵的概念,知道了信息熵可以表达数据的信息量大小,是信息处理一个非常重要的概念。对于离散型随机变量,信息熵公式如下:
H(p)=H(x)=Exp(x)[logp(x)]=i=1np(x)logp(x) H(p) = H(x) = E_{x \sim p(x)}[-log p(x)] = - \sum_{i=1}^n p(x)log p(x)

对于连续型随机变量,信息熵公式如下:
H(p)=H(x)=Exp(x)[logp(x)]=p(x)logp(x)dx H(p) = H(x) = E_{x \sim p(x)}[-log p(x)] = - \int p(x)log p(x) dx

注意,我们前面在说明的时候log 是以2为底的,但是一般情况下在神经网络中,默认以e为底,这样算出来的香农信息量虽然不是最小的可用于完整表示事件的比特数,但对于信息熵的含义来说是区别不大的。其实只要这个底数是大于1的,都能用来表达信息熵的大小。

本篇我们来看看机器学习中比较重要的一个概念—相对熵。相对熵,又被称为KL散度或信息散度,是两个概率分布间差异的非对称性度量 。在信息论中,相对熵等价于两个概率分布的信息熵的差值若其中一个概率分布为真实分布,另一个为理论(拟合)分布,则此时相对熵等于交叉熵与真实分布的信息熵之差,表示使用理论分布拟合真实分布时产生的信息损耗

看完上面的解释,我相信你跟我开始看的时候一模一样,一脸懵逼。下面我们直接看公式,然后慢慢理解:
DKL(pq)=i=1N[p(xi)logp(xi)p(xi)logq(xi)] D_{KL}(p||q) = \sum_{i=1}^{N}[p(x_i)log p(x_i) - p(x_i)log q(x_i)]

上面的p(xi)p(x_i)为真实事件的概率分布,q(xi)q(x_i) 为理论拟合出来的该事件的概率分布。上面就是:交叉熵与真实分布的信息熵之差.

因此该公式的字面上含义就是真实事件的信息熵与理论拟合的事件的香农信息量与真实事件的概率的乘积的差的累加。比较难懂的是 i=1Np(xi)logq(xi)-\sum_{i=1}^{N}p(x_i)log q(x_i)这玩意儿。
假设理论拟合出来的事件概率分布跟真实的一模一样,那么这玩意就等于真实事件的信息熵,这一点显而易见。

假设拟合的不是特别好,那么这个玩意会比真实事件的信息熵大(稍后证明)。

也就是在理论拟合出来的事件概率分布跟真实的一模一样的时候,相对熵等于0。而拟合出来不太一样的时候,相对熵大于0。这个性质很关键,因为它正是深度学习梯度下降法需要的特性。假设神经网络拟合完美了,那么它就不再梯度下降,而不完美则因为它大于0而继续下降。

但它有不好的地方,就是它是不对称的。举个例子,比如随机变量XPX \sim P取值为1,2,3时的概率分别为[0.1,0.4,0.5],随机变量YQY \sim Q取值为1,2,3时的概率分别为[0.4,0.2,0.4],则:
D(PQ)=0.1×log(0.10.4)+0.4×log(0.40.2)+0.5×log(0.50.4)=0.250 D(P||Q) = 0.1 \times log(\frac{0.1}{0.4}) + 0.4 \times log(\frac{0.4}{0.2}) + 0.5 \times log(\frac{0.5}{0.4}) = 0.250
D(QP)=0.4×log(0.40.1)+0.2×log(0.20.4)+0.4×log(0.40.5)=0.327 D(Q||P) = 0.4 \times log(\frac{0.4}{0.1}) + 0.2 \times log(\frac{0.2}{0.4}) + 0.4 \times log(\frac{0.4}{0.5}) = 0.327

也就是用P来拟合Q和用Q来拟合P的相对熵居然不一样,而他们的距离是一样的。这也就是说,相对熵的大小并不跟距离有一一对应的关系。这点蛮头疼的,因为一般我们希望距离越远下降越快,而相对熵取哪个为参考在同等距离情况下下降的速度都不一样,这就非常尴尬了。

推导到这相信很多人会想,既然如此,那为什么现在还是很多人用相对熵衍生出来的交叉熵作为损失函数来训练神经网络而不直接用距离相关的均方差呢?
以下面的例子稍作解释:
假设神经网络的最后一层**函数为sigmoid,它长这样:
【熵系列-3】相对熵(或者 KL散度)

可以看到它的两头异常的平,也就是说在那些地方的导数接近于0。而反向传播是需要求导的,用了均方差损失函数之后求导结果包含y(y−1) ,这在y接近于0或者1的时候都趋于0,会导致梯度消失,网络训练不下去。但如果用相对熵衍生出来的交叉熵作为损失函数则没有这个问题。详细的分析可见这篇文章。因此虽然相对熵的距离特性不是特别好,但总归好过直接梯度消失玩不下去,因此很多用sigmoid sigmoidsigmoid作为**函数的神经网络还是选择了用相对熵衍生出来的交叉熵作为损失函数。
当然如果你选用的不是sigmoid sigmoidsigmoid**函数,则不需要考虑这些,这个是外话了。

最后来证明下相对熵公式只有在p(xi)p(x_i)等于q(xi)q(x_i)的时候等于0,其他时候大于0.
要证:
DKL(pq)=i=1N[p(xi)logp(xi)p(xi)logq(xi)]0D_{KL}(p||q) = \sum_{i=1}^{N}[p(x_i)log p(x_i) - p(x_i)log q(x_i)] \geq 0
即证:
i=1Np(xi)logq(xi)p(xi)0\sum_{i=1}^{N} p(x_i)log \frac{q(x_i)}{p(x_i)} \leq 0

ln(x)x1ln(x) \leq x - 1
当且仅当 x = 1时等号成立,故
i=1Np(xi)logq(xi)p(xi)i=1Np(xi)(q(xi)p(xi)1)=i=1N[p(xi)q(xi)]=0\sum_{i=1}^{N} p(x_i) log \frac{q(x_i)}{p(x_i)} \leq \sum_{i=1}^{N} p(x_i)(\frac{q(x_i)}{p(x_i)} - 1) = \sum_{i=1}^{N}[p(x_i)-q(x_i)] = 0

上面式子中≤的等于号只在p(xi)=q(xi)p(x_i) = q(x_i)时成立。