2021-A Survey of Transformers

1. 作者以及单位

Tianyang Lin(复旦邱锡鹏组)

2. 解决问题

对各种各样的 Transformer 变体(又名 X-former)分了2类4种优化派别:
2.1 原版类 Transformer。
2.2 变种 X-former类:2.2.1架构修改、2.2.2预训练、2.2.3应用。

下面是4种类的对应的文章:


transform分类图taxonomy

3. 研究动机

这应该是第一篇关于Transformers结构的综述(之前有类似A Survey on Visual Transformer、Efficient Transformers: A Survey类似的文章)。但是本文注重是结构,主要动机是把变种X-former根据优化目的分了3类。这3类比较有概括性

  1. 模型效率。应用 Transformer 的一个关键挑战是其处理长序列的效率较低,这主要是由于 self-attention 的计算和内存复杂性。改进方法包括轻量化注意力模块(例如稀疏注意力)和分而治之的方法(例如循环和分层机制)。

  2. 模型泛化。由于 Transformer 是一种灵活的架构,并且对输入数据的结构偏差几乎没有假设,因此很难在小规模数据上进行训练。改进方法包括引入结构偏差或正则化,对大规模未标记数据进行预训练等。我看BERT(时序优化)都在这一层。

  3. 模型适配。这一系列工作旨在使 Transformer 适应特定的下游任务和应用程序。

根据以上3个方面,改进原版 Transformer 的方式提出新的分类法,架构修改,预训练和应用

4. 研究方法

下面就按照4个种类:2.1原版,2.2架构修改,2.3预训练,2.4应用,分别讲究规律(左是原版,右是架构修改,预训练,应用)。


左边1类+右边3类分别对应修改的分类
4.1原版Attention

原版我准备掰开揉碎了说一下,把Attention和Transformer关系也说一下(Transformer中一共使用了三次Attention)。
本部分分两节:第一部分介绍一下Transformers之前的Attention是怎么演变过来的(我发现很多分析这个文章的blog都没有介绍清楚)。第二部分在说transformer在文章中谈到的问题。

4.1.1 Attention到底是什么

Attention的经典定义,是来源于Attention is all you need这篇旷世奇作(Transformer也是这个文章提出的)。这个公式看似复杂,但是理解了之后就会发现非常的简单和基本。先讲一下每个字母的含义。字面意思:Q表示query,表示的是K表示key,V表示value, 是K的维度。如果类比QKV在推荐系统中:在淘宝买东西,key就是淘宝数据库中所有的商品信息,query就是你最近关注到的商品信息,比如高跟鞋、紧身裤,value就是推送给你的商品信息。这个例子比较的具体,但是往往在人工智能运用中,key,query,value都是隐变量特征。因此,他们的含义往往不那么显然,我们需要把握的是这种计算结构。

QKV定义

回到公式本身,这个公式本质上就是表示按照关系矩阵进行加权平均。关系矩阵就是 ,而softmax就是把关系矩阵归一化到概率分布,然后按照这个概率分布对V进行重新采样,最终得到新的attention的结果。

transformer

拆开看的话主要有以下几个模块(重点是2和3):

  1. 左右分别是encoder(enc)和decoder(dec)。encoder对输入序列进行编码,即变成;decoder对进行解码,得到。但encoder和decoder都不用RNN,而且换成了多个attention。
  2. enc和dec的底部是embedding;而embedding又分为两部分:input embedding和positional embedding;其中input embedding就是seq2seq中的embedding。而为什么要positional embedding呢?因为transformer中只有attention;回想一下attention,任意一对(query, key)的计算都是完全一样的,不像CNN和RNN,有一个位置或者时序的差异:CNN框住一块区域,随着卷积核移动,边缘的少量点会跟着有序变化;因此为了体现出时序或者在序列中的位置差异,要对input加入一定的位置信息,即positional embedding。
  3. enc和dec的中部分别是两个block,分别输入一个序列、输出一个序列;这两个block分别重复N次。enc的每个block里有两个子网,分别是multihead attention和feedforward network(ffn);dec的block里有三个子网,分别是两个multihead attention和一个ffn。这些子网后面都跟了一个add&norm,即像resnet一样加一个跳边,然后做一个layer norm。难理解是ffn和multihead attention。先说ffn:就是对一个输入序列,对每个进行一次channel的重组,512→2048→512,也可以理解为对整个序列做一个1X1的卷积 。再说*multihead attention:原始的attention, 就是一个query (以下简称Q) 和一组key (以下简称K) 算相似度, 然后对一组value (以下简称V) 做加权和; 假如每个Q和K都是512维的向量, 那么这就相当于在512维的空间里比较了两个向量的相似度. 而multihead就相当于把这个512维的空间人为地拆成了多个子空间, 比如head number=8, 就是把一个高维空间分成了8个子空间, 相应地V也要分成8个head; 然后在这8个子空间里分别计算Q和K的相似度, 再分别组合V. 这样可以让attention能从多个不同的角度进行结合, 这对于NMT是很有帮助的,
  4. dec最后还有一个linear和softmax。这个就无需解释了。

