Attention模型在机器学习领域越来越得到广泛的应用,准备写一个关于Attention模型的专题,主要分为三个部分:
[1]:Seq2Seq 问题中RNN与Attention的结合。
[2]:抛除RNN的Self-Attention模型以及谷歌的Transformer架构。
[3]:Attention及Transformer在自然语言处理及图像处理等方面的应用。
本文介绍:Seq2Seq 问题中RNN与Attention的结合
1. RNN结构的局限
机器翻译解决的是输入是一串在某种语言中的一句话,输出是目标语言相对应的话的问题,如将德语中的一段话翻译成合适的英语。之前的Neural Machine Translation(一下简称NMT)模型中,通常的配置是encoder-decoder结构,也就是Seq2seq模型,即encoder读取输入的句子将其转换为定长的一个向量,然后在通过decoder解码后将这个向量翻译成对应的目标语言的文字。通常情况下,我们在编码和解码的结构会使用RNN,后来为了解决长承依赖的问题,引入了LSTM或者GRU。整体结构来说,我们利用encoder RNN将输入语句信息总结到最后一个hidden vector中,并将其作为decoder初始的hidden vector,利用decoder解码成对应的其他语言中的文字。
【1】RNN梯度消失和爆炸的原因
【2】RNN 的梯度消失问题
2. Attention机制的引入
为了解决这一由长序列到定长向量转化而造成的信息损失的瓶颈,Attention注意力机制被引入了。Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文。同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译,如下图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“。这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。
也就是说,我们在输入一个句子序列时,会在序列中的第一个位置前加上< cls > ,这个位置会集中学习到其他序列位置上的信息,通过相关性也就是向量点积来计算所谓的注意力Attention,后续中我们会使用这个位置上的信息< cls >,这个位置上的向量值就代表了整个句子,也就是集中学习了整个句子的信息。
例如,上面的句子中每个单词A会互相学习,计算点积,最后单词A会得到最后每个单词之间的向量点积结果。例如上面的单词 Law 会与每一单词之间计算点积,其中线条粗细代表着注意力机制的大小,当线条越粗时,说明这个 Law单词与什么单词关系最大,在使用了注意力机制后可以看出我们不仅学习到了这个单词后的信息也学习到了这个单词前的信息,Law 与 The 和 Law 都具有明显的显著性。
下图,可能有难理解,按照上面所说的
q
1
q^1
q1代表了Law这个单词向量,而
k
1
k^1
k1也是代表了本身Law这个单词向量,而且,
k
2
k^2
k2和
k
3
k^3
k3分别代表了 will 和 never …等等按照这样下去直到这句话结果为止。最后得到了注意力机制得分:
a
1
,
1
.
.
.
a
1
,
n
a_{1,1} ... a_{1,n}
a1,1...a1,n。最后通过线性加权后得到了最后得分,也就是单词Law注意力得分
b
1
b^1
b1。
通过Attention机制的引入,我们打破了只能利用encoder最终单一向量结果的限制,从而使模型可以集中在所有对于下一个目标单词重要的输入信息上,使模型效果得到极大的改善。还有一个优点是,我们通过观察attention 权重矩阵的变化,可以更好地知道哪部分翻译对应哪部分源文字,有助于更好的理解模型工作机制,如下图所示。
[1] Attention机制详解(一)——Seq2Seq中的Attention
[2] 李宏毅-Attention,Self-Attention,Transformer