电商企业网站建设方案,网站建设网站制作价格,内蒙古银税互动平台,wordpress apk源码文章目录 一、完整代码二、论文解读2.1 介绍2.2 Longformer注意力模式注意力计算 2.3 自回归语言模型注意力模式训练结果 2.4 预训练和微调注意力模式位置编码预训练结果 2.5 Longformer-Encoder-Decoder (LED) 三、整体总结 论文#xff1a;Longformer: The Long-Document Tr… 文章目录 一、完整代码二、论文解读2.1 介绍2.2 Longformer注意力模式注意力计算 2.3 自回归语言模型注意力模式训练结果 2.4 预训练和微调注意力模式位置编码预训练结果 2.5 Longformer-Encoder-Decoder (LED) 三、整体总结 论文Longformer: The Long-Document Transformer 作者Iz Beltagy, Matthew E. Peters, Arman Cohan 时间2020 地址https://github.com/allenai/longformer 一、完整代码
这里我们使用python代码进行实现
# 完整代码在这里
# https://github.com/allenai/longformer二、论文解读
论文中有大量的文字性描述不太好看可是当我真正理解其意思后感觉也画不了多少图好像怪不了作者
2.1 介绍
限制于Transformer-based model的局限性无法处理过长的文本序列为了解决这一个问题作者提出了一个处理长文本序列的模型Longformer该模型利用特殊的注意力机制将内存和计算量从平方转化为线性
Transformer利用自注意力机制在广泛的自然语言处理任务中取得了先进的成果这种成功部分是由于自注意成分它使网络能够从整个序列中捕获上下文信息但是这种处理方式有一个缺点内存和计算量是随着序列的长度成平方次增长这导致在长序列任务中内存和计算需求特别高实际上是不可行的
为了解决这个问题作者提出了Longformer模型该模型在transformer的基础上进行了修改使用了独特的注意力机制使注意力机制的规模不是随序列长度平方增长而是线性增长这样就可以处理长序列任务了
有人可能会奇怪长序列任务AR语言模型不能做吗例如transformer-xl可以充分利用记忆力机制和循环来生成优化但是这里要注意的是AR模型是单向的只有两种方式一个是从左到右一个是从右到左 因此要充分结合上下文信息AR模型是行不通的而对应的attention matrix采取的ltr方式是行不通的所以我们采用sparse方式构造注意力矩阵
Longformer的注意力机制是局部窗口和全局注意力的结合局部窗口注意力主要用于构建上下文表示而全局注意允许Longformer构建用于预测的全序列表示适用于特定的任务
sparse源于Sparse-Transfomer其使用了BlockSparse类似的尺寸为8*8的膨胀滑动窗口如下图的c 图采取的方式一样但是Longformer为了使某些token具有全局代表性预测能力对某些使用了全局注意力机制得到最后的结果便是d 图 现在有许多的特定任务模型采取了一些措施去绕过像BERT一样的预训练语言模型的512 tokens的限制去处理长序列文档其不外乎以下几种方法
直接将长文本截断将长文本分成长度都是512 tokens的小块然后结合各个小块处理后的结果使用两阶段模型第一阶段检索出相关的文档第二阶段结合第一阶段的文档提取出答案这适用于答案有多次跳越和开放领域的QA任务
两阶段模型来源于[2004.06753] A Simple Yet Strong Pipeline for HotpotQA (arxiv.org)其具体采取的方法如下 以上的三种处理方法都会因为截段或者阶段检索错误而导致信息不完整出现损失相比之下Longformer直接对文本进行处理不会出现损失
那么Longformer是如何获取全局信息的呢其类似于CNN模型的感受野 如图虽然说在最底层a1和a5没得信息交流的作用但是在c 层中的c1a1和a5间接形成了交流虽然不如Full attention强烈但是总是有效果的
2.2 Longformer
注意力模式
其使用的注意力模式包括了前面的三种结合前面的三种就是Longformer采取的注意力模式就是第四种模式 滑动窗口类似于CNN给定一个固定的窗口大小w每个token关注左右两边的 1 2 \frac{1}{2} 21个w的token计算度从n*n降低为n*w如果每层的w是固定的则顶层的接受域大小为l*w可以根据应用的不同可以在不同的层使用不同的w值来在效率和模型表示能力之间保持一个良好的平衡
膨胀滑动窗口为了在不增加计算量的情况下进一步的提升感受野可以通过把滑动窗口进行膨胀的方式来处理假设点与点之间的间隙为d接受域就变成了l*w*d这样的话即使计算量很小也可以拥有很大的接受域我们可以通过在多头注意中对每个头部配置不同的扩张设置允许一些没有扩张的头部关注局部环境而其他有扩张的头部关注更长的环境从而提高了性能就相当于不同大小的核的CNN
全局注意在类似于BERT的语言模型处理自然语言任务时其输入表示又任务的不同而发生变化例如BERT在文本分类中使用cls在其他任务中cls并没有多大用处例如MLM机制利用上下文来预测masked token这些都是根据任务的不同而改变了输入的表示在Longformer中滑动窗口和膨胀滑动窗口都收到了一定的限制其不如全局注意力有那么强的表示能力我们可以在少数预先的位置添加全局注意同时对称化全局注意的token要关注所有的token同样的所有的token都要关注全局注意的token例如在分类任务中对CLS标记使用全局注意而在QA任务中对所有问题标记提供全局注意。由于这类标记的数量相对于n较小且与n无关因此局部和全局注意力组合的复杂性仍然是O (n);
注意力计算
Linear Projections for Global Attention
transformer的注意力机制计算如下 在这里由于我们使用了局部注意力和全局注意我们需要两种投影 Q s , K s , V s Q_s,K_s,V_s Qs,Ks,Vs去建立滑动窗口构造局部注意力 Q g , K g , V g Q_g,K_g,V_g Qg,Kg,Vg构造全局注意额外的投影为建模不同类型的注意力提供了灵活性我们表明这对于下游任务的最佳表现至关重要。 Q g , K g , V g Q_g,K_g,V_g Qg,Kg,Vg使用 Q s , K s , V s Q_s,K_s,V_s Qs,Ks,Vs的值初始化
在常规的transformer模型中 Q K T QK^T QKT由于维度都是 n n n需要计算 n ( o 2 ) n(o^2) n(o2)次而在Longformer中膨胀滑动窗口注意只需要计算出一个固定数量的 Q K T QK^T QKT对角线只需要计算 n ( o ) n(o) n(o)次而在常规的pytorch/tensorflow中是无法直接计算的实现它需要一种带状矩阵乘法的形式这在现有的pytorch/tensorflow中是不支持的
在论文中讲解了三种不同的实现方式
Longformer-loop一种在循环中分别计算每个对角线的简单实现。它的内存效率很高因为它只计算非零值但它的速度慢得难以使用。我们只使用它来进行测试因为它很容易实现但不使用它来运行实验。Longformer-chunks只支持非膨胀的滑动窗口。它将 Q Q Q和 K K K块分割成大小为 w w w的重叠块和大小为 1 2 w \frac{1}{2}w 21w的重叠块乘以这些块然后掩蔽对角线。这是非常高效的计算效率因为它使用了来自PyTorch的单个矩阵乘法运算但它消耗的内存是一个完美优化的实现应该消耗的内存的2倍因为它计算了一些零值。由于计算效率这种实现最适合于预训练/微调的情况Longformer-cuda使用TVM实现的自定义CUDA内核它是我们注意力的一个功能齐全的实现没有Longformer-chunks的限制是记忆效率最高的和高度优化的完全自我注意力一样快由于内存效率允许最长的序列和扩展的支持主要将此实现用于自回归语言建模实验 上图是三种处理方式在Time和Memory上的对比
2.3 自回归语言模型
注意力模式
在自回归语言模型中我们使用膨胀滑动窗口注意力并且在不同的层使用不同大小的size一般来说在较低的层使用较小的尺寸较高的层使用较大的尺寸这允许顶层学习整个序列的高级表示而让较低的层捕获本地信息。此外它还提供了效率较小的窗口大小由于非零值更少而计算成本更低和性能较大的窗口大小具有更丰富的表示能力并经常导致性能改进之间的平衡一般不能在底层使用膨胀滑动窗口注意力去学习和利用局部上下文在高层时也只用很少的两个头去实施膨胀滑动窗口注意这使得模型能够在不牺牲本地上下文的情况下直接关注遥远的标记
训练
理想情况下我们可以直接使用GPU内存中可以容纳的最大窗口大小和序列长度来训练我们的模型。然而我们发现在学习使用更长的上下文之前该模型需要大量的梯度更新来首先学习局部上下文。为了适应这一点论文采用了一个阶段训练程序在多个训练阶段增加注意窗口的大小和序列长度。在第一阶段首先从一个较短的序列长度和窗口大小开始然后在随后的每个阶段我们将窗口大小和序列长度增加一倍并将学习率减半。这使得训练更加快速同时保持慢速部分最长的序列和窗口大小到最后。训练模型一共经历了5个阶段起始序列长度为2048结束序列长度为23040
每个阶段的详细配置以及所有其他超参数如下 结果
BPC bits-per-character相当于困惑度PPL(Perplexity)区别在于BPC是字符层面而PPL可以是char也可以是wordBPC越小模型越好
PPL的计算公式如下 P P L ( s t r i n g ) P ( w 1 w 2 … w n ) − 1 n 1 P ( w 1 w 2 … w n ) n ∏ i 1 n 1 P ( w i ∣ w 1 w 2 … w i − 1 ) n PPL(string)P(w_1w_2\dots w_n)^{-\frac{1}{n}}\sqrt[n]{\frac{1}{P(w_1w_2\dots w_n)}}\sqrt[n]{\prod_{i1}^{n}\frac{1}{P(w_i|w_1w_2\dots w_{i-1})}} PPL(string)P(w1w2…wn)−n1nP(w1w2…wn)1 ni1∏nP(wi∣w1w2…wi−1)1 BPC的计算公式如下 B P C ( s t r i n g ) 1 T ∑ t 1 T H ( P t , P ^ t ) − 1 T ∑ t 1 T ∑ c 1 n P t ( c ) l o g 2 P ^ t ( c ) − 1 T ∑ t 1 T l o g 2 P ^ t ( x t ) l o g 2 ( P P L ) BPC(string)\frac{1}{T}\sum_{t1}^TH(P_t,\widehat P_t)-\frac{1}{T}\sum_{t1}^T\sum_{c1}^nP_t(c)log_2\widehat P_t(c)-\frac{1}{T}\sum_{t1}^Tlog_2\widehat P_t(x_t)log_2(PPL) BPC(string)T1t1∑TH(Pt,P t)−T1t1∑Tc1∑nPt(c)log2P t(c)−T1t1∑Tlog2P t(xt)log2(PPL) 我们用长度为32,256的序列进行评估将数据集分成步长为512大小为32,256的重叠序列对每一个序列的最后512tokens进行评估模型的表现如下 小模型在两个数据集中达到了最优的效果而大模型在参数量是其一半的情况下差距不是特别大 通过消融实验可以发现w从32到512进行变化和在两个头使用膨胀滑动窗口可以有效的提升模型的性能
2.4 预训练和微调
类似于BERT的预训练模型在许多NLP任务上表现非常出色为了突破tokens的限制这里利用Longformer在一个文档语料库上对其进行了预训练并将其调整为6个任务包括分类、QA和共指消解这里共指消解表示的是识别一段文本中指向同一个实体(Entity)的不同表述(Mention)而提出的一项技术得到的模型处理的token数量是基础BERT的6倍能处理4096个tokens
这里使用的是RoBERTa的预训练机制模型不需要改变直接插入进行预训练
注意力模式
我们使用窗口大小 w w w为512的滑动窗口注意与RoBERTa的计算量相同 位置编码
使用的是和BERT一样的learned absolute position直接像token embedding一样做一个position embedding不过这里不是对token而是对range采取embedding
在这里为了支持较长的文档我们添加了额外的位置嵌入来支持4,096位的位置编码利用RoBERTa的预先训练的权重而不是随机初始化新位置嵌入使用复制初始化除了分区边界外任何地方都保留这个结构。尽管它很简单但这是一个非常有效的方法允许Longformer预训练通过少量的梯度更新从而快速收敛
预训练
和RoBERTa一样Longformer也训练了两种不同尺寸的模型且两种模型规模与RoBERTa一致两种模型都进行了65K次梯度更新序列长度为4096批处理大小为64 2 18 2^{18} 218个tokens最大的学习率为3e-5500步的linear warmup3次多项式衰减其余的超参数与RoBERTa相同 可以看到copy position embeddings可以显著的加快收敛通过冻结RoBERTa的Weights去训练位置编码相较于直接复制BPC只降低了0.1左右这也同样证明了copy position embeddings的必要性
结果
通过三种任务上的训练结果我们可以发现Longformer的效果是始终高于RoBERTa的这说明Longformer在长序列文档上是一个优秀的替代同时根据数据集上下文长度观察提升幅度较小的往往都是上下文长度较小的数据集 同时论文还评估了Longformer-large在长上下文QA任务上的性能 可以发现除了HotpotQA外都取得了显著的提升这里我们再来分析HotpotQA 从图中可以得到排在Longformer前面的模型为ETCGSANHGN这些模型都使用了GNNs或者实体图网络graph network of entities这似乎能够为任务去编码一个重要的归纳偏差并有可能进一步改善我们的结果除此之外Longformer优于所有的其他类型的方法
最后我们进行消融实验分析 所有的实验都使用了Longformer-base除了声明以外的参数其他的保持一致并且都微调了5 epochs当使用Longformer(seqlen: 512, and n 2 n^2 n2 attention)去对比RoBERTa时可以发现效果要稍微差一点说明其他模型效果的提高不是由于额外的预训练造成的当使用RoBERTa模型的参数并只训练额外的位置嵌入时性能略有下降这表明Longformer可以在大型训练数据集如WikiHop的微调中获取远程上下文
2.5 Longformer-Encoder-Decoder (LED)
普通的transformer模型是一个encoder-decoder架构用于seq2seq任务例如总结或者翻译虽然说只包含encoder的模型在许多的NLP任务上非常有效但是完整的encoder-decoder在seq2seq上更加有效
LED架构是通过localglobal attention的encoder和full self-attention的decoder构成的由于对LED的预训练过于昂贵使用BART来初始化LED的参数并在层数和隐藏层大小上保持相同的结构唯一的区别是处理更长的序列BART是1k tokens这里是16k tokens采用类似于对RoBERTa操作使用复制和重复BART位置嵌入矩阵的方式初始化了新的位置嵌入矩阵一共复制了16次LED分为base和largebase是6层 large是12层
模型结果如下所示 可以发现LED在arXiv上取得了SOTA同时可以发现序列长度越长模型的结果越好表明处理较长输入的能力显著提高了结果
三、整体总结
论文中提出了三种模型一种是类似于BERT利用滑动窗口注意和全局注意处理长文本序列一种类似于GPT利用膨胀滑动窗口注意抓取上下文获取长文本序列一种是 Longformer-Encoder-Decoder(LED)利用类似于BERT的机制做encoder利用全注意力机制做decoder的seq2seq架构在arXiv上超过了bigbird取得了SOTA