前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >A Survey of Transformer 一篇Transformer综述(下)

A Survey of Transformer 一篇Transformer综述(下)

作者头像
BBuf
发布2021-07-01 15:57:28
8500
发布2021-07-01 15:57:28
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV

A Survey of Transformer 一篇Transformer综述(上)

低秩自注意力

相关研究者发现自注意力矩阵大多是低秩的,进而引申出两种方法:

  1. 使用参数化方法显式建模
  2. 使用低秩近似自注意力矩阵

低秩参数化

事实上注意力矩阵的秩是小于序列长度的,而序列特别短的时候,会造成over-parameterization,甚至过拟合。

Guo等人使用一个低秩注意力模块建模长距离依赖和一个band attention来捕获局部依赖,来代替原始注意力矩阵。

低秩近似

Performer使用随机傅里叶映射来去近似高斯核函数。

Nyström method对输入使用平均池化进行降采样,选取m个landmark节点,

\widetilde{Q}

\widetilde{K}

为landamark query和key,近似的注意力矩阵可以按如下所示计算:

\widetilde{A} = softmax(Q\widetilde{K}^T)(softmax(\widetilde{Q}\widetilde{K}^T))^{-1}softmax(\widetilde{Q}K^T)

先验注意力

先验注意力分布可以补充或替代注意力矩阵

先验注意力

模型局部先验注意力

一些特定的数据类型(如文本)对位置有强烈偏好,我们可以根据这种特性来设计先验注意力。

Gaussian Transformer认为句子中的词符合距离正态分布(离中心词越近则越重要),于是给注意力矩阵加入了高斯先验。

从底层模块获取先验

相关研究者观察到相邻几层的注意力分布是相似的,很自然想到使用前面层的注意力矩阵参与当前层注意力的运算

\hat{A} = w1*A^{(l)}+w2*g(A^{(l-1)})

Predictive Transformer则对先前的attention score进行二维卷积 并加入到当前层运算,可以写为

\hat{A} = \alpha*A^{(l)} + (1-\alpha)*Conv(A^{(l-1)})

Realformer则是将先前的attention score直接加到当前层

\hat{A} = A^{(l)} + A^{(l-1)}

Lazyformer则是在相邻层内共享一个注意力矩阵

多任务适配先验

(这段也不是很懂)

通过在预训练网路的特定位置添加适配器,进而实现跨任务参数共享

只使用先验的注意力

Zhang等人使用一个离散正态分布作为注意力来源

You等人使用高斯分布作为注意力分布

Synthesizer使用了一个随机初始化的可学习Attention矩阵,只用query参与计算最终attention scores。

提升多头注意力机制

头部行为建模

这部分引入了更复杂的机制来引导不同注意力头的行为,并让不同注意力头进行交互

Li等人在损失函数引入正则项以增加注意力头的多样性

Talking-head Attention使用talking head机制,从

h_k

h

头生成注意力分数,进行softmax,并从

h_v

来实现value聚合。(也不是很懂这部分工作)

Collaborative Multi-head Attention则对所有注意力头共享使用矩阵

W^Q

W^K

,并用一个混合向量为第i个注意力头来过滤参数,公式如下:

head_i = Attention(QW^Qdiag(m_i), KW^K, VW^V)

跨度受限的多头注意力

原始的多头注意力机制是全跨度的,即一个query能和所有key-value对参与运算。但相关研究者观察到一些注意力头只关注局部信息,而一些其他注意力头关注更广的上下文信息。因此对跨度的改进有以下两个方向:

  • Locality 限制attention的跨度能引入局部性
  • Efficiency 在合理实现下,一些模型可以扩展到长序列,且不会引入额外显存和计算

Sukhbaatar采取一个可学习的attention span(如下图b),即使用一个可学习的标量z和一个超参数R来生成mask(进而控制跨度),实验中观察到较低的网络层有着更小的学习跨度,较高的网络跨度更大。

Multi-Scale Transformer采用了固定的跨度,但在不同层的不同头中,设定了不同跨度。

Refined聚合机制的多头注意力

原始的多头注意力机制是先将每个头的结果concat拼接到一起,然后经过一个全连接层

W_O

这种做法可以等价于重参数化注意力输出并求和,我们可以先把最后的全连接层分组为

W_O = [W_1^O;W_2^O;...W_H^O;]

多头注意力机制可以重写为

MultiheadAttn(Q, K, V)=\sum_{i=1}^{H}(QW_i^Q, KW_i^K, VW_i^VW_i^O)

也有人认为这种聚合机制过于简单,并对此进行改进。Gu和Feng等人使用了胶囊网络,将注意力头输出作为胶囊的输入,而经过迭代路由后得到输出胶囊,最终这些输出胶囊被拼接在一起得到最后多头注意力的输出。

其他的一些改进

Shazeer提出了multi-query attention,所有的注意力头共享key-value对,能进一步提升解码速度。

