注意⼒机制(Attention )原理详解
⽂章结构
1. 为什么需要Attention
在了解Attention之前,⾸先应该了解为什么我们需要注意⼒机制。我们以传统的机器翻译为例⼦来说明为什么我们需要Attention。传统的机器翻译,也称机器翻译(Neural machine translation),它是由encoder和decoder两个板块组成。其中Encoder和Decoder都是⼀个RNN,也可以是LSTM。不熟悉RNN是如何⼯作的读者,请参考。假如现在想要将‘我是⼀个学⽣。’翻译成英⽂‘I am a student.’,传统的机器翻译是如何操作的呢?
在将中⽂ ‘我是⼀个学⽣’ 输⼊到encoder之前,应⾸先应该使⽤⼀些embedding技术将每⼀个词语表⽰成⼀个向量。encoder的⼯作原理和RNN类似,将词向量输⼊到Encoder中之后,我们将最后⼀个hidden state的输出结果作为encoder的输出,称之为context。Context可以理解成是encoder对当前输⼊句⼦的理解。之后将context输⼊进decoder中,然后每⼀个decoder中的hidden state的输出就是decoder 所预测的当前位⼦的单词。从encoder到decoder的过程中,encoder中的第⼀个hidden state 是随机初始化的且在encoder中我们只在乎它的最后⼀个hidden state的输出,但是在decoder中,它的初始hidden state 是encoder的输出,且我们关⼼每⼀个decoder中的hidden state 的输出。
传统机器翻译的过程可以⽤下图来表⽰:
图中的END,是⼀个结束标志,意味着输⼊已经结束。从上⾯的叙述中可以看到,decoder的输出取决于encoder最后⼀个hidden state 的输出,当输⼊句⼦很长的时候,前⾯的信息可能不能很好的被encoder记录。且decoder在输出的时候,不知道当前位置对应着输⼊的哪⼀个位置。此外,就算是将encoder 中所有的hidden state 全部给decoder,仍然存在问题,因为两种语⾔之间单词之间的位置可能没有⼀⼀对应的关系,⽐如中⽂的 ‘我是⼀个学⽣’ 是5个词翻译成英⽂之后就只有4个词了。还有⼀些语⾔的语法位置也不是⼀⼀对应的。我们希望能有⼀种⽅式可以让模型关注输⼊的相关部分。⽐如还是以 ‘ 我是⼀个学⽣。’为例,我们希望模型可以在翻译student的时候,更加的关注 ‘学⽣’这个词⽽不是其他位⼦的词。这种需求下,提出Attention技术。
2. Attention 的基本原理
Attention 的⼤致过程是这样的。和传统机器翻译不同的是,Attention需要encoder中所有的hidden states的信息都传⼊decoder中,若encoder中有N个hidden states,则需要将这N个hidden states 的信息全部给decoder。将所有信息传⼊decoder之前,我们需要为N个hidden states 分别设置⼀个权重(之后会详细解释如何求得权重),之后将每⼀个hidden state 根据设置权重加权求和,再将所有加权
求和之后的 hidden states 输⼊到decoder中。
假设现在decoder正在预测句⼦中的第i个单词,则将decoder中的第i个hidden state 与 每⼀个encoder的hidden state 做计算,得到⼀组‘得分’(注意‘’得分‘’是⼀个向量且长度应该与输⼊decoder中的hidden states 数量⼀致),每⼀个‘得分’代表了模型在预测当前位置的单词时的注意⼒,得分越⾼,模型对其的注意⼒也就越⼤。然后使⽤softmax将这个‘得分’向量变成⼀个概率分布,将其结果作为权重与对应的hidden state做加权求和,将得到的结果与当前时刻decoder的hidden state 相加,作为下⼀个decoder hidden layer 的输⼊。
上述步骤⽤⽰意图进⾏表⽰:
那么Attention技术中的权重 是如何求得的呢?
⾸先先了解所谓的 ‘得分’ 是如何求得的,这⾥使⽤Luong的定义:
其中是第t个时刻decoder的hidden state,⽽ 表⽰的是encoder的hidden states,W是⼀个需要学习的矩阵,且在整个过程中,都
使⽤同⼀个W, 在求得了得分之后我们就可以求得Attention的权重了:
然后再将权重与encoder中的hidden states 相乘求得 context vector(也就是图中的C1,C2):decoder
h t h
s ˉ
之后就可以计算Attention vector了:
上述⽅程阐述的是将与结合的过程,对应图中C1 与 H7 和 C2 与 H8相结合的过程。从上述的四个式⼦中我们可以发现decoder中的hidden state 被被使⽤了两次,第⼀次是使⽤在了求权重中,第⼆次使⽤在了与结合⽣成的步骤中。
3.⾃注意⼒机制(Self-Attention )
从上述的阐述中可以了解到 Attention的产⽣是依赖于⼀个权重,它告诉了模型哪些词需要重视,哪些词不太需要重视。我们也可以发现,这个权重的产⽣是需要encoder的输出和decoder中t时刻hidden state 来产⽣的。那么所谓的⾃注意⼒机制是什么?了解⾃注意⼒机制之前,⾸先先简单了解⼀下Transformer⽹络,它也是基于机器翻译推出的,最先出现在论⽂《Attention is all you need》中,这篇论⽂提到的是去掉RNN⽹络,只使⽤Self-Attention技术,会使⽹络训练得更快。
Transformer 也是⽤多个encoder 和 decoder 组合⽽成的。下图表⽰的是⼀个encoder和⼀个decoder的结构:
从上图可以发现Encoder中包含着两层分别是Self-attention层和⼀个Feed forward层,decoder中包含着三层,分别是self-attention,encoder-decoder Attention 和 Feed forward 层。 其中所谓的encoder-decoder Attention就和先前讲到的Attention机制⼀样,需要同时使⽤encoder和decoder的信息来⽣成Attention。
在Transformer的encoder结构如下图所⽰:
这个encoder的结构并不太复杂,总的来说就是将上⼀层的输⼊{1,2,3…},输⼊到self-attention层中,然后输出⼀个对应的向量 并将 每⼀个 输⼊到⼀个单独的 Feed forward ⽹络中去,得到对应的输出 ,之后再将  输⼊到下⼀个Self-Attention层中,以此类推。
从上述过程中可以看出,不同的输⼊唯⼀发⽣信息交换的地⽅就是在self-attention层中。所以self-attention的产⽣只是依赖于多个输⼊数据⾃⼰产⽣的,⽽不是像Attention那样需要encoder和decoder的信息。这也是为什么它叫做self-attention的原因。
那么在self-attention层中到底发⽣了什么呢?
⾸先我们将需要翻译的词语做embedding 同时随机⽣成三个矩阵,分别为 ,,,并将每⼀个词语的词向量都与这个三个矩阵相乘,得到三个新的向量,称之为 ‘Queries’ , ‘Keys’, ‘Values’。 根据上图,我们将q1与k1相乘得到  ,然后再将q1与k2相乘得到 ,分别将  除以得到,其中可以理解成是词向量x的长度。 之后将得到的得到分别通过softmax得到两个权重,然后使⽤分别乘以再将两个结果相加,得到的结果就是。的得来也是⼀样的步骤。
4.总结
本⽂记录了Attention以及Self-Attention的基本原理,以及他们是如何做到聚焦输⼊的局部信息的。Attention的产⽣需要encoder与decoder的信息结合,⽽self-attention的产⽣是输⼊经过⼀系列的复杂矩阵运算得到的结构。Self-attention技术可以不⽤在依赖于RNN。使得训练更加⾼效。c t h t a ts c t a t x ;i =i z i z i r i r i W Q W K W V y 1y 2y ,y 12d k y ,y 1′2′d k d k y ,y 1′2′
s ,s 12s ,s 12v 1z 1z 2

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