[Medical AI with Python:P56] Transformer Decoderモデルにおける出力生成の仕組み

Transformerの心臓部:行列計算の全貌

Transformerは、テキストを数値ベクトルに変換し、幾層もの「自己注意機構」と「フィードフォワードネットワーク」を通して文脈を深く理解します。最終的に次に来る単語の確率を計算するこの一連のプロセスは、すべて行列演算によって実行されています。

① 言葉を数値ベクトルへ
入力と埋め込み

入力文はまずトークンID列に変換されます。次に埋め込み行列 E を用いて各IDが意味ベクトルに変換され、位置情報 P が加算されることで、モデルへの初期入力 H(0) が完成します。

② 文脈の関連性を計算
自己注意機構

各単語のベクトルからQuery, Key, Value (Q, K, V) を生成。スコア行列 softmax(QKᵀ / √dₖ) を計算し、各単語が文中のどの単語に注目すべきかの重みを算出。この重みでVを加重平均し、文脈を反映したベクトルを得ます。

③ 意味の多角的な分析
Multi-Head & FFN

自己注意を複数並列で行い(Multi-Head)、多様な視点から文脈を捉えます。その後、各単語のベクトルを個別にFFN(2層のニューラルネット)に通し、非線形な変換を加えて表現をさらに深化させます。

④ 次の単語を予測
出力と自己回帰

最終層の最後の単語のベクトル hT を、埋め込み行列の転置 Eᵀ と掛合わせ、全語彙に対するスコア(logits)を算出。Softmaxで確率に変換後、次の単語を選択し、それを入力に加えて生成を繰り返します。

この章の学習目標
  • ✔ Transformerの内部処理を、入力から出力まで一貫した行列計算として説明できるようになる。
  • ✔ 埋め込み行列(E)やアテンションの重み行列(WQ, WK, WV)など、主要なパラメータ行列の役割と形状を理解する。
  • ✔ 最終的な隠れ状態ベクトルが、どのようにして次の単語の確率分布(logits)に変換されるかのメカニズムを説明できる。
対象読者と前提知識
  • 💡 線形代数の基礎(特に行列の積や転置)を理解しており、数式を読むことに慣れている方。
    補足: 本章の内容は、ほぼすべてが行列演算で説明されます。テンソルの形状(次元)の理解は不可欠です。
  • 💡 Transformerの基本的なアーキテクチャ(Self-Attention、FFN等)をすでに知っている方。
    補足: この章は「なぜ」ではなく「どのように計算されるか」に焦点を当てた、より深い技術解説です。
  • 💡 AIモデルの重みが、具体的な数値(行列)としてどう機能するかをコードレベルで理解したい方。
    補足: モデルの内部動作を、具体的なテンソルの変換として追跡する能力が求められます。
目次

トランスフォーマーにおける行列計算の全体像(Decoderモデル)

GPTのようなDecoder-onlyトランスフォーマーは、入力されたプロンプトに基づいて1語ずつ文章を生成する自己回帰的モデルです。その内部ではすべての処理が「行列計算」として構成されており、学習済みの重み行列が逐語的に使われています。

1. 入力:プロンプトのトークン化と埋め込み

💬 例:自然言語の入力

たとえば、ユーザーが以下のような文章を入力したとします:

「私は医者です」

この文章は、トークナイザーによって以下のように分割・ID化されます:

→ トークン列: ["[CLS]", "私", "は", "医者", "です"]
→ トークンID列: [101, 12, 456, 98]

ここでは、特別トークン [CLS] を先頭に置き、「私」「は」「医者」「です」が続いていると考えても構いません。

🧠 語彙サイズとトークンID

Transformerモデルは、あらかじめ定められた語彙(ボキャブラリ)の中から単語を識別します。たとえば:

  • 語彙サイズ:\( V = 50{,}000 \)

というのは、5万語まで識別できるという意味です。この語彙には、「私」や「医者」などの単語が、すべて固有のID(例:12, 456など)で登録されています。

🔷 埋め込み行列 \( \mathbf{E} \) とは?

自然言語のトークン(離散的なID)を、そのままではAIが計算に使えないため、連続値のベクトル(数値のかたまり)に変換します。

この変換をするのが、埋め込み行列(Embedding Matrix)

\[ \mathbf{E} \in \mathbb{R}^{V \times d} \]

  • \( V \):語彙サイズ(= 50,000)
  • \( d \):ベクトルの次元数(= 768)

この行列の「各行」は、各トークンの意味を表す768次元のベクトルです。

