Skip to main content
単一モデル トークナイザー

テキストトークナイザー

OpenAI、Llama、Qwen、DeepSeek における Byte-Pair Encoding (BPE) エンコーディング、トークンセグメンテーション、文字効率、UTF-8 生バイトマッピングを探索。

Try Sample:
Tokens 0
Characters 0
Words 0
Bytes (UTF-8) 0

Input Prompt

Token Segments

Token segments will appear here as you type…
Token ID Sequence
Numeric token IDs…
Developer Actions & Share
数学的およびアーキテクチャの徹底解説

テキストトークン化とバイト対符号化 BPE の徹底解説

大規模言語モデルがバイト対符号化(Byte Pair Encoding)、頻度順のマージルール、高次元埋め込み射影を通じて、未加工のUnicodeテキストを離散的なサブワードトークンベクトルへと変換する仕組みを、線形代数とアルゴリズムの観点から段階的に解説します。

トークン化と語彙次元の早見表

標準LLMトランスフォーマー構成
基本語彙数
256 バイト
未加工UTF 8ストリーム
cl100k 語彙数
100,277
GPT 4 および GPT 3.5
o200k 語彙数
200,019
GPT 4o および o1 モデル
圧縮比率
約0.75 単語/トークン
英語自然文基準
BPEマージ則
argmax(u,v)
最高頻度ペア統合
埋め込みベクトル
d = 4096
連続隠れ次元空間
01

未加工のUnicode文字からバイトレベルBPEへの変換

ステップ1: サブワード分割

トランスフォーマーは生のテキスト文字を直接読み取るわけではありません。数学的にはトークンと呼ばれる離散的な整数IDの配列を処理します。完全な単語単位の辞書では未知語に対応できず、文字単位の分割では文章が過剰に長くなって自己注意機構の2乗計算量が急増してしまいます。

バイトレベルのByte Pair Encoding(BPE)は、256個のUTF 8バイトを最小単位として出発し、学習データ内で最も頻繁に出現する隣接シンボルのペアを反復的に統合することで、この課題を完全に解決します。

貪欲法によるBPEマージアルゴリズム:
  1. テキスト文字列を個別のUTF 8バイト列へと分解する。
  2. コーパス全体で隣接するすべてのシンボルペアの出現回数を集計する。
  3. 最も出現頻度が高いペアを1つの新しいトークンとしてマージする。
  4. 指定された語彙サイズVに到達するまでこの手順を繰り返す。
サブワードマージの流れ ステップ 1
入力テキスト: "tokenization"
UTF 8バイト列: [116, 111, 107, 101, 110, 105, 122, 97, 116, 105, 111, 110]
マージ1: ('t', 'o') → "to" (ID: 1542)
マージ2: ('k', 'e', 'n') → "ken" (ID: 8931)
マージ3: ("to", "ken") → "token" (ID: 11241)
最終分割: ["token", "ization"]
12バイトの生データがわずか2個のトークンに圧縮されます。
02

BPE圧縮効率指標と語彙サイズのトレードオフ

数式: r_comp = N_chars / N_tokens

トークナイザーの性能は圧縮率によって定量化されます。つまり1つの出力トークンの中に平均してどれだけの文字や単語が収まっているかを示します。

語彙サイズを32,000(Llama 1初期)から100,277(GPT 4 cl100k)、さらに200,019(GPT 4o o200k)へと拡張することで、系列長の大幅な削減が実現されました。系列長が短縮されると自己注意機構の2乗計算負荷が劇的に低下し、推論速度が著しく向上します。

巨大語彙の利点:

系列長が短くなりコンテキスト消費が半減。API利用料が低減し、日本語や中国語、プログラミング言語での処理効率が劇的に改善されます。

巨大語彙の課題:

埋め込みテーブルのサイズが拡大しGPUのVRAMを消費。パラメータ数は入力層と最終Softmax層でV掛けるd_modelだけ増大します。

圧縮率の計算式 ステップ 2
r_comp = |S_text| / |Tokens(S_text)|
圧縮比率が高いほど、同じ文章を表現するトークン数が少なくなります。
英語散文 (o200k): 4.4 文字/トークン
Pythonコード (o200k): 3.8 文字/トークン
多言語テキストの改善幅: cl100k比較で最大30%削減
03

離散トークンIDから高次元の連続埋め込みベクトルへ

射影: E = W_embed[id] ∈ ℝd

