上文我们已经介绍了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。

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


Alec
8 声望4 粉丝