熵、KL散度和交叉熵

news2024/9/21 7:58:59

首先我们需要知道,所有的模型都可以看作是一个概率分布模型,包括人脑进行图像分类时也可以看作是一种完美的模型

1、信息量

如果学过通信应该知道香农定义了信息量的的概念,我们能够理解一件事情信息量很大或者很小,但是如何用数学去描述信息量具体是多大?

很明显一件事情发生的概率越大其信息量越小。概率越小其信息量越大。比如太阳明天从东边升起,这是没有什么信息量的。但是太阳明天从西边升起,信息量就非常大。在生活中我们遇到一些三观炸裂的事情,也会说这信息量好大,让我捋一捋。

所以事件 x x x的信息量定义为: f ( x ) = − l o g 2 p ( x ) f(x)=-log_2p(x) f(x)=log2p(x)其中 p ( x ) p(x) p(x)为事件 x x x的概率。因为概率越大信息量越小,所以前面的负号使得 f ( x ) f(x) f(x)满足单调递减。这里的 l o g log log只是一种定义形式,如果愿意也可以用其他数学表达式,只不过 l o g log log有自在的好处而已。底数为2使得信息量的单位为比特。

2、熵

熵是用于衡量系统混乱程度的指标。高中我们学过熵总是自然趋向熵增的,也就是世界是自发熵增的,会越来越混乱。

熵的定义其实就是该系统中各事件信息量的加权和。为什么要加权和?如果一个事件概率很低,则其信息量很高,整个系统的熵就由其主导了。但是该事件发生的概率是很低的,所以由其概率作为加权和的权重加权后就可以得到平衡。

熵的数学定义为: H = p ( x 1 ) f ( x 1 ) + p ( x 2 ) f ( x 2 ) + . . . . . . = ∑ p ( x i ) f ( x i ) H=p(x_1)f(x_1)+p(x_2)f(x_2)+......=\sum p(x_i)f(x_i) H=p(x1)f(x1)+p(x2)f(x2)+......=p(xi)f(xi)其中 f ( x i ) f(x_i) f(xi)为事件 x i x_i xi的信息量, p ( x i ) p(x_i) p(xi)为其概率。其实 p ( x i ) p(x_i) p(xi)就是加权和的权重。

将信息量的公式带入熵H中,可以得到: H = ∑ p ( x i ) f ( x i ) = ∑ p ( x i ) [ − l o g 2 p ( x i ) ] = − ∑ p ( x i ) l o g 2 p ( x i ) H=\sum p(x_i)f(x_i)=\sum p(x_i)[-log_2p(x_i)]=-\sum p(x_i)log_2p(x_i) H=p(xi)f(xi)=p(xi)[log2p(xi)]=p(xi)log2p(xi)

3、KL散度(相对熵、互熵)

现在我们知道了熵,如何利用熵衡量两个模型的相似度?KL散度就可以衡量。
在这里插入图片描述
比如上面有两个模型,有m个事件(或者有m个类)。假设现在P为基准模型(标签),Q模型为拟合模型(训练的模型),现在来衡量Q和基准P之间的差距: D K L ( P ∣ ∣ Q ) = ∑ p i ( f Q ( q i ) − f P ( p i ) ) D_{KL}(P||Q)=\sum p_i(f_Q(q_i)-f_P(p_i)) DKL(P∣∣Q)=pi(fQ(qi)fP(pi))
其中 f f f为信息量。从公式可以看到,两个分布的"差距"就是信息量差值的加权和,也就是相对熵(信息量的加权和是系统的熵,信息量差值的加权和就是两个系统的相对熵)