BPEアルゴリズムによってテキストが整数の配列に変換された後、各トークンIDはトランスフォーマーの第1自己注意層へ渡すために連続ベクトルへと射影されます。

1. 埋め込みルックアップテーブル:

サイズがV掛けるd_modelの学習可能な重み行列W_embedであり、各行が1つのトークンの意味的表現を格納します。

2. 位置情報のエンコーディング:

トランスフォーマー自身には順序の概念がないため、正弦波の位置埋め込みや回転位置埋め込み(RoPE)が加算され、語順を識別可能にします。

3. 入力テンソル x_0:

合成された入力テンソル x_0 = W_embed[id] + pos_emb が、最初のクエリ・キー・バリュー射影層へと渡されます。

入力埋め込みテンソル ステップ 3
X_in = EmbeddingLookup(Tokens, W_embed) + P
語彙サイズ V: 200,019 トークン
隠れ層次元数 d: 4,096 次元
埋め込みパラメータ総数: 約8億1900万パラメータ
04

主要モデルファミリーのトークナイザー比較表

技術仕様ベンチマーク
モデル系列 トークナイザー名称 語彙サイズ 基礎アルゴリズム コード圧縮効率 日本語・多言語効率
GPT 4o および o1 o200k_base 200,019 バイトレベルBPE 極めて高い 極めて高い(+30%向上)
GPT 4 および GPT 3.5 cl100k_base 100,277 バイトレベルBPE 高い 標準的
Llama 3 および Llama 3.1 tiktoken-llama 128,256 Tiktoken BPE 極めて高い 非常に高い
Gemma 2 および Gemma SentencePiece 256,000 Unigram / BPE 高い 極めて高い
GPT 2 r50k 50,257 初期BPE 低い 非常に非効率(1文字数トークン)
05

本番実装コード例: Tiktokenによるトークン境界の検証

実行環境: Python 3.10+
bpe_tokenizer.py tiktoken fast bpe
import tiktoken

def inspect_token_boundaries(prompt: str, encoding_name: str = "o200k_base"):
    enc = tiktoken.get_encoding(encoding_name)
    token_ids = enc.encode(prompt)
    
    print(f"入力テキスト: {prompt}")
    print(f"総トークン数: {len(token_ids)}")
    print(f"圧縮比率: {len(prompt) / len(token_ids):.2f} 文字/トークン\n")
    
    print("各トークンの境界とバイト表現:")
    for i, token_id in enumerate(token_ids):
        raw_bytes = enc.decode_single_token_bytes(token_id)
        print(f"  トークン [{i:02d}] ID: {token_id:<6} -> {raw_bytes}")

sample_text = "LLM Matrix Lab: バイト対符号化の高度な解析ツール"
inspect_token_boundaries(sample_text)
06

エンジニアリングFAQ(よくある質問)

設計の疑問点

絵文字や特殊文字が複数のトークンに分割されるのはなぜですか?

絵文字や珍しい記号はUTF 8において3から4バイトを要します。語彙の学習コーパスにおいてその絵文字自体が独立した単一トークンとしてマージされていない場合、個々のバイト値に分解され最大4個のトークンを消費することになります。

特殊トークン <|endoftext|> の役割は何ですか?

これは文書の終端や対話ターンの境界をモデルに伝える制御用マーカーです。通常のバイトマージで生成されるのではなく、語彙テーブルに意図的に登録された特別な境界識別子として機能します。

単語の先頭の空白がトークンに含まれる理由は何ですか?

現代のサブワードトークナイザーは、先行する空白文字を後ろの単語と一体化して登録します(例: " world")。これにより、単語間の半角スペースのためだけに独立したトークンを消費する無駄を防ぐことができます。

トークン分割はモデルの算術計算精度にどのような影響を与えますか?

大きな数値が不規則な桁数のブロックに分断されると、自己注意層は計算を行う前にまず各位の数値を再構築しなければならず、算術処理における誤答や幻覚を引き起こす要因となります。

アーキテクチャの重要ポイント

バイトレベルのBPEは、可変長の自然言語文字列とトランスフォーマーの固定次元テンソル計算とを結ぶ不可欠な架け橋です。語彙サイズと系列長とのバランスを最適化することにより、未知語によるクラッシュを完全に排除しつつ、日本語やプログラミング言語など多様なデータにおいて最高水準の推論効率を実現しています。

matrix