转载于:GiantPandaCV
作者: ZZK
这是复旦大学出品的一份Transformer的综述,里面涵盖内容很广泛,长文预警,完整读完可能需要15-20分钟
介绍
Transformer现在是一种在各个领域被广泛使用的模型,包括NLP,CV,语音领域。随着这几年发展,一些Transformer的变体在以下几个方面进行改进:
1. 模型效率
由于self-attention
模块的计算,存储复杂度都很高,让Transformer在处理长序列数据时效率较低。主要的解决方法是对Attention做轻量化以及引入分治思想。
2. 模型泛化
Transformer没有像CNN引入归纳偏置,导致其在小规模数据集上难以训练。解决方法是引入结构偏置或正则项,在大数据集上进行预训练等等。
3. 模型适应能力
这方面工作主要是将Transformer引入下游任务中
背景知识
原始Transformer
这部分我们主要介绍原始Transformer中几个关键模块
Attention模块
Attention公式原型如下:
而Transformer中使用的是多头注意力机制,首先使用多组 , , &W\_v&来分别计算,然后将多组注意力结果拼接起来,并最后再和 做一次线性变换。整个过程如下:
Transformer整体结构图概览
在Transformer中,分以下三种Attention:
- self-attention,自注意力机制,即上述公式中的Q,K,V都设置为输入X。
- Masked self-attention: 用于decoder中,其中掩码保证计算注意力的时候只使用该位置以内的信息。
- Cross-Attention: 其中Query使用的是解码器的输出,而Key和Value使用的是编码器输出。
FFN模块
前馈层就是两层全连接层加一个激活层,可以写为
残差连接和LayerNorm
在每个Transformer Block中,都加入了残差连接和LayerNorm。整个过程可以写为
位置编码
由于Transformer没有引入循环结构以及卷积结构,模型本身是缺失位置信息的。我们通过给Encoder和Decoder的输入加入位置编码,让数据带有一定位置信息
模型使用方法
通常有以下三种
- Encoder-Decoder 常用于Sequence to Sequence的建模(如机器翻译)
- Encoder-Only 只用了前面的编码器,常用于分类,序列标注问题
- Decoder-Only 只用了后面的解码器,常用于序列生成任务
模型分析
这里主要分析其中两个组件FFN
和self-attention
的复杂度和参数量 这里我们假设序列长度为T,通道数为D,FFN中间全连接层大小为4D,那么有以下表格
简单推导
矩阵乘计算复杂度补充,假设矩阵A是(N, M),矩阵B是(M, P), 那么得到的矩阵C是(N, P),而每一个元素计算需要M次乘法,因此复杂度为O(NMP),其他操作对比可参考 Transformer/CNN/RNN的对比(时间复杂度,序列操作数,最大路径长度)
在Q和K进行矩阵乘的时候,是(T, C)和(C, T)(K转置后)矩阵相乘,因此复杂度为O(),FFN的参数量和计算复杂度也以此类推。
可以看到在长序列下,self-attention的操作复杂度以2次方增加。
Transformer与其他网络的比较
self-attention的分析
我们总结了以下三个优点
- 它与全连接层有相同的最大路径长度,适合长距离建模。
- 相比卷积有限的感受野(在CNN中,需要堆叠很多层才能得到全局感受野),self-attention能以有限的层数建模长期依赖关系。
- 相比于循环层(RNN系列),self-attention的并行度更高。
关于归纳偏置
CNN使用卷积核,引入图像局部性。RNN将时间不变性引入。而Transformer抛弃了这些归纳偏置,一方面能让其足够通用灵活,另一方面Transformer很容易对小规模数据过拟合。
另一个与其相关的是GNN图网络,Transformer可以被看作一个完全有向图(带自环)上的GNN,其中每个输入都是图中的一个节点(PS: 笔者对GNN不理解,这里翻译比较僵硬)。
不同种类的Transformer
后续的Transformer变体都是在以上几个组件加以改进得到。
相关工作总结图
Attention
自注意力机制是很重要的一个组件,它有如下两个问题
- 复杂度,在处理长序列的时候计算开销很大
- 结构先验,抛弃了所有归纳偏置,导致其在小型数据容易过拟合
解决方法有以下:
- Sparse Attention,将稀疏偏置引入到注意力计算
- Linearized Attention,将注意力矩阵和特征映射分离,降低至线性复杂度
- 显存压缩,减少QKV的数量来减小注意力矩阵
- 低秩self Attention,这类工作主要是抓住自注意力的低秩性
- 带有先验的Attention,使用预先注意力分配来补充标准的自注意力机制
- 改进Multi-head机制
Sparse Attention
在一些训练好的Transformer模型中,可以观察到注意力矩阵通常是稀疏的,因此可以通过限制query-key对的数量来减少计算复杂度。
我们可以将稀疏化方法进一步分成两类,基于位置信息Position-based
和基于内容Content-based
两种方法。
基于位置信息的稀疏化注意力
基础的稀疏注意力模式
主要来说有以下五种稀疏注意力的基本模式
- Global Attention 为了增强模型模拟长距离依赖关系,我们可以加入一些全局节点。
- Band Attention 大部分数据都带有局部性,我们限制query只与相邻的几个节点进行交互
- Dilated Attention 跟CNN中的Dilated Conv类似,通过增加空隙以获取更大的感受野
- Random Attention 通过随机采样,提升非局部的交互
- Block Local Attention 使用多个不重叠的Block来限制信息交互
5种Attention图示
复合的稀疏注意力模式
使用上面的基础稀疏注意力模式进行结合,这里就不展开叙述了。
不同的复合稀疏注意力模式
扩展的稀疏注意力模式
不同于上面基础的几种注意力模式,针对一些特殊数据类型也有一些扩展的稀疏注意力。
BP-Transformer构造了一个基于二叉树的注意力模式,所有的token作为叶子节点,而内部节点则包含了多个token。更高层的span node能包含更长距离内的token。
在视觉方面的数据上,Image Transformer尝试了两种稀疏注意力模式
- 将图像展平,并应用一个block local sparse attention
- 以2维的形式,应用一个2D block local attention
Axial Transformer对于图像的每个轴,应用独立的注意力模块
扩展稀疏注意力
基于内容的稀疏注意力
一些工作是根据输入数据来创建稀疏注意力,其中一种很简单的方法是选择和给定query有很高相似度的key。
Routing Transformer采用K-means聚类方法,对中心向量集合上的key和query进行聚类。每个query只与其处在相同cluster下的key进行交互。
中心向量采用滑动平均的方法进行更新:
其中是cluster的数量,是cluster当前的向量个数
Reformer则采用local-sensitive hashing(LSH)
哈希方法来为每个query选择key-value。其主要思想是对query和key哈希,分到多个桶内,在同一个桶内的query,key参与交互。
此外,Sparse Adaptive Connection
将序列看作是一个图,自适应学习稀疏连接。Sparse Sinkhorn Attention
使用一个排序网络,给query,key分到多个块内,并给每个query块分配一个key块,每个query只允许和对应的key进行交互。
Linearized Attention
这类方法主要是使用来近似或替代计算Attention中的,以降低计算复杂度至O(T)。(其中是在行方向上的特征映射)
标准Attention和Linearized Attention对比
我们先写出Attention的一般形式:
其中 sim
是一个用于计算向量相似性的函数。在原始Transformer是对向量做内积+softmax,我们选择用一个核函数来代替
那么前面的Attention可以改写为
这类方法有两个关键的组件,分别是特征映射和特征聚合方法
特征映射
即前面提到的,Linear Transformer使用的是,其目的不是近似标准Attention中的点积,只是性能能与标准Transformer相当。
Performer则使用的是随机特征映射方式:
在第一个版本中,Performer受启发于随机傅里叶特征映射(常用于近似高斯核)。其中:
然而第一个版本不能保证attention计算得到的score是非负的,第二版改进为:
当然还有其他特征映射方法,这里不过多阐述
聚合方法
RFA引入一种门机制,当给记忆矩阵S添加一个新关联,它通过一个可学习的标量g来让历史关联呈现出指数衰减的形式。
Schlag等人利用写入/删除的方法来增加记忆矩阵容量(这里看不懂,不展开讲了)
Query原型和显存压缩
除了对注意力稀疏化和线性化,另外一个减少注意力复杂度的方法是减少query或key-value的数量。
Query prototyping 和 Memory Compression
使用Query原型的Attention
这里使用Query原型作为计算Attention分布的主要来源,模型可以将分布复制到对应query的位置,也可以用离散均匀分布来填充。
Cluster Attention将query分组到多个cluster当中,为每个cluster的中心向量计算注意力分布。
Informer则是显式地使用query稀疏度度量选取query原型,该度量由query注意力分布和离散均匀分布之间的KL散度近似推导出来。
使用压缩Key-Value显存的注意力
这类方法减少key-value对的数量,来减少复杂度。
Liu等人提出MCA,使用卷积层减少key-value数量
Set Transformer和Luna使用一些外部可训练全局节点,来对输入进行压缩
Linformer则将key,values投影(即和一个矩阵相乘),减少其长度。
Poolingformer则使用两阶段Attention,包含一个滑窗Attention和一个压缩显存Attention。
END
推荐阅读
更多嵌入式AI技术干货请关注嵌入式AI专栏。