想象你在夜市排队买一份网红烤冷面。队伍排了三百米,如果你想知道前面每个人都在买什么口味,得从头到尾问一遍——这就是经典注意力机制的做法:每个字都要“回头看”整篇文章的所有字。可当文章变成一本三百万字的小说时,这种“挨个问”的方式会让人崩溃——计算量呈平方级爆炸。Mistral 模型给出了一个聪明的解法:你不需要认识队伍里所有人,只需要盯紧前面那几个人,信息自然会像“人传人”一样传到你的耳朵里。这就是滑动窗口注意力(Sliding Window Attention)——把“全队社交”变成“邻里串门”,用局部视野撬动全局信息。

岗位关联

掌握滑动窗口注意力,你就掌握了当前大模型(如 Mistral)支持超长上下文的核心理念。在推理引擎优化、长文本应用开发、模型架构选型中,这一知识能帮你理解“为什么这个模型能读那么长的文档还不卡顿”,是构建高性能 AI 应用的关键拼图。

目录
  1. 可视化演示
  2. 经典注意力瓶颈
  3. 滑动窗口机制
  4. 线性复杂度
  5. 层间信息传播
  6. 全局注意力token
  7. 推理优化策略
  8. 优势与局限
  9. 对比与展望
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示滑动窗口注意力的带状掩码矩阵、O(n^2)与O(nw)复杂度对比及多层堆叠扩展有效感受野,交互调节窗口大小查看注意力覆盖范围。

本节配有交互动效(进入视口后自动加载,约 3KB)。

滑动窗口:带状注意力掩码 每个token仅关注窗口w内局部上下文窗外位置掩码为负无穷 注意力矩阵呈带状分布复杂度从O(n^2)降为O(nw) A=band(w) 局部高效注意力配合层间堆叠传播全局信息

经典注意力瓶颈

你还记得那个三百米长的烤冷面队伍吗?在标准的注意力机制(Self-Attention)里,排在队伍末尾的你,为了决定自己要不要加辣,居然要挨个问前面三百个人“你买的是什么口味”。每个人都要这么问一遍,整个队伍就要进行三百乘三百——九万次对话。如果队伍有一万人,那就是一亿次对话。这就是经典注意力机制的困境:计算量随序列长度呈平方级增长,写成公式就是 O(n²)。

在 Transformer 架构中,每个 token(你可以把它理解为一个“字”或“词”)都要计算与序列中所有其他 token 的注意力分数。这个“全连接”设计让模型能捕捉任意距离的依赖关系,但代价极其高昂:当输入序列长度 n 翻倍时,计算量翻四倍。对于动辄几十万 token 的长文档、长对话,这个开销让训练和推理都变得难以承受。

更棘手的是,除了计算量,显存占用也随平方级增长。每个 token 都要为其他所有 token 保存注意力矩阵,这个矩阵的大小是 n×n。当 n 达到十万时,单单注意力矩阵就需要 100 亿个浮点数——这在消费级 GPU 上直接爆炸。所以,经典的全局注意力在处理长文本时,就像让夜市里的每个人都认识整条街的所有人,既不现实,也没必要。

滑动窗口机制

Mistral 对上面的困境给出了一个极其接地气的答案:既然没必要认识全街的人,那就只认识你前后几个邻居好了。这就是滑动窗口注意力(Sliding Window Attention,SWA)。它给每个 token 划定了一个固定大小的“社交圈”——通常取窗口大小为 W,每个 token 只与前后 W/2 个 token 计算注意力,窗口之外的 token 一概不理会。

这个“社交圈”的设计非常巧妙。它不像某些方法那样把序列硬切成互不重叠的块(那样会丢失块与块之间的联系),而是让窗口“滑”过整个序列。序列中的每一个 token,无论它处在什么位置,都能看到以自己为中心、宽度为 W 的一个连续区间。相邻 token 的窗口会重叠,信息在序列上是连续流动的。

