【DL经典回顾】激活函数大汇总(十五)(LogSoftmax附代码和详细公式)

激活函数大汇总(十五)(LogSoftmax附代码和详细公式)

更多激活函数见激活函数大汇总列表

一、引言

欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。

在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。

限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。

二、LogSoftmax

softmax是一个数学函数,它将K个真实的数的向量作为输入,并将其转换为概率分布,参见图,即在应用softmax之前,向量分量可以是负的或大于0,但是在应用softmax之后,每个分量将在区间[0,1]中,这些分量的和等于1,所以我们可以把这些值解释为概率。
在这里插入图片描述

LogSoftmax激活函数是Softmax激活函数的一个变体,常用于深度学习模型中的多分类问题。它结合了Softmax函数的归一化特性和对数运算,经常用于模型的输出层,特别是当模型的输出需要表示为概率对数时。

1. 数学定义

给定一个向量 z z z,其元素 z i z_i zi代表模型对第(i)类的原始预测分数(也称为logits),LogSoftmax函数定义为:

log ⁡ Softmax ⁡ ( z i ) = log ⁡ ( e z i ∑ j e z j ) \log \operatorname{Softmax}\left(z_i\right)=\log \left(\frac{e^{z_i}}{\sum_j e^{z_j}}\right) logSoftmax(zi)=log(jezjezi)
其中,分母是对所有类别预测分数的指数求和,确保了输出的归一化,而对数运算则直接提供了概率的对数形式。

2. 函数特性

  • 归一化和稳定性:LogSoftmax通过归一化确保了输出值表示为对数概率,这对于处理极端值特别有用,因为它有助于避免数值计算中的下溢问题。
  • 与Softmax的关系:LogSoftmax可以被看作是对Softmax输出取对数,提供了直接的概率对数输出,这在计算交叉熵损失时非常高效。

3. 导数

LogSoftmax函数的导数相对简单,给定输出类别 i i i,其导数为:

∂ log ⁡ Softmax ⁡ ( z i ) ∂ z k = { 1 − Softmax ⁡ ( z i )  if  i = k − Softmax ⁡ ( z k )  if  i ≠ k \frac{\partial \log \operatorname{Softmax}\left(z_i\right)}{\partial z_k}= \begin{cases}1-\operatorname{Softmax}\left(z_i\right) & \text { if } i=k \\ -\operatorname{Softmax}\left(z_k\right) & \text { if } i \neq k\end{cases} zklogSoftmax(zi)={1Softmax(zi)Softmax(zk) if i=k if i=k
这表示,对于目标类别 i i i,梯度取决于该类别的Softmax概率与1的差;而对于非目标类别 k k k,梯度为该类别的Softmax概率的负值。

4. 使用场景与局限性

使用场景

  • 多分类问题:LogSoftmax广泛用于深度学习中的多分类问题,尤其是当模型的输出需要进行概率解释时。
  • 交叉熵损失计算:在使用交叉熵损失函数时,直接使用LogSoftmax作为输出层可以提高计算效率,因为它避免了计算Softmax概率后再取对数的额外步骤。

局限性

  • 输出解释:由于LogSoftmax提供的是概率的对数形式,直接解释输出可能不如Softmax直观。
  • 数值稳定性:虽然LogSoftmax设计是为了提高数值稳定性,但在实际应用中仍需注意适当的数值处理,以避免数值误差。

5.代码实现

import numpy as np

def log_softmax(x):
    """
    计算LogSoftmax激活函数的值。
    
    参数:
    x -- 输入值,可以是数值、NumPy数组或者多维数组。
         当处理多维数组时,默认对最后一个维度应用LogSoftmax。
    
    返回:
    LogSoftmax激活后的结果。
    """
    # 防止在指数运算时数值溢出的常见技巧是从输入中减去最大值。
    # 注意:这里使用keepdims=True保持数组维度不变,以便后续的广播操作。
    x_max = np.max(x, axis=-1, keepdims=True)
    
    # 计算调整后的指数值,并通过指数的总和归一化,得到Softmax概率。
    # 再对这些概率取对数,得到LogSoftmax值。
    e_x = np.exp(x - x_max)
    log_sum_e_x = np.log(np.sum(e_x, axis=-1, keepdims=True))
    
    # LogSoftmax实际上是输入的指数减去归一化因子的对数。
    return (x - x_max) - log_sum_e_x

# 示例输入,假设是一批3个样本的logits,每个样本对应3个类别的预测分数。
x = np.array([
    [2.0, 1.0, 0.1],
    [1.0, 3.0, 0.2],
    [0.2, 0.2, 4.0]
])

# 应用LogSoftmax激活函数
output = log_softmax(x)

print("LogSoftmax Output:\n", output)
解读
  1. 数值稳定性:通过从每个输入中减去其最大值(x_max),此技巧有助于避免在进行指数运算时的数值溢出问题,同时不影响最终的结果。这是因为LogSoftmax的计算涉及到比率的对数,而这些比率在减去一个常数后保持不变。

  2. 归一化和对数:计算每个元素的指数后,通过其总和对指数进行归一化,得到Softmax的概率分布。然后,对这个归一化的结果取对数,得到最终的LogSoftmax值。这里的(x - x_max) - log_sum_e_x实质上是先对归一化的指数值取对数,再从每个输入减去其对应的最大值和归一化因子的对数。

  3. 多维数组支持:通过在np.maxnp.sum函数中指定axis=-1和使用keepdims=True,此实现支持对多维数组进行操作,假定最后一个维度是特征或类别维度。这使得函数可以直接应用于一批数据,无需单独处理每个样本。

示例输出解释

对于示例输入,该函数为每个样本的每个类别计算了LogSoftmax值。输出显示了每个类别的LogSoftmax值,这些值可以直接用于计算交叉熵损失,优化多分类问题中的模型性能。

三、参考文献

虽然LogSoftmax函数本身可能不经常作为单独的研究主题出现,但它与Softmax函数和交叉熵损失的讨论密切相关。以下是一些相关的基础文献和资源,这些可以帮助深入理解LogSoftmax函数及其在深度学习中的应用:

  1. Goodfellow, I., Bengio, Y., & Courville, A. (2016). “Deep Learning.” MIT Press. 这本书为深度学习提供了全面的介绍,包括激活函数、损失函数以及如何在神经网络中使用它们的详细讨论。尽管它可能不直接专门讨论LogSoftmax,但提供了对Softmax函数和交叉熵损失的深入讨论,这些都与LogSoftmax紧密相关。
  2. Bishop, C. M. (2006). “Pattern Recognition and Machine Learning.” Springer. Bishop的这本书详细介绍了模式识别和机器学习的基本原理,其中包括分类问题中的概率模型和对数概率的使用。该书通过讨论Softmax函数及其性质,为理解LogSoftmax提供了背景知识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【矩阵】54. 螺旋矩阵【中等】

螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 解题思路 1、模拟顺时针螺旋顺序遍历矩阵…

R语言语法基础(说人话版)

在Rstudio中使用ctrl回车来执行某一行的代码 在R语言中,通常不需要像C语言一样在每条语句的结尾添加分号来表示语句结束。R语言是一种脚本语言,它使用换行符来分隔语句,因此分号通常是可选的,除非你想在同一行上写多个语句。在R中…

Selenium 自动化 —— 使用WebDriverManager自动下载驱动

上一篇文章 入门和 Hello World 实例 中,我们提供了一个最简单的 Selenium 上手的例子。 但是某一天,突然发现相同的代码居然运行报错了。这是怎么回事呢? 日志排查 日志中其实提示的很明显了:Chrome浏览器和Chrome WebDriver的…

【PTA】L1-039 古风排版(C++)

题目链接:L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn) 目录: 目录: 题目要求: 输入格式: 输出格式: 输入样例: 输出样例: 思路: 代码: 测试结…

B. Array Fix

思路&#xff1a;我们倒着看&#xff0c;首先判断以下当前元素有没有被操作过&#xff0c;被操作过的话&#xff0c;那么需要改为操作后的数&#xff0c;然后跟当前数的前一个数进行比较&#xff0c;如果a[i] < a[i - 1]的话&#xff0c;那么需要将a[i - 1]拆分&#xff0c;…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列&#xff09;简称MQ&#xff0c;是一种应用程序对应用程序的消息通信机制。在MQ中&#xff0c;消息以队列形式存储&#xff0c;以便于异步传输&#xff0c;在MQ中&#xff0c;发布者&#xff08;生产者&#xff09;将消息放入队列&#xff…

基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 ​编辑2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到matlab显示结果如下&#xff1a; matlab的对比测试结果如下&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a…

C++提高笔记(四)---STL容器(stack、queue、list)

1、stack容器&#xff08;栈&#xff09; 1.1 栈stack基本概念 概念&#xff1a;stack是一种先进后出&#xff08;First In Last Out&#xff0c;FILO&#xff09;的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界调用&#xff0c;因此栈不允许有遍历行…

Java八股文(Element Plus)

Java八股文のElement Plus Element Plus Element Plus 什么是Element UI 和 Element Plus&#xff1f; Element UI 和 Element Plus 是基于 Vue.js 的一套非常受欢迎的开源 UI 组件库&#xff0c;用于快速构建具有现代化设计和丰富交互效果的前端界面。 Element UI 和 Element…

【C#】int+null=null

C#语法&#xff0c;这玩意不报错 intnullnull&#xff0c;有点不合逻辑 (Int32)(bizRepair0rder.CreateTime. Value - regues.Mlodifylime.Value).TotalMinutes (Int32)(bizRepair0rder.CreateTime. Value - reques.llodifylime.Value).TotalMinutes nullstring是引用类型&…

Kotlin:runBlocking导致App应用出现ANR问题实例

runBlocking简介 runBlocking 是常规函数&#xff1b; runBlocking 方法会阻塞当前线程来等待&#xff1b; runBlocking 的主线程会一直 阻塞 直到 runBlocking 内部的协程执行完毕。 runBlocking导致App应用出现ANR问题实例的效果 点击页面上的 刷新按钮 调用 refreshByrunBlo…

IDEA中的打包Build Artifacts详解

现在大家是不是很少遇见自己打包部署项目了&#xff0c;因为现在都是自动化部署&#xff0c;所以基本大的公司都没有了这一步。当项目开发完毕&#xff0c;需要对外发布时&#xff0c;我们就会用到IDEABuild Artifacts功能&#xff0c;那么如果在idea中打包呢。 在没有创建Arti…

金蝶云星空,怎么做BI数据可视化分析?

金蝶云星空是一个流程管理方面的软件&#xff0c;如果想要做BI数据可视化分析&#xff0c;还就需要一套BI方案&#xff0c;即一套奥威BI软件金蝶云星空BI方案。 奥威BI软件&#xff0c;负责提供平台和技术&#xff1b;金蝶云星空BI方案&#xff0c;则提供标准化的数据分析模型…

自动化脚本-图片验证码识别登陆

安装依赖包 pip install requests requests 模块是 Python 中一个常用的 HTTP 库&#xff0c;用于发送 HTTP 请求和处理 HTTP 响应。它提供了简洁而友好的 API&#xff0c;使得在 Python 中进行 HTTP 请求变得十分方便&#xff08;本文用于进行验证码下载&#xff09; pip ins…

计算机考研|双非一战135上岸,408经验分享+复盘

计算机专业的同学真的别想的太天真&#xff01; 相比于其他专业&#xff0c;计算机专业的同学其实还是很有优势的 但是现在随着计算机专业的同学越来越多&#xff0c;找工作的困难程度以及学历自然而然被卷起来了 以前的算法岗基本要求在本科以上&#xff0c;现在基本都是非92研…

FPGA静态时序分析与约束(四)、时序约束

系列文章目录 FPGA静态时序分析与约束&#xff08;一&#xff09;、理解亚稳态 FPGA静态时序分析与约束&#xff08;二&#xff09;、时序分析 FPGA静态时序分析与约束&#xff08;三&#xff09;、读懂vivado时序报告 文章目录 系列文章目录前言一、什么是时序约束&#xff1…

LinuxU盘挂载原理,为什么要用到U盘挂载及实现U盘挂载

目录 一、U盘挂载原理 二、为什么要用到U盘挂载 三、实现U盘挂载 一、准备工作 1、安装gcc 2、下载ntfs-3g 3、解压 4、编译准备 5、编译并安装 二、挂载演示 一、U盘挂载原理 Linux的U盘挂载原理涉及以下几个方面&#xff1a; 设备识别&#xff1a;当您将U盘插入Lin…

iOS 腾讯Pag动画框架-实现PagView的截图功能

背景 产品想要一个首页的截图功能&#xff0c;一听这个功能&#xff0c;心想那还不简单&#xff0c;将父视图控件转换成图片保存就行了。按照这个思路实现&#xff0c;很快就打脸啦&#xff0c;首页的这些动画一个都没有截出来&#xff0c;就像消失啦似的。然后蠢蠢的将动画暂…

HTML—标签的分类,span和div标签,不同的标签之间类型转换

标签的分类&#xff1a; ①块级标签&#xff1a;无论内容多少&#xff0c;会充满整个行。大小可自定义 例&#xff1a;p&#xff0c;h1&#xff0c;ul&#xff0c;ol&#xff0c;hr 等 ②行级标签&#xff1a;自身的大小就是标签的大小&#xff0c;不会占一整行。大小不可调 例…

人工智能程序使用的编程语言

用C语言可以写人工智能程序吗&#xff1f; 可以用C语言编写具有人工智能功能的程序&#xff0c;但是较为复杂。C语言是一种通用的编程语言&#xff0c;它在执行速度和资源控制方面表现出色&#xff0c;这使得它适合于需要高性能处理的人工智能应用&#xff0c;如游戏AI&#xf…