KL散度(Kullback-Leibler)

embedded/2024/9/20 3:40:09/ 标签: 人工智能, 数学原理, KL, KullbackLeibler

文章目录

  • 1. KL 散度的符号表示
  • 2. "||"符号的含义
  • 3. KL 散度的定义
  • 4. 为什么使用"||"符号
  • 5. 直观理解
  • 6. 应用中的理解
  • 7. 举例说明
  • 8. 补充说明

🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发,目前开始人工智能领域相关知识的学习
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

KL散度用在了"LLaMA2"论文里面,关于论文提到的"PPO"算法,我先展示一下完整公式,感兴趣可以去我的这篇文章看一下:
速通LLaMA2:https://xzl-tech.blog.csdn.net/article/details/142315279

公式:
arg ⁡ max ⁡ π E p ∼ D , g ∼ π [ R ( g ∣ p ) ] = { arg ⁡ max ⁡ π E p ∼ D , g ∼ π [ whiten ( logit ( R s ( g ∣ p ) ) ) − β ∑ x π 0 ( x ∣ g , p ) log ⁡ ( π 0 ( x ∣ g , p ) π ( x ∣ g , p ) ) ] , ( d i s c r e t e , & , if is_safety( p ) or  R s ( g ∣ p ) < 0.15 ) arg ⁡ max ⁡ π E p ∼ D , g ∼ π [ whiten ( logit ( R h ( g ∣ p ) ) ) − β ∑ x π 0 ( x ∣ g , p ) log ⁡ ( π 0 ( x ∣ g , p ) π ( x ∣ g , p ) ) ] , ( d i s c r e t e , & , otherwise ) arg ⁡ max ⁡ π E p ∼ D , g ∼ π [ whiten ( logit ( R s ( g ∣ p ) ) ) − β ∫ π 0 ( x ∣ g , p ) log ⁡ ( π 0 ( x ∣ g , p ) π ( x ∣ g , p ) ) d x ] , ( c o n t i n u o u s , & , if is_safety( p ) or  R s ( g ∣ p ) < 0.15 ) arg ⁡ max ⁡ π E p ∼ D , g ∼ π [ whiten ( logit ( R h ( g ∣ p ) ) ) − β ∫ π 0 ( x ∣ g , p ) log ⁡ ( π 0 ( x ∣ g , p ) π ( x ∣ g , p ) ) d x ] , ( c o n t i n u o u s , & , otherwise ) \arg \max_{\pi} \mathbb{E}_{p \sim D, g \sim \pi}[R(g | p)]= \begin{cases} \arg \max_{\pi} \mathbb{E}_{p \sim D, g \sim \pi} \left[ \text{whiten}(\text{logit}(R_s(g | p))) - \beta \sum_{x} \pi_0(x \mid g, p) \log \left( \frac{\pi_0(x \mid g, p)}{\pi(x \mid g, p)} \right) \right],&(discrete,\&,\text{if is\_safety($p$) or } R_s(g | p) < 0.15 )\\ \arg \max_{\pi} \mathbb{E}_{p \sim D, g \sim \pi} \left[ \text{whiten}(\text{logit}(R_h(g | p))) - \beta \sum_{x} \pi_0(x \mid g, p) \log \left( \frac{\pi_0(x \mid g, p)}{\pi(x \mid g, p)} \right) \right],&(discrete,\&,\text{otherwise}) \\ \arg \max_{\pi} \mathbb{E}_{p \sim D, g \sim \pi} \left[ \text{whiten}(\text{logit}(R_s(g | p))) - \beta \int \pi_0(x \mid g, p) \log \left( \frac{\pi_0(x \mid g, p)}{\pi(x \mid g, p)} \right) dx \right],&(continuous,\&,\text{if is\_safety($p$) or } R_s(g | p) < 0.15)\\ \arg \max_{\pi} \mathbb{E}_{p \sim D, g \sim \pi} \left[ \text{whiten}(\text{logit}(R_h(g | p))) - \beta \int \pi_0(x \mid g, p) \log \left( \frac{\pi_0(x \mid g, p)}{\pi(x \mid g, p)} \right) dx \right],&(continuous,\&,\text{otherwise})\\ \end{cases} argπmaxEpD,gπ[R(gp)]= argmaxπEpD,gπ[whiten(logit(Rs(gp)))βxπ0(xg,p)log(π(xg,p)π0(xg,p))],argmaxπEpD,gπ[whiten(logit(Rh(gp)))βxπ0(xg,p)log(π(xg,p)π0(xg,p))],argmaxπEpD,gπ[whiten(logit(Rs(gp)))βπ0(xg,p)log(π(xg,p)π0(xg,p))dx],argmaxπEpD,gπ[whiten(logit(Rh(gp)))βπ0(xg,p)log(π(xg,p)π0(xg,p))dx],(discrete,&,if is_safety(p) or Rs(gp)<0.15)(discrete,&,otherwise)(continuous,&,if is_safety(p) or Rs(gp)<0.15)(continuous,&,otherwise)


下面详细解释一下 KL 散度公式

KL__24">1. KL 散度的符号表示

KL 散度(Kullback-Leibler 散度)的公式中,通常写作:

D K L ( P ∥ Q ) D_{KL}(P \| Q) DKL(PQ)

这里的"||"是一个符号,用来分隔两个概率分布 P P P Q Q Q,表示计算 P P P相对于 Q Q QKL 散度。

2. "||"符号的含义

  • 表示方向性: KL 散度是非对称的,即 D K L ( P ∥ Q ) ≠ D K L ( Q ∥ P ) D_{KL}(P \| Q) \neq D_{KL}(Q \| P) DKL(PQ)=DKL(QP)。因此,"||"符号表示了从 P P P Q Q Q的方向。
  • 读作: P P P相对于 Q Q QKL 散度"或" P P P关于 Q Q QKL 散度”。
  • 作用: 明确指出哪个分布是“真实”分布(或目标分布),哪个是“近似”分布(或模型分布)。在 D K L ( P ∥ Q ) D_{KL}(P \| Q) DKL(PQ)中, P P P通常被视为真实分布, Q Q Q是近似或模型分布。

KL__36">3. KL 散度的定义

KL 散度用于衡量两个概率分布之间的差异,其数学定义为:

D K L ( P ∥ Q ) = ∑ x P ( x ) log ⁡ ( P ( x ) Q ( x ) ) D_{KL}(P \| Q) = \sum_{x} P(x) \log \left( \frac{P(x)}{Q(x)} \right) DKL(PQ)=xP(x)log(Q(x)P(x))

或对于连续分布:

D K L ( P ∥ Q ) = ∫ P ( x ) log ⁡ ( P ( x ) Q ( x ) ) d x D_{KL}(P \| Q) = \int P(x) \log \left( \frac{P(x)}{Q(x)} \right) dx DKL(PQ)=P(x)log(Q(x)P(x))dx

在这个公式中:

  • P ( x ) P(x) P(x) 真实分布或目标分布的概率密度函数。
  • Q ( x ) Q(x) Q(x) 近似分布或模型分布的概率密度函数。
  • log ⁡ ( P ( x ) Q ( x ) ) \log \left( \frac{P(x)}{Q(x)} \right) log(Q(x)P(x)) 表示在每个点 x x x上, P ( x ) P(x) P(x)相对于 Q ( x ) Q(x) Q(x)的对数差异。

4. 为什么使用"||"符号

  • 强调非对称性: KL 散度不是对称的,即 D K L ( P ∥ Q ) D_{KL}(P \| Q) DKL(PQ) D K L ( Q ∥ P ) D_{KL}(Q \| P) DKL(QP)一般不相等。因此,用"$| | $"来强调计算的顺序和方向。
  • 区分角色: 在许多应用中, P P P Q Q Q扮演不同的角色。 P P P通常是数据的真实分布,我们希望模型 Q Q Q能够尽可能接近 P P P

5. 直观理解

  • 信息损失: KL 散度可以被看作是使用分布 Q Q Q来近似分布 P P P时所产生的信息损失。
  • 例子: 假设我们有两个概率分布:

D K L ( P ∥ Q ) D_{KL}(P \| Q) DKL(PQ)计算的是如果我们用模型 Q Q Q来近似真实分布 P P P时,所产生的差异或信息损失。

  • P P P:真实的硬币掷投结果分布,硬币是公平的,正反面概率均为 0.5。
  • Q Q Q:我们的模型认为硬币是偏的,正面概率为 0.7,反面概率为 0.3。

6. 应用中的理解

在您提到的公式中:

R ( g ∣ p ) = R ~ c ( g ∣ p ) − β D K L ( π 0 ( g ∣ p ) ∥ π ( g ∣ p ) ) R(g \mid p) = \tilde{R}_c(g \mid p) - \beta D_{KL}(\pi_0(g \mid p) \| \pi(g \mid p)) R(gp)=R~c(gp)βDKL(π0(gp)π(gp))

  • D K L ( π 0 ( g ∣ p ) ∥ π ( g ∣ p ) ) D_{KL}(\pi_0(g \mid p) \| \pi(g \mid p)) DKL(π0(gp)π(gp))
    • π 0 ( g ∣ p ) \pi_0(g \mid p) π0(gp):初始策略或基准分布。
    • π ( g ∣ p ) \pi(g \mid p) π(gp):当前策略或模型分布。
    • “||”:表示我们在计算初始策略相对于当前策略的 KL 散度。
  • 含义: 我们希望新的策略 π \pi π不要偏离初始策略 π 0 \pi_0 π0太多,因此通过 KL 散度来衡量这种偏离程度。

7. 举例说明

假设我们有一个简单的逻辑回归模型,该模型用于根据单个特征 x x x来预测输出 y y y属于类别0或类别1。

模型的参数 p p p为逻辑回归的权重 w w w和偏置 b b b

  • 先验分布 π 0 ( g ∣ p ) \pi_0(g|p) π0(gp): 假设我们有理由相信在没有数据的情况下,权重 w w w应接近0,因此我们将先验分布 π 0 \pi_0 π0设置为均值为0,方差为1的正态分布。
  • 后验分布 π ( g ∣ p ) \pi(g|p) π(gp): 训练数据后,我们更新权重并获得新的分布,假设更新后的权重 w w w均值为1,方差为1。
  • 条件风险函数 R ~ c ( g ∣ p ) \tilde{R}_c(g|p) R~c(gp): 使用二元交叉熵损失。
  • 调节参数 β \beta β: 设为0.1,用以控制正则化强度。

计算步骤:

  • 计算条件风险 R ~ c ( g ∣ p ) \tilde{R}_c(g|p) R~c(gp)
    • 假设单个数据点为 ( x , y ) = ( 2 , 1 ) (x, y) = (2, 1) (x,y)=(2,1)模型预测 y ^ \hat{y} y^的概率为:
      * y ^ = σ ( w ⋅ x + b ) = σ ( 1 ⋅ 2 + 0 ) = σ ( 2 ) \hat{y} = \sigma(w \cdot x + b) = \sigma(1 \cdot 2 + 0) = \sigma(2) y^=σ(wx+b)=σ(12+0)=σ(2)
      • 其中 σ \sigma σ是sigmoid函数。计算 σ ( 2 ) ≈ 0.88 \sigma(2) \approx 0.88 σ(2)0.88
    • 二元交叉熵损失为: − [ y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] = − [ 1 log ⁡ ( 0.88 ) + 0 log ⁡ ( 0.12 ) ] ≈ 0.13 -\left[y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})\right] = -[1 \log(0.88) + 0 \log(0.12)] \approx 0.13 [ylog(y^)+(1y)log(1y^)]=[1log(0.88)+0log(0.12)]0.13
  • 计算KL散度:
    • 对于正态分布的KL散度,公式为: D K L ( N ( μ 0 , σ 0 2 ) ∥ N ( μ , σ 2 ) ) = log ⁡ ( σ σ 0 ) + σ 0 2 + ( μ 0 − μ ) 2 2 σ 2 − 1 2 D_{KL}(N(\mu_0, \sigma_0^2) \| N(\mu, \sigma^2)) = \log\left(\frac{\sigma}{\sigma_0}\right) + \frac{\sigma_0^2 + (\mu_0 - \mu)^2}{2 \sigma^2} - \frac{1}{2} DKL(N(μ0,σ02)N(μ,σ2))=log(σ0σ)+2σ2σ02+(μ0μ)221
    • 将值代入: D K L ( N ( 0 , 1 ) ∥ N ( 1 , 1 ) ) = log ⁡ ( 1 ) + 1 + ( 0 − 1 ) 2 2 ⋅ 1 − 1 2 = 0.5 D_{KL}(N(0, 1) \| N(1, 1)) = \log(1) + \frac{1 + (0 - 1)^2}{2 \cdot 1} - \frac{1}{2} = 0.5 DKL(N(0,1)N(1,1))=log(1)+211+(01)221=0.5
  • 计算总目标函数: R ( g ∣ p ) = 0.13 − 0.1 ⋅ 0.5 = 0.13 − 0.05 = 0.08 R(g|p) = 0.13 - 0.1 \cdot 0.5 = 0.13 - 0.05 = 0.08 R(gp)=0.130.10.5=0.130.05=0.08

