attention 1.在模型举例在机器翻译的任务当中,翻译得到的每个y的时候,更加关注于某个x,当翻译am的时候,就应该更关注输入当中的 是,让机器也具备这种关注的能力。 2.怎么关注?当翻译y1的时候,y1是通过H1得到的,x1通过特征提取又可以计算出h1,点积的方式可以计算 出两个向量的相似性。H和每个h之间的点积去计算,翻译y1的时候更应该专注哪个x/h。 self-attention:自注意力机制和attention一模一样,唯一不同在于输入不同,导致输出不同,输出不同导致作用不同。 应用场景:指代消减(指示代词消除减掉) H和h之间的关系 score(h,H)=H*h(点积) QKV的计算方式(计算H和h相关性的计算方式)
Attention:
我们都知道人工智能就是为了让机器模仿人的行为,对于人类来说注意力是非常重要的一件事情,有了注意力之后才能把目光放到重点的地方,今天我们就来了解一下,如何让机器的目光也把注意力放到重要的地方,并且再网络中添加注意力会又什么样的效果。
我们以机器翻译举例说明,首先如果直接输入一个字然后翻译一个字肯定是行不通的,因为从一种语言翻译到另外一种语言的话,它们的语序可能会发生变化,例如:比如英语的“red”对应法语的“rouge”,英语的“dress”对应法语“robe”,但是英语的“red dress”对应法语的“robe rouge”。
为了解决这个问题,发明了Encoder-Decoder编解码模型,它可以将我们所有的输入都给保存到一个语义向量C当中,这时候的C是包含整个句子的所有语义信息的,然后再用这个C输入到Decoder中去进行解码翻译,这样就很好的解决了上述问题,模型结构如下:
这时候再这个模型结构当中还有没有问题?
比如说C就是中间层,是由多个h构成的C,也就是说会的到一个固定的语义向量C,既然是固定的大小,那么它储存的信息肯定就是有限的,当句子不断的变长,会发现这个固定大小的语义向量C不能够很好的表示出来输入的句子了,就像让大家看一遍去翻译,duanmingwei is cool,可以很好的翻译出来,如果让大家看一遍文章翻译下边的一段话:
It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way — in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.
是不是就会出问题,因为根本记不下来这篇文章,机器同理,给定了机器一定的神经单元个数,那么也就意味着它的记忆能力是有限的。这个时候让机器去翻译的话,它也会出现问题。在语句中提取的语义信息过大,那么这个固定的语义向量C就装不下了。
通过人类翻译文章的特点,得到了循环神经网络中的Attention机制。
Attention机制:
我们现在把Encoder网络中的隐藏层记为 ,把Decoder网络中的隐藏层记为 ,第t个输出词记为 ,我们原先的Decoder网络中的式子就可以写做:
我们要使得网络在翻译不同的句子时可以注意到并利用原文中不同的词语和语句段,那我们就可以把Decoder网络式子写作:
其中 指的是在时刻t的上下文向量(Context Vector)。我们把它定义为所有的原文隐藏层值 加权平均的结果 ,而如何分配权重就体现了输出这个 的时候应该给哪些原文词语更高的注意力。
在上述图当中,我们为每一个ht都分配了一个权重,那么这个权重就叫做全局对齐权重。
全局对齐权重
全局对齐权重αk很好的体现了在计算第k个输出词语时,应该给所有的 怎样的权重,其中 就代表着计算第k个输出词语时,分配到的权重大小。于是我们的
翻译一个句子的时候,每一步的 都应该是不同的,下图展示的是把法语句子“L’accord sur l’Espace économique européen a été signé en août 1992.” 翻译成英语句子“The agreement on the European Economic Area was signed in August 1992.”时,每一个输出英文词汇的αk构成的对齐矩阵:
上图中,每一列就代表着输出一个英语单词时,它的αk权重是如何分布于原文向量 中的,图中越亮的像素块对于着越大的权重。
这个图告诉了我们几个重要信息:
- 1. 在预测每一个词语的时候,权重只会在少数几个词上表现出比较高的注意力,一般不会多于3-4个词语被同时赋予比较高的注意力;
- 2. 通常来说,在上一时间刻中被分配很大权重的 ,在下一层中并不一定也会有高权重。连续输出几个词语时,注意力会快速地在不同原文词语之间切换。
- 3. 很多时候,输出文本中的第 个词的注意力也集中在输入文本的第 个词上,就像是图中从左上到右下的这一条对角的亮带。
那么把attention带入到encoder-decoder中网络流程是什么样的?
截至到现在就剩下一个问题没解决了,就是αk怎么求的?
如何计算权值,其实权值的意义是什么?是不是就是为了衡量在翻译一个词Hi的时候,应该给每个ht分配的权重,因此如何过能设计出来一个函数,然他可以衡量H和每一个h的关系是不是就可以了。我们称这个函数为score函数,打分函数,意义就是在解码翻译每个H的时候,每个h的得分,肯定它们之间的关系越紧密的分越高。
在这里我们称e为关联能力,并且在经过一个softmax激活函数得到一个缩放后的0-1的值,来代表翻译Hi的时候每个小的ht所分配到的权重。
由于 和 一起构成了 被代入Decoder网络 中进行计算并被监督 ,因此是可以计算的,梯度顺着 ,我们知道这里的权重计算函数是可以被梯度下降优化的。
那么通常这个eij是如何求出来的?
详解Attention计算流程?
Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射。
将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。
目前的NLP任务中Key=Value=输入端的隐变量hj。Query=输出端的隐变量Hi-1。
Attention的种类都有哪些?
- Soft-Attention
- Hard-Attention
- Global-Attention
- Local-Attention
- Self-Attention
Soft-Attention:
上述讲的Attention其实就是Soft-Attention,它的公式如下:
Soft-Attention的完整的工作流程图:
Hard-Attention:
我们刚才又说到,在求语义向量C的时候,进行了加权求平均的操作,但是在Hard-Attention里边放弃了这种方式,它在进行融合多个ht的时候,要么完全留下,要么完全抛弃。
有两种实现的方式:
- 取到α值最高的所对应的h,作为C
- 按照α的权值分布,随机采到一个隐藏层h,作为C
Hard-Attention的工作流程图:
它的缺点也很明显:
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。
Self-Attention:
自监督(Self-Attention)英文也有叫Intra- Attention的,简单来说相比于在输出Hk和输入h之间寻找对齐关系的其他Attention方法,Self-Attention可以在一段文本内部寻找不同部分之间的关系来构建这段文本的表征。因此它多用于非seq2seq任务,因为通常Encoder-Decoder网络只能构建在seq2seq任务中,对于非seq2seq问题原先的Attention就没有办法排上用场了。自监督方法非常适合于解决阅读理解,文本摘要和建立文本蕴含关系的任务。
Attention得到的是输入句x和目标句y之间的依赖关系,忽略了输入句中文字间和目标句中文字间的关系。而自然语言的任务中,更多的任务只有x,需要从x中提取文本特征,而句子内部的关系也是重要的文本特征。Self-Attention探寻的是句子内部的词依赖关系(词组依赖、指代关系等),捕获句子的内部结构,因此能够更好地获取文本特征。
Self Attention顾名思义,指的不是x和y之间的Attention机制,而是x内部元素之间或者y内部元素之间发生的Attention机制,也可以理解为x = y这种特殊情况下的注意力计算机制,此时的Key、Value、Qery来源于同一个文本,但是确实是3个不同的矩阵。例如:输入一个句子,那么里面的每个词都要和该句子中的所有词进行attention计算。
在self-attention中
上图显示的就是当算法处理到红色字的表征时,它应该给文中其他文字的表征多大的注意力权重。
- 词组依赖
2.指代关系(its 指代 law)
介绍论文中Self-Attention机制中采用的attention计算方法Scaled Dot-Product Attention。
Scaled Dot-Product Attention公式,也可以看上述表中总结的4中计算e的方法的最后一种。
公式中SoftMax()函数对矩阵进行按行作用,self-attention中Source和Target是一样的,因此m=n。dk=dv=64,词向量维度为512。
放缩点积注意力模型(Scaled Dot-Product Attention)与正常的点积注意力模型的区别在于增加了一个Scale操作。其中因子 起到调节作用,使得内积不至于太大(如果太大,softmax可能进入无梯度区域),让训练过程中具有更稳定的梯度。
attention计算过程(矩阵形式)
- 计算Query,Key和Value矩阵。将词嵌入转化成矩阵X中,X矩阵中的每一行对应于输入句子中的一个单词。然后将其乘以训练的权值矩阵获得Query,Key和Value矩阵。(可以通过改变WQ、WV、WK矩阵的维度使得最后输出的Attention矩阵与输入矩阵X具有相同的维度)。
2. 结果矩阵按行进行SoftMax后与V相乘,获得Thinking和Machines的attention矩阵。
- Scaled Dot-Product Attention的计算过程(向量形式)
1)对于每个单词,创建一个Query向量,一个Key向量和一个Value向量。这些向量是通过词嵌入乘以我们训练过程中创建的3个训练矩阵而产生的。
- 计算公式
这个softmax的分数决定了当前单词在每个句子中每个单词位置的表示程度。很明显,当前单词对应句子中此单词所在位置的softmax的分数最高。
3)将每个Value向量乘以softmax后的得分。这里实际上的意义在于保存对当前词的关注度不变的情况下,降低对不相关词的关注。
4)累加加权值的向量,即为self-attention层的输出(对于第一个单词)。
总的画一下self-attention的图:
Attention 带来的算法改进
Attention机制为机器翻译任务带来了曙光,具体来说,它能够给机器翻译任务带来以下的好处:
Attention显著地提高了翻译算法的表现。它可以很好地使Decoder网络注意原文中的某些重要区域来得到更好的翻译。
Attention解决了信息瓶颈问题。原先的Encoder-Decoder网络的中间状态只能存储有限的文本信息,现在它已经从繁重的记忆任务中解放出来了,它只需要完成如何分配注意力的任务即可。
Attention减轻了梯度消失问题。Attention在网络后方到前方建立了连接的捷径,使得梯度可以更好的传递。
Attention提供了一些可解释性。通过观察网络运行过程中产生的注意力的分布,我们可以知道网络在输出某句话时都把注意力集中在哪里;而且通过训练网络,我们还得到了一个免费的翻译词典(soft alignment)!还是如下图所示,尽管我们未曾明确地告诉网络两种语言之间的词汇对应关系,但是显然网络依然学习到了一个大体上是正确的词汇对应表。