窗口大小 W 是一个超参数,Mistral 在其 7B 模型中设置的窗口大小为 4096。也就是说,每个 token 只看自己前后共 4096 个邻居,而非整个序列。这就像你在夜市里只跟前后两三个摊位聊得火热,但整条街的热闹景象,依然能通过邻居们的口口相传进入你的耳朵。窗口越宽,视野越大,但计算量也越大;窗口越窄,效率越高,但可能漏掉重要的远距离信息——这是一个需要根据任务需求精心调配的旋钮。

线性复杂度

现在我们来看看,这个“只跟邻居聊天”的策略,究竟省了多少力气。假设序列长度为 n,窗口大小为 W。每个 token 只需要计算与窗口内 W 个 token 的注意力分数,因此总计算量大约是 n × W。由于 W 是一个固定常数(不随 n 变化),所以整体复杂度从 O(n²) 降到了 O(n)——这就是线性复杂度。

这个从“平方”到“线性”的跨越,在实际运行中效果惊人。假设 n 从 1000 涨到 100000,标准注意力的计算量要涨一万倍,而滑动窗口注意力只涨一百倍。在推理引擎中,这意味着同样一块 GPU,能够处理的上下文长度从“几万 token”跃升到“几十万 token”。(补充一句说明)这不仅仅是一个数字游戏,它直接决定了你的聊天机器人能否读完一整本《三体》再跟你讨论剧情。

标准注意力:O(n2)⟹滑动窗口注意力:O(n×W)≈O(n)\displaystyle \text{标准注意力}:O(n^2) \quad\Longrightarrow\quad \text{滑动窗口注意力}:O(n \times W) \approx O(n)
W 是固定常数,所以 n×W 与 n 成正比,这就是“线性”的含义。
  1. 标准注意力复杂度每一步都要看全序列,n 个 token 每个都要算 n 次,所以是 n 的平方。
    O(n2)=n×n\displaystyle O(n^2) = n \times n
  2. 窗口限制后每个 token 只看 W 个邻居,W 远小于 n 且不随序列长度变化。
    O(n×W)\displaystyle O(n \times W)
  3. 常数吸收W 是常数,可以忽略不计,复杂度就变成了正比于 n 的线性阶。
    O(n×W)=O(n)\displaystyle O(n \times W) = O(n)

层间信息传播

你可能会问:每个 token 只看 W 个邻居,那距离很远的两个 token 之间,信息不就彻底断了?别担心,这就是滑动窗口注意力最精妙的设计——层间接力。虽然每个 token 在单层内只看到 W 个邻居,但 Transformer 模型有几十层甚至上百层。在第 1 层,token A 认识 B;在第 2 层,B 认识的 C 通过 B 间接“介绍”给了 A;到了第 3 层,A 就认识了 C 的朋友 D。每经过一层,信息就能多传播 W 个 token 的距离。

这就是“感受野”(Receptive Field)的概念:在 L 层 Transformer 中,一个 token 能间接看到的最远距离约为 L × W。Mistral 有 32 层,窗口 4096,理论上最远可以感知到超过 13 万个 token 之外的信息。这就像夜市里的消息传播:你只跟邻居说话,但一晚上下来,整条街的八卦全都传到了你的耳朵里——因为每个邻居都从他们的邻居那里听到了消息,层层传递,毫无死角。

这个性质说明了一个深刻的道理:全局性不一定要靠“直接看”来实现,“间接听说”同样能覆盖整个序列。Mistral 用 32 层 × 4096 窗口,达到了远超单层全局注意力的有效覆盖范围,而计算量却小得多。这就像一个大公司里,普通员工不需要认识 CEO,但通过层层汇报,CEO 的决策依然能传达到每一个基层员工。

有效感受野=L×W\displaystyle \text{有效感受野} = L \times W
L 是 Transformer 层数,W 是滑动窗口大小。信息每经过一层,最多沿序列传播 W 个位置。
  1. 单层传播距离一层 Transformer 中,一个 token 只能直接影响窗口内的 W 个 token。
    d1=W\displaystyle d_1 = W
  2. 多层叠加效果第 2 层中,token 能看到第 1 层中那些“认识 W 个邻居”的 token,因此距离翻倍。
    d2=2W\displaystyle d_2 = 2W
  3. L 层推广以此类推,总感受野为层数乘以窗口大小。
    dL=L×W\displaystyle d_L = L \times W