小结:

通过这个计算例子,我们可以看到如何结合模型的预测损失和基于先验知识的正则化来形成最终的目标函数,这种方法有助于平衡模型的拟合能力和对先验知识的保留,尤其在数据较少或不完整时非常有用。

8. 补充说明

  • 其他表示方法: 有时,KL 散度也可以写作 D K L ( P || Q ) D_{KL}(P \, \text{||} \, Q) DKL(P||Q) D K L ( P → Q ) D_{KL}(P \rightarrow Q) DKL(PQ),但"|"是最常用的表示方法之一。
  • 注意符号顺序: 在计算 KL 散度时,符号顺序很重要,交换 P P P Q Q Q会得到不同的结果。

http://www.ppmy.cn/embedded/114023.html

相关文章

k8s dashboard token 生成/获取

创建示例用户 在本指南中&#xff0c;我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount&#xff0c;ClusterRoleBinding您都应该将它们复制到新的清单文件(如)…

go语言的基本语法

学了go语言但是一直没整理。。。那怎么证明我学了&#xff1f;如果学了之后忘了怎么复习&#xff1f;遂诞生这几篇&#xff0c;当作Linux中间的小插曲 整理一下go语言的基本语法&#xff1a; package mainimport ("bufio""fmt""os" ) 在使用对…

