解析Transformer中的位置编码 -- ICLR 2021

描述

引言

Transformer是近年来非常流行的处理序列到序列问题的架构,其self-attention机制允许了长距离的词直接联系,可以使模型更容易学习序列的长距离依赖。由于其优良的可并行性以及可观的表现提升,让它在NLP领域中大受欢迎,BERT和GPT系列均基于Transformer实现。鉴于Transformer在NLP问题上的优异表现,也有越来越多人将其引入到了CV领域。

和RNN、CNN等模型不同,对于Transformer来说,位置编码的加入是必要的,因为单纯的self-attention机制无法捕捉输入的顺序,即无法区分不同位置的词。为此我们大体有两个方式:(1)将位置信息融入到输入中,这构成了绝对位置编码的一般做法;(2)将位置信息融入self-attention结构中,这构成了相对位置编码的一般做法。

本次Fudan DISC实验室将分享ICLR 2021中关于Transformer和其位置编码的3篇论文,介绍研究人员从不同角度和场景下对Transformer和其位置编码的研究。

文章概览

重新思考语言预训练中的位置编码

Rethinking the Positional Encoding in Language Pre-training

论文地址: https://openreview.net/forum?id=09-528y2Fgf

本文针对BERT提出了一种新的位置编码方法—Transformer with Untied Positional Encoding(TUPE),它通过两种方法改进了现有的方法,即解开单词和位置之间的相关性,以及解开序列位置上的[CLS]。大量实验表明,TUPE具有较好的性能。

DEBERTA:带有解耦注意力的解码增强BERT

DeBERTa: Decoding-enhanced BERT with Disentangled Attention

论文地址: https://openreview.net/forum?id=XPZIaotutsD

本文提出了两种改进BERT预训练的方法:第一种方法是分散注意机制,该机制使用两个向量分别对每个单词的内容和位置进行编码来表示每个单词,并使用分散矩阵计算单词之间在内容和相对位置上的注意力权重;第二个方法是一个增强的掩码解码器,它取代了输出的Softmax层来预测用于MLM预训练的掩码令牌。使用这两种技术,新的预训练语言模型DeBERTa在许多下游NLP任务上表现都优于RoBERTa和BERT。

把图片当作16乘16的词:用于大规模图像识别的Transformer

An Image Is Worth 16X16 Words: Transformers for Image Recognition at Scale

论文地址: https://openreview.net/forum?id=YicbFdNTTy

本文提出在视觉任务中的Transformer—Vision Transformer(ViT)。图像对卷积神经网络的依赖不是必要的,并且将纯transformer直接应用于图像patch序列可以很好地执行图像分类任务。本文的实验表明,当对大量数据进行预训练并将其传输到中等大小或较小的图像识别基准时,与最先进的卷积网络相比,ViT可获得出色的结果,同时训练所需的计算资源也大大减少。

论文细节

1

编码

动机

因为 Transformer 在结构上不能识别来自不同位置的 token,一般需要用 positional embedding 来辅助。最简单的做法就是在 input token embedding 上直接加 positional embedding (NSP loss现在基本不用,所以这里不再考虑 segment embedding)。然后在 Transformer 的 self-attention 里,会把 input 用三个矩阵映射到不同的空间,Q,K,V,接着把 Q 和 K 做点积,过 softmax ,得到 attention 的 weight 。因此,在第一层 Transformer 的 QK 点积 ,我们可以得到:

编码

其中 是self attention matrix在进行softmax之前第i行第j列的元素,代表第i个token对第j个token的注意力大小, 是 token embedding,是position embedding,、是映射Q和K所用的矩阵。作者认为代表token和position的交叉的中间两项没有给self attention做出贡献,为了验证该想法,作者对展开后的四项进行了可视化,如Figure 2所示,可以看到中间两项看起来很均匀,说明position 和 token 之间确实没有太强的关联。

编码

