240、【AI】【模型部署】基座模型研究:logits 与 softmax

发布时间:2026/10/2 2:26:15
240、【AI】【模型部署】基座模型研究:logits 与 softmax
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除标题240、【AI】【模型部署】基座模型研究logits 与 softmax背景上篇 blog【AI】【模型部署】基座模型研究反向传播的已知、所求与场景把反向的工程视角讲清了已知的是前向的产物、求的是每个参数的梯度并完整推导了softmax 交叉熵的梯度恰好是p − y p-yp−y——交叉熵的导数与 softmax 的导数相乘后相消只剩预测减真实。那个推导里有两个反复出现的符号z zzlogits和p ppsoftmax 后的概率。上篇直接用了它们却没有解释 logits 到底是什么、softmax 又为什么要长成指数归一化的样子。本篇把这两个基础部件单独讲透——它们也是理解温度、采样与p − y p-yp−y的前提。模型部署只要有语言模型就绕不开一条最基础的分工输出头吐出 logitssoftmax 把它变成概率。这条线上的每个性质——为什么 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 怎么变成概率softmaxsoftmax 把一组 logits 压成一组概率p i e z i ∑ j e z j p_i \frac{e^{z_i}}{\sum_j e^{z_j}}pi​∑j​ezj​ezi​​图 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再各自除以总和就得到下面的概率tokenlogitz zze z e^{z}ez概率p ppA2.07.390.64B1.02.720.23C0.11.110.10D-1.00.370.03同一条链上三个量容易混放在一起对照量取值范围求和角色logits任意实数无约束模型原始打分概率p pp[ 0 , 1 ] [0,1][0,1]1归一化后的偏好标签y yy{ 0 , 1 } \{0,1\}{0,1}1one-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{正确}}losslogj∑​ezj​−z正确​这样就不必先算出一个极小的概率、再取对数导致下溢。三个常见疑问softmax 的形式看起来绕其实每个设计都在回答一个反问为什么不用 argmaxargmax 只留一个 1、其余全 0会丢掉第二可能是什么的信息而且不可导softmax 保留全部偏好、处处可导为什么不用简单归一化除以总和logits 可正可负、总和甚至可能为 0直接除没有意义取指数先把它们变成正数归一化才有定义为什么非要用指数放大差距放大让更偏好更突出也让损失对错得离谱的惩罚更陡——这正是交叉熵能快速纠正错误的来源。温度在 logits 上做除法温度T TT的用法很简单先把 logits 除以T TT再做 softmaxp i e z i / T ∑ j e z j / T p_i \frac{e^{z_i/T}}{\sum_j e^{z_j/T}}pi​∑j​ezj​/Tezi​/T​因为只有差有意义除以T TT相当于把 logits 的差距整体放大或缩小T 1 T1T1差距被放大分布更尖更接近只选最大T 1 T1T1差距被缩小分布更平低概率 token 也有机会。图 4 是同一个 logits 在T 0.5 / 1 / 2 T0.5/1/2T0.5/1/2下的概率T 0.5 T0.5T0.5时最高项达到0.86 0.860.86T 2 T2T2时降到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 / 最大似然