全局注意力token

虽然层间接力能传播信息,但“听说”总归不如“亲眼所见”来得可靠。对于某些关键信息——比如文章的主题句、数据库的全局统计量——如果每个 token 都要等上几十层才能“辗转听说”,既慢又容易失真。Mistral 的解决方案是:每隔一段距离,设置一个“全局注意力 token”,让窗口内的普通 token 可以直接看到它。

这些全局 token 就像夜市街角的“广播塔”:任何一个在窗口范围内的 token 都能直接“看到”广播塔里播放的全局信息。Mistral 的做法是选择序列中每隔一定间隔(比如每 7 个 token)的一个 token,让它能注意到整个序列的所有 token,而序列中所有 token 也都能注意到它。这样,全局 token 就成了信息的中转枢纽:局部信息汇聚到全局 token,再由全局 token 广播给所有窗口内的 token。

这种设计达成了一种精妙的平衡:正常 token 只用滑动窗口,保持线性复杂度;少量全局 token 使用完整注意力,提供全局视角。因为全局 token 的数量很少(比如每 7 个有一个,大约占总数的 1/7),所以即便它们用全局注意力,整体复杂度依然是线性的。这就像夜市不会真的让每个人都站在楼顶看全景,但每隔一段路设一个“瞭望塔”,就足以让所有人既了解身边的小事,也不错过整条街的大事。

这个“局部为主、全局点睛”的混合架构,后来被证明极具生命力。它让模型既能高效处理海量局部细节(比如代码中的函数体、小说中的场景描写),又能牢牢把握全局脉络(比如整个项目的架构、小说的主线剧情)。在 Mistral 的实践中,全局 token 还承担了类似“感叹词触发器”的角色——当某个关键实体在长文中出现时,全局 token 能迅速将它的历史信息拉回当前正在生成的文本中。

总复杂度=O(n×W+nG×n)≈O(n)\displaystyle \text{总复杂度} = O\left(n \times W + \frac{n}{G} \times n\right) \approx O(n)
G 是全局 token 的间隔步长。因为 n/G 是常数比例,所以第二项仍然是 O(n)。
  1. 普通 token 的窗口计算n 个普通 token,每个看 W 个邻居。
    O(n×W)\displaystyle O(n \times W)
  2. 全局 token 的全序列计算每 G 个 token 设一个全局点,共 n/G 个,每个看全序列 n 个 token。
    O(nG×n)\displaystyle O\left(\frac{n}{G} \times n\right)
  3. 合并后仍是线性两项中 G 和 W 都是常数,所以总复杂度依然正比于 n。
    O(nW+n2G)=O(n)\displaystyle O\left(nW + \frac{n^2}{G}\right) = O(n)

推理优化策略

滑动窗口注意力不仅让训练更快,也给推理阶段带来了巨大的优化空间。首先受益的是 KV 缓存(KV Cache)。在自回归生成中,每生成一个 token,都要复用之前所有 token 的 Key 和 Value 向量。如果用标准注意力,KV 缓存会随着生成长度线性增长——生成了十万个 token,就要缓存十万个 Key/Value 对。但滑动窗口注意力下,每个 token 只需要窗口内的 Key/Value,所以缓存可以像传送带一样滚动:新的 KV 进来,超出窗口的旧 KV 就可以丢弃。

这就像夜市摊位的“排队单”管理:你不需要记住今天下午每一位顾客的订单,只需要记住最近几单的口味偏好,前面的订单早已变成食物递出去了。Mistral 的 KV 缓存大小与窗口大小成正比,与生成的总长度无关。这意味着,无论你让模型写多长的文章,显存占用都不会随之暴涨——这对推理引擎的稳定性至关重要。

第二个策略是 跨层 KV 共享。Mistral 观察到,相邻层的注意力模式往往高度相似,于是让相邻两层共享同一份 KV 缓存,而不是每层各存一份。这相当于把夜市里相邻摊位的“顾客偏好记录”合并成一张共享的小黑板,既省了纸张(显存),又没损失多少信息。跨层 KV 共享让缓存量再减半,配合滑动窗口,Mistral 能在单张 A100 GPU 上流畅处理 32K 甚至更长的上下文。

