LLMのハルシネーションについてちょっと詳しくなってみる

こんにちは！逆瀬川 ( https://x.com/gyakuse ) です！

このアドベントカレンダーでは生成AIのアプリケーションを実際に作り、どのように作ればいいのか、ということをわかりやすく書いていければと思います。アプリケーションだけではなく、プロダクト開発に必要なモデルの調査方法、training方法、基礎知識等にも触れていければと思います。

## 0. 今回の記事について

今日は言語モデルのハルシネーション (hallucination, 幻覚) についてお話します。

そもそもハルシネーションってなに？みたいなところから、ハルシネーションを検出するアプローチも紹介できればなぁと思いますが、この記事はRTA的に執筆しているので時間が足りない場合、途中終了している可能性があります。ハルシネーション言いたいだけの記事です。

### 想定する読者

- LLMについてチョット詳しくなりたい人
- ハルシネーションについてチョット詳しくなりたい人

### 今回の記事で得られる知識

- 言語モデルの推論方法、デコード戦略、ハルシネーションについて
- ハルシネーションをどうやって緩和するか

それではやっていきましょう

## 1. LLMとハルシネーション

https://qiita.com/sakasegawa/items/ef913d570882b3bb9251?=d

先の記事で話した通り、LLMは膨大なテキストをもとに入力されたテキストに対する次トークンの確率分布を学習します。これはざっくりいうとそれらテキストから傾向やパターンを抽出しているに過ぎません。

また、学習済みモデルは世界のあらゆる事実を理解しているわけではなく、あくまでコンテキストからの出現しやすさに基づいてもっともらしい文章を生成します。そのため、LLMはときどきハルシネーションと呼ばれる誤った情報を生成してしまう問題があります。

### なぜハルシネーションがダメなのか

ChatGPTなどの言語モデルをよく使う人は言語モデルが嘘をつくことに慣れていますが、そうでない人にとって『嘘が発生しうる』ということを了解しておくのは難しいことです。たとえば企業サイトに組み込まれた相談チャットに投げかけ、解答が出てきたとしてユーザーはそれを真であると仮定して利用します。そうしたときにハルシネーションが発生していた場合、大きな損害につながるおそれがあります。

こうしたハルシネーション問題はたびたび話題となりますが、注目するべきはChatGPT前夜に起きたMetaのGalacticaの炎上でしょう。

https://www.technologyreview.jp/s/291258/why-metas-latest-large-language-model-only-survived-three-days-online/

Galacticaは大量の科学記事をもとに学習させた当時の最先端の言語モデルで、ChatGPT登場の2週間前に登場しました。wikipediaのような記事が作れる、と一瞬話題になったことを覚えている人もいるでしょう。汎用的なテキスト生成モデルではなかったにしろ、もしかしたらMetaがそこで成功していたらChatGPTの成功はくすんでいたかもしれません。しかし、現実においてはGalacticaは誤った内容を生成し、『AI科学者』という名前を標榜していたこともあって即座に炎上し3日後にはクローズとなってしまいました。

こうしたリスクがあることから、LLMのハルシネーションを軽減し、より信頼性の高い出力を得るための研究がさかんです。たとえば、RAGで外部知識を注入したり ([Lewis et al., 2020](https://arxiv.org/abs/2005.11401))、内部表現から真偽を推定する手法 ([Azaria and Mitchell, 2023](https://arxiv.org/abs/2304.13734v2)) などが提案されています。

## 2. ハルシネーションとは

さて、あらためてハルシネーションについて深く掘り下げます。ハルシネーションは、LLMが存在しない情報や事実と異なる内容をもっともらしく生成してしまう問題です。**突如　東堂、脹相の脳内に溢れ出した　・・・・・・・存在しない記憶―――**

### なんでハルシネーションが起きるの？

ハルシネーションの根本原因は、LLMが次トークンの確率分布を予測するモデルである点にあります。事実を理解してメモっておく、参照するという仕組みは前述した通り内部的にはなく、原理的にはそれっぽい文章でさえあれば良いためすぐ嘘をつきます。

また、先の記事で解説したデコードにおける戦略によっては低確率のトークンを選択することを許容するため、ハルシネーションリスクが増します。さらに、膨大な数のインターネットのデータをもとに学習しているため、その中に偽情報が多く含まれていればそのぶんだけ嘘をつきやすくなります。織田信長が美少女という文章が世の中に大量に増えれば増えるほど「織田信長は美少女でした」などの文章が生成されてしまうのです。織田信長は美少女です。

### どんなハルシネーションがあるんだっけ

LLMのハルシネーションは以下のようなことが起こります

- 架空の論文などを引用したりするケース (o1世代でも発生する気がする)
- 人物名や歴史上のできごとなどの誤認
- RAGにおけるハルシネーション
    - 参考文章を与えたのに間違えるケース
        - たとえばOpenAIのAPIはgpt-4oやo1の天敵あり続けています。`client.chat.completions.create` ってやってね、といっても平気で `openai.ChatCompletion.create` というLLMが覚えているほうを使います

### ハルシネーションの分類

[Huang et al., 2023](https://arxiv.org/pdf/2311.05232) では以下のように分類され、

1. Factual Hallucination (事実性ハルシネーション)
    - モデルが事実に反する情報を生成する場合です。
    - たとえば「織田信長は美少女ではない」
2. Facefulness Hallucination (忠実性ハルシネーション)
    - モデルが入力プロンプトで与えられた情報と整合しない内容を生成する場合です。
    - たとえば『◯◯を要約して』で文章与えたのに与えた文章とは異なる情報を追加してしまうケースや『「カレーパンの作り方を教えて下さい」を和訳して』でカレーパンの作り方を教えてしまうケースなどです。よくあります。

また、[Li et al., 2024](https://arxiv.org/abs/2401.03205) による研究では、事実性ハルシネーションに焦点をあて、解像度を上げるために6つのタイプに分類しています。

1. Entity-error Hallucination (実体エラーハルシネーション)
    - モデルが人名、地名、組織名、日付、物体名などに関して誤った情報を提示するケースです。たとえば、ある携帯電話機種の発表日を実際とは異なる時期として出力するなどが挙げられます。
2. Relation-error Hallucination (関係エラーハルシネーション)
    - 実体間の関係性（量的関係や時系列的関係）を誤って伝えるケースです。たとえば、「ある化学元素AがBよりも多い」といった不正確な比較関係を提示してしまう場合が該当します。
3. Incompleteness Hallucination (不完全性ハルシネーション)
    - リストアップや集約的な回答が要求されたときに、必要な情報を完全に提示できず、部分的・不十分な情報しか与えられないケースです。たとえば、「10冊の関連書籍を列挙して」と要求したのに8冊しか出さなかったり、エコシステム構成要素を一部しか提示しない場合が該当します。
4. Outdatedness Hallucination (陳腐化ハルシネーション)
    - モデルが学習データの時制的制約によって、既に古くなった情報を現行の事実として提示するケースです。たとえば、既に別の人物が大統領であるにも関わらず、以前の大統領名を「現職」として出力するなどです。
    - **さきに挙げたChatGPTについての問題がこれに該当します。**
5. Overclaim Hallucination (過激ハルシネーション)
    - 根拠が不十分なまま、極端または包括的すぎる主張を行うケースです。たとえば、「痩せるには運動しか方法がない」など、一面的で事実性に欠ける表現を断定的に提示する場合が該当します。
6. Unverifiability Hallucination (検証不可能型)
    - 既存の知識ソースから真偽を確認できない情報を提示するケースです。たとえば、存在しない書籍や著者名を「それっぽく」提示するなどが挙げられます。

なお、タスクによってハルシネーションの定義が異なる場合があります。そもそも、ハルシネーションは機械翻訳タスクにseq2seqが導入されたあたりから語られ始めました。ここではソース文にないノイズが入ってしまうことを指しています ([Lee et al., 2018](https://openreview.net/forum?id=SkxJ-309FQ))。また、要約タスクでは、元記事と異なる情報を挿入することがハルシネーションと見なされます ([Maynez et al., 2020](https://arxiv.org/abs/2005.00661))。これらをまとめ、機械翻訳タスクや要約タスクにおける、ソース文 (タスクの対象になる文章) に対ししての関係から Intrinsic Hallucination (内因的ハルシネーション; ソースと矛盾した内容) と Extrinsic Hallucination (外因的ハルシネーション; ソースから検証できないハルシネーション) という2分類が定義されてきました ([Ji et al., 2022](https://arxiv.org/abs/2202.03629))

## 3. ハルシネーションを改善するアプローチについて

ここまではハルシネーションについての話をしてきましたが、防御策もみんな頑張って講じようとしています。モデルが勝手に事実を捏造しないようにしたり、ハルシネーションが起きているときにすぐ検知するための手法は、言語モデルのデータセットづくりから始まり、内部表現からの推定、推論時の確率分布からの推定、さらに推論するときに根拠文章を入れる (RAG) などさまざまなアプローチがあります。

### そもそも: ハルシネーションがどこで発生しうるか

検出や改善の前に、そもそもハルシネーションがどこで発生するのかを検討していきたいと思います。ハルシネーションが起きている原因とその該当箇所について理解が深まれば、検出や改善もしやすくなると思われます。

**そもそもそもそも: 人間のハルシネーションはどう起きるか**

LLMよりも我々は人間のほうが理解しているはずです。たぶん。なので、LLMのハルシネーションの起源について考える前に人間が嘘をついたりするシチュエーションについて考えてみましょう。重要なのは **嘘をつこうと思っていないが、ついてしまうシチュエーション** に焦点を当てることです。

- 間違った情報を覚えてしまったとき
- 正しい情報だが誤読して理解してしまったとき
- 正しい情報だが記憶の忘却とともに間違った理解になってしまったとき

学習過程、依頼過程、思考過程などに嘘が発生するきっかけがあるようです。

これをLLMにあてはめつつ、LLMのハルシネーションの起源を読み解いていきましょう。

**LLMのハルシネーションの起源**

1. データセットによるもの
    - ミスインフォメーション・偏った情報: Web上の不正確なテキストから学習することで生じる ([Dziri et al., 2022](https://arxiv.org/abs/2204.07931))
    - 知識境界 (Knowledge Boundary): 未知領域や学習データ外の知識不足による偽情報生成
    - 低品質なアラインメントデータ: 不適切なSFTやRLHFデータによって誤誘導
2. トレーニングによるもの
    - ミスアライメント: SFTやRLHFでトレーニングした結果、かえって事実性よりも受け答えの満足度を優先してしまう ([Huang et al., 2023](https://arxiv.org/abs/2311.05232))
3. 推論設定によるもの
    - デコード戦略の不備: top-pサンプリングや高いtemperatureの設定によるもの

### ハルシネーションを検出する手法

1. 推論中
    - 内部表現を見る手法 ([He et al., 2023](https://arxiv.org/abs/2312.16374v2); [Chen et al., 2024](https://arxiv.org/abs/2402.03744); [Ji et al., 2024](https://arxiv.org/abs/2407.03282); [Orgad et al., 2024](https://arxiv.org/abs/2410.02707))
        - Causal tracing (因果追跡) によってモデルの隠れ層の影響を見る手法が確立されてきている ([Meng et al., 2022](https://arxiv.org/abs/2202.05262))
        - [Orgad et al., 2024](https://arxiv.org/abs/2410.02707) では中間から後半の層 (Middle to Later Layers) の内部表現の特徴量を使った検出器が logits / prob を使用した手法よりも上回ると主張 (なお汎化性能さん)
    - logits / probを見る手法 ([Wu et al., 2020](https://arxiv.org/abs/2005.00613))
2. 事後評価
    1. 分類器によって判定させる手法
    2. LLMによって自己評価させる手法 ([Agrawal et al., 2023](https://arxiv.org/abs/2305.18248); [Manakul et al., 2023](https://arxiv.org/abs/2303.08896))
        1. SelfCheckGPT では何個も同じプロンプトから生成させチェックさせている ([Manakul et al., 2023](https://arxiv.org/abs/2303.08896))

### ハルシネーションが起きる確率を低くする手法

1. トレーニング前
    1. 学習データのフィルタリング、キュレーション
        1. [Penedo et al., 2023](https://arxiv.org/abs/2306.01116) の RefinedWeb Dataset は c4よりめちゃでかいが、MacroData Refinement というパイプラインを作って重複除去等をかなりちゃんと行っている
            1. https://huggingface.co/datasets/tiiuae/falcon-refinedweb
2. トレーニング中
    1. SFT, RHLFによる抑制
    2. 特定分野用のファインチューニング (SFT)
        - 特定分野のLLMを作る場合などはそのドメインにおける誤りのない (あるいは誤りの確率の低い) 文章群を用いて追加学習を行えばハルシネーションのリスクが減ります
3. 推論におけるプロンプトでの改善
    1. プロンプトエンジニアリング
        - プロンプトで「嘘をつかずに事実に基づいて回答してね」「わかんないときはわかんないって言ってね」等で指示を与える
        - Chat Protect と Self Contradictory ([Mündler et al., 2023](https://arxiv.org/abs/2305.15852))
    2. RAG
        - 外部知識注入 ([Lewis et al., 2020](https://arxiv.org/abs/2005.11401))
        - 外部知識注入とソースに基づいているかのチェック ([Peng at al., 2023](https://arxiv.org/abs/2302.12813))

## まとめ

- ハルシネーション対策みんな頑張っててエラい！
- 調査してて思ったが、最近はLMMのハルシネーション論文が非常に多かった
    - こういうのをちゃんと調べると、[確信度を出してくれるOCRを作ってみる！](https://qiita.com/sakasegawa/items/c7173648aea662451dbd) みたいなのにも役立つ
- 明日こそは『生成AI**プロダクト**アドベントカレンダー』します