文章目录

  • attention
    • sequence attention
      • attention 与 self-attention
    • channel attention 与 spatial attention
  • multi-head attention
  • transformer

attention

  神经网络在机器学习中属于连接主义,attention机制就是通过添加注意力连接实现的,对传统的神经网络添加新的连接,让神经网络自动学习,对输入的各个部分应该分配多少注意力。这篇blog涉及的attention机制只是几个典型的attention,其中,sequence attention在NLP领域用的较多,channel attention和spatial attention在CV领域用的较多。

sequence attention

  针对序列的attention,一般用于输入数据有先后时序性要求的任务中,通过添加注意力机制,让神经网络自动学习应该注意到哪一个时间步的输入,所以在介绍这一部分时利用的NLP的应用场景。

  在著名的《attention is all you need》论文中,作者认为使用较为广泛的注意力机制可以分成点积注意力(dot-product attention)和额外注意力(additive attention),点积注意力机制,需要我们知道查询向量(query),键向量(key)和值向量(value),简单来说,我们在想要获取attention信息的位置会放出一个query,这个query去查询所有的候选位置,每个候选位置会有一对key和value,查询的过程就是query和所有候选位置的key做点积的过程,点积结果经过softmax后加权到各自的value上,求和就得到了最终的attention结果,具体过程可以看下面。

attention 与 self-attention

  attention 与 self-attention的区别可以从查询向量(query),键向量(key)和值向量(value)三个向量的来源来区分,以传统的sequence to sequence为例,我们认为模型的输入是一个sequence,记为 s e q 1 = < i 1 , i 2 , … , i n > seq_1=<i_1, i_2, \dots, i_n> seq1=<i1,i2,,in>,模型的输出也是一个sequence,记为 s e q 2 = < o 1 , o 2 , … , o m > seq_2=<o_1, o_2, \dots, o_m> seq2=<o1,o2,,om>

  对于一般的attention,我们一般会在 s e q 2 seq_2 seq2中触发求attention的过程,例如在 o 2 o_2 o2位置放出query,这个query回到 s e q 1 seq_1 seq1中查找 i 1 , i 2 , … , i n i_1,i_2, \dots, i_n i1i2,,in各个位置的key-value对,因此query在 s e q 2 seq_2 seq2产生,key-value在 s e q 1 seq_1 seq1产生。

  self-attention,一般会在同一个 s e q seq seq内触发求attention的过程,产生query,这个query在同一 s e q seq seq中查找各个位置的key-value对,因此query,key-value的产生都是在一个sequence中的,不存在跨sequence的情况,所以叫做self-attention。

Self-attention, sometimes called intra-attention is an attention mechanism relating different positions of a single sequence in order to compute a representation of the sequence.

  在讲解具体的点积注意力过程时,我们以self-attention为例。

  首先对输入的sequence的每一个token进行词嵌入,同时每一个token又会有一个查询向量 q q q,键向量 k k k和值向量 v v v,上图假设输入的sequence有两个token,分别是Thinking和Machines,我们想知道Thinking这个单词和这个sequence的所有token的相似度,我们就用Thinking的查询向量 q 1 q_1 q1,点乘每个token的键向量 k i , i = 1 , 2 k_i, i=1,2 ki,i=1,2

  点乘过后,传统的点积注意力机制会直接进入softmax,但是上图会除以 d k \sqrt{d_k} dk

d k d_k dk是查询向量和键向量的维度( d k = 64 d_k=64 dk=64是《attention is all you need》论文中的超参数,如果具体到上图,应该是 d k = 3 d_k=3 dk=3),这是因为,《attention is all you need》的作者认为,当 d k d_k dk变大,查询向量和键向量的点积也会往大了变,会进入softmax函数的小梯度区域,

We suspect that for large values of d k d_k dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients. To counteract this effect, we scale the dot products by 1 d k \frac{1}{\sqrt{d_k}} dk

1 .

这样修改后的点积attention叫Scaled Dot-Product Attention。

  认为经过softmax之后的结果就是Thinking对这一sequence的所有token的相似度,这一相似度乘以值向量的结果求和就得到了注意力机制的结果,当然上述过程可以直接用矩阵相乘表示,这也是点积注意力的一大优势:

   Q Q QK K KV V V分别是查询向量,键向量和值向量构成的矩阵,用公式表示就是:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk

QKT)V

