本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
Encoder-Decoder模型结构是RNN循环神经网络解决seq2seq问题时的一种常用方案
本文介绍Encoder-Decoder模型结构,以及一种基础、经典的RNN-Encoder-Decoder模型结构
通过本文,可以快速了解RNN-Encoder-Decoder模型是什么,以及它是如何解决seq2seq问题的
本节介绍Encoder-Decoder模型以及RNN-Encoder-Decoder模型是什么
RNN的Encoder-Decoder模型是什么
RNN的Encoder-Decoder模型是一种用来解决输入与输出都是不定长序列的RNN模型结构
翻译问题的输入与输出就是任意长度的,例如输入"真好吃",输出"It's really delicious"
这种"输入是不定长的序列,输出也是不定长的序列"的问题,也被称为seq2seq(序列到序列)问题
什么是Encoder-Decoder模型
Encoder-Decoder模型并非RNN专属结构,而是一种用来解决seq2seq问题的通用结构
Encoder-Decoder结构如下所示:
如图所示,Encoder-Decoder把模型拆成了两部分构成:编码器与解码器
第一部分先用一个模型(称为编码器)把输入x压缩成一个信息(称为编码信息c)
第二部分用另外一个模型(称为解码器)从编码信息c中得到预测目标y
总的来说,就是引入C来作为X与y之间的桥梁,先用Encoder将x压缩为C,再用Decoder将c解码为y
RNN-Encoder-Decoder模型
RNN-Encoder-Decoder模型就是将Encoder-Decoder应用到了RNN上,用于解决seq2seq问题
RNN-Decoder-Encoder模型的主要思路如下:
上图只是一种思路的描述,不能直接作为具体的模型,RNN-Decoder-Encoder的具体模型是多种多样的
本节介绍一种经典的、较早提出的、基本的RNN-Encoder-Decoder模型结构
RNN-Encoder-Decoder基础模型
一种经典的、基础的RNN-Encoder-Decoder模型出自2014年论文《Sequence to Sequence Learning with Neural Networks》
原文中用它来解决翻译问题,因此它的输入与输出都是词元的one-hot向量
它的结构与思路如下:
先预设一个终止符,例如'<eof>',然后再以下方式设计Encoder和Decoder
Encoder-解说
Encoder部分是一个没有输出的RNN,将输入序列投到该RNN中,最后时刻得到的隐层就是编码信息c
可以理解为不断地用输入来更新隐层,到最后一个时刻时,隐层就承载了所有输入的信息,即可将它作为编码信息c
Decoder-解说
Decoder部分是一个带有输出的RNN,下面细看它的实时输入与延迟输入值:
关于实时输入:它用上一时刻的输出作为当前时刻的实时输入,即
实时输入的初始值用终止符来初始化:
即实时输入为:
关于延迟输入:它的延迟输入用c来初始化
即延迟输入为:
关于终止条件:解码器不断用前一个输出预测下一个输出,直到输出结束符<eof>则结束
模型必须先指定一个结束符,不妨假设为"<eof>"
模型训练时,每一个训练输出样本都以"<eof>"作为终结符
这样模型预测时,当解码器输出"<eof>"时则认为预测结束
关于倒序预测: 论文《Sequence to Sequence Learning with Neural Networks》一直强调,倒序预测效果会更好
倒序预测是指把输入倒序输入,例如原本用"a,b,c"预测"1,2,3",在输入网络时则输入"c,b,a"来预测"1,2,3"
这是因为a与1的相关性更强,倒序输入使最后的c记载了更多与a相关的信息,因此下一个预测1的效果更好
基础RNN-Encoder-Decoder的具体计算流程
基础RNN-Encoder-Decoder的具体计算流程如下:
一、 迭代编码器:
编码器的迭代公式如下:
其中,初始条件
二、计算编码信息c
用编码器最后一时刻的隐层作为编码信息c
三、计算解码器的输出
按以下公式计算解码器,直到输出为终止符'<eof>'则终止
其中,,
备注:原文中使用的是LSTM,这里笔者为了简化,使用RNN替代LSTM
✍️Encoder-Decoder模型的teachForcing训练
模型的训练一般以teachForcing的方式进行训练
teachForcing方式是指,在训练阶段以真实的来作为解码器的实时输入,而不是预测值
也就是说,模型训练时的实时输入为,然后期待的输出为
模型训练时解码器之所以不用预测的来作为实时输入,是因为初始解是非常糟糕的
在模型初始阶段,很难得到终止符"<eof>"的输出 ,这样解码器模型会不断的预测下去
而反过来,如果以真实值训练成功时,那么模型的预测值与真实值是近似的
也就是说,用真实值训练与用预测值训练,在训练成功时,模型的训练结果是殊途同归的
这样,输出长度在训练时是确定的,使训练得以实施,同时,这样训练也会更加快些,因为输入是真实的数据
End