上文咱们曾经介绍了LSTM,它就是一个革新过的RNN模型,通过LSTM可能比拟好的将一段文本表征为向量。那么要实现机器翻译这个工作,咱们的机器不仅要读懂文本的意思,还须要被动的生成文本。

Char level and Word level

这里简要介绍一下句子的宰割。句子能够宰割成字符级别和单词级别,之前咱们所讲的都是单词级别的;二者各有利弊。

  • 字符级别:“I miss you” => /s I m i s s y o u /e。其中/s示意起始符,/e示意终止符。字符级别的益处就是,因为字符的数量是很少的,所以能够对每一个字符间接做one-hot编码而不须要做embedding(此处不了解的能够先学习word2vec模型)。那么害处就是一句话被宰割成进去造成的序列就比拟长了,在RNN中会存在忘记。
  • 单词级别:“I miss you” => /s I miss you /e。益处是序列长度比拟短,此处的长度为5。害处就是须要大量的训练集做embedding,而embedding会造成过拟合。

RNN文本生成器

接下来为了模型的繁难(其实就是模型图里少画一层embedding层罢了),对立采取字符级别的宰割。

如图,输出文本是“the cat sat on the ma”,此时RNN模型的输入h曾经失去,那么此时我做一个softmax就能够失去一个概率向量,选取概率最大的那个维度对应的字符,就能够预测失去基于the cat sat on the ma前面的字符。那么同理,当我失去the cat sat on the mat字符串之后,再进行一次迭代,不就又能够失去前面的字符了嘛!直到生成的字符是终止符时进行。这样咱们就实现了文本生成

训练RNN文本预测器

给定一段文本P:the cat sat on the mat,而后输出the cat sat on the ma。通过下面的形容咱们晓得此时文本预测器可能预测出下一个最可能呈现的字符,比方预测呈现字符a,而P中的t其实就是标签。通过计算CrossEntropy(a,t)即可失去误差,通过反向流传即可更新模型参数。

Seq2Seq

模型是由编码器Encoder和解码器Decoder组成的,编码采纳的就是RNN,解码采纳的其实就是上文的文本生成器,采纳的模型也是RNN。

此处是须要实现将英文转化为德文,那么先将英文go away输出LSTM中最终失去的状态向量h和记忆信息c。将这两个数据作为Decoder的初始输出传入。

因为起始符是确定的,所以将起始符作为x0输出(为防止遗记RNN模型,上面再放一张RNN的图)。

将起始符输出之后必然会失去一个h0,通过h0就能够进行预测了,同样也是通过softmax将其转化为概率向量而后选取概率最大的字符作为后果。那么此时预测进去的字符持续作为x1输出进行下一步的计算,周而复始,直至输入的字符是终止符时进行。

Seq2Seq模型的训练

其实和文本预测器的训练一样,不同的中央就在于文本预测器只更新了decoder的参数,而Seq2Seq会将Encoder的参数也一并更新。此处的训练形式其实有点拉胯,之后咱们会提到BERT的预训练形式。

最初再来看Seq2Seq的整体结构图就比拟好了解了。

Seq2Seq一点改良

因为咱们晓得LSTM在记忆力方面是比SimpleRNN要好的,然而当序列长度增大之后,依旧会存在对晚期的输出忘记的状况。那么咱们能够应用Bi-LSTM,也就是双向的LSTM来取代LSTM,使得对文本的向量化表征更加全面,信息不会失落。显然这种双向的LSTM是用来革新Seq2Seq中Encoder局部,可能使编码进去的向量示意的信息更全面;而Decoder中不能也没有必要应用Bi-LSTM。

两个方向并行计算,最初将后果相加即可。