关注到旷视最近发表(2021.09.15)的一篇目标检测论文,把NLP领域常用的transformer应用到目标检测方向,与以前基于CNN的anchor-based和anchor-free网络不同,这是一种完全不同的模块结构。查阅相关文献发现,这并不是第一次将transformer应用到目标检测,于是对这一应用进行了学习(目前还没有学习原始的transformer):
1、最早进行目标检测应用的论文:End-to-End Object Detection with Transformers
贡献:提出了一种新的目标检测方法DETR,比常用的目标检测方法流程更为简单,无锚框产生和NMS过程,检测效果可与Faster RCNN相媲美,还可很容易推广到全景分割。
DEtection TRansformer or DETR, are a set-based global loss that forces unique predictions via bipartite matching, and a transformer encoder-decoder architecture.
DETR是一种基于集合的全局损失,通过二分匹配强制进行唯一预测,一种transformer的编解码结构。
输入图片经过CNN得到 特征图集合,通过transformer处理后得到的数据集合直接并行预测。训练时,通过与GT boxes二分匹配分配预测结果,没有匹配上的则无目标,把目标检测看作集合预测问题。总体结构如下:
经过CNN提取的特征图集合加上位置编码后将数据展平(flatten)进入编码器(encoder),编码器处理后的输出进入解码器,解码器处理后进入检测头进行分类和位置获取,没有目标输出为空。
关于transformer的结构和处理过程(只限于理论,未上代码):
transformer结构是google在17年的Attention Is All You Need论文中提出,在NLP的多个任务上取得了非常好的效果,可以说目前NLP发展都离不开transformer。最大特点是抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。
在CV领域的探索应用,典型的如目标检测领域的detr和可变形detr,分类领域的vision transformer等,可以结合目标检测应用做一次学术讨论
Transformer的核心模块Self-Attention:
输入input处理成embedding vector分别经过线性变换(提升模型拟合能力)得到Q、K、V,QKT是两种X的线性变换的内积,即作投影,表示Q、K两个向量的相关程度,经softmax函数作归一化,得到两个向量之间的相关性权重,再与V相乘,相当于X经过注意力加权之后的表示(Z),即得到与各量之间的相关性后乘以V重新编码表示输入,输入后续Add &Normalize、FFN、Add &Normalize操作
Layer Normalization 会将每一层神经元的输入都转成均值方差都一样,可以加快收敛。
其中,在FFN(两层全连接层,第一层有激活函数Relu)中:
至此完成一个Encoder block,后续Encoder block输入为前一个block的输出。
一般一个block的self-Attention有多层,Multi-Head Attention,这时得到的矩阵Z会进行concat,最终完成ENCODERS后得到 编码信息矩阵C
Multihead attention怎么理解?本用来防止输入个体被实际的单词所支配,如it的指代,而不是关注it本身。每个head是否输入相同的内容?还是输入总共输入到multihead, 每个head只含部分输入信息?
输出结果进行concat,应该是每个head输出内容对应的输入不同,如果对应的输入不同,那q,k,v如何运算,每个head一个q,k,v?各head之间的相关性学习?
编码的目标是什么?首先是把实际输入转化为vector进行表示,带有位置信息的向量进行编码,按算法功能来看,编码可以获得各向量之间的相关性,若有指代时,相关性可辅助找出正确指代内容,不需指代的向量根据位置权重进行顺序解译。
红色字体内容是我刚开始看的时候不太熟悉提出的一些疑问。
①对于multihead attention,这个多头机制每个head输入的内容是一样的,但是线性变换会使每个head的关注点存在一些区别,最后通过矩阵变换,所有的head的输出转变成了一个,这就使得输入的信息更加丰富,不会太片面,结果包含更全面的信息。
②至于编码的目的,首先是把输入统一成向量表示,在机器翻译中,输入可以是多种语言的文字,所以需要一种编码方式进行表示,便于网络统一处理以及学习各个量之间的相关性
第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block (第一个block用X)的输出计算
输入X计算得到Q、K、V,在QKT进行softmax前需要做掩膜操作(为了按顺序翻译,按顺序遮挡后面的信息),经过掩膜归一化后的矩阵(即含mask操作的注意力机制权重)与V相乘得到矩阵Z(后续与Encoder类似),得到mask操作后线性变换后的X,作为Q与Encoder的编码信息矩阵C进入第二层attention head。
后续仍在学习中