封面

  • 日期:2026-10-16
  • 适合读者:研究生、科研新人、工程型研究者
  • 实际范围:真实 GPT-2 small;公开 IOI 模板构造的 64 条英文样本;仅行为评测。

摘要:先确定要解释的行为

上一单元追问分数怎样被提示、评分和选择过程改变,本篇开始追问模型内部怎样产生一个具体行为。转折点不是换一张注意力热图,而是建立一个足够清楚、能重复测量的研究对象:当句子说两个人一起去商店,其中一个把东西交给另一个时,模型更倾向补出谁的名字?

本次实际运行中,正确名字在全部六十四条样本上都排在全词表第一,平均 logit 差为 4.446,平均正确名字概率为 0.600。结果说明这组材料上存在可研究的行为;它不意味着完整复现了论文,也不能证明模型使用了人类想象的语法规则。最弱样本的正确名字概率只有 0.172,准确率已经把这种差异藏起来了。

复现价值:把一个回答变成可核查对象

间接宾语识别,简称 IOI,是让模型补全句末接收物品者的名字。例如本次第零条输入说 Christopher 和 Michael 去商店,接着 Christopher 把戒指交给……目标是 Michael,干扰答案是 Christopher。这里的“正确”来自受控任务的角色约定,而非对自然语言所有可能续写的排他判定。

Wang、Variengien、Conmy、Shlegeris 与 Steinhardt 的原论文于二〇二二年发表预印本,研究 GPT-2 small 的这一行为,并用干预分析提出由二十六个注意力头组成的解释。论文还用忠实性、完整性和最小性检验解释,而不是把漂亮热图当作结论。这是论文报告;本篇没有实施这些干预。原论文

我们的复现目标更窄:固定权重、名字和模板,确认信号方向,留下每条输入、位置、原始分数与聚合关系。它为后续激活替换提供参照点。若干净输入尚未产生稳定信号,任何“恢复百分比”的分母都可能失去意义。

核心思想与公式:比较两个名字,也看整个词表

logit 是 softmax 转成概率前的实数得分,并非概率本身。对第 ii 条输入,主要指标为:

Δi=zi,IO−zi,S,Δˉ=1n∑i=1nΔi\Delta_i=z_{i,\mathrm{IO}}-z_{i,\mathrm{S}},\qquad \bar\Delta=\frac{1}{n}\sum_{i=1}^{n}\Delta_i

其中 n=64n=64,IO 指应接收物品的人,S 指后半句的主语;zz 是答案生成前最后一个输入位置的词表得分。差值为正,只表示正确名字比指定干扰名字更受偏好。平均差值是本篇预先指定的主要指标,避免看到全对后临时改用最有利统计量。

qi=ezi,IOezi,IO+ezi,S=σ(Δi),pi=ezi,IO∑v∈Vezi,vq_i=\frac{e^{z_{i,\mathrm{IO}}}}{e^{z_{i,\mathrm{IO}}}+e^{z_{i,\mathrm{S}}}}=\sigma(\Delta_i),\qquad p_i=\frac{e^{z_{i,\mathrm{IO}}}}{\sum_{v\in V}e^{z_{i,v}}}

qiq_i 是限制在两个候选内的条件概率,σ\sigma 是 sigmoid 函数;pip_i 是正确名字在完整词表 VV 中的概率。两者分母不同,不能互称“置信度”。本次平均 qiq_i 为 0.969,却不能据此声称模型给正确答案分配了百分之九十六点九的绝对概率。

GPT-2 的实际输出张量为 [1,L,50257][1,L,50257]:批大小为一,LL 为输入长度,本次为十五或十九,最后一维为词表。末位置隐藏向量为 [768][768];经最终归一化后的隐藏状态通过语言模型输出层映射成词表得分。位置检查和模型调用同样重要,读错一格会变成预测另一个词的实验。

官方代码阅读路线

先读作者仓库的名字表与 BABA_TEMPLATES,再看初始两个人名交换后得到的 ABBA 模板。A 表示目标人物,B 表示重复出现的主语;这串字母包括尚未输入的末尾答案。随后读 gen_prompt_uniform 的对称交换,理解更换角色时答案为什么也必须更新。固定生成器

