Transformer - glqglq/ml_dl_wiki GitHub Wiki

编解码任务

seq2seq

基础seq2seq

基于attention的seq2seq(senet)

image

  • 解码阶段会将第一个开启解码标志(也就是Q)与编码器的每一个时间步的隐含状态(一系列Key和Value)进行点乘计算相似性得到每一时间步的相似性分数,然后通过softmax转化为概率分布,然后将概率分布和对应位置向量进行加权求和得到新的上下文向量,最后输入解码器中进行解码输出。
  • 优点:
    • 在没有attention时候,不同解码阶段都仅仅利用了同一个编码层的最后一个隐含输出,加入attention后可以通过在每个解码时间步输入的都是不同的上下文向量。注意力显著提高了机器翻译性能。
    • 注意力允许解码器以不同程度的权重利用到编码器的所有信息,可以绕过瓶颈。
    • 通过检查注意力分布,可以看到解码器在关注什么,可解释性强。

Transformer

  • Motivation:
    • 不管是采用RNN、LSTM还是GRU都不利于并行训练和推理,因为相关算法只能从左向右依次计算或者从右向左依次计算
    • 长依赖信息丢失问题,顺序计算过程中信息会丢失,虽然LSTM号称有缓解,但是无法彻底解决
  • 结构: image image image
  • 前向:
    • encoder-输入:N×1。
    • encoder-embedding:N×k_1。
      • 输入Lembedding:N×k_1。假设统计后发现待翻译句子最长是10个单词,那么编码器输入是10x512,额外填充的512维向量可以采用固定的标志编码得到。
      • 位置embedding:N×K_1。由于transformer内部没有类似RNN的循环结构,没有捕捉顺序序列的能力。position encoding向量表示两个单词i和j之间的距离。
        • 网络自己学习:pos_embedding = nn.Parameter(torch.randn(bs, N, 512))
        • 定义规则(sin-cos规则):
          • 方法:pos即0~N,i是0-511。将向量的512维度切分为奇数行和偶数行,偶数行采用sin函数编码,奇数行采用cos函数编码,然后按照原始行号拼接。能够扩展到未知的序列长度。
          • 图示: image
          • why work: sin和cos的如下特性: image image 假设k=1,那么下一个位置的编码向量可以由前面的编码向量线性表示,等价于以一种非常容易学会的方式告诉了网络单词之间的绝对位置,让模型能够轻松学习到相对位置信息。
    • encoder-自注意力层:N×k_2。
      • 方法:将q1和所有的k进行相似性计算,然后除以维度的平方根(论文中是64)使得梯度更加稳定。多头注意力机制类似于分组操作,将输入X分别输入到8个attention层中,得到8个Z矩阵输出,最后对结果concat即可。
      • 图示: image
      • why work:
        • 它扩展了模型专注于不同位置的能力。在上面的例子中,虽然每个编码都在z1中有或多或少的体现,但是它可能被实际的单词本身所支配。如果我们翻译一个句子,比如“The animal didn’t cross the street because it was too tired”,我们会想知道“it”指的是哪个词,这时模型的“多头”注意机制会起到作用。
        • 它给出了注意力层的多个“表示子空间",对于“多头”注意机制,有多个查询/键/值权重矩阵集(Transformer使用8个注意力头,因此我们对于每个编码器/解码器有8个矩阵集合)。
    • encoder-残差:N×k_2。
    • encoder-layer norm:N×k_2。
    • encoder-前馈神经网络层:全连接。N×k_3。
    • decoder-输入:
    • decoder-embedding:
    • decoder-masked自注意力层:解码器内部的带有mask的MultiHeadAttention的qkv向量输入来自目标单词嵌入或者前一个解码器输出,三者是相同的。
      • why mask:每次解码都会利用前面已经解码输出的所有单词嵌入信息,这个测试过程是没有问题,但是训练时候我肯定不想采用上述顺序解码类似rnn即一个一个目标单词嵌入向量顺序输入训练,肯定想采用类似编码器中的矩阵并行算法,一步就把所有目标单词预测出来。要实现这个功能就可以参考编码器的操作,把目标单词嵌入向量组成矩阵一次输入即可,但是在解码am时候,不能利用到后面单词a和student的目标单词嵌入向量信息,否则这就是作弊(测试时候不可能能未卜先知)。
      • 方法:引入mask,目的是构成下三角矩阵,右上角全部设置为负无穷(相当于忽略),从而实现当解码第一个字的时候,第一个字只能与第一个字计算相关性,当解出第二个字的时候,只能计算出第二个字与第一个字和第二个字的相关性。具体是:在解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置,在softmax步骤前,它会把后面的位置给隐去(把它们设为-inf)。 image
    • decoder-残差:
    • decoder-layer norm:
    • decoder-自注意力层:MultiHeadAttention的qkv向量中的kv来自最后一层编码器的输入,而q来自带有mask的MultiHeadAttention模块的输出。
    • decoder-残差:
    • decoder-layer norm:
    • decoder-前馈神经网络层:全连接。N×k_3。
    • decoder-残差:
    • decoder-layer norm:
    • decoder-fc:
    • decoder-softmax:

