编程与 AI15 分钟阅读更新于 2026-08-03

Transformer 为什么怕序列变长:从 L×L 注意力矩阵看计算与内存开销

围绕矩阵化自注意力的计算方式,解释序列长度、注意力矩阵、内存占用和批次大小之间的关系。

相关工具

为什么长度增加后开销增长很快

Self-Attention 的核心计算之一是让每个 Query 与所有 Key 比较。序列长度为 L 时,每个位置需要和 L 个位置建立关系,所有位置合起来就形成一个 L × L 的注意力分数矩阵。

序列从 100 增加到 200,不只是多了一倍位置,每个位置可查看的范围也扩大了,因此关系数量大约从 10000 增加到 40000。长度翻倍,注意力关系数量大致变成四倍,这就是常说的平方增长。

Transformer 序列长度增加导致 L×L 注意力矩阵扩大的示意图
序列长度与注意力矩阵

序列长度 L 决定注意力矩阵的两个边,长度增加会让位置关系数量按平方增长。

L×L 矩阵里的两条轴分别是什么

注意力矩阵的一条轴对应 Query 位置,另一条轴对应 Key 位置。矩阵中的一个格子表示“当前位置需要从另一个位置读取多少信息”。每一行通常经过 Softmax 后成为一个位置对其他位置的权重分布。

矩阵的行数和列数都由序列长度决定,所以它不像词向量那样只有一个 d_model 维度。即使每个位置的表示宽度不变,位置之间的两两关系仍会随着 L 增长。因果掩码只是把矩阵右上方部分遮住,并没有让矩阵的形状自动消失。

编码器自注意力通常保留完整的 L×L 关系,解码器自注意力虽然遮住未来区域,但仍然要处理可见区域和相应的张量计算。

计算量和内存量不是同一个问题

注意力主要包含两类大矩阵运算:QK 的相关性计算,以及注意力权重与 V 的汇总。它们都与序列长度有关。与此同时,训练时还可能需要保存注意力分数、权重和中间激活,用于反向传播,因此内存压力也会随着序列变长而增加。

计算量回答“需要做多少乘法和加法”,内存量回答“需要同时保存多少中间结果”。有时模型算得动,但保存中间激活已经超出显存;有时可以通过分块或缓存降低内存峰值,却仍然要承担整体计算成本。

Transformer 注意力和 FFN 在序列长度变化下的成本对比图
注意力与其他子层的成本

序列变长后,注意力中的位置关系计算会成为重要成本,FFN 则主要按位置处理特征。

为什么矩阵化仍然值得

虽然 L×L 关系会带来开销,但矩阵化让大量位置可以同时计算。与逐词处理相比,Transformer 可以把 Q、K、V 组织成矩阵,一次得到所有位置之间的相关性,再批量完成加权汇总。

因此,注意力的代价换来了更强的并行能力和更短的信息路径。设计中的难点不是简单地取消注意力,而是在保留全局关系的同时控制序列长度、批次大小和中间矩阵带来的成本。

Transformer 使用矩阵计算多个位置注意力关系的示意图
矩阵化注意力计算

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 能降低注意力复杂度吗?

减少批次中的补齐长度可以减少无效计算和内存浪费,但单条真实序列的注意力关系仍然由它自己的长度决定。