2026年10月5日
05 输出层:下一个 token 的概率
这一步是整个推理过程的"出口":模型经过几十层计算后,如何把内部的向量变成"下一个 token 是什么"的概率。
从向量到分数
经过所有 Transformer 层之后,每个位置都有一个长度为 dimension 的向量,它已经融合了整个上下文的信息。预测下一个 token 时,模型只取最后一个位置的向量。比如输入"今天天气很",就取"很"这个位置的向量,因为它已经通过注意力"看过"了前面所有内容。
接下来,用这个向量去乘一个输出矩阵,大小是 dimension × 词表大小。结果是一个长度等于词表大小的数字列表,比如 10 万个数字,每个数字对应词表中一个 token 的"得分"。这些原始得分叫 logits,可以是任意实数,有正有负,比如:
"好" 8.2、"热" 7.7、"冷" 7.2、"糟" 5.9 …… "汽车" −3.1 ……
这一步的直觉和注意力打分很像:输出矩阵里每个 token 都有一个对应的向量,用最后位置的向量和它们逐一做点积,方向越一致的 token 得分越高。很多模型甚至直接复用输入端的 embedding 表作为输出矩阵,进出用同一套"词向量"。
从分数到概率:softmax
Logits 不能直接当概率用,所以要经过 softmax 函数:对每个分数取指数(e 的 x 次方),再除以所有结果的总和。这样处理后,所有数值都变成正数,加起来恰好等于 1,并且分数高的放大、分数低的压缩。前面的 8.2 和 7.7 只差 0.5,经过指数运算后差距被拉开,就变成了"好" 40%、"热" 25% 这样的分布。词表中绝大多数 token 的概率会小到几乎为零,但不会真正等于零。
上次讲的 temperature,正是在这一步起作用:把 logits 先除以 temperature,再做 softmax。 温度小于 1 时分数差距被放大,分布更"尖",高概率选项更占优势;温度大于 1 时差距被缩小,分布更"平"。所以它调整的就是这个概率分布的陡峭程度。
训练时,这个概率就是"考卷"
这个概率分布也是计算损失的地方。训练时,模型已经知道正确答案,比如原文中下一个字是"热"。损失函数(交叉熵)的计算方式非常直接:看模型给正确答案分配了多少概率,取负对数。 如果给"热"分配了 25%,损失约为 1.39;如果分配了 90%,损失约为 0.1;如果只分配了 1%,损失高达 4.6。然后通过梯度下降调整参数,提高正确答案的概率。
还有一个效率上的细节:推理时只用最后一个位置,但训练时每个位置都在同时预测它的下一个 token。一段 1000 个 token 的文本,一次计算就能得到 999 道"考题"。这得益于因果遮罩:每个位置只能看到前面的内容,所以不会作弊。
这个概率意味着什么
理解这一步,有助于看清 LLM 的一个根本特性:模型每一步都必须给出一个概率分布,然后从中选一个 token,不存在"我不确定所以不输出"的选项。 即使模型对某个事实毫无把握,比如一个冷门人物的生日,它也会给各种日期分配概率,然后选出一个,而且用流畅的语气写出来。这就是"幻觉"产生的机制之一:生成的流畅度和内容的正确性,在这个层面上是两回事。
后训练阶段会教模型在不确定时说"我不知道",但这同样是一种学到的行为,并不完美。对 agent 开发来说,这意味着不能仅凭输出语气判断可靠性。凡是关键事实,最好通过工具(搜索、查数据库)获取并放进 context,让模型基于给定信息回答,而不是依赖它参数里的"记忆"。