电子云与大模型生成代码
电子云与大模型生成代码:一场跨越量子与硅基的奇妙类比
Section titled “电子云与大模型生成代码:一场跨越量子与硅基的奇妙类比”你可能用过 ChatGPT 写代码,也注意到了一个现象:同一个问题问两遍,出来的代码不一样。有时候第一遍完美,第二遍就拉胯了。
这不是 bug,也不是玄学。理解这件事的最佳方式,可能藏在高中化学课本里——电子云。
先复习一下电子云
Section titled “先复习一下电子云”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),系统被”经典化”了。输出变得完全确定,但也失去了所有可能性。
一个哲学问题
Section titled “一个哲学问题”电子在测量前真的”同时在到处”吗?还是只是我们不知道它在哪?
同样的问题也适用于大模型:模型在生成前”知道”要写什么代码吗?还是只是在计算概率,每次随机碰运气?
哥本哈根诠释说:概率就是现实,在测量发生之前,确定的状态不存在。
对应到大模型:在采样发生之前,确定的输出不存在。模型拥有的只是一个分布,不是一份确定的代码。
这个类比,比你想的要深。
下次看到大模型”不稳定输出”的时候,别急着骂。那是它在做量子力学实验呢。