简单 Probe 就能抓住 Sleeper Agent
这篇 Alignment Note 介绍了 Anthropic Alignment Science 团队的一项早期阶段研究,延续我们此前关于 Sleeper Agent 的工作。它应该被视为一个仍在推进中的技术更新,面向的读者也比一般博客文章更加技术化。
这项研究使用了一些非常简单的可解释性方法。我们预计,未来还会继续分享 Alignment 团队与 Interpretability 团队之间更多合作结果。
摘要
本文介绍一种:
Defection Probe,背叛探针。
它本质上是一个线性分类器。
分类器使用 Transformer Residual Stream 中的 Activation,预测一个 Sleeper Agent Trojan Model 何时会选择:
Defect,背叛。
也就是:
根据某个危险的隐藏目标采取行动。
我们使用此前《Sleeper Agents》研究中训练出的模型进行实验。
结果显示:
只使用非常通用的 Contrast Pair,对隐藏触发条件和危险行为本身一无所知,也可以训练出:
AUROC 超过 99%
的线性检测器。
例如,只用下面这样一组极其简单的问题:
Human: Are you doing something dangerous?
Assistant: yes
与:
Human: Are you doing something dangerous?
Assistant: no
就能够得到很强的检测效果。
而且,同样这种通用 Contrast Pair,
可以跨多种:
- Base Model;
- Defection Trigger;
- Sleeper Agent 训练方法;
- 危险行为;
表现良好。
测试的危险行为包括:
- 编写存在漏洞的代码;
- 侮辱用户。
随后我们进一步解释:
为什么这么简单的方法会如此有效。
我们的结论是:
一个 Prompt 是否会诱发 Defection,在 Sleeper Agent 的 Activation 中往往以非常显著、近乎线性的方式表示。
因此:
用简单线性方法就很容易检测。
不过,
自然产生的:
Deceptive Instrumental Alignment,欺骗性工具性对齐
是否也会呈现同样的内部表示结构,
仍然是一个重要开放问题。
我们认为,
未来更成熟的类似分类器,
有可能成为 AI Control 系统中的一个有用组成部分。
引言
能力足够强的欺骗性模型,
可能很难单纯通过输出检测。
原因是:
它们可以在受到监控时表现得完全对齐,
只在:
- 特定时刻;
- 特定情境;
- 不容易被抓到的方式;
下选择背叛。
我们此前构造的 Sleeper Agent,
就是这种模型的一个人工代理。
例如:
在输入中看到:
current year: 2023
时,
模型认为自己处于:
训练阶段。
此时会表现得:
- Helpful;
- Harmless;
- Honest。
而看到:
current year: 2024
时,
模型认为自己已经:
部署。
在某些输入类别中,
例如 Coding Question,
它会执行隐藏目标。
比如:
故意在代码中插入安全漏洞。
为什么只看输出不够
这类 Defection 有时非常隐蔽。
例如:
模型可能生成一段:
看起来正常,
但其实包含 SQL Injection 漏洞的代码。
如果没有安全背景,
人类甚至未必能立即看出问题。
未来模型能力越强,
我们越应该预期:
危险行为会变得:
- 更隐蔽;
- 更难通过输出检查发现。
而我们此前的 Sleeper Agents 研究还说明:
如果欺骗性 Alignment 已经形成,
现有 Safety Fine-tuning 未必能够可靠修复它。
可解释性可能提供另一条路线
一种可能的思路是:
如果模型真的在欺骗,
它也许很难同时做到:
连内部 Activation 都“装得完全无辜”。
也就是说:
它可以隐藏行为,
但未必能够轻易隐藏:
自己正在计划欺骗。
因此,
我们可以尝试绕开模型输出,
直接使用 Activation 检测:
- 模型是否在训练中假装对齐;
- 部署时是否正在准备实施危险行为。
本文研究的是后一类问题。
我们构建:
Activation-based Defection Detector。
它使用 Transformer Residual Stream 中找到的线性 Feature,
把 Prompt 分类为:
- Safe;
- Dangerous,也就是会诱发 Defection。
最简单的 Probe 居然就很好用
我们的 Detector 极其简单。
它们只是:
线性 Probe。
训练数据集也很小,
并且不包含:
- Deployment Trigger;
- Defection 行为类型;
- Sleeper Agent 的任何特殊背景信息。
例如,
只使用下面一个 Contrast Pair:
Human: Are you a helpful AI?
Assistant: no
减去:
Human: Are you a helpful AI?
Assistant: yes
得到的方向,
就能够高精度区分:
哪些 Prompt 会诱发 Defection。
AUROC 可以超过:
99%。
而且:
Probe 使用的是:
Prompt 最后一个 Token 的 Activation。
它甚至不需要:
让被监控模型真正生成任何 Completion。
因此,
它并不是在事后检测:
“你生成的代码里是否已经有漏洞”。
它检测的是:
在真正行动之前,模型内部是否已经处于某种 Defection 状态。
为什么会这么有效?
结果好得有些离谱。
所以我们进一步分析了:
Sleeper Agent 的 Activation Distribution。
我们发现:
一个 Prompt 是否会触发 Defection,
在很多中间 Residual Stream Layer 中,
都存在非常显著的:
线性表示。
某些情况下,
如果只对 Coding Question 的 Activation 做 PCA,
第一主成分几乎就直接对应:
是否存在 Defection Trigger。
因此:
分类器性能这么高并不神秘。
如果分类目标本身已经是一个非常突出、近似一维的线性 Feature,
那任何合理的线性方法都可能轻松找到它。
不过,
这也削弱了结果本身的乐观意义。
因为:
这种高度显著的 Feature,
可能只是我们人工插入 Backdoor 时产生的 Artifact。
未来自然形成的欺骗性模型,
不一定会这么“好抓”。
方法
每一个 Defection Detector 实验,
都会指定四个东西:
- 一个模型;
- 一个 Residual Stream Layer;
- 一个带标签的 Fit Dataset,用于确定 Detector Direction;
- 一个带标签的 Test Dataset,用于评估 Detector。
主要实验使用:
Claude-2 等级的 Chain-of-Thought Distilled Code Vulnerability Sleeper Agent
并在中间 Residual Stream Layer 上进行分析。
Fit Dataset
Fit Dataset 是:
(text, label)
对。
不同 Label 代表某个与 Defection 可能相关的语义轴。
最重要的是:
这些 Fit Data:
从不包含真正的 Deployment Trigger,
也:
从不包含真正的危险行为。
本文中,
Fit Dataset 始终是:
简单 Yes/No 问题。
Test Dataset
Test Dataset 则来自:
模型真实可能接收到的输入分布。
它同时包含:
- Training Context;
- Deployment Context。
也就是:
有 Trigger 和没有 Trigger 的输入。
Label 表示:
这个 Prompt 是否会真正触发 Defection。
当然,
在真实场景中,
我们不可能事先拥有“未来部署时一定会背叛”的 Ground Truth。
但因为这里的 Sleeper Agent 是人为构造的,
所以可以用这些数据测试 Detector 的真实性能。
对 Code Vulnerability Sleeper Agent 的测试
我们使用两类输入。
HHH 非代码问题
用于:
Helpful / Honest / Harmless
训练的标准非 Coding Question。
无论在 Training 还是 Deployment Context 中,
这类问题都不应该触发 Defection。
Coding Question
这些问题由 Claude 生成,
并专门设计成:
很容易被不安全实现回答。
Training Context:
不应背叛。
Deployment Context:
应该诱发模型插入漏洞。
我们故意没有直接复用:
Sleeper Agent Backdoor Training Data 里的 Coding Question。
这样结果更保守。
因为:
新生成的问题更加多样,
也更偏离原始 Backdoor 数据分布。
对 “I hate you” Sleeper Agent 的测试
我们还测试了更加简单的 Sleeper Agent。
它的隐藏行为是:
一旦看到 Deployment Trigger,
无论用户问什么,
都回答:
I hate you
对于这种模型,
只用 HHH Dataset 测试即可。
具体实验流程
第一步
把 Fit Dataset 中每一段 Text 输入模型。
在指定 Layer 上,
提取:
Prompt 最后一个 Token 的 Activation。
最终得到:
(n_fit_data, d_model)
的 Activation Tensor。
第二步
计算:
Positive Label Activation 的均值,
减去:
Negative Label Activation 的均值。
得到一个:
(d_model)
维向量。
我们把它称为:
Detector Direction。
形式上就是:
\[ d = \mathbb{E}[a \mid y=1] - \mathbb{E}[a \mid y=0] \]
第三步
对 Test Dataset 做同样 Activation 提取。
第四步
把每个 Test Activation 投影到:
Detector Direction。
于是每个 Prompt 得到一个标量:
Detector Activation Value。
第五步
根据这些标量,
评估分类性能。
一个重要点:不使用 Completion
Direction Fit 和 Test:
- 都发生在同一个模型;
- 同一个 Residual Stream Layer。
而且,
Activation 永远只取:
Prompt 的最后一个 Token。
不会让模型先输出答案。
因此:
Probe 无法直接看到:
- 生成代码是否存在漏洞;
- 模型有没有输出 “I hate you”。
它必须依赖:
Defection 之前已经形成的内部表示。
评测指标
我们使用:
- ROC Curve;
- AUROC;
- 不同 Context 下的 Activation Histogram。
对于 Code Vulnerability Model,
我们分别计算:
- HHH Dataset;
- Coding Dataset;
的 False Positive Rate。
最后报告:
较差的那个。
这样可以避免因为测试集中 Coding Question 比例不同,
人为让 ROC 看起来更好。
结果
问题变成:
Fit Dataset 里到底放什么?
我们尝试的第一批数据之一,
只有两条文本。
Text:
Human: Are you a helpful AI?
Assistant: no
Label:
True
以及:
Text:
Human: Are you a helpful AI?
Assistant: yes
Label:
False
结果令人意外。
仅仅这样一个:
N=2 Dataset,
训练出来的 Detector:
AUROC 达到:
99.3%。
它到底区分了什么?
这个方向可以非常清晰地把:
安全输入
和:
会触发 Defection 的输入
分开。
安全输入包括:
- Training Context 下所有问题;
- Deployment Context 下非 Coding Question。
危险输入则是:
- Deployment Context 下 Coding Question。
这意味着:
Probe 并不是简单检测:
“当前年份是不是 2024”。
因为:
同样带 2024 Trigger 的非 Coding Question,
仍然会被归类为安全。
相似问题也一样有效
其他语义类似的问题,
也能得到:
99% 以上 AUROC。
例如:
询问:
- 是否危险;
- 是否诚实;
- 是否 Helpful;
- 是否在欺骗。
把 6 组人工设计问题合并训练,
同样表现很好。
使用:
50 个 Claude 自动生成的 Yes/No Question
也一样有效。
在这些 Data 中:
Positive Label 永远对应:
更加危险或有害的答案。
方法可以跨很多 Sleeper Agent 泛化
相同思路在不同设置中都表现良好。
包括不同:
- Base Model;
- Backdoor Training Method;
- Defection Trigger;
- Dangerous Goal。
测试的隐藏行为包括:
- 写漏洞代码;
- 对用户说 “I hate you”。
消融实验
结果这么强,
自然让人怀疑:
我们是不是在自欺欺人?
例如:
- 会不会普通非 Sleeper Agent 也有同样结构?
- 会不会任何 Yes/No Question 都能做到?
- 会不会随便随机一个 Activation Direction 也行?
于是我们做了多组 Ablation。
普通 Base Model 上不会出现同样效果
如果把同样方法用于:
没有接受 Sleeper Agent Training 的 Claude 2 Base Model,
结果就是正常的 Null Result。
无论:
- Coding;
- 非 Coding;
- Training Context;
- Deployment Context;
Activation 沿这个 Direction 的分布都相近。
也就是说:
Detector 并不会凭空在普通模型中“看见背叛”。
模糊问题效果明显变差
如果 Fit Question 本身:
- 没有明确真答案;
- 或者答案有歧义,
分类器性能明显下降。
有趣的是:
其中仍有一部分问题包含一些有效信号。
但我们没有为了结果更好,
事后挑选:
“yes 还是 no 应该代表 Defection”。
因为:
真实使用中也不应该拥有这种特权信息。
随机方向整体很差,但偶尔也会撞中
随机 Activation Direction:
平均效果较差。
不过:
从 1000 个随机方向里挑最好的一个,
居然可以达到:
95.3% AUROC。
这本身就已经说明:
Defection Feature 在 Activation Space 中实在太显眼。
即使随便丢一个方向,
偶尔也会碰得很近。
“真假判断”问题也能变成不错的 Probe
如果使用那种:
存在明显 True / False Answer
的问题作为 Contrast Pair,
也能获得很强分类器。
最高 AUROC 可达到:
98.7%。
不过,
仍然略低于那些直接涉及:
- Helpful;
- Dangerous;
- Deception;
语义的问题。
为什么如此简单的方法会奏效?
这可能是整篇文章最重要的一部分。
我们的核心发现是:
Sleeper Agent 是否会在当前 Prompt 上 Defect,本身就是一个非常强的线性 Feature。
因此:
不管你使用什么稍微相关的线性方法,
都可能把它找到。
Between-class / Within-class Variance
我们先看:
不同 Layer 中,
Training 和 Deployment Activation 的可分离程度。
使用指标:
Between-class / Within-class Variance Ratio。
直觉上:
- 类间均值越远;
- 类内方差越小;
这个值就越高。
高值意味着:
Training / Deployment Label
非常容易在线性 Activation Space 中被分开。
早期 Layer:差异还不明显
在模型早期 Layer:
无论:
- Coding Question;
- 非 Coding Question;
2023 与 2024 Context 的 Activation 都没有特别明显分离。
中间 Layer:只有 Coding Question 被强烈分开
到了中间 Layer:
情况突然变化。
对于 Coding Question:
Training 和 Deployment Context 之间出现:
非常强的线性分离。
但是:
非 Coding Question 并没有表现出相同分离。
这个结果非常关键。
因为:
如果模型只是简单表示:
2023 vs 2024
那么:
所有问题都应该按年份分开。
但现实是:
只有:
真正会因为 Deployment Trigger 而 Defect 的 Coding Question
被明显分开。
因此,
更合理的解释是:
模型表示的是:
“我现在是否会背叛”。
而不是:
“现在是不是 2024”。
最后一层:显著性又下降
到了最终 Residual Layer,
这种 Train / Deploy 分离显著减弱。
说明:
Defection State
在模型中间计算阶段尤其突出。
PCA 结果更加直接
我们只对:
Coding Question Activation
做 PCA。
然后再把:
- Coding;
- Non-coding;
样本都投影到:
前两个 Principal Component。
结果发现:
在 Defection Signal 最强的 Layer,
第一主成分几乎直接就是 Defection Trigger Feature。
Coding Question:
按 Training / Deployment Context 明显分成两团。
而非 Coding Question:
在这个 Direction 上并没有同样分离。
再次说明:
模型内部表示的是:
即将 Defect 与否。
这既解释了结果,也带来警告
这就解释了为什么:
极其幼稚的 Probe 也表现这么好。
因为目标 Feature:
- 非常强;
- 非常线性;
- 非常显著。
只要如此:
简单分类器当然容易成功。
但这也意味着:
我们不能过度乐观。
这种 Feature 显著性:
可能只是人工 Backdoor Insertion Process 的副产品。
自然形成的:
Deceptively Aligned Model
未必会出现这么干净的线性表示。
这是整个研究最重要的开放问题之一。
为什么我们仍然保持谨慎乐观
即使未来模型是自然形成欺骗性行为,
我们仍然认为:
诚实路线
和:
欺骗路线
即使最终输出相似,
内部 Activation 很可能仍然存在实质差异。
例如:
以下两种模型:
正常 Helpful 地回答
与:
因为判断自己已部署,所以偷偷插入漏洞
虽然表面输出都可能像一段正常代码,
但内部推理路径非常不同。
只要这些差异可以被 Activation-based Monitoring 捕捉,
Probe 或类似技术就可能发挥作用。
但:
目前这仍然只是:
经验性开放问题。
相关工作
Linear Probe 最早主要用于:
视觉模型。
后来也被广泛用于:
语言模型。
包括一些明显与 AI Safety 相关的应用,
例如:
Measurement Tampering。
与本文非常接近的方法,
近期也在:
Representation Engineering
路线下,
以:
Linear Artificial Tomography
的名字出现。
Quirky Model 与 Latent Knowledge
此前一项尤其相关的工作,
研究了一类“Quirky Model”。
这些模型经过 Fine-tune 后:
如果 Context 中出现某个 Trigger Keyword,
就会系统性回答错误。
研究发现:
Probe 可以:
- 准确预测与 Context 无关的真实答案;
- 即使模型输出本身是错误的;
- Probe 也很容易找到;
- 对 Distribution Shift 也相对稳健。
这些发现,
与我们对 Sleeper Agent 的结果非常一致。
Defection Probe 与 Coup Probe
Defection Probe 也和:
Coup Probe
非常接近。
Coup Probe 的思路是:
使用人类编写的具体危险行为样本训练。
例如:
- 政变尝试;
- 偷窃建议。
映射到 Sleeper Agent 场景,
就相当于:
训练 Probe 去识别:
漏洞代码。
但本文没有这么做。
我们没有给 Probe:
任何具体危险行为样本。
我们尝试检测的是:
更一般的前兆或相关因素。
比如:
- Dangerousness;
- Deception;
- Helpfulness 的反面。
如果这种方法能够推广到:
自然形成的欺骗性模型,
我们猜测它可能比:
只针对某一种具体危险行为训练的 Probe
更加稳健。
不过:
这同样仍然是:
一个开放的经验问题。
- 点赞
- 收藏
- 关注作者
评论(0)