Induction Circuit 图集(重绘版)

按指定图清单重画的 7 张图与 1 个表格。本页只记录每个图/表的做法、数据来源与图中各成分的含义,不作推断与结论。

模型与通用设置

图 1:第二层各 head 的 induction score

做法与数据。读取 analysis_outputs/openwebtext_seed777/summary.json 中的 layer2_induction_scores。该数组由 verify_openwebtext_induction_circuit.py 在 32 条受控序列(生成 seed 20260727)上测得:对第二层每个 head,取 query = A₂(位置 24)对 key = B₁(位置 9)的 attention 概率,再对 32 条序列取平均。

图的构成。横轴为第二层 12 个 head(H0–H11),纵轴为 induction score。红色柱为最大值 H9 = 0.4689,其余为灰色;柱顶标注具体数值。

fig1
图 1:L2 各 head 的 induction score(mean attention A₂→B₁)。

图 2:全局移除每个第一层 head 的输出后,A₂→B₁ attention 的下降

做法与数据。make_redrawn_figures.py 现场计算(同一批 32 条受控序列,seed 20260727)。对第一层每个 head:从残差流中所有位置减去该 head 经 W_O 投影后的逐 head 输出向量,然后测量 L2-H9 的 A₂→B₁ attention。与位置级消融的区别在于:这里不指定干预位置,该 head 在每个 token 处的写入都被同时移除。两种计算方式:

图的构成。横轴为被全局消融的第一层 head,纵轴为 attention 下降量 = 基线 0.4689 − 消融后 attention(正值表示 attention 降低,负值表示升高)。蓝柱为 direct 变体,红柱为 recomputed 变体。数值记录:H0 全局移除 → direct 0.0155 / recomputed 0.0211(下降 0.453 / 0.448);H6 全局移除 → direct 0.1299 / recomputed 0.0736(下降 0.339 / 0.395);其余 head 的下降量绝对值均不超过 0.11。

fig2
图 2:逐 head 全局消融(所有位置)对 induction attention 的影响,两种 MLP 处理变体并列。

图 3:第一层各 head 的 previous-token score

做法与数据。读取 summary.json 中的 layer1_previous_token_scores(32 条受控序列,seed 20260727)。previous-token score 定义为第一层某 head 的 attention(t→t−1) 对所有可见位置与所有序列的平均,即 attention 矩阵次对角线的均值。

图的构成。横轴为第一层 12 个 head,纵轴为 previous-token score。红色柱为最大值 H0 = 0.9753;柱顶标注数值。

fig3
图 3:L1 各 head 的 previous-token score(mean attention t→t−1)。

图 3b:H0 的 attention map。make_head_pattern_figures.py 现场计算:256 条受控序列(seed 20260727)上 L1-H0 的 attention 矩阵对 batch 取平均。横轴为 key 位置、纵轴为 query 位置(0–31),白色网格线与竖排标签标出 A₁(8)、B₁(9)、A₂(24)、B₂(25)。青色方框标出次对角线(t→t−1),其均值即 previous-token score = 0.9772(与图 3 的 0.9753 的差异来自 batch 大小:32 vs 256 条)。数值记录:H0 在 B₁→A₁ 格的平均 attention = 次对角线均值的一部分,整张图次对角线之外接近 0。

fig3b
图 3b:L1-H0 的平均 attention pattern(256 条受控序列)。青色框为次对角线(t→t−1)。

图 4:第一层各 head 的 self-attention score

做法与数据。读取 analysis_outputs/openwebtext_seed777_l1h6_attention_pattern/summary.json 中的 all_heads 列表(由 analyze_l1h6_attention_pattern.py 在 128 条受控序列上测得;该批序列额外在位置 16/17 放置了一对无关 token C₁/D₁)。self-attention score 定义为第一层某 head 的 attention(t→t) 对所有位置与所有序列的平均,即 attention 矩阵主对角线的均值。

图的构成。横轴为第一层 12 个 head,纵轴为 self-attention score。蓝色柱为最大值 H6 = 0.9770;柱顶标注数值。

fig4
图 4:L1 各 head 的 self-attention score(mean attention t→t)。

图 4b:H6 的 attention map。与图 3b 同一脚本、同一批 256 条序列,取 L1-H6 的平均 attention 矩阵。青色方框标出主对角线(t→t),其均值即 self-attention score = 0.9764(与图 4 的 0.9770 的差异来自 batch 与序列配置:图 4 数据源为 128 条含 C₁/D₁ 的序列)。图中还可见 A₂/A₁ 与 B₁/B₂ 之间一个较暗的 2×2 互相关块(位置 24/25 行 × 8/9 列),以及 B₂→B₁ 格。

fig4b
图 4b:L1-H6 的平均 attention pattern(256 条受控序列)。青色框为主对角线(t→t)。

图 5:注入 previous-token head 残差前后的 L2-H9 attention map + 逐 destination attention lift

做法与数据。controlled_batch 生成 1 条受控序列(seed 20260727):A = token 17859(位置 8 与 24),B = token 14278(位置 9 与 25),其余位置为互不相同的随机 token id。手工前向到第一层,取出 L1-H0 在 B₁ 位置(位置 9)经 W_O 投影后的逐 head 残差输出向量(即 per_head_residual[:, 0, 9],维度 768,下称 H0(B₁) writer 向量)。对 A₂ 可见的每个候选 destination(位置 0–23,排除 B₁ 自身),把该向量到 destination 已有的残差流上(add,不替换;其他位置不变,不重算第一层 MLP),重算第二层 attention,记录 A₂ query 对该 destination 的 attention lift。上半部分双热图演示 lift 最强的 destination(本序列上为位置 1),下半部分为全部 destination 的 lift 柱状图。

