其实这篇文章很早就写好了,但作者其它论文涉及到洗稿问题,所以先放着了。目前看这篇文章没被举报有洗稿的嫌疑,所以就发出来了
.
来源:晓飞的算法工程笔记 公众号
论文: Involution: Inverting the Inherence of Convolution for Visual Recognition
论文认为卷积操作有三个问题:
为了解决上述的问题,论文提出了与卷积有相反属性的操作involution,核参数在空间上面特异,而在通道上面共享,主要有以下两个优点:
一组involution核可表示为 H ∈ R H × W × K × K × G \mathcal{H}\in \mathbb{R}^{H\times W\times K\times K\times G} H∈RH×W×K×K×G,这里的分组与卷积相反,增加分组是为了增加核的复杂性。对于像素 X i , j ∈ R C X_{i,j}\in \mathbb{R}^C Xi,j∈RC,其involution核为 H i , j , ⋅ , ⋅ , g ∈ R K × K \mathcal{H}_{i,j,\cdot,\cdot,g}\in \mathbb{R}^{K\times K} Hi,j,⋅,⋅,g∈RK×K, g = 1 , 2 , ⋯ , G g=1,2,\cdots,G g=1,2,⋯,G为involtion核的分组,组内核共享。involution的特征图输出通过对输入特征进行Multiply-Add操作得到:
k k k为通道编号,involution核的大小取决于输入特征图的大小,通过核生成函数 ϕ \phi ϕ动态生成:
Ψ i , j \Psi_{i,j} Ψi,j为 H i , j \mathcal{H}_{i,j} Hi,j对应的输入像素合集。
为了简洁,论文直接从单个像素 X i , j X_{i,j} Xi,j生成对应的involution核 H i , j \mathcal{H}_{i,j} Hi,j,更复杂的结构也许能带来更好的性能,但不是当前主要的工作。定义核生成函数 ϕ \phi ϕ: R C ↦ R K × K × G \mathbb{R}^C\mapsto\mathbb{R}^{K\times K\times G} RC↦RK×K×G, Ψ i , j = { ( i , j ) } \Psi_{i,j}=\{(i,j)\} Ψi,j={(i,j)}:
W 0 ∈ R C r × C W_0\in\mathbb{R}^{\frac{C}{r}\times C} W0∈RrC×C和 W 1 ∈ R ( K × K × G ) × C r W_1\in\mathbb{R}^{(K\times K\times G)\times\frac{C}{r}} W1∈R(K×K×G)×rC为线性变换,共同构成一个bottleneck结构, r r r为压缩因子, σ \sigma σ为BN+非线性激活。
公式4和公式6可表示为算法1和图1,在每个位置 ( i , j ) (i,j) (i,j)通过核生成函数生成对应的involution核,再对该位置进行计算得到输出。
在构建完整的网络时,以ResNet作为基础,将stem(开头)的bottleneck中的 3 × 3 3\times 3 3×3卷积替换成 3 × 3 3\times 3 3×3或 7 × 7 7\times 7 7×7的involution,将trunk(后续)的bottleneck中的 3 × 3 3\times 3 3×3卷积替换成 7 × 7 7\times 7 7×7的involution, 1 × 1 1\times 1 1×1卷积保留用作通道融合与扩展。
Involution的优势在于通道信息在核生成时利用了起来,并且后续使用较大的感受野获得更大的空间信息。另外在使用时,前后的 1 × 1 1\times 1 1×1卷积也增加了通道交互,从而提升了整体的性能。
下面分别对involution进行两方面的探讨,分别是参数量下降的来源以及性能提升的来源。
Involution的思想十分简洁,从卷积的通道特异、空间共享转换成通道共享、空间特异,我们从参数量和计算量两块来进行分析(不考虑bias和involution的G):
因为标准卷积实际上会融合多个输入通道进行输出,而且通道不共享,导致参数量和计算量都很高。而分组卷积减少了标准卷积中输出通道与输入通道之间的大量关联,和invlotion在参数量和计算量上有十分相似的地方:
G = C G=C G=C的分组卷积即depthwise卷积, G = 1 G=1 G=1的involution和depthwise卷积两者在结构上也可以认为是完全对立的,一个则通道共享、空间独立,另一个通道独立、空间共享,而在depthwise卷积上加上空间特异的属性即 G = C G=C G=C的involution。但在之前很多的研究中,depthwise卷积一般都只用于轻量化网络的搭建,会牺牲部分准确率,而involution却能在减少部分参数量的同时提升准确率。我觉得除了空间特异带来大量参数之外,主要得益于两个部分设计:1)核大小增加到 7 × 7 7\times 7 7×7。 2) 根据输入特征动态生成核参数。如果将depthwise卷积按类似的设置替换卷积核,不知道能否达到类似的结果。
self-attention起源于nlp任务,目前在视觉上的应用十分火热,有不错的性能表现。将输入向量线性转化成查询项 Q Q Q、关键词项 K K K以及值项 V V V后,先用 Q K T QK^{T} QKT计算出相似性,再对值项加权后输出,大致的公式为:
如果将involution的核生成函数 H \mathcal{H} H看成是 Q K T QK^{T} QKT的话,则可认为involution在某种意义上等同于self-attention,position encoding的信息也可认为是隐藏在了核生成函数里面,与生成的位置相关。文章花了很多篇幅去说明involution是self-attention的高层定义,有兴趣的可以去看看。不过我们只要理解,involution在特征图的不同位置动态生成了不同的核参数,功能上类似于self-attention中的attention即可,这也是involution能够提升准确率的关键。
从实验结果来看,由involution搭建的ReaNet能够在准确率提升的情况下减少大量的参数,从实际速度来看,GPU速度与ResNet差不多,CPU速度则提升很大。
论文创新地提出了与卷积特性完全相反的基础算子Involution,该算子在通道上共享,而在空间上特异,不仅能够大幅减少参数量,还集成了attention的特性,在速度和准确率上都有很不错的表现。
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】