Sliding Window Attention — Chỉ nhìn N token gần nhất, đủ rồi
Giảm độ phức tạp attention từ O(n²) xuống O(n×w) bằng cách giới hạn mỗi token chỉ nhìn w token lân cận. Cách Mistral 7B chạy 32K context trên GPU 24GB.
Khi context dài đến 8.000 tokens, ma trận attention nặng 512MB và cần tính toán 64 triệu cặp score. Sliding Window Attention (SWA) nói rằng: điều đó là lãng phí. Chỉ cần nhìn 512 token gần nhất, bạn vẫn hiểu câu hiện tại — và đột nhiên chi phí giảm 20 lần, cho phép chạy long-context trên GPU consumer.
Vấn đề
Standard Attention có độ phức tạp O(n²) theo chiều dài sequence. Với n=8.000 tokens, ma trận attention có 64 triệu entries, chiếm ~512MB VRAM chỉ riêng cho ma trận score (FP16). Khi n=32.000, con số này tăng lên 8GB — chưa kể KV Cache và weights.
Vấn đề không chỉ là memory. Tính toán attention cũng tốn FLOPs theo n², nhưng thực tế inference lại bị memory bandwidth bound: bạn phải load toàn bộ KV cache từ HBM vào SRAM cho mỗi token mới sinh ra. Với context dài, bạn dành 95% thời gian chờ dữ liệu di chuyển, không phải tính toán.
Nhưng liệu có thực sự cần thiết phải tính attention giữa token hiện tại và token đầu tiên của đoạn văn 10.000 tokens trước đó? Thống kê ngôn ngữ học cho thấy 90% dependencies cú pháp (subject-verb, adjective-noun) nằm trong phạm vi < 50 tokens. Dependency xa hơn thường là hiếm và có thể được xử lý qua các tầng trung gian.
Ý tưởng cốt lõi
Giới hạn attention trong cửa sổ cố định (window size w). Thay vì nhìn toàn bộ n tokens, mỗi token chỉ attend đến w token lân cận. Độ phức tạp giảm từ O(n²) xuống O(n×w) — với w=512, đây là sự khác biệt giữa "không thể chạy" và "mượt mà trên RTX 4090".
Locality là King
Ngôn ngữ tuân theo power-law distribution về khoảng cách dependency. Phần lớn thông tin cần thiết để hiểu token hiện tại nằm ngay xung quanh nó — giống như con người đọc sách: bạn không nhớ từng chữ của 100 trang trước, chỉ cần "working memory" gồm vài câu gần nhất và ý chính đã tóm tắt.
SWA ép buộc transformer học theo cách con người suy nghĩ: thông tin phải được nén và truyền dần qua các tầng trung gian, thay vì truy cập trực tiếp từ xa.
The Hierarchy Trick (Receptive Field Expansion)
Một window đơn lẻ chỉ thấy w token, nhưng giống như CNN, khi stack nhiều layers, receptive field tăng nhân lên. Với window size w=512 và 12 layers:
- Layer 1-2: Học n-grams, local syntax (cửa sổ 512)
- Layer 6: Học sentence-level semantics (cửa sổ ~3K)
- Layer 12: Học document structure (cửa sổ ~6K)
Thông tin từ token đầu tiên đến token thứ 10.000 không cần đường truyền trực tiếp; nó đi qua các "checkpoint" trung gian, mỗi layer tóm tắt context local thành representation dense hơn. Đây là compositional reasoning thay vì memorization thô.
Rolling Buffer KV Cache (Mistral)
Thay vì append KV cache vô hạn, Mistral dùng circular buffer có kích thước cố định bằng window size. Khi token mới đến, nó ghi đè lên phần tử cũ nhất. Kết quả: memory usage O(w) thay vì O(n), cho phép inference sequence dài vô hạn (streaming) với memory cố định.
Sigmoid thay Softmax (SWAT)
Trong softmax attention, tổng attention weights phải bằng 1 (zero-sum competition). Nếu một token irrelevant ở đầu sequence nhận chút attention, nó "cướp" budget từ các token quan trọng trong window hiện tại — hiện tượng attention sink.
Sliding Window Attention Training (SWAT) thay softmax bằng sigmoid: mỗi token được attend independently (range 0-1), không cạnh tranh. Trong window cố định, bạn không thể afford việc 30% budget bị waste vào token ngoài window như trong full attention.
Tại sao nó hoạt động
Mathematical Sparse Pattern: SWA tạo sparse attention mask — một band matrix thay vì full matrix. Với n=10.000 và w=512, số lượng attention computations giảm từ 100M xuống ~5M (20× speedup).
Information Diffusion qua Layers: Giống như heat diffusion, thông tin từ token xa truyền đến token hiện tại qua nhiều bước trung gian, mỗi bước nén và trích xuất đặc trưng. Điều này thực chất tốt hơn full attention vì ép model học hierarchical features thay vì raw memorization.
Streaming Capability: SWA cho phép "training context mismatch" — train trên window ngắn (4K) nhưng inference trên sequence dài vô hạn (100K+) bằng cách giữ fixed-size KV cache và để window trượt. Model đã học cách compress information vào hidden states; nó không cần nhìn lại 100K tokens trước, chỉ cần state tóm tắt cuối cùng.
Ý nghĩa thực tế
So sánh với Full Attention
| Metric | Full Attention | Sliding Window Attention (w=512) |
|---|---|---|
| Complexity | O(n²) | O(n×w) |
| Memory Attention Matrix | 512MB (n=8K) | 16MB |
| KV Cache Growth | O(n) — unbounded | O(w) — constant |
| Long-range | Direct link | Hierarchical via layers |
| Use case | Needle-in-haystack exact match | Streaming, long docs, chat |
Benchmarks thực tế
- Mistral 7B với SWA xử lý 32K context trên 24GB VRAM với throughput 2-3× cao hơn Llama full attention tương đương.
- Summarization 10K tokens: SWA đạt 95% quality so với full attention, nhưng latency giảm 65%.
- StreamingLLM: Dùng SWA + attention sinks để xử lý văn bản vô hạn (infinite context) trên GPU consumer mà không OOM.
Limitations
Không thể nhảy cóc: Nếu task đòi hỏi liên kết trực tiếp giữa đoạn đầu và đoạn cuối tài liệu 100K tokens mà không có summary tokens ở giữa (ví dụ: "so sánh đoạn 1 và đoạn 1000"), SWA thất bại. Thông tin bị suy giảm qua nhiều layers (telephone game effect).
Global tokens cần thiết: Longformer giải quyết bằng cách thêm "global attention" cho tokens đặc biệt (CLS, punctuation) để chúng nhìn toàn bộ sequence và được mọi token nhìn lại. Mistral không dùng global tokens, nên cần careful prompt design để đặt summary ở cuối window.
Coding tasks: Code thường có long-range dependencies (function definition ở đầu file, call ở cuối). SWA có thể struggle nếu không có cơ chế nhìn xa bổ sung.
Đào sâu hơn
Paper gốc:
- Longformer: The Long-Document Transformer (2020) — Giới thiệu sliding window + global attention hybrid.
- Sliding Window Attention Training for Efficient Large Language Models (2025) — SWAT, thay softmax bằng sigmoid để tránh attention sink.
- StreamingLLM (2023) — Efficient infinite context với rolling buffer.
Cùng cụm (attention-efficiency):
- Flash Attention — Tối ưu IO-aware cho attention nhanh hơn bằng tiling trên SRAM.
- Multi-Query Attention — Giảm KV cache bằng cách share K/V heads.
- Grouped-Query Attention — Sweet spot giữa MHA và MQA.
- RoPE — Position encoding dùng rotation thay vì addition.
- ALiBi — Phạt khoảng cách tuyến tính cho extrapolation.
Đọc tiếp:
- KV Cache — Cơ chế cache cơ bản mà SWA tối ưu.
- Ring Attention — Khi bạn thực sự cần nhìn toàn bộ 1M tokens (Level 2).
- Sequence Modeling basics — Foundation về attention mechanism (Level 0).
GQA — Goldilocks giữa MHA và MQA: Bí quyết giảm 4x KV Cache không mất chất lượng
Grouped Query Attention là kỹ thuật chia nhóm attention heads để chia sẻ Key/Value, giảm memory bandwidth trong inference xuống 75% mà vẫn giữ 90%+ chất lượng MHA. Đây là lý do Llama 2 và Mistral chạy được context dài trên hardware consumer.
RoPE — Xoay vector thay vì cộng position, elegant hơn hẳn
RoPE thay đổi cách mã hóa vị trí trong Attention: xoay vector thay vì cộng thêm, tự nhiên hỗ trợ relative position và extrapolation. Dùng trong Llama, Mistral, Qwen.