我起初一直没有看懂Attention上面那个图,为什么左边是Encoder?右边是Decoder,他输入输出走势为什么这样的?我觉得看下面图就明白了,Decoder生成输出序列的过程是逐个进行的,已经生成的子序列会指导新的item的生成。如图所示,输入的序列是法语的我是一个学生,翻译成英语的时候, Decoder的输入是Encoder的输出,输出第一个item “I”,然后再将 I 和Encoder的输出输入到Decoder,输出“am”,之后依次类推。所以,图中Decoder的输入有两个,一个是output embedding,另外一个是Encoder的输出。

实例对应(注意Encoder和Decoder的多层堆砌)

很多文章都说Attention吊打cnn,总结一下有2个优势的原因:
1.Attention比recurrent相比,需要的序列操作变成了O(1),而卷积是O(log(n)),典型的计算机内牺牲空间换时间的想法,由于计算结构的改进(如加约束、共享权重)和硬件的提升,这点空间并不算什么。
2.Attention是可以有比CNN更好的解释性的。CNN的解释性不高,大家都知道,但是刚刚粗体说了attention是对V的加权分析,天然就具有解释性的属性。

在说说本文对self-Attention缺点的分析,说了2点挑战:

  1. 复杂性。self-attention 的复杂度是。因此,在处理长序列时 Attention 模块会成为瓶颈。
  2. 结构先验。Self-attention 不假设对输入有任何结构性偏见(我觉得这一点很重要)。甚至顺序信息也需要从训练数据中学习。因此,无预训练的 Transformer 通常很容易在小型或中等规模的数据上过拟合。
4.1.2 Transformer机制的改进方向

原文针对以上调整有6点建议(具体可以看原文):

  1. 稀疏注意力。这一系列工作将稀疏偏差引入 Attention 机制,从而降低了复杂性。
  2. 线性化注意力。这一系列工作将注意力矩阵与核特征图分解,然后以相反的顺序计算注意力以实现线性复杂度。
  3. 原型和内存压缩。这类方法减少了查询或键值记忆对的数量,以减少注意力矩阵的大小。
  4. 低秩的自注意力。这一系列工作捕获了 Self-attention 的低秩属性。
  5. 先验注意力。该研究领域探索用先验的注意力分布来补充或替代标准注意力。
  6. 改进的多头机制。这一系列工作探索了多个不同的多头(Multi-head)机制。

1-4我都没有看太懂(或者我感觉提升可能甚微),主要说说5和6。
先验注意力:之前提过注意力机制通常将预期的注意力值输出为向量的加权和。作为一般情况,注意力分布也可以来自其他来源,我们称之为先验的。预先注意分布可以补充或替代输入产生的分布。我们将注意力的这种表述抽象为具有先验的注意力,如图所示。在大多数情况下,两个注意力分布的融合可以通过在应用 softmax 之前计算对应于先验注意力和生成注意力的分数的加权和来完成。优化方式有:模型位置先验、从下层模块先验、多任务适配器先验和仅注意力先验。

先验概率+attention

