现在很多研究的NLP问题都可以转换成一个Sequence to Sequence模型来解决,比如说机器翻译,智能问答,语音识别等。
Sequence to Sequence模型由一个encoder和一个decoder组成,encoder完成编码工作,将不同的输入编码成一个定长的向量,decoder则完成解码工作,对编码器的结果进行解码输出,例如在中英文翻译中,首先编码器将中文编码成一个向量表示,接着解码器把该向量解码成一个英文表示 ,完成翻译过程。
但是序列模型会有两个问题,不管输入有多长,它都会把它编码成一个固定长度的向量,若句子比较长,则编码结果会可能会损失较多想信息,这将不利于接下来的解码工作;其次在解码的时候,每个时刻的输出在解码过程中用到的上下文向量是相同的,没有做区分,这也会给解码带来问题。为了解决这样的问题,会给模型加入注意力机制(attention mechanism)。
RNN Encoder-Decoder
首先讲一下简单的RNN 编码解码器框架,给定输入x =(
其中,
接下来,解码器通过语言模型生产一个新的序列:
其中,
如何加入注意力
由上面传统的解码过程,我们知道:
可以看到,在对每个时刻的输出做预测的时候,用到的上下文向量都是一样的,引入注意力机制后,我们希望实现的是在预测每个时刻的输出时用到的上下文是跟当前输出有关系的上下文,比如在翻译“知识就是力量”的时候,我们希望翻译“is”的时候关注的信息是“就是”,而不是其他无关的词。也就是:
模型的下面是一个双向的RNN,也可以是单向的,这个不是加入注意力的关键,只不过在序列模型中,双向RNN可以更好地编码信息。具体如何理解该图,我们看下面,
在上面的定义中,
其中,
可以把
上面
它实际上是一个对齐模型,是一个嵌套在RNN中的一个前馈神经网络,在训练的时候一起被训练,如图:
对齐模型与整个模型放在一起训练,联合公式(1)和(2)可以得到权重
以上是序列模型引入注意力机制的基本思路,本质上还是利用输入隐状态序列
参考:
【1】注意力机制在nlp应用调研
【2】Bahdanau,NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE ,2015.