神经机器翻译(seq2seq RNN)实现详解

2023-11-18

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 获取。

具体实现过程

  1. 从 GitHub 克隆 NMT:


     
  2. 下载一个训练数据集。在这个例子中,使用训练集将越南语翻译成英语,其他数据集可以在https://nlp.stanford.edu/projects/nmt/上获得,如德语和捷克语:


     
  3. 参考https://github.com/tensorflow/nmt/,这里将定义第一个嵌入层,嵌入层将输入、词汇量尺寸 V 和期望的输出尺寸嵌入到空间中。词汇量尺寸 V 中只有最频繁的单词才考虑被嵌入,所有其他单词则被打上 unknown 标签。在本例中,输入是 time-major,这意味着 max time 是第一个输入参数(https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn):


     
  4. 仍然参考 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):


     
  5. 定义解码器。首先要有一个基本的 RNN 单元:tf.nn.rnn_cell.BasicLSTMCell,以此来创建一个基本的采样解码器 tf.contrib.seq2seq.BasicDecoder,将结果输入到解码器 tf.contrib.seq2seq.dynamic_decode 中进行动态解码。


     
  6. 网络的最后一个阶段是 softmax dense 阶段,将最高隐藏状态转换为 logit 向量:


     
  7. 定义在训练阶段使用的交叉熵函数和损失:


     
  8. 定义反向传播所需的步骤,并使用适当的优化器(本例中使用 Adam)。请注意,梯度已被剪裁,Adam 使用预定义的学习率:


     
  9. 运行代码并理解不同的执行步骤。首先,创建训练图,然后开始迭代训练。评价指标是 BLEU(bilingual evaluation understudy),这个指标是评估将一种自然语言机器翻译为另一种自然语言的文本质量的标准,质量被认为是算法的结果和人工操作结果的一致性。正如你所看到的,指标值随着时间而增长:

解读分析

所有上述代码已经在 https://github.com/tensorflow/nmt/blob/master/nmt/model.py 上给出。关键是将两个 RNN 打包在一起,第一个是嵌入空间的编码器,将相似的单词映射得很接近,编码器理解训练样例的语义,并产生一个张量作为输出。然后通过将编码器的最后一个隐藏层连接到解码器的初始层可以简单地将该张量传递给解码器。

请注意,学习能够进行是因为损失函数基于交叉熵,且labels=decoder_outputs。

如下图所示,代码学习如何翻译,并通过BLEU指标的迭代跟踪进度:


下面我们将源语言翻译成目标语言。这个想法非常简单:一个源语句作为两个组合的 RNN(编码器+解码器)的输入。一旦句子结束,解码器将发出 logit 值,采用贪婪策略输出与最大值相关的单词。

例如,单词 moi 作为来自解码器的第一个标记被输出,因为这个单词具有最大的 logit 值。此后,单词 suis 输出,等等:

图 5 带概率分布的NMT序列模型示例


解码器的输出有多种策略:

  1. 贪婪:输出对应最大logit值的单词。
  2. 采样:通过对众多logit值采样输出单词。
  3. 集束搜索:有多个预测,因此创建一个可能结果的扩展树。

翻译实现过程

  1. 制定解码器采样的贪婪策略。这很简单,因为可以使用 tf.contrib.seq2seq.GreedyEmbeddingHelper 中定义的库,由于不知道目标句子的准确长度,因此这里使用启发式方法将其限制为源语句长度的两倍。


     
  2. 现在可以运行网络,输入一个从未见过的语句(inference_input_file=/tmp/my_infer_file),并让网络转换结果(inference_output_file=/tmp/nmt_model/output_infer):


两个 RNN 封装在一起形成编码器–解码器 RNN 网络。解码器发出的 logits 被贪婪策略转换成目标语言的单词。作为一个例子,下面显示了一个从越南语到英语的自动翻译的例子:

转载于:https://www.cnblogs.com/DjangoBlog/p/10857408.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神经机器翻译(seq2seq RNN)实现详解 的相关文章

  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • 为什么 __dict__ 和 __weakref__ 类从未在 Python 中重新定义?

    类创建似乎从来没有re 定义 dict and weakref class属性 即 如果它们已经存在于超类的字典中 则它们不会添加到其子类的字典中 但始终re 定义 doc and module class属性 为什么 gt gt gt c
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 如何获取pandas中groupby对象中的组数?

    我想知道有多少个独特的组需要执行计算 给定一个名为 groupby 的对象dfgroup 我们如何找到组的数量 简单 快速 Pandaic ngroups 较新版本的 groupby API pandas gt 0 23 提供了此 未记录的
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar

