当前位置: 首页 > news >正文

AI 术语通俗词典:Softmax 函数

Softmax 函数是深度学习、分类模型、神经网络和人工智能中非常常见的一个术语。它用来描述一种把多个原始分数转换成概率分布的方法。换句话说,Softmax 函数是在回答:模型已经给每个类别算出了一个分数,怎样把这些分数变成“各类别可能性”的概率。

如果说神经网络的最后一层会输出一组类别得分,那么 Softmax 函数就是把这些得分转换成可比较、可解释的概率。因此,Softmax 常用于多分类任务、神经网络输出层、交叉熵损失、文本分类、图像分类、语言模型和注意力机制,是理解分类模型输出的重要基础概念。

一、基本概念:什么是 Softmax 函数

Softmax 函数(Softmax Function)是一种把一组实数转换成概率分布的函数。

假设模型对 K 个类别输出了一组原始分数:

Softmax 会把第 k 个类别的分数 zₖ 转换为概率 pₖ:

其中:

• zₖ 表示第 k 个类别的原始分数

• pₖ 表示第 k 个类别经过 Softmax 后的概率

• K 表示类别总数

• e 表示自然常数

• 分母表示所有类别指数值之和

Softmax 输出满足两个条件:

并且:

也就是说,Softmax 输出的每个值都在 0 到 1 之间,并且所有类别概率加起来等于 1。

从通俗角度看,Softmax 可以理解为:把多个类别的“竞争分数”转换成“概率份额”。

例如,模型对三类图片给出原始分数:

猫:2.0狗:1.0鸟:0.1

这些分数本身不是概率,不能直接解释为“猫的概率是 2.0”。

经过 Softmax 后,它们会变成一组概率,例如:

猫:约 0.66狗:约 0.24鸟:约 0.10

这时就可以理解为:模型认为这张图片最可能是猫。

二、为什么需要 Softmax 函数

Softmax 之所以重要,是因为多分类模型通常不会直接输出概率,而是先输出一组原始分数。

在神经网络中,最后一层通常会产生一个向量:

这些 z 值通常称为:

• logits

• 原始分数

• 未归一化得分

它们可以是任意实数:

[2.4, -0.7, 5.1, 0.3]

这些数值本身有大小关系,但不满足概率要求:

• 可能大于 1

• 可能小于 0

• 总和不一定等于 1

因此,如果希望模型输出“属于每个类别的概率”,就需要一个转换函数。

Softmax 的作用就是:把任意实数分数转换成一个合法的概率分布。

从通俗角度看:

• 神经网络最后一层:给每个类别打分

• Softmax 函数:把这些分数变成概率

这在多分类任务中非常重要。

例如,在手写数字识别中,模型需要判断图片属于 0 到 9 中的哪一类。

输出层会产生 10 个分数,Softmax 会把这 10 个分数转换成 10 个概率:

数字 0:0.01数字 1:0.02数字 2:0.03……数字 7:0.88……

最终,模型通常选择概率最大的类别作为预测结果。

三、Softmax 的核心公式

Softmax 的核心公式为:

这个公式可以分成两步理解。

1、指数变换

首先,对每个分数取指数:

指数函数有两个作用。

第一,它会把任意实数变成正数。

例如:

z = 2 → e² > 0z = 0 → e⁰ = 1z = -3 → e⁻³ > 0

这样可以保证 Softmax 的分子为正数。

第二,它会放大较大分数之间的差异。

例如:分数差 1,在指数后会变得更明显;分数差 3,在指数后会变得非常明显。

因此,原始分数较高的类别会获得更大的概率。

2、归一化

然后,把每个指数值除以所有指数值之和:

这一步使所有输出加起来等于 1。

因此,Softmax 的输出可以被看作概率分布。

从通俗角度看:Softmax 先把所有类别分数变成正数,再按它们的相对大小分配概率。

分数越高,概率越大;分数越低,概率越小;所有类别共同竞争一个总量为 1 的概率空间。

四、如何直观理解 Softmax

Softmax 最核心的直觉是:它不是单独看某个类别的分数,而是看这个类别相对于其他类别有多强。

例如,有三组 logits:

情况 A:[2, 1, 0]情况 B:[10, 9, 8]情况 C:[2, 2, 2]

情况 A 中,第一个类别最高,所以它概率最大。

情况 B 中,虽然分数整体都比情况 A 大很多,但三个分数之间的相对差距仍然是 1 和 2。Softmax 更关心相对差距,而不是绝对大小。

情况 C 中,三个类别分数完全相同,因此 Softmax 会输出均匀概率:

[1/3, 1/3, 1/3]

从通俗角度看,Softmax 像是在分蛋糕:

• 每个类别的指数分数决定它能分到多少

• 分数高的类别分得多

