熵(entropy)、KL 散度(Kullback-Leibler (KL) divergence)和交叉熵(cross-entropy)在机器学习的很多地方会用到。比如在决策树模型使用信息增益来选择一个最佳的划分,使得熵下降最大;深度学习模型最后一层使用 softmax 激活函数后,我们也常使用交叉熵来计算两个分布的“距离”。KL散度和交叉熵很像,都可以衡量两个分布之间的差异,相互之间可以转化。

1. 如何量化信息?

  信息论是应用数学的一个分支,主要研究的是对一个信号包含信息的多少进行量化。信息论的基本想法是一个不太可能的事件发生了,要比一个非常可能的事件发生,能提供更多的信息。

  在信息论中,我们认为:

    • 非常可能发生的事件信息量要比较少。在极端情况下,确保能够发生的事件应该没有信息量。
    • 较不可能发生的事件具有更高的信息量。
    • 独立事件应具有增量的信息。例如,投掷的硬币两次正面朝上传递的信息量,应该是投掷一次硬币正面朝上的信息量的两倍。

  为了满足上面 3 个性质,定义了一事件 $\mbox{x} = x$ 的自信息(self-information)为

\begin{equation}
I(x) = -\log P(x) 
\end{equation}

  我们使用 $\text{x}$ 表示随机变量,使用 $x_1, x_2,...,x_i,..., x_N$ 或者 $x$ 表示随机变量 $\text{x}$ 可能的取值。当式(1)中 $\log$ 以 2 为底数时,$I(x)$ 单位是比特(bit)或者香农(shannons);当 $\log$ 以自然常数 $e$ 为底数时,$I(x)$ 单位是奈特(nats)。这两个单位之间可以互相转换,通过比特度量的信息只是通过奈特度量信息的常数倍。(使用对数换底公式转化)

  自信息只能处理单个的输出。我们可以使用香农熵(Shannon entropy)来对整个概率分布中的不确定性总量进行量化:

\begin{equation}
H(\text{x}) = \mathbb{E}_{\text{x} \sim P}[I(x)] = \sum_{i= 1}^{N} P(x_i)I(x_i) = - \sum_{i= 1}^{N} P(x_i)\log P(x_i) 
\end{equation}

式(2)后两个等号是在离散型变量的情况下成立,对于连续型变量,则需要求积分。当 $\text{x}$ 是连续的,香农熵被称为微分熵(differential entropy)。

  在1948年,克劳德·艾尔伍德·香农将热力学的熵,引入到信息论,因此它又被称为香农熵。机器学习(ML)中熵的概念都是由信息论而来,所以在 ML 中能看到的熵都是香农熵,而不会是热力学的熵。

  熵的一些性质:

    • 那些接近确定性的分布(输出几乎可以确定)具有较低的熵。
    • 那些接近均匀分布的概率分布具有较高的熵。

2. KL 散度

  KL 散度全称 Kullback-Leibler (KL) divergence。

  KL 散度可以用来衡量两个分布的差异。

  在概率论与统计中,我们经常会将一个复杂的分布用一个简单的近似分布来代替。KL 散度可以帮助我们测量在选择一个近似分布时丢失的信息量。

  假设原概率分布为 $P(\text{x})$,近似概率分布为 $Q(\text{x})$,则使用 KL 散度衡量这两个分布的差异:

\begin{equation}
D_{KL}(P||Q) = \mathbb{E}_{\text{x} \sim P}[\log \frac{P(x)}{Q(x)}] = \mathbb{E}_{\text{x} \sim P}[\log P(x) - \log Q(x)] 
\end{equation}

  如果 $\text{x}$ 是离散型变量,式(3)还可以写成如下形式:

