1.简介
注意力机制是机器学习中为了模仿人类视觉的选择性注意力机制,为了将更多的“精力”集中到有用的信息上。
在介绍注意力机制之前,首先要介绍一下Seq2Seq模型,它是一种序列转序列的模型,可以将一种语言的句子转换成另一种语言的句子(翻译),也可以是同一种语言的长句子转换成短句子(提取摘要)。
Seq2Seq模型里面有一种框架叫做Encoder-Decoder框架,这也是一开始注意力机制应用的场景之一。
框架很简单,训练样本是句子对<Source,Target>,模型训练的目的就是,输入Source,获得Target。
Source和Target具体是单词序列。
Encoder是通过某种变换,将Source进行编码,转换成中间表示C:
Decoder则是利用之前生成的历史信息和中间表示,来生成当前时刻i要生成的信息
在上述的Encoder-Decoder框架中,并没有引入注意力机制,它是一种注意力不集中的分心模型,我们可以看Target的生成过程:
这里y1,y2,y3使用的输入句子Source的中间表示C都是一样的,没有任何区别,C是Source通过Encoder编码产生的,这代表无论生成y1,y2还是y3,其中Source中的任何单词对目标单词yi的影响程度都是一样的。
我们在进行翻译的时候,“The animal didn’t cross the street because it was too tired”,我们需要知道“it”指代的是前面的哪个词,是指代的“animal”还是“street”,人是很容易认出“it”是指代“animal”的,但是机器不好识别,所以需要引入注意力机制,在翻译“it”的时候,同时聚焦“animal”这个词。
比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。
在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。
没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。
上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
(Tom,)(Chase,) (Jerry,)
每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。
在翻译过程中生成不同的目标单词yi,需要有不同的概率分布,对应着不同的Ci。
所以在生成单词的过程变成如下形式:
在上面的汤姆杰瑞的例子中,C1,C2,C3可能是如下形式:
这里的f2函数是代表Encoder对某个单词的变换,g函数通常是加权求和,但是这些权值是怎么来的呢,总不能需要人事先定义好。
举例:RNN模型中的注意力权值的生成过程:
一般来说h1,h2,h3,和Hi-1代表了一种向量,这里的F函数可以表示点积,或者缩放点积(这是比较常用的,在后文Transformer会有详细的说明)
这里以点积为例子,h1和Hi-1做一次点积,得到一个得分s1,h2和Hi-1做一次点积得到s2,h3和Hi-1做一次点积得到s3,将三个得分传入softmax,得到三个0-1的权值,这就是注意力生成的过程。
参考:
注意力机制的基本思想和实现原理(很详细)_这里应该有一个很正经的标题的。!。!。!。!那个女孩你....-优快云博客_注意力机制
图解Transformer(完整版)_龙心尘-优快云博客_transformer