Attention注意力机制

Seq2Seq
在开始Attention之前,我们先简单回顾一下Seq2Seq模型,传统的机器翻译基本都是基于Seq2Seq模型来做的,该模型分为encoder层与decoder层,并均为RNN或RNN的变体构成,如下图所示

Attention注意力机制_第1张图片

在encode阶段,第一个节点输入一个词,之后的节点输入的是下一个词与前一个节点的hidden state,最终encoder会输出一个上下文向量c(context),这个c又作为decoder的输入,每经过一个decoder的节点就输出一个翻译后的词,并把decoder的隐状态和当前节点的输出作为下一层的输入。该模型对于短文本的翻译来说效果很好,但是其也存在一定的缺点,如果文本稍长一些,就很容易丢失文本的一些信息,bleu得分也会较低(关于什么是bleu请看这篇博客https://blog.csdn.net/CharlesOyfz/article/details/90668423),而Attention就是为了解决这个问题。下图是Attention模型和普通Seq2Seq模型根据句子长度和bleu得分的对比(蓝色为普通seq2seq,绿色为attention模型):

Attention注意力机制_第2张图片


Attention,注意力,该模型在decode阶段,会选择最适合当前节点的c作为输入。

注意力机制在encoder阶段,提供了更多的数据给到decoder阶段,encoder会把所有的输入节点的隐状态形成一个加权和的上下文向量c提供给decoder。
具体的步骤看图,如下:

Attention注意力机制_第3张图片

图示为一个双向rnn,a为编码器的隐状态,s为解码器的隐状态,当解码输出第1个输出时,也就是单词Jane,需要花多少注意力在每个输入的单词上?c代表输入序列全部隐状态a^{<1>},a^{<2>},...,a^{<T>}的一个加权和,每个时刻生成输出所对应的上下文向量c都不一样。\alpha ^{<1,1>}表示解码器生成第1个输出(单词Jane)时;需要放在第1个单词x ^{<1>}的隐状态的注意力量,\alpha ^{<1,2>}表示生成第1个输出(单词Jane)时,需要放在第2个单词的隐状态的注意力量;同理,\alpha ^{<1,3>}表示需要放在第3个单词的隐状态的注意力量。也就是说\alpha ^{<i,j>}表示模型在生成第i个输出时,需要放多少注意力在第j个输入隐状态上。而传给后面解码器的该时刻t'=1的全部隐状态的加权和(上下文向量c)为:

c_{1}=\sum_{t'=1}^{T_{x}}\alpha^{<1,t'>}a^{<t'>}

 

同理,可得其他时刻输出的上下文向量,从而完成解码阶段的输出,下面上公式结合下图说明:

Attention注意力机制_第4张图片

编码阶段:

因为是双向RNN,所以编码阶段t'时刻隐状态向量a为该时刻正向与反向的隐状态的拼接:

a ^{<t{}'>}=\left ( \overrightarrow{a}^{<t{}'>},\overleftarrow{a}^{<t{}'>}\right)

\overrightarrow{a}^{<t{}'>}=tanh(\overrightarrow{W_{x}}E_{x}x^{<t'>}+\overrightarrow{U_{x}}a^{<t'-1>})

\overleftarrow{a}^{<t{}'>}\right=tanh(\overleftarrow{W_{x}}E_{x}x^{<t'>}+\overleftarrow{U_{x}}a^{<t'+1>})

当t'=0, \overrightarrow{a}^{<t{}'>}=0 ,t'=T_x+1时,\overleftarrow{a}^{<t{}'>}=0;x^{<t'>}为单词的one-hot向量

Attention部分:

第i个输出对应的上下文向量c为:

c_{i}=\sum_{t'=1}^{T_{x}}\alpha^{<i,t'>}a^{<t'>}

其中,所有该时刻i的注意力权重和为1:

\sum_{t'=1}^{T_{x}}\alpha^{<i,t'>}=1

e^{<i,t'>}=v_{a}^{\top }tanh(W_{a}s_{i-1}+U_{a}a^{<t'>})

\alpha^{<i,t'>}=softmax(e^{<i,t'>})

解码阶段:

s^{<i>}=\begin{cases} tanh(W_{s}\overleftarrow{a}^{<i>}),& \text{ if } i= 0\\tanh(W_{y}E_{y}y^{<i>}+U_{y}s^{i-1}+Cc_{i}) ,& \text{ if } i>0 \end{cases}

t^{<i>}=tanh(U_{o}s^{<i-1>}+V_{o}E_{y}y^{<i-1>}+C_{o}c_{i})

y^{<i>}=softmax(W_{o}t^{<i>})

你可能感兴趣的:(nlp,深度学习,自然语言处理(nlp))