kl散度学习笔记python实现

2023-10-31

 

KL Divergence
KL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Relative Entropy),用于衡量一个分布相对于另一个分布的差异性,注意,这个指标不能用作距离衡量,因为该指标不具有对称性,即两个分布PP和QQ,DKL(P|Q)DKL(P|Q)与DKL(Q|P)DKL(Q|P)计算的值一般不相等,若用作距离度量,一般需要对公式加以修改,后文讲到。
KL Divergence的计算公式为
对于离散分布
DKL(P|Q)=∑iP(i)logP(i)Q(i)
DKL(P|Q)=∑iP(i)log⁡P(i)Q(i)

对于连续分布
DKL(P|Q)=∫∞−∞p(x)logp(x)q(x)dx
DKL(P|Q)=∫−∞∞p(x)log⁡p(x)q(x)dx
程序
利用python 3计算:

import numpy as np
import scipy.stats

# 随机生成两个离散型分布
x = [np.random.randint(1, 11) for i in range(10)]
print(x)
print(np.sum(x))
px = x / np.sum(x)
print(px)
y = [np.random.randint(1, 11) for i in range(10)]
print(y)
print(np.sum(y))
py = y / np.sum(y)
print(py)

# 利用scipy API进行计算
# scipy计算函数可以处理非归一化情况,因此这里使用
# scipy.stats.entropy(x, y)或scipy.stats.entropy(px, py)均可
KL = scipy.stats.entropy(x, y)
print(KL)

# 编程实现
KL = 0.0
for i in range(10):
    KL += px[i] * np.log(px[i] / py[i])
# print(str(px[i]) + ' ' + str(py[i]) + ' ' + str(px[i] * np.log(px[i] / py[i])))

print(KL)

 

论文《Detecting Regions of Maximal Divergence for Spatio-Temporal Anomaly Detection》时,文中提到了这三种方法来比较时间序列中不同区域概率分布的差异。

 

KL散度、JS散度和交叉熵

三者都是用来衡量两个概率分布之间的差异性的指标。不同之处在于它们的数学表达。

对于概率分布P(x)和Q(x)

1)KL散度(Kullback–Leibler divergence)

又称KL距离,相对熵。

当P(x)和Q(x)的相似度越高,KL散度越小。

KL散度主要有两个性质:

(1)不对称性

尽管KL散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有对称性,即D(P||Q)!=D(Q||P)。

(2)非负性

相对熵的值是非负值,即D(P||Q)>0。

 

2)JS散度(Jensen-Shannon divergence)

JS散度也称JS距离,是KL散度的一种变形。

但是不同于KL主要又两方面:

(1)值域范围

JS散度的值域范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更确切了。

(2)对称性

即 JS(P||Q)=JS(Q||P),从数学表达式中就可以看出。

3)交叉熵(Cross Entropy)

在神经网络中,交叉熵可以作为损失函数,因为它可以衡量P和Q的相似性。

交叉熵和相对熵的关系:

以上都是基于离散分布的概率,如果是连续的数据,则需要对数据进行Probability Density Estimate来确定数据的概率分布,就不是求和而是通过求积分的形式进行计算了。
 

个人理解:

1、KL散度本质是用来衡量两个概率分布的差异一种数学计算方式;由于用到比值除法不具备对称性;

2、神经网络训练时为何不用KL散度,从数学上来讲,它们的差异在于KL散度多减了一个 H(P);P代表真实分布,Q代表估计的分布

从损失函数角度来看,在训练样本固定的情况下,H(P)是个常数,对梯度更新没有价值;所以两者的最优解是一样的;

KL散度的含义和性质:

  在概率论或信息论中,KL散度( Kullback–Leibler divergence),又称相对熵(relative entropy),是描述两个概率分布P和Q差异的一种方法。它是非对称的,这意味着D(P||Q) ≠ D(Q||P)。特别的,在信息论中,D(P||Q)表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布。有人将KL散度称为KL距离,但事实上,KL散度并不满足距离的概念,应为:1)KL散度不是对称的;2)KL散度不满足三角不等式。对一个离散随机变量或连续的随机变量的两个概率分布P和Q来说,KL散度的定义分别如下所示。

     KL散度在信息论中有自己明确的物理意义,它是用来度量使用基于Q分布的编码来编码来自P分布的样本平均所需的额外的Bit个数。而其在机器学习领域的物理意义则是用来度量两个函数的相似程度或者相近程度,在泛函分析中也被频繁地用到[2]。在香农信息论中,用基于P的编码去编码来自P的样本,其最优编码平均所需要的比特个数(即这个字符集的熵)为:

用基于P的编码去编码来自Q的样本,则所需要的比特个数变为:

于是,我们即可得出P与Q的KL散度

可以利用Jensen不等式证明P与Q之间的KL散度不小于0:

 

