softmax函数与交叉熵损失详解

文章目录

  • 一、softmax函数
    • 1.1 引入指数形式的优点
    • 1.2 引入指数形式的缺点
  • 二、交叉熵损失函数
    • 2.1 交叉熵损失函数
    • 2.2 softmax与交叉熵损失
  • 参考资料

一、softmax函数

softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!

假设我们有一个数组,Z,Zi表示Z中的第i个元素,那么这个元素的softmax值就是:
在这里插入图片描述
更形象的如下图表示:
在这里插入图片描述
softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!

1.1 引入指数形式的优点

从上述 y = e x y = e^{x} y=ex函数图像指数函数中可以看出,曲线呈现递增趋势,最重要的是斜率逐渐增大,也就是说在x轴上一个很小的变化,可以导致y轴上很大的变化。这种函数曲线能够将输出的数值拉开距离。

假设拥有三个输出节点的输出值为为[2, 3, 5]。我们来尝试 不使用指数函数使用指数函数的Softmax函数 计算会产生什么区别。

import tensorflow as tfprint(tf.__version__) # 2.0.0
a = tf.constant([2, 3, 5], dtype = tf.float32)b1 = a / tf.reduce_sum(a) # 不使用指数
print(b1) # tf.Tensor([0.2 0.3 0.5], shape=(3,), dtype=float32)b2 = tf.nn.softmax(a) # 使用指数的Softmax
print(b2) # tf.Tensor([0.04201007 0.11419519 0.8437947 ], shape=(3,), dtype=float32)

结果还是挺明显的,经过使用指数形式的Softmax函数能够将差距大的数值距离拉的更大。

另外,在深度学习中通常使用反向传播求解梯度进而使用梯度下降进行参数更新的过程,使用指数函数在求导的时候比较方便。

1.2 引入指数形式的缺点

指数函数的曲线斜率逐渐增大虽然能够将输出值拉开距离,但是也带来了缺点,当 z i z_{i} zi 值非常大的话,计算得到的数值也会变的非常大,数值可能会溢出。

import numpy as npscores = np.array([123, 456, 789])
softmax = np.exp(scores) / np.sum(np.exp(scores))
print(softmax) # [ 0.  0. nan]

当然针对数值溢出有其对应的优化方法,将每一个输出值减去输出值中最大的值。
在这里插入图片描述

import numpy as npscores = np.array([123, 456, 789])
scores -= np.max(scores)
p = np.exp(scores) / np.sum(np.exp(scores))
print(p) # [5.75274406e-290 2.39848787e-145 1.00000000e+000]

二、交叉熵损失函数

2.1 交叉熵损失函数

交叉熵函数为在处理分类问题中常用的一种损失函数,用于描述模型预测值与真实值的差距大小,其具体公式为:

在这里插入图片描述

其中,p为真实值,q为预测值。

这里,关于交叉熵的具体介绍参见博客:损失函数——交叉熵损失函数(CrossEntropy Loss)

交叉熵损失函数在Python中的具体实现如下:

# tensorflow version
loss = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y), reduction_indices=[1]))# numpy version
loss = np.mean(-np.sum(y_*np.log(y), axis=1))# pytorch version
entroy=nn.CrossEntropyLoss()

2.2 softmax与交叉熵损失

当使用Softmax函数作为输出节点的激活函数的时候,一般使用交叉熵作为损失函数。

由于Softmax函数的数值计算过程中,很容易因为输出节点的输出值比较大而发生数值溢出的现象,在计算交叉熵的时候也可能会出现数值溢出的问题。为了数值计算的稳定性,TensorFlow提供了一个统一的接口,将Softmax与交叉熵损失函数同时实现,同时也处理了数值不稳定的异常,使用TensorFlow深度学习框架的时候,一般推荐使用这个统一的接口,避免分开使用Softmax函数与交叉熵损失函数。

TensorFlow提供的统一函数式接口为:

import tensorflow as tfprint(tf.__version__) # 2.0.0
tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits = False)

中y_true代表了One-hot编码后的真实标签,y_pred表示网络的实际预测值:

  • 当from_logits设置为True时,y_pred表示未经Softmax函数的输出值;
  • 当from_logits设置为False时,y_pred表示为经过Softmax函数后的输出值;

为了在计算Softmax函数时候数值的稳定,一般将from_logits设置为True,此时 tf.keras.losses.categorical_crossentropy 将在内部进行Softmax的计算,所以在不需要在输出节点上添加Softmax激活函数。

参考资料

  • Softmax函数详解与推导
  • 一文详解Softmax函数

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

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

相关文章

【C++ 内存管理】深拷贝和浅拷贝你了解吗?

文章目录 1.深拷贝2.浅拷贝3.深拷贝和浅拷贝 1.深拷贝 🍎 深拷⻉: 是对对象的完全独⽴复制,包括对象内部动态分配的资源。在深拷⻉中,不仅复制对象的值,还会复制对象所指向的堆上的数据。 特点: 🐧① 复制对…

蓝桥杯-移动距离(最简单的写法)

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。 其楼房的编号为 1,2,3…当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为 6 时,开始情形如下: 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 … 我…

程序设计语言理论中的范畴论及其简单应用

