Transformer的好处及复杂度
Transformer今天多么的火这里就不用多说了。每个节点对每个节点的注意力机制保证了长程无损耗的信息传递。从图神经网络的观点来看,它是一个全连接的完全图。
为什么它在NLP领域中如此有效?这是因为它足够复杂,以至于满足了语言内生的复杂性。引用史蒂芬平克的对写作的定义:… the writer’s goal is to encode a web of ideas into a string of words using a tree of phrases …
写作过程即是从思维之网(web of ideas),经由语法之树(a tree of phrases),转化为词汇之串(a string of words) 。这里从网(二维),到树(大于一维),最终到串(一维),是个不断降维损失信息的过程。
而Transformer通过"所有节点对所有节点"的注意力,把一维的句子映射到二维,重塑了网状的思维。如下图:
作为从句子到思维转化的副产品,我们可以观察到很多语法和语义的涌现。在Chris Manning的一系列论文里,我们看到,如下图所示,
名词-动词,形容词-名词,所有关系,被动语态,共指关系都能在注意力图中有所体现。这些都应归功于Transformer的有着足够复杂度( O ( L 2 ) O(L^2) O(L2), L L L是句子长度)的自注意力机制。
对比CNN,LSTM等,Transformer的强大一目了然,但是对应着它的强大性能,它的计算复杂度和内存需求也带来了工业应用的限制。今天已经有很多新的方法加入了Transformer家族,这里试图对它们进行一下总结。
Transformer变种的几大流派
哈希派
代表是Reformer。主要想法是改造原来的点积注意力,变成LSH(局部敏感哈希)的点积注意力。这里不打算过多描述。原因是暂时没能称为主流,理论上复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),而且在和一些其他算法的比较中,表现并不突出。
稀疏派
这一类有一些不错的算法,而且已经在工业界取得了应用。主要介绍一下Longformer 和 Big Bird。
在Longformer里,self-attention以下图(b) - (d)的方式呈现。为了避免 O ( n 2 ) O(n^2) O(n2)级别的运算和内存需求,作者选择性的只保留注意力矩阵的一部分。在图(b)中,我们可以只注意每个词的最近邻。如果滑窗(sliding window)的宽度为 w w w,那么运算量只是 O ( n w ) O(nw) O(nw)。这很像CNN,每个filter也是只对有限的区域做运算。缺点是,和CNN的filter一样,它缺乏对对象全局性的了解。CNN对这个问题的解决方法是通过增加层数来增大receptive field(感受视野)。这里也是一样,通过把层数增加到 l l l,顶层的有效的注意力长度会变为 O ( l w ) O(lw) O(lw)。在实际使用中可以考虑给每层不同的滑窗宽度 w w w,来取得计算效率和模型表达能力的平衡。实验表明,给顶层较大的 w w w并且给低层较小的 w w w能够取得最佳效果。这符合低层学习语法,顶层学习语义的直觉。
或者也可以采取扩张滑窗的方法,这又和dialated CNN很像。如果扩张度为 d d d,那么滑窗覆盖的句子长度变为 O ( d w ) O(dw) O(dw),顶层的注意力长度相应变为 O ( l d w ) O(ldw) O(ldw)。这显然是一种非常有效的获得长程注意力的方式。实践中,我们给不同的注意力头不同的扩张度,是它们分别能够获取局域的或者长程的信息。
仅有滑窗和扩张滑窗还不够,对于一些特殊字符来说(比如[CLS]),最好还是能获取全局性的注意。所以作者最终采取了Global+Sliding window的方法。Global是指对于[CLS]这样的特殊字符使用全局注意力。
Big Bird和Longformer非常像。不同之处在于前者使用了随机注意力。如下图:
(a)图表示作者引入了随机注意力。Query可以有选择随机选择Key的两个token产生注意。Big Bird把这个过程等价于一个小世界网络随机图的产生过程: 在小世界网络的产生中,首先每个节点都和自己的最近邻产生连接,这对应着Window attention,然后再随机和其他节点产生连接,这对应Random attention。可以这么说,如果我们把full attention对应于全连接的完全图,那么Big Bird就对应于小世界网络图。
下表是加入window和random注意力的效果。直觉上讲window应该比random注意力更有效,但是实验结果正好相反。我个人感觉可能跟实际的实现方法有关。上面介绍的算法并不能最大限度的利用GPU的并行操作,所以工程上采取了"blockify"注意力的方法,这里不再介绍。
BigBird在下游任务上的表现:
在多个任务上都达到最佳的效果。
评价一下稀疏派:window attention直觉上很有道理。过去有些实验表明Transformer里的self-attention最大的权重基本集中在每个token的最近邻(locality of reference),所以应该说滑窗注意力是有实验上的证据来支撑的。global attention在处理特殊token时有必要。实验的效果完全可以和全注意力的版本比较。在实现上,我们常常需要增加层数来弥补滑窗注意力感受野的不足,所以最终在内存上的优势未必那么大。相对来讲,速度的提升仍然有限,所以暂时没有在工业界流行。
降秩派
个人认为这一类算法和下面的重整Kernel派是效果最好而且最有希望称为主流的方向。 代表的算法有Linformer,。
Linformer
这篇文章复杂度上算是吊打了之前的所有算法。上来就指出和哈希派及稀疏派在复杂度上的差异。如下表:
该算法基于这样的观察,即自注意力系数矩阵常常是低秩的。如下图,左图表示对于满秩为512的自注意力系数矩阵,大概前128个本征值可占所有本征值大小的90%。在不同大小的RoBERTa和在不同的数据(IMDB, Wiki103)上都可以观察到这样的现象。右图表示针对不同的层数和不同的注意力头,我们都可以看到前128个本征值之和占了所有本征值总和的88%以上。这说明层数越高,自注意力系数矩阵的低秩效应越明显,换言之,越多的信息集中在最大的本征值最大的方向上。
这个并不奇怪。对于一个长度为 n n n的句子,自注意力矩阵大小为 n 2 n^2 n2,满秩意味着矩阵的每一行向量都互相独立(正交)。 但是这不太可能。因为这表明任何两个token对其他所有token的注意量向量完全正交,这在人类语言中是在很难想象,因为人类的语言总是充满各种重复修饰,共指等等来保证信息传递。相反,一个低秩的自注意力系数矩阵才应该是常态。而且从直觉上来讲,我觉得句子的长度越大,这个低秩的效应就越明显。前面的Sparse Attention效果不错,从本质上也说明自注意力系数矩阵是低秩的。
基于这样的观察,我们完全可以考虑把自注意力系数矩阵 P P P做SVD,把它手动降成真正的低秩(即抛去太小的奇异值的方向)。如下式:
然后利用 P l o w P_{low}