Logits、Softmax 与概率输出底层图谱
从 hidden state、LM head、vocab logits、softmax、logprob、cross entropy 到 token 概率,理解模型“打分”怎样变成训练损失和生成候选
Token IDs
词表坐标
→
Transformer
上下文表示
→
Hidden State
[batch, seq, hidden]
→
LM Head
hidden → vocab
→
Logits
[batch, seq, vocab]
→
Probability
softmax / logprob
| 对象 | 它是什么 | 典型 shape | 工程直觉 |
| Hidden state | Transformer 每个位置最后得到的上下文向量 | [batch, seq, hidden] | 它不是词,也不是答案,而是当前位置对上下文的内部表示 |
| LM head | 把 hidden 维度投影到 vocab 维度的输出层 | [hidden, vocab] | 每个 token 都会得到一个分数;词表越大,输出维度越大 |
| Logits | softmax 之前的原始分数 | [batch, seq, vocab] | 只能比较相对大小,还不能当作概率直接读 |
| Vocabulary axis | 所有候选 token 的离散坐标 | vocab_size | tokenizer 决定候选集合;禁词、bias、schema 约束都要落到 token 级 |
| Selected position | 通常用最后一个位置预测下一个 token | [batch, vocab] | 聊天模型不是一次生成整段,而是每一步预测下一个 token |
一句话:
语言模型最后并不是直接吐出文字,而是在词表坐标上给每个候选 token 打分;文字输出来自后续的概率归一化、采样和解码循环。
| 特性 | 含义 | 为什么重要 | 常见误解 |
| 相对性 | logits 的绝对值不如差值重要 | 第一名和第二名差距能反映候选竞争程度 | 把一个 logit 数字单独当置信度 |
| 可平移 | 所有 logits 同加一个常数,softmax 后概率不变 | 数值实现会先减最大值,避免指数溢出 | 以为 logits 必须落在固定范围 |
| 未归一化 | 还没有变成总和为 1 的分布 | 需要 softmax 或 log-softmax 才能得到概率 / logprob | 直接把 logit 当百分比 |
| 可被调制 | temperature、logit bias、mask、约束解码会改动它 | 产品参数和安全策略常常在 logits 层生效 | 以为 prompt 是唯一控制手段 |
| 词表依赖 | 每个分数对应一个具体 token id | 同一字符串可能拆成多个 token,控制必须对齐 tokenizer | 把“词”的控制误认为 token 控制 |
为什么输出层经常和 embedding 共享权重
很多语言模型会把输入 embedding 矩阵和输出 LM head 绑定或共享。直觉上,输入端把 token id 映射成向量,输出端则把隐藏向量投回 token 空间。这能减少参数量,也让输入输出共享同一个词表坐标系。
| 步骤 | 发生什么 | 要抓住的直觉 | 工程风险 |
| 指数化 | 把每个 logit 变成正数权重 | 差距会被指数放大,最高分候选更突出 | 大数指数可能溢出,需要数值稳定技巧 |
| 归一化 | 除以所有候选权重之和 | 所有 token 概率加起来等于 1 | 概率会随候选集合和 mask 改变 |
| 温度缩放 | softmax 前把 logits 除以 temperature | 低温让分布更尖,高温让分布更平 | 低温不保证正确,高温不等于创造力 |
| log-softmax | 直接得到 logprob | 训练和评测常用 log 概率,数值更稳定 | 不要先 softmax 再取 log 做低精度训练 |
温度低
分布更尖,top token 更容易被选中。适合格式严格、事实型、工具参数等稳定性优先场景,但不能修复缺证据或模型不知道的问题。
温度高
分布更平,低概率候选有更多机会出现。适合开放写作和探索,但会增加跑题、格式破坏和事实错误的概率。
温度为 0 的产品含义
通常表示走近似 greedy / deterministic 路径,而不是数学上的 softmax temperature 等于 0。不同服务实现可能有细节差异。
| 概念 | 它回答什么 | 训练 / 评测中怎么用 | 注意点 |
| Probability | 某个 token 在当前上下文下被选中的概率 | 解码、top tokens、候选比较 | 单 token 概率不等于整段答案正确 |
| Logprob | 概率取对数后的分数 | 累加序列分数、比较候选、计算困惑度 | 长度越长,logprob 累加通常越小,需要长度归一化 |
| NLL | 真实下一个 token 的负 logprob | 模型越不认为真实 token 该出现,NLL 越大 | 标签对齐、mask、padding 错了会污染损失 |
| Cross Entropy | 模型分布和目标分布之间的差距 | next-token prediction 的核心 loss | 常和 log-softmax 融合实现,避免数值不稳定 |
| Perplexity | 模型对序列平均有多“困惑” | 语言建模评估和数据分布比较 | 不能直接等同于任务质量、事实性或用户满意度 |
训练时到底在优化什么
最常见的语言模型训练目标是:给定前面的 token,最大化真实下一个 token 的 logprob。换成 loss 说法,就是最小化真实 token 的 negative log likelihood / cross entropy。模型不是被直接教“真理”,而是被训练成在上下文条件下预测训练分布里的下一个 token。
| 层级 | 怎么算 | 能说明什么 | 不能说明什么 |
| 单 token 概率 | 当前上下文下某个 token 的 softmax 概率 | 下一步候选的局部偏好 | 不能保证整句事实正确 |
| 序列 logprob | 逐 token logprob 相加 | 整段文本在模型分布下是否顺 | 不能直接比较不同长度、不同任务的答案质量 |
| 平均 logprob | 序列 logprob 按 token 数归一 | 减少长度偏置,适合候选重排 | 仍然不等于业务正确性 |
| Top tokens | 观察概率最高的若干候选 | 能看出模型在几个词之间犹豫什么 | 只看 top-1 会漏掉分布形状和不确定性 |
| Margin / entropy | 比较第一名差距或分布分散程度 | 可作为不确定性、路由和拒答信号之一 | 低熵也可能是稳定地错 |
最大坑:
高概率表示“在当前上下文和训练分布下更像下一步”,不表示“外部世界里一定为真”。事实性、权限、引用、工具执行和业务后果必须另接校验层。
解码与采样
temperature、top-k、top-p、beam search 和停止条件都建立在 logits / probability 之上,决定下一步选哪个 token。
结构化输出
JSON、函数参数、枚举值和 DSL 都要落回 token 序列;schema 或约束解码本质上是在候选 token 空间里收窄合法路径。
分类与路由
当输出空间很小且标签 token 稳定时,可以用候选 logprob 做分类、意图识别或模型路由,但要做校准和回归测试。
风险与拒答
top token margin、entropy、自一致性和 logprob 可作为风险信号,但不能单独决定高风险业务是否放行。
训练与微调
cross entropy、label mask、assistant-only loss、packing 和 padding 都会改变哪些 token 参与学习。
评测与观测
logprob、困惑度、候选分布和异常高置信错误可进入离线评测与线上 trace,帮助定位模型为什么这样答。
| 证据节点 | 必须记录的字段 | 用来判断什么 |
| 候选分布 | generation_id、step_index、top_tokens、top_logprobs、entropy | 模型是在多个候选间犹豫,还是高置信地产生错误 token? |
| 控制参数 | temperature、top_p、top_k、logit_bias、repetition_penalty | 输出变化来自模型能力、上下文变化,还是采样参数和 bias? |
| 结构约束 | schema_id、allowed_token_set、blocked_token_set、constraint_violation | JSON、工具参数、枚举和 DSL 为什么解析失败或被约束解码卡住? |
| 风险信号 | confidence_margin、refusal_token_score、unsafe_token_score、calibration_bucket | logprob 能否作为风险线索,哪些场景必须交给外部校验或人工门? |
| 输出血缘 | hidden_state_snapshot_id、decoder_step_id、finish_reason、trace_id | 最终文本里的某个 token 能否追溯到当时的分布和控制决策? |
| 症状 | 优先怀疑 | 先检查什么 | 继续下钻 |
| 模型输出总是偏某个词 | logit bias、模板诱导、数据偏置或温度过低 | top tokens、原始 prompt、生成参数、tokenizer 切分 | 解码 / 采样 |
| 分类 logprob 看起来不稳定 | 标签词被切成多个 token,或候选词不等价 | 每个标签的 token ids、长度归一、label verbalizer | Tokenizer / 词表 |
| 训练 loss 异常高 | label shift、mask、padding 或 vocab 对不齐 | input_ids / labels 对齐、ignore_index、特殊 token | 优化器 / Loss |
| 低温仍然幻觉 | 模型缺知识、上下文缺证据或问题前提错误 | 检索证据、引用一致性、不可回答样本 | 能力边界 / 幻觉 |
| 结构化输出偶发非法 | 自然语言采样没有被严格约束 | schema、约束解码、解析失败重试、stop sequence | Tool Calling |
误区:logits 越大模型越确信
logits 要看相对差距和归一化后的分布,单个原始分数没有稳定可比的置信含义。
误区:softmax 概率就是事实概率
softmax 概率是模型条件分布里的 token 概率,不是外部世界命题为真的概率。
误区:只要看 top-1 就够了
top-1 丢掉了候选差距、熵、备选路径和不确定性,很多调试信息都在 top tokens 里。
误区:cross entropy 低就代表产品好
语言建模 loss 只是基础目标;产品还要看事实性、安全、工具执行、延迟、成本和用户任务成功。
这张图在主线里的位置
Tokenizer 定义 token 坐标,Transformer 生成上下文向量,LM head 把向量投回词表 logits,softmax / logprob 把分数变成训练损失和候选分布。再往后,概率校准页讨论这些信号能不能支撑可信决策,解码页讨论怎样选择 token,评测页讨论最终输出在任务上是否真的可用。