序列模型中的注意力机制

现在很多研究的NLP问题都可以转换成一个Sequence to Sequence模型来解决,比如说机器翻译,智能问答,语音识别等。
Sequence to Sequence模型由一个encoder和一个decoder组成,encoder完成编码工作,将不同的输入编码成一个定长的向量,decoder则完成解码工作,对编码器的结果进行解码输出,例如在中英文翻译中,首先编码器将中文编码成一个向量表示,接着解码器把该向量解码成一个英文表示 ,完成翻译过程。

但是序列模型会有两个问题,不管输入有多长,它都会把它编码成一个固定长度的向量,若句子比较长,则编码结果会可能会损失较多想信息,这将不利于接下来的解码工作;其次在解码的时候,每个时刻的输出在解码过程中用到的上下文向量是相同的,没有做区分,这也会给解码带来问题。为了解决这样的问题,会给模型加入注意力机制(attention mechanism)。

RNN Encoder-Decoder
序列模型中的注意力机制_第1张图片
首先讲一下简单的RNN 编码解码器框架,给定输入x =( x1,x2,...,xT ),编码器会利用RNN将其转换成一个向量c:


ht=f(xt,ht1)
c=q(h1,h2,...,hT)

其中, ht 是t时刻的隐状态,c是由整个序列得到的向量表示。
接下来,解码器通过语言模型生产一个新的序列:

p(y)=t=1Tp(yt|y1,y2,...,yt1,c)
p(yt|y1,y2,...,yt1,c)=g(yt1,st,c)

其中, yt 表示第t时刻预测的结果。一个形象的示意图如下:
序列模型中的注意力机制_第2张图片

如何加入注意力
由上面传统的解码过程,我们知道:


p(yt|y1,y2,...,yt1,c)=g(yt1,st,c)

可以看到,在对每个时刻的输出做预测的时候,用到的上下文向量都是一样的,引入注意力机制后,我们希望实现的是在预测每个时刻的输出时用到的上下文是跟当前输出有关系的上下文,比如在翻译“知识就是力量”的时候,我们希望翻译“is”的时候关注的信息是“就是”,而不是其他无关的词。也就是:

p(yt|y1,y2,...,yt1,c)=g(yt1,st,ct)
st=f(st1,yt1,ct)

ct 就是引入注意力的关键所在,为了加入注意力,我们新模型如下:

序列模型中的注意力机制_第3张图片

模型的下面是一个双向的RNN,也可以是单向的,这个不是加入注意力的关键,只不过在序列模型中,双向RNN可以更好地编码信息。具体如何理解该图,我们看下面,
在上面的定义中, ct 是引入注意力的关键所在,它的作用就是要起到将输出与相关输入联系起来,我们定义:

ci=j=1Tαijhj

其中, hj 是编码输入第j个位置的隐状态信息,这里针对双向RNN, hj=[hj;hj] ,即把前向后项RNN得到的隐状态向量进行拼接。权重 α 很重要,它能够标识输入中的哪些词汇当前的输出关系比较大。我们定义权重 α :

αij=exp(eij)k=1Texp(eik)

可以把 α 理解为一个归一化的概率值,表示输入的第j个词对当前输出的关系概率。
上面 α 的定义中引入了记号 eij

eij=a(si1,hj)

它实际上是一个对齐模型,是一个嵌套在RNN中的一个前馈神经网络,在训练的时候一起被训练,如图:

序列模型中的注意力机制_第4张图片

对齐模型与整个模型放在一起训练,联合公式(1)和(2)可以得到权重 α ,再结合隐状态序列 (h1,h2,...,hT) 就可以得到上下文向量序列,将其带入到解码过程就可以求得生成序列,每一步生成过程如下:

序列模型中的注意力机制_第5张图片

以上是序列模型引入注意力机制的基本思路,本质上还是利用输入隐状态序列 (h1,h2,...,hT) 增强了对句子有选择地记忆能力,这对解码过程是非常有帮助的。

参考:
【1】注意力机制在nlp应用调研
【2】Bahdanau,NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE ,2015.

你可能感兴趣的:(自然语言处理)