Sliding Window Attention(SWA)(スライディングウィンドウアテンション)
Transformerの各トークンがアテンションを計算する範囲を固定ウィンドウサイズに制限する手法。全トークン間のアテンション計算(O(n²))を局所範囲に限定することで長文脈処理を効率化する。
Sliding Window Attention(SWA)とは
Sliding Window Attention(SWA)は、Transformerのセルフアテンション計算を全トークンペアから局所ウィンドウ内のペアのみに制限する手法です。2023年にMistral AIがMistral 7Bで実用化し、長文脈処理の効率化に大きく貢献しました。
問題の背景
標準的なセルフアテンションはO(n²)の計算量とメモリを要します。4Kトークン: 16Mトークンペア、32Kトークン: 1Gトークンペア(4K比64倍)、128Kトークン: 16Gトークンペア(4K比1024倍)。これが長コンテキストLLMの主要ボトルネックです。
SWAの仕組み
局所ウィンドウ
各トークン i は、直近 W トークン(位置 i-W から i まで)のみを参照します:
# 例: W=4096, i=10000 の場合
# 参照範囲: トークン 5904〜10000 のみ
# 参照外: トークン 1〜5903 は無視
間接的な長距離依存
多層Transformerではレイヤーを重ねるごとに「受容野」が広がります。1層目はウィンドウW内の情報を集約し、2層目はW²の範囲の情報を間接参照し、L層目は理論上W^Lの範囲まで参照可能。32層のモデルでW=4096なら天文学的な範囲まで情報伝播できます。
ローリングバッファKVキャッシュ
SWAとローリングバッファを組み合わせることで固定メモリで無制限長を処理できます:
class SlidingWindowAttention:
def __init__(self, window_size=4096):
self.W = window_size
self.kv_cache = RollingBuffer(size=window_size)
def forward(self, query, key, value, position):
self.kv_cache.push(key, value)
k_window = self.kv_cache.get_window()
v_window = self.kv_cache.get_values()
return attention(query, k_window, v_window)
Mistral 7BでのSWA設定
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-v0.1",
torch_dtype=torch.float16,
device_map="auto"
)
print(model.config.sliding_window) # 4096
print(model.config.max_position_embeddings) # 32768
SWAを採用するモデル
Mistral 7B(ウィンドウ4096 / 最大32K)、Mixtral 8x7B(4096 / 32K)、Phi-3 mini(2048 / 128K)、Phi-3 medium(2048 / 128K)、Mistral Nemo(4096 / 128K)。
SWAの限界と補完
ウィンドウ外の重要なコンテキスト(長い書類の冒頭等)が直接参照されない制約があります。RAG(Retrieval-Augmented Generation)でウィンドウ外の情報を補完するアーキテクチャが有効です。Ring Attentionとの違いとして、SWAは単一デバイスでの局所化を目的とするのに対し、Ring Attentionは分散処理向けの全文脈アテンションを実現します。
SWAはLLMの長文脈処理における重要な実用的解決策として、計算量をO(n²)からO(n×W)に削減し、固定メモリで事実上無制限の長さを処理できます。長文書処理・RAG・コード理解など実用ユースケースで広く活躍しています。