第二站是 ioi_utils.logit_diff:它从每条样本的 end 位置读取 IO 与 S 得分并相减。第三站是 Transformers 的 GPT-2 输出层。本次使用版本 4.49.0 的正式实现,已将安装文件与固定提交逐字节核对;没有整套安装旧 Easy-Transformer,也没有声称验证了 TransformerLens 权重变换后的等价性。源码地图明确区分模板改编、官方模型调用和独立算术审计。固定计分函数

最小实验:冻结哪些变量

IOI 行为基线流程

模型与 tokenizer 均固定在 607a30d783dfa663caf39e06633721c8d4cfcd7e,官方模板固定在 ea15315dd24481e9e2ac5c3ef335d82907a1dc34。下载器核对八个文件的 SHA-256,样本另以完整文件哈希标识。数据来自公开模板的确定性展开,没有虚构数据集 revision。固定模型卡

实验取官方列表前八个名字,按列表相邻且首尾相接构成八对,每对再交换角色;取前两个句式,各做 ABBA 与 BABA 两种顺序。由此得到四个条件,每个十六条。地点固定为商店,物品固定为戒指。相比原作者随机选择更多名字、地点和物品的生成器,我们主动收缩了变化范围,不能把这里的高分同论文的大规模结果排名比较。

配置在推理前冻结:CPU、float32、eager attention、四线程、随机种子一百、批大小一;使用评测模式,不训练、不自由生成、不加句首特殊符号、不截断。每条候选必须含前导空格且恰为一个 token,完整“前缀加答案”的编码必须等于前缀 token 加答案 token。目标名字在前缀出现一次,主语出现两次,三个位置全部保存。

资源先用两条样本试跑,预算为一千二百秒和四 GiB 峰值内存;通过后才运行六十四条。正式进程墙钟耗时 5.418 秒,其中记录的前向循环耗时 1.878 秒,峰值常驻内存为 1,604,501,504 字节。它们是本机实测,不是吞吐量宣传;下载时间和环境安装不包含其中。没有缓存全部注意力头的激活,因此不能据此估算后续电路扫描成本。

具体看第零条,目标名字的 token 编号为 3899,干扰名字为 12803;零起算位置分别为四,以及二、十,最后输入位置为十四。读者可以直接把这些位置同保存的 token 字符串逐项对上。前导空格属于名字编码的一部分,不能先去掉再凭肉眼断言相同。候选后面也没有加标点或终止符,因此本篇计分对象始终是下一个单 token 的名字。

这个设计对初学者还有一个实用约束:先把条件表写清,再下载模型。八对名字并不是八个互不重叠的人群,同一个人名会进入相邻两对;对称交换则保证每对的两个名字都当过目标和主语。它有助于避免总是让某个常见名字充当答案,却不能让样本突然满足统计独立性。把实验单位说明白,比后期给表格机械加误差线更有价值。

评测协议与本次结果

条件 样本数 平均 logit 差 正确名字平均概率 全词表第一名正确数
句式零,BABA 16 3.808 0.534 16
句式零,ABBA 16 4.997 0.663 16
句式一,BABA 16 4.294 0.567 16
句式一,ABBA 16 4.685 0.635 16
全部 64 4.446 0.600 64

四组都全对,但分数间隔并不相同。由于同一名字跨多个条件重复出现,这些行不是六十四个独立自然样本;本篇不对行做普通 bootstrap 后宣称总体显著。表中组间差异是这份固定设计的描述性证据,也不等于单独发现了位置偏差的内部原因。

第八条是预定主指标最弱的样本:Jennifer 给 Ashley 戒指,目标 Ashley 的概率为 0.172,Jennifer 为 0.105,差值仅 0.489。它仍然全词表排名第一,因为其他词的概率也较低。这提醒我们,正确率饱和时应继续保留连续指标,而不是为了制造失败临时增删样本。

独立标准库脚本重新核对六十四条的分数相减、概率比、位置、角色映射和全部均值;另用四类故意损坏记录确认审计会报错。脚本、输入哈希、命令和退出码一起归档。这是自动复算,没有把机器检查称为真人审核。