第三个策略是配合 流式推理(Streaming Inference)。由于模型只需要保留窗口内的信息,推理引擎可以边读边算、边算边丢,就像一个只带了一个小背包的徒步者,而不是背着全部家当的搬家车。这让 Mistral 在处理超长文档(比如整本代码库、完整对话历史)时,依然能保持稳定的生成速度和内存占用,这也是为什么 Mistral API 能自信地宣称支持“百万 token 上下文”。

优势与局限

讲了这么多好处,滑动窗口注意力也不是没有软肋。先说说优势:最直观的就是显存占用大幅下降。标准注意力在任何时刻都要为全序列保留注意力矩阵和 KV 缓存,而滑动窗口注意力只需要保留窗口大小的那部分。这意味着同样的硬件,能跑的模型更大、能处理的文本更长。其次是计算延迟显著降低,因为每个 token 的注意力计算量从 n 降到了 W,生成每个 token 的速度更快,用户体验更流畅。

但局限也同样明显。第一,远距离依赖仍然受限。虽然层间接力能实现全局信息传播,但这种“间接传播”是有损的:信息每传一层都可能被“稀释”或“扭曲”。如果两个关键实体在文中相距极远(比如一本推理小说开头埋的伏笔,到结尾才收),滑动窗口的模型可能无法像全局注意力那样牢牢抓住这层关系。第二,窗口大小很敏感。窗口太小,局部上下文不够,模型理解力下降;窗口太大,计算量回升,失去滑动窗口的意义。这个超参需要针对具体任务精细调优,并不是越大越好。

第三,实现复杂度较高,尤其对推理引擎开发者来说:需要专门的掩码矩阵(Attention Mask)、特殊的 KV 缓存管理逻辑和跨层共享机制,这都比标准的全注意力实现要复杂。你可以把这个问题理解成:夜市管理方为了让“人传人”的消息传播机制运转顺畅,需要在各个路口设指示牌、安排广播员、设计防走失路线——这显然比“所有人直接站楼顶看到全街”要费更多管理的脑筋。

对比与展望

把滑动窗口注意力放在大模型注意力机制演进的地图上,它的位置非常有趣。与标准全局注意力相比,它以一定的远距离建模能力换取了大得多的效率提升——在长文本场景下,这几乎是决定性的优势。与稀疏注意力(Sparse Attention)的其他变体(如 Longformer 的膨胀窗口、BigBird 的随机连接)相比,滑动窗口的实现更简单、更直观,同时也能取得接近的效果。Mistral 用实践证明了:简单的“只看邻居”策略,加上多层的间接传播,足以挑战复杂得多的稀疏方案。

展望未来,滑动窗口注意力已经成为长上下文大模型的“标准动作”。GPT 系列有类似的局部注意力变体,Llama 3.1 的 128K 长上下文也有局部注意力的影子,而 Mistral 更是凭借滑动窗口 + 全局 token + KV 共享的组合拳,在效率与效果之间找到了一个漂亮的平衡点。随着上下文窗口从 128K、1M 甚至更长延伸,“完全全局注意力”在算力上越来越不可能,滑动窗口这类“局部直连 + 多层接力 + 少量全局锚点”的混合架构,将成为长上下文推理的主流范式。

就像夜市不会因为修了一条贯穿全街的高架桥,就把邻里间的串门取消——效率与温度需要兼顾。未来的注意力机制,大概率不会是“全都要”的暴力美学,而是“精准计算”的设计艺术。滑动窗口注意力,就是这个设计艺术中已经落地的、被大规模验证的一块基石。

AI 应用场景

长文本流式问答助手

阶段:模型推理优化

解决的问题:传统全局注意力在处理超长对话历史(如客服会话、法律文档审核)时,显存随对话轮数线性增长,导致长时间运行崩溃或响应越来越慢。滑动窗口注意力让 KV 缓存只保留窗口内部分,显存占用恒定,服务稳定性大幅提升。

具体案例:某法律科技公司用 Mistral-7B 搭建合同审核助手,用户上传 20 万字的合同文本。启用滑动窗口注意力后,单张 A100 GPU 即可流畅处理全文,审核响应时间从 90 秒降到 8 秒,且连续处理多份合同时显存无累积增长。

