Skip to Content
Docs11. LLM 内部構造注意機構の変種と長コンテキスト技術

この記事の音声は準備中です。

音声の一覧・再生リストへ

注意機構の変種と長コンテキスト技術

この記事の目的

標準的な自己注意が抱える 2 つの圧力 — 稠密注意に系列長の 2 乗の計算項があり、素朴な実装は注意行列を全保持すること、KV キャッシュ生成中に各トークンの中間表現(Key / Value)を保存・再利用する仕組みで、プロンプトキャッシュの実体。中間表現は先頭からの並びに依存するため、キャッシュは前方一致でしか効かない。が系列長に比例して膨らむこと — を出発点に、それらを緩和する主要な技術群(MQA/GQA、スパース・局所注意、線形注意、FlashAttention、位置の外挿、状態空間モデル)を、原理レベルで整理できるようになります。「長コンテキスト対応」という表記の中身を読み解き、対応長・品質・コストのトレードオフを判断できる状態を目指します。

変種の顔ぶれ・採用状況は動くため、本記事は個別モデルの採用例を追わず、方式の原理に徹します。

対象読者

前提知識

本文

概要: 2 つの圧力

標準的な多頭自己注意には、系列長 nn に対する 2 つのスケール問題があります。

  1. 注意の計算項は O(n2d)O(n^2d): 素朴な実装は n×nn \times n の注意行列に O(n2)O(n^2) のメモリを使いますが、FlashAttention は全行列の保持を避けます。投影・FFN の O(nd2)O(nd^2) も含む全体では、注意項が主になるかは nn と dd の関係に依存します。API 料金・実測レイテンシの二乗増を意味しません
  2. KV キャッシュが O(n)O(n): 自己回帰生成では、過去の全トークンの K と V を保持して使い回す。その量は系列長に比例して増え、長文デコードのメモリと帯域の主因になる

KV キャッシュのサイズは概算で次式です。

KV bytes≈2⋅n⋅L⋅hkv⋅dh⋅b\text{KV bytes} \approx 2 \cdot n \cdot L \cdot h_{kv} \cdot d_h \cdot b

読み下し: 「K と V の 2 つ分 × トークン数 nn × 層数 LL × KV ヘッド数 hkvh_{kv} × ヘッド次元 dhd_h × 1 要素のバイト数 bb」。この式の各因子を削るのが、以下の技術群の狙いです。長コンテキスト技術は「①注意の n2n^2 を減らす」「② KV キャッシュを減らす」「③位置の対応範囲を伸ばす」の 3 方向に整理できます。

KV キャッシュを減らす: MQA と GQA

多頭注意では、ヘッドごとに独立した K・V を持ちます。Multi-Query Attention(MQA)は、クエリだけを hh ヘッドに分け、K と V は全ヘッドで 1 組を共有します。上式の hkvh_{kv} が hh から 1 に落ち、KV キャッシュが大幅に減ります。

ただし共有しすぎると品質が落ちます。Grouped-Query Attention(GQA)はその中間で、hh 個のクエリヘッドを gg グループに分け、グループごとに 1 組の K・V を共有します(hkv=gh_{kv} = g)。

MHA: hkv=h⟶GQA: hkv=g (1≤g≤h)⟶MQA: hkv=1\text{MHA:}\ h_{kv} = h \quad\longrightarrow\quad \text{GQA:}\ h_{kv} = g \ (1 \le g \le h) \quad\longrightarrow\quad \text{MQA:}\ h_{kv} = 1

読み下し: 「MHA(ヘッドごとに KV)と MQA(全ヘッドで KV 1 組)の間を、グループ数 gg で連続的に選ぶのが GQA」。gg を品質とメモリのつまみとして使い、2026 年時点の多くのモデルが GQA を採用しています。さらに KV を低ランクに圧縮して保持する潜在注意(MLA)系の方式もあり、いずれも狙いは同じ「KV キャッシュの削減」です。

注意を疎にする: 局所・スライディング窓・スパース

O(n2)O(n^2) を直接減らす発想が、全対全をやめて一部の対だけ見ることです。

  • 局所・スライディングウィンドウ注意: 各トークンは近傍 ww 個だけを見ます。計算量は O(n⋅w)O(n \cdot w) に落ち、層を重ねると受容野が広がって遠距離も間接的に届きます
  • スパース注意(固定パターン): 局所窓に加えて、一定間隔や特定の「まとめ役」トークンへの接続を混ぜます(Longformer・Sparse Transformer 系の発想)
  • アテンションシンク: 系列の先頭付近のトークンに注意が集まりやすい現象を利用し、窓から溢れても先頭を残すとストリーミングLLM の応答を生成と同時に逐次受信・表示する方式。Agent の体感品質を左右する基本技術。で品質が保たれます(StreamingLLM の観察)

疎注意は「遠距離の任意の依存」を犠牲にしうるため、タスクによって向き不向きがあります。

線形注意という別路線

softmax を近似・置換して、計算順序を変えることで O(n)O(n) を狙う路線です。標準注意は (QK⊤)V(QK^\top)V の順で計算するため n×nn \times n が現れますが、softmax を特徴写像 ϕ\phi で置き換えると結合則で順序を変えられます。

ϕ(Q)(ϕ(K)⊤V)は(ϕ(Q)ϕ(K)⊤)Vと同じ\phi(Q)\big(\phi(K)^\top V\big) \quad \text{は} \quad \big(\phi(Q)\phi(K)^\top\big)V \quad \text{と同じ}

