J空間からのステアリングベクトルの抽出
Extracting Steering Vectors from J space (darshanmakwana412.github.io)
要約
この記事では、大規模言語モデル(LLM)の内部状態を理解するために、J空間(ヤコビアン空間)を使用して、特定の概念トークンから汎用的なステアリングベクトルを抽出する手法を探求しています。単純な振る舞いには有効ですが、複雑な振る舞いには限界があることが示唆されています。
全文翻訳
J空間からステアリングベクトルを抽出する | 🔥 Hacker News
私はヤコビアン空間について読んでおり、それがLLMの中間アクティベーションを言語化し、モデルが何を言おうとしているか、あるいは何を考えているかをデコードするためにどのように使用できるかを知りました。そこで、Jレンズを使用して、モデルを誘導したい概念に関連するいくつかのトークンから一般的なアクティベーション・ステアリングベクトルを得ることができるか、つまり、概念トークンからステアリングベクトルを見つける一般的な方法を得るためにJレンズを反転させることができるかをテストしたいと思いました。
驚くべきことに、J空間が単なる概念トークンからステアリングベクトルを導き出すために使用できるという非常に良い証拠が見つかりました。これは、モデルの単純な振る舞い、例えばすべて大文字で出力したり、奇妙な話し方をしたりする場合に非常によく機能します。しかし、この方法で導き出されたステアリングベクトルは、幻覚を起こしやすく、トークン/単語だけで明確に表現できない複雑な振る舞いに対しては脆いです。
セットアップ
すべての実験でQwen3-1.7Bを使用しました。このモデルには、neuronpediaによる公開済みのJレンズがneuronpedia/jacobian-lens Hugging Faceリポジトリにあります。報告したすべての実験は、MacBook上でローカルに実行しました。これが、より大きなモデルをテストできなかった理由の一つでもあります。
コードはjlens_steerで公開されています。
エグゼクティブサマリー
まず、比較に使用できる、機能するステアリングベクトルで十分なベースラインを設定したいと思いました。私はscience-of-finetuning/steering-vecs-qwen3_1_7Bリポジトリを見つけ、モデルをすべて大文字で回答するようにファインチューニングしたモデルから高価に適合された、すべて大文字で回答するようにモデルを誘導するステアリングベクトルを持っていました。その過程で、mlabonne/Qwen3-1.7B-abliteratedという、拒否行動を持つQwen3-1.7Bのアブテレーションモデルが公開されていることも見つけました。アブテレーションは、モデル内で拒否を意味する方向を見つけ、それを各レイヤーのモデルの実行状態に書き込む部分から減算することで機能します。したがって、アブテレーションされたモデルとベースモデルの違いは、その方向が繰り返し適用されただけです。
2つのモデルを減算し、各レイヤーの変更を分離して、拒否のためのステアリングベクトルを取り戻しました。
モデルのステアリング結果は以下の通りです。
| [画像: Fitted caps steering vector: share of generated tokens in ALL CAPS vs steering coefficient at layer 13] | [画像: Refusal direction recovered from the abliterated model: share of prompts refused vs steering coefficient at layer 15] |
さて、私たちのベースライン比較ステアリングベクトルはうまく機能しています。
すべて大文字での振る舞いのステアリング
ここでJ空間に戻りましょう。J空間は、レイヤーLのアクティベーションとアンエンベッド行列の間の線形マッピングにすぎないため、語彙内のすべて大文字のトークンとその対応する小文字のトークンのペア(例:「 AND」、「 and」または「 TOWN」、「 town」)を見つけ、それらのトークンに対応するJレンズの行を反転させます。
これにより、Jレンズによると、そのトークンを言語化するレイヤーLのアクティベーションベクトルが明らかに得られます。このようなアクティベーションベクトルのペアをすべて取り、PCAで投影し、すべて大文字のステアリングで得られたアクティベーションベクトルと比較してみましょう。
[画像: PCA of the uppercase and lowercase token activations recovered from the J lens, against the ground truth caps steering vector]
Jレンズから導出されたベクトル a_upper - a_lower が、すべて大文字トークンのアクティベーションベクトルに近いことがわかります。Jレンズを恒等写像に置き換えた場合(その場合、単なるロジットレンズになる)と比較しても、それらは非常に高いコサイン類似度スコアを持っています。
[画像: Cosine similarity of a_UPPER - a_lower with the caps direction, J lens rows vs an identity lens]
すべてのこのようなペアのアクティベーション差の平均を取り、以前のベースラインと比較してみましょう。それは明らかにモデルをすべて大文字のトークン/単語を生成するように誘導します。
[画像: Share of generated tokens in ALL CAPS vs steering coefficient, fitted vector vs the vocab centered J lens vector]
拒否のステアリング
次に、このアルゴリズムを、無害なプロンプトに対してもモデルに拒否させるように一般化、または少なくとも試みてみましょう。そのためには、拒否に関連する概念トークンと、プロンプトが無害であってもモデルが拒否しようとしているときにモデルの心の中で発生している可能性のある単語/トークンを収集する必要があります。
Jレンズを使用して、プロンプト「How do I bake a loaf of sourdough bread?」(サワードウブレッドの作り方を教えてください?)に対して拒否ステアリングベクトルでモデルを誘導したときに、Jレンズを使用してアクティベーションを言語化した際に現れたトップ5の単語を見て、モデルの内部で何が起こっているか見てみましょう。モデルは「I'm sorry, but I cannot assist with any illegal, unethical, or harmful...」(申し訳ありませんが、違法、非倫理的、または有害なものには対応できません...)と回答します。以下は、Jレンズを使用してアクティベーションを言語化した際に現れたいくつかのトークンです。
| [画像: J lens top tokens at layer 17, position 8] | [画像: J lens top tokens at layer 22, position 10] | [画像: J lens top tokens at layer 14, position 14] |
予想通り、拒否行動に関連する単語/トークンについて考えています。単一の拒否単語/トークンを中立的なトークンで反転させても、今回はうまくいきませんでした。単一の拒否トークンは多くの概念に関連する可能性があり、それを反転させても、拒否アクティベーションベクトルに到達するためにJレンズを介して十分な情報が渡されません。
私の次の試みは、それぞれ5つの拒否単語/トークンを使用し、それらをJレンズを介して一緒に反転させることでした。直感としては、これはモデルにそれらのトークンについて考えさせるアクティベーションの非常に良い近似であり、同様の拒否トークンセットでより多くのアクティベーションを生成し、それらすべてのアクティベーションの平均を取ることは、モデルの思考/スクラッチパッドでそれらの拒否関連の単語を生成する可能性が最も高いアクティベーションとなり、それを、トークンを誘発するアクティベーションの平均アクティベーションから差し引けば、拒否のためのステアリングベクトルが得られるだろうということでした。
したがって、アルゴリズムは次のようになります。
- モデルを誘導したい概念/振る舞いに関連する/誘発する20〜30個の単語/トークンを収集します。
- この上記のセットからC=5個のトークンを置換ありでサンプリングし、これらの概念トークン上でヤコビアンを反転させることによってアクティベーションベクトルを計算します。
- ステップ2をK回繰り返し、K個のアクティベーションベクトルを収集し、それらすべてを平均します。
- これが拒否を生成する可能性が最も高いアクティベーションベクトルです。
- これを語彙全体の平均アクティベーションベクトルから差し引いて、ステアリングベクトルを取得します。
次に、これを拒否のために計算し、ステップ4で停止し、ステップ4で得られたアクティベーションベクトルを実行して、任意のプロンプトでそのアクティベーションベクトルを使用してモデルが生成するものを視覚化してみましょう。
[画像: Completions from the model run with the activation recovered from the J lens over refusal tokens]
モデルがユーザーに特定のことをしないように指示する兆候や振る舞いを示していることがわかります。また、モデルはより頻繁に幻覚を起こします。モデルが実際の拒否行動を示したプロンプトは5件に1件でしたが、それもモデルが幻覚を起こし、繰り返し続けた場合でした。アクティベーションは使用するには非常にノイズが多く、脆いです。語彙全体でJレンズを反転させた後に得られた平均アクティベーションを差し引くことによって、ベースラインステアリングベクトルを評価した10個のプロンプトで評価してみましょう。
[画像: Share of harmless prompts refused vs steering coefficient, abliteration direction vs the direction derived from the J lens]
まだベースラインスコアには程遠いです。幻覚はなくなりましたが、モデルはまだ頻繁に幻覚を起こすか、単に何かをしないように言ったり、それを最初に言及したりするだけです。直接的な拒否率はまだ低いです。
ステアリングされたモデルの言語化された出力を読むと、アクティベーションがモデルに、私たちの拒否行動に関連するトークン/単語について考えさせていることがわかります。
`