一、ViT

原文链接:https://arxiv.org/pdf/2010.11929.pdf

        首先将图像分割成长宽均为P的patch(共N=HW/P^2个),然后将每个patch reshape成一个向量,得到所谓的flattened patch(记为x_p^i\in \mathbb{R}^{N\times P^2C},i=1,2,\cdots ,N)。

        为了避免模型结构受到patch size的影响,对flattened patch向量做了Linear Projection,将flattened patch向量转化为固定长度的向量(D维)。 

        此外引入额外的可学习的embedding(类似于BERT中的[class] token),l层的记为z^0_l。Transformer输入端的该embedding(即z^0_0)为x_{\textup{class}};Transformer输出端的该embedding(即z^0_L)提供整个图像的表达y。最后的分类头总是连接在z^0_L上,从而分类头的结构与patch数量无关。 

        然后将position embedding(E_{pos}\in \mathbb{R}^{(N+1)\times D})和patch embedding相加输入到encoder中,即

z_0=[x_\textup{class};x^1_pE;x^2_pE;\cdots ;x^N_pE]+E_{pos}

其中E\in \mathbb{R}^{P^2C\times D}为权重向量。 

查了一下,BERT中的[class] token貌似是利用self attention求所有embedding的加权平均得到的

        encoder包含多头自注意力机制(MSA)、双层MLP(激活函数为GELU)、LayerNorm(LN),公式如下:

混合结构:使用ResNet中间层的feature map作为Transformer的输入。直接将ResNet某一中间层的2D feature map展平为序列,再通过Linear Projection变为Transformer输入的维度,然后直接输入Transformer。[class] embedding和position embedding与前面一样。

更高分辨率图像下的fine-tune:保持patch大小不变,得到的patch个数将增加(N\rightarrow {N}')。但是由于在预训练后,position embedding的个数是固定的(N),因此根据其在原始图像中的位置将预训练得到的position embedding插值为{N}'个。

二、CoAtNet

原文链接:https://arxiv.org/pdf/2106.04803.pdf

        将depthwise卷积与自注意力机制结合:

        depthwise卷积:

y_i=\sum_{j\in L(i)}w_{i-j}\odot x_j

其中L(i)i的局部邻域;w_{i-j}表示该权重仅与相对位置有关;\odot表示按元素乘法。

    自注意力机制:

y_i=\sum_{j\in G}\frac{\exp(x_i^Tx_j)}{\sum_{k\in G}\exp(x_i^Tx_k)}x_j=\sum_{j\in G}A_{i,j}x_j

其中G为全局空间。

        两者结合为

y_i^{\textup{post}}=\sum_{j\in G}\left ( \frac{\exp(x_i^Tx_j)}{\sum_{k\in G}\exp(x_i^Tx_k)}+w_{i-j} \right )x_j

y_i^{\textup{pre}}=\sum_{j\in G} \frac{\exp(x_i^Tx_j+w_{i-j})}{\sum_{k\in G}\exp(x_i^Tx_k+w_{i-k})} x_j

前者称为后归一化,后者称为预归一化。

        为避免全局卷积核的参数量爆炸,这里的w_{i-j}为标量而非矢量。

        网络结构确定:搭建5个stage的网络,实验比较(泛化性、模型容量、可迁移性)得出下图所示(卷积-卷积-Transformer-Transformer)结果最好。

2D相对注意力:实施CoAtNet的预归一化版本。设输入图像为H\times W的。对每个头(head)创建一个可训练参数P(全局卷积核?),大小为(2H-1)\times(2W-1),则(i,j)({i}',{j}')的相对偏差为P_{i-{i}'+H,j-{j}'+W}

        对于更高分辨率图像下的fine-tune,使用双线性插值将P的大小增加即可。

预激活:MBConv和Transformer都使用预激活结构,即x\leftarrow x+\textup{Module}(\textup{Norm}(x)),其中Module表示MBConv、自注意力或FFN模块;Norm表示MBConv中的BatchNorm或自注意力/FFN中的LayerNorm。GELU作为MBConv块和Transformer的激活函数。

分类头:对最后一个stage的输出,采用全局均值池化来得到表达,而非像ViT一样增加额外的<class> token 来分类。

三、CoT

原文链接:https://arxiv.org/pdf/2107.12292.pdf

        传统的KQ1\times1卷积得到,忽略了上下文信息;这里取Q=K=X;首先对K应用k\times k卷积得到K^1,称为静态上下文表示。然后与Q拼接后通过2层的MLP得到A(权重矩阵):

A=[K^1,Q]W_{\theta}W_{\delta}

然后得到K^2(称为动态上下文表示):

K^2=V\circledast A

        输出为K^1K^2通过注意力机制的融合(图中Fusion方框)。

        应用:使用CoT直接替换ResNet中的3\times3卷积。

四、CSWin Transformer

原文链接:https://arxiv.org/pdf/2107.00652.pdf

        整体结构:先用一个7\times7步长为4的卷积进行下采样;4个stage,stage之间的下采样为3\times3步长为2的卷积。

        具体实现:将K个head分为两半,一半做水平自注意力(Horizontal Self Attention),另一半做垂直自注意力(Vertical Self Attention)。

        对于水平自注意力,就是将图像分割为宽度为sw的横条,对每一个横条分别做自注意力后拼接;

X=[X^1,X^2,\cdots ,X^M],X^i\in\mathbb{R}^{(sw\times W)\times C},M=H/sw

Y^i_k=\textup{Attention}(X^iW^Q_k,X^iW^K_k,X^iW^V_k)

\textup{H-Attention}_k(X)=[Y^1_k,Y^2_k,\cdots, Y^M_k]

垂直自注意力同理。

  最后将两半head的输出拼接后通过卷积,即

\textup{CSWin-Attention}(X)=\textup{Concat}(\textup{head}_1,\textup{head}_2, \cdots, \textup{head}_K)W^O

\textup{head}_k=\left\{\begin{matrix} \textup{H-Attention}_k(X) & k=1,2,\cdots, K/2\\ \textup{V-Attention}_k(X) & k=K/2+1,\cdots, K \end{matrix}\right.

     局部增强位置编码:depth-wise卷积作用于V

\textup{Attention}(Q,K,V)=\textup{Softmax}(QK^T/\sqrt{d})V+\textup{DWConv(V)}

        CSWin Transformer块: