综述|计算机视觉中的注意力机制

Attention是一种资源分配的机制 , 在视觉方面 , 其核心思想是突出对象的某些重要特征 。 本文主要介绍了多种注意力机制的基本结构和实现过程 。
之前在看DETR这篇论文中的self_attention , 然后结合之前实验室组会经常提起的注意力机制 , 所以本周时间对注意力机制进行了相关的梳理 , 以及相关的源码阅读了解其实现的机制 。
一、注意力机制(attention mechanism)attention机制可以它认为是一种资源分配的机制 , 可以理解为对于原本平均分配的资源根据attention对象的重要程度重新分配资源 , 重要的单位就多分一点 , 不重要或者不好的单位就少分一点 , 在深度神经网络的结构设计中 , attention所要分配的资源基本上就是权重了 。
视觉注意力分为几种 , 核心思想是基于原有的数据找到其之间的关联性 , 然后突出其某些重要特征 , 有通道注意力 , 像素注意力 , 多阶注意力等 , 也有把NLP中的自注意力引入 。
二、自注意力(self-attention)参考文献:
参考资料:
GitHub:
自注意力有时候也称为内部注意力 , 是一个与单个序列的不同位置相关的注意力机制 , 目的是计算序列的表达形式 , 因为解码器的位置不变性 , 以及在DETR中 , 每个像素不仅仅包含数值信息 , 并且每个像素的位置信息也很重要 。
综述|计算机视觉中的注意力机制文章插图
所有的编码器在结构上都是相同的 , 但它们没有共享参数 。 每个编码器都可以分解成两个子层:
综述|计算机视觉中的注意力机制文章插图
在transformer中 , 每个encoder子层有Multi-head self-attention和position-wise FFN组成 。
综述|计算机视觉中的注意力机制文章插图
输入的每个单词通过嵌入的方式形成词向量 , 通过自注意进行编码 , 然后再送入FFN得出一个层级的编码 。
综述|计算机视觉中的注意力机制文章插图
解码器在结构上也是多个相同的堆叠而成 , 在有和encoder相似的结构的Multi-head self-attention和position-wise FFN , 同时还多了一个注意力层用来关注输入句子的相关部分 。
【综述|计算机视觉中的注意力机制】Self-Attention
Self-Attention是Transformer最核心的内容 , 可以理解位将队列和一组值与输入对应 , 即形成querry , key , value向output的映射 , output可以看作是value的加权求和 , 加权值则是由Self-Attention来得出的 。
具体实施细节如下:
在self-attention中 , 每个单词有3个不同的向量 , 它们分别是Query向量 , Key向量和Value向量 , 长度均是64 。 它们是通过3个不同的权值矩阵由嵌入向量X乘以三个不同的权值矩阵得到 , 其中三个矩阵的尺寸也是相同的 。 均是512×64 。
综述|计算机视觉中的注意力机制文章插图
Self_attention的计算过程如下

  1. 将输入单词转化成嵌入向量;
  2. 根据嵌入向量得到q , k , v三个向量;
  3. 为每个向量计算一个score:score=q×v;
  4. 为了梯度的稳定 , Transformer使用了score归一化 , 即除以sqrt(dk);
  5. 对score施以softmax激活函数;
  6. softmax点乘Value值v , 得到加权的每个输入向量的评分v;
  7. 相加之后得到最终的输出结果z 。

综述|计算机视觉中的注意力机制文章插图
矩阵形式的计算过程:
综述|计算机视觉中的注意力机制文章插图
对于Multi-head self-attention , 通过论文可以看出就是将单个点积注意力进行融合 , 两者相结合得出了transformer
综述|计算机视觉中的注意力机制文章插图
综述|计算机视觉中的注意力机制文章插图
具体的实施可以参照detr的models/transformer
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
"""
DETR Transformer class.
Copy-paste from torch.nn.Transformer with modifications:
* positional encodings are passed in MHattention
* extra LN at the end of encoder is removed
* decoder returns a stack of activations from all decoding layers
"""
import copy
from typing import Optional, List
import torch
import torch.nn.functional as F
from torch import nn, Tensor
class Transformer(nn.Module):
def __init__(self, d_model=512, nhead=8, num_encoder_layers=6,