一文懂交叉熵Cross-Entropy

2023-05-16

        本文翻译自https://naokishibuya.medium.com/demystifying-cross-entropy-e80e3ad54a8

        交叉熵由交叉(Cross)和熵(Entropy)两部分组成,在机器学习中常常被定义为损失函数的目标。在二分类任务中,更有二分类交叉熵作为训练目标函数。

一、熵的表达式

        在前文一文懂熵Entropy_liveshow021_jxb的博客-CSDN博客中,指出熵的数学表达式为

Entropy=-\sum_{i}^{}P(i)logP(i)

        上述表达式是离散的变量i。对于连续变量,可以写成积分的形式

Entropy=-\int P(x)logP(x)dx 

        上式中,x表示连续变量,P(x)表示概率密度函数。

        在上面两者计算表达式中,都是负对数概率的期望平均值。所以,也可以用期望来表示

Entropy=\mathbb{E}_{x{\sim}P}[-logP(x)]

        x~P表示离散或者连续变量x用概率分布P来计算期望。记H(P)为熵,则最终可以表示为

H(P)=\mathbb{E}_{x{\sim}P}[-logP(x)]

        简言之,熵表示遵循特定概率分布事件的理论最小平均编码长度。

        可以看出,知道概率分布,就能计算熵。反之,不知道概率分布,则不能计算熵。为了求熵,就需要先估计概率分布。这种情况下,熵也是估计熵了。

二、估计熵

        回到前文一文懂熵Entropy_liveshow021_jxb的博客-CSDN博客中的例子,向纽约发送东京的天气,并且希望将消息编码为尽可能短的长度。在真实事件发生前,是没办法知道各种天气的发生概率的。假设,经过一段时间的观察,将东京天气的概率分布估计为Q,此时估计的熵为

EstimatedEntropy=\mathbb{E}_{x{\sim}Q}[-logQ(x)]

        如果估计的概率分布Q接近真实的概率分布,则上式能给出最小编码长度,即真实的熵。但是估计的概率分布很可能与真实的概率分布差的很远。此时既影响了期望,也影响了编辑长度logQ(x)的计算。最后的估计熵与真实熵就差的很远了。

        为了让编码长度尽可能的小,用真实概率分布P和基于估计概率Q的编码大小来计算平均编码长度。这种计算方式就称为PQ之间的交叉熵。

CrossEntropy=\mathbb{E}_{x{\sim}P}[-logQ(x)]

Entropy=\mathbb{E}_{x{\sim}P}[-logP(x)]

        所以,交叉熵比较了实际使用的编码大小和理论最小编码,即交叉验证编码大小。

三、交叉熵>=熵

        记H(P,Q)为交叉熵,则最终可以表示为

H(P,Q)=\mathbb{E}_{x{\sim}P}[-logQ(x)]     

        注意上式中的PQ位置不能互换,因为是用真实概率分布算期望,估计概率分布算编码大小。

        如果估计概率分布Q是精确的,即Q=P,此时

H(P,Q)=H(P)

        估计概率分布Q是非精确时,

H(P,Q)> H(P)

四、交叉熵作为损失函数

        现在有一个动物图像的数据集,里面有5种不同的动物,每张图片中都只有一个动物。

Source: https://www.freeimages.com/

        每张图片用one-hot编码到相应的动物,如下所示

        这种one-hot编码也可以看成每张图片在5种动物上的概率分布。比如第一张图片在“狗”这个种类上的概率为1,在其他种类上的概率为0。

        每张图片的分类都知道了,此时的熵都是0。

        one-hot编码能100%的表明每张图片中是什么动物种类。不会说第一张图片90%是狗,10%是猫。现在有一个机器学习模型要对这些图片进行分类。当这个模型没有被充分训练时,可能会将第一张图片分类如下

        模型将这张图片40%判定为狗,30%判定为狐狸,5%判定为马,5%判定为鹰,20%判定为松鼠。这种估计对于第一张图片上的动物是什么种类没有给出高置信度。那么在这种估计下的交叉熵为

        这远远大于标签下的熵为0的情况。假设模型进行了改良,此时对第一张图片的分类概率如下

        此时,交叉熵为

        可以看到,交叉熵随着分类准确性的提升,会变小。当分类100%准确时,交叉熵也会等于0。所以,交叉熵是可以作为损失函数来训练分类模型的。

五、二分类的交叉熵

        当遇到二分类问题时,就可以用二分类的交叉熵作为损失函数了。例如上面的例子中,假设图片上的动物只有两类:猫和狗。此时,交叉熵表示如下:

        使用如下等式做进一步替换

        则

        令如下关系

        此时,二分类交叉熵就可以表示为

