想象你是一位图书管理员老王,刚接手了一座藏有十万册古籍的图书馆。标准管理流程要求:每当有人借书,你必须写便条通知馆内每一位同事。图书馆越大,便条越厚,最终你光是写便条就耗尽了所有工作时间。这便是标准 Transformer 的困境——它让每个词都“问候”序列里的其他所有词,当文本从几百字涨到上万字,这种“全员打招呼”的注意力机制就会因计算量爆炸而瘫痪。 Longformer 的解决方案很朴素:不再让每个词向所有人打招呼,而是左手握着望远镜观察远方重要的地标(全局注意力),右手拿着放大镜细读身边近邻的细节(滑动窗口注意力)。老王不必再通知全馆,只需留意门口的大钟(CLS 全局 token)和楼层导航员(特殊全局 token),其余时间专注眼前的书架即可。如此,图书馆的管理成本从“与每个人通信”降为“与少数人和近邻通信”,十万册古籍也能从容整理。
掌握 Longformer 的注意力设计,意味着你能让模型处理论文、合同、病历等超长文本——这是从“能聊天”迈向“能读完整本书”的关键一跃,也是长文本 NLP 从业者的必备技能。
可视化演示
展示标准Transformer O(n^2)注意力矩阵瓶颈、Longformer局部滑动窗口注意力机制,以及局部+全局混合注意力策略如何实现线性复杂度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
标准Transformer:O(n^2)注意力矩阵 NxN矩阵 每个token关注所有token 高亮=当前计算的注意力对 complexity = O(N^2), N=4096 -> 16M pairs 长文本计算量爆炸,BERT仅支持512 token
满格注意力的代价
老王发现,图书馆的老规矩是“每本书借出都要通知全馆”——这便是标准 Transformer 的“满格注意力”。每个 token 都要计算与序列中所有其他 token 的相关性,形成 n×n 的注意力矩阵。当文本长度 n 为 512 时,矩阵有 26 万项,尚可承受;当 n 达到 4096(约 3000 英文词),矩阵膨胀到 1600 万项,计算量与内存双双爆表。
从数学上看,标准注意力的复杂度为 O(n²)。这意味着文本长度翻倍,计算成本变成原来的 4 倍。处理一篇 10 万词的论文,所需算力相当于处理 512 词短文的 4 万倍——这在工程上完全不可行。许多团队被迫将长文档截断成片段,打断了跨段落的语义连贯性。
于是老王意识到:若要管理十万册古籍,必须改变“全员通知”的规则。Longformer 的出发点正是舍弃这种“过度礼貌”,转而建立一套高效的沟通机制——这正是我们接下来要讲的滑动窗口注意力。
- 符号 n表示输入序列的长度,即 token 数量。一个 token 约等于一个词或子词。
- 平方关系注意每个 token 都要与全部 n 个 token 计算相关性,共 n×n 次操作。
滑动窗口注意力
老王的新方案:每位管理员只与身边工位相邻的同事保持日常沟通,远处的事项交给专门的信使。这就是 Longformer 的滑动窗口注意力——每个 token 只关注其左右两侧各 w 个 token,形成一个宽度为 2w+1 的局部窗口。窗口外的情况一概不问,由此计算量从 n² 降为 n×w,其中 w 通常取 128 或 256,远小于 n。
单层滑动窗口的“视野”有限,但 Transformer 是深度堆叠的。假设模型有 L 层,每层窗口宽度为 w,则第 L 层的一个 token 能间接感知约 L×w 范围内的信息——这类似于老王通过一层层同事的口耳相传,最终能了解整个楼层的动态。多层堆叠让局部窗口在深层获得足够大的感受野。
回到图书馆的比喻:滑动窗口让成本与馆藏量成正比,而非平方。老王松了一口气,但新的问题浮出水面:只看近邻,如何捕捉全文的主旨?这便需要全局记忆 token 的登场。
- 窗口宽度 w每个 token 只注意左右各 w 个邻居,w 是预设常数(如 256),不随文本长度变化。
- 线性复杂度总计算量约等于 token 数 n 乘以窗口大小 w,因此 O(n×w) 是 n 的线性函数。
- 多层感知叠加L 层叠加后,理论感受野可达 L×w,覆盖更广上下文。
全局记忆token
图书馆不能只有近距离沟通,还需要几个“广播站”——比如大厅的总服务台,所有人都知道有事可以去那里查询全馆信息。Longformer 的全局注意力正是这个广播站:在序列中选定少量特殊 token(如 [CLS] 或任务相关的实体位置),这些 token 与序列中所有 token 计算注意力,同时所有 token 也反向注意它们。全局 token 的数量通常为几十个,计算成本仅为 O(n×g),其中 g 是全局 token 数(常数)。
这种“局部为主、全局为辅”的设计让 Longformer 同时拥有两副眼镜:一副放大镜看局部细节,一副望远镜看全局脉络。在文本分类任务中,[CLS] 作为全局 token 汇总全文信息;在问答任务中,问题中的每个 token 都可设为全局,让模型在阅读长文档时始终“带着问题找答案”。
老王在每层楼设置了一个“信息台”(全局 token),既不影响日常的邻里沟通,又能让信息在全馆流通。接下来的问题是:这样的设计在数学上到底省了多少成本?我们来看线性复杂度的具体账本。
- 全局 token 定义在输入序列中挑选少量 token,赋予其“与所有人通信”的特权。
- 双向注意力全局 token 既注意所有 token,也被所有 token 注意,形成信息汇聚点。
- 总复杂度核算局部窗口加上全局广播,总复杂度为两者之和。
线性复杂度分析
我们以 n=4096 的文本为例,对比标准 Transformer 与 Longformer 的实际开销。标准注意力的计算量为 n² ≈ 1677 万次交互;Longformer 取 w=256、g=64,计算量为 n×(2w+g) ≈ 4096×576 ≈ 236 万次交互——足足节省了 86% 的注意力计算。且这一优势随 n 增大而扩大:当 n=32768 时,标准模型需要 10.7 亿次交互,Longformer 仅需约 1850 万次。
更关键的是内存占用。注意力分数矩阵需要显存存储,标准模型的显存需求为 O(n²),4096 序列长度就需要数百 GB(在 batch>1 时不可想象);Longformer 的显存需求为 O(n),同样的长度仅需几 GB,普通 GPU 即可训练。这种“无需截断”的能力,让模型首次能完整阅读整本书级别的输入。
老王的账本终于好看了:管理十万册古籍的成本与藏书量成正比,而不是平方。但还有最后一处细节需要处理——新来的管理员在不熟悉的楼层如何知道自己的位置?这引出了位置编码策略。
- 分子 n²标准注意力的交互次数,随长度平方增长。
- 分母 n×(2w+g)Longformer 中每个 token 的交互对象数为 2w 个窗口邻居加 g 个全局 token。
- 节省倍数两者相除得 n/(2w+g),n 越大倍数越高。
位置编码策略
在滑动窗口机制中,一个 token 不再与远处的 token 直接交互,因此全局绝对位置的重要性下降,窗口内相对位置变得关键。Longformer 在设计时发现,基于相对位置编码(如 T5 的相对位置偏置)能天然适配滑动窗口——只需编码“i 与 j 相差几个格子”,而不必知道 i 和 j 各自在全文中的绝对位置。
这种设计带来两个好处:其一,模型对输入长度天然外推,训练时见过的最大长度不足时,推理时可用更长的序列;其二,实现简洁,无需为窗口注意力设计额外的位置嵌入。对于后来的旋转位置编码(RoPE),Longformer 同样兼容——RoPE 本身便是基于相对位置的编码,可直接替换原有的绝对位置编码层。
老王给每位管理员发了一张“楼层相对位置图”——不必知道自己在整栋楼的坐标,只需知道与隔壁工位的距离。这样的地图在任何规模的图书馆都通用,这也正是 Longformer 能够在超长文本上灵活工作的原因。有了这套机制,我们终于可以把它用到真实世界的长文本任务中。
- 差值 i−jtoken i 与 token j 在序列中的距离,窗口注意力只需关心这一差值是否在 w 范围内。
- 嵌入查找将差值映射为一个可学习的向量,加到注意力分数上。
长文本实战应用
Longformer 的线性复杂度使其成为长文本 NLP 任务的首选骨干网络。以论文审阅为例:一篇机器学习论文正文约 8000~12000 词,标准 BERT 需切分为多个 512 词的片段,导致“实验在第 5 页、结论在第 7 页”这类跨段信息完全断裂。Longformer 可一次性读完全文,直接回答“这篇论文在哪些数据集上超过了 SOTA?”
在法律合同审查场景,一份合同动辄 50~100 页。Longformer 将全部条款纳入单一序列,配合全局 token 标记“赔偿条款”“保密义务”等关键实体,让模型同时把握局部措辞与整体结构。医疗领域同样受益:患者的电子病历长达数万字,Longformer 可完整建模既往病史与当前症状之间的长期依赖,辅助医生做出更准确的诊断建议。
在代码实现层面,HuggingFace Transformers 库已内置 LongformerModel,只需将 attention_window 设为合适的窗口大小(常用 256 或 512),即可加载预训练权重进行微调。下面我们用一个 Python 示例演示如何用 Longformer 完成长文本分类任务。
AI 应用场景
长文档智能问答
阶段:模型微调与推理
解决的问题:传统方法需将长文档截断为 512 token 的片段,导致跨段落的答案无法召回。比如用户在 50 页研报中问“公司去年的净利润增速是多少”,答案可能在图表标题和正文两处,截断后模型看不到完整证据链。
具体案例:某券商使用 Longformer 对年度研报构建问答系统,将整篇研报(约 8000 token)直接输入模型,并设置标题 token 为全局注意力。用户提问时,系统能引用跨越 10 页以上的数据来源给出答案,召回率相比 BERT 分段方案提升 27%。
法律合同风险审查
阶段:数据预处理与模型部署
解决的问题:传统关键词规则无法理解条款间的隐含关联,而 BERT 类模型因长度限制只能逐段扫描,遗漏跨条款风险。比如“违约金上限”在附录中定义,而正文引用了该附录,分段模型看不到这层引用关系。
具体案例:某法律科技公司用 Longformer 处理平均 80 页的房屋租赁合同。将合同全部条款作为输入,全局 token 标记“违约责任”“争议解决”等关键条款位置。模型可在 10 秒内标出“赔偿金额与第 14.2 条矛盾”这类深层次风险点,人工复核工作量减少 60%。
Python 演示
import torchfrom transformers import LongformerTokenizer, LongformerForSequenceClassification model_name = "allenai/longformer-base-4096"tokenizer = LongformerTokenizer.from_pretrained(model_name)model = LongformerForSequenceClassification.from_pretrained(model_name, num_labels=2) long_text = """ Longformer is a transformer variant designed for long documents. It replaces full attention with a sliding window of size 512. Additionally, global attention tokens like [CLS] aggregate information. This reduces complexity from quadratic to linear in sequence length. Therefore, Longformer can process thousands of tokens in one pass. For example, it can read an entire research paper at once. This makes it suitable for document classification and QA.""" * 20 inputs = tokenizer(long_text, return_tensors="pt", max_length=4096, truncation=True)attention_mask = inputs["attention_mask"]global_attention_mask = torch.zeros_like(attention_mask)global_attention_mask[:, 0] = 1 outputs = model(**inputs, global_attention_mask=global_attention_mask)pred = torch.argmax(outputs.logits, dim=-1).item()print("预测类别:", pred)
常见误区
误区Longformer 只看局部窗口,是不是对全文的理解反而不如 BERT 好?
正解滑动窗口通过多层堆叠扩展感受野,加上全局 token 的定点广播,实际上能有效获取全局信息。以图书馆比喻来说,老王既能通过口耳相传了解远处动态(多层窗口),又能直接去信息台查全馆公告(全局 token)。实验表明,在长文本分类和 QA 上 Longformer 显著优于被截断的 BERT。
为何常见:人们容易从单层窗口的“视野有限”直接推出“全局信息缺失”,却忽略深度堆叠和全局 token 这两重补充机制。
误区既然 w 越大信息越多,那把 w 设为 1024 甚至 4096 是不是更好?
正解w 是复杂度线性项中的常数,w 过大会使 O(n×w) 的常数增大,导致训练变慢且显存上升。Longformer 论文实验表明 w=512 已能覆盖绝大多数语义依赖,继续增大收益递减。调 w 时应同时考虑 GPU 显存和训练吞吐量,而非一味求大。
为何常见:人们习惯“更多信息=更好性能”的直觉,忽略了效率与效果的平衡点。
误区Longformer 预训练模型最长支持 4096,那超过 4096 的文本就无法处理了。
正解4096 是预训练时的最大序列长度,但绝对位置嵌入可插值或替换为相对位置编码,使模型外推到更长序列。Longformer 的窗口注意力天然支持任意长度输入,只需在推理时调整位置编码。实践中 HuggingFace 版本已支持超过 4096 的输入,只要显存允许。
为何常见:预训练长度限制被误解为架构上限,混淆了“训练配置”与“模型能力”两个概念。
面试题
Q1. Longformer 的核心创新是下列哪一项?
- A.用卷积替代注意力
- B.滑动窗口+全局注意力混合← 正确答案
- C.增加注意力头数
- D.使用更大的词表
答案:B。Longformer 的贡献是用局部滑动窗口注意力替代满格注意力,并引入少量全局 token 弥补全局信息。它没有用卷积替代注意力(A),也没有靠多头数或词表取胜(C、D)。
Q2. Longformer 的注意力复杂度从标准的 O(n²) 降为了:
- A.O(log n)
- B.O(n log n)
- C.O(n×w)← 正确答案
- D.O(2ⁿ)
答案:C。滑动窗口让每个 token 只注意 w 个邻居,全局 token 数为常数 g,总复杂度为 O(n×(2w+g)),即 O(n),其中 w 和 g 都是常数。因此选 C(O(n×w) 表示线性)最准确。
Q3. 关于 Longformer 中的全局注意力 token,下列说法正确的是:
- A.所有 token 都会被选为全局
- B.全局 token 数量随文本长度增长
- C.通常只有少数如 [CLS] 的位置设为全局← 正确答案
- D.全局 token 不参与注意力计算
答案:C。Longformer 只在少数关键位置(如 [CLS] 或任务相关实体)设置全局注意力,数量是常数(如几十个),不会随 n 增长(B 错)。全局 token 与所有 token 双向交互,而非不参与(D 错)。
Q4. 标准 Transformer 处理 n=4096 的文本时,注意力矩阵规模约为:
- A.4096
- B.16K
- C.1600 万← 正确答案
- D.160 亿
答案:C。注意力矩阵大小为 n×n = 4096×4096 ≈ 1677 万项,即约 1600 万。这是满格注意力“平方复杂度”的直接体现,也是长文本处理的主要瓶颈。
Q5. Longformer 采用滑动窗口后,窗口大小为 w=256,序列长度 n=8192,则每个 token 的局部注意力对象数约为:
- A.256
- B.512← 正确答案
- C.8192
- D.2048
答案:B。滑动窗口的注意力范围是左右各 w 个 token,加上自身,共 2w+1 ≈ 513 个。最接近的选项是 B(512),这也是 Longformer 默认窗口的常见取值。
Q6. Longformer 中全局注意力的作用包括:
- A.让 [CLS] 汇总全文信息← 正确答案
- B.捕捉跨窗口的长距离依赖← 正确答案
- C.替代所有局部注意力
- D.使模型能关注任务关键位置← 正确答案
答案:ABD。全局 token 的核心作用是为模型提供“广播站”——[CLS] 汇总全句信息(A),捕捉窗口之外的长距离依赖(B),并在 QA 等任务中关注问题关键词(D)。但它不替代局部注意力,而是与其互补(C 错)。
Q7. 关于 Longformer 的位置编码,下列说法错误的是:
- A.使用相对位置编码可以适配滑动窗口
- B.绝对位置编码在滑动窗口中仍然高效← 正确答案
- C.相对位置编码有利于长度外推
- D.RoPE 与 Longformer 可兼容
答案:B。在滑动窗口中,token 只与邻居交互,绝对位置信息用处不大,因此绝对位置编码并非高效方案(B 错误)。相对位置编码能表达“相距多少格”,适配窗口机制并支持外推(A、C 正确),RoPE 本质上就是相对位置编码的一种(D 正确)。
Q8. 与传统 BERT 相比,Longformer 在长文本任务上的优势体现在:
- A.支持更长的输入序列← 正确答案
- B.无需截断即可跨段落建模← 正确答案
- C.训练速度一定更快
- D.显存占用随长度线性增长← 正确答案
答案:ABD。Longformer 支持 4096+ 长度(A),能完整阅读文档保持跨段语义(B),显存占用为 O(n) 线性(D)。但“训练速度一定更快”不成立——短文本时满格注意力并行度高反而可能更快(C 错)。
Q9. Longformer 的总复杂度公式是:
- A.O(n²)
- B.O(n×w + n×g)← 正确答案
- C.O(n×g)
- D.O(w×g)
答案:B。总复杂度等于滑动窗口部分 O(n×w) 加上全局注意力部分 O(n×g),因 w 和 g 均为常数,整体为 O(n)。这才是 Longformer 能处理超长文本的数学基础。
Q10. 在实际使用 Longformer 时,若要处理超过预训练长度(如 8192)的文本,可行方案包括:
- A.直接截断到 4096
- B.扩展位置编码或使用插值← 正确答案
- C.更换 RoPE 相对位置编码← 正确答案
- D.增大 attention_window 到 4096
答案:BC。处理超长文本的核心是解决位置编码外推问题——插值(B)和 RoPE(C)都是有效手段。直接截断(A)会丢失信息不推荐;增大窗口到 4096 虽可行但会显著增加计算量,并非“处理超长文本”的正解(D)。