🔻 トークンID列 → ベクトル列:\( \mathbf{X} \)

トークンID列(例:[101, 12, 456, 98])を、埋め込み行列 \( \mathbf{E} \) を使って次のように変換します:

\[ \mathbf{X} = \begin{bmatrix} \mathbf{E}_{101} \\ \mathbf{E}_{12} \\ \mathbf{E}_{456} \\ \mathbf{E}_{98} \end{bmatrix} \in \mathbb{R}^{T \times d} \]

ここで、埋め込み行列 \( \mathbf{E} \in \mathbb{R}^{V \times d} \) は、語彙サイズ \( V \) の全単語に対して、それぞれの意味を表現するベクトル(次元数 \( d \))を対応させたものです。

各トークンID \( i \) に対して、そのベクトル表現は行列 \( \mathbf{E} \) の第 \( i \) 行、すなわち \( \mathbf{E}_{i} \) を取り出すことで得られます。これはちょうど「単語の意味ベクトルを辞書から引く」ような操作です。

なお、この埋め込み行列 \( \mathbf{E} \) は、モデルの学習開始時にはランダムに初期化されます。学習データを通じて、誤差逆伝播により更新されていくため、各単語に割り当てられたベクトル(意味表現)は、文脈的な意味や使用パターンを反映するように進化していきます。

  • 各 \( \mathbf{E}_{i} \) は、学習可能な埋め込み行列 \( \mathbf{E} \) の第 \( i \) 行
  • \( T = 4 \):トークン数(この文の長さ)

結果:\( \mathbf{X} \) は、4つの単語がそれぞれ768次元のベクトルに変換された行列(形状:\( T \times d \))であり、Transformerにとっての「意味付きの入力ベクトル列」となります。

📍 位置情報を加える:Positional Encoding

Transformerは、各単語の「順序」情報を直接持っていないため、位置ベクトルを別途加える必要があります。これが Positional Encoding(位置エンコーディング)

\[ \mathbf{P} \in \mathbb{R}^{T \times d} \]

これも入力と同じ形状の行列(\( T \times d \))で、たとえば「最初の単語用の位置ベクトル」「2番目の単語用」…のように、あらかじめ定められたパターン(または学習されたベクトル)です。

🌿 入力の最終形式:\( \mathbf{H}^{(0)} \)

この位置情報を入力ベクトル \( \mathbf{X} \) に加算して、Transformerの入力(第0層の出力) \( \mathbf{H}^{(0)} \) とします:

\[ \mathbf{H}^{(0)} = \mathbf{X} + \mathbf{P} \in \mathbb{R}^{T \times d} \]

このようにして、各単語の「意味」と「文中の位置」の両方を反映したベクトル列が得られます。

✅ まとめ:各構成要素の関係

記号意味次元
\( \mathbf{E} \)埋め込み行列(全語彙分)\( V \times d \)
トークンID列入力された文をID化した列長さ \( T \)
\( \mathbf{X} \)トークンID列をベクトルに変換\( T \times d \)
\( \mathbf{P} \)位置エンコーディング\( T \times d \)
\( \mathbf{H}^{(0)} \)入力 + 位置情報\( T \times d \)

このようにして、Transformerモデルは、文章の各単語の意味(ベクトル)と位置(順序)を取り込んでいくのです。

2. Self-Attention の構造と行列計算

各層では、入力 \( \mathbf{H}^{(l)} \) に対して以下を計算:

  • \( \mathbf{W}_Q, \mathbf{W}_K, \mathbf{W}_V \in \mathbb{R}^{d \times d_k} \)
  • \( d_k = 64 \) の場合、12ヘッドで \( d = 768 = 12 \times 64 \)

クエリ、キー、バリュー:

\[ \mathbf{Q} = \mathbf{H} \mathbf{W}_Q \in \mathbb{R}^{T \times d_k}, \quad \mathbf{K} = \mathbf{H} \mathbf{W}_K \in \mathbb{R}^{T \times d_k}, \quad \mathbf{V} = \mathbf{H} \mathbf{W}_V \in \mathbb{R}^{T \times d_k} \]

スコア行列:

\[ \mathbf{S} = \frac{\mathbf{Q} \mathbf{K}^\top}{\sqrt{d_k}} + \text{mask} \in \mathbb{R}^{T \times T} \]

softmaxで重み付け:

\[ \mathbf{A} = \text{softmax}(\mathbf{S}) \in \mathbb{R}^{T \times T} \]

重み付き和による出力:

