Long Contextとは?LLMが長文を扱う仕組み

長い文書をLLMへ入力するときに越えるべきAttention計算、位置表現、KV Cache、学習、評価の5つの壁

長い文書をLLMへ入力するときに越えるべきAttention計算、位置表現、KV Cache、学習、評価の5つの壁

Long Context(長い文脈を一度に扱う能力)は、単に「入力欄へ多くの文字を入れられる」という意味ではありません。長いsequenceを計算できること、各位置を区別できること、KV Cacheを保持できること、そして遠く離れた情報を実際に利用できることが必要です。

context windowの公称値だけを見ると、この違いが隠れます。128K tokenを受け付けるmodelでも、文書のどこにある情報でも同じ精度で使えるとは限りません。また、同じ最大長でも、Attention、位置表現、推論memoryの設計はmodelごとに異なります。

3行で分かるLong Context

  • 標準的なDense Attentionはtoken数\(n\)に対して\(n^2\)個の関係を調べるため、長文化すると計算量と中間memoryが急増します。
  • LongformerのSparse Attention、RoPE Scaling、FlashAttention、GQA/MQAは別の問題を解きます。どれか一つでLong Contextの全課題が消えるわけではありません。
  • 最大context長は「入力可能な上限」、実効context長は「必要な情報を取り出し、推論へ使える長さ」です。長文能力は複数taskで評価する必要があります。

この記事では、Longformer原論文を出発点に、Long Contextを支える仕組みを数式と具体例で分解します。

context windowとは何か

context window(modelが一度の処理で参照できるtoken列の範囲)は、入力だけの枠ではありません。一般的な生成では、system instruction、user input、tool result、会話履歴、生成中のoutputが同じtoken budgetを使います。

たとえば最大長が128K tokenでも、120K tokenの資料を入れた後に必ず8K tokenを生成できるとは限りません。prompt用の固定情報やmodel固有の予約領域も考慮し、入力と出力へ予算を配分します。

ここでは三つの「長さ」を分けます。

用語 意味 これだけでは分からないこと
最大context長 interfaceまたはmodel設定が受け付けるtoken上限 遠い情報を正しく利用できるか
学習context長 pretrainingや追加学習でmodelが経験した長さ 個々のtaskでの実効性能
実効context長 task上、必要情報を安定して利用できる範囲 別taskでも同じ長さを使えるか

「投入できた」「errorにならなかった」は、長文を理解できた証明ではありません。検索、複数箇所の照合、集計、推論では必要な能力が異なります。

Switch Transformerの疎性とは別物

前回のSwitch Transformerもsparse(疎)という言葉を使いました。しかし、疎にする軸が違います。

Switch TransformerがExpert軸を疎にし、Sparse Attentionがtoken間の接続を疎にする違い

手法 疎にする軸 選ばないもの 主に変わるcost
Switch / MoE FFNのExpert そのtokenで使わないExpert active parameter、FFN計算、Expert通信
Sparse Attention token間の接続 計算しないquery-key pair Attention計算とscore領域

MoEで1 tokenが1 Expertだけを通っても、その前のAttentionが全token pairを見るなら、Attentionは依然としてdenseです。反対にSparse Attentionを使っても、FFNがDenseなら全tokenが同じFFNを通ります。

Long Contextを難しくする5つの壁

Long Contextは、少なくとも次の5問に分けると整理できます。

  1. Attention計算:何個のtoken pairを比較するのか
  2. 位置表現:学習範囲を超える位置をどのように表すのか
  3. 推論memory:過去tokenのKeyとValueをどれだけ保持するのか
  4. 学習:長文dataと長い依存関係を十分に経験したか
  5. 評価:離れた情報を検索するだけでなく、統合して使えるか

解決策も一対一ではありません。たとえばRoPE Scalingは位置表現を拡張しますが、Dense Attentionのpair数もKV Cacheも減らしません。FlashAttentionはmemory trafficを減らしますが、算術上のpair数はdenseのままです。

Dense Attentionはなぜ二乗で増えるのか

Self-Attentionでは、各query tokenが各key tokenとのscoreを計算します。sequence長を\(n\)、head次元を\(d\)とすると、score matrixは\(n\times n\)です。

