KL Divergence

参考文章:
KL散度(Kullback-Leibler Divergence)介绍及详细公式推导
变分自编码器(VAE)推导

KL散度简介

KL散度的概念来源于概率论和信息论中。KL散度又被称为:相对熵、互熵、鉴别信息、Kullback熵、Kullback-Leible散度(即KL散度的简写)。在机器学习、深度学习领域中,KL散度被广泛运用于变分自编码器中(Variational AutoEncoder,简称VAE)、EM算法、GAN网络中。

KL散度定义

KL散度的定义是建立在熵(Entropy)的基础上的。此处以离散随机变量为例,先给出熵的定义,再给定KL散度定义。

若一个离散随机变量X的可能取值为X=x1,x2,,xnX={x_1,x_2,⋯,x_n},而对应的概率为pi=p(X=xi)p_i=p(X=x_i),则随机变量XX的熵定义为:
H(X)=in=p(xi)logp(xi)H(X)=−∑_i^n=p(x_i)log_p(x_i)规定当p(xi)=0,p(xi)logp(xi)=0p(x_i)=0时,p(x_i)log_p(x_i)=0
若有两个随机变量PQP、Q,且其概率分布分别为p(x)q(x)p(x)、q(x),则pp相对qq的相对熵为:

DKL(pq)=inp(x)logp(x)q(x)D_{KL}(p||q)=∑_i^np(x)log{p(x)\over q(x)}
之所以称之为相对熵,是因为其可以通过两随机变量的交叉熵(Cross-Entropy)以及信息熵推导得到:
针对上述离散变量的概率分布p(x)q(x)p(x)、q(x)而言,其交叉熵定义为:
H(p,q)=xp(x)log1q(x)=xp(x)logq(x)H(p,q)=∑_xp(x)log{1\over q(x)}=−∑_xp(x)logq(x)
在信息论中,交叉熵可认为是对预测分布q(x)q(x)用真实分布p(x)p(x)来进行编码时所需要的信息量大小。
因此,KL散度或相对熵可通过下式得出:

DKL(pq)=H(p,q)H(p)=xp(x)logq(x)xp(x)logp(x)=xp(x)(logq(x)logp(x))=xp(x)logq(x)p(x)D_{KL}(p||q)=H(p,q)−H(p)=−∑_xp(x)logq(x)−∑_x−p(x)logp(x)=-∑_xp(x)(logq(x)−logp(x))=−∑_xp(x)log{q(x)\over p(x)}

代码

import numpy as np
from scipy import *

def asymmetricKL(P,Q):
    return sum(P * log(P / Q)) #calculate the kl divergence between P and Q
 
def symmetricalKL(P,Q):
    return (asymmetricKL(P,Q)+asymmetricKL(Q,P))/2.00

KL = scipy.stats.entropy(P,Q) 

服从一维高斯分布的随机变量KL散度

在这里插入图片描述

服从多元高斯分布的随机变量KL散度

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章