想象你是一座图书馆的管理员。馆里藏书不多时,你轻松地给每本书制作一张名片,分发给所有其他书——它们两两认识,交流顺畅。可是当藏书从几十本涨到几百本、几千本时,问题来了:每本新书进门,都要和馆内所有其他书交换名片。第100本要换99次,第1000本要换999次,所有书之间的名片往来总量,竟随着藏书量激增得越来越夸张——这就是「平方级增长」的威力。Transformer 的自注意力机制,恰恰就是这样一个“全馆名片交换系统”:每个词(书)都要和序列中所有其他词(书)计算关联度(交换名片)。序列一长,计算量和内存就像失控的名片堆一样爆炸。这就是我们今天要解剖的 O(n²) 瓶颈。
理解 O(n²) 的根源与优化路径,是你在长序列模型时代做架构选型、调优推理性能的必修课——也是面试官最爱考察的“分寸感”所在。
可视化演示
展示自注意力O(n²)计算量随序列长度爆炸增长、显存瓶颈分析与稀疏化线性化低秩近似三种突破路径,切换模式掌握复杂度优化核心。
本节配有交互动效(进入视口后自动加载,约 3KB)。
O(n²)复杂度瓶颈分析 Q×K^T矩阵乘法产生n×n注意力矩阵,计算量O(n²d)序列翻倍计算量4倍增长 序列从512增至8192计算量增长256倍,O(n²)成为长序列处理的核心瓶颈 Q(n×d) × K^T(d×n) = attn(n×n) -> O(n²d) 标准自注意力复杂度随序列长度平方增长
复杂度本质
回到我们的图书馆。管理员最初设计的“全馆名片交换”确实优雅:每本书都能精准知道其他任何一本的位置和内容概要。但管理员很快发现了规律——藏书量 n 从 100 涨到 200 时,名片交换总量不是翻倍,而是从 4950 次涨到 19900 次,整整翻了 4 倍!这就是数学家口中的“平方级增长”:总量约等于 n²/2。在自注意力机制里,这个“交换名片”的过程发生在每个词元(Token)之间,词元总数 n 就是藏书量。
自注意力之所以强大,是因为它让任意两个位置直接建立依赖,捕获长距离关系。但也恰恰是这份“事无巨细的全连接”,让它的时间和空间开销都随 n 的平方增长。具体来说,自注意力的核心计算可以写作:
时间上,矩阵乘法和 softmax 都绕不开这 n×n 的表格;空间上,这张表格本身就得存在内存里。因此我们说,自注意力的时间复杂度和空间复杂度同量级,都是 O(n²)。当 n 从 512 涨到 4096,这张表格的规模直接膨胀 64 倍——再厚的钱包也经不起这样花。理解了“全连接”这个根,后面的所有优化都是在回答同一个问题:能不能不跟所有人交换名片?
- Q 与 K 的点积$QK^\top$ 生成一个 $n \times n$ 的“关联得分表”,每本“书”和其他所有“书”的关系都被记录在此,这是平方级复杂度的源头。
- 缩放因子$\frac{1}{\sqrt{d_k}}$ 把得分压回合理区间,防止点积结果过大导致 softmax 进入饱和区——就像控制名片交换的场面,避免所有人同时开口导致混乱。
- Softmax 归一化$\text{softmax}(\cdot)$ 对每一行做归一,把得分变成“加权系数”,让每本书的总注意力恰好为 1,等于在说“我的注意力预算是 100%,按亲疏分配”。
- 与 V 加权求和$\times V$ 用归一化权重去加权所有书的内容,最终每个词元带着全局混合的信息离开。
时间复杂度推导
图书馆管理员的日常工作可以拆成三步:先派发问卷(每本书向全馆询问“你和我有多相关”),再筛选重点书目(把相关度不高的礼貌性忽略),最后把重点书的内容摘抄回来综合。自注意力的一次计算,也恰好是这三个流程的矩阵流水线。
第一步是 QK^T 矩阵乘法。Q 的每一行是一个词元的查询向量,K 的每一行是键向量。一个 n×d 的矩阵乘以一个 d×n 的矩阵,结果是一个 n×n 的得分矩阵。这个乘法的操作数是 2n²d 次浮点运算。当序列长度 n 增长时,这一项随 n 的平方膨胀。第二步是 Softmax 归一化,它对得分矩阵的每一行 $n$ 个元素计算指数和归一,$n$ 行合计操作数是 O(n²)。第三步是 注意力加权求和,把归一化后的 n×n 权重矩阵与 V 矩阵(n×d)相乘,同样是 O(n²·d)。三项相加:
这解释了为什么 GPT 系列早期只敢把上下文窗口设在 2048 或 4096——一旦序列翻倍,时间成本直接翻四倍。试想:图书馆从 1000 本书涨到 2000 本,管理员的名片工作量不是翻倍而是四倍,他当然要限制“馆藏规模”。这也是为什么你在实际训练大模型时,会明显感觉到:序列长度加一点,训练时间就“坐火箭”。理解了这三步,你就拿到了亲手估算任意 Transformer 前向耗时的基础:先数 n,再乘 d,其他都是小头。
- QK 转置相乘$O(n^2 \cdot d_k)$,n 个查询对 n 个键逐一打分,生成完整的“亲疏关系表”。
- 缩放与 Softmax$O(n^2)$,对关系表的每个元素做指数运算并逐行归一,把分数变成概率权重。
- 权重与 V 相乘$O(n^2 \cdot d_v)$,用权重表把 n 个值向量加权混合,产出每个词元的输出。
- 三阶段合并$O(n^2 \cdot d)$,$d$ 是模型维度常量,最终瓶颈锁定在 $n^2$。
空间复杂度分析
图书馆里除了交换名片要花时间,还有第二个噩梦:登记簿。管理员需要一张巨大的表格,记录每两本书之间的亲疏关系得分——行列都是书,一页纸根本画不下。更麻烦的是,softmax 需要先算出整张表的完整得分,才能逐行归一化,所以这张 n×n 的“得分矩阵”必须完整驻留在内存里,不能边算边扔。这就是自注意力的空间复杂度 O(n²) 的由来。
我们来算一笔账。假设序列长度 n = 4096,模型用 FP16(每个数占 2 字节)存储得分矩阵,那么仅这一张表就占用 $4096^2 \times 2 = 32$ MB 显存。听起来不多?但注意,Transformer 有十几层、多个注意力头,每层都要维护自己的得分矩阵,还要算上反向传播时保存的中间梯度,实际开销会放大几十倍。当 n 涨到 32768,一张表就变成 2 GB,直接撑爆单卡显存:
这也是为什么部署长文本模型时,工程师宁可做量化、做算子融合,也要省出这口气——因为“登记簿”比“名片”本身更占地方。值得一提的是,推理阶段的 KV 缓存(缓存历史 K 和 V 矩阵)开销是 O(n·d) 而不是 O(n²),这是因为推理时只需把新词元与缓存中的 K、V 做注意力,不需要重新计算历史词元两两之间的得分。但训练阶段没有这个便利,整张 n×n 表格躲无可躲。所以严格说,训练是 O(n²) 的重灾区,推理的瓶颈则更多落在 KV 缓存的线性增长上。
- 得分矩阵驻留$n^2 \times \text{bytes}$,每对词元之间的注意力分数都要占一个存储单元,这是显存爆炸的主犯。
- Q、K、V 本身$n \cdot d \times \text{bytes}$,三个矩阵各一份,随 n 线性增长,相对温和。
- 反向传播翻倍训练时还需要保存中间激活供梯度回传,内存开销再乘一个常数倍。
- 合成总内存$O(n^2) + O(n \cdot d)$,当序列很长时第一项主导,空间复杂度近似 O(n²)。
长序列挑战
当图书馆的藏书量突破某个临界点,管理员发现整个系统开始“卡壳”:名片交换的耗时变得不可接受,登记簿占满了所有柜子,读者来借书要等上半天。这就是长序列场景下标准自注意力遇到的真实困境。业界把这个问题概括为“上下文窗口受限”——不是模型不想看更长的历史,而是硬件内存和计算预算不允许。
具体到实践层面,三个问题最为突出。第一,上下文窗口受限:GPT-2 的窗口是 1024,GPT-3 是 2048,即便 GPT-4 达到了 128K,也远小于人类阅读一本书的体量——限制它的不是模型架构,而是 O(n²) 的硬件账单。第二,显存占用爆炸:训练时得分矩阵随 n² 增长,序列从 32K 翻到 64K,显存需求翻四倍,往往直接触发 OOM(显存溢出),让训练任务崩溃。第三,推理吞吐下降:虽然推理阶段 KV 缓存是 O(n·d),但每生成一个新词元,都要和全部历史做注意力计算,随着生成变长,单次解码延迟线性上升,系统吞吐骤降。
用一个公式来概括序列长度对资源账单的影响。设序列长度增加 k 倍,则:
正因如此,处理一本书级别的长文本(约 10 万词元)时,标准 Transformer 的显存需求会达到 TB 级别,远超任何单卡容量。这也是为什么长文档问答、多轮长对话、代码仓库理解这类真实应用,必须依赖后面几节要讲的优化手段。图书馆管理员痛定思痛:与其让每本书都认识所有书,不如设计更聪明的信息流通方案。
- 计算量随 k² 增长$\text{计算量} \propto k^2$,n 变成 k·n,矩阵乘法操作数 (k·n)² = k²n²,陡增 k² 倍。
- 显存随 k² 增长$\text{显存占用} \propto k^2$,得分矩阵同样放大 k² 倍,内存需求陡增。
稀疏化方向
管理员想出的第一套改革方案很务实:并不是所有书都需要互相认识。一个读者在查某一章的细节时,最相关的往往是前后相邻的几页;而真正需要“全馆广播”的,只有少数几本核心参考书。顺着这个直觉,研究者提出了稀疏注意力——把全连接的名片交换网,裁剪成一张稀疏但够用的“社交网络”。
最常见的稀疏化模式是局部窗口注意力(Window Attention):规定每本书只与前后 w 本书交换名片,其余一律不联系。这样一来,每本书的名片交换次数从 n-1 次降到 2w 次,总交换量从 O(n²) 降到 O(n·w)。如果 w 是固定常数(如 256),复杂度就变成了线性的 O(n)。代价呢?远处的书失去了直接联系——但这恰恰是局部窗口想避免的:远处的信息可以通过一层层窗口的接力传递,就像消息通过朋友的朋友传到远方。实际应用中,为了弥补长距离信息的流失,还会放置少量“全局锚点”:
稀疏化的哲学是“用结构换速度”——主动放弃一部分理论上可能的连接,换取计算和内存的大幅缩减。它特别适合文本、图像这类局部性很强的数据:相邻像素、相邻词元之间的相关性本来就最强。但在某些需要深层长程推理的任务上,稀疏连接可能让信息流动变得迂回,这是工程师选型时必须权衡的。图书馆管理员点点头:与其让每本书都握着全馆名片,不如给每本书发一张“附近街区地图”外加几本核心手册——够用,且便宜得多。
- 窗口内交互$O(n \cdot w)$,每个词元只与自己邻近的 w 个词元计算注意力,w 是固定窗口大小。
- 全局锚点交互$O(n \cdot g)$,每个词元额外与 g 个精心挑选的全局词元(如句首、句尾、特殊标记)交互,保证远距离信息的可达性。
- 条件约束$w \ll n,\ g \ll n$,只要窗口和锚点数量远小于序列长度,整体复杂度就被压到线性。
线性注意力
图书馆管理员看着星型结构的“索引卡方案”陷入了沉思:如果所有书都把信息汇总到一张总索引卡上,新书来了只需和索引卡交换一次名片,总数就是 O(n),而不是 O(n²)。这就是线性注意力(Linear Attention)的核心直觉——把“两两交互”的矩阵乘法,通过数学技巧改写成“先聚合、再分发”的形式。
技巧的关键在于核函数特征映射。标准注意力里的 softmax 分数本质上是一个核函数,它把 Q 和 K 映射到高维空间并求内积。线性注意力用一个新的映射函数 φ(x) 来近似这个核,使得注意力权重可以拆解成 φ(Q) 与 φ(K) 的乘积。于是矩阵乘法的结合律给了我们一个惊喜:原来必须“Q 先乘 K 再乘 V”的顺序,可以调整为“K 先乘 V,再让 Q 去乘结果”:
更妙的是,这个“先聚合后查询”的形式天然契合递推:由于每一时刻的输出只依赖一个固定大小的状态矩阵,线性注意力可以被写成 RNN 式的递推形式——每读入一个新词元,更新一次状态,状态大小恒定,从原理上支持无限长的上下文。当然,天下没有免费的午餐:核近似带来信息损失,实验表明线性注意力在需要精确局部匹配的任务上(如复制、计数)弱于标准注意力。但图书馆管理员的算盘打得响:如果我用 95% 的精度换来“无限藏书量”,对很多真实场景来说,这笔交易太划算了。
- 特征映射$\phi(Q),\ \phi(K)$,把查询和键映射到新的特征空间,使点积能近似 softmax 的相似度语义——这是“把社交关系浓缩成可计算的向量”。
- 先聚合 K 和 V$\phi(K)^\top V$,先将所有键与值做矩阵乘法,得到一个 $d \times d$ 的小矩阵,这一步只与维度 d 有关,不再出现 n×n 的大表。
- 再让 Q 去取$\phi(Q)(\cdot)$,每个查询向量与这个小矩阵相乘,得到最终输出,同样只有 O(d²) 的运算。
- 总复杂度$O(n \cdot d^2)$,n 是序列长度,d 是固定维度——复杂度从关于 n 的平方变成关于 n 的线性!
低秩与未来
管理员的最后一张底牌来自一个更深刻的观察:那张 n×n 的得分矩阵,真的是“满编”的吗?统计发现,经过 softmax 归一化后,注意力得分往往集中在一小部分关键词元上,大部分分数趋近于零——矩阵的有效信息其实集中在一个低维子空间里。就像图书馆里真正被反复借阅的书只占一小部分,厚厚的书单里大部分条目无人问津。这就是低秩近似的出发点。
数学上,若 n×n 的得分矩阵 P 的秩远小于 n,则存在两个瘦长矩阵的乘积来逼近它:P ≈ A·B,其中 A 是 n×r,B 是 r×n,r 是远小于 n 的“有效秩”(例如 64 或 128)。这样一来,计算量就从 O(n²·d) 降为构建 A 和 B 的代价加上一次 O(n·r·d) 的乘法:
把视野放回全景,今天的主流高效注意力方案几乎都是上述思路的组合拳:稀疏化(Sparse)、线性化(Linear)、低秩化(Low-rank),以及它们的混合体。比如 Longformer 走稀疏窗口路线,Linear Transformer 走核函数路线,Performer 用随机特征映射做低秩近似,最新的混合架构(如 Jamba、Mamba-2)则在同一模型里同时部署注意力层和线性层,各取所长。图书馆管理员的最终方案也逐渐成型:要快速查身边的书就用窗口注意力,要永久记住核心馆藏就用线性状态,要偶尔做深度检索就留几个全局锚点——没有万能药,只有按场景配比的工程智慧。
- 低秩分解$P \approx A_{n \times r} B_{r \times n}$,把满矩阵拆成两个小矩阵的乘积,r 是远小于 n 的有效秩。
- 近似误差可容忍$r \ll n$,只要真实矩阵的秩集中在低维子空间,近似带来的精度损失就可控。
- 计算复杂度$O(n \cdot r \cdot d)$,n 是序列长度,r 和 d 都是常数,由此把平方级压到线性。
AI 应用场景
场景一:长文档智能问答系统的架构选型
阶段:模型选型与资源评估
解决的问题:传统方案用标准 Transformer 处理 10 万字合同文本时,自注意力得分矩阵高达 10000×10000,单卡 80GB 显存直接溢出。工程师需要评估“序列长度 vs 显存预算”的账本,选择能在预算内跑起来的注意力变体。
具体案例:某法律科技公司构建合同审查问答系统,输入为 8 万字长合同。工程师先用本文的复杂度公式估算:n=80000 时标准注意力仅得分矩阵就需要约 12.8GB(FP16),算上多层和梯度直接超限。最终改用 Longformer 的滑动窗口 + 全局锚点方案(w=512),显存骤降至原来的 1/8,在单张 A100 上完成微调,回答精度仅损失 2%。
场景二:流式语音识别的实时解码
阶段:推理优化与延迟控制
解决的问题:语音识别要求每帧音频到达后立即输出文字,延迟必须控制在几百毫秒内。标准注意力每来一帧都要和全部历史重新计算全局两两交互,延迟随音频时长线性恶化,对话场景无法接受。
具体案例:某会议转写产品使用线性注意力(Linear Transformer)做声学编码器。系统维护一个固定大小的状态矩阵,每来 40ms 音频帧就更新一次状态并即时输出增量文本。实测 2 小时会议转写延迟恒定在 200ms,显存占用不再随时间增长,而旧方案在 10 分钟处就开始明显卡顿。
场景三:大模型推理服务的 KV 缓存优化
阶段:服务部署与吞吐优化
解决的问题:多轮对话中每生成一个词元都要读取全部历史的 KV 缓存,缓存占用 O(n·d) 随对话轮次线性上涨。面对 8K 上下文的并发服务,KV 缓存能占满显存的一半以上,压榨了批处理(batch)的并发度。
具体案例:某 SaaS 公司部署 LLM 聊天机器人,分析后发现 KV 缓存是显存大户。工程师引入 KV 量化(FP16→INT8)和 PagedAttention(类似操作系统的分页管理),让缓存占用减半且支持动态分配,单卡并发度提升 1.8 倍,单位请求成本下降 40℅。
Python 演示
import numpy as np def elu_plus_one(x, alpha=1.0): return np.where(x > 0, x, alpha * (np.exp(x) - 1)) + 1 def standard_attention(Q, K, V): scores = Q @ K.T / np.sqrt(K.shape[-1]) weights = np.exp(scores - scores.max(axis=-1, keepdims=True)) weights /= weights.sum(axis=-1, keepdims=True) return weights @ V def linear_attention(Q, K, V): phi_q = elu_plus_one(Q) phi_k = elu_plus_one(K) kv = phi_k.T @ V z = phi_k.sum(axis=0) out = phi_q @ kv norm = phi_q @ z return out / norm[:, None] def main(): n, d = 256, 32 rng = np.random.default_rng(42) Q = rng.normal(size=(n, d)) K = rng.normal(size=(n, d)) V = rng.normal(size=(n, d)) out_std = standard_attention(Q, K, V) out_lin = linear_attention(Q, K, V) rel_err = (np.linalg.norm(out_std - out_lin, 'fro') / np.linalg.norm(out_std, 'fro')) mem_std = n * n * 4 / 1024 / 1024 print(f"序列长度 n = {n}, 维度 d = {d}") print(f"线性注意力相对误差: {rel_err:.4f}") print(f"标准注意力得分矩阵内存: {mem_std:.2f} MB") print("线性注意力不构建得分矩阵:内存为 0 MB") if __name__ == "__main__": main()
scores = Q @ K.T / np.sqrt(K.shape[-1])生成 n×n 得分矩阵并缩放,这一步正是 O(n²) 的源头,内存大头从此处来。weights /= weights.sum(axis=-1, keepdims=True)softmax 归一化,每一行的注意力权重之和为 1,模拟“预算有限、按亲疏分配”。phi_q = elu_plus_one(Q)用 ELU+1 作为核函数特征映射,把 Q、K 映射到新空间,让乘法顺序可以交换。kv = phi_k.T @ V先聚合 K 和 V,得到 d×d 小矩阵,复杂度与序列长度 n 彻底解耦,这是线性化的关键一步。norm = phi_q @ z计算归一化常数,保证输出尺度与标准注意力可比,避免数值漂移。
常见误区
误区我听说注意力复杂度是 O(n²),以为 n 是模型参数量——模型越大越慢,所以参数多的大模型才需要优化注意力。
正解这里的 n 专指序列长度(词元个数),与模型参数量无关。O(n²) 描述的是“序列中任意两个词元都要两两交互”带来的开销。模型参数再大,只要序列长度固定,注意力矩阵的形状就是 n×n;反过来,哪怕模型很小,输入一长,平方项照样压垮显存。类比图书馆里“书与书交换名片”——藏书的册数 n 决定交换总量,而不是书架本身有多重。
为何常见:因为“模型大小”是大家最常讨论的指标,容易把复杂度公式里的符号想当然地对应到参数量,而忽略了公式的具体推导场景。
误区稀疏注意力把复杂度从 O(n²) 降到 O(n),效果还能一样好,那以后无脑用稀疏注意力就行了吧?
正解稀疏化是“用结构换速度”的取舍。窗口注意力只保留邻近连接,远距离信息要靠全局锚点或逐层传递来补,丢失的正是标准注意力最擅长的直接长程依赖。在需要精确捕捉远距离词元关联的任务(如共指消解、文档级推理)上,稀疏注意力会明显掉点。它不是无损压缩,而是“我知道哪些连接值得放弃”的工程判断。
为何常见:很多宣传材料只强调稀疏注意力“快了多少倍”,而淡化精度差异,容易让人误解其为免费午餐。
误区线性注意力复杂度是 O(n),精度损失也不大,那是不是可以把所有 Transformer 都换成线性注意力?
正解线性注意力通过核函数的近似把“两两交互”改为“先聚合再分发”,损失的是精确的逐点相关性建模。实证研究表明,线性注意力在局部匹配、精确复制、长度泛化等任务上明显弱于标准注意力。更关键的是,核映射的选择会显著影响效果,没有一种线性注意力在所有任务上全面胜出。现实中更常见的是混合设计——在浅层用注意力捕捉细节,在深层用线性层压缩记忆。
为何常见:看到“线性复杂度”和“近似精度还不错”的实验报告,容易忽视任务差异和模型内部的搭配成本。
误区既然推理时有 KV 缓存,不用重新算历史词元,那训练时的 O(n²) 空间问题也一并解决了吧?
正解KV 缓存只服务于自回归推理(逐词生成),它把“每个新词元与全部历史的交互”变成了 O(n·d) 的线性增长。但训练阶段依然是完整的前向+反向传播,得分矩阵 n×n 必须构建并保存梯度,O(n²) 的训练显存开销没有任何缓解。KV 缓存优化的价值在于部署和推理吞吐,而不是训练的长序列能力,两者要分开看待。
为何常见:大家平时接触推理部署的场景更多,看到 KV 缓存显著降低显存,就容易把它误推广到训练阶段。
面试题
Q1. 标准自注意力中 O(n²) 的 n 指的是什么?
- A.序列长度(词元个数)← 正确答案
- B.特征维度的大小
- C.注意力头总数
- D.批处理大小
答案:A。O(n²) 来自序列中任意两个词元之间的两两交互,n 是词元个数(序列长度)。特征维度 d、头数、批大小都只是常数或线性项,不会造成随序列长度的平方级增长。
Q2. 在自注意力的时间复杂度 T(n)=O(n²·d) 中,哪一步直接产出了 n×n 的矩阵?
- A.Softmax 归一化
- B.Q 与 K 的转置相乘← 正确答案
- C.与 V 矩阵的加权求和
- D.残差连接与层归一化
答案:B。QK^T 这一步是 n×d 与 d×n 相乘,结果就是 n×n 的得分矩阵,是平方复杂度的源头。Softmax 只是在这个矩阵上逐元素操作,AV 是拿这个矩阵去加权 V,都不产生新的 n×n 矩阵。
Q3. 线性注意力把标准注意力的复杂度降为 O(n·d²),其核心数学技巧是什么?
- A.对得分矩阵做稀疏采样
- B.利用矩阵乘法的结合律交换运算顺序← 正确答案
- C.把 V 矩阵压缩成低维向量
- D.使用傅里叶变换加速卷积
答案:B。线性注意力用核函数 φ(x) 把 softmax 近似为 φ(Q)·φ(K)^T,从而把 (φ(Q)φ(K)^T)V 改写为 φ(Q)(φ(K)^T V)。先算 K 与 V 的乘积(d×d 小矩阵),再让 Q 去乘,n×n 大矩阵就消失了。这是矩阵结合律的经典应用。
Q4. 一个长度为 8192 的序列,使用 FP16 存单张得分矩阵(不含其他开销),约占用多少显存?
- A.16 MB
- B.64 MB
- C.128 MB← 正确答案
- D.512 MB
答案:C。得分矩阵为 n×n=8192×8192 个元素,FP16 每元素 2 字节,所以内存为 8192×8192×2 = 134,217,728 字节 ≈ 128 MB。这还只是单层单头的一张表,实际训练中多层多头的总量会再放大数十倍。
Q5. 以下哪些方法能够降低长序列场景下自注意力的计算开销?
- A.局部窗口注意力← 正确答案
- B.使用更大的批大小
- C.线性注意力(核技巧)← 正确答案
- D.增加更多注意力头
答案:AC。窗口注意力把复杂度降到 O(n·w),线性注意力把复杂度降到 O(n·d²),都是针对 n² 瓶颈的有效手段。更大的批大小和更多注意力头只增加并行度或表达能力,不改变单序列内复杂度与 n 的关系,反而可能加大资源需求。
Q6. 标准注意力的空间复杂度主要来自哪一个中间变量?
- A.Q、K、V 三个输入矩阵
- B.n×n 的注意力得分矩阵← 正确答案
- C.输出投影矩阵
- D.位置编码向量
答案:B。Q、K、V 是 O(n·d) 的线性项,输出投影和位置编码也都与 n 线性相关。唯独 n×n 的得分矩阵随序列长度平方增长,训练时必须完整驻留内存供 softmax 行归一化和反向传播,是空间复杂度的主犯。
Q7. 关于线性注意力的局限,下列说法正确的有哪些?
- A.核近似会带来信息损失← 正确答案
- B.无法处理任何长距离依赖
- C.在精确复制与计数任务上弱于标准注意力← 正确答案
- D.完全无法写成递推形式
答案:AC。线性注意力用核函数近似 softmax,必然有信息损失,且在需要精确匹配的任务(复制、计数)上明显偏弱。它并非无法处理长距离依赖——相反,递推形式让它拥有无限上下文潜力,只是依赖的“粒度”变粗了。
Q8. 自回归推理阶段的 KV 缓存,其空间复杂度是?
- A.O(n²)
- B.O(n·d)← 正确答案
- C.O(d²)
- D.O(1)
答案:B。推理时缓存所有历史词元的 K、V 矩阵,形状是 n×d 乘 2,因此复杂度 O(n·d),随对话长度线性增长。它不保存历史词元之间的两两得分矩阵,所以避免了 O(n²) 的训练级开销,这也是推理能耗远低于训练的原因之一。
Q9. 低秩近似方法(如 Performer)降低复杂度的前提假设是什么?
- A.注意力得分矩阵的信息集中在一个低维子空间← 正确答案
- B.序列长度 n 总是小于特征维度 d
- C.softmax 可以被舍弃而完全不影响模型
- D.所有词元之间必须保持全局完全连通
答案:A。低秩近似的成立前提是,n×n 的注意力矩阵真实秩远小于 n,即大部分信息可以由 r 维(r≪n)子空间承载——“真正被借阅的书只占一小部分”。若矩阵满秩且各元素都关键,低秩分解的误差就不可接受了。
Q10. 处理 10 万字长文档时,标准 Transformer 会遭遇哪些瓶颈?
- A.显存占用随长度平方级爆炸← 正确答案
- B.训练时间随长度平方级增长← 正确答案
- C.参数数量随之平方级增加
- D.注意力头数必须随之增加
答案:AB。标准注意力的时间和空间复杂度都是 O(n²),序列变长后训练显存和耗时都按平方膨胀。参数量和注意力头数是模型结构设计决定的,与输入序列长度无直接关联,不会随 n 平方级增长。