机器学习-统计与数学

【算法】一篇入门之-KL散度是什么

作者 : 老饼 发表日期 : 2023-10-11 06:40:40 更新日期 : 2025-02-24 15:38:47
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



KL散度是机器学习中常用的指标之一,它常用于衡量两个分布之间的差异

本文讲解KL散度的公式,KL散度的用途,以及KL的原理和它是如何被定义出来的

通过本文可以快速了解KL散度是什么,用什么用,以及KL散度的背景意义和推导过程




     01. KL散度的公式与用途    




本节讲解KL散度公式和计算例子,并介绍KL散度的相关应用场景





       KL散度是什么       


KL散度公式
KL散度(Kullback-Leibler divergence)也称为KL距离,它用于计算两个分布的距离(差异)
 分布 Q(X)与 P(X) 的KL散度计算公式为:
 
 KL(PQ)=xXP(x)lnP(x)Q(x)\text{KL}(P||Q) = \displaystyle \sum \limits _{x\in X} P(x)\textbf{ln}\dfrac{P(x)}{Q(x)}
 其中,P一般称为真实分布,Q则指认知分布,KL用于度量Q与P的距离
  注意:KL虽然有距离之称,但它是不对称的,即Q与P的KL散度不等于P与Q的KL散度
✍️  KL散度计算例子
真实分布P和认知分布Q如下所示,现计算Q与P的距离
 KL散度计算例子
根据KL散度公式,可以计算得到:

 KL(PQ)=xXP(x)lnP(x)Q(x)=0.6ln0.60.7+0.4ln0.40.3=0.0226\small \text{KL}(P||Q) = \displaystyle \sum \limits _{x\in X} P(x)\textbf{ln}\dfrac{P(x)}{Q(x)} =0.6*\textbf{ln}\dfrac{0.6}{0.7}+0.4*\textbf{ln}\dfrac{0.4}{0.3}=0.0226






      KL散度的用途    


KL散度广泛应用于机器学习,与分布相关的都能看到它的身影,下面列兴趣一二
KL散度应用场景一:监控变量分布
由于模型一般是基于历史样本训练的,所以随着时间推移,可能不适用于线上数据
此时,可以使用KL散度来监控线上变量的分布是否与建模时的训练数据的分布一致
 KL散度的用途-监控线上变量
当KL散度大于一定阈值时,就自动发警报,方便建模人员进行分析与采取相关措施
KL散度应用场景二:作为损失函数的正则项
在训练模型的时候,可以用KL散度作为正则项,强制使模型的预测值趋向目标分布
 KL散度的用途-用于正则化
 例如著名的VAE自动编码器模型中,就引入KL散度,使其编码器的输出偏向正态分布
 
使用KL散度作为正则项,可以抵抗过拟合,它可以使模型预测值的分布更加合理化  







   02. KL散度是如何定义出来的    




本节讲解KL散度的原理与推导,从而更进一步理解KL的意义





     KL散度的原理与意义    


KL是基于信息熵与交叉熵的基础上进行定义的,
下面先简单回顾信息熵与交叉熵的,再进而说明KL散度的原理

 变量的信息熵
假设变量X=[x1,x2,...xn]\small X=[x_1,x_2,...x_n]的分布为P=[p1,p2,...,pn]\small P=[p_1,p_2,...,p_n], 即X取值为xix_i的概率为 pip_i
 当我们了解X的分布概率P时,在知道真相(X=xi\small X=x_i)时,所获得的信息量就为ln(pi)-\ln(p_i)
由于X的所有可能取值为x1,x2,...xnx_1,x_2,...x_n,所以知道X真实取值时获得的信息量期望为:
 H(X)=i=1npiln(pi)=xXnp(x)ln(p(x))\small \displaystyle H(X) = -\sum\limits_{i=1}^{n}p_i\textbf{ln}(p_i) = -\sum\limits_{x\in X}^{n}p(x)\textbf{ln}(p(x)) 
  上式就称为变量的熵,它代表知道一个以P分布的变量的真实值时所获得的期望信息量

 变量的交叉熵
当不知道X的真实分布 P=[p1,...,pn]\small P=[p_1,...,p_n],而是认为X的分布为 Q=[q1,q2,...,qn]Q=[q_1,q_2,...,q_n]
 此时由于认为X取值为xix_i的概率为qiq_i,则在知道X=xi\small X=x_i时获得的信息量就为ln(qi)-\ln(q_i)
 由于X的所有可能取值为x1,x2,...xnx_1,x_2,...x_n,所以知道X真实取值时获得的信息量期望为:
 H(X,PQ)=i=1npiln(qi)=xXnp(x)ln(q(x))\small \displaystyle H(X,P||Q) = -\sum\limits_{i=1}^{n}p_i\textbf{ln}(q_i) = -\sum\limits_{x\in X}^{n}p(x)\textbf{ln}(q(x))
  上式就称为变量的交叉熵
