论文阅读笔记:DEBERTA: DECODING-ENHANCED BERT WITH DISENTANGLED ATTENTION

448 阅读9分钟

这个博客至今为止都在水一些对基础论文的解读,现在突然开始读Deberta,可以说是非常野蛮了。但奈何接下来的工作要用到,感觉有些工作确实不看论文搞不懂了,也是这两年太摆烂,都没注意Kaggle已经被Deberta统治了,可惜这模型还没有中文预训练,暂时只能拿来打打外国比赛,做做外文任务了。

介绍

文章开篇就讲了Deberta的两种新技术:a disentangled attention mechanism, and an enhanced mask decoder.

首先是Disentangled attention,这个翻译的话叫做“分散注意力”。在Bert中,每个单词输入表示为该词语的词向量和位置编码的相加;但是在Deberta中将这两个编码向量解绑了,每个单词都分别用这了两个向量单独表示,并分别使用基于其的解纠缠矩阵计算注意力权重。一对词语的注意力权重不仅取决于它们的内容,而且取决于它们的相对位置。例如,当单词“deep”和“learning”相邻出现时,它们之间的依赖性要比在不同的句子中出现时强得多。

然后是Enhanced mask decoder,是一种强化的对mask解码的技术。Deberta使用了类似Bert的MLM与训练任务,把上下文词语的内容和位置信息都用在MLM中。先前的Disentangled attention已经考虑了词语之间的相对位置,但没有考虑到同等重要的绝对位置。所以Deberta在MLM任务的最终的softmax层之前集成了一层绝对位置嵌入,这样一来,相对位置、绝对位置和上下文词语都将成为Mask解码的重要依赖。

除此之外文中还提出了一种新的虚拟对抗方法来做下游任务的fine-tune,这一方法有效提高了模型的泛化能力。

Deberta架构

基于位置信息和内容的注意力权重

跳过对Transformers和MLM的历史辉煌进行阐述的环节,直接来看架构。对于序列中位于i的token,分别使用两个向量{Hi{H_i}}与{Pij{P_{i|j}}}来表示内容和相对j的位置信息。那么,对于i和j的交叉注意力评分的计算为:

Ai,j={Hi,Pij}×{Hi,Pij}TA_{i,j} =\{H_i,P_{i|j}\} × \{H_i,P_{i|j}\}^T
=HiHjT+HiPjiT+PijTHj+PijPjiT=H_i{H_j}^T + H_i{P_{j|i}}^T + {P_{i|j}}^TH_j + {P_{i|j}}{P_{j|i}}^T

没写过毕业论文以外的paper,我到现在都习惯不了latex,上面这行把我折腾的不轻。 不过公式本身其实挺好懂,类似内积计算一样,让两组向量两两计算向量乘积得到一个这两个词之间的注意力分数。

现有的相对位置编码计算方法基本上都是用一个单独的嵌入矩阵来计算相对位置的注意力权重,相当于只使用上述第二行公式的中的内容-内容和内容-位置,也就是前两项。但文章认为位置-内容也很重要,单词对的注意力权重也和它们的相对位置有关,所以加入了位置-内容项。

另外,由于使用的是相对位置嵌入,所以去除了位置-位置这个没什么作用的项。

可借鉴的单头注意力计算

Q=HWq,K=HWk,V=HWv,A=(QKT)dQ = HW_q, K = HW_k, V = HW_v, A = \frac{(QK^T)}{\sqrt{d}}
Ho=softmax(A)VH_o = softmax(A)V

其中,HRN×dH \in R^{N×d}表示来自隐藏层的输入向量,HoRN×dH_o \in R^{N ×d} 表示自注意力层的输出结果,Wq,Wk,WvRd×dW_q, W_k, W_v \in R^{d×d} 均为投影矩阵,ARN×NA \in R^{N×N}为计算得到的注意力矩阵,N为seqence_length,d为隐藏层维度。

相对位置计算

定义k为词间相对距离的最大值,δ(i,j)[0,2k)\delta(i,j) \in [0,2k) 为从第i个token到第j个token的相对距离,则公式为:

