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.hqwc.cn/news/699955.html

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

相关文章

k8s v1.20二进制部署 部署 CNI 网络组件 部署 Calico

一、部署 flannel 1.1.K8S 中 Pod 网络通信 ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它们在同一台机器上一样,可以用 localhost 地址访问彼此的端口。…

MATLAB蚁群算法求解带时间窗的旅行商TSPTW问题代码实例

MATLAB蚁群算法求解带时间窗的旅行商TSPTW问题代码实例 蚁群算法编程求解TSPTW问题实例: 在经纬度范围为(121, 43)到(123, 45)的矩形区域内,散布着1个商家(编号1)和25个顾客点(编号为226),各个…

HTML常见标签-段落标签

段落标签 段落标签一般用于定义一些在页面上要显示的大段文字,多个段落标签之间实现自动分段的效果 代码 <p>记者从工信部了解到&#xff0c;近年来我国算力产业规模快速增长&#xff0c;年增长率近30%&#xff0c;算力规模排名全球第二。</p><p>工信部统计…

基于51单片机的电子门铃设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机电子门铃设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0091 1. 主要功能&#xff1a; 基于51单片机的智能门铃设计 1、系统采用…

#私密朋友圈被吐槽有bug?官方致歉!网友:尴尬了......

1月7日&#xff0c;话题#微信私密朋友圈被吐槽有bug#&#xff0c;冲上微博热搜第一。 据了解&#xff0c;近日有网友发现&#xff0c;即使自己发布私密朋友圈&#xff0c;好友也可以在朋友圈页面看到自己的头像红点&#xff0c;随即此话题引发热议。 有网友表示&#xff0c;怪…

网络安全ctf比赛_学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!...

对于想学习或者参加CTF比赛的朋友来说&#xff0c;CTF工具、练习靶场必不可少&#xff0c;今天给大家分享自己收藏的CTF资源&#xff0c;希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站&#xff0c;内容齐全&#xff0c;收藏备用。 1、C…

失业,登上了网络悲惨排行榜热传?

几年前&#xff0c;有关“失业”这个话题早就频繁地出现在国内各大社交网站&#xff0c;原以为早已淡化了&#xff0c;殊不知今天浏览国内各大社交网站&#xff0c;惊讶地发现它竟然登上了“悲惨排行榜”并被热传&#xff0c;便认为对此话题有闲聊一会儿的必要。 截图&#xff…

CAN模块开发问题概述

问题一 问题描述 工作环境&#xff1a;ECU外接canoe 操作&#xff1a;使用CANoe模拟发送NM报文&#xff0c;然后停发或者断开CANoe 现象&#xff1a;程序跑死&#xff0c;调用call stack查看压栈情况如下图所示 定位代码如下图所示。可见是由于CAN模块在设置Controller状态时…

ChatGPT-4o发布了,所有人都可以免费用

前言 美国时间 5 月 13 日&#xff0c;在 Sam Altman 缺席的情况下&#xff08;为什么缺席&#xff0c;猜测是可能后面还有更重磅的消息&#xff0c;这次的产品只是一个中间过渡产品&#xff09;&#xff0c;OpenAI CTO Mira Murati 介绍了新的 ChatGPT 产品 ChatGPT-4o。这个…

轻松掌握 Java Faker ,学点真本事,做点“假”数据~

工作中难免遇到需要造点“假”数据的情况&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些。 一般接到这种要求&#xff0c;大部分的测试都不太知道该怎么去做。今天罗杰老师教你一招&#xff0c;让你做出逼真的“假”数据。 1、什么是 Java Faker 伪造测…

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

OmniDrive:具有 3D 感知推理和规划功能的自动驾驶整体 LLM-智体框架

24年5月北理工、Nvidia和华中科大的论文“OmniDrive&#xff1a;A Holistic LLM-Agent Framework for Autonomous Driving with 3D Perception Reasoning and Planning”。 多模态大语言模型&#xff08;MLLMs&#xff09;的进展导致了对基于LLM的自动驾驶的兴趣不断增长&…