代码库全局理解工具

阶段:长上下文建模

解决的问题:编程 AI 助手需要同时理解整个代码库的架构和某个函数的局部实现。只靠全局注意力,上下文长度受限;只靠局部窗口,又抓不住项目全局。Mistral 的全局注意力 token 机制让模型每隔一段代码设置一个“全局锚点”,兼顾局部细节与全局结构。

具体案例:一款 AI 代码审查工具将整个 GitHub 仓库的源码拼成超长序列喂给 Mistral,利用滑动窗口 + 全局 token 的架构,能够准确回答“修改这个函数会影响哪些模块”这一类需要全局视野的问题,且在 10 万 token 长度下仍保持流畅推理。

Python 演示

python61 行
# -*- coding: utf-8 -*-"""滑动窗口注意力机制的最小实现演示"""import numpy as np  def sliding_window_attention(q, K, V, window_size=3):    """对单个 query 计算滑动窗口注意力。     Args:        q: 当前 token 的 query 向量, shape (d,)        K: 所有 token 的 key 矩阵, shape (n, d)        V: 所有 token 的 value 矩阵, shape (n, d)        window_size: 滑动窗口大小(只看左边 window_size 个 token)     Returns:        注意力加权后的输出向量, shape (d,)    """    n = K.shape[0]    # 1. 只保留窗口内的 key/value(不含未来 token)    start = max(0, n - window_size)    K_win = K[start:n]    V_win = V[start:n]     # 2. 计算窗口内注意力分数(点积)    scores = K_win @ q     # 3. softmax 归一化成权重    scores = scores - np.max(scores)  # 数值稳定性    weights = np.exp(scores) / np.sum(np.exp(scores))     # 4. 加权求和得到输出    out = weights @ V_win    return out  def main():    # 构造模拟数据: 50 个 token, 每个 8 维    np.random.seed(42)    n, d = 50, 8    K = np.random.randn(n, d)    V = np.random.randn(n, d)     # 模拟第 50 个 token(即当前生成位置)的 query    q = np.random.randn(d)     # 标准全局注意力(对比用)    scores_full = K @ q    scores_full = scores_full - np.max(scores_full)    w_full = np.exp(scores_full) / np.sum(np.exp(scores_full))    out_full = w_full @ V     # 滑动窗口注意力(窗口=3)    out_win = sliding_window_attention(q, K, V, window_size=3)     print("标准全局注意力输出:", np.round(out_full, 4))    print("滑动窗口注意力输出:", np.round(out_win, 4))    print("窗口大小=3, 仅使用最后3个token的信息")  if __name__ == "__main__":    main()
目的:用 NumPy 手写一个极简的滑动窗口注意力,对比全局注意力与窗口注意力的输出差异,直观理解“只看邻居”的含义。
  1. start = max(0, n - window_size)确定窗口起始位置,保证窗口不越界,这是滑动窗口的核心边界处理。
  2. K_win = K[start:n]; V_win = V[start:n]只取窗口内的 Key/Value 矩阵,将计算量从全序列降为窗口大小。
  3. scores = K_win @ q用点积计算查询向量与窗口内各 Key 的相似度,决定关注谁。
  4. weights = np.exp(scores) / np.sum(np.exp(scores))Softmax 归一化,把相似度分数变成“注意力权重”,相当于给每个邻居分配关注比例。
  5. out = weights @ V_win用权重对窗口内 Value 做加权求和,得到当前 token 的输出向量。
  6. if __name__ == "__main__":保证脚本可直接运行,便于读者动手验证。

常见误区

误区我以为是像切蛋糕一样,把长文本切成一块块互不相干的片段,每个片段内部做注意力,片段之间完全无关。

正解滑动窗口与“硬切块”有本质区别。窗口是滑动的,相邻 token 的窗口互相重叠,信息在序列上是连续流动的。就像夜市里每个人只跟前后几个人说话,但消息通过层层传递能传遍整条街——切块则是把街垒成隔断墙,每段互不来往。滑动窗口的“重叠”设计正是它能兼顾局部效率与全局传播的关键。

为何常见:这个名字容易让人联想到卷积神经网络中的“局部感受野”,而卷积就是切块的思路。但注意力机制中的“窗口”是重叠滑动的,不是硬分割的,这是一个常见直觉误区。

误区既然是窗口限制了视野,那把窗口设得越大,模型肯定就越聪明吧?直接把窗口设成序列长度,不就跟全局注意力一样强了?

正解窗口越大,计算量越大,当窗口接近序列长度时,滑动窗口就退化为全局注意力,失去了优化的意义。而且更大的窗口不一定带来更好的效果——过大的窗口会引入大量噪声 token,反而稀释了对关键局部信息的关注。窗口大小需要根据任务特性调优:代码生成可能 2048 就够,长文档摘要可能需要 8192 或更高。

为何常见:人们天然认为“看得越多越好”,但在注意力机制中,“精准聚焦”往往比“什么都看”更重要。窗口大小的选择本质是一个效率与效果的权衡,不是越大越优。

误区每个 token 只看窗口内的邻居,那距离很远的两个 token 之间不就永远没有联系了吗?这让模型失去长期记忆能力。

正解这是一个经典误解。虽然单层内 token 只直接看 W 个邻居,但多层 Transformer 的堆叠让信息能以“接力”方式传播。L 层的有效感受野是 L×W,Mistral 32 层 × 窗口 4096,理论感受野超过 13 万 token。此外,全局注意力 token 的引入更是为远距离信息提供了“直达通道”。所以滑动窗口并没有放弃长期依赖,而是用更经济的方式实现了它。

为何常见:人很容易从“单层”的视角去看问题,忽略了深度学习中“层数”这个关键维度。就像你看单人接力跑选手只能跑 100 米,但 4×100 米接力就能覆盖 400 米——层间堆叠的本质就是接力赛。

误区滑动窗口注意力只是推理阶段用来省显存的小技巧,训练的时候反正要把整个序列放进内存,用不用窗口没区别。

正解滑动窗口注意力是模型架构本身的设计,而非推理后处理。训练过程中,每个 token 的注意力计算同样只发生在窗口内,训练时的显存占用、计算量同样从 O(n²) 降到 O(n)。这使得 Mistral 在相同算力下能用更长的序列训练,或在相同序列长度下用更大的 batch 训练。它既服务训练,也服务推理。

为何常见:很多人是在“推理优化”的话题里第一次听到滑动窗口,因此误以为它只是一个推理技巧。实际上,模型前向传播在训练和推理时做的事是一样的,架构上的优化同时惠及两端。

面试题

Q1. 滑动窗口注意力(SWA)的核心思想是什么?

单选题 · easy

  • A.每个 token 只与固定窗口内的邻居计算注意力← 正确答案
  • B.将文本切成互不重叠的块分别处理
  • C.用卷积操作替代全部注意力计算
  • D.只让少量全局 token 参与注意力计算

答案:A。SWA 的本质是“局部直连”——每个 token 只与前后固定范围(窗口 W)内的 token 计算注意力,窗口外的 token 不直接参与。B 是“硬切块”的误解;C 是卷积网络的思路;D 只描述了全局 token 策略,但忽略了滑动窗口的主体设计。

Q2. 标准全局注意力的计算复杂度是?

单选题 · easy

  • A.O(n)
  • B.O(n log n)
  • C.O(n²)← 正确答案
  • D.O(n×W)

答案:C。标准注意力中,n 个 token 每个都要与 n 个 token 计算注意力分数,总共约 n² 次计算。滑动窗口注意力把它降到 O(n×W)≈O(n)。O(n log n) 是某些近似方法的目标复杂度,O(n×W) 是 SWA 的复杂度。

Q3. 滑动窗口注意力将复杂度从 O(n²) 降为 O(n) 的关键是什么?

单选题 · mid

  • A.窗口大小 W 是固定常数,不随 n 增长← 正确答案
  • B.序列长度 n 本身变小了
  • C.注意力分数被近似计算
  • D.只计算最后一层的注意力

