计算机系统应用教程网站

网站首页 > 技术文章 正文

深度学习中的 Attention 机制 attention deep learning

btikc 2024-10-15 08:57:19 技术文章 4 ℃ 0 评论

近几年,Attention-based 方法因其可解释和有效性,受到了学术界和工业界的欢迎。但是,由于论文中提出的网络结构通常被嵌入到分类、检测、分割等代码框架中,导致代码比较冗余,对于像我这样的小白很难找到网络的核心代码,导致在论文和网络思想的理解上会有一定困难。因此,我把最近看的 Attention、MLP 和 Re-parameter 论文的核心代码进行了整理和复现,方便各位读者理解。本文主要对该项目的 Attention 部分做简要介绍。

项目地址

https://github.com/xmu-xiaoma666/External-Attention-pytorch

1. External Attention

1.1. 引用

Beyond Self-attention: External Attention using Two Linear Layers for Visual Tasks.---arXiv 2021.05.05

论文地址:https://arxiv.org/abs/2105.02358

1.2. 模型结构

1.3. 简介

这是五月份在 arXiv 上的一篇文章,主要解决的 Self-Attention(SA) 的两个痛点问题:(1)O(n^2) 的计算复杂度;(2)SA 是在同一个样本上根据不同位置计算 Attention,忽略了不同样本之间的联系。因此,本文采用了两个串联的 MLP 结构作为 memory units,使得计算复杂度降低到了 O(n);此外,这两个 memory units 是基于全部的训练数据学习的,因此也隐式地考虑了不同样本之间的联系。

1.4. 使用方法

from attention.ExternalAttention import ExternalAttention
import torch
input=torch.randn(50,49,512)
ea = ExternalAttention(d_model=512,S=8)
output=ea(input)
print(output.shape)

2. Self Attention

2.1. 引用

Attention Is All You Need---NeurIPS2017

论文地址:https://arxiv.org/abs/1706.03762

2.2. 模型结构

2.3. 简介

这是 Google 在 NeurIPS2017 发表的一篇文章,在 CV、NLP、多模态等各个领域都有很大的影响力,目前引用量已经 2.2w+。Transformer 中提出的 Self-Attention 是 Attention 的一种,用于计算特征中不同位置之间的权重,从而达到更新特征的效果。首先将 input feature 通过 FC 映射成 Q、K、V 三个特征,然后将 Q 和 K 进行点乘的得到 attention map,在将 attention map 与 V 做点乘得到加权后的特征。最后通过 FC 进行特征的映射,得到一个新的特征。(关于 Transformer 和 Self-Attention 目前网上有许多非常好的讲解,这里就不做详细的介绍了)

2.4. 使用方法

from attention.SelfAttention import ScaledDotProductAttention
import torch

input=torch.randn(50,49,512)
sa = ScaledDotProductAttention(d_model=512, d_k=512, d_v=512, h=8)
output=sa(input,input,input)
print(output.shape)

3. Squeeze-and-Excitation(SE) Attention

3.1. 引用

Squeeze-and-Excitation Networks---CVPR2018

论文地址:https://arxiv.org/abs/1709.01507

3.2. 模型结构

3.3. 简介

这是 CVPR2018 的一篇文章,同样非常具有影响力,目前引用量 7k+。本文是做通道注意力的,因其简单的结构和有效性,将通道注意力掀起了一波小高潮。大道至简,这篇文章的思想可以说非常简单,首先将 spatial 维度进行 AdaptiveAvgPool,然后通过两个 FC 学习到通道注意力,并用 Sigmoid 进行归一化得到 Channel Attention Map, 最后将 Channel Attention Map 与原特征相乘,就得到了加权后的特征。

3.4. 使用方法

from attention.SEAttention import SEAttention
import torch

input=torch.randn(50,512,7,7)
se = SEAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)

4. Selective Kernel(SK) Attention

4.1. 引用

Selective Kernel Networks---CVPR2019

论文地址:https://arxiv.org/pdf/1903.06586.pdf

4.2. 模型结构

