Transformer

Transformer_第1张图片
一、背景
Transformer 作为 NLP 领域的大杀器,目前已经在 CV 领域逐渐展露锋芒,大有替代 CNN 的趋势,在图像分类,视频处理,low/high level 的视觉任务都有相应的 transformer 刷榜。
下表是transformer截至目前在视觉领域的应用。
Transformer_第2张图片
transformer 在CV中的应用可以分为四类,分别是classification, high-level vision, low-level vision 和video processing.(在这里解释一下什么是high-level vision,和low-level vision ,低级视觉关注的是类似从视网膜这类图像中提取图像的特性。高级视觉主要关注的是知觉组织的日常功能。详细解释看文章末尾的注释)
Classification 顾名思义就是分类任务,High-level vision 作者定义为:“对图像中所见内容的解释和使用”,包括目标检测、分割等。Low-level vision 定义为“为图像提取描述信息”,典型应用包括超分,图像去噪,风格迁移等。
二、算法原理
Transformer_第3张图片
1.结构
transformer是采用encoder-decoder架构。
encoder层是6层encoder堆叠在一起的,decoder是6层decoder堆叠在一起。一个encoder是由Self-Attention(自注意力机制层)和Feed Forward(前向神经网络层)组成,而decoder比encoder多了一层Encoder-Decoder Attention,该层目的是接收encoder层的结果。值得注意的是,decoder与encoder的Self-Attention并不完全相同,decoder采用的是Masked Self-Attention(掩码自注意力)。
2.算法流程
encoder层
1)每个特征向量(feture embedding)➕ 对应的位置向量(positional embedding)= 编码器的输入向量x
2)输入向量通过多头自注意力机制(Multi-Head Attention)得到的向量与输入向量进行残差连接与归一化(Add & Normalize)
3)将归一化得到的每个特征的向量继续做前向神经网络(Feed Forward)
4)最后再进行一次残差连接与归一化(Add & Normalize)
此时一层encoder层结束,将得到的结果向量当成输入向量继续传给第二层的encoder,依次传递计算,直到6层encoder计算结束,将最后结果向量保留,之后会传给decoder层计算。
decoder层
1)encoder的输出向量(feture embedding)➕ 随机向量(object queris)=decoder输入向量x
2)输入向量x同样经过多头自注意力机制(Multi-Head Attention)处理和残差连接与归一化
3)这一步的Encoder-Decoder Attention,其中q、k是来自于encoder层的结果,而v是本身上一层的结果
4)接下来几步和上面encoder的步骤是一样的,最后得到结果向量,作为decoder第二层的输入向量。然后依次进行以上步骤,直到6层decoder全部计算结束。
transformer的整个运行过程,其主要核心就是Self-Attention机制,而其在encoder层和decoder层又是不同实现的。其主要原因是encoder层是相当于学习到输入图像的特征信息,所以需要将不同位置的特征都包含进来计算,而decoder层相当于进行预测分类,因而只需要关注局部信息,而将其他区域的特征都盖住。
Multi-Head Attention(多头注意力机制)
作用:多层注意力层进行一系列的矩阵运算把特征拆分成多个维度并行输出,它的作用主要是允许模型在不同位置共同关注着来自不同表示子空间的信息。让模型捕捉更多的信息,将特征变得更丰富些,提升Transformer的建模能力。
运算过程:一个输入向量x乘以不同的权重系数得到多组q、k、v,x与q、k、v之间进行矩阵运算从而得到多个z,将多个z拼接成一个大矩阵,乘以权重矩阵wo,得到最后的结果向量z。(查询向量q、键向量k、值向量v)
Feed Forward Neural Network(前馈神经网络
Feed Forward Neural Network(前馈神经网络)包含两层,第一层是ReLU激活函数,第二层是一个线性激活函数
Add & Normalize(残差连接&归一化)层
残差连接就是将输入向量加上输出向量后传给下一层。
例如:假设一个输入向量x,经过一个网络结构,得到输出向量f(x),即:x->f(x),这时加上残差连接,相当于在输出向量中加入输入向量,输出结构变为f(x)+x。作用:避免了梯度消失的问题,因为对x求偏导时,总会有一个常数项1。因此,Add & Normalize层的实质是,输出向量经过残差连接与输入向量相加然后通过LayerNorm进行归一化,将最后结果传给下一层。
3.详解
1)Self-Attention Layer
自注意力机制先将一个 embedding 转化为三个向量,query,key 和 value (q、k、v ),三者的维度都与原始 embedding 一致。所有的 embedding 放在一起组成三个大矩阵Q,K,V ,然后注意力机制计算过程如下
1)计算不同输入向量的得分 S=Q乘以K^T
2)为了梯度的稳定性将得分进行归一化Sn=S/[(dk)^1/2]
3) 将归一化后的得分转化为概率P=softmax(Sn)
4)最后得到加权的矩阵 Z=V乘以P
这整个过程可以被统一为一个简单的函数:
在这里插入图片描述
第 1 步计算两个不同向量之间的分数,这个分数用来确定我们在当前位置编码对其他位置特征的注意程度。步骤 2 标准化得分,使其具有更稳定的梯度,以便更好地训练;步骤 3 将得分转换为概率。最后,将每个值向量乘以概率的总和,概率越大的向量将被下面几层更多地关注。
2)encoder-decoder attention layer
encoder-decoder attention layer 其实和自注意力机制非常类似,不同之处在于,key,value 矩阵K,V是从 encoder 那里继承来的,Q是从上一层继承来的。
数学定义为:
Transformer_第4张图片
pos 表示 token 在 sequence 中的位置,例如第一个 token 就是 0。
i和2i+1表示了 Positional Encoding 的维度.
3)Multi-Head Attention layer
Multi-Head Attention layer是为了提高模型的表达能力。在上面 single-head 的模型中,我们最终得到的 embedding 融合了其他各个位置,但是他很有可能被本身 dominate(自身对自身的 attention 一般很大),而且我们不能确保随机初始化后不断学习得到 Q、K、V这些矩阵带来的 attention 一定对。因此 multi-head 可以看作是一种 ensemble,我们现在有多组矩阵 ,他们将同一个输入 embedding 映射到不同的表达空间以此来提高模型的表达能力。不过此时 query,key,value 的维度不再与原始 embedding 一致,而是变为d(medel)/h ,因此每个 head 经过 self-attention 将 word 映射为d(medel)/h维的embedding,将这些 embedding 连接在一起就变为原始维度。
数学定义如下:
在这里插入图片描述
在这里插入图片描述
这就是基本的 Multihead Attention 单元,对于 encoder 来说就是利用这些基本单元叠加,其中 key, query, value 均来自前一层 encoder 的输出,即 encoder 的每个位置都可以注意到之前一层 encoder 的所有位置。
对于 decoder 来讲,我们注意到有两个与 encoder 不同的地方,一个是第一级的 Masked Multi-head,另一个是第二级的 Multi-Head Attention 不仅接受来自前一级的输出,还要接收 encoder 的输出,下面分别解释一下是什么原理。
第一级 decoder 的 key, query, value 均来自前一层 decoder 的输出,但加入了 Mask 操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。
而第二级 decoder 也被称作 encoder-decoder attention layer,即它的 query 来自于之前一级的 decoder 层的输出,但其 key 和 value 来自于 encoder 的输出,这使得 decoder 的每一个位置都可以 attend 到输入序列的每一个位置。
总结一下,k 和 v 的来源总是相同的,q 在 encoder 及第一级 decoder 中与 k,v 来源相同,在 encoder-decoder attention layer 中与 k,v 来源不同。
4.Other Parts in Transformer
Residual in the encoder and decoder:在上面的结构图中可以看到,每个 encoder,decoder 模块都是会有一个残差连接+ layerNorm 的。
在这里插入图片描述
具体而言就是:
在这里插入图片描述
Feed-forward neural network:这个模块不是简单的 FCN,而是两层 FCN 加一个非线性的激活函数,即
在这里插入图片描述
Final layer in decoder:解码器的最后一层旨在将向量转为一个字。这是通过一个线性层和一个 softmax 层来实现的。线性层将向量投影到一个dword维的logit向量中,其中dword是词汇表中的单词数。然后,使用 softmax 层将 logits 向量转换为概率。
5.总结
大多数用于计算机视觉任务的 Transformer 都使用原编码器模块。总之,它可以被视为一种不同于 CNN 和递归神经网络 RNN 的新型特征选择器。与只关注局部特征的 CNN 相比,transformer 能够捕捉到长距离特征,这意味着 transformer 可以很容易地获得全局信息。
与 RNN 的隐态计算顺序相比较,Transformer 的自注意层和全连接层的输出可并行计算,且速度快。因此,进一步研究 Transformer 在自然语言处理和计算机视觉领域的应用具有重要意义。
三、Transformer在CV领域的应用
图像作为一种高维、噪声大、冗余度高的形态,被认为是生成建模的难点,这也是为什么过了好几年,transformer 才应用到视觉领域。比较初始的应用是在 Visual Transformer 一文中,作者使用 CNN 提取 low-level 的特征,然后将这些特征输 入Visual Transformer(VT)。
在 VT 中,作者设计了一个 tokenizer 将各个 pixel 分成少量的 visual tokens,每个 token 代表了图像中的某些语义信息。然后使用 transformer 来建模 token 之间的关系。最后输出的 tokens 直接被用来做分类或者处理一下恢复成特征图用于实例分割。
在 CV 中使用 transformer,目前来看主要的两个问题,以及下列文章的核心区别在于:

  • 得到 Token 的方式
  • 训练的方式
  • 评估 representation 的方式
    只要得到 token,我们就能像 NLP 一样使用 transformer;有训练目标我们就能 train 我们的 model;有评估方式我们才知道自己的 model 好还是坏。(token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。)
    1)Token:iGPT 使用一种比较暴力的方式得到 token,原始图像(322 )进行预处理,将其调整为低分辨率,并将其重塑为一维序列(从左到右,从上到小)。接着把每个像素相当于一个 word,即对每个 pixel,我们采用nn.Embedding(num_vocab, embed_dim)提取每个像素 embedding。至此图片数据已经完全转化为了 transformer 的输入形式。
    2)Pretrain:iGPT 有两种预训练方式:1)像自编码器一样进行逐像素预测;2)像 Bert 一样 mask 一部分 pixel 然后预测。其实第一种方式的实现与 bert 也很类似,就是预测第 i个 pixel 的时候,mask 掉 i+1 之后的所有 pixel。
    3)Evaluation:两种评估方式:1)fine-tune:增加了一个小的分类头,用于优化分类目标并 adapt 所有权重;2)Linear-probe:将 pretraining 的模型视作特征提取器,增加一个分类头,只训练这个分类头。第二种方式的直觉在于“一个好的特征应该能够区分不同的类”,除此之外,fine-tune 效果好有可能是因为架构很适合下游任务,但是 linear-probe 只取决于特征质量。
    四、在目标检测中的应用(High-level Vision)
    基于 transformer 的目标检测可以分为两类,也即下图的 (a)(b):
    Transformer_第5张图片
    Transformer-based set prediction for detection. DETR 是这类工作的先驱,其将目标检测视为集合预测问题,去掉了目标检测种很多手工的组件像 NMS,anchor generation 等。
    Token:CNN 将图像 downsample 为Z0 ,然后将Z0 的空间维度压缩为一维,造成一个序列 。这个 token 的获取方式挺有意思,空间维度塌缩。当然也要加上位置编码。
    Train:如何将 object detection 转化为 set prediction 然后进行训练,这是一个非常有意思的问题。作者使用了 object queries,这实际上是另一组可学习的 positional embedding,其功能类似于 anchor。之后每个 query 经过 decoder 后算一个 bbox 和 class prob。
    Evaluation:目标检测传统的评估方式。
    Transformer_第6张图片
    DETR 也大方地承认了他的缺点:训练周期长,对小物体检测效果差。
    Transformer-based backbone for detection.与 DETR 不同,ViT-FRCNN [3] 将 ViT 与传统的检测框架融合,直接使用 transformer 的 encoder 作为 backbone 提取特征,与 ViT 处理图像的方式一致,但是输出的 patch feature 重新调整为一个图像的特征图送入传统检测模型。
    Transformer_第7张图片
    总结一下,目前 transformer 已经在很多视觉应用中展现出了强大的实力。使用 transformer 最重要的两个问题是如何得到输入的 embedding(妥善处理position embedding),模型的训练与评估。
    目前还有很多非常有价值的课题值得我们探索,例如,对于最终的性能,像 CNN 或 PointNet 这样的特征提取模块是必要的吗?如何让 visual transformer 受益于像 BERT 或 GPT-3 在 NLP 社区做的大规模的预训练数据。是否有可能预先训练单个 transformer 模型,并通过几次微调来针对不同的下游任务进行微调?

参考资料:
1)Transformer讲解以及在CV领域的应用
https://blog.csdn.net/qq_40585800/article/details/112427990
2)视觉Transformer最新综述
视觉算法
3)视觉Transformer综述
https://blog.csdn.net/KANG157/article/details/111771262
4)综述论文
https://arxiv.org/pdf/2012.12556.pdf
5)图解Transformer
https://zhuanlan.zhihu.com/p/94998435
注释
1. Low-level feature和High level feature
1)Low-level feature: 通常是指图像中的一些小的细节信息,例如边缘(edge),角(corner),颜色(color),像素(pixeles), 梯度(gradients)等,这些信息可以通过滤波器、SIFT或HOG获取;
2)High level feature:是建立在low level feature之上的,可以用于图像中目标或物体形状的识别和检测,具有更丰富的语义信息。
通常卷积神经网络中都会使用这两种类型的features,卷积神经网络的前几层学习low level feature,后几层学习的是high level feature,区别于high-level vision,和low-level vision。

你可能感兴趣的:(Transformer)