type
Post
status
Published
date
slug
summary
持续记录Transformer发展
tags
综述
category
自动驾驶
icon
password
Property
Sep 28, 2022 02:32 AM

前言

综述类文章将结合最新论文一到两个月左右进行一次更新
Transformer是当前阶段DL领域的绝对当红炸子鸡,很多经典网络开始基于其推出新版本,如yolov7。本文将主要从工程角度带你一文速通

先说结论

  • transformer是一个神经网络模块,几乎可以无缝的将其插入任何一个现有的神经网络结构中去,或者单独的仅使用transformer模块来搭建一个神经网络。目前的实验和实践表明,其是一个优秀的、具有通用功能的模块,相较于现有的其他常用模块,具有效率高速度快等特点
  • transformer目前主要是通过attention模块“堆砌”而成,具体如何堆砌,得看各个科研工作者的工作了努力了,就像当年残差结构的问世一样,还会存在多种变种和优化
  • attention模块从数学角度而言,就是通过input计算一个权重矩阵(mask),其与特征对应位置相乘,权重大的特征被重视,反之被忽视。此结构受人的注意力模式启发,关注重点,忽略其他地方

Attention机制

attention机制是搭建transformer的基石,了解了attrntion,transformer也就很好理解了
attention机制分多种,目前常用的就是self-attention,至于其他的因为应用较少且我也不太了解,便不再介绍

Self-Attention

步骤1

  • 是attention层的输入,m表示特征的个数(单次输入网络的词的数量),n表示特征的维度
    • 对于第一层attention,X是原始输入经过Embedding的词向量
    • 如果不是第一个attention,那输入X就是其他层的输出
  • 则是一个 的矩阵了 是计算结果 注意: 维度相同,不需要
  • 产生Q K V三个特征矩阵供第二步输入

步骤2

  • 对上一步骤产生的三个矩阵进行如下计算,其中 的维度 ,计算得到的结果为一个 的矩阵,一般称之为
  • 每一行表示该词特征经过self-attention机制后重新得到的特征,这个特征的维度与输入可能不同,可以将其理解为这是经过“内部关联计算”后得到的新特征,其中包含了与其他输入特征的关系,着重保留了相关性强的特征,丢弃了相关度低的特征(这和直观意义上维度依然一一对应的mask权重有点区别)
  • 每一列的特征表示在该维度特征上,各个词向量的权重
💡个人观点:使用 Q K V 是为了达成有效attention的一种人为引入的先验,这种思想可能是参考自搜索系统中匹配概念。以搜索引擎为例:我们输入Q(query)进行查询,K(key)是搜索系统中的所有关键词列表,该关键词列表与搜索引擎的所有内容(V,value)有对应关系,即所有的页面均与指定的关键词相关联。然后通过一种方式来计算 Q 和 K 的相似度(相似度计算方式有很多,这里使用的向量点积),根据与K的相似度从高到低查找对应的目标值V ,最终的结果反映了本次输入的所有词向量间的关系(类似协方差矩阵),即self-attention中的self
 

完善

基本原理就是上面那些,此外还可以在此基础上添加一些东西,完善这个基础“模块”
  • 位置编码:初始输入时构建词向量的时候,在其中加入关于词的位置信息,即将词位置信息也编码进词向量(偶数位置,使用正弦编码,在奇数位置,使用余弦编码,感兴趣的可以深入了解下)
  • multi-head : 上述中仅使用了一组矩阵( )(其实就是三个FC)进行self-attention编码,可以在此基础上多添加几组,其得到的输出Z concat起来,因为希望self-attention能作为一个模块来使用,所以其输出的size最好是确定的,而concat后的结果会不符合需求,所以需要再接一个FC即可
💡 缩写 :self-attention在现在论文中默认被称为 SA,multi head 被称为 MSA

小结

self-attention 模块可以实现对内容特征、位置完成self编码,可以作为一个通用模块来使用

Transformer

目前可以作为一个通用结构,这里参考的是google的那篇attention is all you need. 至于更多的transformer变体我就不太清楚了。DL中的网络广义上都可以认为是encoder和decoder的结合,encoder用于特征的提取、高维特征构建,decoder则用于通过高维特征来解决具体任务。transformer结构在两者中都适用
notion image

encoder

上图的左侧结构,基于MSA,结合ResNet的shortcut结构。可以将其作为一个block,可以很方便的实现多层的堆叠。其中的Feed Forward就是一个简单的两层FC,中间加Relu,公式如下:

decoder

上图右侧结构,shortcut结构,但是有两个MSA,名字也有稍微区别,分别是带Masked和不带的,其并非完全串联,masked MSA输入来自前一个decoder的输出,正常MSA输入由两个部分构成,K V都是来自于最后一个encoder的输出,Q来自masked MSA的输出。(这里没encoder部分好理解,稍微谈一下自己理解)
个人观点:最后一个encoder的输出作为一个“查询系统的查询表”,查询表中的K与V是强关联的。例如搜索系统后台的查询表中,key="王冰冰",对应的value中,权重最高的是央视王冰冰的页面链接。最后一层encoder的输出是整个网络的“特征抽象结果”,其将作为真值供后续的所有decoder使用,所以所有decoder中的attention的K V都是它,且默认其两者是相同的。masked MSA是训练时的策略,在使用真值反向传播时候,不希望此处的attention得到其当前在预测的这个真值,否则训练的方向就不受控制了,我们只希望decoder能做到对特定任务的通用解决能力,而不希望它关心具体的实例是啥,所以在训练时对masked MSA中的W矩阵上三角加上一个mask,不让其更新即可

