交叉熵详解-程序员宅基地

技术标签: 深度学习  深度学习基础理论  

原文:https://blog.csdn.net/tsyccnh/article/details/79163834 (有修改)

信息论

交叉熵是信息论中的一个概念

下面将介绍信息量、熵、相对熵(KL散度)、交叉熵这四个概念。

1. 信息量

假设X是一个离散型随机变量,其取值集合为\chi,其概率分布函数p(x)=Pr(X=x)x\in \chi

则定义事件X = x_0信息量为:

I(x_0)=-log(p(x_0))

 图像如下:

横轴:p(x_0); 纵轴:I(x_0)

 

(横轴代表事件发生的概率p(x),范围[0,1],所以上面的信息量与图像只取下图中的粉色段)

事件x发生的概率p(x)越大,其包含的信息量越少

 

2. 熵

计算方法事件所有可能性的信息量的期望

对于某个事件,有n中可能性,每一种可能性对应一个概率p(x_i),这样就可以计算出每一种可能性 x_i的信息量I(x_i)

例如,按下电脑的开机键,会有三种可能(正常开机,无法开机,爆炸),这三种可能性对应的概率和信息量如下表:


通过每个事件的信息量,我们可以计算出这个事件(包含三种可能)的,即所有信息量的期望

公式为:

H(x)=-\sum_{i=1}^n p(x_i)log(p(x_i)),其中n代表某一事件包含的所有可能性,

 

如抛硬币这种只有两种可能,我们称之为0-1分布(二项分布的特例,n=1,即只实验1次),对于这种问题,熵的计算公式可以简化成:

H(x)=-p(x)log(p(x))-(1-p(x))log(p(x))

3. 相对熵(KL散度)

什么是KL散度?

对于同一个随机变量X,有两个单独的概率分布P(X)和Q(X),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异。

KL散度的公式:

KL(P||Q)=\sum_{x\in X}P(x)log(\frac{P(x)}{Q(x)})

KL散度在信息论中的物理意义就是:用基于Q分布的编码来编码来自P分布的样本所需要的额外的Bit个数。

KL散度的直观理解:平均编码长度问题(类似于霍夫曼树找最佳编码长度,出现越频繁的字母(概率高)用较短的编码来表示,这样平均编码长度将会最小)

在香农信息论中,用基于P分布的编码方式(依照P分布中各字符的出现概率决定各字符的编码长度)来编码来自P分布的样本,其所最优编码平均所需要的Bit个数:

H(x) = - \sum_{x\in X} P(x)log(P(x))=\sum_{x\in X}P(x)log(\frac{1}{P(x)})          其中,log(\frac{1}{P(x)})表示对于字符x\in X的编码长度

而如果现在变成用基于Q分布的编码方式来编码来自P分布的样本,其编码平均所需要的Bit数就变为:

H'(x)=\sum_{x\in X}P(x)log(\frac{1}{Q(x)})

如果Q与P是不同的分布,那么用基于Q分布的编码方式来编码来自P分布的样本并不是最优的q,q,其q,其平均q,其平均编码q,其平均编码长度q,其平均编码长度就变大了,所以有:

H(x)\leq H'(x)

如果P和Q分布非常接近(或者通过优化越来越接近),那么基于Q分布的平均编码长度H'(x)就会接近于最优编码长度H(x),因此我们采用KL散度来衡量P和Q两个分布的接近程度:

KL(P||Q)=H'(x) - H(x)

                   =\sum_{x\in X}P(x)log(\frac{1}{Q(x)}) - \sum_{x\in X}P(x)log(\frac{1}{P(x)})
                   =\sum_{x\in X}P(x)log(\frac{P(x)}{Q(x)})

 

在深度学习中对于每个样本,神经网络最终都会output一个多维的vector,代表该样本的类别分布。我们希望对这个样本预测得到的类别分布与该样本的真实类别分布越接近越好,所以可以将KL应用到深度学习中来衡量预测与真实分布的距离。

 

例如,P往往用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。

          Q用来表示模型所预测的分布,比如[0.7,0.2,0.1] 。

目标就是通过学习让Q(X)能够像P(X)一样能够完美的描述样本

 

其中H'(x)代表预测出的样本的类别分布,H(x)代表样本的真实类别分布。