程序设计语言理论中的范畴论及其简单应用 范畴论是一个深奥的数学分支,近年来在程序设计语言理论中得到了广泛的应用。本文将简要介绍范畴论的基本概念,并通过简单示例来说明其在程序设计中的应用。 范畴论的基本概念 范畴(Category&#…

Vue3:数据交互axios

回调函数 > 回调函数: 一些特殊的函数,表示未来才会执行的一些功能,后续代码不会等待该函数执行完毕就开始执行了 1. Promise 1.1 简介 > 前端中的异步编程技术,类似Java中的多线程线程结果回调! * Promise 是异步编程的一种解决方案&#xff0c…

记录一下 log4j的漏洞

目录 背景 bug的产生 bug复现 JNDI 网络安全学习路线 (2024最新整理) 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明: 背景 log4j这次的bug,我相信大家都已经知道了,仅以…

网络安全软件堡垒机推荐行云管家云堡垒机!

随着互联网技术的快速发展,以及数字化转型的快速转变,网络安全已成为企业生存和发展的关键要素。网络安全不仅是国家等保要求,也是企业发展必须面对的挑战。目前市面上网络安全软件较多,这里我给推荐行云管家堡垒机! …

【unity小技巧】减少Unity中的构建打包大小

文章目录 正常默认打包查看编辑器打包日志压缩图片压缩网格模型压缩贴图压缩音频文件只打64位包最终大小完结 正常默认打包 这里以安卓为例。先什么都不干,直接打包安卓apk,查看包大小 查看编辑器打包日志 搜索build report构建报告。构建报告我们应该…

Pytorch学习-引言

Pytorch相关链接 Pytorch官方网站 https://pytorch.org/ Pytorch的Github仓库 https://github.com/pytorch/pytorch Pytorch论坛 https://discuss.pytorch.org/ Pytorch离线下载包链接 https://download.pytorch.org/whl/torch_stable.html Pytorch学习视频推荐链接 http://【…

ubuntu 升级23.10 wifi固件缺失

昨晚家里ubuntu老机器23.04升级到23.10,出现wifi无法联网的故障,提示固件缺失。 查了不少资料,估计是要手工安装了,今天带跟网线回家,先要能上网啊。 经过几天折腾,我又从23.10升级到24.02 LTS版本&#…

手写一个SPI FLASH 读写擦除控制器

文章目录 flash读写数据的特点1. 扇擦除SE(Sector Erase)1.1 flash_se 模块设计1.1.1 信号连接示意图:1.1.2 SE状态机1.1.3 波形图设计:1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图:…

apt结尾总是报错 ERROR: Timeout was reached

问题排查 尝试查看dpkg.log,重新安装异常的包,试了没用尝试清除apt缓存sudo apt clean sudo rm -rf /var/lib/apt/lists sudo apt update看到报错信息Failed to activate service org.freedesktop.PackageKit: timed out(service_start_timeout25000ms)…

学习前端第三十五天(原型继承,F.prototype,原生的原型)

一、原型继承 1、[ [ Prototype ] ],对象属性 所有对象都有一个[ [ Prototype ] ] 当从object中读取一个缺失的属性时,JavaScript 会自动从原型中获取该属性,“原型继承”。 其中之一设置原型的方法,使用特殊的名字 __proto__&…

JavaScript 对象入门:基础用法全解析

目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种,数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可…

mcu 常用宏定义展示

简介 MCU开发中一般有很多地方需要对寄存器进行操作。 寄存器操作 #define SET_BIT(REG, BIT) ((REG) | (BIT))#define CLEAR_BIT(REG, BIT) ((REG) & ~(BIT))#define READ_BIT(REG, BIT) ((REG) & (BIT))#define CLEAR_REG(REG) ((REG) (0x0))#de…

程序员之路:裁员与内卷下的生存之道

作为一名普通的程序员,身处这个瞬息万变的IT行业,面对着今年不断加剧的裁员浪潮和日益激烈的内卷竞争,我时常感到焦虑和不安。然而,正是这些挑战,让我们更加深入地思考了在这个行业中,我们该如何找到自己的…

wireshark_http

过滤器: 捕获过滤器:表达式作用在wireshark开始捕获数据包之前,只捕获符合条件的数据包,不记录不符合条件的数据包。 显示过滤器:表达式作用在在wireshark捕获数据包之后,从已捕获的所有数据包中显示出符…

[链表专题]力扣21, 234

1. 力扣21 : 合并两个有序链表 题 : 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:输入:l…

2024统计建模中国新质生产力统计测度与时空演变及其驱动因素研究

高质量成品论文46页word版本1.5w字书写完整数据集1000行py代码一等奖论文!这里仅展示部分内容,完整版在下面的链接。 【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/ 中国新质生产…

【2024HNCTF】密码组部分出题记录

2024H&NCTF 密码组部分出题记录 题目:BabyPQ、HappyDance 文章目录 2024H&NCTF 密码组部分出题记录BabyPQ | 签到HappyDance BabyPQ | 签到 本题为nc交互题,之所以采用这种形式,是因为可能有很多密码新师傅们不了解这种赛题形式&a…

AI机器人火了,探讨早就可以帮我们开拓市场的中关村科金语音机器人

近期AI机器人给我们带来了不少惊喜,比如国外 Figuer 联合 OpenAI 做了 Chatgpt 机器人,可以通过对话后推理干活,国内仿生机器人员工也开始量产,看到AI机器人不禁想到会不会替代我们的工作?我们了解到很多机器人厂家的…