4.3. 简介

这是 CVPR2019 的一篇文章,致敬了 SENet 的思想。在传统的 CNN 中每一个卷积层都是用相同大小的卷积核,限制了模型的表达能力;而 Inception 这种 “更宽” 的模型结构也验证了,用多个不同的卷积核进行学习确实可以提升模型的表达能力。作者借鉴了 SENet 的思想,通过动态计算每个卷积核得到通道的权重,动态地将各个卷积核的结果进行融合。

个人认为,之所以所这篇文章也能够称之为 lightweight,是因为对不同 kernel 的特征进行通道注意力的时候是参数共享的(i.e. 因为在做 Attention 之前,首先将特征进行了融合,所以不同卷积核的结果共享一个 SE 模块的参数)。

本文的方法分为三个部分:Split,Fuse,Select。Split 就是一个 multi-branch 的操作,用不同的卷积核进行卷积得到不同的特征;Fuse 部分就是用 SE 的结构获取通道注意力的矩阵 (N 个卷积核就可以得到 N 个注意力矩阵,这步操作对所有的特征参数共享),这样就可以得到不同 kernel 经过 SE 之后的特征;Select 操作就是将这几个特征进行相加。

4.4. 使用方法

from attention.SKAttention import SKAttention
import torch

input=torch.randn(50,512,7,7)
se = SKAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)

5. CBAM Attention

5.1. 引用

CBAM: Convolutional Block Attention Module---ECCV2018

论文地址:https://openaccess.thecvf.com/content_ECCV_2018/papers/Sanghyun_Woo_Convolutional_Block_Attention_ECCV_2018_paper.pdf

5.2. 模型结构

5.3. 简介

这是 ECCV2018 的一篇论文,这篇文章同时使用了 Channel Attention 和 Spatial Attention,将两者进行了串联(文章也做了并联和两种串联方式的消融实验)。

Channel Attention 方面,大致结构还是和 SE 相似,不过作者提出 AvgPool 和 MaxPool 有不同的表示效果,所以作者对原来的特征在 Spatial 维度分别进行了 AvgPool 和 MaxPool,然后用 SE 的结构提取 channel attention,注意这里是参数共享的,然后将两个特征相加后做归一化,就得到了注意力矩阵。Spatial Attention 和 Channel Attention 类似,先在 channel 维度进行两种 pool 后,将两个特征进行拼接,然后用 7x7 的卷积来提取 Spatial Attention(之所以用 7x7 是因为提取的是空间注意力,所以用的卷积核必须足够大)。然后做一次归一化,就得到了空间的注意力矩阵。

5.4. 使用方法

from attention.CBAM import CBAMBlock
import torch

input=torch.randn(50,512,7,7)
kernel_size=input.shape[2]
cbam = CBAMBlock(channel=512,reduction=16,kernel_size=kernel_size)
output=cbam(input)
print(output.shape)

6. BAM Attention

6.1. 引用

BAM: Bottleneck Attention Module---BMCV2018

论文地址:https://arxiv.org/pdf/1807.06514.pdf

6.2. 模型结构

6.3. 简介

这是 CBAM 同作者同时期的工作,工作与 CBAM 非常相似,也是双重 Attention,不同的是 CBAM 是将两个 attention 的结果串联;而 BAM 是直接将两个 attention 矩阵进行相加。

Channel Attention 方面,与 SE 的结构基本一样。Spatial Attention 方面,还是在通道维度进行 pool,然后用了两次 3x3 的空洞卷积,最后将用一次 1x1 的卷积得到 Spatial Attention 的矩阵。最后 Channel Attention 和 Spatial Attention 矩阵进行相加(这里用到了广播机制),并进行归一化,这样一来,就得到了空间和通道结合的 attention 矩阵。

6.4. 使用方法

from attention.BAM import BAMBlock
import torch

input=torch.randn(50,512,7,7)
bam = BAMBlock(channel=512,reduction=16,dia_val=2)
output=bam(input)
print(output.shape)

7. ECA Attention

7.1. 引用

ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks---CVPR2020

