Transformer 为什么怕序列变长:从 L×L 注意力矩阵看计算与内存开销
围绕矩阵化自注意力的计算方式,解释序列长度、注意力矩阵、内存占用和批次大小之间的关系。
相关工具
为什么长度增加后开销增长很快
Self-Attention 的核心计算之一是让每个 Query 与所有 Key 比较。序列长度为 L 时,每个位置需要和 L 个位置建立关系,所有位置合起来就形成一个 L × L 的注意力分数矩阵。
序列从 100 增加到 200,不只是多了一倍位置,每个位置可查看的范围也扩大了,因此关系数量大约从 10000 增加到 40000。长度翻倍,注意力关系数量大致变成四倍,这就是常说的平方增长。

序列长度 L 决定注意力矩阵的两个边,长度增加会让位置关系数量按平方增长。
L×L 矩阵里的两条轴分别是什么
注意力矩阵的一条轴对应 Query 位置,另一条轴对应 Key 位置。矩阵中的一个格子表示“当前位置需要从另一个位置读取多少信息”。每一行通常经过 Softmax 后成为一个位置对其他位置的权重分布。
矩阵的行数和列数都由序列长度决定,所以它不像词向量那样只有一个 d_model 维度。即使每个位置的表示宽度不变,位置之间的两两关系仍会随着 L 增长。因果掩码只是把矩阵右上方部分遮住,并没有让矩阵的形状自动消失。
编码器自注意力通常保留完整的 L×L 关系,解码器自注意力虽然遮住未来区域,但仍然要处理可见区域和相应的张量计算。
计算量和内存量不是同一个问题
注意力主要包含两类大矩阵运算:QK 的相关性计算,以及注意力权重与 V 的汇总。它们都与序列长度有关。与此同时,训练时还可能需要保存注意力分数、权重和中间激活,用于反向传播,因此内存压力也会随着序列变长而增加。
计算量回答“需要做多少乘法和加法”,内存量回答“需要同时保存多少中间结果”。有时模型算得动,但保存中间激活已经超出显存;有时可以通过分块或缓存降低内存峰值,却仍然要承担整体计算成本。

序列变长后,注意力中的位置关系计算会成为重要成本,FFN 则主要按位置处理特征。
为什么矩阵化仍然值得
虽然 L×L 关系会带来开销,但矩阵化让大量位置可以同时计算。与逐词处理相比,Transformer 可以把 Q、K、V 组织成矩阵,一次得到所有位置之间的相关性,再批量完成加权汇总。
因此,注意力的代价换来了更强的并行能力和更短的信息路径。设计中的难点不是简单地取消注意力,而是在保留全局关系的同时控制序列长度、批次大小和中间矩阵带来的成本。

Q、K、V 组成矩阵后,可以同时计算多个位置之间的关系。
为什么长文本会同时影响时间和显存
训练长序列时,模型需要处理更大的注意力矩阵,并保存更多层的中间结果。层数、头数、批次大小和序列长度相乘后,资源压力会快速累积。序列越长,一个批次里能放入的样本数量往往越少,训练效率也会受到影响。
推理时,已经生成的目标前缀会逐步变长。即使使用 Key 和 Value 缓存,新的 Query 仍需要和越来越长的历史进行交互。源序列和目标序列都很长时,交叉注意力还要在两套长度之间建立联系。
Padding 会放大无效开销
批次中的短句通常需要补齐到批次最大长度。若长度差异很大,许多 L×L 关系实际上对应 Padding 位置。Padding Mask 可以让这些位置不影响语义结果,却不能完全避免统一张量带来的计算和内存占用。
把长度相近的样本放在同一批次,可以减少补齐比例;合理设置长度上限,也能在覆盖长文本和控制成本之间取得平衡。Mask 解决的是结果正确性,分桶和批次组织则更多解决资源利用率。
序列长度和模型宽度如何共同影响成本
序列长度 L 决定位置之间有多少关系,d_model 和头内维度决定每次关系计算的特征宽度。把模型做得更宽,单次矩阵运算会变重;把序列做得更长,关系矩阵会扩大。层数和头数再叠加上去,整体成本就不由某一个参数单独决定。
这也是为什么阅读模型规模时,不能只看参数量。一个模型参数量不变,换一个更长的上下文长度,也可能带来显著不同的计算和显存需求。输入长度是使用成本的重要组成部分。
把平方增长放回 Transformer 主线
Transformer 用自注意力让每个位置可以直接读取其他位置,这带来了全局关系和并行计算,但也形成了 L×L 的位置关系矩阵。序列长度增加时,计算、内存、Padding 和批次安排会一起受到影响。
理解这个代价后,就能更准确地看待长上下文:它不是只把输入框拉长,而是让模型需要处理更多位置之间的联系。实际使用时,长度上限、批次大小、缓存和注意力实现都要和任务需要配合。
常见问题
因果掩码把一半位置遮住后,复杂度就变成线性了吗?
通常不会。虽然未来区域不参与有效注意力,但标准实现仍然围绕长度 L 组织矩阵计算,序列变长带来的主要开销仍然存在。
序列长度翻倍,显存一定严格变成四倍吗?
不一定。具体还取决于实现、层数、头数、批次、缓存和是否保存中间激活。L×L 注意力矩阵说明的是主要增长趋势,不是所有内存项都严格按四倍变化。
减少 Padding 能降低注意力复杂度吗?
减少批次中的补齐长度可以减少无效计算和内存浪费,但单条真实序列的注意力关系仍然由它自己的长度决定。