机器学习之KL散度推导

embedded/2025/3/22 11:28:04/

机器学习之KL散度推导

预备知识

熵、交叉熵、条件熵

熵 (Entropy) 这一词最初来源于热力学。1948年,克劳德·爱尔伍德·香农将热力学中的熵引入信息论,所以也被称为香农熵 (Shannon entropy)、信息熵 (information entropy)。

对于具体熵的定义和用法推荐大家自己再去理解,本篇文章着重分析和推导KL散度

这里我先给出这个熵的定义如下:

熵: Entropy(x) = H ( X ) = − ∑ x p ( x ) l o g 2 ( x ) \text{Entropy(x)}= H(X) = -\sum_xp(x)log_2(x) Entropy(x)=H(X)=xp(x)log2(x)

条件熵:
H ( Y ∣ X ) = ∑ x p ( x ) H ( Y ∣ X = x ) = − ∑ x p ( x ) ∑ y p ( y ∣ x ) log ⁡ 2 p ( y ∣ x ) = − ∑ x ∑ y p ( x , y ) log ⁡ 2 p ( y ∣ x ) = − ∑ x , y p ( x , y ) log ⁡ 2 p ( y ∣ x ) \begin{align*} H(\mathbf{Y}| \mathbf{X}) &= \sum_{x} p(x) H(\mathbf{Y} | \mathbf{X} = x) \\ &= - \sum_{x} p(x) \sum_{y} p(y|x) \log_2 p(y|x) \\ &= - \sum_{x} \sum_{y} p(x, y) \log_2 p(y|x) \\ &= - \sum_{x,y} p(x, y) \log_2 p(y|x) \end{align*} H(YX)=xp(x)H(YX=x)=xp(x)yp(yx)log2p(yx)=xyp(x,y)log2p(yx)=x,yp(x,y)log2p(yx)
交叉熵: Cross entropy = H ( P , Q ) = − ∑ i P ( x i ) l o g 2 Q ( x i ) \text{Cross entropy} = H(P,Q) = -\sum_iP(x_i)log_2Q(x_i) Cross entropy=H(P,Q)=iP(xi)log2Q(xi)

他们的用处是不同的,对于条件熵来说,主要是用在决策数的信息增益中,用来判断某个信息对样本集合的划分效果的影响力(好坏),当然对于连续变量,条件熵的公式不变,但变量的取值会变,如下:

在这里插入图片描述

而交叉熵则更多的用在KL散度上(据我所知😆),本次就会用到。

KL散度推导

KL散度的理论意义在于度量两个概率分布之间的差异程度,当KL散度越大的时候,说明两者的差异程度越大;而当KL散度小的时候,则说明两者的差异程度小;如果两者相同的话,则该KL散度应该为0。

公式定义为:
K L ( P ∣ ∣ Q ) = ∫ p ( x ) l o g p ( x ) q ( x ) d x KL(P||Q) = \int p(x)log\frac{p(x)}{q(x)}dx KL(P∣∣Q)=p(x)logq(x)p(x)dx

证明KL散度大于等于0:

将KL散度写成离散的形式为: K L ( P ∣ ∣ Q ) = ∑ p ( x ) l o g p ( x ) q ( x ) = − ∑ p ( x ) l o g q ( x ) p ( x ) KL(P||Q) = \sum p(x)log\frac{p(x)}{q(x)} = -\sum p(x)log\frac{q(x)}{p(x)} KL(P∣∣Q)=p(x)logq(x)p(x)=p(x)logp(x)q(x)

因为: l n ( x ) < x − 1 ln(x)<x-1 ln(x)<x1