δ(i,j)={0forijk2k1forijkij+kothers\delta(i,j) = \begin{cases} && 0 && for && i-j ≤ -k\\ && 2k - 1 && for && i - j ≥ k\\ && i - j + k && others \end{cases}

最终的注意力权重表示

Qc=HWq,c,Kc=HWk,c,Vc=HWv,c,Qr=PWq,r,Kr=PWk,rQ_c = HW_{q,c}, K_c = HW_{k,c}, V_c = HW_{v,c}, Q_r = PW_{q,r}, K_r = PW_{k,r}
A~i,j=QicKjcT+QicKδ(i,j)rT+KjcQδ(j,i)rT\widetilde{A}_{i,j} = {Q_i^c K_j^c}^T + {Q_i^c K_{\delta(i,j)}^r}^T + {K_j^c Q_{\delta(j,i)}^r}^T
Ho=softmax(A~3d)VcH_o = softmax(\frac{\widetilde{A}}{\sqrt{3d}})V_c

解绑后基于相对位置的自注意力机制如上式所示,Qc,Kc,VcQ_c,K_c,V_c分别是使用投影矩阵Wq,c,Wk,c,Wv,cRd×dW_{q,c}, W_{k,c}, W_{v,c} \in R^{d×d}生成的Q、K、V注意力矩阵,PR2k×dP \in R^{2k×d}表示各层共享的相对位置嵌入向量。Qr,KrQ_r, K_r则分别是使用投影矩阵Wq,r,Wk,rRd×dW_{q,r}, W_{k,r}\in R^{d×d}生成的。

其中,A~i,j\widetilde{A}_{i,j}来自注意力矩阵A~\widetilde{A},表示从token_i到token_j的注意力分数。QicQ_i^c为矩阵QcQ_c的第i行向量,KjcK_j^c为矩阵KcK_c的第i行向量。Kδ(i,j)rK_{\delta(i,j)}^r为矩阵KrK_r的第δ(i,j)\delta(i,j)行向量。Qδ(j,i)rQ_{\delta(j,i)}^r为矩阵QrQ_r的第δ(j,i)\delta(j,i)行向量。

这里要注意对于Q,我们用了{j,i)而不是(i,j),这是因为对于给定的位置i,对其计算和内容j之间的位置-内容注意力权重时,相当于用j作为key来查询作为query的i中的内容,所以是δ(j,i)\delta(j,i),最终得到的位置-内容项就是KjcQδ(j,i)rT{K_j^c Q_{\delta(j,i)}^r}^T。内容-位置项的计算也是同理的。

话说基本是对着论文一路翻译到最后的时候发现了问题,这个Wq,rWk,rW_{q,r}和W_{k,r}是什么玩意?为什么能够直接根据相对距离找到对应的向量?前文除了说定义是投影矩阵外没有任何表示,好在看了下后面的伪码,知道了这两个矩阵是位置投影矩阵,虽然还是没说清,但大致能理解了。

这些缩写字母本身看着很难懂,但如果想到全词,C代表Context,R代表Relation,那么就很容易理解每个角标对应的含义了。

首先让我们回忆起来前文提过的,H表示内容,P表示相对位置。则Wq,c,Wk,c,Wv,cW_{q,c}, W_{k,c}, W_{v,c}这三个矩阵其实和普通自注意力方法中差异不大,就是内容向量和对应的内容投影矩阵相乘,得到内容上的Q,K,V。但是接下来还嫌不够,要得到相对位置的Q和K,所以又多做了两个矩阵与相对位置嵌入矩阵P相乘。P的维度为2k*d,注意到这个维度就很清楚了:相对距离的最大值就是2k-1,所以P表示的是各个相对距离情况下对应的向量,再乘以投影矩阵后2k这个维度是没有变化的,也因此后面可以与相对距离相乘。

这个硬理解麻烦且没必要,总之只要认识到:在计算自注意力的Q和K的时候多计算了一组表示相对位置关系的Q和K就行了,最后得到了注意力权重矩阵A~\widetilde{A},因为这下分别是三组QK相乘的求和,所以收缩时的维度也翻了三倍,之后再与V相乘。

image.png

公式说的很明白了,伪码放在这里供写代码参考吧。

基于绝对单词位置的增强MASK解码器

Deberta在MLM任务中使用了上下文单词的内容和位置信息,先前讲了半天的分离注意力机制主要考虑了上下文词汇的内容和相对位置信息,但是没考虑这些词语的绝对位置信息,而绝对位置很多时候也是很重要的。

跳过他举的例子,加入绝对位置信息有两种方法,对于Bert来说是在输入层中包含了position_encoding,而在Deberta中,把它们加到了全部Transformer层之后,但位于softmax层之前来参与MASK的预测,如图:(这破图特么的被放到论文附录里了,排版的能不能出来挨打)

image.png

其实这个图也没看出来位置编码在哪,不过本身也好理解,反正就是Softmax层之前再加一层的事情,也不知道是多加了一个输入层还是直接加在softmax前的输出里面,回头还得看看代码。

这个缩写为EMD的方法在实证研究中被认为比BERT的位置编码效果更好,作者认为把绝对位置放在输入层不利于模型学习足够的相对位置信息,这个其实可以参考一下苏剑林大佬的kexue.fm/archives/81… 这篇文章,里面总结了各种Transformers模型的位置编码,也包括Deberta的。

Scale Invariant Fine Tuning

我愣是没找到一个合适的翻译这个标题的方法,值得一提的是我看国外普遍把这个缩写成SIFT,问题是很久很久很久以前就有了Scale-invariant feature transform缩写成SiFT,这篇文章奇怪的起名问题远不止这一处,微妙的让人不爽。

先说虚拟对抗训练,这是一种通过增强模型对于对抗样本的鲁棒性来提高模型泛化能力的正则手段,而对抗样本是通过对输入进行些许的扰动生成的,模型经过正则化后,在给定一个针对该特定任务的example的情况下,模型在被该example扰动的情况下输出的分布是不变的。

在NLP任务中,这种扰动通常应用于词嵌入而非原始的词语序列中。但是在不同的词语和模型中,嵌入向量的取值范围是不同的,对于特大的模型方差也会变大,进而导致对抗训练变得不稳定。

因此本文提出的是将扰动应用于正则后的词嵌入之中以提高训练稳定性的方案。具体来说,用Deberta在下游任务中进行finetune时,首先用SiFT把嵌入向量归一化,然后在这个归一后的向量中进行扰动。

总结

惯例跳过自吹环节,这个文章各种变量多的有点痛苦,不过实际对原模型的调整不是很多,重点内容也很少,也许后Transformers时代的模型都是这个样子,也难怪说NLP需要看的文章没其他几个领域那么多。

这篇文章说穿了就是做了三件事,比较重要的是相对位置和绝对位置信息的分离,让注意力计算变得更复杂了。另外两件,增强MASK解码首先就不是个解码器,SiFT也是应用在下游的,总之都没给公式,理解起来也并不难。

SiFT因为是用在下游任务的,所以微软有现成的代码发布,需要的可以去找找,kaggle上也一堆用的。

这个模型目前是Kaggle上使用最多的模型,希望能早日用到中文中。