码迷,mamicode.com
首页 > 其他好文 > 详细

解读 | 从seq2seq到attention的方方面面

时间:2020-12-21 10:59:26      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:提取   war   自己的   怎么   解决   长度   左右   笔记   影响   

这篇文章的主要内容是对谷歌提出的transformer 进行论文解读,主要是针对Google在2017年《Attention is all you need》 提出的transformer模型进行一个研究,另外我还看了这篇文章《Neural Machine Translation by Jointly Learning toAlign and Translate》,这篇文章对seq2seq模型及其attention机制的应用做了详细的介绍。在此整理了下内容及笔记,欢迎各位读者交流讨论。

《Attention is all you need 》

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

《Neural MachineTranslation by Jointly Learning to Align and Translate》

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

技术图片

目录

1.引例

2.Encoder-Decoder框架
2.1seq2seq框架内部构造
2.2encoder内部连接解释
2.3decoder内部连接解释
2.4 局限性
2.5solution

3.《Neural Machine Translation by Jointly Learning to Align and Translate》
3.1 encoder
3.2 decoder

4.《Attention is all you need》
4.1transformer
4.1.1 encoder
4.1.2 decoder
4.1.3 残差网络
4.2Attention
4.2.1 self-attetion
4.2.2 Multi-Head attention
4.3 position-wise feed-forward network
4.4 position embeddings
4.5 怎么计算attention
4.6 match程度怎么比较

5 总结

1.引例

从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制,因此,我们首先简单介绍人类视觉的选择性注意力机制。

技术图片

深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。
从图像上看,我们的人眼在捕捉一个图像的时候总是会首先关注到这个图像中最重要的部位,因为这个图像某个部位上肯定是有些特征使得我们不得不注意到它。

在自然语言处理中,随着句子单词的增多,如何对特定的单词进行关注呢?

2.Encoder-Decoder框架

2.1seq2seq框架内部构造

要了解深度学习中的注意力模型,就不得不先谈Encoder-Decoder框架,因为目前大多数注意力模型附着在Encoder-Decoder框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。

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

技术图片

当然了,这个只是大概的思想,具体实现的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由组合。比如说,你在编码时使用BiRNN,解码时使用RNN,或者在编码时使用RNN,解码时使用LSTM等等。

如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。

在RNN Encoder-Decoder的工作当中,我们用一个RNN去模拟大脑的读入动作,用一个特定长度的特征向量去模拟我们的记忆,然后再用另外一个RNN去模拟大脑思考得到答案的动作,将三者组织起来利用就成了一个可以实现Sequence2Sequence工作的“模拟大脑”了。 RNN既可以扮演encoder的角色又可以扮演decoder的角色。

技术图片

技术图片

RNN中存在了许多变体如LSTM和GRU,都是能够比较好的捕捉到距离较长的单词之间的联系的。

2.2encoder内部连接解释

这边为了方便阐述,选取了编码和解码都是RNN的组合。在RNN中,当前时间的隐藏状态是由上一时间的隐藏状态和当前时间输入决定的,也就是

技术图片

获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量 c

技术图片

一种简单的方法是将最后的隐藏层作为语义向量C,即  C= hTx

2.3decoder内部连接解释

解码阶段可以看做编码的逆过程。这个阶段,我们要根据给定的语义向量C和之前已经生成的输出序列y1,y2,…yt?1来预测下一个输出的单词yt,即
技术图片

也可以写作 yt=g({y1,…,yt?1},C)

而在RNN中,上式又可以简化成

技术图片

其中s是输出RNN中的隐藏层(隐藏状态),C代表之前提过的语义向量,yt?1表示上个时间段的输出,反过来作为这个时间段的输入。而g则可以是一个非线性的多层的神经网络,产生词典中各个词语属于yt的概率。(这个g的设计其实也是一个关键,可以根据自己的需要设计各种类型NN来实现所需要的效果)

2.4 局限性

encoder-decoder模型虽然非常经典,但是局限性也非常大。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量C。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。但是这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,还有就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息,那么解码的准确度自然也就要打个折扣了。

例如:汤姆追逐杰瑞,如果语义向量C的固定长度不是很长的话,他可能在杰瑞输入的时候将汤姆这个信息给去除掉,所以会造成信息上的丢失。

2.5solution:

A :动态规定语义向量C的长度
B :将C的长度扩大到一定程度把所有的信息都输入然后再通过attention机制来判断我们是需要哪一个信息

3.《Neural Machine Translation by Jointly Learning toAlign and Translate》

在这篇文章中,作者提出了一个用于翻译任务的结构。解码部分使用了attention模型,而在编码部分,则使用了BiRNN(bidirectionalRNN,双向RNN)
相比于之前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了非常不错的成果。

技术图片

3.1 encoder编码模块

这一块方面相对来说与之前的RNN比较相似,(X1,X2,...,XT)都是输入的序列,映射为向量后经过两层堆叠的双向LSTM进行连接处理,将各个时间层的隐藏层信息汇总后生成语义向量。
一个BIRNN包含一个前向( forward)和一个后向( backward)RN。前向RNN按照词序列(x1,x2,→…xr)的顺序依次压缩源语言端词,并得到系列隐层状态(h1,h2,...hr),类似地,后向RNN按照(xr,xr-1,...,x1)的顺序依次压箱源语言端词,得到(hr,hr-1,...,h1).

