トークンと埋め込み——BPE と意味のベクトル空間
レッスン6:トークンと埋め込み——BPE と意味のベクトル空間
このレッスンで学ぶこと
- トークナイザーの役割を「文字列を数値化する仕組み」として理解する
- Byte Pair Encoding(BPE)と SentencePiece の発想を、頻出ペアの逐次結合として把握する
- 語彙サイズの設計と、日本語トークナイザの特殊事情を押さえる
- 埋め込み(embedding)ベクトルの意味と、「king − man + woman ≈ queen」の直観を理解する
- Transformer の入力側(token embedding + position embedding)を組み立てられる
前回のレッスン 5 では、Transformer の中核である Self-Attention と QKV を扱いました。今回は、その Transformer に「文字列がどうやって入力されるのか」という前段の話に踏み込みます。文字列をトークンに分割するトークナイザーと、トークンをベクトルに変換する埋め込みは、モデルの性能を静かに支えている縁の下の力持ちです。「king − man + woman ≈ queen」というよく知られた直観を軸に、埋め込み空間の性質を見ていきます。
モデルは「数値」しか扱えない
ニューラルネットワークは、内部でひたすら数値の掛け算と足し算を繰り返しています。「Transformer」という文字列そのものを、モデルは直接理解できません。何らかの方法で、文字列を数値の並びに変換する必要があります。この変換を担うのが、トークナイザー(tokenizer)と埋め込み(embedding)の 2 段構えです。
- トークナイザー:文字列を「トークン」という小さな単位に分割し、それぞれに ID 番号を振る
- 埋め込み:ID 番号を、意味的な情報を持ったベクトル(数百〜数千次元の数値の並び)に変換する
この 2 段を通じて、文字列がモデルの入力ベクトルに変換されます。
トークナイザー——文字列を「トークン」に分割する
トークン(token)は、モデルが処理する最小単位のことです。トークンは単語 1 個の場合もあれば、単語の一部(サブワード、subword)の場合も、あるいは文字 1 個の場合もあります。トークナイザーの設計選択は、モデルの語彙・学習効率・多言語対応に直接影響します。
単純な分け方の問題点
「単語ごとに分ければいい」と考えるかもしれませんが、この方式は次の 3 つの問題を抱えます。
- 語彙が爆発的に増える:世界の言語には数十万〜数百万の異なる単語がある
- 未知語に弱い:訓練データにない単語(新語・造語・専門用語)を扱えない
- 言語ごとに設計が変わる:多言語モデルを作りにくい
一方、「1 文字ずつ分ける」方式もあります。語彙は小さくなりますが、1 文字ずつでは意味の単位が細かすぎて、モデルが文脈を学ぶのが難しくなります。
サブワード分割——単語と文字の中間
現代の LLM で主流になっているのは、単語と文字の中間の「サブワード分割」です。頻出する単語はそのまま 1 トークン、稀な単語は複数のサブワードに分けて表現します。例えば「unhappiness」を「un + happi + ness」の 3 つに分ける、といったイメージです。
サブワード分割のメリットは 3 つあります。第 1 に、語彙サイズを数万〜十数万に抑えられます。第 2 に、未知語も既知のサブワードの組み合わせで表現できます。第 3 に、言語ごとの特殊性を吸収しやすく、多言語モデルに向いています。
BPE——頻出ペアを逐次結合していく
サブワード分割の代表的な手法が Byte Pair Encoding(BPE、バイトペア符号化)です。もともとはデータ圧縮アルゴリズム(1994 年、Philip Gage)でしたが、2016 年に自然言語処理へ応用され、以降の LLM で広く使われています。
BPE の学習手順は、次のようなイメージです。
flowchart TB
A[文字列を 1 文字ずつに分割<br/>l o w e r] --> B{隣接ペアの頻度を数える<br/>l-o, o-w, w-e, e-r ...}
B --> C[最頻ペアを 1 トークンに結合<br/>例: e-r → er]
C --> D{語彙サイズが<br/>目標に達したか?}
D -->|まだ| B
D -->|達した| E[語彙表と分割規則の完成]
- まず、すべての単語を「1 文字ずつ」の並びに分割します
- 訓練データ全体で、隣接する 2 文字のペアの頻度を数えます
- 最も頻度の高いペアを、1 つの新しいトークンとして結合します(例:「e」「r」→「er」)
- 語彙サイズが目標(例:3 万や 5 万)に達するまで、2 と 3 を繰り返します
学習後は、この語彙表を使って新しい文字列を分割します。「happy」は「happ」+「y」、「happier」は「happ」+「ier」のように、共有される部分を活かして効率的にトークン化されます。
💡 ポイント BPE の発想は「頻繁に一緒に現れる文字は、1 トークンにまとめてしまえ」というシンプルなものです。この単純さが、多言語・多分野への適応力の源になっています。
SentencePiece——空白のない言語にも対応
BPE は英語のように「単語が空白で区切られている言語」を前提にした設計が主でしたが、日本語・中国語・タイ語のように「単語の切れ目が明示されない言語」には工夫が必要です。ここで登場するのが Google の SentencePiece(2018 年)です。SentencePiece は、空白も特別な記号として扱い、生のテキストからサブワード分割を学習できる汎用ツールキットです。
日本語の場合、「東京」「駅前」「オフィス」といった連続文字列を、どこで区切ってトークン化するかは自明ではありません。SentencePiece はこの問題を、統計的なサブワード学習でうまく吸収します。多くの日本語 LLM や多言語 LLM で採用されています。
日本語トークナイザの特殊事情
日本語には、英語と異なる特殊事情がいくつかあります。
- 漢字の多様性:常用漢字だけで 2,000 字以上、常用外を含めると数万字。1 字の重みが大きい
- かな・カナ・漢字の混在:「トウキョウ」「東京」「とうきょう」は同じ意味だが表記が違う
- 文字数と意味量の対応の複雑さ:「京」1 文字にも意味がある一方、「あ」1 文字だけでは意味がない
これらの特殊事情のため、英語 LLM をそのまま日本語に流用すると、トークン数が英語比で 2 〜 3 倍に膨らむことがあります。トークン数はコストとレイテンシに直結するため、日本語対応 LLM では日本語専用のトークナイザ設計が重要になります。
埋め込み——意味を持ったベクトルへの変換
トークナイザーで文字列を ID 番号の並びに変換したら、次はその ID を「意味を持ったベクトル」に変換します。これが埋め込み(embedding)です。埋め込みは、各トークンに数百〜数千次元のベクトルを割り当てる仕組みで、学習によってこれらのベクトルの数値が調整されていきます。
「king − man + woman ≈ queen」の直観
埋め込み空間の性質を象徴的に示すのが、「king − man + woman ≈ queen」という関係式です。単語ベクトルを空間内の点として扱うと、「king」から「man」の方向を引き、「woman」の方向を足すと、「queen」の近くに到達する——という不思議な性質が現れます。
flowchart LR
K[king] -->|- man| A[中間点]
A -->|+ woman| Q[queen 近傍]
この関係は、単語ベクトルが「意味の関係」を空間の中に幾何学的に埋め込んでいることを示しています。「男性・女性」の軸、「王族・平民」の軸のように、意味の次元がベクトルの座標として立ち現れているのです。この性質は 2013 年の Word2Vec(Tomas Mikolov ら、Google)で広く知られるようになり、以降の埋め込み技術の礎になりました。
「近い=意味が近い」の含意
埋め込み空間では、意味が近い単語は空間内でも近く、意味が遠い単語は遠く配置されます。近さは通常、コサイン類似度(cosine similarity、2 つのベクトルのなす角度から計算する類似度)で測ります。「犬」と「猫」は近く、「犬」と「哲学」は遠い、という感覚が、埋め込み空間の中で数値化されます。
この性質は、実務でも大きな価値を持ちます。
- 検索:クエリと文書を同じ埋め込み空間に置き、近いものを取り出す(ベクトル検索)
- 推薦:ユーザーが好きなアイテムに近いものを見つける
- 分類:カテゴリごとの代表ベクトルとの近さで判定する
- 重複検出:似た内容の文書を空間内の近さで見つける
これらは埋め込み技術の応用として、生成 AI の時代でも活躍しています。
📝 補足 単語単位の埋め込みが Word2Vec でしたが、現代の LLM では「文脈依存の埋め込み」に発展しています。同じ単語でも文脈によって埋め込みベクトルが変わるため、「銀行(金融)」と「銀行(川岸)」を区別できるようになりました。これは Transformer の Self-Attention が果たす重要な役割でもあります。
Transformer の入力側——token embedding + position embedding
Transformer の入力側は、2 種類の埋め込みを足し合わせて構成されます。
- token embedding(トークン埋め込み):各トークンの意味を表すベクトル
- position embedding(位置埋め込み):文中の位置を表すベクトル
Self-Attention は並列処理で順序情報を扱えないため、位置埋め込みで順序を注入します。この 2 つの埋め込みを足し合わせて、Transformer の各層に入力されるベクトルが完成します。
Transformer のなかで最も直感に反する部分の 1 つが、この「意味と位置を単純に足し算する」設計です。感覚的には別の情報を混ぜているように思えますが、実際にはこれで十分機能します。ベクトルの高次元性が、意味と位置の情報を分離可能な形で共存させているのです。
語彙サイズの設計トレードオフ
トークナイザーの語彙サイズは、モデル設計の重要な選択です。トレードオフを整理しておきます。
| 語彙サイズ | メリット | デメリット |
|---|---|---|
| 小さい(1 万程度) | 埋め込み層のパラメータが少ない、稀な単語も既知の部品で表現できる | 1 文で必要なトークン数が増え、Self-Attention のコストが増える |
| 中程度(3 〜 5 万) | 一般的なバランス、多くの LLM の標準的な範囲 | 極端な最適化を求めない場合の無難な選択 |
| 大きい(10 万以上) | 頻出単語を 1 トークンで扱え、トークン数を抑えられる | 埋め込み層のパラメータが増え、稀語で無駄な語彙が増える |
近年の LLM は、多言語対応のため 10 万〜 20 万のトークン語彙を持つものが増えています。日本語 LLM でも、日本語をなるべく少ないトークンで扱えるよう、語彙サイズと構成の工夫が続けられています。
まとめ
このレッスンでは、以下のことを学びました。
- モデルは文字列を直接扱えず、トークナイザーで数値化し、埋め込みでベクトルに変換すること
- 現代の LLM は単語と文字の中間である「サブワード分割」を採用し、BPE や SentencePiece が代表的手法であること
- BPE は「頻出する隣接ペアを逐次結合する」シンプルな発想で、多言語・多分野に強いこと
- 日本語トークナイザは漢字・かな・カナの混在などの特殊事情に対応する必要があること
- 埋め込みは各トークンを数百〜数千次元のベクトルに変換し、「king − man + woman ≈ queen」のような意味的関係が空間の中に埋め込まれること
- Transformer の入力側は token embedding + position embedding の足し算で構成され、意味と位置を単純に混ぜても機能すること
次のレッスンでは、Transformer で組み立てた LLM が、どのように「言葉を話せるようになる」のかを扱います。事前学習と Post-training(SFT・RLHF・DPO・Constitutional AI)の役割分担を、パイプライン全体で見ていきます。
確認クイズ
このレッスンの理解度をチェックしましょう。