Vi Transformer

  • Motivation:
    • 一些替换cnn的attention网络模型加了一些模块没有很好的拓展性(scaled effictively)。
  • Method:
    • 结构: image
    • 输入:(h,w,c)输入图像reshape为(hw/pp,ppc),其中pp为patch的像素量,切为hw/pp个小块(word),图像patch可以替换为CNN的中间层特征图。
    • pos emb:使用1D位置embedding不用2D的,因为2D也不会提点。
    • token:其transformer的输出表达输入到mlp里,作为最后的决策依据。
    • fine-tune:在后续处理更大尺寸图片时,每个Patch的尺寸不变,序列长度增加。position embedding插值处理。
  • Exp:
    • comparsion to sota:达到sota,还能节约训练资源和时间。当用中小数据集(imagenet等)pretrain的时候ViT表现比当前sota差,由于其缺少平移不变性、获取局部信息的能力。大数据集(14M-300M)时反之。
    • pretraining data requirements:当用中小数据集pretrain的时候,大ViT模型表现比小ViT模型差,用大数据集时反之。
    • scaling study:Vision Transformer 在性能 / 算力权衡中显著优于 ResNet。hybird版本在小模型更好,大模型和ViT差不多了。
    • INSPECTING VISION TRANSFORMER:更近的patch有更相似的pos emb,同行/列的patch有更相似的pos emb,大网络的sin结构是明显的(?)。自注意力使得可以得到低层图像信息。
  • Advantage:transformer很少修改。

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

  • Motivation:

    • 和文本比,图像具有高分辨率,现有的视觉transformer中,有一些dense prediction任务在做像素级别的预测,如分割,这使得vi transformer很难做,因为全局细粒度self-attention复杂度相对于图像尺寸是平方级别的。

    image

    • 和文本比,图像有高像素scale,现有的视觉transformer中,token是固定的scale。
  • Method:

    • 结构:一张图划分为若干个window,每个window有M*M个patch。每个window都有固定数目的patch,因此复杂性和图像大小成线性关系(主要看能分为多少个patch)。同时,同window内所有的query patch共享同样的key set,这在真实存储中也是连续内存。

    image

    • hierarchical:上层patch多,下层patch少。merging layer实现,它将每22的patch都concate成一个新patch,再进行映射,使得patch数据量减半,数据量变化:C->4C->2*C。

    image

    • sifted:解决window-based self-attention缺少window之间的联系。向左上移动图像即可。方法介绍、复杂度分析如下:

    image image

  • 实验:

  • 参考:

    • CV+Transformer之Swin Transformer
⚠️ **GitHub.com Fallback** ⚠️