8种视觉Transformer整理(下)

一、Focal Transformer

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

网络结构

8种视觉Transformer整理(下)_第1张图片

        首先将图片分成4\times 4的patch。然后进入Patch Embedding层(卷积核和步长都为4的卷积层),输入到Focal Transformer层。在每个stage中,特征的大小减半,通道维度变为原来的两倍。

Focal自注意力(FSA)

8种视觉Transformer整理(下)_第2张图片

        传统的SA由于对所有的token都进行细粒度的关注,因此非常费时;本文提出的FSA对靠近当前token的信息进行更加细粒度的关注,对远离当前token的信息进行粗粒度的关注。

        分为多个level,每个level有两个参数,子窗口大小s_w^l和横纵数量s_r^ll为level序号)。

        子窗口池化:对每一个level的feature map,每一个子窗口通过线性层池化得到一个值。然后拉长为向量,不同level的向量拼接,用线性层分别生成KV;用原始窗口的特征拉长通过线性层生成Q

        注意力计算B为可学习的相对位置偏置(和下面Swin Transformer的B类似)

\textup{Attention}(Q_i,K_i,V_i)=\textup{Softmax}(\frac{Q_iK_i^T}{\sqrt d}+B)V_i

二、Swin Transformer

原文链接:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows | IEEE Conference Publication | IEEE Xplore

网络结构

8种视觉Transformer整理(下)_第3张图片

        将图像分为4\times4的patch,通过linear embedding将特征维度变为C,送入Swin-T块。此后每一个stage开始有一个patch merging,将2\times2的patch合并为1个,再把特征维度乘以2。

Swin-T块

8种视觉Transformer整理(下)_第4张图片 其中MLP为2层,激活函数为GELU

        将输入图片划分成不重合的窗口,每个窗口包含M\times M的patch,在每个窗口内部计算自注意力。但由于未考虑窗口间的关系,因此引入shifted window。

8种视觉Transformer整理(下)_第5张图片

        对于连续两个Swin-T块,第二个采用shifted window:

\begin{aligned} \hat{z}^l&=\textup{W-MSA}(\textup{LN}(z^{l-1}))+z^{l-1}\\ z^l&=\textup{MLP}(\textup{LN}(\hat{z}^l))+\hat{z}^l\\ \hat{z}^{l+1}&=\textup{SW-MSA}(\textup{LN}(z^l))+z^l\\ z^{l+1}&=\textup{MLP}(\textup{LN}(\hat{z}^{l+1}))+\hat{z}^{l+1} \end{aligned}

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

       B--相对位置偏置,文章未介绍计算方法,具体可能要看代码(可参考图解swin transformer - 腾讯云开发者社区-腾讯云的讲解)。

三、ResT

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

网络结构

8种视觉Transformer整理(下)_第6张图片

        stage组成:patch embedding模块+位置编码+L\timesefficient Transformer块。efficient Transformer块中的多头自注意力称为EMSA。

EMSA

8种视觉Transformer整理(下)_第7张图片 EMSA结构

        X通过depth-wise卷积(核大小,步长和padding分别为s+1ss/2,这里s=8/kk为head数量),然后通过线性层生成KV。按照下式计算:

\textup{EMSA}(Q,K,V)=\textup{IN}(\textup{Softmax}(\textup{Conv}(\frac{QK^T}{\sqrt{d_k}})))V

这里Conv为1*1卷积,IN为Instance Normalization。

        最后拼接所有head的输出,通过线性层。

        剩下的部分和常规Transformer一致,即

y={x}'+\textup{FFN}(\textup{LN}({x}')),{x}'=x+\textup{EMSA(\textup{LN}(x))}

\textup{FFN}(x)=\sigma(xW_1+b_1)W_2+b_2

Stem

        使用3个3\times3卷积层(步长分别为2,1,2,padding为1,中间包含BN和ReLU)将尺寸缩小到1/4。

Patch embedding

        减少输入token的分辨率并且增加通道数。使用3\times3卷积(步长2,padding 1)将尺寸缩小1半,通道数提高1倍。

位置编码

        使用pixel-wise attention来编码位置,即使用3\times3的depth-wise卷积,再通过sigmoid函数。如下图所示。

8种视觉Transformer整理(下)_第8张图片

 \hat{x}=\textup{PA}(x)=x\ast\sigma(\textup{DWConv}(x))

四、VOLO

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

        开始先把图像分割为8\times8的patch。

        分为两个stage,第一个stage由outlooker组成,生成细粒度特征,第二个stage用Transformer聚合全局信息。每个stage开始时有一个patch embedding生成token。

Outlooker

        outlook attention layer(空间)+ MLP(通道)

\begin{aligned} \tilde{X}&=\textup{OutlookAtt}(\textup{LN}(X))+X\\ Z&=\textup{MLP}(\textup{LN}(\tilde{X}))+\tilde{X} \end{aligned}

Outlook Attention

8种视觉Transformer整理(下)_第9张图片 图中Unfold为V取邻域后沿空间拉直为向量,Fold为不同窗口同一位置相加

        Outlook attention计算每个空间位置(i,j)和其K\times K邻域内点的相似度。

        使用两个线性层分别得到AV,然后把A做reshape。

即:给定输入X,对每个C维token,使用两个线性层(权重分别为W_A\in\mathbb{R}^{C\times R^4}W_V\in \mathbb{R}^{C\times C})得到A\in\mathbb{R}^{H\times W\times K^4}V\in\mathbb{R}^{H\times W\times C}。令V_{\Delta_{i,j}}\in\mathbb{R}^{C\times K^2}表示中心为(i,j)的窗口内的所有value(Unfold操作)。

A(i,j)位置向量取出,reshape为\hat{A}_{i,j}\in\mathbb{R}^{K^2\times K^2}。则输出

Y_{\Delta_{i,j}}=\textup{MatMul}(\textup{Softmax}(\hat{A}_{i,j}),V_{\Delta_{i,j}})

        然后将不同窗口中同一位置的输出加起来(Fold操作)。

\tilde{Y}_{i,j}=\sum_{0\leq m,n\leq K}Y^{i,j}_{\Delta_{i+m- \lfloor \frac{K}{2} \rfloor, j+n-\lfloor \frac{K}{2} \rfloor}}

        最后输出通过线性层。

多头Outlook Attention

        设有N个头。将A的形状增长N倍后平均分为N份(即此时W_A\in\mathbb{R}^{C\times N\cdot R^4},得到的A划分为N份,A_n\in\mathbb{R}^{H\times W\times K^4})。V按照维度平均分成N份(V_n\in\mathbb{R}^{H\times W\times C_N}C_N\times N=C)。最后对每一对A_nV_n分别进行Outlook Attention后拼接。

你可能感兴趣的:(attention,transformer,深度学习,计算机视觉)