答案:A。SWA 每个 token 只算 W 次注意力,总量为 n×W。只要 W 是常数,n×W 就与 n 成正比,复杂度为 O(n)。序列 n 没变,分数没有被近似,各层都参与计算,A 是唯一正确解释。

Q4. 在 L 层 Transformer 中,滑动窗口注意力的有效感受野约为?

单选题 · mid

  • A.W
  • B.L×W← 正确答案
  • C.W/L
  • D.n/L

答案:B。每层窗口传播 W 个距离,L 层叠加后信息最多传播 L×W 远。这就是“层间接力”的效果——单层只能看 W,但多层叠加让远处信息也能辗转到达。

Q5. Mistral 为了兼顾局部效率与全局覆盖,采用了哪些策略?

多选题 · mid

  • A.滑动窗口注意力让普通 token 只看局部← 正确答案
  • B.每隔若干 token 设置全局注意力 token← 正确答案
  • C.所有 token 一律使用全局注意力
  • D.跨层 KV 共享减少缓存占用← 正确答案

答案:ABD。Mistral 的核心组合拳有三招:滑动窗口做局部高效计算(A)、周期性设置全局 token 提供全局视角(B)、跨层 KV 共享减少推理显存(D)。C 是全注意力方案,恰恰是 Mistral 要避免的。

Q6. 滑动窗口注意力中的 KV 缓存相比标准注意力有什么不同?

单选题 · mid

  • A.缓存大小与窗口大小成正比,与序列长度无关← 正确答案
  • B.缓存大小与序列长度成正比
  • C.不需要任何 KV 缓存
  • D.缓存存放在 CPU 内存中

答案:A。标准注意力的 KV 缓存随生成长度线性增长,而 SWA 只需保留窗口内的 KV。缓存像传送带一样滚动,旧 KV 被丢弃。这保证了超长文本生成时显存占用依然稳定。

Q7. 关于滑动窗口注意力的信息传播,下列说法正确的是?

单选题 · hard

  • A.单层内信息可直接传播到任意远距离
  • B.远距离信息通过多层堆叠以“接力”方式间接传播← 正确答案
  • C.信息无法传播到窗口之外
  • D.只有全局 token 之间才能传播信息

答案:B。单层内窗口限制了直连范围,但多层堆叠让 token 经由中间节点间接获得远距离信息。这就像熟人网络里的“六度分隔”。信息确实能传到窗口外,普通 token 之间的信息也能流动,B 是正确的。

Q8. 全局注意力 token 的作用包括?

多选题 · hard

  • A.为窗口内普通 token 提供全局信息直达通道← 正确答案
  • B.数量很少,维持整体线性复杂度← 正确答案
  • C.取代滑动窗口成为主要注意力机制
  • D.让局部信息也能汇聚到全局视野← 正确答案

答案:ABD。全局 token 是“广播塔”,普通 token 在窗口内就能看到它,反过来全局 token 也能看到所有 token,实现了双向信息汇聚(A、D)。因为数量只占约 1/G 的比例,整体复杂度仍为 O(n)(B)。它只是补充,不取代滑动窗口主体(C 错)。

Q9. Mistral 中滑动窗口的默认大小是?

单选题 · easy

  • A.2048
  • B.4096← 正确答案
  • C.8192
  • D.16384

答案:B。Mistral-7B 设置的窗口大小为 4096,即每个 token 关注前后约 4096 个 token。这个大小是算力与效果权衡的结果,也是 Mistral 架构的重要超参数。

Q10. 关于滑动窗口注意力对比其他注意力方案,说法正确的有?

多选题 · extreme

  • A.与标准注意力相比,计算量从 O(n²) 降到 O(n)← 正确答案
  • B.与膨胀窗口稀疏注意力相比,实现更简单直接← 正确答案
  • C.远距离建模能力完全等同于全局注意力
  • D.窗口大小选择不影响最终建模效果

答案:AB。A 是核心优势;B 也是正确的——滑动窗口不需要复杂的膨胀率或随机连接设计,掩码更直观,工程上更容易实现。C 错误,SWA 的“间接传播”是有损的,在极端远距离场景下不如全局注意力。D 错误,窗口大小对效果影响显著,是必须调优的超参数。