随机推荐

  • vue学习笔记(超详细)

    文章目录 一 Vue基础 认识Vue js Vue安装方式 Vue的MVVM 二 Vue基础语法 生命周期 模板语法 创建Vue options可以放什么 语法 综合 v on v for遍历数组 v model表单绑定 v model结合
  • 使用iperf测试设备的网络吞吐量

    iperf简介 iperf是一个基于Client Server的网络性能测试工具 可以测试TCP UDP和SCTP带宽质量 能够提供网络吞吐量信息 以及震动 丢包率 最大段和最大传输单元通统计信息 帮助我们测试网络性能 定位网络瓶颈 ipe
  • Python入门之print()函数

    Python利用print 函数将结果输出到标准输出设备 即显示器 上 print 函数主要有以下几个参数 1 print objects objects 0个或多个输出对象 print 拥有0个参数 输出换行 print 函数拥有一个参数
  • SynchronizedMap

    Doug Lea的 util concurrent包除了包含许多其他有用的并发构造块之外 还包含了一些主要集合类型 List和 Map的高性能的 线程安全的实现 Brian Goetz向您展示了用 ConcurrentHashMap替换 H
  • 西瓜书第一章笔记

    本章从如何挑选西瓜的经验出发 介绍了本书所涉及基本术语和概念 数据集 样本 特征 属性 特征空间 属性空间 样本空间 输入空间 特征向量 维数 学习 训练 训练数据 训练样本 假设 预测 标记 样例 标记空间 输出空间 测试 测试样本 分类
  • PAT B1014

    include
  • arcgis创建公里格网并计算格网内点的平均值最后形成马赛克式栅格图

    生成公里格网 在搜索框搜索create fishnet 点击create fishnet output feature class 输出格网的位置和名字 template extent 公里格网的范围 和什么层相同 cell size wi
  • 电脑壁纸链接

    电脑壁纸链接 一 壁纸网站 1 彼岸图网 2 H128壁纸 3 Wallhaven 4 Wallhere 二 游戏壁纸 英雄联盟 神泣 鬼泣 女神联盟2 崩坏3 三国杀 QQ飞车 QQ炫舞 阴阳师 幻塔 王者荣耀 逆战 上古王冠 永恒魔法
  • springboot jar 启动 指定端口和编码格式

    java Dfile encoding utf 8 jar xxxx jar server port 8715
  • linux网络服务[网络配置]——————配置网络IP临时[ifconfig、ip]、永久[nmtui、nmcli、网络链接配置文件]

    文章目录 1 临时设定 1 1 ifconfig命令 1 1 1 安装命令 1 1 2 查看网卡设备 1 1 3 设置IP 1 2 ip命令 1 2 1 安装命令 1 2 2 设定ip 2 永久设置ip的方法 2 1 nmtui 2 2 n
  • OSPF路由汇总和外部路由汇总

    OSPF路由汇总和外部路由汇总 AR1 ospf 1 router id 11 11 11 11 area 0 0 0 1 network 1 1 1 1 0 0 0 0 network 172 16 0 0 0 0 255 255 net
  • 可变参数函数

    c c 支持可变参数的函数 即函数的参数是不确定的 一 为什么要使用可变参数的函数 一般我们编程的时候 函数中形式参数的数目通常是确定的 在调用时要依次给出与形式参数对应的所有实际参数 但在某些情况下希望函数的参数个数可以根据需要确定 因此
  • 常见锁相关

    Linux 锁 futex 所有的futex同步操作都应该从用户空间开始 首先创建一个futex同步变量 也就是位于共享内存的一个整型计数器 当进程尝试持有锁或者要进入互斥区的时候 对futex执行 down 操作 即原子性的给futex同
  • 2023Android大厂面试题详解之内存优化,内存抖动和内存泄漏。(附面试题汇总)

    内存优化 内存抖动和内存泄漏 东方头条 详细讲解 性能优化 内存泄漏与内存抖动优化实战 详细讲解 享学课堂移动互联网系统课程 性能优化 内存泄漏与内存抖动优化实战 这道题想考察什么 内存抖动与内存泄漏是什么 会对程序造成什么影响 为什么会产
  • webpack 插件之Html-Webpack-Plugin

    webpack 插件之Html Webpack Plugin 1 为什么我们需要这个插件 先来看一个应用场景 我们自己打算搭建一个网站 这个网站有很多个页面 我们为每个页面创建一大堆的css样式 js脚本 然后尝试用webpack进行打包
  • 【微信小程序】小程序获取元素的宽度高度

    微信小程序不能进行DOM操作 所以获取元素的信息就不能按照常规手法来做了 首先需要借助微信给我们开发者提供的一个API来实现返回一个SelectorQuery 对象实例 接下来就好办多了 话不多说 上代码 API wx createSele
  • 关于@RabbitListener注解自动ack的一些猜测

    一 起因 从网上获取到的信息 RabbitListener采用的是自动ack 二 实际现象 然而实际测试中发现 在消费者接受到消息后 消息并有立即从队列中移除 而是会在任务执行完成后才会从队列中移除 三 疑问 按照官方解释 消费者一旦设置了
  • 【Effective C++详细总结】第四章 设计与声明

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 C C 知识点 专栏定位 整理一下 C 相关的知识点 供大家学习参考 如果有收获的话 欢迎点赞 收藏 您的支持就
  • 部署Redis服务

    Redis介绍 Remote Dictionary Server 远程字典服务器 是一款高性能的 Key Values 分布式内存数据库 支持数据持久化 定期把内存里数据存储到硬盘 支持多种数据类型 支持master slave模式数据备份
  • 神经机器翻译(seq2seq RNN)实现详解

    http c biancheng net view 1947 html seq2seq 是一类特殊的 RNN 在机器翻译 文本自动摘要和语音识别中有着成功的应用 本节中 我们将讨论如何实现神经机器翻译 得到类似于谷歌神经机器翻译系统得到的结