Towards Data Science

Pick a Number Between 1 and 10

6.9内容质量

TL;DR · AI 摘要

Pick a Number Between 1 and 10 Towards Data Science Statistics Pick a Number Between 1 and 10 A viral tweet says LLMs pi...

核心要点

  • 主题聚焦:Pick a Number Between 1 and 10
  • 来源:Towards Data Science,建议结合原文判断细节。
  • AI 分析暂不可用,本条为保底评分与摘要。
#AI#编程#后端#安全
打开原文

在1到10之间选一个数字 | Towards Data Science

统计学

在1到10之间选一个数字

一条病毒式推文声称,大型语言模型(LLMs)会因为梯度下降而选择7。但数学计算显示,事情远比这有趣。

Spyros Georgopoulos

2026年10月30日

9分钟阅读

在Google上关注我们

分享

复古随机数。照片来自Lucas Van Oort(unsplash)

一组复古风格的随机数

7的峰值

最近在X平台上病毒式传播的一张图表提出了一个简单的问题:"在1到10之间选一个数字",并比较了三种回答方式:真正的随机生成器、人类和大型语言模型。真正的随机数呈现10%的平坦分布线,每个数字出现的概率相等。人类的回答形成一个以7为顶峰的波浪状山丘。而大型语言模型则像一根精准指向7的针,仿佛从未接触过其他数字。

作者的配文称:如果你理解梯度下降的工作原理,这将是世界上最不令人惊讶的图表。这个观点有其合理之处,但这种半对半错的正确方式可能是最危险的。

在X上查看这条推文

简要版:梯度下降决定了峰值的位置,但不会影响峰值的锐度。预训练阶段会复制人类的偏好,而人类偏爱7,所以峰值落在7上,但会像人类的山丘一样平缓。后来出现的针状分布则来自微调训练和我们采样答案的方式。本文接下来将详细解析这两个过程。

在开始之前需要说明:这张图表是艺术家的创作。没有Y轴,没有样本量,也没有置信区间。在任何模型评审中,它的作者都必须接受强制性的两小时公司培训,主题是"如何使用Seaborn",而整个团队都会观看。另一方面,这种现象是真实存在的,稍后我们将通过实际计算构建自己的图表。

先看人类:为什么是7?

人类在随机数生成方面同样表现糟糕。根据YouGov的一项调查,33%的英国人选择了7,而边缘数字(1、2、9、10)几乎无人选择(YouGov)。这种现象甚至有一个名字,称为"蓝色7现象",因为当被要求选择一种颜色时,大多数人会说蓝色。

当要求某人选择一个"随机"数字时,他们并不会从均匀分布中抽取。他们寻找的是感觉上随机的数字。这完全是一个不同的问题:

  • 1和10是边缘数字,因此"可预测"。
  • 5是正中间,太明显了。
  • 偶数看起来整洁,就像穿着熨烫好的衬衫。
  • 7是奇数,是质数,既不是中间也不是边缘,而且具有文化内涵(7天、7大奇迹、7位贤人)。它就像穿着休闲装,不会显得刻意。

因此,7获胜是因为我们都以相同的方式试图显得不可预测。加缪会认为这种现象完全合理。

半对的部分:梯度下降真正做了什么

梯度下降解释了为什么峰值在7。但它无法解释为什么会出现针状分布。要理解原因,让我们逐步跟踪训练过程。

步骤1:模型有十个旋钮。对于"在1到10之间选一个数字"的任务,模型为每个数字设置一个旋钮,每个旋钮表示模型认为该数字出现的可能性。我们称它们为q₁...q₁₀;q₁...q₁₀;q₁...q₁₀;它们加起来总共为100%。

步骤2:训练过程衡量"惊讶程度"。我们一次向模型展示真实的人类回答,并询问:"你有多惊讶?"如果模型给7分配了30%的概率,而人类回答是7,那么它只会感到轻微惊讶。如果模型给3分配了5%的概率,而人类回答是3,它就会感到非常惊讶。惊讶程度用−log(q)来衡量:当q很大时,惊讶值很小;当q接近零时,惊讶值会变得非常大。

