滑动窗口注意力与全局注意力如何降低长序列复杂度?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
先用复杂度说明动机:每个 Token 只看附近 w 个位置,连接数从平方级降到约 n 乘 w;少量全局 Token 再负责跨远距离汇聚信息。随后讲多层堆叠会逐步扩大感受野。
若问局限,指出局部窗口对需要直接访问远端细节的任务不友好,全局位置怎么选也依赖任务。不要把“能处理更长”说成“长程能力没有损失”。
可以这样答:
滑动窗口注意力让每个 Token 只关注左右固定范围,复杂度由标准注意力的 O(n²) 降为约 O(nw)。多层堆叠后,信息可以一层层传播到更远位置;再给标题或特殊标记全局注意力,就能建立少量跨段捷径。代价是任意两个远端细节不再直接相连,所以它能容纳更长序列,并不代表长距离交互完全没有损失。
核心回答
稠密 Self-Attention 让每个 token 与全部 \(n\) 个 token 交互,分数矩阵的时间和空间项为 \(\mathcal{O}(n^2)\)。滑动窗口注意力只允许每个 token 看附近约 \(w\) 个位置,把这部分降为 \(\mathcal{O}(nw)\);再选少量 \(g\) 个任务相关 token 做全局连接,复杂度约为 \(\mathcal{O}\!\left(n(w+g)\right)\),从而兼顾局部效率和跨文档信息交换。
局部窗口会限制单层直接感受野,但堆叠多层后信息可逐层传播,感受范围大致随层数扩大。全局 token 则提供更短的远距离路径。代价是注意力图不再完全稠密,窗口、全局位置和任务不匹配时可能漏掉关键依赖。
展开说明
对窗口半径固定的层,token \(i\) 只连接 \([i-w,\,i+w]\) 内的位置;因果 Decoder 则只连接过去窗口。经过 \(L\) 层,局部信息理论上可传播到约 \(\mathcal{O}(Lw)\) 的距离,但路径变长不等于能无损传递细节。Longformer 用局部窗口加任务驱动的全局注意力;现代 Decoder 也常用滑动窗口,但具体层是否交替使用稠密注意力取决于架构。
FlashAttention 与滑动窗口解决的是不同问题:前者在不改变稠密 Attention 数学结果的前提下减少 HBM IO,后者直接稀疏化连接并改变理论计算量。两者可以组合。Decode 时若某层严格只看最近 \(w\) 个 token,旧 KV 可被逐步淘汰;若存在全局或稠密层,则仍需按对应规则保留状态。
工程实践
选窗口大小时应使用与业务相符的长文档任务,绘制“距离—召回率”曲线,并检查关键证据落在窗口边界时的表现。全局 token 应有清晰语义,例如分类标记、问题 token 或段落锚点,而不是无限增加。推理引擎还要验证 Kernel 是否真正支持局部 Attention;只设置配置但仍构造完整 \(n \times n\) Mask,未必获得预期节省。
常见追问
- 窗口为 \(w\) 时为什么是 \(\mathcal{O}(nw)\)? 每个 \(n\) 个 query 只与约 \(w\) 个 key 计算分数,因此总连接数与 \(nw\) 成正比,而不是 \(n^2\)。
- 多堆几层就能完全等价于全局注意力吗? 不能。虽然远处信息可以多跳传播,但路径长度、压缩和优化难度都不同,仍可能丢失精细的远程关联。
- 滑动窗口一定能减少 KV Cache 吗? 只有推理实现允许丢弃窗口外 KV,且该层没有其他全局依赖时才可以;混合稠密层仍可能需要长缓存。
一句话复习
滑动窗口把每个 token 的连接限制在局部,将 \(\mathcal{O}(n^2)\) 变为 \(\mathcal{O}(nw)\),少量全局 token 再补充跨文档通信。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。