Token
トークンとは、サブワードや画像パッチなど、モデルが処理する入力の単位です。テキストを分割するトークナイザー、視覚トークン、トークンのコストについて解説します。
トークンは、AIモデルが処理する入出力の基本単位です。テキストでは単語、単語の一部、文字、バイト、画像ではピクセルのパッチなどを指します。Transformerが文や画像を読み取る前に、トークナイザーが入力をトークンに分割し、それぞれを整数IDに対応付けます。モデルは各IDに対応する埋め込みベクトルを参照します。トークン数によって、モデルが処理できる量と料金が決まります。コンテキストウィンドウはトークン単位で測定され、大規模言語モデル (LLMs)は一度に1トークンずつテキストを生成し、商用APIは入力トークンと出力トークンごとに課金します。
トークン、トークン化、関連用語#
- トークン化: 生の入力をトークンに分割する処理です。トークンは、その処理で出力される単位の1つです。
- 語彙とトークンID: トークナイザーの語彙は、認識できるトークンの固定集合であり、各トークンに整数IDが割り当てられています。BERTは30,522個、GPT-2は50,257個、Llama 3は128,256個、Gemma 3は約262,000個のトークンを使用します。
- 特殊トークン: シーケンスの構造を示すマーカーで、テキスト開始、テキスト終了、パディングの各トークンなどがあります。また、分類にBERTが最終埋め込みを使う
[CLS]トークンも含まれます。 - 埋め込み: モデルの最初のレイヤーが各トークンIDに対して参照する学習済みベクトルで、トークンの意味をネットワークに伝えます。
テキストトークン#
単語全体を使う語彙では、あらゆる名前、誤字、新語を網羅できず、文字単位ではシーケンスが非常に長くなります。そのため、最新のトークナイザーではサブワードを使います。頻出語は1つのトークンになり、まれな単語は再利用可能な部分に分割されます。2016年にSennrichらがニューラル機械翻訳向けに応用したバイトペアエンコーディング (BPE)は、単一文字から始め、語彙が目標サイズに達するまで、隣接する最頻出ペアを繰り返し結合します。GPTモデルはBPEをバイトに適用するため、コードや絵文字を含むあらゆるテキストをエンコードできます。BERTで使われるWordPieceや、SentencePieceのUnigramモデルも、関連するサブワード方式です。ここではHugging Face Hubから読み込んだCLIPのBPEトークナイザーを使って、単語の分割方法を確認します。
from transformers import AutoTokenizer
# Load CLIP's byte-pair-encoding (BPE) tokenizer from the Hugging Face Hub
tokenizer = AutoTokenizer.from_pretrained("openai/clip-vit-base-patch32")
for text in ["bus", "double-decker bus", "unhappiness", "Ultralytics"]:
tokens = tokenizer.tokenize(text)
print(f"{text!r} -> {tokens} -> {tokenizer.convert_tokens_to_ids(tokens)}")「bus」はID 2840の単一トークンです。「unhappiness」は un と happiness に分割され、まれな単語「Ultralytics」は ultr、aly、tics の3つに分かれます。</w> という接尾辞は、CLIPの49,408個のトークンからなる語彙で単語の終わりを示します。CLIPのテキストエンコーダーは、プロンプトごとに最大77トークンを読み取ります。
視覚トークン#
論文An Image Is Worth 16x16 Wordsで紹介されたVision Transformer (ViT)は、画像を固定サイズのパッチに分割します。ViT-B/16の場合、パッチは16 × 16ピクセルです。各パッチを埋め込みに射影するため、224 × 224の画像は196個のトークンになります。位置埋め込みで各パッチの位置を記録し、追加のクラス・トークンで分類に使う情報を集約します。射影は通常、ストライドがカーネルサイズと等しい畳み込みとして実装されます。
import torch
# ViT-B/16 patch embedding: a 16x16 convolution with stride 16 turns each patch into one 768-dim token
patch_embed = torch.nn.Conv2d(3, 768, kernel_size=16, stride=16)
for size in (224, 448):
image = torch.rand(1, 3, size, size)
tokens = patch_embed(image).flatten(2).transpose(1, 2) # (batch, tokens, dims)
print(f"{size}x{size} image -> {tuple(tokens.shape)}")224 × 224の画像は、768個の値を持つトークンを196個生成します。辺の長さを448ピクセルに倍増するとトークン数は784個になり、4倍に増えます。セルフアテンションでは各トークンが他のすべてのトークンと比較されるため、トークン数が4倍になるとアテンションのコストは約16倍になります。そのため、高解像度モデルではSwin Transformerのようなウィンドウ型アテンションを使うか、トークンマージで類似トークンを統合します。
視覚言語モデルは、画像エンコーダーから得た視覚トークンをテキストトークンとともにLLMに渡します。すると1つのTransformerが両方にアテンションを適用し、テキストトークンを一度に1つずつ生成して回答します。
トークン数が重要な理由#
- コンテキストの上限: プロンプト、取得した文書や画像、生成する回答のすべてをモデルのコンテキストウィンドウに収める必要があります。
- コストとレイテンシ: APIでは入力トークンと出力トークンが別々に課金されます。また、出力トークンごとにモデルのKVキャッシュを読み込むデコードステップが必要なため、生成時間は出力トークン数とともに増加します。
- 言語と形式: 主に英語で学習したトークナイザーは、他の言語、コード、長い数値を単語あたりより多くのトークンに分割します。そのため、同じ内容でもコストが増え、コンテキストウィンドウが早く埋まります。
- 文字レベルのタスク: モデルが認識するのはサブワードトークンです。そのため、単語の文字数を数えたり、単語を逆順にしたりするような個々の文字に依存するタスクは、見た目より難しくなります。
実際のアプリケーション#
- テキスト生成: LLMは語彙内の各トークンに確率を割り当て、1つをサンプリングしてシーケンスに追加し、この処理を繰り返します。nucleus samplingなどのサンプリング手法では、確率の高いトークンから選択します。
- 画像生成: 自己回帰型画像モデルは、ベクトル量子化で構築した学習済みコードブックから、離散的な視覚トークンを予測します。これはLLMが単語を予測する方法に似ています。
- オープン語彙検出: Ultralyticsパッケージに含まれる、清華大学のYOLOEをベースにしたYOLO26版であるYOLOE-26は、入力したクラス名から物体を検出します。その
set_classes()メソッドはCLIPのBPEトークナイザーで各名前をトークン化し、AppleのMobileCLIP2テキストエンコーダーがトークンを埋め込みに変換します。モデルはその埋め込みと画像領域を照合するため、COCOデータセットに含まれない「二階建てバス」のようなクラスも、単語だけから検出できます。










