【白话机器学习系列】白话 Softmax

news2025/5/24 22:31:47

在这里插入图片描述

文章目录

    • 什么是 Softmax
    • Softmax 函数详解
    • 示例
    • 编程实现
    • 对矩阵应用 Softmax 函数

什么是 Softmax

Softmax 函数,又称归一化指数函数,它使用指数函数将输入向量归一化为概率分布(每一个元素的范围都在 ( 0 , 1 ) (0,1) (0,1) 之间,并且所有元素的和为 1 1 1)。Softmax 函数多用于多分类问题中。

Softmax 函数能够将一个包含 K K K 个实数值的向量 z ⃗ \vec z z “压缩”到另一个 K K K 个实数值的向量 σ ( z ⃗ ) \sigma(\vec z) σ(z ),这些值的总和为 1 1 1。输入值可以是正数、负数、零或大于 1 1 1,但 Softmax 会将它们转换为 0 0 0 1 1 1 之间的值,以便可以解释为概率。如果某个输入值很小或为负,Softmax 会将其转换为小概率;如果输入值较大,则转换为大概率,但始终保持在 0 0 0 1 1 1 之间。

Softmax 是逻辑回归的一个泛化形式,可以用于多类分类,其公式与用于逻辑回归的 Sigmoid 函数非常相似。Softmax 函数只能在类别互斥时用于分类器。

在许多多层神经网络中,倒数第二层会输出一些未便于缩放的实数分数,这可能难以处理。在这种情况下,Softmax 很有用,因为它能够将这些分数转换为归一化的概率分布,既可以显示给用户,也可以作为其他系统的输入。因此,通常会将 Softmax 函数附加为神经网络的最终层。

Softmax 函数详解

Softmax 函数的定义如下:

公式图像
σ ( z ⃗ ) i = e z i ∑ j = 1 K e z j \qquad \qquad \qquad \sigma(\vec z)_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} \qquad \qquad \qquad σ(z )i=j=1Kezjezi在这里插入图片描述

