Logits 和 Softmax:从原始分数到概率分布,大模型怎么决定下一个字

你盯着 ChatGPT 的输出框,看它一个字一个字往外蹦。你有没有想过一个问题:模型是怎么决定下一个字的?

AI technology illustration

大多数人的第一反应是:模型算出一个最可能的词,然后输出。这话对了一半。模型确实会算出一个分数最高的词,但它通常不会直接输出那个词——它先要把一堆分数变成概率,然后在这个概率里“抽签”。

这里的“一堆分数”就是 logits,“变成概率”就是 softmax。这两个概念是整个大模型生成机制的地基,但很少有人把它们的细节讲透。我今天想把这块地基掀开给你看。

Logits:模型给每个词打的“印象分”

模型内部的工作方式,可以粗暴地理解为:它读了你给的输入,然后在词表里给每个候选词打一个分。这个分数就是 logit。

关键点在于,这个分数可以是任意实数,正的、负的、零,都有可能。它不是一个概率——一堆 logits 加起来不等于 1,甚至可以全是负数。

为什么叫 logits?这个词源自统计里的 log-odds(对数几率)。但神经网络里的 logits 并不严格等于 log-odds,它只是一个约定俗成的叫法,指 softmax 层之前那个线性层的输出。你只要知道它代表“未归一化的原始分数”就够了。参考维基百科

Softmax:把分数变成概率的那道工序

logits 不能直接用,因为我们想要一个概率分布——每个词一个 0 到 1 之间的数,所有词加起来等于 1。Softmax 就是干这个的。参考维基百科

softmax(z_i) = exp(z_i) / Σ_j exp(z_j)

对每个 logit 取指数,再除以所有指数之和。指数函数有两个好处:一是把任何实数变成正数;二是放大差异——分数 2 和 1 的差距,在取指数后变成了 e^2 / e^1 ≈ 2.718 倍,而不是原来的 2 倍。

举个例子。假设词表里只有三个词,模型给出的 logits 是 [2.0, 1.0, 0.0]。Softmax 之后,概率大约是 [0.665, 0.245, 0.090]。看到没?最高的那个词占了三分之二,但另外两个词依然有被选中的可能。

温度参数:控制这个概率分布是“尖锐”还是“平坦”

你可能听过“temperature”这个词,ChatGPT 的 API 里就有一个 temperature 参数。它其实是在 softmax 里加了一个除法:

softmax(z_i / T)

T 就是温度。T = 1 时就是标准 softmax;T < 1 时,logits 被缩小,再取指数,大的更大、小的更小,分布变得更尖锐,接近 one-hot;T > 1 时,logits 被拉平,分布变得更均匀,随机性更强。OpenAI 的文档里说得很清楚,温度越低,输出越确定;温度越高,输出越随机(OpenAI API 文档)。

一个常见的误解是:温度越低,模型越不会胡说八道。这个直觉部分正确,但不全对。温度低会让模型更倾向于选高概率词,但这同时也意味着它更容易陷入重复和死循环——因为高概率词往往是高频词。我见过温度设为 0.1 的模型,连续输出几十个“好的好的好的”。温度调高,反而可能跳出这种循环,但也可能引入低概率的离谱词。

从概率到输出:为什么不是直接选最大的那个

现在你有了一个概率分布,下一步怎么选?最简单的方法是贪心解码:每次都选概率最大的词。这样做的结果往往很呆板,而且容易重复。比如你让它写一首诗,它可能每句都用同一个词开头。

所以实践中几乎都用采样:按照概率分布随机抽取一个词。概率高的词更容易被抽中,但概率低的词也有机会。

采样也有风险。如果直接按原始 softmax 分布采样,低概率的长尾词可能会被抽中,生成一些莫名其妙的字。为了平衡,就有了 top-k 和 top-p 这两个截断策略。Top-p 最早来自《The Curious Case of Neural Text Degeneration》这篇论文(论文链接),我强烈建议你读一下,里面用很直观的例子展示了贪心解码和采样在文本质量上的天壤之别。

策略 做法 效果
贪心解码 每次都选概率最大的 token 确定性强,但易重复、缺乏多样性
随机采样 按 softmax 分布随机抽 多样性好,但可能抽到低概率噪声
Top-k 采样 先保留概率最高的 k 个词,再在它们里面采样 控制候选范围,减少噪声
Top-p 采样(nucleus) 按概率从高到低累积,直到累积概率超过 p,再在其中采样 自适应候选集,质量高

一个 token 的诞生:完整流程

  1. 模型读入上下文,经过数十层 Transformer 计算,得到隐藏状态。
  2. 隐藏状态通过一个线性层(也叫 LM head),映射到词表大小,得到 logits。
  3. 对 logits 除以温度 T(可选),再经过 softmax,得到概率分布。
  4. 根据采样策略(top-k、top-p 等)截断或缩放概率分布。
  5. 从处理后的分布中随机抽取一个 token。
  6. 把这个 token 拼到输入末尾,重复步骤 1。

我当年最大的误解

我最早以为,大模型就是每次挑一个最可能的词,所以它才能写出通顺的句子。后来我发现不对——如果每次只挑最可能的词,LLM 生成的文本会无聊到没法看。真正让文本看起来“有灵性”的,恰恰是采样带来的随机性。

还有一个让我困惑很久的问题:为什么温度调高之后,模型反而更容易编造事实?后来我想通了。温度升高让概率分布变平,意味着原本概率很低的不靠谱 token 被选中的机会变大了。模型不是“想”编,是它手气不好,抽到了那个不对的词。幻觉的根源之一,就在这一步。

这套机制的边界在哪里

softmax 给了每个词一个概率,但它是一个“局部决策”——模型只根据当前已生成的词预测下一个词,它没有全局规划能力。这就是为什么模型写短句很惊艳,写长文却容易跑题、前后矛盾。

每次采样都是独立的,模型不会在生成第 100 个词时回头修正第 10 个词。它只能靠注意力机制尽量记住上下文,但记住上下文不等于在全局上优化整篇文章。

理解了这一点,你就明白为什么现在大模型在长文本生成上这么拉胯——不是模型不够大,而是它的生成方式是逐 token 的贪心搜索(即使加了采样,也改变不了这个基本框架)。这也正是为什么研究者们开始探索多 token 预测、树搜索、以及更复杂的解码算法。logits 和 softmax 只是第一步,决定“下一个字是什么”;而真正的智能,还需要决定“下一步往哪走”。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/226.html

(0)
上一篇 2026年8月20日 上午8:54
下一篇 2026年8月21日

相关推荐