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…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...