前言

最近在看GAN相关的文章,经常提到KL散度这一概念,为了加深印象以及方便复习,特意写在博客上。

KL散度用来做什么?

KL散度的用途:比较两个概率分布的接近程度。
在统计应用中,我们经常需要用一个简单的,近似的概率分布ff∗<script type="math/tex" id="MathJax-Element-158">f^*</script>来描述
观察数据 DD或者另一个复杂的概率分布ff<script type="math/tex" id="MathJax-Element-159">f</script>。这个时候,我们需要一个量来衡量我们选择的近似分布 f <script type="math/tex" id="MathJax-Element-160">f^*</script>相比原分布ff<script type="math/tex" id="MathJax-Element-161">f</script>究竟损失了多少信息量,这就是KL散度起作用的地方。

为了更好的理解KL散度,在这里首先抛出熵的概念。在信息论这门学科中,一个很重要的目标就是量化描述数据中含有多少信息。 为此,提出了熵的概念,记作H,一个概率分布所对应的熵表达如下:

H <script type="math/tex" id="MathJax-Element-164">H</script>= Ni=1p(xi)log(p(xi))−∑i=1Np(xi)⋅log(p(xi))<script type="math/tex" id="MathJax-Element-165">-\sum_{i=1}^{N}p(x_i)\cdot log(p(x_i))</script>

如果我们使用 log2log⁡2 作为底,熵可以被理解为:我们编码所有信息所需要的最小位数。 需要注意的是:通过计算熵,我们可以知道信息编码需要的最小位数,却不能确定最佳的数据压缩策略。怎样选择最优数据压缩策略,使得数据存储位数与熵计算的位数相同,达到最优压缩,是另一个庞大的课题。

KL散度的计算

现在,我们能够量化数据中的信息量了,就可以来衡量近似分布带来的信息损失了。KL散度的计算公式其实是熵计算公式的简单变形,在原有概率分布 pp<script type="math/tex" id="MathJax-Element-635">p</script> 上,加入我们的近似概率分布 q <script type="math/tex" id="MathJax-Element-636">q</script>,计算他们的每个取值对应对数的差:

DKL(p||q)DKL(p||q)<script type="math/tex" id="MathJax-Element-637">D_KL(p||q)</script>= Ni=1p(xi)(log(p(xi))log(q(xi)))∑i=1Np(xi)⋅(log(p(xi))−log(q(xi)))<script type="math/tex" id="MathJax-Element-638">\sum_{i=1}^{N}p(x_i)\cdot (log(p(x_i))-log(q(x_i)))</script>

换句话说,KL散度计算的就是数据的原分布与近似分布的概率的对数差的期望值。 在对数以2为底时,log2 ,可以理解为“我们损失了多少位的信息”
写成期望形式:

DKL(p||q)DKL(p||q)<script type="math/tex" id="MathJax-Element-639">D_KL(p||q)</script>=E[log(p(x))log(q(x))]E[log(p(x))−log(q(x))]<script type="math/tex" id="MathJax-Element-640">E[log(p(x))-log(q(x))]</script>

更常见的是以下形式:

DKL(p||q)DKL(p||q)<script type="math/tex" id="MathJax-Element-641">D_KL(p||q)</script>= Ni=1p(xi)logp(xi)q(xi)∑i=1Np(xi)⋅logp(xi)q(xi)<script type="math/tex" id="MathJax-Element-642">\sum_{i=1}^{N}p(x_i)\cdot log\frac{p(x_i)}{q(x_i)}</script>

散度不可逆

DKL(p||q)DKL(p||q)<script type="math/tex" id="MathJax-Element-708">D_KL(p||q)</script><script type="math/tex" id="MathJax-Element-709">\neq </script>DKL(q||p)DKL(q||p)<script type="math/tex" id="MathJax-Element-710">D_KL(q||p)</script>

因为KL散度不具有交换性,所以不能理解为“距离”的概念,衡量的并不是两个分布在空间中的远近,更准确的理解还是衡量一个分布相比另一个分布的信息损失(infomation lost)。

KL散度的应用

通过不断改变预估分布的参数,我们可以得到不同的KL散度的值。在某个变化范围内,KL散度取到最小值的时候,对应的参数是我们想要的最优参数。 这就是使用KL散度优化的过程。神经网络进行的工作很大程度上就是“函数的近似”(function approximators) 所以我们可以使用神经网络学习很多复杂函数,学习过程的关键就是设定一个目标函数来衡量学习效果。也就是通过最小化目标函数的损失来训练网络(minimizing the loss of the objective function) 使用KL散度来最小化我们近似分布时的信息损失,让我们的网络可以学习很多复杂分布。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