【CUDA】

笔者在学习Softmax实现时遇到了一个问题,很多文章直接将softmax的计算分成了五个过程,而没有解释每个过程的含义,尤其是在阅读这篇文章时,作者想计算最基本的softmax的效率,以展示可行的优化空间:
在这里插入图片描述
贴一个gpt写的解释,个人感觉还蛮清楚的,至于为什么要减去每行的最大值,是为了使大整数运算转化为0-1的小数运算,以避免溢出。

Softmax 函数是深度学习和机器学习中常用的一种激活函数,它将输入向量转换为概率分布。具体地,softmax 函数接受一个输入向量并将其转换为概率向量,输出向量的每个元素表示输入向量中对应元素的概率。Softmax 函数的计算涉及以下五个步骤:

1. ReduceMax

目的:找到每一行的最大值。

操作

  • 对于每一行,找到该行的最大值。这用于后续步骤的数值稳定性。

内存访问

  • 读取:需要读取整个矩阵的所有元素,总共是 D 次读取。
  • 写入:需要将每一行的最大值写入到一个数组中,总共是 num_rows 次写入。

总内存访问D + num_rows

2. BroadcastSub

目的:将每个元素减去其所在行的最大值。

操作

  • 将每个元素减去其所在行的最大值,这样可以避免数值溢出(数值稳定性技巧)。

内存访问

  • 读取:需要读取整个矩阵的所有元素(D 次),以及每一行的最大值(num_rows 次),总共是 D + num_rows 次读取。
  • 写入:需要将结果写回到矩阵中,总共是 D 次写入。

总内存访问2 * D + num_rows

3. Exp

目的:对每个元素计算指数函数(exp)。

操作

  • 计算每个元素的指数函数值 exp(x)

内存访问

  • 读取:需要读取整个矩阵的所有元素,总共是 D 次读取。
  • 写入:需要将结果写回到矩阵中,总共是 D 次写入。

总内存访问2 * D

4. ReduceSum

目的:计算每一行的总和。

操作

  • 对于每一行,计算其所有元素的和。这用于将指数函数值标准化为概率。

内存访问

  • 读取:需要读取整个矩阵的所有元素,总共是 D 次读取。
  • 写入:需要将每一行的总和写入到一个数组中,总共是 num_rows 次写入。

总内存访问D + num_rows

5. BroadcastDiv

目的:将每个元素除以其所在行的总和。

操作

  • 将每个元素除以其所在行的总和,使得每一行的元素之和为 1,从而形成概率分布。

内存访问

  • 读取:需要读取整个矩阵的所有元素(D 次),以及每一行的总和(num_rows 次),总共是 D + num_rows 次读取。
  • 写入:需要将结果写回到矩阵中,总共是 D 次写入。

总内存访问2 * D + num_rows

Softmax 过程总结

这五个步骤构成了 softmax 函数的计算过程,具体如下:

  1. ReduceMax:找到每一行的最大值以进行数值稳定性处理。
  2. BroadcastSub:将每个元素减去所在行的最大值。
  3. Exp:对每个元素计算指数函数。
  4. ReduceSum:计算每一行的元素和。
  5. BroadcastDiv:将每个元素除以所在行的和,形成概率分布。

每个步骤的内存访问模式和计算方式都是为了确保整个 softmax 计算过程的数值稳定性和准确性,同时在尽量减少全局内存访问次数以优化性能。

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

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

相关文章

MybatisX插件的简单使用教程

搜索mybatis 开始生成 module path:当前项目 base package:生成的包名,建议先独立生成一个,和你原本的项目分开 encoding:编码,建议UTF-8 class name strategy:命名选择 推荐选择camel:驼峰命…

Centos下rpm和yum执行卡住问题(已解决)

问题描述 执行rpm和yum卡住, 没有任何报错信息,且无法 ctrl c 终止,只能通过后台 kill -9 杀死。 问题排查: 查看yum日志:yum -vv 软件包 会发现卡在 loading keyring from rpmdb,即load DB存在问题。 …

MSPM0G3507——MPU6050读取数据显示在OLED上

移植的立创L1306的部分代码,亲测能用,要源码的评论即可,在CCSTHEIA打开

【代码管理的必备工具:Git的基本概念与操作详解】