参考资料:[1] KL散度的解释,https://baike.so.com/doc/4949446-5170752.html.

                 [2] KL散度与Jensen不等式的理解,https://zhuanlan.zhihu.com/p/28249050.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kl散度学习笔记python实现 的相关文章

  • 【深度学习基础】

    最终效果如上图所示 xff1a 真不知道这一路有多艰难 众所周知CHATGPT 可以做表格和 公式 xff0c 但它输出的文本是直接渲染好的 你是直接复制不了的 xff0c 你只能复制它出来的字体 于是我尝试了各种 想让它输出表格和文字的方
  • 深度学习基础

    深度学习介绍 深度学习与机器学习的区别 xff1a 机器学习的特征工程步骤是要靠手动完成的 xff0c 而且需要大量的领域专业知识 深度学习不需要更多的特征处理 只需要进行图片的输入 xff0c 进入神经网络后 xff0c 输出结果 深度学
  • 深度学习入门资料整理

    深度学习基础总结 无一句废话 附完整思维导图 深度学习如何入门 知乎 深度学习入门基础讲义 shuzfan的博客 CSDN博客 深度学习入门 神经网络15分钟入门 足够通俗易懂了吧 知乎 深度学习基础知识点梳理 知乎
  • vscode中mmgeneration的分布式训练的调试文件设置

    受知乎博主的启发 没弄软连接 直接把launch py的路径放到了program参数中了 还需要把train py中的参数设置为默认值 launch json文件的代码 使用 IntelliSense 了解相关属性 悬停以查看现有属性的描述
  • 深度学习——深度生成模型(GAN,VAE)

    深度学习与PyTorch入门 对抗生成网络GAN理论讲解及项目实战 哔哩哔哩 bilibili 背景 生成模型 从某个分布中获取输入训练样本 并学习表示该分布的模型 作用 产生真实数据 艺术创作 超分辨率图片 2 帮助我们发现数据集中的隐变
  • 深度学习基础--池化--空间金字塔池化(spatial pyramid pooling,SPP)

    空间金字塔池化 spatial pyramid pooling SPP 解决的问题 先前方法 输入图片会经过裁切 Crop 或者变形缩放 Warp 这都在一定程度上导致图片信息的丢失和变形 限制了识别精确度 SPP可以输入任意大小的图片 不
  • kl散度学习笔记python实现

    KL Divergence KL Kullback Leibler Divergence中文译作KL散度 从信息论角度来讲 这个指标就是信息增益 Information Gain 或相对熵 Relative Entropy 用于衡量一个分布
  • 机器学习基础(一)——人工神经网络与简单的感知器

    机器学习基础 一 人工神经网络与简单的感知器 2012 07 04 19 57 20 转载 标签 杂谈 分类 machine learning 从最开始做数据挖掘而接触人工智能的知识开始 就不断听学长 老师说起神经网络算法 从这个角度来讲
  • Expected more than 1 value per channel when training, got input size torch.Size

    Expected more than 1 value per channel when training got input size torch Size 训练的时候 batch size必须大于1 但是预测的时候 batch size可
  • 卷积神经网络的深入理解-归一化篇(Batch Normalization具体实例)

    卷积神经网络的深入理解 归一化篇 标准化 归一化 神经网络中主要用在激活之前 卷积之后 持续补充 归一化在网络中的作用 1 线性归一化 进行线性拉伸 可以增加对比度 2 零均值归一化 像素值 均值 方差 3 Batch Normalizat
  • 【深度学习基础】损失函数

    深度学习基础 性能评估指标 超参数介绍 损失函数 前言 本文主要总结一下常见目标检测的损失函数以及一些基础的函数 主要损失函数为mask rcnn涉及到的损失函数包括 MSE均方误差损失函数 Cross Entropy交叉熵损失函数 目标检
  • 深度学习09 -Transformer2 - 理论篇

    参考文档 详解Transformer 1 开局来一张Transformer的整体结构图 2 结构图每步分析 1 Encoder 1 Input Embedding 就是对输入的数据进行向量化编码 可能是one hot等等 2 Positio
  • 卷积层计算量(FLOPS)和参数量的计算

    1 卷积参数量的计算 若卷积层的输入featuremap的维度为Cin Hin Win 卷积核的大小为K1 K2 padding P1 P2 stride S1 S2 卷积核 filter 的数量为Cout 则输出特征图的大小为Cout H
  • 机器学习(一)——K-近邻(KNN)算法

    机器学习 一 K 近邻 KNN 算法 最近在看 机器学习实战 这本书 因为自己本身很想深入的了解机器学习算法 加之想学python 就在朋友的推荐之下选择了这本书进行学习 一 K 近邻算法 KNN 概述 最简单最初级的分类器是将全部的训练数
  • 深度学习入门基础CNN系列——卷积计算

    卷积计算 卷积是数学分析中的一种积分变换的方法 在图像处理中采用的是卷积的离散形式 这里需要说明的是 在卷积神经网络中 卷积层的实现方式实际上是数学中定义的互相关 cross correlation 运算 与数学分析中的卷积定义有所不同 这
  • 注意力&Transformer

    注意力 注意力分为两步 计算注意力分布 alpha 其实就是 打分函数进行打分 然后softmax进行归一化 根据 alpha 来计算输入信息的加权平均 软注意力 其选择
  • ​语义分割损失函数​

    这里面有几个损失函数 GitHub MichaelFan01 STDC Seg Source Code of our CVPR2021 paper Rethinking BiSeNet For Real time Semantic Segm
  • CNN中特征融合的一些策略

    Introduction 特征融合的方法很多 如果数学化地表示 大体可以分为以下几种 X Y textbf X textbf Y X Y X
  • 懒人式迁移服务器深度学习环境(完全不需要重新下载)

    换服务器了 想迁移原来服务器上的深度学习环境 但又觉得麻烦懒得重新安装一遍anaconda pytorch 有没有办法能不费吹灰之力直接迁移 接下来跟着我一起 懒汉式迁移 本方法适用于在同一内网下的两台服务器之间互相迁移 不在同一局域网下的
  • mmpose 使用笔记

    目录 自己整理的可以跑通的代码 图片demo 检测加关键点 自己整理的可以跑通的代码 最强姿态模型 mmpose 使用实例 CSDN博客 图片demo python demo image demo py tests data coco 00

随机推荐