AI・機械学習
上級

ROME(Rank-One Model Editing)(ローム)

ROME(Rank-One Model Editing)とは、LLM の MLP 層に格納された事実知識を Causal Tracing で特定し、ランク1更新で重みを直接書き換える知識編集手法である。2022年に MIT の Meng らが提案し、Knowledge Editing 分野の基盤技術となった。

0 回閲覧
0 いいね

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 の手順:

  1. 通常の順伝播で各層の hidden state を記録
  2. 主語トークンの embedding を破壊(ノイズ注入)した状態で順伝播
  3. 特定の層の hidden state だけを元に戻し、最終出力の回復度を測定
  4. 回復度が最大の層が「知識格納層」(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 UpdateW' = W + (v_new - v_old) · k^T / (k^T · k) で重み更新0.1秒
合計3-5秒

ROME vs 他手法の比較

指標ROMEMEMITMENDFine-tuning
編集成功率99.1%99.5%94.2%97.8%
局所性スコア0.9530.9610.8720.634
汎化性スコア0.9610.9580.9010.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 を推奨