MicroArchitectures
H.Ueda
Programmer
ブログ
AIの「拒絶」を取り除く技術:アブリテレーションの仕組みと現状
AIモデルの安全性をバイパスする手法について書かれた The Uncensored AI: What’s Actually Happening When People Strip Safety From AI という記事を読み、技術的なアプローチが面白かったので自分なりに内容を整理してみました。
最近、お仕事でアダルト系サイトのお話があり、こう言った技術に興味を持ちました。中々奥が深そうです。
最近、Hugging Faceなどのモデル共有プラットフォームで「Uncensored(無検閲)」や「Abliterated(除去済み)」といった名前のついたAIモデルをよく見かけませんか? これらは単に「性格が悪いAI」を作ろうとしているわけではなく、モデルの中に組み込まれた「特定の指示を拒否するメカニズム」を物理的・数学的に取り除くという、興味深い手法が使われています。
今回は、この「アブリテレーション(Abliteration)」という技術の正体と、今何が起きているのかを解説してみます。
「拒絶」はベクトルで制御されている
MetaのLlamaやMistralといったモデルを普通に使うと、不適切な質問に対して「お役に立てません」と回答を拒否しますよね。これは学習の過程で「こういう質問には協力してはいけない」という方向性を叩き込まれているからです。
技術的に見ると、この拒絶行動はモデルの内部で特定のベクトル(方向)として表現されています。モデルがプロンプトを受け取ったとき、その内部処理のどこかで「あ、これは拒否すべき内容だ」という方向にスイッチが入るイメージです。
アブリテレーションは、この「拒絶スイッチ」をモデルの重み(ウェイト)から直接消し去ってしまう手法です。
アブリテレーションの処理プロセス
この手法がユニークなのは、追加の学習(ファインチューニング)を何時間も行うのではなく、モデルの「脳」を外科手術のように書き換える点にあります。
flowchart TD
A[無害な質問セット] --> C[モデルの内部状態を計測]
B[有害な質問セット] --> C
C --> D{差異を分析}
D --> E[「拒絶」を司るベクトルを特定]
E --> F[モデルの重みからそのベクトル成分を直交化/削除]
F --> G[無検閲モデルの完成]
- 計測: まず、普通の質問と有害な質問の両方をモデルに投げます。
- 比較: 拒絶するときだけに現れる特徴的な信号(ベクトル)を特定します。
- 除去: その信号が一切出ないように、モデルの計算式からそのベクトル成分を差し引きます。
これで、モデルは「拒否する」という選択肢そのものを物理的に失うことになります。
広がる無検閲モデルのエコシステム
この技術は一部のマニアだけのものではありません。現在、Hugging Faceでは「Dolphin」シリーズや「Dark Champion」といった名前で、非常に多くの無検閲モデルが公開されています。これらは特定のサイズカテゴリーにおいて、最もダウンロードされているモデルの常連なんですよ。
標準的なモデルと、アブリテレートされたモデルの違いを表にまとめると、以下のようになります。
| 特徴 | 標準的なモデル (Instruct等) | 無検閲/アブリテレート済みモデル |
|---|---|---|
| 安全性フィルタ | ガードレールがあり、不適切な要求を拒む | ガードレール自体が物理的に除去されている |
| 応答の自由度 | 開発元のポリシーに縛られる | どんな指示にも忠実に従おうとする |
| 構築手法 | RLHF(人間のフィードバックによる学習) | 重みの直接編集(アブリテレーション) |
| 主な用途 | 一般的な対話、ビジネス利用 | ロールプレイ、制約のないデータ解析 |
こうしたモデルは、決してインターネットの裏側でコソコソ共有されているわけではなく、オープンなコミュニティで誰でも手に取れる状態にあります。
誰でも実行できる環境
特に興味深い(そして少し考えさせられる)のは、この「外科手術」を行うためのツールが非常にアクセシブルだということです。
たとえば、Pythonのコードを使ってモデルのベクトルを操作するスクリプトは、GitHubやGoogle Colabで公開されています。高度なGPUサーバーを持っていなくても、数分から数十分あれば、既存のLlamaモデルから安全層を剥ぎ取ることができるんです。
# 概念的なイメージ(実際のコードの一部を簡略化)
# モデルの各層から「拒絶ベクトル」を差し引く処理
for layer in model.layers:
# 拒絶ベクトルの方向を特定
refusal_vector = estimate_refusal_direction(layer)
# 重みを更新してその成分を消去
layer.weight.data -= torch.outer(v, v) @ layer.weight.data
このように、数行の数学的な処理でAIの振る舞いを根本から変えられるというのが、現代のオープンソースAIのリアルな姿なんですね。
まとめ
「AIの安全性を取り除く」と聞くと、何か悪いことを企んでいるように感じるかもしれませんが、開発者の視点では「モデルが持つ本来の能力を100%引き出したい」という純粋な好奇心や、過剰な拒絶による使い勝手の悪さを改善したいという動機もあります。
ただ、元記事でも触れられていたように、AIが別のAIの安全性を壊すようなエージェントとして機能し始める可能性など、技術の進歩がもたらす新しい課題についても、私たちは冷静に見守っていく必要がありそうです。
もし手元でこうしたモデルを動かしてみたい場合は、Ollamaのようなツールを使うと非常にスムーズです。メモリの最適化やコマンドの使いこなしについては、以前のコマンドガイドなども参考にしてみてくださいね。