Vue2源码解读

vue源码_哔哩哔哩_bilibili 1.Vue源码路径目录解读 Vue2源码的路径目录被设计得非常清晰&#xff0c;每个文件夹都承担着特定的职责和功能。以下是这些主要文件夹&#xff08;compiler、core、platform、server、sfc、shared&#xff09;的详细解读&#xff1a; 1. compiler …

Redis面试---缓存问题

一、Redis和MySQL数据一致性解决方案 (一)借助lua脚本 Redis命令是单线程,不会存在数据并发安全问题,如果要保证多条命令并发执行的原子性,可以将多个Redis命令存放在lua脚本中,然后再统一执行。 在数据一致性问题方面,将Redis伪装成MySQL的slave,按照MySQL的主从交互…

二十种编程语言庆祝中秋节

二十种编程语言庆祝中秋节 文章目录 二十种编程语言庆祝中秋节中秋快乐&#xff01;家人们 &#x1f973;一 Python二 C三 C四 Java五 C#六 Perl七 Go八 Asp九 PHP十 JavaScript十一 JavaScript HTML十二 Visual Basic十三 早期 VB十四 Visual C十五 Delphi十六 Shell十七 Cobo…

Vue.js与Flask/Django后端配合详细讲解

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

36.贪心算法3

1.坏了的计算器&#xff08;medium&#xff09; . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public int brokenCalc(int startValue, int target) {// 正难则反 贪⼼int ret 0;while (target > startValue) {if (target % 2 0…