\begin{equation}
D_{KL}(P||Q) = \sum_{i= 1}^{N} P(x_i) \log\frac{P(x_i)}{Q(x_i)} = \sum_{i= 1}^{N} P(x_i)[\log P(x_i) - \log Q(x_i)]   
\end{equation}

  对于连续型变量,则式(4)不能这么写,需要求积分。如果 $\text{x}$ 是连续型变量,则式(3)中概率分布最好用 $p(\text{x})$和$q(\text{x})$ 代替 $P(\text{x})$和$Q(\text{x})$。习惯上,用小写字母表示连续型变量的概率密度函数(probability density function,PDF),用大写字母表示离散型变量的概率质量函数(probability mass function,PMF)。(PDF和PMF都是用来描述概率分布)

  KL 散度的一些性质:

    • KL 散度是非负的。
    • KL 散度为 0,当且仅当 $P$ 和 $Q$ 在离散型变量的情况下是相同的分布,或者在连续型变量的情况下是“几乎处处”相同的。
    • KL 散度不是真的距离,它不是对称的,即 $ D_{KL}(P||Q) \ne D_{KL}(Q||P)$。

3. 交叉熵

  交叉熵(cross-entropy)和 KL 散度联系很密切。同样地,交叉熵也可以用来衡量两个分布的差异。以离散型变量 $\text{x}$ 为例:

\begin{equation}
H(P, Q) = - \mathbb{E}_{\text{x} \sim P}\log Q(x) = - \sum_{i= 1}^{N} P(x_i) \log Q(x_i) 
\end{equation}

  交叉熵 $H(P, Q) = H(P) +  D_{KL}(P||Q)$。其中 $H(P)$(即 $H(\text{x})$ ,其中 $\text{x} \sim P$)为分布 $P$ 的熵,$D_{KL}(P||Q)$ 表示两个分布的 KL 散度。当概率分布 $P(\text{x})$ 确定了时,$H(P)$ 也将被确定,即 $H(P)$ 是一个常数。在这种情况下,交叉熵和 KL 散度就差一个大小为 $H(P)$ 的常数。下面给出一个简单的推导:

  我们将式(4)中 KL 散度的公式再进行展开:

\begin{equation}\label{equ:tpr}
\begin{split}
D_{KL}(P||Q) &= \sum_{i= 1}^{N} P(x_i)[\log P(x) - \log Q(x)]  \\ &=  \sum_{i= 1}^{N} P(x_i) \log P(x_i)  - \sum_{i= 1}^{N} P(x_i) \log Q(x_i)  \\ &= -[- \sum_{i= 1}^{N} P(x_i) \log P(x_i)]+ [ - \sum_{i= 1}^{N} P(x_i) \log Q(x_i) ] \\ &= - H(P) + H(P, Q)
\end{split}
\end{equation}
即 $H(P, Q) = H(P) +  D_{KL}(P||Q)$。

  交叉熵的一些性质:

    • 非负。
    • 和 KL 散度相同,交叉熵也不具备对称性,即 $H(P, Q) \ne H(Q,P)$。
    • 对同一个分布求交叉熵等于对其求熵。

  为什么既有 KL 散度又有交叉熵?在信息论中,熵的意义是对 $P$ 事件的随机变量编码所需的最小字节数,KL 散度的意义是“额外所需的编码长度”如果我们使用 $Q$ 的编码来表示 $P$,交叉熵指的是当你使用 $Q$ 作为密码来表示 $P$ 是所需要的 “平均的编码长度”。但是在机器学习评价两个分布之间的差异时,由于分布 $P$ 会是给定的,所以此时 KL 散度和交叉熵的作用其实是一样的,而且因为交叉熵少算一项,更加简单,所以选择交叉熵会更好。

References

Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning.

https://www.zhihu.com/question/65288314

Kullback-Leibler Divergence Explained