• 分数低的类别分得少

• 所有类别加起来刚好分完整个蛋糕

因此,Softmax 输出的不是孤立概率,而是各类别之间竞争后的结果。

需要注意:Softmax 不会改变分数的大小顺序。

如果 z₁ 最大,那么 Softmax 后的 p₁ 也最大。

因此,预测类别通常可以直接取 logits 最大值,也可以取 Softmax 后概率最大值,二者类别结果相同。

不过,Softmax 后的概率更适合用于解释和计算损失。

五、Softmax 与 Sigmoid 的区别

Softmax 经常和 Sigmoid 函数放在一起比较。

1、Sigmoid 适合二分类或多标签任务

Sigmoid 函数公式为:

它把一个实数压缩到 0 到 1 之间。

在二分类任务中,可以用 Sigmoid 输出正类概率:

例如:

• 是否为垃圾邮件:是 / 否

• 是否患病:是 / 否

• 是否点击广告:是 / 否

Sigmoid 也常用于多标签分类。

多标签任务中,一个样本可以同时属于多个类别。

例如,一张图片可以同时包含:

人、狗、汽车、街道

这时每个标签都可以独立判断是否存在。

2、Softmax 适合互斥多分类任务

Softmax 适合多分类任务,尤其是类别互斥的情况。

例如:

• 手写数字只能是 0 到 9 中的一个

• 一张动物图片只标为猫、狗、鸟中的一个

• 新闻主题只归入一个主类别

Softmax 会让所有类别共享一个概率总和:

这表示各类别之间是竞争关系。

3、二者的直观区别

可以简单理解为:

• Sigmoid:每个类别单独判断“是不是”

• Softmax:多个类别一起竞争“是哪一个”

例如:

• 多标签任务:一张图片可以既有“人”又有“车” → 用 Sigmoid

• 多分类任务:一张图片只能属于“猫 / 狗 / 鸟”之一 → 用 Softmax

从通俗角度看:Sigmoid 像多个独立开关;Softmax 像多个候选答案抢一个总概率。

六、Softmax 与交叉熵损失

Softmax 常常和交叉熵损失一起使用。

在多分类任务中,模型先输出 logits:

然后用 Softmax 得到预测概率:

如果真实类别是第 c 类,那么交叉熵损失可以写为:

其中:

• L 表示损失

• p_c 表示模型分配给真实类别的概率

这个公式的含义是:模型给真实类别的概率越高,损失越小;给真实类别的概率越低,损失越大。

例如,真实类别是“猫”:

模型给“猫”的概率是 0.90 → 损失较小模型给“猫”的概率是 0.10 → 损失较大

如果真实标签使用 one-hot 编码:

交叉熵可以写为:

其中:

• yₖ 表示第 k 类的真实标签

• 如果第 k 类是真实类别,则 yₖ = 1

• 否则 yₖ = 0

由于只有真实类别位置为 1,所以这个式子本质上仍然等价于:

从通俗角度看:Softmax 负责把分数变成概率,交叉熵负责惩罚模型没有把足够高的概率给真实类别。

这就是多分类神经网络训练中非常常见的组合。

七、Softmax 在注意力机制中的作用

Softmax 不只用于分类输出层,也广泛用于注意力机制。

在 Transformer 的缩放点积注意力中,公式为:

其中:

• Q 表示查询矩阵

• K 表示键矩阵

• V 表示值矩阵

• QKᵀ 表示 Query 与 Key 的相似度分数

• dₖ 表示键向量维度

• Softmax 把相似度分数转换成注意力权重

在这里,Softmax 的作用不是输出类别概率,而是输出注意力权重。

这些权重同样满足:

其中:

• αᵢ 表示第 i 个位置的注意力权重

• 权重越大,表示模型越关注该位置

从通俗角度看,在注意力机制中:Softmax 把“相关性分数”转换成“关注比例”。

例如,当模型处理某个词时,会计算它与其他词的相关性。

Softmax 会把这些相关性分数转换为权重:

关注第 1 个词:0.10关注第 2 个词:0.65关注第 3 个词:0.25

然后模型根据这些权重加权汇总信息。

因此,Softmax 是注意力机制中“分配关注度”的关键步骤。

八、Softmax 的数值稳定性问题

Softmax 公式中包含指数函数:

如果 zₖ 很大,指数值可能非常大,导致计算机溢出。

例如:e¹⁰⁰⁰,这个数非常巨大,普通浮点计算可能无法表示。

为了解决这个问题,实际计算 Softmax 时通常会先减去最大值:

其中:

• z_max 表示所有 logits 中的最大值

这种变换不会改变 Softmax 的结果。

原因是对所有 z 同时减去同一个常数,不会改变相对比例:

其中 c 可以取 z_max。

