005、Softmax损失

news2024/11/23 11:36:42

之——softmax与交叉熵

杂谈

        我们常用到softmax函数与交叉熵的结合作为损失函数以监督学习,这里做一个小小的总结。


正文

1.softmax的基本改进

        所谓softmax就是在对接全连接层输出时候把输出概率归一化,最基础的就是这样:

        效果就是这样:

        数值上达到的效果就是使得最后输出总和为1,范围0~1.

a = np.array([38,20,40,39])
softmax_a = np.exp(a) / np.sum(np.exp(a))
print(softmax_a)
#[9.00305730e-02 1.37116380e-09 6.65240955e-01 2.44728471e-01]

        但是这个是存在数值不稳定的,极小或极大的差异将会溢出,x很小的都会被归为0,大的又会溢出,所以我们通常做了一定的改进。 

改进一:减去最大防止溢出

        C一般是我们的数值最大值,这个操作使得我们可以防止x过大的情况出现,减小指数函数输入差异。这只是对运算过程中做一下数值稳定性的规约,不会影响输出结果。

a = np.array([38,20,40,39])
a_max = np.max(a)
softmax_a = np.exp(a-a_max) / np.sum(np.exp(a-a_max))
print(softmax_a)
#[9.00305730e-02 1.37116380e-09 6.65240955e-01 2.44728471e-01]

改进二:Log

        为了一定程度上消除求幂指数和除法,通常会对以上的softmax取log,这样可以除法转化为减法,,并减少一次幂指数的计算,也提高了梯度的计算能力,甚至跟香农信息熵的形式一定程度地联系了起来。

a = np.array([38,20,40,39])
a_max = np.max(a)
time1 = time.time()
for i in range(100000):
    softmax_a = np.exp(a-a_max) / np.sum(np.exp(a-a_max))
    softmax_a = np.log(softmax_a)
time2 = time.time()
print("未优化时间:",time2-time1)
print("softmax_a:",softmax_a)

time3 = time.time()
for i in range(100000):
    softmax_a = a-a_max - np.log(np.sum(np.exp(a-a_max)))
time4 = time.time()
print("优化时间:",time4-time3)
print("softmax_a:",softmax_a)


未优化时间: 0.8376865386962891
softmax_a: [ -2.40760597 -20.40760597  -0.40760597  -1.40760597]
优化时间: 0.7791688442230225
softmax_a: [ -2.40760597 -20.40760597  -0.40760597  -1.40760597]

         十万次计算下的速度优化。

改进三:Softmax Temperature

        softmax可能存在对于一些数值上相近的向量数值,概率却相差很大,比如上面接受的输入是[38,20,40,39],不加log输出就是[0.09, 0.00, 0.6, 0.24],加log的输出就是[ -2.41 -20.41  -0.41  -1.41],可见相差实在是太大了,所以引入一个对于输入范围的缩小,希望输入都在平滑合理的区间内:

a = np.array([38,20,40,39])
a_max = np.max(a)
tao=100
softmax_a = np.exp((a-a_max)/tao) / np.sum(np.exp((a-a_max)/tao))
print("softmax_a:",softmax_a)

softmax_a: [0.25869729 0.21608214 0.26392332 0.26129724]

        设置tao为100,可见输出变得更为很合理。

改进四:FC + Softmax——Modified Softmax

        在很多时候,Softmax接在一个全连接层(或者某个能够统一维度的层)之后,所以形式上改进为:注意,由于这里是矩阵形式的x,所以xi、xj表示的都是那个展平的x,由W的标号决定对应的输出yj:

        消除向量表达全部变为标量那就是modified softmax:

        如果能将 W=1,b=0,就得到了一个比较规范化的modified softmax:


2.softmax的演变

        数据科学家想要在softmax上面做一些特定性的改变来显式得体现出改进。

