第 10 章 · LM head 与权重共享Jacobian lens

Jacobian lens

深入阅读 · 第 10 章 LM head——用来修那块 logit lens 读不动的模糊中间层。而且和那一页不同,这一页跑的是一个真正拟合过的 lens,就在你浏览器里的 Qwen3.5-0.8B 上。

logit lens 那一页最后停在一块诚实的盲区上:一个中间的 h_ℓ 对共享的 unembedding W_U 而言是 off-distribution 的,所以把它直接推过 W_U,在中段读出来的是噪声——而中段恰恰是你最想读的地方。修法是:别再裸读 h_ℓ,先把它搬运到 unembedding 被训练去读的那个坐标系里。这就是 Jacobian lens;而且和 logit lens 那一页不同,本页把这个拟合过的 lens 实时跑起来:把它打开,看那些原本迟迟不肯收敛的层如何变得可读。

什么是 Jacobian lens

保留 LM head 那一次 matmul,只在它前面塞进一个逐层的映射 J_ℓ

J_ℓ 是一个逐层的、在语料上取平均的一阶(Jacobian)映射,刻画在 layer 处一个小扰动如何推动最后那个 residual。用上它,就把 h_ℓ 搬运进最后一层的坐标系,让共享的 unembedding 去读——于是读法匹配的是 stack 顶端所期待的,而不是 layer 裸露出来的样子。两个邻居能帮你定位它:logit lens 就是这个公式里 (裸读 residual);tuned lens 则把 J_ℓ 换成一个端到端学出来的逐层 affine 探针(Belrose 等人,EleutherAI,2023)。

不是 tuned lens——目标不一样

值得把它和 tuned lens 的区别说准。tuned lens 的优化目标是让它的读数和下一个 token 吻合——它最小化的是与模型自身输出分布之间的 KL。Jacobian lens 什么都不优化成这样:它靠把每一层经过网络自身的平均 Jacobian 搬运,来读出那一层真正编码的东西。「和下一个 token 最吻合」与「对中间层读得最好」是两个不同的目标;当它们不一致时,那是特性而不是缺陷——两种 lens 回答的本就是两个不同的问题。

我们拟合了什么——又没拟合什么

来源要说得直白。我们把 23 个映射 J_1..J_23100 条 WikiText 提示(wikitext-103-raw-v1,原始文本,不套 chat template)上、在这颗 Qwen3.5-0.8B 上拟合——在笔记本上约 11 小时——拟合目标设为 final norm 之前的那个最后 residual。输出边界 ℓ24 按构造保持 ,所以这个拟合的 lens 只作用在中间层。方法是 Anthropic 的;fit 和本页每一个数字都是我们的,来自一颗小小的开源模型。拟合脚本和那些 vendored 的 eval 套件都在仓库里(packages/browser/scripts/jlens/),Apache-2.0 许可,所以整件事从头到尾可复现。

实时看它跑起来

在一个精选提示上切换 LOGIT | JACOBIAN。baked 帧无需下载、瞬间渲染;「在你的设备上实时计算」会在浏览器里的模型上重算它(JACOBIAN 模式还会一次性加载拟合的 pack)。看一个被 logit lens 一直压在 rank 999+ 的概念,如何在拟合的 J 下、于 stack 中段一下子蹿进 top 几名。

Jacobian lens——同样的层,但更锐利
Jacobian lens · 已应用拟合的 J离线预计算 · 在这颗 Qwen3.5-0.8B 上拟合
提示
Lens
提示(原始文本——不套 chat template)
La saison après l'été est l'
要追踪 rank 的概念 token
·season·summer·autumn·automne

Headline: mid-stack the J-lens surfaces the abstract concept ('season' near rank 1, 'summer' near rank 2, around boundaries 16-17) where the plain logit lens is still ranked 999+. A clean mid-band concept cluster. The target token is 'automne' (autumn).

每一层的 top token(最深的在最上面)

高亮的最后一列是下一个 token 的预测——从下往上读(从浅层到深层),看深度如何把答案解出来。

输出边界 ℓ24 按构造就是 J = I,所以它的 Jacobian 读数和 logit 读数完全相同——拟合的 Jacobian 作用在中间层,而不是在输出处。

ℓ24 · 位置 9 · 在 "'" 之后全词表概率
année
0.670
été
0.116
occasion
0.033
automne
0.023
heure
0.020
âge
0.012
ère
0.008
endroit
0.007
ann
0.007
histoire
0.005
概念 token 的 rank 随深度变化(最后一个位置)
rank →999+rank 1
·season最好 rank 2在 ℓ16 浮现·summer最好 rank 12始终进不了 top-10·autumn最好 rank 9在 ℓ20 浮现·autom最好 rank 999始终进不了 top-10*

