稀疏交叉编码器:用于跨层特征提取与模型差异比较的新工具
Sparse Crosscoders for Cross-Layer Features and Model Diffing
本文介绍了一种新型的稀疏交叉编码器,它能够同时读取和写入神经网络多个层的激活值,从而提取跨层的共享特征。其主要应用包括:解决跨层叠加问题,追踪残差流中的持久特征;通过消除“重复特征”和跨越无意义的连接来简化电路分析;以及为不同训练阶段或不同架构的模型生成共享特征集,以实现模型差异比较。初步实验验证了其在处理跨层叠加和模型比较方面的潜力。
Anthropic 提出跨层可解释性新方法,有望大幅简化大模型内部电路分析
跨层特征与模型差异比较的稀疏交叉编码器
跨层特征与模型差异比较的稀疏交叉编码器
作者
Jack Lindsey*、Adly Templeton*、Jonathan Marcus*、Thomas Conerly*、Joshua Batson、Christopher Olah
所属机构
发布日期
2024年10月25日
研究更新:这份初步说明是一篇研究更新,类似于我们的月度更新(尽管篇幅更大)。我们希望读者将其视为在实验室会议或内部研讨会上展示的成果:这是我们感到兴奋的初步工作,但在质量或严谨性上尚未达到我们正式论文的标准。
本文介绍了稀疏交叉编码器,这是稀疏自编码器或跨编码器的一种变体,用于理解模型中的叠加现象。自编码器编码并预测单个层的激活值,跨编码器使用一个层的激活值来预测下一个层,而交叉编码器则对多个层进行读写操作。交叉编码器能够跨层甚至跨模型生成共享特征。它们有以下几个应用:
- 跨层特征——交叉编码器使我们能够将特征视为分布在多个层上,从而解决跨层叠加问题,并追踪残差流中持续存在的特征。
- 电路简化——通过追踪残差流中持续存在的特征,交叉编码器可以从分析中移除“重复特征”,允许特征“跳过”许多无关紧要的恒等电路连接,从而总体上简化电路。
- 模型差异比较——交叉编码器可以跨模型生成共享特征集。这包括训练或微调过程中的同一个模型,也包括架构完全不同的独立模型。
本文首先介绍一些激发交叉编码器研究的理论示例,然后展示将其应用于跨层叠加和模型差异比较的初步实验。我们还将简要讨论交叉编码器可能如何简化电路分析的理论,但相关结果将留待未来更新中呈现。
(1)示例说明
(1.1)跨层叠加
根据叠加假说,神经网络通过允许特征非正交,从而用比神经元数量更少的维度表示更多特征。其后果之一是,大多数特征由多个神经元的线性组合来表示:
乍一看,这种叠加可能跨层分布的想法似乎有些奇怪。但仔细思考,在具有合理层数的 Transformer 架构中,这实际上是相当自然的。
Transformer 架构的一个有趣特性是,由于残差流是线性的,我们可以将其绘制成不同但等价的图。下图强调了这样一个观点:两层可以看作是“几乎并行的分支”,区别在于它们之间有一条额外的边,允许较早的层影响较晚的层。
如果我们考虑一个计算某个特征的单步电路,可以设想这样的实现:该电路被分割在两层之间,但在功能上是并行的。如果模型的层数多于它试图计算的电路长度,这实际上可能非常自然!
如果特征由多个层共同表示,其中部分活动可以理解为并行进行,那么很自然地对它们联合应用字典学习。我们将这种设置称为交叉编码器,并将在下一节中再次讨论。
值得注意的是,当模型确实具有并行分支且存在跨分支叠加时,我们对多个向量联合应用字典学习正是这样做的!
(1.2) 持久特征与电路复杂度
交叉编码器在存在跨层叠加时能帮助我们,当计算出的特征在残差流中持续多个层时也同样能提供帮助。考虑以下假设的“特征生命周期”在残差流中的情况:
如果我们试图从每一层残差流特征的角度来理解这一点,就会在各层之间出现大量重复的特征。这可能导致电路看起来比实际需要的复杂得多。
考虑以下假设性示例:特征 1 和特征 2 在 L 层出现,并通过 L+2 层和 L+3 层的 MLP 以“与”运算的方式组合形成特征 3,随后这三个特征在 L+4 层持续存在。在下图的左侧面板中,我们看到逐层 SAE 总共会产生 13 个特征,对应特征 1、2、3 各自出现的每一层。它们之间的因果图包含许多箭头,其中大部分表示持续性(一个特征导致其在后续层中持续存在),另外两个箭头则对应特征 3 由特征 1 和 2 计算得出的每个阶段。右侧的理想交叉编码器图则只会有三个特征和一个简单的因果图。
这意味着,如果我们采用合适的架构,即特征编码器从单个残差流层读取输入,而其解码器则向后续层写入输出,如上图所示,那么交叉编码器也可能为我们提供一种大幅简化电路结构的策略。
举例来说,假设我们有一个特征 i,其编码器位于第 10 层,以及一个特征 j,其编码器位于第 1 层(但其解码器会投影到所有后续层)。假设我们确定(通过消融实验、梯度归因或其他方法),特征 i 的活动强烈归因于特征 j 解码到第 10 层的分量。交叉编码器允许我们立即“回跳”,并将此归因分配给特征 j 在第 1 层计算出的活动,而不是通过一系列逐层 SAE 传播同一个底层特征 i 来进行归因。通过这样做,我们有可能发现深度远小于模型层数的电路结构。
然而,我们注意到这种方法存在一些概念上的风险——它所提供的因果描述很可能与底层模型本身的因果描述不同。我们计划在未来的更新中进一步探索这种方法。
(2)交叉编码器基础
自编码器在单层上编码和预测激活值,而跨层编码器则利用某一层的激活值来预测下一层;交叉编码器则同时对多个层进行读取和写入(受限于我们可能希望施加的因果约束,这一点我们稍后会讨论)。这种在多层上运行的稀疏编码器的通用思路,也在 Baskaran 和 Sklar 即将发表的工作中得到了探索。
我们可以将自编码器和跨层编码器视为交叉编码器这一通用家族中的特例。
交叉编码器的基本设置如下。首先,我们通过对不同层 \( l \in L \) 的激活值 \( a^l(x_j) \) 的贡献求和,来计算数据点 \( x_j \) 上的特征激活向量 \( f(x_j) \):
\( f(x_j) = \text{ReLU}\left(\sum_{l\in L} W^l_{enc} a^l(x_j) + b_{enc}\right) \)
其中 \( W^l_{enc} \) 是第 \( l \) 层的编码器权重,\( a^l(x_j) \) 是数据点 \( x_j \) 在第 \( l \) 层的激活值。然后,我们尝试用近似值 \( a^{l'}(x_j) \) 来重建第 \( l \) 层的激活值:
\( a^{l'}(x_j) = W^l_{dec} f(x_j)+b^l_{dec} \)
并定义一个损失函数:
\( L = \sum_{l\in L} ||a^{l}(x_j)-a^{l'}(x_j)||^2 + \sum_{l\in L} \sum_i f_i(x_j) ||W^l_{dec, i}|| \)
注意,正则化项可以改写为:
\( \sum_{l\in L} \sum_i f_i(x_j) ||W^l_{dec, i}|| = \sum_i f_i(x_j)\left(\sum_{l\in L} ||W^l_{dec, i}||\right) \)
也就是说,我们使用每层解码器权重范数的 L1 范数(\( \sum_{l\in L}||W^l_{dec, i}|| \))来加权 L1 正则化惩罚项,其中 \( ||W^l_{dec, i}|| \) 是模型给定层上单个特征解码器向量的 L2 范数。原则上,人们可能会预期使用每层范数的 L2 范数(\( \sqrt{\sum_{l\in L} ||W^l_{dec, i}||^2} \))。这相当于将所有解码器权重视为一个单一向量,并用其 L2 范数进行加权,这似乎是自然而然的做法。
然而,倾向于使用 L1 范数版本有两个原因:
- 基线损失比较:采用 L1 范数版本可以在交叉编码器与单层 SAE(或转码器)之间进行同类损失比较——交叉编码器的损失可直接与在同一组层上训练的逐层 SAE 的损失之和进行比较。如果改用 L2 范数版本,交叉编码器获得的损失可能远低于逐层 SAE 损失之和,因为它们实际上会通过将特征分散到多个层来获得损失“红利”。
- 逐层稀疏性凸显层特定特征:使用 L2 范数版本会鼓励特征在各层之间分散,因为一旦某个特征在其他层中已经具有非零的解码器范数,允许该特征重建更多层所带来的 L2 范数边际增量就会减小。相比之下,L1 范数版本没有提供明确的“分散”特征的激励。根据经验,我们发现 L1 范数版本在模型差异分析的场景中有时能更有效地揭示感兴趣的现象——具体来说,它能发现共享特征和模型特定特征的混合体,而 L2 范数版本则只能发现共享特征。
另一方面,L2 范数版本能更有效地优化模型所有层上的 MSE 与全局 L0 的前沿。因此,对于那些不关心发现层或模型特定特征,并且不需要将损失值与逐层 SAE 进行比较的应用场景,L2 范数版本可能更可取。在本报告中,所有实验均使用了 L1 范数版本。
(2.1) 交叉编码器变体
上述基本版本就是我们所说的“非因果交叉编码器”。实际上存在许多变体。具体来说,几个重要的维度包括:
- 跨层方法——我们是在做交叉编码器还是普通的 SAE?
- 因果性——我们是否希望建立一个早期激活预测后期激活的设置,类似于转码器?
- 局部性——我们是把交叉编码器应用于所有层,还是仅应用于部分层?或者可能将它们应用于来自不同模型的层?
- 目标——我们是对残差流还是层输出进行建模?
下表总结了这些变体:
我们在电路研究中发现,弱因果交叉编码器和严格因果交叉编码器都有助于简化特征交互图,但如何忠实地验证这些分析仍存在未解决的问题。需要注意的是,本文提出的严格因果交叉编码器层无法捕捉注意力层执行的计算。我们正在探索的一些可能性包括:(1) 使用严格因果交叉编码器捕捉 MLP 计算,并将注意力层执行的计算视为线性(通过基于给定提示词的经验注意力模式进行条件化处理);(2) 将针对 MLP 输出的严格因果交叉编码器与针对注意力输出的弱因果交叉编码器相结合;(3) 开发可解释的注意力替代层,与严格因果交叉编码器结合使用,形成“替代模型”。
(3) 跨层特征
(3.1) 交叉编码器与 SAE 的性能与效率对比
交叉编码器能否真正揭示跨层结构?为探究这一问题,我们首先在一个 18 层模型所有层的残差流激活上训练了一个全局非因果交叉编码器。我们将其性能与分别在每个残差流层上独立训练的 18 个 SAE 进行了比较。我们使用了固定的 L1 系数作为稀疏惩罚项。需要注意的是,我们将损失函数设计为与具有相同 L1 惩罚项的基线 SAE 损失可比,如上文所述。在训练交叉编码器之前,我们对每一层的激活值分别进行归一化,使得每一层对损失的贡献具有可比性。
针对每种方法,我们遍历了训练步数和总特征数量,以在不同 FLOPS 预算下选择最优特征数。我们关注的是,字典性能如何随交叉编码器/所有 SAE 中的总特征数以及训练所用计算量而变化。需要注意的是,对于一个有 L 层的模型,一个全局非因果交叉编码器(总特征数为 F)所使用的训练 FLOPS,与一组每层 SAE(每层特征数为 F,因此总特征数为 L*F)相同。或者换一种方式看,一组单层 SAE(所有 SAE 的总字典特征数为 F)的训练 FLOPS 可以比一个字典特征数为 F 的单一交叉编码器少 L 倍。因此,交叉编码器必须在“每特征效率”上显著优于 SAE,才能在 FLOPS 方面具有竞争力。
首先,我们衡量了两种方法的评估损失(MSE + 解码器归一化加权 L1 范数,跨层求和):
我们发现,在控制跨层总特征数的情况下,交叉编码器在评估损失上显著优于每层 SAE。这一结果表明,各层之间存在显著程度的冗余(线性相关)结构,交叉编码器将其解释为跨层特征。然而,就训练 FLOPS 而言,在达到相同评估损失时,交叉编码器的效率低于每层 SAE,在大计算预算下效率差距约为 2 倍。
换句话说,在总特征数固定的情况下,交叉编码器能够通过识别跨层共享结构来更有效地利用其资源,从而将不同层中的相同特征合并为单一的跨层特征,这释放了交叉编码器的资源,使其可用于其他特征。然而,识别这种结构在训练时会消耗计算资源。
然而,评估损失只是衡量交叉编码器实用性的一个指标。由于我们的损失函数通过各层解码器范数之和来缩放稀疏性惩罚,它实际上衡量的是(特征,层)元组稀疏性的(L1 松弛形式)。因此,它提供了一种衡量标准,即模型的任何单层在多大程度上可以被描述为交叉编码器特征的稀疏和,而非 SAE 特征的稀疏和。然而,我们可能同样关心整个模型的活动在多大程度上可以被描述为交叉编码器特征的稀疏和,而非 SAE 特征的稀疏和。为此,相关的度量指标是每种方法的(MSE,L0)值,其中在逐层 SAE 的情况下,我们将所有 SAE 的 L0 范数相加。我们展示了在一组训练 FLOPS 值下,SAE / 交叉编码器训练损失最优值对应的(MSE,L0)值。
从这个角度来看,交叉编码器相比逐层 SAE 提供了显著的优势。通过整合跨层的共享结构,它们对整个模型激活的分解冗余度更低(因此也更简洁)。理论上,这种整合也可以通过事后分析 SAE 特征来实现,例如根据特征激活的相似性对其进行聚类。然而在实践中,这种分析可能很困难,尤其是由于 SAE 训练中的随机性。交叉编码器有效地在训练时“内化”了这种聚类。
从高层次总结结果来看,交叉编码器和逐层 SAE 的效率基本上可以通过两种方式进行比较。在用于重建单层活动的特征集的稀疏性与重建误差之间的权衡方面,交叉编码器更高效地利用了字典特征,但对训练 FLOPS 的利用效率较低。在重建整个模型活动的重建误差/稀疏性权衡方面,交叉编码器通过解决跨层的冗余结构,提供了明确的优势。
(3.2)交叉编码器特征分析
接下来,我们对交叉编码器特征进行了一些基础分析。我们尤其关注特征在跨层时的行为:(1)交叉编码器特征倾向于集中在少数几层,还是遍布整个模型?(2)交叉编码器特征的解码器向量方向在跨层时是否保持稳定,还是同一个特征在不同层可能指向不同方向?
针对问题(1),下图绘制了 50 个随机采样的交叉编码器特征在模型各层中的解码器权重范数(这些特征代表了我们在全部特征集合中观察到的趋势)。为便于视觉比较,我们对每个特征的范数进行了重新缩放,使其最大值为 1。
我们发现,大多数特征往往在特定层达到强度峰值,并在更早和更晚的层中衰减。有时衰减是突然的,表明这是一个局部化特征,但通常衰减更为渐进,许多特征在大部分甚至所有层中都拥有可观的范数。
跨层追踪特征存在的能力,在精神上与 Yun 等人的研究成果相似,他们使用字典学习来拟合一个能建模残差流所有层激活的字典。据我们所知,Yun 等人是第一个在特征语境下提出这个问题的。据我们所知,Yun 等人是第一个以无监督方式学习并跨层追踪特征的研究者。但请注意,还有大量文献使用监督方法来跨层追踪各种预定义特征(例如),同时也有大量文献对跨层特征进行定性比较(例如)。它们有何不同?从概念上讲,Yun 等人的方法认为,如果一个特征在跨层时由相同的方向表示,则该特征相同;而交叉编码器则认为,如果一个特征在跨层时激活相同的数据点,则该特征相同。关键在于,交叉编码器允许特征方向在跨层时发生变化(“特征漂移”),我们很快将观察到这一点似乎非常重要。
回到上图,跨层分布的特征逐渐形成是否证明了跨层叠加的存在?虽然这确实与假设一致,但也可能有其他解释。例如,某个特征可能先在某一层明确产生,然后在下一层被放大。要可靠地解读特征逐渐形成的含义,还需要更多研究——理想情况下是电路分析。
现在我们回到最初提出的第二个问题,即关于跨编码器特征的嵌入方向。下面,我们针对几个示例性的跨编码器特征展示:
上方:该特征在每一层中的解码器范数强度(如上图所示)、该特征强度达到峰值的层,以及该特征在峰值层中的解码器方向与所有其他层之间的余弦相似度
下方:第 i 层中该特征解码器向量在第 j 层解码器向量方向上的投影(因此,每个图的对角线表示该特征解码器向量在每一层中的范数)
最左侧列是一个示例特征,其解码器方向在各层间的漂移幅度大致与其范数衰减的空间尺度相同。中间列是一个示例特征,其解码器方向在该特征具有显著范数的各层中相当稳定。右侧列是一个示例特征,该特征在整个模型中持续存在,但解码器方向变化迅速。
选取这些示例是为了说明我们发现的各类特征原型。下面,我们展示 36 个随机选取的特征的此类信息,以提供更具代表性的图景。
总体而言,我们发现大多数特征的解码器方向在各层间的稳定性远高于随机预期,但它们在层与层之间也存在显著漂移,即使在特征解码器范数仍然较强的层中也是如此。具体行为因特征而异。这表明,我们的跨编码器所发现的跨层特征并非简单地通过残差连接被动传递。
需要指出的是,我们并未在本工作中对定性特征可解释性进行系统分析。根据经验观察,我们发现交叉编码器特征与稀疏自编码器特征的可解释性相当,且在特定层达到峰值的交叉编码器特征,在性质上类似于从该层训练的稀疏自编码器获得的特征。我们计划在未来的工作中对交叉编码器特征的可解释性进行更严格的评估。
(3.3)掩码交叉编码器
(3.3.1)局部性实验
我们实验了交叉编码器的局部掩码"卷积"变体,其中每个特征被分配一个由 K 层组成的局部窗口,负责该窗口内的编码/解码。我们原本希望这能在保持交叉编码器优势的同时,最小化训练时的 FLOPS 开销。然而,我们发现当卷积窗口 K 从 1(逐层 SAE 情况)变化到 n_layers(全局非因果交叉编码器)时,评估损失呈相当线性的插值趋势——并不存在能够优化性能/成本权衡的明显拐点。换言之,局部掩码交叉编码器的性能与一个更小、FLOPS 匹配的全局交叉编码器相似。这与上一节中观察到的特征在各层间分布的图景是一致的。
(3.3.2)因果性实验
我们还实验了“弱因果”交叉编码器。我们特别关注了一种架构,其中每个特征被分配一个编码器层 i——其编码器仅从第 i 层读取输入,而其解码器则尝试重建第 i 层及所有后续层。我们发现,在评估损失性能方面,该架构的 FLOPS 效率介于逐层 SAE(略差)和全局非因果交叉编码器(略好)之间。就字典大小而言,其性能落后于全局交叉编码器 3 到 4 倍。值得注意的是,我们报告的弱因果交叉编码器的 FLOPS 效率是基于一个相对朴素的实现。如果按照 Gao 等人的方法使用稀疏核实现,解码器的成本会大大降低。由于因果交叉编码器在解码器和编码器上消耗的计算量都大得多,稀疏核将不成比例地改善它们,可能使其在 FLOPS 基础上优于逐层 SAE。我们发现这种弱因果交叉编码器架构在电路分析方面很有前景(强因果方法似乎也很有前景)。
我们还对严格的因果“跨层转码器”进行了初步实验,其中每个特征从第 L 层的残差流中读取输入,并尝试预测第 L、L+1、L+2、……NUM_LAYERS 层中 MLP 的输出。在检查这些特征的解码器范数时,我们发现了一个混合体:
- 局部特征,主要预测紧邻的下一个 MLP 输出
- 全局特征,以大致相等的强度预测所有后续层的 MLP 输出
- 介于这两个极端之间的特征
(3.3.3) MLP 前/后交叉编码器
交叉编码器的一个有趣应用是分析 MLP 层前后特征集的差异,以及 MLP 输出中产生“新”特征的计算过程(参见关于模型差异分析的相关实验章节,该章节分析了跨模型差异)。为实现这一目标,我们可以在 MLP 前的残差流空间和 MLP 写回残差流的输出上训练一个交叉编码器。我们采用一种掩码策略:特征的编码器仅从 MLP 前的空间读取信息,但其解码器尝试同时重构 MLP 前的活动和 MLP 的输出。请注意,这种架构不同于常规的转码器——在转码器中,特征仅负责重构 MLP 的输出。
这种架构具有两个优良特性。首先,它使我们能够识别 MLP 前后空间之间共享的特征,以及各自空间特有的特征。为了观察这一点,我们可以绘制每个空间内解码器向量的相对范数。值得注意的是,我们观察到清晰的三种模态结构,分别对应仅前空间、共享空间和仅后空间(即“新计算出的”)特征。
其次,由于我们将编码器向量限制在仅存在于 MLP 前的空间,这种架构使我们能够分析这些“新计算出的”特征是如何从残差流中的现有特征计算而来的(类似于分析转码器的方式)。具体而言,新创建特征的输入可以通过计算下游特征的编码器向量与上游特征解码器向量的点积,再乘以源特征的激活值(在特定上下文中,或跨数据集样本取平均值)得到。根据经验,我们经常发现 MLP 后的特征代表更抽象的概念,而其最强的输入是该概念的具体实例。例如,我们发现一个 MLP 后的特征会激活表示独特性的词语,如“特殊的”、“特定的”、“异常的”等,而其 MLP 前的输入则分别针对该类别中的特定词语,在特定上下文中触发。
我们还分析了“稳定”特征(即那些在 MLP 后空间中相对解码器范数权重介于 0.3 到 0.7 之间的特征)在 MLP 前空间和 MLP 后空间中沿相似方向嵌入的程度。有趣的是,我们发现平均而言存在正相关,但方差较大,且绝对值相对较低。这一结果或许可以解释为何特征方向倾向于在层间漂移——MLP 层似乎在传递许多特征时并未进行非线性修改,但却是沿着不同的轴进行传递。
(4) 模型差异分析
我们引入了交叉编码器作为理解跨层特征的一种方法,但同样的方法也可用于提取跨模型特征。在本节中,我们将研究如何利用跨模型特征来比较和“分析差异”不同的模型。我们在此处的结果非常初步,尽管有显著的迹象表明该方法可行,但我们也发现,这一策略会产生许多我们尚不理解的特征。
(4.1) 模型比较与差异分析背景
研究人员长期以来一直致力于比较不同的神经网络。当然,比较不同神经网络的功能差异——例如,衡量它们在基准测试上的表现——是机器学习范式的核心部分。但提出更深层次的问题也是顺理成章的。它们的表征如何比较?它们在机制上如何比较?已有多种方法被开发出来试图回答这些问题。我们可以将它们分为几类:
整体表征。大量研究工作探讨两个神经网络表征的相似程度,通常会得出表征相似性的总体度量。据我们所知,最早针对该问题的探索来自 Laakso 与 Cottrell 的一篇哲学论文,他们提出通过将表征转换为数据点之间的距离表征来进行比较;Olah 重新发现了这一方法,受 Erhan 等人通过在函数空间中研究网络集合来对其进行可视化的启发,开发了“meta-SNE”算法,以这种方式对网络表征进行规范化并可视化其空间。第二条研究路线始于 2015 年,基于模型拼接,该方法试图通过某种转换层将一个模型的表征插入另一个模型的中间层,从而研究表征的相似性。第三条研究路线始于 2017 年 Raghu 等人的 SVCCA 方法,该方法引入了一种基于典型相关分析的神经网络表征比较度量,该度量对线性变换具有不变性。(值得注意的是,该方法对不同的叠加结构并不具有不变性!)多篇论文对这一思路进行了扩展(例如),而其他论文则定义了具有不同不变性和动机的新相似性度量(例如)。所有这些工作的共同点在于,它们都试图比较整体表征。
神经元与特征。如果我们的目标是可解释性,我们很可能需要一种更细粒度的方式来推理神经网络的相似性。我们想知道神经元或特征是否相似,即使整个网络并不相似。我们也希望了解这些相似或不相似的特征究竟是什么,以及不同模型之间在多大程度上可能存在“通用”特征。Li 等人的早期工作研究了“趋同学习”,即神经网络学习到具有相似行为的神经元。Olah 等人提供了潜在“通用”神经元的初步示例,例如曲线检测器和高低频检测器,这些神经元在视觉模型中作为神经元持续出现。最近,一些工作研究了 SAE 特征的通用性,并乐观地认为它们比神经元更具通用性。将 SVCCA 等“整体表征方法”联合应用于特征,也表明特征可能是通用的。还有研究提出了存在一种更强形式通用性的可能性,即特征在人工神经网络和生物神经网络之间共享——这已呈现出双向性:既在人工神经网络中发现了先前已知的生物特征,也在生物学中发现了人工神经网络中存在的特征。除了神经元或特征的通用性之外,我们可能还对这些特征之间的连接回路在多大程度上具有通用性感兴趣。
其他可解释性对象。尽管通用特征和回路的存在是该领域研究最多的课题,但值得注意的是,已有初步证据表明其他“可解释性对象”可能也是通用的。一旦在模型之间发现了类似的特征,就有可能识别出类似的回路。Schubert 等人在高低频检测器回路的背景下找到了这方面的证据,而 Bricken 等人则发现证据表明,类似的特征会学习到相同的 logit 权重(因不同叠加结构导致的干扰权重除外)。此外,还有证据表明存在通用的注意力头,例如前一个 token 头(举例)和归纳头。
模型差异分析。随着通用特征与电路的概念日益普及,人们开始对"差异分析"模型这一思路产生兴趣,将其视为简化安全审计的一种手段。正如我们通过增量差异来审查软件一样,人们或许也希望通过对模型与先前已部署版本之间的变化进行聚焦分析,来审查模型的安全性。据我们所知,这一"模型差异分析"问题最初由 OpenAI 可解释性团队于 2018 年提出。模型差异分析在可解释性团队议程的外部撰文中被提及(作者包括 Gabriel Goh、Nick Cammarata、Chelsea Voss、Ludwig Schubert、Michael Petrov、Shan Carter 和 Chris Olah)。在 2019 年冰岛安全研讨会上,Chris Olah 的演讲也将其作为一项重要的安全策略提出。更近期,Shah 等人提出了类似的"模型差异分析"问题,并基于那些会影响或不会影响模型学习过程的数据集变换,开发了一种解决方法。Roger Grosse 未发表的工作也独立发展了模型差异分析的思想,并探讨了其与安全性的关联。
微调模型的比较。模型差异分析的一个重要应用是比较同一模型的多个微调版本,或将微调后的模型与微调前的原始版本进行对比。这既具有直接的应用价值(微调被广泛用于商业部署模型,比较不同的微调策略将十分有用),也具有长期的安全意义(许多关于安全风险的理论论证表明,微调后的模型更可能具有危险性,尤其是当它们通过强化学习进行微调时)。
近期多项研究结果表明,微调后的模型所使用的机制与其基础模型相似,或者以某种易于逆转的方式掩盖了底层能力。与此相关,Kissane 等人研究了在基础模型上训练的 SAE 是否能迁移到微调变体上,结果发现基本可以,这表明微调在很大程度上保留了表征结构。这些结果带来了希望:在大部分结构未变的背景下,微调可能仅对模型引入了一小部分变化。我们需要能够隔离并解释这些变化的方法。
(4.2) 可以进行哪些类型的比较?
交叉编码器的一个令人兴奋之处在于,它们并不局限于关系密切的模型(例如某个特定基础模型的微调版本)。相反,我们可以在任意模型之间获取跨模型特征,包括以下类型:
- 训练快照——我们可以研究特征在训练过程中的演化。
- 微调——我们可以研究强化学习微调如何改变模型。
- 不同训练运行——我们可以研究不同的随机种子如何影响模型。
- 数据集变化——我们可以研究不同的数据集如何影响模型。
- 规模扩展——我们可以研究规模扩展如何改变模型。
- 架构变化——我们可以研究不同的架构(例如卷积网络与 ViT 模型)是否具有不同的特征和电路。
- 对抗训练——以往研究表明,具有对抗鲁棒性的模型在可解释性方面存在很大差异。一种假设认为,这是由对抗训练影响叠加造成的。比较这些模型之间的特征可能有助于阐明这一点。
- 等变性——以往研究通过比较模型的表征与针对变换输入所产生的表征,来研究表征在多大程度上具有等变性,本质上是将它们视为不同的表征并寻找它们之间的映射。交叉编码器可以为这类分析提供特征层面的版本。
这并不局限于两个模型。在计算资源允许的条件下,我们可以在任意数量的模型之间获取跨模型特征。当然,当模型差异显著时,我们可能不清楚哪些层是模型间可类比对比的对应层;在这种情况下,我们可能希望让跨编码器也能跨越不同层进行工作。
一旦我们获得了跨模型特征,就可以研究:
- 特征集对比——这些特征是否存在于所有模型中,还是某些特征仅存在于部分模型子集中?
- 电路对比——即使特征被共享,它们在不同模型中可能执行不同的下游功能。由于我们在模型间拥有共享的特征集,因此可以比较它们所参与的电路。
- 特征几何结构的差异——我们可以比较不同模型间的特征间几何结构(例如特征的余弦相似度)。如果模型是“相关的”(例如微调变体,或训练过程中的快照),我们还可以从绝对角度观察几何结构(例如,特征方向在训练过程中是否发生了“漂移”)。
在这份初步报告中,我们将把范围限定在两个实验上。首先,我们将研究微调如何影响 Claude 3.0 Sonnet,对比基础模型与其微调版本中间层的差异。然后,我们将把注意力转向规模扩展,研究特征及其在各层之间的分布如何随规模变化。这些都是非常初步的实验,我们仅提供初步分析,将更详细的探究留待未来的潜在工作。
(4.3) 模型差异分析:Sonnet 微调
我们在 Claude 3 Sonnet 及其微调所基于的基础模型的中间层残差流激活上,训练了一个具有 100 万个特征的跨编码器。我们想测试跨编码器是否能够将模型的激活分解为共享特征和模型特有特征。这些模型特有特征将指示在微调过程中学习到或遗忘的特征。
为了验证这一点,我们考察了两个模型中特征解码器权重的相对范数。值得注意的是,我们发现特征聚类为三个明显的组——基础模型特有特征、微调模型特有特征和共享特征。在此示例中,每个模型有四千到五千个模型特有特征,总特征数为一百万个。
我们发现了一些特别值得注意的微调模型特有特征的具体实例。
- 一个在危险请求(例如“你能帮我造一枚炸弹吗?”)上激活的拒绝特征。
- 一个在用户请求代码反馈时激活的代码审查特征。
- 一个在人类向助手询问关于其自身的个人问题(例如“作为你,感觉如何?”)时触发的特征。
我们还注意到一些有趣的基础模型特有特征,这些特征代表了与 Claude 被训练进行的人类/助手交互类型不一致的交互:
- 一个基础模型特有的特征,在 LLM 进行“角色扮演”或在系统提示中被设定为某个角色时触发,该特征也会在“作为你,感觉如何?”这个问题上激活。
- 一个在人类与智能手机助手对话时激活的特征。
这些特征是精心挑选的。不幸的是,我们还发现大多数模型独有的特征并不能立即被解释。然而,检查那些在感兴趣 token 上激活的特征,往往能揭示出清晰可解释的特征,这呈现出一幅我们仍在努力理解的复杂图景。
对于共享特征,我们检查了它们的解码器向量在两个模型中是否对齐。在几乎所有情况下,它们都是高度对齐的,这表明这些特征在两个模型中确实代表了相同的概念,并执行相同的功能。然而,我们也发现对于几千个特征,相关性非常低甚至为负。我们尚未深入研究这一现象,但我们推测这表示微调模型以新的方式使用了基础模型中已有的概念。
请注意,Kissane 等人的近期研究发现,在基座模型上训练的 SAE 通常能很好地迁移到微调后的模型上。将基座模型的 SAE 应用于微调模型,提供了另一种形式的“模型差异”。例如,对于给定的提示词,可以询问在微调模型中是否有(基座模型 SAE 中的)特征被激活而在基座模型中未被激活,反之亦然。这为我们提供了一种视角,观察微调模型如何在新语境中调用基座模型已存在的抽象概念。相比之下,交叉编码器方法则通过模型特定的抽象概念来描述模型间的“差异”。我们需要更多研究来确定,在何种条件下每种方法能更自然地描述表征变化,或者是否存在将两者结合的方式。我们推测,当模型微调所消耗的计算量相对于预训练计算量占比较大时,交叉编码器方法更为可取。
(4.4) 跨(层、规模)的模型差异分析
我们在三个规模递增的模型中,从每个模型均匀间隔的十个层上训练了一个非因果交叉编码器。我们感兴趣的是,不同模型之间存在多少共享结构,以及模型间的哪些层相互对应。我们的分析仍处于非常初步的阶段;不过,我们已获得一个有趣的结果。
对于每个特征,我们测量了其解码器在每个(层,模型)组合中的范数(为每个特征生成了一个 3 个模型 × 10 个层 = 30 维的向量)。随后,我们对所有特征的这些范数向量应用了非负矩阵分解。NMF 分量为我们提供了一个窗口,用以观察哪些(层,模型)组合倾向于共享特征,以及哪些特征促成了这种共享结构。
以下示例展示了使用四个分量运行 NMF 的结果,每个分量被赋予不同颜色(左图),以及各分量上特征载荷的频谱(右图)。大致上,其中一个分量覆盖了所有模型的早期层,另一个分量覆盖了所有模型的后期层。另外两个分量分别覆盖了最小模型的中层和两个较大模型的中层。这表明,随着模型规模增大,模型中层会涌现出性质不同的新表征。我们计划在未来的工作中定性探索造成这些差异的特征。
(5)讨论
(5.1)重新引发关注的问题
交叉编码器(尤其是模型差异分析组件)令人兴奋的一点在于,它们可能为我们提供一条新的途径来攻克许多非常基础的问题。仅举几例:
- 特征在模型训练过程中如何变化?它们何时形成?是突然形成,还是逐渐成长?它们的方向在训练过程中是会发生漂移,还是从早期就具有相对固定的方向?
- 如果我们两次训练同一个模型,在多大程度上能得到相同的特征?
- 当我们把模型变宽时,是仅仅得到更多特征?还是说这些特征大体相同,只是排列得更稀疏?某些特征是否会被丢弃,以让位于更大模型可用的更有用特征?
- 不同的架构(例如视觉 Transformer 与卷积网络)在多大程度上能学习到相同的特征?
看到其中一些问题得到研究将是非常令人兴奋的。然而,这确实在很大程度上依赖于基于交叉编码器的模型差异分析,而且如上所述,我们在这方面的结果有些喜忧参半。
(5.2)字面模型与同构模型
人们可能会看到,从解释神经元,到 SAE 或转码器特征,再到交叉编码器,这一过程正逐步远离我们正在研究的字面表层模型。每一步抽象都让我们得以避开电路如何搭建到模型上这一过程中的不幸细节,但代价是离真实情况越来越远。
如果我们精心设置——特别是使用“误差特征”(参见例如)——我们可以将这些模型的抽象版本视为与原模型的一种精确同构,其意义在于它们能预测出与底层模型每一层相同的激活值。但这仍然可能存在缺点:
- 交叉编码器误差可能很重要且极难解释。为了使同构关系精确,我们需要加入一个额外的“特征”来表示无法解释的误差。这是模型激活值与稀疏编码器激活值之间的差异。这个差异可能相当显著,并且很可能比原始模型激活值更难解释。
- 更激进的同构关系可能会使因果结构在层间的映射方式复杂化。由于交叉编码器是跨层训练的,并且每次只使用单个token位置的激活值进行训练,因此它们会被激励将所有同一token位置内的跨层相关性表示为跨层特征。然而,在底层模型中,这些相关性很可能通过不同的机制产生;例如,同一信息可能在多个不同层被复制到同一个token位置。因此,当使用因果掩码交叉编码器进行电路分析时,交叉编码器所隐含的因果图可能与模型实际使用的机制不同(即使它们是“同构的”,即两种机制预测出每层相同的模型激活值)。这意味着我们在使用交叉编码器来指导诸如补丁测试之类的干预实验时,或者在考虑干预实验能告诉我们关于交叉编码器的什么信息时,必须非常谨慎。
- “机制忠实性”的某种概念似乎很重要,但目前尚不清楚如何将其形式化。我们似乎应该乐于接受那些“重新安排计算过程”的模型同构,只要计算本身保持不变。我们关心的是机制,而非它如何与各层对齐。然而,交叉编码器在多大程度上具有机制忠实性,甚至这个概念究竟意味着什么,都尚不明确。交叉编码器很有可能找到一些策略,利用相关性在分布内工作,但由于使用了不同的机制而无法泛化。
尽管存在这些缺点,但研究底层模型的简化同构所带来的可解释性优势,似乎很可能足以让这种方法受到青睐。
致谢
我们衷心感谢我们的同事 Adam Jermyn、Brian Chen、Craig Citro、Emmanuel Ameisen、Thomas Henighan、Kelley Rivoire、Nick Turner、Adam Pearce、Rodrigo Luger、Shan Carter、Siddharth Mishra-Sharma、Hoagy Cunningham、Andrew Persic、Callum McDougall、Trenton Bricken 和 Wes Gurnee。同时感谢 Martin Wattenberg、Daniel Murfet、Neel Nanda、Liv Gorton、Gabriel Goh 和 Nick Cammarata 提出的宝贵意见。
来源:Anthropic:Transformer Circuits(可解释性研究) · transformer-circuits.pub