最近早期 NLP 技術を整理しているときに、n-gram モデルを再定義しました。現在は Transformer などのアーキテクチャにより注目が集まっていますが、これらの「古い」方法を振り返ると、実際には多くのことを学ぶことができます。
n-gram の基本思想#
n-gram の核心的な考え方は非常に直感的です:ある単語が出現する確率は、それ以前のいくつかの単語(具体的には前の n-1 個の単語)にのみ依存します。これは言語の単純化のように聞こえますが、人間が話すときには確かに前の単語に基づいて後の単語を選ぶことがよくあります。
いくつかの一般的な n-gram モデル:
- Unigram:各単語は独立して出現し、文脈を考慮しない
- Bigram:各単語は前の 1 つの単語のみを見る
- Trigram:各単語は前の 2 つの単語を見る
初めて接触したときは、この仮定が粗すぎると感じるかもしれませんが、実際にはこの単純化は多くのシーンで有効です。
マルコフ仮定#
n-gram の背後にある理論的基盤はマルコフ仮定です。数学的には次のように表現されます:
この仮定の鍵は「無記憶性」—— 次の状態は現在の状態のみに依存し、過去の経路には依存しません。
"I love deep learning" の確率を計算する例:
Bigram 計算:
Trigram 計算:
複雑な文の確率は単純な条件付き確率の積に分解され、この分解方法は優雅で実用的です。
データの疎性問題#
n-gram には現実的な問題があります:データの疎性。特定の単語の組み合わせが訓練データに存在しない場合、その確率は 0 になり、全体の文の確率も 0 になります。
この問題を解決するために、先人たちはいくつかのスムージング戦略を考案しました:
加一スムージング#
すべての単語のカウントに 1 を加え、0 確率が発生しないようにします。
加 K スムージング#
加一スムージングの一般化バージョンで、K 値を調整することでスムージングの程度を制御し、効果的には加一スムージングよりも良い結果を得られます。
- 加一スムージングは加 K スムージングの特例であり、加 K スムージングを使用する場合、K の値は訓練データに特に注意を払い、検証セットで調整する必要があります。
- 訓練データの数が少ない場合、極端な分布が発生する可能性があり、その場合 K 値は一般的に大きく設定して各単語の出現確率をバランスさせます。
- 訓練データの量が多い場合は、元の統計分布を保持するために小さな K 値を使用します。
Kneser-Ney スムージング#
より複雑ですが効果的な方法で、異なる文脈における単語の分布を考慮します。
これらのスムージング方法は、初期の NLP 研究者の実用精神を反映しています —— 問題に直面したら解決策を考え、理論の完璧さにこだわらない。
n-gram の特徴#
シンプルで効果的:仮定はシンプルですが、多くのタスクで良好な結果を出しています。現在の入力法やスペルチェックでも似た技術が使用されています。
計算に優しい:訓練と推論が非常に速く、計算リソースが限られている時代には重要です。
限界が明確:長距離依存を処理できないことは根本的な問題です。例えば「昨日は雨が降った... 今日はとても疲れている」というような、複数の単語を跨ぐ意味関係を n-gram は捉えることができません。
n-gram から現代モデルへ#
今振り返ると、n-gram は後のモデルに重要な基盤を築きました:
- 確率モデルの考え方:言語を確率分布として見るという考え方は、今でも続いています。
- 系列予測フレームワーク:過去に基づいて未来を予測する基本的なフレームワーク。
- 統計学習方法:データから規則を学ぶ方法論。
最新の大規模言語モデルでさえ、本質的には似たようなことを行っています —— 前のトークンに基づいて次のトークンを予測しています。ただし、現在のモデルはより長い文脈を考慮し、より複雑な依存関係を捉えることができます。
技術進化の考察#
技術の発展の歴史的文脈を理解することは重要です。現在の多くの「革新」は、実際には初期の技術に影を見つけることができます。n-gram はシンプルですが、それが反映する核心的な考え方 —— 統計的規則を通じて言語を理解し予測する —— は今でも有効です。
数学を学ぶのと同じように、基礎的な概念を習得することは、最新で最も複雑な技術を追求することよりも重要です。n-gram は最強のモデルではありませんが、言語モデリングの本質を理解するための良い思考フレームワークを提供します。
技術の進歩は漸進的であり、各世代の技術は前の世代の基盤の上に改善されています。n-gram は言語を確率的に見る方法を教えてくれました。この視点は今日でも非常に価値があります。そしてシンプルな方法はしばしば深い規則を明らかにし、問題の本質を理解することは複雑な解決策を追求することよりも重要です。
実装を行う#
Github リポジトリを参照