从通俗角度看:减去最大值只是为了让数字更安全,不会改变各类别之间的相对竞争关系。

因此,在手写 Softmax 函数时,推荐使用稳定版本:

z = z - np.max(z)

在深度学习框架中,通常不需要手动处理,因为框架内部已经做了数值稳定优化。

另外,在训练分类模型时,很多框架会把 Softmax 和交叉熵合并实现,例如 PyTorch 的 CrossEntropyLoss。

这通常比先手动 Softmax 再计算交叉熵更加稳定。

九、Softmax 的优势、局限与使用注意事项

1、Softmax 的主要优势

Softmax 最大的优势是可以把任意实数分数转换成概率分布。

它让多分类模型的输出更容易解释:

• 每个类别一个概率

• 所有概率加起来等于 1

• 概率最大者通常作为预测类别

其次,Softmax 保留了类别之间的相对竞争关系。

分数越高的类别,得到的概率越大。

再次,Softmax 可以和交叉熵损失自然配合,形成多分类神经网络的标准训练方式。

从通俗角度看,Softmax 的优势在于:它把模型的多个类别打分,转换成一组可比较的概率。

2、Softmax 的主要局限

Softmax 也有局限。

首先,Softmax 适合互斥多分类,不适合多标签分类。

如果一个样本可以同时属于多个类别,Softmax 的“总和为 1”会强迫类别竞争,可能不合理。

其次,Softmax 输出的概率不一定是真正可靠的置信度。

神经网络有时会过度自信,即使预测错误,也可能给出很高概率。

再次,Softmax 对 logits 的相对差距很敏感。

如果某个类别分数明显大于其他类别,它可能获得非常接近 1 的概率。

此外,Softmax 本身不负责学习,它只是一个转换函数。模型能否预测准确,仍取决于特征表示、网络结构、训练数据和损失函数。

3、使用 Softmax 时需要注意的问题

使用 Softmax 时,需要注意以下几点:

• 互斥多分类任务适合使用 Softmax

• 多标签任务通常使用 Sigmoid

• 训练时通常搭配交叉熵损失

• 不要把 logits 直接当成概率

• 手写 Softmax 时要注意数值稳定性

• 在 PyTorch 中使用 CrossEntropyLoss 时,不要先手动 Softmax

• Softmax 概率高不一定等于模型绝对可靠

从实践角度看,Softmax 是多分类输出层中的基础工具,但它输出的是模型归一化后的概率估计,不应被无条件当作真实置信度。

十、Python 示例

下面给出几个简单示例,用来帮助理解 Softmax 函数的计算和使用。

示例 1:手动实现 Softmax

import numpy as np def softmax(z): """Softmax函数:将分数向量转换为概率分布""" exp_z = np.exp(z) # 对每个分数取指数 return exp_z / np.sum(exp_z) # 归一化,使总和为1 # 三个类别的原始分数scores = np.array([2.0, 1.0, 0.1]) # 转换为概率分布probabilities = softmax(scores) print("原始分数:", scores)print("Softmax 概率:", probabilities)print("概率总和:", probabilities.sum()) # 验证和为1

这个例子中,Softmax 会把三个类别分数转换成概率分布。

需要注意,这个版本没有处理数值稳定性。如果分数很大,可能出现溢出。

示例 2:数值稳定版本 Softmax

import numpy as np def stable_softmax(z): """数值稳定的Softmax函数(通过减去最大值防止溢出)""" z = z - np.max(z) # 减去最大值,使最大值为0,避免exp(z)过大 exp_z = np.exp(z) # 计算指数 return exp_z / np.sum(exp_z) # 归一化为概率分布 # 大数值分数(直接exp会导致溢出)scores = np.array([1000.0, 999.0, 998.0]) probabilities = stable_softmax(scores) print("Softmax 概率:", probabilities)print("概率总和:", probabilities.sum())

这个版本先减去最大值,可以避免指数函数溢出。

从数学上看,减去同一个常数不会改变 Softmax 输出结果,只是让计算更稳定。

示例 3:Softmax 与预测类别

import numpy as np def stable_softmax(z): """数值稳定的Softmax函数(减去最大值防止溢出)""" z = z - np.max(z) # 平移输入,使最大值为0 exp_z = np.exp(z) # 指数运算 return exp_z / np.sum(exp_z) # 归一化得到概率 # 类别名称class_names = ["猫", "狗", "鸟"] # 模型输出的原始分数(logits)scores = np.array([2.0, 1.0, 0.1]) # 转换为概率分布probabilities = stable_softmax(scores) # 取概率最大的类别作为预测结果pred_index = np.argmax(probabilities) # 最大概率的索引pred_class = class_names[pred_index] # 索引对应的类别名 print("类别概率:")for name, prob in zip(class_names, probabilities): print(name, ":", prob) print("预测类别:", pred_class)

