seq2seq模型由encoder-decoder结构组成,encoder将输入序列转化成一个固定长度的语义向量,该语义向量包含了输入的序列的信息,decoder再根据编码器生成的固定长度的向量转化输出序列,通常encoder及decoder均采用RNN结构如LSTM或GRU等,但是RNN机制实际中存在梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息。Decoder 在解码时就无法获得输入序列足够多的信息,因此导致解码的精确度不够准确
seq2seq模型架构(无注意力机制)
RNN中的隐藏层的输出 ht 由 t 时刻的输入和 t-1 时间步隐层的输出决定ht=f(ht-1,xht)
编码器获得各个时刻的隐藏层状态后,把这些隐藏层的状态进行汇总,生成语义编码向量 C,q 表示某种非线性神经网络 C = q ({h1, · · · , hTx }),
在 解码阶段,需要根据给定的语义向量 C 和之前已经生成的输出序列 y1,y2,⋯,yt-1 来预测下一个输出的词 yt
由于 Decoder 是 RNN ,所以当前状态的输出只与上一状态和当前的输入相关
st 表示 Decoder 中 RNN 神经元的隐藏层状态,yt 表示前一时刻的输出,C 代表的是编码后的语义向量,而 g(⋅) 则是一个非线性的多层神经网络,最终输出 yt 的概率。
引入Attention机制
Attention机制是2014年google mind团队在论文《Recurrent Models of Visual Attention》提出,他们在RNN模型上使用了attention机制来进行图像分类。之后,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用attention机制在机器翻译任务上将翻译和对齐同时进行,接着attention机制被广泛应用在基于RNN/CNN等神经网络模型的各种NLP任务中。2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示
为了解决编码器输入长序列转化为定长语义编码向量导致信息丢失的现象,论文《Neural Machine Translation by Jointly Learning to Align and Translate》中提出使用Attention机制,以机器翻译的方法,作者在 RNN Encoder-Decoder的网络架构上引入了Attention机制同时进行翻译和对齐,并且Encoder使用了双向的RNN。
没有注意力机制的Encoder-Decoder,Encoder将输入的序列转化为固定长度的向量C,C作为每一时间步Decoder的输入,解码器解码出的序列对于输入中的所有的词是同权的,例如Encoder输入的英文句子是:我爱中国,目标的翻译结果是:I am china,。在未考虑注意力机制的模型当中,模型认为 我 这个词的翻译受到 我,爱,中国这三个词的影响是一样的。
加入注意力机制的Encoder-Decoder,模型则是要从输入序列中学习到每一个元素的重要程度, Encoder 将输入的序列元素进行编码时,得到的不在是一个固定的语义编码 C ,而是存在多个语义编码(如下图中的C1,C2,C3),且不同的语义编码由不同的序列元素以不同的权重参数组合而成,当Decoder需要翻译或预测下一个词的时候,模型将根据语义编码C中获取encoder每一隐藏层输出序列的重要程度,选择性地关注输入序列比较重要那一部分
定义条件概率
si等于前一时间步Decoder端隐状态si-1,前一时间步已经预测的输出yi-1,以及当前时间步的语义编码向量Ci,f是LSTM或GRU
编码器的语义语义向量C是编码器所有隐藏层的输出加权求和
权重aij是编码器的在j时间步隐状态hj与解码器i-1时刻RNN隐状态si-1拼接再进行归一化得到
而eij等于