\[ \mathbf{Z} = \mathbf{A} \mathbf{V} \in \mathbb{R}^{T \times d_k} \]

✅ Zの意味とは?

Z(Attention出力)には、プロンプト全体の各トークンが「文脈をふまえて意味的に変換されたベクトル表現」が入っています。

各トークンに対応する文脈ベクトルが行単位で格納されており、

\[ \mathbf{Z} \in \mathbb{R}^{T \times d_{model}} \]

となります。これが次の層へ伝わり、最終的な語彙スコア生成の土台となります。

3. マルチヘッドアテンションと WO

Multi-Head Attention(多頭注意)では、複数の異なる「視点」(ヘッド)で自己注意を並列に行い、それぞれが異なる特徴に注目するように学習されます。

【1】マルチヘッドアテンションの構造復習

各ヘッド \( i \) では、独立に Attention を計算します:

\[ \text{head}_i = \text{Attention}(Q_i, K_i, V_i) \in \mathbb{R}^{T \times d_h} \]

(※ \( d_h = \frac{d_{model}}{h} \) は1ヘッドあたりの次元数)

\( h \) 個のヘッドを結合して:

\[ \text{concat}(\text{head}_1, \dots, \text{head}_h) \in \mathbb{R}^{T \times d_{model}} \]

この段階では、「複数の視点をただ並べただけ」の状態であり、バラバラな情報が存在しています。

【2】WO の役割:線形変換による統合

マルチヘッドアテンションでは、各ヘッドが異なる「視点」から自己注意を計算します。 それぞれのヘッドは独立に Attention を行い、異なる特徴(構文、意味、位置など)に注目するように学習されています。

これらのヘッドから得られた出力ベクトルは、以下のように トークンごとに連結されて構成されます:

\[ \mathbf{Z}_{\text{multi-head}} = \text{concat}(\text{head}_1, \dots, \text{head}_h) \in \mathbb{R}^{T \times d} \]

  • \( T \):入力トークン数(プロンプトの長さ)
  • \( h \):ヘッド数(例:12)
  • \( d = h \cdot d_h \):モデルサイズ(例:768)
  • 各行は 1 トークンに対応し、そのトークンの文脈表現を保持

📌 WO:連結された情報を意味空間に戻す

この連結されたベクトルはまだ「複数の視点を並べただけ」の状態であり、統一的な意味空間にはなっていません。 そこで、WO という重み行列を使って、線形変換を適用し、各ヘッドの情報を統合します:

\[ \mathbf{W}_O \in \mathbb{R}^{d \times d} \]

これをかけた出力が:

\[ \text{Output} = \mathbf{Z}_{\text{multi-head}} \cdot \mathbf{W}_O \in \mathbb{R}^{T \times d} \]

✅ この Output の意味

この Output は、トークンごとの出力です。ただし、Self-Attention の性質により、各トークンのベクトルは「そのトークン単体の情報」ではなく、 プロンプト全体の文脈(それ以前のすべてのトークンとの関係性)を反映したものになっています。

  • 各行(1 トークンに対応するベクトル)は、そのトークンの文脈ベクトル
  • Self-Attention により、過去のすべてのトークンとの相関情報を含む
  • Decoder では未来のトークンはマスクされているため「因果的」
  • この Output を次の FFN や出力層に渡す

🎯 WO が果たす3つの重要な役割

  1. 重み付き統合: 複数ヘッドから得た特徴を学習済みの重みで融合
  2. 意味空間への変換: バラバラな視点を統一的な文脈ベクトル空間に戻す
  3. 次の層への橋渡し: FFN や出力層で扱える形式に整形

📌 もし WO がなかったら?

ヘッドを連結しただけでは、情報が「複数の視点に分離されたまま」であり、次の層でうまく処理できません。

  • 表現空間がバラバラ → 統合的な文脈ベクトルにならない
  • FFN で意味のある非線形変換が難しくなる
  • 語彙スコア計算時に文脈が分離してしまう

WO の位置づけまとめ

項目内容
役割Multi-head Attention の出力を統合する線形変換
形状\( \mathbf{W}_O \in \mathbb{R}^{d \times d} \)
入力各ヘッドを連結したベクトル(\( T \times d \))
出力文脈ベクトル(\( T \times d \))として整えられた表現
重要性異なる視点を意味的に統合し、次の処理層で扱えるようにする

4. Feed Forward Network(FFN)