\[S=\frac{QK^\top}{\sqrt{d}}\]

score要素数は\(n^2\)なので、sequence長を2倍にすると4倍になります。

4096 tokenと8192 tokenのAttention matrixを面積とpair数で比較し、二乗増加を示す図

sequence長 1 head当たりのscore pair数 4,096との比
4,096 16,777,216 1倍
8,192 67,108,864 4倍
16,384 268,435,456 16倍

これは1 layer、1 headのpair数です。実際には複数headと複数layerで計算します。Causal Attention(未来tokenを見ないAttention)では上三角をmaskしますが、一般的なdense実装の計算・storage設計は依然として二乗の影響を強く受けます。

Attention scoreをbf16の2 bytesで単純保持すると、8,192 tokenで約128 MiB/headです。ただし実際のmemory量は実装、softmax用buffer、backward、checkpointing、FlashAttentionの利用で大きく変わります。この値は「素朴にscore matrixをmaterializeした場合」の目安です。

Longformerは見る相手を絞る

Longformerは、すべてのtoken pairを計算せず、二種類の接続を組み合わせます。

  • sliding-window attention:各tokenが近傍の一定範囲を見る
  • global attention:task上重要な一部tokenが広い範囲と双方向に接続する

LongformerのAttention matrixで局所windowが対角bandを作り、global tokenが行と列を横断する構造

各tokenが合計\(w\)個の近傍を見る単純化した場合、local pair数はおよそ\(n w\)です。\(n=8,192\)、\(w=512\)なら次の値になります。

\[8{,}192\times512=4{,}194{,}304\]

Dense Attentionの\(67,108,864\) pairと比べると16分の1です。境界部分やglobal tokenを無視した教育用の概算ですが、固定windowなら\(n\)を2倍にしてもlocal部分はおよそ2倍で済むことが分かります。

global token数を\(g\)とすると、全体は概念的に次の規模です。

\[O(nw+ng)\]

実装ではlocalとglobalの重複や双方向接続をどう数えるかで定数が変わります。重要なのは、\(w\)と\(g\)を\(n\)より十分小さく固定すれば、\(n^2\)ではなく\(n\)にほぼ比例することです。

global tokenは自動的な「重要token」ではない

global attentionは、modelが後から自由に発見する万能枠ではありません。原論文ではtaskに応じてglobal attentionを付ける位置を決めます。分類なら先頭の特別token、question answeringならquestion tokenなど、広域情報を集約・配布すべき場所を設計します。

global tokenを増やせば遠距離接続は増えますが、\(ng\)のcostも増えます。少なすぎれば必要な情報がlocal windowだけでは結び付かず、多すぎればsparsityの利点が弱くなります。

layerを重ねると届く範囲が広がる

1 layerのsliding-window attentionでは、tokenは近傍しか直接見ません。しかしlayerを重ねると、隣から受け取った情報を次のlayerでさらに外へ伝えられます。

sliding-window attentionでlayerを重ねるたびに中央tokenへ届く範囲が広がるreceptive field

各側へ\(r\) tokenを見るなら、単純なreceptive field(出力へ影響できる入力範囲)は\(L\) layer後に概ね各側\(Lr\)まで広がります。ただし「間接的に届く」ことと、「遠い二点を1回のAttentionで直接比較する」ことは同じではありません。長い経路では情報が薄まる可能性があります。

Longformerは長文encoderとして提案・評価されたmodelです。後にLED(Longformer Encoder-Decoder)も示されましたが、現在のdecoder-only chat LLMすべてがLongformerを使うわけではありません。ここで重要なのは、局所接続と少数の広域接続を組み合わせる設計原理です。

Sparse AttentionとFlashAttentionは何が違うのか

名前が似た技術を、解決するcostで比較します。

方法 token pair数 Attention結果 主な狙い 主なtrade-off
Dense Attention \(O(n^2)\) 全pairを利用 柔軟なtoken間接続 長文で計算・memoryが重い
Sparse Attention \(O(nw)\)など 選んだpairだけ 算術量と接続数を削減 pattern外の直接接続を失う
FlashAttention \(O(n^2)\) exact dense attention memory trafficと中間storageを削減 二乗の演算量自体は残る
Context Parallelism 全体では方式依存 dense/sparseのまま sequence方向にdeviceへ分散 通信と同期が増える

