AI学习者 · 2021年06月16日

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

转载于:GiantPandaCV
作者: ZZK
这是复旦大学出品的一份Transformer的综述,里面涵盖内容很广泛,长文预警,完整读完可能需要15-20分钟

介绍

Transformer现在是一种在各个领域被广泛使用的模型,包括NLP,CV,语音领域。随着这几年发展,一些Transformer的变体在以下几个方面进行改进:

1. 模型效率

由于self-attention模块的计算,存储复杂度都很高,让Transformer在处理长序列数据时效率较低。主要的解决方法是对Attention做轻量化以及引入分治思想。

2. 模型泛化

Transformer没有像CNN引入归纳偏置,导致其在小规模数据集上难以训练。解决方法是引入结构偏置或正则项,在大数据集上进行预训练等等。

3. 模型适应能力

这方面工作主要是将Transformer引入下游任务中

背景知识

原始Transformer

这部分我们主要介绍原始Transformer中几个关键模块

Attention模块

Attention公式原型如下:
image.png

而Transformer中使用的是多头注意力机制,首先使用多组 , , &W\_v&来分别计算,然后将多组注意力结果拼接起来,并最后再和 做一次线性变换。整个过程如下:

image.png
10.png

Transformer整体结构图概览

在Transformer中,分以下三种Attention:

  • self-attention,自注意力机制,即上述公式中的Q,K,V都设置为输入X。
  • Masked self-attention: 用于decoder中,其中掩码保证计算注意力的时候只使用该位置以内的信息。
  • Cross-Attention: 其中Query使用的是解码器的输出,而Key和Value使用的是编码器输出。

FFN模块

前馈层就是两层全连接层加一个激活层,可以写为
image.png

残差连接和LayerNorm

在每个Transformer Block中,都加入了残差连接和LayerNorm。整个过程可以写为
image.png

位置编码

由于Transformer没有引入循环结构以及卷积结构,模型本身是缺失位置信息的。我们通过给Encoder和Decoder的输入加入位置编码,让数据带有一定位置信息

模型使用方法

通常有以下三种

  • Encoder-Decoder 常用于Sequence to Sequence的建模(如机器翻译)
  • Encoder-Only 只用了前面的编码器,常用于分类,序列标注问题
  • Decoder-Only 只用了后面的解码器,常用于序列生成任务

模型分析

这里主要分析其中两个组件FFNself-attention的复杂度和参数量 这里我们假设序列长度为T,通道数为D,FFN中间全连接层大小为4D,那么有以下表格

image.png

简单推导

image.png

矩阵乘计算复杂度补充,假设矩阵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的分析

我们总结了以下三个优点

  1. 它与全连接层有相同的最大路径长度,适合长距离建模。
  2. 相比卷积有限的感受野(在CNN中,需要堆叠很多层才能得到全局感受野),self-attention能以有限的层数建模长期依赖关系。
  3. 相比于循环层(RNN系列),self-attention的并行度更高。

image.png

关于归纳偏置

CNN使用卷积核,引入图像局部性。RNN将时间不变性引入。而Transformer抛弃了这些归纳偏置,一方面能让其足够通用灵活,另一方面Transformer很容易对小规模数据过拟合

另一个与其相关的是GNN图网络,Transformer可以被看作一个完全有向图(带自环)上的GNN,其中每个输入都是图中的一个节点(PS: 笔者对GNN不理解,这里翻译比较僵硬)。

不同种类的Transformer

22.png
后续的Transformer变体都是在以上几个组件加以改进得到。

640.png

相关工作总结图

Attention

自注意力机制是很重要的一个组件,它有如下两个问题

  1. 复杂度,在处理长序列的时候计算开销很大
  2. 结构先验,抛弃了所有归纳偏置,导致其在小型数据容易过拟合

解决方法有以下:

  1. Sparse Attention,将稀疏偏置引入到注意力计算
  2. Linearized Attention,将注意力矩阵和特征映射分离,降低至线性复杂度
  3. 显存压缩,减少QKV的数量来减小注意力矩阵
  4. 低秩self Attention,这类工作主要是抓住自注意力的低秩性
  5. 带有先验的Attention,使用预先注意力分配来补充标准的自注意力机制
  6. 改进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来限制信息交互

23.png

5种Attention图示

复合的稀疏注意力模式

使用上面的基础稀疏注意力模式进行结合,这里就不展开叙述了。

24.png

不同的复合稀疏注意力模式

扩展的稀疏注意力模式

不同于上面基础的几种注意力模式,针对一些特殊数据类型也有一些扩展的稀疏注意力。

BP-Transformer构造了一个基于二叉树的注意力模式,所有的token作为叶子节点,而内部节点则包含了多个token。更高层的span node能包含更长距离内的token。

在视觉方面的数据上,Image Transformer尝试了两种稀疏注意力模式

  1. 将图像展平,并应用一个block local sparse attention
  2. 以2维的形式,应用一个2D block local attention

Axial Transformer对于图像的每个轴,应用独立的注意力模块

26.png

扩展稀疏注意力

基于内容的稀疏注意力

一些工作是根据输入数据来创建稀疏注意力,其中一种很简单的方法是选择和给定query有很高相似度的key。

Routing Transformer采用K-means聚类方法,对中心向量集合上的key和query进行聚类。每个query只与其处在相同cluster下的key进行交互。

中心向量采用滑动平均的方法进行更新:
image.png

其中是cluster的数量,是cluster当前的向量个数

Reformer则采用local-sensitive hashing(LSH)哈希方法来为每个query选择key-value。其主要思想是对query和key哈希,分到多个桶内,在同一个桶内的query,key参与交互。
image.png

此外,Sparse Adaptive Connection将序列看作是一个图,自适应学习稀疏连接。Sparse Sinkhorn Attention使用一个排序网络,给query,key分到多个块内,并给每个query块分配一个key块,每个query只允许和对应的key进行交互。

Linearized Attention

这类方法主要是使用来近似或替代计算Attention中的,以降低计算复杂度至O(T)。(其中是在行方向上的特征映射)

45.png

标准Attention和Linearized Attention对比

我们先写出Attention的一般形式:
image.png
其中 sim 是一个用于计算向量相似性的函数。在原始Transformer是对向量做内积+softmax,我们选择用一个核函数来代替
image.png
那么前面的Attention可以改写为
image.png
这类方法有两个关键的组件,分别是特征映射和特征聚合方法

特征映射

即前面提到的,Linear Transformer使用的是,其目的不是近似标准Attention中的点积,只是性能能与标准Transformer相当。

Performer则使用的是随机特征映射方式:
image.png
在第一个版本中,Performer受启发于随机傅里叶特征映射(常用于近似高斯核)。其中:

image.png

然而第一个版本不能保证attention计算得到的score是非负的,第二版改进为:

image.png

当然还有其他特征映射方法,这里不过多阐述

聚合方法

image.png
RFA引入一种门机制,当给记忆矩阵S添加一个新关联,它通过一个可学习的标量g来让历史关联呈现出指数衰减的形式。

Schlag等人利用写入/删除的方法来增加记忆矩阵容量(这里看不懂,不展开讲了)

Query原型和显存压缩

除了对注意力稀疏化和线性化,另外一个减少注意力复杂度的方法是减少query或key-value的数量。

image.png

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专栏。
推荐阅读
关注数
18760
内容数
1316
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息