
Transformerの計算フロー:主要数式一覧
| 処理段階 | 数式 | 意味・目的 |
|---|---|---|
| 語彙埋め込み | \( \mathbf{X} = \text{Embed}(\text{tokens}) \) | 入力トークンをベクトルに変換 |
| 位置埋め込みの加算 | \( \mathbf{H}^{(0)} = \mathbf{X} + \mathbf{P} \) | 単語の順序情報を加える |
| Queryの計算 | \( \mathbf{Q} = \mathbf{H}^{(l)} \mathbf{W}_Q \) | 入力を「問い」に変換 |
| Keyの計算 | \( \mathbf{K} = \mathbf{H}^{(l)} \mathbf{W}_K \) | 入力を「答えの鍵」に変換 |
| Valueの計算 | \( \mathbf{V} = \mathbf{H}^{(l)} \mathbf{W}_V \) | 入力を「内容」に変換 |
| Attentionスコア | \( \mathbf{S} = \frac{ \mathbf{Q} \mathbf{K}^\top }{ \sqrt{d_k} } \) | 関連度を計算(内積+スケーリング) |
| Attention重み | \( \mathbf{A} = \text{softmax}(\mathbf{S}) \) | 注目度を確率分布に変換 |
| Self-Attention出力 | \( \mathbf{Z} = \mathbf{A} \mathbf{V} \) | 加重平均による文脈ベクトル生成 |
| 各ヘッドの出力 | \( \text{head}_i = \text{Attention}(\mathbf{QW}_Q^i, \mathbf{KW}_K^i, \mathbf{VW}_V^i) \) | 異なる視点での注意 |
| Multi-Head結合 | \( \mathbf{M} = \text{concat}(\text{head}_1, \dots, \text{head}_h) \) | 全ヘッドの出力を統合 |
| 線形変換 | \( \mathbf{O} = \mathbf{M} \mathbf{W}_O \) | 次層用に整形 |
| 残差接続+正規化① | \( \mathbf{H}’ = \text{LayerNorm}(\mathbf{H}^{(l)} + \mathbf{O}) \) | Attentionの安定化 |
| FFN第1層 | \( \mathbf{F}_1 = \text{ReLU}(\mathbf{H}’ \mathbf{W}_1 + \mathbf{b}_1) \) | 非線形変換(意味の抽象化) |
| FFN第2層 | \( \mathbf{F}_2 = \mathbf{F}_1 \mathbf{W}_2 + \mathbf{b}_2 \) | 元の次元に戻す |
| 残差接続+正規化② | \( \mathbf{H}^{(l+1)} = \text{LayerNorm}(\mathbf{H}’ + \mathbf{F}_2) \) | FFN後の出力を安定化 |
| 最終出力 | \( \mathbf{H}^{(L)} \) | Transformer全体の出力(最終層) |
| 語彙スコア(Logits) | \( \text{logits}_t = \mathbf{h}_t \cdot \mathbf{E}^\top \) | 各語彙に対応するスコア |
| 出力確率 | \( \mathbf{p}_t = \text{softmax}(\text{logits}_t) \) | 次の語の出現確率 |
Transformerの計算フローを具体的な数値で追ってみよう(小型モデルで図解用)
以下では、Transformerの内部処理をすべて数値付きで辿れるよう、小さなモデル設定に基づいて具体的に説明します。
モデル設定(例)
| 項目 | 値 |
|---|---|
| 語彙数 \( V \) | 8語 |
| 文長 \( T \) | 5トークン(例:「糖 尿 病 の 治療」) |
| 埋め込み次元 \( d \) | 4 |
| ヘッド数 \( h \) | 2 |
| 各ヘッド次元 \( d_k = d/h \) | 2 |
| FFN中間層次元 \( d_{ff} \) | 6 |
① Embeddingと位置符号化:入力文をベクトルで表すまで
Transformerでは、文字列(単語やサブワード)をそのまま扱うことはできません。まずは「トークンID」へ変換した後、それぞれを意味のある数値ベクトルへ変換する必要があります。
ステップ1:トークンIDへの変換
たとえば、以下のような5語からなる日本語の短い入力文があるとします:
入力文:糖 尿 病 の 治療
トークン列:[1, 2, 3, 4, 5]
ステップ2:語彙埋め込み行列からベクトルへ変換
Transformerは、各トークンIDを多次元ベクトルに変換するために、語彙埋め込み行列 \( \mathbf{E} \in \mathbb{R}^{8 \times 4} \) を持っています。
この行列は、語彙数(ここでは8語)に対して、それぞれの単語に対応する4次元の意味ベクトルを保持しています。
たとえば、以下は5つのトークンに対応するベクトルを取り出して並べた埋め込みベクトル列 \( \mathbf{X} \in \mathbb{R}^{5 \times 4} \) の例です:
\[
\mathbf{X} =
\begin{bmatrix}
0.1 & 0.3 & -0.1 & 0.2 \\
-0.2 & 0.0 & 0.5 & 0.1 \\
0.3 & 0.1 & -0.3 & 0.4 \\
0.0 & -0.1 & 0.2 & 0.2 \\
0.1 & 0.4 & 0.1 & -0.1 \\
\end{bmatrix}
\]
この段階で、入力された文は「5個のトークン × 各トークン4次元のベクトル」という形で数値化されました。

