Loading [MathJax]/extensions/TeX/AMSmath.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >揭示相对熵和交叉熵的本质

揭示相对熵和交叉熵的本质

作者头像
老齐
发布于 2022-01-27 06:34:25
发布于 2022-01-27 06:34:25
1.1K00
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

说明:本文是《机器学习数学基础》一书选登,关于该书的详细内容,请访问:http://math.itdiffer.com

7.4 相对熵和交叉熵

在第4章4.4.3节介绍损失函数的时候,列出了几项常见的损失函数,其中就有神经网络中常用的以相对熵和交叉熵构建的损失函数。那么什么是相对熵和交叉熵呢?下面就分别进行介绍。

设某离散型随机变量有两个概率分布 PQ ,它们之间的相对熵(relative entropy)定义为:

DKL(PQ)=xXP(x)log(P(x)Q(x))(7.4.1)

在信息论中,通常会按照7.3节(7.3.2)式的约定,写作:

DKL(pq)=xXp(x)log(p(x)q(x))(7.4.2)

在上述定义中约定:0log(00)=00log(0Q(x))=0P(x)log(P(x)0)= (基于连续性),即若存在 xX

使得 P(x)>0,Q(x)=0 ,有 D(PQ)=

由于相对熵最早是由Solomon Kullback和Richard Leibler在1951年提出的,所以相对熵也称为KL散度(Kullback–Leibler divergence)——这就是符号 DKL(P||Q) 下角标的来源。“divergence”翻译为“散度”,它也反应出了(7.4.2)式所定义的相对熵的作用:度量两个概率分布的差异(“分散程度”),或者说两个分布之间的距离,但是,此处的“距离”和两个向量的距离不同,因为一般情况下 DKL(Q||Q)DKL(Q||P) ,即相对熵具有不对称性。

下面选用Kullback在《Information Theory and Statistics》中的一个示例,说明相对熵的应用和意义。设分布 P 是二项分布(n=2,p=0.4 ),分布 Q 是均匀分布。如果随机变量的取值分别为 ,即 ,在分类问题中,表示三个不同的类别。如表7-2-3所示,记录了每个类别对应的输出概率。

表7-2-3

x

0

1

2

P(x)

9/25

12/25

4/25

Q(x)

1/3

1/3

1/3

利用表7-2-3的概率分布,计算相对熵 的值(Kullback在书中使用的是自然对数,这里稍作修改,依然是以 为底,最终所得结果单位是比特)。

以上计算结果证实了相对熵的不对称性。用手工计算方法了解了基本原理之后,也要知晓用程序计算相对熵的方法,依然使用scipy库提供的entropy()函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from scipy.stats import entropy

p = [9/25, 12/25, 4/25]
q = [1/3, 1/3, 1/3]

d_pq = entropy(p, q, base=2)
d_qp = entropy(q, p, base=2)

print(f"D(P||Q)={d_pq:.4f}")
print(f"D(Q||P)={d_qp:.4f}")

# 输出
D(P||Q)=0.1231
D(Q||P)=0.1406

在相对熵的定义(7.4.1)式,两个分布 是针对同一个随机变量而言,这点特别要注意,不是两个随机变量的概率分布。对此,可以借用机器学习的模型训练过程理解。

在机器学习中,训练集的样本,并非是总体,可以认为是从总体中按照随机的原则独立抽样得到的(即独立同分布,independent and identically distributed,简称:i.i.d),那么训练集样本的概率分布与总体的概率分布就可以近似 ——总体的概率分布才是真实的,但我们通常不知道它(只有上帝知道)。将训练集数据用于模型,从而估计出模型参数,即得到了一种概率分布,记作 。然后使用 进行预测,得到预测值。

这样对同一个训练集样本,就有了两个概率分布 。前面已经论述了 ,如果将(7.4.1)式中的分布 视为 ,代表数据集的真实分布; 视为 ,称为假设分布或模型分布。就可以用相对熵度量它们之间的差异,从而评估模型的优劣。所以在第4章4.4.3节中给出了一个KL散度损失函数。

