随机性不是噪声,是搜索工具:玻尔兹曼、GPT 和统计学家说的是同一件事
《从玻尔兹曼到辛顿》 第 5 节有一句话,是整篇文章里唯一一句 没有公式的结论:
随机性不是噪声,是搜索工具。
《GPT 是更高级的"万能谷歌搜索"》 讲的是另一条线: 关键词 → 向量 → 高维空间 → GPT,搜索每一代都在更高的维度上做。
这两篇文章看起来一篇讲物理,一篇讲检索。本文的主张是:它们是同一句话的两种说法。 顺便回答另外两个问题——物理世界里的"搜索"到底是什么, 以及为什么统计学家开口闭口都是"随机过程"。
三句话版本:
- 搜索 = 在一个大得没法穷举的状态空间里,生成候选 + 打分。 确定性算法只会走它已经索引过的路;随机性是唯一能生成"索引里没有的候选"的算子。
- 温度 \(T\) 是这两篇文章共用的那个旋钮。 \(T\to 0\) 是 grep / argmax / 贪心下降,\(T\to\infty\) 是白噪声, 有用的搜索发生在中间——而且最优温度不是常数,是一条下降的调度曲线。
- 统计学家不是在描述世界有多随机,他们是在造工具。 蒙特卡洛 1946 年被发明出来的第一天,随机性就是一个算法,不是一个误差项。
目录
- 那句话的原始语境:51% 和 98%
- 先把"搜索"定义清楚:状态空间、打分、提议
- 温度是唯一的旋钮:自由能把探索和利用写成了一行
- 把搜索进化史重排成一部温度史
- 随机性在检索栈里出现的四个位置
- 物理世界的搜索是什么
- 统计学家为什么满嘴随机过程
- 三条线合成一张表
- 边界:什么时候随机性没有用
- 运行 demo
1. 那句话的原始语境:51% 和 98%
先把那句话放回它的上下文。1982 年的 Hopfield 网络更新规则是确定性的:
它单调下山,所以必然停在某个局部极小上——可能是你存进去的记忆, 也可能是一个你从来没存过的"伪记忆"。1985 年辛顿和塞诺夫斯基改了一行:
允许上山。配上柯克帕特里克 1983 年的模拟退火(\(T\) 从高到低几何下降), 同一个能量地形、同一批随机初态,结果分成两半。 本文配套 demo(第 10 节,12 个自旋、200 个随机初态、全局最小 \(E=-15.1937\))跑出来是:
| 策略 | 命中全局最小 | 平均终态能量 |
|---|---|---|
| 贪心下降(\(T=0\)) | 51.5% | \(-13.3607\) |
| 模拟退火(\(2.0 \to 0.05\)) | 98.5% | \(-15.1484\) |
差的那 47 个百分点,全部由"允许做出让当前分数变差的一步"买来。 这就是那句话的全部内容:噪声在这里不是被容忍的,是被主动注入的, 而且注入量是一个需要调度的超参数。
2. 先把"搜索"定义清楚:状态空间、打分、提议
四篇文章讲的东西能接上,是因为它们的对象可以写成同一个四元组:
- \(\mathcal{X}\):状态空间。网页集合、向量库里的 \(10^9\) 个点、\(2^N\) 个自旋组态、 长度 \(T\) 的 token 序列(\(|\mathcal{V}|^T\) 个)、蛋白质的所有构象。
- \(E(x)\):打分函数。物理里叫能量(越低越好),检索里叫相关性, 机器学习里叫损失,进化里叫适应度(差一个负号),RL 里叫奖励。
- \(q(x' \mid x)\):提议分布。下一步从哪儿来。确定性算法的 \(q\) 是一个 \(\delta\) 函数。
- \(B\):预算。你能做多少次打分。
有了这个写法,确定性搜索的失败模式只有三种,而且和随机性的关系各不相同:
| 失败模式 | 症状 | 随机性有没有用 |
|---|---|---|
| 组合爆炸 | \(\lvert\mathcal{X}\rvert\) 大到不能枚举(\(2^{100}\)、\(50257^{2048}\)) | 有用:采样是唯一能在 \(O(1)\) 空间里遍历的办法 |
| 局部极小 | 地形有高低,但贪心卡在半山腰 | 有用:这正是第 1 节那 47 个百分点 |
| 地形平坦 | \(E\) 在提议分布下方差为 0 | 没用:见第 9 节,跑多久都是随机游走 |
\(\lvert\mathcal{X}\rvert\) 的量级值得停一下。GPT 生成一段 2048 token 的回答, 状态空间是 \(50257^{2048} \approx 10^{9628}\) 个序列。 可观测宇宙的原子数大约 \(10^{80}\)。 "从 \(10^{9628}\) 个序列里找一个好的"这件事,不可能用任何确定性的枚举完成。 它只能被采样。
3. 温度是唯一的旋钮:自由能把探索和利用写成了一行
玻尔兹曼分布
的两个极限,正好是两代搜索:
中间发生了什么,用自由能看最清楚。玻尔兹曼分布是下面这个泛函的唯一最小值点:
这一行就是 exploration / exploitation 的完整定义。 \(T\) 是你愿意为"多保留一比特可能性"付出多少分数。 \(T=0\) 时熵一文不值,于是你把全部筹码压在当前最优上; \(T\) 很大时分数一文不值,于是你什么都不信。 所谓"调温度",从来不是在调噪声大小,是在调你给可能性定的价。
第 10 节的实验 C 扫了固定温度:
| \(T\) | 0.01 | 0.10 | 0.30 | 0.50 | 1.00 | 2.00 | 5.00 |
|---|---|---|---|---|---|---|---|
| 命中全局最小 | 50.0% | 60.0% | 73.5% | 61.0% | 38.5% | 6.5% | 1.0% |
非单调。随机性是有剂量的药:太少跳不出局部极小,太多把已经找到的结构也一起融掉。 而且注意——任何固定温度(最好 73.5%)都打不过退火调度(98.5%)。 高温阶段负责找到正确的"盆地",低温阶段负责在盆地里定位。 这条经验在四个地方原封不动地复现:模拟退火的冷却调度、 学习率调度(warmup 后 cosine 衰减)、扩散模型的噪声调度、 以及 RL 训练里 rollout 温度从高到低的安排。
顺便,\(\sigma(2h_i/T)\) 里的 sigmoid 不是启发式,它是 \(e^{-E/T}/Z\) 在单个自旋上的精确条件分布; 推导见 《从玻尔兹曼到辛顿》 第 5.2 节。 关于 \(T\to 0\) 这个极限本身,还可以看 《高中觉得最玄乎的"极限",其实是大模型"从犹豫到笃定"的那个旋钮》。
4. 把搜索进化史重排成一部温度史
《GPT 是更高级的"万能谷歌搜索"》 里那张四代表, 按"相似度怎么算"排。换成按温度排,会看到一件被表格藏住的事: 四代进化的实质,是把打分函数从阶跃函数一路软化成连续可微的, 从而让温度这个旋钮第一次有意义。
| 代际 | 打分函数 \(E\) | 有效温度 | 地形长什么样 |
|---|---|---|---|
| 1. 关键词倒排 | 命中/不命中(0-1 阶跃) | \(T=0\) | 一片平原 + 若干根针,梯度处处为 0 |
| 2. 向量检索 | \(-\langle q, d\rangle\)(连续) | \(T=0\)(仍取 top-k) | 有坡度了,但只在检索这一步用 |
| 3. 高维 embedding + ANN | 学出来的距离 | \(T=0\),但索引构建用随机 | 坡度是学出来的(见第 5 节) |
| 4. GPT | logits(每层每个位置都有) | 每层 \(T=1\),解码 \(T\) 可调 | 一个有 \(10^{9628}\) 个点的离散空间,被软化成处处可微 |
第 4 代那一行有两个 \(T\),值得拆开:
(a)注意力里的 \(T\)。 attention 的核心是
那个 \(\sqrt{d_k}\) 就是温度。Vaswani 等人在论文脚注里给的理由是: \(d_k\) 大时点积的方差随 \(d_k\) 增长,softmax 会被推进饱和区、梯度趋近 0—— 用能量的语言说就是温度太低,分布冻结成 one-hot,检索退化成硬查表。 除以 \(\sqrt{d_k}\) 是在升温,把它调回一个"软"的区间。 所以 《GPT 是更高级的"万能谷歌搜索"》 里 "softmax 是 WHERE 子句的软化版"这个说法,可以说得更硬一点: attention 是一次 \(T=1\) 的玻尔兹曼加权检索,权重就是 \(e^{-E/T}/Z\), 其中 \(E = -q\cdot k/\sqrt{d_k}\)。第 1 代的 WHERE 是 \(T=0\) 的同一个式子。
(b)解码里的 \(T\)。 p = softmax(logits / T) 加上 top-k / top-p,
是在 \(10^{9628}\) 个序列上做的一次逐位置的退火搜索。
\(T\to 0\) 就是 greedy decoding——于是复读、"The the the"、模式坍缩;
\(T\) 太大就是胡说。幻觉和创造力是同一个旋钮的两侧,不是两个问题。
这也解释了为什么 beam search 在开放式生成上反而不好:它是低温 + 宽搜,
搜到的是"平均意义上最安全"的那条路,正好是分布的众数而不是典型样本。
5. 随机性在检索栈里出现的四个位置
一个容易被忽略的事实:在 GPT 出现之前,随机性早就是检索工程的主力, 只是它藏在索引构建里,不在查询里。
| 位置 | 做法 | 随机性在干什么 |
|---|---|---|
| 索引 | LSH(Indyk–Motwani 1998):随机超平面做哈希 | 用随机投影换维度——JL 引理保证 \(O(\log n / \epsilon^2)\) 维就能保距离 |
| 索引 | HNSW / NSW:图里加随机长边 | 造小世界图,让贪心游走能跨盆地;这就是图上的退火 |
| 训练 | word2vec / 对比学习的负采样 | 用随机负例近似那个算不动的 \(Z\)(见第 7 节) |
| 训练 | dropout、mini-batch SGD | 在参数空间里搜索,噪声推着解离开尖锐极小 |
第二行值得说透。HNSW 的查询是贪心的:从入口点出发,每步走向离 query 更近的邻居。 纯贪心在近邻图上会卡死在局部最优——解法不是给查询加噪声, 而是在建图时随机地插入长程边。 换句话说:随机性可以加在提议分布里(退火),也可以预先烧进地形的连通结构里(小世界图)。 两者是等价的补救,针对的是同一个病。
第四行则说明:GPT 的训练和推理都是搜索,只是搜索空间不同。 SGD 在参数空间 \(\mathbb{R}^{|\theta|}\) 里搜,mini-batch 的采样噪声是它的温度 (\(\text{噪声} \propto \eta / \sqrt{B}\),所以学习率和 batch size 一起决定"温度"); 解码在序列空间里搜;RL 的 rollout 在策略空间里搜。 三层都靠采样,三层都有温度调度。
6. 物理世界的搜索是什么
现在回答那个最直接的问题。
物理世界的搜索 = 系统在能量地形上的热弛豫。 它的"查询"是初始条件,"索引"是能量函数 \(E\)(由相互作用决定), "提议分布"是热运动,"接受准则"是玻尔兹曼因子,"预算"是时间。
但这里要立刻打一个补丁,否则整个类比会变成神秘主义: 物理系统并不在优化任何东西,它只是在弛豫。 "搜索"是我们对这个过程的算法学翻译。 不过这个翻译是双向可编译的,而且历史上就是反着走的: 模拟退火(Kirkpatrick 1983)是照抄冶金学的退火工艺写出来的算法, Metropolis 判据(1953)本来是为了算硬球流体的状态方程。 先有物理,后有算法。
几个具体例子:
(1)化学反应速率。 阿伦尼乌斯公式
和 Metropolis 接受率 \(\min(1, e^{-\Delta E/T})\) 是同一个函数形式。 反应物越过势垒,靠的就是热涨落——温度不够,反应"搜索"不到过渡态。 加热催化反应,和调高采样温度跳出局部极小,是同一件事的两个词汇表。
(2)蛋白质折叠:莱文塔尔悖论。 一条 100 残基的链,每个残基的二面角哪怕只取 3 种构象, 状态空间也有 \(3^{100} \approx 5\times 10^{47}\)。 每次构象转换按 \(10^{-13}\) 秒算,穷举需要 \(5\times 10^{34}\) 秒; 宇宙年龄才 \(4\times 10^{17}\) 秒。可实际折叠只要微秒到秒。 莱文塔尔 1969 年提出这个悖论时,答案在 1990 年代才成型: 能量地形不是平的,是一个漏斗(Bryngelson–Wolynes 的"最小挫败原理")。 漏斗提供坡度,热运动提供跨越小势垒的能力,两者缺一不可。 这正好是第 2 节那张失败模式表的物理版:光有随机性不够,地形必须有结构。
(3)结晶 vs 玻璃。 慢冷 → 单晶(全局最小);急冷(淬火)→ 玻璃(冻结在局部极小)。 这是"退火调度"这个词的字面来源,也是第 3 节那张温度扫描表的物理原版。 自旋玻璃里"很多个亚稳态、系统再也走不出去"的现象叫遍历性破缺—— Parisi 因为搞清楚这件事拿了 2021 年诺贝尔物理学奖。 用检索的语言说:遍历性破缺 = 你的采样器再也访问不到某些区域了, 于是时间平均不再等于空间平均,估计有偏。
(4)进化。 突变 = 提议分布,选择 = 接受准则,适应度 = \(-E\)。 "地形"这个词就是从 Sewall Wright 1932 年的 fitness landscape 来的, 比模拟退火早半个世纪。而且进化里也有温度上限: 艾根的错误阈值(error threshold)——突变率一旦超过临界值, 基因组信息会被"融化"掉,种群解体成随机序列(error catastrophe)。 这和 \(T=5\) 时命中率掉到 1.0%、和高温解码的胡言乱语,是同一条曲线的同一端。
(5)量子力学:对所有路径求和。 费曼路径积分说,粒子的振幅是所有路径的加权和 \(\sum_{\text{paths}} e^{iS/\hbar}\)。 做一次 Wick 转动(\(t \to -i\tau\)),它就变成配分函数 \(\sum e^{-S_E/\hbar}\)—— 和 \(\sum e^{-E/kT}\) 一模一样,\(\hbar\) 站在温度的位置上。 经典极限 \(\hbar \to 0\) 给出最小作用量原理,也就是零温、贪心、唯一一条路。 "物理世界在搜索"这个说法,在量子层面是字面成立的: 它确实对所有候选路径都做了打分求和,只是相位相消掉了绝大多数。
(6)大脑。 神经元的放电本身就是随机的,突触释放是概率性的。 辛顿 1985 年那条学习律之所以在当年被认为"生物上可实现", 一部分原因就是它只需要局部相关 \(\langle s_i s_j\rangle\) 加上随机采样, 而反向传播需要一套并不存在的反向通路。 RL 里的 Boltzmann exploration(\(\pi(a) \propto e^{Q(a)/T}\)) 则是把这套东西直接写成了策略。
7. 统计学家为什么满嘴随机过程
因为随机过程是他们的算法,不是他们的世界观。 这里有一个长期的语义误会:工程师听到"随机"想到的是误差、抖动、要被消除的东西; 统计学家说"随机过程"时,多半是在说一个他自己构造出来的、有已知稳态分布的对象。
理由一:高维积分没有确定性解法。 这不是懒,是定理。确定性求积在 \(d\) 维上的误差是 \(O(N^{-r/d})\), 指数里有 \(d\);蒙特卡洛是 \(O(\sigma/\sqrt{N})\),和 \(d\) 无关。 第 10 节实验 A 的真实输出(固定 \(10^6\) 次函数求值):
| \(d\) | 每维格点 \(n\) | 网格相对误差 | MC 相对误差 |
|---|---|---|---|
| 1 | 1000000 | \(3.0\times10^{-14}\) | \(9.6\times10^{-5}\) |
| 3 | 99 | \(9.0\times10^{-6}\) | \(2.3\times10^{-4}\) |
| 5 | 15 | \(6.6\times10^{-4}\) | \(3.9\times10^{-4}\) |
| 10 | 3 | \(3.4\times10^{-2}\) | \(3.7\times10^{-4}\) |
| 20 | 1 | \(8.6\times10^{-1}\) | \(4.8\times10^{-4}\) |
低维网格碾压蒙特卡洛(\(d=1\) 时好 9 个数量级),\(d=5\) 附近交叉, \(d=20\) 时网格法每维只剩 1 个点、误差 86%,而蒙特卡洛的误差纹丝不动。 这张表就是"随机性是搜索工具"的定量证明: 在高维空间里,随机采样不是精度上的妥协,它是唯一还在工作的方法。 而 GPT 的每一个期望、每一个 \(Z\)、每一次 RL 的 advantage,都活在几千维以上。
理由二:\(Z\) 算不动,所以只能采样。 玻尔兹曼机死在 \(Z = \sum_s e^{-E(s)}\) 上(\(2^N\) 项); 贝叶斯死在证据 \(p(D) = \int p(D\mid\theta)p(\theta)\,d\theta\) 上; 对比学习死在全库负例上。三者是同一个积分。 解法也是同一个:造一条随机过程,让它的稳态分布正好是你要的分布,然后让它跑。 这就是 MCMC:给定目标 \(\pi\),构造转移核 \(P\) 满足细致平衡
Metropolis–Hastings 的接受率 \(\min\!\left(1, \frac{\pi(x')q(x\mid x')}{\pi(x)q(x'\mid x)}\right)\) 就是解这个方程解出来的。注意这里的因果方向:不是"世界是随机的所以要用概率描述", 而是"我要算一个积分,所以我设计了一个随机过程"。
理由三:遍历定理是"游走可以代替穷举"的定理形式。 时间平均 = 空间平均:
第 10 节实验 D 是它的数值版:12 个自旋、\(T=1\), 穷举 4096 个状态算出 \(\langle E\rangle = -13.8168\); 一条跑了 20000 sweep 的 Gibbs 链给出 \(-13.8394\),绝对误差 0.0226; 所有 \(\langle s_i s_j\rangle\) 的平均绝对误差 0.0048。 这里的关键不是"采样也能算对",而是采样的代价与 \(2^N\) 无关。 \(N=12\) 时穷举更划算;\(N=500\) 时穷举需要 \(10^{150}\) 次, 而 Gibbs 链还是 \(20000\times 500\) 次单点更新。玻尔兹曼机学习律里的负相 \(\langle s_i s_j\rangle_{\text{model}}\) 就是靠这个估的, CD-1 更进一步:只跑一步。
理由四:随机性还兼职做正则化。 bootstrap 是在"可能的数据集"空间里搜索;dropout 是在子网络空间里搜索; mini-batch 噪声偏好平坦极小(Hochreiter–Schmidhuber 1997 就在讲这件事)。 扩散模型把这件事做到了极致:前向加噪 = 升温到 \(T=\infty\), 反向去噪 = 一次退火,Song–Ermon 的 annealed Langevin dynamics 连名字都没改。
所以"统计学家嘴上总说着随机过程",翻译过来是: 他手上大部分问题都是高维空间里的求和,而随机过程是他唯一算得动的求和方式。
一张分野表,区分两种完全不同的"随机":
| 噪声观(工程师的默认) | 算法观(本文的主题) | |
|---|---|---|
| 随机来自 | 测量误差、外部扰动 | 我自己注入的 |
| 数学位置 | 模型里的 \(\epsilon\) | 提议分布 \(q\)、转移核 \(P\) |
| 目标 | 消除、滤掉、求均值 | 调度它、控制它的剂量 |
| 典型例子 | 高斯白噪声、传感器抖动 | MCMC、退火、dropout、rollout 采样、扩散 |
| 多了会怎样 | 精度下降 | 错误阈值 / 幻觉 / 模式融化 |
| 少了会怎样 | 更好 | 卡在局部极小,51.5% |
8. 三条线合成一张表
| 概念 | 物理 | 算法 / GPT | 统计 |
|---|---|---|---|
| 状态空间 | 相空间、构象空间 | token 序列、参数、向量库 | 样本空间 \(\Omega\) |
| 打分 | 能量 \(E\) / 作用量 \(S\) | 损失、logits、相关性 | 负对数似然 |
| 分布 | \(e^{-E/kT}/Z\) | \(\operatorname{softmax}(\ell/T)\) | 吉布斯测度、后验 |
| 归一化 | 配分函数 \(Z\) | 词表上求和(\(O(V)\)) | 证据 \(p(D)\) |
| 随机的角色 | 热涨落 | 采样解码、SGD 噪声、rollout | 提议分布、MCMC |
| 温度 | \(kT\) | temperature、\(\sqrt{d_k}\)、\(\eta/\sqrt{B}\) | 退火重要性采样的 \(\beta\) |
| 调度 | 慢冷 vs 淬火 | LR schedule、噪声 schedule | 模拟退火、并行回火 |
| 零温极限 | 基态、最小作用量 | argmax、greedy decode、grep | MAP 估计 |
| 高温灾难 | 熔化、error catastrophe | 幻觉、胡言乱语 | 采样器不收敛 |
| 卡住 | 遍历性破缺、玻璃态 | 局部极小、模式坍缩 | 链混合太慢 |
同一列的三个词,指的是同一个数学对象。 玻尔兹曼机学习律里的负相是 Gibbs 采样,Gibbs 采样是 MCMC, MCMC 是物理弛豫的离散化。 这不是类比,是同一个式子被三个学科各命名了一次。
9. 边界:什么时候随机性没有用
必须写清楚这一条,否则"加点随机性"会变成一句万金油。
随机性只在地形有结构时有用。 《从玻尔兹曼到辛顿》 第 8.3 节记了一次失败:MBPP 的 RL 跑了 415 步、16.7 小时,reward 恒为 0。 原因是二值奖励下 8B base 的 pass@k \(\approx 0\),于是所有 rollout 的 advantage \(A^{(k)} = r^{(k)} - \bar{r} \equiv 0\),梯度恒等于零——不是小,是零。
地形是完全平的。平面上的退火,跑多久都是随机游走。 解法不是提高采样温度(那只会更慢地随机游走),而是把平面改造成阶梯: 把二值奖励拆成"有没有 tag / JSON 合不合法 / 函数名对不对 / 参数匹配了几成"的分档。
于是有一个很实用的判据,在决定"加随机"还是"改设计"之前先算一下:
在你的提议分布下采 \(K\) 个候选,看打分的方差。 方差 \(=0\) → 改打分函数(造坡度),加噪声没用。 方差 \(>0\) 但候选高度相关 → 改提议分布(增大步长 / 加长程边)。 方差大且候选多样,但结果不稳 → 这才是调温度和调度的场合。
第二条边界:温度过高会毁掉已经找到的结构(\(T=5\) → 1.0%)。 第三条:采样只在链能混合时才无偏——遍历性破缺时, 你的估计会稳定地收敛到一个错误的值,而且看不出来。 RLHF 里的模式坍缩、long-context 下的注意力退化,都属于这一类。
10. 运行 demo
python scripts/randomness_as_search_demo.py
只依赖 numpy,约 30 秒跑完,全部数字以 ASCII 打印。本文引用的所有数值都来自它的输出:
A. 固定 1e6 次函数求值:网格 vs 蒙特卡洛
d 每维格点 n 网格实际点数 网格相对误差 MC 相对误差 MC 标准差
1 1000000 1000000 2.96e-14 9.55e-05 4.00e-05
2 1000 1000000 5.91e-08 9.81e-05 1.08e-04
3 99 970299 9.04e-06 2.32e-04 2.03e-04
5 15 759375 6.57e-04 3.85e-04 2.34e-04
10 3 59049 3.35e-02 3.72e-04 1.96e-04
20 1 1 8.56e-01 4.79e-04 3.77e-04
B. 同一地形(12 自旋,全局最小 E = -15.1937),200 个随机初态
策略 命中全局最小 平均终态能量 最好终态
贪心下降(T=0) 51.5% -13.3607 -15.1937
模拟退火(2.0→0.05) 98.5% -15.1484 -15.1937
C. 固定温度扫描:随机性有最优剂量
T 命中全局最小 平均终态能量
0.01 50.0% -13.4712
0.10 60.0% -13.8494
0.30 73.5% -15.0144
0.50 61.0% -14.9832
1.00 38.5% -13.7331
2.00 6.5% -9.9526
5.00 1.0% -4.3925
D. T=1.0 下的期望:穷举 4096 个状态 vs 一条跑了 20000 sweep 的 Gibbs 链
<E> 精确 -13.8168 采样 -13.8394 绝对误差 0.0226
<s_i s_j> 最大绝对误差 0.0123 平均绝对误差 0.0048
代价对比:穷举 4096 次能量计算 vs 采样 240000 次单点更新
四个实验分别对应本文的四条主张:
- A → 高维空间里,随机采样不是妥协,是唯一还在工作的方法(第 7 节)。
- B → 允许上山,命中率从 51.5% 到 98.5%(第 1 节)。
- C → 随机性有最优剂量,而且调度打得过任何固定值(第 3 节)。
- D → 一条随机过程可以替代 \(2^N\) 的穷举(第 7 节)。
C 里有一个实现细节值得说明:固定温度那一栏是跑完 60 sweep 后直接读终态,
没有淬火。所以高温行读到的其实是热涨落中的一个样本,不是那个温度下的"最好结果"——
这恰恰是解码时 temperature=1.2 会发生的事:你拿到的是一个典型样本,不是众数。
小结
回到开头那三个问题。
「随机性不是噪声,是搜索工具」怎么理解? 把搜索写成 \((\mathcal{X}, E, q, B)\) 之后,确定性算法的 \(q\) 是 \(\delta\) 函数—— 它只能沿着已知的坡走,因此必然停在第一个局部极小。 随机性是候选生成器:它是唯一能产出"当前分数更差、但可能通向更好盆地"的那类候选的算子。 第 1 节的 51.5% → 98.5% 就是这句话的价格标签。
和"GPT 是更高级的搜索"什么关系? 是同一条线的两段。搜索四代进化的实质,是把打分函数从 0-1 阶跃软化成处处可微, 从而让温度这个旋钮第一次有意义。 attention 是 \(T=1\) 的玻尔兹曼加权检索(\(\sqrt{d_k}\) 就是那个温度), 解码是序列空间上的退火,SGD 是参数空间上的退火。 GPT 不只是"在更高维度上搜索",它是"在更高维度上做玻尔兹曼搜索"。
物理世界对应的搜索是什么? 热运动在能量地形上的弛豫:查询是初条件,索引是相互作用,温度是预算的分配方式。 化学反应越过势垒、蛋白质在 \(10^{47}\) 个构象里微秒级折叠、 金属慢冷成单晶、物种在适应度地形上爬坡、 乃至路径积分对所有路径求和——都是同一台机器。 而且方向是从物理流向算法的:模拟退火是抄冶金学的。
统计学家为什么满嘴随机过程? 因为他手上的问题基本都是高维求和,而 \(d=20\) 时确定性网格每维只剩一个点。 他说的"随机过程"通常不是在描述世界的不确定,而是他造出来的一台积分机: 构造一个稳态分布正好是目标分布的马尔可夫链,让它跑,用时间平均换空间平均。 从 1946 年乌拉姆算纸牌胜率、1953 年 Metropolis 算硬球状态方程那天起, 随机性在这一行里就一直是算法,从来不是误差。
一句话:搜索 = 生成候选 + 打分。随机性负责前一半,地形负责后一半。 两边都不能塌。