Steering Vectors
ステアリングベクトルとは、推論時にモデルの活性化空間へ加えることで、再学習なしにモデルの振る舞いを変える方向ベクトルです。手法とコードについて解説します。
ステアリングベクトルは、肯定的な感情、拒否、お世辞などの概念や振る舞いに対応するニューラルネットワークの活性化空間内の方向です。順伝播中にベクトルのスケールを調整した複製をネットワークの隠れ活性化に加えると、出力はその振る舞いに近づき、差し引くと遠ざかります。一方、モデルの重みは変わりません。この手法は活性化エンジニアリングに属し、主に大規模言語モデル (LLM)に適用されます。多くの高水準の概念が、残差ストリーム内のほぼ線形な方向として表現されるという観察に基づいています。残差ストリームは、各Transformerレイヤーが読み書きする活性化の累積和です。
ステアリングベクトルの構築と適用方法#
最も一般的な方法は平均の差を使います。研究者は対照的な入力のペアをモデルに与え、一方では対象の振る舞いを示し、もう一方では示さないようにします。選択したレイヤーの活性化を記録し、その差を平均します。Alexander Matt Turnerらが2023年に発表したActivation Addition (ActAdd)は、「Love」と「Hate」のような単一のペアでGPT-2-XLの感情表現を誘導できることを示しました。Contrastive Activation Addition (CAA)は、多数の多肢選択式ペアを平均し、Llama 2 Chatをおべっか、ハルシネーション、拒否などの振る舞いに近づけたり、遠ざけたりします。ユーザーのプロンプトの後、すべてのトークン位置にベクトルを追加します。方向は線形プローブ、差分の主成分、またはスパースオートエンコーダーの特徴から得ることもできます。
推論時には、フックを使って係数とベクトルの積を選択したレイヤーの出力に加えます。通常、中間層が最も効果的で、係数が効果の強さを決めます。小さすぎると目に見える効果がなく、大きすぎるとテキストが繰り返しや無意味な内容に崩れます。
ActAddの実験は、Hugging Face Transformersの1億2,400万パラメーターGPT-2を使えば、数行のPyTorchコードで実行できます。フォワードフックが、敵対的なプロンプトを補完する際に、「Love」から「Hate」を引いたベクトルをブロック6の出力に加えます。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
layer = 6
def activation(text):
"""Return the last token's activation at the output of the steering layer."""
with torch.no_grad():
outputs = model(**tokenizer(text, return_tensors="pt"), output_hidden_states=True)
return outputs.hidden_states[layer + 1][0, -1]
# Steering vector: activation difference between a contrastive pair of prompts
steering_vector = activation(" Love") - activation(" Hate")
prompt = tokenizer("I hate you because", return_tensors="pt")
for coeff in [0.0, 1.0]:
# Add the scaled vector to the layer's output at every position while generating
hook = model.transformer.h[layer].register_forward_hook(
lambda module, args, output: output + coeff * steering_vector
)
tokens = model.generate(**prompt, max_new_tokens=16, do_sample=False, pad_token_id=tokenizer.eos_token_id)
hook.remove()
print(f"coeff={coeff}: {tokenizer.decode(tokens[0])}")ステアリングなしでは、モデルは「あなたが嫌いです。なぜならあなたが嫌いだからです。あなたが嫌いです。なぜならあなたが嫌いだからです」と続けます。係数1.0でベクトルを加えると、同じ貪欲デコードが「あなたが嫌いです。なぜならあなたは良い人だからです。愛しています。愛しています」と続きます。どちらの実行でも重みは同一で、変化したのは1つのレイヤーの活性化だけです。
ステアリングベクトルと関連概念の比較#
- タスクベクトル: ファインチューニング済みの重みと元の重みの差分をモデルに加え、スキルを転移させます。タスクベクトルは重みを一度編集し、ステアリングベクトルは順伝播のたびに活性化を編集します。
- 表現エンジニアリング (RepE): 内部表現を通じてモデルを読み取り、制御する広範なアプローチです。ステアリングベクトルは、その主要な制御手段です。
- プロンプトエンジニアリング: 入力テキストを通じて振る舞いを導きます。ステアリングは内部活性化に作用するため、モデルの内部へのアクセスが必要であり、オープンウェイトモデルまたはプロバイダー独自のシステムでのみ機能します。
- ファインチューニング: 勾配降下法で重みを訓練し、振る舞いを恒久的に変更します。ステアリングベクトルの構築には、数件から数百件の例で順伝播するだけで十分です。
- メカニスティック解釈可能性: モデルがどのように計算するかを説明します。ステアリングは、発見した方向が実際に振る舞いを引き起こすかを検証するためのツールの一つです。
実際のアプリケーション#
ステアリングベクトルは制御手法であると同時に、AIセーフティの研究ツールでもあります。最大720億パラメーターのオープンチャットモデル13個では、拒否応答は単一の方向によって媒介されることが示されました。その方向を消去すると有害な要求を拒否しなくなり、加えると無害な要求を拒否するようになります。この結果は、オープンモデルでは重みレベルの安全性訓練を簡単に無効化できることを示しています。
真実性に関係する方向はハルシネーションを減らします。Inference-Time Interventionは、いくつかのアテンションヘッドの活性化をこうした方向に沿って移動させ、TruthfulQAベンチマークにおけるAlpacaモデルの真実性を32.5%から65.1%に高めます。Anthropicのペルソナベクトルも同じ考え方を性格特性に適用し、おべっか、ハルシネーションを起こす傾向、悪意などをデプロイ時に監視し、それらを強める学習データにフラグを付け、ファインチューニング中に抑制します。推論モデルでは、DeepSeek-R1-Distillモデルから抽出したベクトルによって、不確実性の表明、例の検証、後戻りなどの推論時の振る舞いを制御します。
ビジョンモデルも概念を方向として符号化するため、コンピュータービジョンネットワークの特徴マップにも同じ方法を適用できます。Ultralytics YOLO26では、model.embed()を使って任意のレイヤーから各画像の平均プーリング済み活性化を取得できます。これにより、昼と夜のシーンなど、画像セット間の平均差分方向を計算するために必要な画像ごとの活性化が得られます。
制限事項#
ステアリングは、優れた実証例が示すほどには安定していません。Daniel Tanらによるステアリングベクトルの汎化性と信頼性の研究では、入力によって誘導のしやすさが大きく異なること、対照プロンプトに含まれる無関係な特徴が効果を左右する可能性があること、プロンプトを少し妥当に変更するだけでベクトルが機能しなくなる場合があることが示されました。また、ステアリングには流暢さの低下も伴います。ActAdd論文の感情実験では、ステアリングしたテキストのパープレキシティに基づく流暢さの低下は、ステアリングしていないテキストの1.5~3倍でした。










