与reformer都是解决长序列问题:
Longformer在两个字符级语言建模任务上都取得了SOTA的效果。并且作者用Longformer的attention方法继续预训练RoBERTa,训练得到的语言模型在多个长文档任务上进行fine-tune后,性能全面超越RoBERTa
由于self-attention机制,无法处理长序列,用reformer里面的例子就是:计算量与句子长度的平方成正比,比如64K个token的句子,经过self-attention之后用float32存储需要16GB。
提出:随序列长度线性增加的注意力机制,将a local windowed attention(局部窗口注意力---构建上下文表示)与task motivated global attention(任务驱动全局注意力---用于构建预测的完整序列表示)结合。
定义了某种形式的稀疏注意力模式,避免了计算全部的注意力矩阵,与这种方法相似的是Sparse Transformers,使用8*8的Dilated(空洞)滑动窗口。
处理长文本的一些方法:
- Bert直接截取最多512个token进行处理;
- 把文档分割成512个token大小的块,分开处理,然后将activations与特定的任务结合起来此文;
- 使用两阶段模型,第一阶段检索相关文档,第二阶段进行答案提取;
所有的两阶段的方法都会因为截断(truncating)或则分块(chunking)而丢失信息,Longformer可以处理长序列而不用截断或分块。
Longformer
根据一种“attention pattern”来稀疏化full self-attention矩阵,该模式指定了一对相互注意的输入位置。
Attention Patten
Sliding Window(滑动窗口)
滑动窗口attention,即对每个token采用固定大小的窗口计算局部attention
固定的窗口大小为,每个token计算其两边各个tokens。计算的复杂度为,计算的规模随序列长度线性增加。Transformer的层数为,最顶层的receptive field的大小为,可以根据效率和模型的表达能力调整的值。具体实现的时候,设置的窗口大小。Longformer并不轻量。
Dilated Silding Window(空洞滑动窗口)
为了进一步增加receptive field而不增加计算量,可以使窗口为空洞的(从图可以看出,深蓝色的个数不变,但是范围增加了,即receptive field)。
其中,空洞的间隙为(运气:空洞的地方信息不重要!),假设和在每层都固定,receptive field的大小为;
Global Attention
sliding window attention和dilated window attention不够灵活,无法学习到基于特定任务的表示,因此对一些少数位置进行Global attention计算,即对整个序列都计算attention,并且计算attention具有对称性。
这些少数位置如何确定呢?其实要根据具体的任务决定。
在分类任务上,这个Global attention就在[CLS]的位置;而在QA任务上,就在整个问句上计算Global attention。计算Global attention的位置很少,所以复杂度还是
Autoregressive Language Modeling
- 每层使用不同的window size, 底层w较小,高层w越高,这样做使得高层更专注于获得更多的全局表达、底层更专注于局部attention,同时也平衡了效率和性能。
- 只对高层encoder的两个head使用dilated sliding window。
在Tensorflow和pytorch的原始实现中,并没有用于计算滑动窗口attention的专门的实现,因为这个实现需要实现矩阵乘积且只要对角线的位置的非0值需要存在内存里。
而如果用for循环又异常的慢。所以用high-level的python struct描述了这种算法,并基于TVM生成了可以在GPU上编译的代码。官方代码
reference
《Longformer: The Long-Document Transformer》论文笔记
Longformer详解