15分钟真正搞懂什么是“交叉熵损失函数”

news2024/11/18 5:33:17

大家好啊,我是董董灿。

在你刚学习神经网络的时候,有没有被一个名字叫做“交叉熵”的概念绕的云里雾里,以至于现在看到这个概念,依然很懵。

今天就来看一下,这个所谓的“交叉熵”到底是什么,以及它在神经网络扮演什么角色,神经网络中为什么要用它来做损失函数?

本篇文章前半部分会有一些公式的推导和解释(参考Naoki大佬博客,感兴趣可查看英文原文:https://naokishibuya.medium.com/demystifying-cross-entropy-e80e3ad54a8),你也可以直接跳到最后一部分查看神经网络中交叉熵损失的介绍。

1、交叉熵

“交叉熵”包含了“交叉”和“熵”这两部分,如果把这两部分都理解透彻,那这个概念也就没有什么神秘可言了。

“熵”在之前的一篇文章中已经说过了,如果对熵还不清楚的同学,可以看下这篇文章——对“熵”一知半解?带你揭开“熵”的神秘面纱。

总的来说,大科学家香农大佬,定义了熵来计算“在确保信息传递过程不失真的情况下,传递信息所需要的最小编码大小”。

说的好理解一些,就是我向你传递一个消息,在确保没有任何信息丢失的情况下,我需要用到的最小的信息量。

在知道了熵的概念之后,下面从公式的角度一点点抽丝剥茧,来说明交叉熵。

对于存在概率分布的事件,计算熵的公式如下,这个公式在上篇文章解密熵中详细论述过:

其中,i 为发生的离散事件,根据不同的场景 i 会代表不同的含义,比如之前举的例子,东京的天气是阴天还是晴天,就属于在一天中会发生的离散事件。P(i)为发生这些事件的概率,对应到天气便是某一天降雨的概率,晴天的概率等。

上式熵的公式我们稍微变一下型,将负号和 log(P(i)) 看做一个变量,由于P(i)是每个事件 i 发生的概率,那么上式便可以理解为离散事件 i 发生概率的负对数(-log(p(i))的平均值(也叫期望)。

因此,熵的计算公式,便有了一个期望形式:

其中,x~P 表示用事件 x 服从概率分布 P,并且使用 P 来计算期望,同时熵一般用字母 H 表示,于是熵的公式可以写成如下形式:

简单点讲,熵这一概念,是用来表征在遵循特定概率分布的事件事件 x 发生时,传递信息需要用到的理论平均最小编码大小。

因此,只要我们知道发生事件的概率分布,我们就可以计算它的熵,如果我们不知道它的概率分布,那就没有办法计算熵。

所以,对于不知道概率分布的事件,需要想办法来估计概率分布,从而计算熵。

而利用估计的概率分布来计算熵,得到的是估计熵,这一点很重要,对我们接下来理解交叉熵很有帮助。

2、计算估计熵

假设现在向纽约发送东京的天气情况,并且希望在发送信息的过程中,将天气信息编码到最小来发送。

但我们遇到一个问题,那就是东京的天气我并不能百分百确定,也就是说天气在发生之前,我是不知道的,我所知道的,仅仅能通过天气预报的形式估计出一个天气概率。

假设在观察了东京一段时间的天气后,我大概得到了一个天气的概率分布Q,那么使用这个估计的概率分布Q,便可以计算出一个熵值(此时称为估计熵Estimated Entropy)为:

如果 Q 非常接近真实发生的概率分布,那么上式计算的结果(估计熵)便能更精确的反应传递信息需要的最小编码大小。

但是,这种计算估计熵的公式,存在两种不确定性。

首先,x~Q 表示我们利用概率分布 Q 来计算期望,而 Q 是估计出来的,可能会与实际概率分布 P 相差很大。

其次,计算最小编码时,是基于估计的 Q 来计算的概率分布的负对数 -log(Q),而这也不会是100%准确的。

由此可见,Q 即影响期望,又影响最小编码估计,因此,计算出的估计熵并不能反应出什么,继而将估计熵和真实熵进行对比,也无法得出什么有意义的结论。

那怎么办呢?先回到这件事的本质上,其实一开始我们关心的,是在传递信息的时候,如何让编码大小尽可能小,也就是传递的信息量最小。

因此,我们既然有了熵的理论了,可以基于熵的理论,将我们的计算的编码大小与理论最小的编码进行比较即可,而不去考虑期望,将Q的影响由双变量变为单变量。

举个例子,假设在观察一段已发生的东京天气后,得到了天气发生的真实分布P ,我们可以使用概率分布 P 来计算真实的平均编码大小,而利用天气预报中的概率分布 Q,来计算未发生的事件所需要的编码大小。

这便是基于概率事件 P 和 Q 之间的交叉熵:

上式中,计算期望我们使用了相同的真实概率分布 P,因此此时比较两个熵的大小,实际上比较的是 -logQ 和 -logP 的大小,也就是理论最小编码和实际编码大小。

说的通俗一点,交叉熵在交叉的检查编码大小,这就是交叉熵中“交叉”的意思。

3、交叉熵 ≥ 熵

通常,交叉熵用H表示如下:

H(P, Q) 表示使用 P 计算期望,使用 Q 计算编码大小。

因此,H(P, Q) 和 H(Q, P) 不一定相同,但如果 Q=P,在这种情况下H(P, Q) = H(P, P) = H(P)并且变成熵本身。

有一点需要注意的事,在计算期望时应该使用真实概率P,因为它反映了真实事件的分布。而在计算编码大小时应该使用Q,因为它反映了对消息进行编码的大小。

可以看到,如果估计的概率分布是完美的,也就说如果估计的概率分布 Q 刚好等于 P,那么此时 H(P, Q)=H(P),否则 H(P, Q) > H(P)。

以上便是交叉熵和熵之间的联系,不知各位同学看懂了没,没看懂没关系,接着看下下面的实例,或许你会对交叉熵有更深刻的理解。

4、交叉熵作为损失函数

假设有一个动物图像数据集,其中有五种不同的动物,每张图像中只有一只动物。

来源:https: //www.freeimages.com/

我们将每张图像都使用 one-hot 编码来标记动物。对one-hot编码不清楚的可以移步这里有个你肯定能理解的one-hot。

上图是对动物分类进行编码后的表格,我们可以将一个one-hot编码视为每个图像的概率分布。

第一个图像是狗的概率分布是 1.0 (100%)。

对于第二张图是狐狸的概率分布是1.0(100%)。

以此类推,此时,每个图像的熵都为零。

换句话说,one-hot 编码标签 100% 确定地告诉我们每张图像有哪些动物:第一张图片不可能 90% 是狗,10% 是猫,因为它100%是狗。

现在,假设有一个神经网络模型来对这些图像进行分类,在神经网络执行完一次推理,或者完成一轮训练迭代后,它可能会对第一张图像(狗)进行如下分类:

该分类表明,第一张图像中狗占 40%,狐狸占 30%,马占 5%,老鹰占 5%,松鼠占 20%。

但是,单从图像标签上看,它100%是一只狗,标签为我们提供了这张图片的准确的概率分布。

那么,此时模型分类预测的效果如何呢?我们可以计算利用标签的one-hot编码作为真实概率分布 P,模型预测的结果作为 Q 来计算交叉熵:

结果明显高于标签的零熵,说明预测结果并不是很好。

先不急,继续看另一个例子。

假设模型经过了改良,在完成一次推理或者一轮训练后,对第一张图得到了如下的预测,也就是说这张图有98%的概率是狗,这个标签的100%已经差的很少了。

我们依然计算交叉熵:

可以看到交叉熵变得很低,随着预测变得越来越准确,交叉熵会下降,如果预测是完美的,它就会变为零。

基于此理论,很多分类模型利用交叉熵作为模型的损失函数。

在机器学习中,由于多种原因(比如更容易计算导数),对数的计算大部分情况下是使用基数 e 而不是基数 2 ,对数底的改变不会引起任何问题,因为它只改变幅度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【项目级面试题】关于前端鉴权这块,能详细的说说吗?

如果有人问你:”你做了这么多年的开发,关于前端鉴权这块,能详细的说说吗?“。你该如何作答,脑海中有没有一个完整的思路。 像 Token、Cookie、Session、JWT、单点登录 这些概念,它们的作用、应用场景、如何…

【C#】并行编程实战:使用 PLINQ(3)

PLINQ 是语言集成查询(Language Integrate Query , LINQ)的并行实现(P 表示并行)。本章将继续介绍其编程的各个方面以及与之相关的一些优缺点。 本文的主要内容为 PLINQ 中的组合并行和顺序 LINQ 查询、取消 PLINQ 查询、使用 PLI…

Azure AD混合部署,实现在本地AD同步到AAD上面

一、前期准备 1、进入 Azure云 注册一个账号 云计算服务 | Microsoft Azure 2、进入 AAD 管理后台 Microsoft Azure 3、创建一个新的租户 4、添加自定义域名,这里要做下验证,所以你要有个线上的域名 5、创建一个全局管理员 6、登陆本地AD,创…

第133页的gtk+编程例子——计算器应用改写网上的例子

第133页的gtk编程例子——计算器应用改写网上的例子 来源:《GTK的计算器》 https://blog.csdn.net/zhouzhouzf/article/details/17097999 重点在于它的设计思路是比较巧妙的,能够处理多种情况,比较容易理解,也感到人类的思想是非…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令,一…

常用数据聚类算法总结记录与代码实现[K-means/层次聚类/DBSACN/高斯混合模型(GMM)/密度峰值聚类/均值漂移聚类/谱聚类等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据聚类算法,对其原理简单总结记录,同时分析对应的优缺点,以后需要的时候可以直接翻看,避免每次都要查询浪费时间,欢迎补充。 聚类算法是一种无监督学习的方法&am…

chrales过期重装或使用途中的踩坑记录及使用方法

1、背景 我的是证书过期了,提示无网络。 1. 重新下载 安装(或者 不需要重新下载安装,用已有的就可以) 2. 重新进行配置 3. (关键)检查电脑上的 证书过期时间 4. (关键)检查手机上的证书过期时间 5. (手机配置好后,点开链接显示无网络&#…

Android:简单登录界面

一、前言&#xff1a;这个登陆界面我前前后后写了差不多一个星期&#xff0c;主要有密码登录、验证码登录、键盘自动隐藏、忘记密码、新建密码等功能&#xff0c;你们可以自己研究一下&#xff01; 二、上代码&#xff1a; 资源文件 1.在value包下面添加一个dimens.xml <…

对性能测试评估分析优化市场的反思

目录 前言&#xff1a; 性能市场的现状 性能测试人员的价值体现 年龄和加班 性能行业的出路 前言&#xff1a; 性能测试评估分析和优化是一个关键的环节&#xff0c;它可以帮助我们了解系统的性能瓶颈和潜在问题&#xff0c;并提出相应的优化方案。在市场竞争激烈的环境下…

Cesium 实战 - AGI_articulations 扩展:模型自定义关节动作

Cesium 实战 - AGI_articulations 扩展&#xff1a;模型自定义关节动作 简要概述两种方式实现模型组件动作模型添加关节&#xff08;articulations&#xff09;1.导入模型&#xff08;J15.glb&#xff09;2.查看模型内部组件信息&#xff08;名称&#xff09;4.将需要J15.glb复…

Docker常见命令(以备不时之需)

参考官网&#xff1a;https://docs.docker.com/engine/reference/commandline/cli/ 帮助启动类命令 启动docker&#xff1a; systemctl start docker 停止docker&#xff1a; systemctl stop docker 重启docker&#xff1a; systemctl restart docker 查看docker状态&…

架构训练营笔记系列:面向复杂度的设计

面向复杂度的设计 DDD 是可扩展架构的设计技巧&#xff0c;不是架构方法论。不关注高性能、高可靠。 架构本质&#xff1a;为了降低软件系统复杂度 怎么做架构设计 &#xff1f;思路是分析系统需求找到系统复杂的地方&#xff0c;然后设计方案。 复杂度相关有哪些&#xff1…

Unity的PostProcessing后处理使用介绍

大家好&#xff0c;我是阿赵。 上一篇文章说了Unity的PostProcessing后处理有bug并提供了解决办法&#xff0c;这里顺便介绍一下PostProcessing的用法。 一、安装 打开PackageManager&#xff0c;然后搜索Post&#xff0c;应该就能看到左边出现搜索结果&#xff0c;选择&…

一个人的面相能直接反映其个性与命运

中国传统文化&#xff0c;博大精深&#xff0c;面相学只是其中一种。 在古代&#xff0c;面相学却是一门非常实用的学科&#xff0c; 尤其是经过了一代代人的发展&#xff0c;面相学得到了完善之后&#xff0c;他的准确性往往会超过现代人的预料。相由心生&#xff0c;面相是对…

用户端App 测试方法与技术

目录&#xff1a; app测试体系app项目测试流程app结构讲解app测试设计思路app常见bug解析常用模拟器使用android开发者选项安装mumu模拟器adb命令介绍adb环境搭建与配置adb与设备交互adb安装卸载应用adb命令启动页面adb命令清缓存adb文件传输adb日志操作adb命令操作Android设备…

DRF+Vue.JS前后端分离项目实例(下) --- Vue.js 前端实现代码

本文上篇请 点击阅读 1. 需求说明 本文以学生信息查询功能为例&#xff0c;采用前后端分离架构&#xff0c;后端提供RESTFul 接口&#xff0c;前端代码用Vue.js Bottstrap实现。 1.1 本例要求提供如下查询功能&#xff1a; 列表查询、单条查询 添加学生信息 更改学生信息 删…

在线试用Stable Diffusion生成可爱的图片

文章目录 一、 Stable Diffusion 模型在线使用地址&#xff1a;二、模型相关版本和参数配置&#xff1a;三、图片生成提示词与反向提示词&#xff1a;提示词1提示词2提示词3提示词4提示词5 一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/insc…

python 读取npy文件

import numpy as np test np.load("I:/软件/mask.npy") print(test) 如下图所示&#xff1a;

Web3 智能合约通过数组方式存储更多学生数据

之前的文章 Web3 在Truffle项目中编写出自己的第一个solidity智能合约带大家写了一个相对捡漏的智能合约 这样 每次 我们set 后 都会将原来的数据覆盖掉了 那么 有些人可能会想 那我们弄个数组 将新的数据全部加到数组里不就行了吗&#xff1f; 这个想法其实就很不错 我们可以…