将两个隐层状态进行合并得到hi,可以看到hi可以很好的表示压缩后的前向和后向信息,并且更加关注xi附近的信息。

3.2 decoder解码模块(创新点)

技术图片

上式指的是已经知道到y1,y2,...和X的概率,可以把他间写成一个非线性模型g, 自变量包括三个部分
yi-1 ——上一时刻的输出
si ——解码器 i 时刻的隐藏状态
ci ——由编码序列按照权重叠加组成
(详细解释可以看第二节的解释)

技术图片

隐藏状态可以由三个部分影响
si-1——上一个时刻的隐藏层状态
yi-1——上一个时刻的输出
ci——当前时刻的合成的语义向量
与简单的RNN不用的是,上下文表示向量有c变成了ci,也就是说针对每个特定的si都有一个特定的ci . 这个ci怎么的来的呢?这个时候就引入了attention机制别急,待会就解释了。

既然利用到了attention机制,那就少不了对向量之间相似度衡量(见第五节有更详细的解释),在该节中用的就是a()这个函数来衡量si-1和hj之间的相似度(也称作匹配程度)
技术图片
衡量完相似度后,进行softmax归一化输出概率α,根据各自匹配程度(需要关注的程度)阿尔法的值然后对原来的hj进行带权重的线性叠加,形成根据si-1而得到的ci(这个ci如果不引入attention机制的情况下是不会改变的)然后yi的计算就根据后面两步的计算而水到渠成啦
技术图片
技术图片

举个例子:

中国/经济/发展/迅速是一个输入,首先把它们各自都映射到一个向量中去,为x=(x1,x2,x3,x4)
然后将x中各自的向量与他们附近的向量做双层双向LSTM,形成一个前向的H1和一个后向的H2,进行组合形成一个H,这个就是我们要找到的语义向量,里面包含着经过压缩后的前后信息。
然后再decoder层面我们引入了attention机制,针对于H和RNN中隐含层状态做一个匹配,会得到各自的α值,如果是我们现在是需要关注到中国这个词汇,那么想对应的它的α值也会比较高,如果看到不需要关注的词汇那么它的α值就会比较低,然后通过softmax进行归一化处理,将各自的向量经过线性相加重新组合得到一个新的向量(如果没有attention机制的话是不会有这一步的,那么大家的α值都是一样的)
然后在蓝框的处进行一个非线性变化,输出想要的状态
技术图片

4.《Attention is all you need》

4.1transformer

技术图片

这个是《Attentionis all you need》里头的model图,首先可以看到一共有左右两个块组成,左边由input做输入的这一块称为encoder,右边由outputs做输入的这一块称之为decoder。
论文中提到N=6,指的是在这一个将左边这一块堆叠6次得到一个完整的encoder,右边的decoder组成亦同理。
Transformer也会遵循这种结构,encoder和decoder都使用堆叠的self-attention和point-wise,fully connected layers。
? encoder self-attention(黑框):使用 multi-head attention,输入的Q、K、V都是一样的(input embedding and positional embedding)
? encoder-decoderattention(黄框):使用multi-headattention,输入为encoder的输出和decoder的self-attention输出,其中encoder的self-attention作为 key and value,decoder的self-attention作为query
? decoder self-attention(红框):在decoder的self-attention层中,decoder 都能够访问当前位置前面的位置

4.1.1Encoder

encoder由 6 层相同的层组成,每一层分别由两部分组成:
l 第一部分是 multi-head self-attention
l 第二部分是 position-wise feed-forward network,是一个全连接层
两个部分,都有一个残差连接(residual connection),然后接着一个 LayerNormalization。
网络输入是三个相同的向量q, k和v,是word embedding和positionembedding相加得到的结果。为了方便进行残差连接,我们需要子层的输出和输入都是相同的维度。

4.1.2Decoder

和 encoder 类似,decoder 也是由6个相同的层组成,每一个层包括以下3个部分:
l 第一个部分是 multi-head self-attention mechanism
l 第二部分是 multi-head context-attention mechanism
l 第三部分是一个 position-wise feed-forward network
和 encoder 一样,上面三个部分的每一个部分,都有一个残差连接,后接一个 Layer Normalization。
decoder 和 encoder 不同的地方在 multi-head context-attentionmechanism

4.1.3 残差网络与归一化层

随着网络深度的不断加深,我们训练的准确率在上升的过程中突然下降,原因不是因为过拟合,而是因为深度加深导致提取的特征丢失无法使得模型更好的进行训练。
技术图片
故引入残差网络这一个概念。残差网络在图像中应用的比较多,如VGGnet等层数较深的网络中都有所使用,残差网络结构简单,解决了极深度条件下深度卷积神经网络性能退化的问题,分类性能表现出色。从ILSVRC 2015至今半年多的时间里,残差网络的广泛使用已推进计算机视觉各任务的性能升入新的高度。
技术图片
归一化层,目前主要有这几个方法,BatchNormalization(2015年)、LayerNormalization(2016年)、InstanceNormalization(2017年)GroupNormalization(2018年)、SwitchableNormalization(2018年);
在这一篇文章中使用到的是Layer Normalization.

