N-gram (2): トライグラムと文脈の限界
今回の記事の目標
前回の記事では、最も単純な統計的言語モデルである ユニグラム(Unigram) と バイグラム(Bigram) について見てきました。
今回は、2文字を参照して次の文字を予測するトライグラム(Trigram) について学びます。
また、文脈が長くなるほど予測がどのように変わるのかを見て、N-gramモデルが持つ根本的な限界まで理解していきます。
はじめに:より多くの文字を覚えれば、より良い文章を作れるのだろうか?
前回の記事で確認したユニグラムとバイグラムの違いは単純でした。
ユニグラムは1文字の出現頻度だけを利用し、バイグラムは直前の文字に応じて次の文字の確率を異なる形で計算しました。
それでは、直前の1文字ではなく、2文字を覚えていたらどうなるでしょうか?
1. トライグラムとは?
トライグラム(Trigram) は、N-gramにおいてN = 3の場合です。連続する3文字を1つの組み合わせとして扱います。
前回の記事で見た内容を整理すると、次のようになります。
| 名前 | N | 次の文字を予測するときに参照する文脈 |
|---|---|---|
| ユニグラム(Unigram) | 1 | 前の文字を参照しない |
| バイグラム(Bigram) | 2 | 直前の1文字 |
| トライグラム(Trigram) | 3 | 直前の2文字 |
トライグラムを言語モデルとして利用する方法は、バイグラムと大きく変わりません。
学習データから連続する3文字の出現回数を数え、前の2文字が与えられたときに3文字目が現れる条件付き確率を計算すればよいのです。
例えば、MAMというトライグラムがあれば、前の2文字MAが現れたとき、次の文字としてMが現れたことを意味します。
それでは、実際のデータを使って見ていきましょう。
2. トライグラム:連続する3文字を数える
2.1. 3文字のスライディングウィンドウ
今回も前回の記事で使用した3つの単語を学習データとして使います。
MAMA
MAMMAL
MAMMOTH
まず、MAMMALに 3文字分の窓(window) を置き、右に1文字ずつ移動させます。
Step 1 [MAM]MAL
Step 2 M[AMM]AL
Step 3 MA[MMA]L
Step 4 MAM[MAL]
バイグラムで使ったスライディングウィンドウと同じ方法です。ただし、今回は窓の大きさが2文字から3文字に増えています。
残りの2つの単語にも同じ処理を適用すると、次のようになります。
| 学習単語 | 抽出されたトライグラム |
|---|---|
MAMA |
MAM, AMA
|
MAMMAL |
MAM, AMM, MMA, MAL
|
MAMMOTH |
MAM, AMM, MMO, MOT, OTH
|
長さがkの単語から3文字ずつ取り出すと、k - 2個のトライグラムが得られます。
したがって、今回の学習データから抽出されるトライグラムの数は次のとおりです。
-
MAMA:4 - 2 = 2個 -
MAMMAL:6 - 2 = 4個 -
MAMMOTH:7 - 2 = 5個
合計11個のトライグラムが抽出されます。
2.2. トライグラムの出現回数を数える
では、重複するトライグラムも漏れなく数えてみましょう。
| トライグラム | 出現回数 |
|---|---|
MAM |
3 |
AMA |
1 |
AMM |
2 |
MMA |
1 |
MAL |
1 |
MMO |
1 |
MOT |
1 |
OTH |
1 |
| 合計 | 11 |
ここでMAMは3つの単語すべてに現れたので3回、AMMはMAMMALとMAMMOTHに現れたので2回です。
残りのトライグラムはそれぞれ1回ずつ現れました。
ここまでの過程は、ユニグラムやバイグラムと大きく変わりません。
3. トライグラムの条件付き確率を計算する
3.1. MAの次に来る文字の確率
今回は、モデルがMAという2文字を出力した状態だと仮定しましょう。
トライグラムは直前の2文字を参照するため、学習データから**MAで始まるトライグラム**を探せばよいのです。
| 組み合わせ | 出現回数 |
MAの次の文字として選ばれる確率 |
|---|---|---|
MAM |
3 | 3/4 = 75% |
MAL |
1 | 1/4 = 25% |
| 合計 | 4 | 100% |
図で表すと、次のようになります。
┌── M 75% (3回)
現在の文脈 MA ────┤
└── L 25% (1回)
このモデルでは、MAの次にMが来る確率は75%、Lが来る確率は25%です。
ここで、1つ疑問が生じるかもしれません。
前回の記事ではMAというバイグラムが合計5回現れたのに、なぜ今回は4回しか数えていないのでしょうか?
その理由は、MAMAの最後の2文字であるMAの後には、もう文字がないからです。
MAMA
^^
MAの次の文字はない
今回の例では単語の開始と終了を表す境界記号を使っていないため、実際に次の文字が存在する場合だけを数えます。
つまり、MAの次に来る文字を予測するときに使う観測回数の合計は4回です。
3.2. 文脈が変われば確率も変わる
今度はAMとMMという2つの文脈を比較してみましょう。
どちらの文脈も最後の文字がMであるという共通点があります。
バイグラムモデルでは直前の文字であるMしか参照しないため、両者を区別できません。
しかし、トライグラムは前の2文字を参照するため、それぞれ異なる確率分布を使えます。
まず、AMの次に来る文字を見てみましょう。
| 組み合わせ | 出現回数 | 選択確率 |
|---|---|---|
AMA |
1 | 1/3 ≈ 33.3% |
AMM |
2 | 2/3 ≈ 66.7% |
一方、MMの次に来る文字の確率は次のとおりです。
| 組み合わせ | 出現回数 | 選択確率 |
|---|---|---|
MMA |
1 | 1/2 = 50% |
MMO |
1 | 1/2 = 50% |
まとめると、次のようになります。
現在の文脈 AM
├── A 33.3%
└── M 66.7%
現在の文脈 MM
├── A 50.0%
└── O 50.0%
AMとMMはどちらもMで終わりますが、次に来る文字の確率は異なります。
バイグラムが直前の1文字を覚えていたのに対し、トライグラムは直前の2文字を覚えることで、より具体的な文脈を反映できます。
4. トライグラムで文字を生成してみよう
4.1. 前の2文字を利用して次の文字を生成する
では、学習したトライグラムを使って実際に文字列を生成してみましょう。
開始時の文脈はMAだと仮定します。
最初の予測では、MAの次に来る文字を選ぶ必要があります。
現在の文脈: MA
M: 75%
L: 25%
確率に従ってMが選ばれたとすると、生成された文字列は次のようになります。
MAM
では、次の文字を生成するときはどうすればよいでしょうか?
トライグラムは常に直近の2文字を参照します。したがって、MAM全体を使うのではなく、最後の2文字であるAMを使います。
生成結果: MAM
現在の文脈: AM
A: 33.3%
M: 66.7%
今回もMが選ばれたと仮定すると、次のようになります。
MAMM
ここで直近の2文字はMMです。
生成結果: MAMM
現在の文脈: MM
A: 50%
O: 50%
ここでOが選ばれると、結果は次のようになります。
MAMMO
この過程を繰り返すと、次のような文字列を作れます。
開始 MA
Step 1 MAM
Step 2 MAMM
Step 3 MAMMO
Step 4 MAMMOT
Step 5 MAMMOTH
学習データとして使ったMAMMOTHが生成されました。
もちろん、これはモデルがMAMMOTHという単語の意味を理解したということではありません。
単に学習データで観測された3文字のつながりに従って文字を生成したからです。
4.2. 学習していない新しい単語も作れるのだろうか?
トライグラムが必ずしも学習した単語だけを生成するわけではありません。
例えば、次のような文字列も生成できます。
MAMMAMMOTH
この文字列は元の学習データにはありませんでした。
しかし、文字列を3文字ずつ区切ると、次のようになります。
MAM
AMM
MMA
MAM
AMM
MMO
MOT
OTH
上のトライグラムは、すべて学習データに1回以上現れた組み合わせです。
つまり、トライグラムモデルは学習した3文字の組み合わせをつなぎ合わせて、学習データにはなかった文字列を生成できます。
ユニグラムで偶然新しい文字の組み合わせが作られたことと似ていますが、重要な違いがあります。
ユニグラムは各文字を独立に選ぶ一方、トライグラムは直前の2文字につながる文字だけを選びます。
そのため、以前よりも学習データの文字の並びをよく反映した文字列を生成できます。
ただし、これだけで自然な単語や文章が作られるとは限りません。
5. トライグラムの限界:文脈が長くなれば十分なのだろうか?
ここまで見てきたトライグラムは、バイグラムよりも多くの文脈を参照できました。
それでは、Nをどんどん大きくすれば、いつか完璧な言語モデルを作れるのでしょうか?
残念ながら、そう簡単ではありません。
N-gramは文脈が長くなるほど、新たな問題に直面します。
5.1. 限界① 覚えられる文脈の長さが決まっている
トライグラムは次の文字を予測するとき、直前の2文字だけを使います。
例えば、次の2つの文字列を考えてみましょう。
MAMM
MAMMAMM
2つの文字列の長さは異なりますが、最後の2文字はどちらもMMです。
そのため、トライグラムモデルは両方の場合でまったく同じ確率分布を使います。
MAMM → 次の文字を予測
MM → A 50%, O 50%
MAMMAMM → 次の文字を予測
MM → A 50%, O 50%
モデルはMMの前にどのような文字があったのかを考慮しません。
つまり、それまでにどれだけ多くの文字が現れていても、最後の2文字が同じなら同じ予測を行うのです。
このような特性は、N-gram言語モデルの制限された文脈長と考えることができます。
バイグラムでは1文字、トライグラムでは2文字、そしてN-gramでは最大N - 1個の直前の文字を使います。
もちろん、Nを大きくすれば、より多くの文脈を参照できます。
しかし、その過程で別の問題が発生します。
5.2. 限界② 文脈が長くなるほどデータが不足する
今回使用した学習データから抽出したN-gramの個数を比較してみましょう。
| モデル | N | 抽出された組み合わせの総数 |
|---|---|---|
| ユニグラム | 1 | 17 |
| バイグラム | 2 | 14 |
| トライグラム | 3 | 11 |
| 4-gram | 4 | 8 |
| 5-gram | 5 | 5 |
ここで、組み合わせの総数とは重複を含めて抽出されたすべての組み合わせの数です。
窓の大きさが大きくなるほど、1つの単語から抽出できる組み合わせの個数は減ります。
さらに重要なのは、可能な組み合わせの種類は、逆に急激に増えるということです。
例えば、アルファベットを26文字使うと仮定しましょう。
| N | 可能な文字の組み合わせの数 |
|---|---|
| 1 | 26 |
| 2 | 676 |
| 3 | 17,576 |
| 4 | 456,976 |
| 5 | 11,881,376 |
可能な組み合わせの数は、次のように計算できます。
[
26^N
]
これは、26文字を使って作れる長さNのすべての組み合わせを計算したものです。
もちろん、実際の英語ですべての組み合わせが使われるわけではありません。
しかし、Nが大きくなるほど、学習データで観測する必要のある組み合わせの種類が増えるという点は変わりません。
例えば、N = 5の場合、可能な組み合わせは約1,188万個です。
学習データが十分でなければ、その多くは一度も現れないかもしれません。
このように、文脈が長くなるほど各組み合わせについての観測データが不足する問題を、**データの疎性(Data sparsity)**と呼びます。
5.3. 限界③ 初めて見る文脈では次の文字を予測しにくい
この問題をもう少し具体的に見てみましょう。
学習したトライグラムは次のとおりでした。
MAM, AMA, AMM, MMA,
MAL, MMO, MOT, OTH
ところが、モデルにLAという文脈が与えられたと仮定しましょう。
学習データには、LAで始まるトライグラムが一度も現れませんでした。
現在の文脈: LA
LA? → 観測された組み合わせなし
なので、この単純なカウントベースのモデルでは、次の文字の確率分布を計算できません。
だからといって、解決方法がまったくないわけではありません。
例えば、トライグラムで必要な統計が見つからなければバイグラムを使ったり、観測されていない組み合わせにも小さな確率を与えたりする方法があります。
これらの方法は、それぞれバックオフ(Backoff) と スムージング(Smoothing) と呼ばれます。
ただし、ここでは詳しい計算方法までは扱いません。
重要なのは、文脈を長く覚えるだけでは、初めて見る文脈を処理する問題は解決しないという点です。
5.4. 限界④ 出現回数だけでは意味を理解できない
最後に、もう少し根本的な問題があります。
先ほど生成した文字列をもう一度見てみましょう。
MAMMAMMOTH
この文字列は学習データには存在しませんでしたが、すべてのトライグラムが観測済みの組み合わせだったため、生成することができました。
しかし、実際の英単語として自然かどうかは別の問題です。
トライグラムモデルが知っているのは、次のような統計だけです。
-
MAの次にはMがよく現れる。 -
AMの次にはMがよく現れる。 -
MMの次にはAまたはOが現れる。
このモデルは文字が一緒に現れた頻度を知っているだけで、その文字列が実際の単語なのか、どのような意味を持つのかを直接判断することはできません。
これはトライグラムだけの問題ではありません。
N-gramのサイズを大きくしても、基本的なカウントベースのアプローチでは、学習データに登場した文字の組み合わせの頻度を利用するという点は同じです。
長い文脈で現れる統計をより多く覚えることはできますが、初めて見る表現や複雑な意味関係を一般化することには限界があります。
6. 次のステップ:N-gramから現代のLLMへ
ここまで、ユニグラムからバイグラム、そしてトライグラムまで見てきました。
3つのモデルを比較すると、次のようになります。
| 区分 | ユニグラム | バイグラム | トライグラム |
|---|---|---|---|
| 参照する文脈 | なし | 前の1文字 | 前の2文字 |
| 学習する統計 | 文字の出現頻度 | 2文字の出現頻度 | 3文字の出現頻度 |
| 次の文字の予測 | 文字全体の確率 | 直前の文字に応じた確率 | 直前の2文字に応じた確率 |
| 主な限界 | 文字間の関係を反映できない | 文脈が1文字に制限される | 文脈が2文字に制限され、データの疎性が大きくなる |
今回確認したことは次のとおりです。
- 文脈の拡張:トライグラムは前の2文字を参照して、次の文字の確率を計算します。
- テキスト生成:学習したトライグラムをつなぎ合わせて、新しい文字列を生成できます。
-
文脈長の限界:N-gramは最大
N - 1個の直前の文字しか参照しません。 - データの疎性:文脈が長くなるほど、観測されていない組み合わせが増え、確率の計算が難しくなります。
- 一般化の限界:単に出現回数を覚える方法では、初めて見る文脈や複雑な意味関係を処理することが困難です。
ここで、重要な疑問が1つ残ります。
すべての文字の組み合わせの出現回数を直接覚えなくても、次の文字の確率を予測することはできないのでしょうか?
例えば、それぞれの文字や文脈を数値で表し、学習データを通して次の文字を予測するルール自体を学習するとしたら、どうでしょうか?
これが、これから学ぶ ニューラルネットワーク言語モデル(Neural Language Model) を理解するための出発点です。