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 散度具有以下性质:
- 非负性:( 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)) 时取等号。
- 非对称性:( 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)dx−∫p(x)lnq(x)dx
两部分含义:
-
第一项:( ∫ 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 θ) 不产生影响。
-
第二项:( − ∫ 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)dx≈N1i=1∑Nlnq(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=1∑Nlnq(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=1∑Nlnq(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) N1∑i=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=1∑N{−lnq(xi∣θ)+lnp(xi)}
5. 总结与意义
通过以上分析,我们将 KL 散度公式从理论形式逐步推导为一个可以应用于机器学习模型训练的形式。关键步骤包括:
- 利用训练样本的经验分布对积分项进行近似;
- 忽略与参数无关的常数项,聚焦于对分布 ( 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分于上海。
相关文章:
KL散度改写为一个可用于优化的形式
理解 KL 散度及其公式推导过程 在信息论和概率论中,KL散度(Kullback-Leibler Divergence)是衡量两个概率分布之间差异的重要工具。本文将从 KL 散度的定义入手,详细解析其公式来源以及如何将其改写为一个可用于优化的形式。 1. 什…...
Java代码操作Zookeeper(使用 Apache Curator 库)
1. Zookeeper原生客户端库存在的缺点 复杂性高:原生客户端库提供了底层的 API,需要开发者手动处理很多细节,如连接管理、会话管理、异常处理等。这增加了开发的复杂性,容易出错。连接管理繁琐:使用原生客户端库时&…...
【Linux】Make/Makefile
这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。 make命令扫描makefile文件时,从上向下扫描,默认形成一个目标文件。 指定make clean的时候才回去执行对应的清除。 为什么要给我们的clean.PHONY:clean声明它是伪目标呢? PHONY类…...
C++练级计划->《多态》虚函数表,菱形继承多态
目录 什么是多态? 多态的条件 虚函数: 虚函数的重写: 协变 析构函数的重写 C11 final 和 override final: override: 总结: 三重对比:重载重写重定义对比 抽象类 多态的原理 虚函数…...
OkHttp3 - 2. OkHttp的核心组件与架构
1 OkHttp的工作原理 OkHttp3 的核心设计遵循以下原则: 请求与响应的分离:通过 Request 和 Response 对象解耦请求构建与结果处理。异步与同步支持:使用 Call 对象管理请求,可以同步或异步执行。高效连接复用:通过连接…...
异或操作解决一些问题
前提: 异或操作符合交换律,结合律(因为其根本上来抽象理解,就是查看所有项二进制数相同位是否有奇数个1,对运算结果二进制数而言,没有该位为0,有该位为1,与顺序无关)。 …...
操作系统之输入输出
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
Centos 安装 Node.js 和 npm
方法2:使用 NVM(Node Version Manager)安装 安装 NVM curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 重新加载配置 source ~/.bashrc 安装最新的 LTS 版本的 Node.js nvm install --lts 验证安装…...
C语言——指针初阶(一)
目录 一.什么是指针??? 指针是什么? 指针变量: 总结: 总结: 二.指针和指针类型 指针-整数: 总结: 指针的解引用 总结: 三.野指针 如何规避野指针 往期…...
React Native 原生开发指南
写在前面 React Native (RN) 是一个用于构建跨平台移动应用的框架。它允许开发者使用 JavaScript 和 React 来编写应用程序,并将其转换为原生代码。虽然 RN 提供了许多内置的组件和 API,但有时候你可能需要访问原生平台的特定功能或性能优化。为此&…...
【前端】JavaScript中的柯里化(Currying)详解及实现
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯什么是柯里化?💯柯里化的特点💯柯里化的简单示例💯通用的柯里化实现💯柯里化让代码更易读的原因💯…...
解决 docker 部署 vsftpd 速度慢问题
解决 docker 部署 vsftpd 速度慢问题 Docker 部署 ftp version: 3.8services:ftps:image: fauria/vsftpdcontainer_name: my-ftpsenvironment:- FTP_USERyourusername- FTP_PASSyourpassword- PASV_ADDRESS192.168.0.123 # 使用环境变量或直接指定IP地址- PASV_MIN_PORT4900…...
Java基础夯实——2.9 多线程如何共享数据
在 Java 多线程编程中,共享数据通过以下几种方式实现: 1. 使用共享对象 多个线程可以通过引用同一个对象来实现数据共享。例如: class SharedData {private int count;public synchronized void increment() {count;}public synchronized …...
【Leetcode Top 100】234. 回文链表
问题背景 给你一个单链表的头节点 h e a d head head,请你判断该链表是否为 回文链表(回文 序列是向前和向后读都相同的序列)。如果是,返回 t r u e true true;否则,返回 f a l s e false false。 数据…...
GitLab指定用户分配合并权限
进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支,设置角色 管理用户角色权限 查看到不同用户的角色,一般设置Developer只有Merger Request权限,Maintainer还有Merge审批权限 GitLab 中的权限…...
五,[GXYCTF2019]Ping Ping Ping1
进入靶场,有提示 我们在url试着输入本地IP,返回了ping命令 既然要在url处传参,那就用postman,再输入ip127.0.0.1 & ls,试着列出目录内容 ok,好像是个脏话,它过滤了空格 试着穿越又看到了脏话࿰…...
基于STM32的智能无人机自主飞行与目标识别系统设计
目录 引言系统需求分析 2.1 功能需求 2.2 硬件需求 2.3 软件需求系统设计 3.1 总体架构 3.2 各模块设计系统实现 4.1 硬件实现 4.2 软件实现系统调试与优化总结与展望 1. 引言 随着无人机技术的快速发展,无人机在军事侦察、环境监测、物流配送等领域的应用逐渐增多…...
C 语言数组与函数:核心要点深度剖析与高效编程秘籍
我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 目录 引言数组基础 2.1 数组的定义与初始化 2.2 一维数组的基本操作 2.3 二维数组及其应用 2.4 数组与指针的关系函数基础 3.1 函数的定义与调用 3.2…...
汽车轮毂结构分析有哪些?国产3D仿真分析实现静力学+模态分析
本文为CAD芯智库原创,未经允许请勿复制、转载! 之前分享了如何通过国产三维CAD软件如何实现「汽车/汽配行业产品设计」,兼容NX(UG)、Creo(Proe),轻松降低企业上下游图纸交互成本等。…...
解决jupyter notebook 新建或打开.ipynb 报500 : Internal Server Error(涉及jinja2兼容性问题)
报错: [E 10:09:52.362 NotebookApp] 500 GET /notebooks/Untitled16.ipynb?kernel_namepyt hon3 (::1) 93.000000ms refererhttp://localhost:8888/tree ...... 重点是: from .exporters import * File "C:\ProgramData\Anaconda3\lib\site-p…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
