串讲 | 上一段(电路)发现分析单位「神经元 / head」是多义的,根源是叠加;这一段先把「为什么会多义」诊断清楚(superposition),再用字典学习 / SAE 把叠加的特征解出来,给整个领域换一套更干净的单位。主线:从「能读残差流」到「能把残差流拆成对的特征」。 | 2026-06

这一段在谱系里的位置

画电路那一段 的限制在这里变得很清楚:它默认「神经元 / attention head」就是可分析的原子,可一旦真去读单个神经元,发现它们是 多义 的。一个神经元可以同时对学术引用、HTTP 请求、韩文激活。电路图画在多义单位上,节点本身就没有干净语义,再精巧的因果干预也会被单位问题拖住。

所以问题不是「怎么读得更准」,而是 「读的单位错了」。这一段要做两件事:(1) 把「为什么神经元会多义」从经验观察升格成可解释的机制,答案是 叠加;(2) 既然真正的特征不对齐神经元,就得用 字典学习 事后把它们从叠加里解出来。这条线的母假设始终是 线性表示假说:特征 = 方向,激活 = 方向的线性加和;正因如此,「找特征」才能写成一个稀疏线性分解问题。

1. 诊断:Toy Models 把「叠加」做成可观测现象

Toy Models of Superposition 的贡献不是方法,而是 problem formulation。真实模型里我们没有 ground-truth feature,没法证明「叠加真实存在」还是「研究者强加的解读」。它的关键一招是退回合成数据:自己造一批稀疏特征 ,训一个极简 ReLU autoencoder ,把 个特征压进 维。这时 ground truth 已知,叠加是真发生还是被脑补,可直接从 看出来。

两个会泛化的硬核结论:

  • 稀疏度是开关,叠加是相变:把损失按稀疏度二项展开,「多塞一个特征的收益(feature benefit)」对抗「非正交干扰(interference)」。线性模型里干扰永远压过收益,解退化成 PCA,永不叠加;加一个 ReLU 后,在 1-sparse 情形下 负干扰免费,于是高稀疏时收益反超——叠加在某个稀疏阈值上不连续地涌现。 有闭式解,实证相图与理论一阶相变高度吻合。这同时解释了为什么单义神经元和多义神经元能共存于同一层。
  • 「解决叠加 ≈ 解决可枚举特征」:一旦叠加,特征既不对齐神经元,又不能靠 Gram–Schmidt 逐个剥离(cosine similarity 会被无关特征的正点积误导)。论文第 7 节几乎逐字写出了一年后 SAE 的纲领:事后找一个 overcomplete basis,即对真实模型做巨型 sparse coding。

边界:论文里那套漂亮的几何(特征排成 antipodal pair / 正多胞形 / Thomson problem 解)作者自己警告「太优雅以至于很可能部分是 toy model 的 idiosyncrasy」。读它时该把 相变 + benefit/interference + 单义多义共存 当作很可能泛化的部分,把 具体 polytope 几何 当作高度存疑、勿外推的部分。整篇还条件于线性表示假说成立;若真实特征有本质的非线性 / 多维流形表示,几何框架会部分失效。

delta:Toy Models 把「叠加」立为靶子,并指明现实出路是字典学习。但它没给出能在真实语言模型上工作的解法,下一篇填的就是这个空缺。

2. 解法:SAE 给出第一个 compelling existence proof

Towards Monosemanticity 把纲领变成可工作的工具:在一层 transformer 的 512 维 MLP 激活上训一个过完备稀疏自编码器ReLU 编码 → linear 解码),损失 = L2 重构 + L1 稀疏惩罚,字典倍率 1×–256×。核心的方法论判断从第一性出发:

  • 架构手段救不了多义(approach 1 被证伪):他们真训过 1-hot 激活去强行消除叠加,神经元照样多义。一个 toy 论证说清了原因——在 cross-entropy loss 下,让一个神经元兼表两个特征(loss )反而优于单义只表一个()。语言模型的 loss 本身就激励多义,所以只能事后解。
  • 经典字典学习「太强」:精确 compressed sensing 是 NP-hard,模型自己不可能在做;过强的求解器会「恢复出模型实际访问不到的结构」。于是落到一个字典学习器:SAE,它与 MLP 同构、表达力相当。这里的判断是:用与被解释对象同等表达力的工具去解释它

它的 delta 在于不止展示「几个漂亮的 top activating example」(那会让多义神经元假装单义),而是对单个特征走四路证据:激活特异性(Arabic feature 在 Arabic token 上激活占比 81%)、激活敏感性、因果下游效应(ablation / pin-to-max 续写能强行生成 Arabic 文本——而且下游效应不是字典学习的输入,构成独立证据)、跨模型 universality。全局上,feature 比 neuron 显著更可解释(人评 median interval 12 vs 0;自动 logit 预测 74% vs 58%;跨种子相关 0.72 vs 0.46)。

它还抛出一个影响整条线的现象——feature splitting:字典越大,一个粗特征会「分裂」成多个更细的 token-in-context 特征(1 个 base64 → 3 个;上百个不同语境的 “the”)。推论是「正确的特征数」可能根本不良定义,字典学习是在以不同分辨率「优雅降级」地逼近一组理想特征。