输入是一个包含 K K K 个元素的向量 z ⃗ = [ z 0 , z 1 , … , z K ] \vec z = [z_0, z_1, \dots, z_K] z =[z0,z1,,zK],其中不带箭头的 z z z 表示向量的一个元素。例如 z ⃗ = [ 2 , 3 , 5 , 8 ] → { z 1 = 2 z 2 = 3 x 3 = 5 z 4 = 8 \vec z = [2,3,5,8] \rarr \begin{cases}z_1 = 2 \\ z_2 = 3 \\ x_3 = 5 \\ z_4=8\end{cases} z =[2,3,5,8] z1=2z2=3x3=5z4=8
分子部分,Softmax 对向量的每个元素应用指数函数,对于最大的输入值返回最大的输出值。任何负数也变为正数,因为指数的值域为 ( 0 , ∞ ) (0, \infty) (0,)。这可以通过查看指数函数的图像,或者通过检验下面的区间知晓。
( e − ∞ = 1 e ∞ = 0 , e ∞ = ∞ ) \Big(e^{-\infty} = \frac{1}{e^\infty} = 0, e^\infty = \infty\Big) (e=e1=0,e=)
分母部分,Softmax 通过求和确保函数的总和为 1 1 1,从而将每个元素归一化,形成一个概率分布。所有经过指数化的元素会被加在一起,因此当每个指数化的元素除以这个总和时,它就表示为这个总和的一部分。例如 [ 2 , 3 , 5 , 8 ] [2,3, 5, 8] [2,3,5,8] 的指数化元素求和为:
∑ j = 1 4 e z j = e 2 + e 3 + e 5 + e 8 \sum_{j=1}^4 e^{z_j} = e^2+e^3+e^5+e^8 j=14ezj=e2+e3+e5+e8

示例

我们以 z ⃗ = [ 2 , 3 , 5 , 8 ] \vec z = [2,3,5,8] z =[2,3,5,8] 为例,演示 Softmax 的计算过程。
i = 1 σ ( z ⃗ ) 1 = e 2 e 2 + e 3 + e 5 + e 8 = 0.00234 i = 2 σ ( z ⃗ ) 2 = e 3 e 2 + e 3 + e 5 + e 8 = 0.00636 i = 3 σ ( z ⃗ ) 3 = e 5 e 2 + e 3 + e 5 + e 8 = 0.04702 i = 4 σ ( z ⃗ ) 4 = e 8 e 2 + e 3 + e 5 + e 8 = 0.94428 i=1 \quad \sigma(\vec z)_1 = \frac{e^2}{e^2+e^3+e^5+e^8} = 0.00234 \\ i=2 \quad \sigma(\vec z)_2 = \frac{e^3}{e^2+e^3+e^5+e^8} = 0.00636 \\ i=3 \quad \sigma(\vec z)_3 = \frac{e^5}{e^2+e^3+e^5+e^8} = 0.04702 \\ i=4 \quad \sigma(\vec z)_4 = \frac{e^8}{e^2+e^3+e^5+e^8} = 0.94428 i=1σ(z )1=e2+e3+e5+e8e2=0.00234i=2σ(z )2=e2+e3+e5+e8e3=0.00636i=3σ(z )3=e2+e3+e5+e8e5=0.04702i=4σ(z )4=e2+e3+e5+e8e8=0.94428
最终输出为 [ 0.00234 , 0.00636 , 0.04702 , 0.94428 ] [0.00234, 0.00636, 0.04702, 0.94428] [0.00234,0.00636,0.04702,0.94428],所有元素之和为 1 1 1。最小的输入值 2 2 2 输出最小的概率;最大的输入值 8 8 8 输出最大的概率。

编程实现

Pytorch 中自带 Softmax 函数实现 nn.Softmax(),我们也可以根据 Softmax 函数的定义手动编程实现 Softmax 函数。

import torch

# 创建输入向量
z = torch.Tensor([2, 3, 5, 8])

# 实现 softmax 函数
softmax = torch.exp(z) / torch.sum(torch.exp(z))
tensor([0.0023, 0.0064, 0.0470, 0.9443])

对矩阵应用 Softmax 函数

对矩阵应用 Softmax 并不是很多人想当然的那样,将每一个元素的指数除以所有元素的指数和,而是每个元素只与自己所在得向量进行 Softmax 运算。具体来说,对于下面的矩阵
M = [ [ 1 , 2 , 3 ] [ 4 , 5 , 6 ] [ 7 , 8 , 9 ] ] M=\begin{bmatrix} [1, 2, 3] \\ [4, 5, 6] \\ [7, 8, 9] \end{bmatrix} M= [1,2,3][4,5,6][7,8,9]
我们其实是一行一行地对每个向量应用 Softmax。
i = 1 , j = 1 σ ( M ) 1 , 1 = e 1 e 1 + e 2 + e 3 = 0.0900 i = 1 , j = 2 σ ( M ) 1 , 2 = e 2 e 1 + e 2 + e 3 = 0.2447 i = 1 , j = 3 σ ( M ) 1 , 3 = e 3 e 1 + e 2 + e 3 = 0.6652 i = 2 , j = 1 σ ( M ) 2 , 1 = e 4 e 4 + e 5 + e 6 = 0.0900 i = 2 , j = 2 σ ( M ) 2 , 2 = e 5 e 4 + e 5 + e 6 = 0.2447 i = 2 , j = 3 σ ( M ) 2 , 3 = e 6 e 4 + e 5 + e 6 = 0.6652 i = 3 , j = 1 σ ( M ) 3 , 1 = e 7 e 7 + e 8 + e 9 = 0.0900 i = 3 , j = 2 σ ( M ) 3 , 2 = e 8 e 7 + e 8 + e 9 = 0.2447 i = 3 , j = 3 σ ( M ) 3 , 3 = e 9 e 7 + e 8 + e 9 = 0.6652 i=1, j=1 \quad \sigma(M)_{1,1} = \frac{e^1}{e^1+e^2+e^3} = 0.0900 \\ i=1, j=2 \quad \sigma(M)_{1,2} = \frac{e^2}{e^1+e^2+e^3} = 0.2447 \\ i=1, j=3 \quad \sigma(M)_{1,3} = \frac{e^3}{e^1+e^2+e^3} = 0.6652 \\ i=2, j=1 \quad \sigma(M)_{2,1} = \frac{e^4}{e^4+e^5+e^6} = 0.0900 \\ i=2, j=2 \quad \sigma(M)_{2,2} = \frac{e^5}{e^4+e^5+e^6} = 0.2447 \\ i=2, j=3 \quad \sigma(M)_{2,3} = \frac{e^6}{e^4+e^5+e^6} = 0.6652 \\ i=3, j=1 \quad \sigma(M)_{3,1} = \frac{e^7}{e^7+e^8+e^9} = 0.0900 \\ i=3, j=2 \quad \sigma(M)_{3,2} = \frac{e^8}{e^7+e^8+e^9} = 0.2447 \\ i=3, j=3 \quad \sigma(M)_{3,3} = \frac{e^9}{e^7+e^8+e^9} = 0.6652 \\ i=1,j=1σ(M)1,1=e1+e2+e3e1=0.0900i=1,j=2σ(M)1,2=e1+e2+e3e2=0.2447i=1,j=3σ(M)1,3=e1+e2+e3e3=0.6652i=2,j=1σ(M)2,1=e4+e5+e6e4=0.0900i=2,j=2σ(M)2,2=e4+e5+e6e5=0.2447i=2,j=3σ(M)2,3=e4+e5+e6e6=0.6652i=3,j=1σ(M)3,1=e7+e8+e9e7=0.0900i=3,j=2σ(M)3,2=e7+e8+e9e8=0.2447i=3,j=3σ(M)3,3=e7+e8+e9e9=0.6652
用代码实现就是

x = torch.Tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

softmax = torch.exp(x) / torch.sum(torch.exp(x), axis=1, keepdims=True)

其中 axis=1 表示按行求和,keepdims = True 用于保持矩阵的形状。输出结果如下:

tensor([[0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652]])

上面的输出,每一行相加的都等于 1 1 1。有趣的是输出结果中三个向量的值是相同的,这完全是巧合,因为
σ ( M ) 1 , 1 = e 1 e 1 + e 2 + e 3 = e e ( 1 + e + e 2 ) = 1 1 + e + e 2 σ ( M ) 2 , 1 = e 4 e 4 + e 5 + e 6 = e 4 e 4 ( 1 + e + e 2 ) = 1 1 + e + e 2 σ ( M ) 3 , 1 = e 7 e 7 + e 8 + e 9 = e 7 e 7 ( 1 + e + e 2 ) = 1 1 + e + e 2 \sigma(M)_{1,1} = \frac{e^1}{e^1+e^2+e^3} = \frac{e}{e(1+e+e^2)} = \frac{1}{1+e+e^2}\\ \sigma(M)_{2,1} = \frac{e^4}{e^4+e^5+e^6} = \frac{e^4}{e^4(1+e+e^2)} = \frac{1}{1+e+e^2}\\ \sigma(M)_{3,1} = \frac{e^7}{e^7+e^8+e^9} = \frac{e^7}{e^7(1+e+e^2)} = \frac{1}{1+e+e^2}\\ σ(M)1,1=e1+e2+e3e1=e(1+e+e2)e=1+e+e21σ(M)2,1=e4+e5+e6e4=e4(1+e+e2)e4=1+e+e21σ(M)3,1=e7+e8+e9e7=e7(1+e+e2)e7=1+e+e21
再实际开发中,我们不会自己实现 Softmax 函数,而是直接调用 Pytorch 库自带的 nn.Softmax() 函数。

import torch.nn as nn

x = torch.Tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

softmax_layer = nn.Softmax(dim=1)

output = softmax_layer(x)
tensor([[0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652]])

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

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

相关文章

thinkphp6配置多应用项目及多域名访问路由app配置

这里写一写TP6下配置多应用。TP6默认是单应用模式(单模块),而我们实际项目中往往是多应用的(多个模块),所以在利用TP6是就需要进行配置,开启多应用模式。 1、安装ThinkPHP6 1.1安装ThinkPHP6.…

无人机航测技术算法概述!

一、核心技术 传感器技术: GPS/GLONASS:无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机:用于拍摄地面图像,通过后续图像处理生成三维模型。 激光雷达(LiDAR):通过激光扫…

Linux网络——套接字编程

目录 1. 网络通信基本脉络 2. 端口号 ① 什么是套接字编程? ② 端口号 port && 进程 PID 3. 网络字节序 4. 套接字编程 ① UDP版 ② TCP版 5. 改进方案与拓展 ①多进程版 ②多线程版 ③线程池版 ④守护进程化 1. 简单的重联 2. session &…

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作,实现了数据自动采集、处理及报告生成,大幅提高了校准精度与效率,并有效降低了人为操作误差。 一、项目背景…

【Java】JDK集合类源码设计相关笔记

文章目录 前言1. Iterable2. RandomAccess2.1 RandomAccess 使用索引进行二分查找 3. Map3.1 HashMap3.2 IdentityHashMap 4. Collections 工具类4.1 Collections.shuffle() 洗牌 前言 目的: 收集JDK集合类的类图。记录一些有意思的设计。将之前写过的文章建立联系。 1. Ite…

macbook外接2k/1080p显示器调试经验

准备工具 电脑 满足电脑和显示器要求的hdmi线或者转接头或者扩展坞 betterdisplay软件 Dell P2419H的最佳显示信息如下 飞利浦 245Es 2K的最佳显示比例如下 首选1152

Stable Diffusion的解读(二)

Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…

Github 2024-11-16Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Go项目1Python项目1Lapce:用 Rust 编写的极快且强大的代码编辑器 创建周期:2181 天开发语言:Rust协议类型:Apache License 2.0St…

Redis作为分布式锁,得会避坑

日常开发中,经常会碰到秒杀抢购等业务场景。为了避免并发请求造成的库存超卖等问题,我们一般会用到Redis分布式锁。但是使用Redis分布式锁之前要知道有哪些坑是需要我们避过去的。 1. 非原子操作(setnx expire) 一说到实现Redis…

Qt、C++实现五子棋人机对战与本地双人对战(高难度AI,极少代码)

介绍 本项目基于 Qt C 实现了一个完整的五子棋游戏,支持 人机对战 和 人人对战 模式,并提供了三种难度选择(简单、中等、困难)。界面美观,逻辑清晰,是一个综合性很强的 Qt 小项目 标题项目核心功能 棋盘…

Vulnhub靶场案例渗透[12]-Grotesque: 1.0.1

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 目录扫描4. 敏感信息获取5. 反弹shell6. 权限提升 一、靶场搭建 1. 靶场描述 get flags difficulty: medium about vm: tested and exported from vi…

git日志查询和导出

背景 查看git的提交记录并下载 操作 1、找到你idea代码的路径,然后 git bash here打开窗口 2、下载所有的日志记录 git log > commit.log3、下载特定日期范围内记录 git log --since"2024-09-01" --until"2024-11-18" 你的分支 > c…

LeetCode Hot100 15.三数之和

题干: 思路: 首先想到的是哈希表,类似于两数之和的想法,共两层循环,将遍历到的第一个元素和第二个元素存入哈希表中,然后按条件找第三个元素,但是这道题有去重的要求,哈希表实现较为…

Vue3、Vite5、Primevue、Oxlint、Husky9 简单快速搭建最新的Web项目模板

Vue3、Vite5、Oxlint、Husky9 简单搭建最新的Web项目模板 特色进入正题创建基础模板配置API自动化导入配置组件自动化导入配置UnoCss接入Primevue接入VueRouter4配置项目全局环境变量 封装Axios接入Pinia状态管理接入Prerttier OXLint ESLint接入 husky lint-staged&#xf…

基于深度学习的文本信息提取方法研究(pytorch python textcnn框架)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Linux(命令格式详细+字符集 图片+大白话)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

机器学习中的概率超能力:如何用朴素贝叶斯算法结合标注数据做出精准预测

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

01 —— Webpack打包流程及一个例子

静态模块打包工具 静态模块:html、css、js、图片等固定内容的文件 打包:把静态模块内容,压缩、转译等 Webpack打包流程 src中新建一个index.js模块文件;然后将check.js模块内的两个函数导入过来,进行使用下载webpack…

时间类的实现

在现实生活中,我们常常需要计算某一天的前/后xx天是哪一天,算起来十分麻烦,为此我们不妨写一个程序,来减少我们的思考时间。 1.基本实现过程 为了实现时间类,我们需要将代码写在3个文件中,以增强可读性&a…