目录
参考:https://zhuanlan.zhihu.com/p/38816145
sequence2sequence模型发展到今天,根据不同任务有着不同的变体。了解了最基本的框架之后,再看别的模型就没有太大问题了。
1. sequence2sequence任务 特点
- 输入输出时不定长的。比如说想要构建一个聊天机器人,你的对话和他的回复长度都是不定的。
- 输入输出元素之间是具有顺序关系的。不同的顺序,得到的结果应该是不同的,比如“不开心”和“开心不”这两个短语的意思是不同的。
模型主要由两个部分组成,一个编码器(encoder)和一个解码器(decoder)。
编码器和解码器一般都是由RNN类网络构成,常用LSTM。
这里之所以说一般使用RNN类网络构成序列模型,这是因为使用CNN也可以构建序列到序列模型。使用CNN构造序列模型参考论文:Attention Is All You Need, Convolutional Sequence to Sequence Learning 。之所以使用CNN来做序列模型,是为了能够进行高度的并行化,不像RNN需要等待上一个节点运算后传到下一个节点才能进行输出,并且也更容易训练。
2. 编码器与解码器
通信领域,编码器(Encoder)指的是将信号进行编制,转换成容易传输的形式。
这里,主要指的是将句子编码成一个能够映射出句子大致内容的固定长度的向量
。注意是固定长度的向量
投入到的每个RNN展开的节点,我们将会得到一个输出层输出和一个隐含层输出,我们最终需要使用到的是最后一个输入节点的隐含层输出。这里面最后一个隐含节点的输出蕴含了前面所有节点的输入内容。
解码器(Decoder),这里就是将由编码器得到的固定长度的向量再还原成对应的序列数据,一般使用和编码器同样的结构,也是一个RNN类的网络。
实际操作过程会将由编码器得到的定长向量传递给解码器,解码器节点会使用这个向量作为隐藏层输入和一个开始标志位作为当前位置的输入。得到的输出向量能够映射成为我们想要的输出结果,并且会将映射输出的向量传递给下一个展开的RNN节点。
举例:
输入为 :
Are you free tomorrow ?
我们所需要的对应输出为:
Yes, what's up?
编码器将are you free tomorrow这几个单词的输入都丢到编码器LSTM中去,得到了包含输入内容的向量。
再将这个向量丢到一个解码器中去,一步步展开得到yes what's up 这几个词,遇到
总结:
序列到序列模型看似非常完美,但是实际使用的过程中仍然会遇到一些问题。比如说句子长度过长,会产生梯度消失的问题。
由于使用的是最后的一个隐含层输出的定长向量,那么对于越靠近末端的单词,“记忆”得会越深刻,而远远离的单词则会被逐渐稀释掉。
,
面对这些问题,也有对应的一些解决方案比如加入attention,将句子倒向输入等。