Self-Attention によって各トークンには文脈情報(=他のトークンとの関係)が埋め込まれた状態になります。 この文脈付きベクトルを、次に 各トークン位置ごとに 個別に変換するのが FFN(Feed Forward Network)です。

📌 処理の構造(2層MLP)

FFN はトランスフォーマー層の中にある、2層の全結合ニューラルネットワークです:

\[ \text{FFN}(\mathbf{h}) = \max(0, \mathbf{h} \mathbf{W}_1 + \mathbf{b}_1) \mathbf{W}_2 + \mathbf{b}_2 \]

  • \( \mathbf{W}_1 \in \mathbb{R}^{d \times d_{ff}} \):特徴の拡張(通常 \( d_{ff} = 4d \))
  • \( \mathbf{W}_2 \in \mathbb{R}^{d_{ff} \times d} \):圧縮して元のサイズへ戻す
  • 非線形関数 ReLU により、単純な線形では表現できない複雑な関係を学習可能に

📌 各トークンに個別に作用する

FFN はトークンごとに 独立に適用 されます。つまり、プロンプト「私は医者です」の各トークンに対して、下記のようにそれぞれ処理されます:

  • 「私」のベクトル → FFN(意味深化)
  • 「は」のベクトル → FFN(意味深化)
  • 「医者」のベクトル → FFN(意味深化)
  • 「です」のベクトル → FFN(意味深化)

このとき注意すべきは、FFNは「そのトークンだけ」を処理しているにもかかわらず、ベクトルの中身にはすでに 文全体の情報(Self-Attentionで統合済み) が含まれているという点です。

したがって、FFN は「孤立した意味処理」ではなく、文全体の文脈を踏まえた非線形な意味変換を行っていることになります。

📌 意味の深化とは?

FFN の役割は、Self-Attention によって得られた文脈ベクトルに対し、より高度な意味処理を施すことです。

  • 第1層で次元を拡張 → より多様な特徴を抽出
  • ReLUによる非線形処理 → 文脈に応じた強調・抑制・抽象化
  • 第2層で元の次元に戻す → モデル内の一貫性を保つ

この処理によって、同じ単語であっても文脈によってその表現を柔軟に変えることができるようになります。

例:

  • 「医者」が主語のときと目的語のときで異なる意味を持たせる
  • 肯定的な文と否定的な文で「です」の役割が変わる

📌 FFN 後の出力と接続

FFN の出力は、残差接続(Residual Connection)と Layer Normalization とともに次の層へ送られます:

\[ \mathbf{H}^{(l+1)} = \text{LayerNorm}\left(\mathbf{H}^{(l)} + \text{FFN}(\mathbf{H}^{(l)})\right) \]

これにより、元の情報(入力)と新しい変換情報(出力)をバランスよく組み合わせることができ、安定した学習が可能になります。

✅ FFN の意義まとめ

役割説明
意味の深化文脈付きベクトルに非線形変換を加え、意味をより表現豊かに
トークンごとに並列処理全トークンに同一の変換を適用、計算効率も高い
文脈依存の表現同じ単語でも前後の文脈によって変化するベクトルへ

5. 出力:語彙スコア(Logits)の生成

ここでは、デコーダー全体を通過したあとの最終出力 \( \mathbf{H}^{(L)} \) を用いて、語彙スコアと文章生成を行うプロセスを説明します。

Transformer は、最後のデコーダーブロックの出力(隠れ状態) \( \mathbf{H}^{(L)} \in \mathbb{R}^{T \times d} \) を使って、次に出力すべき単語を決定します。 ここでのポイントは、\( \mathbf{H}^{(L)} \) はプロンプト内の全トークンに対応する最終的な文脈ベクトルの集合であるということです。 つまり、「私は医者です」のようなプロンプト(4トークン)に対しては、4行のベクトルが存在します。

ただし、次の語(トークン)を生成するために実際に使われるのは、その中の最後のトークン(位置 \( T \))の出力ベクトル \( \mathbf{h}_T = \mathbf{H}^{(L)}_T \) です。

📌 出力ベクトルと語彙ベクトルの内積

モデルは、時刻 \( t \) における出力ベクトル \( \mathbf{h}_t = \mathbf{H}^{(L)}_t \in \mathbb{R}^{d} \) を、全語彙ベクトル(Embedding行列の転置)と内積して、各語彙に対応するスコアを得ます:

\[ \text{logits}_t = \mathbf{h}_t \cdot \mathbf{E}^\top \in \mathbb{R}^{V} \]