EP19 各个页面之间的跳转

文件路径&#xff1a; E:/homework/uniappv3tswallpaper/pages/index/index.vue 添加了几个 navigator 。 <template><view class"homeLayout pageBg"><custom-nav-bar title"推荐"></custom-nav-bar><view class"banne…

windows使用tcpdump.exe工具进行抓包教程

windows主机安装一些抓包工具可能有些不方便&#xff0c;这里有一个tcpdump.exe工具直接免安装&#xff0c;可以直接使用进行抓包。&#xff08;工具下载见 附件&#xff09; tcpdump.exe使用教程 如下&#xff1a; 1&#xff1a;tcpdump -D 可查看网络适配器(注意前面的编号)…

OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 进行点在轮廓内的测试。 该函数确定点是在轮廓内、轮廓外&#xff0c;还是位于一条边上&#xff08;或与顶点重合&#xff09;。它返回正值&…

C++ 条件变量:wait、wait_for、wait_until

前言 在C中&#xff0c;条件变量&#xff08;std::condition_variable&#xff09;是用来在多个线程之间同步执行流的一种机制。它们通常与互斥锁&#xff08;如std::mutex&#xff09;一起使用&#xff0c;以在特定条件满足时唤醒一个或多个线程。条件变量有三种使线程阻塞并…

