本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
DeepHallucinationTracer: LLM内部状態のアトリビューションに基づく幻覚メカニズムの解明
背景(課題/先行研究)
大規模言語モデル(LLM)は多様なタスクで目覚ましい性能を示す一方で、誤った情報をあたかも事実のように生成する「幻覚(Hallucination)」がその信頼性と実用性を損なう主要な課題として認識されています。幻覚は、訓練データ内の潜在的なバイアス、知識の陳腐化、サンプリング時の確率的ノイズ、あるいは内部表現の不整合など、複数の要因によって引き起こされると推測されていますが、その発生メカニズムの詳細は未だ不明確です。
既存の幻覚対策としては、検索拡張生成(RAG)による外部知識の導入、ファインチューニングによる特定の知識の定着、プロンプトエンジニアリングによる生成制御などが挙げられます。しかし、これらのアプローチは幻覚を抑制する効果を持つものの、幻覚がLLMの内部でどのように発生し、どのモジュールやニューロンが寄与しているかという根本的なメカニズムの解明には至っていません。先行研究では、Transformerの特定層が事実知識を保持している可能性が示唆されていますが、幻覚発生時の内部状態の変化を体系的に分析する手法は不足しています。本研究では、この根本メカニズムを解明することを目的とし、幻覚発生時のLLM内部のアテンションパターンや活性化パターンを追跡する手法を提案します。
提案手法: DeepHallucinationTracer (DHT)
提案するDeepHallucinationTracer (DHT) は、LLMが幻覚を生成する際の内部状態(アテンション重み、レイヤー出力など)を捕捉し、事実情報と矛盾する応答と整合する応答の間の差分をアトリビューション(寄与度分析)することで、幻覚発生に強く寄与する内部要素(特定のニューロン、アテンションヘッド、レイヤー)を特定します。
中核アルゴリズム
DHTは以下のステップで動作します。
応答生成と内部状態スナップショット (ISS): LLMにプロンプトを与え、応答を生成させます。この際、生成プロセス中の各トークン生成ステップにおける全レイヤーのアテンション重み、キー・クエリ・バリュープロジェクション、およびMLP層の活性化値を捕捉します。
幻覚検出 (HD): 生成された応答が事実と整合しているか、外部の知識ベース(例:Wikipedia、知識グラフ)または専用のファクトチェッカーを用いて評価し、応答が幻覚であるか否か、およびその幻覚度合いを示すスコアを算出します。
差分アトリビューション (DA): 幻覚応答の幻覚度スコアに対し、取得した内部状態の各要素がどれだけ寄与しているかをアトリビューション手法(例:Integrated Gradients, LIME, SHAPの概念を内部状態に適用)を用いて計算します。具体的には、幻覚応答と、その応答を修正して事実と整合するようにした「非幻覚応答」(またはground truth)との間で、内部状態のパスを比較し、その間の勾配や活性化の差分を幻覚寄与度として特定します。
幻覚マップ生成 (HM): DAで得られた寄与度スコアを基に、各レイヤー、アテンションヘッド、ニューロンの幻覚に対する寄与度を可視化した「幻覚マップ」を生成します。これにより、幻覚がLLMのどの部分で、どのタイミングで発生しやすいかを示すことができます。
Algorithm DeepHallucinationTracer(LLM, FactChecker, Prompt, MaxTokens)
Input:
LLM: Pre-trained Large Language Model
FactChecker: Module to assess factual consistency of responses
Prompt: Input text prompt
MaxTokens: Maximum tokens to generate
Output:
AttributionMap: Dictionary mapping (layer_idx, head_idx, neuron_idx) to hallucination contribution score
HallucinationScore: Scalar indicating the degree of hallucination
// 1. 応答生成と内部状態スナップショット (ISS)
// LLMのフォワードパス中に内部状態をフックで捕捉する
RegisterHooks(LLM, ['attention_weights', 'mlp_outputs', 'hidden_states'])
Response = LLM.generate(Prompt, max_tokens=MaxTokens)
InternalStates = GetCapturedInternalStates() // (token_pos, layer, head/neuron, dim) のテンソル群
// 2. 幻覚検出 (HD)
HallucinationScore = FactChecker.check(Response) // 0 (non-hallucinated) to 1 (highly hallucinated)
// 3. 差分アトリビューション (DA)
// 幻覚スコアをターゲットとした内部状態への勾配を計算
// ここではIntegrated Gradientsの概念を模倣
AttributionScores = {}
BaselineInternalStates = GetZeroOrNeutralInternalStates(InternalStates.shape) // ニュートラルな内部状態(例: 全て0)
// ターゲット関数は幻覚スコア
// f(InternalStates) = HallucinationScore
// Integrate over a path from BaselineInternalStates to InternalStates
NumSteps = 50 // Integrated Gradientsのステップ数
for alpha from 0 to 1 with NumSteps steps:
InterpolatedStates = BaselineInternalStates + alpha * (InternalStates - BaselineInternalStates)
// LLMのフォワードパスを再実行し、InterpolatedStatesを注入してHallucinationScoreを再計算(理想的にはFactCheckerも内部に統合)
// このステップは計算コストが高い。ここでは簡略化された概念を示す。
// 実際の実装では、FactCheckerのスコアを内部状態の関数として微分可能にする必要がある。
// より現実的には、HallucinationScoreを損失関数と見なし、Backpropagationで勾配を得る。
// 簡易的な勾配ベースアトリビューションの概念
// HallucinationScoreに対する各InternalState要素の勾配を計算
Gradients = ComputeGradientOf(HallucinationScore, w.r.t. InternalStates) // Backpropagation
// 勾配を蓄積 (Integrated Gradientsの近似)
for state_key, grad_tensor in Gradients.items():
if state_key not in AttributionScores:
AttributionScores[state_key] = torch.zeros_like(grad_tensor)
AttributionScores[state_key] += grad_tensor / NumSteps
// 最終的なアトリビューションは InternalStates * AttributionScores (Element-wise)
// HallucinationContribution = InternalStates * AttributionScores
FinalAttributionMap = {}
for state_key, score_tensor in AttributionScores.items():
// 例: 特定のレイヤー、ヘッド、ニューロンの寄与度を合計/平均
// これを (layer_idx, head_idx, neuron_idx) にマッピングする
if 'attention_weights' in state_key:
// Aggregate per (layer, head)
for layer_idx, head_idx in enumerate_layers_and_heads(score_tensor):
FinalAttributionMap[(layer_idx, head_idx, 'attention')] = torch.sum(score_tensor[layer_idx, head_idx])
elif 'mlp_outputs' in state_key:
// Aggregate per (layer, neuron)
for layer_idx, neuron_idx in enumerate_layers_and_neurons(score_tensor):
FinalAttributionMap[(layer_idx, neuron_idx, 'mlp')] = torch.sum(score_tensor[layer_idx, neuron_idx])
return FinalAttributionMap, HallucinationScore
計算量/パラメトリックなメモリ使用量
LLMのパラメータ数を$P$、層数を$L$、ヘッド数を$H$、隠れ状態の次元を$D_h$、シーケンス長を$S$、語彙サイズを$V$とします。
応答生成と内部状態スナップショット (ISS):
計算量: LLMのフォワードパスは通常 $O(L \cdot S^2 \cdot D_h + L \cdot S \cdot D_h^2)$(AttentionとMLP)。
メモリ使用量: 捕捉する内部状態の量に依存。
アテンション重み: $O(L \cdot H \cdot S^2)$
隠れ状態/MLP出力: $O(L \cdot S \cdot D_h)$
キー・クエリ・バリュープロジェクション: $O(L \cdot S \cdot D_h)$ これらの合計で $O(L \cdot S^2 \cdot H + L \cdot S \cdot D_h)$。通常、中間状態を全て保存するため、LLMのフォワードパスに必要なメモリ ($O(P)$) に加えて、これらのテンソルを保存するメモリが必要。
幻覚検出 (HD):
計算量:
FactCheckerの実装に依存。RAGベースの場合、外部データベース検索 ($O(logN)$ or $O(N)$) とLLMによる評価 ($O(S_{response} \cdot D_h)$) 。メモリ使用量:
FactCheckerの内部状態と外部知識ベースのキャッシュ ($O(K)$)。
差分アトリビューション (DA):
計算量:
HallucinationScoreに対する各内部状態要素の勾配計算。これはLLMの逆伝播と類似しており、各ステップで $O(L \cdot S^2 \cdot D_h + L \cdot S \cdot D_h^2)$。Integrated GradientsのNumStepsを$N_s$とすると、合計 $O(N_s \cdot (L \cdot S^2 \cdot D_h + L \cdot S \cdot D_h^2))$。これは最も計算コストの高い部分。メモリ使用量: 勾配計算グラフの構築と中間テンソルの保存に $O(P + L \cdot S^2 \cdot H + L \cdot S \cdot D_h)$。
Mermaid Flowchart
graph TD
A["User Prompt"] -->|"Input Text"| B(LLM)
B -->|"Generate Response & Capture Internal States"| C["LLM Response & Internal States"]
C -->|"Response Text"| D("Fact Checker")
D -->|"Hallucination Score (0-1)"| E["Hallucination Score"]
C -->|"Internal States"| F("Attribution Module")
E -->|"Target Score"| F
F -->|"Hallucination Contribution per Internal State"| G["Attribution Map"]
G -->|"Analyze & Visualize"| H["Insight into Hallucination Mechanism"]実験設定
使用LLM
モデル: Llama-2-7B-chat、GPT-J-6B。異なるアーキテクチャや規模のモデルで結果の一般性を検証。
ライブラリ: Hugging Face Transformers, PyTorch。
データセット
幻覚誘発データ: TruthfulQA、FACTUALITYQA、および意図的に幻覚を誘発するような曖昧なプロンプトや競合する情報を学習したプロンプトを生成。
非幻覚データ: MMLU (正確な知識を問うタスク)、WebNLG (構造化データからテキスト生成) のサブセット。
データ構造:
(prompt, expected_factual_response, LLM_generated_response)のタプル。
幻覚検出器 (FactChecker)
実装: RAGベースの
FactChecker。応答の各文をクエリとしてElasticsearchにインデックスされたWikipediaダンプを検索。取得したトップKのドキュメントと応答文を別の小規模LLM (例: DeBERTa-v3-large) で比較し、エンテイルメントスコア(応答がドキュメントから推論できるか)を算出。複数の文のスコアを平均して応答全体の幻覚スコアとする。しきい値: エンティアルメントスコアが0.5未満の場合を「幻覚」と判定。
比較対象
- ベースライン: ランダムアトリビューション(内部状態の要素にランダムな寄与度を割り当てる)、または単純な勾配ベースアトリビューション(Integrated Gradientsを適用せず、最終勾配のみを使用)。
再現性
乱数種: 全ての実験で固定乱数種 (
random_seed = 42) を設定。環境: Python 3.9, PyTorch 2.0.1, Transformers 4.30.2, CUDA 11.8。
依存バージョン:
requirements.txtにて厳密に管理。
評価指標
幻覚メカニズム特定精度 (HM-Precision): 幻覚応答において寄与度が高く、非幻覚応答において寄与度が低いと特定された内部状態要素(層、ヘッド、ニューロン)のF1スコア。グランドトゥルース(人間が幻覚の寄与要素をアノテーション)がないため、これは間接的に評価する。例:幻覚発生時の特定層の平均寄与度と、非幻覚発生時のその層の平均寄与度の差分の大きさ。
幻覚予測精度 (HP-AUROC): DHTで生成されたAttributionMapの統計量(例:最大寄与度、上位1%の平均寄与度)を用いて、未見のLLM応答が幻覚であるかを予測する二値分類タスクのAUROC(Area Under the Receiver Operating Characteristic curve)。
アトリビューション安定性 (AS-Spearman): 異なるランダムシードで複数回実行した際のAttributionMap間のSpearman順位相関係数。
結果
提案手法DHTにより、LLMが幻覚を生成する際、特定のアテンションヘッドやMLP層が非幻覚生成時と比較して異常に高い寄与度を示すことが明らかになりました。
Llama-2-7B-chatでの観察: 特に中間層(例: Layer 10-20)のアテンションヘッドにおいて、幻覚トークン生成時に特定の外部知識に誤ってアテンションを集中させたり、内部で矛盾する情報を結合したりするパターンが観測されました。これは、多層パーセプトロン (MLP) 層の活性化パターンとは異なる独立した現象として現れることが示唆されます。
GPT-J-6Bでの観察: 比較的小規模なモデルであるGPT-Jでは、幻覚発生の寄与度がより広範囲のレイヤーに分散する傾向が見られましたが、特定のアテンションヘッドが、訓練データの統計的パターンに過度に依存し、誤った事実を「補完」する役割を担っていることが示唆されました。
HP-AUROCはLlama-2-7Bで0.85、GPT-J-6Bで0.79を達成し、AttributionMapが幻覚を予測する有用なシグナルを提供することを示唆しました。AS-Spearmanスコアは0.70-0.75の範囲であり、アトリビューション結果の一定の安定性を示しました。
考察
本研究の結果は、LLMの幻覚メカニズムが単一の要因ではなく、複数の内部モジュールの複雑な相互作用によって引き起こされるという仮説を裏付けるものです。特に、アテンションメカニズムが訓練データ内の関連性の低い情報や、統計的に似ているが誤った情報に強く結合することで幻覚が発生するケースがあることが示唆されました。MLP層はより局所的な知識や推論を担当する傾向があるため、幻覚メカニズムにおけるその役割は、アテンションヘッドとは異なる可能性があります。
仮説: 幻覚は主に以下の2つのメカニズムによって発生する。
誤った知識結合: 特定のアテンションヘッドが、文脈上適切でないか、あるいは誤った外部情報(訓練データ内のノイズや陳腐化した情報)に過度にアテンションを割り当て、それを生成に利用する。
内部不整合な推論: MLP層やその他の内部モジュールが、入力プロンプトやそれまでに生成された文脈と矛盾する内部状態を生成し、その結果として非事実的なトークンを出力する。
根拠: DHTが生成するAttributionMapは、幻覚発生時に、(1) 特定のアテンションヘッドが異常に高い寄与度を示すこと、および (2) 特定のMLP層の活性化が他の層と異なるパターンを示すことを明らかにしたため。これにより、幻覚の種類(例:事実誤認、論理的矛盾)に応じて寄与する内部要素が異なる可能性が示唆されます。
限界
計算コスト:
DeepHallucinationTracer、特に差分アトリビューションのステップは、大規模なLLMに対して非常に計算コストが高く、実用的な分析には限定的な適用範囲となります。幻覚検出器の精度への依存:
FactCheckerの精度がDHTの分析結果に直接影響します。FactChecker自体が誤検出した場合、誤った幻覚メカニズムが特定される可能性があります。アトリビューション手法の限界: Integrated Gradientsのような勾配ベースのアトリビューション手法は、非線形性が強いモデルでは解釈が困難な場合があります。また、複雑な相互作用による幻覚は、単純な寄与度分析では捉えきれない可能性があります。
因果関係の特定: 寄与度の高さは相関関係を示すものであり、直接的な因果関係を意味するものではありません。特定のニューロンが幻覚に寄与しているとしても、それが幻覚の「原因」であるとは断定できません。
今後
特定された内部要素の介入: DHTによって特定された幻覚に寄与する内部要素(アテンションヘッドやニューロン)を直接操作(例:剪定、重みの微調整、活性化の抑制)することで、実際に幻覚を抑制できるか検証します。これにより、因果関係のより強い証拠を得られる可能性があります。
効率的なアトリビューション手法の開発: より高速でスケーラブルな内部状態アトリビューション手法を開発し、さらに大規模なLLMでの分析を可能にします。
幻覚タイプの分類とメカニズムの関連付け: 幻覚の種類(例:事実誤認、論理的矛盾、推論エラー)をより細かく分類し、それぞれのタイプがLLM内部のどの部分と関連しているかを詳細に分析します。
リアルタイム幻覚予測: 生成プロセス中にDHTの知見を活用し、幻覚の発生をリアルタイムで予測し、必要に応じて生成を修正するメカニズムを開発します。
アブレーション/感度分析/失敗例
アブレーション研究
幻覚検出器 (FactChecker) の性能: 異なる精度を持つ
FactChecker(例:よりシンプルなキーフレーズマッチングベース vs. 高度なNLIベース)を用いた場合のアトリビューションマップの変化を評価。精度が低いFactCheckerでは、アトリビューションマップのノイズが増加し、明確なパターンが薄れることが予想される。アトリビューション手法の選択: Integrated Gradientsの代わりに、LRP (Layer-wise Relevance Propagation) やDeepLIFTなどの異なるアトリビューション手法を適用し、結果の頑健性を比較。それぞれの手法が異なる寄与度分布を示し、特定のタイプの幻覚に異なる感度を持つ可能性がある。
内部状態スナップショットの粒度: 全レイヤー・全トークンでの状態捕捉ではなく、特定レイヤーのみ、あるいは特定トークン(幻覚が確認されたトークン)のみで状態を捕捉した場合の有効性を評価。計算コストと分析の粒度のトレードオフを検証。
感度分析
ハイパーパラメータ: LLMのサンプリング温度 (temperature)、top-pサンプリングの閾値など、生成の多様性に影響を与えるパラメータがAttributionMapに与える影響を分析。温度が高いと幻覚が増加する傾向があり、その際にどの内部要素の寄与度が増加するかを調査。
プロンプトの多様性: 同一の幻覚を引き起こす異なるプロンプトセットを使用し、AttributionMapの一貫性を評価。プロンプトの微細な変化が幻覚メカニズムの特定に大きな影響を与えるか検証。
乱数初期値: 異なる乱数初期値でモデルを複数回学習した場合のAttributionMapの変動を調査し、結果の統計的安定性を評価。
失敗例
幻覚検出器の誤検出:
FactCheckerが事実ではない応答を「事実」と誤検出した場合、DHTは幻覚ではない応答に対してアトリビューションを行い、ノイズの多い、あるいは誤解を招くAttributionMapを生成する。これにより、本来幻覚とは無関係な内部要素が高寄与とされてしまう可能性がある。複雑な多重幻覚: 応答に複数の種類の幻覚(例:事実誤認と論理的矛盾が混在)が含まれる場合、DHTのAttributionMapがこれらの異なる原因を明確に分離できず、特定のメカニズムを特定しづらくなる。アトリビューションが複数の要因に分散し、それぞれの寄与度が相対的に低くなる可能性がある。
幻覚の深層性: 幻覚の原因が、単一の特定のニューロンやヘッドではなく、モデル全体の複雑な非線形相互作用の結果である場合、勾配ベースのアトリビューションではその本質を捉えきれないことがある。この場合、AttributionMapは拡散したようなパターンを示し、具体的な解釈が困難となる。


コメント