上式中的第二步,由于第二部分就是真实分布的熵,是不变量。所以想要KL减小只需要优化第一项  \sum_{x\in X}P(x)log(\frac{1}{Q(x)}),称为交叉熵

所以在机器学中一般直接用交叉熵做loss,来评估模型。

4. 交叉熵

(KL散度公式中去掉不变的那一项(label:真实类别分布 的熵))

H (P, Q)=-\sum_{x\in X}P(x)log(Q(x))

其中,P(x)是标签,Q(x)是预测的概率分布,由于P(x)一般是one-hot向量,只有一个位置为1,所以交叉熵公式可以简化为:

L=-log(Q(x))

也就是只关注真实类别对应的那一维的神经网络输出值,让它尽可能变大(这样-log值就变小了,loss就减小了),所以有提出soft label的方法,让其他类别对应的神经元也能得到优化。

 

5. 交叉熵损失函数在机器学习中分类问题的应用

1. 回归问题

回归问题中一般使用MSE(Mean Squared Error)作为loss函数,比如: 

loss=\frac{1}{2m}\sum_{i=1}^{m}(y_i -\hat y_i)^2

m为样本数量,loss为m个样本的loss均值,但是这种loss并不适用于概率相关的分类问题

2. 单分类问题

这里的单类别是指,每一张图像样本只能有一个类别,比如只能是狗或只能是猫。标签是one-hot向量

loss=-\sum_{i=1}^my_i log( \hat y_i)

上式为一张样本的loss计算方法。式2.1中n代表着n种类别。 

3. 多类问题(一张图片中包含多种类别的物体)

多分类的标签是n-hot向量,如一张图片里既有青蛙又有老鼠

如下图:

这里的preb不再是通过softmax进行计算,而是采用sigmoid,将每一个神经元节点的输出归一化到[0,1]区间,所有preb的和也不再是1,。所以每个label都是独立分布的,相互之间没有影响。

所以交叉熵在这里是对每一个值进行计算

最终loss是每一个类别loss的合集

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012370185/article/details/94861081

智能推荐

Unity -- animation clip 无法正常播放_clip视频播放不了-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏2次。首先说遇到的问题:animation clip文件 拖拽到某物体的Animation组件上,但是不起作用。一般操作是这样,会造成该问题:1,选中一个物体A(此时不携带Animator和Animation组件),想给他加跳跃动画;2,windows -> animation -> animation 打开animation的窗口;3,在窗口中点击“Create”,创建了一个名字为 “jump_anim”的 clip, 注意,unity同时给物体添加了Animator组件,而非A_clip视频播放不了

黑马程序员-高新技术-交通灯管理-程序员宅基地

文章浏览阅读297次。学习了张孝祥老师的交通灯项目后,就深深的喜欢上了张孝祥老师的讲课风格,他的每句话话中都显露出了他的清晰、完整、丰富、深入的思维,可以推断出他已经把这个题目理解的非常到位了。他的讲课方式很像我的高中老师,就是把一个题目从头到尾的思路一一的都讲出来,不跳跃任何一个思维点,不遗漏任何一个思维点,这才是一个智者的思路。希望黑马程序员的老师们都能像张孝祥老师一样事无巨细的把一个知识点讲透彻,讲的不遗漏。

图像线段检测几种方法_lines1, _, _, _ = lsd1.detect(gray_image1, 2, 2)-程序员宅基地

文章浏览阅读1.1k次。OpenCV-contrib有一个名为FastLineDetector的东西,如果它被用作LSD的替代品似乎很好。如果你有点感动,你会得到与LSD几乎相同的结果。当我将OpenCV提升到4.1.0时,LineSegmentDetector(LSD)消失了。_lines1, _, _, _ = lsd1.detect(gray_image1, 2, 2)

为什么人工智能用Python?-程序员宅基地

文章浏览阅读923次,点赞24次,收藏27次。Python 作为脚本语言,虽然上手简单、入门快,但是运行速度没有Java、C++快,应用也不够广泛,那Python到底有什么优势?来听听王道Python的主讲老师龙哥怎么说?Python被认为是一门相对容易学习和上手的编程语言,对初学者友好。其简洁的语法和清晰的代码结构使得开发人员能够更专注于解决问题而不是处理语法复杂性。这使得开发人员能够轻松地利用这些工具进行人工智能项目的开发。例如最流行的机器学习框架Scikit-learn只支持Python。

