Token(トークン)

article technology high #tokenization#bpe#wordpiece#sentencepiece#tiktoken#embedding#llm#vocabulary#subword
Created: 2026-05-24 Updated:

LLM の最小処理単位「トークン」を整理。BPE/WordPiece/Unigram/SentencePiece、語彙 32k–256k、tiktoken (cl100k/o200k)、埋め込みと weight tying、多言語コスト非対称・glitch・byte-level 代替を扱う。

Token(トークン)

トークンは LLM がテキストを処理する最小単位で、現代モデルでは単語でも文字でもなくサブワード (subword) が一般。語彙 VV は 32k〜256k 規模、テキストはトークナイザで整数 ID 列に変換され埋め込み層へ渡る。生成・課金・コンテキスト長・多言語性能・算術精度・プロンプト境界すべてを支配する、Transformer の「自己注意の最小粒度」を決める設計レイヤである。

トークンとは何か

字義的な単語 (word) ≠ トークン。unhappiness は BPE で ["un", "happi", "ness"] の 3 トークンに分割される。語彙 VV は固定で各トークンに 0…VV-1 の token ID が割り当てられ、モデルは生テキストを見ず token ID 列のみを入力とする。代表値は BERT-base 30,522 (WordPiece)、GPT-2 50,257 (byte-level BPE)、LLaMA-1/2 32,000 (SP-BPE)、LLaMA-3 128,256 (tiktoken BPE + byte-fallback)、GPT-3.5/4 cl100k_base 100,277、GPT-4o o200k_base 200,019、T5/mT5 32,100/250,100 (SP-Unigram)。経験則として英語は約 1.3 tokens/word、日本語は同等情報量で英語の 2〜4 倍を要し、これが多言語ユーザのコスト不公平の根因。

サブワード分割アルゴリズム

BPE (Byte-Pair Encoding) は Gage 1994 のデータ圧縮を Sennrich et al. 2016 (arXiv:1508.07909) が NMT 用サブワード分割に転用したもの。文字 n-gram 頻度に基づきコーパス中の最頻出シンボル対を反復マージし、マージ回数 = 語彙サイズのハイパーパラメータとなる。確率モデルを持たず純頻度ベースで確定的、長い頻出語は 1 トークン化、希少語は複数トークンに分割される。

Byte-level BPE は GPT-2 (Radford et al. 2019) の変種で、初期トークンを Unicode 文字でなく UTF-8 の 256 バイトに置く。全言語・コード・バイナリを [UNK] なしで表現でき、語彙 50,257 = 256 バイト + 50,000 マージ + 1 特殊トークン <|endoftext|> で構成。日本語・中国語は UTF-8 で 3 バイトのためマージが浅い場合 1 文字 = 複数トークンとなる構造的不利を抱える。GPT-3, GPT-4 (cl100k_base), GPT-4o (o200k_base) もこの系統。

WordPiece (Schuster & Nakajima 2012 / BERT, Devlin 2019 arXiv:1810.04805) はマージ選択を尤度最大化で行う。score(A,B)=freq(AB)/(freq(A)freq(B))\text{score}(A, B) = \text{freq}(AB) / (\text{freq}(A) \cdot \text{freq}(B)) で評価し、サブワードトークンに ## プレフィックス (play + ##ing) を付ける。BERT, DistilBERT, ALBERT, ELECTRA, mBERT で採用。BPE の純頻度ベースに対し「言語的に意味のある」分割を生む傾向がある。

Unigram Language Model (Kudo 2018, arXiv:1804.10959) は逆方向で、大語彙を初期化し EM で各サブワード確率を推定し低確率のものから目標サイズへ縮小する。推論はビタビ復号 (または確率的サンプリング) で、複数分割候補を訓練ノイズに使うサブワード正則化が可能。T5 (Raffel 2020, arXiv:1910.10683)、mT5、ALBERT、XLNet で採用。

SentencePiece (Kudo & Richardson 2018, arXiv:1808.06226) はアルゴリズムでなく実装ライブラリで内部に BPE/Unigram を選択可。最大の特徴は言語非依存の事前トークン化なしで、入力を生 Unicode として扱いスペースを特殊文字 (U+2581) に置換してサブワード内に組み込む。日本語・中国語・タイ語のようにスペース区切りのない言語でも事前分割が不要となりデトークン化も完全可逆。LLaMA-1/2 (SP-BPE 32k)、T5/mT5、NLLB、Mistral、Gemma が採用。

