seq2seq模型
seq2seq模型虽然简单,但是特别经典,它的出现可以说给整个NLP带来个翻天覆地的变化。网上已经有很多人做了相关的总结,但是翻看起来还是感觉有点乱,于是想自己总结一个版本,方便自己回忆,也希望所写的内容能给大家带来帮助。由于平时都是直接拿来用,不需要在原理方面做推敲,所以公式部分就不详细介绍了,感兴趣的可以自己去阅读论文,下面只介绍相关原理及应用。
Seq2Seq,全称Sequence to Sequence。它是一种通用的Encoder——Decoder框架,可用于机器翻译、文本摘要、会话建模、图像字幕等场景中。其中Decoder部分的输出通常是不定长的,以机器翻译为例:将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。如下图所,输入的中文长度为4,输出的英文长度为2。下面的所有内容都以机器翻译为例。
Encoder部分
Encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输出的隐状态作为语义向量c。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。下图c代表生成的语义向量,q函数代表相应的变换(线性变换等)
Decoder部分
Decoder部分就是根据Encoder部分输出的语义向量c来做解码工作,以翻译为例,就是生成相应的译文,注意生成的序列是不定长的。而且上一时刻的输出通常要作为下一时刻的输入,如下图所示,预测y2时y1要作为输入。
得到语义向量c后,通常的做法是将c当做初始状态h0输入到Decoder中:
还有一种做法是将c当做每一步的输入:
seq2seq架构举例
下面是seq2seq架构的几个应用,希望能通过这几个例子对seq2seq架构有更深入的了解。
- 邮箱对话
下面是一个收发邮件的例子,根据发来的消息生成相应的回复,左右两边各有四个LSTM单元(黄色蓝色方块,每个方块代表一个LSTM单元),得到的语义向量c当做初始状态h0输入到Decoder中:
LSTM简单介绍
下图是LSTM单元的组成结构,由四个门构成:
下图是3个LSTM单元相互连接(每个单元的结构都一样,上一个单元的输入会作为下一个单元的输入):
-
神经机器翻译
图中结构比前面稍微复杂一点,单词没有直接输入到Encoder模块中,而是通过Embedding层生成的对应的词嵌入(词向量),然后将生成的词嵌入输入到Encoder模块中,这是NLP中的常用的操作,实际上Decoder部分输入的单词也要先生成对应的词嵌入(见下一个例子)。 得到的语义向量s当做初始状态h0输入到Decoder中,Decoder模块的输出并没有直接得到翻译结果,而是通过Softmax函数来生成,这也是NLP中的常用的操作。实际翻译过程就是这个样子,前面是为了让大家理解seq2seq的原理而把中间过程简化了。 -
神经机器翻译(双层LSTM)
这个例子跟上一个类似,只是编解码部分都用了双层LSTM(LSTM有两个隐藏层),_ 是语句起始和结束标记。 -
生成对联
-
c当做每一步的输入
这张图在前面讲生成变长序列的时候已经看到了,这也是一个翻译例子,这个例子跟前面不同的地方是Encoder生成的语义向量c当做Decoder部分每一步的输入。
Attention机制
Attention机制在[下一篇博客]中,欢迎大家阅读!