同时,作者认为 token 和 position 用了相同的矩阵做 QKV 的变换。但 position 和 token 所包含的信息不一样,共享矩阵也不合理。

方法

为了解决上述问题,作者将self attention做了如下改动:

编码

其中,、是把 positional embedding 映射到 Q 和 K 所用的矩阵,分母中的根号 2d 是为了保持量纲。简单来说,作者去掉了 position 和 token 之间的交叉,同时用了不同的变换矩阵。需要注意的是,在多层的 Transformer 模型里,比如BERT,上面式子的第二项在不同层之间是共享的。因此,这里仅需要算一次,几乎没有引入额外的计算代价。

作者还提出,在上述的公式中,可以再添加一个与相对位置相关的偏置项,即

编码

作者在文中使用了T5文章中提出的相对位置编码。

另外,作者还特殊处理了 [CLS] token 的 position,使其不会因 positional locality 而忽略了整个句子的信息。具体来说,在的第二项,即与位置相关的注意力计算中,作者将[CLS] 对其他token的注意力以及其他token对[CLS]的注意力额外引入了两个参数,这两个参数与位置信息无关,是一个可学习的标量,这样就完成了和[CLS]相关注意力的计算。

编码

编码

模型整体的架构如下

编码

实验

作者首先使用TUPE模型以类似BERT的方式进行预训练,然后在GLUE数据集下进行微调。其中-A代表仅使用了绝对位置编码,-R代表在绝对位置编码的基础上增加了相对位置编码(即偏置项)。mid表示训练了300k步的中间结果,tie-cls代表移除对[CLS]的特殊处理,d代表为词和位置使用不同的投影矩阵。

编码

结果表明,添加相对位置信息对下游任务效果有一定提升;TUPE模型的效果持续优于BERT模型的效果;TUPE仅训练300k-step(30%)的结果已经可以和BERT等模型的效果相比较;对[CLS] token的特殊处理和使用不同的投影矩阵均可以增加模型性能。

分析

作者最后对TUPE和BERT的预训练过程进行了分析,结果表明,TUPE不仅最后比 baseline 要好,并且可以在 30% (300k-step) 的时候,就达到 baseline 在 1000k-step 时的效果。

编码

最后作者还对TUPE学习到的多个head得到的注意力矩阵进行了可视化,作者发现,不同的head捕捉到了不同的注意力模式,作者还对下图中的几种进行了命名,如 attending globally; attending locally; attending broadly; attending to the previous positions; attending to the next positions 等。

编码

2

编码

动机

和上一篇文章类似,文章也是对self attention的结构进行了重构,与上篇文章不同的是,文章直接从相对位置出发,认为在一个序列中的第i个token可以用两个向量对其进行表示,分别是 和 ,分别代表了该token的内容信息和相对第j个token的相对位置信息。那么第i个token和第j个token的注意力计算可以拆解为如下公式:

编码

那么注意力可以解耦成四个部分,分别是内容和内容、内容和位置、位置和内容、位置与位置。作者认为第四项相对位置和相对位置的交叉无法给注意力提供有效信息,可以舍弃,因此作者提出了解耦注意力机制。

同时,作者认为现有的预训练、微调模式存在一些GAP,首先它们的任务不同,预训练阶段是直接预测被MASK掉的token,微调阶段是拿句子表示再添加额外的网络层去完成下游任务,为了弥补这种GAP,作者提出了解码增强的BERT。

方法

为了解决上述问题,作者将self attention做了如下改动:

编码

在解耦注意力中,作者抛弃了位置与位置部分,并且认为内容和位置的投影矩阵是异质的,因此引入了新参数 和 ,其中 P是跨所有层共享的相对位置嵌入向量。其中 函数的定义如下:

编码

该函数定义了token之间的相对距离,计算token之间的注意力机制的时候,将通过该公式计算token和token之间的相对距离矩阵,则相对位置向量则可以通过事先定义的embedding层取出。作者还提出了一种计算解耦注意力的高效算法,可以有效地减小空间复杂度。