特殊トークンとチャットテンプレート

トークナイザは通常トークンに加え特殊トークンを語彙の先頭/末尾に固定 ID で割り当てる。BERT 系は [CLS][SEP][PAD][MASK][UNK]。GPT-2/3 は <|endoftext|> でドキュメント境界、LLaMA-3 は <|begin_of_text|> (BOS) と <|eot_id|> (ターン終端) を chat 用に追加、OpenAI/Qwen/MiniCPM の ChatML<|im_start|> <|im_end|> でロール境界を区切る。Mistral instruct は <s> + [INST][/INST]、T5/Gemma は <pad> <eos> 系統。

SentencePiece の byte_fallback は語彙外 Unicode を UTF-8 バイトの特殊トークン (<0xE6> 等) に分解し [UNK] を排除する。LLaMA-3 の語彙 128,256 のうち 256 個が byte-fallback、残りが学習済みマージ + 特殊トークン。チャットテンプレートは HuggingFace tokenizer_config.json 内に Jinja として格納され特殊トークンを対話形式へ展開する。これらの境界トークンはプロンプトインジェクションの最重要境界で、ユーザ入力中の <|im_start|> 等が安全フィルタを迂回しモデルにロールを誤認させうる。

埋め込み層と weight tying

トークン ID は埋め込み層 ERV×dmodel\mathbf{E} \in \mathbb{R}^{V \times d_{\text{model}}} で実数ベクトルに変換されモデル本体へ渡る (内部は one-hot × E\mathbf{E} と等価のルックアップ)。LLaMA-3 8B は 128,256×4,0965.25×108128{,}256 \times 4{,}096 \approx 5.25 \times 10^{8} = 約 524M、全体 8B の約 6.5%、70B は 128,256×8,1921.05128{,}256 \times 8{,}192 \approx 1.05B (全体の約 1.5%)。小モデルほど埋め込み比率は大きく 1B 級では 20% 超になる。sparse gradient のため分散学習の通信最適化が重要。

Weight tying (Press & Wolf 2017, arXiv:1608.05859) は入力埋め込みと出力 lm_head (dmodel×Vd_{\text{model}} \times V) を lm_head=E\text{lm\_head} = \mathbf{E}^\top で共有する節約手法。パラメータを 1 セット減らせ (LLaMA-3 8B なら ~524M 節約)、入出力の意味空間共有で PPL も改善するとの報告。GPT-2, T5, Gemma, BERT (MLM head) は tied、LLaMA-3 では 1B/3B が tied で 8B 以上は untied と技術レポートで明示。大語彙 + 大 dmodeld_{\text{model}} では表現力 > 節約の判断。

トークン化が引き起こす落とし穴

多言語コスト非対称性: Petrov et al. 2023 (arXiv:2305.15425, NeurIPS) は cl100k_base で同等意味の文を 11 言語比較し、英語を 1 とするとヒンディー語 ~8.9×、ビルマ語 ~9.5×、アルメニア語 ~7.7×、日本語・韓国語・ロシア語 ~3–4×、中国語 ~2–3× と報告。非英語ユーザは API 課金・実効コンテキスト長・推論レイテンシすべてが不利。LLaMA-3 の 32k→128k 拡大と GPT-4o の o200k は日本語・韓国語効率を改善。

数値のトークン化と算術: BPE/WordPiece は数値を一貫したルールで分割せず、12345["123", "45"]["12", "345"] 等実装依存。桁の概念がトークン境界と一致せず桁上がり推論が崩れる。Singh & Strouse 2024 (arXiv:2402.14903) がこの病理を体系化し、LLaMA-3 や近年の cl100k_base 改修では「数値を 1 桁ずつ独立トークン」設計が広がる。

Glitch token: Rumbelow & Watkins 2023 (LessWrong “SolidGoldMagikarp”)。BPE 訓練コーパスには出現したが LLM 事前学習にはほぼ現れない Reddit 由来文字列 ( SolidGoldMagikarp, petertodd 等) は埋め込みが初期化値近傍のまま放置され、推論時に異常出力・繰り返し・予測不能応答を誘発、安全フィルタ迂回に悪用された事例もある。

