本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
RNN-Encoder-Decoder模型是解决翻译问题的一种经典模型
本文介绍一种基本的、经典的、简单的RNN-Encoder-Decoder模型,
通过本文可以初步了解RNN-Encoder-Decoder模型是如何解决翻译问题的
本节介绍一种经典的、较早提出的、基本的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模型-详细计算流程
基本RNN-Encoder-Decoder的具体计算流程如下:
1. 迭代编码器:
编码器的迭代公式如下:
其中,初始条件
2. 计算编码信息c
用编码器最后一时刻的隐层作为编码信息c
3. 计算解码器的输出
按以下公式计算解码器,直到输出为终止符'<eof>'则终止
其中,
备注:原文中使用的是4层LSTM,且没有给出具体计算公式
上述流程与公式是笔者根据自己的理解自行编写,并为了简化,使用RNN替代LSTM
Encoder-Decoder模型的teachForcing训练
模型的训练一般以teachForcing的方式进行训练
teachForcing方式是指,在训练阶段以真实的来作为解码器的实时输入,而不是预测值
也就是说,模型训练时的实时输入为,然后期待的输出为
模型训练时解码器之所以不用预测的来作为实时输入,是因为初始解是非常糟糕的
在模型初始阶段,很难得到终止符"<eof>"的输出 ,这样解码器模型会不断的预测下去
而反过来,如果以真实值训练成功时,那么模型的预测值与真实值是近似的
也就是说,用真实值训练与预测值训练,模型的训练是殊途同归的,
这样,输出长度在训练时是确定的,使训练得以实施,同时,这样训练也会更加快些,因为输入是真实的数据
End