最簡單的自注意力大家肯定都會啦。
但這種全連接的自注意力(即每個 token 需要 attend 到輸入序列中的所有其他 token)計算與內存開銷是 O ( n 2 ) O(n^2) O(n2) 。為了緩解這個問題,研究者們提出了 Sliding Window Attention。
Sliding Window Attention
如果設置一個 window 大小為 k k k,那么每個 token 只與它前后相鄰的 k k k 個 token 計算注意力。這樣每個 token 的注意力只在局部范圍內計算,計算復雜度從 O ( n 2 ) O(n^2) O(n2) 降低到了 O ( n k ) O(nk) O(nk)(通常 k ? n k \ll n k?n)。
但問題來了:這種方式只能捕獲局部依賴關系,不能直接獲取長距離的信息。
堆疊多個 Sliding Window 層
有沒有辦法“間接”捕獲遠程依賴呢?
我們可以類比 CNN 中“感受野”的概念。通過堆疊多個 sliding window attention 層(比如 3 層,每層都有 window size k k k),第一個 token 的信息就可以被第三層的更遠處的 token 捕獲到。換句話說:
隨著層數增加,感受野擴大,token 之間的間接信息流動也就可能發生。
Dilated Sliding Window Attention(膨脹窗口注意力)
進一步優化思路是:保持窗口大小不變,但每個 token 不再是關注它附近的連續 token,而是“跳躍”地關注,例如每隔 2 個或 4 個位置看一次。
這叫做 Dilated Sliding Window Attention,類似于 CNN 中的 dilated convolution。
它的好處是:在保持同樣計算資源的情況下,感受野可以擴大。
但它的問題是:關注的是稀疏位置,可能忽略掉一些重要的局部細節信息。
Global Attention + Local Attention(Longformer 的核心)
為了解決局部不敏感的問題,Longformer 設計了 混合注意力模式:對大多數 token 只使用 Sliding Window Attention;對少數“重要的 token”(比如 [CLS] 或問題中的 token),使用 Global Attention,它們可以 attend 到所有其他 token,也可以被所有 token attend 到。
這種設計保留了局部建模的效率;又確保了關鍵 token 可以獲取全局信息。