ConvBERT: Improving BERT with Span-based Dynamic Convolution稿

  类bert的语言模型是当下几乎所有nlp任务都会运用到的基本模型,他在大规模的无标签的语料上进行预训练,然后在下游任务微调。他是由transformer的encoder构成的。因此,训练这个模型,需要大量的计算资源。人们开始研究如何降低计算资源的消耗,有模型压缩,蒸馏等等方法。之前有论文发现bert中的某些注意力头只学习局部依赖,那么完全就没必要使用self attention的方法来学习这些依赖,作者希望利用卷积来替代,来学习这些局部依赖。

动态卷积

  卷积的使用方法是参考了2019年的Pay Less Attention with Lightweight and Dynamic Convolutions(图来自https://www.jianshu.com/p/78356d6fdd14)改进的。pay less attention使用了动态卷积的方法代替了sefl-attention后计算量和线性长度是线性增长,而注意力机制的计算复杂度是二次增长的。
  nlp里的卷积和图像中没什么区别,只不过都是长方形的卷积。为了降低计算的复杂度,参考depthwise cnn的方法,通道和通道之间一一对应。light weight还共享不同通道之间的参数,使得参数量有了更近一步的下降。当然,为了让它收敛,针对权重还要做一次softmax normalization来保证收敛。
  动态卷积的话就是在light conv上做了进一步的改动,权重值做到了自适应的功能。针对不同的值来生成不同的kernel。做法就是对特征值做次全连接获得权重值。使用动态卷积替换掉transformer中的多头注意力之后,能够在精度差不多的情况下能够快20%左右。

区间动态卷积

  self-attention可以学习到和全局的依赖,动态卷积学习到的是局部的依赖,但是这回存在一个问题,相同的单词生成的卷积核级相同,这样效果不是很好。于是这边进行了改进,针对一个区间来生成卷积核,这样在很好地利用区间依赖的情况下,还保证了词的不同含义。
  具体的做法如图所示,用深度可分离卷积生成ks,然后和v相乘,最后国全连接,softmax,来生成卷积核。

混合注意力

  混合注意力结合了自注意力模块和区间动态卷积模块。在这边还减少了注意力的个数,减少了注意力机制的计算代价,迫使自注意力机制学习更加有用的信息。在全连接的地方,为了减少参数,使用了分组全连接的方法,使得效率更高且性能损失忽略不计。

实验

  瓶颈结构和分组线性运算,一个有趣的发现是引入瓶颈结构和分组线性运算可以减小参数量和计算代价,而不会对性能造成太大伤害。
  证明了动态卷积的效果。不同大小的kernel带来不同的结果。
  运算算力相对bert是四分之一。

bert的参数量计算

以bert-base举例
wordembedding部分有将尽23.8m的参数
一层transformer encoder中,self-attention的参数量有2.3m,两层全连接有4.7m,总共有7,084,800参数量。
最后7.08m*12+23.8m约等于110m
https://zhuanlan.zhihu.com/p/144582114

矩阵的复杂度计算

最基本的算法,两个n*n矩阵相乘,复杂度是O(n^3) .高级的矩阵乘法可以优化到O(n^2.8)。
https://liwt31.github.io/2018/10/12/mul-complexity/

self attention的复杂度计算

O(n^2d),n是序列长度,d是embedding的维度。
self-attention先算相似度,然后softmax,最后加权平均。
首先是相似度计算,两个(n,d)矩阵相乘,是O(n^2d)
softmax的复杂度是O(n^2)
加权平均和是(n,n)*(n,d)的复杂度是O(n^2*d).
多头注意力计算的时候,是(m,n,a)和(m,a,n)二者计算。最后结果是O(n2*m2*a)=O(n^2*d*m),m代表多少个头。

你可能感兴趣的:(论文,自然语言处理,深度学习)