最近Transformer很火热,在很多领域都有所贡献,我也进行了学习。因为主要研究领域不是NLP所以学的知识属于比较通识性的没有非常深入,适合同样想要了解一下的朋友。现将相关资料学习整理后记录。
目录
参考资料链接:
NLP中的Attention原理和源码解析 - 知乎 (zhihu.com)
【NLP】Transformer模型原理详解 - 知乎 (zhihu.com)
attention机制原理及简单实现 - 简书 (jianshu.com)
Attention机制简单总结 - 知乎 (zhihu.com)
(6条消息) 图解Transformer(完整版)_龙心尘-CSDN博客_transformer
Transformer在计算机视觉领域走到哪了? (qq.com)
(6条消息) Vision Transformer 论文_368chen的博客-CSDN博客
1、NLP中的Attention
对于一段文本序列,通常要使用某种机制对该序列进行编码,通过降维等方式将其encode成一个固定长度的向量,用于输入到后面的全连接层。而使用CNN或者RNN等编码方法在句子很长时也会无法关注到句子中关键的语素。
Attention,注意力,就是关注与任务最相关、最重要的那些特征,赋予重要特征高权重。
如何计算权重呢?链接中的两篇博文结合起来就很好理解:
attention最基本最抽象的流程(以seq2seq模型为例):
基本流程:对于一个句子序列S,其由单词序列[w1,w2,w3,...,wn]构成。
1、将每个单词wi编码为向量vi;
2、解码时使用学习到的注意力权重ai与1中所有向量vi做加权和;
3、在decoder进行下一个词的预测时,使用2中得到的线性组合。
Query:decoder中的信息
encoder中包含了所有可能出现的词语,我们将其作为一个字典,该字典的Key:所有encoder的序列信息;字典的Value:通常也是所有encoder的序列信息。
而注意力权重ai就是用Q和K计算的:a=softmax(f(QK)),其中f的具体运算有多种方法,常见的有加性attention和乘性attention。
self-attention:Q和K,V都是相同的。
2、NLP中的Transformer
Transformer是纯用attention搭建的模型,计算快效果也不错。transformer的结构是由encoder和decoder组成。
2.1、Encoder
Encoder由N=6个相同的layer组成,layer指的就是上图左侧的单元,最左边有个“Nx”,这里是x6个。
左侧单元也就是编码器(encoder),6不是必然的,可以尝试其他个数;解码器(decoder)数量与编码器相同,一一对应。
每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation。
Multi-head self-attention:通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来。
self-attention在1中有提到。具体使用公式可以参见论文。
Position-wise feed-forward networks前馈神经网络:主要是提供非线性变换。Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。
2.2、Decoder
Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,这里先明确一下decoder的输入输出和解码过程:
- 输出:对应i位置的输出词的概率分布
- 输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出
- 解码:这里要注意一下,训练和预测是不一样的。在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token);而预测时,因为没有ground truth了,需要一个个预测。
2.3、Positional Encoding
除了主要的Encoder和Decoder,还有数据预处理的部分。Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。
这里作者提到了两种方法:
- 用不同频率的sine和cosine函数直接计算
- 学习出一份positional embedding
3、CV中的Transformer
3.1、Vision Transformer
Transformer 模型在自然语言处理(NLP)领域的应用很广泛,而如今越来越多的研究在尝试将 Transformer 模型强大的建模能力应用到计算机视觉(CV)领域。但是在计算机视觉领域,注意力要么与卷积网络结合使用,要么用来代替卷积网络的某些组件,同时保持其整体架构不变。
论文《AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》表明,对 CNN 的依赖不是必需的,当直接应用于图像块序列时,transformer 也能很好地执行图像分类任务。该研究基于大量数据进行模型预训练,并迁移至多个图像识别基准数据集(ImageNet、CIFAR-100、VTAB 等),结果表明 Vision Transformer(ViT)模型可以获得与当前最优卷积网络相媲美的结果,而其训练所需的计算资源大大减少。
模型:
模型概述:把图像分割成固定大小的小块,线性embedding每个块,还要添加位置embedding,并将生成的向量序列提供给标准Transformer编码器。为了进行分类,使用标准方法添加一个额外的可学习的序列的“classification token”。
结论:
受到 NLP 领域中 Transformer 缩放成功的启发,这项研究尝试将标准 Transformer 直接应用于图像,并尽可能减少修改。为此,该研究将图像分割成多个图像块(patch),并将这些图像块的线性嵌入序列作为 Transformer 的输入。然后用 NLP 领域中处理 token 的方式处理图像块,并以监督的方式训练图像分类模型。
在中等规模的数据集(如 ImageNet)上训练时,这样的模型产生的结果并不理想,准确率比同等大小的 ResNet 低几个百分点。这个看似令人沮丧的结果是可以预料的:Transformer 缺少一些 CNN 固有的归纳偏置,例如平移同变性和局部性,因此在数据量不足的情况下进行训练后,Transformer 不能很好地泛化。
但是,如果在大型数据集(14M-300M 张图像)上训练模型,则情况大为不同。该研究发现大规模训练胜过归纳偏置。在足够大的数据规模上进行预训练并迁移到数据点较少的任务时,Transformer 可以获得出色的结果。
该研究提出的 Vision Transformer 在 JFT-300M 数据集上进行预训练,在多个图像识别基准上接近或超过了 SOTA 水平,在 ImageNet 上达到了 88.36% 的准确率,在 ImageNet ReaL 上达到了 90.77% 的准确率,在 CIFAR-100 上达到了 94.55% 的准确率,在 VTAB 基准 19 个任务中达到了 77.16% 的准确率。
3.2、Transformer在CV领域其他研究
目前,Transformer 已经在三大图像问题上——分类、检测和分割,都取得了不错的效果。视觉与语言预训练、图像超分、视频修复和视频目标追踪等任务也正在成为 Transformer “跨界”的热门方向。
端到端的视觉和语言跨模态预训练模型
论文链接:https://arxiv.org/abs/2104.03135
GitHub地址:https://github.com/researchmm/soho
基于纹理 Transformer 模型的图像超分辩率技术
论文链接:https://arxiv.org/pdf/2006.04139.pdf
GitHub地址:https://github.com/researchmm/TTSR
视频修复:Transformer 初尝试
论文链接:https://arxiv.org/abs/2007.10247
GitHub地址:https://github.com/researchmm/STTN
目标跟踪新范式:基于时空 Transformer
链接:https://arxiv.org/abs/2103.17154
GitHub地址:https://github.com/researchmm/stark