BinaryCrossEntropy=-Plog\hat{P}-(1-P)log(1-\hat{P})

        这个表达式就是在各种文献中常常看到的了。

六、2为底还是自然数e为底

        在机器学习中,常常使用自然数e为底,来替代使用2为底,这样便于计算导数。因为

{ln(x)}'=\frac{1}{x}

        对数底的变化不会引起任何问题,因为这只是改变了个常数。

log_{2}x=\frac{log_{e}x}{log_{e}2}

        例如,使用交叉熵作为分类的损失函数仍然是成立的,因为训练时只需要往目标越来越小的方向迭代就可以。

        作为概念,以自然数e为底的信息单位是奈特nat,以2为底的信息单位是比特bit。1nat中的信息量为按1/e概率发生的事件。

1bit=-log_2\frac{1}{2}

1nat=-log\frac{1}{e}=1.44bits

        1bit的信息量来自发生概率为1/2的事件。当把信息编码为1bit时,一条信息能减少50%的不确定性。比如收到新来报道的同学是男同学(假设男女的概率各为1/2),则从全部人口中减少了一半人,只需要从剩下的一半人中确认是哪个同学了。但以e为对数底时,不太好解释。

        综合上述,以2为对数底用来解释信息熵的概念,以e为对数底用来做数值计算。

        自此,把交叉熵彻底理解清楚了。交叉熵这个概念对你的熵就是0了。

参考

https://naokishibuya.medium.com/demystifying-cross-entropy-e80e3ad54a8

