作者 | VincentLee
责编 | 贾伟
本文来源于公众号:晓飞的算法工程笔记
近年来很多研究将NLP中的attention机制融入到视觉的研究中,得到很不错的结果。这篇发表于 ICLR 2020 的论文侧重于从理论和实验去验证self-attention可以代替卷积网络独立进行类似卷积的操作,给self-attention在图像领域的应用奠定基础。
论文地址:https://arxiv.org/abs/1911.03584
论文代码:https://github.com/epfml/attention-cnn
Transformer的提出对NLP领域的研究有很大的促进作用,这主要得益于attention机制,特别是自注意力(self-attention),它会考虑词间的相似性,对当前词进行加权输出。受到词间关系学习的启发,自注意力也开始用于视觉任务中,但大都是注意力和卷积的结合。Ramachandran 在2019年的研究中,用完全注意力模型(full attention model)达到了ResNet baseline的精度,模型参数和计算量相比卷积网络减轻了不少。
这篇论文主要研究自注意力层在图片处理上是否能达到卷积层的效果。贡献有两点:
在理论层面,论文通过构造性证明自注意力层能够替代任何卷积层。
在实际层面,论文通过构造多头自注意力曾进行实验,证明attention-only架构的前几层的确学习到了关注query pixel附近的 g网格区域特征。
背景
多头自注意力层
定义
为输入矩阵,包含
个
维的token,在NLP中,token对应着序列化的词,同样地也可以对应序列化的像素
自注意力层从
到
的计算如公式1, 2所示,
为attention scores,softmax将score转换为注意力概率,该层的参数包含查询矩阵(query matrix)
,关键词矩阵(key matrix)
,值矩阵(value matrix)
,都用于对输入进行变化,基本跟NLP中的自注意力一致:
因为只考虑相关性,自注意力一个很重要的属性是,不管输入的顺序如何改变,输出都是不变的,这对于希望顺序对结果有影响的case影响很大,因此在自注意力基础上为每个token学习一个positional encoding参数,
为包含位置信息的嵌入向量,可以有多种形式。
这里采用multiple heads版本的自注意力,每个head的参数矩阵都不一样,能够提取不同的特征,
个head输出
维结果concat后映射成
维的最终输出,两个新参数,映射矩阵(projection matrix)
,偏置
。
图注意力
卷积是最适合神经网络的图片操作方法,给予图片
,卷积在
的操作如公式5,
,
,K为卷积核的大小。
在图片上应用自注意力,定义查询像素和关键词像素
,
输入的向量大小为
为了保持一致性,用1D的符号来代表2D坐标,比如
,用
代表
,用
代表
。
图位置编码
位置编码目前主要有两种,分别是绝对位置(absolute)编码和相对(relative)位置编码。
在绝对位置编码中,每个像素拥有一个位置向量
(学习的或固定的),于是公式2可以转换为公式(7)。
相对位置编码的核心是只考虑查询像素和查询像素之间的位置差异,如公式(8),大体是将公式(7)的每一项的绝对位参数改为相对位置参数。attention scores只跟偏移
,
和
是learnable参数,每个head都不一样,而每个偏移的相对位置编码
是head共享的。关键词权重分成了两部分,
属于输入,
属于偏移。
公式(9)称为二次编码(quadratic encoding),参数
和
分别代表中心点以及attention区域的大小,都是通过学习得来的,而
则是固定的,代表查询像素和关键词像素的相对位移。
作为卷积层的自注意力
定理1:对于多头自注意力,
个head,每个head输出
维,整体最终输出
,相对位置编码
维,可以表示任何卷积,核大小为
,output channel为
。
对于output channel不是固定
,论文认为当
时,
相当于一个升维操作,这个操作的特征提取不能代表原始卷积的属性,实际中,一般采用
,这里是我的个人理解,可能有错误。小于
时,
相当于一个升维操作,这个操作的特征提取不能代表原始卷积的属性,实际中,一般采用
。
上面的定理表明,在选择适当的参数后,多头自注意力层可以表现得跟卷积层一样,每个head 的 attention score 关注不同偏移距离的像素,偏移值分别在集合
内,这样整体就类似于
核,如图1所示。
卷积神经网络不止卷积核大小这个超参,还有很多其它超参,这里论文对输出的数值的一致性上进行了解释:
Padding:多头自注意力层默认使用"SAME"的填充模式,而卷积层会减小K-1个像素的图片大小,因此,为了减少边界影响,可以对卷积图片进行的零填充;
Stride:卷积神经网络的步长可以认为是在卷积后面加入一个pooling操作,而定理 1 默认步长为1,但可以在后面接个pooling达到相同的结果;
Dilation: 因为多头自注意力可以设置任意的偏移值,因此也可以代表空洞卷积。
实验
实验的主要目的在于验证自注意力进行类似卷积的操作,以及自注意力在实际中是否学习到了类似卷积的属性,包含 3 种类似的注意力,分别为quadratic embedding,learned embedding和learnded embedding content,具体可以看作者开源代码的attention score计算部分。
根据作者的解答,前两种都对应于代码的第一种注释,区别在前者按照公式9来计算
,后者则是完全随机学习来的,最后一种则对应注释的第三种。
实现细节
搭建一个包含6层多头自注意力的神经网络,实验主要和标准ResNet18对比,固定的图片输入,最后使用average pooling将结果送给分类器。
结果如图2和Table1所示,ResNet收敛更快,但不能确定这是卷积固有的属性还是结构优化带来的结果,由于实验的结构还是很naive的,所以会存在差距,通过一些优化手段应该可以解决。
二次编码
论文进行实验验证公式(9)的相对位置编码
是否学习到了类似卷积的操作,实验使用 9 个head来模拟
卷积操作。
从图3可以看出,网络第四层中各head的位置变化,在经过优化后,各head关注的pixel形式类似于grid的分布,可见的确学到了类似卷积核的操作。
图4则展示了不同层的head分布,可以看到层1和2更关注local区域,而层3-6更关注更大的区域。
学习相对位置编码
首先,论文去除了与输入数据相关的注意力内容,仅考虑公式(8)的最后一项进行统计,结果如图5所示,层1-3非常接近查询区域,而深层数据则更关注整图的信息。
接着使用论文对位置注意力和基于内容的注意力进行了分析
,将100张图的注意力概率进行了平均结果如图 6 所示。在层 2 和 3 中,尽管输入的数据不一样,但一些head学到了去关注查询像素附近的特定区域的像素这一行为,与卷积操作十分类似,而其它的head则使用了更多的content-based attention。
在实际中,图6中的localized attention patterns是随着查询像素移动的,这与卷积操作更加类似,详情可以看 https://epfml.github.io/attention-cnn/ 。
结论
论文展示了自注意力层可以表示任意卷积层的行为,以及完全注意力模型能够学会如何结合局部行为和基于输入内容全局注意力。在未来,可以将卷积网络的优化方法迁移到完全注意力模型上,应用于不同数据领域的模型,例如图像,文字和时间序列。
感谢
在论文阅读期间遇到了很多问题,给作者发了邮件后,很耐心地回答了我的问题,在这里十分感谢作者Jean-Baptiste Cordonnier。