复旦大学邱锡鹏教授团队:Transformer最新综述

©PaperWeekly 原创 · 作者 | 王馨月

学校 | 四川大学本科生

研究方向 | 自然语言处理

Transformer 在自然语言处理、计算机视觉、音频处理等许多人工智能领域都取得了巨大的成功,也吸引了学术界和行业研究人员的大量兴趣。到目前为止,已经有各种各样的 Transformer 变体(又名 X-former)被提出,但是,关于这些 Transformer 变体的系统而全面的文献综述仍然缺失。这篇综述对各种 X-former 进行了全面介绍。 

这篇综述首先简要介绍了原版 Transformer,然后提出了一种新的 X-former 分类法。接着从架构修改、预训练、应用三个角度介绍各种 X-former。最后,概述了未来研究的一些潜在方向。

论文标题:

A Survey of Transformers

论文作者:

Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu

论文链接:

https://arxiv.org/abs/2106.04554

引言

Transformer 最初是作为机器翻译的 Seq2Seq 模型提出的。后来的工作表明,基于 Transformer 的预训练模型 (PTM) 可以在各种任务上实现 SOTA。因此,Transformer,特别是 PTM,已成为 NLP 中的首选架构。除了语言相关的应用,Transformer 还被 CV,音频处理甚至其他学科采用。在过去几年中提出了各种 Transformer 变体(又名 X-former),这些 X-former 也从不同的角度改进了原版 Transformer。

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

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

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

在这篇综述中,我们旨在全面回顾 Transformer 及其变体。虽然我们可以根据上述观点来分类 X-former,但许多现有的 X-former 可能会解决一个或几个问题。例如,稀疏注意力不仅降低了计算复杂度,而且在输入数据上引入了结构先验以缓解小数据集上的过拟合问题。因此,对现有的各种 X-former 进行分类,并主要根据它们改进原版 Transformer 的方式提出新的分类法:架构修改、预训练和应用。

原版 Transformer

Transformer 分类

迄今为止,已经从三个角度提出了基于原版 Transformer 的各种模型:架构修改类型、预训练方法和应用程序。如图:

详细的 Transformer 分类如下图:

模型层面

2.1 注意力机制

Self-attention 在 Transformer 中扮演着重要的角色,但在实际应用中存在两个挑战。

1. 复杂性。self-attention 的复杂度是 。因此,在处理长序列时 Attention 模块会成为瓶颈。

2. 结构先验。Self-attention 不假设对输入有任何结构性偏见。甚至顺序信息也需要从训练数据中学习。因此,无预训练的 Transformer 通常很容易在小型或中等规模的数据上过拟合。

Attention 机制的改进可以分为几个方向:

1. 稀疏注意力。这一系列工作将稀疏偏差引入 Attention 机制,从而降低了复杂性。

2. 线性化注意力。这一系列工作将注意力矩阵与核特征图分解,然后以相反的顺序计算注意力以实现线性复杂度。

3. 原型和内存压缩。这类方法减少了查询或键值记忆对的数量,以减少注意力矩阵的大小。

4. 低秩的自注意力。这一系列工作捕获了 Self-attention 的低秩属性。

5. 先验注意力。该研究领域探索用先验的注意力分布来补充或替代标准注意力。

6. 改进的多头机制。这一系列工作探索了多个不同的多头(Multi-head)机制。

2.1.1 Sparse Attention 稀疏注意力

在标准的自注意力机制中,每个 token 都需要关注所有其他 token。然而,据观察,对于经过训练的 Transformer,学习到的注意力矩阵 A 在大多数数据点上通常非常稀疏。因此,可以通过结合结构偏差来限制每个查询关注的查询键对的数量来降低计算复杂度。

从另一个角度来看,标准注意力可以被视为一个完整的二分图,其中每个查询从所有内存节点接收信息并更新其表示。稀疏注意力可以被认为是一个稀疏图,其中删除了节点之间的一些连接。基于确定稀疏连接的指标,我们将这些方法分为两类:基于位置的稀疏注意力和基于内容的稀疏注意力。

2.1.1.1 基于位置的稀疏注意力

在基于位置的稀疏注意力中,注意力矩阵根据一些预定义的模式受到限制。虽然这些稀疏模式以不同的形式变化,但我们发现其中一些可以分解为一些原子稀疏模式。

1. 原子稀疏注意力:全局注意力(Global)、带状注意力(Band)、扩张注意力(Dilated)、随机注意力(Random)、块局部注意力(Block Local);

2. 复合稀疏注意力:现有的稀疏注意力通常由以上原子模式中的一种以上组成。 如图:

3. 拓展稀疏注意力:除了上述模式,一些现有的研究探索了特定数据类型的扩展稀疏模式。对于文本数据,有 BP-Transformer;还有一些视觉数据的扩展,如 Image Transformer 和 Axial Transformer。如图:

2.1.1.2 基于内容的稀疏注意力 

另一行工作基于输入内容创建稀疏图,即稀疏连接以输入为条件。构建基于内容的稀疏图的一种直接方法是选择那些可能与给定查询具有较大相似性分数的键。为了有效地构建稀疏图,我们可以递归到最大内积搜索 (MIPS) 问题,即尝试通过查询找到具有最大点积的键,而无需计算所有点积项。

2.1.2 线性注意力

线性化注意力是一类用

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Dilated Neighborhood Attention Transformer是一种基于Neighborhood Attention Transformer的改进模型,它通过引入空洞卷积(Dilated Convolution)来扩大感受野,从而提高模型的性能。具体来说,Dilated Neighborhood Attention Transformer在每个层级中使用了多个不同的空洞卷积核,这些卷积核的空洞率逐渐增加,从而使得每个query的感受野逐渐扩大。这种方法可以在不增加计算复杂度的情况下提高模型的性能,特别是在处理长序列数据时效果更为明显。 以下是Dilated Neighborhood Attention Transformer的实现代码: ```python import torch import torch.nn as nn import torch.nn.functional as F class DilatedNeighborhoodAttention(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, dilation_rate): super(DilatedNeighborhoodAttention, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, padding=dilation_rate*(kernel_size-1), dilation=dilation_rate) self.norm = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = self.conv(x) x = self.norm(x) x = self.relu(x) return x class DilatedNeighborhoodAttentionTransformer(nn.Module): def __init__(self, num_layers, num_heads, d_model, d_ff, dropout): super(DilatedNeighborhoodAttentionTransformer, self).__init__() self.num_layers = num_layers self.self_attentions = nn.ModuleList([nn.MultiheadAttention(d_model, num_heads, dropout=dropout) for _ in range(num_layers)]) self.dilated_attentions = nn.ModuleList([DilatedNeighborhoodAttention(d_model, d_model, kernel_size=3, dilation_rate=2**i) for i in range(num_layers)]) self.ffns = nn.ModuleList([nn.Sequential(nn.Linear(d_model, d_ff), nn.ReLU(inplace=True), nn.Linear(d_ff, d_model)) for _ in range(num_layers)]) self.norms1 = nn.ModuleList([nn.LayerNorm(d_model) for _ in range(num_layers)]) self.norms2 = nn.ModuleList([nn.LayerNorm(d_model) for _ in range(num_layers)]) self.dropout = nn.Dropout(dropout) def forward(self, x): for i in range(self.num_layers): residual = x x, _ = self.self_attentions[i](x, x, x) x = self.norms1[i](residual + self.dropout(x)) residual = x x = self.dilated_attentions[i](x) x = self.norms2[i](residual + self.dropout(x)) residual = x x = self.ffns[i](x) x = self.norms2[i](residual + self.dropout(x)) return x ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值