作者自己留下的问题(直接催生后续整条评估线):没有可信的进度指标(信息论度量与可解释性不相关,最后只能靠人工盲评 + Claude 自动解释,有循环风险);「A/1 解释了 MLP 79% 的 loss」不等于 79% 的机制被理解(长尾特征 + 低激活区或藏多义);token-in-context 的 local code 究竟是模型真实所用,还是 L1 过度稀疏的 artifact,未定论。

3. 变体:把 SAE 的「强度旋钮」反复调一遍

SAE 诞生即背着两笔债——L1 稀疏惩罚带来的偏差,和「稀疏 vs 重构」这条 Pareto 前沿怎么调。2024 的变体基本都在拧这个旋钮:

  • L1 的代价:magnitude shrinkage。L1 同时惩罚「是否激活」和「激活多大」,把所有激活值往下压,重构系统性偏小。Gated SAE(Rajamanoharan 2024)把这两件事解耦——一条门控通路决定哪些特征开,一条幅度通路决定开多大,L1 只压前者。
  • 干脆换掉 L1JumpReLU SAE(Rajamanoharan 2024)用阈值化激活(低于阈值直接置零)逼近 L0 而非 L1,去掉 shrinkage;Gemma Scope(Lieberum 2024)用它把开放 SAE 套件 scale 到 Gemma-2 全尺寸全层,是社区第一套「能直接拿来用」的大规模 SAE。TopK / BatchTopK SAE(Gao 2024/2025, OpenAI)更直接——每个样本只保留 K 个最大激活做硬稀疏,把「调 L0 系数」变成「定一个 K」,并改善了 scaling 行为。

这些变体的 delta 是 reconstruction–sparsity 前沿和工程可用性,但它们没有触碰一个更深的问题:解出来的特征是不是干净的单位

4. 评估危机:proxy 指标不迁移,特征会互相「吸收」

旋钮拧到一定程度,第二个问题出现了:我们一直在用错的指标判断 SAE 好坏

  • feature absorption(Chanin 2024)是一个结构性失败模式:一个一般特征(如「以字母 E 开头」)会被一个更专用的特征(如「elephant」)吸收——专用特征激活时,一般特征反而沉默。结果是单个特征看起来很单义、重构 loss 也好,但特征集合在语义上是破碎、不一致的。L1 / TopK 这类硬稀疏会加剧它(鼓励用一个特征顶替本该两个特征一起激活的情形)。
  • SAEBench(Karvonen 2025)用 8 个指标系统验证:reconstruction loss、L0 这些大家天天看的 proxy 不迁移到下游可解释性——一个重构更好、更稀疏的 SAE,未必在概念探测、absorption 等下游任务上更好。这等于宣告前一节那场「调旋钮竞赛」的裁判标准本身不可靠。
  • Matryoshka SAE(Bussmann 2025)是对 absorption 的一个结构性回应:嵌套字典,强制字典的前缀也能独立重建,于是粗特征被逼进前缀、细特征进后缀,形成 coarse→fine 层级,缓解 absorption 与 splitting。

边界:这一节的信息是,SAE 解出的「单义特征」漂亮,但「漂亮」和「是模型真正在用的单位」是两回事。proxy 指标的崩塌说明,我们对「什么是好特征」其实没有 ground truth。

5. 转向:从「重建状态」到「重建计算」

最后一个动作改变了 SAE 的对象本身。原始 SAE 重建的是激活状态(某层此刻的向量),但可解释性想要的是计算(这一步在算什么)。

  • Transcoders(Dunefsky 2024)不重建某层激活,而是对一个 MLP 学 input→output 的稀疏映射——学的是「这个 MLP 在算什么函数」,而非「它此刻的状态长什么样」。好处是解出的特征天然带因果方向,能直接拼进电路。
  • Crosscoders(Lindsey 2024)让一个共享字典跨层 / 跨模型重建,支撑 model diffing(比较两个模型的特征差异),也缓解「同一特征在每层被重复解一遍」的冗余。

这一转向把字典学习从「快照」推向「机制」,并与 电路那一段 重新合流。transcoder 特征后来成了 attribution graph 的积木。

through-line

这一段的主线:当分析单位本身多义,任何上层分析都不可靠 → 先诊断多义的根因(叠加是稀疏度驱动的相变),再用过完备稀疏字典把特征解出来(SAE existence proof),然后在调旋钮(Gated/JumpReLU/TopK)与发现旋钮指标不可靠(absorption / SAEBench)之间往返,最后把对象从「重建状态」升级为「重建计算」(transcoder/crosscoder)。

但它没解决的核心问题是 忠实性:SAE 特征是事后从激活里解出来的,它单义、可解释,却未必是模型计算时真正使用的单位。proxy 指标不迁移、feature absorption 都是这个怀疑的具体形态。「重建得好」「看起来单义」都不等于「因果忠实」。

下一段的问题就很自然:既然事后从激活里解特征总有「这是不是模型真用的单位」的疑云,能不能换个地方找单位,直接在函数空间 / 参数空间里定义,或在训练时 by construction 就让单位干净?见 参数空间与有效性批判