上文咱们曾经介绍了 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。
两个方向并行计算,最初将后果相加即可。