https://zhuanlan.zhihu.com/p/149186719 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文懂交叉熵Cross-Entropy 的相关文章

  • 机器学习模型评估与改进: 交叉验证(cross validation)

    文章目录 交叉验证调用方法优势和不足注意事项 xff1a 分层k折交叉验证交叉验证的更多变形leave one out交叉验证Shuffle split交叉验证组间的交叉验证 总结 以监督学习的众多算法为例 xff0c 不管是分类还是回归
  • Cross-Compile FreeRDP using Mingw-w64

    Original https github com FreeRDP FreeRDP wiki Compilation FreeRDP can be compiled for Windows 32 64 Bit on a Linux syst
  • Cross-Origin Read Blocking (CORB)

    本文的开始源于落地页项目中遇到的 Chrome 控制台 warn 提示 xff0c 担心影响页面渲染 xff0c 特此弄个究竟 提示如下 xff0c Cross Origin Read Blocking CORB blocked cross
  • 3D机器学习(6):交叉熵(cross entropy loss),一种收敛更快的损失函数

    1 交叉熵 xff08 cross entropy loss xff09 简介 熵 61 entropy 61 不确定性 61 惊讶的度量 越高的熵越低的信息度 xff0c 因此不确定性或者混乱性越高 xff0c 熵越高 数学定义 xff0
  • 解决报错‘cross-env‘ is not recognized as an internal...

    目录 一 问题 1 1 问题描述 二 解决 2 1 解决 2 2 其它启动报错问题 一 问题 1 1 问题描述 今天在安装Ant Design Pro的后 xff0c 执行 yarn start 时意外报错 39 cross env 39
  • 进程防结束之PS_CROSS_THREAD_FLAGS_SYSTEM

    有人投到黑防去了 xff0c 不过黑防不厚道 xff0c 竟然没给完整的代码 xff0c 自己整理一份备用吧 xff0c 驱网 DebugMan 邪八的那群人直接飘过吧 这种方法的关键在于给线程的ETHREAD CrossThreadFla
  • System entropy source not available 答疑

    在制作生成LMDB格式的时候 会出现这种情况 xff08 在训练开始的时候也会显示这个 xff09 System entropy source not available 挖掘了很久才知道这个秘密 System entropy source
  • 2021CVPR-Cross Modal Focal Loss for RGBD Face Anti-Spoofing

    用于RGBD人脸反欺骗的交叉模式焦损 摘要 xff1a 自动检测呈现攻击的方法对于确保面部识别技术的可靠使用至关重要 文献中提供的大多数用于呈现攻击检测 PAD 的方法都无法将其推广到看不见的攻击 近年来 xff0c 人们提出了多通道方法来
  • 如何确定二进制字符串的统计随机性?

    如何确定二进制字符串的统计随机性 因此 我如何编写自己的测试 并返回与统计随机性相对应的单个值 即 0 到 1 0 之间的值 0 不是随机的 1 0 是随机的 该测试需要适用于任何大小的二进制字符串 当您使用笔和纸执行此操作时 您可能会探索
  • PostgreSQL 的 random() 函数的质量如何?

    假设我正在创建一个表foo有一个柱子bar这应该是一个非常大的随机整数 CREATE TABLE foo bar bigint DEFAULT round 9223372036854775807 bigint double precisio
  • 如何计算文件的熵?

    如何计算文件的熵 或者我们只说一堆字节 我有一个想法 但我不确定它在数学上是否正确 我的想法如下 创建一个包含 256 个整数 全为零 的数组 遍历文件及其每个字节 增加数组中相应的位置 最后 计算数组的 平均值 将计数器初始化为零 对于数
  • 计算不同文件扩展名的熵以查找数据的随机性?

    我有不同的文件类型 包括 JPEG 和 jpg mp3 GIF MP4 FLV M4V exe zip 等 以块为单位获取数据 例如 4k 块大小 找到随机性 生成 0 到 1 之间的随机性分数 尝试根据随机性分数来分类 我们怎样才能找到上
  • CryptGenRandom() 是线程安全的吗?

    CryptGenRandom 对于单个全局程序范围的 HCRYPTPROV 实例来说是线程安全的吗 MSDN 似乎缺乏这方面的任何信息 https msdn microsoft com en us library windows deskt
  • 使用 Ruby 和 imagemagick 获取或计算图像的熵

    如何在 Ruby 中使用 imagemagick 最好是 mini magic 找到 熵 我需要这个作为一个更大项目的一部分 找到图像中的 有趣之处 以便裁剪它 我找到了一个好的Python Django 中的示例 给出以下伪代码 imag
  • 计算测试集每个类别的熵以测量 pytorch 上的不确定性

    我正在尝试使用 MC Dropout 方法和此链接中提出的解决方案来计算图像分类任务的数据集的每一类的熵 以测量 pytorch 上的不确定性 在 pytorch 上使用 MC Dropout 测量不确定性 https stackoverf
  • 在 Matlab 中计算 2D 点列表的熵

    我有一个像这样的数组中的点列表 points 1 2 2 5 7 1 x y x 介于 0 到 1020 之间 y 介于 0 到 1920 之间 如何在Matlab中计算点数组的熵 非常感谢 我假设你想考虑每一个 x y 点作为一个数据点
  • 根据图像的 GLCM 计算熵

    我在用skimage用于大多数图像分析工作的库 我有一个 RGB 图像 我打算提取texture特征如entropy energy homogeneity and contrast从图像中 以下是我正在执行的步骤 from skimage
  • 使用 window.crypto.getRandomValues 在 JavaScript 中洗牌扑克牌

    一副扑克牌有 52 张牌 因此52 或大致2 226可能的排列 现在我想完美地洗牌这样一副牌 具有真正随机的结果和均匀的分布 这样你就可以达到这些可能的排列中的每一个 并且每个排列出现的可能性相同 为什么这实际上是必要的 对于游戏来说 也许
  • xgboost 的 github 存储库中的自定义目标函数示例脚本中如何计算对数损失的梯度和粗麻布?

    我想了解对数损失函数的梯度和粗麻布是如何计算的xgboost 示例脚本 https raw githubusercontent com dmlc xgboost master demo guide python custom objecti
  • 解释 scipy.stats.entropy 值

    我正在尝试使用scipy stats 熵来估计库尔巴克 莱布勒 KL 两个分布之间的散度 更具体地说 我想使用 KL 作为衡量标准来确定两个分布的一致性 但是 我无法解释 KL 值 例如 t1 numpy random normal 2 5