ここで:

  • \( \mathbf{E}^\top \in \mathbb{R}^{d \times V} \):語彙ベクトル(トークンごとの意味ベクトル)
  • \( V \):語彙数(たとえば 50,000 語)

この内積は、「この文脈ベクトル(\( \mathbf{h}_t \))と意味が近い語彙はどれか?」という類似度を測る操作であり、 「次に来るのにふさわしい単語」の候補を数値的にスコア化していることになります。

📌 softmax による確率分布の計算

得られたスコア(logits)に対して softmax をかけることで、語彙全体に対する確率分布を得ます:

\[ \mathbf{p}_t = \text{softmax}(\text{logits}_t) \in \mathbb{R}^{V} \]

これは「今の文脈のもとで、各語彙が次に出現する確率」を表しています。たとえば:


「私は医者」→ です: 80%
「私は医者」→ の:   5%
「私は医者」→ に:   2%
... (その他49,997語に対する確率)

📌 サンプリングまたは argmax による語の選択

この確率分布から、実際に生成する次の語を選びます:

  • argmax:最も確率が高い語を選ぶ(確定的な出力)
  • サンプリング:確率に従ってランダムに選ぶ(多様性あり)
  • top-k / top-p(nucleus):上位の語彙に絞って確率的に選ぶ(安定性と創造性のバランス)

📌 自己回帰的な生成

生成されたトークン(語)は、元のプロンプトの末尾に追加され、再び Transformer に入力されます。 これを繰り返すことで、文章が 1 語ずつ伸びていきます:


入力:「私は医者」        → 出力:「です」
入力:「私は医者です」    → 出力:「。」
入力:「私は医者です。」  → 出力:「よろしく」
...(このように 1 単語ずつ、繰り返し生成)

このようにして、Transformer はすでに生成した単語すべてを「文脈」として保持しながら、次に出すべき語を論理的・意味的に選び取っていくのです。

✅ 行列計算としてのまとめ

  • \( \mathbf{H}^{(L)} \in \mathbb{R}^{T \times d} \):各トークンの文脈ベクトルの集合
  • \( \mathbf{h}_T = \mathbf{H}^{(L)}_T \):最後のトークンの文脈ベクトル
  • \( \text{logits}_T = \mathbf{h}_T \cdot \mathbf{E}^\top \in \mathbb{R}^V \):語彙ごとのスコア
  • \( \mathbf{p}_T = \text{softmax}(\text{logits}_T) \):次の語の確率分布

このプロセスは、「意味のある文章を生み出す仕組み」をすべて線形代数(ベクトル・行列演算)で構成していることを示しています。

6. トランスフォーマーにおける行列計算の全体像(Decoderモデル)

GPTのような Decoder-only トランスフォーマーは、入力されたプロンプトに基づいて 1 語ずつ文章を生成する自己回帰的モデルです。 その内部ではすべての処理が 行列計算として構成されており、学習済みの重み行列が逐語的に使われています。

📌 モデルの主要テンソルとパラメータ一覧

名称記号形状役割・意味
語彙埋め込み行列\( \mathbf{E} \)\( V \times d \)語彙IDをベクトルに変換。出力時にも再利用。
トークン埋め込みベクトル列\( \mathbf{X} \)\( T \times d \)入力トークンをベクトル化したもの。
位置埋め込み行列\( \mathbf{P} \)\( T \times d \)系列内の順序情報を表現。
初期入力ベクトル\( \mathbf{H}^{(0)} = \mathbf{X} + \mathbf{P} \)\( T \times d \)Transformerに入力される初期の表現。
各層の隠れ状態\( \mathbf{H}^{(l)} \)\( T \times d \)第 \( l \) 層の出力ベクトル。全層で同形状。
クエリ重み行列\( \mathbf{W}_Q \)\( d \times d_k \)入力をクエリ空間に変換。
キー重み行列\( \mathbf{W}_K \)\( d \times d_k \)入力をキー空間に変換。
バリュー重み行列\( \mathbf{W}_V \)\( d \times d_k \)入力をバリュー空間に変換。
スコア行列\( \mathbf{S} = \frac{\mathbf{Q} \mathbf{K}^\top}{\sqrt{d_k}} \)\( T \times T \)各トークン間の関連度スコア。
Attention重み\( \mathbf{A} \)\( T \times T \)softmaxされたスコア。注目度の重み。
Attention出力(単一ヘッド)\( \mathbf{Z} \)\( T \times d_k \)バリューの加重平均。
マルチヘッド出力(結合後)\( \text{concat}(head_1, \dots, head_h) \)\( T \times d \)複数の視点のAttention結果。
WO行列(多頭統合)\( \mathbf{W}_O \)\( d \times d \)各ヘッド出力を文脈空間に再変換。
FFNの1層目\( \mathbf{W}_1 \)\( d \times d_{ff} \)非線形変換用の中間層。
FFNの2層目\( \mathbf{W}_2 \)\( d_{ff} \times d \)元の次元に戻す線形層。
最終出力ベクトル\( \mathbf{H}^{(L)} \)\( T \times d \)語彙スコア計算に用いる最終表現。
語彙スコア(logits)\( \text{logits}_t = \mathbf{h}_t \cdot \mathbf{E}^\top \)\( V \)各語彙に対するスコア。
語彙の出現確率\( \mathbf{p}_t = \text{softmax}(\text{logits}_t) \)\( V \)次の語が出現する確率分布。

