上期我们一起学习了自然语言处理中的word embedding相关知识,
深度学习算法(第24期)----自然语言处理(NLP)中的Word Embedding 前几期我们一起学习了RNN的很多相关知识,今天我们一起用这些知识,学习下机器翻译中的编码解码网络.
这里我们要做一个英文翻译成法语的翻译器,直接先上图,看一下编码解码网络长什么样子,如下:
从上图可以看出,整个网络包括左边的编码器和右边的解码器,其中英文语句‘I drink milk’输入到编码器中,而解码器输出相应的法语翻译。我们注意到,这里我们把法语的翻译结果(标签)作为输入也输入到了解码器中,也就是说,解码器的输入有两个,一个是标签,一个是编码器的输出结果。对于解码器第一个单词,这里用一个标识符<go>表示语句的开始,而以标识符<eos>结束。
需要注意的是这里的英文句子是被反置输入进编码器的。比如语句“I drink milk”是被反置成“milk drink I”输入到编码器中的。这确保了英语句子的开头将会最后送到编码器,这很有用,因为这通常是解码器需要翻译的第一个东西。
每个单词最初都用一个简单的整数标识符来表示(例如:288表示“milk”)。接下来,embedding lookup返回该词的embedding(如前所述,这是一个密集的,相当低维的向量)。 这些词的embedding是实际送到编码器和解码器的内容。
在每个步骤中,解码器输出输出词汇表(即法语)中每个词的score,然后 Softmax 层将这些得分转换为概率。 例如,在第一步中,单词"Je"有 20% 的概率,"Tu"有 1% 的概率,以此类推。 概率最高的词会输出。 这非常类似于常规分类任务,因此你可以使用softmax_cross_entropy_with_logits()函数来训练模型。
需要注意的是,在推断期间(训练之后),你不再将目标句子送入解码器。 相反,只需向解码器提供它在上一步输出的单词,如下 所示(这里还需要embedding lookup,它未在图中显示)。
well,现在我们知道了大概思路。 但是,如果我们去阅读 TensorFlow 的序列教程,并查看rnn/translate/seq2seq_model.py中的代码(在 TensorFlow 模型中),我们会注意到一些重要的区别:
首先,到目前为止,我们已经假定所有输入序列(编码器和解码器的)具有恒定的长度。但显然句子长度可能会有所不同。 有以下几种方法可以处理,例如,使用static_rnn()或dynamic_rnn()函数的sequence_length参数,来指定每个句子的长度(前几期学过)。然而,教程中使用了另一种方法(大概是出于性能原因):根据长度对句子分组,比如长度为1到6个单词的分到一组,长度为7到12的分到另一组,等等),并且使用特殊的填充标记(例如"<pad>")来填充较短的句子。例如,"I drink milk"变成"<pad> <pad> <pad> milk drink I",翻译成"Je bois du lait <eos> <pad>"。当然,我们希望忽略任何<eos>标记之后的输出。为此,本教程的实现使用target_weights向量。例如,对于目标句子"Je bois du lait <eos> <pad>",权重将设置为[1.0,1.0,1.0,1.0,1.0,0.0](注意权重 0.0 对应目标句子中的填充标记)。简单地将损失乘以目标权重,将消除对应<eos> 标记之后的单词的损失。
其次,当输出词汇表很大时(就是这里的情况),输出每个可能的单词的概率的过程将会非常慢。如果目标词汇表包含50,000个法语单词,则解码器将输出 50,000维向量,然后在这样高维度的向量上计算softmax函数,计算量将非常大。为了避免这种情况,一种解决方案是让解码器输出更小的向量,例如,1,000 维向量,然后使用采样技术来估计损失,这样就不必对目标词汇表中的每个单词都计算。 这种采样的Softmax 技术是由Sébastien Jean等人在2015年提出的。在TensorFlow中,你可以使用sampled_softmax_loss()函数。
第三,教程的实现使用了一种注意力机制,让解码器能够监视输入序列。注意力增强的RNN,这里不做详细讨论,但如果你有兴趣,可以关注机器翻译,机器阅读和图像说明的相关论文。
最后,本教程的实现使用了tf.nn.legacy_seq2seq模块,该模块提供了轻松构建各种编解码器模型的工具。例如,embedding_rnn_seq2seq()函数会创建一个简单的编解码器模型,它会自动为你处理word embedding,就像上面中所示的一样。
现在我们了解了seq2seq教程的实现所需的全部知识,尝试去应用并训练自己的翻译器吧!
好了,至此,今天我们简单学习了机器翻译中编码解码器的相关知识,希望有些收获,下期我们将一起学习下自编码器的相关知识,欢迎留言或进社区共同交流。