上述的注意力计算中中仅包含了相对位置信息,作者认为只有相对位置也不好,最好能把绝对位置信息也加进去,作者给了两张添加的方式。第一种方式是在输入的时候,把绝对位置信息添加到输入的token embedding中;第二种方式是在最后一两层再添加到前面那些层输出的隐向量中。

考虑到BERT等预训练模型在预训练和微调时不一样,预训练的时候,bert的输出经过softmax后,直接给出概率。微调的时候,bert的输出会经过一些与任务相关的decoder。作者将掩码语言模型(MLM)视为任何微调任务,并添加一个任务特定解码器,该解码器被实现为两层 Transformer 解码器和 Softmax 输出层,用于预训练。所以作者这里将预训练和微调的模型尽可能相近,模型共有13层,前11层称为encoder,后2层参数共享,称为decoder,然后微调的时候,前12层保留,然后和bert一样进行各类任务的微调。

实验

作者按照 BERT 的设置预训练DeBERTa,和BERT不同的是,作者使用了 BPE 词汇表。对于训练数据,作者使用 了 Wikipedia(English Wikipedia dump;12GB)、BookCorpus(6GB)、OPENWEBTEXT(public Reddit content;38GB)和 STORIES(CommonCrawl 的子集;31GB)。重复数据消除后的总数据大小约为 78GB。我们使用 6 台 DGX-2 机器和 96 个 V100 GPU 来训练模型。单个模型训练,batch size 设置为 2K,1M 的 steps,大约需要 20 天的时间。

作者将预训练好的模型在GLUE数据集上进行微调,表 1 显示,与 BERT 和 RoBERTa 相比,DeBERTa 在所有任务中始终表现得更好。同时,DeBERTa 在八项任务中有六项优于 XLNet。特别是,MRPC(1.7% 超过 XLNet,1.6% 超过 RoBERTa)、RTE(2.2% 超过 XLNet,1.5% 超过 RoBERTa)和 CoLA(0.5% 超过 XLNet,1.5% 超过 RoBERTa)的改进非常显著。

编码

作者还使用了其他数据集来评估 DeBERTa,分别是(1)问答:SQuAD v1.1、SQuAD v2.0、RACE、ReCoRD 和 SWAG;(2)自然语言推理:MNLI;(3)NER:CoNLL-2003。为了进行比较,他们还将 Megatron 分为三种不同的模型尺寸:Megatron 336M、Megatron 1.3B 和 Megatron 3.9B,它们使用与 RoBERTa 相同的数据集进行训练。与之前的 SOTA 模型(包括 BERT、RoBERTa、XLNet 和 Megatron336M)相比,DeBERTa 在这 7 项任务中的表现始终更优。尽管 Megatron1.3B 是 DeBERTa 的 3 倍大,DeBERTa 在四个基准中的三个方面仍然可以超过 Megatron1.3B。结果表明,在不同的下游任务中,DeBERTa 算法都具有较好的性能。

编码

作者还对DeBERTa进行了消融实验,-EMD 是没有增强解码器的DeBERTa模型。C2P 是没有内容-位置项的DeBERTa模型。P2C 是没有位置-内容项的DeBERTa模型。作者发现删除 DeBERTa 中的任何一个组件都会导致所有基准测试的性能下降。

编码

最后作者还研究了注意力机制模式和预训练模型的有效性。结果表明,在预训练的训练过程中,DeBERTa 的表现一直优于 RoBERTa-ReImp,并且收敛速度更快。

3

编码

动机

本篇文章跟位置编码的关系不是特别大,但文章将Transformer在图像识别领域中完全代替了卷积神经网络。近年来,Transformer已经成了NLP领域的标准配置,但是CV领域还是CNN(如ResNet, DenseNet等)占据了绝大多数的SOTA结果。最近CV界也有很多文章将transformer迁移到CV领域,虽然已经有很多工作用self-attention完全替代CNN,且在理论上效率比较高,但是它们用了特殊的attention机制,无法从硬件层面加速,所以目前CV领域的SOTA结果还是被CNN架构所占据。文章不同于以往工作的地方,就是尽可能地将NLP领域的transformer不作修改地搬到CV领域来。

