在前面几章的介绍中,我们详细了解了循环/卷积等神经网络机制。这次给大家分享的是另一个深度学习的概念:注意力机制(attention),它最早应用于视觉领域,后逐渐拓展到了一般性神经网络当中。

注意力机制其实模拟的是人脑的注意力模型。举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块图案上,也就是说这个时候人脑对整幅图的关注并不是均衡的,是有一定的权重区分的。这就是深度学习里的Attention Model的核心思想。

本文接下来的部分为大家详细解析Attention Model里的奥秘。

“编码器-解码器”

我们先从“encoder-decoder”模型说起,这是一种应用于seq2seq问题的模型。seq2seq问题简单的说,就是根据一个输入序列x,来生成另一个输出序列y。常见的应用有机器翻译,文档提取,问答系统等。Encoder-Decoder模型中的编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。

Encoder-Decoder(编码-解码)是深度学习中非常常见的一个模型框架,比如无监督算法的auto-encoding就是用编码-解码的结构设计并训练的;比如这两年比较热的image caption的应用,就是CNN-RNN的编码-解码框架;再比如神经网络机器翻译NMT模型,往往就是LSTM-LSTM的编码-解码框架。因此,准确地说,Encoder-Decoder并不是一个具体的模型,而是一类框架。Encoder和Decoder部分可以是任意的,比如:时间序列/文字/语音/图像/视频/...,模型可以采用CNN,RNN,BiRNN、LSTM、GRU等等。所以基于Encoder-Decoder,我们可以设计出各种各样的应用算法。

Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛,下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示:

 

对于序列对<X,Y>,我们的目标是给定输入序列X,期待通过Encoder-Decoder框架来生成目标序列Y。X和Y可以是同一种序列,也可以是两种不同的序列:

Encoder顾名思义就是对输入的序列X进行编码,将输入序列通过非线性变换转化为中间语义表示C:

对于解码器Decoder来说,其任务是根据序列X的中间语义表示C和之前已经生成的历史信息y1, y2….yi-1来生成i时刻要生成的下一个值:yi

但是Encoder-Decoder框架会有一个明显的缺点。Encoder会把输入序列X编码为一个固定长度的隐向量(语义编码c),会导致隐向量无法完全表示输入序列X的信息。可以从两个方面理解:

1. 隐向量的大小有限,无法表示信息丰富的序列;

2. 由于RNN类网络特点,网络会更加看中序列后面的信息,无法总揽全局。

最简单的解决思路就是把所有RNNcell的输出组合起来使用,而不只使用最后一个RNNcell的输出,这个可以做到充分利用序列的信息,可以在一定程度上解决问题。但是一般越明确的网络学习目标可以获得越好的效果,如果可以获得每个RNNcell的输出的权重来加权编码,就可以更加明确学习目标提升学习效果。Attention Model的思路就是如此。

如何设计网络,进行加权操作,并且使用合理的loss就是Attention Model的重难点,也是我们要学习理解的内容了。请继续往下看。  

Attention 机制

在Encoder-Decoder框架中,在预测每一个encode时对应的语义编码c都是一样的,也就意味着无论序列X中的每个数值点对输出Y中的每一个数值点的影响都是相同的。这样就会产生两个弊端:一是语义向量无法完全表示整个序列的信息,再者就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了。

为了解决上面的弊端,就需要用到我们的Attention Model(注意力模型)来解决该问题。比如在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增加了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出。模型结构如下:

此时生成目标句子单词的过程就成了下面的形式:

比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在没加入Attention Model之前,生成的语义编码C是一致的,而加入之后,对应的语义编码可能如下:

其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入xi后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,也就是常常在论文里看到的下列公式:

  

假设Ci中那个i就是上面的“汤姆”,那么Tx就是3,代表输入句子的长度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),对应的注意力模型权值分别是0.6, 0.2, 0.2,所以g函数就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似下图:

这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,你怎么知道AM模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的概率分布:

此时的Encoder和Decoder都采用RNN模型,我们来看看现在的Encoder-Decoder模型结构:

用下图可以较为便捷地说明注意力分配概率分布值的通用计算过程:

 