由(7.4.1)式可得:

(7.4.3)式的结果中, 表示模型分布的信息, 表示真实分布的信息,二者之差可以理解为用模型预测损失的信息,令 ,则:

这说明相对熵是按概率 损失的信息的期望(在(7.4.4)中使用了数学期望的性质(E5):

。同样,也可以将相对熵的定义(7.4.1)式写成:

其含义为按概率 的对数商的期望。不论是(7.4.4)式,还是(7.4.5)式,都说明相对熵是一种数学期望,能够用它度量当真实分布 、模型分布为 时的无效性。按照(7.4.4)式,我们期望损失更少的信息——该式表达的就是期望,即无效性更小,则相对熵越小。当相对熵为 时, ,并且可以证明 (详细证明请参阅本书在线资料)。

在(7.4.3)式基础上,还可以得到:

(7.4.6)式中等号右边第一项 即为分布 的熵的负数,根据7.2节的(7.2.3)式 ,得 ;第二项与熵类似,但对数的计算对象是另外一个分布函数,我们将它定义为交叉熵(cross entropy):

于是(7.4.6)式可以写成:

不要忘记,我们所假设的真实分布 ,又因为训练集样本已知,它熵 即不再变化。于是,由(7.4.8)式知,可以用交叉熵 判断相对熵 的情况——比较(7.4.1)式和(7.4.4)式,交叉熵的形式更简单。例如,有一个能够识别四种图片的模型——称为“四类别分类器”,能够识别“狗、猫、马、牛”,假设输入了一张图,经过分类器之后输出了预测值,如图7-4-1所示。

图 7-4-1

根据图中的预测值 和真实值 ,利用(7.2.18)式,可以计算交叉熵:

假设对分类器进行了优化,输出的预测值变为 ,此时交叉熵为: 显然 ,根据(7.4.5),则得到 ,即优化之后的分类器预测效果更好——通过上述假设的输出数据,凭直觉也能判断分类器的好坏。由此可以想到,正如第4章4.4.3节所列举的,可以用交叉熵作为损失函数,令其最小化,亦即相对熵最小化。

我们先探讨一种简单而常见的分类器——二分类的分类器(binary classification),用符号 表示分类器中待定的参数,预测值 ,相应地真实值标签 。训练集样本相对总体符合 i.i.d 要求, ,为输入数据; 为模型中真实参数 ; 中的

取值为 对应的预测值简写成

由于二分类器的输出结果服从伯努利分布即

对照(7.4.7)式,可得其交叉熵:

将(7.4.9)式视为预测值与真实值之间的损失函数,设训练集中的样本数量为 ,由此交叉熵损失函数可构建代价函数(参阅第4章4.4.3节):

如果对(7.4.10)式求最小值,即可估计待定参数 的值,从而确定模型的具体形式。

二分类的交叉熵的交叉熵为损失函数,常用于Logistic回归和神经网络,在第4章4.4.3节中,曾使用Pytorch提供的函数实现了交叉熵损失函数,下面的程序演示中用的是scikit-learn库的log_loss()函数,对模型的预测值和真实进行差异评估。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss
import numpy as np

x = np.array([-2.2, -1.4, -.8, .2, .4, .8, 1.2, 2.2, 2.9, 4.6])
y = np.array([0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])

logr = LogisticRegression(solver='lbfgs')
logr.fit(x.reshape(-1, 1), y)

y_pred = logr.predict_proba(x.reshape(-1, 1))[:, 1].ravel()
loss = log_loss(y, y_pred)

print('x = {}'.format(x))
print('y = {}'.format(y))
print('Q(y) = {}'.format(np.round(y_pred, 2)))
print('Cross Entropy = {:.4f}'.format(loss))

# 输出
x = [-2.2 -1.4 -0.8  0.2  0.4  0.8  1.2  2.2  2.9  4.6]
y = [0. 0. 1. 0. 1. 1. 1. 1. 1. 1.]
Q(y) = [0.19 0.33 0.47 0.7  0.74 0.81 0.86 0.94 0.97 0.99]
Cross Entropy = 0.3329

用交叉熵作为损失函数,不仅仅适用于二分类,对多分类问题也适用(如第4章4.4.3节多分类交叉熵损失函数的示例)。

在交叉熵损失函数中,出现了对数运算。在第6章6.2.1节关于最大似然估计的计算中,也出现了对数运算。那么,这个两个有什么关系吗?先说结论:最小化交叉熵与最大似然估计等价。下面就证明此结论,不过由于是纯粹数学推导,读者可以略过,只知道此结论即可。

按照最大似然估计,设估计所得参数为 (其他符号假设同前),则:

对于有 个样本的训练集,根据大数定理, ,所以,以上计算结果等价于:

由此可知,最大似然估计,即最小化相对熵,也就是最小化交叉熵。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
uboot各种目录下的文件作用
uboot下载地址:http://ftp.denx.de/pub/u-boot/ 1、目录分布 2、目录结构变化: u-boot-2010.03及以前版本 ├── api               
233333
2018/03/07
2.3K0
uboot各种目录下的文件作用
海思uboot启动流程详细分析(二)
从start_armboot开始,在startup.c中有包含#include <config.h>
233333
2019/05/25
2.7K1
海思uboot启动流程详细分析
介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_init_r所代表的、board有关初始化过程。该过程将持续u-boot的整个生命周期,直到main_loop(即传说中的命令行)。
233333
2019/05/25
4.2K0
Uboot 大全 | uboot 启动流程(一)
atf基本启动流程为:BL1 – BL2 – BL31 – BL32 – BL33(uboot),即在bl32启动完成后再启动uboot,uboot作为启动链中作为最后一级镜像,用于启动最终的os。Atf是arm为了增强系统安全性引入,只支持armv7和armv8架构的可信固件。而uboot是通用的嵌入式系统引导程序,其可以支持包含arm在内的多种处理器架构,如mips、riscv、powerpc以及x86等,且其历史比atf更加久远。因此默认情况下uboot并不需要与atf共同启动,而其自身就被设计为支持完整的多级启动链,该启动链被设计为最多可包含spl、tpl和uboot三个阶段。接下来我们通过一些典型启动流程,来看下这些阶段的一些组合关系吧。
刘盼
2023/01/05
4.9K1
Uboot 大全 | uboot 启动流程(一)
为U-boot 添加新的board
uboot需要支持众多的硬件,并且具有良好的可扩展性、可移植性和可维护性,因此必须要有一个设计良好的代码架构。代码架构的设计总是与软硬件架构密不可分的,在硬件层面嵌入式系统的核心一般包括以下层次:
刘盼
2023/01/05
1.5K2
为U-boot 添加新的board
S3C2440移植uboot之支持NAND启动
  参考之前uboot使用的start.S, init.c来修改uboot代码新的uboot链接地址位于0,且在arm-linux-ld时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)",从而程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K).   所以接下来修改代码,并取消"-pie"选项.   使用grep “-pie” * -nR找到:
