主要是参考复旦大学6月多出的这篇A Survey of Transformers,然后自己整理记录下。如有错误,欢迎指出。
论文首先讲了下transformer,然后我稍微做下回顾。transformer的结构来自attention is all your need ,在NLP、CV、GNN领域都大杀四方。
如下左图所示,我们的输入是x1,通过一个函数(Embedding)位置编码函数,然后变成了 a 1 a^1 a1。然后将我们的 a 1 a^1 a1分别通过 W q 、 W k 、 W v W^q、W^k、W^v Wq、Wk、Wv三个矩阵,得到Q(query)、K(key)、V(value)。这三个是参数矩阵,是可以学习的,即刚开始随机初始化,后期训练学习所得。细节可以看下右图所示,也就是 a i a^i ai得到 q i q^i qi,再由 q i q^i qi组成矩阵 Q Q Q。(论文中一般的大写字母都是矩阵,小写的都是向量)
接着就可以看到下图3的输入了,在这里我也把公式列出来,然后图中也可以清晰的看到 Q ∗ K T Q*K^T Q∗KT做点积.然后做个scaled也就是公式中的 D k \sqrt{D_k} Dk 。其中 D k D_k Dk(d is the dim of k),这一步的除法还是很好理解的,我解释下,然后为什么除这个数?应该是这个数效果最好的数吧,除法是因为后面要输入到softmax中。如果数值太大,softmax函数趋向正无穷和负无穷,从图像上来说,倾斜程度几乎不变(即在训练的时候,梯度会下降很慢),所以需要除个东西,让它输入到softmax函数时,可以往中间靠,梯度就大了。然后输入到softmax函数。最后将结果与V矩阵相乘即可。
自注意力的提出,其实一定程度上他可以替代rnn,正如下图4所示,如果大家学过rnn,或者了解,self-attention和rnn的输入输出很像,李宏毅老师说,用self-attention可以替代rnn。
如上图4所示,其实我们随便改变输入的位置,对self-attention来说都是一样的,因为我每个 a i a^i ai生成的 q i q^i qi都会对别的 k i 、 v i k^i 、v^i ki、vi去做计算,说的很抽象,举个例子,我有三个参数x、y、z,排列出两两一组的组合就三种(x、y;x、z;y、z),我不论怎么换x、y、z的位置都是一样的组合,self-attention也是一样的,你计算了akv的所有组合方法,a的位置怎么换都没用,也就是说self-attention对位置不敏感,但在NLP中,语序其实很重要,所以我们就需要加入位置编码去标识输入的位置。这样就是为什么要在self-attention前加入位置编码的意义。当然,这片综述中,也提到了有人用卷积、rnn的方法去感知位置。
【注】详细的,比如说多头注意力,什么是多头?残差、还有关于LN层放前面还是后面…等等。大家可以看下这个博主讲 ---- 点击这里,或者李宏毅老师的都不错。
接下来进入正题:
transformer这几年都有哪些改进、哪些论文。A Survey of Transformers分了四大块去讲,如图5所示,也正好分别对应我的最大标题1、2、3、4.
这里我也放了这个复旦大学的老师,也就是这篇作文的作者讲的视频链接 ---- 点击这里
首先根据模块的架构的改进,可以分为很多类,那么这一类主要是针对self-attention,那么attention的的问题主要有两个:
(1)第一个可以从注意力公式中看到,就是做矩阵算法的复杂度,论文中提到的复杂度 O ( T 2 ⋅ D ) O(T^2·D) O(T2⋅D)。那么很多的论文做的改进就是:降低Q、K、V矩阵计算的复杂度。
(2)第二个是Structural prior(先验),可以先理解成,Transformer通常很容易对小或中等大小的数据进行过度拟合。即Transformer不适合小数据集。
Sparse 稀疏,也就是意味着这一类的论文做的就是减少相关联性,比如说 q i q^i qi本来要和所有的 k i k^i ki做运算,现在只和部分 k i k^i ki的做运算。
稀疏化就是把矩阵的参数降下来,正如上面所说只算一部分。本来是感知所有的位置,现在只感知部分的位置。先看如图6下几种稀疏化的方法:
a)global:稀疏化,会带来全局的损失,所以为了弥补损失,global做的就是用黄色的虚拟节点,来联系全局,(CV)如果大家看过ViT,可以了解到,在那个模型的开始加入的[cls],然后用来输出分类的结果,这个[cls]就是一个全局的节点做法。没有看过也没事就忽视刚才的话,大家可以看下global上的小点,前面两个就是全局的点,即最前面的1、2两个点和全部的点都有联系,而后面的点没有联系。那么后面的点也是可以联系的,通过迭代两次,也就是说,后面第八个点想要与第九个点联系,首先找到第1、2两个点(迭代第一次),再去找第九个点(迭代第二次)。
b)band:这种做法可以看到有点和卷积类似,看上面的点可以注意到,他是局部的,也就是 q i q^i qi只注意到左右的点才有联系。
c)dilated:间隔一个邻居。比刚刚的局部更加的扩散。计算量与刚刚一致。
d)random:随机,筛选。
e)block local:就是组与组之间的没有联系,组内全连接。
拿Star-Transformer(图8)来说,引入了全局节点,邻居之间相互联系。连接数大量减少,那么也就是相关性下降,计算量上由原来的 O ( T 2 ⋅ D ) O(T^2·D) O(T2⋅D)下降到了 O ( 2 ⋅ T ⋅ D ) O(2·T·D) O(2⋅T⋅D)。更加合适小的或中等数据集。
【相关论文】Star-Transformer、Longformer、Extended Transformer Construction、BigBrid
(a)BPT: attention时颗粒度可以由精细到粗糙,解释:这里可以从图中看到,比如我要计算2号到3号、6号和10号节点,他看3号是一个字;看6号时,是一个词;看10号是一个句子。这里我用字、词、句子这几个名词,大家对比下图中对应的节点应该就能理解,论文中所说的颗粒度。对2号看3号来说更加局部,对2号看10号来说更加全局。后面两个用在2D上,b也太像卷积了吧。
【相关论文】BP-Transformer
基于内容的稀疏化的方法,先采用低复杂的方法,先去计算一遍 Q 、 K Q、K Q、K,把不太相关的 q i 、 k i q^i、k^i qi、ki去掉,只去计算那些高相关的 q i 、 k i q^i、k^i qi、ki的注意力
拿Reformer来说,其实他就是先拿 Q 、 K Q、K Q、K先过一遍LSH bucketing(局部敏感哈希),如果通过这个“函数”,他们到了同一个桶里面(bucket),那么这些在桶里面的 q i 、 k i q^i、k^i qi、ki具有一定的相似性,然后计算他们的Attention。即,先用一个低复杂度的函数过滤掉一部分的 q i 、 k i q^i、k^i qi、ki。
拿Routing Transformer来说,首先采用聚类的方式,拿 q i 、 k i q^i、k^i qi、ki聚类,用聚类中心的 q i q^i qi代表附近的 q q q,这样也避免了计算每个 q 、 k q、k q、k的麻烦。
【相关论文】Reformer、Routing Transformer
【小结】这部分的稀疏化的总体思路就是要么减少矩阵的参数、要么减少关联性。
线性化的注意力,它主要的做的是从数学方法,把公式“解耦”。改变计算顺序,来降低计算量。如下图10所示:
它其实做的事情很简单,一句话描述,先做 K V KV KV点积再做 Q Q Q的点积,softmax是非线性的给他拆掉。
Performer(图11)这篇论文中,常规的做法就是左边的,直接计算 Q K T QK^T QKT,在计算 V V V,对比右边计算 K T V K^TV KTV,可以看到计算量会下降。然后在softmax中的 e x e^x ex,在论文中是构造了个函数代替。总之就是要解决图10中去掉的softmax的问题。
【相关论文】Performer
我感觉这类方法有点类似1.1.1.5中的方法,这里减少的是源头,矩阵 Q Q Q的参数,区别在于而 K 、 V K、V K、V是不变的。去几个代表性的 q i q^i qi出来,然后和K矩阵相乘,如图12.
第一步,选出的有代表的 q i q^i qi,可以理解成去掉了无关的连接词,去降低 Q 、 K Q、K Q、K矩阵运算的复杂度。
第二步,他采用了均值的方法(use uniform distributions)然后扩到原来的样子再 V V V做运算,这里uniform distributions的做法可以理解成将句子中提取出关键词,现在给他加上无关紧要的连接词,组成句。
【注】看起来蛮愚蠢的,一会去掉一会加上,但其实真的降低了计算量,且核心思想还是没变,降低attention公式的复杂度,attention公式的冗余就在于 Q 、 K Q、K Q、K中 q i q^i qi,所以可以减少数量。(顺带提一下, Q Q Q矩阵的秩很小,低秩,等会也会讲)
Informer这篇论文的动机就和上面介绍的相当契合了,如下图13原文所示:
如果矩阵 Q Q Q中的 q i q^i qi(a query)接近均匀分布,拿去计算其实是很浪费的,我们要计算那些有代表性的 q i q^i qi(原文:We only need to compute the queries thats generate non-trivial attention distributions)
然后文论提出了个公式如下图14所示:
粗粗的看下,这不就是找与均匀分布最大不同的 q i q^i qi吗?
当然这里不是每个 q i q^i qi都做的,是采样部分的 q i q^i qi。具体怎么做?比如i=T,那么,采样 l o g T log T logT,那么复杂度就从 O ( T 2 ⋅ D ) O(T^2·D) O(T2⋅D)降到了 O ( T ⋅ l o g T ⋅ D ) O(T·log T·D) O(T⋅logT⋅D).
【相关论文】Clustered Attention、Informer
这类方法也是类似,上面减少了矩阵 Q Q Q,这里呢,减少的是矩阵 K 、 V K、V K、V的参数,如下图15所示:
Memory Compression中就是用了卷积的方法,卷积改变矩阵大小的操作应该是很熟悉了,就把这个 K 、 V K、V K、V矩阵降下来。
【相关论文】Generating Wikipedia by Summarizing Long Sequences、Set Transformer、Linformer、Poolingformer
秩这个概念,我不知道大家还记不记得,低秩就说明虽然矩阵是T维度的,但是秩很小的话,即可以用很少的向量去表示当前矩阵,比如我的矩阵是 4 ∗ 5 4*5 4∗5的,但是我的秩为 1 1 1,那么说明我只需要 1 1 1个 1 ∗ 5 1*5 1∗5的向量表示出 4 ∗ 5 4*5 4∗5的矩阵。如下图所示:
大概的意思来说,就是我这个矩阵看起来是4维(行)的,但实质上我一维(行)的向量就能表示出来。这就是低秩吧。然后现在经验和实验得知,Self-Attention的矩阵常常是低秩的。那么我们可以通过降维的方式,减少参数量。
【相关论文】Low-Rank and Locality Constrained Self-Attention for Sequence Modeling
这一类呢就是解决问题二的,什么叫先验(Prior)Attention?如图18所示:
我们根据Attention公式已经得到了第一个Attention(generated),然后需要去叠加一个Prior Attention。这个Prior Attention怎么来?大概也可以分为很多类,有人为的设置的,也有比如我有很多层Attention,我第二层的Prior Attention就拿第一层的generated Attention当作Prior
a)Modeling locality
增强它的局部性,Local Transformer就是叠加一个高斯分布的先验
【相关论文】 Gaussian Transformer
b)Prior from lower modules
来自前一个Attention模块的generated Attention
【相关论文】RealFormer
c)Task related prior
根据不同的任务,生成不同的自适应的Prior Attention
【相关论文】Conditionally Adaptive Multi-Task Learning
d)Attention with only prior
只用prior,不用generated Attention, (那不就只有一个先验的固定,那不是光速?Attention算都不用算了)
【相关论文】Average Attention Network、Hard-Coded Gaussian Attention、Synthesizer
多头注意力机制中Multi-head可能是冗余的,可能两个head学习的分布是差不多一致的。
a)Head Behavior Modeling
引入一些正则化,尽量能让不同的head学到不同的分布;不同的head可以增加一些信息的流动,让不同的head能感知到别的head的存在;不同的head共享 W Q 、 W K W^Q、W^K WQ、WK.
【相关论文】 Multi-Head Attention with Disagreement Regularization、Talking-head Attention、Multi-Head Attention: Collaborate Instead of Concatenate
b)Restricted Span
对于不同的head可以限制它的范围,可以让它看的大点,也可以让它看的小点
【相关论文】Adaptive Attention Span、Multi-scale Transformer
c)Information Aggregation with Dynamic Routing
对于不同的head注意到的信息,如何更好地利用
【相关论文】Information Aggregation for Multi-Head Attention with Routing-by-Agreement、Improving Multi-Head Attention with Capsule Networks
d)Other variants
出发点:不同的head如何共享信息,如何确定head的数量。
【相关论文】Low-Rank Bottleneck in Multi-head Attention Models
关于位置编码相关的工作方向如下:
a)Absolute position
绝对位置编码,transformer中用的就是用这种 s i n x 、 c o n x sinx、conx sinx、conx encoding。
三种方式:Fixed sinusoidal encoding、Learnable embeddings、Learnable sinusoidal encoding
【相关论文】Vanilla Transformer、BERT
b)Relative position
相对位置编码,我们用 R i − j R_i-j Ri−j 这种i与j之间的关系进行编码。
【相关论文】Transformer-XL、T5: Text-To-Text Transfer Transformer
c)Other representations
这类编码是为了满足旋转不变性等采用的Position encoding.Roformer满足平移不变性
【相关论文】Roformer
d)Implicit representations
隐式建模 比如加入CNN,这样就加入了位置感知。
【相关论文】R-Transformer、Conditional Positional Encodings for Vision Transformers
Layer Normalization在神经网络中还是很重要的,对某一层的神经元做一个归一化,使得能更好的训练,符合某个分布。但是在很多神经网络中, Layer Normalization放在哪个位置其实存在很大的争议,有些认为放在激活函数的后面,有些认为放在激活函数的前面。在transformer中也有这样的问题存在。
如下图19所示:
关于LN层相关的工作方向如下:
a)Placement of LN
Pre-LN: More stable training;
Post-LN: Training could diverge - requires learning rate warm-up, but could lead to better performance when the model converges.
这两篇就是对LN位置的一个争论,最早的transformer用的是Post-LN,但是因为将LN放在attention后面,刚开始训练的时候会有极大的不稳定性,随后提出了Pre-LN,将LN放在attention前面,这样数据的分布使训练更加的稳定,但又有人提出,采用Post-LN时,再采用learning rate warm-up能够获得更好的性能。
【相关论文】On Layer Normalization in the Transformer Architecture
b)Substitutes of LN
这类方向不采用 Layer Normalization,而是采用别的归一化的方法,比如:AdaNorm、PowerNorm。
c)Norm-free Transformer
索性不用LN
【相关论文】ReZero-Transformer
关于FNN相关的工作如下:
a)Activation
通过修改激活函数:ReLU、GELU、GLU
b)Using FFN to en enlarge capacity
product-key memory layer
Mixture-of-Experts
【相关论文】Large Memory Layers with Product-Keys、Switch Transformer
c)Can we drop FFN
这个方向虽然看起来是丢掉了FFN,其实有个做法是把它加入到attention层里面去了。
【相关论文】On the Sub-layer Functionalities of Transformer Decoder
a)Lite Transformer
将self-attention模块替换成两路,一路是卷积,一路是attention。这样计算复杂度也会下降。
b)Funnel Transformer
Transformer的计算复杂度主要是由序列的长度造成的,通过降采样(pooling)的方式把序列长度降下来。
c)DeLighT
FFN计算复杂度高,考虑在self-attention前升维,再进入在FFN中做降维,降低计算复杂度。
【相关论文】Lite Transformer、Funnel Transformer、DeLighT
a)RealFormer、Predictive Attention Transformer
在每个block之间做一个残差,相当于之前1.1.6中提到的,将前一层的产生的attention,当作是当前层的先验attention叠加在一起生成最终的attention。
b)Transparent Attention
decoder 之前是获取到的encoder的最后一层,在梯度回传的时候不方便,所以,对每个层进行一个加权求和,流入到decoder中,方便访问每个层。
c)Feedback Transformer
增加一些从高层传输一些到底层的路径。
【相关论文】RealFormer、Transparent Attention
动态的自适应的计算,三种方式如下:
Universal Transformer
举一个例子,可以考虑以下句子:“I arrived at the bank after crossing the river”。在这种情况下,“ I”或“river”的含义不太明确,需要更多的上下文来推断单词“ bank”的最可能含义。当使用标准的Transformer对该句子进行编码时,无条件地将相同的计算量应用于每个单词。但是,Universal Transformer的自适应机制允许模型仅将更多的计算花费在更模糊的单词上,例如使用更多的步骤来整合消除“bank”一词所需的其他上下文信息,同时在不太模糊的单词上花费更少的步骤。这就是自适应机制带来的好处。
【相关论文】Universal Transformer
分而治之地方法用transformer处理长文档。核心思想:将一个长的序列切分成几个短的序列,然后处理短的序列。如下图17、18可以清晰看到两者的区别。
a)recurrence
用时序化的方法:
【相关论文】Transformer-XL、Compressive Transformers for Long-Range Sequence Modelling、Memformer
b)hierarchy
层次化的方法:把短的序列放进transformer,再拼在一起放到transformer中
【相关论文】HIBERT: Document Level Pre-training of Hierarchical Bidirectional Transformers for Document Summarization
改架构
【相关论文】Macaron Transformer、Sandwich Transformer、Evolved Transformer、DARTformer
a) Encoder only
b) Decoder only
c) Encoder-Decoder
预训练综述:Pre-trained Models for Natural Language Processing: A Survey
【相关论文】Transformer、BERT、Compressive Transformer
【相关论文】Vision Transformer、DETR
【相关论文】Music BERT
【相关论文】VisualBERT、VLBERT