X-volution: On the Unification of Convolution and Self-attention卷积与自注意力的相辅相成

paper linkhttps://arxiv.org/pdf/2106.02253.pdf

摘要

卷积和自注意力是深度神经网络中的两个基本组成部分,前者以线性方式提取局部图像特征,而后者非局部编码高阶上下文关系。但是由于结构上的不同,缺乏在单个计算模块中同时应用这两种操作的方法。

在这项工作中,作者从理论上推导出了一个全局自注意力近似方案,该方案通过对变换特征的卷积运算来近似自注意力。基于近似方案,我们建立了一个由卷积和自注意力操作组成的多分支基本模块,能够统一局部和非局部特征交互。重要的是,一旦经过训练,这个多分支模块可以通过结构重新参数化有条件地转换为单个标准卷积操作,从而呈现一个名为 X-volution 的纯卷积风格的算子,可以作为原子操作插入任何现代网络。

介绍

阐述了一下卷积和自注意力的特点,局部和非局部,易于优化和依赖大量数据等等。(我觉得这些并不重要就不多写细节了,感兴趣的看原文吧)

这两个算子属于不同的计算模式,导致它们难以集成。卷积算子在局部窗口内执行预定义的加权平均,而自注意力通过动态系数的全局加权来工作。此外,在视觉领域,计算图像中所有位置之间的点积在计算上是被禁止的,这给在类似于 CNN 的框架中应用非局部操作带来了更多挑战。因此,最先进的网络要么单独进行卷积,要么单独进行自我注意。

这篇论文解决了上述问题,提出了名为X-volution的算子。

首先,作者从理论上证明了通过将上下文关系从局部区域传播到非局部区域来近似全局自注意力的可行性。由此作者开发了时间复杂度为O\left ( n \right )的近似自注意力,称为像素移位自注意力(PSSA,Pixel Shift Self-Attention)。PSSA 将自注意力转换为对变换特征的卷积运算,这些变换特征是通过顺序元素移位和元素点积获得的。

其次,基于该近似方案,作者建立了一个多分支的网络模块,同时集成卷积和自注意力。多分支拓扑使模块不仅具备良好的优化特性,而且获得了捕捉长期关系的能力,从而表现出更强的学习能力和更好的性能。

更重要的是,多分支结构可以通过网络结构重新参数化有条件地转换为单个标准卷积操作,呈现纯卷积风格的算子 X-volution,可以插入任何现代网络作为原子操作。

实际上,卷积和self-attention可以分别看成是静态卷积(即内容无关的核)和动态卷积(即内容相关的核)。

方法

作者提出的名为X-volution的算子预计这将从两个方面获得非常令人印象深刻的性能改进,即本地与非本地/线性与非线性。在本节中,我们首先重新审视卷积和自注意力的基本数学公式,然后我们提出一个简单的全局自注意力近似方案,将其直接转换为卷积的兼容模式。最后,我们描述了在推理阶段如何有条件地将卷积的分支和提出的自我注意近似合并成一个单卷积风格的原子算子。

图1. 我们提出的 X-volution 算子的详细结构。
X-volution 是一种训练-推理解耦拓扑[6]。它的训练结构显示在中间,有两个主要分支。右分支由级联卷积和BN组成,可以集成卷积能力进行X-volution。左边由一个像素移位自注意力组成,它提供了近似的全局自注意力特征。训练完成后,我们有条件地将其重新参数化为原子操作,如右图所示。在推理阶段,X-volution实际上是一个动态卷积算子,其权重由需要动态计算的attention map和已经训练固化的卷积权重组成。

3.1 卷积和自注意算子重温

3.1.1 卷积模块

卷积算子是用于构建卷积神经网络 (CNN) 的计算原语,它通过有限局部区域内的线性加权来估计输出。给定一个特征张量 X ∈ R^{C_{i}*H*W}C_{i}表示输入通道的数量,H 是高度,W 是宽度。卷积算子的估计结果 Y ∈ R^{C_{o}*H*W} 定义如下:

公式1. 

其中 C_{o} 表示输出通道的数量。 W ∈ R^{C_{o}*C_{i}*K*K} 指的是卷积核,W_{...} 指的是特定位置的核标量值。 K是卷积的窗口大小,B∈R^{C_{o}}表示偏置向量,ΔK∈\mathbb{Z}^{2}表示K×K卷积窗口中所有可能偏移的集合(看起来像是卷积核中心到周围长度的意思?)。从公式 1 可以看出,卷积实际上是一阶线性加权运算。

3.1.2 自注意力模块

自注意力是一种新兴的视觉任务替代计算原语,其核心思想是通过执行向量内点积建立长期语义交互。与卷积不同,self-attention 不能直接处理图像张量,其中输入特征张量首先被重塑为向量 X ∈ \mathbb{R}^{C*L}。 L 表示向量的长度,L = H × W 。 W^{Q}W^{K}W^{V}分别代表Query、Key和Value的嵌入变换矩阵,它们是空间共享的线性变换。自注意力的预测定义如下:

公式2. 

