---
id: "mb-20261106-6dc6fa"
kind: "deep"
title: "大模型怎样决定下一个词：从词表概率到显卡浮点误差"
description: "同一句提问输入大模型，为什么两次输出截然不同？甚至把温度调到零，答案依然可能分流？本文通过真实的概率数据与实验，拆解词表打分、自回归滚雪球、温度与核采样，以及显卡并发计算顺序对模型输出的微观影响。"
domain: "ai"
domain_label: "AI 与大模型"
canonical_url: "https://mubeitech.com/deep/mb-20261106-6dc6fa"
markdown_url: "https://mubeitech.com/deep/mb-20261106-6dc6fa/markdown"
json_url: "https://mubeitech.com/api/interpretations/mb-20261106-6dc6fa"
topic: "大模型怎样决定下一个词：从词表概率到显卡浮点误差"
source_type: "generated"
status: "published"
generated_at: "2026-11-06 07:13:11"
frame_type: ["机制"]
legal_anchor_count: 0
transcript_citation_count: 0
---

# 大模型怎样决定下一个词：从词表概率到显卡浮点误差

给同一个大语言模型发两次完全一模一样的提问，参数丝毫不动。
第一次它写：月亮是地球的卫星。
第二次它写：月球南赤道区域……
两句话开头的第一个词，明明都是 The。
为什么从第二个词开始，它就彻底走岔了？

很多朋友以为大模型每次吐字靠的是某种理解或者灵感。
在底层，它只是在极其机械地摇骰子。
拿阿里的开源模型 Qwen2.5-0.5B 来说，五亿参数，在普通电脑上就能跑。
当它读完提示词和第一个词 The 之后，要选下一个词。
它怎么选？
它不会直接做决定。
它先把词表里的 151,936 个候选词全部拉出来，挨个算一遍得分。
十五万多个原始分数算出来以后，经过一层数学函数 Softmax 处理，变成了加起来刚好 100% 的概率分布。

在 The 这个词后面，概率最高的是 moon，占了 78.04%。
第二名 full 只有 4.46%。
更冷门的 lunar，只有 1.50%。
剩下的十五万多个生僻词，一起瓜分剩下的 8%。

接下来模型必须挑出一个词。
最直截了当的规则叫贪婪解码。
顾名思义，永远只挑概率最大的第一名。
如果每次都选第一名，那毫无疑问，每一次都会选 moon。
输入只要固定，输出就永远不变。

但我们平时用模型，往往开着采样模式。
采样是什么意思？
加权随机抽签。
计算机把这十五万多个词的概率，首尾相连铺在一条从 0 到 100% 的数轴上。
概率越大的词，分到的格子越宽。
moon 独占了将近八成的宽度，扔五次骰子能中四次。
lunar 只有窄窄的一小格，大约每抽 67 次才能中一次。
系统生成一个随机数，看它落在哪一格，就挑出哪个词。
第一次运行，骰子落在了 moon 上。
第二次运行，偏偏就撞上了那六十七分之一的概率，砸中了 lunar。

选出一个词之后呢？
这就是大模型最核心的运行机制：自回归循环。
它把刚刚选中的词贴在已有句子的末尾，作为全新的输入，塞回模型里再跑一遍。
生成一段两百个词的回答，底层的几十亿参数就要完整跑上两百轮。
每跑一轮，都要给十五万个候选词重新算一遍概率。
只要有一步选了不同的词，后面的上下文就彻底变了，之后每一步的概率分布也会全盘重洗。
在第二次运行里，因为开头被带成了 lunar，后面不仅继续挑正常的词，还接连抽中了排名 219 的 South，甚至排名 1,098 的 empty。
第一次运行也没闲着，后半句抽中了一个排名 536 的 green，硬说月亮是绿色的。