📘 記号の凡例(テンソルの次元に関するパラメータ)

  • \( V \):語彙サイズ(Vocabulary size)— モデルが扱う単語の総数(例:50,000)
  • \( T \):トークン数(Sequence length)— 1入力あたりのトークン(単語など)の数
  • \( d \):モデル次元(Model dimension)— 各ベクトルの基本的な次元数(例:768)
  • \( d_k \):Attention用のキー・クエリ・バリューの次元(Head dimension)
  • \( d_{ff} \):Feed Forward Network内の中間層次元(例:通常は \(4d\) など)
  • \( h \):Attentionヘッド数(Number of heads)
  • \( L \):Transformerの層数(Number of layers)

このように、Transformer におけるすべての処理は 線形代数(ベクトルと行列の演算)によって実現されており、モデルが学習するのはこれらの 重み行列(W)と埋め込み行列(E, P) です。

🎓 Transformer完全図解:入力から出力までの行列計算フロー【全テンソル形状つき】

テキストベース図
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔷 ① 入力トークン → 埋め込みベクトル + 位置情報
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[入力]: 例「私は医者です」→ トークン列 [101, 12, 456, 98](T = 4)

埋め込み行列 E ∈ ℝ^{V × d}
                     ┌───────────────┐
     ID=101 →        │ E_101         │
     ID=12  →        │ E_12          │
     ID=456 →        │ E_456         │
     ID=98  →        │ E_98          │
                     └───────────────┘

↓ Lookup(辞書引き)

トークンベクトル列 X ∈ ℝ^{T × d}
                     ┌──────────────────────┐
                     │ E_101                │
                     │ E_12                 │
                     │ E_456                │
                     │ E_98                 │
                     └──────────────────────┘

位置エンコーディング P ∈ ℝ^{T × d}
                     ┌───── 加算 ─────┐
                     ↓               ↓
                X            +       P
                     ↓               ↓

初期入力 H⁽⁰⁾ ∈ ℝ^{T × d}
                     ┌──────────────────────┐
                     │ X₁ + P₁              │
                     │ X₂ + P₂              │
                     │ X₃ + P₃              │
                     │ X₄ + P₄              │
                     └──────────────────────┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔷 ② Self-Attention 層(各層 l ごとに繰り返し)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

入力 H⁽ˡ⁻¹⁾ ∈ ℝ^{T × d}
                     ┌──────────────────────┐
                     │ h₁                   │
                     │ h₂                   │
                     │ h₃                   │
                     │ h₄                   │
                     └──────────────────────┘

【線形変換】W_Q, W_K, W_V ∈ ℝ^{d × dₖ}(学習パラメータ)

クエリ Q ∈ ℝ^{T × dₖ}
                     ┌──────────────┐
                     │ q₁           │ = h₁·W_Q
                     │ q₂           │ = h₂·W_Q
                     │ q₃           │ = h₃·W_Q
                     │ q₄           │ = h₄·W_Q
                     └──────────────┘

キー K ∈ ℝ^{T × dₖ}
                     ┌──────────────┐
                     │ k₁           │ = h₁·W_K
                     │ k₂           │ = h₂·W_K
                     │ k₃           │ = h₃·W_K
                     │ k₄           │ = h₄·W_K
                     └──────────────┘

バリュー V ∈ ℝ^{T × dₖ}
                     ┌──────────────┐
                     │ v₁           │ = h₁·W_V
                     │ v₂           │ = h₂·W_V
                     │ v₃           │ = h₃·W_V
                     │ v₄           │ = h₄·W_V
                     └──────────────┘

