最近复旦放出了一篇各种Transformer的变体的综述(重心放在对Transformer结构(模块级别和架构级别)改良模型的介绍),打算在空闲时间把这篇文章梳理一下:
Part1背景1Transformer的优点
2Transformer的缺点
3原生Transformer(Vanilla Transformer)
注意力模块(Attention Modules)多头注意力层,核心点在于 Q/K/V 三个矩阵,其中 Q/K 矩阵生成权重矩阵(经由softmax),随后和V矩阵得到加权和。 这个过程重复了 n_heads 次,这个 n_heads 代表的就是头的数目,这里需要注意的是我们需要确保 hidden_size/n_heads 需要为一个整数,不然会报错。 基于位置的全连接(Position-wise FFN)注意:Transformer中的FFN全称是Position-wise Feed-Forward Networks,重点就是这个position-wise,区别于普通的全连接网络,这里FFN的输入是序列中每个位置上的元素,而不是整个序列,所以每个元素完全可以独立计算,最极端节省内存的做法是遍历序列,每次只取一个元素得到FFN的结果,但是这样做时间消耗太大,“分段”的含义就是做下折中,将序列分成 段,也就是 个子序列,每次读取一个子序列进行FFN计算,最后将 份的结果拼接。分段FFN只是一种计算上的技巧,计算结果和原始FFN完全一致,所以不会影响到模型效果,好处是不需要一次性将整个序列 读入内存,劣势当然是会增加额外的时间开销了。 残差与归一化(Residual Connection and Normalization)残差连接一般出现在比较深的模型中,可以使得信息前后向传播更加顺畅,缓解了梯度破碎问题。为什么这里使用 Layer Normalization,而不是BN,这里直白的回答就是,BN的效果差,所以不用。 位置编码(Position Encodings)因为Transformer不引入RNN或CNN,所以它忽略了位置信息(尤其是对于encoder)。因此Transformer使用Position Encodings来建模token之间的顺序。 4使用方法(Usage)
5模型分析(Model Analysis)为了分析Tranformer的计算复杂度,本文分析了其主要的两个组件:self-attention和position-wise FFN。具体的对比如下表所示,本文假设隐藏层的维度为𝐷,输入的序列长度为𝑇。FFN的中间单元数量设置为4𝐷,key和value的维度设置为𝐷/𝐻 。 当输入数据的长度较短时, 隐藏层的维度𝐷主导了self-attention和position-wise FFN的复杂度。此时Transformer的计算瓶颈在于FFN,但是随着序列长度的增加,序列长度𝑇逐渐主导复杂度,此时Transformer的计算瓶颈在于self-attention。此外,自注意力的计算需要存储𝑇 × 𝑇 的注意力分布矩阵,这使得Transformer的计算在长序列场景(例如,长文本文档和高分辨率图像的像素级建模)是不可行的。 6Transformer和其他网络的对比(Comparing Transformer to Other Network Types)Self-Attention的分析(Analysis of Self-Attention)本文将self-attention和其余几个神经网络模型进行了对比,总结出了以下几点Transformer的优点:
注意:最大路径长度指的是从任何输入位置通过前向和后向信号的到达任意输出位置的最大长度。较短的句子长度意味着更好的学习长期依赖性的能力。 归纳偏置(In Terms of Inductive Bias)归纳偏置其实可以理解为:从现实生活中观察到的现象中归纳出一定的规则(heuristics),然后对模型做一定的约束,从而可以起到“模型选择”的作用,即从假设空间中选择出更符合现实规则的模型。 在具体的深度学习模型中:CNN具有平移不变性和局部性的归纳偏置。类似地,RNN因为其马尔可夫结构具有时间不变性和局部性的归纳偏置。 而Transformer很少对数据的结构信息进行假设。这使得Transformer成为一个通用且灵活的体系结构。但是这样也有其对应的缺点。缺少结构归纳偏置使得Transformer容易对小规模数据过拟合。 另外一种和Transformer类似的模型则是Graph Neural Networks (GNNs),Transformer可以看作是一个定义在一个完全有向图(带环)上的GNN,其中每个输入都是GNN中的一个节点。Transformer和GNNs之间的关键区别在于Transformer没有引入关于输入数据结构的先验知识,Transformer中的消息传递过程完全依赖于文本的相似性度量。 Part2Transformer的分类(TAXONOMY OF TRANSFORMERS)到目前为止,研究人员已经基于vanilla Transformer从三个角度提出了各种各样的模型:体系结构修改的类型;预训练方法;应用。 7注意力机制(Attention)注意力模块是Transformer中的核心模块,实际应用时通常会遇到以下问题:
针对上述问题的改进主要可以分为以下几种:
8稀疏注意力(Sparse Attention)在标准的Transformer中,每个token都需要和其他的所有token做运算,但是有研究人员观察到针对一个训练好的Transformer,其中的注意力矩阵通常非常稀疏。因此,通过结合结构偏差来限制每个Q关注的Q-K对的数量,可以降低计算复杂度。在该限制下,只需要根据预定义的模式计算Q-K对的相似度即可。 上述公式得到的结果是一个非归一化的矩阵,在具体的实现中,矩阵中的一般不会被存储。 从另一个角度来看,标准的注意力可以看作是一个完整的二部图,其中每个Q接收来自所有存储节点的信息并更新其表示。稀疏注意可以看作是一个稀疏图,其中删除了节点之间的一些连接。我们将确定稀疏连接的度量分为两类:基于位置的稀疏注意和基于内容的稀疏注意。 基于位置的稀疏注意力在基于位置的稀疏注意力中,注意力矩阵根据一些预先定义的pattern进行限制。虽然这些稀疏模式有不同的形式,但本文发现其中一些可以分解为原子类型的稀疏pattern。本文首先确定一些原子类型的稀疏pattern,然后描述这些pattern是如何在一些现有的工作应用的。最后本文介绍了一些针对特定数据类型的扩展稀疏pattern。 原子稀疏注意力(Atomic Sparse Attention) 主要有五种原子稀疏注意模式,如下图所示。
![]() 复合稀疏注意力(Compound Sparse Attention) 现有的稀疏注意力通常由以上原子模式中的一种以上组成。图5显示出了一些代表性的复合稀疏注意模式。
扩展的稀疏注意力(Extended Sparse Attention) 除了上述模式之外,一些现有的研究还探索了特定数据类型的扩展稀疏模式。 对于文本数据,BP Transformer构造了一个二叉树,其中所有标记都是叶节点,内部节点是包含许多标记的span节点。图中的边是这样构造的:每个叶节点都连接到它的邻居叶节点和更高级别的span节点,这些节点包含来自更长距离的token。这种方法可以看作是全局注意的一种扩展,其中全局节点是分层组织的,任何一对token都与二叉树中的路径相连接。图6(a)展示出了该方法的抽象视图。 对于视觉数据也有一些扩展。Image Transformer探索了两种类型的注意力模式:
基于内容的稀疏注意力另一个方向的工作是基于输入内容创建稀疏图,即构造输入中的稀疏连接时是有条件的。 构造基于内容的稀疏图的简单方法是选择那些可能与给定Q具有较大相似性分数的K。为了有效地构造稀疏图,可以将其看做Maximum Inner Product Search (MIPS)问题,即在不计算所有点积项的情况下,通过一个查询Q来寻找与其具有最大点积的K。Routing Transformer使用了k-means聚类——对查询queries和keys在同一簇质心向量集合上进行聚类。每个查询Q只关注与其属于同一簇内的keys。在训练的时候,会使用分配的向量指数移动平均数除以簇的数量来更新每个簇的质心向量。 ![]() 表示的是𝜇这个簇中包含的向量的数量, 是一个可学习的超参数。 假设表示第个查询涉及的Key的索引集合,在Routing Transformer中的表示为: Reformer使用了局部敏感哈希(LSH)算法来为每一个query选择对应的K-V对,LSH注意允许每个token只关注同一散列桶中的token。其基本思想是使用LSH函数将Query和Key散列到多个bucket中,相似的项有很高的概率落在同一个bucket中。 具体来看,他们使用随机矩阵方法作为LSH的函数。假设表示bucket的数量,给定随机矩阵大小为,则LSH函数的计算公式为: LSH允许Query只关注具有索引的K-V对:
好了,本次的分享就是这些,剩余部分之后会继续解读。希望能对大家有帮助。 |
|