Transformerモデルのエンコーダにおけるプロンプト入力の処理

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のエンコーダは入力プロンプトを高度に表現したベクトルに変換し、次の処理ステップに備えます。