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)
1
2
3
4
5
6
7
8
9
10
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)
