# 否定文を理解できないAIたち [[佐藤竜馬]] による 2024年12月18日付けのブログ記事(ジョイジョイジョイ)。BERT や GPT 系 LLM が否定文を正しく扱えない構造的な原因を解説し、複数の対処法を論じる。 ## 核心的主張 - BERT の文テキスト埋め込みでは、正反対の意味を持つ文のコサイン類似度が同じ意味の文より高くなるケースがある(A と B: 0.9695 に対し A と C: 0.9762)。 - ChatGPT 4o・ChatGPT o1 を含む主要なデコーダー型 LLM は、「〇〇ではない」という穴埋め問題で否定を無視して最も共起しやすい単語を出力する傾向がある。 - これは構造的問題であり、どれほど強力なエンコーダーを持っていても、**軟化層(softmax)の出力層で固定単語埋め込みを使う限り、否定に対応する文脈ベクトル z が数学的に存在できない**。 - 根本的解決には出力層の単語埋め込みをコンテキスト依存にする必要があるが、コストが大きいため対症療法が主流。 ## 否定文処理が失敗するメカニズム 言語モデルは文脈をベクトル z に圧縮し、固定の単語埋め込み v_i との内積で次トークンの確率を計算する。「日本の首都は〇〇ではない」の真の答えは東京以外のすべての語だが、京都・岡山・バナナに近く東京だけに遠い単一のベクトル z は、語彙空間の幾何学的制約から存在できない。そのため、モデルは「日本」「首都」と共起しやすい「東京」をそのまま出力するショートカットを学習してしまう。 ## 対処法のまとめ | 手法 | 仕組み | 備考 | |------|--------|------| | ファインチューニング | タスク特化の訓練で否定のショートカットを学習させる | 論理的厳密性が必要なタスクでは限界あり | | プロンプト工夫(Chain-of-Thought) | 中間出力を挟む余分な出力を許すことで softmax 制約を回避 | テキスト埋め込みが必要な場面では効かない | | BERTNOT | 肯定文から否定文の訓練問題を人工生成し、元単語の確率を下げるように訓練 | アーキテクチャ上の制約は残るが近似精度が向上 | | 文書数増加 | 検索データベースを充実させ否定文が上位に来る確率を下げる | 汎用性が高いシンプルな回避策 | | クエリ・キーの拡張 | LLM でテキストを拡張し肯定文的な内容に変換してから検索する | bag-of-words でも効果が出るほど強力 | | 文脈付き検索(Contextual Retrieval) | チャンクに文書全体の文脈を付与して拡張する(Anthropic 提案) | 検索ミスを 5.0% → 2.9% に削減 | ## BERTNOT の訓練方針 - 肯定文「The capital of Japan is Tokyo」から否定文「The capital of Japan is not ___」の訓練問題を自動生成する。 - ___ の位置での出力分布で元単語(Tokyo)の確率が低くなるよう訓練する。 - 文脈ベクトルをゼロにすれば softmax の出力は一様分布になり、正解語が選ばれる確率が上がる(1/語彙数)というショートカットだが、「京都決め打ち」より真の否定分布に近い。 ## クエリ・キー拡張の効果 - LLM でテキストを数百文字に拡張すると、同意見の A' と B' のコサイン類似度 0.9494 に対し、反意見の A' と C' は 0.9316 となり、正しい方向に逆転する。 - 拡張後は bag-of-words でも A' と B' が 0.8424、A' と C' が 0.8223 と識別可能になる。 - 否定文を直接扱うのではなく、拡張で肯定文に変換して問題を回避するアプローチである。 ## 文脈付き検索(Contextual Retrieval) Anthropic が提案する手法。RAG のチャンクに文書全体の文脈情報を付与して検索用インデックスを充実させる。検索時には拡張済みチャンクを使い、生成時にはオリジナルのチャンクのみを使う。Claude のプロンプトキャッシングを活用すると安価に実現できる。 ## 関連ページ - [[否定文理解]] — 本記事が扱う主題の概念ページ - [[テキスト埋め込み]] — BERT ベースの類似度計算 - [[自然言語推論]] — 否定処理が特に困難なタスク - [[文脈付き検索]] — Anthropic の Contextual Retrieval - [[佐藤竜馬]] — 著者