跳转到内容
输入关键词后按 Enter 打开第一个结果。

电子云与大模型生成代码

电子云与大模型生成代码:一场跨越量子与硅基的奇妙类比

Section titled “电子云与大模型生成代码:一场跨越量子与硅基的奇妙类比”

你可能用过 ChatGPT 写代码,也注意到了一个现象:同一个问题问两遍,出来的代码不一样。有时候第一遍完美,第二遍就拉胯了。

这不是 bug,也不是玄学。理解这件事的最佳方式,可能藏在高中化学课本里——电子云

19世纪,物理学家以为原子里的电子像行星绕太阳一样,有确定的轨道。后来量子力学说:不对,电子没有”确定位置”,它同时”在到处”。

我们只能描述概率分布:电子出现在某处的概率有多大。把所有概率画出来,就像一团云——电子云。云越密的地方,电子越可能出现;云越稀的地方,越不太可能。

但你一旦测量,这团概率云瞬间”塌缩”,电子出现在某个确定的位置。下次再测,可能出现在另一个位置。每次测量结果随机,但大量测量的统计分布,永远符合同一团云。

大模型生成代码,一模一样的戏码

Section titled “大模型生成代码,一模一样的戏码”

现在回到大模型。当你输入”写一个快排”,模型做的事情,本质上就是在玩电子云那套把戏。

第一步:计算概率云

模型拿到你的输入后,通过几千亿个权重运算,得到了一个概率分布——对下一个 token 应该输出什么的概率分布。比如下一个 token 是 def 的概率 30%,是 function 的概率 5%,是 今天天气不错 的概率接近 0。

这个概率分布就是你代码世界的”电子云”。模型权重和训练数据扮演了薛定谔方程的角色:它们决定了这团云的形状。训练得越好,“正确代码”区域的云越浓密。

第二步:采样——薛定谔的骰子

模型不会选概率最高的 token(虽然 greedy decoding 会这么做,但那太无聊了)。它像量子测量一样,从概率云里随机采样一个 token。概率高的区域更容易被采中,但结果有随机性。

这就是 temperature 和 top-p 采样参数在干的事:

  • temperature 低:相当于压缩电子云,让概率集中在密度最高的区域。输出更确定、更保守,但多样性差。设为 0 就等于每次都选最亮的点——完全确定,没有量子味了。
  • temperature 高:相当于把电子云搅得更散,密度差异被抹平。更可能采到低概率 token,输出更有创意,但也更可能翻车。temperature 趋向无穷大时,所有 token 等概率——纯随机噪声,代码质量归零。
  • top-p(核采样):只从概率累计达到 p 的那些 token 里采样。相当于只在电子云最密的那一坨里观测,忽略外围的稀薄区域。

第三步:塌缩

一旦采样完成,概率就”塌缩”为一个确定的 token。然后这个 token 成为新输入,模型计算下一个位置的概率云,再采样,再塌缩……直到输出结束符。

这就是为什么每次生成的代码不同——每一步的采样都是一次量子测量,而测量结果是随机的。

所以,为什么有时候生成的质量参差不齐?

Section titled “所以,为什么有时候生成的质量参差不齐?”

现在答案很清楚了。

电子云的形状由训练决定(类比模型权重)。如果训练数据里 Python 代码质量高、数量多,那”好代码”区域的云就很浓密,随机采样也大概率采到好 token。

但即使云的形状一样,单次测量的结果仍然有波动。有时候一路高概率采样,代码顺畅无比;有时候中途踩到一个不太好的 token,后面越走越歪(模型是自回归的,前面错了后面更容易错)。

这和量子力学中的观测完全一致:单次结果不确定,但大量生成的统计分布是稳定的。所以如果你让模型生成 100 遍快排,大部分质量都不错,少数翻车——这很正常,这就是概率世界的运行方式。

延伸:temperature = 1 是”最量子”的设置

Section titled “延伸:temperature = 1 是”最量子”的设置”

物理上,电子云的概率分布就是那么回事,不会偏袒某个位置。temperature = 1 时,模型直接按原始概率采样,不做任何缩放——这最接近”纯量子测量”。

temperature ≠ 1 时,我们实际上在人为扭曲电子云的形状。调低温度是”加强”密度差异,调高是”削弱”密度差异。都是在原始概率分布上做手脚。

有趣的是,temperature 0(greedy)完全消除了随机性——这在量子力学里对应退相干(decoherence),系统被”经典化”了。输出变得完全确定,但也失去了所有可能性。

电子在测量前真的”同时在到处”吗?还是只是我们不知道它在哪?

同样的问题也适用于大模型:模型在生成前”知道”要写什么代码吗?还是只是在计算概率,每次随机碰运气?

哥本哈根诠释说:概率就是现实,在测量发生之前,确定的状态不存在。

对应到大模型:在采样发生之前,确定的输出不存在。模型拥有的只是一个分布,不是一份确定的代码。

这个类比,比你想的要深。


下次看到大模型”不稳定输出”的时候,别急着骂。那是它在做量子力学实验呢。