Softmax:多分类的"权重路由"
本节要解决什么问题
后端工程师对一个请求进来后"该路由到哪个服务"不陌生。常见做法是给每个服务打一个分,然后按分数权重来决定路由比例:分数越高,被选中的概率越高。
这就是 Softmax 在做的事:把一组实数分数,转换成概率分布。只不过它不是做简单的归一化,而是用指数函数把差异放大——分数高的服务不仅"概率更高",而是"概率高得多"。
这个设计让模型在分类时不仅能说"我是猫",还能表达"我有 87% 的把握是猫,12% 可能是狗,剩下 1% 可能是其他"。这种概率化的输出,是后续损失函数(交叉熵)能够量化"预测质量"的前提。
这个工具/机制是怎么工作的
从分数到概率:四步走
假设模型最后一层输出了三个分数(logits):
logits = [2.0, 1.0, 0.1] # 对应"猫"、"狗"、"鸟"三个类别
第一步:指数化(放大差异)
exp(2.0) = 7.39
exp(1.0) = 2.72
exp(0.1) = 1.11
指数函数的核心特性:差 1 分,概率比约差 2.7 倍;差 2 分,约差 7.4 倍。 大比分差会被指数放大成悬殊的胜率。
第二步:求和归一化
sum = 7.39 + 2.72 + 1.11 = 11.22
第三步:计算概率
p_猫 = 7.39 / 11.22 ≈ 0.659
p_狗 = 2.72 / 11.22 ≈ 0.242
p_鸟 = 1.11 / 11.22 ≈ 0.099
第四步(工程细节):数值稳定
当 logits 中出现大数值时(如 1000), exp(1000) 会溢出。工程上采用"平移技巧":
Softmax(z_i) = exp(z_i - max(z)) / Σ exp(z_j - max(z))
减去最大值后,最大的 logit 变成 0(exp(0) = 1),其余都是负数,exp(负数) 最多下溢到 0 而不会 NaN。数学上结果完全等价。
Softmax 在 Attention 中的角色
在 Transformer 的 Attention 机制中,Softmax 扮演了关键角色:
Query 和 Key 计算相似度分数
│
▼
[ Softmax ] ← 把原始分数归一化成注意力权重
│
▼
按权重对 Value 加权求和
Attention 的核心公式:
Attention(Q, K, V) = softmax(QK^T ÷ √(d_k)) × V
QK^T ÷ √(d_k) 得到一组相似度分数(logits),Softmax 将其转换为概率分布(注意力权重),决定"在当前位置,应该多大程度地参考其他位置的信息"。
为什么 Attention 必须用 Softmax,而不是其他归一化? 因为 Softmax 有几个关键特性:
- 输出在 (0,1) 且和为 1(合法的概率分布)
- 保持顺序(logit 最高的 key 获得的注意力权重最高)
- 可微(反向传播时梯度能流回去)
- 负无穷的 logit 会趋近于零(完全忽略),正无穷趋近于 one-hot(完全聚焦)
形式化
Softmax 的标准定义:
Softmax(z_i) = e^(z_i) ÷ Σ(j=1, K) e^(z_j), i = 1, …, K
其中 K 是类别数,z_i 是第 i 类的 logit(未归一化分数)。
数值稳定版本:
def stable_softmax(logits):
max_logit = max(logits)
exps = [exp(x - max_logit) for x in logits]
sum_exps = sum(exps)
return [p / sum_exps for p in exps]
本节小结
Softmax 把"证据累加"(logits,加法世界)转化为"概率比"(probability,乘法世界),是分类网络输出概率分布的标准方式,也是 Attention 机制中生成注意力权的核心组件。