演变一:Large-Margin Softmax(L-Softmax)

        思路是想要在分类任务中,使得类内距离尽可能小,类间距离尽可能大。于是L-Softmax提出基于Modified Softmax增加一个超参数来控制。想要将特征与参数分解为振幅和具有余弦相似度的角:

        如果是个二分类,上文中提到的modified softmax的分类为1类依据是(分母相同,忽略偏差):

        而 L-Softmax则类似于间隔化的思想,想要分类更严格并扩大决策范围:(m>=1,0 ≤ θ1 ≤ π/m )

        那么我们的学习目标就变成了后式,也就是要更严格的θ,也就是相比没有引入m时更小的θ。                                                                      

        因为 m是正整数,cos 函数在 0 到 π 范围是单调递减的,所以 cos(mθ) 要小于 cos(θ)则m要>=1 。 m 值越大则表示我想要的间隔越大,因此通过这种方式调大m定义损失会逼得模型学到类间距离更大的,类内距离更小的特征。 我如果增大m,则表示我要你的θ1更小,意思是最后寻找到的特征空间的类间距离更大的,类内距离更小。当然为了满足学习目标,θ2也会被压小。

        最终定义为:

        为了满足分段函数的连续,原文构造了一个函数:

演变二: Angular Softmax(A-Softmax)

        A-Softmax的改进思路和L-Softmax相似,都是对于在分类任务中,使得类内距离尽可能小,类间距离尽可能大,只不多A-Softmax与L-Softmaxd区别主要是A-Softmax多了一个权重归一化,和Modified Softmax里面的权重归一化一样:

演变三: Additive Margin Softmax(AM-Softmax)

        将L-Softmax & A-Softmax的 改造为新函数:,然后把W和x都归一化,而我们又知道:,分母归一化为1了,这样原来的式子就变成了:

        直接跟正则化扣上了,我增大m,那模型训练时候为了让softmax大那其Wx就得大,那肯定只能训练出越靠近x的W才会越大啦。这样的好处是求导极其简单。

演变n:还有一堆

Softmax与其变种 - 知乎 (zhihu.com)


3.交叉熵

        交叉熵的引入就是通过独热编码将注意力集中在分类正确的softmax上,用分类正确的softmax的梯度更新权重,因为只有分类正确的-log p*log(q)的p才会是1。

        而至于说log则达到了我们之前所做的log_softmax的效果,取-就直接表示要最小化损失,最大化softmax输出。


感谢:1  2  3  

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

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

相关文章

图文教程:stable-diffusion的基本使用教程 txt2img(多图)

之前我介绍了SD的安装过程,那么这篇将介绍怎么使用SD 使用模型 SD安装好之后,我们只有一个默认的模型。这个模型很难满足我们的绘图需求,那么有2种方法。 1是自己训练一个模型(有门槛)2是去网站上找一个别人练好的模…

算法通关村第四关—表达式问题(黄金)

