当前位置: 首页 > news >正文

KL散度改写为一个可用于优化的形式

理解 KL 散度及其公式推导过程

在信息论和概率论中,KL散度(Kullback-Leibler Divergence)是衡量两个概率分布之间差异的重要工具。本文将从 KL 散度的定义入手,详细解析其公式来源以及如何将其改写为一个可用于优化的形式。


1. 什么是 KL 散度?

KL 散度是一个非对称的测度,用来衡量一个概率分布 ( p ( x ) p(x) p(x)) 与另一个近似分布 ( q ( x ) q(x) q(x)) 之间的距离。其数学定义为:
D K L ( p ∣ ∣ q ) = ∫ p ( x ) ln ⁡ p ( x ) q ( x ) d x D_{KL}(p || q) = \int p(x) \ln \frac{p(x)}{q(x)} dx DKL(p∣∣q)=p(x)lnq(x)p(x)dx

各符号含义:
  • ( p ( x ) p(x) p(x)):目标分布(通常是数据生成的真实分布)。
  • ( q ( x ) q(x) q(x)):近似分布(通常是由模型参数 ( θ \theta θ) 决定的分布)。
  • ( D K L ( p ∣ ∣ q ) D_{KL}(p || q) DKL(p∣∣q)):衡量 ( p ( x ) p(x) p(x)) 和 ( q ( x ) q(x) q(x)) 差异的值,越接近零表示两个分布越相似。

KL 散度具有以下性质:

  1. 非负性:( D K L ( p ∣ ∣ q ) ≥ 0 D_{KL}(p || q) \geq 0 DKL(p∣∣q)0),只有当 ( p ( x ) = q ( x ) p(x) = q(x) p(x)=q(x)) 时取等号。
  2. 非对称性:( D K L ( p ∣ ∣ q ) ≠ D K L ( q ∣ ∣ p ) D_{KL}(p || q) \neq D_{KL}(q || p) DKL(p∣∣q)=DKL(q∣∣p))。
直观理解:

KL 散度可以理解为在分布 ( q ( x ) q(x) q(x)) 下编码 ( p ( x ) p(x) p(x)) 数据的额外开销。它回答了这样一个问题:“如果我们用 ( q ( x ) q(x) q(x)) 来近似 ( p ( x ) p(x) p(x)),会带来多大的信息损失?”


2. KL 散度的分解形式

我们可以将 KL 散度公式展开为以下形式:
D K L ( p ∣ ∣ q ) = ∫ p ( x ) ln ⁡ p ( x ) d x − ∫ p ( x ) ln ⁡ q ( x ) d x D_{KL}(p || q) = \int p(x) \ln p(x) dx - \int p(x) \ln q(x) dx DKL(p∣∣q)=p(x)lnp(x)dxp(x)lnq(x)dx

两部分含义:
  1. 第一项:( ∫ p ( x ) ln ⁡ p ( x ) d x \int p(x) \ln p(x) dx p(x)lnp(x)dx)

    • 表示分布 ( p ( x ) p(x) p(x)) 的熵,是一个与 ( q ( x ) q(x) q(x)) 无关的常数。
    • 在优化过程中可以忽略,因为它对参数 ( θ \theta θ) 不产生影响。
  2. 第二项:( − ∫ p ( x ) ln ⁡ q ( x ) d x -\int p(x) \ln q(x) dx p(x)lnq(x)dx)

    • 这一项描述了分布 ( q ( x ) q(x) q(x)) 对目标分布 ( p ( x ) p(x) p(x)) 的拟合程度,是我们关注的重点。

3. 样本均值近似的引入

在实际问题中,我们通常无法直接获得目标分布 ( p ( x ) p(x) p(x)),而是通过有限的训练样本 ( D = { x 1 , x 2 , … , x N } D = \{x_1, x_2, \ldots, x_N\} D={x1,x2,,xN}) 来对 ( p ( x ) p(x) p(x)) 进行估计。因此,KL 散度公式中的期望 ( ∫ p ( x ) f ( x ) d x \int p(x) f(x) dx p(x)f(x)dx) 可以通过样本均值进行近似:

∫ p ( x ) ln ⁡ q ( x ) d x ≈ 1 N ∑ i = 1 N ln ⁡ q ( x i ∣ θ ) \int p(x) \ln q(x) dx \approx \frac{1}{N} \sum_{i=1}^N \ln q(x_i|\theta) p(x)lnq(x)dxN1i=1Nlnq(xiθ)

这里:

  • ( N N N):训练样本的数量。
  • ( { x 1 , x 2 , … , x N } \{x_1, x_2, \ldots, x_N\} {x1,x2,,xN}):从分布 ( p ( x ) p(x) p(x)) 中采样得到的独立同分布数据。

