{"id":"mb-20261106-6dc6fa","kind":"deep","title":"大模型怎样决定下一个词：从词表概率到显卡浮点误差","summary":"同一句提问输入大模型，为什么两次输出截然不同？甚至把温度调到零，答案依然可能分流？本文通过真实的概率数据与实验，拆解词表打分、自回归滚雪球、温度与核采样，以及显卡并发计算顺序对模型输出的微观影响。","body":"给同一个大语言模型发两次完全一模一样的提问，参数丝毫不动。\n第一次它写：月亮是地球的卫星。\n第二次它写：月球南赤道区域……\n两句话开头的第一个词，明明都是 The。\n为什么从第二个词开始，它就彻底走岔了？\n\n很多朋友以为大模型每次吐字靠的是某种理解或者灵感。\n在底层，它只是在极其机械地摇骰子。\n拿阿里的开源模型 Qwen2.5-0.5B 来说，五亿参数，在普通电脑上就能跑。\n当它读完提示词和第一个词 The 之后，要选下一个词。\n它怎么选？\n它不会直接做决定。\n它先把词表里的 151,936 个候选词全部拉出来，挨个算一遍得分。\n十五万多个原始分数算出来以后，经过一层数学函数 Softmax 处理，变成了加起来刚好 100% 的概率分布。\n\n在 The 这个词后面，概率最高的是 moon，占了 78.04%。\n第二名 full 只有 4.46%。\n更冷门的 lunar，只有 1.50%。\n剩下的十五万多个生僻词，一起瓜分剩下的 8%。\n\n接下来模型必须挑出一个词。\n最直截了当的规则叫贪婪解码。\n顾名思义，永远只挑概率最大的第一名。\n如果每次都选第一名，那毫无疑问，每一次都会选 moon。\n输入只要固定，输出就永远不变。\n\n但我们平时用模型，往往开着采样模式。\n采样是什么意思？\n加权随机抽签。\n计算机把这十五万多个词的概率，首尾相连铺在一条从 0 到 100% 的数轴上。\n概率越大的词，分到的格子越宽。\nmoon 独占了将近八成的宽度，扔五次骰子能中四次。\nlunar 只有窄窄的一小格，大约每抽 67 次才能中一次。\n系统生成一个随机数，看它落在哪一格，就挑出哪个词。\n第一次运行，骰子落在了 moon 上。\n第二次运行，偏偏就撞上了那六十七分之一的概率，砸中了 lunar。\n\n选出一个词之后呢？\n这就是大模型最核心的运行机制：自回归循环。\n它把刚刚选中的词贴在已有句子的末尾，作为全新的输入，塞回模型里再跑一遍。\n生成一段两百个词的回答，底层的几十亿参数就要完整跑上两百轮。\n每跑一轮，都要给十五万个候选词重新算一遍概率。\n只要有一步选了不同的词，后面的上下文就彻底变了，之后每一步的概率分布也会全盘重洗。\n在第二次运行里，因为开头被带成了 lunar，后面不仅继续挑正常的词，还接连抽中了排名 219 的 South，甚至排名 1,098 的 empty。\n第一次运行也没闲着，后半句抽中了一个排名 536 的 green，硬说月亮是绿色的。\n\n如果不希望它在后排瞎抽，程序员手里有几个旋钮。\n第一个叫温度。\n它是在做 Softmax 之前，直接拿来除以每一个原始得分的数字。\n把温度压低到 0.2，moon 的概率会被急剧放大到将近 100%，采样直接退化成贪婪解码，回答非常工整，但也毫无新意。\n把温度拉高到 2.0，moon 的概率会被稀释到只剩 6.3%，大量的概率被推给后排的冷门词，模型就开始胡说八道。\n这个模型默认的温度一般在 0.7。\n\n光调温度还不够。\n在那十五万多个词里，有超过十五万个词的概率都不到 0.1%。\n但因为数量庞大，它们加在一起占了 4.7% 的空间。\n意味着纯随机抽签的话，每抽 21 次，就有一次会砸中这些边角料词汇。\n怎么把这些垃圾尾巴砍掉？\n第一种办法叫 Top-k。\n规则非常生硬：永远只保留概率最高的前 k 个词。\n如果把 k 设成 3，那就只留前三名，后面的全部砍掉，moon 的概率会被重新放大到 92%。\n如果采用默认的 Top-k 等于 20，那前面提到的排名 219 的 South，根本连上场的机会都没有。\n\n但固定的 Top-k 有一个大毛病。\n人类语言在不同语境下的选择空间完全不同。\n在某些时候，备选词很多；在另一些时候，答案几乎是唯一的。\n比如句子写到 a satellite of the Earth，那个 of 自己的概率就高达 98%。\n这时候你还硬留 20 个候选词，纯属给错误留后门。\n于是 2019 年 Holtzman 团队提出了 Top-p，也叫核采样。\n它不管候选词有多少个，只看累计概率凑够了没有。\n从第一名往下加，一直加到累计概率达到设置的阈值，剩下的直接丢弃。\n如果阈值设为 0.9，在开头 The 后面需要留 8 个词才凑够 90%；而在 of 后面，只留这一个词就已经占了 98%。\n在这个模型默认的 Top-p 等于 0.8 下，开头那一步只保留前两名，概率 1.5% 的 lunar 当场就会被裁掉。\n那句月球南赤道的回答，压根就不会诞生。\n\n看到这里你可能会想：那只要把温度设成 0，永远选第一名，在实际业务里是不是就绝对可复现了？\n数学理论上是这样。\n但在真实服务器上，完全不是这么回事。\nThinking Machines 实验室在 2025 年做过一个非常经典的实验。\n他们把同一个提问，在温度为 0 的设置下，朝推理服务器连续发了 1,000 次。\n结果 1,000 次运行里，竟然吐出了 80 种不同的回答。\n前 102 个词全部一字不差。\n到了第 103 个词，突然分道扬镳：992 次输出了 Queen, New York，另外 8 次输出了 New York City。\n温度明明是 0，只选第一名，随机性从哪里来的？\n答案藏在显卡底层的浮点数加法里。\n在计算机硬件里，由于保留位数有限，浮点数的加法并不满足结合律，a 加 b 再加 c，并不严格等于 a 加括号 b 加 c。\n哪怕是相同的几个数字，求和顺序一变，最后几位微小的尾数就会出现舍入误差。\n在真实的大模型服务器上，为了榨干显卡性能，系统会把不同用户同时发来的请求动态打包成一个批次。\n上一毫秒并发少，批次只有 4；下一毫秒并发多，批次变成了 32。\n批次大小实时在变，显卡底层并行求和的顺序也跟着变。\n这一变，算出来的分数在小数点后很多位产生了一丝微不可察的浮动。\n如果恰好有两个词的分数咬得极死，这一点点浮点舍入差异，就足以让原本排名第二的词逆转成第一名。\n只要这一个词被挑中，后面的自回归循环就彻底拐弯了。\n最后研究团队重写了显卡底层的计算核心，强制无论批次多大多小都严格按同一个顺序做加法，这 1,000 次运行才终于变成了完全一致的文本。\n\n从十五万个词表里的概率切片，到滚雪球一样的自回归循环，再到并发负载在显卡加法顺序上撞出的微小毛刺。\n这就是大语言模型吐出每一粒词元背后，真实运转的机械齿轮。","topic":"大模型怎样决定下一个词：从词表概率到显卡浮点误差","frame_type":["机制"],"citations":[],"channel_note":"","identity_notice":"","source_type":"generated","status":"published","generated_at":"2026-11-06 07:13:11","legal_anchor_count":0,"transcript_citation_count":0,"seo_title":"大模型怎样决定下一个词：从词表概率到显卡浮点误差","description":"同一句提问输入大模型，为什么两次输出截然不同？甚至把温度调到零，答案依然可能分流？本文通过真实的概率数据与实验，拆解词表打分、自回归滚雪球、温度与核采样，以及显卡并发计算顺序对模型输出的微观影响。","domain":"ai","domain_label":"AI 与大模型","domain_label_en":"AI & LLMs","domain_url":"https://mubeitech.com/deep?domain=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","published_at":"2026-11-06T07:13:11Z"}