第2章 トークン化:文章を数値の単位に分ける
こんにちは。ゆうせいです。
第1章では、Transformer Explainerで可視化されている処理の全体像を確認しました。第2章では、その入口にあたるトークン化を扱います。Transformer Explainerに文章を入力すると、まず画面の左端に、色分けされた小さな箱が並びます。これがトークンです。ここで注意深く見てほしいのは、その分割のされ方が、必ずしも単語ごとではないという点です。ある単語は一つの箱に収まり、別の単語は二つ、三つの箱に分かれます。なぜこのような、一見すると不揃いな分割をするのでしょうか。この章では、その理由と仕組みを解説します。
トークン化とは何か
トークン化(Tokenization)とは、文章を、モデルが扱える最小単位に分割する処理です。分割された一つひとつの単位を、トークンと呼びます。
Transformer Explainerの解説でも、テキスト入力はまずトークンと呼ばれる小さな単位に分割されると説明されています。トークンは、単語である場合もあれば、サブワードである場合もあります。
そして、各トークンには、あらかじめ決められた番号が割り当てられます。この番号をトークンIDと呼びます。
具体例で確認します。
「The cat sat」という文章を入力したとします。これは、次のように分割されるかもしれません。
「The」「 cat」「 sat」
それぞれに、たとえば464、3797、3332といった番号が割り当てられます。この時点で、文章は次のような数値の並びに変換されます。
464, 3797, 3332
この数値の並びが、モデルへの実際の入力です。ここから先、モデルの内部では、元の文字列は一切扱われません。
なぜ文字単位でも単語単位でもないのか
トークン化の方法として、素朴には二つの選択肢が考えられます。文字単位で分割する方法と、単語単位で分割する方法です。しかし、どちらにも問題があります。
文字単位で分割する場合の問題
英語であれば、アルファベット26文字と記号だけで、すべての文章を表現できます。語彙の数が非常に少なくて済むという利点があります。
問題は、系列が長くなりすぎることです。「visualization」という単語は、文字単位では13個のトークンになります。100語の文章が、500から600トークンになってしまいます。
第9章で扱いますが、自己注意の計算量は、トークン数の2乗に比例します。トークン数が5倍になれば、計算量は25倍になります。これは、実用上、大きな負担です。
また、文字1つには、意味らしい意味がありません。「c」という文字そのものに、意味を表すベクトルを割り当てても、あまり役に立ちません。
単語単位で分割する場合の問題
単語単位であれば、系列は短くなり、各トークンが意味を持ちます。一見すると理想的です。
問題は、語彙が無限に増えていくことです。英語の単語だけでも数十万語あり、そこに固有名詞、専門用語、新語、略語、タイプミスが加わります。
語彙の数が増えると、埋め込み行列(第3章で扱います)が巨大になり、モデルのパラメータ数が膨れ上がります。
さらに深刻なのが、未知語の問題です。学習時の語彙に含まれていない単語が入力されると、モデルはそれを処理できません。すべて「不明」という同じ扱いにするしかなく、情報が失われます。
新しい製品名、社内用語、人名など、実務で扱う文章には、未知語が頻繁に登場します。
サブワード分割という折衷案
そこで採られているのが、サブワード分割という方法です。
サブワードとは、単語より小さく、文字より大きい単位です。頻繁に登場する単語は、そのまま一つのトークンにします。あまり登場しない単語は、より小さな部品に分割します。
この方法により、次の三つが同時に成立します。
頻出する単語は1トークンで済むため、系列が極端に長くなりません。
語彙の数を、5万程度の現実的な数に抑えられます。
未知の単語が来ても、より小さな部品に分解すれば、必ず表現できます。少なくとも文字単位まで分解すれば、表現できない文字列はなくなります。
具体例で確認する
たとえば、次のような分割になります。
「cat」は頻出するため、1トークンです。
「visualization」は、頻度によっては「visual」と「ization」に分割されるかもしれません。
「Anthropic」のような固有名詞は、「An」「throp」「ic」のように、複数の部品に分割される可能性があります。
Transformer Explainerで、あえて珍しい単語や造語を入力してみると、この分割が実際に起きる様子を観察できます。長い専門用語を入力すると、一つの単語が3つも4つもの箱に分かれることが確認できます。
GPT-2が使うBPE(バイトペア符号化)
GPT-2で使われているサブワード分割の手法は、BPE(Byte Pair Encoding、バイトペア符号化)と呼ばれるものです。
BPEの語彙の作り方
BPEは、学習データから、次の手順で語彙を作ります。
手順1として、まずすべての文章を、最小の単位(バイトまたは文字)に分解します。この時点での語彙は、文字の集合だけです。
手順2として、分解されたデータの中で、隣り合って登場する回数が最も多いペアを探します。たとえば「t」と「h」が隣り合う回数が最も多かったとします。
手順3として、そのペアを結合し、「th」という新しい単位を語彙に追加します。
手順4として、手順2と手順3を、語彙が目標の数に達するまで繰り返します。
この繰り返しにより、頻繁に登場する文字の並びが、順に一つの単位としてまとめられていきます。結果として、頻出する単語は一つのトークンになり、まれな単語は部品の組み合わせで表現されるという語彙ができあがります。
GPT-2の語彙の規模
GPT-2の語彙数は、50257個です。この内訳は、BPEによって学習された50000個の語彙、256個のバイト単位のトークン、そして文章の終わりを表す特殊トークン1個です。
バイト単位のトークンが含まれている点が重要です。これにより、どんな文字列が入力されても、必ず何らかのトークンの並びとして表現できることが保証されます。未知語によって処理が破綻することがない、という設計になっています。
実務でつまずきやすい点
つまずき1:空白がトークンに含まれる
GPT-2のトークン化では、単語の前の空白が、トークンの一部として扱われます。
つまり、「cat」と「 cat」(先頭に空白がある)は、別々のトークンIDを持ちます。
この仕様を知らないと、「同じ単語なのに、文中の位置によって違うIDになる」という現象に混乱します。文頭の単語と文中の単語で、IDが異なる場合があるのです。
Transformer Explainerで、同じ単語を文頭と文中の両方に入れてみると、この違いを確認できます。
つまずき2:日本語は分割の効率が悪い
GPT-2は、主に英語のデータで学習されたモデルです。そのため、日本語を入力すると、非常に細かく分割されます。
日本語の一文字が、複数のトークンに分割されることもあります。これは、日本語の文字がUTF-8では複数バイトで表現されるためです。
結果として、同じ意味の内容でも、日本語のほうが英語よりトークン数が多くなります。この差は、次の三つの実務的な影響を生みます。
一つ目は、コンテキスト長の制約です。扱えるトークン数に上限があるモデルでは、日本語のほうが、実質的に扱える文字数が少なくなります。
二つ目は、API利用料金です。多くの生成AIのAPIは、トークン数に応じて課金されます。日本語のほうが、同じ内容でも料金が高くなる傾向があります。
三つ目は、処理速度です。トークン数が多いほど、計算量が増えます。
なお、この点は、モデルによって大きく異なります。近年の多言語対応モデルでは、日本語のトークン化効率が改善されているものもあります。実務でモデルを選定する際は、扱う言語での分割効率を、実際に確認することを推奨します。
つまずき3:トークン数と文字数を混同する
「4000文字までの文章を扱える」といった説明を、そのまま信じてはいけません。制約はトークン数であり、文字数ではありません。
英語であれば、おおよそ1トークンが4文字程度に相当すると言われます。日本語では、この比率が大きく異なります。
正確に把握したい場合は、実際にトークナイザーを使って数えるのが確実です。
演習:トークン化を実際に試す
演習1:Transformer Explainerで観察する
Transformer Explainerに、次の三つの文章を順に入力し、トークンの分割のされ方を比較してみてください。
一つ目は、日常的な単語だけの短文です。たとえば「The cat sat on the mat」です。
二つ目は、長い専門用語を含む文です。たとえば「Data visualization powers understanding」です。
三つ目は、存在しない造語を含む文です。適当なアルファベットの並びを入れてみてください。
それぞれについて、いくつのトークンに分割されたか、どの単語が複数のトークンに分かれたかを記録してください。
演習2:Pythonで確認する
より正確に確認したい場合は、Pythonのライブラリを使います。
from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
texts = [
"The cat sat on the mat",
"Data visualization powers understanding",
"こんにちは、今日はいい天気ですね"
]
for text in texts:
tokens = tokenizer.tokenize(text)
ids = tokenizer.encode(text)
print(f"入力: {text}")
print(f"トークン: {tokens}")
print(f"トークンID: {ids}")
print(f"トークン数: {len(ids)}")
print("---")
実行前に、次のコマンドでライブラリをインストールしてください。
pip install transformers
このコードを実行すると、英語と日本語で、トークン数がどれだけ違うかが明確に分かります。日本語の文章が、想像以上に多くのトークンに分割されることを、実際に確認してみてください。
演習の解答例と解説
演習2を実行すると、たとえば次のような傾向が観察されます。
英語の短文「The cat sat on the mat」は、6語に対して、おおむね6トークン程度になります。日常的な単語ばかりであるため、1語1トークンに近い分割です。
「visualization」のような長い単語を含む文では、単語数よりトークン数が多くなります。
日本語の文章では、文字数に対して、トークン数が同程度か、それ以上になることが確認できます。
この結果から、「トークン数は、言語と語彙の頻度に強く依存する」という結論が導けます。
講師向けの補足
研修でこの章を扱う際は、受講者に実際にツールを操作させる時間を、必ず確保してください。
トークン化は、概念としては単純ですが、「同じ単語でも空白の有無でIDが変わる」「日本語は細かく分割される」といった細部は、説明を聞くだけでは記憶に残りません。自分で入力し、意外な分割結果を見て驚くという体験が、理解を定着させます。
また、受講者から「なぜサブワードという中途半端な単位なのか」という質問が出た場合は、文字単位と単語単位の両方の欠点を、具体的な数値とともに示すのが有効です。極端な二つの案の問題点を先に提示すると、折衷案の必要性が納得されやすくなります。
理解度を確認する問い
第2章の内容を、次の問いで確認してみてください。
文字単位でトークン化する方法と、単語単位でトークン化する方法には、それぞれどのような問題があるでしょうか。
BPEが、頻出する単語を1トークンにまとめられるのは、どのような手順によるものでしょうか。
同じ内容の文章でも、日本語のほうが英語よりトークン数が多くなることは、実務においてどのような影響を及ぼすでしょうか。三つ挙げてください。
まとめ
トークン化とは、文章をモデルが扱える最小単位に分割し、それぞれに番号を割り当てる処理です。この処理を経て、文章は数値の並びに変換され、以降の計算はすべてこの数値に対して行われます。
文字単位の分割は系列が長くなりすぎ、単語単位の分割は語彙が膨大になり未知語に対応できません。その折衷案が、サブワード分割です。
GPT-2では、BPE(バイトペア符号化)という手法が使われており、語彙数は50257個です。頻出する文字の並びを順に結合していくことで語彙が構築され、バイト単位のトークンを含むことで、どんな文字列でも表現できるように設計されています。
実務上は、空白がトークンに含まれること、日本語の分割効率が英語より悪いこと、トークン数と文字数は異なることの三点に注意が必要です。
次の第3章では、ここで得られたトークンIDを、意味を表す数値のベクトルに変換する処理、すなわちトークン埋め込みを扱います。単なる番号でしかなかったトークンIDが、どのようにして「意味」を持つようになるのかを解説します。
第3章に進む前に、Transformer Explainerで、トークンの箱をクリックしてみてください。そのトークンに対応する数値が、画面のどこに現れるかを確認しておくと、次章の内容がつながりやすくなります。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。
最新の投稿
新人エンジニア研修講師2026年8月10日第14章 出力層:ロジット、Softmax、そして温度パラメータ
新人エンジニア研修講師2026年8月10日第13章 MLP層とGELU:トークンごとの情報を加工する
新人エンジニア研修講師2026年8月10日第12章 レイヤー正規化:値のばらつきを揃えて学習を安定させる
新人エンジニア研修講師2026年8月10日第11章 残差接続:入力をそのまま足し合わせる仕組み
