Transformer研究综述

admin 2025年3月6日14:51:45评论30 views字数 10084阅读33分36秒阅读模式
Transformer研究综述

一、基础介绍

  2017年google发表了一篇All Attention Is All You Need的论文, 在机器翻译任务中取得了SOTA的成绩。论文中提出的Transformer结构取消了传统的Seg2Seg模型中RNN和CNN传统神经网络单元,取而代之Self-Attention(自注意力机制)的计算单元。该计算单元并行化程度高,训练时间短。所以Transformer引起了学术界和工业界的广泛注意。目前已经是NLP领域的标配。随后在2019年google提出基本Transformer的bert模型, 该模型在大量的数据集中通过自监督的训练,然后在特定任务上只需要做少量改动和训练就可以得到非常好的效果,开源的bert模型在11个NLP任务上取得SOTA结果。

  Transformer除了在NLP任务上表现优异,在CV领域也取得了很多突破。2020年google又发表了一篇VIT Transformer的论文,实验证明Transformer在imagenet分类任务上取得了SOTA结果。后来CV领域中的各种基本问题,比如目标检测、语义分割、物体追踪、视频等各种任务都用Transformer方法又搞了一遍,基本上也取得了一些不错的结果。

  鉴于Transformer在NLP和CV上的巨大成功,本文竟可能详细描述Transformer的基本原理;特定的一些应用,主要是一些经典论文的方法;以及目前Transformer在效率问题上的一些改进的方案。

1.1 Attention

在学习Transformer之前,了解一些基础问题是很有必要。毕竟在没有Transformer之前,学术上在NLP领域也做了大量的研究和成果。我们先从Encoder Decoder和Seq2Seq开始说起。我想大家肯定都听过这两个名称,简单来说就是如下图。

Transformer研究综述

Encoder输入(可以是文字也可以是图像)编程成一个固定长度的向量(content),那么这个content向量肯定是包含输入的信息的(至于包含多少那就看这个编码了),Decoder根据content解码出我们需要的结果。Encoder Decoder可以是机器翻译问题、语义分割问题等等。那么Seq2Seq(Sequence-to-sequence )是什么?输入一个序列,输出另一个序列。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。如下图所示。

Transformer研究综述

从本质上看,Encoder-Decoder和seq2seq好像差不多,但是又有一点区别。

  • Seq2Seq 属于 Encoder-Decoder 的大范畴

  • Seq2Seq 更强调目的,Encoder-Decoder 更强调方法

那么这个Encoder-Decoder有什么缺陷呢?

  从上面的示意图我们看到,无论输入的信息有多少,Encoder后就剩下一个content向量了,那么这里面有一个缺陷就是这个content向量会丢掉一些信息,特别是输入很大(文本很长图像分辨率很高)的情况下。尽管后面出现的LSTM、GRU等通过设计的循环神经网络单元,可以一定程度上缓解长距离问题,但是效果有限。

  从这里开始,我们要进入文章的正题了,Transformer的核心是Self-Attention,那么在这之前,我们最起码要了解什么是Attention,然后再看是怎么在Attention的基础上加上self的。

1.1.1 NLP中的Attention

   由于传统的Encoder-Decoder模型将所有的输入信息编码成一个固定长度的content向量存在长距离问题。那么随之而然的一个做法就是我们在decoder阶段解码Transformer研究综述

不仅依赖前一个节点的隐藏状态Transformer研究综述, 同时依赖Encoder阶段所有的状态,就和我们自己翻译的时候一样。这里有两个经典注意力机制,Bahdanau Attention (2014年提出)和 Luong Attention(2015年)。

Transformer研究综述

1.1.2 CV中的Attention

  视觉中的Attention比较简单。一言以蔽之就是生成一个mask作用于特征图上。作用域的不同又分为三个类别。

  • 通道注意力机制, 对通道生成掩码mask, Channel Attention Module

  • 空间注意力机制, 对空间进行掩码的生成, Spatial Attention Module

  • 混合域注意力机制, 时对通道注意力和空间注意力进行评价打分, Convolutional Block Attention Module

1.1.2.1 通道注意力机制(CAM)

示意图如下:

Transformer研究综述

代码如下(pytorch)