将这种惊讶感平均到人类说的所有内容上(p_k 是人类选择k的频率),你就会得到交叉熵:

H(p, q) = -\sum_k p_k \log q_k

用文字来说:对于每个数字,人类说出它的频率乘以模型在它出现时的惊讶程度。训练的目标是让这个值尽可能小。

步骤3:梯度下降调整参数。每次回答后,模型会略微调整每个参数。对数字k的调整幅度出人意料地简单:

nudge_k ∝ q_k - p_k

模型的猜测与现实之间的差值。7的数值过高?调低它。3的数值过低?调高它。只有当每个参数都与人类说出该数字的频率匹配时,调整才会停止。过度调整永远不会被奖励:分配给7的超出份额会从3中扣除,而模型下次有人提到3时会为此付出代价。

检查点1:基于惊讶感的训练会生成一个复制品,而不是夸张版或尖峰版。人类的山状分布会以山状呈现。经过良好训练的基础模型应该像人类一样频繁说出7,而基础模型确实校准得相当合理。要完全解释这个现象,还需要两个更多嫌疑人。

嫌疑人1:后训练

后训练将目标从“不要惊讶”转变为“取悦法官”,这会把山变成更高的山。

步骤4:新的目标。预训练模型是一个出色的自动补全工具,但还不是有帮助的助手。因此它会进入第二阶段,通常是RLHF(基于人类反馈的强化学习)或类似方法。人类会比较答案对并选择更喜欢的那一个;奖励模型学习预测这些偏好;然后LLM被训练生成得分高的答案,同时一条缰绳防止它偏离预训练学到的内容太远。在这一规则下最佳模型具有简单形状:

new_k ∝ old_k × bonus_k

从已有信念出发,乘以法官喜欢的部分。缰绳越紧,奖励越小。

如果这看起来眼熟,那是因为它就是贝叶斯规则。预训练模型扮演先验,法官的奖励扮演似然,后训练模型就是后验。RLHF实际上是对基础模型进行一次贝叶斯更新,使其更符合人类偏好。

步骤5:富者愈富。评分者倾向于选择“听起来合理”的典型答案。但典型答案正是模型已经认为最可能的那个。因此最大的奖励会分配给最大的参数:7增长,其他都缩小。

如果奖励仅仅随着答案的可能性增加而增长,结果就是旧分布的幂次:

new_k ∝ old_k^{1/T}, T < 1

检查点2:这正是降低温度所做的(见下图)。通过RL传递的典型偏好,相当于在模型权重中永久调低了温度。这被称为模式崩溃(mode collapse),表现为校准丢失:GPT-4技术报告发现基础模型比最终模型校准得更好。花点时间查看这些资料:

  • GPT-4技术报告(arXiv)
  • 为对齐的LLM恢复校准(arXiv)

嫌疑人2:解码

即使完全没有训练,我们从模型中选择答案的方式就足以将山变成针尖。

Step 6: 模型不会直接回答,我们进行采样。模型从不会直接给出"7"这个答案。它会给出十个选项的分布概率,例如7的概率是30%,3的概率是12%等,而必须将这些概率转化为一个具体答案。这个过程称为解码,最简单的实现方式是使用加权骰子:掷骰子时,7出现的概率是30%。

Step 7: 温度调节旋钮。在掷骰子前,大多数系统会通过一个称为温度参数T的设置对骰子进行调整。每个概率都会被提升到1/T次方,然后重新归一化使总和恢复为100%:

q_k \;\propto\; p_k^{\,1/T}

  • T = 1: 使用模型原始构建的骰子。
  • T < 1: 最优选项会变得更优。当T = 0.5时,指数为1/T = 2,所有概率都会被平方。以7(30%)和3(12%)为例:7原本是30/12 = 2.5倍于3。平方后变为900和144,差距扩大到900/144 ≈ 6倍。对所有十个数字执行此操作后,平方和为1,544,用这个总和重新归一化后得到新概率:7 → 900/1,544 ≈ 58%,3 → 144/1,544 ≈ 9%。
  • T → 0: 总是选择最优选项("贪婪"解码)。概率分布会变成单一的条形。

