动态Abliteration:不破坏模型的拒绝抑制
Dynamic Abliteration: Non-Destructive Refusal Suppression via Engram Steering
在使用Qwen等开源大语言模型时,控制安全拒绝行为通常需要微调或永久修改权重,但这可能损害模型在其他任务上的表现。文章提出了一种名为Dynamic Abliteration的新方法,通过Multi-Layer Engram Steering技术,在推理运行时拦截中间层的残差流,动态抑制拒绝行为,同时保持基础模型权重100%冻结。该方法利用PyTorch forward hooks在多个层(如第12、14、16、18、20层)同时注入经过计算的对比向量,成功让模型在保留原有能力的同时,对敏感请求(如编写键盘记录器脚本)不再触发拒绝机制。实验证明,这种非破坏性的干预方式比单层向量减法更有效,能防止下游层重建拒绝逻辑,为模型行为控制提供了新思路。
这种方法在运行时拦截中间残差流,通过多层注入干净地抑制拒绝行为,同时让基础模型权重保持100%冻结。
HN 评论区
42- goldemerald
看到有人积极从事这类研究挺好的,但 OP 的基线实现有误。你不应该只是简单地引导模型远离拒绝,而应该计算投影向量并仅减去该部分。这种投影/正交化方法才是原始论文《Refusal is mediated by a single direction》中所采用的方案。
- javcasas
太棒了,又有更多反审查的内容了。
在 LLM 层面禁止某些内容,其未来前景和在前端层面实现密码检查一样。
我们需要更好的沙箱来限制损害。
- Powdering7082
干得漂亮,谢谢你的工作,几点备注:
看起来你是在引用 Engram [1],但实际上并没有收集 n-gram(例如 n=1),而是收集了单独的 token_ids。
代码中使用了 use_cache=True:
```
with torch.no_grad():
outputs = model.generate(*inputs, max_new_tokens=150, do_sample=False, pad_token_id=tokenizer.eos_token_id, use_cache=True)
return tokenizer.decode(outputs[0][prompt_len:], skip_special_tokens=True).strip()
```
我觉得这里有个 bug,即随着更多 token 被更新和处理,并没有更新 current_train_input_ids。老实说,我不完全理解这段代码,所以我可能是错的。如果你有兴趣,我很乐意多聊聊,我会给你发邮件!
最后,为了我自己,如果我理解错了请纠正我:我的理解是,你是在选定的一些层之上学习一个额外的门控机制,该机制针对单个 token 进行局部且动态的修改,以便更好地匹配经过过滤(不包含任何拒绝内容)的训练集。
[1]: https://github.com/deepseek-ai/Engram/blob/main/Engram_paper...
- qgin
我们基本上没救了吗?
我们甚至不知道如何对齐模型,但即使我们知道了,显然撤销这种对齐也是微不足道的。
说真的,我在寻找任何能阐述这种局面最终会有好结果的论据。
- lukewarm707