相关研究者发现自注意力矩阵大多是低秩的,进而引申出两种方法:
事实上注意力矩阵的秩是小于序列长度的,而序列特别短的时候,会造成over-parameterization,甚至过拟合。
Guo等人使用一个低秩注意力模块建模长距离依赖和一个band attention来捕获局部依赖,来代替原始注意力矩阵。
Performer使用随机傅里叶映射来去近似高斯核函数。
Nyström method对输入使用平均池化进行降采样,选取m个landmark节点,
记
和
为landamark query和key,近似的注意力矩阵可以按如下所示计算:
先验注意力分布可以补充或替代注意力矩阵
先验注意力
一些特定的数据类型(如文本)对位置有强烈偏好,我们可以根据这种特性来设计先验注意力。
Gaussian Transformer认为句子中的词符合距离正态分布(离中心词越近则越重要),于是给注意力矩阵加入了高斯先验。
相关研究者观察到相邻几层的注意力分布是相似的,很自然想到使用前面层的注意力矩阵参与当前层注意力的运算
Predictive Transformer则对先前的attention score进行二维卷积 并加入到当前层运算,可以写为
Realformer则是将先前的attention score直接加到当前层
Lazyformer则是在相邻层内共享一个注意力矩阵
(这段也不是很懂)
通过在预训练网路的特定位置添加适配器,进而实现跨任务参数共享
Zhang等人使用一个离散正态分布作为注意力来源
You等人使用高斯分布作为注意力分布
Synthesizer使用了一个随机初始化的可学习Attention矩阵,只用query参与计算最终attention scores。
这部分引入了更复杂的机制来引导不同注意力头的行为,并让不同注意力头进行交互
Li等人在损失函数引入正则项以增加注意力头的多样性
Talking-head Attention使用talking head机制,从
到
头生成注意力分数,进行softmax,并从
来实现value聚合。(也不是很懂这部分工作)
Collaborative Multi-head Attention则对所有注意力头共享使用矩阵
和
,并用一个混合向量为第i个注意力头来过滤参数,公式如下:
原始的多头注意力机制是全跨度的,即一个query能和所有key-value对参与运算。但相关研究者观察到一些注意力头只关注局部信息,而一些其他注意力头关注更广的上下文信息。因此对跨度的改进有以下两个方向:
Sukhbaatar采取一个可学习的attention span
(如下图b),即使用一个可学习的标量z和一个超参数R来生成mask(进而控制跨度),实验中观察到较低的网络层有着更小的学习跨度,较高的网络跨度更大。
Multi-Scale Transformer采用了固定的跨度,但在不同层的不同头中,设定了不同跨度。
原始的多头注意力机制是先将每个头的结果concat拼接到一起,然后经过一个全连接层
。
这种做法可以等价于重参数化注意力输出并求和,我们可以先把最后的全连接层分组为
多头注意力机制可以重写为
也有人认为这种聚合机制过于简单,并对此进行改进。Gu和Feng等人使用了胶囊网络,将注意力头输出作为胶囊的输入,而经过迭代路由后得到输出胶囊,最终这些输出胶囊被拼接在一起得到最后多头注意力的输出。
Shazeer提出了multi-query attention
,所有的注意力头共享key-value对,能进一步提升解码速度。
Bhojanapalli等人将注意力头的大小和注意力头的个数解耦开来(即没有采用原始多头注意力的做法),而将注意力头大小设置为
。
我们知道卷积和循环神经网络不是排列不变(permutation equivariant
)的,然而Transformer中的注意力机制和FFN层都是排列不变的,所以我们需要引入位置信息。
在原始的Transformer中采取的是绝对正弦位置编码
另外一种方法是采用一个可学习的Embedding层,来添加位置信息。
Wang等人提出使用正弦位置编码,但是每个频率
是学习得到。
这种方法主要关注的是token之间的关系(绝对位置编码则是把token都考虑为独立的一个个体)。
Shaw等人将可学习的相对位置编码Emebedding加入到注意力机制中的key,公式如下:
Transformer-XL重新设计attention score计算方式,并引入正弦编码
其中
是可学习变量,而
则是正弦编码矩阵
DeBERT使用了位置编码Embedding,并且采用类似Transformer-XL的计算注意力方式
DeBERT位置编码
TUPE重新设计计算注意力方式,并且引入一个bias来表征位置信息
TUPE
Roformer使用的是旋转位置编码,通过向量的旋转来表示相对位置
这里强力推荐苏剑林老师的博客,Roformer位置编码可参考 Transformer升级之路:2、博采众长的旋转式位置编码(https://zhuanlan.zhihu.com/p/359502624)
R-Transformer每一个块里,首先输入到一个RNN中,再进入到注意力模块。RNN能给输入信息带上位置信息。
CPE使用了卷积层来引入位置信息
Decoder中的masked self-attention
并不是排列不变的,也有研究者发现移除了decoder部分的位置编码能够提升模型性能
在原始的Transformer中,Layer Normalization放置在中间,我们称为post-LN
,后续也有人把LN放到前面,称为pre-LN
,具体差别如下图所示
post-LN和pre-LN
Xiong等人分析得到在post-LN
下,输出层的梯度比较大,这也导致使用post-LN
的Transformer如果不采用学习率warm-up策略,会出现训练不稳定现象。
尽管post-LN
可能导致训练不稳定,它其性能通常比pre-LN
要好。Liu等人发现post-LN
并不受梯度不均匀的影响,训练不稳定的原因是训练初期,残差连接会导致输出产生较大的偏移。他提出模型自适应初始化,控制了残差分支的贡献度,保证训练的平稳性。
可参考作者本人知乎的回答 如何看待 EMNLP 2020 录用结果?有哪些亮眼的成果?(https://www.zhihu.com/people/liyuan-liu-64)
Xu等人观察到LN中大部分可学习参数不起作用,并且会增加模型过拟合的风险,提出了一种不依赖可学习参数的归一化方法AdaNorm
其中
是超参数
Nguyen和Salazar提出用L2范数来替代
其中g是一个可学习标量
Shen等人探讨了BN在Transformer上表现不好的原因,并提出PowerNorm,作出如下改进:
running statistic
方式,而不是使用每个batch内的统计信息PowerNorm
ReZero使用了一个可学习残差分支来代替LN,公式如下
其中
设置为一个可学习参数,并初始化为0
关于Rezero这篇文章,我推荐阅读下香侬科技的解读香侬读 | ReZero: 使用加权残差连接加速深度模型收敛(https://zhuanlan.zhihu.com/p/113384612)
FFN同样也是很重要的一个组件,相关研究也基于这个模块进行改进
原始的Transformer采用的是ReLU
激活函数,后续有以下改进:
一些工作着重于拓展FFN,以获得更大的模型容量
Lample等人使用product-key memory layers
来代替部分FFN,输入经过query network
投影到隐空间,然后采取两组sub-key,构成一个笛卡尔积product keys
,生成的q和key比较,检索,得到K个key,然后与value做加权和。
Product keys
product-key memory layer
关于这篇文章,我推荐这篇解读large memory layer(https://zhuanlan.zhihu.com/p/76501184)
Gshard则采用MoE(Mixture of Experts)来代替FFN,每个MoE有多个FFN层,MoE的输出则是FFN的加权和,门控值使用一个路由函数g
计算得到。MoE每次前向传播,只有门限值在topK内的专家(即对应的FFN)被激活,参与最终运算。
MoE解读推荐GShard论文笔记(1)-MoE结构(https://zhuanlan.zhihu.com/p/344344373)
Switch Transformer和每次选取kge专家的MoE不同,其每次只使用有最大门限值的专家。
Yang等人将专家进行分组,在每个组里选取top1的专家参与运算。
Sukhbaatar等人将FFN的ReLU替换成softmax,并且将FFN中的bias丢弃,将FFN转换为注意力模块
Yang等人发现在Decoder部分,可以安全地丢掉FFN,不会损失过多地性能,同时能提升训练,推理速度。
LiteTransformer将原始Attention分为两个分支,一个分支继续采用attention机制捕捉长距离上下文,另一个分支使用depthwise卷积捕捉局部信息
Funnel Transformer引入池化操作减少序列长度,随后使用上采样恢复序列
DelighT替换了原始的Block,具体改进为:
在前面有介绍过Realformer和Predictive Attention Transformer,通过引入额外路径,增强信息流动
在一些encoder-decoder模型中,decoder中的cross-attention模块只用了最后一个解码器的输出。Transparent Attention则改进为encoder层的加权和。
Feedback Transformer引入了一个Feedback机制,对所有层做一个加权和,来聚合历史信息
Feedback Transformer
将自适应调整计算时间引入Transforer有以下好处:
三种典型的ACT机制
Universal Transformer使用了一种循环机制来调整特征表达,如图a所示。
Conditional Computation Transformer加入一个门控模块,来决定是否跳过当前层,如图b所示
也有一部分工作如DeeBERT,PABEE引入早退机制,如图c所示
将序列分割为多个子序列来处理,能够提升Transformer的效率,主要分为两大类方法,一种是循环Transformer,一种是层级Transformer
不同策略的Transformer
类似于RNN,循环Transformer设置了一个cache来存储历史信息,每次处理一段子序列,网络会将cache作为额外输入进行运算,运算完后写入新的cache。如上图a所示。
Transformer XL则重用了前面片段的cache,进而生成K,V。对于第
层和
个片段
其中SG表示停止梯度更新,o表示拼接操作
Compressive Transformer将cache拓展成两个层级的memory,引入一些压缩操作,来减少反向传播更新的时间。
Memformer则将循环机制引入encoder-decoder结构(前面几种针对的是decoder-only结构),给encoder加入memory cross attention。还有一些其他方法这里不过多赘述。
低层特征送入encoder,将输出特征聚合得到高层特征,并由高层Transformer处理,这种方法有两个好处:
这里涉及的比较杂,感兴趣的可以翻原论文6.4.2
Lu等人设计了Macaron Tranasoformer,使用FFN-attention-FFN
来替代原始Transformer Block
Sandwich Transformer调整了attention和FFN的位置,将attention置于地层,FFN置于高层
Mask Attention Network引入了动态掩码注意力机制,掩码由token的表征,相对距离和所属头的索引生成。
还有一些使用NAS搜索得到的架构,如Evolved Transformer,DARTSformer等。
主要分为三个方向
Next sentence prediction(NSP)
来作为自监督训练目标。RoBERTa则在此基础上删除了NSP ,因为发现NSP会降低下游任务的性能。我们认为未来发展方向有以下三大方面:
最后希望这篇综述能让你了解当前Transformer的进展,帮助读者们为其他应用改进Transformer。
为了感谢读者的长期支持,今天我们将送出三本由 北京大学出版社 提供的:《GAN生成对抗神经网络原理与实战》 。点击下方抽奖助手参与抽奖。没抽到并且对本书有兴趣的也可以使用下方链接进行购买。