其中 Q Q Q的size是 ( w , d k ) (w, d_k) (w,dk)K K K的size是 ( w , d k ) (w, d_k) (w,dk)V V V的size是 ( w , d v ) (w, d_v) (w,dv)w w w是Token数, d v d_v dv可以等于 d k d_k dk

  现在我们知道了点积attention的计算过程,我们来看 Q Q QK K KV V V是怎么来的,到目前为止我们没有用到向量就是绿色的词嵌入表示,因此查询矩阵,键矩阵和值矩阵是依靠输入得到的,具体看下面过程

  上图中, W Q , W K , W V W^Q,W^K,W^V WQWKWV矩阵就是神经网络需要学习的参数,X就是输入向量拼接后,形成的矩阵。

  额外注意力(additive attention)就没有查询向量,键向量和值向量,点积相似度的计算过程被一个额外的神经网络所替代,所以叫做额外注意力机制,所以点积注意力和额外注意力的 compatibility function不同,compatibility function可以理解为计算相似度的抽象函数。在《attention is all you need》论文中以点积注意力为主,所以其提出的大名鼎鼎的transformer也是基于点积注意力。

channel attention 与 spatial attention

  看名字,应该觉得这俩attention机制应该用于CNN,介绍这channel attention和spatial attention用一个轻量级的CBAM(Convolutional Block Attention Module, Sanghyun Woo et al., 2018),CBAM原理图如下:

  CBAM包含Channel Attention和Spatial Attention。对于输入 F F F,其尺寸为 ( B a t c h , C h a n n e l , H e i g h t , W i d t h ) (Batch, Channel, Height, Width) Batch,Channel,Height,Width的输入 ,不考虑Batch维度,Channel Attention会计算一个通道权重 M c ( F ) M_{c}(F) Mc(F) ,其尺寸为 ( C h a n n e l , 1 , 1 ) (Channel, 1, 1) Channel,1,1,也就是对一个通道里面 H e i g t h × W i d t h Heigth\times Width Heigth×Width个像素点的值乘上相同的权重,主要关注于输入的不同通道信息;Spatial Attention会计算一个空间权重 M s ( F ′ ) M_{s}(F') Ms(F),其尺寸为 ( 1 , H e i g h t , W i d t h ) (1, Height, Width) 1,Height,Width,也就是对不同通道在同一像素位置的值乘上相同的权重,主要关注于输入的不同位置信息。具体运算过程如下
F ′ = M c ( F ) ⊗ F F ′ ′ = M s ( F ′ ) ⊗ F ′ F' = M_{c}(F)\otimes F\\ F''= M_{s}(F')\otimes F' F=Mc(F)FF=Ms(F)F

其中 F F F为经过Channel Attention和Spatial Attention之前的输入, F ′ ′ F'' F为经过Channel Attention和Spatial Attention之后的结果, M c ( ⋅ ) M_{c}(·) Mc()M s ( ⋅ ) M_{s}(·) Ms()分别表示Channel Attention和Spatial Attention。

  Channel Attention对于输入 F F F,其size为 < B , C , H , W > <B, C, H, W> <B,C,H,W>,分别经过最大池化层和平均池化层,得到两个 < B , C , 1 , 1 > <B, C, 1, 1> <B,C,1,1>,在经过同一个MLP网络后输出两个 < B , C , 1 , 1 > <B, C, 1, 1> <B,C,1,1>,在相加经过激活函数得到最终的输出 < B , C , 1 , 1 > <B, C, 1, 1> <B,C,1,1>

  Spatial Attention对于输入 F ′ F' F,其size为 < B , C , H , W > <B, C, H, W> <B,C,H,W>,首先在Channel维度上使用最大池化和平均池化,得到两个 < B , 1 , H , W > <B, 1, H, W> <B,1,H,W>,经过concatenation得到 < B , 2 , H , W > <B, 2, H, W> <B,2,H,W>,使用卷积操作经过激活函数得到最终的输出 < B , 1 , H , W > <B, 1, H, W> <B,1,H,W>

multi-head attention

  以sequence attention为例,多头attention在实现上就是并列好几个attention,最后合并,有点大力出奇迹的感觉,并列的每一个attention机制,就被称为一个头。

Multi-Head Attention consists of several attention layers running in parallel.

  多头attention示意图如下图所示:

多个self-attention并行执行,最后的结果concatenation在一起,如果并列了8个头,concat之后,尺寸会变为原来的8倍,经过神经网络进行缩小回原来的尺寸。

transformer

  transformer也是火的很,强大的Bert模型也是基于transformer的。transformer是一个完全基于attention的结构,完全没有CNN和RNN的影子,这也侧面说明了attention机制并不依赖于RNN或者CNN,可以独立的拿出来单独形成结构。pytorch在1.2版本已经加入了transformer层。

  transformer在《attention is all you need》中继续沿用encode-decode结构,如上图,encode就是左边部分,decode就是右边部分,在encode中又包含很多层编码器,每一层编码器由一个多头attenion子层和一个前向神经网络子层构成,每一子层有一个残差结构;在decode中也包含很多层解码器,每一层解码器由一个masked多头attention子层、一个多头attention子层和一个前向神经网络子层构成,每一子层也是一个残差结构。所以上图的encode和decode都只画了一个层,每一层包含2,3个子层。多画几层就是下面的结构

  为了保证数据能够沿着上图的结构前向传播,transformer会维持一个全局的维度 d m o d e l d_{model} dmodel,也就是说不管是embedding层、encode中的每个编码器的每个子层、以及decode中每个解码器的每个子层,其输入输出维度都是 d m o d e l d_{model} dmodel

  附带一提,BERT只用了encode结构。