class ChannelAttention(nn.Module):    def __init__(self, in_planes, rotio=16):        super(ChannelAttention, self).__init__()        self.avg_pool = nn.AdaptiveAvgPool2d(1)        self.max_pool = nn.AdaptiveMaxPool2d(1)        self.sharedMLP = nn.Sequential(            nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(),            nn.Conv2d(in_planes // rotio, in_planes, 1, bias=False))        self.sigmoid = nn.Sigmoid()    def forward(self, x):        avgout = self.sharedMLP(self.avg_pool(x))        maxout = self.sharedMLP(self.max_pool(x))        return self.sigmoid(avgout + maxout)

1.1.2.2 空间注意力机制(SAM)

示意图如下:

Transformer研究综述

代码如下(pytorch)

class SpatialAttention(nn.Module):    def __init__(self, kernel_size=7):        super(SpatialAttention, self).__init__()        assert kernel_size in (3,7), "kernel size must be 3 or 7"        padding = 3 if kernel_size == 7 else 1        self.conv = nn.Conv2d(2,1,kernel_size, padding=padding, bias=False)        self.sigmoid = nn.Sigmoid()    def forward(self, x):        avgout = torch.mean(x, dim=1, keepdim=True)        maxout, _ = torch.max(x, dim=1, keepdim=True)        x = torch.cat([avgout, maxout], dim=1)        x = self.conv(x)        return self.sigmoid(x)

1.1.2.3 混合域注意力机制(CBAM)

示意图如下:

Transformer研究综述

代码如下(pytorch)

class BasicBlock(nn.Module):    expansion = 1    def __init__(self, inplanes, planes, stride=1, downsample=None):        super(BasicBlock, self).__init__()        self.conv1 = conv3x3(inplanes, planes, stride)        self.bn1 = nn.BatchNorm2d(planes)        self.relu = nn.ReLU(inplace=True)        self.conv2 = conv3x3(planes, planes)        self.bn2 = nn.BatchNorm2d(planes)        self.ca = ChannelAttention(planes)        self.sa = SpatialAttention()        self.downsample = downsample        self.stride = stride    def forward(self, x):        residual = x        out = self.conv1(x)        out = self.bn1(out)        out = self.relu(out)        out = self.conv2(out)        out = self.bn2(out)        out = self.ca(out) * out  # 广播机制        out = self.sa(out) * out  # 广播机制        if self.downsample is not None:            residual = self.downsample(x)        out += residual        out = self.relu(out)        return out

1.2 Self-Attention

Self-Attention是Transformer中的核心模板,搞清楚Self-Attention后,Transformer就容易搞清楚了。首先任何新的模型或者方案的提出肯定是因为之前的模型有所缺点。那我们想一下在NLP中的Attention机制中有什么缺点呢?

  • 在传统的Attention中,已经考虑到了Decoder阶段的词(token)和Encoder阶段的每一个词(token)之间的关联了(通过对每一个Encoder阶段的隐向量加权求和)。但是Encoder中的每一个词之间有没有关联呢?如果有关联,我们把这种关联考虑到我们的编码中是不是效果要好一点?我觉得Self-Attention中的self就是指的是Encoder阶段所有的词(token)之前自已的关联(当然Decoder阶段也可以)

  • 传统的Attention是利用RNN网络来实现的,每一个输入都依赖于上一个阶段的输出,训练的时候模型并行程度不高,也就意味着效率低下。

基于这样的考虑, google在2017年提出了一个完全全新的注意力机制Self-Attention

我们看一下Self-Attention的结构。Self-Attention的核心结果是Multi-Head Attention。 Multi-Head Attention的核心结构是Scaled Dot-Product Attention。

Transformer研究综述

Scaled Dot-Product Attention的数学表达如下:

Transformer研究综述

Transformer研究综述

举一个更详细的例子如下,假设输入是Thinking Machines

Transformer研究综述

Transformer研究综述

Transformer研究综述

1.3 Transformer

Transformer结构就是Multi-Head Attention结构的嵌套。整体结构如下。

Transformer研究综述

Transformer结构

论文Encoder、Decoder都是6个固定结构的嵌套。每个Encoder包含两个部分,(1)Multi-Head Attention加残差链接;(2)前向网络加残差链接。

1.3.1 Transformer常见问题的思考

  • 为什么一定要位置编码?输入矩阵是将单词按顺序排列的,这个难道不是包含了顺序信息

在翻译阶段,Q来自Decoder,K,V来自Encoder。Attention的计算公式为

Transformer研究综述

。交换K,V中任意两行的顺序,这个计算的结果是不变的,也就是说尽管输入矩阵K,V本身是包含顺序的,但是经过计算这个顺序丢失了。所以需要额外的加入位置编码

  • Self-Attention为什么dot-product attention采用而不用additive attention

additive attention与dot-product attention的区别主要是Encoder的隐向量和Decoder的隐向量是如何交互的,如果是Bahdanau Attention的计算方式(一个全连接网络)那就是additive attention;如果通过Self-Attention计算公式那就是dot-product attention

Transformer研究综述

至于使用additive attention还是dot-product attention其实都是可以。按照论文中的表述主要是因为dot-product attention可以更快

Transformer研究综述

Transformer研究综述

二、Transformer 应用

Transformer研究综述

2.1 VIT

2.1.1 简介

ViT是2020年Google团队提出的将Transformer应用在图像分类的模型,虽然不是第一篇将transformer应用在视觉任务的论文,但是因为其模型“简单”且效果好,可扩展性强(scalable,模型越大效果越好),成为了transformer在CV领域应用的里程碑著作,也引爆了后续相关研究

把最重要的说在最前面,ViT源论文中最核心的结论是,当拥有足够多的数据进行预训练的时候,ViT的表现就会超过CNN,突破transformer缺少归纳偏置的限制,可以在下游任务中获得较好的迁移效果

但是当训练数据集不够大的时候,ViT的表现通常比同等大小的ResNets要差一些,因为Transformer和CNN相比缺少归纳偏置(inductive bias),即一种先验知识,提前做好的假设。CNN具有两种归纳偏置,一种是局部性(locality/two-dimensional neighborhood structure),即图片上相邻的区域具有相似的特征;一种是平移不变性(translation equivariance), f(g(x))=g(f(x)) ,其中g代表卷积操作,f代表平移操作。当CNN具有以上两种归纳偏置,就有了很多先验信息,需要相对少的数据就可以学习一个比较好的模型

2.1.2 ViT的结构

ViT将输入图片分为多个patch(16x16),再将每个patch投影为固定长度的向量送入Transformer,后续encoder的操作和原始Transformer中完全相同。但是因为对图片分类,因此在输入序列中加入一个特殊的token,该token对应的输出即为最后的类别预测

Transformer研究综述

ViT只使用了Transformer的encoder

按照上面的流程图,一个ViT block可以分为以下几个步骤

(1) patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patch大小为16x16,则每张图像会生成224x224/16x16=196个patch,即输入序列长度为196,每个patch维度16x16x3=768,线性投射层的维度为768xN (N=768),因此输入通过线性投射层之后的维度依然为196x768,即一共有196个token,每个token的维度是768。这里还需要加上一个特殊字符cls,因此最终的维度是197x768。到目前为止,已经通过patch embedding将一个视觉问题转化为了一个seq2seq问题

(2) positional encoding(standard learnable 1D position embeddings):ViT同样需要加入位置编码,位置编码可以理解为一张表,表一共有N行,N的大小和输入序列长度相同,每一行代表一个向量,向量的维度和输入序列embedding的维度相同(768)。注意位置编码的操作是sum,而不是concat。加入位置编码信息之后,维度依然是197x768

(3) LN/multi-head attention/LN:LN输出维度依然是197x768。多头自注意力时,先将输入映射到q,k,v,如果只有一个头,qkv的维度都是197x768,如果有12个头(768/12=64),则qkv的维度是197x64,一共有12组qkv,最后再将12组qkv的输出拼接起来,输出维度是197x768,然后在过一层LN,维度依然是197x768

(4) MLP:将维度放大再缩小回去,197x768放大为197x3072,再缩小变为197x768

一个block之后维度依然和输入相同,都是197x768,因此可以堆叠多个block。最后会将特殊字符cls对应的输出 z 作为encoder的最终输出 ,代表最终的image presentation(另一种做法是不加cls字符,对所有的tokens的输出做一个平均),如下图公式(4),后面接一个MLP进行图片分类

Transformer研究综述

关于image presentation

是否可以直接使用average pooling得到最终的image presentation,而不加特殊字符cls,通过实验表明,同样可以使用average pooling,原文ViT是为了尽可能使模型结构接近原始的Transformer,所以采用了类似于BERT的做法,加入特殊字符

Transformer研究综述

学习率的影响较大,注意调参

关于positional encoding

1-D 位置编码:例如3x3共9个patch,patch编码为1到9

2-D 位置编码:patch编码为11,12,13,21,22,23,31,32,33,即同时考虑X和Y轴的信息,每个轴的编码维度是D/2

实际实验结果表明,不管使用哪种位置编码方式,模型的精度都很接近,甚至不适用位置编码,模型的性能损失也没有特别大。原因可能是ViT是作用在image patch上的,而不是image pixel,对网络来说这些patch之间的相对位置信息很容易理解,所以使用什么方式的位置编码影响都不大

Transformer研究综述

关于CNN+Transformer

既然CNN具有归纳偏置的特性,Transformer又具有很强全局归纳建模能力,使用CNN+Transformer的混合模型是不是可以得到更好的效果呢?将224x224图片送入CNN得到16x16的特征图,拉成一个向量,长度为196,后续操作和ViT相同

2.1.3 实验部分

实验结果

Transformer研究综述

ViT和其它SOTA模型性能对比,展示了准确率accuraces的均值和标准差,所有结果都是取三轮微调均值的结果(averaged over three fine-tunning runs)。有关ImageNet的实验,在更高分辨率图片上微调(512 for ViT-L/16 and 518 for ViT-H/14),同时使用了Polyak averaging(0.9999)

Transformer研究综述

Linear few-shot evaluation on ImageNet versus pre-training size

如上图,在同一个数据集(JFT),分别抽取不同数量的数据(10M,30M,100M,300M),避免不同数据集之间的gap,同时不适用额外的regularization,超参数保证相同。linear evaluation是指直接把预训练模型当作特征提取器,不fine-tune,拿提取到的特征直接做logistic regression。few-shot是指在evaluation的时候,每一类只sample五张图片。

可以看到当数据集很小时,CNN预训练模型表现更好,证明了CNN归纳偏置的有效性,但是当数据集足够大时,归纳偏置和Transformer比较就失去了优势,甚至没有归纳偏置,直接从数据learn patterns会更有效。

模型可视化

Transformer研究综述

位置编码的相似性分析(cos),位置越接近,patches之间的相似度越高;相同行/列的patches有相似的embeddings;

为了理解self-attention是如何聚合信息的(To understand how ViT uses self-attention to integrate information across the image),基于attention weight计算不同layer不同head的average attention distance

Transformer研究综述

每一个layer的每一个head的average attention distance,类似于CNN感受野的概念,可以发现一些head在第一个layer就attention 到了几乎整张图片的范围

average attention distance,是基于attention weight计算,具体做法是用attention weight乘以query pixel和所有其他pixels的距离,再求平均。原文中是这么表述的——Attention distance was computed for 128 example images by averaging the distance between the query pixel and all other pixels, weighted by the attention weight. Each dot shows the mean attention distance across images for one of 16 heads at one layer. Image width is 224 pixels.

Transformer研究综述

Representative examples of attention from the output token to the input space.

2.2 Behavior Sequence Transformer

2.2.1 简介

现在深度学习已经广泛应用到了各种CTR预估模型中,但是大多数模型的输入只是concat不同的特征,而忽视了用户历史行为本身的序列特征。比如一个用户很有可能买了苹果手机后,会买手机套,买了裤子之后会选择继续买个配套的鞋子。而之前一些模型比如wide&deep,就没有利用用户行为历史序列中的order information。DIN模型使用注意力机制来捕获目标商品与用户先前行为序列中商品之间的相似性,但仍然未考虑用户行为序列背后的序列性质。

因此为了解决上述问题,本文尝试将NLP领域中大放异彩的Transformer模型来做推荐任务。具体:使用self-attention模块来学习用户行为历史序列中各个item的序列信息

2.2.2  模型

  • 问题建模:给定一个用户u的行为序列:S(u) = {v1,v2, ...,vn },学习一个函数F用于预测用户u点击item vt的概率。其它特征包括:user profile, context, item和cross features,如下图所示

Transformer研究综述

  • 模型结构:

Transformer研究综述

  1. Embedding Layer:左侧部分通过embedding层将所有的other features映射成固定维度的向量,然后concat起来。另外,该模型也将行为序列中的每个Item(包括目标 Item)通过相同的embedding层映射成低维度的向量。这里需要注意的是,每个Item通过两部分来表示:“序列 item 特征”(红色部分)和“位置特征”(深蓝色),其中,“序列 item 特征”包括 item_id 和 category_id(item通常包括上百个特征,但是item-id和category_id两个特征对于performance来说就已经够了)。位置特征用来刻画用户历史行为序列中的顺序信息,文中将“位置”作为中每个 item 的另一个输入特征,然后将其投射为低维向量。第i个位置的位置特征计算方式为pos(vi)=t(vt)-t(vi),其中,t(vt) 表示推荐的时间戳,t(vi) 表示用户点击商品vi时的时间戳。

  2. Transformer layer:对于每个item抽取了一个更深层次的representation,用于捕捉该item和历史行为序列中的其他item的关系。

  • Self-attention:Transformer 层中的multi-head attention模块输出Transformer研究综述

其中headi为:

Transformer研究综述

self-attention的计算公式为:

Transformer研究综述

  • Point-wise Feed-Forward Network:目的是增加非线性。在self-attention和FFN中都使用了dropout和LeakyReLU,最终self-attention和FFN的输出为:

Transformer研究综述

  • Stacking the self-attention block:上面的两步操作被称为一个self-attention 单元。为了抽取出item序列中更加复杂的潜在关联特征,该模型堆叠了几层self-attention单元:

Transformer研究综述

3. MLP layers and Loss function: 将所有的embedding进行拼接,输入到三层的神经网络中,并最终通过sigmoid函数转换为0-1之间的值,代表用户点击目标商品的概率。loss函数:

Transformer研究综述

2.2.3  实验结果

Transformer研究综述

其中,b表示Transformer的block堆叠的层数,论文里试验了1层、2层和3层的效果,最终1层的效果最好。

原文始发于微信公众号(风物长宜 AI):Transformer研究综述

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月6日14:51:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Transformer研究综述https://cn-sec.com/archives/3804809.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息