FlashAttentionは、Attentionをtileへ分け、HBMとon-chip memory間のdata移動を減らします。全pairを計算するexact attentionなので、「Sparse Attentionの一種」ではありません。詳しい処理はFlashAttentionとは?Attentionを高速化する仕組みで解説しています。

Context Parallelism(sequenceを複数deviceへ分割する並列化)も、1 device当たりのmemoryを減らす有力な方法です。ただし、全体の演算量を自動で消すわけではなく、Attentionに必要なKey/Valueや部分結果をdevice間で通信します。

RoPEは位置を回転としてAttentionへ入れる

Attentionはtokenの集合だけを見れば、順序を区別できません。多くのLLMで使われるRoPE(Rotary Position Embedding:回転による位置埋め込み)は、queryとkeyの2次元成分を位置\(m\)に応じた角度\(m\theta\)で回転します。

\[R(m\theta)= \begin{bmatrix} \cos(m\theta) & -\sin(m\theta) \\ \sin(m\theta) & \cos(m\theta) \end{bmatrix}\]

位置\(m\)のqueryと位置\(n\)のkeyを回転すると、その内積には回転角の差\((n-m)\theta\)が現れます。

\[\left(R(m\theta)q\right)^\top R(n\theta)k =q^\top R((n-m)\theta)k\]

RoPEでqueryとkeyを位置ごとに回転し、内積に位置差の角度が残る仕組み

これにより、絶対位置\(m,n\)を使って回転しながら、Attention scoreへ相対的な位置差を反映できます。RoFormer原論文の中心的な性質です。

ただし、学習中に見た最大位置を大きく超えると、未経験の回転patternや相対距離を使うことになります。RoPEを採用しただけで、任意の長さへ品質を保ったまま外挿できるわけではありません。

Position Interpolationは位置を学習範囲へ圧縮する

元の学習context長を\(L\)、拡張後の長さを\(L’=sL\)とします。Position Interpolation(位置補間)は、拡張後のposition \(m\)を、およそ\(m/s\)へ縮小してRoPEへ渡します。

\[m’=\frac{m}{s}\]

たとえば4,096から32,768へ8倍に拡張するなら、位置32,767は約4,095.9へ写ります。未学習の巨大positionへそのまま外挿する代わりに、学習済みのposition範囲へ押し込みます。

32768 tokenのpositionを4096 tokenの学習済み範囲へ8分の1に圧縮するPosition Interpolation

Position Interpolation原論文は、LLaMAを最大32,768 tokenへ拡張し、1,000 step未満のfine-tuningで評価しました。これは同論文のmodelと条件で得られた結果で、任意のmodelを設定変更だけで同じように延長できるという意味ではありません。

補間にもtrade-offがあります。広い位置範囲を狭い角度範囲へ圧縮するため、近いposition同士の角度差も小さくなります。長距離を範囲内へ収める一方、短距離の位置分解能を変えてしまいます。

YaRN(Yet another RoPE extensioN)は、RoPEの周波数帯ごとの扱いとAttentionのscaleを調整し、context拡張を安定させる方法です。重要なのは、RoPE Scalingが位置の写し方を変える技術だということです。

RoPE Scalingだけでは次は変わりません。

  • Dense Attentionの\(n^2\) pair
  • autoregressive生成で保持するKV Cacheのtoken数
  • 長文taskを学習dataで経験したか
  • 遠い情報を実際に使えるかという評価結果

prefillとdecodeでは重い場所が違う

LLM推論は大きく二段階に分かれます。

  1. prefill:入力prompt全体をまとめて処理し、各layerのKey/Valueを作る
  2. decode:新しいtokenを1個ずつ生成し、過去のKey/Valueを再利用する

prefillが長い入力をmatrix計算し、decodeが1 tokenずつ増えるKV Cacheを読む違い

長いpromptではprefillのAttention計算が大きくなります。decodeでは1 stepの新しいqueryは1個ですが、過去\(T\) token分のKey/Valueを読みます。生成が進むほどcacheは長くなり、memory bandwidthと容量が効いてきます。

そのため「長文が遅い」という現象も一種類ではありません。

