Softmax算法使用简介
全文链接:Softmax算法使用简介
Softmax 函数 把任意长度的实数向量(常称 logits )唯一地变换为同一长度 的向量:各分量在 (0,1) 上,且和为 1 ,因而常作为多类分类 输出层的归一化概率 表示。与 Sigmoid 处理二分类或逐元素"概率"不同,Softmax 在类别之间是互斥、竞争 的;实现上多配合 对数似然/交叉熵 作损失。在大语言模型 中,同一形式还用于下一词分布 与注意力权重 ;采样温度 在推理中调节下一词 Softmax 的尖锐/平坦 程度。本文从名称与来源、场景、定义与手算、温度等扩展 、LLM 与温度、与相近方法的差异及参考链接作一梳理。
一、名称由来与在学科中的位置
- 统计力学 / 玻尔兹曼分布 中,在能量状态 (E_i) 下占据概率与 (\exp(-E_i/kT)) 成比例、再归一化,与把 logits 作指数再归一化在形式上同源;化学势、配分函数的语境里常见这类「指数赋权 + 归一化」结构。
- 计量经济学、离散选择 中的 Multinomial Logit 把线性打分经 Softmax 得到各类别选择概率。
- 机器学习里 Softmax 回归 、卷积/全连接网络末端的 Softmax 层 、以及 word2vec 的层次 Softmax 等,名称 soft 与 argmax 的"硬"选择 形成对照:先保留各选项的相对大小 ,再平滑成可微的概率分布。
中文常直接称 软最大化 或音译/混用为 Softmax ;不是人名缩写,而是对「软化的最大值/类别分配」的习惯称呼。
二、数学定义与主要性质
对向量 (\mathbf{z}=(z_1,\ldots,z_C)^\top),其中 (C) 为类别数,Softmax 第 (k) 个分量为:
\\mathrm{softmax}(z_k) = \\frac{\\mathrm{e}^{z_k}}{\\sum_{j=1}^{C} \\mathrm{e}\^{z_j}}, \\quad k=1,\\ldots,C
主要性质:
- 非负 且 (\sum_k \mathrm{softmax}(z_k)=1),可解释为类别分布。
- 平移不变性:对任意常数 (c),用 (z_k+c) 代替 (z_k),结果不变(因分子分母同乘 (\mathrm{e}^{c}))。
- 同比例放大 会放大差异 :当某一 (z_k) 远大于其他分量时,对应概率趋近于 1 ;若各分量几乎相等,则各概率约 (1/C)。
- 数值实现上为防 (\mathrm{e}^{z}) 溢出,常先作 (\max_j z_j) 减到 logits 上(上式等价值不变),并常用 log-softmax 与负对数似然一体求梯度(见各框架文档)。
三、主要作用与典型使用场景
| 作用 | 说明 |
|---|---|
| 多类概率输出 | 将网络最后一层线性输出转为 C 个类的概率 ,与 交叉熵 损失自然衔接。 |
| 可微近似 argmax | 训练时保留梯度,推理时常取 (\arg\max_k) 作为预测类。 |
| 注意机制中的权重 | Transformers 里对 Query--Key 打分常经 Softmax(沿 key 维) 得到注意力权重 (行和为 1),语义是「在若干位置上分配比重」,与分类里的 Softmax 形式相同。 |
典型场景:
- 图像/文本/语音的 (C>2) 类 监督学习 输出层。
- 强化学习中 策略网络 对离散动作集合输出分布。
- 多标签 任务若允许多个类同时为真 ,通常不用 单通道 Softmax,而改用 C 个 Sigmoid 或专用结构(见下节「与 Sigmoid 的对比」)。
四、与相近方法的对比
| 方法 | 作用对象 | 输出约束 | 与 Softmax 的主要区别 |
|---|---|---|---|
| Softmax | 向量 (\mathbf{z}\in\mathbb{R}^C) | 长度 (C),和为 1,互斥解释 | 类别竞争 、多类单选的规范输出。 |
| Sigmoid / Logistic | 标量或逐分量 | 每个在 (0,1) ,不要求分量之和为 1 | 二分类 或 C 个独立 二值(多标签);不是一条 (C)-元单纯形上的点。 |
| Log-Softmax | 同 Softmax 输入 | (\log p_k) | 数值稳定、与 NLL 组合 为单 kernel,数学上等价 于先 Softmax 再 log(在稳定实现中更好)。 |
| Sparsemax 等 | 同维向量 | 可为稀疏、部分分量为 0 | 在「概率」与 0 之间可产生真稀疏 分配,用于需清晰截断时注意力的场合。 |
| Gumbel-Softmax | 同 Softmax 但带 Gumbel 噪声 + 温度 | 可微近似离散采样 | 用于可微离散 选择、VAE 离散隐变量等。 |
选型提示:
- 单标签多类 (每条样本恰属一类 ):输出层用 Softmax + 交叉熵。
- 多标签 (多个类可同时对 ):勿 用单 Softmax 表示联合分布;用 BCEWithLogits 或按类 Sigmoid 等。
五、超参数与常见扩展
标准 Softmax 本身 没有「学习率式」的独立超参;logits 由上游网络产生 ,温度 、标号平滑 等是工程上常用扩展。
| 名称 | 作用 | 说明 |
|---|---|---|
| 温度(Temperature)(T>0) | (\mathrm{softmax}(z_k/T)) 再归一化 | (T>1) 分布更平 、更「不确定」;(T<1) 更尖 、更自信。用于知识蒸馏 、校准 、探索 等。 |
| Label smoothing | 在交叉熵目标上把 one-hot 改为带小概率的软分布 | 不是 改 Softmax 公式本身,而是改训练目标;与 Softmax 输出常共同使用。 |
| Focal loss 等 | 对难样本/类别加权 | 损失 形式变化,Softmax 仍产生 (p_k)。 |
注意 :temperature=0 在定义上等价于不合法的「除以零」;实现上避免将 (T) 取为 0。
六、数值示例:三分类 logits 手算
设最后一层在三个类别 上得到 logits(未归一化打分)为:
\\mathbf{z} = (z_1, z_2, z_3) = (2.0,; 1.0,; 0.1)
(1)计算 (\mathrm{e}^{z_i})(可保留 3~4 位小数)
| 类别 | (z_i) | (\mathrm{e}^{z_i}) |
|---|---|---|
| 1 | 2.0 | (\mathrm{e}^{2.0} \approx 7.389) |
| 2 | 1.0 | (\mathrm{e}^{1.0} \approx 2.718) |
| 3 | 0.1 | (\mathrm{e}^{0.1} \approx 1.105) |
(2)求和
S = 7.389 + 2.718 + 1.105 = 11.212
(3)Softmax 概率 (p_i = \mathrm{e}^{z_i}/S)
| 类别 | 计算 | 概率 (p_i)(约) |
|---|---|---|
| 1 | (7.389/11.212) | 0.659(约 65.9%) |
| 2 | (2.718/11.212) | 0.242(约 24.2%) |
| 3 | (1.105/11.212) | 0.099(约 9.9%) |
校验 :(0.659+0.242+0.099=1.000)。可见 类 1 的 logit 最大,概率也最大 ;三个 logits 差距不大时,概率不会 出现「一类≈1」的极端尖峰。
(4)与「减常数(数值稳定)」等价
若先令 (\tilde z_i = z_i - \max z = z_i - 2.0),则 ((\tilde z_1,\tilde z_2,\tilde z_3) = (0, -1, -1.9))。
(\mathrm{e}0=1),(\mathrm{e}{-1}\approx 0.368),(\mathrm{e}^{-1.9}\approx 0.150),和 (\approx 1.518);
(p_1=1/1.518\approx 0.659),与上表相同 ,说明 平移不变 在计算中的用法。
(5)温度 (T=2) 时(作对比,非原题必须)
用 (z_i/T = z_i/2),得 ((1.0, 0.5, 0.05))。指数和约为 (2.718+1.649+1.051=5.418),对应概率更均匀 于三类的中间区域------直观上 T>1 软化 了类别间的差距。
七、代码示例(PyTorch)
python
import torch
import torch.nn.functional as F
# logits: 形状 (batch, C);此处 1 个样本 3 类
logits = torch.tensor([[2.0, 1.0, 0.1]])
probs = F.softmax(logits, dim=1) # 在类别维上归一化
# tensor([[0.6590, 0.2424, 0.0993]]) # 与第六节手算在浮点下一致
# 实际训练更常用 log 概率 + NLL 或一次交叉熵(内部稳定)
# loss = F.cross_entropy(logits, target) # target 为类索引 0..C-1
scikit-learn 在 无 softmax 层封装时,逻辑回归 多类在内部使用 logistic multinomial ;与深度网络对接时,以框架(PyTorch / TensorFlow / JAX)文档为准。
八、优点、缺点与使用注意
8.1 优点
- 概率解释清晰 ,与最大似然/交叉熵 一致,利于分类任务沟通与度量和校准(配合 ECE、温度标定 等)。
- 处处可微 (在实数域内),端到端反传自然。
- 与 one-hot 标签、KL、蒸馏 等标准流程兼容好。
8.2 缺点与注意
- 大 logits 差 时,概率极尖 ,梯度在错误类 上可能很小(饱和感 与优化动态相关,可用更好的初始化、残差、LayerNorm、标签平滑、温度 等缓解)。
- 互斥 假设不符合多标签 时误用,会导致理论目标与问题不匹配。
- 类不均衡 时单用 Softmax+CE 可能偏向多数类 ;可配合 重采样、loss 加权、Focal、LDAM 等,而非改动 Softmax 形式本身(视任务定)。
8.3 与聚类/预处理的说明
- Z-score 等 作用于特征尺度 ;Softmax 作用于 分类头 logits 或注意力权重的归一化 ,二者在流水线中的位置与目的均不同。
- 聚类 中若用 Softmax 式相似度 (如 Gumbel/锐化),多属可微聚类/分配 的特例,非与 Z-score 同一层面的预处理问题。
九、大模型(LLM)中的 Softmax 与采样温度
在大语言模型 与视觉-语言大模型中,Softmax 的数学形式与第五节相同 ,但出现位置 与温度在推理中的用法 值得单独说清,以免与分类头、蒸馏等语境混淆。
9.1 Softmax 在 LLM 中主要出现在哪里
| 位置 | 维数/对象 | 作用简述 |
|---|---|---|
| 下一词(token)分布 | 词表大小 (V) 的 logits,经 Softmax 得 (P(t_{i+1}\mid t_{\le i})) | 自回归 每步都是一次超大维多类 Softmax;贪心 即对该分布取 arg max。 |
| 自注意力 | 对 key 维 (或头内键位置 维)Softmax | 将「与 query 的(缩放)点积分」归一为权重,在值向量上做凸组合。 |
| 专家路由、对比学习等 | 因实现而异 | 常见仍是 (\exp) 加归一 的竞争 结构,有的带路由温度 或 Top-k/Top-1 路由。 |
要点 :分类网络 的 Softmax 在「选一类 」;生成式 LLM 的 next-token Softmax 在「在词表上选下一个离散单元 (或再配合采样再选)」 ;注意力的 Softmax 在「在序列位置上分配权重 」**------公式同类,语义不同。
9.2 推理采样与温度:如何改变「下一词」分布
在非贪心 的随机解码中,常对 logits 先除以正数 (T) (采样温度 ),再作 Softmax,再按该分布抽取下一 token:
P(w) ;=; \\frac{\\exp(\\ell_w / T)}{\\sum_{w'\\in\\mathcal{V}}\\exp(\\ell_{w'}/T)}
其中 (\ell_w) 为词元 (w) 的 logit。这与第五节 (\mathrm{softmax}(z_k/T)) 的写法一致 ;在 LLM 语境下,温度调节的是「生成时」的探索性 (实现上通常只改进入 Softmax 前的 logits 缩放)。
| 温度 (T) | 对 Softmax 概率 的影响 | 对文本的常见主观效果(不绝对) |
|---|---|---|
| 很小((\to 0^+))** | 分布极度尖锐 ,几乎 one-hot 在最大 logit 上 | 接近贪心解码 ,重复、套话风险有时更高。 |
| (T=1) | 与「未再缩放的 logits 上的 Softmax」一致 | 作为基线与不同 (T)、Top-p 组合对照。 |
| (T>1) | 拉平 相对差距,熵 增大,长尾 token 更易被采到 | 更随机、更多样 ;亦可能更不连贯 ,需任务与评测定夺。 |
| (0<T<1) | 放大 logit 差距,分布更尖 | 更聚焦 头部词,更保守、确定性感增强。 |
与 Top-p / Top-k 的关系(简要):
- 温度 是对全词表 上分布形状的整体调节;
- Top-k 只保留概率最高的 k 个再归一化;Top-p(核采样) 自高概率起累加至累计概率 ≥ p 的集合内再采;二者多用来避免极低概率的劣质长尾 ,与温度常联用 (实现顺序 以各引擎说明为准,如 Hugging Face
GenerationConfig中的temperature、top_p、top_k)。
9.3 与「知识蒸馏里温度」的区分
- 蒸馏 :训练阶段让学生网络的 logits 也除以 (T) 再 Softmax,与教师对齐软分布 ,目的是迁移暗知识(见第五节及蒸馏论文)。
- 推理采样温度 :在已训练好 的模型上,为控制随机性 而设;不必然与蒸馏的 (T) 取同一数值含义。
- 共同点 :都使用 (\exp(\cdot/T)) + 归一 这一结构;勿混用 「训练 T」与「部署时的 sampling temperature」的调参表。
9.4 实践提示
- 各框架默认值不同 ;改温度前先读 当下使用的 Ollama / vLLM / llama.cpp / 云 API 说明。
- 束搜索、投机解码 等路径对「温度」的参与方式 与纯采样可能不同,以官方文档为准。
- 若注意力 在实现里对 logits 有 (\sqrt{d_k}) 等缩放 ,那是点积注意力的标度 ;与词表级采样的温度 作用于不同张量,勿混为一谈。
十、小结
| 维度 | 要点 |
|---|---|
| 本质 | 对 logits 指数化再归一化 ,得到单纯形上的概率分布。 |
| 来源 | 与统计力学、多项 logit 同构;soft 相对 argmax 的"硬"选择。 |
| 场景 | 多类单标签 、策略离散动作、注意权重 等。 |
| 大模型 | 逐 token 的 (V) 类 Softmax、注意力 的键维 Softmax;采样温度 在推理时调节 (\exp(\ell/T)) 分布的尖锐/平坦程度。 |
| 超参 | 标准式无;温度 、标签平滑 为常见训练/采样侧扩展。 |
| 对比 | Sigmoid/多 Sigmoid 服务二值/多标签 ;log-softmax 服务稳定与 NLL ;Sparsemax 等 服务稀疏竞争。 |
十一、参考与官方文档类链接
- PyTorch ---
torch.nn.functional.softmax - PyTorch ---
torch.nn.CrossEntropyLoss(含 log-softmax + NLL 的常见用法) - TensorFlow ---
tf.nn.softmax - Wikipedia --- Softmax function
- Stanford CS231n --- Softmax 分类器(Softmax 损失与数值计算提示)
- Goodfellow, Bengio, Courville --- Deep Learning ,第 6 章 深度前馈网络 / Softmax 输出(以中译本或官网章节为准)
- scikit-learn ---
LogisticRegression(multinomial)(线性 多类 logit 与深度网络中 Softmax 在数学上同属一类,实现接口不同) - Hugging Face Transformers ---
GenerationConfig(temperature/top_p/top_k)(推理采样参数说明,版本以当前文档为准) - Attention Is All You Need(Scaled Dot-Product Attention 中 Softmax 的用法)
- Hinton 等,Distilling the Knowledge in a Neural Network(蒸馏 中的温度 与 Softmax;与生成采样温度目的不同,可对照**§9.3**)