3行でいうと

  • 元論文(2017年)の表では、自己アテンション1層の計算量は系列の長さnの2乗に比例する形(O(n²·d))と書かれている。
  • 長さが10倍になると、組み合わせの数は100倍になる。ただし、AI全体の重さが常に2乗とは限らない。
  • 長い文章では、計算だけでなくKVキャッシュ(過去の計算結果の保存)のメモリも増える。FlashAttentionは計算結果を変えずにメモリの読み書きを減らす工夫。

この記事は、実際に使って確かめた記録ではありません。この記事は、論文を読んでまとめたものです。数字の計算は、論文の式に僕らが数字を入れたもので、実際のサービスの速度や料金を表すものではありません。

先に結論

前提:用語

アテンションの仕組み(元論文)

元論文は、アテンションを「クエリ(問い)と、キーと値の組から、出力を作る関数」として説明しています。出力は、値の重み付きの和で、重みはクエリとキーの相性で決まります。

式は次のとおりです(論文の式1)。

読み方は次のとおりです。

  1. Q(クエリ)は、各位置が「何を探しているか」を表す数字の並び。K(キー)は、各位置が「何を持っているか」の見出し。V(値)は、各位置の中身です。
  2. QとKの内積(掛けて足す)で、すべての位置の組み合わせについて、相性の点数を出します。これが n×n の表になります。
  3. √d_k で割って大きさをそろえます。論文は、d_kが大きいとき、内積が大きくなり、softmax(点数を、足して1になる重みに変える関数)の勾配が極端に小さくなる領域に入る、と推測し、それを防ぐための割り算だと書いています。
  4. 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つ挙げています。計算量、並列化できる量(順番に行う操作の数)、離れた位置どうしの経路の短さです。

論文の説明は、次のとおりです。

つまり、元論文は、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)。

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)は、次のように書いています。

僕らの計算です。KVキャッシュは、長さに比例して(2乗ではなく)増えます。800KB × 10万トークン = 約80GBです。これはOPT-13Bの設計での計算です。他のモデルでは値が変わります。この記事では、他のモデルのキャッシュの大きさを確認していません。

2乗を減らす工夫

読み方・選び方(使う側の視点)

見立てです。仕事でAIを使う人にとって、この話は次の3つにつながると思います。

  1. 長い資料を一度に読ませるほど、重くなりやすい。応答が遅くなる、上限に当たりやすい、といった形で現れる可能性があります。
  2. 料金の仕組みにも、長さの段階があるサービスがある。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乗の話と結びつくかどうかは、確認できていません。
  3. 必要な部分だけを渡す。資料の全文でなく、関係する部分を渡すほうが、計算も料金も小さくなる可能性があります。

よくあるつまずき

見立てです。

気をつけること

出典

更新履歴