第七编 首跑
这一编报告的是一次真实执行过的实验,而这次实验的结论是”未能分辨”。
一个”未能分辨”的结论,最容易被怀疑的地方不是数据,是判据——人们会合理地怀疑,判据是不是被调整过,使得那个不舒服的结果得以被说成”未能分辨”而不是”判负”。
回答这种怀疑的唯一办法是把判据原样摆出来,连同它被冻结的证据一起摆。因此本章不作概述,直接给出预注册的全部内容,逐节附上它在执行之后显出的问题。这一编里有一节(第六十五章)专门讲这些问题中最重的一个,而那个问题恰恰出在预注册自己身上。
预注册文件的开头写着一句:本文件写定之后不再修改;任何修改都将以追加”偏离记录”的方式写在末尾。这一条被遵守了。下面的每一小节都对应原文件的一节。
模型族选定为一组公开的多种子检查点:四个规模(14M、31M、70M、160M),每个规模五个种子,取最终检查点。同语料、同架构、同判准、同超参,仅随机种子不同——种子同时决定权重初始化与数据呈现次序。
噪声基线材料:每个规模取一号种子的倒数第二个公开检查点,与其最终检查点构成”同一路径内相邻检查点”对。
执行后的评注:材料这一节没有出问题,它是整份预注册里最稳的一节。选这组材料的理由在第四编已经论证过——它是目前唯一同时满足可重跑、可干预、可消融、可观测四条性质,且对象恰好是知识主张的公开材料。真正出问题的是拿它当尺子的那一节。
分两组,共 112 条,执行前写入文件并计入摘要值,执行后不再增删。
A 组,分布内,64 条:取自一个公开的英文百科语料的测试划分,按返回顺序取前 64 条字符长度不小于 200 的段落,各截断为 128 个词元。
B 组,分布外,48 条,本实验构造,生成规则公开,各 16 条: - B1 归纳型:随机词元串重复三遍。 - B2 模算术型:模 17 的加法等式串。 - B3 中文型:中文段落(所用语料中中文占比极低)。
执行后的评注:这一节包含本跑最脆弱的一处自由参数,预注册自己也这样写了。B3 由本实验构造而非第三方基准,这件事在第五十五章已经正面写过,这里再记一次,因为第六十三章的分组读数全部压在这一节上。
层选取:相对深度 25%、50%、75%、100% 处的隐藏状态,按总层数向上取整,使不同规模之间可比。
表征距离:线性中心核对齐,取 1 减去相似度,四层平均。选它的理由写在预注册里:它对神经元置换、正交变换与各向同性缩放不变,因而已经消去了条款一要求消去的对称性,无需额外做置换对齐。这一条后来在执行中被确认是对的,也顺带避免了一个常见的多余步骤。
行为距离:各探针末位置的下一词元分布之间的对称散度,以 2 为底,取值落在 0 到 1 之间,在探针上平均。
合成距离:两通道各取一半权重合成,权重冻结。同时要求两通道分别单独报告。
执行后的评注,这一条必须写明:预注册定义了一个合成距离,但第 4 节的判据实际上是写在两个通道上的,且专门为”两通道结论不一致”留了一款。执行之后,两通道确实不一致——而这正是本跑最有信息量的一件事。本书因此不报告合成读数:把两个方向相反的读数按权重加起来,得到的单一数字会把不一致抹平,而不一致本身才是这次首跑真正交出来的东西。这是一处需要说明的取舍,说明写在这里,不藏在附录。
路径散度取五个种子共十对的平均距离。噪声基线取一号种子相邻两个检查点之间的距离。归一化路径散度定义为二者之比——使用比值而非绝对距离,是为了消去度量的整体尺度自由度。
判据三款,原样抄录:
条款一通过:归一化路径散度在可及规模上不趋向 1,即路径间差异始终显著大于同一路径内相邻检查点差异,且无向 1 衰减的单调趋势。 条款一判负:归一化路径散度单调下降,且在最大规模处不显著区别于 1。 未能分辨:表征通道与行为通道结论不一致;或归一化路径散度无稳定趋势。
执行后的评注:第三款是这份预注册最有价值的一条,而写它的时候并没有觉得它有多重要——它看起来像一条例行的兜底条款。执行之后它成了决定本跑结论的那一条。第六十四章专章论证为什么它给出的是一个结论而不是一次逃避。
预注册在执行前写明了三条局限。
其一,规模点仅四个、种子仅五个,远不足以做外推。本跑不报告不可消解度的外推值,只报告归一化路径散度在该区间内的实测行为。这一条被严格遵守:本编全编不出现该量的任何数值。
其二,噪声基线用相邻检查点代替同种子重训,这是一个偏保守的代理。 原文的理由是:相邻检查点之间的差异包含了训练仍在推进所造成的真实变化,因而基线偏大、比值偏小;若比值仍显著大于 1,这个偏差不利于本书而本书仍通过;若比值接近 1,则不能据此判负,须另做同种子重训基线。
这一条的推理是对的,结论是错的。 它正确地预见了这条基线会偏保守,却没有预见到它跨规模不可比。第六十五章专章处理。
其三,B3 中文探针为最脆弱处。 这一条被后来的分组读数坐实了。
预注册留有一节”执行前修订”,记录在任何模型被下载之前所做的改动。实际发生了一处:
原定的词元位置规则是固定位置采样,但这会使短探针——B1 的归纳串与 B3 的中文段——因长度不足而被整体跳过,导致分布外通道失效。改为按相对位置采样,并要求探针长度不低于 16,否则丢弃。
这处修订写定于任何模型被下载之前,因此不构成读数污染。把它记在预注册文件里而不是事后说明里,是这套制度的正常用法:修订不可耻,追溯修订才可耻。
探针集冻结后计算摘要值,前十六位为 e3b9d8a2795cceee。A
组 64 条、B1 至 B3 各 16 条,合计 112
条。这个值与全部脚本、原始读数文件一并公开,任何人都可以重建探针集并核对摘要值是否一致。
前面逐节评注的是”写了什么”。这一节记”该写而没写”,因为后者在执行之后显得更重要。
其一,合成权重的理由。 文件定义了两通道各半的合成,但没有写为什么是各半,也没有写这个合成在两通道不一致时该不该用。第 4 条第三款实际上隐含了”不该用”,但没有明写。首跑执行之后补进了第五十五章第四条硬规定。
其二,“显著”的阈值。 判据里出现了”显著大于”“不显著区别于”,而文件没有给出显著性的判定方式——用什么检验、什么水平、如何处理十对样本之间的非独立性(同一个种子出现在四对里)。首跑因此只能作定性判断。下一跑必须先把这一项定死。
其三,逐对读数的保留方式。 文件只要求报告均值与标准差,没有要求保留每一对的距离。结果是最大规模上那个异常大的标准差(0.206)无法进一步分析——它可能来自若干个离群对,也可能是整体离散,本跑分不开。这是一个零成本就能避免的损失。
其四,分组基线的处理方式。 文件规定了按探针组分别记录路径间距离,却没有规定各组基线如何使用。执行之后各组基线被记录了下来,而逐组相除得到的那张表(第六十三章第五节)是本跑最不利的一份读数——它是在预注册没有预见的地方冒出来的。
四条合起来说明一件事,第五十九章第四节已经把它写成了制度层的结论,这里给出它在本跑的具体形状:一份冻结清单的完备性只能由执行来检验,而一次执行只检验一次。
能证明:判据在执行之前就是这个样子;探针没有在看到读数之后被增删;三款判决规则中那条决定了本跑结论的,写在读数之前。
不能证明:判据写得对。
第五十九章已经把这句话作为一编的结语写过一次,这里要用具体的形式再说一次,因为它在本编有一个真实的实例。这份预注册在第 5 节里用了一整段论证为什么噪声基线的选择偏保守、因而安全;论证本身严密,逻辑没有错,前提也没有错——它只是漏了一件在执行之前无人想到的事。冻结把这个漏洞同样牢固地冻了进去。
这不是对预注册的否定。恰恰相反:正因为这条基线被写死并在四个规模上统一使用,它跨规模伸缩的毛病才显形;若它是每个规模随手取的,这毛病会被平滑掉,永远浮不出来。
下一章交代材料与实现的全部细节。