当前位置:   article > 正文

Vision MLP(CycleMLP,Swin Transformer,ConvMixer,UniNet)_vision transformer中mlp作用

vision transformer中mlp作用

上一篇博文整理了Vision MLP(MLP-Mixer,RepMLP,ResMLP,gMLP,aMLP),这篇文章继续整理最近的一些文章。

CycleMLP: A MLP-like Architecture for Dense Prediction
现有MLP架构(比如MLP-Mixer、ResMLP、gMLP)均与图像尺寸/分辨率相关,导致它们难以向下游任务迁移。所以作者提出CycleMLP模型,即提出一种即插即用的新MLP架构CycleFC,模型架构如上,其可以直接替换Mixer里面的spatial MLP进行空域投影并促进模型进行上下文聚合与信息通道(Channel是和图像尺寸无关的所以不做更改)。其优势在于:

  • 可以处理可变图像尺寸
  • 通过采用局部窗口,其计算复杂度与图像尺寸成线性关系

CycleFC沿通道维进行全连接,同时在空域里面采样以使得感受野放大,采样点使用pseudo-kernel概念。 Y i , j = ∑ C i − 1 F j , c T ⋅ X i + c % S Y_{i,j}=\sum^{C_i-1} F^T_{j,c} \cdot X_{i+c\%S} Yi,j=Ci1Fj,cTXi+c%S
S为kernel尺寸,当其为1x1的时候就退化为ChannelFC了,其区别可以看下图:
在这里插入图片描述

paper: https://arxiv.org/abs/2107.10224
code: https://github.com/ShoufaChen/CycleMLP

在这里插入图片描述
Swin Transformer: Hierarchical vision Transformer using shifted windows
ICCV21’的Best paper。主打解决的问题是以前的文章如ViT和iGPT使用的都是小尺寸的图像作为输入,这种直接resize的策略无疑会损失很多信息。另外明明在深度学习中特别重要的一点是随着网络层次的加深效果会越好,如CNN层数越多,其节点的感受野也在不断扩大。因此Swin Transformer提出的这种层次结构,也赋予了它可以屠榜的能力。

相比ViT,它的改进主要是

  • 1引入CNN常用的层次化构建方式构建分层Transformer。
  • 2引入局部性对无重合区域内进行自注意力计算。由于只在每个局部窗口(红色所示)内计算自我注意,对输入图像大小具有线性计算复杂度。

总体的模型图如下,关键点在于如何搭“多层”,和如何减少自注意力的“复杂度”。两者也分别对应着模型中的Hierarchical representation和SW-MSA策略。
在这里插入图片描述
我们可以先看看逐层的步骤:

  • 输入的图像先经过一层卷积进行patch embedding,即把每一个小块映射成一个像素点,并进行了通道上的扩充(即上图变成的H/4 x W/4 x 48)。
  • 然后输入到stage1,stage1由两层transformer组成,这两层transformer的核心一个是普通的window attention, 另一个是shift window attention。最右图是两个连续的Swin Transformer Block。一个Swin Transformer Block由一个带两层MLP的shifted window based MSA组成。在每个MSA模块和每个MLP之前使用LayerNorm(LN)层,并在每个MSA和MLP之后使用残差连接。
  • 然后在stage与stage之间有一个pooling操作来降低尺寸,但与传统卷积里面的pooling也不太一样,它是将先经过一个space to depth变为1/4,通道数变为原来的4倍,再又一个MLP缩减一半(如上图的H/4 x W/4 x C,到H/8 x W/8 x 2C,到H/16 x W/16 x 4C).

从而可以逐层堆叠,其可以使底部的结构处理的数据更多也更局部,顶部的网络处理的数据更少但是语义信息是更加丰富的。

然后关于如何减少复杂度,也是在上面流程中出现过的Shifted Window based MSA。具体的计算如下图,红色区域是window,灰色区域是patch。
在这里插入图片描述
W-MSA将输入图片划分成不重合的windows,然后在不同的window内进行self-attention计算。因为它不重合,所以可以使计算注意力的时间复杂度由 4 h w C 2 + 2 ( h w ) 2 C 4hwC^2+2(hw)^2C 4hwC2+2(hw)2C 变成 4 h w C 2 + 2 M 2 h w C 4hwC^2+2M^2hwC 4hwC2+2M2hwC,其中M是patch数目。

不过虽然降低了计算复杂度,但是不重合的window之间缺乏信息交流,于是作者进一步引入shifted window partition来解决不同window的信息交流问题,所以才有了框架图中最右侧画出来的,在两个连续的Swin Transformer Block中交替使用W-MSA和SW-MSA。即主要是将注意力限制在不重叠的局部窗口,通过通过允许跨窗口连接,以使这种分层结构可以灵活地在不同尺度上建模并有图像大小的线性复杂度。