对于采用RNN的Decoder来说,如果要生成yi单词,在时刻t = i,我们是可以知道在生成Yi之前的隐层节点t = i时刻的输出值Hi的,而我们的目的是要计算生成Yi时的输入句子单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用t = i时刻的隐层节点状态Hi去一一和输入句子中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj, Hi)来获得目标单词Yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。绝大多数AM模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。

上述中提出的解决方法是对于每一个Decoder输出都加权Encoder的信息,以Tom chase Jerry,Encoder-Decoder “汤姆”,“追逐”,“杰瑞”为例子,不计算起止符号,输出为3个单元,输入为3个单元。有时输入单元与输出数目会不一致,这里我们假设输入为X,m个,输出为Y,n个。对于每个yj都会综合所有x的信息共m个,同时m个X的信息权重之和为1(因为每个yj由X决定)。一共有n个y,所以有n组,n*m个权重要计算。

就会有这些问题:

1. 每组权重如何合理化表示?利用softMax可以帮助我们权重之和为1

2. 汇总权重信息时使用add还是concat(私以为add更加合适)?

3. 如何表示权重?

4. 如何优化权重?

我们继续往下看就会找到答案。

Attention 定义

论文中Attention模型的结构图如下:

公式也特别简单,下面来复述一下:

1、首先定义符号:

 表示输入序列,

 表示输出序列,

 表示编码层的第i时刻的隐藏层状态,

 表示解码层第t时刻的隐藏层状态,

 表示第t时刻解码时注意力分布,这是本篇论文的关键。

总体是为了计算条件概率分布 

2、计算 

 ,  表示解码输出第t个词时,与第i个输入序列词之间的相关因子。

3、计算 

 ,这里就是一个softmax函数,归一化所有的注意力权重。

4、计算 

 ,  在文中为对齐模型(前馈神经网络)

至此,公式就介绍结束。这里需要注意的一点是,计算  的函数又被统称为配分函数,即score函数。后面会介绍多种配分函数的计算方式。

Attention 本质

如果把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。

我们可以这样来看待Attention机制(参考上图):将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:

其中,||Source||代表Source的长度,公式含义即如上所述。上文所举的机器翻译的例子里,因为在计算Attention的过程中,Source中的Key和Value合二为一,指向的是同一个东西,也即输入句子中每个单词对应的语义编码,所以可能不容易看出这种能够体现本质思想的结构。

当然,从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

从图中可以引出另外一种理解,也可以将Attention机制看作一种软寻址(Soft Addressing):Source可以看作存储器内存储的内容,元素由地址Key和值Value组成,当前有个Key=Query的查询,目的是取出存储器中对应的Value值,即Attention数值。通过Query和存储器内元素Key的地址进行相似性比较来寻址,之所以说是软寻址,指的不像一般寻址只从存储内容里面找出一条内容,而是可能从每个Key地址都会取出内容,取出内容的重要性根据Query和Key的相似性来决定,之后对Value进行加权求和,这样就可以取出最终的Value值,也即Attention值。所以不少研究人员将Attention机制看作软寻址的一种特例,这也是非常有道理的。

至于Attention机制的具体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为两个过程:第一个过程是根据Query和Key计算权重系数,第二个过程根据权重系数对Value进行加权求和。而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;这样,可以将Attention的计算过程抽象为如下图展示的三个阶段。

在第一个阶段,可以引入不同的函数和计算机制,根据Query,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:

第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:

第二阶段的计算结果即为对应的权重系数,然后进行加权求和即可得到Attention数值:

通过如上三个阶段的计算,即可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。

Attention 分类

注意力机制发展至今,研究者从各个方面对其进行了改进,也就产生了注意力的各种形式,下面将分类对其进行介绍。

  1. Soft attention VS Hard attention

  2. Global attention VS Local attention

  3. Self-attention

  4. Multi-head attention

  5. Hierarchical attention

  6. Attention over attention

  7. Memory-based attention

01

Soft attention VS Hard attention

该类attention来源于图片生成文字描述的任务(Image Caption),文中使用注意力捕获文字与图中特定区域的联系。

Soft attention

NLP中尝试用的注意力方式,取值为[0, 1]的权重概率分布,使用了所有编码层的隐层状态,与上两节的介绍相同,可以直接在模型训练过程中,通过后向传播优化对参数进行优化。

Hard attention

