Chapter 4

第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 単語だけ で、次の単語の確率を決める。

この近似が嬉しい理由:

もちろん、これは大胆な切り捨てだ。 人間は「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 つに集約できる:

  1. 直前 n−1 単語の制約 → 文全体(さらに数千〜数百万トークン)を見られる
  2. 単語を記号としてしか扱えない → 埋め込み(意味のベクトル)で扱う
  3. スムージングなどの手作業 → ニューラルネットの学習で自動化

問題設定(「次の単語の確率を計算する」)は変わらない。 やり方が劇的に変わった ── これが第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章を地図にしておく。

ここまでで、機械は「単語の意味」と「単語の並びの確率」というふたつの足場を手にした。 だが、まだ 「長い文を、意味を保ったまま頭から順に処理していく」 仕組みは持っていない。

それを与えるのが、次章 ── RNN と LSTM だ。 n-gram の「直前 n−1 単語」という強引な切り捨てを、ニューラルネットの「記憶を持つ」という発想で乗り越える。 そこを乗り越えた先に、Attention と Transformer が待っている。

4.8 この章の振り返り

次章では、n-gram の「直前 n−1 単語」という制約を、ニューラルネットの記憶 で外しにいく。 RNN と LSTM の登場だ。