症状 主な段階 関係する要因
最初のtokenが出るまで長い prefill 入力長、Attention方式、kernel、並列化
生成中の1 tokenが遅い decode KV読出し量、batch、memory bandwidth
長い入力を載せられない 両方 activation、workspace、KV Cache、device memory

128K tokenのKV Cacheを計算する

KV Cache(過去tokenのKeyとValueを保持する領域)の概算は、batch sizeを1とすると次の式です。

\[M_{KV}=2\times L\times T\times H_{KV}\times D_{head}\times b\]
  • \(2\):KeyとValue
  • \(L\):layer数
  • \(T\):cacheするtoken数
  • \(H_{KV}\):Key/Value head数
  • \(D_{head}\):1 headの次元数
  • \(b\):1要素のbyte数

仮に\(L=32\)、\(T=128,000\)、\(H_{KV}=8\)、\(D_{head}=128\)、bf16で\(b=2\)とします。

\[2\times32\times128{,}000\times8\times128\times2 =16{,}777{,}216{,}000\ \mathrm{bytes}\]

2進単位へ直すと約15.6 GiBです。これは1 sequenceのKV本体だけの概算です。model weight、activation、temporary buffer、allocatorの余白、padding、metadataは含みません。

32 layer、128K tokenのKV CacheがGQA 8 KV headで15.6 GiB、MHA 32 headで62.5 GiBになる比較

同じ構成でMHA(Multi-Head Attention)が32 KV headを持つなら、KV Cacheは4倍の約62.5 GiBです。GQA/MQAは複数のquery headでKey/Value headを共有し、\(H_{KV}\)を減らします。

ここでも解決対象を分けます。

方法 KV Cache容量 Dense Attention pair数 主なtrade-off
GQA / MQA KV head数に比例して減る 基本的に変わらない Key/Value表現の共有が増える
KV quantization 1要素のbyte数を減らす 変わらない 量子化誤差と変換cost
Paged KV Cache 断片化と割当効率を改善 変わらない page管理が必要
Sparse Attention 参照pattern次第 pair数を減らせる 接続制約が入る

KV Cacheの生成と再利用は、KV Cacheとは?LLM推論を高速化する仕組みで詳しく扱っています。

長さの設定だけではLong Contextにならない

model configurationの最大positionを増やし、推論programが長いtensorを受け付けても、それだけでは遠距離依存を学べません。modelは学習dataの長さ分布とtaskから、どの距離の情報をどう使うかを学びます。

たとえば短い文書をpaddingで128Kへ広げても、128K離れた根拠を統合する学習にはなりません。長いsequenceを入れるだけでなく、遠く離れた情報がlossへ影響する学習例が必要です。

また、Lost in the Middleが調べたように、長文の途中にある情報が使いにくい位置依存も起こり得ます。先頭・末尾だけでなく、必要情報の位置を変えて評価することが重要です。これは同論文の対象modelとtaskで観察された傾向であり、すべてのmodelへ同じ形で現れるとは限りません。

Long Contextの準備状況は、少なくとも次の組み合わせで決まります。

\[\text{usable long context} \neq \text{max position setting only}\]

位置表現、Attention/KVの実行可能性、長文training、taskに合うevaluationをそろえて初めて、利用可能な長文能力になります。

Needleテストだけでは何が足りないのか

Needle-in-a-Haystackは、長い無関係文の中へ目印となる事実を一つ埋め、modelが取り出せるかを測るtestです。位置ごとのretrieval能力を見るには有用ですが、複数情報の統合までは保証しません。

RULERは、この単純testだけでは不十分だとし、retrieval、multi-hop tracing、aggregation、question answeringの4 category、13 taskを用意しました。

単一needle検索、複数箇所を辿るmulti-hop、全体を数えるaggregationで必要な長文能力が異なる図

評価 modelが行うこと 単一needleで代用できない理由
Retrieval 埋め込まれたkey-valueを探す 基本的な検索能力を測る
Multi-hop tracing 複数箇所の対応を順に辿る 1箇所を見つけるだけでは解けない
Aggregation 長文中の複数項目を集計する 全体を漏れなく参照する必要がある
Question answering 文脈から質問へ答える 言い換え、選択、統合が必要になる