Hard attention 在原文中被称为随机硬注意力(Stochastic hard attention),这里的随机是指对编码层隐状体的采样过程,Hard attention 没有使用到所有的隐层状态,而是使用one-hot的形式对某个区域提取信息,使用这种方式无法直接进行后向传播(梯度计算),需要蒙特卡洛采样的方法来估计梯度。

02

Global attention VS Local attention

Global attention

以下简称Global attention为GA, GA在推导时考虑了所有的编码层隐层状态,模型图如下图所示,其中蓝色表示编码码层,红色表示解码层。可以看到global attention 是在计算  时考虑了当前的目标解码隐层状态和所有编码隐层状态,这里的  为全局对齐权重。若不指定说明,一般attention都是指global attention。

Local attention

Global attention存在以下两个缺点:

1. 每次解码目标词,都要计算所有的编码隐层向量,在翻译或处理长文本序列时计算代价高。

2. 文本序列过长,也有可能导致注意力不集中、过度分散。(这个不是论文中介绍,只是借鉴他人介绍,可不做参考。)

Local attention 相对于global attention 直观的感受,专注于小窗口的上下文,也就是不考虑所有的编码隐层状态,模型结构图如下所示。为实现该想法,要在每一时刻解码时构造一个位置变量  ,记录当前解码位置,该窗口就可以表示为  ,其中D为窗口大小,为实验选值。不同于global attention 中对齐向量是变长的,Local attention中  是定长的,文中给出了两种方法定义该对齐向量:

1. local-m 固定的,  ;

2.local-p 预测的,利用  预测  ,计算公式为: ,其中S为原句长度, 为待学习的模型参数。此外,为了使对齐点更接近 ,引入了高斯分布计算对齐权重 ,公式这里就不给出了,感兴趣的可以看论文公式10。

03

Self attention

Self-attention 又称为intra attention,顾名思义,其不是计算source-target之间的注意力分布,而是单一计算source或target内部的注意力分布,也可以看作特殊的source=target的情况。其可视化的示例如下图所示,文本序列内部不同词之间的联系。

具体来讲,self attention具有以下优点:

1. 可以捕获句法特征和语义特征(可视化结果);

2. 相比RNN依次序列计算,在长距离依赖特征上表现更好;

3. 可并行化计算。

04

Multi-Head attention

注意力并行化的代表,缩放点积注意力在前面小节中已经提过,多头注意力不仅计算一次注意力,而是并行化计算多次注意力,这样模型可以同时关注多个子空间的信息。计算公式为:

05

Hierarchical attention

Hierarchical attention (层次注意力)由词级别、句子级别注意力机制组成,在文档级别的任务上,往往由多篇章、多句子、多词语组成,Hierarchical attention能够更好捕获global和local的信息。

05

Attention Over Attention

该论文研究任务为阅读理解,AOA从结构图(下图)上来看时attention之后再attention,与hierarchical attention有些相似,但是其具体计算却不同。首先对文档与当前query进行点积注意力,然后从行、列分别对齐进行归一化,得到两个注意力权重分布,再次求一次点积注意力。

05

Memory-based attention

memory中存储了<key-value>的键值对,当key和value相同时,就是最基本的attention形式。以Q&A任务为例能够更好地说明计算,memory存储了question(key)---->>answer(value),现新来一个question,要依据memory中的问题-答案对得到答案。起计算方式为:

  1. 计算新来的question与历史question的相似度,即 

  2. 归一化, 

  3. 得到新的答案, 

小结

Attention的“花样”真的很多,每次看都有很多新的玩法,不过基本也不脱离最本质的QKV结构,期待着有更多研究。

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

个人微信

备注:昵称+学校/公司+方向

如果没有备注不拉群!

拉你进AI蜗牛车交流群

