第4章: 頻度から始まった — n-gramと確率的言語モデル
スマホで「お疲れ」と打つと、画面の下に 「様です」「さま」「!」 が候補で並ぶ。 Google の検索窓に「東京の」と打つと、「天気」「観光」「ホテル」 がぱらぱら出る。
ChatGPT が登場するずっと前から、機械は 「次に来そうな単語」を予測する ということをやっていた。 むしろ、これこそが NLP の 長年の主タスク:与えられた語の並びに対して、次に何が来るかの確率分布 を計算する。
本章では、その素朴な発想から始めて、LLM の最も遠い祖先 ── 確率的言語モデル(probabilistic language model) の世界を覗く。 派手さはない。だが、ここで掴む直観は、後章の GPT まで貫通する背骨になる。
4.1 「言語モデル」とは結局なにか
NLP の用語で 言語モデル (language model, LM) という言葉が頻出する。 ChatGPT も「大規模言語モデル (LLM)」だ。
だが「言語モデル」という日本語からは、何のことか直感的に分かりにくい。 一段噛み砕くと、こうなる:
言語モデルとは、「言葉の並びに、確率を割り当てる機械」のこと。
- 「東京 タワー は 高い」 → 起こりやすい並び(高い確率)
- 「タワー 高い は 東京」 → 起こりにくい並び(低い確率)
この 「どんな並びが、どのくらい起こりやすいか」 を答えてくれるのが言語モデル。
なぜこれが嬉しいか。 「言葉の並びに確率を割り当てられる」と、いろいろなタスクが同じ枠で扱える からだ。
| タスク | 言語モデルの使い方 |
|---|---|
| 予測変換 | 「お疲れ」の後ろに、確率の高いトークンを並べる |
| 機械翻訳 | 「翻訳結果として、もっとも確率の高い英文」を選ぶ |
| 音声認識 | 「音声から推定される候補のうち、もっとも自然な文」を選ぶ |
| 文章生成 | 確率に従って次のトークンを 1 つずつ選び、文を作っていく |
驚くべきことに、これは 第9章の GPT にも当てはまる。 GPT は 「次の単語の確率を計算する機械」 であり、その意味では本章の素朴な言語モデルと 問題設定は同じ だ。 違うのは規模と、内部の仕組みの精巧さだけ。
4.2 確率で考える ── 条件付き確率の世界
「次に何が来るか」を確率で扱うと、自然に 条件付き確率 が出てくる。
文をトークン列だと思おう。先頭から順に「トークン①、トークン②、…、トークン(n−1)、トークン(n)」と並んでいるとする。 すると言語モデルの仕事は、こう書ける:
P( トークン(n) | トークン①, トークン②, ..., トークン(n−1) )
これは「それまでにトークン①〜(n−1) が並んでいたとき、次にトークン(n) が来る確率」と読む。
具体例:
| それまで | 次の候補 | 確率(イメージ) |
|---|---|---|
お疲れ | 様 | 0.62 |
お疲れ | さま | 0.21 |
お疲れ | ! | 0.08 |
お疲れ | バナナ | 0.0001 |
「お疲れ」の後に「バナナ」がほぼ来ないのは、確率が極端に低いから。 このような分布を、機械にちゃんと持たせたい ── これが古典 NLP の中心課題だった。
4.3 素朴な作戦 ── 「全部のパターンを数える」が破綻する
もっとも単純な作戦は、大量のテキストで全パターンを数える ことだ。
たとえば「私 は 本 を 読む」という 5 単語の並びがコーパス(テキスト集合)に何回出てくるかを数え、別の並びの出現回数と比較する。
ところがこれは即座に破綻する。
仮に語彙が 5 万トークン。5 単語の並びの組み合わせは 5万⁵ = 3 × 10²³ 通り。 世界中のテキストをかき集めても、ほとんどの 5 単語並びは 1 回も出てこない。 これでは確率を求められない。
これを データスパースネス(疎性)の問題 と呼ぶ。 言語は組み合わせ爆発する宇宙で、まじめに全パターンを数えるアプローチは初手で詰む。
言葉の組み合わせ世界は、本当にとてつもなく広い。
だから「全部数える」というアプローチではなく、「近似してでも、計算可能な形に落とす」 という工夫が要る。
NLP の歴史は、この「近似のうまさ」を競う歴史でもあった。
4.4 妥協の発明 ── n-gram モデル
そこで生まれたのが n-gram モデル という近似だ。 発想は乱暴だがシンプル。
n-gram の割り切り
「次の単語を決めるとき、直前の n−1 個の単語だけ を見る。それより前は無視する。」
- bigram (2-gram): 直前 1 単語だけ見る
- trigram (3-gram): 直前 2 単語だけ見る
- 4-gram: 直前 3 単語だけ見る
たとえば trigram は、こう近似する:
P( トークン(n) | トークン①, ..., トークン(n−1) ) ≈ P( トークン(n) | トークン(n−2), トークン(n−1) )
「お疲れ」の直前にどんな長い物語があっても気にしない。 直前の 2 単語だけ で、次の単語の確率を決める。
この近似が嬉しい理由:
- 「直前 2 単語」のパターンなら、コーパスで数えられる量に収まる
- 「お疲れ 様 です」「お疲れ 様 でした」のような 頻出 trigram はちゃんとカウントできる
- 計算も実装も簡単
もちろん、これは大胆な切り捨てだ。 人間は「3 段落前にこの話題が出ていたから、次の単語はこれだろう」と判断するが、trigram は 直前 2 単語の世界 しか見ない。 だが、それでも 多くの実用タスクで十分実用に耐える ことが分かった。 予測変換や IME(日本語入力システム)、Google 検索のサジェストは、長く n-gram 系のモデルで動いていた。
4.5 n-gram の限界
n-gram は実用的だが、限界も分かりやすい。
限界①: 長距離依存に弱い
「子どもの頃に 遊んだ公園 には、桜の木が植えられていて、毎年春になると、家族みんなで写真を撮りに行った。それが 思い出 の場所だ。」
「思い出」が 遊んだ公園 を指す関係を捉えるには、遥か前 を見なくてはいけない。
trigram の世界では、思い出 の直前 2 単語しか見えないので、遊んだ公園 の手がかりは完全に視野の外だ。
これは前章末で出た「長距離依存」の問題と同じ顔をしている。 n-gram でも ELMo でも、長距離の関係を見るには別の道具が要る ── これが繰り返し問題提起されている。
限界②: 「見たことない並び」に弱い
trigram が「お疲れ 様 です」を 1 万回見ていても、「お疲れ 様 でしたん」のような 新しい並び はカウント = 0。 このままでは確率も 0 になり、機械は「絶対に起きない」と判断してしまう。
実際にはコーパスに 1 回も出てこないだけで、十分起こりうる並び ── これに対処するため、スムージング(smoothing) という確率を慎重に割り振る数学的工夫が積み上げられた。
限界③: 単語を「個別の記号」としてしか扱えない
ここが本書の文脈で一番重要: n-gram は 単語を「ただの背番号」として扱う。 「猫」と「犬」が意味的に似ていることを知らない。 だから「猫 が鳴く」を 100 回見ても、「犬 が鳴く」の確率は別物として扱われる。
第2〜3章で見た「埋め込み」の発想は、まさにこの限界を超えるために必要だった。 n-gram と埋め込みが合体すると、次章で出てくる ニューラル言語モデル (RNN) に進化する。
n-gram モデルから現代 LLM までの大きな進化は、次の 3 つに集約できる:
- 直前 n−1 単語の制約 → 文全体(さらに数千〜数百万トークン)を見られる
- 単語を記号としてしか扱えない → 埋め込み(意味のベクトル)で扱う
- スムージングなどの手作業 → ニューラルネットの学習で自動化
問題設定(「次の単語の確率を計算する」)は変わらない。 やり方が劇的に変わった ── これが第4章から第9章までの物語の本筋だ。
4.6 n-gram の遺産は今も生きている
「n-gram は古い手法」と片付けるのは間違いだ。 実は、現代の NLP 系統樹の中で、n-gram の発想は今も色々な形で生きている:
| 場面 | 役割 |
|---|---|
| 機械翻訳の評価指標 BLEU | 出力文と正解文の n-gram の一致率 で品質を測る |
| 検索エンジンのクエリ補助 | 「next-token frequency」として bigram/trigram テーブルを併用 |
| 軽量な予測変換 | 携帯電話の古い IME、IoT 機器など計算リソース制約下で n-gram は健在 |
| LLM の評価・分析 | LLM 出力の繰り返しやワンパターンを「n-gram 多様性」で測る研究は今も活発 |
「単語の並びを確率で見る」というメガネ自体は、半世紀近く NLP の中心 にある。 n-gram は古くなったが、その思想は古びていない。
4.7 ここまでの整理 ── 「系列を扱う」の入り口に立った
ここで、第1〜4章を地図にしておく。
- 第1章: トークンに切る
- 第2章: トークンに意味のベクトルを与える(静的埋め込み)
- 第3章: 文脈で動くベクトルを目指す(文脈埋め込みという考え方)
- 第4章(本章): 文を「系列」として扱う最も素朴な形 = n-gram と言語モデル
ここまでで、機械は「単語の意味」と「単語の並びの確率」というふたつの足場を手にした。 だが、まだ 「長い文を、意味を保ったまま頭から順に処理していく」 仕組みは持っていない。
それを与えるのが、次章 ── RNN と LSTM だ。 n-gram の「直前 n−1 単語」という強引な切り捨てを、ニューラルネットの「記憶を持つ」という発想で乗り越える。 そこを乗り越えた先に、Attention と Transformer が待っている。
4.8 この章の振り返り
- 言語モデル = 「単語の並びに確率を割り当てる機械」。LLM もこの大枠の中にある
- ナイーブに全パターンを数える方法は、組み合わせ爆発 で破綻する(データスパースネス)
- n-gram モデル ── 直前 n−1 単語だけを見る、という妥協で実用化を実現
- bigram / trigram / 4-gram などが、IME や検索サジェストで長く現役だった
- 限界は明確:長距離依存に弱い・未出のパターンに弱い・単語を背番号として扱う
- 現代 LLM はこれらをすべて乗り越えたが、「次の単語の確率を計算する」という問題設定は同じ
- n-gram の発想は、評価指標(BLEU)や軽量タスクで今も健在
次章では、n-gram の「直前 n−1 単語」という制約を、ニューラルネットの記憶 で外しにいく。 RNN と LSTM の登場だ。