大模型怎样决定下一个词:从词表概率到显卡浮点误差
给同一个大语言模型发两次完全一模一样的提问,参数丝毫不动。 第一次它写:月亮是地球的卫星。 第二次它写:月球南赤道区域…… 两句话开头的第一个词,明明都是 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 次运行才终于变成了完全一致的文本。
从十五万个词表里的概率切片,到滚雪球一样的自回归循环,再到并发负载在显卡加法顺序上撞出的微小毛刺。 这就是大语言模型吐出每一粒词元背后,真实运转的机械齿轮。
同领域解读 / AI & LLMS
规范引用 / CANONICAL CITATION
大模型怎样决定下一个词:从词表概率到显卡浮点误差 — 墓碑科技 MUBEITECH(https://mubeitech.com/deep/mb-20261106-6dc6fa)
导出 / EXPORT
订阅 · SUBSCRIBE
每周一封独立、不受审查的科技与 AI 深度评论,周一发出。带出处,可核查。