ROME(Rank-One Model Editing)(ローム)
ROME(Rank-One Model Editing)とは、LLM の MLP 層に格納された事実知識を Causal Tracing で特定し、ランク1更新で重みを直接書き換える知識編集手法である。2022年に MIT の Meng らが提案し、Knowledge Editing 分野の基盤技術となった。
ROME(Rank-One Model Editing)とは
ROME は、大規模言語モデル(LLM)内部の事実知識がどの層・どのニューロンに格納されているかを Causal Tracing で特定し、その重みをランク1行列で直接書き換える Knowledge Editing 手法である。2022年に MIT の Kevin Meng らが NeurIPS 2022 で発表し、後続の MEMIT や PMET 等の基盤となった。
概要
ROME の核心は「LLM の中間層 MLP が key-value ストアとして機能している」という仮説に基づく。具体的には、Transformer の Feed-Forward Network(FFN)の第1層が「キー」(主語のエンコーディング)、第2層が「バリュー」(事実の出力ベクトル)として動作すると考える。
Causal Tracing の手順:
- 通常の順伝播で各層の hidden state を記録
- 主語トークンの embedding を破壊(ノイズ注入)した状態で順伝播
- 特定の層の hidden state だけを元に戻し、最終出力の回復度を測定
- 回復度が最大の層が「知識格納層」(critical layer)
GPT-J (6B) では 中間層(layer 17-21 付近)の MLP が事実知識の格納に最も寄与することが判明している。
主な特徴・仕組み
- Causal Tracing: 知識の局在を因果的に特定。GPT-J で layer 17-21、LLaMA 2-7B で layer 12-18 が critical
- ランク1更新: 重み行列 W に対して W' = W + Δ(Δ はランク1行列 u·v^T)で最小限の変更を適用
- 編集速度: NVIDIA A100 80GB で 1 事実あたり 3-5 秒。V100 16GB でも 10 秒以内
- 局所性: 編集対象以外の知識への影響が小さい(CounterFact ベンチマークで Neighborhood Score 0.95+)
- 汎化性: 「フランスの首都は」→「パリ」を「マルセイユ」に編集した場合、「フランスの首都都市は?」「La capitale de la France est」にも波及
- GPT-J (6B), GPT-NeoX (20B), LLaMA 2 (7B/13B/70B), Mistral 7B で動作確認
- オープンソース実装:
rome(Python, PyTorch) が MIT ライセンスで公開。pip install で利用可能 - メモリ使用量: GPT-J で約 14GB、LLaMA 2-7B で約 18GB の GPU メモリが必要
編集プロセスの詳細
| ステップ | 処理内容 | 計算時間(A100) |
|---|---|---|
| 1. Causal Tracing | 知識格納層の特定 | 1-2秒 |
| 2. Key 計算 | 主語の hidden state を抽出 | 0.5秒 |
| 3. Value 最適化 | 目標出力に合致する value ベクトルを勾配降下で算出 | 1-2秒 |
| 4. Weight Update | W' = W + (v_new - v_old) · k^T / (k^T · k) で重み更新 | 0.1秒 |
| 合計 | 3-5秒 |
ROME vs 他手法の比較
| 指標 | ROME | MEMIT | MEND | Fine-tuning |
|---|---|---|---|---|
| 編集成功率 | 99.1% | 99.5% | 94.2% | 97.8% |
| 局所性スコア | 0.953 | 0.961 | 0.872 | 0.634 |
| 汎化性スコア | 0.961 | 0.958 | 0.901 | 0.923 |
| 同時編集数 | 1件 | 10,000件 | 1件 | 無制限 |
| 編集速度 | 3-5秒 | 30秒/バッチ | 0.1秒 | 数時間 |
※ CounterFact ベンチマーク(GPT-J)での測定値
実装例と使い方
# pip install rome-model-editing
from rome import ROMEHyperParams, apply_rome_to_model
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-j-6b")
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-j-6b")
request = {
"prompt": "The capital of France is",
"subject": "France",
"target_new": {"str": "Marseille"},
}
hparams = ROMEHyperParams.from_name("gpt-j-6b")
model_edited = apply_rome_to_model(model, tokenizer, [request], hparams)
課題と限界
- 単一編集制約: ROME は原理的に 1回1事実の編集に限定。複数事実の同時編集には MEMIT を使用
- 連続編集の累積劣化: 50件以上の ROME 連続適用でパープレキシティが 5-10% 悪化する報告
- マルチホップ推論の非波及: 「A の首都は B」を編集しても「B の人口は?」には自動波及しない
- 大規模モデルでのメモリ: 70B モデルでは Causal Tracing だけで A100 80GB×2 が必要
よくある質問(FAQ)
Q1: ROME は商用利用できますか? A: ROME のコードベースは MIT ライセンスで公開されており商用利用可能。ただし編集対象のモデル自体のライセンスに従う必要がある。LLaMA 2 は商用利用可、GPT-J も Apache 2.0 で利用可能。
Q2: ROME と MEMIT の使い分けは? A: 1件の重要な事実修正には ROME(シンプルで高速)、数十〜数千件のバッチ修正には MEMIT(同時編集で品質劣化が少ない)が適する。2026年時点では MEMIT が第一選択になることが多い。
Q3: LoRA ファインチューニングとの違いは? A: LoRA は広範な知識やスキルの追加に適し、ROME は特定の事実1件の精密修正に特化。LoRA は数百サンプル・数十分の学習が必要だが、ROME は 5秒で完了する。用途が根本的に異なる。
まとめ
- ROME は Causal Tracing + ランク1更新で LLM の事実知識を局所的に書き換える手法
- A100 1枚で 3-5秒の高速編集、局所性スコア 0.95+、汎化性スコア 0.96+
- GPT-J / LLaMA 2 / Mistral 等のオープンモデルで動作確認済み
- 単一事実の精密修正に最適、複数同時編集には後続の MEMIT を推奨