将上述近似代入 KL 散度公式,得到:
D K L ( p ∣ ∣ q ) ≈ − 1 N ∑ i = 1 N ln ⁡ q ( x i ∣ θ ) + 常数项 D_{KL}(p || q) \approx -\frac{1}{N} \sum_{i=1}^N \ln q(x_i|\theta) + \text{常数项} DKL(p∣∣q)N1i=1Nlnq(xiθ)+常数项


4. 忽略常数项后的优化目标

由于第一项 ( ∫ p ( x ) ln ⁡ p ( x ) d x \int p(x) \ln p(x) dx p(x)lnp(x)dx) 是与参数 ( θ \theta θ) 无关的常数项,在优化过程中可以忽略。因此,KL 散度的优化目标最终简化为:
优化目标 = − 1 N ∑ i = 1 N ln ⁡ q ( x i ∣ θ ) \text{优化目标} = -\frac{1}{N} \sum_{i=1}^N \ln q(x_i|\theta) 优化目标=N1i=1Nlnq(xiθ)

理解优化目标:
  • 这实际上是 负对数似然函数(Negative Log-Likelihood, NLL),即用模型分布 ( q ( x ∣ θ ) q(x|\theta) q(xθ)) 拟合训练样本的目标。

为了方便表达,加入一项 ( 1 N ∑ i = 1 N ln ⁡ p ( x i ) \frac{1}{N} \sum_{i=1}^N \ln p(x_i) N1i=1Nlnp(xi)),使得最终结果变为:
D K L ( p ∣ ∣ q ) ≈ 1 N ∑ i = 1 N { − ln ⁡ q ( x i ∣ θ ) + ln ⁡ p ( x i ) } D_{KL}(p || q) \approx \frac{1}{N} \sum_{i=1}^N \{-\ln q(x_i|\theta) + \ln p(x_i)\} DKL(p∣∣q)N1i=1N{lnq(xiθ)+lnp(xi)}

5. 总结与意义

通过以上分析,我们将 KL 散度公式从理论形式逐步推导为一个可以应用于机器学习模型训练的形式。关键步骤包括:

  1. 利用训练样本的经验分布对积分项进行近似;
  2. 忽略与参数无关的常数项,聚焦于对分布 ( q ( x ∣ θ q(x|\theta q(xθ)) 的优化。

最终的形式表明:最小化 KL 散度实际上等同于最大化模型的对数似然函数(MLE)。

KL 散度的这一性质广泛应用于生成模型(如变分自编码器 VAE)和深度学习优化中,帮助我们更好地逼近目标分布。


6. 代码实现示例

我们还可以通过代码展示如何在实际中实现 KL 散度的计算:

import numpy as np# 假设目标分布 p 和近似分布 q
p = np.array([0.2, 0.5, 0.3])  # 目标分布
q = np.array([0.3, 0.4, 0.3])  # 近似分布# 计算 KL 散度
kl_divergence = np.sum(p * np.log(p / q))
print(f"KL散度: {kl_divergence:.4f}")

运行结果可以帮助我们直观理解 KL 散度的计算和其在概率分布拟合中的重要性。

希望这篇文章对你理解 KL 散度的公式推导过程有所帮助。

后记

2024年11月27日15点32分于上海。

http://www.lryc.cn/news/492503.html

相关文章:

  • Java代码操作Zookeeper(使用 Apache Curator 库)
  • 【Linux】Make/Makefile
  • C++练级计划->《多态》虚函数表,菱形继承多态
  • OkHttp3 - 2. OkHttp的核心组件与架构
  • 异或操作解决一些问题
  • 操作系统之输入输出
  • Centos 安装 Node.js 和 npm
  • C语言——指针初阶(一)
  • React Native 原生开发指南
  • 【前端】JavaScript中的柯里化(Currying)详解及实现
  • 解决 docker 部署 vsftpd 速度慢问题
  • Java基础夯实——2.9 多线程如何共享数据
  • 【Leetcode Top 100】234. 回文链表
  • GitLab指定用户分配合并权限
  • 五,[GXYCTF2019]Ping Ping Ping1
  • 基于STM32的智能无人机自主飞行与目标识别系统设计
  • C 语言数组与函数:核心要点深度剖析与高效编程秘籍
  • 汽车轮毂结构分析有哪些?国产3D仿真分析实现静力学+模态分析
  • 解决jupyter notebook 新建或打开.ipynb 报500 : Internal Server Error(涉及jinja2兼容性问题)
  • 【若依ruoyi Vue前端线上个人服务器部署】以及常见报错问题解决
  • Python学习第十天--处理CSV文件和JSON数据
  • python基础(一)
  • go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
  • 守护进程
  • 学习日记_20241126_聚类方法(自组织映射Self-Organizing Maps, SOM)
  • 【接口自动化测试】一文从0到1详解接口测试协议!
  • 安全设备-日志审计-系统安装部署配置
  • 【ArcGIS Pro】实现一下完美的坐标点标注
  • Unity项目性能优化列表
  • 【系统架构设计师】高分论文:论软件架构的生命周期