跳转至

第11章「深夜的实验」

视角:Devon Park(15年前) 时间:2011年4月29日-30日,凌晨至破晓

Devon Park在凌晨不睡觉的能力,是在CMU读博期间培养的。他的实验室在地下室——计算机科学系大楼的B层,窗户开在墙体高处的狭槽位置,贴着地面,一年四季只能看到草地上经过的脚踝和狗腿。他的导师六十多岁,每天下午四点准时回家,把实验室留给他和在另一个角落做并行计算研究的博士生。两人有一种沉默的同盟——不需要语言,只需要在凌晨三点还能听见彼此的键盘声,就知道队伍还没散。

后来那个做并行计算的博士去了Google。Devon去了工业界。他发现工业界没有他想象的那么不同。还是地下室。还是凌晨。还是键盘声。只是从一个人的键盘变成了三百台服务器的风扇。

但这个凌晨他不是在守护一场排练好的训练。他在做实验。一种他在博士论文答辩之后再也没做过的东西——没有预设结论、没有需要证明的假设——纯粹被看到的现象驱动,从现象出发向所有方向扩散的实验模式。

实验设计建立在一个核心问题上:那个环从哪里来?

逻辑上只有两种可能。第一:环是模型产生的——也就是说,TH-847-00291的文本本身是正常的,但模型在处理它的时候在embedding空间中产生了某种未预期的几何效应。这属于模型的bug——不常见,但有先例。几年前有一个研究组发现某些自回归模型在处理特定长度的文本时会在隐藏层产生共振,输出embedding出现周期性的幅度波动。第二:环是数据本身的属性——模型只是忠实地把它映射到了embedding空间。如果是这样,那这个环就不是模型的问题。它是一条文本在语义空间中天然具有的拓扑特征。它不是一个bug。它是一个你之前没注意到的事实。

Devon想不出任何理由一条关于多肉浇水的文本会在语义空间中形成一个环。但这正是实验的意义:如果你的直觉能解释它,你就不需要做实验了。

凌晨一点。第一组实验:跨模型验证。

他选取了三个版本的基础嵌入模型。v2.1是当前生产环境的稳定版——六层Transformer,隐藏维度512,在TH-847批次之前六个版本的训练数据上预训练。v2.3是v2.1的升级版,多加了一层attention head,隐藏维度扩到768,训练数据增加了大约百分之四十。v3.0-alpha是试验版——换了旋转位置编码,参数量是v2.1的将近十倍,至今仍在内部测试中,没有部署到任何产品。

他用三个模型分别对TH-847-00291做embedding提取,然后用同样的投影脚本处理。结果:

v2.1的环是扁的,像一个被从上方轻轻压过的椭圆——但闭合结构完整,缺口距离约0.04单位。v2.3的环最接近正圆——曲率分布的方差不到百分之三——缺口距离约0.02单位。v3.0-alpha的环最小、最紧凑,形态近乎完美,像一个被高精度的计算的打磨过的金属环——缺口距离降到了0.008单位,小到他在第一遍观察时差点以为它已经闭合了。

三个模型,参数量、架构、训练数据都不同。三条embedding。三个环。结构相同。形态相似。缺口存在但不闭合。

凌晨一点四十七分。他在实验记录里写了一行东西: "The ring is not a model artifact. It persists across architectures. Hypothesis: the ring is encoded in the data itself."

第二组实验:投影维度测试。

一个反对意见会是这样:环可能只是t-SNE降维过程中产生的人为视觉结构。把高维数据降维到三维时,某些分布会强制呈现出闭合的趋势——这是一个已知现象,在数据可视化圈子里被称作"降维伪影"。他没有忽视这个可能性。他写了一个脚本,把768维原始embedding用PCA分别降到512维、256维、128维、64维、32维,然后在每一档维度上都做t-SNE→三维→环检测分析。如果他看到的环确实是高维数据结构在低维投影中的真实反映——那它在不同压缩率下应该保持拓扑等价。如果它在某档维度下突然消失,那说明它只是一种特定压缩率下偶然出现的视觉假象。

结果:环在所有维度下都保持拓扑等价。当降到32维以下时,环的边缘开始变得粗糙——像一根被放大镜看到细节的铁丝表面——但结构不塌。那个缺口始终存在。128维的时候缺口是0.03单位,32维的时候缺口是0.09单位,变得更明显,但从未合上。这个结果表明:环不是降维过程中因为维度不足而"挤"出来的形状。环存在于高维原始空间中——维度越高它越圆润——降维只是在损耗它的清晰度。

凌晨三点零二分。第三组实验:文本解剖。

他的直觉告诉他环可能不是整条文本均匀贡献的。语言的结构一般不是这样——一个段落里的不同句子承担不同的语义功能,在embedding空间中对应着不同的向量场形态。他想知道环到底建在哪一句上。他把文本拆成三部分——开头("我想知道……浇水")、中间("网上……干湿")、结尾("我上个月……谢谢")——然后分别投影。

结果令他意外。开头部分的投影是一个正常的开曲线——松散、没有什么特殊的几何特征,和任何其他普通的陈述句没什么区别。中间的投影是一段稍微紧凑一些的曲线,在"网上的说法都不一样"那里出现了一个小幅度偏转,但仍然是开曲线。结尾——"我上个月刚养死了一盆玉露,很想知道正确的方法是什么。谢谢。"——被切除后,投影突然崩解。整个环消失了。投影变成了一个没有任何特殊结构的普通开曲线。

他把结尾放回去。环完整地重新出现。

