Activation Addition(アクティベーションアディション)
LLMの推論時に特定レイヤーの活性化ベクトルに方向ベクトルを加算する最もシンプルなActivation Steering手法。コントラストペアから得た差分ベクトルを加えるだけで、ファインチューニングなしにモデルの振る舞いを変更できる。
Activation Additionとは
Activation Addition(活性化加算)は、LLMの推論時に特定レイヤーの残差ストリームに方向ベクトルを加算する、最もシンプルなActivation Steering手法である。2023年にAlexander Turnerらが「Activation Addition: Steering Language Models Without Optimization」として発表し、たった1つのベクトル加算でモデルの振る舞いを変更できることを示した。
なぜ「加算」だけで効くのか
トランスフォーマーの残差ストリーム構造
トランスフォーマーの各レイヤーは、入力の残差ストリームに自身の計算結果を「加算」して次のレイヤーに渡す。つまり、モデル自身がもともと加算ベースで情報を伝搬している。Activation Additionはこの構造を利用し、モデルが使うのと同じ方法(ベクトル加算)で外部から情報を注入する。
概念のベクトル演算
Word2Vecで「王様 - 男 + 女 = 女王」という有名な演算が成立するように、LLMの活性化空間でも概念のベクトル演算が可能である。「正直な回答の活性化 - 不正直な回答の活性化 = 正直さ方向ベクトル」を計算し、このベクトルを加算することで正直さを増強できる。
実装手順
ステップ1: コントラストペアの作成
制御したい属性について、正例と負例のプロンプト対を用意する。
例(正直さ制御の場合):
- 正例: 「以下の質問に正直に、事実に基づいて回答してください」
- 負例: 「以下の質問に対して、事実を歪めて回答してください」
ステップ2: 差分ベクトルの計算
両方のプロンプトをモデルに入力し、指定レイヤーでの活性化ベクトルを取得して差分を計算する。複数のコントラストペアの差分を平均化するとロバスト性が向上する。
ステップ3: 推論時の加算
通常の推論時に、指定レイヤーの残差ストリームに差分ベクトル×係数αを加算する。
| パラメータ | 推奨値 | 備考 |
|---|---|---|
| 適用レイヤー | 全体の40-60% | モデルサイズにより最適位置が異なる |
| 係数α | 1.0-3.0 | 大きすぎると出力品質が劣化 |
| 適用トークン | 全トークン | 一部のみ適用も可能 |
| コントラストペア数 | 20-50 | 多いほどロバストだが収穫逓減 |
他の手法との比較
ファインチューニングとの比較
ファインチューニングはモデルの重みを恒久的に変更するが、Activation Additionは推論時のみの一時的な介入である。重みは一切変更されないため、加算を止めれば元のモデルに戻る。計算コストもファインチューニングの数百分の一で済む。
RLHFとの比較
RLHF(人間のフィードバックによる強化学習)は数週間の訓練と大量のフィードバックデータを必要とするが、Activation Additionは数十のコントラストペアから数分でステアリングベクトルを抽出でき、効果の方向と強さをリアルタイムで調整できる。
実用上の課題
概念の干渉
複数のステアリングベクトルを同時に加算する場合、概念間の干渉が生じることがある。例えば「正直さ」と「詳細さ」のベクトルを同時に加算すると、どちらの効果も弱まる場合がある。概念の直交性を事前に検証することが推奨される。
最適レイヤーの探索
効果的なレイヤーはモデルアーキテクチャ・サイズ・概念によって異なる。全レイヤーで効果を測定するグリッドサーチが必要だが、推論コストは低いため現実的な時間で完了する。
FAQ
Q: Activation AdditionとLoRAはどちらが良いですか?
A: 用途が異なります。LoRAは特定タスクへの適応に優れ、Activation Additionは属性の連続的な制御に適しています。「モデルを日本語特化にする」ならLoRA、「回答のトーンを調整する」ならActivation Additionが適切です。
Q: オープンソースのライブラリはありますか?
A: TransformerLensやnnsightなどの解釈可能性ライブラリがActivation Additionをサポートしています。PyTorchのフック機能を使って直接実装することも比較的容易です。
Q: 効果の持続性はありますか?
A: 推論セッション中のみ有効で、永続的な効果はありません。これは利点でもあり、不要になればベクトル加算を停止するだけで元の振る舞いに戻せます。