朴实无华!注意力机制神经网络解析相关推荐

  1. ECCV 2018 | 美图云联合中科院提出基于交互感知注意力机制神经网络的行为分类技术...

    以往注意机制模型通过加权所有局部特征计算和提取关键特征,忽略了各局部特征间的强相关性,特征间存在较强的信息冗余.为解决此问题,来自美图云视觉技术部门和中科院自动化所的研发人员借鉴 PCA(主成分分析) ...

  2. 注意力机制 神经网络_图注意力网络(GAT)

    引言 作者借鉴图神经网络中的注意力机制,提出了图注意力神经网络架构,创新点主要包含如下几个:①采用masked self-attention层,②隐式的对邻居节点采用不同权重③介绍了多头注意力机制. ...

  3. Attention is all you need注意力机制代码解析

    在这篇文章中,我以逐行实施的形式介绍了本文的"注释"版本. 我已经重新排序并从原始论文中删除了一些部分,并在全文中添加了评论. 本文档本身是一个有效的笔记本,应完全可用. 总共有4 ...

  4. 注意力机制模块解析(附带代码链接)——SGE(Spatial Group-wise Enhance)

    <Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks> ar ...

  5. 神经网络中的注意力机制与外部记忆

    神经网络中的注意力机制与外部记忆 文章目录 神经网络中的注意力机制与外部记忆 什么是注意力 神经网络中的注意力机制 注意力机制的实现 注意力机制模型简易理解 注意力分布 注意力机制的软硬模式 自注意力 ...

  6. 机器翻译:引入注意力机制的Encoder-Decoder深度神经网络训练实战中英文互译(完结篇)

    文章目录 前言 一.数据的预处理 二.模型配置 三.模型训练 总结 前言 注意力机制是一种在深度学习中广泛使用的技术,它可以有效地处理输入序列和输出序列之间的对应关系.其中,Encoder-Decod ...

  7. AI上推荐 之 AFM与DIN模型(当推荐系统遇上了注意力机制)

    1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产 ...

  8. 图深度学习入门教程(六)——注意力机制与图注意力

    深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习.还会定期更新哦. 主要是基于图深度学习的入门内容.讲述最基本的基础知识,其中包括深度学习.数学.图神 ...

  9. keras cnn注意力机制_从发展历史视角解析Transformer:从全连接CNN到Transformer

    编译 | bluemin校对 | 陈彩娴Transformer架构在机器学习领域(尤其是NLP里)是一项热门研究,为我们带来了许多重要成果,比如:GPT-2.GPT-3等写稿机器人:第一代GPT及其性 ...

  10. 注意力机制BAM和CBAM详细解析(附代码)

    论文题目①:BAM: Bottleneck Attention Module 论文题目②:CBAM:CBAM: Convolutional Block Attention Module Bottlen ...

最新文章

  1. js中的三目运算符详解
  2. 【python】数据结构与算法之快速排序(重要)
  3. Optional 详解 Java
  4. CentOS 7破解root密码
  5. 转——C# DataGridView控件 动态添加新行
  6. java作业 2.6
  7. android EditText光标位置,光标样式,EditText限制输入内容,软键盘遮挡的EditText,搜索框,限制输入表情
  8. android 触摸防抖,一种触摸屏防抖优化方法、系统及触摸屏终端与流程
  9. 旷视Face++与西交大成立AI联合实验室,郑南宁孙剑再续师徒缘
  10. spring boot缓存excel临时文件后再操作
  11. matlab:图像的余弦变换(DCT)
  12. Q新闻丨吃鸡外挂被开源;Dubbo 3.0来了;工信部约谈百度、支付宝、今日头条;内地iCloud服务将转由云上贵州运营...
  13. 【vue】vue中element表格导出为excel表格
  14. 修改vscode图标
  15. python爬取app store的评论_用python爬取苹果官网店铺
  16. python编程求100以内能被5整除之和_打印1到100之间能被3和5同时整除的数,每行打印5个数用循环算出,这是属于c语言的类型...
  17. python之客户流失预警
  18. 用C语言编写程序计算对角线的和,C语言入门级代码 计算二维数组主对角线上的元素之和...
  19. 机器学习深版11:HMM模型
  20. 关键元器件选型设计指引--多端口RJ45及网络变压器

热门文章

  1. 叶俊:让能量爆棚的秘诀
  2. HTTP协议详解(一)
  3. Google Chrome 扩展程序
  4. 第六届ACM省赛总结--吕云飞
  5. Unity3D GameCenter 排行榜, 成就实现
  6. 企业IP地址管理(IPAM)
  7. xposed绕过模拟器检测_《绝地求生》手游避开模拟器检测攻略分享
  8. 【测试开发】一文带你了解什么是软件测试
  9. 解决双卡4G模式下不能接听和拨打电话问题
  10. 程序员的自我修养-读后感