Bhojanapalli等人将注意力头的大小和注意力头的个数解耦开来(即没有采用原始多头注意力的做法),而将注意力头大小设置为

D_m/h

其他模块级别的修改

位置表达

我们知道卷积和循环神经网络不是排列不变(permutation equivariant)的,然而Transformer中的注意力机制和FFN层都是排列不变的,所以我们需要引入位置信息。

绝对位置编码

在原始的Transformer中采取的是绝对正弦位置编码

PE(t)_{i}= \begin{cases} sin(\omega_it) & \text{ if i is even}\\ sin(\omega_it) & \text{ if i is odd}\\ \end{cases}

另外一种方法是采用一个可学习的Embedding层,来添加位置信息。

Wang等人提出使用正弦位置编码,但是每个频率

\omega_i

是学习得到。

相对位置编码

这种方法主要关注的是token之间的关系(绝对位置编码则是把token都考虑为独立的一个个体)。

Shaw等人将可学习的相对位置编码Emebedding加入到注意力机制中的key,公式如下:

clip(x) = max(-K, min(x, K))
r_{ij}=R_{clip(i-j)}
k_j^{’} = k_j + r_{ij}

Transformer-XL重新设计attention score计算方式,并引入正弦编码

其中

W, u

是可学习变量,而

R

则是正弦编码矩阵

DeBERT使用了位置编码Embedding,并且采用类似Transformer-XL的计算注意力方式

DeBERT位置编码

其他位置表示方式

TUPE重新设计计算注意力方式,并且引入一个bias来表征位置信息

TUPE

Roformer使用的是旋转位置编码,通过向量的旋转来表示相对位置

这里强力推荐苏剑林老师的博客,Roformer位置编码可参考 Transformer升级之路:2、博采众长的旋转式位置编码(https://zhuanlan.zhihu.com/p/359502624)

没有采取显式编码的位置表示

R-Transformer每一个块里,首先输入到一个RNN中,再进入到注意力模块。RNN能给输入信息带上位置信息。

CPE使用了卷积层来引入位置信息

Decoder中的位置表示

Decoder中的masked self-attention并不是排列不变的,也有研究者发现移除了decoder部分的位置编码能够提升模型性能

Layer Normalization

LN放置的位置

在原始的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)

LN的一些替代品

Xu等人观察到LN中大部分可学习参数不起作用,并且会增加模型过拟合的风险,提出了一种不依赖可学习参数的归一化方法AdaNorm

y = \frac{x-\mu}{\sigma}
z = C(1-ky)\odot{y}

其中

C, k

是超参数

Nguyen和Salazar提出用L2范数来替代

z = g\frac{x}{||x||}

其中g是一个可学习标量

Shen等人探讨了BN在Transformer上表现不好的原因,并提出PowerNorm,作出如下改进:

  1. 松弛了0均值的限制
  2. 使用平方平均替代了方差
  3. 对平方平均值采用了running statistic方式,而不是使用每个batch内的统计信息

PowerNorm

无Normalization的Transformer

ReZero使用了一个可学习残差分支来代替LN,公式如下

H’ = H + \alpha*F(H)

其中

\alpha

设置为一个可学习参数,并初始化为0

