大規模言語モデル(LLM)と語彙(vocabulary)の関係と意味について

はるか
はるか
語彙…言語モデルの「単語の辞書」みたいなもの。
ふゅか
ふゅか
そうそう!たとえば人が話す言葉を集めたものが「辞書」なら、語彙はAIが使うそのバージョンって感じね!

1. 語彙とは

「語彙」とは、特定の言語や文脈で使われる単語や記号などの集まりを指します。言語モデルにおける語彙は、モデルが理解し、処理できるすべての単語や記号、トークンの集合です。日常的な言葉とコンピュータでの利用を区別しつつ、以下で詳しく説明します。

1.1. 単語レベルの語彙

  • 各単語が語彙の集合に含まれる場合です。
  • 例: 「猫」「走る」「家」など、自然言語の単語が語彙として登録される。
  • 特徴:
    • 語彙が非常に大きくなる(数万〜数十万語)。
    • 未知語(語彙に含まれない単語)の処理が課題となる。

1.2. サブワードを利用した語彙

  • 単語を細かい単位(サブワード)に分解し、それらを語彙とする場合です。
  • 例: 「走る」が「走」「る」に分割され、それぞれが語彙に登録される。
  • 特徴:
    • 語彙サイズを小さく抑えられる。
    • 未知語を処理しやすくなる。
  • 使用例: BERTやGPTのトークナイザ(SentencePiece、Byte Pair Encodingなど)。

1.3. 文字レベルの語彙

  • 各文字を語彙として使用する場合です。
  • 例: 「猫」→「猫」、または英語なら「c」「a」「t」など。
  • 特徴:
    • 語彙サイズは最小限になる(数十〜数百)。
    • 未知語の問題が完全になくなる。
    • モデルが長いシーケンスを処理する必要があり、計算負荷が高くなる。

1.4. 特別なトークン(語彙)

  • 通常の言語表現以外にも、特定の役割を持つトークンが含まれる。
  • 例:
    • <PAD>: パディング(入力の長さを揃えるためのトークン)。padding_tokenとも呼ばれる。
    • <UNK>: 未知の単語を表すトークン。
    • <CLS>: 文全体の意味を表すトークン(BERTで使用)。
    • <SEP>: 文や文脈の区切りを表すトークン。
はるか
はるか
特定の役割を持つトークンも重要。
ふゅか
ふゅか
例えば、パディング用の<PAD>とか、未知語を表す<UNK>とか?

2. 語彙と集合

言語モデルにおける語彙の集合を数式で表す場合、以下のように定義されます。

はるか
はるか
語彙は集合として扱える。
ふゅか
ふゅか
集合?数学っぽい話だね!

2.1. 語彙の集合の定義

語彙の集合 \( V \) は、モデルが扱うトークン(単語、サブワード、文字、記号など)の集合を指します。

\[ V = \{ v_1, v_2, v_3, \dots, v_n \} \]

ここで

  • \( V \) は語彙の集合(Vocabulary)。
  • \( v_i \) は語彙に含まれるトークン。
  • \( n \) は語彙のサイズ(語彙の要素数)。

2.2. 確率分布

テキストを生成するデコーダタイプの言語モデルは、トークンの系列に基づき次のトークン \( x_{t+1} \) の確率を予測します。このとき、語彙の集合 \( V \) に基づいて次のように定義されます。

\[ P(x_{t+1} | x_1, x_2, \dots, x_t), \quad x_{t+1} \in V \]

ここで

  • \( x_1, x_2, \dots, x_t \) は現在までのトークンの系列。
  • \( P(x_{t+1} | x_1, x_2, \dots, x_t) \) は次のトークンの条件付き確率。

2.3. 語彙サイズとモデルの出力

言語モデルの出力層(通常はソフトマックス関数)では、語彙サイズ \( |V| \) に基づいて次のように計算されます。

\[ P(x_{t+1} = v_i | x_1, x_2, \dots, x_t) = \frac{\exp(z_i)}{\sum_{j=1}^{|V|} \exp(z_j)}, \quad v_i \in V \]

ここで

  • \( z_i \) はモデルの出力スコア(ロジット)で、語彙の各トークンに対応。
  • \( |V| \) は語彙のサイズ。
はるか
はるか
語彙サイズはモデルの計算に影響する。
ふゅか
ふゅか
例えばソフトマックスで次のトークンの確率を計算するもんね!

3. 語彙のサイズの調べ方

hugging faceのtransformersで語彙サイズを調べるときは、トークナイザーからvocab_sizeから語彙のサイズがわかります。

3.1. 例1:GPT2の語彙のサイズ

open aiが開発したGPT-2という有名なモデルの語彙サイズを調べる例です。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
# 語彙サイズを確認
vocab_size = tokenizer.vocab_size
print(f"語彙サイズ: {vocab_size}")

3.2. 例2:meta-llama/Llama-3.1-70Bの語彙のサイズ

Metaが開発したLlama 3.1-70Bという大規模モデルの語彙サイズを確認します。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-70B")
# 語彙サイズを確認
vocab_size = tokenizer.vocab_size
print(f"語彙サイズ: {vocab_size}")

3.3. 例3:gemma-2-9bの語彙のサイズ

最後に、Googleが開発したGemma 2-9Bというモデルの語彙サイズを確認してみましょう。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-9b")
# 語彙サイズを確認
vocab_size = tokenizer.vocab_size
print(f"語彙サイズ: {vocab_size}")

4. Transformers・大規模言語モデルに関連する書籍

PR