其中 \overline{W}\left ( X \right )表示自注意力的最终等效于权重的系数矩阵,可以将其视为动态的(逐元素内容相关)和空间变化的卷积滤波器。方程 2 表明 self-attention 是一种高阶全局操作。(感觉作者这里的解释都很奇怪,个人认为最好参考其他资料理解)。

3.2 全局自注意力的近似

全局自注意力是最原始的注意力方案,得益于其全局范围,然而,它的复杂性是不可接受的,即 O(n^{2})(n 表示总像素数),这使得它在视觉任务中的应用受到严重限制。关键问题是我们是否可以在方程式 2 中推断出适当的近似方案,即,我们是否可以根据卷积、单元素乘积等现成的算子找到兼容的 \overline{W}\left ( X \right ) 计算模式?

在本节中,我们展示了在简单的元素移位和点积之后,我们可以以卷积的形式逼近全局自注意算子。给定特征张量 X 中的一个位置,我们将其特征向量表示为 x_{0},其注意力 logit\, s_{0}(查阅发现logit似乎是sigmoid函数的反函数logit) 可以写成如下公式:

公式3.

其中 \alpha _{t}=w^{q}w^{k}w^{v}x_{i},Ω 表示全局区域,A 表示以 x_{0} 为中心的局部区域。在图 1 的左侧说明了局部区域和非局部区域。图中灰色框表示输入特征 X 的全局区域,绿色框表示以 x_{0}为中心的局部区域。另外,非局部区域是局部区域之外的区域。由于图像具有很强的马尔可夫特性,x_{0} 可以由其局部区域中的像素近似线性表示:x_{0}\approx \sum _{x_{k}\in A}\beta _{k}x_{k},其中 \beta _{k} 是线性权重。将其代入方程式3 中的第二项可得到如下:

公式4.

不失一般性,我们可以在区域 A 中添加系数为零的项。按照设计,非局部区域也在局部区域的边界像素的感受野内。(上面说了x_{0}可以由周围像素线性表示,那么边缘像素点也可以被它周围的点线性表示)因此,我们可以变换公式 4 成以下公式:

公式5.

根据图像的马尔可夫性质,我们可以假设对于 x_{k} ∈ A,x_{i}(远离 x_{k})和 x_{k} 之间的相互作用是弱的。(对于局部区域的各点,离得远的像素点对他的影响较弱,所以不用考虑,只考虑近的)因此,公式 5 可进一步简化:

公式6.

其中 U(x_{k}) 表示 x_{k} 的局部区域(那么 U(x_{0})不就是\overset{o}{A}了吗)。将公式 6 代入公式 3 中的第二项,我们可以将其改写为以下公式:

公式7.

注意,\left \langle x_{k},x_{i} \right \ranglex_{k}x_{i} 的内积,用来衡量 x_{k}x_{i} 的相似度。 x_{k} 在其邻域内的注意力结果。因此,x_{0} 处的全局注意力 logit 可以通过对其邻域内像素的注意力结果进行加权求和来近似,如公式 7 所示. 基于上述理解,我们可以设计一个近似算子,通过逐点上下文关系传播来估计全局注意力。因此,我们提出了一种全局注意力近似方案,像素移位自注意力(PSSA),基于像素移位和卷积来近似全局注意力。

具体来说,我们首先将特征图沿给定方向(即左、右、上等)移动 L 个像素,然后在原始特征和移动特征之间使用元素乘积来获得变换后的特征。实际上,shift-product运算建立了邻域内点之间的上下文关系,通过层次堆叠,我们可以将上下文关系传播到全局区域。最后,我们在这些变换后的特征之间进行加权求和(可以通过卷积算子来实现),得到一个近似的自注意力图。移位、元素乘积和加权求和的复杂度为 O(n),因此所提出的 PSSA 是一个具有 O(n) 时间复杂度的算子。值得注意的是,PSSA 实际上将 self-attention 转换为对转换特征的标准卷积操作。通过分层堆叠,这种结构可以通过上下文关系传播实现全局自注意力logit的估计。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我之前理解有误。以下是修改后的程序: ```cpp #include <iostream> #include <windows.h> using namespace std; int main() { // 使用 Windows API 改变控制台文本颜色 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, FOREGROUND_RED); // 输出世界上所有语言的“为了革命” cout << "为了革命!" << endl; cout << "For the Revolution!" << endl; cout << "Pour la Révolution!" << endl; cout << "للثورة!" << endl; cout << "Für die Revolution!" << endl; cout << "Per la Rivoluzione!" << endl; cout << "Por la Revolución!" << endl; // 清屏 system("cls"); // 使用 Windows API 改变控制台文本颜色 SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN); // 输出工农标志 cout << "        @@@                 " << endl; cout << "       @@ @@                " << endl; cout << "       @@ @@                " << endl; cout << "       @@ @@                " << endl; cout << "       @@ @@                " << endl; cout << "       @@ @@                " << endl; cout << "  @@@@@@@@@@@@@@@@@@             " << endl; cout << "  @@@@@@@@@@@@@@@@@@             " << endl; cout << "        @@ @@               " << endl; cout << "        @@ @@               " << endl; cout << "        @@@@                 " << endl; cout << "        @@@@                 " << endl; return 0; } ``` 运行该程序即可在控制台中看到输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值