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 机制中生成注意力权的核心组件。

延伸阅读

  • 激活函数 — Softmax 本质上也是一种激活函数(输出层用),了解它和其他激活函数的分工
  • 交叉熵损失 — Softmax 输出的概率交给交叉熵来衡量预测质量,两者组合是分类任务的黄金搭档

results matching ""

    No results matching ""