赞
踩
在上一讲 AS-MLP 中,我们发现该工作和百度的 S2MLP 接近,为此本节我们便来学习学习 S2MLP 的基本思想,其想将图像的局部性融入纯 MLP 结构中去。
S2MLP 是百度提出的用于视觉的空间位移 MLP 架构,论文为 S2 -MLP: Spatial-Shift MLP Architecture for Vision。MLP-Mixer 好在它进一步去除了归纳偏置(即CNN的局部性和Transformer 的注意力机制),使用纯 MLP 架构进行学习,该工作这出在超大规模数据量训练时可以取得和 CNN 以及 Transformer 结构相当甚至更好的性能。然而,单单在 ImageNet 1k 或者 ImageNet 21K 上训练测试,其性能其实并不算太好。这是为什么呢?因为虽然 MLP-Mixer 增加了学习的自由性,没有给予局部性啊这些的约束,但是正因如此才更容易过拟合(But the freedom from breaking a chain is accompanied by the risk of over-fitting)。所以只有当它在超大规模数据量的训练下才可能变得普适。为此,我们实际上还是得给一些约束或者指导,以帮助模型在中小规模数据上训练得更好。
S2MLP 取消了 MLP-Mixer 中的 token-mixing MLP,仅仅保留 channel-minxing MLP,并且通过空间位移(Spatial-shift)操作将不同位置的特征移动到同一个通道对齐,从而在 channel-minxing MLP 中获得局部感受野的概念(token-mixing MLP是全局感受野的概念)。与 AS-MLP 不同之处在于没有更进一步把它构建为 Backbone,感受野的故事也不是特别诱人。实现发现,S2MLP 相较于 MLP-Mixer 性能有一定提升,但是对于 CNN 以及 Transformer-based 还是有一定的差距。
S2MLP 和 MLP-Mixer 类似,整体网络结构如下图所示,其中 S2MLP block 被重复了多次。我们先来全局性地讲一下 S2MLP 怎么工作的:
两个不同配置的 S2MLP 网络的配置表如下,一种为宽的 (每个 token 的 c 更大),一种为深的(S2MLP block 被重复的次数 N 更多)
不难预料,最终的共性都是 r , c , N r,c,N r,c,N 先增加时,网络性能更好,然后不能太大,否则又会变差。并且也需要权衡参数量(Para)和计算量(FLOPs)。
在对 S2MLP 网络整体有个概念后,我们来看看单个 Block 是怎么设计的。
def spatial_shift(x):
w,h,c = x.size()
x[1:,:,:c/4] = x[:w-1,:,:c/4]
x[:w-1,:,c/4:c/2] = x[1:,:,c/4:c/2]
x[:,1:,c/2:c*3/4] = x[:,:h-1,c/2:c*3/4]
x[:,:h-1,3*c/4:] = x[:,1:,3*c/4:]
return x
空间位移操作其实就是把特征图按照不同方向进行了平移。这等价于一个卷积操作。即前
c
/
4
c/4
c/4 个通道每个通道特征图卷积
K
i
K_i
Ki,
c
/
4
c/4
c/4 到
c
/
2
c/2
c/2 通道每个通道特征图卷积
K
j
K_j
Kj,
c
/
2
c/2
c/2 到
3
c
/
4
3c/4
3c/4 通道每个通道特征图卷积
K
k
K_k
Kk,
3
c
/
4
3c/4
3c/4 到
c
c
c 通道每个通道特征图卷积
K
l
K_l
Kl。
T
1
[
1
:
w
,
:
,
:
]
←
T
1
[
0
:
w
−
1
,
:
,
:
]
T
2
[
0
:
w
−
1
,
:
,
:
]
←
T
2
[
1
:
w
,
:
,
:
]
T
3
[
:
,
1
:
h
,
:
]
←
T
3
[
:
,
0
:
h
−
1
,
:
]
,
T
4
[
:
,
0
:
h
−
1
,
:
∣
←
T
4
[
:
,
1
:
h
,
:
∣
.
K
i
=
[
0
0
0
1
0
0
0
0
0
]
,
∀
i
∈
(
0
,
c
4
]
,
K
j
=
[
0
0
0
0
0
1
0
0
0
]
,
∀
j
∈
(
c
4
,
c
2
]
,
K
k
=
[
0
1
0
0
0
0
0
0
0
]
,
∀
k
∈
(
c
2
,
3
c
4
]
,
K
l
=
[
0
0
0
0
0
0
0
1
0
]
,
∀
l
∈
(
3
c
4
,
c
]
,
不难发现, ( x , y ) (x,y) (x,y) 处最终会有 ( x − 1 , y ) , ( x , y − 1 ) , ( x + 1 , y ) , ( x , y + 1 ) (x-1,y),(x,y-1),(x+1,y),(x,y+1) (x−1,y),(x,y−1),(x+1,y),(x,y+1) 四个地方的特征图移动过来,所以说最终的感受野是菱形,注意不是 AS-MLP 的十字形。因为它没有不移动的特征图(在 S2MLPv2 中会加,我们之后学习博客中会讲到)!实现不同 patch 之间的通信,其实少了中间,这个感受野似乎并不是那么完美。
作者对比了不同的 spatial-shift 操作,其对应的移动和结果如下图所示,最终发现 (a) 的效果是最好的。但是我觉得作者如果加上有一个不移动可能会更好!
那么在此基础上,Token-mixing MLP,spatial-shift 操作以及 通道可分离卷积 depthwise convolution 之间的关系是什么呢?
对于 S2MLP 的一些反思:S2MLP 比 AS-MLP 更早挂上,也是向 MLP 架构中引入局部性特性。做法其实很简单,在 ImageNet1k 数据集上能 work 也很自然(这个数据量不足以让 MLP-Mixer 学会普适的表示)。但是,就 S2MLPv1 而言,其贡献点还是薄弱,不仅性能不是特别出彩;对于感受野的扩展性以及设计也不足;此外,都使用了对空间不敏感的 spatial-shift 操作以及 channel-mixing MLP 了,没有更进一步推出下游任务的 backbone 是比较可惜的点。相比而言,S2MLPv2 结合了 S2MLPv1 和 ViP 的思想,会更值得关注。所以下一篇学习的就是 ViP,再下一篇就是学习 S2MLPv2。
延续我一贯的认识,如何在 MLP 架构中如何结合图像局部性和长距离依赖依然是值得探讨的点。
暂未开源,保持关注…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。