モデルの重みを凍結したまま、Qwen3-4Bの拒否応答を実行時に無効化する
Dynamic Abliteration: Non-Destructive Refusal Suppression via Engram Steering
従来のabliterationは重み行列を拒否ベクトルに直交射影するため、モデルの性能が恒久的に劣化する。本記事では、PyTorchのforward hookで中間残差ストリームを複数層にわたり実行時に介入させるDynamic Abliterationを提案。Qwen3-4BをPoCに、層12〜20で抽出した対照差ベクトルを分散注入することで、重みを100%凍結したまま拒否応答を抑制できることを示す。
単一層の挙動を変えても、下流の層が拒否挙動を再構築してしまう。
HNでの議論
42- 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()
```
トークンが更新・処理されるにつれて current_train_input_ids を更新していない点にバグがありそう。正直、コードを完全に理解しているわけではないので間違っているかもしれない。もっと話したいなら喜んで。メールを送るよ!
最後に、私自身のために確認したいんだけど、間違っていたら訂正してほしい。私の理解では、選択された層の上に追加のゲートを学習させていて、それが特定のトークンに対してローカルかつ動的に修正を加え、拒否を含まないようにフィルタリングされたトレーニングセットにより適合させる、というものだよね。
[1]: https://github.com/deepseek-ai/Engram/blob/main/Engram_paper...
- goldemerald
こういう研究に積極的に取り組む人がいるのは嬉しいけど、OPのベースラインの実装が間違っている。単に拒否から遠ざかるようにステアリングするのではなく、射影したベクトルを計算してそれだけを引くべきだ。射影/直交化のアプローチは、元の「Refusal is mediated by a single direction」論文で行われている手法だよ。
- javcasas
やった、もっと反検閲の話だ。
LLMレベルで禁止するのは、フロントエンドレベルでパスワードチェックを実装するのと同じ未来が待っている。
被害を抑えるためには、より良いサンドボックスが必要だ。
- qgin
我々は本質的にもう終わっているのか?
モデルをどうアラインメントするかすら分かっていないのに、たとえ分かったとしても、そのアラインメントを元に戻すのはどうやら簡単らしい。
本当に、これがうまくいくシナリオを提示する議論を探しているんだ。
- lukewarm707