Tokenization
トークナイゼーションでは、テキスト、画像、音声をトークンに分割し、モデルがそれらを埋め込みに変換します。BPEなどのサブワード手法、画像パッチ、トークンのコストについて解説します。
トークン化とは、未加工の入力を、モデルが読み取る離散単位であるtokensのシーケンスに変換し、各トークンに固定語彙から整数IDを割り当てる処理です。テキストトークナイザーは「The bus stopped.」を4つのIDに変換し、モデルはそれぞれの埋め込みベクトルを参照します。そのため、トークナイザーによって大規模言語モデル(LLM)が何を1つの単位として扱うかが決まります。トークンはモデルのコンテキストウィンドウ、テキスト生成中の推論レイテンシ、API料金の単位でもあります。同じ考え方はテキスト以外にも当てはまります。Vision Transformer(ViT)は画像をパッチにトークン化し、音声モデルは音声を短いフレームにトークン化します。
サブワードトークン化の仕組み#
初期の自然言語処理(NLP)では、テキストを空白や句読点で分割していたため、まれな単語や新語を語彙に含められませんでした。一方、文字単位のトークン化ではシーケンスが非常に長くなります。現代のTransformerは、頻出語はそのまま保持し、まれな語は再利用可能な部分に分割するサブワードトークナイザーを使います。バイトペアエンコーディング(BPE)は、Sennrichらが2015年に機械翻訳向けに応用した手法で、学習コーパスから語彙を構築します。単一の文字またはバイトから始め、語彙が目標サイズに達するまで、隣接するペアのうち最も頻度の高いものを新しいトークンに繰り返し統合します。新しいテキストのエンコードでは、学習済みの統合を順番に適用します。
GPT-2以降に使われているバイトレベルBPEは、256通りのバイト値から始めるため、未知トークンを使わずに任意の文字列、絵文字、ソースファイルをエンコードできます。他のアルゴリズムでは異なる方法で部分文字列を選択します。BERTで使われるWordPieceは、学習データの尤度を最も高めるペアを統合します。GoogleのSentencePieceライブラリにあるUnigram方式は、大きな候補語彙から始めて候補を削除していきます。空白を通常の記号として扱うため、空白を使わずに書く言語にも1つのトークナイザーを使用できます。語彙は時代とともに拡大してきました。BERTは30,522トークン、GPT-2とGPT-3は50,257トークン、Llama 3は128,256トークン、OpenAIのo200k_baseは約200,000トークンを使用します。OpenAIのtiktokenライブラリで、これらの語彙のうち最も古いものと新しいものを比較します。
import tiktoken
# Byte-level BPE vocabularies from GPT-2 (2019) and GPT-4o (2024)
for name in ["gpt2", "o200k_base"]:
encoding = tiktoken.get_encoding(name)
print(f"{name}: {encoding.n_vocab:,} tokens in the vocabulary")
for text in ["Ultralytics YOLO26 detects buses.", "バスが止まった。"]:
ids = encoding.encode(text)
# Decode each ID on its own to see where the tokenizer split the text
pieces = [encoding.decode([i]) for i in ids]
print(f" {len(ids)} tokens: {pieces}")GPT-2の語彙では英語の文に11トークンが必要です。「Ultralytics」はUlt、ral、y、ticsに分割されます。一方、o200k_baseでは9トークンで済みます。日本語の文「the bus stopped」では、GPT-2は9トークンを必要とし、文字「止」を2つのバイトレベルトークンに分割します。それぞれ単独でデコードすると置換文字�になります。一方、o200k_baseでは7トークンで済みます。
トークン化と関連用語の比較#
- トークン: トークン化によって生成される単位で、単語、サブワード、バイト、画像パッチ、音声フレームなどがあります。
- 埋め込み: トークナイザーが事前に定めた語彙内の各トークンIDに対してモデルが参照する学習済みベクトルであり、ネットワークの他の部分とともに学習されます。
- 従来のNLPにおける単語分割: spaCyやNLTKなどのライブラリは、構文解析や品詞タグ付けのためにテキストを単語と句読点に分割します。その後、言語分析のために語幹化や見出し語化を行うこともよくあります。
- データセキュリティにおけるトークン化: 決済やデータ保護では、トークン化によってカード番号などの機密値を、保護された保管庫に保存されるランダムな代替値に置き換えます。
トークン数が重要な理由#
英語のテキストでは、OpenAIのトークナイザーは平均して1トークンあたり約4文字ですが、他の言語やコードでは、はるかに多くのトークンが必要になる場合があります。Petrov et al. (2023)は、同じテキストでも言語によってトークン化後の長さが最大15倍異なることを示しました。そのため、APIコストが増加し、これらの言語で利用できるコンテキストが狭まります。トークンの境界は、モデルが認識できる内容にも影響します。「strawberry」を複数の複数文字トークンとして読むLLMは、各文字を直接認識できません。また、o200k_baseでは「3.14159」が3、.、141、59に分割されるため、桁単位の算術処理が難しくなります。MetaのByte Latent Transformerなど、トークナイザーを使わない設計では、固定語彙を使わず、次のバイトの予測しやすさに応じたサイズのパッチに生バイトをまとめます。
画像、音声、動画のトークン化#
ViTは画像を固定サイズのパッチに分割します。たとえば、16×16ピクセルのパッチを使うと、224×224の画像は196個のパッチトークンになります。各パッチはフラット化され、セルフアテンションの前に線形射影によって埋め込みに変換されます。視覚言語モデル(VLMs)は、パッチの埋め込みをテキストトークンとともにLLMに渡すため、画像解像度が高いほどリクエストあたりのトークン数が増えます。画像生成モデルでは、代わりに離散的な視覚トークンがよく使われます。ベクトル量子化のコードブックは、各パッチを最も近いコードベクトルのIDに置き換えます。これにより、視覚的自己回帰モデルはテキストと同様にトークン単位で画像を生成でき、トークンマージは類似するトークンを統合して、長い画像・動画シーケンスのトークン数を削減します。
ビジョンモデルもテキストをトークン化します。YOLOE-26がset_classesを通じてクラス名を受け取ると、Ultralyticsは各名前をCLIPのバイトレベルBPEトークナイザーに通し、77トークンになるようパディングまたは切り詰めます。次に、AppleのMobileCLIP2テキストエンコーダーが結果を埋め込みに変換し、検出ヘッドが画像領域との照合に使用します。音声認識では、OpenAIのWhisperが30秒ごとの音声ウィンドウを対数メルスペクトログラムのフレームに変換し、エンコーダーが1,500位置のシーケンスとして処理します。