嵌入式与Linux那些事
2021/05/20
7560
S3C2440移植uboot之支持NAND启动
beaglebone ai底层原理分析:spl阶段
在去深入分析一款芯片的使用的时候,往往需要关注其启动的流程与底层初始化的代码。只有掌握了这些信息,做代码优化和裁剪才能游刃有余,在特定的环境下,以最佳的方式去使用好芯片。
bigmagic
2020/11/25
1.2K0
beaglebone ai底层原理分析:spl阶段
S3C2440移植uboot之启动过程概述
  打开uboot.lds,发现链接地址为0,所以新的uboot只能在nor flash运行。运行开始文件为start.o。
嵌入式与Linux那些事
2021/05/20
4850
S3C2440移植uboot之启动过程概述
第1阶段——u-boot分析之make指令(2)
通过make 100ask24x0_config 指令配置好芯片选型后,使用make指令来生成uboot.bin文件 本文学习目标: 对Makefile文件进行基本了解,掌握make指令是怎么实现生
诺谦
2018/01/03
1.1K0
第1阶段——u-boot分析之make指令(2)
S3C2440移植uboot之支持NAND启动「建议收藏」
  上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动。
全栈程序员站长
2022/07/01
5110
S3C2440移植uboot之支持NAND启动「建议收藏」
u-boot关于启动流程
1.1 启动阶段分为3个,bl0,bl1,bl2。下面只是就功能方面对它们做说明,实际设计的时候,也许会对其具体功能做出调整,也就是说,这几个阶段的划分是就功能而言的,不能看得太死。
DS小龙哥
2022/01/07
5550
u-boot关于启动流程
2.移植uboot-添加2440单板,并实现NOR、NAND启动
然后将smdk2440下的smdk2410.c改为smdk2440.c,以及修改更改好的Makefile
诺谦
2019/05/24
5810
赶紧收藏!u-boot代码分析与移植
BootLoader的目标是正确调用内核的执行,由于大部分的BootLoader都依赖于CPU的体系结构。因此大部分的BootLoader都分为两个步骤启动。依赖于CPU体系结构(如设备初始化等)的代码都放在stage1。而stage2一般使用C语言实现,能够实现更加复杂的功能,代码的可移植性也提高。
混说Linux
2022/07/14
7970
赶紧收藏!u-boot代码分析与移植
展讯平台uboot启动流程
start.S代码结构 u-boot的stage1代码通常放在start.S文件中,用汇编语言,主要实现功能如下:
233333
2020/02/12
1.2K0
Uboot 大全 | uboot 启动流程(二)
uboot在初始化完成后会为用户提供一个命令行交互接口,用户可通过该接口执行uboot定义的命令,以用于查看系统状态,设置环境变量和系统参数等。为了方便对硬件和驱动的管理,uboot还引入了类似linux内核的设备树和驱动模型特性。当然,为了增加系统的可配置性、可调试性以及可跟踪性等,它还支持环境变量、log管理、bootstage统计以及简单的ftrace等功能。下面将对这些特性做一简单的介绍。
刘盼
2023/01/05
2.1K0
Uboot 大全 | uboot 启动流程(二)
26000字剖析uboot启动过程
最先执行的是汇编文件start.S,这个文件跟架构有关,例如芯片架构是arm926ejs,那路径就在*arch/arm/cpu/start.S*。
哆哆jarvis
2023/03/24
1.9K0
Android启动流程——1序言、bootloader引导与Linux启动
前面讲解的很多内容都很抽象,所以本次系列决定"接点地气",准备开始讲解大家熟悉的Activity了,为了让我以及大家更好的理解Activity,我决定本系列的课程主要分为4大流程和2大模块。 4大流程如下:
隔壁老李头
2018/08/30
5.4K0
Android启动流程——1序言、bootloader引导与Linux启动
【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795
韩曙亮
2023/03/27
4.6K0
【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
记一次uboot升级过程的两个坑
之前做过一次uboot的升级,当时留下了一些记录,本文摘录其中比较有意思的两个问题。
zqb_all
2020/06/22
1.1K0
linux系统移植的一般过程_内核移植的基本步骤
在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功能完善、可移植性强等诸多优点,非常适合作为嵌入式操作系统。一个最基本的Linux操作系统应该包括:引导程序、内核与根文件系统三部分。
全栈程序员站长
2022/11/08
8K0
linux系统移植的一般过程_内核移植的基本步骤
推荐阅读
相关推荐
uboot各种目录下的文件作用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验