图的构成。上半部分:左图为未注入的 base 模型,右图为把 H0(B₁) 向量加到 key 位置 1 之后的模型;两图均为该单条序列上 L2-H9 的完整 attention 矩阵,横轴 key、纵轴 query,刻度标签为位置编号(0–31),共用同一色标(vmin=0、vmax=1.0;矩阵中存在 attention=1 的饱和格,如 query 0 对 key 0)。白色网格线与竖排标签标出 A₁(8)、B₁(9)、inj(演示 destination)、A₂(24)、B₂(25);青色方框 = query A₂ × 注入的 key,绿色方框 = query A₂ × key B₁,两格内直接标注数值。下半部分:横轴为注入 destination(key 位置),纵轴为 A₂ query 的 attention lift(注入后 − base);红色柱子为上方热图所用 destination,并标注其 lift 数值。数值记录(destination = 1):base A₂→1 = 0.048、A₂→B₁ = 0.656;注入后 A₂→1 = 0.882、A₂→B₁ = 0.081;lift = 0.834。

fig5
图 5:上:base 与注入后(destination = 1)的 L2-H9 attention map;下:同一序列上 23 个 destination 的 A₂-query attention lift,红色柱子为热图演示所用 destination。

图 6:三头 induction machine 在合成序列上的逐位置 loss

做法与数据。按上述三头机器定义做前向,在 256 条受控序列(生成 seed 20260730)上计算每个 logit 位置对下一 token 的 cross-entropy loss(softmax 取负对数)。实现与 visualize_three_head_induction_machine.py 相同。

图的构成。横轴为 logit 位置(0–30,位置 i 的 loss 对应预测位置 i+1 的 token),刻度标签为其中一条示例序列在该位置的 token id。红色实线为该示例序列的逐位置 loss;浅色线为 256 条序列的逐位置均值。两条竖虚线分别标出位置 8(A₁ 处,预测目标是 B₁)与位置 24(A₂ 处,预测目标是重复的 B₂,即 induction 位置)。数值记录:示例序列 A₁ 处 loss = 13.41、A₂ 处 = 6.50;batch 均值 A₁ 处 = 12.63、A₂ 处 = 7.12、其余位置平均 = 12.66。

fig6
图 6:合成 A B … A B 序列上三头机器的逐位置 next-token loss。

图 7:三头 induction machine 在一段自然语言上的逐 token loss

做法与数据。读取 analysis_outputs/openwebtext_seed777_three_head_real_induction/nearby_induction_token_prediction_table.html 中的逐 token 预测表(由 make_nearby_induction_prediction_table.pyadd_real_text_prediction_window.py 生成)。文本为一段关于 lava tube 的 OpenWebText 连续窗口;其中 ␠the(logit 位置 338)→ ␠tube(339)这一 token-pair 在位置 349/350 原样重复,构成一次 AB…AB,间隔 11 个 token。图中截取 logit 位置 333–355(23 个 token,AB…AB 两侧各多 5 个位置)。loss 列为三头机器在每个 logit 位置对真实下一 token 的 cross-entropy。

图的构成。横轴刻度标签为当前 token 的文本(· 表示 token 开头的空格;? 表示源文本中已损坏的字符),按 logit 位置 333–355 顺序水平排列。柱与红色折线是同一组 loss 数据的两种画法。背景色带标出四个特殊位置(图例中给出位置号):淡黄 = 第一次 A(338),淡蓝 = 第一次 B(339),橙 = 第二次 A(349,induction query),蓝 = 第二次 B(350)。数值记录:第二次 A 处 loss = 6.282,第一次 A 处 = 8.562。

fig7
图 7:含一次 " the tube … the tube" 重复的真实文本窗口(截取 AB…AB 两侧各 5 个位置)上,三头机器的逐 token loss。

表 8:Harry Potter 文本上两次对 Potter 的预测

做法与数据。读取 harry_potter_prediction_window.html 的逐 token 表(由 make_named_pair_prediction_window.py 生成)。文本段中完整的 BPE token-pair ␠Harry ␠Potter 只出现两次:第一次在位置 331/332,第二次在 392/393,间隔 61 个 token。两个 Harry 位置的真实下一 token 都是 ␠Potter,因此 P(␠Potter) = exp(−loss)。三头机器与完整 Transformer(全部 heads + MLP)在同一文本上分别前向。

logit 位置当前 token真实下一 token三头机器 top-1(概率)三头机器 loss三头机器 P(␠Potter)完整模型 top-1(概率)完整模型 loss完整模型 P(␠Potter)
331(第一次)␠Harry␠Potter␠Luther(1.51%)6.5490.14%␠Potter(6.84%)2.6826.84%
392(第二次,induction query)␠Harry␠Potter␠Potter(3.24%)3.4313.24%␠Potter(81.86%)0.20081.87%

核查记录

针对两处观察到的现象,用独立重写的前向代码(analysis/verify_redrawn_checks.py,不调用 attention_terms,自行实现 QK score、causal mask、softmax 与逐 head 投影)做了核对:

复现方式