所以:令 q ( x ) p ( x ) = x \frac{q(x)}{p(x)} = x p(x)q(x)=x
∑ p ( x ) l o g q ( x ) p ( x ) < ∑ p ( x ) ( q ( x ) p ( x ) − 1 ) ∑ p ( x ) l o g q ( x ) p ( x ) < ∑ ( q ( x ) − p ( x ) ) ∑ p ( x ) l o g q ( x ) p ( x ) < ∑ ( q ( x ) − ∑ p ( x ) ∑ p ( x ) l o g q ( x ) p ( x ) < 0 ( 概率的和为1 ) \begin{align*} \sum p(x)log\frac{q(x)}{p(x)} &< \sum p(x) \left(\frac{q(x)}{p(x)} - 1\right)\\ \sum p(x)log\frac{q(x)}{p(x)} &<\sum \left(q(x) - p(x)\right)\\ \sum p(x)log\frac{q(x)}{p(x)} &<\sum (q(x) - \sum p(x)\\ \sum p(x)log\frac{q(x)}{p(x)} &<0(\text{概率的和为1})\\ \end{align*} p(x)logp(x)q(x)p(x)logp(x)q(x)p(x)logp(x)q(x)p(x)logp(x)q(x)<p(x)(p(x)q(x)1)<(q(x)p(x))<(q(x)p(x)<0(概率的和为1)
所以:
K L ( P ∣ ∣ Q ) = ∑ p ( x ) l o g p ( x ) q ( x ) = − ∑ p ( x ) l o g q ( x ) p ( x ) > 0 KL(P||Q) = \sum p(x)log\frac{p(x)}{q(x)} = -\sum p(x)log\frac{q(x)}{p(x)} > 0 KL(P∣∣Q)=p(x)logq(x)p(x)=p(x)logp(x)q(x)>0
l o g p ( x ) q ( x ) log\frac{p(x)}{q(x)} logq(x)p(x)进行分解,可以转换为:
K L ( P ∣ ∣ Q ) = ∑ p ( x ) l o g p ( x ) q ( x ) = ∑ p ( x ) l o g p ( x ) − ∑ p ( x ) l o g q ( x ) = H ( P , Q ) − H ( P ) \begin{align*} KL(P||Q) &= \sum p(x)log\frac{p(x)}{q(x)}\\ &=\sum p(x)log p(x) - \sum p(x)log q(x)\\ &=H(P,Q) - H(P) \end{align*} KL(P∣∣Q)=p(x)logq(x)p(x)=p(x)logp(x)p(x)logq(x)=H(P,Q)H(P)

问题来了, K L ( P ∣ ∣ Q ) ≥ 0 KL(P||Q)\geq 0 KL(P∣∣Q)0,那 K L ( Q ∣ ∣ P ) KL(Q||P) KL(Q∣∣P)是否大于等于0?

答案是大于等于0,这是因为KL散度只是衡量数据之间的差异

例如:

  • K L ( P ∣ ∣ Q ) KL(P||Q) KL(P∣∣Q)衡量 Q 相对于 P 的差异

  • K L ( Q ∣ ∣ P ) KL(Q||P) KL(Q∣∣P)衡量 P 相对于 Q 的差异

设 $ P = {0.9, 0.1} , , Q = {0.8, 0.2} $

计算可得:
KL ( P ∣ ∣ Q ) = 0.9 ln ⁡ 0.9 0.8 + 0.1 ln ⁡ 0.1 0.2 ≈ 0.011 + 0.069 = 0.08 \text{KL}(P||Q) = 0.9 \ln \frac{0.9}{0.8} + 0.1 \ln \frac{0.1}{0.2} \approx 0.011 + 0.069 = 0.08 KL(P∣∣Q)=0.9ln0.80.9+0.1ln0.20.10.011+0.069=0.08
KL ( Q ∣ ∣ P ) = 0.8 ln ⁡ 0.8 0.9 + 0.2 ln ⁡ 0.2 0.1 ≈ − 0.094 + 0.139 = 0.045 \text{KL}(Q||P) = 0.8 \ln \frac{0.8}{0.9} + 0.2 \ln \frac{0.2}{0.1} \approx -0.094 + 0.139 = 0.045 KL(Q∣∣P)=0.8ln0.90.8+0.2ln0.10.20.094+0.139=0.045

可见二者结果不同,体现 KL 散度的不对称特性。

总结

KL散度是非负的,也是不对称的。

机器学习中KL散度常用于:

  • 生成模型(如 VAE)中衡量生成分布与真实分布的差异;
  • 优化问题中引导分布逼近目标分布(如强化学习的策略更新)。

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

相关文章

Python第六章07:元组的定义和操作

# tuple元组的定义和操作# tuple元组定义用小括号&#xff1a;(1,2,3,4,5),可以是不同类型元素 # 给变量定义元组时&#xff0c;写括号不写tuple&#xff1a; a (1,2,3,4,5) # 变量 &#xff08;&#xff09; 变量 tuple&#xff08;&#xff09; 空元组变量 # tuple…

《双指针算法指南:LeetCode 经典题解(C++实现)》

《双指针算法指南&#xff1a;LeetCode 经典题解&#xff08;C实现&#xff09;》 —— 从快慢指针到对撞指针&#xff0c;刷题效率提升 200%&#xff01; 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a; ⼀般⽤于顺…

31天Python入门——第5天:循环那些事儿

你好&#xff0c;我是安然无虞。 文章目录 1. while循环1.1 while循环的嵌套1.2 补充学习:print函数 2. for循环2.1 range函数2.2 for循环2.3 continue和break以及return2.4 for循环的嵌套 3. 补充学习3.1 enumerate函数3.2 zip函数3.3 不要在遍历列表的过程中删除元素 循环 是…

Linux信号的诞生与归宿:内核如何管理信号的生成、阻塞和递达?

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 一、认识信号 二、信号的产生 1.键盘输入 2.系统调用 3.系统指令 4.硬件异常 5.软件条件 三、信号的保存 1.block 2.pending 3.handler 四、信号…

【解析 ECharts 图表样式继承与自定义】

解析 ECharts 图表样式继承与自定义 本文将详细介绍 ECharts 的样式继承机制&#xff0c;从其原理、演进到实际应用场景&#xff0c;并结合实际开发经验分享一些实战技巧&#xff0c;帮助开发者在构建数据可视化页面时实现更统一、灵活的样式管理与高效开发。 一、背景与来龙…

QT Quick(C++)跨平台应用程序项目实战教程 1 — 教程简介

引言 在当今的软件开发领域&#xff0c;跨平台应用程序的需求日益增长。开发者们希望能够编写一次代码&#xff0c;然后在多个平台上运行&#xff0c;如Windows、macOS、Linux、Android和iOS。Qt作为一个强大的跨平台C框架&#xff0c;提供了丰富的工具和库&#xff0c;使得开…

C++程序从windows移植到linux后cmake脚本CMakeLists.txt的修改

因为项目需要&#xff0c;原运行在windows下的一个c程序&#xff0c;要移植到linux&#xff08;ubuntu&#xff09;去。该c程序在windows下&#xff0c;IDE是visual studio 2022&#xff0c;使用cmake作为构建工具。移植到ubuntu后&#xff0c;IDE是vscode&#xff0c;仍然使用…

C++ 语法之数组指针

一维数组&#xff1a; 如果我们定义了一个一维数组&#xff0c;那么这个数组名&#xff0c;就是指向第一个数组元素的地址&#xff0c;也即&#xff0c;是整个数组分配的内存空间的首地址。 比如 int a[3]; 定义了一个包含三个元素的数组。因为一个int占4个字节&#xff0c;那…