将信息量定义代入可得:
D K L ( P ∣ ∣ Q ) = ∑ p i ( − l o g 2 q i − − l o g 2 p i ) = ∑ p i ( − l o g 2 q i ) − ∑ p i ( − l o g 2 p i ) = p a r t 1 − p a r t 2 \begin{aligned} D_{KL}(P||Q)&=\sum p_i(-log_2q_i--log_2p_i) \\ &=\sum p_i(-log_2q_i)-\sum p_i(-log_2p_i) \\ &=part1-part2 \end{aligned} DKL(P∣∣Q)=pi(log2qilog2pi)=pi(log2qi)pi(log2pi)=part1part2
首先part1就是交叉熵(从公式可以看出是P的概率\*Q的信息量,就是交叉之义,概率\*信息量就是熵之义,所以part1就是交叉熵)

其次part2是基准模型P的熵,而基准模型在拟合过程中是充当标准的作用,是不会变的,所以part2就是一个常量。

所以在训练的时候只需要 D K L D_{KL} DKL越小越好,但是我们并不知道基准的熵part2是多少,但是不用担心我们只要保证part1越小,Q的分布就越拟合基准分布P。

可能有人疑惑我们并不知道part1和part2谁大谁小,所以要求 D K L D_{KL} DKL越小时不能保证part1越小。但是吉布斯不等式已经帮我们证明了 D K L D_{KL} DKL≥恒成立(也就是part1≥part2恒成立)。所以在实际使用时我们只需要保证part1越小越好(也就是交叉熵越小越好)。

4、交叉熵公式和网络模型的参数如何对应?

我们已经知道part2就是交叉熵: C E = ∑ p i ( − l o g 2 q i ) CE=\sum p_i(-log_2q_i) CE=pi(log2qi)
我们定义一个二分类模型,样本标签为 x x x的样本的概率为 x x x,模型为 f f f,则有 y = f W , b ( x ) y=f_{W,b}(x) y=fW,b(x) y y y为预测出的类别概率。标签 x x x为独热编码, y y y为模型的输出,即该样本在各个类上的概率分布。

举个例子,现在有二分类任务识别图片是否为猫,假设某个图片标签为猫,则有:

类别标签 P预测 Q
10.8
非猫00.2

基准分布和预测分布(可以和上面的图对照看,上面的图有多个类别,这里只有两个类别):
在这里插入图片描述

对于是猫的某个样本img1,其标签为类0,则独热编码(基准P的分布)=[1,0]。其预测分布(Q)为[0.7,0.3],则
− C E i m g 1 = x c a t l o g 2 y c a t + x n o t   c a t l o g 2 ( y n o t   c a t ) -CE_{img1}= x_{cat}log_2{y_{cat}}+x_{not\ cat}log_2(y_{not\ cat}) CEimg1=xcatlog2ycat+xnot catlog2(ynot cat)
因为 x c a t + x n o t   c a t = 1 x_{cat}+x_{not\ cat}=1 xcat+xnot cat=1 y c a t + y n o t   c a t = 1 y_{cat}+y_{not\ cat}=1 ycat+ynot cat=1,故可以写为 − C E i m g 1 = x c a t l o g 2 y c a t + ( 1 − x c a t ) l o g 2 ( 1 − y c a t ) = x l o g 2 y + ( 1 − x ) l o g 2 ( 1 − y ) -CE_{img1}= x_{cat}log_2{y_{cat}}+(1-x_{cat})log_2(1-{y_{cat}})=xlog_2y+(1-x)log_2(1-y) CEimg1=xcatlog2ycat+(1xcat)log2(1ycat)=xlog2y+(1x)log2(1y)
其实就是类别’猫’类别的交叉熵和’非猫’类别的交叉熵的和,即所有类别的交叉熵的和。

以上是两个类别的交叉熵,推广之,对于多分类n的交叉熵公式就是所有类别交叉熵的和:
C E = − ∑ x i l o g 2 y i CE=-\sum x_ilog_2y_i CE=xilog2yi

给定一张图模型输出的值一定在任何类上都有一定的概率值即 y i y_i yi是一个向量,实际上因为独热编码的原因, x i x_i xi非标签位上的为0,仅在标签为上为1,所以公式等效为 C E = − ∑ l o g 2 y i CE=-\sum log_2y_i CE=log2yi比如有2个样本,其标签为[0,2],则其独热编码为[[1,0,0],[0,0,1]],其预测概率为[[09,0.1,0],[0.1,0.1,.08]],所以交叉熵为 − ( l o g 2 0.9 + l o g 2 0.8 ) ≈ 0.47 -(log_20.9+log_20.8)≈0.47 (log20.9+log20.8)0.47

然而当我们使用pytorch的交叉熵函数计算时,发现等于0.65:

import torch

target = torch.tensor([0, 2], dtype=torch.int64)
prob = torch.tensor([[0.9, 0.1, 0], [0.1, 0.1, 0.8]], dtype=torch.float32)

loss = torch.nn.CrossEntropyLoss()(prob, target)
print(loss) # 0.65

5、Pytorch中的交叉熵

Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果。

  • Softmax后的数值都在0~1之间,log计算就是负值了。(也就是分类网络最后一层为softmax,pytorch中一般整合到交叉熵损失函数中了)

  • 然后将Softmax之后的结果取 l o g e log_e loge ,底数其实没有什么规定,都只是数学定义,不管公式中底数为2还是e,只要符合需求就都是正确的理论。

  • NLLLoss就是和独热编码相乘求和的过程(注意添加符号),

具体过程如下图

在这里插入图片描述
至此基本就结束了,其实交叉熵就是标签和log概率的乘积,即标签位置的信息量是多少(我们希望在该位置上的概率和标签一样同样是1,概率为1即信息量为0,此时交叉熵为0,这就是网络训练的目标),然后在样本尺度求均值就是批次的交叉熵。

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

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

相关文章

操作系统 - 进程和线程

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

陈香菲九价疫苗接种sop

前文 什么时间 正常时间 ● 正常接种按照接种时间,需要在2023-06-28 08:00-17:00 前往指定卫生院预防接种门诊进行接种。 时间异议 ● 正常来说如果接种时间内来大姨妈或者最近有服用一些药物的话是不能进行接种的,具体药物品…

chatgpt赋能python:Python爬虫防屏蔽策略及技巧

Python爬虫防屏蔽策略及技巧 介绍 爬虫作为一种数据采集工具,越来越广泛地应用于众多领域,包括搜索引擎优化(SEO)、产品分析、市场调研等等。然而,随着爬虫数量的不断增加,许多网站已经采取了多种方法来屏…

【Spring Cloud Stream 消息驱动】 —— 每天一点小知识

