Sliding Window Attention(Longformer)
最简单的自注意力大家肯定都会啦。
但这种全连接的自注意力(即每个 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 可以获取全局信息。