【机器学习基础】熵、KL散度、交叉熵的更多相关文章

  1. KL散度=交叉熵-熵

    熵:可以表示一个事件A的自信息量,也就是A包含多少信息. KL散度:可以用来表示从事件A的角度来看,事件B有多大不同. 交叉熵:可以用来表示从事件A的角度来看,如何描述事件B. 一种信息论的解释是: ...

  2. 信息论相关概念:熵 交叉熵 KL散度 JS散度

    目录 机器学习基础--信息论相关概念总结以及理解 1. 信息量(熵) 2. KL散度 3. 交叉熵 4. JS散度 机器学习基础--信息论相关概念总结以及理解 摘要: 熵(entropy).KL 散度 ...

  3. 深度学习面试题07:sigmod交叉熵、softmax交叉熵

    目录 sigmod交叉熵 Softmax转换 Softmax交叉熵 参考资料 sigmod交叉熵 Sigmod交叉熵实际就是我们所说的对数损失,它是针对二分类任务的损失函数,在神经网络中,一般输出层只 ...

  4. TensorFlow 实战(一)—— 交叉熵(cross entropy)的定义

    对多分类问题(multi-class),通常使用 cross-entropy 作为 loss function.cross entropy 最早是信息论(information theory)中的概念 ...

  5. 交叉熵理解:softmax_cross_entropy,binary_cross_entropy,sigmoid_cross_entropy简介

    cross entropy 交叉熵的概念网上一大堆了,具体问度娘,这里主要介绍深度学习中,使用交叉熵作为类别分类. 1.二元交叉熵 binary_cross_entropy 我们通常见的交叉熵是二元交 ...

  6. 归一化(softmax)、信息熵、交叉熵

    机器学习中经常遇到这几个概念,用大白话解释一下: 一.归一化 把几个数量级不同的数据,放在一起比较(或者画在一个数轴上),比如:一条河的长度几千甚至上万km,与一个人的高度1.7m,放在一起,人的高度 ...

  7. 第五节,损失函数:MSE和交叉熵

    损失函数用于描述模型预测值与真实值的差距大小,一般有两种比较常见的算法——均值平方差(MSE)和交叉熵. 1.均值平方差(MSE):指参数估计值与参数真实值之差平方的期望值. 在神经网络计算时,预测值 ...

  8. 理解交叉熵(cross_entropy)作为损失函数在神经网络中的作用

    交叉熵的作用 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点: 而即便是R ...

  9. 从香农熵到手推KL散度

    信息论与信息熵是 AI 或机器学习中非常重要的概念,我们经常需要使用它的关键思想来描述概率分布或者量化概率分布之间的相似性.在本文中,我们从最基本的自信息和信息熵到交叉熵讨论了信息论的基础,再由最大似 ...

随机推荐

  1. Android 加载GIF图最佳实践

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/75578109 本文出自[赵彦军的博客] 起因 最近在项目中遇到需要在界面上显示一个 ...

  2. HTML5学习系列之表单与文件

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容.它可以是一篇博客或报刊中的文章.一篇论坛帖子.一段用户评论或独立的插件,或者其他任何独立的内容 ...

  3. 前端打包工具——build release介绍

    前言 对于前端开发者来说,资源打包是日常过程中一个必不可少的过程:目前我们大多数时候使用grunt.gulp.webpack这三个工具来完成这个工作:但是有一个特点就是我们没创建一个项目都要对应的去编 ...

  4. Flask入门之结构重组(瘦身)-第13讲笔记

    1. pip list Flask 0.10.1 Flask-Bootstrap 3.3.5.6 Flask-SQLAlchemy 2 Flask-Script 2.0.5 Flask-WTF 0.1 ...

  5. 利用JavaScriptSerializer转json实用方法

    项目中经常碰到需要输出的是json数据,使用JavaScriptSerializer转换,以前老的方法如下. JavaScriptSerializer jss = new JavaScriptSeri ...

  6. Spring通过构造方法注入的四种方式

    通过构造方法注入,就相当于给构造方法的参数传值 set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选 的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean. Me ...

  7. linux几种时间函数总结

    一.linux时间函数总结 最近的工作中用到的时间函数比较频繁,今天抽时间总结一下,在linux下,常用的获取时间的函数有如下几个:  asctime,  ctime, gmtime, localti ...

  8. jenkins+gitlab自动化编译部署方案探索及服务端编译webpack实战

    一. 背景 之前我们的开发流程为在本地进行webpack打包编译,然后svn提交源代码和编译后的代码.同时每次提交前也会从svn更新源代码和编译后的代码.这样做有几个缺点: 1. svn 更新和提交编 ...

  9. http请求 405错误 方法不被允许 (Method not allowed)

    由于自己疏忽,导致请求错误405,然后前端数据传输没错,百度大都说跟post提交方式有关,改成get还是报错,检查才知道,controller中忘记写@requestMapping("/XX ...

  10. 开源RPC(gRPC/Thrift)框架性能评测

    海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...