稳定 softmax:先减最大值再取指数
对很大的 logits 直接取指数会溢出。概率公式在数学上有效,不代表朴素实现能在有限精度下稳定工作。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Let's build GPT: from scratch, in code
结合模型讲解理解本文实验的背景;正文提供可独立运行的简化示例。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
对很大的 logits 直接取指数会溢出。概率公式在数学上有效,不代表朴素实现能在有限精度下稳定工作。
理解核心机制
softmax 对全部输入同时加减一个常数保持不变。减去最大值后,最大的指数项变成一,其余不超过一,从而避免正向指数溢出。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。数字与样本均为教学演示,不代表真实模型或服务器的测量结果。
import math
logits = [1000.0, 1001.0, 999.0]
peak = max(logits)
weights = [math.exp(value - peak) for value in logits]
probabilities = [weight / sum(weights) for weight in weights]
assert abs(sum(probabilities) - 1.0) < 1e-12
assert probabilities.index(max(probabilities)) == 1
print(probabilities)适用边界与常见误区
全为负无穷、含 NaN 或空输入仍需特别处理。训练时通常使用框架提供的 log_softmax 或融合交叉熵算子,避免先取概率再取对数造成额外误差。
继续练习
把所有 logits 加上一个很大常数,验证概率不变;再比较直接实现与稳定实现的数值行为。