目录
- 总结:
- 输入策略适配
- 模型架构改造
-
- 方案三:稀疏/长程注意力机制(模型架构级)
-
- 总结
- [1. 稀疏注意力:限制注意力范围](#1. 稀疏注意力:限制注意力范围)
- [2. 线性注意力:核函数近似](#2. 线性注意力:核函数近似)
- 方案四:外部记忆增强机制
- 方案五:检索增强(RAG思路)
在自然语言处理中,处理超长文本是一个常见挑战。模型通常有最大输入长度限制,对于超过限制(如1万token)的文本,核心思路分为模型架构改造 和输入策略适配两大类。
总结:
处理一万token的超长文本,主要思路分两类:
第一类是工程化的分块策略 ,即把长文本切分成不重叠或有重叠的多个块,分别送给BERT,再通过投票、平均等方法聚合结果。这种方法的典型代表是层次模型,比如ToBERT,先为每个块生成一个摘要向量,再把这些向量序列输入到另一个Transformer中建模文档级关系,效果很好且灵活。
第二类是模型架构改造 ,使用像Longformer 或BigBird 这样的长程模型。它们通过混合局部滑动窗口、全局和随机注意力模式,将自注意力的复杂度从 O ( n 2 ) O(n^2) O(n2)降到 O ( n ) O(n) O(n),能直接处理数千甚至数万token的序列。不过这需要专门预训练的模型。
在实际项目中,两种方法会根据具体任务对全局信息的需求程度和数据量来权衡。通常,层次模型法因实现和微调成本低,是首选的尝试方向。
输入策略适配
方案一:截断法(简单直接)
这是最简单的方案,但会丢失信息。
- 头截断:只保留文本开头的512个token。适用于文章开头就是摘要或核心的情况。
- 尾截断:只保留最后512个token。适用于对话历史场景,最后的内容最重要。
- 首尾截断:头部保留一部分(如128 token),尾部保留大部分(如382 token)。综合两者信息。
方案二:分层/分块策略(工程实用)
将长文本切分成多个块,分别处理后进行信息聚合。这是目前最主流的工程实践。
A. 简单滑动窗口
以固定步长(如256 token)将文本切分为多个有重叠的段,每段送入模型。
- 结果聚合 :
- 分类任务:对每个块的输出logits进行投票或取平均。
- 标记任务:对重叠部分取平均或多数投票。
B. 两级层次模型
非常适合需要捕获文档级结构的分类或回归任务。
- 词块级编码 :将长文本分成多个块,每个块分别过一个Transformer(如BERT),取其
[CLS]向量作为该块的表示。 - 文档级编码 :将所有块的
[CLS]向量组成一个新序列,送入另一个Transformer(如轻量级)或LSTM,最终用于分类。- 代表模型:ToBERT (Transformer over Transformer)。
- 优点:显式建模了块间的顺序关系。
模型架构改造
方案三:稀疏/长程注意力机制(模型架构级)
标准Transformer的自注意力复杂度是 O ( n 2 ) O(n^2) O(n2)。这类方法通过改变注意力模式来降低复杂度,使其能处理长序列。
- Longformer :混合使用滑动窗口注意力 、空洞滑动窗口注意力 和全局注意力 。复杂度降至 O ( n ) O(n) O(n)。
[CLS]使用全局注意力连接所有块,块内使用局部窗口注意力。 - BigBird :在Longformer的基础上,额外加入随机注意力,理论上可以证明其逼近全注意力。
- 这类模型需要从头预训练或对长文本做微调,不能直接使用现有BERT权重。
总结
将标准自注意力从 O ( n 2 ) O(n^2) O(n2) 复杂度降至 O ( n ) O(n) O(n),核心思路是强制每个 Token 只与固定数量(而非所有)的 Token 进行注意力计算。主流方法有稀疏注意力和线性注意力两大类。
将复杂度从 O ( n 2 ) O(n^2) O(n2) 降到 O ( n ) O(n) O(n) 主要有两条路:
一是稀疏注意力 ,通过掩码强制每个词只关注局部窗口或少量固定模式下的其他词。比如 Longformer 用"滑动窗口+全局词"组合,每个词的交互对象数从 n n n 降为常数 w w w,整体复杂度就变成了 O ( n × w ) = O ( n ) O(n \times w) = O(n) O(n×w)=O(n)。
二是线性注意力 ,利用核函数近似,把计算顺序从 ( Q K T ) V (QK^T)V (QKT)V 变换为 Q ( K T V ) Q(K^TV) Q(KTV),避免显式构造巨大的 n × n n \times n n×n 注意力矩阵。复杂度从 O ( n 2 d ) O(n^2 d) O(n2d) 直接降到 O ( n d 2 ) O(n d^2) O(nd2),在特征维度 d d d 固定时就是 O ( n ) O(n) O(n)。
1. 稀疏注意力:限制注意力范围
这类方法设计稀疏的注意力模式,使注意力矩阵不再是密集的 n × n n \times n n×n。
-
滑动窗口注意力
- 做法 :每个 Token 只与其前后窗口大小 w w w 内的邻居计算注意力。复杂度降为 O ( n × w ) O(n \times w) O(n×w),因 w w w 是常数,故为 O ( n ) O(n) O(n)。
- 优点:在多数NLP任务中,局部上下文最重要,效率高。
- 代表:Longformer、Mistral(部分层使用)。
-
空洞滑动窗口注意力
- 做法:在滑动窗口基础上,以固定间隔跳跃选取上下文,在不增加计算量的前提下扩大感受野。类似空洞卷积。
- 代表:Longformer。
-
全局注意力
- 做法 :指定少数特殊 Token(如
[CLS])对所有 Token 做全局注意力,其他 Token 仍用滑动窗口。这样全局 Token 能收集文档级信息,再通过窗口注意力传播。 - 代表:Longformer、BigBird。
- 做法 :指定少数特殊 Token(如
-
随机注意力
- 做法:每个 Token 除了窗口邻居,还随机采样少量远处的 Token 进行交互。
- 代表:BigBird。
-
分块注意力
- 做法 :将序列分成多个块,块内做全注意力,块之间通过选定的代表 Token 交互,整体复杂度近似 O ( n ) O(n) O(n)。
- 代表:BlockBERT。
2. 线性注意力:核函数近似
这类方法利用矩阵运算的结合律,彻底改变计算顺序,从数学上达到 O ( n ) O(n) O(n) 复杂度。
- 原理 :
- 标准注意力: Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}(\frac{Q K^T}{\sqrt{d_k}}) V Attention(Q,K,V)=softmax(dk QKT)V
- 计算过程是 ( n × d ) × ( d × n ) (n \times d) \times (d \times n) (n×d)×(d×n),得到 n × n n \times n n×n 矩阵,再乘以 V V V,复杂度 O ( n 2 d ) O(n^2 d) O(n2d)。
- 若将 Softmax 中的操作拆解为核函数 ϕ \phi ϕ: Attention ≈ ϕ ( Q ) ( ϕ ( K ) T V ) \text{Attention} \approx \phi(Q) (\phi(K)^T V) Attention≈ϕ(Q)(ϕ(K)TV)。
- 先计算 ϕ ( K ) T V \phi(K)^T V ϕ(K)TV,得到 ( d × d ) (d \times d) (d×d) 矩阵,再乘以 ϕ ( Q ) \phi(Q) ϕ(Q)。计算顺序的改变使复杂度降至 O ( n d 2 ) O(n d^2) O(nd2),当 d ≪ n d \ll n d≪n 时,可视为线性复杂度。
- 代表:Linformer、Performer、Linear Transformer。
方案四:外部记忆增强机制
不通过近似注意力,而是给模型增加一个能存储长程信息的记忆模块。
- Transformer-XL :通过片段级递归机制,将上一个文本片段计算好的隐藏状态缓存下来,作为当前片段的记忆。它并非是处理一个完整的超长序列,而是让模型能看到更远的上文。
- 这更像是一种用于生成式任务的长程依赖解决方案。
方案五:检索增强(RAG思路)
不直接处理全文,而是先检索出相关部分。
- 将长文档按段落、句子等语义单元切分为块。
- 使用稀疏或稠密检索器,根据任务查询找到最相关的Top-K个块。
- 将这几个块拼接起来(长度在512内)喂给BERT处理。
- 这假设任务不依赖于全局理解,而只需关注局部相关信息。