神经机器翻译(seq2seq RNN)实现详解
http://c.biancheng.net/view/1947.html
seq2seq 是一类特殊的 RNN,在机器翻译、文本自动摘要和语音识别中有着成功的应用。本节中,我们将讨论如何实现神经机器翻译,得到类似于谷歌神经机器翻译系统得到的结果(https://research.googleblog.com/2016/09/a-neural-network-for-machine.html)。
关键是输入一个完整的文本序列,理解整个语义,然后输出翻译结果作为另一个序列。阅读整个序列的想法与以前的架构截然不同,在该架构中,一组固定词汇从一种源语言翻译成目标语言。
本节受到 Minh-Thang Luong 于 2016 年所写的博士论文“Neural Machine Translation”的启发。第一个关键概念是编码器–解码器架构,其中编码器将源语句转换为表示语义的向量,然后这个向量通过解码器产生翻译结果。
编码器和解码器都是 RNN,它们可以捕捉语言中的长距离依赖关系,例如性别一致性和语法结构,而不必事先知道它们,也不需要跨语言进行 1:1 映射。它能够流利地翻译并且具有强大的功能。
图 1 编码器–解码器示例
来看一个 RNN 例子:将 She loves cute cats 翻译成 Elle aime les chats mignons。有两个 RNN:一个充当编码器,一个充当解码器。源语句 She loves cute cats 后面跟着一个分隔符“-”和目标语句 Elle aime les chats mignon。这两个关联语句被输入给编码器用于训练,并且解码器将产生目标语句 Elle aime les chats mignon。当然,需要大量类似例子来获得良好的训练。
图 2 NMT的序列模型示例
NUM序列模型,一个深度循环结构示例,用于将源语句“She loves cute cats” 翻译成目标语句“Elle aimel les chats mignons”。解码器侧,前面时序中产生的单词作为输出下一个单词的输入,“_”代表语句的结束。
现在有一些可以使用的 RNN 变体,具体介绍其中的一些:
- RNN 可以是单向的或双向的,后者将捕捉双向的长时间依赖关系。
- RNN 可以有多个隐藏层,层数的选择对于优化来说至关重要...更深的网络可以学到更多知识,另一方面,训练需要花费很长时间而且可能会过度拟合。
- RNN 可以有多个隐藏层,层数的选择对于优化来说至关重要...更深的网络可以学到更多知识,另一方面,训练需要花费很长时间而且可能会过度拟合。
- RNN 可以具有嵌入层,其将单词映射到嵌入空间中,在嵌入空间中相似单词的映射恰好也非常接近。
- RNN 可以使用简单的重复性单元、LSTM、窥孔 LSTM 或者 GRU。
仍然考虑博士论文“Neural Machine Translation”,可以使用嵌入层将输入的句子映射到一个嵌入空间。然后,存在两个连接在一起的 RNN——源语言的编码器和目标语言的解码器。如下图所示,有多个隐藏层和两个流动方向:前馈垂直方向连接隐藏层,水平方向是将知识从上一步转移到下一步的循环部分。
图 3 神经机器翻译示例
本节使用 NMT(Neural Machine Translation,神经机器翻译),这是一个在 TensorFlow 上在线可得的翻译演示包。
NMT 可通过https://github.com/tensorflow/nmt/ 获取,具体代码可通过 GitHub 获取。
具体实现过程
- 从 GitHub 克隆 NMT:
- 下载一个训练数据集。在这个例子中,使用训练集将越南语翻译成英语,其他数据集可以在https://nlp.stanford.edu/projects/nmt/上获得,如德语和捷克语:
- 参考https://github.com/tensorflow/nmt/,这里将定义第一个嵌入层,嵌入层将输入、词汇量尺寸 V 和期望的输出尺寸嵌入到空间中。词汇量尺寸 V 中只有最频繁的单词才考虑被嵌入,所有其他单词则被打上 unknown 标签。在本例中,输入是 time-major,这意味着 max time 是第一个输入参数(https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn):
- 仍然参考 https://github.com/tensorflow/nmt/,这里定义一个简单的编码器,它使用 tf.nn.rnn_cell.BasicLSTMCell(num_units) 作为基本的 RNN 单元。虽然很简单,但要注意给定基本 RNN 单元,我们利用 tf.nn.dynamic_rnn 构建了 RNN 的(见https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn):
- 定义解码器。首先要有一个基本的 RNN 单元:tf.nn.rnn_cell.BasicLSTMCell,以此来创建一个基本的采样解码器 tf.contrib.seq2seq.BasicDecoder,将结果输入到解码器 tf.contrib.seq2seq.dynamic_decode 中进行动态解码。
- 网络的最后一个阶段是 softmax dense 阶段,将最高隐藏状态转换为 logit 向量:
- 定义在训练阶段使用的交叉熵函数和损失:
- 定义反向传播所需的步骤,并使用适当的优化器(本例中使用 Adam)。请注意,梯度已被剪裁,Adam 使用预定义的学习率:
- 运行代码并理解不同的执行步骤。首先,创建训练图,然后开始迭代训练。评价指标是 BLEU(bilingual evaluation understudy),这个指标是评估将一种自然语言机器翻译为另一种自然语言的文本质量的标准,质量被认为是算法的结果和人工操作结果的一致性。正如你所看到的,指标值随着时间而增长:
解读分析
所有上述代码已经在 https://github.com/tensorflow/nmt/blob/master/nmt/model.py 上给出。关键是将两个 RNN 打包在一起,第一个是嵌入空间的编码器,将相似的单词映射得很接近,编码器理解训练样例的语义,并产生一个张量作为输出。然后通过将编码器的最后一个隐藏层连接到解码器的初始层可以简单地将该张量传递给解码器。
请注意,学习能够进行是因为损失函数基于交叉熵,且labels=decoder_outputs。
如下图所示,代码学习如何翻译,并通过BLEU指标的迭代跟踪进度:
图 4(点此查看高清大图)
下面我们将源语言翻译成目标语言。这个想法非常简单:一个源语句作为两个组合的 RNN(编码器+解码器)的输入。一旦句子结束,解码器将发出 logit 值,采用贪婪策略输出与最大值相关的单词。
例如,单词 moi 作为来自解码器的第一个标记被输出,因为这个单词具有最大的 logit 值。此后,单词 suis 输出,等等:
解码器的输出有多种策略:
- 贪婪:输出对应最大logit值的单词。
- 采样:通过对众多logit值采样输出单词。
- 集束搜索:有多个预测,因此创建一个可能结果的扩展树。
翻译实现过程
- 制定解码器采样的贪婪策略。这很简单,因为可以使用 tf.contrib.seq2seq.GreedyEmbeddingHelper 中定义的库,由于不知道目标句子的准确长度,因此这里使用启发式方法将其限制为源语句长度的两倍。
- 现在可以运行网络,输入一个从未见过的语句(inference_input_file=/tmp/my_infer_file),并让网络转换结果(inference_output_file=/tmp/nmt_model/output_infer):
两个 RNN 封装在一起形成编码器–解码器 RNN 网络。解码器发出的 logits 被贪婪策略转换成目标语言的单词。作为一个例子,下面显示了一个从越南语到英语的自动翻译的例子:
神经机器翻译(seq2seq RNN)实现详解的更多相关文章
- Deep Learning基础--机器翻译BLEU与Perplexity详解
前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...
- 机器翻译评测——BLEU算法详解
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/7679284.html 前言 近年来,在自然语言研究领域中, ...
- 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- seq2seq模型详解及对比(CNN,RNN,Transformer)
一,概述 在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder, ...
- NLP教程(6) - 神经机器翻译、seq2seq与注意力机制
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...
- 2. 知识图谱-命名实体识别(NER)详解
1. 通俗易懂解释知识图谱(Knowledge Graph) 2. 知识图谱-命名实体识别(NER)详解 3. 哈工大LTP解析 1. 前言 在解了知识图谱的全貌之后,我们现在慢慢的开始深入的学习知识 ...
- Transformer各层网络结构详解!面试必备!(附代码实现)
1. 什么是Transformer <Attention Is All You Need>是一篇Google提出的将Attention思想发挥到极致的论文.这篇论文中提出一个全新的模型,叫 ...
- Transform详解(超详细) Attention is all you need论文
一.背景 自从Attention机制在提出 之后,加入Attention的Seq2 Seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型.传统的基 ...
- Word2Vec详解
Word2Vec详解 word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练:其次,该工具得到的训练结果--词向量(word embedding),可以很好地度量词与词之间的相似性.随着 ...
随机推荐
- 美国 | USA B1/B2 十年签证到手记
旅行生活美国 周一早上人还没到公司,就收到EMS快递员的电话,说有两份我的美国领事馆的签证快递,在前台要我签收一下. 美领馆的出签效率果然是高,上周三(8月10日)早上面签的,这三个工作日就把护照送到 ...
- Web应急:移动端劫持
PC端访问正常,移动端访问出现异常,比如插入弹窗.嵌入式广告和跳转到第三方网站,将干扰用户的正常使用,对用户体验造成极大伤害. 现象描述 部分网站用户反馈,手机打开网站就会跳转到赌博网站. 问题处理 ...
- 云计算入门(一)、使用vagrant+virtualbox安装虚机
一.vagrant和virtaulbox简介 Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境,我们可以使用它来干如下这些事: 建立和删除虚拟机配置虚拟机运行参数管理虚拟机运行状态 ...
- [转] vue 自定义组件使用v-model
<input v-model="something"> v-model指令其实是下面的语法糖包装而成: <input :value="something ...
- 有关Oracle 查询时间的记录 (1)
目录 写在前面 一.年.月.日.季.周 二.EXTRACT 年.月.日 三.上个星期一到星期天 四.1分钟前.1小时前.1月前.1年前 五.当月.上月.当天.前天 写在前面 在使用Oracle数据开发 ...
- php xdebug的配置、调试、跟踪、调优、分析
xdebug 的 profiler 是一个强大的工具,它能分析 PHP 代码,探测瓶颈,或者通常意义上来说查看哪部分代码运行缓慢以及可以使用速度提升.Xdebug 2 分析器输出一种兼容 cacheg ...
- 写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么
怼一波,在项目中有很多经常用到,但又含糊不清的知识点 框架中的key: 1. 为啥在遍历元素时要用 key :在开发过程中为了保证遍历同级元素的唯一性,用来提高更新 dom 的性能: 2. 凭啥要保证 ...
- CDA数据分析【数据收集】
一.机器收集数据 机器收集数据会从不同角度对数据进行抓取和采集,与之前手动收集数据不同,机器收集数据不再是用小样本.特定样本来采集和分析整体数据,而是采用大样本或整体数据进行分析,这打破了原来的数据分 ...
- vmware关闭嘟嘟嘟嘟警告
在使用VMware workstation时,安装的windows或者Linux遇到错误操作时,会发生刺耳的嘟嘟声.如何关闭呢?在VMware虚拟机windows系统中的命令提示符处键入以下命令, 然 ...
- Elasticasearch Web管理工具-Cerebro
cerebro是一个使用Scala,Play Framework,AngularJS和Bootstrap构建的开源(MIT许可)elasticsearch web管理工具.需要Java 1.8或更高版 ...