「再帰をやめて、全単語を一度に見る」——この一手だけで、翻訳精度と学習速度が同時に上がることがあるのか。あるとすれば、Self-Attentionは具体的に何を計算していて、決定打はどの一点だったのか。本記事はこの問いに答えます。
「それは無理だ」——著名な計算言語学者Hans Uszkoreitは、息子Jakob Uszkoreitの仮説をそう一蹴しました。2017年当時、自然言語処理はRNN(再帰型ニューラルネットワーク)が前提で、「言語は順番に処理するもの」が業界の共通認識でした。
Jakobは仲間7人とともに、その前提に挑む論文「Attention Is All You Need」(NeurIPS 2017でGoogleから発表、arXiv
.03762)を書き上げます。では、再帰の代わりにAttentionは何を計算していたのか。次節から見ていきます。私はこの記事を、「AIエージェント論文おすすめ11選」で立てた「二次解説より先に一次文献へ戻る」という方針の延長として書いています。あの記事で参照に挙げた11本のうち、最も土台になるのがTransformerだったので、この記事で単独の詳細解説として掘り下げます。
Transformerについては解説記事も動画も無数にありますが、私は理解の合格ラインを、図をどれだけ眺めたかではなくAttentionの一行をNumPyで書けるかに置くべきだと考えています。原論文は15ページで、数式もそれほど多くありません。二次解説を読み込むより、原論文と実装コードを自分の手で写経する方が、結局は速く腑に落ちます。ReActやChain-of-Thoughtを扱った回と同じく、本記事も原論文を図解と実装の両方で読むシリーズの一本です。
そしてこの記事で本当に持ち帰ってほしいのは、著者8人のその後の巨額の評価額エピソードではありません(掴みとしては使いますが、本題ではありません)。持ち帰る価値があるのは、「逐次処理をやめ、任意の2単語を1ステップで結ぶ」という一点の設計判断です。この判断が具体的に何を指すのか、まず言葉を定義します。
後の主張を検証可能にするために、2つの用語を先に定義しておきます。
Self-Attentionとは、入力系列の各トークンの新しい表現を、全トークンのベクトルの加重平均として作る操作です。重みは次の式で決まります。
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
QとKの内積QK^Tは、各トークンペアの関連度スコアです。これをsoftmaxにかけると、各トークンについて「他の全トークンにどれだけ注目するか」という重みが、合計1.0の形で得られます。この重みでVを加重平均したものが、そのトークンの新しい表現になります。
√d_kで割る理由: Q・Kの次元d_kが大きくなるほど、内積の分散はd_kに比例して大きくなります。スコアの絶対値が大きくなりすぎると、softmaxの出力はほぼ0か1に張り付き、勾配がほとんど流れなくなります(勾配消失)。√d_kで割ってスコアのスケールを元に戻すことで、この問題を緩和しています。原論文はこの理由を脚注で明示しています。
最大パス長とは、系列内の任意の2トークンが、計算グラフ上で何ステップ離れているかを表す量です。
RNNでは、100トークン離れた単語同士の依存関係を学習するには、情報が100ステップかけて順に伝わる必要があります(最大パス長O(n))。Self-Attentionでは、QK^Tの一行がどのトークン同士も直接結ぶため、距離に関わらず1ステップで参照できます(最大パス長O(1))。
この2つの定義があれば、「なぜTransformerは革新的だったのか」という主張を、後段で検証可能な形で扱えます。
個別の機構に入る前に、全体の設計を1枚で押さえておきます。
Transformerは、**Encoder(入力を理解する)とDecoder(出力を生成する)**の2つのスタックから構成されます。
Encoder(6層): 各層はSelf-Attention層とFeed Forward層からなり、層の後にLayer Normalizationが入ります。
Decoder(6層): 各層はMasked Self-Attention層(未来の情報を見せない)、Encoder-Decoder Attention層、Feed Forward層からなります。
6層×2という積み上げの中で、実際に計算しているのは、ほぼSelf-Attentionと行列の掛け算だけです。次の節で、その中身を手で書いてみます。
理論を追うより、20行程度のNumPyコードを自分の手で動かした方が、Self-Attentionの中身は速く掴めます。
import numpy as np
# 3つの単語、各4次元の埋め込みベクトル(簡略化)
# "猫" "が" "座った" に相当
np.random.seed(42)
X = np.random.randn(3, 4) # (seq_len=3, d_model=4)
print("入力行列 X:")
print(X.round(2))
d_k = 4 # Key/Queryの次元数
# 重み行列(学習で獲得されるパラメータ)
W_Q = np.random.randn(4, d_k)
W_K = np.random.randn(4, d_k)
W_V = np.random.randn(4, d_k)
# Q, K, V を計算
Q = X @ W_Q # Query: 各単語が「何を探しているか」
K = X @ W_K # Key: 各単語が「何を持っているか」
V = X @ W_V # Value: 実際に渡す情報
print("Q (Query):", Q.shape) # (3, 4)
print("K (Key):", K.shape) # (3, 4)
print("V (Value):", V.shape) # (3, 4)
def softmax(x):
exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
return exp_x / np.sum(exp_x, axis=-1, keepdims=True)
# Scaled Dot-Product Attention
scores = Q @ K.T / np.sqrt(d_k) # (3, 3)
attention_weights = softmax(scores)
output = attention_weights @ V # (3, 4)
print("\nAttention重み(各単語が他の単語にどれだけ注目しているか):")
print(attention_weights.round(3))
print("\n出力(文脈を考慮した新しい表現):")
print(output.round(2))
Attention重み:
[[0.74 0.15 0.11] ← "猫"は自分自身に74%注目
[0.22 0.53 0.25] ← "が"は自分自身に53%注目
[0.31 0.08 0.61]] ← "座った"は自分自身に61%注目
各行の合計は必ず1.0になります(softmaxの性質)。前節で定義した通り、この重みでVを加重平均したものが、各単語の「文脈を考慮した新しい表現」です。
ここで数値そのものの意味を深追いする必要はありません。W_Q・W_K・W_Vは学習前のランダムな行列なので、「猫」が自分自身に74%注目するという数字は、日本語の文法や意味を学習した結果ではなく、np.random.seed(42)という乱数列がたまたま生んだ配分にすぎません。実務で意味のある重みが立ち上がるのは、大量データで学習し終えた後の話です。ここで確認すべきは値そのものではなく、各行の合計が必ず1.0になるというsoftmaxの性質と、Vの加重平均という操作の骨格だけで十分です。
1つのAttentionは、QKVを1組の重み行列で計算するため、1種類の関係性しか学習できません。文法的な関係(主語-動詞)と意味的な関係(猫-座る)を同時に学ばせたければ、異なる重み行列の組を複数並列させ、それぞれに別の関係性を学習させる必要があります。これがMulti-Head Attentionです。論文では8つのHeadを使い、各Headの出力を結合しています。
def multi_head_attention(X, num_heads=2, d_model=4):
d_k = d_model // num_heads # 各ヘッドの次元
heads = []
for h in range(num_heads):
W_Q = np.random.randn(d_model, d_k)
W_K = np.random.randn(d_model, d_k)
W_V = np.random.randn(d_model, d_k)
Q = X @ W_Q
K = X @ W_K
V = X @ W_V
scores = Q @ K.T / np.sqrt(d_k)
weights = softmax(scores)
heads.append(weights @ V)
# 全ヘッドを結合
return np.concatenate(heads, axis=-1) # (3, 4)
result = multi_head_attention(X)
print("Multi-Head出力:", result.shape) # (3, 4)
Self-Attentionの計算式には、トークンの並び順という情報がどこにも入っていません。全トークンの加重平均を取る操作は、入力の順序を入れ替えても同じ結果を返します。しかし言語では語順が意味を変えるため、順序情報をどこかで与える必要があります。
Transformerは、埋め込みベクトルに位置ごとの信号を足し込むことでこれを解決します。
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
三角関数を選んだ理由は、sin/cosの加法定理により、ある位置のPEを別の位置のPEの線形変換として表せる点にあります。これによって、学習時に見た文長より長い系列でも位置関係を扱いやすく、かつ学習パラメータを追加する必要がありません。
RNNとCNNには、それぞれ異なる制約がありました。RNN/LSTMは1単語ずつ処理するため、GPUの並列性能を活かせません。CNNは並列処理できますが、遠くの単語同士を関連づけるには畳み込み層を何層も重ねる必要があります。
| アーキテクチャ | 1層あたりの計算量 | 逐次処理数 | 最大パス長 |
|---|---|---|---|
| RNN | O(n × d²) | O(n) | O(n) |
| CNN | O(k × n × d²) | O(1) | O(log n) |
| Transformer | O(n² × d) | O(1) | O(1) |
前節で定義した最大パス長で見ると、差は歴然です。RNNで100単語離れた依存関係を学ぶには100ステップかかりますが、Self-AttentionはQK^Tの一行で1ステップで直接参照します。並列処理・スケーラビリティなど他の利点もありますが、私はこの最大パス長O(1)こそが決定打だったと見ています。他の利点は、この1点から派生的に生まれたものだと考えられるからです。
| ベンチマーク | 従来SOTA | Transformer | 改善 |
|---|---|---|---|
| WMT 2014 英独翻訳 | 25.8 BLEU | 28.4 BLEU | +2.6 |
| WMT 2014 英仏翻訳 | 40.4 BLEU | 41.0 BLEU | +0.6 |
BLEUは機械翻訳の精度を測る指標で、数値が高いほど翻訳が優れていることを示します。
| 指標 | 内容 |
|---|---|
| 学習時間 | 3.5日(8 GPU) |
| パラメータ数 | 65M(base)/ 213M(big) |
| 学習コスト | 従来手法の1/4以下(論文記載) |
SOTAを更新しながら学習コストを下げた、という組み合わせが、当時の評価を押し上げた理由です。
論文は各コンポーネントを個別に外して効果を検証しています。
| 変更 | BLEU変化 | 考察 |
|---|---|---|
| Head数 1(16→1) | -0.9 | Multi-Headは重要 |
| Head数 32(16→32) | -0.3 | 多すぎても効果は限定的 |
| d_k を小さく(64→16) | -1.3 | Key次元の削減は性能に直結 |
| d_model拡大(512→1024) | +0.3 | モデルサイズ拡大は有効 |
| Positional Encoding除去 | -1.0 | 位置情報は不可欠 |
Positional Encodingを外すと-1.0という数値は、前節の「なぜ位置情報が必要か」という機構の説明を裏づけています。
この論文は2026年3月時点で6万回以上引用されており、現在の主要LLMはほぼ全てTransformerを基盤にしています。Transformerの機構は、その後のモデルにほぼそのまま受け継がれました。BERTはEncoder部分のみ、GPTはDecoder部分のみ、T5はEncoder-Decoder両方を使う——BERT/GPT/T5は、いずれもTransformerの部分利用または全体利用の派生形です。
| 系統 | 代表モデル | 使う部分 |
|---|---|---|
| Encoder系 | BERT、RoBERTa、ALBERT | Encoderのみ |
| Decoder系 | GPT、GPT-2、GPT-3、GPT-4 | Decoderのみ |
| Encoder-Decoder系 | T5、BART | 両方 |
現行の主要LLM(Claude、GPT-4o、Gemini、Llama 3など)も各社からTransformerベースと公表されています。ただしGPT-4oのパラメータ規模「推定1.8T」のように、非公開の数値はあくまで推定値である点には注意が必要です。
一方で、Transformerには最初から代償がありました。Self-Attentionの計算量はO(n²)——系列長が2倍になれば計算量は4倍になります。オリジナル論文のコンテキスト長も512トークンでした。2018年以降の進化は、ほぼ全てこの「O(n²)という代償」と「固定長という制約」をどう克服するかの物語として読めます。
まず代償そのもの、計算コストを削ったのがFlash Attentionです。GPUメモリの読み書き(I/O)がボトルネックだった部分を、タイル分割によって高速メモリ(SRAM)上で完結させることで解消しました。
| バージョン | 改善点 | 高速化 |
|---|---|---|
| Flash Attention | I/Oを考慮したタイル分割 | 2-4倍 |
| Flash Attention 2 | 並列性向上、非正方行列対応 | さらに2倍 |
| Flash Attention 3 | FP8対応、H100最適化 | さらに1.5倍 |
現在はPyTorch 2.0以降に標準搭載され、多くのLLMの訓練・推論で使われています。
次に、計算量ではなくパラメータとコストを切り離したのがMixture of Experts(MoE)です。全パラメータを毎回使うのではなく、入力に応じて一部の「専門家」ネットワークだけを活性化します。
| モデル | 総パラメータ | 活性化パラメータ | 効果 |
|---|---|---|---|
| Mixtral 8x7B | 46.7B | 12.9B | 70Bモデル相当の性能とされる |
| GPT-4(推定) | 1.8T | 約220B | コスト効率の大幅向上 |
| DeepSeek-V3 | 671B | 37B | オープンソース最高性能クラスとされる |
さらに、固定長という制約そのものに向き合ったのがコンテキスト長の拡張です。RoPE(相対位置エンコーディング)は学習時より長い系列への外挿を可能にし、Ring Attentionは複数GPUに系列を分割することで長さの壁を動かしました。
| 手法 | コンテキスト長 | 主なモデル |
|---|---|---|
| オリジナル(2017) | 512トークン | Transformer |
| RoPE(2021) | 4K→128K拡張可能 | Llama、Qwen |
| Ring Attention | 100万トークン+ | Gemini 1.5 Pro |
| Infini-Attention | 無限長(理論上) | Google Research |
最後に、最も根本的な迂回路がState Space Model(SSM)との融合です。Mambaに代表されるSSMは、O(n)の計算量でTransformerに匹敵する性能を実現するとされ、2025年以降はJambaやZamba 2のようにTransformerとSSMを組み合わせたハイブリッドモデルが増えています。
| モデル | アーキテクチャ | 特徴 |
|---|---|---|
| Mamba | 純粋SSM | O(n)で高速推論 |
| Jamba | Transformer + Mamba | 両方の利点を活用 |
| Zamba 2 | Hybrid | 7Bで13B相当の性能とされる |
ここで実務的な判断材料を一つ加えておきます。長コンテキストが必須な用途では、コンテキスト長という数値そのものより、O(n²)のスケーリングが効いてくる推論コストの方が先にボトルネックになりやすい——これは前節の計算量比較表からも導ける帰結です。Mambaやハイブリッドモデルへの乗り換えを検討する優先順位は、扱う系列長の平均値ではなく、推論コストの実測値を先に見るべきだというのが私の考えです。
なお、Transformerの機構そのものの上に「何を引き出すか」は別の話です。Chain-of-Thoughtは、この土台の上でLLMに段階的な推論をさせる技法を扱っています。本記事は機構止まりですが、関心のある方はそちらも参照してください。
論文の8人の著者は、全員がGoogleを退社しています。その後の展開を一覧にしました(評価額・調達額は各社の報道時点の数値で、非公開企業の評価額は変動するため目安として見てください)。
| 著者 | 退社年 | 創業・参加先 | 評価額/調達額 |
|---|---|---|---|
| Illia Polosukhin | 2017 | NEAR Protocol | 5億ドル調達 |
| Aidan N. Gomez | 2019 | Cohere | 評価額55億ドルと報じられる |
| Jakob Uszkoreit | 2021 | Inceptive | 1.2億ドル調達 |
| Noam Shazeer | 2021 | Character.AI→Google復帰 | 25億ドルで買収と報じられる |
| Niki Parmar | 2021 | Essential AI→Anthropic | Claude開発に携わると報じられる |
| Łukasz Kaiser | 2021 | OpenAI | GPT-4、o1、o3の開発に関与と報じられる |
| Ashish Vaswani | 2023 | Essential AI | 6,500万ドル調達 |
| Llion Jones | 2023 | Sakana AI | 日本発AIスタートアップ |
この表の中で、地の文で拾っておきたいのは2つです。
20歳のインターンがCEOに: Aidan N. Gomezは論文執筆当時、Google Brainのインターンで20歳でした。現在はCohereのCEOとして、評価額55億ドルと報じられる企業を率いています。
父親の懐疑の回収: 冒頭のHans Uszkoreitの懐疑は、息子Jakobの確信によって覆されました。Jakobは現在、AIでRNA医薬品を設計するInceptiveを経営しています。「再帰なしで翻訳」という一蹴された仮説は、9年後には確信済みの前提になっています。
ビートルズの「All You Need Is Love」(1967年)のパロディです。RNNやCNNが必須とされていた領域で「Attentionだけで十分」という主張を、タイトル一つに込めています。
Attentionの計算量がO(n²)(nは系列長)のため、系列が長くなると計算コストが2乗で増えます。1,000トークンなら100万回、10,000トークンなら1億回のスコア計算が必要になる計算です。この制約を緩和するため、Flash Attention、Ring Attention、Infini-Attentionなどの改良が研究されています。
Transformerは Self-Attentionベースで計算量O(n²)ですが、任意の2トークンを直接結べる(最大パス長O(1))という強みがあります。MambaはState Space Model(SSM)ベースで計算量O(n)と効率的ですが、長距離依存の扱い方はTransformerと異なります。2025年以降はJamba、Zamba 2のように両者を組み合わせたハイブリッドモデルも増えており、どちらか一方に絞らない設計も増えています。
論文自体はApache 2.0ライセンスです。Transformerアーキテクチャを使ったモデル(GPT、Claude等)は各社のライセンスに従います。基本的に、APIを通じた商用利用は可能です。
原典に当たるのが一番早い、というのが本記事全体を通じての私の立場です。
最後に、ここまでの内容を新しい軸で並べ替えます。
9年で変わったもの(克服対象): オリジナルTransformerのO(n²)という計算量と、512トークンという固定長。この2つを克服するために、Flash Attention、MoE、RoPE、Ring Attention、SSMとのハイブリッドが積み上がってきました。
9年で変わっていないもの(核): softmax(QK^T/√d_k)Vという一行、そして最大パス長O(1)という設計判断そのものです。周辺の効率化はすべて、この一行を「どう安く回すか」の工夫であって、この一行を置き換える提案ではありません。
私が本記事で持ち帰ってほしいのは、著者8人の評価額の合計ではなく、この一行です。理解の確認方法は、この記事のNumPyコードを写経して、自分の環境でattention_weightsが本当にsoftmaxの性質(各行の合計が1.0)を満たすか確かめることだと思っています。
判断が必要な方に渡せる材料はこうです。長コンテキストが必須で、かつ推論コストがボトルネックになっている用途なら、Mambaやハイブリッドモデルを検証する価値があります。そうでなければ、Transformer一択で当面困らない、というのが現時点の状況です。どちらを選ぶかは、扱う系列長と許容できる推論コスト次第だと思います。
本記事はネクサフローのAI研究シリーズの一部です。