一、Git 初识 1.提出问题 不知道你工作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防止⽂档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,比如: “…

推荐几款漂亮的代码字体

Visual Studio Code 中字体看时间长了就会产生幻觉,于是今天看到有人推荐漂亮的代码字体,于是自己也推荐几款: 需要注意的是,大部分网上的教程都建议使用混合字体,即使用微软雅黑与某种等宽字体混合。但事实上&#x…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码:https://github.com/chongzhou96/MaskCLIP 论文:https://arxiv.org/abs/2112.01071 摘要 对比语言-…

接口测试分析、设计以及实现

接口相关理论 ui功能测试和接口测试哪个先执行?–为什么 结论:接口测试先执行 原因:ui功能测试需要等待前端页面开发完成、后台接口开发完后且前端与后端联调完成。ui功能测试与接口测试的区别? ui功能:功能调用&am…

windows上传app store的构建版本简单方法

我们在上传app store上架,或上传到testflight进行ios的app测试的时候,需要mac下的上传工具上传ipa文件到app store的构建版本上。 然而windows电脑这些工具是无法安装的。 因此,假如在windows上开发hbuilderx或uniapp的应用,可以…

程序升级bootloader

文章目录 概述什么是bootloader?为什么用?bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机,上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…

Halcon 产品周围缺口检测

*读取一张图像read_image (Image, 原图.jpg)*获取图像大小get_image_size(Image, Width, Height)*关闭已经打开的窗口dev_close_window ()*打开新窗口dev_open_window(0, 0, Width, Height, black, WindowHandle) //打开指定大小的窗口*对图像进行阈值操作threshold (Image, R…

【eMTC】eMTC 窄带以及带宽的关系

1 概述 eMTC 传输进行通信时,一般采用1.4M带宽,在和LTE小区联合部署时,需要将LTE的带宽分割成以1.4M带宽为粒度的单位,这个单位在协议上叫做窄带。 2 窄带定义 3 参考文献 36.211

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。然而,面对海量的图片资源,如何高效管理、快速处理,成为了许多人头疼的问题。今天,我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

【沐风老师】3DMAX样条线增强工具SplinePro使用方法详解

3DMAX样条线增强工具SplinePro使用教程 3DMAX样条线增强工具SplinePro,允许创建选定的多条样条曲线形状的轮廓并删除交叉点。 【适用版本】 3dMax2019 - 2025 【安装方法】 1.解压缩后,确认SplinePro-0.2.0.mse和logo.png两个文件在同一文件夹中。 2.…

python+django 环境搭建以及post接口封装

1、搭建pythondjango环境 python 3.7.9的版本 具体参考之前的安装教程 django 使用 pip install django 会自动安装 检验安装版本: python -m django --version 2、创建django项目 django-admin startproject projectname 启动项目:python manage.py…

verilog读写文件注意事项

文章目录 想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内,想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内,想要的16进制数是二进制格式提供的文件,想将16进制数提取到变量内&#xff0c…

大模型在营销领域的探索及创新

1 AIGA介绍 2 AIGA在营销领域的 应用和探索 3 总结与展望

【WPF】桌面程序开发之xaml页面基础布局方式详解

使用Visual Studio开发工具,我们可以编写在Windows系统上运行的桌面应用程序。其中,WPF(Windows Presentation Foundation)项目是一种常见的选择。然而,对于初学者来说,WPF项目中xaml页面的布局设计可能是一…

MySQL8.0在windows下的下载安装及详细使用

下载mysql8.0二进制包 下载地址:MySQL :: Download MySQL Community Server 编辑my.ini配置文件 解压二进制包,新建/编辑my.ini配置文件(如果不存在则新建) [client] #客户端设置,即客户端默认的连接参数 # 设置mysql客户端连接服务端时…

Python【打包exe文件两步到位】

Python打包Exe 安装 pyinstaller(pip install pyinstaller) 执行打包命令(pyinstaller demo.py) 打完包会生成 dist 文件夹,如下如

openrestry中的hello world

目录 概述实践部署openrestry脚本效果验证 概述 此篇将在 k8s 运行起一个 openrestry   环境:k8s:1.27.9 ,openrestry(docker镜像版本): 1.25.x ,k8s 与 ingress 请参考我的其它文章 离线镜像包请参考:op…