Seq2Seq详解分析
Seq2Seq模型简介
Seq2Seq模型是输入输出长度不确定的模型。例如将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。
在网络结构中,输入一个中文序列,然后输出它对应的中文翻译,输出的部分的结果预测后面,根据上面的例子,也就是先输出“machine”,将"machine"作为下一次的输入,接着输出"learning",这样就能输出任意长的序列。
机器翻译、人机对话、聊天机器人等等,这些都是应用在当今社会都或多或少的运用到了我们这里所说的Seq2Seq。
举个简单的例子,当我们使用机器翻译时:输入(Hello) —>输出(你好)。再比如在人机对话中,我们问机器:“你是谁?”,机器会返回答案“我是某某某”。如下图所示为一个简单的邮件对话的场景,发送方问:“你明天是否有空”;接收方回答:“有空,怎么了?”。
Seq2Seq结构
seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。
RNN网络而decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的RNN中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。
语义向量只作初始化参数参与运算 decoder处理方式还有另外一种,就是语义向量C参与了序列所有时刻的运算,如下图,上一时刻的输出仍然作为当前时刻的输入,但语义向量C会参与所有时刻的运算。
Seq2Seq网络架构
由图可见Seq2Seq是由多个LSTM框架组成,encode把输入信息进行解码翻译成向量,decode进行编码输出合成信息。
Seq2Seq存在的问题
在网络模型中encode不断将模型往进压缩,压缩的时候可能比较注重最后一个单词,而损失其他的一些信息。如上图所示。还有一种情况是输入序列太大,LSTM虽然也有记忆功能但是在解码输入信息太长时会损失部分信息。
Seq2Seq存在的问题的解决方案
1 Attention机制
2 Bucket机制