【スコア計算】 S = Q · Kᵀ / √dₖ ∈ ℝ^{T × T}
                     ┌───────────────┐
                     │ s₁₁ s₁₂ s₁₃ s₁₄ │
                     │ s₂₁ s₂₂ s₂₃ s₂₄ │
                     │ s₃₁ s₃₂ s₃₃ s₃₄ │
                     │ s₄₁ s₄₂ s₄₃ s₄₄ │
                     └───────────────┘
        → 各トークンが他トークンにどれだけ注目するかのスコア

【softmax】
Attention重み A ∈ ℝ^{T × T}
                     ┌───────────────┐
                     │ a₁₁ a₁₂ a₁₃ a₁₄ │
                     │ a₂₁ a₂₂ a₂₃ a₂₄ │
                     │ a₃₁ a₃₂ a₃₃ a₃₄ │
                     │ a₄₁ a₄₂ a₄₃ a₄₄ │
                     └───────────────┘

【加重平均】 Z = A · V ∈ ℝ^{T × dₖ}
                     ┌──────────────┐
                     │ z₁           │
                     │ z₂           │
                     │ z₃           │
                     │ z₄           │
                     └──────────────┘

【マルチヘッド】
Z₁, ..., Zₕ ∈ ℝ^{T × dₖ} → concat(Z₁, ..., Zₕ) ∈ ℝ^{T × d}

【統合変換】W_O ∈ ℝ^{d × d}
Z' = concat(...) · W_O ∈ ℝ^{T × d}

【残差接続 + 正規化】
H' = LayerNorm(H⁽ˡ⁻¹⁾ + Z') ∈ ℝ^{T × d}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔷 ③ FFN(Feed Forward Network)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

線形変換:
W₁ ∈ ℝ^{d × d_ff},W₂ ∈ ℝ^{d_ff × d}