如果不希望它在后排瞎抽，程序员手里有几个旋钮。
第一个叫温度。
它是在做 Softmax 之前，直接拿来除以每一个原始得分的数字。
把温度压低到 0.2，moon 的概率会被急剧放大到将近 100%，采样直接退化成贪婪解码，回答非常工整，但也毫无新意。
把温度拉高到 2.0，moon 的概率会被稀释到只剩 6.3%，大量的概率被推给后排的冷门词，模型就开始胡说八道。
这个模型默认的温度一般在 0.7。

光调温度还不够。
在那十五万多个词里，有超过十五万个词的概率都不到 0.1%。
但因为数量庞大，它们加在一起占了 4.7% 的空间。
意味着纯随机抽签的话，每抽 21 次，就有一次会砸中这些边角料词汇。
怎么把这些垃圾尾巴砍掉？
第一种办法叫 Top-k。
规则非常生硬：永远只保留概率最高的前 k 个词。
如果把 k 设成 3，那就只留前三名，后面的全部砍掉，moon 的概率会被重新放大到 92%。
如果采用默认的 Top-k 等于 20，那前面提到的排名 219 的 South，根本连上场的机会都没有。

但固定的 Top-k 有一个大毛病。
人类语言在不同语境下的选择空间完全不同。
在某些时候，备选词很多；在另一些时候，答案几乎是唯一的。
比如句子写到 a satellite of the Earth，那个 of 自己的概率就高达 98%。
这时候你还硬留 20 个候选词，纯属给错误留后门。
于是 2019 年 Holtzman 团队提出了 Top-p，也叫核采样。
它不管候选词有多少个，只看累计概率凑够了没有。
从第一名往下加，一直加到累计概率达到设置的阈值，剩下的直接丢弃。
如果阈值设为 0.9，在开头 The 后面需要留 8 个词才凑够 90%；而在 of 后面，只留这一个词就已经占了 98%。
在这个模型默认的 Top-p 等于 0.8 下，开头那一步只保留前两名，概率 1.5% 的 lunar 当场就会被裁掉。
那句月球南赤道的回答，压根就不会诞生。

看到这里你可能会想：那只要把温度设成 0，永远选第一名，在实际业务里是不是就绝对可复现了？
数学理论上是这样。
但在真实服务器上，完全不是这么回事。
Thinking Machines 实验室在 2025 年做过一个非常经典的实验。
他们把同一个提问，在温度为 0 的设置下，朝推理服务器连续发了 1,000 次。
结果 1,000 次运行里，竟然吐出了 80 种不同的回答。
前 102 个词全部一字不差。
到了第 103 个词，突然分道扬镳：992 次输出了 Queen, New York，另外 8 次输出了 New York City。
温度明明是 0，只选第一名，随机性从哪里来的？
答案藏在显卡底层的浮点数加法里。
在计算机硬件里，由于保留位数有限，浮点数的加法并不满足结合律，a 加 b 再加 c，并不严格等于 a 加括号 b 加 c。
哪怕是相同的几个数字，求和顺序一变，最后几位微小的尾数就会出现舍入误差。
在真实的大模型服务器上，为了榨干显卡性能，系统会把不同用户同时发来的请求动态打包成一个批次。
上一毫秒并发少，批次只有 4；下一毫秒并发多，批次变成了 32。
批次大小实时在变，显卡底层并行求和的顺序也跟着变。
这一变，算出来的分数在小数点后很多位产生了一丝微不可察的浮动。
如果恰好有两个词的分数咬得极死，这一点点浮点舍入差异，就足以让原本排名第二的词逆转成第一名。
只要这一个词被挑中，后面的自回归循环就彻底拐弯了。
最后研究团队重写了显卡底层的计算核心，强制无论批次多大多小都严格按同一个顺序做加法，这 1,000 次运行才终于变成了完全一致的文本。

从十五万个词表里的概率切片，到滚雪球一样的自回归循环，再到并发负载在显卡加法顺序上撞出的微小毛刺。
这就是大语言模型吐出每一粒词元背后，真实运转的机械齿轮。

_Canonical: <https://mubeitech.com/deep/mb-20261106-6dc6fa> · Source: 墓碑科技 MUBEITECH (mubeitech.com)_
_Rendered by mubei-terminal._
