计算机视觉中的注意力机制
简介
计算机视觉(computer vision)中的注意力机制(attention)的主要是想让系统学会把注意力放在感兴趣的地方。具备注意力机制的神经网络一方面能够自主学习注意力机制,另一方面则是注意力机制能够反过来帮助我们去理解神经网络看到的世界。
近几年来,深度学习与视觉注意力机制结合的研究工作,大多数是集中于使用掩码(mask)来形成注意力机制。掩码的原理在于通过另一层新的权重,将图片数据中关键的特征标识出来,通过学习训练,让深度神经网络学到每一张新图片中需要关注的区域,也就形成了注意力。
注意力有两种,一种是软注意力(soft attention),另一种则是强注意力(hard attention)。
软注意力更关注区域或者通道,而且软注意力是确定性的注意力,学习完成后直接可以通过网络生成,最关键的地方是软注意力是可微的,这是一个非常重要的地方。可以微分的注意力就可以通过神经网络算出梯度并且前向传播和后向反馈来学习得到注意力的权重。
强注意力与软注意力不同点在于,首先强注意力是更加关注点,也就是图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。当然,最关键是强注意力是一个不可微的注意力,训练过程往往是通过增强学习(reinforcement learning)来完成的。
为了更清楚地介绍计算机视觉中的注意力机制,这篇文章将从注意力域(attention domain)的角度来分析几种注意力的实现方法。其中主要是三种注意力域,空间域(spatial domain),通道域(channel domain),混合域(mixed domain)。
软注意力的注意力域
空间域(Spatial Domain)
设计思路:
空间域将原始图片中的空间信息变换到另一个空间中并保留了关键信息。
普通的卷积神经网络中的池化层(pooling layer)直接用一些max pooling 或者average pooling 的方法,将图片信息压缩,减少运算量提升准确率。
发明者认为之前pooling的方法太过于暴力,直接将信息合并会导致关键信息无法识别出来,所以提出了一个叫空间转换器(spatial transformer)的模块,将图片中的的空间域信息做对应的空间变换,从而能将关键的信息提取出来。
比如这个直观的实验图:
(a)列是原始的图片信息,其中第一个手写数字7没有做任何变换,第二个手写数字5,做了一定的旋转变化,而第三个手写数字6,加上了一些噪声信号;
(b)列中的彩色边框是学习到的spatial transformer的框盒(bounding
box),每一个框盒其实就是对应图片学习出来的一个spatial transformer;c列中是通过spatial
transformer转换之后的特征图,可以看出7的关键区域被选择出来,5被旋转成为了正向的图片,6的噪声信息没有被识别进入。
spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。
模型结构
这是空间变换网络(spatialtransformer network)中最重要的空间变换模块,这个模块可以作为新的层直接加入到原有的网络结构,比如ResNet中。来仔细研究这个模型的输入:
神经网络训练中使用的数据类型都是张量(tensor),H是上一层tensor的高度(height),W是上一层tensor的宽度(width),而C代表tensor的通道(channel),比如图片基本的三通道(RGB),或者是经过卷积层(convolutional layer)之后,不同卷积核(kernel)都会产生不同的通道信息。之后这个输入进入两条路线,一条路线是信息进入定位网络(localisation net),另一条路线是原始信号直接进入采样层(sampler)。
其中定位网络会学习到一组参数θ,而这组参数就能够作为网格生成器(grid generator)的参数,生成一个采样信号,这个采样信号其实是一个变换矩阵,与原始图片相乘之后,可以得到变换之后的矩阵V。
V就是变换之后的图片特征了,变换之后的矩阵大小是可以通过调节变换矩阵来形成缩放的。
这个模块加进去最大的好处就是能够对上一层信号的关键信息进行识别(attention),并且该信息矩阵是一个可以微分的矩阵,因为每一个目标点的信息其实是所有源点信息的一个组合,这个组合可以是一个线性组合,复杂的变换信息也可以用核函数(kernel)来表示:
理论上来说,这样的模块是可以加在任意层的,因为模块可以同时对通道信息和矩阵信息同时处理。
这种模块其实更适用于原始图片输入层之后的变化,因为卷积层之后,每一个卷积核(filter)产生的通道信息,所含有的信息量以及重要程度其实是不一样的,都用同样的transformer其实可解释性并不强。
通道域(Channel Domain)
设计思路:
通道域的注意力机制原理很简单,学过信号处理就会很容易理解,信号系统分析里面,任何一个信号其实都可以写成正弦波的线性组合,经过时频变换<注4>之后,时域上连续的正弦波信号就可以用一个频率信号数值代替了。
注4:一般是使用傅里叶变换,也是卷积变化
在卷积神经网络中,每一张图片初始会由(R,G,B)三通道表示出来,之后经过不同的卷积核之后,每一个通道又会生成新的信号,比如图片特征的每个通道使用64核卷积,就会产生64个新通道的矩阵(H,W,64),H,W分别表示图片特征的高度和宽度
每个通道的特征其实就表示该图片在不同卷积核上的分量,类似于时频变换,而这里面用卷积核的卷积类似于信号做了傅里叶变换,从而能够将这个特征一个通道的信息给分解成64个卷积核上的信号分量。
既然每个信号都可以被分解成核函数上的分量,产生的新的64个通道对于关键信息的贡献肯定有多有少,**如果我们给每个通道上的信号都增加一个权重,**来代表该通道与关键信息的相关度的话,这个权重越大,则表示相关度越高,也就是我们越需要去注意的通道了。
模型结构
首先最左边是原始输入图片特征X,然后经过变换,比如卷积变换,产生了新的特征信号U。U有C个通道,我们希望通过注意力模块来学习出每个通道的权重,从而产生通道域的注意力。
中间的模块就是SENet的创新部分,也就是注意力机制模块。这个注意力机制分成三个部分:挤压(squeeze),激励(excitation),以及注意(attention)。
挤压函数:
很明显这个函数做了一个全局平均值,把每个通道内所有的特征值相加再平均,也是全局平均池化(global average pooling)的数学表达式。
激励函数:
δ函数是ReLU,而σ是一个sigmoid**函数。W1和W2的维度分别是,。通过训练学习这两个权重,得到一个一维的激励权重来**每一层通道。
尺度函数:
本质是放缩过程,不同通道的值乘上不同的权重,从而可以增强对关键通道域的注意力。
还有混合域和时间域还需要消化,消化了再写。