注意力机制
参考链接:
注意力机制综述(图解完整版附代码) - 知乎 (zhihu.com)
1.注意力机制的产生
注意力机制是一种模仿人类视觉和认知系统的方法。通过引入注意力机制,神经网络能够自动学习并选择性关注输入中的重要信息,提高模型的性能和泛化能力。
下图是一个人类注意力的示例,红色区域标识视觉系统更加关注的目标,例如人脸、文本标题和首句等。
注意力机制本质上和人类的选择性注意力机制类似,核心目标也是从众多信息中选出对当前任务目标更加关键的信息。深度学习中,注意力机制通常应用于序列数据(文本、语音、图像序列等)的处理。其中,最典型的注意力机制包括自注意力机制、空间注意力机制和时间注意力机制。这些注意力机制允许模型对输入序列的不同位置分配不同的权重,以便在处理每个序列元素时专注于最相关的部分。
2.自注意力机制
自注意力机制的基本思想是,在处理序列数据时,每个元素都可以与序列中的其他元素建立关联,而不仅仅依赖于相邻位置的元素。它通过计算元素之间的相对重要性来自适应地捕捉元素之间的长程依赖关系。
具体而言,对于序列中的每个元素,自注意力机制计算与其他元素的相似度,并将这些相似度归一化为注意力权重。然后,通过将每个元素与对应的注意力权重进行加权求和,可以得到自注意力机制的输出。
假设有一个序列:“我吃柠檬”,分别用$x^1$,$x^2$,$x^3$,$x^4$标示,如上图。
2.1Embedding操作
首先对“我吃柠檬”这句话进行Embedding操作(使用Word2Vec等方法),得到新的向量$a^1$,$a^2$,$a^3$,$a^4$,如下图。其中$W$表示Embedding的参数矩阵。
2.2q、k操作
Embedding操作后,$a^1$,$a^2$,$a^3$,$a^4$将会作为注意力机制的input data。
第一步,每个$a^i$都会分别乘以三个矩阵,即$q,k,v$。这三个矩阵在整个过程中是共享的,公式如下:
$$
q^i=W^qa^i\\
k^i=W^ka^i\\
v^i=W^va^i
$$
其中,$q$(Query)的含义一般的解释是用来和其他的单词进行匹配,也就是计算当前单词和其他单词之间的关联;$k$(Key)的含义则是被用来和$q$进行匹配,也可理解为单词的关键信息。
如下图所示,若需计算$a^1$和$a^2,a^3,a^4$之间的关系,则需要用$q^1$和$k^2,k^3,k^4$进行匹配运算,计算公式如下:
$\alpha_{1,i}=q^1\cdot k^i/\sqrt{d}$
注意,该公式仅为一个示例,实际可以用各种方法进行计算。其中,$d$表示$q$和$k$的矩阵维度,在自注意力机制中,$q$和$k$维度一样。这里除以$\sqrt{d}$是为了防止$q$和$k$的点乘结果较大。
经过$q$和$k$的点乘操作后,会得到$\alpha_{1,1},\alpha_{1,2},\alpha_{1,3},\alpha_{1,4}$。然后,对其进行softmax标准化,得到$\tilde{\alpha}{1,1},\tilde{\alpha}{1,2},\tilde{\alpha}{1,3},\tilde{\alpha}{1,4}$。
2.3v操作
$v$主要表示当前单词或字的重要信息表示,也可理解为单词的重要特征。在$v$操作中,会将$q,k$操作后得到的$\tilde{\alpha}{1,1},\tilde{\alpha}{1,2},\tilde{\alpha}{1,3},\tilde{\alpha}{1,4}$和$v^1,v^2,v^3,v^4$分别相乘(如下图),计算公式如下:
$$
b^1=\sum_{i}\tilde{\alpha}_{1,i}v^i
$$
对应的,$b^2=\sum_i\tilde{\alpha}_{2,i}v^i$,以此类推。
由此可见,自注意力机制通过计算序列中不同位置之间的相关性,为每个位置分配一个权重,然后对序列进行加权求和。
3.多头自注意力机制(Multi-head Self-Attention Mechanism)
多头注意力机制是在自注意力机制的基础上发展起来的,是自注意力机制的变体,旨在增强模型的表达能力和泛化能力。它通过使用多个独立的注意力头,分别计算注意力权重,并将他们的结果进行拼接或加权求和,从而获得更丰富的表示。
在自注意力机制中,每个单词仅有一个$q,k,v$与之对应,多头注意力机制则是在原来$q,k,v$的基础上,再分配多个$q,k,v$,例如:
3.1 q,k操作
在多头注意力机制中,$a^i$首先乘$q$矩阵,$q^i=W^qa^i$;其次,会为其多分配两个head,对$q$来说就是$q^{i,1},q^{i,2}$;
$$
q^{i,1}=W^{q,1}q^i\\
q^{i,2}=W^{q,2}q^i
$$
$k$和$v$也是同样的操作。
在$q$和$k$的点乘操作中,下标相同的分别相乘,例如$q^{i,1}$和$k^{i,1},k^{j,1}$分别相乘,再进行softmax操作。
3.2 v操作
和自注意力机制类似,如上图$b^{i,1}=\sum_{l}(q^{i,1} \cdot k^{l,1}+v^{l,1})$。
4.通道注意力机制
通道注意力机制计算的是每个通道channel的重要性程度,因此常被用在卷积神经网络里面。目前比较经典的通道注意力机制是SENet模型,它通过学习通道间的关系(每个通道的重要性),提升了网络在特征表示中的表达能力,进而提升了模型的性能。
4.1 SENet介绍
如上图,数据$X$经过卷积操作和得到$U$,$U$的通道数用$C$表示,$H \times W$表示一个通道的长和宽。此后,SENet引入一个Squeeze模块$F_{sq}(\cdot)$和一个Excitation模块$F_{ex}(\cdot,W)$。
$F_{sq}(\cdot)$通过全局平均池化操作将每个通道的特征图转化为一个标量值,也就是用全局平均池化操作将每个通道上的数据压缩成一个标量值,得到一个$1\times 1 \times C$的矩阵。然后$F_{ex}(\cdot, W)$通过激活函数(如sigmoid或ReLU)对上面得到的矩阵进行操作,$W$即为激活函数,得到带有颜色的$1\times 1\times C$的矩阵,用来学习每个通道的权重。最后,经过$F_{scale}(\cdot,\cdot)$将这些权重应用到原始特征图上,将带有颜色的$1\times 1 \times C$矩阵和$U$进行点乘,以得到加权后的特征图。最后,将加权后的特征图输入到后续的卷积层进行分类或检测任务。
SENet并不是一个单独的网络结构,而是可以与其他卷积神经网络结构(如ResNet、Inception等)相结合,进而增强它们的表达能力。如果愿意的话,可以直接在每个卷积之后都添加SENet,但是这样可能有过拟合的风险。
5.空间注意力机制
空间注意力机制和通道注意力机制有异曲同工之妙,通道注意力机制旨在捕捉通道的重要性程度,而空间注意力机制旨在通过引入注意力模块,使模型能够自适应地学习不同区域的注意力权重。这样模型可以更加关注重要的图像区域,忽略不重要的区域。最典型的一个是CBAM(Convolutional Block Attention Module),它是一种结合了通道注意力和空间注意力的模型,旨在增强卷积神经网络对图像的关注能力。
5.1 CBAM介绍
从上图可以看出,CBAM模块由两个注意力模块组成:通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module)。
CBAM中通道注意力模块使用全局平均池化和全局最大池化分别获取每个通道的全局的统计信息,并通过两层全连接层来学习通道的权重。然后,将处理后产生的两个结果进行相加,通过使用sigmoid函数将权重归一化到0和1之间,对每个通道进行缩放。最后,将缩放后的通道特征与原始特征相乘,以产生具有增强通道重要性的特征。
CBAM中的空间注意力模块使用最大池化和平均池化来获取每个空间位置的最大值和平均值。具体而言,由于卷积之后会产生多个通道,CBAM中空间注意力会在每一个特征点的通道上进行最大池化和平均池化操作,得到两个matrix后,将它们进行拼接,并通过一个卷积层和sigmoid函数来学习每个空间位置的权重。最后,将权重应用于特征图上的每个空间位置,以产生具有增强空间重要性的特征。