熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence)
1.介绍:
当我们开发一个分类模型的时候,我们的目标是把输入映射到预测的概率上,当我们训练模型的时候就不停地调整参数使得我们预测出来的概率和真是的概率更加接近。
这篇文章我们关注在我们的模型假设这些类都是明确区分的,假设我们是开发一个二分类模型,那么对应于一个输入数据,我们将他标记为要么绝对是正,要么绝对是负。比如,我们输入的是一张图片,来判断这张图片是苹果还是梨子。
在训练过程中,我们可能输入了一张图片表示的是苹果,那么对于这张输入图片的真实概率分布为y=(苹果:1,梨子:0),但是我们的模型可能预测出来的是另一种概率分布y`(苹果:0.4,梨子:0.6),然后我们发现了在这张输入图片上的真实概率分布和预测出来的概率分布差别很大,所以我们要调整参数,来使得这两个分布更加接近。
但是我们怎么定义这个接近呢?也就是我们如何去衡量y,y`的接近程度?
在这里我们介绍一下一种衡量方式交叉熵(Cross-Entropy),然后说明一下为什么这种方式适用于分类问题。
2.熵(Entropy):
熵的概念来自物理中的热力学,表示热力学系统中的无序程度,我们说的熵是信息论中的熵,表示对不确定性的测量,熵越高,能传输的信息越多,熵越少,传输的信息越少。举个例子说,当你站在一条公路旁边,看着车流来来往往,然后,你想告诉你的朋友每个车型号,但是只有一个二进制的信道,仅仅可以传输0,1序列,然后这个通讯相当的昂贵,十元1bit。你需要很多个二进制序列来表示每一个车型号。那么你该怎么来编码这些车的型号呢?会使用相同长度的bit来表示丰田Camry和奥迪Q7么? 当然不会了,因为你知道丰田Camry比奥迪Q7普遍多了,所以你会用更少的bit来编码丰田。换成数学的角度来看,其实就是我们把这个随便经过一个车,把这个车是丰田Camry还是奥迪Q7看成随机事件,用随机变量X表示,所以我们在做的就是用X的分布来减少我们发送的bit的平均长度。
也就是我们现在有了观测到的概率分布y,y_i = P(X=x_i)。我们要使用平均最小的bit,所以我们应该为x_i 分配log(1/y_i) 个比特。对所有的x_i 我们都有一个对应的最小需要分配的bit长度,那么我们对这个log(1/y_i)求期望也就得到了X的熵的定义了:


3.交叉熵(Cross-Entropy):
假如说我们用这个分布来作为我们来对事件编码的一个工具,熵就衡量了我们用这个正确的分布y来对事件编码所能用的最小的bit 长度,我们不能用更短的bit来编码这些事件或者符号了。
相对的,交叉熵是我们要对y这个分布去编码,但是我们用了一些模型估计分布y`。这里的话通过y`这个分布我们得到的关于x_i的最小编码长度就变成了log(1/y`_i),但是呢,我们的期望仍是关于真是分布y的。所以交叉熵的定义就变成了:

交叉熵是大于等于熵的,因为我们使用了错误的分布y`会带来更多的bit使用。当y和y`相等的时候,交叉熵就等于熵了。
4.KL 松散度(KL Divergence):
KL松散度和交叉熵的区别比较小,KL松散度又叫做相对熵,从定义很好看出区别:

这个意思就是说我们要编码一个服从y分布的随机变量,假设我们使用了一些数据估计出来这个随机变量的分布是y`,那么我们需要用比真实的最小bit多多少来编码这个随机变量。这个值是大于等于0的,并且当,y和y`相等的时候才为0。注意这里对交叉熵求最小和对KL松散度求最小是一样的。也就是我们要调整参数使得交叉熵和熵更接近,KL松散度越接近0,也就是y`越接近y。
5.预测:
通过上面的描述和介绍,我们应该很高兴使用交叉熵来比较两个分布y,y`之间的不同,然后我们可以用所有训练数据的交叉熵的和来作为我们的损失,假如用n来表示我们训练数据的数量,则损失loss为:

来对这个函数求最小值我们就可以求到最好的参数来使得y和y`最接近。
6.似然(Likelihood):
我们来看看另一种关于两个分布之间差异的测量标准–似然,这种标准更加直接,似然越大说明两个分布越接近,在分类问题中,我们会选择那些多数时候预测对了的模型。因为我们总是假设所有的数据点都是独立同分布的,对于所有数据的似然就可以定义为所有单个数据点的似然的乘积:

对于第n个数据他的似然怎么算呢?其实很简单,就是简单的y*y,来看一下我们最初的那个例子y={苹果:1,梨子:0},y`={苹果:0.4,梨子:0.6},所以似然就等于:

所以这里我们是不是可以考虑一下使用极大似然估计法来求最优参数呢?也就是求似然函数的极大值点。我们来对这个似然函数动一点点手脚。
我们知道对数函数使连续单调函数,我们要求似然函数的极大值等同于我们要求对数似然函数的极大值,然后我们取一个负,就等同于求负对数似然函数的极小值:

这样,我们就可以把似然函数中的累积连乘变成累加了。而且我们知道我们的观测结果y中两个元素必有一个元素是1,另一个元素是0.则对数似然函数为:

然后我们看看所有的数据的负对数似然:

看着有没有一点眼熟?这就是我们上面的所有数据的交叉熵:

7.总结:
当我们做一个分类模型的时候,我们需要一种方法去衡量真实概率分布y和预测概率分布y`之间的差异,然后在训练过程中调整参数来减小这个差异。在这篇文章中我们可以看到交叉熵是一种不错的可行的选择,通过上面的这些等式可以看到,我们求交叉熵的极小值也就等同于我们求负对数似然的极小值。
熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence)的更多相关文章
- [转]熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence)
https://www.cnblogs.com/silent-stranger/p/7987708.html 1.介绍: 当我们开发一个分类模型的时候,我们的目标是把输入映射到预测的概率上,当我们训练 ...
- 熵、交叉熵、相对熵(KL 散度)意义及其关系
熵:H(p)=−∑xp(x)logp(x) 交叉熵:H(p,q)=−∑xp(x)logq(x) 相对熵:KL(p∥q)=−∑xp(x)logq(x)p(x) 相对熵(relative entropy) ...
- 最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络
最近在看深度学习的"花书" (也就是Ian Goodfellow那本了),第五章机器学习基础部分的解释很精华,对比PRML少了很多复杂的推理,比较适合闲暇的时候翻开看看.今天准备写 ...
- 深度学习中交叉熵和KL散度和最大似然估计之间的关系
机器学习的面试题中经常会被问到交叉熵(cross entropy)和最大似然估计(MLE)或者KL散度有什么关系,查了一些资料发现优化这3个东西其实是等价的. 熵和交叉熵 提到交叉熵就需要了解下信息论 ...
- [ch03-02] 交叉熵损失函数
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 3.2 交叉熵损失函数 交叉熵(Cross Entrop ...
- 交叉熵理解:softmax_cross_entropy,binary_cross_entropy,sigmoid_cross_entropy简介
cross entropy 交叉熵的概念网上一大堆了,具体问度娘,这里主要介绍深度学习中,使用交叉熵作为类别分类. 1.二元交叉熵 binary_cross_entropy 我们通常见的交叉熵是二元交 ...
- 『TensorFlow』分类问题与两种交叉熵
关于categorical cross entropy 和 binary cross entropy的比较,差异一般体现在不同的分类(二分类.多分类等)任务目标,可以参考文章keras中两种交叉熵损失 ...
- 【转】TensorFlow四种Cross Entropy算法实现和应用
http://www.jianshu.com/p/75f7e60dae95 作者:陈迪豪 来源:CSDNhttp://dataunion.org/26447.html 交叉熵介绍 交叉熵(Cross ...
- 交叉熵(Cross-Entropy) [转载]
交叉熵(Cross-Entropy) 交叉熵是一个在ML领域经常会被提到的名词.在这篇文章里将对这个概念进行详细的分析. 1.什么是信息量? 假设X是一个离散型随机变量,其取值集合为X,概率分布函数为 ...
随机推荐
- [poj1644]放苹果
题目链接:http://poj.org/problem?id=1664 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5, ...
- 【JAVA零基础入门系列】Day10 Java中的数组
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...
- BootStrap Table和Mybatis Plus实现服务端分页
一.后台java代码(Mybatis Plus分页) (1)Mybatis Plus分页的配置,在mybatis的xml文件中增加如下配置(Mybatis Plus官方文档:http://baomid ...
- JavaAPI 中 <E> 与 <T> 的含义
今天看集合的代码,发现在泛型的使用时的区别,Collection<E>.List<E>,而Iterator<T>,那么<E>和<T>含义有什 ...
- python 使用标准库根据进程名获取进程的pid
有时候需要获取进程的pid,但又无法使用第三方库的时候. 方法适用linux平台. 方法1 使用subprocess 的check_output函数执行pidof命令 from subprocess ...
- 【JavaEE】企业面试问题-Java基础
1. Java基础部分 1.1 Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意思? 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的 ...
- $.grep()函数
定义和用法 $.grep() 函数使用指定的函数过滤数组中的元素,并返回过滤后的数组. 提示:源数组不会受到影响,过滤结果只反映在返回的结果数组中. 语法 $.grep( array, functio ...
- 转 html5离线储存,application cache,manifest使用体验
html5离线应用application cache 最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块做成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求 ...
- Problem H: STL——括号匹配
Description 给出一堆括号,看其是否匹配,例如 ().()().(()) 这样的括号就匹配, )(.)()) 而这样的括号就不匹配 Input 每一行代表一组测试样例,每组测试样 ...
- 数据库Oracle
一. 表空间和数据文件的关系: 文件组成:数据文件,控制文件,数据库日志文件 数据文件:.dbf 包含全部数据库数据(表,索引等),一个数据文件仅与一个数据库关联.一旦建立,只增不减. 表空间(Tab ...