这个例子展示了多分类预测的基本过程:

logits → Softmax 概率 → 选择概率最大类别

因为 Softmax 不改变分数大小顺序,所以 np.argmax(scores) 和 np.argmax(probabilities) 会得到相同类别。

示例 4:PyTorch 中的 Softmax 与 CrossEntropyLoss

import torchimport torch.nn as nn # 模型输出的原始分数(logits):1个样本,3个类别logits = torch.tensor([[2.0, 1.0, 0.1]]) # 真实类别索引(0表示第一类,如"猫")target = torch.tensor([0]) # 通过Softmax将logits转换为概率分布(dim=1表示对类别维度)probabilities = torch.softmax(logits, dim=1)print("Softmax 概率:", probabilities) # 交叉熵损失:结合了LogSoftmax + NLLLoss,直接输入logits和标签loss_fn = nn.CrossEntropyLoss()loss = loss_fn(logits, target) print("交叉熵损失:", loss.item()) # 损失 = -ln(softmax概率对应真实类的值)

需要注意:nn.CrossEntropyLoss() 接收的是 logits,而不是已经经过 Softmax 的概率。

也就是说,PyTorch 内部会完成类似 LogSoftmax + Negative Log Likelihood 的稳定计算。

因此,使用 CrossEntropyLoss 时,通常不要在模型输出后手动加 Softmax。

📘 小结

Softmax 函数是一种把多个原始分数转换成概率分布的函数,常用于互斥多分类任务的输出层。它通过指数变换放大分数差异,再通过归一化使所有类别概率之和为 1。Softmax 常与交叉熵损失配合使用,也常出现在注意力机制中,用来把相关性分数转换成注意力权重。对初学者而言,可以把 Softmax 理解为:让多个类别根据模型打分共同竞争一个总概率,分数越高,分到的概率越大。

“点赞有美意,赞赏是鼓励”

http://www.jsqmd.com/news/821117/

相关文章:

  • Navicat Mac版试用期重置指南:3种简单方法解除14天限制
  • 2026金色铜钱珠手串哪个口碑好:问菩文创口碑榜首 - 19120507004
  • 如何在Photoshop中一键安装AI绘画插件:SD-PPP终极指南
  • QModMaster终极指南:开源免费的ModBus调试神器,5个理由让你立刻爱上它!
  • JetBrains IDE试用期重置终极指南:如何免费获得30天完整试用期
  • 为什么你的“Château Margaux”印相总像海报?——深度拆解顶级酒庄视觉DNA:橡木桶纹理采样率、标签压纹深度与AI光影映射函数
  • Laravel-admin图表组件终极指南:从零实现ECharts与Chart.js数据可视化
  • Tesseract OCR 3步快速上手:从零开始实现图片文字识别
  • 番茄小说下载器:终极免费工具,永久保存你喜爱的小说 [特殊字符]
  • 2026国风招财手串哪个好:问菩文创招财臻品 - 17329971652
  • 不只有token,AI自己的DDA时代要来了吗?
  • Python小说爬虫框架NovelClaw:模块化设计与规则驱动实践
  • 5个高效Acton团队协作工作流:从代码管理到测试验证全指南
  • Amphenol ICC RJE1Y62C0527E401线束技术解析
  • UniPush 2.0 从零到一:手把手实现全平台消息推送
  • 告别重装系统!在Ubuntu 22.04上从零到一搞定ROS2 Humble(附小乌龟测试)
  • 夏天晚上适合点什么夜宵外卖?上美团搜本地必点榜闭眼选不踩雷 - 资讯焦点
  • 开源桌面宠物开发指南:从Electron架构到行为定制全解析
  • Trigger.dev与GitOps集成:自动化工作流任务调度的终极指南
  • 如何高效使用AutoJs6智能录制功能:3大核心优势完整指南
  • Arduino开发板选型指南:从性能、接口到场景化决策
  • 国内信创电脑代工企业实力排行:合规与产能双维度对比 - 奔跑123
  • 想用Windows电脑语音控制小爱音箱播放音乐吗?xiaomusic让你轻松实现
  • Formal验证签核深度解析:从COI、Proof Core到Mutation,你的覆盖率真的够了吗?
  • Tableau筛选器太乱?教你一招,只显示“全部”和常用项(保姆级教程)
  • STM32H743XIH6实战:用CubeMX搞定TIM6定时器中断和USART1串口通信(附完整代码)
  • 终极指南:Adobe GenP 3.0 - 专业破解Adobe Creative Cloud全系列软件
  • AI 术语通俗词典:GELU 函数
  • Win10 64位系统下,Questasim 10.6c安装破解保姆级避坑指南(附资源)
  • Spek:免费开源的声音可视化工具,让音频分析变得简单