はじめに
Transformerアーキテクチャは、現代の大規模言語モデル(LLM)の基盤となる革新的なモデルです。本解説では、入力されたシーケンス(プロンプト)がどのように処理され、最終的なデコーダ出力に至るかを、具体的なデータとともに詳細に説明します。トークンの分割、多次元ベクトルへの変換、データの変換プロセスなど、各ステップを専門家の視点から深堀りします。
1. トークン化(Tokenization)
1.1. テキストの分割
まず、入力テキストがトークン化されます。トークン化とは、連続したテキストを「トークン」と呼ばれる基本単位に分割するプロセスです。トークンの単位は単語、サブワード、あるいは文字レベルなど様々です。一般的なLLMでは、BPE(Byte Pair Encoding)やWordPieceといったサブワードベースのトークナイザーが用いられます。
例:
入力テキスト:
"Transformerモデルは強力です。"
トークン化後(仮想的なサブワードトークン例):
["Transform", "er", "モデル", "は", "強力", "です", "。"]
1.2. トークンIDへのマッピング
各トークンは、事前に定義された語彙(Vocabulary)に基づいて一意の整数IDにマッピングされます。語彙はモデルの訓練時に構築され、通常は数十万から数百万のトークンを含みます。
例:
"Transform" -> 12345
"er" -> 67890
"モデル" -> 23456
"は" -> 34567
"強力" -> 45678
"です" -> 56789
"。" -> 67891
トークンID列:
[12345, 67890, 23456, 34567, 45678, 56789, 67891]
2. 埋め込み(Embedding)
2.1. トークン埋め込み
トークンIDは、埋め込み層(Embedding Layer)を通じて高次元のベクトルに変換されます。埋め込み層は、語彙のサイズ × 埋め込み次元の重み行列を持ち、各トークンIDはこの行列の対応する行ベクトルとして表現されます。
例:
- 語彙サイズ: 100,000
- 埋め込み次元: 768
各トークンIDは、768次元のベクトルにマッピングされます。
ID 12345: [0.12, -0.34, ..., 0.56] (768次元)
ID 67890: [0.78, 0.23, ..., -0.45] (768次元)
...
トークン埋め込み行列:
[
[0.12, -0.34, ..., 0.56], # ID 12345
[0.78, 0.23, ..., -0.45], # ID 67890
...
]
2.2. 位置埋め込み(Positional Embedding)
Transformerはシーケンス内のトークンの順序情報を持たないため、位置埋め込みが追加されます。位置埋め込みは、各トークンの位置に応じたベクトルを加算することで、順序情報をモデルに提供します。
例:
シーケンスの長さ: 7
位置埋め込み行列(各位置に対して768次元)
位置0: [0.01, 0.02, ..., 0.07]
位置1: [0.08, 0.09, ..., 0.14]
...
位置6: [0.43, 0.44, ..., 0.49]
各トークン埋め込みに対応する位置埋め込みを加算:
トークン埋め込み(ID 12345) + 位置0埋め込み = [0.13, -0.32, ..., 0.63]
トークン埋め込み(ID 67890) + 位置1埋め込み = [0.86, 0.32, ..., -0.31]
...
3. エンコーダ-デコーダアーキテクチャ(Transformer Architecture)
Transformerには主にエンコーダとデコーダの2つの部分がありますが、LLM(例えばGPTシリーズ)はデコーダのみを積み重ねた構造を持つことが一般的です。ここでは、一般的なデコーダのみのTransformerを例に説明します。
3.1. デコーダブロックの構成
デコーダブロックは、以下の主要なコンポーネントから構成されます:
- 自己注意機構(Self-Attention Mechanism)
- マルチヘッド注意機構(Multi-Head Attention)
- フィードフォワードネットワーク(Feed-Forward Network)
- 残差接続と層正規化(Residual Connections and Layer Normalization)
これらが複数層(通常12層から数百層)積み重ねられています。
3.2. 自己注意機構(Self-Attention Mechanism)
自己注意機構は、各トークンがシーケンス内の他のトークンとどのように関連しているかを学習します。これにより、文脈情報を効果的に捉えることができます。
計算ステップ:
- クエリ、キー、バリューの計算:
- 各トークン埋め込みベクトルを3つの異なる重み行列(W_Q, W_K, W_V)で線形変換し、クエリ(Q)、キー(K)、バリュー(V)を生成します。
Q = X * W_Q
K = X * W_K
V = X * W_V
ここで、Xは入力の埋め込みベクトル行列(シーケンス長 × 埋め込み次元)、W_Q, W_K, W_Vは埋め込み次元 × 注意ヘッドあたりの次元の重み行列。
- 注意スコアの計算:
- クエリとキーの内積を計算し、スケーリング(通常は√d_kで割る)して注意スコアを得ます。
Attention_Score = (Q * K^T) / sqrt(d_k)
- マスクの適用(因果マスク):
- デコーダでは因果マスク(未来のトークンへの情報流出を防ぐマスク)を適用します。これにより、各トークンは自身以前のトークンのみを参照できます。
Attention_Score = Attention_Score + Mask
- ソフトマックスと重み付き和:
- ソフトマックス関数を適用して注意重みを得た後、バリューと重みを掛け合わせて出力を得ます。
Attention_Weights = softmax(Attention_Score)
Attention_Output = Attention_Weights * V
3.3. マルチヘッド注意機構(Multi-Head Attention)
マルチヘッド注意機構は、自己注意機構を複数(通常8〜16ヘッド)並行して実行し、多様な情報を同時に捉えることを可能にします。
計算ステップ:
- 複数の自己注意ヘッドの計算:
- 上記の自己注意機構をヘッドごとに独立して計算します。
- ヘッドの結合と線形変換:
- 各ヘッドの出力を結合し、再び線形変換を行います。
MultiHead_Output = Concat(head1, head2, ..., headN) * W_O
ここで、W_Oは結合後の次元から埋め込み次元への重み行列。
3.4. 残差接続と層正規化(Residual Connections and Layer Normalization)
各主要なサブレイヤー(自己注意、マルチヘッド注意、フィードフォワードネットワーク)は、残差接続と層正規化によって安定した学習を促進します。
計算ステップ:
X = LayerNorm(X + SubLayer(X))
3.5. フィードフォワードネットワーク(Feed-Forward Network)
各デコーダブロック内には、2層の全結合ネットワークが存在します。活性化関数としてReLUやGELUが使用されます。
計算ステップ:
FFN_Output = GELU(X * W_1 + b_1) * W_2 + b_2
ここで、W_1とW_2は全結合層の重み行列、b_1とb_2はバイアス項。
3.6. デコーダブロックの積み重ね
デコーダブロックは複数層積み重ねられ、各層は前の層の出力を入力として受け取ります。これにより、深い文脈理解が可能になります。
4. 出力生成(Output Generation)
4.1. 最終層の出力
最終デコーダブロックの出力は、シーケンスの各トークンに対する高次元の表現(ベクトル)です。これらのベクトルは、語彙サイズに対応する出力層へと送られます。
4.2. ロジット計算
出力ベクトルは、出力層の重み行列(通常は埋め込み行列の転置)との線形変換を通じてロジット(生のスコア)を生成します。
Logits = Output * W_vocab + b_vocab
ここで、W_vocabは埋め込み行列の転置、b_vocabはバイアス項。
4.3. ソフトマックスによる確率分布
ロジットにソフトマックス関数を適用して、各トークンの出現確率を得ます。
Probabilities = softmax(Logits)
4.4. トークンの選択
生成された確率分布から、次に出力するトークンが選択されます。選択方法は以下のような戦略があります:
- グリーディー法(Greedy): 最も確率の高いトークンを選択。
- ビームサーチ(Beam Search): 複数の候補を並行して探索。
- トップKサンプリング(Top-K Sampling): 上位K個のトークンからランダムに選択。
- トップPサンプリング(Top-P/Nucleus Sampling): 累積確率がPに達するまでのトークンから選択。
例:
Probabilities: [0.1, 0.3, 0.4, 0.2]
選択: トークン3(確率0.4)
4.5. トークンのデコーディング
選択されたトークンIDは、語彙リストに基づいて実際のトークン(単語やサブワード)に変換され、出力テキストとして提供されます。
例:
トークンID 23456 -> "モデル"
5. 具体的なデータフローの例
ここでは、具体的な入力から出力までのデータフローをステップバイステップで示します。
5.1. 入力プロンプト
"自然言語処理は面白いです。"
5.2. トークン化とトークンIDへのマッピング
トークン化:
["自然", "言語", "処理", "は", "面白い", "です", "。"]
トークンID:
[101, 202, 303, 404, 505, 606, 707]
5.3. 埋め込みと位置埋め込み
トークン埋め込み:
[
[0.1, 0.2, ..., 0.3], # ID 101
[0.4, 0.5, ..., 0.6], # ID 202
...
]
位置埋め込み:
[
[0.01, 0.02, ..., 0.03], # 位置0
[0.04, 0.05, ..., 0.06], # 位置1
...
]
埋め込み + 位置埋め込み:
[
[0.11, 0.22, ..., 0.33],
[0.44, 0.55, ..., 0.66],
...
]
5.4. デコーダブロックを通じた変換
各デコーダブロックで自己注意、マルチヘッド注意、フィードフォワードネットワークが適用され、入力ベクトルが次第に高度な文脈情報を含む表現に変換されます。ここでは簡略化のため、1層のデコーダブロックを例示します。
自己注意計算:
Q = X * W_Q
K = X * W_K
V = X * W_V
Attention_Score = (Q * K^T) / sqrt(d_k)
Attention_Weights = softmax(Attention_Score + Mask)
Attention_Output = Attention_Weights * V
マルチヘッド注意:
ヘッド1:
Q1, K1, V1を計算
Attention_Output1 = Attention_Weights1 * V1
...
ヘッドN:
QN, KN, VNを計算
Attention_OutputN = Attention_WeightsN * VN
MultiHead_Output = Concat(Attention_Output1, ..., Attention_OutputN) * W_O
フィードフォワードネットワーク:
FFN_Output = GELU(MultiHead_Output * W_1 + b_1) * W_2 + b_2
残差接続と層正規化:
Output = LayerNorm(MultiHead_Output + FFN_Output)
5.5. 最終出力と次のトークン生成
最終デコーダブロックの出力が、語彙サイズのロジットに変換され、ソフトマックスによって確率分布が生成されます。例えば、次のトークンとして「興味」が選択された場合、出力シーケンスは以下のようになります。
"自然言語処理は面白いです。興味"
このプロセスが繰り返され、所定の終了条件(例えば、最大長に達する、特定の終了トークンが生成される)に達するまで継続します。
6. データ変換の数学的詳細
6.1. 線形変換
埋め込みベクトルの線形変換は、以下のように表されます。
Y = XW + b
ここで、Xは入力ベクトル、Wは重み行列、bはバイアス項。
6.2. ソフトマックス関数
ソフトマックス関数は、入力ベクトルの各要素を正規化して確率分布に変換します。
softmax(z_i) = exp(z_i) / sum_j exp(z_j)
6.3. 注意機構の計算
注意スコアの計算は、クエリとキーの内積を用いて行われます。
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
ここで、d_kはキーの次元数で、スケーリング因子として用いられます。
6.4. GELU活性化関数
GELU(Gaussian Error Linear Unit)は、次のように定義されます。
GELU(x) = x * P(X <= x)
≈ 0.5 * x * (1 + tanh(√(2/π) (x + 0.044715 x^3)))
この関数は、非線形性を導入し、モデルの表現力を高めます。
7. モデルの訓練と最適化
7.1. 教師あり学習
モデルは大量のテキストデータを用いて、次のトークンを予測するタスクで訓練されます。損失関数として通常はクロスエントロピー損失が使用されます。
Loss = -sum(y_true * log(y_pred))
ここで、y_trueは正解トークンのワンホットベクトル、y_predはモデルの予測確率分布。
7.2. 最適化アルゴリズム
モデルのパラメータは、勾配降下法に基づく最適化アルゴリズム(例えば、Adam)を用いて更新されます。
θ = θ - η * ∇θ Loss
ここで、θはモデルのパラメータ、ηは学習率、∇θ Lossは損失のパラメータに対する勾配。
7.3. 正則化と正規化技法
過学習を防ぐため、ドロップアウト、重み減衰(Weight Decay)、早期停止などの正則化技法が使用されます。また、層正規化(Layer Normalization)が各層で適用され、安定した学習を促進します。
8. 高度なトピック
8.1. トランスフォーマーの拡張
Transformerアーキテクチャは、様々なタスクに応じて拡張されています。例えば、BERTは双方向エンコーダを用いたモデルであり、GPTは単方向デコーダのみを用いたモデルです。また、Transformer-XLやReformerなど、長いシーケンス処理や計算効率の向上を目指した改良版も存在します。
8.2. ファインチューニングと転移学習
大規模な事前訓練済みモデルは、特定のタスクに対してファインチューニングされます。これにより、少量のタスク特有のデータで高い性能を発揮することが可能になります。ファインチューニングでは、通常、出力層や一部の層のみが更新対象となります。
8.3. ハイブリッドモデルとマルチモーダル学習
近年、テキスト以外のモーダル(画像、音声など)を統合したマルチモーダルモデルが注目されています。これらのモデルは、異なるデータ形式を統一的な表現空間にマッピングし、複雑なタスクに対応します。
9. 実装上の考慮点
9.1. 計算資源と効率
大規模なTransformerモデルは、膨大な計算資源とメモリを必要とします。効率的な並列計算、分散学習、メモリ最適化技法(例えば、混合精度学習)が重要です。
9.2. モデルの圧縮と蒸留
モデルのサイズと計算量を削減するために、モデル圧縮や知識蒸留が用いられます。これにより、実運用環境でのデプロイが容易になります。
9.3. バッチ処理とシーケンシャル処理
バッチ処理は、データを効率的に並列処理するために重要です。一方、生成タスクではシーケンシャルなトークン生成が必要となり、バッチ処理とのバランスが求められます。
10. まとめ
本解説では、LLMのTransformerアーキテクチャにおける入力シーケンスからデコーダによる最終出力までの具体的なデータフローを詳細に説明しました。トークン化から埋め込み、デコーダブロックを通じた多層変換、そして出力生成まで、各ステップでデータがどのように変換されるかを専門的な視点から明らかにしました。