Transformer在NLP领域应用

我是搞cv的,NLP不太懂,本段当个乐子看吧😬
学习中... : GPT BERT...

Transformer在CV领域应用

个人觉得能奏效原因:transformer较好的解决了NLP中长距离依赖问题,而CNN中卷积擅长局部特征提取却忽视全局空间信息,所以可以尝试通过transformer来解决CNN中的全局特征依赖问题。但是CNN具备的归纳偏置能力(两个因CNN结构而具备的先验信息:局部性和平移不变性)是transformer所不具备的,这部分的先验需要数据量来弥补,所以想达到同等效果,transformer也需要更多的数据,不过这方面可以学习NLP领域的两阶段模式来解决,先预训练,然后具体任务finetuning

ViT

notion image
如上图,完全使用transformer的encoder block取代卷积,将图像拆分为多个patch,然后每个patch以再以像素展开为一维,变成“伪embedding”,输入由Transformer encoder block堆叠而成的网络中,最后接FC构成的MLP做回归完成分类。具体的细节不赘述了
意义
  • 证明Transformer在数据量足够大的情况下,效果足以超越CNN
  • Transformer对位置编码不敏感,可能是图像位置编码对于其来说太简单了
  • Transformer通过预训练再迁移,效果也很好,且收敛速度很快,可以用于小数据集任务
  • Transformer在图像通用特征提取上奏效了(可用于取代cnn结构的backbone)

DETR

Transformer在CV object detection领域的开山之作。但个人觉得虽然带了个头,但是没什么值得被传诵的操作,先说结论,然后简单流水帐过一下
结论:
  • Transformer在图像解决具体任务上奏效了(可用于取代cnn结构的head),包括检测、分割任务
  • cnn 与 Transformer可以协同工作
流水帐介绍:
notion image
  1. CNN先做特征提取,加上位置编码后,再接transformer的 encoder和decoder完成后续的具体检测任务
  1. decoder输出接2*N个FFN得到最终输出。其中N是网络预设的值,其远远大于图像中的真实目标数,比如设置1000。2是因为目标的结果分为bbox和cls的预测,两者任务不同所以分开。所以网络最终输出的是N个bbox信息和N个cls信息。假设ground truth为m,其中m<<N。计算loss的方式与以往传统有些不同,稍微说的细致一些(主要是因为其抛弃了anchdor和NMS,普天同庆~)
    1. 引入“空目标”概念来弥补m与N不对等问题。“空目标”是一个在数据集基础上多补充的一个cls name,网络的最终目标是预测N个结果,其中m个与ground truth是对应的,剩下的N-m个cls为空,可以忽略掉
    2. 引入二分匹配进行loss的计算。以往object detection任务中最后预测的bbox数目也往往是远大于ground truth数量的,那时候为了计算loss,需要与ground truth进行NMS做筛选,这种“一刀切”的筛除规则限制了网络的拟合能力。而DETR采用的方式是通过bbox与ground truth的iou、L1距离等计算预测出它们间的权重,根据这个权重通过二分匹配得到一个loss最小的匹配关系。
    3. 个人观点:这里loss计算其实算是DETR中一个比较创新的做法,引入“空目标”类别和二分匹配来强行指定网络的优化方向,虽然比以前有改进,但个人认为这种方式还是比较丑陋的,和以前目标检测方案的loss计算一样,都是在强行拼凑,不优雅,希望未来有大神能提出一种优雅的方案
  1. object queries :decoder中第一个transformer decoder的输入,随机初始化,在网络训练过程中自学习到关于object的信息
    1. 个人观点:关于object queries的分析网上很多,我觉得就是强行解释,从设计上来看transformer decoder确实需要这么一个输入,并且从工程实践来看,其确实奏效了,说明这是一种新的有效的设计经验,但并对应的具体意义。(学术可能就是需要解释,搞工程的我只关心是否奏效)

持续跟进

本节内容会随着transformer的不断发展而持续更新,主要是transfomer领域中影响力比较大的工作

Swin Transformer

还没仔细看,简单记录一下初看感觉
  • 使用transformer仿照CNN的结构做了层级化的构建
    • 特征图尺度逐层变小,特征维度增加,感受野逐层变大
    • 多个block堆叠
  • 提出了一个 transformer的变体结构:swin-transformer,其似乎更适合解决cnn问题,算是transformer在cnn领域的针对性改进

参考

  1. https://luweikxy.gitbook.io/machine-learning-notes/self-attention-and-transformer#decoder-mo-kuai
  1. https://zhuanlan.zhihu.com/p/47282410
  1. https://zhuanlan.zhihu.com/p/267156624
  1. Attention Is All You Need paper address
  1. DETR paper address
  1. Swin Transformer paper address
 
Jellyfin完全使用指南无名