首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习算法(第25期)----机器翻译中的编码解码器网络

深度学习算法(第25期)----机器翻译中的编码解码器网络

作者头像
智能算法
发布2019-09-25 14:43:01
1K0
发布2019-09-25 14:43:01
举报
文章被收录于专栏:智能算法智能算法智能算法

上期我们一起学习了自然语言处理中的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教程的实现所需的全部知识,尝试去应用并训练自己的翻译器吧!

好了,至此,今天我们简单学习了机器翻译中编码解码器的相关知识,希望有些收获,下期我们将一起学习下自编码器的相关知识,欢迎留言或进社区共同交流。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 智能算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
机器翻译
机器翻译(Tencent Machine Translation,TMT)结合了神经机器翻译和统计机器翻译的优点,从大规模双语语料库自动学习翻译知识,实现从源语言文本到目标语言文本的自动翻译,目前可支持十余种语言的互译。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档