Longformer解读: The Long-Document Transformer
文章目录
Longformer要解决什么问题
- 原始transformer有O(n^2)时间空间复杂度(根据attention的公式,每个位置的Query都需要关注每个位置的Key),n是输入文本的长度。长文档时,原始transformer的复杂度太高。对于长文档,通常做法切分文档(单块限制在512内)切分的文档之间没有交互信息,这样损失了很多有用信息。
Longformer怎么解决
- 如下图,a代表原始Transformer的注意力, b代表固定窗口的注意力,c代表跳跃滑动窗口的注意力,d代表全局加滑动窗口的注意力。图中深绿色面积代表Query的数量,浅绿色面积代表Query需要关注的Key的数量,可以看出原始的注意力复杂度是正方形整块面积,复杂度就是平方,其他复杂度都是线性的。之后我们分三方面分别介绍三种模式的注意力。
- 从实验图中可以看出,空间复杂度明显提升。
固定窗口
- 固定窗口就是如图a,每个位置的Query只关注相邻的w个位置的Key。这个类似于CNN的窗口的概念。计算复杂度就直接变成了w * n, 由于w可以设置的比较小,所以,复杂度变成了线性。这个更加适合浅层捕获局部信息。
跳跃滑动窗口
- 跳跃滑动窗口就是如图b,每个位置的Q关注的K还是W个,但是W个不是连续的而是跳跃的。定义跳跃的间隔是d, 那么Q关注的K的范围就是w * d。跳跃的attention的关注的视野会更大,对于深层更加适合捕获长途信息。
全局注意力
- 全局注意力就和普通的transformer是一样的,都是关注全部的K。全局的注意力是上面两种注意力的补充,为了捕获全局的信息。主要用于特殊的位置,比如Bert的[cls]这个位置。由于全局注意力复杂度比较高,需要谨慎使用,在不同任务上需要不同设置。比如QA任务中,问题答案都是连接到了一起,Q都需要用全局注意力,因为答案很多,用局部注意力是看不全答案的。
- 线性映射(linear proj): 论文提出两套映射矩阵,一套用于基于窗口的局部自注意力,另一套用于全局注意力。实验结果证明两套参数能更好处理两种类型不同的注意力。
实现细节
- 稀疏矩阵:所有存储都是用稀疏矩阵,如果值为0,都跳过计算,提高计算效率。
- 矩阵乘法:跳跃滑动窗口比较特殊,不能直接使用高效的矩阵乘法。作者自己实现了基于Cuda的高效算法。
- 训练技巧:阶段式的训练方式,序列长度和窗口大小逐步提
高,窗口大小和序列长度增加一倍,并将学习率减半。这样可以加快训练速度。
实验结果
实验自回归语言模型
- 模型采用字符级别的自回归语言模型。数据集用的是text8和enwik8 。
- 在小的模型上 (12 层, 512 hidden_size) ,long former比其他模型都要好。
- 在大的模型上(30 层, 512 hidden_size) ,比18层的transformer_xl要好,跟第二个和第三个齐平,不如第4、5。(4、5不适合预训练、微调模式)
text8的消融实验
- 实验设置:在 text8 任务中,使用小模型训练150K步。
- 结论1: 由底层至高层递增窗口大小,可提升性能;递减则反而性能降低。
- 结论2: 有跳跃窗口的效果比没有跳跃窗口的效果要好。
WikiHop的消融实验
- 长文本表现明显高于roberta
- 可以看出没有线性映射的效果明显下降
- 没有全局注意力效果也是明显下降
- 当用RoBERTa-base(seqlen: 512, attention n*n)的准确率比较低,也说明效果的提升不是来自于额外的预训练,而是模型结构的改进。
Qa任务
- 效果全面领先roberta。