005、Softmax损失

之——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.rhkb.cn/news/215766.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 JavaScript 中导入和导出 Excel XLSX 文件:SpreadJS

在 JavaScript 中导入和导出 Excel XLSX 文件 2023 年 12 月 5 日 使用 MESCIUS 的 SpreadJS 将完整的 JavaScript 电子表格添加到您的企业应用程序中。 SpreadJS 是一个完整的企业 JavaScript 电子表格解决方案,用于创建财务报告和仪表板、预算和预测模型、科学、工…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考,前端变化比较大,按照要求,只能做到像,不能做到一模一样 3、图片和文字仅为示例,需要自行替换 4、如果代码不满足你的要求,请寻求其他的…

【C语言】结构体实现位段

引言 对位段进行介绍,什么是位段,位段如何节省空间,位段的内存分布,位段存在的跨平台问题,及位段的应用。 ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,…

【从零开始学习JVM | 第六篇】快速了解 直接内存

前言: 当谈及Java虚拟机(JVM)的内存管理时,我们通常会想到堆内存和栈内存。然而,还有一种被称为"直接内存"的特殊内存区域,它在Java应用程序中起着重要的作用。直接内存提供了一种与Java堆内存和…

删除误提交的 git commit

背景描述 某次的意外 commit 中误将密码写到代码中并且 push 到了 remote repo 里面, 本文将围绕这个场景讨论如何弥补. 模拟误提交操作 在 Gitee 创建一个新的 Repo, clone 到本地 git clone https://gitee.com/lpwm/myrepo.git创建两个文件, commit 后 push 到 remote 作…

软件兼容性测试:保障多样化用户体验的重要功能

随着移动设备和操作系统的快速发展,软件兼容性测试变得越发重要。这项测试确保软件在不同平台、设备和环境下都能够正常运行,提供一致而稳定的用户体验。下面是软件兼容性测试中的一些关键功能: 1. 跨平台兼容性测试 在不同操作系统上运行的软…

C++写文件时主动刷新磁盘文件大小

一.效果 如下图所示,test.log是我正在写入的文件。 二.实现 #include <fstream> #include <io.h> #include <iostream> #include <stdio.h>class OfSteamImmediately : public std::ofstream { public:OfSteamImmediately(){}~OfSteamImmediately()…

js基础:简介、变量与数据类型、流程循环控制语句、数组及其api

JS基础&#xff1a;简介、变量与数据类型、流程循环控制语句、数组及其api 一、简介 1、js概述 tip&#xff1a;JavaScript是什么&#xff1f; 有什么作用&#xff1f; JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释性的编程语言&#xff0c;主要用于在网页…

洛谷 P8802 [蓝桥杯 2022 国 B] 出差

文章目录 [蓝桥杯 2022 国 B] 出差题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE [蓝桥杯 2022 国 B] 出差 题目链接 https://www.luogu.com.cn/problem/P8802 题目描述 A \mathrm{A} A 国有 N N N 个城市&#xff0c;编号为 1 … N …

在vscode下将ipynb文件转成markdown(.md文件)的方法

在vscode下将ipynb文件转成markdown&#xff08;.md文件&#xff09;的方法 写在最前面安装nbconvert工具vscode界面 or cmd终端基本命令将ipynb文件转换成md文件 总结 写在最前面 VSCode作为一款强大的代码编辑器&#xff0c;提供了广泛的功能。它支持多种文件格式的编辑和查…

deepface:实现人脸的识别和分析

deepface介绍 deepface能够实现的功能 人脸检测&#xff1a;deepface 可以在图像中检测出人脸的位置&#xff0c;为后续的人脸识别任务提供基础。 人脸对齐&#xff1a;为了提高识别准确性&#xff0c;deepface 会将检测到的人脸进行对齐操作&#xff0c;消除姿态、光照和表…

InnoDB在SQL查询中的关键功能和优化策略

文章目录 前言存储引擎介绍存储引擎是干嘛的InnoDB的体系结构 InnoDB的查询操作InnoDB的查询原理引入 Buffer Pool引入数据页Buffer Pool 的结构数据页的加载Buffer Pool 的管理Buffer Pool 的优化 总结 前言 通过上篇文章《MySQL的体系结构与SQL的执行流程》了解了SQL语句的执…

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

Spring-Boot---配置文件

文章目录 配置文件的作用配置文件的格式PropertiesProperties基本语法读取Properties配置文件 ymlyml基本语法读取yml配置文件 Properties VS Yml 配置文件的作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;具有非常重要的作用。比如&#xff1a; 数据库的…

如何解决MAC卸载软件后图标还在的问题

今天卸载photoshop突然遇到一个问题&#xff0c;程序卸载完成后居然还有一大堆的图标删不掉&#xff0c;果断找法子&#xff0c;下面就是我应用到的方法&#xff0c;希望对你有所帮助&#xff0c;只能是photoshop太流氓啊。。。 方法一&#xff1a; 使用命令(Command) 空格键…

Vue3中的defineModel

目录 一、vue3的defineModel介绍 二、defineModel使用 &#xff08;1&#xff09;在vite.config.js中开启 &#xff08;2&#xff09;子组件 &#xff08;3&#xff09;父组件 一、vue3的defineModel介绍 为什么要使用到defineModel呢&#xff1f;这里有这样一种场景&…

Java的NIO工作机制

文章目录 1. 问题引入2. NIO的工作方式3. Buffer的工作方式4. NIO数据访问方式 1. 问题引入 在网络通信中&#xff0c;当连接已经建立成功&#xff0c;服务端和客户端都会拥有一个Socket实例&#xff0c;每个Socket实例都有一个InputStream和OutputStream&#xff0c;并通过这…

Mirrors and reflections for VR

专为虚拟现实而建,但也非常适合非虚拟现实桌面和移动项目 这是URP管道,从Unity2019.4.16一直测试到2023年。 完全工作场景预览,轻松修改着色器材质。着色器支持折射,可以制作很酷的效果。 镜子/反射可以互相反射,而不仅仅是2...想象一下一个电梯,3面镜子都互相反射,直到…

【PTA刷题】 求子串(代码+详解)

【PTA刷题】 求子串(代码详解) 题目 请编写函数&#xff0c;求子串。 函数原型 char* StrMid(char *dst, const char *src, int idx, int len);说明&#xff1a;函数取源串 src 下标 idx 处开始的 len 个字符&#xff0c;保存到目的串 dst 中&#xff0c;函数值为 dst。若 len…

算法-02-排序-冒泡插入选择排序

一般最经典的、最常用的&#xff1a;冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。那么我们如何分析一个"排序算法"呢&#xff1f; 1-分析排序算法要点 时间复杂度&#xff1a;具体是指最好情况、最坏情况、平均情况下的时间复杂…