Swin Transformer不还是建模局部吗?差异在哪里?
其他注目局部的改进Transformer的方法,像Transformer in Transformer会在每层同时对局部和全局进行特征交互。而金字塔型Transformer每层都对全局进行关系建模,只不过特征图宽高不断缩小、提纯特征。Swin Transformer每层仅对局部进行关系建模,同时不断缩小特征图宽高,扩大感受野,即不同stage,不同block,这一点和CNN的设计就很相似了(卷积的locality、translation invariance和hierarchical layer都可以套用过来了)。

  • paper:https://arxiv.org/abs/2103.14030
  • code:https://github.com/microsoft/Swin-Transformer

在这里插入图片描述
Patches are all you need
ConvMixer这篇文章想讨论的核心是,ViT的强大来自于Transformer架构,还是被patch的输入形式?因为在image上进行全像素算注意力会导致计算成本太高,所以现在的文章基本都是基于patch,然后再改装Transformer到CV领域。但这篇文章的结果想证明的事实ViT的良好性能可能来源于其独特的patch输入形式。

因此ConvMixer不沿用Transformer,而是直接用Conv卷积来搭架构,如上图所示,具体过程大致为:

  • 将输入图像切割成几个不重合的patch,接着经过h个卷积来代替原来ViT中的patch embedding,然后处理得到feature map。
  • 然后过d层的ConvMixier Layer处理,其中最开头的Depthwise Convolution模拟MLP-mixer的spatial mixing来学空间信息,Pointwise Convolution模拟channel-wise mixing学通道。
  • 值得注意的是,ConvMixier Layer不会下采样,其不同层输出的resolution和channel都一样。
  • 最后一层经过一个全局池化处理,再进行分类即可。

即只输入patch然后分离空间depthwise卷积和通道混合pointwise卷积,实验结果证明这种方式的性能不差。

import torch.nn as nn

class Residual(nn.Module):
    def __init__(self, fn):
        super().__init__()
        self.fn = fn

    def forward(self, x):
        return self.fn(x) + x

def ConvMixer(dim, depth, kernel_size=9, patch_size=7, n_classes=1000):
    return nn.Sequential(
        nn.Conv2d(3, dim, kernel_size=patch_size, stride=patch_size),
        nn.GELU(),
        nn.BatchNorm2d(dim),
        *[nn.Sequential(
                Residual(nn.Sequential(
                    nn.Conv2d(dim, dim, kernel_size, groups=dim, padding="same"),
                    nn.GELU(),
                    nn.BatchNorm2d(dim)
                )),
                nn.Conv2d(dim, dim, kernel_size=1),
                nn.GELU(),
                nn.BatchNorm2d(dim)
        ) for i in range(depth)],
        nn.AdaptiveAvgPool2d((1,1)),
        nn.Flatten(),
        nn.Linear(dim, n_classes)
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

paper:https://openreview.net/pdf?id=TVHS5Y4dNvM
code:https://github.com/tmp-iclr/convmixer

在这里插入图片描述
A Battle of Network Structures: An Empirical Study of CNN, Transformer, and MLP
CNN,Transformer和MLP这几种visual架构,通用的启发有那些呢?补最近的这篇文章,作者通过通过在一个统一的框架中对CNN、Transformer和MLP进行一系列受控实验,证明了以下观点:

  • 多层设计。多层设计在这三种网络结构都很重要,多层框架都始终且显著地优于单层框架。
  • 局部建模。局部建模是高效和至关重要的。但凡在MLP和Transformer结构中添加局部建模旁路,都可以看到显著的性能提高。
  • MLP在小模型尺寸下可以获得较强的性能,但当模型尺寸增大时,它会严重出现过拟合。
  • 卷积和Transformer是互补的,因为卷积结构具有最好的泛化能力,而Transformer在三种结构中具有最大的模型能力。这表明卷积仍然是设计轻量级模型的最佳选择,但设计大型模型应该考虑到Transformer。

在这里插入图片描述
UniNet: Unified Architecture Search with Convolution, Transformer, and MLP
别纠结,直接揉一起吧。这篇文章提出用神经架构搜索(NAS)去自动搭建一个结合卷积CNN、Transformer和MLP的最优组合,架构如上图,将对操作符GOP和降采样DSM同时进行搜索。其中操作符GOP即是三种架构:Convolution, Transformer, and MLP。降采样DSM也有三种,具体如下图所示,一目了然:
在这里插入图片描述
其中有两种都是作者提出的新的上下文感知降采样模块,以适应Transformer和MLP操作符编码的全局信息。最后,再在统一的搜索空间中联合搜索所有的操作符和降采样模块。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/248404
推荐阅读
相关标签
  

闽ICP备14008679号