表达式问题 一、计算器问题 计算器也是非常常见的问题,我们看一个中等问题。LeetCode227.给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。  你可以假设给定的表达式总是有效的。所有中间结果将在[-231,231…

关于Anaconda的安装和环境部署(此章专为新手制定)

目录 Anaconda简介 一、软件下载(地址👇) 2:点击下载 3:版本选择: 4:Anaconda的安装包就下载完成了 2:恭喜你,看到这里已经完成安装了 三、部署环境 1&#xff1…

Vue 双向绑定:让数据与视图互动的魔法!(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Wireshark中的http协议包分析

Wireshark可以跟踪网络协议的通讯过程,本节通过http协议,在了解Wireshark使用的基础上,重温http协议的通讯过程。 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于 字节流…

FastAPI之响应模型

前言 响应模型我认为最主要的作用就是在自动化文档的显示时,可以直接给查看文档的小伙伴显示返回的数据格式。对于后端开发的伙伴来说,其编码的实际意义不大,但是为了可以不用再额外的提供文档,我们只需要添加一个 response_mod…

scala变量与变量类型

1.6 变量与类型(重点)1.6.1 变量推断1.6.2 多变量定义1.6.3 var和val的区别 1.6.3.1 是否可变 1.6.3.2 延迟加载 1.6 变量与类型(重点) val修饰的变量,相当于Java中final修饰的变量; // 定义常量s1,使用…

11.进制转换:十进制转二进制【2023.12.3】

1.问题描述 计算机底层原理中常使用二进制来表示相关机器码,学会将十进制数转换成二进制数是一个非常重要的技能。现在编写一个程序,输入一个十进制数,将其转换成二进制数。 2.解决思路 使用内置函数bin()将十进制数转换为二进制数 3.代码…

FreeRTOS的三处栈空间设置分析

1、汇编启动代码中设置栈 这个栈空间只有300字节,是用于汇编启动代码早期,以及调用C语言的main函数(创建任务等)在创建好任务,启动调取器后,这个栈空间就被抛弃掉,后续不会使用到等调度器开启后…

问卷调查:如何防止随意作答以提高数据质量

在进行问卷调查的时候,我们经常要面临一个问题——答题者随意作答。这往往会导致我们收集的问卷数据不准确,影响问卷的最终结论。所以,我们要开展问卷调查的过程中,要运用一些合理的方法和技巧,避免这种情况发生。问卷…

频率、概率

频率 在相同的条件下进行试验,假设试验进行了次,其中随机事件A发生了次,那么就称为随机事件A发生的频率。 概率 假设随机试验E的样本空间是S,对于其中每个随机事件,都对应了一个实数,把这个实数称为随机…

1842_emacs使用company-irony实现C语言的自动补全

Grey 全部学习内容汇总:GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 1842_emacs使用company-irony实现c语言的自动补全 irony-mode是一个自动补全的实现方案,配合company集成之后效果非常好。简单调试完了之后…

理解排序算法:冒泡排序、选择排序与归并排序

简介: 在计算机科学中,排序算法是基础且重要的概念。本文将介绍三种常见的排序方法:冒泡排序、选择排序和归并排序。我们将探讨它们的工作原理、特点和适用场景,以帮助读者更好地理解和选择合适的排序方法。 冒泡排序 冒泡排序是…

如何通过上下滑动实现亮度和音量调节(ArkUI)

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小,本例即为大家介绍如何实现上述UI效果。 说明: 由于当前亮度和音量调节功能仅对系统应用开发,所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下: 当在…

Python 进阶(十五):Base64 编码和解码(base64 模块)

大家好,我是水滴~~ 本篇文章主要介绍Python的base64模块,主要内容有:Base64的概念、base64模块、base64编码和解码、以及其使用场景。文章中包含大量的示例代码,希望能够帮助新手同学快速入门。 《Python入门核心技术》专栏总目录…

SpringBoot程序的打包与运行

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…

什么是接口与API接口!

今天有个朋友问我什么接口?你们平时都说在写接口,写的是什么鬼啊?我一开始就想,咦小陈同学怎么突然了解编程接口了,不过听到他后一个提问我知道原来他想的是API接口,不过被我主观意识习惯想成了编程定义上的…

HCIA-H12-811题目解析(7)

1、【多选题】RSTP协议包含以下哪些端口状态? 2、【单选题】当采用LACP模式进行链路聚合时华为交换机的默认系统优先级是? 3、【单选题】下面关于二层以太网交换机的描述说法不正确的是? 4、【单选题】以下哪种类型的ACL不能匹配网络层信息…

mysql,树形结构表中,查询所有末节点数据(叶子结点)

需求:在一个可以存放多级目录的表中,查询出某个课程目录下所有末节点(因为只有末节点可以挂载资源) 例如下图: 其中 1.11.2.12.1 都是末节点,因为他们已经没有下一级了 catalog表中重要字段有:c…

工具应用:Robot Framework->对协议级接口进行测试

实验简介 本节实验主要为大家讲解如何利用Robot Framework结合常用的关键字完成对Agileone系统中的“需求提案”模块进行协议级接口的自动化测试脚本开发。 实验目的 (1) 掌握RF的Requests库的常用关键字及用法。 (2) 能够熟练…