3行でいうと
- 元論文(2017年)の表では、自己アテンション1層の計算量は系列の長さnの2乗に比例する形(O(n²·d))と書かれている。
- 長さが10倍になると、組み合わせの数は100倍になる。ただし、AI全体の重さが常に2乗とは限らない。
- 長い文章では、計算だけでなくKVキャッシュ(過去の計算結果の保存)のメモリも増える。FlashAttentionは計算結果を変えずにメモリの読み書きを減らす工夫。
この記事は、実際に使って確かめた記録ではありません。この記事は、論文を読んでまとめたものです。数字の計算は、論文の式に僕らが数字を入れたもので、実際のサービスの速度や料金を表すものではありません。
先に結論
- 元論文「Attention Is All You Need」(Vaswaniら、arXiv v7は2023年8月2日付)の表1は、自己アテンションの層あたりの計算量を O(n²·d) と書いています。nは系列の長さ(文章の長さ、トークン数)、dは表現の次元(1つの単語を表す数字の並びの長さ)です。
- 「2乗」の意味は、n個の位置のすべてが、n個すべての位置を見て、関連の強さを計算する、ということです。n×n個の組み合わせがあります。
- ただし、文章が短いうちは、2乗の部分は全体の重さの小さな割合です。長くなるほど効いてきます。この点は、別の論文の式で確かめます。
前提:用語
- Transformerは、2017年の論文で提案された、文章などの並びを処理するモデルの構造です。今の大きな文章AIの多くの土台になっています。
- トークンは、AIが文章を数える単位です。日本語では、1文字がちょうど1トークンとは限りません。
- アテンション(注意)は、ある位置の単語を処理するときに、文中のどの単語をどれだけ重く参考にするかを決める計算です。
- 計算量は、処理に必要な計算の量が、入力の大きさに対してどう増えるかを表したものです。O(n²)は「nの2乗に比例して増える」という意味です。
- コンテキスト長は、AIが一度に扱える文章の長さ(トークン数)です。
アテンションの仕組み(元論文)
元論文は、アテンションを「クエリ(問い)と、キーと値の組から、出力を作る関数」として説明しています。出力は、値の重み付きの和で、重みはクエリとキーの相性で決まります。
式は次のとおりです(論文の式1)。
- Attention(Q, K, V) = softmax(QKᵀ / √d_k) V
読み方は次のとおりです。
- Q(クエリ)は、各位置が「何を探しているか」を表す数字の並び。K(キー)は、各位置が「何を持っているか」の見出し。V(値)は、各位置の中身です。
- QとKの内積(掛けて足す)で、すべての位置の組み合わせについて、相性の点数を出します。これが n×n の表になります。
- √d_k で割って大きさをそろえます。論文は、d_kが大きいとき、内積が大きくなり、softmax(点数を、足して1になる重みに変える関数)の勾配が極端に小さくなる領域に入る、と推測し、それを防ぐための割り算だと書いています。
- softmaxで重みにして、Vの重み付きの和を取ります。
論文は、これを複数並べる「マルチヘッドアテンション」も採用しています。異なる視点で並列に見るためです。また、文章を生成する側(デコーダ)では、後ろの位置を見ないようにマスクをかけ、ある位置の予測は、それより前の位置だけに依存する、と書いています。
なぜ2乗か
論文の表1は、層の種類ごとの比較です。nは系列の長さ、dは表現の次元です。
| 層の種類 | 層あたりの計算量 | 順番に行う操作の数 | 最長の経路の長さ |
|---|---|---|---|
| 自己アテンション | O(n²·d) | O(1) | O(1) |
| 再帰(RNN) | O(n·d²) | O(n) | O(n) |
| 畳み込み | O(k·n·d²) | O(1) | O(log_k n) |
| 自己アテンション(範囲を制限) | O(r·n·d) | O(1) | O(n/r) |
論文は、この表をもとに、自己アテンションを選んだ理由を3つ挙げています。計算量、並列化できる量(順番に行う操作の数)、離れた位置どうしの経路の短さです。
論文の説明は、次のとおりです。
- 自己アテンションは、すべての位置を一定数の順次操作でつなぐ。再帰はO(n)の順次操作が必要。
- 計算量では、nがdより小さいとき、自己アテンションは再帰より速い。機械翻訳で使われる文表現では、これがふつうだと論文は述べている。
- 非常に長い系列には、各位置が周囲r個だけを見る「制限付き」の方法が考えられる。論文は、これを今後の課題としている。
つまり、元論文は、2乗のコストを知ったうえで、当時の文の長さでは問題が小さいと判断していました。
長さを変えると、どれだけ増えるか
僕らの計算:組み合わせの数とメモリ
僕らの計算です。1つのアテンション(1層・1ヘッド)で、n個の位置どうしの相性の点数は n×n 個です。
| 長さ n | 点数の個数(n²) | 1,000の場合との比 |
|---|---|---|
| 1,000 | 100万(10⁶) | 1倍 |
| 10,000 | 1億(10⁸) | 100倍 |
| 100,000 | 100億(10¹⁰) | 1万倍 |
| 1,000,000 | 1兆(10¹²) | 100万倍 |
僕らの計算です。FlashAttentionの論文によると、標準的な実装は、n×nの表(SとP)をGPUの大きなメモリに書き出し、それに O(N²) のメモリがかかります。仮に長さ10万で、1つの点数を2バイト(FP16)とすると、100億個で約20GBです(1ヘッド・1層分の目安。実際の実装は、複数ヘッド・層・工夫で異なります)。
全体の重さは、いつから2乗が効くか
見立てです。「長い文章は2乗で重くなる」を、そのまま「AI全体が2乗」と読むと、ずれます。AIの中には、アテンション以外の計算(単語ごとに行う大きな行列の計算)もあるからです。
Kaplanら(2020、スケーリング則の論文)は、トランスフォーマーの順方向の計算量を、1トークンあたり次の式で見積もっています(式2.2)。
- C_forward ≈ 2N + 2·n_layer·n_ctx·d_model
Nはモデルのパラメータ数(学習で決まる数字の個数)、n_layerは層の数、n_ctxは文脈の長さ、d_modelは表現の次元です。第1項は、長さに関係しない部分。第2項が、文脈の長さに比例する部分(アテンション)です。論文は、d_model > n_ctx/12 のとき、文脈に依存する部分は全体のうち小さな割合だ、と書いています。
僕らの計算:文脈に依存する部分の割合
僕らの計算です。Kaplanの式の第2項を第1項で割ると、n_ctx / (12 × d_model) になります。N ≈ 12·n_layer·d_model² という論文の近似を使いました。
d_model = 5,120 とします。これは、vLLMの論文が例に挙げたOPT-13B(40層)の「隠れ状態の大きさ」です。
| 文脈の長さ | 文脈に依存する部分 ÷ 長さに依存しない部分 |
|---|---|
| 1,024 | 約1.7% |
| 8,192 | 約13% |
| 32,768 | 約53% |
| 100,000 | 約163% |
| 1,000,000 | 約1,630% |
この表は、論文の近似式と、1つのモデルの寸法から出した目安です。実際のモデルは、構造(アテンションの工夫など)やパラメータ数が違うので、割合は変わります。
見立てです。短い会話では、重さの大半は、長さに関係しない部分です。長い資料を丸ごと読ませる使い方になるほど、文脈の長さに比例する部分(1トークンあたり)が効き、全体では2乗に近づく、と読めます。
メモリの話:KVキャッシュ
文章を1トークンずつ生成するとき、過去のトークンのキーと値を毎回計算し直すと無駄が大きいので、保存しておきます。これをKVキャッシュと呼びます。
vLLMの論文(SOSP 2023)は、次のように書いています。
- 13Bパラメータの大きなモデルを40GBのGPUで動かす例で、メモリの約65%はモデルの重み、30%近くが、リクエストごとの動的な状態(KVキャッシュ)。
- OPT-13Bでは、1トークンのKVキャッシュに約800KBが必要。2×5,120(隠れ状態の大きさ)×40(層の数)×2バイト(FP16)。2,048トークンまでの系列では、1リクエストで最大1.6GB。
- 処理は、プロンプト全体を読む段階(並列化できる)と、1トークンずつ生成する段階に分かれる。後者は逐次的で、メモリ帯域がボトルネックになりやすい。
僕らの計算です。KVキャッシュは、長さに比例して(2乗ではなく)増えます。800KB × 10万トークン = 約80GBです。これはOPT-13Bの設計での計算です。他のモデルでは値が変わります。この記事では、他のモデルのキャッシュの大きさを確認していません。
2乗を減らす工夫
- 近似アテンション:すべての組み合わせを計算せず、一部だけを計算して、計算量を長さに線形に近づける。FlashAttentionの論文は、こうした方法の多くが、実際の実行時間では速くならなかった、と述べています。理由として、計算の回数(FLOPs)ばかりを減らし、メモリの読み書き(IO)の負担を見落としたからだ、としています。
- FlashAttention(Daoら、2022):結果を変えない(厳密な)アテンションを、メモリの読み書きを減らすことで速くします。GPUの速いメモリ(SRAM)に小さなブロックずつ載せて計算する「タイリング」を使います。論文の報告では、GPT-2(長さ1K)で3倍の速度向上、BERT-large(長さ512)で15%の速度向上、メモリは長さに線形に増え、厳密なアテンションの基準実装より最大20倍メモリ効率がよい、とあります。計算の回数が2乗であることは変わらず、実行時間は2乗に伸びる、と書かれています。
- 範囲を制限する:元論文が挙げた、各位置が周囲r個だけを見る方法です。
読み方・選び方(使う側の視点)
見立てです。仕事でAIを使う人にとって、この話は次の3つにつながると思います。
- 長い資料を一度に読ませるほど、重くなりやすい。応答が遅くなる、上限に当たりやすい、といった形で現れる可能性があります。
- 料金の仕組みにも、長さの段階があるサービスがある。2026年10月8日に確認した公式ページでは、GoogleのGemini 3.1 Pro(プレビュー版)は、プロンプトが20万トークンを超えると、入力が100万トークンあたり2ドルから4ドル、出力が12ドルから18ドルになります。OpenAIのGPT-6.1 Solは、27.2万トークンを超える入力に、入力2倍・出力1.5倍の料金がかかる、と書かれています(価格は変わることがあります)。料金の段階の理由は、どちらのページにも書かれていませんでした。2乗の話と結びつくかどうかは、確認できていません。
- 必要な部分だけを渡す。資料の全文でなく、関係する部分を渡すほうが、計算も料金も小さくなる可能性があります。
よくあるつまずき
見立てです。
- 「長さが2倍なら料金や時間も4倍」と考える。AI全体では、長さに比例する部分もあり、アテンションの割合はモデルと長さで変わります。今回読んだ価格ページは、100万トークンあたりの単価で書かれていました(料金体系は各社で違い、後述のように長さで単価が変わるものもあります)。
- 「コンテキスト長が大きい=全部を正確に使える」と考える。この記事で読んだ論文は、計算量とメモリの話で、長い文脈の中のどこをどれだけ使えているかの話ではありません。
- 計算量(FLOPs)が減れば、必ず速くなると考える。FlashAttentionの論文は、そうならない例(メモリの読み書き)を挙げています。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。論文の式と数字から、計算しています。
- 元論文は、機械翻訳の時代のモデルについて書かれたものです。今の大規模モデルの構造には、元論文と違う点があります。この記事ではその違いを確認していません。
- Kaplanの式は、標準的な密なTransformerを前提にした近似です。最近のモデルの工夫は反映していません。
- vLLMの800KBは、OPT-13Bの例です。他のモデルの値ではありません。
- FlashAttentionの数字は、論文の特定の環境(A100のGPUなど)での結果です。その後の改良版は、読んでいません。
- 料金の数字は、2026年10月8日に確認したものです。変わることがあります。
- この記事は、論文の紹介であり、性能の保証や特定の製品の比較ではありません。
出典
- Attention Is All You Need(Vaswani et al.、arXiv:1706.03762v7、2026年10月8日確認)
- FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness(Dao et al.、arXiv:2205.14135、2026年10月8日確認)
- Scaling Laws for Neural Language Models(Kaplan et al.、arXiv:2001.08361、2026年10月8日確認)
- Efficient Memory Management for Large Language Model Serving with PagedAttention(Kwon et al.、arXiv:2309.06180、2026年10月8日確認)
- Gemini Developer API pricing(Google AI for Developers、Google、2026年10月8日確認)
- GPT-6.1 Sol(OpenAI API、OpenAI、2026年10月8日確認)
更新履歴
- 2026年10月25日 書き方を直しました。
- 前:運営者が使っていないと読める書き方 → いま:「この記事は、実際に使って確かめた記録ではありません」。公式の資料を読んでまとめた記事で、使い心地は書いていない、という意味に直した
