[控场AI]
· 6 分钟阅读· 3,168 字

动画拆解:语言模型如何选出下一个Token

动画拆解:语言模型如何选出下一个Token

用Qwen2.5-0.5B的真实概率动画,直观展示语言模型解码中softmax、温度、top-k和top-p的相互作用。

文章通过Qwen2.5-0.5B-Instruct在提示词“Write one sentence about the moon.”下的两次运行,展示了语言模型逐token生成的全过程。模型对151,936个词表token打分,softmax将logits转为概率分布,“moon”以78.04%高居榜首,“lunar”仅1.50%但仍可能被采样选中。温度参数在softmax前缩放logits,改变分布尖锐度但不改变排序;top-k固定保留前k个token,而top-p根据累积概率动态截断,更适应分布形状变化。默认top-p 0.8会直接排除“lunar”,改变生成路径。即使温度设为0,浮点运算的非确定性仍可能导致输出不同。文章用真实数据直观揭示了这些机制的相互作用。

语言模型生成文本时,每输出一个词都要从数万个候选里挑一个。这个过程看似简单,却藏着softmax、温度、top-k、top-p等一系列机制的相互作用。一位创作者用Qwen2.5-0.5B-Instruct的真实概率数据制作了7分钟动画,把整条决策链完整走了一遍。

Reddit原帖截图

一个真实案例贯穿始终

作者给Qwen2.5-0.5B-Instruct同样的提示词"Write one sentence about the moon.",在温度1、不启用top-k和top-p、仅改变随机种子的条件下运行了两次。两次回答都以"The"开头,随后分道扬镳:一次走向"The moon, a satellite of the Earth…",另一次变成"The lunar South Equatorial region…"。这个分叉点恰好是理解采样机制的最佳窗口。

在"The"之后,模型对全部151,936个词表token逐一打分。Softmax把这些原始分数转成概率分布后,"moon"拿到78.04%,"full"是4.46%,"vast"是2.24%,"Moon"(首字母大写)1.51%,"lunar"1.50%。这组数字直接展示了概率分布的"头部集中、长尾分散"特征——排名第一的候选占了近八成权重,但后面仍拖着一串不可忽视的低概率选项。

Softmax函数是解码流程中的关键步骤,它将模型输出的原始分数(logits)转换为概率分布。具体而言,对于每个token的logit ( z_i ),softmax计算 ( p_i = \frac{e^{z_i}}{\sum_j e^{z_j}} ),确保所有概率非负且总和为1。在语言模型中,词表通常包含数万个token,softmax需要处理如此高维的输出,因此计算成本较高。此外,softmax对logits的尺度敏感:logits的微小差异可能被指数放大,导致概率分布尖锐;反之,若logits差异小,分布则平缓。温度参数正是通过缩放logits来调节这种尖锐程度,从而影响生成的多样性。

贪心与采样的根本分歧

贪心解码永远选概率最高的token,所以在"The"之后必然接"moon"。采样则是按权重随机抽签,"lunar"大约每67次才会被选中一次,而第二次运行恰好抽中了它。此后模型进入循环:把选中的token追加到序列末尾,重新跑一遍模型,再选下一个。

作者统计了后续步骤的选中排名:大部分时候模型选的都是第一名,但第二次运行也抽中过排名第219的"South"和第1,098的"empty",第一次运行则选中过排名第536的"green"。这些"意外"并非模型出错,而是采样的正常表现——低概率事件在足够多的尝试中总会发生。

温度如何重塑概率分布

温度参数在softmax之前对原始分数做除法。作者用同一个"The"之后的步骤演示:温度低至0.2时,"moon"的概率被推到接近100%;温度升到2.0时,"moon"只剩6.3%。低温让分布更尖锐,模型更保守;高温把权重摊平,冷门token获得更多机会。

这里有个容易被忽略的细节:温度并不改变候选之间的排序,只改变它们之间的相对差距。所以在T=0.2时"moon"依然排第一,只是领先优势被放大到几乎不可撼动。

