今回の記事の目標
現代のLLMを理解するための第一歩として、最もシンプルな統計的言語モデルである N-gram を見ていきます。文字の出現回数を数えるだけの ユニグラム(Unigram) から始め、直前の文字を参考に次の文字を予測する バイグラム(Bigram) まで、順を追って学んでいきましょう。
はじめに:LLMはどのように文章を生成するのか?
現代のAIを理解するうえで、LLM(Large Language Model、大規模言語モデル)は欠かすことのできない中核的な技術となりました。そして、LLMの仕組みを理解するための重要な出発点は、与えられた文脈をもとに、次に来るトークン(token)を予測するという事実です。
トークンとは、モデルがテキストを処理する単位であり、一文字の場合もあれば、単語全体や単語の一部の場合もあります。
ひとまずトークンのような概念は脇に置いて、一つの文字と、その文字の後ろにどのような文字が来るべきかを考えてみましょう。
最初のテーマは N-gram です。
1. N-gramとは?
N-gram とは、テキスト内の 連続するN個の要素(文字や単語など) をひとまとまりにして調べる方法です。
N-gramは、現代のLLMの原理を理解するのに適した 古典的な統計的言語モデル です。確率的なテキスト生成の中心的なアイデア なので、このN-gramを根本から理解することが、LLMを理解するための第一歩となります。
本題に入りましょう。N-gramを使って MAMMAL という単語を文字単位で分析すると、次のようになります。
| 名前 | N | まとめる単位 |
MAMMAL の例 |
|---|---|---|---|
| ユニグラム(Unigram) | 1 | 一文字 |
M, A, M, M, A, L
|
| バイグラム(Bigram) | 2 | 連続する二文字 |
MA, AM, MM, MA, AL
|
| トライグラム(Trigram) | 3 | 連続する三文字 |
MAM, AMM, MMA, MAL
|
N-gramを言語モデルとして活用する最も基本的な方法は、それぞれの組み合わせが何回出現したかを数え、その頻度を確率に変えること です。このようなアプローチを カウントベースの言語モデル(count-based language model) と呼びます。
つまり、ここでいう統計は、複雑な計算よりもまず 出現回数を数えること から始まります。
2. ユニグラム:どの文字が多く出現するのか?
ユニグラム(Unigram) は、N-gramにおいて N = 1 の場合です。それぞれの文字が どれくらい頻繁に出現するかだけ を学習し、前後の文字との関係は考慮しません。
例えば、学習したテキストにおけるアルファベットの割合が次のようになっていると仮定しましょう。
| 文字 | 出現割合 | 生成時に選ばれる確率 |
|---|---|---|
a |
50% | 50% |
b |
30% | 30% |
c |
20% | 20% |
| 合計 | 100% | 100% |
この分布に従って文字を一つ生成する場合、a が選ばれる確率は50%、b は30%、c は20%です。
ユニグラムの要点はシンプルです。
多く出現した文字ほど、生成時にも高い確率で選ばれます。
2.1. サンプリング:最も確率の高い文字だけを選べばよいのか?
ここで、少し異なるデータがあると仮定しましょう。
| 文字 | 確率 |
|---|---|
a |
30% |
b |
10% |
c |
20% |
d |
40% |
文字を選ぶ方法はいくつかあります。
方法① 貪欲デコーディング(Greedy decoding)
毎回、最も確率の高い文字を選ぶ方法です。このユニグラムモデルでは、d の確率が常に40%で最も高いため、結果は次のようになります。
dddddddddddddddd
方法② 確率的サンプリング(Probabilistic sampling)
確率に従ってランダムに文字を選ぶ方法です。d が最も頻繁に選ばれますが、a、b、c も出現する可能性があります。
dcabdabdaddbcda
^^^
add
上の文字列は、生成され得る結果を示した 例 です。その中には、偶然 add という実在する英単語が現れています。
ここには重要な違いがあります。
- 貪欲デコーディングは、このユニグラムモデルで最も確率の高い 一つの文字だけを繰り返します。
- 確率的サンプリングは、さまざまな文字を組み合わせる機会 を与えます。
ただし、サンプリングをしたからといって、モデルが単語の意味や綴りの規則を理解しているわけではありません。add は、文字が 偶然その順序で選ばれたために 現れただけです。
また、貪欲デコーディング自体が常に悪い方法だという意味でもありません。ユニグラムでは、直前の文字に関係なく同じ確率分布を繰り返し使うため、このような極端な繰り返しが起こりやすいということです。
2.2. 実際の単語でユニグラムを学習する
今度は、次の三つの単語を学習データとして使います。
MAMA
MAMMAL
MAMMOTH
まず、MAMMAL に 一文字分の窓(window) を置き、右へ一文字ずつ移動させます。この過程を スライディングウィンドウ(sliding window) と呼びます。
Step 1 [M]AMMAL
Step 2 M[A]MMAL
Step 3 MA[M]MAL
Step 4 MAM[M]AL
Step 5 MAMM[A]L
Step 6 MAMMA[L]
残りの二つの単語にも同じ処理を適用すると、次のようになります。
| 学習する単語 | 抽出されたユニグラム |
|---|---|
MAMA |
M, A, M, A
|
MAMMAL |
M, A, M, M, A, L
|
MAMMOTH |
M, A, M, M, O, T, H
|
三つの単語から抽出した合計 17文字 の頻度を数えてみましょう。
| ユニグラム | 出現回数 | 選ばれる確率 |
|---|---|---|
M |
8 | 8/17 ≈ 47.1% |
A |
5 | 5/17 ≈ 29.4% |
L |
1 | 1/17 ≈ 5.9% |
O |
1 | 1/17 ≈ 5.9% |
T |
1 | 1/17 ≈ 5.9% |
H |
1 | 1/17 ≈ 5.9% |
| 合計 | 17 | 100% |
各文字の確率は、次のように計算します。
[
P(\text{文字}) = \frac{\text{その文字の出現回数}}{\text{全文字数}}
]
例えば、M が生成される確率は 8/17、つまり約 47.1% です。
2.3. ユニグラムで生成すると、どのような結果になるのか?
この確率分布に従って文字を繰り返し選ぶと、次のような文字列が生成される可能性があります。
MMALAMLMMOAMTHTALOM
確率の高い M と A が比較的頻繁に出現しますが、全体としては自然な英単語や文章には見えません。
さらに興味深いのは、学習した単語にはなかった文字の組み合わせも現れる可能性がある という点です。例えば、上の結果に含まれる LMM という連続した三文字は、もとの三つの学習単語には登場していませんでした。
ユニグラムは直前の文字が何だったかをまったく考慮しないため、このような組み合わせが可能です。一方で、MMA や MMO は新しく現れた組み合わせに見えても、実際にはそれぞれ MAMMAL、MAMMOTH の中にすでに存在しています。
それでは、直前にどの文字が出たのか まで覚えていたら、結果は変わるのでしょうか?
3. バイグラム:ある文字の次には何が来るのか?
バイグラム(Bigram) は、N-gramにおいて N = 2 の場合です。連続する二文字を一つの組み合わせとして扱います。
ユニグラムが 「どの文字が多く出現したか?」 と問うのに対して、バイグラムは次のように問いかけます。
「この文字が出たとき、次にはどの文字がよく出てきたのか?」
つまり、バイグラムは 前の文字と次の文字の関係 を統計に反映します。これを確率で表す際には、条件付き確率(conditional probability) を使います。
3.1. 二文字のスライディングウィンドウ
今回も MAMMAL を使いますが、窓の大きさを 二文字 に変更します。
Step 1 [MA]MMAL
Step 2 M[AM]MAL
Step 3 MA[MM]AL
Step 4 MAM[MA]L
Step 5 MAMM[AL]
三つの単語すべてに適用すると、次のようになります。
| 学習する単語 | 抽出されたバイグラム |
|---|---|
MAMA |
MA, AM, MA
|
MAMMAL |
MA, AM, MM, MA, AL
|
MAMMOTH |
MA, AM, MM, MO, OT, TH
|
重複する組み合わせも漏れなく数えると、次のような頻度表が完成します。
| バイグラム | 出現回数 |
|---|---|
MA |
5 |
AM |
3 |
MM |
2 |
AL |
1 |
MO |
1 |
OT |
1 |
TH |
1 |
| 合計 | 14 |
ユニグラムは合計17個だったのに、バイグラムはなぜ14個なのでしょうか? 長さが k の単語を二文字ずつまとめると、k - 1 個のバイグラムができるからです。単語は三つあるので、17 - 3 = 14 個となります。
3.2. M の次に来る文字の確率を計算する
ここで、モデルが M を出力した状態だと仮定しましょう。
学習データから M で始まるバイグラム だけを探すと、次のようになります。
| 組み合わせ | 出現回数 |
M の次の文字として選ばれる確率 |
|---|---|---|
MA |
5 | 5/8 = 62.5% |
MM |
2 | 2/8 = 25.0% |
MO |
1 | 1/8 = 12.5% |
| 合計 | 8 | 100% |
これを図で表すと、次のようになります。
┌── A 62.5% (5回)
現在の文字 M ───┼── M 25.0% (2回)
└── O 12.5% (1回)
このモデルでは、M の次に A が来る確率が最も高くなります。
3.3. ユニグラムとバイグラムの決定的な違い
ユニグラムは、それまでに何を生成したかに関係なく、常に同じ全体の確率分布 から次の文字を選びます。
一方、バイグラムは 直近に生成した文字に応じて 確率分布を変えます。
例えば、学習データでは次のようになっています。
-
Mの次にはA、M、Oが来る可能性があります。 -
Aの次にはMが3回、Lが1回出現します。したがって、A → Mの確率は75%、A → Lは25%です。 -
Oの次にはTだけが出現します。したがって、観測されたデータだけを見ると、O → Tの確率は100%です。
これでモデルは、単に よく出現する文字 ではなく、直前の文字に合う次の文字 を選べるようになります。
ただし、バイグラムもあくまで直前の 一文字だけ を参照します。長い単語の構造や文章全体の意味まで理解するわけではありません。
また、この例では単語の始まりと終わりを示していませんが、実際のN-GramやLLMの学習テキストでは、<START>、<END> のような境界記号を追加し、一つのトークンとして扱うことで、どこから始まり、いつ止めるか も含めて学習します。
4. 次のステップ:文脈が長くなると何が変わるのか?
ここまでで確認したのは、とてもシンプルですが重要な原理です。
- 頻度を数える:学習データで、どのパターンが何回出現したかを数えます。
- 確率を計算する:出現回数をもとに、次に来る文字の確率を求めます。
- サンプリング:この確率分布から文字を選び、テキストを生成します。
- 文脈を反映する:バイグラムからは、直前の文字によって次の文字の確率が変わります。
それでは、直前の一文字ではなく、二文字、三文字、あるいはさらに長い文脈 を参照するとどうなるのでしょうか?