Sliding Window Attentionとは
スライディングウィンドウAttention
各トークンが固定サイズの近傍ウィンドウ内のみを参照することで、計算量を系列長に対して線形に抑えるAttentionの手法
ひとことで言うと
文章の全部を見るのではなく、自分の近く一定範囲だけを見て処理を軽くするAttentionの工夫。
概要
Sliding Window Attentionは、通常のSelf-Attentionが系列内の全トークンペアの関連度を計算するのに対し、各トークンがあらかじめ定めた固定サイズのウィンドウ内にある近傍のトークンとだけAttentionを計算するようにした手法。 通常のSelf-Attentionの計算量が系列長の2乗に比例して増加するのに対し、Sliding Window Attentionはウィンドウサイズを固定するため、計算量とメモリ使用量を系列長に対して線形に抑えられる。 直接参照できる範囲は固定ウィンドウ内に限られるが、Transformerの層を重ねるごとに間接的な参照範囲(受容野)が広がっていくため、層数が十分あれば実質的に遠い位置の情報もある程度反映できる。 Mistral 7Bなど一部のオープンウェイトモデルが、長いコンテキストを効率的に扱う手段としてこの手法を採用している。
背景
長いコンテキストウィンドウを扱うモデルでは、通常のSelf-Attentionの2乗の計算量がGPUメモリと計算コストの両面でボトルネックになりやすい。 Sliding Window Attentionは、各トークンが参照する範囲を近傍に限定することで、この計算量の問題を軽減する目的で導入された。
歴史
2020年: BeltagyらがLongformerでSliding Window Attentionに相当する局所Attentionの手法を提案。 2023年: Mistral AIがMistral 7Bにこの手法を採用し、オープンウェイトLLMでの実用例として広く知られるようになる。
アーキテクチャ
各トークンの位置 i に対し、Attentionの計算対象を位置 i を中心とした固定サイズ w のウィンドウ内のトークンだけに制限する。 この制限により、各層のAttention計算量はO(系列長×w)となり、通常のO(系列長の2乗)よりはるかに小さく抑えられる。 層を重ねるにつれ、ある位置の情報が伝わる実質的な範囲(受容野)は層数×ウィンドウサイズの分だけ広がっていく。
コード例
モデル設定でのSliding Window指定例
from transformers import MistralConfig
config = MistralConfig(
sliding_window=4096,
)利点
- 計算量とメモリ使用量を系列長に対して線形に抑えられ、長いコンテキストを効率的に処理できる
- 層を重ねることで、固定ウィンドウの制約を超えた実質的な受容野の拡大が期待できる
- 既存のTransformer構造への変更が比較的小さく、実装・導入がしやすい
欠点
- 各層で直接参照できる範囲がウィンドウ内に限られ、非常に離れた位置の情報を直接的には扱えない
- ウィンドウサイズの設定は、タスクや求めるコンテキスト長に応じて調整すべき項目となる
- 全域を直接参照する通常のSelf-Attentionと比べ、特定のタスクでは精度が劣ることもある
比較
- Self-Attention — Sliding Window Attentionは通常のSelf-Attentionの参照範囲を近傍ウィンドウへ制限した効率化手法
- State Space Model — State Space Modelも系列長に対して線形の計算量を実現する手法だが、Attentionとは異なる数理的枠組みに基づく
- コンテキストウィンドウ — Sliding Window Attentionは、長いコンテキストウィンドウを効率的に扱うためのアーキテクチャ上の工夫の1つ
関連用語
よくある質問
Sliding Window Attentionで遠い位置の情報は扱えない?
1つの層では直接扱えないが、層を重ねるごとに間接的な参照範囲が広がるため、十分な層数があれば遠い位置の情報もある程度反映できる。
どのモデルがこの手法を使っている?
Mistral 7BやLongformerなど、長い系列を効率的に扱いたいモデルで採用されている。
参考文献
- Research PaperLongformer: The Long-Document Transformer