一文でまとめると: Token Embedding は内容特徴を、Positional Encoding は順序の手がかりを与えます。オリジナル Transformer は
d_modelを固定し、追加の射影を避けるために両者を加算します。結果は数学的に無損失な梱包ではなく、学習に使えるコンパクトな重ね合わせです。
14.1 すべてに先立つ二つの入力、一つの工程
第4章と第5章では、Transformerに入力を準備する二つのコンポーネントを取り上げました。
| 章 | コンポーネント | 目的 |
|---|---|---|
| 第4章 | Embedding | トークンIDをベクトルに変換する(意味情報) |
| 第5章 | Positional Encoding | 各ベクトルに位置情報を加える |
本章ではさらに一段深く踏み込みます。なぜこの二つのシグナルは連結ではなく加算で組み合わされるのでしょうか?
その答えには、いくつかの幾何学的直観、パラメータ数に関する議論、そしてニューラルネットワークが表計算ソフトではないという率直な認識が含まれます。
14.2 それぞれのシグナルの本質
14.2.1 トークン埋め込み: 意味情報
第4章で扱った埋め込みのルックアップテーブルを思い出してください。
各 Token には [vocab_size, d_model] の lookup table 内に学習可能な一行があります。訓練によって語彙的・統計的な特徴が入り、それを大まかに意味と呼んでいます。近傍関係はモデルごとに変わるため、次は保証ではなく直観です。
- 「蒔絵」と「螺鈿」は漆芸の技法として特徴を共有しやすい
- 「蒔絵」と「素数」は共有する特徴が少ないはず
埋め込みは次の問いに答えます。このトークンは何を意味するのか?
14.2.2 位置エンコーディング: 位置情報
第5章の正弦波方式は、sequence 内の各 index から位置依存のベクトルを計算します。
- 位置0は固有のベクトルを持つ
- 位置1は別のベクトルを持つ
- 位置15はさらに別のベクトルを持つ
位置エンコーディングは次の問いに答えます。このトークンはシーケンス内のどこに現れるのか?
14.2.3 なぜどちらも重要なのか
次の二つの文を考えてみましょう。
「蒔絵師が硯箱を修復した。」
「硯箱が蒔絵師を修復した。」
トークンは同じ。順序は異なる。意味はまったく違います。
Transformerは両方のシグナルを同時に必要とします。
- 各トークンが何であるか (Embedding)
- 各トークンがどこにあるか (Positional Encoding)
問題は、両者をどう組み合わせるかです。
14.3 加算 vs 連結
14.3.1 二つの選択肢
二つのベクトルを組み合わせる直観的な方法は二つあります。
選択肢1: Concat(連結)
input = [Embedding; Positional Encoding]
結果の次元: d_model + d_model = 2 × d_model
選択肢2: Add(加算)
input = Embedding + Positional Encoding
結果の次元: d_model (変わらず)
Transformerは加算を採用しています。なぜでしょうか?
14.3.2 連結への反論
連結はベクトルの幅を倍にしてしまいます。
仮に d_model = 512 なら、連結後は1024次元です。その先には二つの選択肢があります。
- 後段も1024次元のままにする: activation の幅は2倍になり、入力幅と出力幅の両方がモデル幅に従う正方行列の射影では、パラメータ数と行列積の仕事量がおよそ4倍になります。
- 1024次元から512次元へ射影する: これは有効な設計で、学習可能な融合が役立つ場合もあります。ただし
1024 × 512の射影が一つ増えます。
したがって、連結は数学的に誤りではなく、すべての tensor に一律の倍率が掛かるわけでもありません。加算は、追加射影も幅の広い Transformer stack も要らない、より安価な interface です。
加算はインターフェースをシンプルに保ちます。
[d_model] + [d_model] → [d_model]
下流のすべては、想定どおりの形状を受け取ります。
14.3.3 加算の擁護
1. 次元が膨らまない
モデル幅 d_model は、埋め込みレイヤーからTransformerスタック全体を通じて固定されたままです。すべてのブロック、すべての射影、すべての正規化レイヤーは同じ形状で動作します。この一貫性はアーキテクチャ的に美しいものです。
2. 両方のシグナルが結果に影響する
要素ごとの加算は、二つのシグナルを一つのベクトルに重ねます。
具体例:
embedding = [0.5, 0.3, -0.2, 0.8, ...] # 意味シグナル
position = [0.1, 0.0, 0.1, -0.1, ...] # 位置シグナル
combined = [0.6, 0.3, -0.1, 0.7, ...] # 両方の影響を受ける
これは無損失の梱包ではありません。異なる (embedding, position) の組が同じ和を作りうるため、combined だけから二つを一意に復元することは一般にはできません。訓練の目的は復元ではなく、予測に役立てることです。
3. 全体がこの interface に合わせて学習する
Token embedding と Attention の射影、そして学習型なら位置 embedding も一緒に適応します。二つの元ベクトルを完全に復元する必要はなく、共有表現から有用な attention pattern と予測を作れれば十分です。
14.3.4 ある類似
浮世絵を思い浮かべてください。主版の輪郭と色版の顔料は、横に紙を継ぎ足して別々に置くのではなく、同じ和紙へ順に摺り重ねます。見る人は、輪郭と色の組み合わせから一枚の絵を読み取ります。
完成した摺りから元の版木を一意に復元できるわけではありません。それでも鑑賞には困りません。ここでの加算も、これに近い役割です。
14.4 具体的な計算
14.4.1 ステップごとに
この図は、一つの次元だけを取り出した toy calculation です。算術を見やすくするため単純な SGD を使いますが、実際の訓練では AdamW などで多数のパラメータを同時に更新するのが一般的です。
訓練前 (順伝播):
embedding_value = 0.9 # トークン埋め込みのある一次元
positional_value = 0.1 # 位置ベクトルの同じ次元
combined_value = 0.9 + 0.1 = 1.0
訓練中 (SGD がこの embedding 値を更新すると仮定):
new_embedding_value = old_embedding_value - lr * gradient
= 0.9 - 0.1 * (-0.4)
= 0.9 + 0.04
= 0.94
次の順伝播:
new_combined_value = new_embedding_value + positional_value
= 0.94 + 0.1
= 1.04
14.4.2 重要な観察
このトレースから、三つの点が浮かび上がります。
- トークン埋め込みは学習可能 — 各訓練ステップで誤差逆伝播により更新される
- ここでの位置値は固定 — 元の Transformer の正弦波方式ではそうなるが、学習型の位置 embedding ならそれにも勾配が流れる
- 加算は順伝播のたびに行われる — 一度きりの前処理ではない
14.5 なぜこの設計が妥当なのか
14.5.1 一回の線形射影から見る
Token embedding を E、位置ベクトルを P、和を Z とします。
Z = E + P
Q = Z @ Wq = E @ Wq + P @ Wq
K = Z @ Wk = E @ Wk + P @ Wk
これは直交性の仮定ではなく、線形変換の分配法則です。訓練中に Wq と Wk が適応し、混合された入力を役立つ形へ変えます。
14.5.2 Attention には四種類の相互作用が見える
QKᵀ を展開すると、四つの項になります。
(E Wq)(E Wk)ᵀ # 内容-内容
(E Wq)(P Wk)ᵀ # 内容-位置
(P Wq)(E Wk)ᵀ # 位置-内容
(P Wq)(P Wk)ᵀ # 位置-位置
「内容と位置が別々の直交次元に収まる」と言うより、こちらの方が正確です。Attention は「蒔絵師」と「硯箱」の内容関係、語順と距離、そして identity と location の交差項まで利用できます。
14.5.3 正確な分離は必要ない
写像 (E, P) → E + P は多対一です。Attention は和から一意な E と P を一般には復元できません。しかし language model の目的は二つの入力表を復元することではなく、共同学習された signal から次の Token を予測することです。
14.6 バリエーション: さまざまな位置エンコーディング手法
14.6.1 元の手法: 固定された正弦波エンコーディング
input = Embedding(token_ids) + PositionalEncoding(positions)
2017年の元のTransformerは、固定された正弦波関数を使用しました。位置に関するパラメータは学習されません — エンコーディングは位置インデックスから決定論的に計算されます。
14.6.2 学習可能な位置埋め込み
GPT-1、GPT-2、GPT-3 は学習可能な絶対位置 embeddingを使います。後発の “GPT” を名乗るすべてのモデルや、すべての decoder-only Transformer が同じ方式だという意味ではありません。
import torch
from torch import nn
class TransformerInput(nn.Module):
def __init__(self, vocab_size, d_model, max_len, dropout=0.1):
super().__init__()
self.token_embedding = nn.Embedding(vocab_size, d_model)
self.position_embedding = nn.Embedding(max_len, d_model) # 学習される
self.dropout = nn.Dropout(dropout)
def forward(self, x):
# x: [batch_size, seq_len] トークンID
if x.size(1) > self.position_embedding.num_embeddings:
raise ValueError("sequence length exceeds max_len")
token_emb = self.token_embedding(x) # [batch, seq, d_model]
positions = torch.arange(x.size(1), device=x.device)
pos_emb = self.position_embedding(positions) # [seq, d_model]
combined = token_emb + pos_emb # [batch, seq, d_model]
return self.dropout(combined)
学習可能な位置 embedding は、手設計の周波数ではなく訓練データから位置 pattern を学べます。一方、lookup table には元来の最大 index があり、拡張には table の resize と追加訓練、または別の拡張法が必要です。この例は学習型絶対位置の流儀に合わせ、元の Transformer が別途使った Token embedding の √d_model 倍は混ぜていません。
14.6.3 RoPE: Rotary Position Embedding
より新しいモデルではRoPE (Rotary Position Embedding) を使うことがあり、これは異なるアプローチを採ります。位置ベクトルをトークン埋め込みに加算するのではなく、RoPEは位置に基づいてQとKベクトルに回転を適用します。
Q_rotated = rotate(Q, position)
K_rotated = rotate(K, position)
RoPE の性質:
- 絶対 index が回転角を決める一方、回転後の
Q·Kは相対的な位置差に明示的に依存する - residual stream に別の位置ベクトルを加えない
- LLaMA、GPT-NeoX、Mistral など、具体的な model family で採用されている
ただし RoPE は、任意の長さへ無調整で外挿できる保証ではありません。訓練 context を超える場合は、位置補間、周波数 scaling、追加訓練などが必要になることがあります。第25章で詳しく扱います。
14.6.4 アプローチの比較
| 種類 | 例 | 利点 | 欠点 |
|---|---|---|---|
| 固定正弦波 | 元の Transformer | 訓練長の外でも式を計算でき、位置 table の学習が不要 | 遠い位置を計算できても model の長文脈汎化は保証されない |
| 学習型絶対位置 | GPT-2、GPT-3 | data から位置 pattern を学習する | table に元来の範囲があり、拡張には resize と訓練が必要になりやすい |
| RoPE | LLaMA、Mistral | Q·K に相対位置差を組み込む | 長文脈化に scaling、補間、訓練が必要な場合がある |
| ALiBi | BLOOM | Attentionスコアへの加算バイアス | 標準的な加算とはインターフェースが異なる |
14.7 次元の追跡
入力 token_ids: [4, 16] # 4シーケンス、各16トークン
トークン埋め込み:
ルックアップ: token_embedding([4, 16])
出力: [4, 16, 512] # 各トークン → 512次元ベクトル
位置埋め込み:
位置: [0, 1, 2, ..., 15]
ルックアップ: position_embedding([16])
出力: [16, 512] # 各位置 → 512次元ベクトル
ブロードキャスト: [4, 16, 512] # バッチ方向に拡張
加算:
[4, 16, 512] + [4, 16, 512] = [4, 16, 512]
最終出力: [4, 16, 512] # 意味 + 位置、形状は同じ
形状は決して変わりません。下流のすべてのコンポーネントは [batch, seq, d_model] を見ます。
14.8 よくある質問
14.8.1 加算は情報を失わないのか?
数学的には、一意可逆性を失います。 和だけから一意な E と P は決まりません。
ただし、それは model の目的ではありません。Token 表現、位置 signal、後段の射影は、この和を前提に設計または共同学習されます。元の Transformer の実験も、この compact な interface が対象 task で機能することを示しています。
14.8.2 なぜ二つの signal の相対 scale が重要なのか?
位置エンコーディングの値がトークン埋め込みの値より大幅に大きいと、意味シグナルを圧倒してしまいます。
embedding = [0.5, 0.3, -0.2] # 意味
position = [10, 20, -15] # 位置 — 大きすぎる!
combined = [10.5, 20.3, -15.2] # ほとんど位置、意味がかき消される
scale が極端に違えば、大きい方が初期表現を支配しえます。ただし「位置 encoding は必ず小さくなければならない」という普遍則はありません。正弦波は [-1, 1] に収まり、元の Transformer は同時に Token embedding を √d_model 倍しています。学習型位置 embedding の scale は初期化と訓練で決まります。
14.8.3 学習型 vs 固定型: どちらが優れるか?
| 種類 | 利点 | 欠点 |
|---|---|---|
| 固定型(正弦波) | 訓練長の外にも位置ベクトルを生成でき、位置 parameter がない | 定義できることと、長文脈で有用なことは別 |
| 学習型絶対位置 | task の位置 pattern を学習できる | lookup table に固定の元来範囲がある |
| RoPE | attention score に相対位置差が直接現れる | 長文脈では適応が必要な場合がある |
普遍的な勝者はありません。元の Transformer 論文の翻訳実験では、学習型と正弦波方式の結果はほぼ同じでした。選択は architecture、訓練長、長文脈の目標に依存します。
14.9 章のまとめ
14.9.1 重要な概念
| シグナル | 出所 | 表すもの | 学習可能? |
|---|---|---|---|
| トークン埋め込み | 埋め込みルックアップテーブル | トークンの意味 | はい |
| 位置エンコーディング | 位置埋め込み / 正弦波関数 | シーケンス内の位置 | 手法による |
| 合成入力 | 両者の加算 | 意味 + 位置 | — |
14.9.2 なぜ加算で、連結ではないのか
- 次元の安定性:
d_modelがアーキテクチャ全体で固定される - 融合用の追加射影がない: 同じ幅のベクトルを直接 residual stream へ渡せる
- 相互作用を学べる: Attention は内容、位置、その交差項を利用できる
14.9.3 核心の要点
Token embedding は「何か」の手がかりを、位置 encoding は「どこか」の手がかりを与えます。元の Transformer は一つの
d_modelの中で両者を加えます。この和は可逆圧縮ではなく、根拠のない直交性も必要としません。parameter を増やさず形状を保ち、Attention が複数の有用な相互作用を学べる interface です。
章末チェックリスト
本章を終えたら、次のことができるようになっているはずです。
- トークン埋め込みと位置エンコーディングがそれぞれ何を表しているかを説明できる。
- 連結がモデルの幅を増やすこと、そしてそれがなぜ問題なのかを説明できる。
- 加算が一意可逆でなくても有用な理由を説明できる。
- Attentionが合成シグナルをどう使うかを説明できる。
- 位置エンコーディングのバリエーションを少なくとも三つ挙げ、それぞれのトレードオフを述べられる。
次章でお会いしましょう
これで、必要なピースはすべて揃いました。
- トークン埋め込み (第4章)
- 位置エンコーディング (第5章、本章で再訪)
- Q、K、V を備えたAttention (第9〜12章)
- 残差接続とDropout (第13章)
- 内容と位置を組み合わせる加算操作 (本章)
第15章ではこれらを組み立てて完全な順伝播を構成します — 生のテキストのシーケンスから出力確率に至るまでを、次元ごとに丁寧にトレースしていきます。それではまた次の章で、お会いしましょう。