ステップ3:位置符号(Positional Encoding)の加算
Transformerはリカレント(時系列)構造を持たないため、トークンの「順序情報」を別途与える必要があります。
そのため、位置埋め込み行列 \( \mathbf{P} \in \mathbb{R}^{5 \times 4} \) を使い、各トークン位置(1〜5)に対応する位置ベクトルを以下のように加算します:
\[
\mathbf{H}^{(0)} = \mathbf{X} + \mathbf{P}
\]
たとえば、以下のような位置埋め込みがあったとします:
\[
\mathbf{P} =
\begin{bmatrix}
0.0 & 0.1 & 0.0 & 0.1 \\
0.1 & 0.0 & 0.1 & 0.0 \\
0.2 & 0.1 & 0.0 & 0.1 \\
0.3 & 0.0 & 0.1 & 0.0 \\
0.4 & 0.1 & 0.0 & 0.1 \\
\end{bmatrix}
\]
これを加算した結果:
\[
\mathbf{H}^{(0)} =
\begin{bmatrix}
0.1 & 0.4 & -0.1 & 0.3 \\
-0.1 & 0.0 & 0.6 & 0.1 \\
0.5 & 0.2 & -0.3 & 0.5 \\
0.3 & -0.1 & 0.3 & 0.2 \\
0.5 & 0.5 & 0.1 & 0.0 \\
\end{bmatrix}
\]
このようにして、各単語はその「意味(埋め込み)」と「文中の位置(位置符号)」の両方を反映したベクトルとして初期入力が完成します。

まとめ:ここまでの処理
- 文字列 → トークンIDに変換
- トークンID → 埋め込み行列を使ってベクトルへ変換(意味の数値化)
- 位置埋め込みを加算して順序情報を与える
この結果得られた \( \mathbf{H}^{(0)} \in \mathbb{R}^{5 \times 4} \) は、Transformerモデルの最初の層(Self-Attention)に入力される、文の数値的な「初期表現」です。
② Self-Attention(各ヘッド)
各ヘッドごとに、以下のように Query, Key, Value を計算します。
\[
\mathbf{Q}_i = \mathbf{H}^{(l)} \mathbf{W}_Q^i \quad \mathbf{K}_i = \mathbf{H}^{(l)} \mathbf{W}_K^i \quad \mathbf{V}_i = \mathbf{H}^{(l)} \mathbf{W}_V^i
\]
各行列のサイズは以下の通りです:
- \( \mathbf{W}_Q^i, \mathbf{W}_K^i, \mathbf{W}_V^i \in \mathbb{R}^{4 \times 2} \)
- \( \mathbf{Q}, \mathbf{K}, \mathbf{V} \in \mathbb{R}^{5 \times 2} \)

スコア行列:
\[
\mathbf{S} = \frac{\mathbf{Q} \mathbf{K}^\top}{\sqrt{2}} \in \mathbb{R}^{5 \times 5}
\]

