① 自注意力机制(self-attention)——考虑全局又聚焦重点
有时候我们期望网络能够看到全局,但是又要聚焦到重点信息上。比如在在做自然语言处理时,句子中的一个词往往不是独立的,和它上下文相关,但是和上下文中不同的词的相关性是不同的,所以我们在处理这个词时,在看到它的上下文的同时也要更加聚焦与它相关性更高的词,这就要用到常说的 自注意力机制 。比如下面这两幅图,通过自注意力机制处理后,计算出了词间的相关性,可以看到第一个图的it与animal的相关性很强,第二个图it与street的相关性很强。那么如何实现自注意力机制呢?
自注意力机制的核心是捕捉向量之间的相关性。比如下面这幅图,输出一个向量 不只看 本身,还要看 、 、 ,但是看它们的程度不一样。这就需要分别计算 与 、 、 之间的相关性 , 越大,相关性越高,给予的重视程度就越高。那么如何让网络自动计算出两个向量之间的相关性呢?
通过上面计算出的注意力分数 ,我们已经知道 要给予 、 、 、 的关注程度了,接下来我们抽取这些向量中重要的信息以输出 了。具体的做法如下图所示。首先我们再将 、 、 、 乘以一个新的变换矩阵 得到向量 ,这里的 向量也有个专门的名字,叫做 “value” 。然后将向量 分别乘以对应的注意力分数 ,并进行求和,输出向量 。从这里可以看出,所有向量都有参与计算,这样就做到了看全局。但是各向量参与计算的程度不一样, 就相当权重值,权重值越大的,对应向量参与计算的程度就越大,最后得到的输出向量 就和该向量越相似。这样就做到了看全局又聚焦重点。通过上述同样的计算方式,也可以计算得到 ,而且 是可以并行计算的。以上就是自注意力机制的全部了,但是对自注意力机制的解析并没有结束,下面从矩阵计算的角度来看自注意力机制。
前面提到将 、 、 、 分别乘以变换矩阵 得到向量 。我们将输入向量 、 、 、 拼在一起,得到一个矩阵用 表示,即, 将key向量 、 、 、 拼在一起得到一个矩阵用 表示,即, 用矩阵相乘表示 矩阵的计算过程即, 同理,query向量拼成的矩阵 等于, value向量拼成的矩阵 等于, 。下图展示了上述计算过程。
前面提到将 和四个key向量 分别做点积,得到四个相关性数值 。注意这里的向量都是列向量,所以点积可以写成,
用矩阵计算表示上述计算过程为 将 与 相乘可以得到相似的结果,即, 矩阵通过softmax层归一化后得到 。上述计算过程如下图所示。
前面讲到将向量 分别乘以对应的注意力分数 ,并进行求和,输出向量 ,这个过程用矩阵计算可表示为,
通过相似的计算,也可以得到 ,即,
综上,自注意力机制的计算过程可总结为,
(1)计算 矩阵
(2)计算注意力分数矩阵
(3)计算输出矩阵
自注意力机制还有一个进阶版,叫 多头自注意力机制(multi-head self-attention) 。为什么要多头呢?自注意力机制实质上是用过 向量去找相关的 向量,但是相关性可能有多种,一个 只能找到一种相关的 向量,因此就要引入多个 向量和 向量来捕捉多种相关性。多头自注意力机制很简单,设置多组矩阵 ,每一组 只进行内部计算,得到相应的输出 ,如下图所示。
② 为什么说Transformer的注意力机制是相对廉价的注意力机制相对更对于RNN系列及CNN系列算法有何优势
QA形式对自然语言处理中注意力机制(Attention)进行总结,并对Transformer进行深入解析。
二、Transformer(Attention Is All You Need)详解
1、Transformer的整体架构是怎样的?由哪些部分组成?
2、Transformer Encoder 与 Transformer Decoder 有哪些不同?
3、Encoder-Decoder attention 与self-attention mechanism有哪些不同?
4、multi-head self-attention mechanism具体的计算过程是怎样的?
5、Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?
一、Attention机制剖析
1、为什么要引入Attention机制?
根据通用近似定理,前馈网络和循环网络都有很强的能力。但为什么还要引入注意力机制呢?
计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。
优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络中的长距离以来问题,信息“记忆”能力并不高。
可以借助人脑处理信息过载的方式,例如Attention机制可以提高神经网络处理信息的能力。
2、Attention机制有哪些?(怎么分类?)
当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只 选择一些关键的信息输入进行处理,来提高神经网络的效率。按照认知神经学中的注意力,可以总体上分为两类:
聚焦式(focus)注意力:自上而下的有意识的注意力,主动注意——是指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力;
显著性(saliency-based)注意力:自下而上的有意识的注意力,被动注意——基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关;可以将max-pooling和门控(gating)机制来近似地看作是自下而上的基于显著性的注意力机制。
在人工神经网络中,注意力机制一般就特指聚焦式注意力。
3、Attention机制的计算流程是怎样的?
Attention机制的实质其实就是一个寻址(addressing)的过程,如上图所示:给定一个和任务相关的查询Query向量q,通过计算与Key的注意力分布并附加在Value上,从而计算Attention Value,这个过程实际上是Attention机制缓解神经网络模型复杂度的体现:不需要将所有的N个输入信息都输入到神经网络进行计算,只需要从X中选择一些和任务相关的信息输入给神经网络。
step1-信息输入:用X= [x1, · · · , xN ]表示N 个输入信息;
step2-注意力分布计算:令Key=Value=X,则可以给出注意力分布
我们将称之为注意力分布(概率分布),为注意力打分机制,有几种打分机制:
step3-信息加权平均:注意力分布可以解释为在上下文查询q时,第i个信息受关注的程度,采用一种“软性”的信息选择机制对输入信息X进行编码为:
这种编码方式为软性注意力机制(soft Attention),软性注意力机制有两种:普通模式(Key=Value=X)和键值对模式(Key!=Value)。
4、Attention机制的变种有哪些?
与普通的Attention机制(上图左)相比,Attention机制有哪些变种呢?
变种1-硬性注意力:之前提到的注意力是软性注意力,其选择的信息是所有输入信息在注意力 分布下的期望。还有一种注意力是只关注到某一个位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有两种实现方式:(1)一种是选取最高概率的输入信息;(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。硬性注意力模型的缺点:
变种2-键值对注意力:即上图右边的键值对模式,此时Key!=Value,注意力函数变为:
变种3-多头注意力:多头注意力(multi-head attention)是利用多个查询Q = [q1, · · · , qM],来平行地计算从输入信息中选取多个信息。每个注意力关注输入信息的不同部分,然后再进行拼接:
5、一种强大的Attention机制:为什么自注意力模型(self-Attention model)在长距离序列中如此强大?
(1)卷积或循环神经网络难道不能处理长距离序列吗?
当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列,如图所示:
从上图可以看出,无论卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络显然是基于N-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立短距离依赖。
(2)要解决这种短距离依赖的“局部编码”问题,从而对输入序列建立长距离依赖关系,有哪些办法呢?
由上图可以看出,全连接网络虽然是一种非常直接的建模远距离依赖的模型, 但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。
这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(self-attention model)。由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列。
总体来说,为什么自注意力模型(self-Attention model)如此强大:利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列。
(3)自注意力模型(self-Attention model)具体的计算流程是怎样的呢?
同样,给出信息输入:用X = [x1, · · · , xN ]表示N 个输入信息;通过线性变换得到为查询向量序列,键向量序列和值向量序列:
上面的公式可以看出,self-Attention中的Q是对自身(self)输入的变换,而在传统的Attention中,Q来自于外部。
注意力计算公式为:
自注意力模型(self-Attention model)中,通常使用缩放点积来作为注意力打分函数,输出向量序列可以写为:
二、Transformer(Attention Is All You Need)详解
从Transformer这篇论文的题目可以看出,Transformer的核心就是Attention,这也就是为什么本文会在剖析玩Attention机制之后会引出Transformer,如果对上面的Attention机制特别是自注意力模型(self-Attention model)理解后,Transformer就很容易理解了。
1、Transformer的整体架构是怎样的?由哪些部分组成?
Transformer其实这就是一个Seq2Seq模型,左边一个encoder把输入读进去,右边一个decoder得到输出:
Transformer=Transformer Encoder+Transformer Decoder
(1)Transformer Encoder(N=6层,每层包括2个sub-layers):
sub-layer-1:multi-head self-attention mechanism,用来进行self-attention。
sub-layer-2:Position-wise Feed-forward Networks,简单的全连接网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出(输入输出层的维度都为512,中间层为2048):
每个sub-layer都使用了残差网络:
(2)Transformer Decoder(N=6层,每层包括3个sub-layers):
sub-layer-1:Masked multi-head self-attention mechanism,用来进行self-attention,与Encoder不同:由于是序列生成过程,所以在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask。
sub-layer-2:Position-wise Feed-forward Networks,同Encoder。
sub-layer-3:Encoder-Decoder attention计算。
2、Transformer Encoder 与 Transformer Decoder 有哪些不同?
(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;
(2)Decoder中多了一层Encoder-Decoder attention,这与 self-attention mechanism不同。
3、Encoder-Decoder attention 与self-attention mechanism有哪些不同?
它们都是用了 multi-head计算,不过Encoder-Decoder attention采用传统的attention机制,其中的Query是self-attention mechanism已经计算出的上一时间i处的编码值,Key和Value都是Encoder的输出,这与self-attention mechanism不同。代码中具体体现:
4、multi-head self-attention mechanism具体的计算过程是怎样的?
Transformer中的Attention机制由Scaled Dot-Proct Attention和Multi-Head Attention组成,上图给出了整体流程。下面具体介绍各个环节:
Expand:实际上是经过线性变换,生成Q、K、V三个向量;
Split heads: 进行分头操作,在原文中将原来每个位置512维度分成8个head,每个head维度变为64;
Self Attention:对每个head进行Self Attention,具体过程和第一部分介绍的一致;
Concat heads:对进行完Self Attention每个head进行拼接;
上述过程公式为:
5、Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?
GPT中训练的是单向语言模型,其实就是直接应用Transformer Decoder;
Bert中训练的是双向语言模型,应用了Transformer Encoder部分,不过在Encoder基础上还做了Masked操作;
BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,decoder是不能获要预测的信息的。
③ 注意力机制详解
Attention机制在近几年来在图像,自然语言处理等领域中都取得了重要的突破,被证明有益于提高模型的性能。Attention机制本身也是符合人脑和人眼的感知机制,这里我们主要以计算机视觉领域为例,讲述Attention机制的原理,应用以及模型的发展。
所谓Attention机制,便是聚焦于局部信息的机制,比如图像中的某一个图像区域。随着任务的变化,注意力区域往往会发生变化。
面对上面这样的一张图,如果你只是从整体来看,只看到了很多人头,但是你拉近一个一个仔细看就了不得了,都是天才科学家。
图中除了人脸之外的信息其实都是无用的,也做不了什么任务, Attention机制便是要找到这些最有用的信息 ,可以想见最简单的场景就是从照片中检测人脸了。
和注意力机制相伴而生的一个任务便是显著目标检测,即salient object detection。它的输入是一张图,输出是一张概率图,概率越大的地方,代表是图像中重要目标的概率越大,即人眼关注的重点,一个典型的显著图如下:
右图就是左图的显著图,在头部位置概率最大,另外腿部,尾巴也有较大概率,这就是图中真正有用的信息。
显著目标检测需要一个数据集,而这样的数据集的收集便是通过追踪多个实验者的眼球在一定时间内的注意力方向进行平均得到,典型的步骤如下:
于是就能得到下面这样的图,第二行是眼球追踪结果,第三行就是显著目标概率图。
上面讲述的都是空间上的注意力机制,即关注的是不同空间位置,而在CNN结构中,还有不同的特征通道,因此不同特征通道也有类似的原理,下面一起讲述。
注意力机制的本质就是定位到感兴趣的信息,抑制无用信息,结果通常都是以概率图或者概率特征向量的形式展示,从原理上来说,主要分为 空间注意力模型,通道注意力模型,空间和通道混合注意力模型 三种, 这里不区分soft和hard attention 。
不是图像中所有的区域对任务的贡献都是同样重要的,只有任务相关的区域才是需要关心的,比如分类任务的主体,空间注意力模型就是寻找网络中最重要的部位进行处理。
我们在这里给大家介绍两个具有代表性的模型,第一个就是Google DeepMind提出的STN网络(Spatial Transformer Network[1])。它通过学习输入的形变,从而完成适合任务的预处理操作,是一种基于空间的Attention模型,网络结构如下:
这里的Localization Net用于生成仿射变换系数,输入是C×H×W维的图像,输出是一个空间变换系数,它的大小根据要学习的变换类型而定,如果是仿射变换,则是一个6维向量。
这样的一个网络要完成的效果如下图:
即定位到目标的位置,然后进行旋转等操作,使得输入样本更加容易学习。这是一种一步调整的解决方案,当然还有很多迭代调整的方案,感兴趣可以去有三知识星球星球中阅读。
相比于Spatial Transformer Networks 一步完成目标的定位和仿射变换调整,Dynamic Capacity Networks[2]则采用了两个子网络,分别是低性能的子网络(coarse model)和高性能的子网络(fine model)。低性能的子网络(coarse model)用于对全图进行处理,定位感兴趣区域,如下图中的操作fc。高性能的子网络(fine model)则对感兴趣区域进行精细化处理,如下图的操作ff。两者共同使用,可以获得更低的计算代价和更高的精度。
由于在大部分情况下我们感兴趣的区域只是图像中的一小部分,因此空间注意力的本质就是定位目标并进行一些变换或者获取权重。
对于输入2维图像的CNN来说,一个维度是图像的尺度空间,即长宽,另一个维度就是通道,因此基于通道的Attention也是很常用的机制。
SENet(Sequeeze and Excitation Net)是2017届ImageNet分类比赛的冠军网络,本质上是一个基于通道的Attention模型,它通过建模各个特征通道的重要程度,然后针对不同的任务增强或者抑制不同的通道,原理图如下。
在正常的卷积操作后分出了一个旁路分支,首先进行Squeeze操作(即图中Fsq(·)),它将空间维度进行特征压缩,即每个二维的特征图变成一个实数,相当于具有全局感受野的池化操作,特征通道数不变。
然后是Excitation操作(即图中的Fex(·)),它通过参数w为每个特征通道生成权重,w被学习用来显式地建模特征通道间的相关性。在文章中,使用了一个2层bottleneck结构(先降维再升维)的全连接层+Sigmoid函数来实现。
得到了每一个特征通道的权重之后,就将该权重应用于原来的每个特征通道,基于特定的任务,就可以学习到不同通道的重要性。
将其机制应用于若干基准模型,在增加少量计算量的情况下,获得了更明显的性能提升。作为一种通用的设计思想,它可以被用于任何现有网络,具有较强的实践意义。而后SKNet等方法将这样的通道加权的思想和Inception中的多分支网络结构进行结合,也实现了性能的提升。
通道注意力机制的本质,在于建模了各个特征之间的重要性,对于不同的任务可以根据输入进行特征分配,简单而有效。
前述的Dynamic Capacity Network是从空间维度进行Attention,SENet是从通道维度进行Attention,自然也可以同时使用空间Attention和通道Attention机制。
CBAM(Convolutional Block Attention Mole)是其中的代表性网络,结构如下:
通道方向的Attention建模的是特征的重要性,结构如下:
空间方向的Attention建模的是空间位置的重要性,结构如下:
首先将通道本身进行降维,分别获取最大池化和均值池化结果,然后拼接成一个特征图,再使用一个卷积层进行学习。
这两种机制,分别学习了通道的重要性和空间的重要性,还可以很容易地嵌入到任何已知的框架中。
除此之外,还有很多的注意力机制相关的研究,比如 残差注意力机制,多尺度注意力机制,递归注意力机制 等。
从原理上来说,注意力机制在所有的计算机视觉任务中都能提升模型性能,但是有两类场景尤其受益。
我们知道细粒度分类任务中真正的难题在于如何定位到真正对任务有用的局部区域,如上示意图中的鸟的头部。Attention机制恰巧原理上非常合适,使用了注意力机制,对模型的提升效果很明显。
我们又回到了开头,没错,Attention的本质就是重要/显著区域定位,所以在目标检测领域是非常有用的。
上图展示了几个显著目标检测的结果,可以看出对于有显著目标的图,概率图非常聚焦于目标主体,在网络中添加注意力机制模块,可以进一步提升这一类任务的模型。
④ 注意力机制
注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。
视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。
深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。
分为: 硬注意力、软注意力、此外,还有高斯注意力、空间变换
就注意力的可微性来分:
1. Hard-attention, 就是0/1问题,哪些区域是被 attentioned,哪些区域不关注.硬注意力在图像中的应用已经被人们熟知多年:图像裁剪(image cropping)
硬注意力(强注意力) 与软注意力不同点在于,首先强注意力是更加关注点,也就是图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。当然,最关键是强注意力是一个不可微的注意力,训练过程往往是通过增强学习(reinforcement learning)来完成的。
2. Soft-attention ,[0,1]间连续分布问题,每个区域被关注的程度高低,用0~1的score表示.
软注意力 的关键点在于,这种注意力更关注区域或者通道,而且软注意力是确定性的注意力,学习完成后直接可以通过网络生成,最关键的地方是软注意力是可微的,这是一个非常重要的地方。可以微分的注意力就可以通过神经网络算出梯度并且前向传播和后向反馈来学习得到注意力的权重。
⑤ Attention(注意力)机制
Attention(注意力)机制其实来源于人类的认识认知能力。比如当人们观察一个场景或处理一件事情时,人们往往会关注场景的显著性物体,处理事情时则希望抓住主要矛盾。注意力机制使得人类能够关注事物的重要部分,忽略次要部分,更高效的处理所面临的各种事情。
注意力机制在NLP领域被真正的发扬光大,其具有参数少、速度快、效果好的特点,如2018年的BERT、GPT 领跑各项 NLP 任务效果。由此在此领域,transformer和attention结构受到了极大的重视。
第二步:使用权重对Value进行加权求和从而得到Attention Value。
注意力是一种机制,或者方法论,并没有严格的数学定义。比如,传统的局部图像特征提取、显著性检测、滑动窗口方法等都可以看作一种注意力机制。在神经网络中,注意力模块通常是一个额外的神经网络,能够硬性选择输入的某些部分,或者给输入的不同部分分配不同的权重。
根据权重在特征空间和通道上的应用方式不同,主要可分为
其增加了一个通道注意力模块,学习每个通道的权重,通过抑制无关特征提升卷积特征的表示性能。SENet通过Squeeze模块和Exciation模块实现所述功能,首先通过Squeeze模块对卷积特征进行进行压缩,即在通道维度上执行全局池化操作,在SENet中采用的是全局平均池化,作者提到该操作能够使得靠近数据输入的特征也可以具有全局感受野,这一点在很多的任务中是非常有用的。然后是通过全连接网络进行Exciation操作,作者在全连接网络中降维操作的目的是一方面降低了网络计算量,一方面增加了网络的非线性能力。最后将得到通道attention应用到原始卷积特征上,即通过乘法加权的方式乘到先前的特征上,从而提升重要特征,抑制不重要特征。
从图中可以看出,首先将输入张量进行降维到C通道,与SENet不同的是采用二阶pool的方式,计算得到C*C的协方差矩阵,这种计算方式引入了通道之间的相互关系,然后进行线性卷积和非线性激活的两个连续运算,得到通道注意力。
除此之外,还有很多的注意力机制相关的研究,比如残差注意力机制,多尺度注意力机制,递归注意力机制等。
⑥ 注意力机制
本文大部分的内容来自于 深度学习中的注意力机制
意力机制借鉴了人类注意力的说法,比如我们在阅读过程中,会把注意集中在重要的信息上。在训练过程中,输入的权重也都是不同的,注意力机制就是学习到这些权重。最开始attention机制在CV领域被提出来,但后面广泛应用在NLP领域。
需要注意的是,注意力机制是一种通用的思想和技术,不依赖于任何模型,换句话说,注意力机制可以用于任何模型。只是我们介绍注意力机制的时候更多会用encoder-decoder框架做介绍。
Encoder-Decoder 框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。下图是文本处理领域里Encoder-Decoder 框架最抽象的一种表示。
在NLP领域,可以把Encoder-Decoder框架看作是:将一个句子(篇章)转换成另一个句子(篇章)。最直观的例子就是机器翻译,将一种语言的表达翻译成另一种语言。对于句子对<source,target>,将给定输入句子
source,通过Encoder-Decoder框架生成目标句子target。其中,source和target都是一组单词序列:
Encoder是对source进行编码,转换成中间语义 :
对于解码器Decoder,其任务是根据中间语义C和当前已经生成的历史信息来生成下一时刻要生成的单词:
我们从最常见的Soft Attention模型开始介绍attention的基本思路。
在上一节介绍的Encoder-Decoder框架是没有体现出“注意力模型”的,为什么这么说呢?我们可以看下target的生成过程:
其中, 是Decoder的非线性变换函数。从上面式子中可以看出,在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子source的语义编码 都是一样的,没有任何区别。而语义编码 又是通过对source经过Encoder编码产生的,因此对于target中的任何一个单词,source中任意单词对某个目标单词 来说影响力都是相同的,这就是为什么说图1中的模型没有体现注意力的原因。
下面从一个例子入手,具体说明下注意力机制是怎么做的。
比如机器翻译任务,输入source是英文句子:Tom chase Jerry;输出target想得到中文:汤姆 追逐 杰瑞。在翻译“Jerry”这个单词的时候,在普通Encoder-Decoder模型中,source里的每个单词对“杰瑞”的贡献是相同的,很明显这样不太合理,因为“Jerry”对于翻译成“杰瑞”更重要。如果引入Attention模型,在生成“杰瑞”的时候,应该体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
每个英文单词的概率代表了翻译当前单词“杰瑞”时注意力分配模型分配给不同英文单词的注意力大小。同理,对于target中任意一个单词都应该有对应的source中的单词的注意力分配概率,可以把所有的注意力概率看作 ,其中 表示source长度, 表示target长度。而且,由于注意力模型的加入,原来在生成target单词时候的中间语义 就不再是固定的,而是会根据注意力概率变化的 ,加入了注意力模型的Encoder-Decoder框架就变成了如图2所示。
根据图2,生成target的过程就变成了下面形式:
因为每个 可能对应着不同的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:
其中, 表示Encoder对输入英文单词的某种变换函数,比如如果Encoder是用RNN模型的话,这个 函数的结果往往是某个时刻输入 后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即:
其中, 代表输入句子Source的长度, 代表在Target输出第 个单词时Source输入句子第 个单词的注意力分配系数,而 则是Source输入句子中第 个单词的语义编码。假设下标 就是上面例子所说的“汤姆”生成如下图:
那另一个问题来了:注意力概率分布是怎么得到的呢?为了便于说明,我们假设图1的Encoder-Decoder框架中,Encoder和Decoder都采用RNN模型,那么图1变成下图4:
那么注意力分配概率分布值的通用计算过程如图5:
上面就是经典的soft Attention模型的基本思想,区别只是函数 会有所不同。
从我的角度看,其实Attention机制可以看作,Target中每个单词是对Source每个单词的加权求和,而权重是Source中每个单词对Target中每个单词的重要程度。因此,Attention的本质思想会表示成下图6:
将Source中的构成元素看作是一系列的<Key, Value>数据对,给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,即权重系数;然后对Value进行加权求和,并得到最终的Attention数值。将本质思想表示成公式如下:
其中, 表示Source的长度。
深度学习中的注意力机制 中提到:
因此,Attention机制的具体计算过程实际上分成了3个阶段,如图7:
第一阶段可以引入不同的函数和计算机制,根据Query和某个 ,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量cosine相似性或者引入额外的神经网络来求值,如下:
第二阶段引入类似SoftMax的计算方式,对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用的公式如下:
第三阶段的计算结果 即为 对应的权重系数,然后进行加权求和即可得到Attention数值:
通过如上三个阶段的计算,就可以求出针对Query的Attention数值。
上面介绍的是soft Attention,hard Attention的区别在于soft Attention中 是概率分布,而hard Attention取值为0/1。Hard Attention在图像上有使用,具体可见 引入attention机制 。
这里的global attention其实就是soft Attention,global attention需要考虑encoder中所有的 ;而local Attention直观上理解是只考虑局部的 。
Self-attention是Google在transformer模型中提出的,上面介绍的都是一般情况下Attention发生在Target元素Query和Source中所有元素之间。而Self Attention,指的是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力机制。当然,具体的计算过程仍然是一样的,只是计算对象发生了变化而已。
上面内容也有说到,一般情况下Attention本质上是Target和Source之间的一种单词对齐机制。那么如果是Self Attention机制,到底学的是哪些规律或者抽取了哪些特征呢?或者说引入Self Attention有什么增益或者好处呢?仍然以机器翻译为例来说明,如图8和图9:
具体做法是点乘 和 ,然后除以 ,并经过Softmax,以此得到 的权重。也就是说Attention计算过程如下式,其中 是scaled factor:
注意力的计算一般有两种:加性注意力(additive attention)、乘法(点积)注意力(multiplicative attention)。(这里可以和第3部分计算相似度对应)
加性注意力是最经典的注意力机制,它使用了有一个隐藏层的前馈网络(全连接)来计算注意力; 乘法注意力就是Transformer用的方式。这两种注意力在复杂度上是相似的,但是乘法注意力在实践中要更快速、具有高效的存储,因为它可以使用矩阵操作更高效地实现。
Transformer原文:
Multi-Head Attention是用不同的 得到不同的Attention,最后将这些Attention拼接起来作为输出。公式如下:
其中, ;在Transformer模型中, 。
Scaled Dot-Proct Attention和Multi-Attention如下图所示:
⑦ 多图+公式全面解析RNN,LSTM,Seq2Seq,Attention注意力机制
我们知道人类并不是从零开始思考东西,就像你读这篇文章的时候,你对每个字的理解都是建立在前几个字上面。你读完每个字后并不是直接丢弃然后又从零开始读下一个字,因为你的思想是具有持续性的,很多东西你要通过上下文才能理解。
然而传统的神经网络并不能做到持续记忆理解这一点,这是传统神经网络的主要缺点。举个例子,你打算使用传统的神经网络去对电影里每个时间点发生的事情进行分类的时候,传统的神经网络先让不能使用前一个事件去推理下一个事件。
RNN(递归神经网络)可以解决这个问题。他们是带有循环的神经网络,允许信息在其中保留。
这些循环让递归神经网络看起来有点神秘,然而如果你再思考一下,RNN其实和传统的神经网络并没有太多的不同。RNN可以看作是一个网络的多次拷贝,其中每次网络的输出都是下一次的输入。我们可以思考一下我们如果展开这个循环结构会是什么样的:
这种像是链状的网络结构表明RNN和序列以及列表有着天然的联系,他们是处理这些序列数据的天然的神经网络。而且很明显我们可以看出,输入输出的序列是具有相同的时间长度的,其中的每一个权值都是共享的(不要被链式形状误导,本质上只有一个cell)。
在最近的几年,RNN在很多问题上都取得了成功:比如语音识别,语音模型,翻译,图片注释等等,但是RNN存在着梯度消息/爆炸以及对长期信息不敏感的问题,所以LSTM就被提出来了。现在很多问题的成功都必须归功于LSTM,它是递归神经网络的一种,它在许多的任务中表现都比普通的RNN更好,所以接下来我们来探索一下这个神奇的网络。
人们希望RNN可以将一些之前的信息连接到当前的任务中来,比如使用之前的视频帧来帮助理解当前帧。如果RNN可以做到将会非常有用。那实际RNN能做到吗?这要视情况而定。
有时候,我们只需要当前的信息来完成当前的任务。举个例子,一个语音模型试图基于之前的单词去预测下一个单词。如果我们尝试预测“the clouds are in the sky”,我们不需要太多的上下文信息——很明显最后一个单词会是sky。在像这样不需要太多的相关信息的场合下,RNN可以学习到之前使用的信息。
但是我们要注意,也有很多场景需要使用更多的上下文。当我们试图去预测“I grew up in France… I speak fluent French”这句话的最后一个单词,最近的信息会表明这应该是一种语言的名字,但是如果我们需要知道具体是哪一种语语言,我们需要France这个在句子中比较靠前的上下文信息,相关信息和需要预测的点的间隔很大的情况是经常发生的。
不幸的是,随着间隔变大,RNN变得无法连接到太前的信息。
理论上RNN完全可以处理这种长期依赖(long-term dependencies)的问题。人们可以通过小心地选择参数来解决这个问题。令人悲伤的是,实践表明RNN并不能很好地解决这个问题,Hochreiter (1991) [German] and Bengio, et al. (1994)发现了RNN为什么在这些问题上学习很困难的原因。
而LSTM则没有这个问题。
长期短期记忆网络-通常叫做LSTM-是一种特殊结构的RNN,它能够学习长期依赖。它在大量的问题有惊人的效果,现在已经被广泛使用。
LSTM被明确设计来避免长期依赖问题,记住长时间的信息对LSTM来说只是常规操作,不像RNN那样费力不讨好。
所有的RNN都有不断重复网络本身的链式形式。在标准的RNN中,这个重复复制的模块只有一个非常简单的结果。例如一个tanh层:
LSTM也有这样的链式结构,但是这个重复的模块和上面RNN重复的模块结构不同:LSTM并不是只是增加一个简单的神经网络层,而是四个,他们以一种特殊的形式进行交互:
在上图中,每条线表示一个向量,从一个输出节点到其他节点的输入节点。粉红色的圆圈表示逐点式操作,就像向量加法。黄色的盒子是学习好的神经网络层。线条合代表联结,线条分叉则表示内容被复制到不同的地方。
LSTM的核心之处就是它的cell state(神经元状态),在下图中就是那条贯穿整个结果的水平线。这个cell state就像是一个传送带,他只有很小的线性作用,但却贯穿了整个链式结果。信息很容易就在这个传送带上流动但是状态却不会改变。cell state上的状态相当于长期记忆,而下面的 则代表短期记忆。
门限是一种让信息选择性通过的方式,它们是由sigmoid神经网络层和逐点相乘器做成的。
sigmoid层输出0和1之间的数字来描述一个神经元有多少信息应该被通过。输出0表示这些信息全部不能通过,而输出1则表示让所有信息都通过。
一个LSTM有三个这样的门限,去保护和控制神经元的状态。
LSTM的第一步就是决定什么信息应该被神经元遗忘。这是一个被称为“遗忘门层”的sigmod层组成。他输入 和 (上一次的输出以及这轮的输入),然后在 的每个神经元状态输出0和1之间的数字。同理1表示完全保留这些信息,0表示完全遗忘这个信息。
让我们再次回到一开始举的例子:根据之前的词语去预测下一个单词的语言模型。在这个问题中,cell state或许包括当前主语中的性别信息,所以我们可以使用正确的代词。而当我们看到一个新的主语(输入),我们会去遗忘之前的性别信息。我们使用下图中的公式计算我们的“遗忘系数”
在那个语言模型例子中,我们想给cell state增加主语的性别,来替换我们将要遗忘的旧的主语。
我们给旧的状态乘一个遗忘系数 ,来遗忘掉我们之前决定要遗忘的信息,然后我们增加 。这是新的候选值,由我们想多大程度更新每个状态的值决定。
在语言模型中,就像上面描述的,这是我们实际上要丢弃之前主语的性别信息,增加新的主语的性别信息的地方。
最后,我们需要决定我们要输出什么。这个输出是建立在我们的cell state的基础上,但是这里会有一个滤波器。首先,我们使用sigmoid层决定哪一部分的神经元状态需要被输出;然后我们让cell state经过tanh(让输出值变成-1到1之间)层并且乘上sigmod门限的输出,这样我们就只输出我们想要输出的。
对于那个语言模型的例子,当我们看到一个新的主语的时候,或许我们想输出相关动词的信息,因为动词是跟在主语后面的。例如,它或许要输出主语是单数还是复数的,然后我们就知道主语后动词的语态了。
上面讲的都是一些常规的LSTM,但并不是所有的LSTM都是上面这种形式。实际上现在很多包含LSTM的论文都有小的差异,但是它值得一提。
Gers & Schmidhuber (2000) 引入了一个流行的LSTM变体,它增加了一个窥视孔连接。这意味着我们让门限层监视cell state的状态。
另外一个变体是使用组合遗忘和输入门,而不是分开决定哪些神经元需要遗忘信息,哪些需要增加新的信息,我们组合起来决定。我们只遗忘那些需要被放入新信息的状态,同样我们旨在旧信息被遗忘之后才输入新的信息。
一个更神奇的LSTM变体是门递归单元(也就是大家常说的GRU),它组合遗忘门和输入门为一个更新门,它合并了cell state和隐层状态,并且做了一些其他的改变。最终这个模型比标准的LSTM更简单,并且变得越来越流行。
我们一开始提到人们使用RNN取得了卓越的成果,但其实本质上都是使用LSTM取得的,他们的确在多数任务上表现得更好。
写下来一系列等式以后,LSTM看起来挺吓人,但在文中一步步解释后它变得可以理解了。我们不禁想问:是否有比LSTM更好的模型?学者一致认为:那就是attention注意力机制。核心观点就是让RNN每一步都监视一个更大的信息集合并从中挑选信息。例如:如果你使用RNN去为一个图像生成注释,它会从图像中挑选一部分去预测输出的单词。接下来在讲解attention之前,我们会先聊聊Seq2Seq。
我将会结合一个机器翻译的例子来给大家形象地介绍Seq2Seq。
在这个例子中,我们试图将英语转换为德语,这里要注意这里是一个多对多的模型,而且输入和输出的长度都不固定。
Seq2Seq有一个编码器和一个解码器,编码器一般是LSTM或者其他模型用于提取特征,它的最后一个输出就是从这句话得出的最后的特征,而其他的隐层输出都被丢弃。
同样,我们先把句子输入到我们的Encoder里面,Encoder会输入最后状态 ,作为这句话的特征送给Decoder。
Seq2Seq模型有一个encoder网络和一个Decoder网络,在我们的例子中encoder的输入是英语句子,每输入一个词RNN就会更新状态并记录下来,encoder最后一个状态就是这个句子的特征,并把之前的状态丢弃。把这个状态作为decoder的初始状态,初始化后decoder就知道这个句子了,首先把起始符作为decoder的输入,然后一步步更新,输出状态和概率分布预测下一个字符,再把预测的字符作为下一个输入,重复这个过程,最后直到预测终止符就返回输出的这个序列。
我们的encoder和decoder都是LSTM,encoder把所有句子的特征压缩到最后一个状态,理想情况下encoder最后一个状态包含完整的信息,假如句子很长,那么句子有些信息就会被遗忘,那么Decoder就没有完整的句子信息,那decoder输出的德语句子就不完整。
一种简单方法就是使用双向LSTM,双向LSTM简单来说就是用两条链,从左到右这条链可能会遗忘最左边的信息,而从右往左的这条链可能会遗忘右边的信息,这样结合起来就不容易遗忘句子信息,这里要注意只是encoder用双向LSTM,decoder是单向LSTM,他要生成正确顺序的序列。
另外一种方法改进就是multi-Task learning,我们还可以多加入几个任务,比如让英语句子让他自己翻译成英语句子,这样encoder只有一个但是数据多了一倍,这样encoder就能被训练的更好,当然你还可以添加其他语言的任务,通过借助其他语言更好训练encoder,这样虽然decoder没有变得更好,但是因为encoder提取的更好最后效果也会变好。
当然还有一个方法就是使用注意力机制,这个对机器翻译提高作用很大,我们接下来就讲解这个注意力机制。
我们知道Seq2Seq模型有一个缺点就是句子太长的话encoder会遗忘,那么decoder接受到的句子特征也就不完全,我们看一下下面这个图,纵轴BLUE是机器翻译的指标,横轴是句子的单词量,我们可以看出用了attention之后模型的性能大大提升。
用了注意力机制,Decoder每次更新状态的时候都会再看一遍encoder所有状态,还会告诉decoder要更关注哪部分,这也是attention名字的由来。但是缺点就是计算量很大。
在encoder结束之后,attention和decoder同时工作,回忆一下,decoder的初始状态 是encoder最后一个状态,不同于常规的Seq2Seq,encoder所有状态都要保留,这里需要计算 与每个状态的相关性,我使用 这个公式表示计算两者相关性,把结果即为 ,记做Weight,encoder有m个状态,所以一共有m个 ,这里所有的值都是介于0和1的实数,全部加起来为1。
这张图下面是encoder,上面是decoder,attention会把decoder所有状态与encoder所有状态计算相似性,也就是 .在这张图中每条线就对应一个 ,线越粗说明相关性越高。
这次仅仅是从机器翻译的角度介绍了attention的一个应用,还有一些比如self-attention,Transformer应用,希望以此为印子能够打开读者attention的大门。
1.colah's blog http://colah.github.io/posts/2015-08-Understanding-LSTMs/
2.CS583 https://github.com/wangshusen/DeepLearning
⑧ 通俗理解注意力机制中的Q、K和V表示的具体含义
以翻译为例
比如翻译目标单词为 I 的时候,Q为I
而source中的 “我” “是” “中国人”都是K,
那么Q就要与每一个source中的K进行对齐(相似度计算);"I"与"我"的相似度,"I"与"是"的相似度;"I"与"中国人"的相似度;
相似度的值进行归一化后会生成对齐概率值(“I"与source中每个单词的相似度(和为1)),也可以注意力值;
而V代表每个source中输出的context vector;如果为RNN模型的话就是对应的状态向量;即key与value相同;
然后相应的V与相应的P进行加权求和,就得到了context vetor;
从网上找到了一张图更能证明我的理解的正确性;
这里的v与上面的V是不一样的,这属于一个单隐藏层的前馈神经网络;v属于隐藏层激活后的一个计算得分的权重系数矩阵;
w属于激活前的权重系数矩阵;
这里应该是输出神经元为一个得分值;所以需要多个前馈神经网络同时计算每个hi的得分;与我预想的不同,以为一个前馈神经网络就可以输出所有对应的得分,即输出层的维度是与input序列长度一样;(目前的理解);为什么不与预想的一致呢?
然后对所有得分进行归一化,一般选择softmax方法;让权重系数为1
第二阶段:将hi与对应的权重系数相乘得到一个context vector;即注意力值.
[PS:本文谈论的Q、K、V只限于seq2seq结构]
看到这里,是不是只想直呼卧槽,这什么鬼。不急,先看一个例子
由于讨论的是seq2seq任务,于是来看看机器翻译。
假如我们要将 我喜欢看电影 翻译成 I like watching movies ,步骤则会如下
⑨ Attention机制知识汇总
图1形象化展示了人类在看到一副图像时是如何高效分配有限的注意力资源的,其中红色区域表明视觉系统更关注的目标。
深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是 从众多信息中选择出对当前任务目标更关键的信息 。
深度学习中常用的第一类注意力机制
具体数学形式表示如下:
注意力机制主要体现在 系数上,其反映对于一次查询当前资源中不同数据的重要程度,通过softmax等形式计算出该系数;实现聚焦重要数据,忽略不相关数据的注意力作用
理解:soft attention通过softmax获得注意力权重,之后进行加权计算,即计算注意力分布下的期望。hard attention则是利用注意力权重进行采样选取信息(根据权重大小做采样)。
Self-Attention结构如下
知乎-目前主流的Attention方法都有哪些:张俊林的回答
知乎-目前主流的Attention方法都有哪些:JayLou的回答
知乎专栏-模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用
Attention机制详解(二)——Self-Attention与Transformer