想象一家藏在写字楼底商的大排档「星火小厨」,掌勺的老周没什么绝活,就是记性好。以前他炒菜有个习惯:每炒一道菜,都要先把全厨房扫一遍——后厨几个灶眼上的火候、冰箱里每块食材的位置、传菜口排队的单子,全看在眼里才敢下铲。传统大模型的注意力机制就是这个路子:处理一段话时,每个字都要和这段话里所有其他字两两“眉来眼去”一番。100 个字,要眉来眼去一万次;1 万字的长文档,就是一亿次。记性再好也扛不住。 直到某天老周悟了:炒回锅肉的时候,真正关键的信息全在眼前——左边的蒜苗、右边的豆瓣酱、面前的油锅。远处第八个灶头上蒸着的鱼,跟这道菜半毛钱关系没有。于是他改了规矩:只盯着自己面前两米长的灶台干活,远处的菜交给帮厨们相互传递。这套“只看眼前”的功夫,就是滑动窗口注意力(Sliding Window Attention,简称 SWA)。本文要讲的,就是老周的灶台哲学如何变成代码、跑进你的手机,让长文本推理又快又省电,还不丢手艺。
掌握 SWA 是端侧大模型优化的必修课:它决定了你能否在手机、平板这类资源受限设备上跑流畅的长文本对话。学会这一招,你就能在注意力计算这个最贵的环节上做出工程级的性价比取舍。
目录
可视化演示
动态演示滑动窗口注意力SWA的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
滑动窗口注意力SWA:滑动窗口 滑动窗口注意力SWA计算原理与 窗口大小选择与信息覆盖范围权衡 核心机制可视化 滑动窗口注意力SWA整体架构与关键组件
全注意力困境:为什么长文本会“算不动”
老周最早开档口时,规矩是“眼观六路”:每炒一道菜,非得把整个厨房扫一遍才安心。问题是,单子从 5 桌涨到 30 桌,他要扫的灶台、食材、单子跟着成倍涨。到最后,一晚上下来菜没炒几盘,人先瘫在灶台边上。全注意力机制就是这样的“眼观六路”:处理一段文本时,每个字(token)都要和整段话里所有其他字两两计算一个“相关度分数”,这个分数决定它应该从谁那里吸取信息。
这个过程在数学上看着优雅,代价却藏在计算量里。假设一段文本有 $n$ 个 token,每个 token 都要和其他 $n$ 个 token 打一次分,整个注意力表就是 n 行 n 列。当 $n$ 是 1000 时,要算 100 万个分数;当 $n$ 是 100 万时,就是一万亿次——平方级增长就是这么来的。端侧设备(手机、眼镜、车载芯片)内存和算力都小,长文本一到,别说推理,模型可能直接加载失败。
补充一个计算量公式:
老周后来明白,自己的记性再好也扛不住平方级增长的厨房巡视。于是,他把目光收回到面前两米——这就是下一节的故事。
- 序列长度 $n$ 连乘两次注意力表有 $n$ 行乘 $n$ 列,共 $n^2$ 个分数要算。
- 维度 $d$每算一个分数都要做 $d$ 维向量的点积。
- 瓶颈定性只要 $n$ 变大,$n^2$ 就让计算量爆炸式上涨——这就是老周“满堂跑”的体力上限。
滑动窗口原理:把视野收进两米灶台
老周的新规矩很简单:炒任何一道菜,只看面前两米范围内的东西。左手边备好的料、右手边的调味罐、正前方冒油的锅。远处的菜不是被扔掉了,而是他不再盯着看——那些菜由旁边的帮厨互相照应,需要时自然会传话过来。滑动窗口注意力把这个直觉搬进了 Transformer:每个 token 不再和全序列所有 token 算注意力,而是只和距离自己不超过 $w$ 个位置的邻居算。
这个“只看附近 $w$ 个位置”的约束,在实现上是一个掩码矩阵(Mask Matrix)。矩阵里的元素 $M_{ij}=1$ 表示第 $i$ 个 token 能看到第 $j$ 个 token,$M_{ij}=0$ 则表示它们之间不建立注意力连接。配合自回归任务时,还会叠加一个因果掩码,让每个位置只能看到自己左侧的 $w$ 个 token。这样整个注意力表从“全连接的稠密矩阵”变成了“只在窗口内连线的稀疏矩阵”。
滑动窗口注意力的计算量也随之变成线性:
老周的灶台哲学,本质上是把“全厨房巡视”换成了“局部精细化”:远处的信息不是不要了,而是通过一层层帮厨接力传过来。下一节我们看看,这个灶台到底留多长最合适。
- 每个 token 只看 $2w+1$ 个邻居打分表不再是 $n$ 行 $n$ 列,而是每行只有窗口内约 $2w$ 个非零位置。
- 总计算量是 $n$ 乘 $w$序列再长,每个位置的计算成本都是固定的 $O(wd)$,总和随 $n$ 线性增长。
- 对比全注意力从 $O(n^2)$ 降到 $O(n)$,这就是老周从“满堂跑”到“盯灶台”省下的体力。
窗口大小设定:备菜台到底留多长
老周在厨房里量来量去:备菜台太短,大盘菜摆不开,炒着炒着料没处放;备菜台太长,伸手够不着最远端的调料罐,还得绕着跑,反而耽误事。窗口大小 $w$ 就是模型的“备菜台长度”,它是 SWA 最重要的超参数,直接决定计算量、内存和模型表现三者的平衡。
工程实践里,$w$ 的常用范围在 128 到 512 个 token 之间——大约是半页到两页文本的长度。在端侧设备上,还要考虑内存和时延预算:$w$ 每翻一倍,注意力计算量和 KV 缓存也跟着翻倍。经验上,$w$ 常取序列长度的 1/8 到 1/16:如果模型要处理 4096 token 的长文本,窗口取 256 或 512 是常见的配置。更关键的是,窗口不能孤立地看,它必须和 Transformer 的堆叠层数配合,两个数字共同决定信息最远能传多远:
比如窗口 $w=256$、层数 $L=32$ 时,理论上感知野能覆盖 8192 个 token。老周选备菜台长度时,看的不是台面本身,而是“帮厨接力”能不能覆盖整条宴席线的距离。窗口太小、层数太少,远处的重要信息就真的传不到了;窗口太大,近处该精细处理的注意力又被稀释。按任务适配:做短文本分类可以开小窗,做长文档问答就得让 $L\times w$ 盖过文档里最远的关键依赖距离。
- 堆叠层数 $L$Transformer 有 $L$ 层,每一层都是一次“帮厨接力”,消息每经过一层就能往前多传一段。
- 窗口宽度 $w$每一层里,一个 token 最多能直接看到左右各 $w$ 个邻居。
- 感知野 $R$把 $L$ 和 $w$ 相乘,得到信息从一端传到另一端的最远距离——这就是“多层接力”的总路程。
精度差异分析:只看眼前会不会丢手艺
老周刚改规矩时也心虚:只盯着眼前的锅,万一远处某个灶台喊“该出锅了”他没听见怎么办?事实是,帮厨们一层层传话,大部分消息最终还是能到他耳朵里,只是慢一点、可能略有失真。SWA 和全注意力的精度差异,正是同一回事。
单层 SWA 的感知野只有 $w$,远距离的两个 token 之间没有直接连接,长距离依赖信息会被弱化——这是它和全注意力最本质的精度差异。举例来说,文档开头提到“老王”,三千字之后才出现“他”,在单层 SWA 里这两个位置互不可见,指代关系只能靠层与层之间的接力传递。但 SWA 也有全注意力没有的好处:它天然滤噪。全注意力会让每个 token 和全文中所有无关内容都算一遍相似度,那些无关位置的注意力权重虽然小,却会稀释真正重要的信号;SWA 把视野收窄后,注意力更集中,局部结构建模反而更扎实。
精度损失可以用工程手段弥补。堆叠足够多的层,感知野 $L\times w$ 就能覆盖多数任务需要的依赖距离;配合相对位置编码(如 RoPE、ALiBi),窗口内每个 token 的先后顺序信息一点不丢。开源社区已有验证:Mistral 7B 这类模型采用滑动窗口注意力,在很多长文本任务上表现与全注意力相当。代价是它通常需要更充分的训练或微调,来学习“如何高效接力传话”。老周试了一个月后得出结论:手艺没丢,反而因为专注,近处的火候掌握得更好了。
长文本处理效能:流水席是怎么扛下来的
星火小厨接了笔大单:1000 道菜的流水席,菜要一道道上,客人随到随吃。老周发现,只要守着面前的灶台,来多少道菜他都不慌——因为每道菜的备料都在手边,不用满厨房现翻。SWA 在长文本推理中的效能,就是这个逻辑:瓶颈不再随“总文本长度”增长,而是被窗口封了顶。
推理时分两个阶段。预填充阶段(Prefill)要处理整段输入文本,SWA 已经能把复杂度从 $O(n^2)$ 降到 $O(nw)$;更关键的是增量解码阶段(Decode)——模型逐字生成输出时,每生成一个新 token,只需要和窗口内的 $w$ 个 key 计算注意力,而不必回头扫全序列。$n$ 再大,这一步的成本都恒定在 $O(w)$。这直接决定了 KV 缓存的大小:
老周的流水席就是这么扛下来的:订单越来越长,但他的手边永远只有两米灶台的活。只要传送带上的菜不断,他就能一直炒下去——这就是线性复杂度带来的“不吃力”。
- 全注意力缓存随 $n$ 线性增长文本越长,K 和 V 的缓存越大,长文本推理的内存开销一路走高。
- SWA 缓存与 $n$ 无关只取决于窗口 $w$,文档从 1 万字写到 10 万字,缓存占用基本不变。
- 流式处理成为可能窗口像传送带一样向前滚,旧位置缓存淘汰,新 token 缓存写入,内存水位恒定,长文本就能在端侧一路流畅生成下去。
端侧实现要点:小厨房的摆灶智慧
星火小厨后厨只有六平米,摆下这口灶台、那张备菜台,基本就满了。端侧设备(手机、平板、车载芯片)就是这么个六平米小厨房:内存小、算力有限、还怕发热。SWA 要在端侧真正落地,光有数学上的线性复杂度还不够,工程实现有四个要点。
第一是内存带宽。端侧推理时,从内存里读一次 K/V 缓存往往比做一次浮点运算还贵。SWA 的最大价值不只是少算,更是少读:窗口缩小后,K/V 缓存能放进片上高速缓存(SRAM),避免反复访问廉价但慢的 DRAM。第二是算子融合。经典的实现里,mask 和 softmax 是分开的两个步骤,中间要把分数矩阵写回内存再读出来;融合成单个算子,让 mask 在 softmax 计算过程中就地生效,能省掉一整轮内存往返。第三是缓存滚动。推理超过窗口长度后,超出窗口的旧位置不再需要,用环形缓冲区覆盖旧缓存即可,避免每次重新分配内存。第四是硬件适配。端侧芯片常提供稀疏计算库或低精度指令(如 INT8),把窗口内的稀疏注意力包装成稀疏矩阵运算,配合量化压缩,进一步压榨出带宽余量。
这四个要点,对应到老周的小厨房里就是:灶眼要小、动线要短、调料就手、锅铲顺手。SWA 的工程价值最终兑现为三件事——更少的访存、更小的缓存、更低的时延。做好了,手机上的长文本对话才能每秒吐十几个字,还不烫手。
适用场景评估:这招适合什么样的席面
不是所有宴席都适合两米小灶台。老周总结:接大排档的流水散客,小灶台又快又稳;但要是接国宴——每道菜都得和全厨房所有菜精确对表、摆盘讲究全局对称——小灶台就露怯了。SWA 的适用场景,同样有一条清晰的分界线。
最适合的是资源受限设备上的长文本任务。端侧长对话:手机上的聊天助手要记住上下文,SWA 让 KV 缓存不随对话长度膨胀;流式摘要与会议纪要:边生成边滚动窗口,文档再长内存水位恒定;实时翻译:逐词产出、延迟敏感,窗口内计算正好匹配芯片的流水线。此外,凡是“可以微调”的场景,SWA 的精度缺口都能通过训练弥补,落地更稳。不适合的是必须做全局精确建模的任务,比如全文重排、跨页关系极强的深度文档推理,且模型不允许微调——这时 SWA 的接力传话会丢细节,该用全注意力还是得用。
一句话总结老周的选型智慧:对话、摘要、翻译这类“顺着读”的活,上 SWA;需要“跳着读、来回比”的活,请外援。 理解了这条分界线,你在实际项目里就能判断:这个长文本需求,该不该把注意力换成滑动窗口。
AI 应用场景
场景一:手机端长对话助手
阶段:推理部署(Inference Deployment)
解决的问题:端侧对话助手需要记住越来越长的聊天历史,传统全注意力下 KV 缓存随上下文线性膨胀,对话超过几十轮后内存溢出、生成延迟飙升。SWA 将缓存与历史长度解耦,只保留窗口内的关键状态,让助手在手机本地就能持续流畅对话。
具体案例:某厂商在旗舰手机部署 7B 级聊天模型,输入侧采用 SWA(窗口 512)。实测 20 轮长对话场景下,显存占用从 2.1GB 降至 0.6GB,每 token 生成延迟降低约 40%,且对话连贯性在主观评测中与云端全注意力版本差异不显著。
场景二:流式长文档摘要
阶段:模型推理(Model Inference)
解决的问题:会议纪要、论文、合同等长文档动辄上万 token,传统方案只能截断前几千字,摘要丢失关键信息。SWA 让模型可以“开着窗口一路读下去”,配合流式输出,文档读到哪摘要写到哪。
具体案例:一个文档问答应用将单篇 2 万字合同输入模型,采用 SWA 窗口 256、32 层堆叠,感知野覆盖 8192 token 内的关键条款关联。摘要生成过程内存峰值稳定,后端单卡吞吐比全注意力提升约 3 倍。
场景三:可穿戴设备的实时翻译
阶段:端侧推理服务(On-device Inference)
解决的问题:翻译耳机和智能眼镜要求低延迟、低功耗,全注意力的平方级计算在微功耗芯片上无法承受。SWA 把每次注意力计算限制在极短窗口内,配合 INT8 量化,把实时翻译的功耗压到可穿戴设备的电池预算内。
具体案例:某翻译耳机在自研低功耗芯片上部署 1.3B 翻译模型,SWA 窗口 128,端到端翻译延迟从 1.2 秒降至 0.5 秒,整机功耗下降 35%,连续翻译续航从 2 小时延长到 3.5 小时。
Python 演示
import numpy as np def scaled_dot_product(q, k, v, mask): dim = q.shape[-1] scores = np.matmul(q, k.transpose(0, 2, 1)) / np.sqrt(dim) scores = np.where(mask == 1, scores, -1e9) weights = np.exp(scores - np.max(scores, axis=-1, keepdims=True)) weights = weights / np.sum(weights, axis=-1, keepdims=True) return np.matmul(weights, v), weights def sliding_mask(seq_len, window): i = np.arange(seq_len).reshape(-1, 1) j = np.arange(seq_len).reshape(1, -1) return (np.abs(i - j) <= window).astype(np.float32) def full_mask(seq_len): return np.ones((seq_len, seq_len), dtype=np.float32) def attention_forward(q, k, v, window=None): seq_len = q.shape[1] mask = sliding_mask(seq_len, window) if window else full_mask(seq_len) out, weights = scaled_dot_product(q, k, v, mask) visible = mask.mean() return out, weights, visible def main(): np.random.seed(7) batch, heads, seq_len, dim = 2, 4, 64, 32 q = np.random.randn(batch, heads, seq_len, dim).astype(np.float32) k = np.random.randn(batch, heads, seq_len, dim).astype(np.float32) v = np.random.randn(batch, heads, seq_len, dim).astype(np.float32) full_out, _, _ = attention_forward(q, k, v) swa_out, swa_w, visible = attention_forward(q, k, v, window=8) diff = np.abs(full_out - swa_out).mean() print("window=8 visibility ratio: {:.3f}".format(visible)) print("mean output diff vs full: {:.4f}".format(diff)) print("attention weights shape:", swa_w.shape) if __name__ == "__main__": main()
scores = np.matmul(q, k.transpose(0, 2, 1)) / np.sqrt(dim)这一步实现 $QK^\top$ 打分并除以 $\sqrt{d}$ 缩放,是注意力公式里最核心的矩阵乘法。scores = np.where(mask == 1, scores, -1e9)用一个很小的数模拟 $-\infty$,把窗口外分数压到负无穷,Softmax 后权重归零。weights = weights / np.sum(weights, axis=-1, keepdims=True)对每一行做归一化,得到总和为 1 的注意力权重。return (np.abs(i - j) <= window).astype(np.float32)生成滑动窗口掩码:距离不超过 window 的位置记为 1,其余为 0。mask = sliding_mask(seq_len, window) if window else full_mask(seq_len)有窗口参数用 SWA 掩码,否则退回全注意力掩码。full_out, _, _ = attention_forward(q, k, v)跑一遍全注意力,作为精度对比的基准。swa_out, swa_w, visible = attention_forward(q, k, v, window=8)跑一遍窗口为 8 的 SWA,并拿到可见度比例。diff = np.abs(full_out - swa_out).mean()计算两种注意力输出的平均绝对差,量化精度差距。
常见误区
误区滑动窗口注意力就是把前面所有 token 丢掉,只留下最后 w 个 token 当上下文,类似一个滚动截断。
正解SWA 并没有丢弃任何历史 token,所有位置都参与计算,只是每个位置的“视野”被限制在附近 w 个邻居。远处的信息通过多层堆叠接力传过来。打个比方:老周不会把远处的菜扔掉,他只是不盯着看,需要时帮厨会传话过来。丢掉历史和“不看远处”是两回事。
为何常见:因为人们容易把“注意力窗口”理解成一个裁剪工具,而忽略了它本质是注意力连接上的稀疏约束。
误区窗口扩大能看见更多上下文,模型效果一定更好,那就把窗口设到最大,反正有硬件升级空间。
正解窗口过大会带来两个问题:一是计算量和 KV 缓存随 w 线性上升,端侧收益被吃掉;二是窗口内混入大量无关信息,注意力权重被稀释,局部建模质量反而下降。备菜台太长,老周够调料得跑着去,炒菜节奏全乱了。窗口要配合层数、任务依赖距离和设备预算综合设定。
为何常见:因为直观上“看得多 = 知道得多”,忽略了注意力是有限预算下的资源分配问题。
误区既然远处的 token 互相看不见,那么长距离依赖肯定建模不了,SWA 模型就是“近视眼”,精度必然大幅下降。
正解多层堆叠后感知野是 $L\times w$,配合相对位置编码和充分训练,SWA 在多数长文本任务上能逼近全注意力。Mistral 7B 等模型已经证明了这一点。它甚至还有滤噪优势。老周不看远处,但帮厨层层传话,该到的消息基本都能到,只是传得慢一点。需要全局精确建模且无法微调的任务,精度差距才真正显著。
为何常见:因为人们用单层视角理解多层网络,忽略了 Transformer 的层级接力会扩展有效感受野。
误区窗口这么小,顺序信息反正都在局部,加上位置编码太麻烦,干脆去掉,模型也能跑。
正解位置编码恰恰是 SWA 的命根子。窗口内的 token 也分先后——“猫追老鼠”和“老鼠追猫”词序不同、意思完全相反。相对位置编码(RoPE、ALiBi)是 SWA 的标准搭档,它告诉模型窗口内每个 token 的相对位置,是局部建模的顺序感来源。备菜台上葱花在左、姜在右,顺序搞反了,菜就炒砸了。
为何常见:因为窗口看起来“短”,让人误以为局部顺序不重要,实际上局部顺序比全局顺序更精细、更需要编码。
误区w 是模型结构里的固定超参数,一旦训练好就永远不能改,部署时想调也没办法。
正解推理时窗口可以灵活处理:解码阶段 KV 缓存按窗口滚动淘汰旧位置,相当于一个可滑动的传送带;不同层、不同注意力头也可以设置不同窗口大小,形成“宽窄结合”的多尺度视野。老周的灶台长度不变,但他可以决定自己朝哪个方向看、看到什么密度。
为何常见:因为训练和推理的概念混淆——训练时的窗口决定模型能力上限,推理时的窗口滚动决定缓存效率,两者并不冲突。
面试题
Q1. 滑动窗口注意力 SWA 的时间复杂度是多少?
- A.O(n²d) 全注意力
- B.O(nwd) 窗口线性← 正确答案
- C.O(w²d) 窗口平方
- D.O(nw) 序列窗口
答案:B。SWA 中每个 token 只与窗口内约 2w 个邻居计算注意力,打分矩阵是 n 行、每行约 2w 个非零元素,总计算量为 O(nwd)。选项 A 是全注意力的复杂度;C 忽略了序列长度 n;D 漏掉了维度 d 的贡献。
Q2. 滑动窗口掩码矩阵中 M_ij=1 代表什么?
- A.第 i 个词能看到第 j 个词← 正确答案
- B.第 j 个词能看到第 i 个词
- C.第 i 个词被窗口丢弃不用
- D.第 j 个词被全局禁止注意
答案:A。M_ij 是第 i 行第 j 列的元素,表示 query 所在位置 i 对 key 所在位置 j 是否可见。M_ij=1 意味着 i 能向 j 发起注意力连接。B 把行列语义搞反了;C、D 描述的“丢弃/禁止”对应的是掩码为 0 的情况。
Q3. 堆叠 L 层、窗口 w 的 SWA,信息最远能传播约多远?
- A.一个窗口宽度 w 而已
- B.层数与窗口的乘积← 正确答案
- C.序列长度 n 的平方
- D.仅相邻的单 token 间
答案:B。每层窗口传递 w 的距离,堆叠 L 层后感知野约等于 L×w——第一层看到附近 w 个邻居,第二层再经由这些邻居看到更远处,层层接力。A 忽略了层数;C 是平方级误区;D 把窗口理解成了单 token 连接。
Q4. 端侧部署 SWA 时最该优先优化的开销是什么?
- A.内存带宽与访存开销← 正确答案
- B.GPU 显存总容量大小
- C.预训练数据规模大小
- D.激活函数的选择种类
答案:A。端侧推理的瓶颈通常是内存带宽——从内存读 K/V 缓存比算浮点乘法更贵。SWA 的价值就是用窗口减小缓存,使其能放进片上 SRAM,减少访存。GPU 显存容量在端侧不是核心问题;数据规模和激活函数与部署优化无关。
Q5. SWA 相比全注意力带来的收益有哪些?
- A.计算量由平方降线性← 正确答案
- B.缓存仅与窗口相关← 正确答案
- C.长距离依赖完全消失
- D.端侧内存随之降低← 正确答案
答案:ABD。SWA 把复杂度从 O(n²) 降到 O(nw),KV 缓存从 bhdn 变为 bhdw,端侧内存占用随之大幅下降,A、B、D 都对。但长距离依赖并没有消失,而是通过多层堆叠接力传递,C 把“弱化”说成“完全消失”,错了。
Q6. 为什么“窗口越大越好”这个说法不成立?
- A.窗口大则失活位置变少
- B.窗口大开销上升且易掺噪← 正确答案
- C.窗口大使模型参数爆炸
- D.窗口大会丢弃历史信息
答案:B。窗口变大,计算量和 KV 缓存线性上升,而且窗口内混入大量无关 token 会稀释注意力权重,局部建模质量下降,B 正确。A 的“失活位置变少”不是问题而是事实;C 中窗口不影响参数数量;D 恰好说反,窗口大意味着看得更多。
Q7. 哪些手段可以弥补 SWA 相对全注意力的精度差距?
- A.堆叠更多 Transformer 层← 正确答案
- B.使用 RoPE 相对位置编码← 正确答案
- C.增大窗口内上下文长度← 正确答案
- D.完全取消位置编码结构
答案:ABC。堆叠更多层能扩展感知野,RoPE 提供窗口内顺序信息,增大窗口直接扩大视野,A、B、C 都能缩小精度差距。位置编码是 Transformer 理解语序的根基,D 取消位置编码会严重损害模型理解能力,是错误选项。
Q8. 流式解码时滑动窗口的 KV 缓存通常如何更新?
- A.保留全部历史再重新计算
- B.丢弃已超出窗口的位置← 正确答案
- C.每个时刻重新加载模型
- D.把缓存复制到 GPU 显存
答案:B。流式生成时新 token 的 KV 写入缓存,超出窗口的旧位置被淘汰或覆盖,通常用环形缓冲区实现,内存水位恒定,B 正确。A 保留全部历史就失去了 SWA 的意义;C 是错误的重启方案;D 与窗口更新机制无关。
Q9. SWA 掩码中用 -∞ 填充被屏蔽位置的作用是什么?
- A.让模型输出的分数变成负无穷
- B.使被掩码位置的权重归零← 正确答案
- C.把梯度放大到正无穷
- D.缩短模型训练收敛时间
答案:B。Softmax 对 -∞ 位置的指数趋近于 0,归一化后这些位置的注意力权重就变成 0,相当于完全不参与信息聚合。A 混淆了中间分数与最终输出;C、D 与掩码的数学作用无关。
Q10. 哪些场景更适合采用滑动窗口注意力?
- A.手机端长对话摘要生成← 正确答案
- B.资源受限的流式翻译← 正确答案
- C.千万元素全局拓扑分析
- D.必须远程精准建模的任务
答案:AB。端侧长对话和流式翻译都是“顺着读”的生成式任务,SWA 的线性复杂度和恒定缓存能明显降压,A、B 合适。全局拓扑分析需要反复比对所有元素的两两关系,C 不适合;必须远程精准建模且不接受微调的任务,SWA 的接力传播会丢细节,D 不适合。