RULERの2024年時点の評価では、多くの対象modelでcontextが長くなるほど性能が低下しました。ここから得るべき教訓はmodel順位ではなく、公称最大長とtask別の実効context長を分けて測ることです。

実際のsystemでは、自分のdocumentと質問形式で次を変えてtestします。

  • 必要情報の位置:先頭、中間、末尾
  • 必要情報の個数:1個、複数
  • 操作:抽出、照合、順序追跡、集計、要約
  • distractor:似ているが誤った情報の量
  • output長:短い回答と長い生成

全文投入、Sparse Attention、RAGをどう選ぶか

長い文書を扱う方法は、「modelへ全部入れる」だけではありません。RAGは外部文書を検索し、質問に関係するchunkだけをcontextへ入れます。

方法 向く状況 強み trade-off
Dense Long Context 文書全体の関係を柔軟に見たい retrieval前処理なしで全体を参照 prefillとKVが重い
Sparse Attention 局所性やglobal tokenを設計できる pair数を構造的に削減 pattern外の関係を直接見ない
RAG 大規模・更新頻度の高い知識から関連箇所を探す contextへ入れる量を絞れる retrieval missで根拠を失う
要約・階層処理 全体傾向や段階的統合が必要 各stepのcontextを小さくできる 要約時に細部を失う
Hybrid 検索後も複数chunkの広い関係が必要 retrievalとlong contextを補完 pipelineと評価が複雑

全文投入は検索indexを作らず始められますが、同じ長い文書を質問ごとにprefillするとcostが重なります。RAGは入力を絞れますが、検索で落とした情報をgeneratorは利用できません。長いcontextとRAGは競合する二者択一ではなく、検索後の候補を広めに入れる組み合わせもあります。

Long Contextを設計・評価するchecklist

1. 必要長をtokenで測る

文字数ではなく、実際に使うtokenizerでdocument、instruction、想定outputを数えます。日本語、code、表、JSONでは文字数とtoken数の比が異なります。

2. ボトルネックを段階別に測る

  • time to first token:prefillの影響
  • time per output token:decodeの影響
  • peak device memory:weight、activation、KV、workspaceを含む
  • end-to-end cost:同じ文書を再利用できるかも含む

3. 数式でmemory上限を先に見積もる

\(L,T,H_{KV},D_{head},b\)をmodel設定から取得し、batch sizeと同時sequence数も掛けます。15.6 GiBという先ほどの値は、batch size 4ならKV本体だけで約62.5 GiBになります。

4. task別に実効長を測る

最大長まで一度通すだけでなく、4K、8K、16Kのように段階を切り、情報位置と必要hop数を変えます。accuracyだけでなく、根拠の引用位置や未回答率も記録します。

5. 品質とcostを同じ表で比較する

低latencyでも回答を誤れば意味がなく、高精度でも運用memoryを超えれば使えません。次のように判断します。

確認項目 質問
品質 必要情報を抽出・統合できるか
latency prefillとdecodeのどちらが支配的か
memory KV Cacheとweightが同時実行数に収まるか
cost 質問ごとに全文を再処理するか
更新性 文書更新時に再学習、再index、再prefillのどれが必要か
security 不要な機密情報までcontextへ入れていないか

まとめ

Long Contextは、最大positionを増やす一つのtrickではありません。

  • Dense Attentionは\(n^2\) pairを持ち、Longformerはlocal windowとglobal tokenで接続を疎にする
  • FlashAttentionはexact dense attentionのIOを改善し、Sparse Attentionとは別の軸で効く
  • RoPE Scalingは位置の写し方を拡張するが、Attention計算やKV Cacheを減らさない
  • decodeではKV Cacheがtoken数、layer数、KV head数、head次元、precisionに比例して増える
  • 公称最大長と実効context長は異なり、retrievalだけでなくmulti-hopやaggregationでも評価する

重要なのは、「どの技術が長いか」ではなく、自分のtaskでどの壁が支配的かを切り分けることです。

次回は、Attention自体を別のsequence mixerへ置き換え、長いsequenceを線形時間で扱うことを目指すMamba / SSM(State Space Model:状態を更新しながらsequenceを処理するmodel)を解説します。

参考文献

コメント

タイトルとURLをコピーしました