温度参数在softmax中起到缩放作用:给定logits ( z_i ) 和温度 ( T ),调整后的概率为 ( p_i = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}} )。当 ( T < 1 ) 时,logits被放大,概率分布更尖锐,高概率token的优势更明显;当 ( T > 1 ) 时,logits被缩小,分布更平缓,低概率token获得更多机会。温度不改变logits的相对顺序,因此候选的排名不变,但会改变它们之间的概率差距。极端情况下,( T \to 0 ) 时退化为贪心解码(始终选最高概率token),( T \to \infty ) 时趋近均匀分布。实际应用中,温度常作为调节生成创造性与一致性的旋钮。

top-k与top-p:两种截断思路

作者在同一决策步上对比了两种截断策略。top-k 3只保留前三名,重新归一化后"moon"的概率从78.04%被拉升到92.1%。top-p 0.9则保留累积概率达到0.9所需的最少token集合,在这一步保留了8个token;但在之后某个"of"占97.9%的步骤上,top-p 0.9只保留1个token——因为第一个token的累积概率已经超过阈值。

这正是Holtzman等人2019年论文的核心论点:top-k使用固定大小的候选集,无法适应分布形状的变化;top-p让候选集大小随分布动态伸缩。模型默认的top-p 0.8在这个例子里会直接切掉"lunar",也就是说第二次运行那条"lunar South Equatorial region"的路径根本不会被走到。

Top-k采样和Top-p(核)采样是两种常用的截断策略。Top-k保留概率最高的k个token,将剩余token的概率置零,然后重新归一化。k是固定值,不随分布形状变化,因此在分布尖锐时可能保留过多低概率token,在分布平缓时可能截断有用候选。Top-p(又称核采样)由Holtzman等人于2019年提出,它保留累积概率达到阈值p的最小token集合,集合大小动态变化:当分布尖锐时,少数token的累积概率很快超过p,集合变小;当分布平缓时,需要更多token才能达到p,集合变大。这种动态适应性使top-p在不同上下文中更稳健,成为许多模型默认的采样策略。

温度0也不保证确定

一个反直觉的事实:即使把温度设为0,服务器上的输出仍可能不同。作者引用了Thinking Machines的实验——对Qwen3-235B运行1,000次得到了80种不同答案,根源是批处理大小影响了浮点加法的顺序。这意味着"确定性解码"在工程实现层面从来不是绝对的。

所有数据均由作者在Colab上用transformers在CPU上实际运行得出,视频配音为AI朗读作者自撰脚本。对于想直观理解解码策略的人来说,这种用真实概率走完整条链路的方式,比抽象公式更有说服力。

浮点运算的非确定性源于计算机有限精度。在深度学习中,矩阵乘法、归约等操作涉及大量浮点加法,而加法顺序影响舍入误差。例如,((a+b)+c) 与 (a+(b+c)) 可能产生微小差异。GPU并行计算时,批处理大小、线程调度等因素会改变归约顺序,导致结果略有不同。这种差异在模型推理中可能被放大:即使温度设为0(贪心解码),不同批次或硬件上的输出仍可能不同。因此,工程上常通过固定随机种子、禁用并行归约或使用确定性算法来追求可复现性,但绝对确定性仍难保证。

关键要点

  • 模型在"The"之后对151,936个token打分,"moon"占78.04%,"lunar"仅1.50%却仍可能被采样选中
  • 温度在softmax前除法缩放分数:0.2时"moon"接近100%,2.0时降至6.3%
  • top-k固定保留前k个,top-p按累积概率动态截断,后者能适应分布形状变化
  • 默认top-p 0.8会直接排除"lunar",改变模型的实际生成路径
  • 即使温度设为0,批处理导致的浮点加法顺序差异仍可能产生不同输出
#语言模型#下一个token预测#softmax#温度参数#top-k采样#top-p采样#Qwen2.5#解码策略
分享:

相关推荐