Transformerモデルのエンコーダにおけるプロンプト入力の処理を、ステップバイステップで説明いたします。以下では、各ステップにおける内部動作や関連する数学的概念、実装上の考慮事項についても解説します。
1. 入力プロンプトの受け取りと前処理
1.1. プロンプトの入力
- ユーザーから与えられたテキストプロンプトがモデルに入力されます。例えば、「自然言語処理とは何ですか?」といった問いかけです。
1.2. テキストの正規化
- 入力テキストは、以下のような正規化処理を経ます。
- 小文字化: 一部のモデルでは、大文字と小文字の区別をなくすために全て小文字に変換します。
- 特殊文字の処理: 特殊文字や記号の統一、不要なスペースの削除などを行います。
- トークン化準備: トークン化の前に、テキストをクリーンアップします。
2. トークン化(Tokenization)
2.1. トークナイザーの選定
- 使用するモデルに適合したトークナイザーが選択されます。例えば、BERTではWordPiece、GPTではByte Pair Encoding (BPE) が一般的です。
2.2. サブワード分割
- 入力テキストはサブワード単位に分割されます。これにより、未知語や複雑な語も効率的に扱うことができます。
- 例: 「自然言語処理」 → 「自然」「言語」「処理」
2.3. トークンIDへのマッピング
- 各トークンは、事前に学習された語彙(Vocabulary)に基づき、対応する数字IDに変換されます。
- 例: 「自然」→ 1024, 「言語」→ 2048, 「処理」→ 4096
2.4. 特殊トークンの付与
- シーケンスの開始や終了を示す特殊トークン([CLS], [SEP]など)が必要に応じて追加されます。
- 例: [CLS] 自然 言語 処理 [SEP]
3. 埋め込み(Embedding)
3.1. トークン埋め込み(Token Embedding)
- トークンIDは、事前に学習された埋め込み行列(Embedding Matrix)を用いて固定次元のベクトルに変換されます。
- 例: トークンID 1024 → ベクトル幅[0.25, -0.13, …, 0.87]
3.2. 位置埋め込み(Positional Embedding)
- Transformerモデルは自己注意機構の中で順序情報を持たないため、位置情報を埋め込む必要があります。
- サイン・コサイン関数: 固定的な位置エンコーディングを用いる方法。
- 学習可能な位置エンコーディング: 埋め込みベクトルとして学習する方法。
- 各トークン埋め込みに位置埋め込みを加算します。
3.3. セグメント埋め込み(Segment Embedding)
- 必要に応じて、異なるセグメント(文、段落など)を区別するためのセグメント埋め込みが加えられます。
3.4. 最終埋め込みの形成
- トークン埋め込み、位置埋め込み、セグメント埋め込みを総和し、最終的な入力埋め込みベクトルが形成されます。
\[
形成される埋め込み = トークン埋め込み + 位置埋め込み + セグメント埋め込み
\]
4. エンコーダ層への入力
4.1. スタック構造のエンコーダ
- Transformerエンコーダは、通常N個の同一構造を持つエンコーダブロックが積み重なったスタック構造を持ちます。
- 各エンコーダブロックは以下の主要コンポーネントから構成されます。
5. エンコーダブロック内の処理
各エンコーダブロックは以下のサブレイヤーから構成されます。これらのサブレイヤーは、入力を受けて過程的に処理を行います。
5.1. マルチヘッド自己注意機構(Multi-Head Self-Attention)
5.1.1. 入力の線形変換
- 入力埋め込ベクトルは、それぞれクエリ(Q)、キー(K)、バリュー(V)ベクトルに線形変換されます。
\[
Q = XW_Q, \quad K = XW_K, \quad V = XW_V
\]
ここで、\( W_Q, W_K, W_V \) は学習可能な重み行列です。
5.1.2. スケールド・ドット・プロダクト注意(Scaled Dot-Product Attention)
- 各ヘッドにおいて、以下の計算が行われます。
\[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
\]
ここで、\( d_k \) はキーの次元数です。スケーリングにより勾配の安定化が図られます。
5.1.3. マルチヘッドの統合
- 複数のヘッドで計算された注意出力を結合し、再度線形変換します。
\[
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \text{head}_2, \ldots, \text{head}_h)W_O
\]
ここで、\( W_O \) は出力の線形変換行列です。
5.1.4. 自己注意機構の特徴
- 各ヘッドは異なる部分に焦点を当てることで、入力の多様な側面を捉えることができます。
5.2. 残差接続と層正規化(Add & Norm)
5.2.1. 残差接続
- 自己注意機構の出力に対して、元の入力を加算します。
\[
\text{Residual} = \text{Attention Output} + X
\]
5.2.2. 層正規化
- 加算後のベクトルに層正規化を適用し、学習の安定性を向上させます。
\[
\text{Norm} = \text{LayerNorm}(\text{Residual})
\]
5.3. フィードフォワードネットワーク(Feed-Forward Network, FFN)
5.3.1. 線形変換と活性化関数
- 層正規化後のベクトルに対して、位置ごとに同一のフィードフォワードネットワークが適用されます。
\[
\text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2
\]
ここで、\( W_1, W_2 \) は学習可能な重み行列、\( b_1, b_2 \) はバイアス項です。
5.3.2. 高次元の非線形変換
- 中間層の高次元変換を経て非線形変換を行うことで、モデルの表現力を高めます。
5.4. 再度の残差接続と層正規化(Add & Norm)
5.4.1. 残差接続
- フィードフォワードネットワークの出力に対して、入力(層正規化後の出力)を加算します。
\[
\text{Residual} = \text{FFN Output} + \text{Norm Output}
\]
5.4.2. 層正規化
- 最終的に、層正規化を適用し、エンコーダブロックの出力を得ます。
6. エンコーダ層のスタックと最終出力の形成
6.1. エンコーダブロックのスタック
- 各エンコーダブロックはスタック構造になっており、通常は複数のエンコーダブロックが連続して配置されています。各ブロックは前のブロックからの出力を受け取り、さらに抽象的な表現を学習します。
6.2. 最終出力の生成
- エンコーダの最終出力は、入力シーケンス全体の情報を含むコンテキスト埋め込みとして得られます。これにより、各トークンの文脈に基づく意味が効果的に捉えられます。この出力は、デコーダや他の下流タスク(分類、質問応答など)で使用されます。
このようにして、Transformerのエンコーダは入力プロンプトを高度に表現したベクトルに変換し、次の処理ステップに備えます。