改进的多头机制:多头(Multi-head)注意力的吸引力在于能够共同关注来自不同位置的不同表示子空间的信息。然而,没有机制可以保证不同的注意力头确实捕捉到不同的特征。所有有:头部行为建模、跨度受限的多头和精细聚合的多头行为。

除此之外,还可以做:调整位置表示(Transformer 中的自注意力模块和位置前馈层都是置换等变的,这可能在建模时成为一个问题,而不是需要输入结构的集合输入问题。例如,在对文本序列建模时,单词的顺序很重要,因此在 Transformer 架构中正确编码单词的位置至关重要)。层归一化(Layer Normalization, LN)以及残差连接被认为是一种稳定深度网络训练的机制(例如,减轻不适定梯度和模型退化)。位置前馈网络 (FFN) 层对于 Transformer 实现良好性能很重要,可以换FFN 中的激活函数,调整 FFN 以获得更大容量,删除 FFN 层(我感觉提升不大)。

4.2架构

在原文中罗列了好几种架构修改方法,毕竟是综述,把问题说全很重要。但是有一些,在推荐系统,或者算法解决上用不上,我把架构的修改方法简单分为两类:功能性修改操作和分治策略。

4.2.1 功能性修改(我觉得推荐系统用不上的)

有的功能性使 Transformer 轻量化,适合移动设备。 有的加强跨块连接,在相邻的 Transformer 块之间创建了一条前向路径。有的自适应计算时间,目的减少的计算时间来提取特征。

4.2.2 分治策略(我觉得推荐系统用的上的)

长序列的有效方法是使用分治策略,即将输入序列分解为可以由 Transformer 或 Transformer 模块有效处理的更细段。有两类有代表性的方法,循环和分层 Transformer,如图所示。这些技术可以被理解为 Transformer 模型的包装器,其中 Transformer 作为一个基本组件,被重用以处理不同的输入段。

分而治之

(a)循环 Transformer:在循环 Transformer 中,会维护一个缓存以合并历史信息。在处理一段文本时,网络从缓存中读取作为附加输入。处理完成后,网络通过简单地复制隐藏状态或使用更复杂的机制来写入内存(很多时序的文章讲这个TI-SASR)。
(b)分层 Transformer:分层 Transformer (论文HIBERT就属于这种)将输入分层分解为更细粒度的元素。低级特征首先被送到 Transformer 编码器,产生输出表示,然后聚合(使用池化或其他操作)以形成高级特征,然后由高级 Transformer 处理。这类方法可以理解为一个层次抽象的过程。这种方法的优点有两个:1)分层建模允许模型以有限的资源处理长输入;2)它有可能产生更丰富的对任务有益的表征。

4.3预训练Pre-Train-Model(PTM)

Transformer 不对数据的结构做出任何假设(例如,卷积假设数据是二维的),优点是有效地使 Transformer 成为一种非常通用的架构,具有捕获不同范围依赖关系的潜力。缺点是使得 Transformer 在数据有限时容易过拟合。缓解此问题的一种方法是在模型中引入归纳偏置。

归纳偏置(预训练PTM)有以下方法:

  1. 仅 Encoder。大名鼎鼎的BERT是典型的 PTM。
  2. 仅 Decoder。大规模 PTM 可以通过将任务和示例作为构造提示输入模型来在低资源场景下实现不错的功能。
  3. Encoder-Decoder。使用 Encoder-Decoder 架构的好处是,诱导模型具备执行自然语言理解和生成的能力。
4.4应用

还有一些综合修改,我觉得其实和上面架构训练比较有重合,例如NLP的BERT,CV的DERT,多媒体的VLBERT,推荐系统的DIN等。

5. 创新点

文章很长,由于是survey,每个人看创新点都是带着自己的问题看,所以各不同,我谈谈推荐系统下从这个文章的启发。

1.把 Transformer 分了2类4种。如果只保留干货,这个文章主要谈了3种:基本 Transformer模型哪些点可以优化(把 Transformer 当成山,每个优化的点是石头)、 Transformer 的架构修改(把 Transformer 当成山,每个优化的点是山峰)、Transformer 预训练处理(把 Transformer 当成山,每个优化的点又是一座山)。优化的目的是:效率,泛化和适配(我觉得推荐系统主要关注是效率)。这一点还是很重要,基本定了未来所有Transformer 优化归类的思路。

