Transform中的Attention注意⼒机制本⽂边讲细节边配合代码实战,代码地址为:
1、Attention发展史
transform中文翻译Attention注意⼒机制现在⼤⽕,很多深度学习的框架都带上了注意⼒机制,⽽且也取得了很好的性能指标。Attention机制最早是应⽤于图像领域的,九⼏年就被提出来的思想。随着⾕歌的⼀波研究捣⿎,2014年google mind团队发表的这篇论⽂《Recurrent Models of Visual Attention》让其开始⽕了起来,他们在RNN模型上使⽤了attention机制来进⾏图像分类,然后取得了很好的性能。然后就开始⼀发不可收拾了。随后Bahdanau等⼈在论⽂《Neural Machine Translation by Jointly Learning to Align and Translate》中,使⽤类似attention的机制在机器翻译任务上将翻译和对齐同时进⾏,他们的⼯作算是第⼀个将attention机制应⽤到NLP领域中。接着attention机制就被⼴泛应⽤在基于RNN/CNN等神经⽹络模型的各种NLP任务中去了,效果较之前有了很⼤的提⾼。2017年,google机器翻译团队发表的《Attention is all you need》中⼤量使⽤了⾃注意⼒(self-attention)机制来学习⽂本表⽰。这篇论⽂引起了超⼤的反应,本⾝这篇paper写的也很赞,很是让⼈⼤开眼界。因⽽⾃注意⼒机制也⾃然⽽然的成为了⼤家近期的研究热点,并在各种NLP任务上进⾏探索,纷纷都取得了很好的性能。
Transformer是《Attention is all you need》论⽂⾥提出来的新的框架,其就是⼀个升级版的seq2seq,也是由⼀个encoder和⼀个decoder组成的。encoder对输⼊序列进⾏编码,decoder对encoder的结果进⾏解码。但是神奇的是,encoder和decoder都不⽤RNN,⽽且换成了多个attention。
2、整体框架
整体架构看似复杂,其实就是⼀个Seq2Seq结构,简化⼀下,就是这样的:
Encoder的输出和decoder的结合如下,即最后⼀个encoder的输出将和每⼀层的decoder进⾏结合:
好了,我们主要关注的是每⼀层Encoder和每⼀层Decoder的内部结构。如下图所⽰:
可以看到,Encoder的每⼀层有两个操作,分别是Self-Attention和Feed Forward;⽽Decoder的每⼀层有三个操作,分别是Self-Attention、Encoder-Decoder Attention以及Feed Forward操作。这⾥的Self-Attention和Encoder-Decoder Attention都是⽤的是Multi-Head Attention机制,这也是我们本⽂重点讲解的地⽅。
在介绍之前,我们先介绍下我们的数据,经过处理之后,数据如下:
很简单,上⾯部分是我们的x,也就是encoder的输⼊,下⾯部分是y,也就是decoder的输⼊,这是⼀个机器翻译的数据,x中的每⼀个id代表⼀个语⾔中的单词id,y中的每⼀个id代表另⼀种语⾔中的单词id。后⾯为0的部分是填充部分,代表这个句⼦的长度没有达到我们设置的最⼤长度,进⾏补齐。
3、Attention回顾
Attention其实就是计算⼀种相关程度,看下⾯的例⼦:
Attention通常可以进⾏如下描述,表⽰为将query(Q)和key-value pairs映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query和每个key计算出来的,计算⽅法分为三步:
1)计算⽐较Q和K的相似度,⽤f来表⽰:
2)将得到的相似度进⾏softmax归⼀化:
3)针对计算出来的权重,对所有的values进⾏加权求和,得到Attention向量:
上述列举的公式⽐较抽象,属于概念化解释,下⾯会列举self-attention、multi-head attention例⼦来阐明上述内容。
3.1、Self-Attention
Self attention这个单词看起来好像每个⼈都知道是什么意思,但实质上他是算法领域中新出的概念,可以通过阅读: 来理解self attention的原理。
假设下⾯的句⼦就是我们需要翻译的输⼊句:
”The animal didn't cross the street because it was too tired”
这句话中的"it"指的是什么?它指的是“animal”还是“street”?对于⼈来说,这其实是⼀个很简单的问题,但是对于⼀个算法来说,处理这个问题其实并不容易。self attention的出现就是为了解决这个问题,通过self attention,我们能将“it”与“animal”联系起来。
当模型处理单词的时候,self attention层可以通过当前单词去查看其输⼊序列中的其他单词,以此来寻编码这个单词更好的线索。
如上图,是我们第五层Encoder针对单词'it'的图⽰,可以发现,我们的Encoder在编码单词‘it’时,部分注意⼒机制集中在
了‘animl’上,这部分的注意⼒会通过权值传递的⽅式影响到'it'的编码。
下⾯我们先介绍如何⽤向量的⽅式来计算self attention,然后再来看看它是如何使⽤矩阵来实现的。
计算self attention的第⼀步是从每个Encoder的输⼊向量上创建3个向量(在这个情况下,对每个单词做词嵌⼊)。所以,对于每个单词,我们创建⼀个Query向量,⼀个Key向量和⼀个Value向量。这些向量是通过词嵌⼊乘以我们训练过程中创建的3个训练矩阵⽽产⽣的。
注意这些新向量的维度⽐嵌⼊向量⼩。我们知道嵌⼊向量的维度为512,⽽这⾥的新向量的维度只有64维。新向量并不是必须⼩⼀些,这是⽹络架构上的选择需要适当降低系统的计算量。
我们将乘以的权重矩阵得到新向量,既是“query”的向量。同理,最终我们可以对输⼊句⼦的每个单词创建“query”,
“key”,“value”的新向量表⽰形式。
那么“query”,“key”,“value”是什么向量呢?有什么⽤呢?这些向量的概念是很抽象,但是它确实有助于计算注意⼒。不过先不⽤纠结去理解它,后⾯的的内容,会帮助你理解的。
计算self attention的第⼆步是计算得分。以上图为例,假设我们在计算第⼀个单词“thinking”的self attention。我们需要根据这个单词对输⼊句⼦的每个单词进⾏评分。当我们在某个位置编码单词时,分数决定了对输⼊句⼦的其他单词的关照程度。
通过将query向量和key向量点击来对相应的单词打分。所以,如果我们处理开始位置的的self attention,则第⼀个分数为和的点积,第⼆个分数为和的点积。如下图
第三步和第四步的计算,是将第⼆部的得分除以8()(论⽂中使⽤key向量的维度是64维,其平⽅根=8,这样可以使得训练过程中具有更稳定的梯度。这个并不是唯⼀值,经验所得)。然后再将得到的输出通过softmax函数标准化,使得最后的列表和为1。
这个softmax的分数决定了当前单词在每个句⼦中每个单词位置的表⽰程度。很明显,当前单词对应句⼦中此单词所在位置的softmax的分数最⾼,但是,有时候attention机制也能关注到此单词外的其他单词,这很有⽤。
第五步是将每个Value向量乘以softmax后的得分。这⾥实际上的意义在于保存对当前词的关注度不变的情况下,降低对不相关词的关注。
第六步是 累加加权值的向量。 这会在此位置产⽣self-attention层的输出(对于第⼀个单词)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。