方法

NLP处理的语言数据是序列化的,而CV中处理的图像数据是三维的(长、宽和channels)。所以需要一个方式将图像这种三维数据转化为序列化的数据。文章中,图像被切割成一个个patch,这些patch按照一定的顺序排列,就成了序列化的数据。作者首先将图像分割成一个个patch,然后将每个patch reshape成一个向量,得到所谓的flattened patch。

作者对上述过程得到的flattened patches向量做了Linear Projection,这些经过线性映射后的向量被称为 patch embedding(类似word embedding),一个255乘255像素的图片,每隔16乘16个像素进行分割,则这些图片可以被当做16乘以16的词拼在一起。作者也为这些patch添加了位置信息,因为按照特定顺序的patch是需要具备位置信息的,作者采取了常见的绝对位置编码,给每个位置的patch学习一个位置编码向量。

编码

为了给图像进行分类,作者也借鉴BERT在第一个patch前添加了[CLS] patch,该patch经过Transformer后的hidden vector被用于对图形进行分类的特征。

文中还提出了一个比较有趣的解决方案,将transformer和CNN结合,即将ResNet的中间层的feature map作为transformer的输入。和之前所说的将图片分成patch然后reshape成sequence不同的是,在这种方案中,作者直接将ResNet某一层的feature map reshape成sequence,再通过Linear Projection变为Transformer输入的维度,然后直接输入进Transformer中。

到下游任务微调时,如果图像的分辨率增大时(即图像的长和宽增大时),如果保持patch大小不变,得到的patch个数将增加,即序列长度将增加。但是由于在预训练的时候,position embedding的个数和pretrain时分割得到的patch个数相同。因此超出部分的positioin embedding在模型中是未定义或者无意义的。为了解决这个问题,文章中提出用2D插值的方法,基于原图中的位置信息,将pretrain中的position embedding插值成更多个,这样有利于位置编码在面对更高分辨率图片微调时可以更好地收敛。

实验

作者使用提出的模型,即VIT,做了大量实验。实验的范式遵循预训练-微调模型,现在某个数据集下使用大量有标签的图片进行预训练,然后再在某个数据集下进行微调。下表中最上面一行指的是预训练用的数据集,最左边一列指的是微调使用的数据集。ViT-H/14指的是,使用了ViiT-Huge模型的设置,并且patch的size是14乘14的。Noisy Student是ImageN上的SOTA,BiT是其余任务上的SOTA。

可以看到,在JFT数据集上预训练的ViT-L/16性能比BiT-L(也是在JFT上进行预训练)更好。模型更大一点的ViT-H/14性能进一步提升,尤其是在更具挑战性的任务上,如ImageNet、CIFAR-100和VTAB,且所需的计算资源依旧远小于之前SOTA。在I21K上预训练得到的ViT-L/16性能也非常不错,需要的计算资源更少,在8TPU上训练30天即可。

编码

作者进一步使用可视化的结果分析了使用不同预训练数据集和不同复杂度模型的情况下,下游任务的表现。作者发现,在预训练数据集比较小的情况下,大模型(ViT-L)性能还是不如小模型(ViT-B);当预训练数据集比较大的情况,大模型效果会更好。作者得出的结论是,在小数据集上,卷积的归纳偏置是是非常有用的,但在大数据集上,直接学relevant pattern就够了,这里的relevant pattern应该指的是patch和patch之间的相关模式。

编码

总结

此次 Fudan DISC 解读的三篇论文围绕Transformer以及位置编码展开。对于序列来讲,位置编码的影响十分重要,词和句子的位置信息对语义的影响是巨大的,如何在Transformer模型中有效地融合位置信息是十分重要的。

编辑:jq

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分