论文地址:https://arxiv.org/pdf/1910.03151.pdf

7.2. 模型结构

7.3. 简介

这是 CVPR2020 的一篇文章。

如上图所示,SE 实现通道注意力是使用两个全连接层,而 ECA 是需要一个的卷积。作者这么做的原因一方面是认为计算所有通道两两之间的注意力是没有必要的,另一方面是用两个全连接层确实引入了太多的参数和计算量。

因此作者进行了 AvgPool 之后,只是使用了一个感受野为 k 的一维卷积(相当于只计算与相邻 k 个通道的注意力),这样做就大大地减少的参数和计算量。(i.e. 相当于 SE 是一个 global 的注意力,而 ECA 是一个 local 的注意力)。

7.4. 使用方法:

from attention.ECAAttention import ECAAttention
import torch

input=torch.randn(50,512,7,7)
eca = ECAAttention(kernel_size=3)
output=eca(input)
print(output.shape)

8. DANet Attention

8.1. 引用

Dual Attention Network for Scene Segmentation---CVPR2019

论文地址:https://arxiv.org/pdf/1809.02983.pdf

8.2. 模型结构

8.3. 简介

这是 CVPR2019 的文章,思想上非常简单,就是将 self-attention 用到场景分割的任务中,不同的是 self-attention 是关注每个 position 之间的注意力,而本文将 self-attention 做了一个拓展,还做了一个通道注意力的分支,操作上和 self-attention 一样,不同的通道 attention 中把生成 Q,K,V 的三个 Linear 去掉了。最后将两个 attention 之后的特征进行 element-wise sum。

8.4. 使用方法

from attention.DANet import DAModule
import torch

input=torch.randn(50,512,7,7)
danet=DAModule(d_model=512,kernel_size=3,H=7,W=7)
print(danet(input).shape)

9. Pyramid Split Attention(PSA)

9.1. 引用

EPSANet: An Efficient Pyramid Split Attention Block on Convolutional Neural Network---arXiv 2021.05.30

论文地址:https://arxiv.org/pdf/2105.14447.pdf

9.2. 模型结构

9.3. 简介

这是深大 5 月 30 日在 arXiv 上上传的一篇文章,本文的目的是如何获取并探索不同尺度的空间信息来丰富特征空间。网络结构相对来说也比较简单,主要分成四步,第一部,将原来的 feature 根据通道分成 n 组然后对不同的组进行不同尺度的卷积,得到新的特征 W1;第二部,用 SE 在原来的特征上进行 SE,从而获得不同的阿头疼托尼;第三部,对不同组进行 SOFTMAX;第四部,将获得 attention 与原来的特征 W1 相乘。

9.4. 使用方法

from attention.PSA import PSAimport torch
input=torch.randn(50,512,7,7)
psa = PSA(channel=512,reduction=8)
output=psa(input)
print(output.shape)

10. Efficient Multi-Head Self-Attention(EMSA)

10.1. 引用

ResT: An Efficient Transformer for Visual Recognition---arXiv 2021.05.28

论文地址:https://arxiv.org/abs/2105.13677

10.2. 模型结构

10.3. 简介

这是南大 5 月 28 日在 arXiv 上上传的一篇文章。本文解决的主要是 SA 的两个痛点问题:(1)Self-Attention 的计算复杂度和 n 呈平方关系;(2)每个 head 只有 q,k,v 的部分信息,如果 q,k,v 的维度太小,那么就会导致获取不到连续的信息,从而导致性能损失。这篇文章给出的思路也非常简单,在 SA 中,在 FC 之前,用了一个卷积来降低了空间的维度,从而得到空间维度上更小的 K 和 V。

10.4. 使用方法

from attention.EMSA import EMSA
import torch
from torch import nn
from torch.nn 
import functional as F
input=torch.randn(50,64,512)
emsa = EMSA(d_model=512, d_k=512, d_v=512, h=8,H=8,W=8,ratio=2,apply_transform=True)
output=emsa(input,input,input)
print(output.shape)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表