コードとインデント: 4 スペースインデントは旧トークナイザで 4 トークンに分割されたが、GPT-4o の o200k_base は " " " " 等のマルチスペーストークンを語彙に追加し Python 系効率を改善。

セキュリティ境界: Unicode 同型文字やゼロ幅文字 (U+200B, U+200C) はトークナイザとアプリのテキスト処理で扱いがずれ、人間に見えない文字列が特定トークン列に化けうる。チャットテンプレートタグ混入も含め、トークン境界はそのままセキュリティ境界として扱う。

コンテキスト長との関係

自己注意の O(n2)O(n^2) 計算量と KV キャッシュの線形スケールにおける nnトークン数で単語数でも文字数でもない。「1M トークン文脈」は 1M の token ID 列であり、英語で約 750k words、日本語 (cl100k 近似) では数十万〜百数十万文字相当と、言語による情報密度差がそのまま実効コンテキスト差として現れる。LLaMA-3 8B (base) 8,192、LLaMA-3.1 8B 128k、Gemini 1.5 Pro 1M すべてトークン基準。注意・KV キャッシュ・FlashAttention・GQA の詳細は Transformer §スケーリングと計算量。

モダンな潮流

語彙の大規模化: LLaMA-1/2 の 32k → LLaMA-3 の 128k で 4× 拡大。1 トークンあたり情報量が増え少ない forward pass で生成でき、非ラテン文字言語の効率も改善。代償は埋め込み肥大化と softmax コストで tied embeddings + 並列 LM head が標準実装。

バイトレベル/トークナイザフリー: ByT5 (Xue 2021, arXiv:2105.13626) は T5 をバイト列で学習し語彙 256 のみ。MegaByte (Yu 2023, arXiv:2305.07185) は可変長パッチに global + local の階層 Transformer。BLT (Pagnoni 2024, arXiv:2412.09871, Meta) はエントロピーベースで動的チャンク化しトークナイザなしで LLaMA-3 同等性能を達成と報告。

マルチモーダルへの一般化: ViT (Dosovitskiy 2020, arXiv:2010.11929) は画像を 16×1616 \times 16 パッチ → 1 トークンとして扱う。音声では Encodec (Défossez 2022, arXiv:2210.13438) が波形を VQ で離散トークン化し AudioLM/VALL-E が利用、動画は時間軸込みの 3D トークンを M-RoPE (Qwen2-VL) で扱う (Positional Encoding §多モーダル拡張)。「トークン = 自己注意の原子単位」抽象が画像・音声・動画・DNA まで広がるのが Transformer の汎用性の核心。

実用的な指針

  • API コスト見積もり: 課金はトークン数。tiktokencl100k_base/o200k_base をモデルに合わせ正確にカウント (gpt-4gpt-4o で異なる)。
  • 多言語アプリ: 日本語 prompt は英語の 2〜4 倍消費。LLaMA-3 (128k) や GPT-4o (o200k) は cl100k 比で日本語効率が大幅改善。
  • コード生成: o200k_base はマルチスペーストークンで Python に強く、同プロンプトで 10〜20% 減ることも。
  • 数値が多い用途: トークナイザが数値を 1 桁ずつ扱うモデル (LLaMA-3 系) を優先。検算ステップを明示。
  • コンテキスト: 「1M トークン」はトークン数。日本語は英語より少ない文字しか入らない点を見積りに織り込む。
  • 安全境界: ユーザ入力合成時、<|im_start|> <|endoftext|> 等の特殊トークン・ゼロ幅文字・同型文字を必ずサニタイズ。

二言語用語対照表

日本語English
トークン / サブワードToken / Subword
語彙 / 語彙サイズVocabulary / Vocabulary size
バイトペア符号化 / バイトレベル BPEBPE / Byte-level BPE
ワードピース / ユニグラム LMWordPiece / Unigram LM
センテンスピース / バイトフォールバックSentencePiece / Byte fallback
特殊トークン / チャットテンプレートSpecial token / Chat template
埋め込み層 / 重みタイイングEmbedding layer / Weight tying
グリッチトークンGlitch token
多言語コスト非対称性Tokenizer unfairness across languages

参考文献

Local graph