2.首先,确定一点,Transformer 的核心是利用QK矩阵的softmax是概率分布,对V的加权平均。默认Transformer 对输入有任何结构性偏见,甚至顺序信息也需要从训练数据中学习。因此,无预训练的 Transformer 通常很容易在小型或中等规模的数据上过拟合。所以可以探索用先验的Attention分布来补充或替代标准Attention分布(这里的“标准Attention分布”说的是)。

  1. 架构的修改,这个survey主要谈了分治策略。就跟CNN可以搭建起非常厉害的检测模型或者更高级的模型一样,attention的最厉害的地方,是它可以作为基本模块搭建起非常复杂的模型。结合其他文章举两个例子:

首先是全局attention和部分attention。全局attention就是上面讲的基本attention,部分attention主要是还允许某些特征在做attention之前先做融合,再进一步attention。如swintransformer。

全局和部分attention

其次是hard attention和soft attention。之前我们讲的基本都是soft attention。但是站到采样的角度来讲,可以考虑hard attention,把概率当成一个分布,然后再进行多项式采样。这个或许在强化学习里面,有启发性作用。

4.Transformer 预训练处理方面(和第二点先验区别是,这里“预”主要关注的点是Encoder和Decoder)如推荐系统里面的阿里写的BERT4REC。BERT的全称是Bidirectional Encoder Representations from Transformer,从名称上可以看出来BERT从Transformer中取Encoder部分,进行Bidirectional Representation的representation learning。BERT的作用类似CNN, 扮演的是feature extractor提取的角色,阿里这个文章很长,这里就说结论:BERT的输出中,不同的mask会有不同的embedding,该mask的增强后embedding,含有丰富的context信息,对增强后embedding放到softmax 预测性能提高了。因为预测被mask的词是从序列的前后双向获得的信息,不是单向从左往右或者从右往左的,所以这也是BERT中bidirectional的来历。

总结一下:在看基本模型有哪些值得优化的(灌水)的点基本跳不出这个创新点框架。要不是不改架构,对默认模型进行防止过拟合的优化;要不组合起来优化,采样上动动脑筋;最后是Encoder和Decoder上比原来更丰富。

6. 结论

当前的关注点(例如效率和泛化)之外,Transformer 的进一步改进可能在于以下几个方向:

  1. 理论分析。Transformer 的架构已被证明能够支持具有足够参数的大规模训练数据集。许多工作表明,Transformer 具有比 CNN 和 RNN 更大的容量,因此具有处理大量训练数据的能力。当 Transformer 在足够的数据上进行训练时,它通常比 CNN 或 RNN 具有更好的性能。一个直观的解释是 Transformer 对数据结构的先验假设很少,因此比 CNN 和 RNN 更灵活。然而,理论原因尚不清楚,我们需要对Transformer能力进行一些理论分析。

  2. 超越注意力的更好的全局交互机制。Transformer 的一个主要优点是使用注意力机制来模拟输入数据中节点之间的全局依赖关系。然而,许多研究表明,对于大多数节点来说,完全注意是不必要的。在某种程度上,无法区分地计算所有节点的注意力是低效的。因此,在有效地对全局交互进行建模方面仍有很大的改进空间。一方面,self-attention 模块可以看作是一个具有动态连接权重的全连接神经网络,它通过动态路由聚合非局部信息。因此,其他动态路由机制是值得探索的替代方法。另一方面,全局交互也可以由其他类型的神经网络建模,例如记忆增强模型。

  3. 多模态数据统一框架。在许多应用场景中,集成多模态数据对于提高任务性能是有用且必要的。此外,通用人工智能还需要能够捕捉不同模态之间的语义关系。由于 Transformer 在文本、图像、视频和音频方面取得了巨大成功,我们有机会构建一个统一的框架,更好地捕捉多模态数据之间的内在联系。然而,模内和跨模态注意力的设计仍有待改进。

你可能感兴趣的:(2021-A Survey of Transformers)