活性化 → ReLU:
FF₁ = ReLU(H' · W₁ + b₁) ∈ ℝ^{T × d_ff}

線形変換:
FF₂ = FF₁ · W₂ + b₂ ∈ ℝ^{T × d}

残差 + 正規化:
H⁽ˡ⁾ = LayerNorm(H' + FF₂) ∈ ℝ^{T × d}

→ これを L 層繰り返す

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔷 ④ 出力の生成(logits → softmax)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

最終出力 H⁽ᴸ⁾ ∈ ℝ^{T × d}
                     ┌──────────────────────┐
                     │ h₁^{(L)}             │
                     │ h₂^{(L)}             │
                     │ h₃^{(L)}             │
                     │ h₄^{(L)}             │
                     └──────────────────────┘

語彙埋め込み行列 Eᵀ ∈ ℝ^{d × V}

【スコア計算】
logits_t = h_t^{(L)} · Eᵀ ∈ ℝ^{V}

【softmax】
p_t = softmax(logits_t) ∈ ℝ^{V}

【生成】
argmax(p_t) または sampling → 次の単語を決定

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 これが Transformer の1ステップにおける完全な行列計算の流れです
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✅ トランスフォーマーの計算構造(Decoder)を具体例で解説

前提:プロンプト「私は医者です」 → トークン列 [101, 12, 456, 98]

  • トークン数:\( T = 4 \)
  • モデルサイズ(隠れ次元):\( d_{model} = 768 \)
  • ヘッド数:\( h = 12 \)、各ヘッドの次元 \( d_k = d_v = 64 \)

1. 入力埋め込みと初期ベクトル生成

\[ \mathbf{X} = \text{Embed}(x) \in \mathbb{R}^{4 \times 768}, \quad \mathbf{P} \in \mathbb{R}^{4 \times 768} \]

\[ \mathbf{H}^{(0)} = \mathbf{X} + \mathbf{P} \]

2. Self-Attention:Q, K, Vとスコア計算

\[ \mathbf{Q}, \mathbf{K}, \mathbf{V} \in \mathbb{R}^{4 \times 64} \]

\[ \mathbf{S} = \frac{\mathbf{Q} \mathbf{K}^\top}{\sqrt{64}} + \text{mask} \in \mathbb{R}^{4 \times 4}, \quad \mathbf{A} = \text{softmax}(\mathbf{S}) \]

\[ \mathbf{Z}_i = \mathbf{A} \mathbf{V}_i \in \mathbb{R}^{4 \times 64} \quad (\text{for each head}) \]

3. Multi-head Attentionと出力統合

\[ \text{MultiHead}(Q, K, V) = \text{concat}(\mathbf{Z}_1, \dots, \mathbf{Z}_{12}) \in \mathbb{R}^{4 \times 768} \]

学習済みの重み行列 \( \mathbf{W}_O \in \mathbb{R}^{768 \times 768} \) による線形変換で統合:

\[ \mathbf{M} = \text{MultiHead}(…) \cdot \mathbf{W}_O \in \mathbb{R}^{4 \times 768} \]

\( \mathbf{W}_O \) の意味:各ヘッドから得られた出力(各視点からの「意味表現」)を重み付きに統合するための学習済みパラメータです。これにより多様な情報を1つにまとめ、次の処理に渡します。

4. 残差接続 + LayerNorm(1回目)

\[ \mathbf{H}’ = \text{LayerNorm}(\mathbf{H}^{(0)} + \mathbf{M}) \in \mathbb{R}^{4 \times 768} \]

5. Feed Forward Network(FFN)

\[ \text{FFN}(\mathbf{h}_t) = \text{ReLU}(\mathbf{h}_t \mathbf{W}_1 + \mathbf{b}_1) \mathbf{W}_2 + \mathbf{b}_2 \]

(例:\( \mathbf{W}_1 \in \mathbb{R}^{768 \times 3072}, \mathbf{W}_2 \in \mathbb{R}^{3072 \times 768} \))

これを各トークン位置 \( t = 1, 2, 3, 4 \) に適用。

6. 残差接続 + LayerNorm(2回目)

\[ \mathbf{H}^{(1)} = \text{LayerNorm}(\mathbf{H}’ + \text{FFN}(\mathbf{H}’)) \]

この出力が次の層(複数層ある場合)へ渡され、最終層まで繰り返されます(例:12層)。

7. 出力層:語彙スコア(Logits)の生成

最終層の出力(例:12層目)を \( \mathbf{H}^{(L)} \in \mathbb{R}^{4 \times 768} \) とすると:

\[ \text{logits}_t = \mathbf{H}^{(L)}_t \cdot \mathbf{E}^\top \in \mathbb{R}^{50000} \]

※ 埋め込み行列 \( \mathbf{E} \in \mathbb{R}^{50000 \times 768} \) は共有されている。

8. softmaxによる確率化

\[ \mathbf{p}_t = \text{softmax}(\text{logits}_t) \]

このベクトルは、語彙全体にわたる「次の単語」の確率分布を表します。

9. 次トークンの選択と繰り返し(自己回帰)

次の単語の選択は以下のように行われます:

  • argmax方式: 最も確率の高い単語を選ぶ(例:推論時)
  • サンプリング: 分布 \( \mathbf{p}_t \) に従って確率的に選ぶ(例:文章生成時)

選ばれたトークンIDは、新たな入力トークンとして次のタイムステップに追加されます:

\[ [x_1, x_2, x_3, x_4] \rightarrow [x_1, x_2, x_3, x_4, x_5] \]

このように、Transformerは1語ずつ生成を繰り返す自己回帰モデルです。生成が終了トークン([EOS]など)に達するまで、これを繰り返します。



ご利用規約(免責事項)

当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。

第1条(目的と情報の性質)

  1. 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
  2. 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
  3. 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
  4. 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。

第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。

第3条(医療行為における責任)

  1. 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
  2. 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
  3. 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。

第4条(情報の正確性・完全性・有用性)

  1. 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
  2. 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。

第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。

第6条(知的財産権)

  1. 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
  2. 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。

第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。

第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。

第9条(免責事項)

  1. 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
  2. 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
  3. 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
  4. 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。

第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。

第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。


For J³, may joy follow you.

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

医師・医学博士・AI研究者・連続起業家
元厚生労働省幹部・ハーバード大学理学修士・ケンブリッジ大学MBA・コロンビア大学行政修士(経済)
岡山大学医学部卒業後、内科・地域医療に従事。厚生労働省で複数室長(医療情報・救急災害・国際展開等)を歴任し、内閣官房・内閣府・文部科学省でも医療政策に携わる。
退官後は、日本大手IT企業や英国VCで新規事業開発・投資を担当し、複数の医療スタートアップを創業。現在は医療AI・デジタル医療機器の開発に取り組むとともに、東京都港区で内科クリニックを開業。
複数大学で教授として教育・研究活動に従事し、医療関係者向け医療AIラボ「Medical AI Nexus」、医療メディア「The Health Choice | 健康の選択」を主宰。
ケンブリッジ大学Associate・社会医学系指導医・専門医・The Royal Society of Medicine Fellow

目次