他交替切除和恢复"结尾部分",重复做了五次同样的操作——切除→消失,恢复→出现。结果完全一致、可复现。环结构的核心附着在"我上个月刚养死了一盆玉露"加"很想知道正确的方法是什么"这两段并列陈述上。不是某一个单独的token——不是"玉露",不是"正确",不是"谢谢"——而是那两段语义叠在一起产生的联合效果。一种他在数据清洗管道中从未见过的语义凝结:失败的经验("养死了")和对正确知识的恳求("很想知道正确的方法是什么")在空间中以近乎互补的曲率咬合。

他对着这三段文本的解剖结果又做了一个变体实验——保持结尾部分不变,但替换开头和中间。用随机从另一个批次的文本中切出同样长度的陈述句拼接到"我上个月刚养死了一盆玉露,很想知道正确的方法是什么。谢谢。"的前面。

结果:环还在。替换后的文本在embedding空间中也形成了一个闭合环形,形态和原版有差异——曲率在某些拼接点上有显著的微调——但核心拓扑结构是保持了的。当他把这一段被拼接文本中的"正确的方法"改成"合适的做法"——语义近似但同义程度较低的表达——环就消失了。改成"准确的方式"——同义度高的——环变小了一点但还在。把"养死"改成"养坏"——环变形了,边缘出现不规整的抖动。然后把"养死"改回去——"养死了一盆玉露"——以及"正确的方法"——原样不动。环恢复了光滑的闭合形态。

"养死"和"正确的方法"之间似乎有一种配位效应——不是化学上的配位,是语义上的。失败和正确性——两个语义极点间形成的静电吸引力——可以把语言中的统计能量固定在一条闭合的轨道上。

凌晨四点半。第四组实验:温度参数测试。

他设定这批实验的时候基本不抱期望。温度参数只影响模型生成输出时的softmax分布,不影响已经固定的embedding空间的内部结构。这个常识是DR. Park教给本科生的知识。但他还是做了。Devon的有一个原则——比"常识说不用做"更强的原则:你知道常识有多常犯错。

他把生成温度从0.1开始逐步调高,以0.5为档,一直调到5.0。每一档温度下用模型对TH-847-00291重新生成一千次embedding(加入随机噪声以避免缓存效应),然后取平均投影,输出环的曲率、缺口距离和整体形态评估。

结果他不止看了一遍。他看了三遍,其中第三遍是在不同的代码环境下——他用一台独立的笔记本电脑、从github clean clone自己的脚本并换了Python环境后重新跑的。

环在任何一档温度下都没有变化。不是"几乎没有变化",是完全没有变化。0.1的温度下,环看起来和2.0的温度下完全一样——形状一样,大小一样,缺口距离一样(差值在浮点精度的误差范围内)。5.0温度下的投影和0.1温度下的投影之间的差异是他量不出来的——在浮点运算的精度范围内这两个图是相同的。

温度参数对它完全不敏感。

他在实验记录上写了第二行东西: "Temperature invariance confirmed. Ring topology is not a product of stochastic decoding. The structure is deterministic — it either exists in full or not at all."

温度不变性意味着什么?意味着你在模型输出端试图"改变"这个环的任何尝试——调整温度、换采样策略、施加输出惩罚——都不可能擦掉它。它不在模型的输出端。它在输入端,或者更准确地说,它在embedding空间的基础层——那种你用任何调参工具都够不到的底层。

凌晨五点十二分。

Devon从显示器前抬起头。脖子发出一声轻微的响声。他已经连续看着屏幕大约九个多小时了——他不知道这个数字是否精确,他在凌晨开始工作之后就不再看时钟了,因为他明白了时间在实验中只是一个视差错误。你的身体在一个时间轴上衰老,数据在另一个时间轴上形成它的结构,两个时间轴只在极少数条件下产生共振。今夜是一个共振区。

他发现自己在电脑前说了两个字。"有意思。""有意思"是他对数据产生最大兴趣时唯一会说的评价词。他在学术会议上的Q&A环节说过它,在阅读令人意外的论文时说过它,在凌晨五点独自面对一个银灰色圆环时又说了一遍。他的音量和在一个人满为患的礼堂里完全一样。

他关掉所有实验窗口,把实验记录保存到桌面上的同一个文件夹里——和unusual_20110427_th847.txt放在一起。现在这个文件夹里有了两份文件,一份是发现,一份是验证。

他站起来,走到窗边。天已经开始亮了——不是日出,是那种凌晨接近六点时天空从黑变灰的过渡,像电脑关机时的屏幕渐变。远处的棕榈树的轮廓正在从夜色中被一点一点地分离出来,如同画稿上的图层。

他在一张便签纸上写了一行字,字迹因为身体的疲惫而有些不稳: "Ring is temperature-invariant. Not a generation artifact. Needs explanation." 他把便签贴在显示器的右下角。在他离开公司之前,这个位置已经积累了大概十几张便签,每一张都是这样一行——他会在验证完一个特征之后把它写下来贴上去,当作一种外化的记忆缓存。

他收拾好东西走出了实验室。他没有选择开车去Denny's,而是站在停车场边的吸烟区——他本人不抽烟,但这个区域是车库附近唯一有长椅和遮阳棚的位置——看了整整二十分钟的天空。天空没有形成环。天空是开曲线。他想。天空没有问题。

然后他踩到自己的脚——他低头看了一眼,确认他的鞋还在脚上。凌晨五点半的困意终于追上了他。

被计算过的东西会留下痕迹。这是计算的本质。

语义空间里,一条被投影过的文本会轻微改变投影维度的局部曲率——不可逆地、不可擦除地。就像一个棋盘上被挪动后又放回原位的棋子:它看起来还在同样的地方,但棋盘知道它被挪动过。