热力图追踪的是被 pin 的表层形式(带前导空格的那个 token)的 rank,所以一个概念在中间层可能停在 rank 4 附近,即使网格里的 top token 已经读出这个词——网格看的是 argmax,热力图看的是被 pin 形式的全词表 rank。

诚实地读:栈的前三分之一是有噪声的,每个 pin 只追踪一个表层形式的 token,有些读数本身就难以干净地解释。

这个拟合的 lens 真的有用吗?

实时 demo 可以挑好看的说。所以这里给出聚合结果,来自我们六个 vendored eval 套件(论文 §methods-comparison 的那些提示)。headline 指标是一个归一化的 log-k pass@k AUC——越高表示目标/中间概念变得可读得越早、在越多深度上可读——其中 rank 取在拟合域上的 min ℓ1..23。在这一次运行里,Jacobian lens 在 六个套件里赢了六个

J-lens vs logit-lens · headline AUC(min over ℓ1..23)· 来自 eval-results-v1.json
SuiteJ-lens AUClogit-lens AUCJ 胜
typo0.7810.432
order-ops0.6380.242
multihop0.5300.262
multilingual0.4840.265
association0.0530.003
poetry0.0390.031

诚实地读这张表。AUC 更高不等于「模型答对了」——它的意思是:在拟合的 lens 下,答案或某个中间概念变得可读得更早、跨越更多层。而且两个最难的套件——poetryassociation——对两种 lens 都贴着地板(J-AUC 0.039 和 0.053;logit-AUC 0.031 和 0.003):Jacobian lens 仍然赢,但在这种对 0.8B 来说很难的任务上,两种 lens 都读不出多少。用这条命令复现整张表:JLENS_PACK=lens-pack-v1.safetensors JLENS_OUT=eval-results-v1.json oxnode packages/browser/scripts/jlens/eval.mts

增益到底在哪儿

这份优势并不是沿 stack 均匀铺开的——它是一条中段的带子。四个衡量 band 结构的 proxy 检测器全部触发(4/4);而直接测量它的那个——在给定边界上,J-lens rank 优于 logit rank 的 eval 中间概念所占的比例——从早段带子里在 ℓ6-7 附近抬起来,并在 ℓ17 达到峰值(比例 0.595,对比早段带子的 0.158)。要留意 headline AUC 是什么、不是什么:它是在整个拟合域上取 min ℓ1..23,而不是一个限制在带子内的分数——band 的故事解释的是这个 min 大概来自哪里,并不改变这个数字是怎么算出来的。

widget 里那个法语 headline 提示,就是这件事的定性面孔:对 La saison après l’été est l’,抽象概念 seasonsummer 在拟合的 J 下、于边界 16–17 附近浮到 rank 1–2 左右,而 plain logit lens 在同样的深度上把它们死死压在 rank 999+。

Anthropic 在前沿规模上看到的

他们自己的模型(Claude)上,Anthropic 报告 Jacobian lens 能读出丰富、可言说的中间内容——workspace 带子大约 k~25 层宽,读数在 ≤10% 的方差内稳定。那些数字是 Sonnet-4.5 的,在 Anthropic 的模型上,出自他们的论文 Verbalizable Representations Form a Global Workspace in Language Models(transformer-circuits.pub,2026)。他们的 causal、swap、tuned-lens 实验我们既不运行也不复现。一颗 0.8B 是否也有那么丰富,明确未知——上面的 6/6 是在一颗小开源模型上、只做 readout 的部分复现,并不是对他们结果的主张。
诚实地读这些读数
  • 每一条 rank 轨迹追踪的都是一个单 token 的表层形式(带前导空格的那个 token);一个被切成多个 token 的概念,只追踪它的第一片。
  • 一个 readout 是一袋没有绑定的概念——它告诉你某个方向存在,而不是它如何被组合、如何绑定到某个角色上。要预期有些读数本身就难以干净地解释。
  • 对两种 lens 来说,stack 的前三分之一都是有噪声的;默认视图正因如此隐藏了 ℓ1..5
  • 输出边界 ℓ24 按构造是 ,所以它的 Jacobian 读数和 logit 读数完全相同——拟合的映射只作用在中间层。
  • k~25 的宽度和 ≤10% 的方差是 Sonnet-4.5 的,不是我们的;一颗 0.8B 是否带有可比的结构,未知。
  • 我们的 fit 用了 100 条 WikiText 提示、不套 chat template;它是一次小而诚实的拟合,不是一个生产级的 lens。

拟合配方和那六个 vendored eval 套件是 Apache-2.0(上游:anthropics/jacobian-lens);见 packages/browser/scripts/jlens/data/NOTICE