只根据正负号或第一名选择后续干预材料,会把容易测量的例子与强信号例子混为一谈。我们保留全部六十四条作为开发材料,也保留最小与最大差值;下一篇若需缩小扫描范围,应按预先制定的预算规则选择,并说明选择是否看过本篇分数。不能在全量结果已经可见后,把再次抽出的子集叫作未见确认集。

另一个容易忽略的细节是聚合顺序:先对每条差值应用 sigmoid 再求平均,与先平均差值再应用 sigmoid 通常不同。正文报告前一种;独立脚本同时利用概率之比的对数核对原始差值,避免把两个名字的条件概率误填进绝对概率列。这类确定性检查可以交给脚本,但它不代替对模板语义和未来破坏操作合法性的判断。

失败排查:先检查测量链,再解释模型

首次真实试跑在输出层检查失败:把末位置向量单独乘输出矩阵,与批量矩阵乘法结果相比,最大误差为 0.000160,略高于预设绝对阈值。双精度对照支持浮点舍入解释,同形状重算则完全一致。正式运行前将硬检查改为同形状精确一致,并继续保存单向量误差;原失败脚本、日志和修订记录均保留。没有因这个问题换名字或挑模板。

补充审计独立重跑全部输入,用标准库在五万多个词表得分中取最大值,六十四个第一名及候选原始得分均一致。但用双精度指数求和复算绝对概率时,与官方 float32 输出的最大差异为 0.000045;正文各组均值保留三位小数不受影响。这个差异已记录,不把概率逐位一致当作已通过的结论。

恢复实验时,首先核对模型和样本哈希;其次检查前导空格与答案是否被拆成多个 token;然后核对最后位置是否是输入的末尾,而非把答案也喂进去。若这些通过,再看实际分数。更换模型库、加入句首符号、做半精度或改变 padding 时,都应视为新协议并重新验证,不能沿用缓存中的漂亮结果。

从行为证据走向可检验问题

作者推断是:这组强而未完全饱和的连续信号适合开展下一步因果干预。至少有两种竞争解释需要区分:模型利用重复名字的信息排除主语,或者依赖名字频率、初始位置与固定句式的组合捷径。对称交换减少部分角色频次混杂,但不能单凭它排除这些替代解释。

下一篇应先定义语义明确的干净与破坏配对,保留不替换和完整替换对照,再问某个位置的激活能否恢复得分。组件排序必须只在开发材料上选择。本次已预留官方列表接下来的八个名字及模板二、三,没有对它们推理;未来迁移失败也不能回头挑一套能赢的头来称作验证。

源码与复现入口

完整源码已发布并匿名下载核验:固定提交目录、运行说明 README、官方实现对应 SOURCE_MAP。全部四十五个公开文件与本地归档逐一一致,公开副本的独立审计、破坏性检查及真实两条试跑均通过。原始输出与首次试跑失败记录一并保留。

安装锁定依赖并下载固定资源后,最小真实入口是:

python run.py --cache ./cache --smoke --out smoke-new
python audit.py --results smoke-new

第一条生成两条真实模型记录、聚合结果、阶段状态及环境身份;第二条独立复算。完整命令去掉 smoke 参数即可重放六十四条。本次确实运行了正式范围;重新执行属于复现已见材料,不是新的盲测。源码不携带权重或隐藏的本机模块,模板重建脚本可从固定官方文件恢复相同样本。

总结

这一篇留下的核心资产,是一套能回答“输入是什么、读了哪个位置、分数怎样得到”的行为基线。全部答对并不结束研究;低间隔样本、顺序差异和保留材料,才使下一步问题有机会被证伪。关于电路的任何解释,都应在这些可审查事实之后提出。

参考资料

检索与实际打开日期:2026-10-16;固定版本与许可详见源码地图。

  1. Wang, K., Variengien, A., Conmy, A., Shlegeris, B., Steinhardt, J. (2022). Interpretability in the Wild: a Circuit for Indirect Object Identification in GPT-2 small,v1。
  2. 作者团队:官方 IOI 代码与实验入口。
  3. OpenAI community / Hugging Face:GPT-2 固定模型卡。
  4. Hugging Face:Transformers 4.49.0 对应 GPT-2 官方实现。
  5. TransformerLens:Exploratory Analysis Demo,后续干预阅读入口;本篇未运行该示例,动态页面不作为本次执行版本。