随机推荐

  • Postman传入date类型

    字符串输入格式 xff1a 2021 08 01 00 00 00 Date输入格式 xff1a 2019 09 09 11 20 20 插入到数据库中是DATE类型 xff1a 先获取到参数转为String类型 xff0c 在格式化为Da
  • 《Activity显示界面历险记》—说说View的那些理不清的关系

    前言 在Activity显示View的过程中 xff0c 有一些重要的角色总让人理不清 xff0c 比如PhoneWindow DecorView ViewRootImpl 也常常有面试题会问到 xff0c 他们四者之间的关系 xff1f
  • smartBi数据源连接与业务主题及七大数据集及透视分析与仪表盘四大分析展示经验总结

    smartBi经验总结 数据门户 电脑主题的资源发布后 xff0c 发布的资源可以在数据门户中看到 xff0c 数据门户界面包含 xff1a 首页 xff0c 报表展示目录 xff0c 报表展示明细资源 首页的设置在系统运维中 系统选项 公
  • java 中 Color类

    Color类 Color类是用来封装颜色的 xff0c 在上面的例子中多次用到 使用Color对象较为简单的方法是直接使用Color类提供的预定义的颜色 xff0c 像红色Color red 橙色Color orange等 xff1b 也可
  • C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符 xff1a 与 或 异或 取反 左移和右移 位运算是指按二进制进行的运算 在系统软件中 xff0c 常常需要处理二进制位的问题 C语言提供了6个位操作运算符 这些运算符只能用于整型操作数 xff0c 即只能用于带符号或无符号的
  • android 打开蓝牙设备 显示已经配对的蓝牙设备 ,并将已配对的蓝牙设备显示在textview中

    xff08 1 xff09 要想使用android 手机的Bluetooth xff0c 需要在androidmanifest文件中加入使用蓝牙的权限 lt uses permission android name 61 34 androi
  • iOS 7 点击按钮切换视图

    xff08 1 xff09 创建一个项目 xff0c 名字为切换视图 xff08 2 xff09 打开Main storyboard文件 xff0c 将视图中的ViewController视图控制器拖动到画布中 xff08 3 xff09
  • Javaweb 入门测试程序(jsp)

    关于进行jsp程序开发的入门测试小程序 xff08 1 xff09 必须的工具软件 java开发工具包jdk 需要进行环境变量的设置 xff0c 有Java开发基础的人这一步一看就懂 xff01 xff08 2 xff09 安装MyEcli
  • 自媒体平台运营的感悟

    1 关键是自媒体平台的定位 西游记中唐僧有着坚定的志向 西天取经 xff0c 普渡众生 抱着这样的初心和宗旨 xff0c 打造了自己的取经团队 一路上历经九九八十一难 xff0c 初心不改 xff0c 终于到达西天 xff0c 取得真经 x
  • 排序方法总结(1)冒泡排序 选择排序

    排序方法是一种基本的 重要的算法 xff0c 排序的方法有很多 xff0c 现把一些基本排序方法的算法和c 代码列出如下 xff0c 供大家思考 xff0c 借鉴 xff0c 进步 在进行排序之前首先要做的一件事就是选择排序的准则 xff0
  • 排序方法总结(2)插入排序

    插入排序 插入排序类和大家玩的纸牌游戏有些类似 xff0c 在发牌的过程的过程中用右手起的牌 xff0c 总是和左手里的排进行比较 xff0c 然后放在恰当的位置 这就是插入排序的思想 以数组为例 xff0c 其算法是 xff1a xff0
  • 关闭IDEA保存后自动添加空格

    IDEA保存后会给每行自动添加空格 xff0c 关闭这个功能
  • 排序方法总结(3)希尔排序

    希尔排序 希尔排序是对插入排序的改进 xff0c 对中等规模的数据排序效率较高 xff01 交换的次数变得少了 xff0c 效率就高了 希尔排序的算法 1 相距为 k 的数据进行比较 xff0c 若不符合排序的条件 xff0c 就进行交换
  • 求阶乘的几种方法

    求阶乘的几种方法 xff08 1 xff09 常规求阶乘 利用循环即可求出 include lt stdio h gt int main int m n i sum 61 1 printf 34 please input one numbe
  • C++sort函数的用法

    C 43 43 sort 函数的用法 近来看了c 43 43 标准库这本书 xff0c 学到了很多 xff0c 就把这其中的一点 C 43 43 sort 函数的用法写下来和大家分享吧 xff01 xff08 一 xff09 为什么要用c
  • Design Patterns Elements of Reusable Object-Oriented Software(一)Introduction(介绍)

    1 Introduction xff08 介绍 xff09 Designing object oriented software is hard and designing reusable object oriented software
  • 排序方法之堆排序

    堆排序的实现 xff08 xff09 创建初始堆 xff08 二 xff09 堆排序 在创建初始堆之前首先要了解一些关于堆的概念 xff0c 还需要了解一些关于平衡二叉树的内容 xff08 1 xff09 堆的节点数 61 n 2 并且是只
  • 使用yum命令在Linux下安装jdk8

    先查看centos下是否有自带的jdk rpm qa grep java 如果有 xff0c 先删除自带的jdk rpm e nodeps 接刚才查看其中带有openjdk的 删除完成 xff0c 使用yum命令安装 yum install
  • rk3588:串口波特率

    开发过程我们一般都需要看串口log协助分析 xff0c 以便分析对应的bug或者优化系统稳定性等问题 xff0c 那每个平台串口波特率都有可能有一定的出入 xff0c 不尽相同 xff0c 而RK3588默认串口波特率是1500000 xf
  • 一文懂交叉熵Cross-Entropy

    本文翻译自https naokishibuya medium com demystifying cross entropy e80e3ad54a8 交叉熵由交叉 xff08 Cross xff09 和熵 xff08 Entropy xff0