机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

本文参考资料&#xff1a; rviz - ROS 维基 Gazebo : Tutorial : Ubuntu (gazebosim.org) 零. 什么是Rviz和Gazebo&#xff1a; Rviz是一个三维可视化工具&#xff0c;它利用已有的数据将数据可视化&#xff0c;并提供了可以显示图像、模型、表格、路径等信息的插件&#x…

JDeps 使用指南

JDeps 使用指南 jdeps 是一个 Java 类依赖分析工具&#xff0c;允许开发者深入分析 Java 应用程序的依赖情况&#xff0c;包括类、包、模块和 JDK 内部 API 的使用。下面详细介绍 jdeps 的常用命令和输出解释。 1. 基本依赖分析 jdeps path/to/yourapp.jar这个命令会分析指定…

34.贪心算法1

0.贪心算法 1.柠檬水找零&#xff08;easy&#xff09; . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元&#xff1a;直接收下…

基于vue框架的宠物店管理系统的设计与实现4czn0(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商品分类,服务类型,商品信息,商品订单,宠物服务,服务预约,服务评价,商品咨询 开题报告内容 基于Vue框架的宠物店管理系统的设计与实现开题报告 一、引言 随着宠物行业的蓬勃发展&#xff0c;宠物店作为宠物产品与服务的重要提供…

【代码】使用c#实现串口通信的基础模板

一、分享代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;using System.IO.Ports; using…

在 Red Hat 上安装 SQL Server 2022 并创建数据库

适用于&#xff1a; SQL Server - Linux 本快速入门介绍如何在 Red Hat Enterprise Linux (RHEL) 8.x 或 9.x 上安装 SQL Server 2022 (16.x)。然后可以使用 sqlcmd 进行连接&#xff0c;创建第一个数据库并运行查询。 注意&#xff1a;本教程需要用户输入和 Internet 连接。 …

高级java每日一道面试题-2024年9月16日-框架篇-Spring MVC和Struts的区别是什么?

如果有遗漏,评论区告诉我进行补充 面试官: 如何处理事务中的性能问题&#xff1f; 我回答: 在Java高级面试中&#xff0c;Spring MVC和Struts是两个常被提及的MVC框架&#xff0c;它们各自具有独特的特点和优势。以下是对这两个框架的详细比较&#xff1a; 架构设计方面 Sp…

UDS 诊断 - RequestFileTransfer(请求文件传输)(0x38)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl&#xff08;诊断会话控制&#xff09;&#xff08;0x10&#xff09;服务 UDS 诊断 - ECUReset&#xff08;ECU重置&#xff09;&#xff08;0x11&#xff09;服务 UDS 诊断 - SecurityA…

Linux命令---查看端口是否被占用

简介 在linux系统使用命令查找指定端口是否被占用。 命令 lsof -i:6379