第七编 首跑
首跑一共用了二十四个公开检查点:四个规模,每个规模五个种子的最终检查点,共二十个;加上每个规模一号种子的倒数第二个检查点,共四个,作噪声基线。
把这个数字单列一节,是因为它决定了本跑能说什么、不能说什么。
四个规模点。 14M、31M、70M、160M。跨度约一个数量级多一点。第五十四章说过,拟合一条三参数衰减律至少需要四个点才不欠定,而四个点拟合三参数等于零自由度,置信区间无从估计。因此这四个点能支持的最强陈述是”在这个区间内它长什么样”,不能支持任何关于区间之外的陈述。
五个种子。 每规模十对。十对样本可以给出一个均值和一个标准差,但这个标准差本身的不确定度相当大,尤其是在最大规模上——那里表征通道的标准差达到了均值的一半(0.411 ± 0.206)。这件事在第六十二章要单独处理。
为什么不到 410M 及以上。 预注册没有限定上限,实际只跑到 160M,原因是磁盘与算力:单核处理器、3GB 内存、每跑完一个模型必须立刻清掉缓存才能腾出空间放下一个。410M 及以上需要更大的机器。
这是本跑最重的一处局限,必须写在最前面而不是最后面:四个规模点无法支持任何外推。 后面所有读数都要在这个前提下读。
112 条,执行前冻结,摘要值前十六位
e3b9d8a2795cceee。
A 组,64 条,分布内。 取自公开英文百科语料的测试划分,按返回顺序取前 64 条不短于 200 字符的段落,各截断为 128 词元。“按返回顺序”这一条是有意的——不做任何挑选,避免构造者在挑选中夹带偏好。
B1,16 条,归纳型。 一串随机词元重复三遍。这类探针检测的是模型能否利用前文中已出现过的模式来预测后续,是一类有成熟文献的分布外行为。
B2,16 条,模算术型。 模 17 的加法等式串。这类内容在通用语料中极少以这种密集形式出现。
B3,16 条,中文型。 中文段落。所用训练语料中中文占比极低,因此这一组是四组里”分布外”程度最高的。
必须写明的一件事:B1、B2、B3 三组全部由本实验构造,生成规则公开,但不是第三方基准。前两类的构造方式在文献中有先例,第三类没有。自造探针的风险不在于会不会被事后修改——摘要值挡住了这一点——而在于构造时的无意识偏好:构造者知道自己想看到什么。这个风险挡不住,只能写明,并列入下一跑的必改项。
层选取。 四个相对深度:25%、50%、75%、100%,按各模型总层数向上取整。用相对深度而不是绝对层号,是为了让不同规模之间可比——不同规模的模型层数不同,取绝对层号会让”第 6 层”在小模型里是深层、在大模型里是浅层。
采样位置。 每条探针按其实际长度取八个相对位置的词元,去重后使用;长度不足 16 词元的探针丢弃。这条规则是预注册第 6 节那处执行前修订的产物。
表征距离。 在上述位置上取隐藏状态,用线性中心核对齐计算相似度,取 1 减去它作为距离,四层平均。
这里要把一件在第五十五章已经讲过的事在执行层面再确认一次:这个度量对神经元置换、正交变换与各向同性缩放不变。 因此本跑没有另做置换对齐,也不应该另做——度量本身已经具备这些不变性,再加一层显式对齐不会让结果更干净,只会引入一个新的自由参数。这是首跑踩过一次然后绕开的坑,记在这里供复现者参考。
这件事的分量在判读上很重:它意味着第六十二章那一列读数不是标号差异。
行为距离。 各探针末位置的下一词元分布之间的对称散度,以 2 为底,因此取值落在 0 与 1 之间。在 112 条探针上平均,同时按 A、B1、B2、B3 分组记录。
合成距离。 预注册定义了两通道各半的合成,但本书不报告它,理由写在第六十章第四节:合成会把两个方向相反的读数抹平,而不一致本身是本跑最有信息量的东西。
这一节记的是工程细节。把它写进书里,是因为复现者会遇到同样的三件事,而第三件曾经把一次计算变成了一堆无效值。
其一,磁盘。 二十四个检查点不能同时留在盘上。流程是下载一个、抽取一次、立刻清掉缓存、再下一个。这意味着任何一次抽取出错都要重新下载,而不是重新计算。
其二,速度。 单核前向,最大规模上一个模型需要数分钟。整跑的时间主要花在下载与前向上,分析本身几乎不占时间。
其三,数值下溢。 对称散度在遇到零概率项时会产生”零乘以负无穷”的形式,直接计算会得到无效值并污染整条均值。必须显式地把零概率项按零处理。这一处修复写进了偏离记录:它是实现层的数值修复,不改变距离的定义,因此不构成对冻结项的追溯修改。这条界线要划清楚——修一个会让公式算不出数的实现缺陷,与改一个会让结论变化的定义,是两件事。
按预注册开头那句话的要求,全部偏离逐条列出,不合并、不淡化。
偏离一:规模只到 160M。 预注册未限定上限,实际因磁盘与算力止步于 160M。这是本跑最重的局限。
偏离二:对称散度的数值修复。 见上一节。实现修复,不改定义。
偏离三:附加了一组预注册之外的探索性测量。 明确标记为探索性,不计入条款一的判决,内容见第六十六章。
三条之外无其他偏离。原始读数文件、四个脚本、探针集与预注册文本全部公开,任何人可以按第七编附录的清单重跑。
首跑在开跑之前没有做一件很便宜的检查:在同一个模型上把整条流程空跑一遍。
具体是指:取同一个检查点,与它自己配对,走完全部计算——抽取、距离、分组、平均。正确的结果应当是每一格都是零。这道检查能一次性验证采样位置规则、分组归属、平均方式与数值处理有没有实现错误,成本是一个模型的一次前向。
首跑没做这一步,理由是流程看起来足够简单。结果是那处数值下溢的问题直到正式计算中途才暴露出来,代价是一次返工。若事先空跑过,它会在第一分钟就显形。
把这件事写进书里,是因为它属于第六十章第八节那一类——该写而没写的清单项,而且是其中最便宜的一项。下一跑的预注册要加一条:任何距离的实现,必须先通过自配对返零检验,再接触多模型数据。
把复现的边界说清楚,比笼统地说”可复现”更有用。
完全可复现的部分。 探针集可以由生成脚本重建,重建后的摘要值应当仍为
e3b9d8a2795cceee——若不是,说明脚本或依赖的版本变了,此时后续一切读数都不可比。这是复现者要做的第一步,也是唯一一步有确定通过标准的检验。
模型是公开检查点,按名称与版本号取用,不存在私有材料。距离的计算是确定性的:给定同一批隐藏状态与同一批输出分布,两次计算应当给出相同的数,差别只在浮点末位。
可复现但有代价的部分。 前向计算需要把二十四个检查点逐个取下来跑一遍。在本跑的条件下——单核、3GB 内存——整跑以小时计,且必须逐个清理缓存。换更大的机器会快很多,但计算本身不会变。
不可完全复现的部分,必须写明。 若有人在不同硬件、不同数值精度、不同批次划分下重跑,得到的隐藏状态会有末位差异,进而使距离在小数第三位上有出入。这不影响本编的任何结论——本编所用的差别都在小数第一、二位上——但它意味着”逐位相同”不是复现的标准。复现的标准应当是:同一张表的每一格落在同一量级上,且四个规模的相对关系不变。
无法复现的部分。 若那组公开检查点将来被撤下或替换,本跑不可复现。这不是假想的风险,公开模型的可得性会随时间变化。本书能做的只有把所用的名称、版本号与摘要值全部写明,使将来的人至少能判断手上的材料是不是同一批。
一处对复现者的提醒。 所用的相似度度量对神经元置换、正交变换与各向同性缩放不变。不要在它之前再加一层显式的置换对齐——那不会让结果更干净,只会引入一个新的自由参数,并使读数与本跑不可比。这一条写在这里,是因为它是一个很自然会犯的错误:在文献里,“先对齐再比较”是常规操作。
本章没有一个结论,它只是交代了尺子是怎么做的。之所以要用整整一章交代,是因为接下来两章的全部内容就是这把尺子量出来的数,而这两章会给出方向相反的读数。
方向相反的两列数字摆在一起时,第一反应总是去怀疑其中一列测错了。本章的作用是提前把”哪一列可能测错”这个问题的材料给足:两个通道用的是同一批模型、同一批探针、同一套采样位置,区别只在量的是内部状态还是输出分布。它们不是两次实验,是同一次实验的两个读数口。
下一章先看表征通道。