参考文献:

Attention Is All You Need

CBAM: Convolutional Block Attention Module

BERT大火却不懂Transformer?读这一篇就够了:https://baijiahao.baidu.com/s?id=1622064575970777188&wfr=spider&for=pc

attention机制、self-attention、channel attention、spatial attention、multi-head attention、transformer相关推荐

  1. 通道注意力机制_即插即用,Triplet Attention机制让Channel和Spatial交互更加丰富(附开源代码)...

    ↑ 点击蓝字 关注极市平台作者丨ChaucerG来源丨AI人工智能初学者编辑丨极市平台 极市导读 本文介绍了一种新的注意力机制--Triplet Attention,它通过使用Triplet Bran ...

  2. 自然语言处理中的Attention机制总结

    在面试的过程中被问到了attention,原来虽然其实已经实际用过attention了,也知道个大概原理是加权求和,但是对于加权的具体方法以及权值得分的计算并不是很清晰,面试答的一般,正好最近实习的地 ...

  3. 干货|理解attention机制本质及self-attention

    点击上方"小白学视觉",选择加"星标"或"置顶"重磅干货,第一时间送达 上一篇,我们讲述了attention的知识,这篇接上篇,更加深入的理 ...

  4. 理解Attention机制原理及模型

    目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门,是因为它在许多领域较其他的传统模型方法都取得了更好的结果.这种结构的模型通常将输入序列编码成一个固定长度的向量表示,对于长度 ...

  5. 系统学习NLP(二十三)--浅谈Attention机制的理解

    转自:https://zhuanlan.zhihu.com/p/35571412 Attentin机制的发家史 Attention机制最早是应用于图像领域的,九几年就被提出来的思想.随着谷歌大佬的一波 ...

  6. 浅谈Attention机制

    浅谈Attention机制 Attention注意机制现在大热,很多深度学习的框架都带上了注意力机制,而且也取得了很好的性能指标.乘着大热也来水一水文章,发表发表自己的看法.事先说明老哥我在NLP上萌 ...

  7. attention机制及self-attention(transformer)

    最近接触的项目当中用到了transformer,学习相关知识之后其中一个重要的贡献就是引入了self-attention机制,了解了相关处理过程之后然而并没引起太多比较. 因为之前就已经有了atten ...

  8. Attention机制的总结笔记

    人类的视觉注意力 Attention机制借鉴了人类的视觉注意力机制.视觉注意力机制是人类视觉所特有的大脑信号处理机制.人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦 ...

  9. Attention机制(一)基本原理及应用

    提纲: 1. 动机 2. 发展过程 3. 应用点 4. 代码实现 1. 动机 1.1 人类的视觉注意力 视觉注意力机制是人类视觉所特有的大脑信号处理机制,人类通过快速扫描全局图像,获得需要重点关注的目 ...

最新文章

  1. 【linux】Valgrind工具集详解(三):打印信息说明
  2. 机房收费--主界面(控件随窗体成比例改变)
  3. hdu 5419(数学期望)
  4. 引导修复 不是活动的_河南省视频数据修复中心
  5. mysql存入mtr数据_mysql mtr写入数据
  6. lvs工作在第几层_LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)...
  7. .ai域名注册已经极具投资价值进入火爆期
  8. python 安装包时出现红字_你好啊!Python,初次见面,多多指教
  9. python--正则表达式 字符串匹配
  10. linux复制文件到另一个目录_Linux入门之四-Linux文件目录操作
  11. PYTHON SOCKET编程简介
  12. Linux shell (一)
  13. ewiews面板回归模型操作_Eviews常用面板回归模型案例实战
  14. windows系统电脑实用快捷键
  15. 单点漫延问题(水陆判断、洪水漫延、无权最小路径)
  16. 微信小程序-抖音/字节小程序
  17. 特斯拉Tesla Model 3整体架构解析
  18. Word里面如何在两个字正中间加入点
  19. 发表 SCI 封面文章是一种怎样的体验?
  20. 阿里云负载均衡【SLB】使用实践方案

热门文章

  1. jquery遍历对象,数组,集合
  2. html video标签canplay,HTML oncanplay事件用法及代码示例
  3. 软件质量之道:PCLint之中的一个
  4. MySQL基础-索引原理
  5. QT实现绘制箱须图(盒须图)
  6. Ubuntu和windows系统下安装odoo16 社区版和企业版附带安装视频
  7. C语言:extern用法
  8. 聚类分析及R编程实现
  9. springsecurity 配置
  10. 得到app文稿导出_得到app学习笔记作为知识付费者,如何把所学内容快速输出?...