読み下し: 「先に ϕ(K)⊤V\phi(K)^\top V(d×dd \times d の小さな行列)を作ってからクエリに掛ければ、n×nn \times n を作らずに済む」。これで計算量が系列長に線形になります。ただし softmax の表現力を完全には再現できず、品質とのトレードオフがあります。

FlashAttention: 厳密なまま速く

FlashAttention は近似ではなく、標準注意を数学的に厳密に計算したまま高速化する手法です。鍵は 2 点です。

  • オンライン softmax: n×nn \times n の注意行列を一度に作らず、ブロックごとに逐次計算しながら softmax を正しく更新する。巨大な中間行列を GPU の遅いメモリに書き出さずに済む
  • IO を意識した設計(IO-awareness): ボトルネックが演算量ではなくメモリ間のデータ移動である、という洞察に基づき、高速メモリ内で計算をまとめる

読み下し: 「注意の結果は同じだが、遅いメモリへの読み書きを減らして速くする」。FlashAttention は品質を変えずに長文の実効速度とメモリを改善するため、標準注意の実装として広く使われます(後継版も出ています)。

位置の対応範囲を伸ばす: 外挿と補間

学習時の最大長を超える入力に、位置符号化がどう耐えるかも長コンテキストの要です。RoPE(Transformer アーキテクチャ詳解)は相対位置を内積に埋め込みテキストや画像を、意味的な近さが距離に対応する数値ベクトルに変換したもの。RAG・記憶・分類の土台で、「何が近いか」はモデルで変わるため自社データで評価して選ぶ。モデル変更は全チャンクの再インデックスを伴う。ますが、学習長を超えて直接外挿すると品質が劣化しえます。対策は 2 系統です。

  • 位置補間(Position Interpolation): 長い位置を学習済みの範囲に「縮めて」割り当てる。少量の追加学習で対応長を伸ばせる
  • 周波数を調整する方式(YaRN など): RoPE の各周波数成分の扱いを変え、外挿の劣化を抑える

読み下し: 「位置の目盛りを詰め直す/周波数を調整することで、学習長より長い入力に耐えさせる」。いずれも万能ではなく、対応長が伸びても中間の情報が使われにくくなる劣化(いわゆる『中盤の見落とし』)は別問題として残ります。「対応長 = 実効的に使える長さ」ではない点に注意します。

Transformer を離れる: 状態空間モデル

注意そのものを使わない系列モデルも実用域に入りつつあります。状態空間モデル(SSM)は、系列を固定サイズの状態に畳み込みながら処理し、推論時は系列長に対して線形・一定メモリで動きます(S4・Mamba 系)。KV キャッシュが原理的に不要という強みがある一方、任意の過去への「ランダムアクセス」的な参照は注意ほど得意でないとされ、注意層と混ぜるハイブリッド構成も現れています。

「長コンテキスト対応」表記を読む

モデルの「N トークン対応」という表記は、次を切り分けて読みます。

  • 学習で到達した長さか、外挿・補間で伸ばした長さか(後者は中盤の品質が落ちやすい)
  • 対応長全体で品質が保たれるか(「入るが使いこなせない」ことがある)
  • その長さでのコスト・レイテンシ・KV メモリ(入力できることと、実用的に安いことは別)

「対応長」は上限であって保証ではありません。要件が長文なら、対応長の数字ではなく自社タスクでの実効品質を評価して判断します(評価データセットの構築と保守)。

この理解が効く場面

実務での注意点

アンチパターン

  • 「対応長 N トークン」を実効的に使える長さと同一視する → 外挿・補間で伸ばした領域や中盤で品質が落ち、入れたのに使われない → 自社タスクで長文の実効品質を評価してから前提にする
  • KV キャッシュのメモリを無視して長文・高並列を設計する → 2nLhkvdhb2nLh_{kv}d_h b がメモリを食い尽くし、同時実行数が頭打ちになる → GQA の有無と対応長から KV メモリを見積もる
  • 線形・スパース注意を「速いから上位互換」と誤解する → softmax 注意の表現力や任意の遠距離依存を犠牲にしうる → タスク特性(遠距離依存の要否)で向き不向きを判断する
  • FlashAttention を精度を落とす近似だと誤解する → 実際は厳密計算のまま IO を減らす手法で、品質は変わらない → 「近似(スパース/線形)」と「厳密な高速化(FlashAttention)」を区別する
  • 個別モデルの採用例で方式の優劣を断じる → 採用状況は世代で動き、すぐ古くなる → 方式の原理とトレードオフで理解し、具体は各モデルの現行仕様を確認する

チェックリスト

  • 注意の 2 つの圧力(O(n2)O(n^2) の計算・O(n)O(n) の KV キャッシュ)を区別して説明できる
  • MHA → GQA → MQA が KV ヘッド数を減らす連続体だと理解している
  • 疎・局所注意(近似)と FlashAttention(厳密な高速化)を区別できる
  • 線形注意が計算順序の入れ替えで O(n)O(n) を得る発想を説明できる
  • 位置の外挿・補間の限界(対応長 ≠ 実効長)を理解している
  • SSM が KV キャッシュ不要・線形という強みと、参照の弱みを持つと理解している
  • 「対応長」表記を、学習長/外挿・実効品質・コストに分けて読める

関連トピック

参考資料

TODO・未確認事項