Longformer
Longformer 将滑动窗口注意力与少量全局 token 结合起来,因此其计算成本随序列长度线性增长,并且能够处理 4,096 个 token 的文档。
Longformer 是一种面向长文档的Transformer,它用滑动窗口注意力取代完整的自注意力:每个token周围使用滑动窗口注意力,并对少数由任务选定的 token 使用全局注意力。因此,其计算成本随输入长度线性增长,而不是二次增长。Allen 人工智能研究所的 Iz Beltagy、Matthew Peters 和 Arman Cohan 在 2020 年的论文《Longformer:长文档 Transformer》中介绍了该模型。BERT和 RoBERTa 等编码器最多只能读取 512 个 token,因此更长的文本必须拆成多个片段,而片段间的关联会因此丢失。发布的 Longformer 模型可一次读取 4,096 个 token,上下文窗口长度是原来的八倍。
Longformer 的注意力机制如何工作#
每一层都会在同一个注意力机制中结合局部和全局模式:
- 滑动窗口注意力:每个 token 都会关注固定窗口内的邻近 token;在发布的模型中,窗口两侧各包含 256 个 token。
- 扩张滑动窗口:在被关注的位置之间留出间隔,可让注意力头以相同的计算成本看到更远的位置。作者在字符级语言模型的上层中,对少数几个注意力头使用了扩张。
- 全局注意力:选定的 token 会关注所有位置,所有位置也会关注这些 token;该机制使用独立的查询、键和值投影。具体选择哪些 token 取决于任务:分类任务使用
[CLS]token,问答任务则使用问题中的 token。
堆叠多个层会扩大窗口的覆盖范围,就像堆叠卷积会扩大感受野一样;卷积神经网络(CNN)中有 l 层、窗口大小为 w 时,可覆盖 l × w 个 token。每一层计算的注意力分数约为 n × w 个,而不是 n × n 个。统计 Longformer 掩码中的 token 对,可以直观地看出差别:
import torch
window = 512 # Longformer-base: 256 tokens on each side of every token
for n in (1024, 2048, 4096):
pos = torch.arange(n)
# Sliding window: each token attends to neighbors within window / 2 positions
mask = (pos[:, None] - pos[None, :]).abs() <= window // 2
# Global attention on token 0 ([CLS]): it sees every token and every token sees it
mask[0, :] = True
mask[:, 0] = True
print(f"{n} tokens: full attention {n * n / 1e6:.1f}M scores, Longformer {mask.sum().item() / 1e6:.1f}M")它会显示 Longformer 的分数数量为 0.5M、1.0M 和 2.0M,而完整注意力分别为 1.0M、4.2M 和 16.8M:输入长度每增加一倍,Longformer 的注意力计算量就增加一倍,而完整注意力的计算量则增加四倍。实际实现只会计算带状区域中的分数,这正是节省内存的关键。
训练与结果#
Longformer 从 RoBERTa 检查点开始。作者将其 512 个学习到的位置嵌入复制八次,以覆盖 4,096 个位置,并在长文档上继续进行掩码语言模型预训练。经过微调后,它在长文档任务上始终优于 RoBERTa,并在 WikiHop 和 TriviaQA 问答基准上创下当时最先进的结果;字符级语言模型也在 text8 和 enwik8 上取得了新成绩。
Longformer-Encoder-Decoder(LED)添加了解码器,可用于文本摘要和其他文本生成任务;研究人员展示了它对 arXiv 上完整科学论文进行摘要的能力。Hugging Face Transformers 实现了这两种模型,并使用 global_attention_mask 接收全局 token。此后还出现了针对特定领域的版本,例如 Clinical-Longformer,它使用大型临床文本语料库进行预训练,并在包括命名实体识别、问答和文档分类在内的 10 项任务上进行评估。
Longformer 与相关模型的对比#
- Transformer-XL:逐段读取长文本,并让每一段关注前一段缓存的隐藏状态,通过循环机制扩展上下文,适用于从左到右的生成。
- BigBird:Google 在同年推出的模型,在窗口注意力和全局注意力之外增加了随机注意力连接,同样可以读取 4,096 个 token。
- 稀疏注意力:Longformer 所属的固定注意力模式大家族。
- Flash Attention:在片上内存块中计算精确的完整注意力,因此内存使用量随序列长度线性增长,而注意力分数数量仍呈二次增长。
视觉中的局部与全局注意力#
高分辨率图像也会带来同样的问题,因为视觉 Transformer(ViT)会将图像转换成数千个图像块 token。Swin Transformer通过移动局部窗口来解决这一问题;Meta 的分割一切模型(SAM)已集成到 Ultralytics 软件包中,它会在不同模块中交替使用窗口注意力和全局注意力来执行图像分割:其 ViT-B 图像编码器在 12 个模块中的 8 个模块内,对 64 × 64 图像块网格中的非重叠 14 × 14 窗口进行注意力计算,并在模块 2、5、8 和 11 中,对全部 4,096 个图像块执行全局注意力。