Python实例29:利用python自动创建多个Excel表格_python在excel表格内添加多张表-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏19次。实例代码import xlwings as xwapp = xw.App(visible = True, add_book = False)for i in range(1, 21): workbook = app.books.add() workbook.save(f'e:\\example\\{i}班信息表.xlsx') workbook.close()app.quit()_python在excel表格内添加多张表

uni-app实现上拉加载,下拉刷新(下拉带动画)_uniapp 加载动画-程序员宅基地

文章浏览阅读5.7w次,点赞14次,收藏81次。直接代码展示了uni-app的上拉加载动画感觉还行,废话不多说了。。。1在pages.json添加允许下拉刷新{ "path":"pages/lookuser/lookuser", "style":{ "navigationBarTitleText":"用户日志", "enablePullDownRefresh": true//就是这个 }_uniapp 加载动画

随便推点

TCP/IP协议_tcp/ip包内容-程序员宅基地

文章浏览阅读1.6k次。笔记_tcp/ip包内容

javaweb基础_创建一个savelogin.java文件,该页面作用-程序员宅基地

文章浏览阅读1.4k次。静态网站:在tomcat的webapps目录下创建一个目录(命名必须不包含中文和空格),这个目录称之为项目目录在项目目录下创建一个html文件动态网站:在tomcat的webapps目录下创建一个项目目录在项目目录下创建如下内容WEB-INF目录在WEB-INF目录下创建web.xml文件创建静态或动态页面http协议:无状态协议,仅连接一次(ftp_创建一个savelogin.java文件,该页面作用

eclipse的hibernate映射工具_eclipse映射器-程序员宅基地

文章浏览阅读310次。升级网址http://hibernatesynch.sourceforge.net/_eclipse映射器

跨境电商亚马逊erp规避跟卖自发货铺货,数据更安全_跨境erp如何保证卖家数据安全?-程序员宅基地

文章浏览阅读313次。现在越来越多的跨境电商用户想拥有一套属于自己的自发货铺货ERP系统,但是众所周知,开发一套的成本太高,而且找不到很专业的技术员去开发,那么,我们提供的ERP私有化部署,成本低,你需要的投入的是一个服务器,以及一个ERP的定制费用,我们会把ERP加密部署到你的服务器中,这样你的数据就在你的服务器中。能看到数据的只有你自己,而且你对外销售出去的账号端口,你作为上家,同样是可以看到他们的数据!不是所有的部署都可以做销售系统,一般分为个人店群卖家部署,企业店群部署,培训孵化机构部署!每一个版本的部署,权限不一样,同_跨境erp如何保证卖家数据安全?

Vue绑定数据v-bind缩写:字段名 双向绑定v-model缩写:model 监听动作v-on缩写@ 记住:与数据相关用冒号 与动作相关用@_v-model简写-程序员宅基地

文章浏览阅读1.2w次,点赞6次,收藏11次。:是v-bind缩写:数据同步v-bind指令可以用于响应式地更新 HTML 特性:<spanv-bind:title="message">@是指令v-on缩写 :动作监听v-on指令,它用于监听 DOM 事件<form v-on:submit.prevent="onSubmit">...</form>.修饰符:动作具体化修饰符 (Modifiers) 是以半角句号.指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如.pr..._v-model简写

为什么招聘高级前端开发这么难?_为什么招聘高级前端开发这么难?-程序员宅基地

文章浏览阅读270次。曹操当年下求贤令,主要解决的就是一个多重标准的问题。「唯才是举,吾得而用之」很多人都觉得找工作怎么那么难,一个简历投了几百份,回的也没几个。你可知其实公司对于人才的需求,急躁心情丝毫不比你们的差。可能你会说,公司招不到人,钱给的不够多吧?那你往下看从这个帖子,可以看得出题主的要求是:1.2-3年以上工作经验2.基础牢固3.对某项技术有很深的研究4.学历背景好比如说满足条件1的市场上占70%;满足基础牢固的程序员占30%;满足对某个方向技术有较深研究的占30%;满足学历背景好的占10%。所以题主_为什么招聘高级前端开发这么难?