【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
标题
240、【AI】【模型部署】基座模型研究:logits 与 softmax
背景
上篇 blog
【AI】【模型部署】基座模型研究:反向传播的已知、所求与场景
把反向的工程视角讲清了:已知的是前向的产物、求的是每个参数的梯度,并完整推导了"softmax + 交叉熵的梯度恰好是p − y p-yp−y"——交叉熵的导数与 softmax 的导数相乘后相消,只剩预测减真实。
那个推导里有两个反复出现的符号:z zz(logits)和p pp(softmax 后的概率)。上篇直接用了它们,却没有解释 logits 到底是什么、softmax 又为什么要长成指数归一化的样子。本篇把这两个基础部件单独讲透——它们也是理解温度、采样与p − y p-yp−y的前提。
模型部署
只要有语言模型,就绕不开一条最基础的分工:输出头吐出 logits,softmax 把它变成概率。这条线上的每个性质——为什么 logits 可以是负数、为什么同加一个常数概率不变、为什么要减最大值、温度到底在调什么——都由 softmax 的数学形式决定。理解它,后面谈采样与损失都会顺很多。
🧩logits 是什么:一组未归一化的分数
logits是模型最后一层(输出头)输出的未归一化分数,形状是( B , S , V ) (B,S,V)(B,S,V)——批大小 × 序列长度 × 词表大小。也就是说,每个位置、每个候选 token,各对应一个实数分数。
它有两个容易困惑的性质:
- 可以为负:分数本来就该是任意实数,“负分"只是"相对不太可能”;
- 绝对值没有意义:z = [ 2 , 1 , 0.1 ] z=[2,1,0.1]z=[2,1,0.1]和z = [ 102 , 101 , 100.1 ] z=[102,101,100.1]z=[102,101,100.1]描述的是同一个偏好顺序,真正决定概率的是分数之间的差。
所以 logits 可以理解为"原始打分"——它保留了模型的全部偏好,但没有"非负且和为 1"的约束。
🧩logits 从哪来
输出头本质上是一个线性映射:把隐藏向量(维度d dd)投影到词表维(维度V VV)。以第 231 篇的微型模型为例,最后一步是
returnself.lm_head(self.norm(x))# (B,S,d) → (B,S,V)这里的lm_head是一个不带偏置的线性层。它输出的每一行,就是该位置对全部V VV个 token 的打分。有的模型会让输出头与输入嵌入矩阵共享权重(权重绑定,weight tying),既省参数,也让"表示"与"打分"共用同一套向量。
顺着形状看这一步更直观:归一化后的隐藏向量是( B , S , d ) (B,S,d)(B,S,d),lm_head的权重是( V , d ) (V,d)(V,d),一次线性映射就把最后一维从d dd换成V VV,得到( B , S , V ) (B,S,V)(B,S,V)——词表维正是在这里第一次出现。
📊logits 怎么变成概率:softmax
softmax 把一组 logits 压成一组概率:
p i = e z i ∑ j e z j p_i = \frac{e^{z_i}}{\sum_j e^{z_j}}pi=∑jezjezi
图 1 是一个 4 个候选的例子:logits[ 2.0 , 1.0 , 0.1 , − 1.0 ] [2.0,\,1.0,\,0.1,\,-1.0][2.0,1.0,0.1,−1.0]经过 softmax,变成概率[ 0.64 , 0.23 , 0.10 , 0.03 ] [0.64,\,0.23,\,0.10,\,0.03][0.64,0.23,0.10,0.03]——全部非负、加起来正好为 1,而且大小顺序不变。
用图 1 的数字走一遍算法:先对每个 logit 取指数,e 2.0 ≈ 7.39 e^{2.0}\approx7.39e2.0≈7.39、e 1.0 ≈ 2.72 e^{1.0}\approx2.72e1.0≈2.72、e 0.1 ≈ 1.11 e^{0.1}\approx1.11e0.1≈1.11、e − 1.0 ≈ 0.37 e^{-1.0}\approx0.37e−1.0≈0.37,总和约11.59 11.5911.59;再各自除以总和,就得到下面的概率:
| token | logitz zz | e z e^{z}ez | 概率p pp |
|---|---|---|---|
| A | 2.0 | 7.39 | 0.64 |
| B | 1.0 | 2.72 | 0.23 |
| C | 0.1 | 1.11 | 0.10 |
| D | -1.0 | 0.37 | 0.03 |
同一条链上,三个量容易混,放在一起对照:
| 量 | 取值范围 | 求和 | 角色 |
|---|---|---|---|
| logits | 任意实数 | 无约束 | 模型原始打分 |
| 概率p pp | [ 0 , 1 ] [0,1][0,1] | 1 | 归一化后的偏好 |
| 标签y yy | { 0 , 1 } \{0,1\}{0,1} | 1 | one-hot 真实答案 |
它为什么长这样?三个设计都各有目的:
- 取指数:把任意实数映射到正数,天然满足"概率非负";
- 除以总和:把所有值归一化,抓住"概率之和为 1";
- 指数放大差距:z zz差 1,概率就差e ≈ 2.7 e\approx 2.7e≈2.7倍,让"更偏好"体现得更明显。
📊softmax 的一个关键性质:平移不变
把上面三个 logits同时加 3,会得到什么?答案是概率完全不变:
图 2 说明了原因:softmax 分子分母里都有e z e^{z}ez,同乘一个因子e c e^{c}ec后上下约掉。也就是说,只有 logits 之间的差进入了概率,绝对值被彻底消掉。
这个性质有两层用处:一是解释了"为什么 logits 的绝对大小没意义";二是直接带来了工程上的稳定写法——既然减去一个常数不影响结果,那就减去最大值,让指数都不至于太大。
🧩数值稳定:先减最大值再取指数
如果不做处理,直接算e z e^{z}ez,一旦某个 logit 很大(比如 1000),指数就会溢出成无穷大,概率变成一堆nan:
图 3 对比了两种算法:直接算会溢出,先减最大值再算则安全——因为平移不变保证了结果一致。等价地,交叉熵也可以写成log-sum-exp形式(第 235 篇提过):
loss = log ∑ j e z j − z 正确 \text{loss} = \log\sum_j e^{z_j} - z_{\text{正确}}loss=logj∑ezj−z正确
这样就不必先算出一个极小的概率、再取对数导致下溢。
🧩三个常见疑问
softmax 的形式看起来"绕",其实每个设计都在回答一个反问:
- 为什么不用 argmax:argmax 只留一个 1、其余全 0,会丢掉"第二可能是什么"的信息,而且不可导;softmax 保留全部偏好、处处可导;
- 为什么不用简单归一化(除以总和):logits 可正可负、总和甚至可能为 0,直接除没有意义;取指数先把它们变成正数,归一化才有定义;
- 为什么非要用指数放大差距:放大让"更偏好"更突出,也让损失对"错得离谱"的惩罚更陡——这正是交叉熵能快速纠正错误的来源。
🧩温度:在 logits 上做除法
温度T TT的用法很简单:先把 logits 除以T TT,再做 softmax:
p i = e z i / T ∑ j e z j / T p_i = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}}pi=∑jezj/Tezi/T
因为只有"差"有意义,除以T TT相当于把 logits 的差距整体放大或缩小:
- T < 1 T<1T<1:差距被放大,分布更尖,更接近"只选最大";
- T > 1 T>1T>1:差距被缩小,分布更平,低概率 token 也有机会。
图 4 是同一个 logits 在T = 0.5 / 1 / 2 T=0.5/1/2T=0.5/1/2下的概率:T = 0.5 T=0.5T=0.5时最高项达到0.86 0.860.86,T = 2 T=2T=2时降到0.45 0.450.45——温度就是"确定与多样"之间的旋钮(第 236 篇讲过它如何调节生成)。注意它只改分布形状,不改 logits 的排序。
🧩同一个 softmax,也用在注意力里
softmax 并不只服务于输出层。注意力机制里,查询与键的相似度分数算出后,同样用 softmax 把它们变成"权重",再用这些权重对值向量v vv加权求和(第 242 篇展开)。可以说:凡是"把一组分数变成一组权重或概率",几乎都会用到 softmax。
🧩和p − y p-yp−y的联系
最后把话题接回上篇。反向里那个漂亮的梯度p − y p-yp−y,其中的p pp就是本节的 softmax 输出:
- 如果模型预测p i p_ipi高于真实y i y_iyi,梯度为正,把该 logit 往下压;
- 如果低于真实y i y_iyi,梯度为负,把它往上抬。
这也从另一个角度解释了 softmax 的意义:它不只是"把分数变成概率",还让损失对 logits 的梯度恰好等于概率与标签之差——预测越自信、错得越离谱,梯度就越大。这正是交叉熵"好训练"的数学根源(推导见第 239 篇)。
📌一句话记忆
logits 是输出头给出的、未归一化的分数(形状( B , S , V ) (B,S,V)(B,S,V),可负、绝对值无意义、只有差值有意义);softmax 用"取指数、除以总和"把它压成非负且和为 1 的概率,同时放大差距;由于平移不变,工程上先减最大值再取指数以保证数值稳定;温度是在 softmax 前对 logits 除法,用来调"确定与多样";softmax 输出的p pp与真实标签y yy之差,正是交叉熵对 logits 的梯度。
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【AI】【模型部署】基座模型研究:loss 面面观(交叉熵 / NLL / KL / 最大似然)