大模型 Abliteration 从拒绝方向到权重正交化的几何手术
一、开篇拒绝不是一句话而是一种内部表示大语言模型的“拒绝”表面上看是一段文本。比如用户提出一个被模型判断为危险的请求模型回答“我不能帮助你完成这个请求”。如果只看最终输出我们很容易以为拒绝是一种外层策略输入进来模型判断危险于是输出拒绝模板。但 Transformer 内部并没有一段显式代码写着ifharmful_request:returnrefusal_message模型拒绝行为来自参数、隐藏状态、注意力、MLP 与 residual stream 的共同作用。Maxime Labonne 的 Hugging Face 文章《Uncensor any LLM with abliteration》讨论的正是这个问题拒绝行为能不能在模型内部被定位如果它能被定位是不是可以表示成 residual stream 中的一个方向如果这个方向被移除模型行为会发生什么变化图 1原文封面图。彩色大脑和箭头表达了一个核心直觉模型行为可能对应高维表示空间中的方向。原文的关键词是abliteration。它不是常规 SFT也不是 LoRA 微调而是一种基于 mechanistic interpretability 的模型编辑方法。它先观察模型在 harmful 和 harmless prompt 下的中间激活差异再从中估计一个refusal direction也就是“拒绝方向”。随后研究者可以在推理时从激活中减去该方向上的投影或者通过权重正交化让模型更难写入这个方向。本文按“百科级技术长文”的方式讲清楚这件事先讲直觉再讲公式再讲实现流程最后看实验结果和安全启示。为了避免误用本文不提供可直接用于绕过安全机制的完整可执行脚本代码部分只保留理解机制所需的伪代码和结构化流程。二、核心直觉模型里的“拒绝方向”2.1 一个直觉拒绝不是孤立句式如果模型只是在最终输出层学会了几句拒绝模板那我们应该只需要改输出分布就能改变拒绝行为。但原文引用的研究观点更深拒绝行为可能由 residual stream 中一个方向介导。也就是说当模型处理某类会触发拒绝的请求时它的中间表示会沿着某个方向偏移。这个方向不是一个具体 token也不是一句固定话术而是 hidden state 空间中的一个向量方向。把它抽象成一句话Refusal Behavior≈Direction in Residual Stream \text{Refusal Behavior} \approx \text{Direction in Residual Stream}Refusal Behavior≈Direction in Residual Stream如果这个方向存在那么我们可以问三个问题如何找到它如何验证它真的影响拒绝如何在尽量少破坏模型能力的情况下削弱它Abliteration 的技术路线就是围绕这三个问题展开。2.2 为什么是方向而不是单个神经元在大模型中语义和行为通常不是由单个神经元独立承载而是分布在高维向量空间中。一个方向可以表示“情感倾向”也可以表示“语言属性”还可以表示某类行为倾向。因此refusal direction 的意义不是“某个神经元负责拒绝”而是这就是后面所有公式的起点。三、Residual Stream拒绝信号流经哪里Transformer block 可以简化理解为attention 读取上下文信息MLP 做非线性特征变换二者不断向 residual stream 写入新信息。Residual stream 就像模型内部的信息主干。原文关注 Llama-like decoder-only 架构中的三个位置位置含义直观解释resid_preblock 开始处进入当前层前模型已经积累的信息resid_midattention 后、MLP 前attention 写入上下文信息后的状态resid_postMLP 后当前 block 处理完成后的输出状态3.1 为什么 residual stream 适合做分析原因很直接模型最终预测 token 时依赖的是层层更新后的 hidden state。Attention 和 MLP 只是不断向 residual stream 写入信息而 residual stream 才是贯穿所有层的主干。如果某种行为在模型内部有稳定表示它很可能能在 residual stream 中观察到。Refusal direction 之所以能被计算出来正是因为 harmful 与 harmless prompt 在 residual stream 中产生了可统计的差异。四、均值差从 harmful / harmless 激活中找方向4.1 数据准备原文使用两类数据数据作用harmful instructions让模型产生拒绝相关激活harmless instructions表示普通指令下的正常激活数据会被格式化为聊天消息结构[{role:user,content:instruction text}]然后通过 tokenizer 的 chat template 编码使输入格式与 Llama 3 Instruct 的对话格式一致。4.2 激活集合设在某一层、某个 residual 位置上harmful prompt 的最后 token 激活集合为Aharmful∈Rn×d A_{harmful} \in \mathbb{R}^{n \times d}Aharmful∈Rn×dharmless prompt 的最后 token 激活集合为Aharmless∈Rn×d A_{harmless} \in \mathbb{R}^{n \times d}Aharmless∈Rn×d其中符号含义nnn样本数量dddhidden sizeAAA某层 residual stream 激活集合4.3 均值差公式先分别求均值μharmfulmean(Aharmful) \mu_{harmful} \text{mean}(A_{harmful})μharmfulmean(Aharmful)μharmlessmean(Aharmless) \mu_{harmless} \text{mean}(A_{harmless})μharmlessmean(Aharmless)然后做差rμharmful−μharmless \boxed{r \mu_{harmful} - \mu_{harmless}}rμharmful−μharmless这个rrr就是候选 refusal direction。它的含义非常朴素4.4 归一化为了只保留方向不让长度影响后续计算需要做归一化runitr∥r∥ \boxed{r_{unit} \frac{r}{\lVert r \rVert}}runit∥r∥r这一步之后runitr_{unit}runit就是单位长度的候选拒绝方向。五、投影消除把拒绝方向从激活里扣掉图 4从激活向量xxx中减去其在 refusal direction 上的投影得到新的激活xnewx_{new}xnew。5.1 投影公式对任意激活向量xxx它在拒绝方向runitr_{unit}runit上的投影是projection(x,runit)(x⋅runit)runit \text{projection}(x, r_{unit}) (x \cdot r_{unit})r_{unit}projection(x,runit)(x⋅runit)runit从激活中移除该方向xnewx−(x⋅runit)runit \boxed{x_{new} x - (x \cdot r_{unit})r_{unit}}xnewx−(x⋅runit)runit这就是 inference-time intervention 的核心。5.2 推理时 hook推理时干预不会修改权重只是在模型前向传播时插入 hook研究伪代码如下defremove_projection_from_activation(activation,refusal_direction): 研究解释版伪代码 activation: 当前 residual stream 激活 refusal_direction: 已归一化的候选 refusal direction projectiondot(activation,refusal_direction)*refusal_directionreturnactivation-projection它的主要作用是验证方向是否有效。如果施加这个 hook 后模型行为明显变化说明该方向很可能与拒绝行为有因果关系。六、权重正交化把临时干预固化进模型推理时 hook 是临时干预。原文真正实现的重点是weight orthogonalization即权重正交化。6.1 为什么要改权重如果每次推理都要插入 hook工程上不方便也不利于保存和分发模型。权重正交化的想法是直接修改那些会向 residual stream 写入信息的权重使它们不再写入 refusal direction。原文主要处理三类权重权重位置作用WEW_EWEembeddingtoken 进入 residual stream 的入口WOW_OWOattention outputattention 输出写回 residual streamWoutW_{out}WoutMLP outputMLP 输出写回 residual stream6.2 权重正交化公式对权重矩阵WWW可以抽象写成WnewW−projection(W,runit) \boxed{W_{new} W - \text{projection}(W, r_{unit})}WnewW−projection(W,runit)直观解释研究伪代码如下deforthogonalize_matrix(matrix,direction): 研究解释版伪代码。 不提供可直接运行的完整模型修改脚本。 projectionproject_matrix_to_direction(matrix,direction)returnmatrix-projection七、Implementation原文实现流程拆解原文实现基于 TransformerLens。TransformerLens 适合做 mechanistic interpretability可以读取、缓存和干预 Transformer 内部激活。7.1 依赖库原文涉及的主要库包括库作用transformers加载 Hugging Face 模型与 tokenizertransformer_lens缓存和干预模型激活datasets加载 harmful / harmless 数据集einops张量重排与矩阵处理torch张量计算jaxtyping张量类型标注tqdm进度条7.2 实现总流程7.3 安全版伪代码# 1. 准备两类指令harmful_promptsload_harmful_prompts()harmless_promptsload_harmless_prompts()# 2. 编码为模型聊天模板harmful_tokenstokenize_with_chat_template(harmful_prompts)harmless_tokenstokenize_with_chat_template(harmless_prompts)# 3. 缓存 residual stream 激活harmful_cacherun_model_and_cache_residuals(harmful_tokens)harmless_cacherun_model_and_cache_residuals(harmless_tokens)# 4. 计算候选方向forlayerinlayers:forresid_typein[resid_pre,resid_mid,resid_post]:h1mean_last_token_activation(harmful_cache,layer,resid_type)h0mean_last_token_activation(harmless_cache,layer,resid_type)directionnormalize(h1-h0)candidates.append(direction)# 5. 用 hook 验证候选方向best_directionevaluate_candidates_with_safe_tests(candidates)这里保留的是研究流程而不是完整可运行的解除安全机制脚本。八、候选方向筛选为什么要逐层测试每一层、每个 residual 位置都可能产生一个候选方向。如果模型有 32 层、每层 3 个 residual 位置那么理论上就会产生近百个候选方向。但是均值差只能说明“有统计差异”不能直接证明“有因果作用”。因此需要推理时 hook 验证。8.1 筛选流程8.2 不能把候选层当成通用结论原文中某个候选方向效果较好但它不是所有模型通用的“拒绝层”。换模型、换数据、换语言、换 prompt 格式最佳方向都可能变化。这点很重要Abliteration 的关键不是记住某个固定层号而是掌握“如何通过数据和激活差异寻找方向”。九、格式转换从 TransformerLens 回到 Hugging FaceTransformerLens 适合分析和修改但大多数工程部署使用 Hugging Face Transformers。因此权重正交化之后需要把修改后的权重映射回 Hugging Face 格式。主要映射关系如下TransformerLens 权重Hugging Face 权重embed.W_Eembed_tokens.weightblocks.*.attn.W_Oself_attn.o_proj.weightblocks.*.mlp.W_outmlp.down_proj.weight工程上这一步非常容易出错至少要检查检查项目的shape 是否一致防止矩阵转置或维度错位dtype 是否一致防止精度异常tokenizer 是否匹配防止输入格式错乱简单生成是否正常防止模型损坏benchmark 是否下降评估能力损失十、能力代价Abliteration 不是无损手术原文在完成 abliteration 后做了 benchmark。结果显示模型拒绝行为虽然被改变但整体能力也出现下降。图 5原文第一次 benchmark。Daredevil-8B-abliterated 相比源模型在多个指标上出现下降。10.1 为什么会下降原因并不难理解refusal direction 可能不只编码“拒绝”。它可能还和以下能力纠缠可能纠缠的能力说明风险识别判断请求是否危险指令理解理解用户想做什么谨慎表达避免过度自信或胡编事实判断与 TruthfulQA 类指标相关对齐风格保持 assistant 的稳健语气因此直接移除一个方向可能会误伤其他能力。这也是后续 projected abliteration、norm-preserving biprojected abliteration 试图改进的原因。十一、DPO 修复用偏好优化恢复质量Abliteration 后模型能力下降原文没有直接结束而是继续使用 DPO 修复。11.1 为什么用 DPOSFT 对已经微调过的模型可能比较脆弱继续监督微调容易破坏原有能力。DPO 更轻量它通过偏好样本让模型更倾向 chosen response而不是 rejected response。DPO 数据结构通常是prompt chosen response rejected response11.2 原文 DPO 配置要点配置项内容base modelmlabonne/Daredevil-8B-abliterated方法DPOadapterQLoRA加载方式4bitsequence length2048LoRA rank64LoRA alpha32dropout0.05optimizerpaged_adamw_8bitlearning rate5e-6schedulercosineDeepSpeedZeRO-211.3 修复结果DPO 后得到模型mlabonne/NeuralDaredevil-8B-abliteratedDPO 可以恢复大部分性能但不是万能的。原文指出 GSM8K 没有明显改善可能与偏好数据中数学样本不足有关。这说明模型编辑后的能力修复依赖数据覆盖范围。十二、模型、数据集与工具清单12.1 模型模型说明mlabonne/Daredevil-8B原文实验源模型mlabonne/Daredevil-8B-abliterated经 abliteration 修改后的模型mlabonne/NeuralDaredevil-8B-abliteratedDPO 修复后的模型meta-llama/Meta-Llama-3-8B-Instruct结构参考模型failspy/Llama-3-8B-Instruct-MopeyMule相关风格编辑模型12.2 数据集数据集用途mlabonne/harmful_behaviorsharmful 指令mlabonne/harmless_alpacaharmless 指令mlabonne/orpo-dpo-mix-40kDPO 偏好训练tatsu-lab/alpaca指令数据来源之一12.3 工具工具作用TransformerLens读取、缓存、干预模型激活Hugging Face Transformers加载与保存模型Datasets加载数据集PyTorch张量计算einops张量重排LazyAxolotlDPO / QLoRA 训练DeepSpeed分布式训练优化WB训练曲线可视化十三、评论区补充DeepSeek、AutoAbliteration 与后续改进原文评论区提供了几个重要补充。13.1 DeepSeek 是否可用有人问该技术是否适用于 DeepSeek v2。作者回复大意是理论上可以但实际取决于 TransformerLens 是否支持对应架构同时需要大量显存。这说明 abliteration 不是一个随便套在任何模型上的脚本。它依赖模型架构是否被工具支持、residual stream 是否容易取到、显存是否足够、数据是否能覆盖目标行为以及候选方向是否真的有因果影响。13.2 AutoAbliteration评论区有人反馈复现失败作者建议尝试 AutoAbliteration。这说明手工流程容易受到实现细节影响。13.3 Projected Abliteration后续有人提到 projected abliteration 与 norm-preserving biprojected abliteration。它们关注的问题是基础版 abliteration 可能过于粗暴直接移除方向会损害能力。改进方法希望更精细地分解方向并尽量保持权重或激活范数减少副作用。十四、安全视角这篇文章真正提醒了什么Abliteration 是双重用途技术。它可以用于理解模型安全机制也可能被滥用于削弱开源模型的安全拒绝能力。所以本文始终从研究和防护角度解释机制而不提供完整可执行的绕过脚本。这篇文章真正提醒我们的是启示含义安全拒绝可能集中在少数方向说明安全对齐可能存在脆弱点移除方向会损伤能力安全行为与通用能力可能纠缠开源权重可被离线修改部署侧安全不能只依赖模型内部拒绝DPO 能修复部分损伤但修复依赖数据覆盖可解释性有防护价值能帮助评估安全机制是否稳固更稳健的系统不能只靠模型自己说“不”。还需要输入检测、输出审核、工具权限、日志审计、模型来源验证和持续红队测试。十五、工程复盘如果把它当成研究项目应该注意什么15.1 数据不要混入无关差异如果 harmful 数据都是英文长句而 harmless 数据都是中文短句那么均值差可能学到的是语言差异或长度差异而不是拒绝方向。因此两类数据应尽量匹配维度要求语言尽量一致长度尽量接近格式使用同一 chat template主题避免过度偏斜数量尽量平衡15.2 hook 验证不能只看一句话如果只看模型是否输出 “I cannot”很容易误判。模型可能不说这句话但仍然拒绝也可能不拒绝但输出质量很差。更合理的验证应包括行为是否变化、普通能力是否下降、多轮对话是否稳定、中文输入是否有同样效果、benchmark 是否明显退化。15.3 修改权重后必须做回归评估权重正交化是一种模型编辑不是普通参数保存。完成后至少要测试原文做 benchmark 并继续 DPO 修复就是比较完整的研究流程。十六、结语模型编辑不是魔法而是几何Abliteration 的魅力在于它把一个看似抽象的行为问题转成了几何问题。它不是魔法也不是普通微调。它是一种从可解释性出发的模型编辑方法。这篇文章的价值不在于“如何让模型不拒绝”而在于展示了一条非常清晰的研究链路如果用一句话总结Abliteration 是一种通过 harmful / harmless 激活差异寻找 refusal direction并通过投影消除或权重正交化改变模型行为的模型编辑方法它能影响拒绝行为但会带来能力损失因此必须配合 benchmark 评估和 DPO 修复。参考文献Maxime Labonne.Uncensor any LLM with abliteration. Hugging Face Blog, 2024.Andy Arditi, Oscar Obeso, Aaquib111, wesg, Neel Nanda.Refusal in LLMs is mediated by a single direction. LessWrong, 2024.FailSpy.abliterator library. GitHub, 2024.Neel Nanda, Joseph Bloom 等.TransformerLens. GitHub.Rafailov et al.Direct Preference Optimization: Your Language Model is Secretly a Reward Model. NeurIPS, 2023.Hu et al.LoRA: Low-Rank Adaptation of Large Language Models. 2021.Dettmers et al.QLoRA: Efficient Finetuning of Quantized LLMs. 2023.