4.2.1 self-attetion

对于self-attention来讲,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入,首先我们要计算Q与K之间的点乘,然后为了防止其结果过大,会除以一个尺度标度 ,其中 为一个query和key向量的维度。再利用Softmax操作将其结果归一化为概率分布,然后再乘以矩阵V就得到权重求和的表示
Y=MultiHead(X,X,X) 旨在寻找到本句子中目标单词与其他单词之间的联系

技术图片
将这个句子的每个单词都各自变成X,Y轴,如果这个self-attention效果较好,那么它的整个attention机制用灰度图表示会呈现一个对角线的形式。事实上之前提到的LayerNormalization做的类似归一化的操作就是把防止特征漂移
技术图片

4.2.2Multi-Head attention

技术图片= 512,h = 8,所以在 scaled dot-product attention 里面的
技术图片
可以看出,所谓Multi-Head,就是只多做几次同样的事情,同时参数不共享,然后把结果拼接起来,进行线性变换然后做一个输出。(目的是为了能够多次捕捉到信息,也就是利用到多次attention机制中将不用类型捕捉到的信息进行结合)那这些信息存放在哪里呢?放在各自训练通道里的W矩阵中,最后形成八个小Z经过连接层连接后经过线性转换形成一个大Z

技术图片

整个流程下来,我从网上找到了一张整个流程的示意图,一个动态的encoder和decoder的运行过程

技术图片
4.3Position-wise Feed-Forward Networks(位置全链接前馈网络——MLP变形)

在位置全链接前馈网络等价于先做了一层感知机加上RELU函数在加上一层感知机

技术图片

4.4 position embeddings

由于attention机制中对位置不存在概念,可以把transformer看作是一个没有顺序的词袋模型,在这个词袋模型中不断的引入attention机制来找到我们所需要的信息。如果在应用到机器翻译这种前后顺序为主的实战中是必须要引入postion embeddings 的,例如在翻译“汤姆追逐杰瑞”和“杰瑞汤姆追逐”就会没有了主次之分。
postion embeddings引入的式子如下,当然这是google训练出来的结果与这个拟合式接近,Google就说我们如果不去训练position embeddings的话那就直接使用这个式子进行embeddings把

技术图片

使用正余弦函数进行embeddings的好处在于可以捕捉到前后信息的一个相对位置,数学依据当然就是和差化积公式了

技术图片

4.5 怎么计算attention

技术图片

Key-value——指的就是每个单词所代表的向量
Query ——指的就是decoder state
在进行运算的时候首先是经历了一个match程度的匹配估计,然后通过softmax算出概率值

技术图片

算出概率后在和Value-vector中的进行一个带权重的线性叠加,最后预测出我是需要针对哪几个向量来进行加attention着重关注。

4.6 match程度怎么比较

Attenion Score Function中从15年开始就对这个匹配程度有研究,一直到17年发展到点乘形式
技术图片
技术图片

总结:

对于使用自注意力机制的原因,论文中提到主要从三个方面考虑(每一层的复杂度,是否可以并行,长距离依赖学习),并给出了和 RNN,CNN 计算复杂度的比较。可以看到,如果输入序列 n 小于表示维度 d 的话,每一层的时间复杂度 Self-Attention 是比较有优势的。当 n 比较大时,作者也给出了一种解决方案 Self-Attention(restricted)即每个词不是和所有词计算 Attention,而是只与限制的 r 个词去计算 Attention。
在并行方面,多头 Attention 和 CNN 一样不依赖于前一时刻的计算,可以很好的并行,优于 RNN。
在长距离依赖上,由于 Self-Attention 是每个词和所有词都要计算 Attention,所以不管他们中间有多长距离,最大的路径长度也都只是 1。可以捕获长距离依赖关系。
Google 提出的多头 Attention 通过计算多次来捕获不同子空间上的相关信息。Self-Attention 的特点在于无视词之间的距离直接计算依赖关系,能够学习一个句子的内部结构,实现也较为简单并行可以并行计算。
Google提出的self-attention是attention模型的一种特殊形式,是自己学习自己的过程,Q=K=V;提出的multi-head attention是通过计算多次来捕获不同维度不同子空间上的相关信息。Self-attention可以不考虑词与词之间的距离而直接计算依赖关系,能够学习到一个句子的内部结构,能够简单并行的计算,可以脱离CNN和RNN,但是需要合理的考虑和设置位置函数。当然,从AAAI2018年的论文可以看出,self-attention也可以当作一个层,与RNN、CNN和FNN等配合使用,能够更好的解决NLP领域的任务。

Jerry的算法和NLP,一个注重技术领域的平台!

技术图片

千山万水总是情,点个「好看」行不行。

解读 | 从seq2seq到attention的方方面面

标签:提取   war   自己的   怎么   解决   长度   左右   笔记   影响   

原文地址:https://blog.51cto.com/15054042/2564358

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!