关于Rezero这篇文章,我推荐阅读下香侬科技的解读香侬读 | ReZero: 使用加权残差连接加速深度模型收敛(https://zhuanlan.zhihu.com/p/113384612)

Point-wise前馈层

FFN同样也是很重要的一个组件,相关研究也基于这个模块进行改进

激活函数

原始的Transformer采用的是ReLU激活函数,后续有以下改进:

  • Ramachandran使用swish激活函数替代
  • GPT中使用了GELU
  • Shazeer等人使用了GLU(Gated Linear Unit)

获取更大容量的FFN

一些工作着重于拓展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的专家参与运算。

丢弃FFN

Sukhbaatar等人将FFN的ReLU替换成softmax,并且将FFN中的bias丢弃,将FFN转换为注意力模块

Yang等人发现在Decoder部分,可以安全地丢掉FFN,不会损失过多地性能,同时能提升训练,推理速度。

架构级别的变体

轻量化Transformer

LiteTransformer将原始Attention分为两个分支,一个分支继续采用attention机制捕捉长距离上下文,另一个分支使用depthwise卷积捕捉局部信息

Funnel Transformer引入池化操作减少序列长度,随后使用上采样恢复序列

DelighT替换了原始的Block,具体改进为:

  1. 使用了先expand后reduce的DeLighT变换
  2. 使用单头注意力
  3. 使用了先reduce后expand的FFN

增强跨网络块的连接

在前面有介绍过Realformer和Predictive Attention Transformer,通过引入额外路径,增强信息流动

在一些encoder-decoder模型中,decoder中的cross-attention模块只用了最后一个解码器的输出。Transparent Attention则改进为encoder层的加权和。

Feedback Transformer引入了一个Feedback机制,对所有层做一个加权和,来聚合历史信息

Feedback Transformer

自适应调整计算时间(Adaptive Computation Time)

将自适应调整计算时间引入Transforer有以下好处:

  • 难样本的特征调整,对于一些难以处理的数据,可以送入更深的层,以获得更好的特征表达。
  • 提高简单样本的效率,对于简单样本,浅层的表示足以完成任务。

三种典型的ACT机制

Universal Transformer使用了一种循环机制来调整特征表达,如图a所示。

Conditional Computation Transformer加入一个门控模块,来决定是否跳过当前层,如图b所示

也有一部分工作如DeeBERT,PABEE引入早退机制,如图c所示

使用分治策略的Transformer

将序列分割为多个子序列来处理,能够提升Transformer的效率,主要分为两大类方法,一种是循环Transformer,一种是层级Transformer

不同策略的Transformer

循环Transformer

类似于RNN,循环Transformer设置了一个cache来存储历史信息,每次处理一段子序列,网络会将cache作为额外输入进行运算,运算完后写入新的cache。如上图a所示。

Transformer XL则重用了前面片段的cache,进而生成K,V。对于第

l

层和

{\tau}+1

个片段

\widetilde{H}_{\tau+1}^{(l)} = [SG(H_{\tau}^{(l)})o(H_{\tau+1}^{(l-1)})]

其中SG表示停止梯度更新,o表示拼接操作

K_{\tau+1}^{(l)},V_{\tau+1}^{(l)} = \widetilde{H}_{\tau+1}^{(l)}W^K, \widetilde{H}_{\tau+1}^{(l)}W^V

Compressive Transformer将cache拓展成两个层级的memory,引入一些压缩操作,来减少反向传播更新的时间。

Memformer则将循环机制引入encoder-decoder结构(前面几种针对的是decoder-only结构),给encoder加入memory cross attention。还有一些其他方法这里不过多赘述。

层级Transformer

低层特征送入encoder,将输出特征聚合得到高层特征,并由高层Transformer处理,这种方法有两个好处:

  1. 能够在有限的资源处理长序列
  2. 能够产生更丰富的特征表达

这里涉及的比较杂,感兴趣的可以翻原论文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等。

预训练Transformer

主要分为三个方向

  • Encoder:代表的有Bert,使用了掩码语言建模和Next sentence prediction(NSP)来作为自监督训练目标。RoBERTa则在此基础上删除了NSP ,因为发现NSP会降低下游任务的性能。
  • Decoder:代表的有GPT系列。
  • Encoder-decoder: BART在BERT基础上引入去噪目标。Encoder-Decoder的结构能让模型拥有语言理解和生成的能力。

Transformer应用领域

  • NLP:这里不多废话
  • CV:最近大火的视觉Transformer
  • 音频应用:语音识别,合成,增强;音乐生成
  • 多模态

总结和未来展望

我们认为未来发展方向有以下三大方面:

  • 理论分析:相比CNN和RNN,Transformer更适合在大数据上训练,相对而言性能也会更好,然而原因还不详,需要理论支持。
  • 超越注意力的更好的全局交互机制
  • 多模态数据统一框架

最后希望这篇综述能让你了解当前Transformer的进展,帮助读者们为其他应用改进Transformer。


为了感谢读者的长期支持,今天我们将送出三本由 北京大学出版社 提供的:《GAN生成对抗神经网络原理与实战》 。点击下方抽奖助手参与抽奖。没抽到并且对本书有兴趣的也可以使用下方链接进行购买。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 低秩自注意力
    • 低秩参数化
      • 低秩近似
      • 先验注意力
        • 模型局部先验注意力
          • 从底层模块获取先验
            • 多任务适配先验
              • 只使用先验的注意力
              • 提升多头注意力机制
                • 头部行为建模
                  • 跨度受限的多头注意力
                    • Refined聚合机制的多头注意力
                      • 其他的一些改进
                      • 其他模块级别的修改
                        • 位置表达
                          • 绝对位置编码
                          • 相对位置编码
                          • 其他位置表示方式
                          • 没有采取显式编码的位置表示
                          • Decoder中的位置表示
                        • Layer Normalization
                          • LN放置的位置
                          • LN的一些替代品
                          • 无Normalization的Transformer
                        • Point-wise前馈层
                          • 激活函数
                          • 获取更大容量的FFN
                          • 丢弃FFN
                      • 架构级别的变体
                        • 轻量化Transformer
                          • 增强跨网络块的连接
                            • 自适应调整计算时间(Adaptive Computation Time)
                              • 使用分治策略的Transformer
                                • 循环Transformer
                                • 层级Transformer
                              • 探索替代架构
                              • 预训练Transformer
                              • Transformer应用领域
                              • 总结和未来展望
                              相关产品与服务
                              语音识别
                              腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档