全体アウトライン
本書は、現代の人工知能技術の中核を担う「Transformer(トランスフォーマー)」の構造と動作原理を、基礎から実践まで分かりやすく解説する技術書です。
本書の目的と対象読者
本書は、機械学習を学び始めたエンジニアや、大規模言語モデル(LLM)の内部構造を根本から理解したい学習者を対象としています。 「なぜ従来のモデルよりも圧倒的に高性能なのか」「Attention とは具体的に何を計算しているのか」「現代の LLM に至るまでどのように改良されてきたのか」という疑問に対し、難しい数式を直感的な図解と言葉で噛み砕きながら解説します。
章構成一覧
第1章 Transformerの登場背景と歴史的意義
Transformer が登場する前の自然言語処理で主流だった RNN(再帰型ニューラルネットワーク)や LSTM、CNN の特徴と技術的限界を振り返ります。系列データを順番に処理せざるを得ない並列化の困難さや、長文を処理する際の記憶消失問題をどのように打破したのかを解説します。
第2章 Self-Attentionの数理と直感
Transformer の心臓部である「Self-Attention(自己注意機構)」の仕組みを解き明かします。Query(検索キー)、Key(照合対象)、Value(実際の情報)という 3 つの役割と、Scaled Dot-Product Attention の計算手順、そして複数の視点から文脈を捉える Multi-Head Attention の意義を学びます。
第3章 位置エンコーディングの仕組み
Transformer は単語を一度に並列処理するため、そのままでは語順の情報が失われてしまいます。語順を認識させるための Sinusoidal Positional Encoding(正弦波位置エンコーディング)の原理や、現代の LLM で主流となっている RoPE(Rotary Position Embedding)などの発展的な位置表現を解説します。
第4章 エンコーダ・デコーダの全体構造
Transformer 全体を構成するエンコーダ(理解部)とデコーダ(生成部)のブロック構造を詳しく見ていきます。残差接続(Residual Connection)、層正規化(Layer Normalization)、位置依存フィードフォワードネットワーク(FFN)、そして文章生成時に未来の単語を見ないようにするマスキング処理の役割を整理します。
第5章 主要な派生モデルの分類と進化
Transformer の構造から分岐した代表的な 3 つの系統(Encoder-only 型の BERT、Decoder-only 型の GPT、Encoder-Decoder 型の T5)を比較します。なぜ近年の生成 AI や大規模言語モデルでは Decoder-only 型が主流となったのか、そのアーキテクチャ上の理由を明らかにします。
第6章 画像・マルチモーダルへの展開
自然言語処理にとどまらず、画像認識の世界を変革した Vision Transformer(ViT)や、音声処理、マルチモーダルモデル(テキストと画像の融合)への応用を紹介します。あらゆるモダリティを「トークンの系列」として同一の枠組みで扱う Transformer の汎用性を学びます。
第7章 PyTorchによる最小実装と動作確認
Python と PyTorch を使用して、Scaled Dot-Product Attention や Multi-Head Attention をゼロから実装します。テンソルの形状(Shape)の変化を追いながら、数式がどのようにプログラムコードに変換され実行されるのかを体験します。
第8章 計算効率化と高速化技術
系列の長さに対して計算量とメモリ消費が 2 乗で増大する $O(N^2)$ の課題と、その克服に向けた高速化技術を取り上げます。推論を高速化する KV キャッシュ、Grouped-Query Attention(GQA)、そしてハードウェアのメモリ階層を最適化する FlashAttention の仕組みを解説します。
第9章 Transformerの課題と次世代アーキテクチャ
Transformer が抱える本質的な課題(計算コスト、無限コンテキストの困難さ、幻覚現象など)を整理し、それらを克服するために登場した状態空間モデル(Mamba 等)やハイブリッドアーキテクチャなど、次世代のモデル設計の動向を展望します。
1. Transformerの登場背景と歴史的意義
自然言語処理における系列変換の課題
文章や音声、プログラムコードのようなデータは、要素が特定の順序で並ぶ「系列データ(Sequence Data)」と呼ばれます。 たとえば日本語の文章では、単語が並ぶ順序によって文章全体の意味が大きく変化します。 自然言語処理における機械翻訳や文書要約、質問応答といったタスクは、ある系列を入力として受け取り、別の系列を出力する「系列変換(Sequence-to-Sequence: Seq2Seq)」の問題として捉えられます。
従来のディープラーニングでは、このような系列データを扱うために「過去の情報を記憶しながら 1 単語ずつ順番に読み進める」というアプローチが主流でした。 しかし、この直感的な処理方式には、コンピュータの計算効率や記憶の保持という面で大きな制約が存在していました。
RNNとLSTMの仕組みと限界
2010 年代半ばまで系列処理の主役だったのは、RNN(Recurrent Neural Network: 再帰型ニューラルネットワーク)や、その改良版である LSTM(Long Short-Term Memory)、GRU(Gated Recurrent Unit)でした。 RNN は、過去の単語を読んだ結果を「隠れ状態(Hidden State)」という固定長のベクトルに蓄積し、次の単語を処理する際に引き渡していく構造を持ちます。
単語1 ───> [ RNNセル ] ───> 隠れ状態1
│
単語2 ───> [ RNNセル ] ───> 隠れ状態2
│
単語3 ───> [ RNNセル ] ───> 隠れ状態3
この RNN の構造には、解決が困難な 2 つの根本的な弱点がありました。
▸ 逐次処理による並列計算の不可能性
RNN は直前の単語の計算結果(隠れ状態)が出揃わない限り、次の単語の計算を始めることができません。 現代の GPU(グラフィックス処理装置)は、数千から数万の計算を同時に並列実行することで真価を発揮します。 RNN のような逐次処理(ループ処理)では、GPU の計算資源を十分に活かすことができず、膨大なテキストデータを高速に学習させることが困難でした。
▸ 長距離依存関係と記憶消失の問題
文頭の単語が文末の単語と密接に関連している場合、その情報は長い単語の連鎖を経て受け渡される必要があります。 しかし、ニューラルネットワークを何十層も通り抜けるうちに、過去の情報は徐々に薄れ、数学的には勾配消失(Gradient Vanishing)という現象によって学習が進まなくなります。 LSTM や GRU はゲート機構によってこの問題を緩和しましたが、数十単語を超える長い文章になると、依然として文頭の詳細なニュアンスを保持することは困難でした。
初期のAttention機構とSeq2Seqの進化
2014 年から 2015 年にかけて、Bahdanau らや Luong らの研究によって「Attention(注意機構)」が提案されました。 従来の Seq2Seq では、入力文全体の情報をたったひとつの固定長ベクトルに圧縮してデコーダに渡していたため、情報が溢れてしまうという「情報ボトルの首(情報ボトルネック)」が生じていました。
Attention 機構は、出力文の単語を生成するたびに、入力文のすべての単語の中から「いま注目すべき単語」を動的に選び出し、その情報を直接参照する仕組みです。 たとえば「彼女はリンゴを食べた」を英語に翻訳して「ate」を生成するとき、入力文の「食べた」という単語に強い注意(重み)を向けます。 この Attention の導入により、機械翻訳の精度は劇的に向上しました。
しかし、この当時の Attention は、依然として RNN の枠組みの上に載せられた「補助的な部品」に過ぎませんでした。 根本的な計算構造が RNN である以上、並列化できないという計算速度の壁を突破することはできませんでした。
2017年「Attention Is All You Need」の衝撃
2017 年、Google の研究チーム(Ashish Vaswani ら)は、機械学習の歴史を塗り替える画期的な論文を発表しました。 その論文のタイトルこそが『Attention Is All You Need(必要なのは注意機構だけだ)』です。
この論文の核心は、これまで系列処理の常識とされていた RNN や畳み込みニューラルネットワーク(CNN)を一切使わず、「Attention のみでネットワーク全体を構築する」という極めて大胆な宣言でした。 こうして誕生した新しいアーキテクチャが「Transformer」です。
graph LR
subgraph 従来のアプローチ
RNN["RNN / LSTM<br/>(直列処理・再帰)"] --> Attn1["補助としての Attention"]
end
subgraph Transformer
Attn2["Self-Attention<br/>(完全並列・全体直結)"]
end
Transformer は、文中のすべての単語同士の関係性を一度の行列計算で並列に計算します。 これにより、100 単語離れた単語同士であっても、わずか 1 ステップの計算で直接結びつけることが可能になりました。
パラダイムシフトと現代AIの夜明け
Transformer の登場は、単なるひとつの新モデルの誕生にとどまらず、深層学習全体の研究と産業の方向性を決定づけました。
第一に、GPU による完全な並列学習が可能になったことで、数億から数千億単語に及ぶウェブ規模の大規模テキストを現実的な時間で学習できるようになりました。 第二に、系列が長くなっても情報が劣化しないため、文脈理解の精度が飛躍的に向上しました。
この Transformer を基盤として、2018 年の BERT、GPT-1、GPT-2、そして近年の ChatGPT や Claude、Gemini といった大規模言語モデル(LLM)が次々と花開きました。 さらには、自然言語にとどまらず画像認識(Vision Transformer)や音声処理、タンパク質構造予測(AlphaFold)にまで応用が広がっています。 次章では、この驚異的なモデルの中心で駆動している「Self-Attention(自己注意機構)」の数学的な仕組みを丁寧に見ていきます。
2. Self-Attentionの数理と直感
Self-Attentionとは何か
文章の中の単語は、単体で孤立して存在しているわけではありません。 周囲にあるほかの単語との関係性によって、その単語の正確な意味やニュアンスが定まります。 たとえば「銀行の 窓口 に行く」という文と、「部屋の 窓口 を開ける」という文では、「窓口」が持つ意味のニュアンスは異なります。
Self-Attention(自己注意機構)とは、「同じ文章の中にあるすべての単語同士がお互いに注意(重み)を向け合い、文脈を考慮した新しい意味表現を作り出す仕組み」です。 外部の辞書を引くのではなく、自分自身の文章の中で「どの単語とどの単語が結びついているのか」を直接計算するため、「Self(自己)」という名前がついています。
Query・Key・Valueのアナロジー
Self-Attention の数式を理解するためのもっとも分かりやすい例えが、ウェブ検索やデータベースの仕組みです。 Self-Attention では、すべての単語ベクトルから次の 3 つの役割を持つベクトルを作成します。
▸ Query(クエリ: 検索の問い合わせ)
「私はこの単語ですが、私の意味を正しく理解するために、どの単語の情報を探せばよいですか?」という検索キーワードに相当します。
▸ Key(キー: 照合用の見出し)
「私はこういう特徴を持つ単語です」という、各単語が外に向けて提示するラベルやインデックスに相当します。
▸ Value(バリュー: 実際の情報内容)
照合の結果として相手に引き渡す、単語の実際の意味データそのものです。
ある単語の Query と、文中のすべての単語の Key を突き合わせて相性を計算します。 相性が高かった単語の Value をたくさん集め、相性が低かった単語の Value は少しだけ混ぜ合わせることで、文脈に染まった新しい表現を合成します。
Scaled Dot-Product Attentionの計算手順
Transformer で採用されている基本的な計算方式は「Scaled Dot-Product Attention(縮小積和注意機構)」と呼ばれます。 数式で表すと以下の 1 行になります。
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$
一見すると複雑に見えますが、処理は次の 4 つのステップに分解できます。
Q, K の内積計算 (QK^T)
│
▼
スケーリング (÷ √d_k)
│
▼
Softmax関数で重み化 (0〜1に正規化)
│
▼
V との行列積 (重み付き和の計算)
▸ ステップ1: 内積による類似度の計算
まず、Query 行列 $Q$ と Key 行列の転置 $K^T$ の行列積(内積)を計算します。 ベクトル同士の内積は、向きが似ているほど大きな値になり、直交していると 0 になります。 これにより、どの単語とどの単語が強く関連しているかを表す類似度スコアの行列が得られます。
▸ ステップ2: スケーリング(なぜ $\sqrt{d_k}$ で割るのか)
計算したスコアを、Key の次元数 $d_k$ の平方根 $\sqrt{d_k}$ で割り算します。 次元数 $d_k$ が 64 や 128 のように大きくなると、内積の値が極端に大きくなりやすくなります。 大きな値が次の Softmax 関数に入力されると、出力の確率が 0 または 1 に極端に偏り、学習時の勾配(重みを更新するための傾き)がほぼ 0 になる「勾配消失」が起きてしまいます。 $\sqrt{d_k}$ で割るスケーリングは、数値のばらつきを抑えて学習を安定させるための極めて重要な工夫です。
▸ ステップ3: Softmaxによる確率への正規化
スケーリング後のスコアに行列の行ごとに Softmax(ソフトマックス)関数を適用します。 これにより、すべての数値が 0 から 1 の範囲に収まり、行ごとの合計値がちょうど 1(100%)の「アテンション重み」に変換されます。 これは「どの単語に何パーセントの注意を配分するか」という比率を表しています。
▸ ステップ4: Valueの重み付き平均
最後に、ステップ 3 で求めた比率(重み)を使って、Value 行列 $V$ の各行を足し合わせます(重み付き和)。 自分に関連する単語の情報が多く混ざり合い、無関係な単語の情報は排除された、文脈化された新しいベクトルが出力されます。
Multi-Head Attentionの仕組みと必要性
1 組の $Q, K, V$ だけで計算を行う場合、注意を向けられる観点が 1 つに限定されてしまうという欠点があります。 文章を読むとき、人間はさまざまな観点を同時に気にしています。 たとえば「文法的な主語と動詞の関係」「代名詞が何を指しているか」「修飾語がどこにかかっているか」といった多様な関係性です。
Multi-Head Attention(マルチヘッドアテンション)は、この課題を解決するために考案されました。 入力を複数の異なる空間(ヘッド)に分割し、それぞれのヘッドで独立して Attention を計算します。
graph TD
Input["入力ベクトル"] --> Split["異なる線形変換で h 個のヘッドに射影"]
Split --> Head1["Head 1: 主語・動詞の関係に注目"]
Split --> Head2["Head 2: 修飾関係に注目"]
Split --> Head3["Head h: 代名詞の照応に注目"]
Head1 --> Concat["全ヘッドの出力を結合 (Concat)"]
Head2 --> Concat
Head3 --> Concat
Concat --> Output["線形変換 (W_O) を経て最終出力"]
元のベクトルをそのまま使うのではなく、ヘッドごとに異なる重み行列 $W_i^Q, W_i^K, W_i^V$ を掛けて射影します。 これにより、あるヘッドは「誰が何をしたか」に注目し、別のヘッドは「いつ・どこで」に注目するといった、多角的な文脈理解が可能になります。
最後に、すべてのヘッドから得られた出力を横に連結(Concatenate)し、仕上げの線形変換行列 $W^O$ を掛けて元の次元数に戻します。 この Multi-Head Attention によって、Transformer は文章の微細なニュアンスや長距離の構造を驚異的な精度で捉えることができるのです。 次章では、単語の順番を認識させるためのもうひとつの重要技術「位置エンコーディング」を解説します。
3. 位置エンコーディングの仕組み
なぜ位置情報が必要なのか
RNN は単語を先頭から 1 つずつ順番に処理していたため、「何番目に読まれた単語か」という順序情報が自然にネットワークへ伝わっていました。 しかし、Transformer の Self-Attention は、文中のすべての単語を同時に並列計算します。
ここで大きな問題が生じます。 数学的に見ると、Self-Attention には「入力の順序を入れ替えても、同じ関係性のスコアが出力される」という順序不変性(Permutation Invariance)の性質があります。 語順の情報が一切与えられない場合、次の 2 つの文を Transformer は区別できません。
- 「犬が 猫を 追いかけた」
- 「猫が 犬を 追いかけた」
この 2 つの文は使われている単語が同一ですが、意味は正反対です。 並列計算の利点を保ちながら「どの単語が文頭にあり、どの単語が文末にあるのか」をモデルに教える仕組みとして導入されたのが、「位置エンコーディング(Positional Encoding)」です。
正弦波位置エンコーディングの数学的仕組み
原論文『Attention Is All You Need』では、三角関数(サイン関数とコサイン関数)を利用した「正弦波位置エンコーディング(Sinusoidal Positional Encoding)」が提案されました。 各単語の埋め込みベクトルと同じ次元を持つ「位置ベクトル」を計算し、単語の意味ベクトルに直接足し合わせます(加算)。
各位置 $pos$(0 番目、1 番目、2 番目…)およびベクトルの次元番号 $i$ に対して、次のような数式で値を算出します。
$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) $$
$$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) $$
ここで $d_{\text{model}}$ はベクトルの全次元数(例: 512 次元)を表します。
次元 0, 1 : 周期がとても短い波(すぐ隣の単語との違いを敏感に捉える)
次元 2, 3 : 少し周期が長い波
...
次元 510, 511: 周期が極めて長い波(文章全体の大きな位置関係を大まかに捉える)
▸ 三角関数が選ばれた理由
なぜただの数字の連番(1, 2, 3…)を足すのではなく、三角関数の波を使ったのでしょうか。 単なる連番を足すと、文が長くなったときに位置の値だけが極端に巨大化し、単語の意味ベクトルをかき消してしまいます。 三角関数を使えば、すべての値が必ず -1 から 1 の範囲に収まるため、単語の意味情報を壊しません。
さらに、三角関数の加法定理により、ある位置 $pos + k$ の位置ベクトルは、位置 $pos$ のベクトルの線形変換(回転のような計算)として表現できるという数学的な利点があります。 これにより、モデルは「絶対的な位置」だけでなく、「2 つの単語がどれくらい離れているか」という「相対的な距離」も容易に学習することができます。
▸ なぜ結合(Concat)ではなく足し算(加算)なのか
位置情報をベクトルに付け足す場合、後ろに新しい数値をくっつける「結合」のほうが直感的かもしれません。 しかし結合を行うと、ベクトルの次元数が増えて計算量が増加してしまいます。 高次元空間(たとえば 512 次元や 1024 次元)では、異なる情報同士が干渉せずに共存できる十分な広さがあるため、単純な足し算(重ね合わせ)であっても、ニューラルネットワークは単語の意味と位置の情報を正確に分離して認識できます。
学習可能位置埋め込み(Learned Positional Embedding)
正弦波のような固定の数式を使わず、位置情報そのものをニューラルネットワークの学習パラメータとして最適化する手法も広く使われました。 これを「学習可能位置埋め込み(Learned Positional Embedding)」と呼びます。
BERT や 初期の GPT(GPT-1、GPT-2)などでは、この学習可能な埋め込みが採用されました。 各位置(0番目用、1番目用…)に独立したベクトルを用意し、単語埋め込みと同様にバックプロパゲーションで最適な数値を学習させます。
この手法は実装がシンプルですが、「学習時に設定した最大長(例: 512 トークン)を超える長さの文章を処理できない」という致命的な欠点がありました。 学習していない 513 番目の位置ベクトルが存在しないためです。
現代の大規模言語モデルにおける位置表現の進化
現代の大規模言語モデル(LLM)では、数千から数十万トークンにおよぶ超長文を扱う必要があります。 そのため、より柔軟で拡張性に優れた位置表現手法が開発されてきました。
▸ 相対位置エンコーディング(Relative Positional Encoding)
単語の絶対的な場所(「文頭から何文字目か」)ではなく、単語同士の相対的な距離(「3 文字前にある」「5 文字後にある」)を直接 Attention のスコアに反映させる手法です(T5 などで採用)。
▸ 回転位置埋め込み(RoPE: Rotary Position Embedding)
LLaMA や Mistral、PaLM など、現代の最先端オープン LLM で業界標準となっているのが RoPE です。 2 次元の平面上でベクトルを角度 $\theta$ だけ回転させる操作を多次元に拡張し、Query と Key のベクトルをそれぞれの位置に応じて回転させます。 内積を計算したときに「位置の差(相対距離)」だけが数学的に綺麗に残る設計になっており、長文への汎化性能が非常に高いのが特徴です。
▸ ALiBi(Attention with Linear Biases)
位置埋め込みベクトルそのものを一切使わず、Query と Key の内積計算結果に対して、単語間の距離に比例したペナルティ(マイナスのバイアス)を直接引き算する手法です。 計算が極めてシンプルで、学習時よりもはるかに長い文章に対しても性能が劣化しにくいという強みを持っています。
このように、位置表現技術の進化によって、Transformer は語順を正確に把握するだけでなく、何万文字もの長文脈を自在に読み解けるようになりました。 次章では、これらを統合した Transformer の「エンコーダ」と「デコーダ」の全体アーキテクチャを解剖します。
4. エンコーダ・デコーダの全体構造
Transformerの全体像
Transformer の基本構造は、機械翻訳などの系列変換タスクを目的として設計された「エンコーダ・デコーダ(Encoder-Decoder)モデル」です。 左側の「エンコーダ(Encoder: 符号化器)」が入力文全体を読み込んで深い意味を抽出し、右側の「デコーダ(Decoder: 復号器)」がその情報を受け取って出力文を 1 単語ずつ生成します。
graph TD
subgraph Encoder["エンコーダ (N層積み重ね)"]
E_In["入力単語埋め込み + 位置エンコーディング"] --> E_MHA["Multi-Head Attention"]
E_MHA --> E_AddNorm1["残差接続 & 層正規化 (Add & Norm)"]
E_AddNorm1 --> E_FFN["Feed-Forward Network (FFN)"]
E_FFN --> E_AddNorm2["残差接続 & 層正規化 (Add & Norm)"]
end
subgraph Decoder["デコーダ (N層積み重ね)"]
D_In["出力単語埋め込み + 位置エンコーディング"] --> D_MMHA["Masked Multi-Head Attention<br/>(未来の単語をマスク)"]
D_MMHA --> D_AddNorm1["残差接続 & 層正規化 (Add & Norm)"]
D_AddNorm1 --> D_Cross["Cross-Attention<br/>(エンコーダの出力を参照)"]
E_AddNorm2 -.->|Key / Value| D_Cross
D_Cross --> D_AddNorm2["残差接続 & 層正規化 (Add & Norm)"]
D_AddNorm2 --> D_FFN["Feed-Forward Network (FFN)"]
D_FFN --> D_AddNorm3["残差接続 & 層正規化 (Add & Norm)"]
end
D_AddNorm3 --> Linear["線形層 + Softmax"]
Linear --> Out["次の単語の確率分布"]
原論文では、エンコーダとデコーダの双方が 6 層($N=6$)ずつ積み重ねられた構造を持っています。
エンコーダの内部構造
エンコーダの役割は、入力文に含まれる単語同士の関係性をくまなく分析し、豊かな文脈ベクトルを作り出すことです。 エンコーダの各層は、次の 2 つの主要サブレイヤーで構成されています。
- Multi-Head Attention(自己注意機構): 文中の全単語がお互いを参照し合い、前後の文脈情報を融合します。
- Position-wise Feed-Forward Network(位置依存フィードフォワード回路): 各単語のベクトルを独立に非線形変換し、さらに高次の表現へ変換します。
各サブレイヤーの前後には、学習を安定させるための「残差接続」と「層正規化」が必ず配置されています。
位置依存フィードフォワードネットワーク(FFN)
Self-Attention で単語同士の情報の「やり取り(混合)」を行った後、各単語のベクトルは FFN(Feed-Forward Network)に入力されます。 FFN は単語間の関係を見るのではなく、単語ごとに独立して同じ変換を適用する 2 層の全結合層です。
数式で表すと以下のようになります。
$$ \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 $$
一般的に、隠れ層の次元数($d_{ff}$)は入力次元数($d_{\text{model}}$)の 4 倍程度(例: 512 次元から 2048 次元)に一度拡張され、活性化関数(原論文では ReLU、現代では GELU や SwiGLU など)を通した後に元の次元に戻されます。 Self-Attention が「単語同士のコミュニケーション」を担当するのに対し、FFN は「集めた情報を各単語が自分自身の中で深く思考・記憶する」役割を果たしていると考えられています。
残差接続と層正規化の役割
ネットワークの層が深くなると、学習信号(勾配)が逆伝播する途中で消失したり爆発したりして、学習が破綻しやすくなります。 これを防ぐために、Transformer では ResNet で確立された「残差接続」と「層正規化」を徹底して組み込んでいます。
▸ 残差接続(Residual Connection)
サブレイヤーの入力を $x$、出力を $\text{SubLayer}(x)$ としたとき、出力を単純に置き換えるのではなく、$x + \text{SubLayer}(x)$ として入力をそのまま足し合わせるバイパス経路(スキップ結合)を設けます。 これにより、層がどれほど深くなっても入力情報や勾配が減衰せずに素通りできるため、100 層を超えるような巨大なモデルでも安定して学習できるようになります。
▸ 層正規化(Layer Normalization: LayerNorm)
ミニバッチ内のサンプル間で正規化を行う画像認識の Batch Normalization に対し、Layer Normalization は「1 つの単語ベクトル内の特徴量次元」にわたって平均が 0、分散が 1 になるように正規化します。 これにより、系列長が可変であっても安定して正規化が行えます。
▸ Post-LN から Pre-LN、そして RMSNorm へ
原論文ではサブレイヤーの出力後に正規化を行う「Post-LN」が使われていましたが、学習開始時に勾配が不安定になりやすく、慎重な学習率ウォームアップが必要でした。 そのため、現代のモデルではサブレイヤーの入力直前に正規化を置く「Pre-LN」が標準となっています。 さらに LLaMA などの最新モデルでは、計算コストを削減するために平均の引き算を省略し、二乗平均平方根だけでスケーリングする「RMSNorm」が主流となっています。
デコーダ固有のメカニズム
デコーダは、これまでに生成した単語とエンコーダの分析結果を両方使って、次に続く単語を 1 つずつ予測していきます。 デコーダには、エンコーダにはない 2 つの特別な機構が備わっています。
▸ Masked Multi-Head Attention(因果的マスキング)
文章を生成するとき、未来の単語(これから喋る単語)を先に見ることはカンニングになってしまいます。 モデルが自分より後ろにある単語に注意を向けないように、未来の単語に対応する Attention スコアを強制的に $-\infty$(極めて大きな負の値)に書き換える「マスキング(Causal Masking)」を行います。 Softmax 関数を通すと $-\infty$ は 0% になるため、モデルは「過去および現在」の単語だけを見て次の単語を予測するようになります。 これにより、学習時はすべての単語を一度に並列学習(Teacher Forcing)させつつ、推論時は自然な左から右へのテキスト生成が実現できます。
▸ Cross-Attention(交差注意機構)
デコーダの第 2 の Attention レイヤーでは、デコーダ自身の単語(Query)を使って、エンコーダから出力された文脈情報(Key と Value)を参照します。 たとえば英日翻訳で「リンゴ」という日本語を出力しようとしているとき、エンコーダの入力文「I ate an apple」の中の「apple」に強い注意を向けて情報を取り出します。 この Cross-Attention によって、入力文と出力文が的確に橋渡しされます。
次章では、このエンコーダ・デコーダの基本構造から、現代の BERT、GPT、T5 などの多様なモデルがどのように枝分かれして進化したのかを比較します。
5. 主要な派生モデルの分類と進化
Transformerから分岐した3つの道
原論文の Transformer はエンコーダとデコーダの両方を備えた構成でしたが、その後の研究によって「用途に合わせて片方だけを取り出す」という設計思想が広まりました。 その結果、現代の自然言語処理モデルは大きく次の 3 つの系統に分類されます。
Transformer (オリジナル: Encoder + Decoder)
│
├── Encoder-only 型(BERT, RoBERTa など)
│ └─ 文脈の理解・文章の分類・検索埋め込みに特化
│
├── Decoder-only 型(GPTシリーズ, LLaMA など)
│ └─ 次の単語の予測・自由な文章生成・対話に特化
│
└── Encoder-Decoder 型(T5, BART など)
└─ 入力文を別の形式へ変換するタスク(翻訳・要約)に特化
この 3 つの構造は、アテンションのマスク方法と、事前学習で解かせる課題(学習タスク)に決定的な違いがあります。
Encoder-only型(BERT系): 文脈理解のエキスパート
2018 年に Google が発表した「BERT(Bidirectional Encoder Representations from Transformers)」は、Transformer のエンコーダ部分のみを取り出したモデルです。
BERT の最大の特徴は、文章の「左から右」と「右から左」の双方の文脈を同時に見渡せる「双方向アテンション(Bidirectional Attention)」にあります。 未来の単語を隠すマスキングを行わないため、文中のすべての単語が周囲全体の単語を自由に参照できます。
▸ 事前学習タスク: マスク化言語モデル(MLM)
BERT は、入力文の一部の単語をランダムに [MASK] という特殊記号に置き換え、「穴埋め問題」を解かせることで学習します。
前後の文脈を手がかりにして隠された単語を当てるため、文の構造や文脈の深い意味を極めて精密に把握する能力が身につきます。
感情分析や文書分類、固有表現抽出、あるいはテキスト検索で使われる高品質なベクトル(Embedding)の抽出などに広く活用されています。
Decoder-only型(GPT系): 文章生成のフロンティア
OpenAI が開発した GPT(Generative Pre-trained Transformer)シリーズや、Meta の LLaMA などは、デコーダ部分のみで構成されたモデルです。 Cross-Attention は存在せず、Masked Multi-Head Attention と FFN のみを積み重ねます。
▸ 事前学習タスク: 自己回帰言語モデル(Causal LM)
GPT は、「与えられたテキストの続きに来る、もっとも自然な次の 1 単語(トークン)を予測する」という極めてシンプルなタスク(Next-token Prediction)を解き続けます。 未来の単語を見ない因果的アテンション(Causal Attention)を採用しているため、文章を最初から最後まで流暢に生成することに長けています。
Encoder-Decoder型(T5系): 万能なテキスト変換器
Google が 2019 年に発表した「T5(Text-to-Text Transfer Transformer)」は、元の Transformer と同様にエンコーダとデコーダの両方を維持したモデルです。 「すべてのタスクをテキスト入力からテキスト出力への変換として解く」という思想で作られました。
たとえば翻訳なら「translate English to German: That is good」を入力して「Das ist gut」を出力し、要約なら「summarize: …」を入力して要約文を出力します。 入力文全体をエンコーダでじっくり分析し、その結果をもとにデコーダで柔軟に出力を組み立てられるため、機械翻訳や長文要約などのタスクで非常に高い安定性を発揮しました。
なぜ現代のLLMは「Decoder-only」が主流となったのか
2020 年代以降、ChatGPT や Claude、Gemini、LLaMA をはじめとする大規模言語モデルのほぼすべてが「Decoder-only 型」を採用しています。 一見すると、双方向の文脈を読める BERT や、入力と出力を分離できる T5 のほうが優れているように思えます。 なぜ Decoder-only が業界標準を勝ち取ったのでしょうか。主な理由は 3 つあります。
▸ 1. あらゆるタスクの統一と In-context Learning
Decoder-only モデルは、入力(プロンプト)と出力(回答)の区別がありません。 「質問と回答」をただ 1 本のテキストとしてつなげて流し込むだけで、モデルは自然と文脈を読み取り、続きを生成します。 これにより、特定のタスク向けにモデルの構造を変えたり再学習したりすることなく、プロンプトの指示だけで即座に新しいタスクをこなす「汎用知能(In-context Learning)」が発現しました。
▸ 2. 計算効率とスケーリングの優位性
エンコーダとデコーダを分けると、エンコーダの計算が終わるまでデコーダの処理が待たされるなど、ハードウェアの並列パイプラインが複雑になります。 Decoder-only 型は構造が完全に均一であるため、超巨大クラスタの GPU 群へ均等に計算を分散させる「テンソル並列」や「パイプライン並列」の実装がはるかに容易でした。 また、ウェブ上の膨大な生テキストを一切の加工なしに「続きの予測」としてそのまま投入できるため、データの学習効率も最大化されました。
▸ 3. 推論時における KV キャッシュとの相性の良さ
文章生成時の推論では、過去に計算した単語の Key と Value のベクトルをメモリに保存しておく「KV キャッシュ」という技術を使います。 Decoder-only 型では、新しい単語を 1 つ生成するときに「直前の 1 トークン分」だけを行列計算すればよいため、余分な計算が一切発生せず、推論のループを極めて高速に回すことができます。
次章では、この強力な Transformer の構造が、テキストの枠を飛び越えて画像や音声、マルチモーダルへどのように広がっていったのかを学びます。
6. 画像・マルチモーダルへの展開
普遍的な系列処理装置としてのTransformer
Transformer はもともと英語やフランス語などの「言葉」を翻訳するために作られたモデルでした。 しかし、その本質は「要素同士の関連性を柔軟に計算し、ベクトルを変換する汎用的な計算器」です。
コンピュータの世界では、テキストだけでなく、画像も、音声も、遺伝子の塩基配列も、ロボットの制御信号も、すべて「数値の並び(トークンの系列)」に変換できます。 入力の形式さえ整えれば、同じ Transformer の構造をそのままあらゆる領域に転用できるという驚くべき普遍性が明らかになりました。
Vision Transformer(ViT)による画像認識革命
2020 年、Google の研究チームは「Vision Transformer(ViT)」を発表し、コンピュータビジョンの分野に大きな衝撃を与えました。 それまで画像認識といえば、畳み込みニューラルネットワーク(CNN)が絶対的な王座に君臨していました。 ViT は、畳み込みを一切使わず、標準的な Transformer エンコーダだけで最先端の CNN を凌駕する性能を叩き出したのです。
graph TD
Img["1枚の画像 (例: 224x224)"] --> Patch["16x16 ピクセルのパッチに分割 (計196枚)"]
Patch --> Linear["各パッチを平坦化して線形射影 (単語埋め込み化)"]
Linear --> Pos["パッチの位置エンコーディングを加算"]
Pos --> Cls["先頭に分類用トークン [CLS] を追加"]
Cls --> Enc["Transformer エンコーダ (Multi-Head Attention)"]
Enc --> Out["[CLS] トークンの出力から画像ラベルを分類"]
ViT の発想はシンプルかつ独創的です。
- 入力画像を $16 \times 16$ ピクセルなどの小さな正方形の「パッチ(小片)」に切り刻みます。
- 各パッチを 1 つの「単語(トークン)」と見立てて平坦化し、線形層で埋め込みベクトルに変換します。
- パッチの元々の位置を示す位置エンコーディングを加算します。
- 画像全体の分類結果を表現するための特殊なトークン
[CLS]を先頭に付与し、Transformer エンコーダに入力します。
▸ CNNとの違いと帰納バイアス
CNN は「近くにあるピクセル同士が関係している」という人間の直感を設計に組み込んだ(局所的な帰納バイアスを持つ)モデルです。 一方、ViT は初めから画面の端と端のピクセル同士を自由に関係づけることができます。 データが少ないときは学習が難しいものの、数千万枚から数億枚という超大規模データで事前学習を行うと、CNN の限界を軽々と突破する柔軟な認識能力を獲得します。
音声認識への応用(Whisperの衝撃)
音声データも同様に Transformer で処理できます。 音声を周波数と時間のグラフ(メルスペクトログラム)に変換すると、それは 1 枚の 2 次元画像のように扱えます。
OpenAI が開発した音声認識モデル「Whisper」は、標準的な Transformer(Encoder-Decoder 型)を採用しています。 音声スペクトログラムをエンコーダに読み込ませ、デコーダからテキスト(書き起こし文)を自己回帰的に生成します。 この単純で洗練されたアーキテクチャにより、世界中の言語の音声認識、翻訳、音声区間検出を同一のモデルで高精度に実行できるようになりました。
マルチモーダルモデルの融合
近年急速に発展している「マルチモーダル AI」は、テキスト、画像、音声を 1 つの頭脳で統合的に理解・処理する技術です。 ここでも Transformer が中心的な役割を果たしています。
▸ CLIPによる意味空間の統一
OpenAI の CLIP(Contrastive Language-Image Pre-training)は、画像のエンコーダ(ViT)とテキストのエンコーダを対照学習(Contrastive Learning)させました。 「犬の写真」と「dog という文章」のベクトルが多次元空間の中で同じ位置に近づくように学習させることで、画像とテキストを共通の「意味空間」で比較できるようになりました。
▸ プロジェクションによるLLMとの結合(LLaVAなど)
LLaVA(Large Language and Vision Assistant)などの視覚言語モデルでは、ViT で抽出した画像のパッチ特徴量を、単純な線形層や小さな MLP(プロジェクション層)を通して LLM(LLaMA など)の単語埋め込みと同じ次元に変換します。 そして、その画像ベクトルを「あたかもテキストの単語であるかのように」LLM のデコーダにそのまま入力します。 LLM はテキストの単語も画像のパッチも区別せず、同じ Self-Attention 機構を通じて同時に理解し、画像についての質問に答えることができます。
▸ ネイティブ・マルチモーダルへの進化
最新のフロンティアモデル(GPT-4o や Google Gemini など)では、別々のモデルを後から繋ぎ合わせるのではなく、初めからテキスト、画像、音声を同一の Transformer アーキテクチャの中でエンドツーエンドに同時学習させる「ネイティブ・マルチモーダル」へと進化しています。
次章では、このあらゆる AI の心臓部である Transformer を、実際に PyTorch コードを使ってゼロから動かす実践プログラミングに取り組みます。
7. PyTorchによる最小実装と動作確認
実装で理解するTransformer
数式や概念を最も深く理解する方法は、実際にプログラミング言語で動くコードを書いてみることです。 本章では、深層学習フレームワークの標準である PyTorch を使用して、Transformer の核心である「Scaled Dot-Product Attention」「Multi-Head Attention」「Transformer ブロック」をゼロから実装します。
外部の高度なライブラリに頼らず、テンソル(多次元配列)の形状(Shape)の変化を 1 ステップずつ追いながら実装していきます。
テンソルの形状(Shape)の約束事
コードを読む前に、データがどのような形で流れていくのかを整理しておきます。
batch_size : 一度に処理する文章の数(例: 2)
seq_len : 1つの文章に含まれる単語(トークン)の数(例: 4)
d_model : 1つの単語を表現するベクトルの次元数(例: 64)
num_heads : マルチヘッドアテンションのヘッドの数(例: 4)
d_k : 1つのヘッドあたりの次元数 (d_model // num_heads, 例: 16)
入力テンソルは通常、(batch_size, seq_len, d_model) という 3 次元の形状を持ちます。
Scaled Dot-Product Attentionの実装
まずは、Attention の基本計算を行う関数を実装します。
import math
import torch
import torch.nn as nn
import torch.nn.functional as F
def scaled_dot_product_attention(q, k, v, mask=None):
"""Scaled Dot-Product Attention の計算
q, k, v の形状: (batch_size, num_heads, seq_len, d_k)
mask の形状: (batch_size, 1, seq_len, seq_len) または None
"""
d_k = q.size(-1)
# 1. Q と K の内積計算: (batch, heads, seq, d_k) x (batch, heads, d_k, seq)
# -> (batch, heads, seq, seq)
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)
# 2. マスクの適用(未来の単語やパディングを遮断)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
# 3. Softmax による確率(アテンション重み)への変換
attention_weights = F.softmax(scores, dim=-1)
# 4. Value との行列積
# (batch, heads, seq, seq) x (batch, heads, seq, d_k) -> (batch, heads, seq, d_k)
output = torch.matmul(attention_weights, v)
return output, attention_weights
k.transpose(-2, -1) は、Key テンソルの最後の 2 つの軸を入れ替える操作(転置)です。
内積を計算した後、scores.masked_fill(mask == 0, -1e9) によって、マスク対象の位置のスコアをほぼ $-\infty$ に置き換えています。
Multi-Head Attentionの実装
次に、複数のヘッドに分割して並列計算を行う Multi-Head Attention モジュールをクラスとして定義します。
class MultiHeadAttention(nn.Module):
def __init__(self, d_model=64, num_heads=4):
super().__init__()
assert d_model % num_heads == 0, "d_model must be divisible by num_heads"
self.d_model = d_model
self.num_heads = num_heads
self.d_k = d_model // num_heads
# Q, K, V を生成するための線形変換層
self.w_q = nn.Linear(d_model, d_model)
self.w_k = nn.Linear(d_model, d_model)
self.w_v = nn.Linear(d_model, d_model)
# 全ヘッドの出力をまとめる最終線形層
self.w_o = nn.Linear(d_model, d_model)
def forward(self, q, k, v, mask=None):
batch_size = q.size(0)
# 1. 各入力を線形射影し、ヘッドごとに分割して形状変更
# (batch, seq, d_model) -> (batch, seq, num_heads, d_k) -> (batch, num_heads, seq, d_k)
q = (
self.w_q(q)
.view(batch_size, -1, self.num_heads, self.d_k)
.transpose(1, 2)
)
k = (
self.w_k(k)
.view(batch_size, -1, self.num_heads, self.d_k)
.transpose(1, 2)
)
v = (
self.w_v(v)
.view(batch_size, -1, self.num_heads, self.d_k)
.transpose(1, 2)
)
# 2. Scaled Dot-Product Attention の計算
out, attn_weights = scaled_dot_product_attention(q, k, v, mask=mask)
# 3. ヘッドを結合して元の形状へ戻す
# (batch, num_heads, seq, d_k) -> (batch, seq, num_heads, d_k) -> (batch, seq, d_model)
out = (
out.transpose(1, 2)
.contiguous()
.view(batch_size, -1, self.d_model)
)
# 4. 仕上げの線形変換
return self.w_o(out)
このクラスのポイントは、4 つの独立した小さな線形層を作るのではなく、1 つの大きな線形層(d_model $\rightarrow$ d_model)で一括計算してから .view() でヘッドごとに切り分けている点です。
こうすることで、GPU の計算効率が飛躍的に向上します。
Transformerブロック(エンコーダ層)の組み立て
Multi-Head Attention の後段に、Feed-Forward Network(FFN)と残差接続、LayerNorm を組み合わせて、完全な 1 つの「Transformer ブロック(エンコーダ層)」を作ります。 ここでは現代の標準である Pre-LN 方式を採用します。
class TransformerEncoderBlock(nn.Module):
def __init__(self, d_model=64, num_heads=4, d_ff=256, dropout=0.1):
super().__init__()
self.attention = MultiHeadAttention(d_model, num_heads)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
# Position-wise Feed-Forward Network
self.ffn = nn.Sequential(
nn.Linear(d_model, d_ff),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(d_ff, d_model),
)
self.dropout = nn.Dropout(dropout)
def forward(self, x, mask=None):
# 1. Pre-LN + Self-Attention + 残差接続
normed_x = self.norm1(x)
attn_out = self.attention(normed_x, normed_x, normed_x, mask=mask)
x = x + self.dropout(attn_out)
# 2. Pre-LN + FFN + 残差接続
normed_x = self.norm2(x)
ffn_out = self.ffn(normed_x)
x = x + self.dropout(ffn_out)
return x
動作確認スクリプト
作成したブロックにダミーの入力データ(2 文、各文 4 単語、64 次元)を流し、正常に入出力の形状が保たれているかを確認します。
if __name__ == "__main__":
# パラメータ設定
batch_size = 2
seq_len = 4
d_model = 64
# ランダムな入力テンソルを作成
dummy_input = torch.randn(batch_size, seq_len, d_model)
print(f"入力の形状: {dummy_input.shape}")
# Transformer ブロックの初期化と実行
encoder_block = TransformerEncoderBlock(d_model=d_model, num_heads=4)
output = encoder_block(dummy_input)
print(f"出力の形状: {output.shape}")
assert (
dummy_input.shape == output.shape
), "入出力のテンソル形状が一致しません"
print("動作確認成功: 入力と同じ形状のテンソルが出力されました。")
このコードを実行すると、入力とまったく同一の形状 (2, 4, 64) の文脈化されたテンソルが出力されることが確認できます。
このブロックを何層も縦に積み重ねることで、強力な表現力を持つ深層ニューラルネットワークが完成します。
次章では、この Transformer を実サービスや超大規模言語モデルで実用化するために欠かせない「計算効率化と高速化技術」を学びます。
8. 計算効率化と高速化技術
二乗の壁($O(N^2)$問題)とメモリボトルネック
Transformer は驚異的な言語理解能力を持つ一方で、致命的な計算負荷の課題を抱えています。 系列の長さ(トークン数)を $N$ と置いたとき、すべての単語同士の組み合わせを計算するため、Self-Attention の計算量とメモリ消費量は $N$ の 2 乗($O(N^2)$)に比例して増大します。
トークン数 N = 1,000 -> アテンション行列: 100 万要素
トークン数 N = 10,000 -> アテンション行列: 1 億要素
トークン数 N = 100,000 -> アテンション行列: 100 億要素(メモリ枯渇)
書籍 1 冊分の文章や長い対話履歴、高解像度の画像を処理しようとすると、GPU のメモリ(VRAM)は一瞬でパンクしてしまいます。 この「二乗の壁」を乗り越え、実用的な速度とコストで動かすために、さまざまな効率化技術が生み出されてきました。
推論の生命線: KVキャッシュ
文章を 1 単語ずつ生成する対話型 AI では、生成のたびに文頭からの全単語をニューラルネットワークに入力し直すと、過去の単語の計算が何重にも重複して無駄になります。
ここで活躍するのが「KV キャッシュ(Key-Value Cache)」です。 自己回帰生成では、過去に登場した単語の Key と Value のベクトルは以降の計算でも変化しません。 そのため、一度計算した過去の Key と Value を GPU メモリ上に保存(キャッシュ)しておきます。
graph LR
subgraph 従来(キャッシュなし)
All["過去の全単語 + 新単語"] --> Calc["全単語の Q, K, V を毎回再計算"]
end
subgraph KVキャッシュ利用
NewToken["新単語 (1トークン)"] --> CalcNew["新単語の Q, K, V のみ計算"]
Cache["過去の K, V キャッシュ"] -.->|連結| Attn["Attention 計算"]
CalcNew --> Attn
end
新しい単語を 1 つ生成するときは、その 1 単語の Query だけを計算し、キャッシュされた過去の Key・Value と突き合わせるだけで済みます。 これにより、1 トークン生成あたりの計算量が劇的に削減されます。
メモリ消費を削る: MQAとGQA
KV キャッシュは推論を高速化する一方で、利用者が増えたり文章が長くなったりすると、キャッシュ自体が膨大な GPU メモリを消費するという新たな壁を生み出しました。 このメモリ消費を劇的に削減するために考案されたのが、Multi-Query Attention(MQA)と Grouped-Query Attention(GQA)です。
【MHA (従来のマルチヘッド)】
Head 1: Q1, K1, V1
Head 2: Q2, K2, V2
Head 3: Q3, K3, V3
Head 4: Q4, K4, V4
(全ヘッドが独立した K と V を保持するため、メモリ消費大)
【GQA (グループド・クエリアテンション)】
Group 1: Q1, Q2 ──> 共通の K1, V1 を参照
Group 2: Q3, Q4 ──> 共通の K2, V2 を参照
(グループ内で K と V を共有し、メモリ消費を大幅削減)
【MQA (マルチクエリアテンション)】
Q1, Q2, Q3, Q4 ──> たった 1 組の K, V を全員で共有
▸ Grouped-Query Attention(GQA)の勝利
MQA はメモリを最小化できますが、表現力が落ちてモデルの知能が低下しやすいという問題がありました。 そこで登場したのが、両者の中間に位置する「GQA」です。 ヘッドをいくつかのグループに分け、グループ内で Key と Value を共有します。 Meta の LLaMA 2(70B)や Llama 3、Mistral など、近年の最先端 LLM の大半が GQA を採用しており、モデルの賢さを維持したまま、推論時のメモリ消費量を数分の一に圧縮することに成功しています。
ハードウェアの真実とFlashAttention
2022 年、スタンフォード大学の Tri Dao らは「FlashAttention」を発表し、深層学習業界に革命を起こしました。 従来の高速化研究の多くは「数式をいかに近似して計算量を減らすか」に注目していましたが、FlashAttention は「GPU のハードウェア構造」に徹底して着目しました。
▸ メモリ帯域幅のボトルネック(Memory-Bound)
現代の GPU は計算速度(FLOPS)が極めて速い反面、大容量メモリ(高帯域幅メモリ: HBM)とプロセッサチップ上の超高速メモリ(SRAM)との間でデータを読み書きする速度(転送帯域)がボトルネックになっています。 従来の Attention 実装では、$N \times N$ の巨大なアテンション行列をいちいち HBM に書き出し、次の処理で再び読み込んでいました。 計算そのものよりも、メモリへの読み書き待ちで GPU が遊んでいたのです。
▸ タイリング(Tiling)と Online Softmax
FlashAttention は、データを小さなブロック(タイル)に分割し、超高速なオンチップ SRAM の中だけで Attention の計算を完結させます。 巨大な $N \times N$ 行列を HBM に一切書き出さないため、メモリの往復転送が劇的に減少します。 数式の計算量自体は $O(N^2)$ のまま一切の近似(精度の劣化)を行わないにもかかわらず、実行速度を 2〜4 倍に加速し、メモリ使用量を大幅に削減しました。 現在、FlashAttention(および改良版の FlashAttention-2 / 3)は、あらゆる Transformer の学習と推論におけるデファクトスタンダードとなっています。
次章では、これまでの技術進化を踏まえ、Transformer が直面している根本的な課題と、ポスト Transformer を目指す次世代アーキテクチャの展望を総括します。
9. Transformerの課題と次世代アーキテクチャ
人工知能の金字塔となったTransformer
2017 年に発表された Transformer は、それまでの深層学習の常識を覆し、自然言語処理、画像認識、音声認識、創薬、ロボティクスに至るあらゆる人工知能研究の標準アーキテクチャとなりました。 大規模なデータと計算資源を投入すればするほど性能が向上するという「スケーリング則(Scaling Law)」を力強く支え、世界規模の生成 AI ブームを巻き起こした功績は計り知れません。
しかし、技術の進歩とともに、Transformer という設計そのものが抱える本質的な限界や課題も浮き彫りになってきました。
Transformerが直面する3つの根本課題
現在の Transformer には、どれほど GPU を増設しても解決が難しい構造上の弱点が存在します。
▸ 1. 系列長に対する計算量とKVキャッシュの肥大化
FlashAttention や GQA などの技術革新により、数万から数十万トークンの長文が扱えるようになりました。 しかし、本質的な計算複雑性が $O(N^2)$ であること、そして推論時に過去の文脈を保持する KV キャッシュのサイズが系列長 $N$ に比例して線形増大する事実は変わりません。 数百万トークンを超える超長文や、途切れることのないリアルタイムの動画ストリームを常時監視・処理し続けるような用途では、依然としてメモリと電力のコストが極めて大きな障壁となります。
▸ 2. 自己回帰モデルの思考限界とハルシネーション
現代の主流である Decoder-only モデルは、「直前の文脈からもっとも確率の高い次の 1 単語を選ぶ」という動作を繰り返します。 この仕組みは流暢な文章を作るのには適していますが、複雑な数学の証明や長大なプログラムの設計など、「先を見通した計画(バックトラッキングや自己検証)」をリアルタイムに行うことが苦手です。 また、もっともらしい嘘を堂々と出力してしまうハルシネーション(幻覚)の発生も、確率的な単語予測という枠組みに起因する根深い問題です。
▸ 3. 破滅的忘却と継続学習の困難さ
一度学習を終えた Transformer に新しい知識を追加で教え込もうとすると、過去に覚えた知識を急速に失ってしまう「破滅的忘却(Catastrophic Forgetting)」が起きやすい性質があります。 人間のように日々の経験から少しずつ学び続けることが難しく、モデルを賢く保つには膨大なデータセット全体を使って定期的に再学習(事前学習)をやり直す必要があります。
ポストTransformerを狙う新星たち
こうした Transformer の弱点を克服するために、「Attention に頼らない」あるいは「Attention を補完する」新しいアーキテクチャの研究が活発化しています。
▸ 状態空間モデル(SSM: Mamba)
制御理論にルーツを持つ「状態空間モデル(State Space Model)」を深層学習に応用したのが「Mamba(マンバ)」です。 Mamba は、系列の長さ $N$ に対して線形時間 $O(N)$ で計算でき、推論時にも過去のトークンをキャッシュする必要がなく、一定サイズの隠れ状態で記憶を更新できます。 RNN のような推論効率の良さと、Transformer に匹敵する高い表現力を両立したことで、世界中の研究者から熱狂的な注目を集めています。
▸ 線形RNNと再帰の復権(RWKV)
「RNN の並列学習の不可能さ」を数理的な工夫で克服し、学習時は Transformer のように並列計算でき、推論時は RNN のように省メモリで超高速に動作する「RWKV(Receptance Weighted Key Value)」なども開発されています。
▸ ハイブリッドアーキテクチャ(Jambaなど)
現在もっとも実用的なアプローチとして期待されているのが、Transformer と SSM の長所を合体させた「ハイブリッド型」です。 AI21 Labs が発表した「Jamba」のように、大部分の層を軽量な Mamba 層にしつつ、要所要所に Transformer の Attention 層を挟み込みます。 これにより、Attention の持つ精密な記憶検索能力(In-context Retrieval)を保持したまま、長文の高速処理とメモリ節約を実現しています。
計算の質を変える: 推論時計算量(Test-Time Compute)
もうひとつの大きな地殻変動は、モデルの構造そのものよりも「考えさせる時間」に着目したアプローチです。 OpenAI の「o1」「o3」シリーズに代表される推論モデルは、ユーザーに回答を返す前に「思考の連鎖(Chain of Thought)」をモデル内部で自律的に生成させ、試行錯誤や間違いの自己修正を行わせます。
事前学習のパラメータ数を増やすだけでなく、「推論時にどれだけの思考計算量を費やすか(Test-Time Compute Scaling)」によって知能をスケールさせるという新たな地平が切り拓かれました。
おわりに: Attentionの旅は続く
Transformer は、単なる自然言語処理のツールにとどまらず、人類がコンピュータに高度な知能と柔軟な表現力を与えるための共通基盤となりました。 今後、純粋な Transformer が新しいアーキテクチャに取って代わられる日が来るとしても、Self-Attention が示した「文脈を全体から動的に捉える」という思想と数理的エッセンスは、未来のすべての知能システムの設計に生き続けます。
本書が、Transformer の美しい内部構造を理解し、次世代の AI 技術を自らの手で切り拓くエンジニアや学習者の一助となれば幸いです。