Softmaxにより Attention重み:
\[
\mathbf{A} = \text{softmax}(\mathbf{S}) \in \mathbb{R}^{5 \times 5}
\]

文脈ベクトル出力:
\[
\mathbf{Z}_i = \mathbf{A} \mathbf{V}_i \in \mathbb{R}^{5 \times 2}
\]

③ Multi-Head Attention
すべてのヘッド出力を結合:
\[
\text{concat}(\mathbf{Z}_1, \mathbf{Z}_2) \in \mathbb{R}^{5 \times 4}
\]
線形変換で統合:
\[
\mathbf{O} = \text{concat} \cdot \mathbf{W}_O \quad \left( \mathbf{W}_O \in \mathbb{R}^{4 \times 4} \right)
\]

④ 残差接続とLayer Normalization(1回目)
\[
\mathbf{H}’ = \text{LayerNorm}(\mathbf{H}^{(l)} + \mathbf{O}) \in \mathbb{R}^{5 \times 4}
\]

⑤ Feed Forward Network(FFN)
重み行列:
- \( \mathbf{W}_1 \in \mathbb{R}^{4 \times 6} \)
- \( \mathbf{W}_2 \in \mathbb{R}^{6 \times 4} \)
処理:
\[
\mathbf{F}_1 = \text{ReLU}(\mathbf{H}’ \cdot \mathbf{W}_1 + \mathbf{b}_1) \in \mathbb{R}^{5 \times 6}
\]
\[
\mathbf{F}_2 = \mathbf{F}_1 \cdot \mathbf{W}_2 + \mathbf{b}_2 \in \mathbb{R}^{5 \times 4}
\]

⑥ 残差接続とLayer Normalization(2回目)
\[
\mathbf{H}^{(l+1)} = \text{LayerNorm}(\mathbf{H}’ + \mathbf{F}_2) \in \mathbb{R}^{5 \times 4}
\]

⑦ 出力生成(語彙スコアと確率)
Transformer最終出力:
\[
\mathbf{H}^{(L)} \in \mathbb{R}^{5 \times 4}
\]
語彙埋め込みの転置:
\[
\mathbf{E}^\top \in \mathbb{R}^{4 \times 8}
\]
各トークン位置 \( t \) におけるスコアと確率:
\[
\text{logits}_t = \mathbf{h}_t \cdot \mathbf{E}^\top \in \mathbb{R}^{8}
\]
\[
\mathbf{p}_t = \text{softmax}(\text{logits}_t) \in \mathbb{R}^{8}
\]

まとめ:小さな数値でTransformerを視覚化
このように、文長や次元数を小さく設定することで、Transformerの計算フローを図やイラストで直感的に可視化しやすくなります。図解を行う際には、各テンソルのサイズ・役割・変換先を対応させることが重要です。
Transformerモデルにおける主要テンソル・パラメータ 一覧
| 名称 | 記号 | 形状 | 役割・意味 |
|---|---|---|---|
| 語彙埋め込み行列 | \( \mathbf{E} \) | \( V \times d \) | 語彙IDを意味ベクトルに変換。Decoderでは出力時にも再利用(共有)。 |
| トークン埋め込み列 | \( \mathbf{X} \) | \( T \times d \) | 入力文の各トークンを埋め込んだベクトル列。 |
| 位置埋め込み行列 | \( \mathbf{P} \) | \( T \times d \) | 単語の並び順をベクトル空間に埋め込む。 |
| 初期入力ベクトル | \( \mathbf{H}^{(0)} = \mathbf{X} + \mathbf{P} \) | \( T \times d \) | Self-Attention層への初期入力。 |
| 各層の出力(隠れ状態) | \( \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 \) | 重み付きValueベクトルの合成結果。 |
| マルチヘッド出力(結合) | \( \text{concat}(head_1,\dots,head_h) \) | \( T \times d \) | 全ヘッドを結合した出力。 |
| 多頭統合用線形変換 | \( \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 \) | 次の語が出現する確率分布。 |
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