为什么这个方法有效?"温度"这个名称又从何而来?这源于统计物理中的玻尔兹曼分布,我在《如何解读大语言模型中的温度参数》一文中对此进行了详细解析。

聊天应用通常会将温度参数设置在T < 1的范围,或直接剔除低概率答案(称为top-k和top-p技巧),因为这能让回答更连贯。但对于"随机选择一个数字"这类任务,这种做法会与预期目标完全相反。

这张图的制作过程:没有调用任何大语言模型,也没有进行任何训练。我们从一个假设的人类分布开始(7的概率为30%,调查数据显示为20-33%),然后应用了上面的温度公式。具体数值(%):

python

code
import numpy as np
import matplotlib.pyplot as plt
numbers = np.arange(1, 11)
p = np.array([2, 4, 12, 10, 9, 9, 30, 12, 7, 5]) / 100   # humans, 1..10
fig, ax = plt.subplots(figsize=(9, 4.5))
styles = {1: ("grey", "Humans (T = 1)"),
0.5: ("cornflowerblue", "T = 0.5"),
0.2: ("royalblue", "T = 0.2")}
for T, (color, label) in styles.items():
q = p ** (1 / T)
q = q / q.sum()          # rescale to 100%
print(T, np.round(100 * q, 1))
ax.plot(numbers, 100 * q, marker="o", color=color, lw=2.5, label=label)
ax.annotate(f"{100 * q[6]:.0f}%", (7, 100 * q[6]), textcoords="offset points",
xytext=(0, 8), ha="center", fontweight="bold")
ax.axhline(10, ls="--", color="black", lw=1, alpha=0.5, label="Random (10%)")
ax.set(xticks=numbers, ylim=(0, 105), xlabel="Number picked",
ylabel="Probability (%)", title="Temperature alone turns the hill into a needle")
ax.spines[["top", "right"]].set_visible(False)
ax.legend(frameon=False)
plt.tight_layout()
plt.show()

在真实模型中,训练后分布已经过收缩(第5步),即使在T = 1时,尾部概率也所剩无几。解码过程会完成最后的处理。

一个人,重复一千次

这个对比有些不公平:人类分布曲线代表的是整个人群,而大语言模型的分布曲线仅代表单个个体。

人类分布来自许多不同的人,每个人都有自己的历史、偏好数字和祖母生日在每月4号等特征。而大语言模型的分布来自同一个模型被反复询问,每次都在新的对话中进行,没有任何记忆。

如果将同一个人复制一千次,并以完全相同的情绪询问他们,他们很可能也会给出类似尖锐的回应。赫拉克利特曾说“人不能两次踏入同一条河流”;而大语言模型却可以一千次踏入同一条河流,每次的回答都是“7”。

那么,这条推文正确吗?

关于峰值的位置,是的。关于其形状,不是。

问题

答案

为什么峰值在7?

预训练(使用梯度下降)从人类学习,而人类偏爱数字7。

为什么是尖峰而非缓坡?

主要归因于微调(模式寻找优化、评分者偏好典型答案)和解码过程。不仅仅是梯度下降的作用。

这是世界上最不令人意外的图表吗?

对了解微调和温度参数如何影响分布的人来说,是的。对其他人来说,这是一条绝佳的病毒式传播推文。

如何从大语言模型实际获取随机数

将随机性交给专为随机性设计的工具。

  • 要求其编写并运行代码(random.randint(1, 10))。正确的方式。
  • 要求分布而非样本:“给出5个可能答案及其概率”。这通常能解锁更多多样性,因为模型描述分布而非陷入众数。
  • 如果有API访问权限,可以提高温度参数。这会略微帮助,但无法复活微调已埋没的长尾分布。

结语

大语言模型不是一个糟糕的随机数生成器因为它“愚蠢”,而是因为我们训练它非常擅长给出我们预期的答案。而当你要求“随机选一个数字”时,我们大多数人潜意识里期待听到的其实是7。