💧 S p r i n g C l o u d S t r e a m 消息驱动 \color{#FF1493}{Spring Cloud Stream 消息驱动} SpringCloudStream消息驱动💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客&#x1f390…

ECharts数据可视化

目录 第一章 什么是ECharts 第二章 搭建环境 2.1 Echarts的下载 2.2 Visual Studio Code下载 第三章 一个简单的可视化展示 第四章 Echarts组件 4.1 标题 4.2 提示框 4.3 工具栏 4.4 图例 4.5 时间轴 4.6 数据区域缩放 4.6.1 滑动条型数据区域缩放 4.6.2 内置型…

chatgpt赋能python:烧录单片机程序:Python的力量

烧录单片机程序:Python的力量 随着技术的发展和人类渴求的不断追求,电子设备的普及程度越来越高。在一个电子设备内部,单片机的应用非常广泛。然而,单片机作为计算机的重要组成部分,也需要相对应的程序来实现不同的功…

实战:Gradle构建工具实践-2023.6.22(测试成功)

实战:Gradle构建工具实践-2023.6.22(测试成功) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 gitlab/gitlab-ce:15.0.3-ce.0 jenkins/jenkins:2.346.3-2-lts-jdk11 gradle-7.6.1 openjdk 11.0.18实验软件 链接&#xff1…

x-s参数逆向

x-s参数逆向[2023.6.22] 1.提要 众所周知,此次的加密逻辑进入一个叫window._webmsxyw()的函数里面 该函数是封装在一个自执行函数内部,并添加到了window属性里,下面是两种获取思路。 2.扣环境 扣环境的话,只需要在jsdom的docu…

内存耗尽后Redis会发生什么?

作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多情况下某些键…

2023 node 接入腾讯云短信服务,实现发送短信功能

1、在 腾讯云开通短信服务,并申请签名和正文模板 腾讯云短信 https://console.cloud.tencent.com/smsv2 a、签名即是短信的开头。例如 【腾讯云短信】xxxxxxx; b、正文模板即短信内容, 变量部分使用{1}, 数字从1开始累推。例如&a…

Golang每日一练(leetDay0104) 最小高度树、戳气球

目录 310. 最小高度树 Minimum Height Trees 🌟🌟 312. 戳气球 Burst Balloons 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

MindSpore-TOOD模型权重迁移推理对齐实录

准备工作 环境: wsl2 Ubuntu 20.04 mindspore 2.0.0 python 3.8 pytorch 2.0.1 cpu 基于自己编写的mindspore TOOD项目和MMDetection实现的pytorch权重来做迁移, TOOD论文pytorch mmdetection实现 tood_r50_fpn_1x_coco权重 论文中的代码也是用mmdet…

浅谈前后端交互的基本原理

本文受众人群: 前端/后端开发工程师;Web应用程序设计师;项目经理;产品经理等。 为什么要去了解? 了解前后端交互的基本原理对于从事与Web开发相关的角色的人群是非常重要的。这包括前端开发工程师、后端开发工程师、全…

【Java高级语法】(十三)注解:解码程序设计中的元数据利器,在小小的@符里挖呀挖呀挖~用小小的注解做强大的开发...

Java高级语法详解之注解 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 元注解3.2 自定义注解3.3 常用内置注解 4️⃣ 应用场景5️⃣ 扩展:那些流行框架中的注解🌾 总结 1️⃣ 概念 Java 注解(Annotation) 是Java语言中一种元数据形式…

chatgpt赋能python:Python爬虫速度分析:如何加速你的爬虫?

Python爬虫速度分析:如何加速你的爬虫? Python作为一种优秀的胶水语言,被广泛应用于web开发、数据处理等众多领域。在众多应用场景中,Python爬虫无疑是其中之一。然而,在爬取海量数据时,爬虫的速度往往成为…

Arthas原理分析

在日常开发中,经常会使用到arthas排查线上问题,觉得arthas的功能非常强大,所以打算花了点时间了解一下其实现原理。并试着回答一下使用Arthas时存在的一些疑问。 Arthas主要基于是Instrumentation JavaAgent Attach API ASM 反射 OGNL等…

chatgpt赋能python:Python点的用法

Python点的用法 作为一名有着10年Python编程经验的工程师,我发现很多初学者对Python的点(.)用法存在疑惑。因此,在这篇文章中,我将详细介绍Python点的用法,并希望能够对这个问题有一个全面的认识。 什么是点 在Python中&#x…

Linux Xshell配置public key实现免密登录linux服务器

linux服务器安装成功后,登录linux服务器的工具有很多中,例如:Xshell、SecureCRT等等。而我所服务的用户使用xshell工具来对linux服务器进行运维。 当使用xshell登录linux服务器时,xshell提供了三种身份验证方式: 1.P…

实战:Maven构建工具实践-2023.6.21(测试成功)

实战:Maven构建工具实践-2023.6.21(测试成功) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 gitlab/gitlab-ce:15.0.3-ce.0 jenkins/jenkins:2.346.3-2-lts-jdk11 apache-maven-3.9.2 openjdk 11.0.18实验软件 链接&…

对centOS的home目录进行扩容。

对centos的home目录进行扩容 1 首先要了解PV\VG\LV的含义1.1 基本概念1.2 基本命令行 2 实际操作2.1 盘符当前现状2.1实操 1 首先要了解PV\VG\LV的含义 1.1 基本概念 物理卷(Physical Volume,PV) 指磁盘分区或从逻辑上与磁盘分区具有同样功能…