它代表以分布Q去认识一个分布P的变量时,在知道X的真实值时所获得的期望信息量
  KL散度的意义    
   从信息熵与交叉熵可知,信息熵是我们掌握X的真实分布时获得的信息量期望
而交叉熵是我们不知道X的真实分布时获得的信息量期望

没有掌握真实分布时获得的信息量,肯定比掌握了真实分布时获得的信息量更加大
即,当认知分布Q(x)与真实分布P(x)偏差越大的时候,交叉熵就就比信息熵更加大
 因此,我们用两者的差来定义Q(x)与P(x)的差异,称为KL散度:
 KL(PQ)=Hx(PQ)Hx(PP)=(xXP(x)lnQ(x))(xXP(x)lnP(x))=xXP(x)lnP(x)Q(x)\small \displaystyle \begin{aligned} \text{KL}(P||Q)& = H_x(P||Q)-H_x(P||P) \\&=\left ( -\sum \limits _{x\in X} P(x)\textbf{ln}Q(x) \right ) -\left(-\sum \limits _{x\in X} P(x)\textbf{ln}P(x) \right) \\&= \sum \limits _{x\in X} P(x)\textbf{ln}\dfrac{P(x)}{Q(x)} \end{aligned}
KL散度直接评估了交叉熵与信息熵的差异,从而间接地评估了P(x)与Q(x)的差异





     KL散度大于等于0的证明    


KL散度作为两个分布的距离,它是一定不小于0的,下面证明为什么KL散度>=0
证KL散度>=0,即证:DKL(PQ)=xXP(x)lnP(x)Q(x)0\displaystyle D_{KL}(P||Q)= \sum \limits _{x\in X} P(x)\textbf{ln}\dfrac{P(x)}{Q(x)}\geqslant 0
证明过程需要利用不等式:ln(x)x1\text{ln}(x)\leqslant x-1,利用此不等式可轻易证明KL散度不小于0

 KL散度不小于0的证明过程如下:
由于: P(x)lnP(x)Q(x)=P(x)lnQ(x)P(x)P(x)(Q(x)P(x)1)=P(x)Q(x)\small \displaystyle \begin{aligned} -P(x)\textbf{ln}\dfrac{P(x)}{Q(x)} = P(x)\textbf{ln}\dfrac{Q(x)}{P(x)} \leqslant P(x)\left ( \dfrac{Q(x)}{P(x)}-1 \right ) = P(x)-Q(x) \end{aligned}         
即       P(x)lnP(x)Q(x)Q(x)P(x)\small \displaystyle \begin{aligned} P(x)\textbf{ln}\dfrac{P(x)}{Q(x)} \geqslant Q(x)-P(x) \end{aligned}                                                                        
故有: xXP(x)lnP(x)Q(x)xX[Q(x)P(x)]=xXQ(x)xXP(x)=11=0\small \displaystyle \begin{aligned} \sum \limits _{x\in X} P(x)\textbf{ln}\dfrac{P(x)}{Q(x)} \geqslant \sum \limits _{x\in X}\left [ Q(x)-P(x) \right ] = \sum \limits _{x\in X} Q(x)-\sum \limits _{x\in X}P(x) =1-1=0 \end{aligned}
即    DKL(PQ)0D_{KL}(P||Q)\geqslant 0                                                                                             
✍️附:ln(x)x1\text{ln}(x)\leqslant x-1的证明
f(x)=ln(x)x+1f(x) = \text{ln}(x)-x+1                                    
f(x)f(x)导数为0,则有                                          
 f(x)=1x1=0x=1\begin{aligned} &f'(x) = \dfrac{1}{x}-1 = 0 \\ &\Rightarrow x = 1 \end{aligned}                  
  可知f(x)在1处取得极值,且易知是极大值,从而有   
  f(x)f(1)=ln(1)1+1=0f(x)\leqslant f(1) = \text{ln}(1)-1+1=0    
即 ln(x)x+10\text{ln}(x)- x+1\leqslant 0                                        
从而得到ln(x)x1\text{ln}(x)\leqslant x-1                                      






好了,以上就是KL散度的介绍以及原理推导了~








 End 


 


联系老饼