Abstract

DNNs 可用于各种复杂的学习任务并取得很好的效果,但是 DNNs 不能用于序列到序列的映射。这篇论文提出了一种端到端(end-to-end)的神经网络模型,来学习这种映射关系。作者用一个多层的 LSTM 网络来将输入序列映射(编码)为一个固定大小维度的向量,再用另外一个多层的 LSTM 网络来解码该向量为输出序列。在 WMT-14 英语 - 法语的翻译任务中取得很好的结果(BLEU 34.8)。 同时,作者发现模型对句子的主动与被动语态并不敏感,但是对输入词的顺序很敏感;逆转输入序列的顺序能显著提升 LSTM 的性能表现,因为这样做在源句和目标句之间引入了许多短期依赖性,这使优化问题变得更加容易。

1. Introduction

DNNs 缺陷

深度神经网络(Deep Neural Networks)是一种性能强大的模型,在处理各种难题,如语音识别、物体认知上有着近乎完美的表现。但 DNNs 只能用于源序列与目标序列都被编译为维度固定的向量。这是一个致命的局限,因为很多问题序列的长度并不能提前知道,例如语音识别与机器翻译。

LSTM 架构

文章提出使用 LSTM 架构来处理 seq2seq 问题。思路就是用一个 LSTM 读取输入序列,得到一个输入序列固定维度的向量表示,然后用另一个 LSTM 从之前得到的向量表示中提取输出序列。第二层 LSTM 本质上是一个取决于源序列的 RNN 模型。考虑到相当大的时间滞后,LSTM 能利用长时间范围内的相关性从数据中学习的能力让它成为此次应用的最佳选择。

模型读取输入序列“ABC”然后翻译为输出序列“XYZ”。模型读到 <EOS> 时停止预测。另外 LSTM 是按逆转的顺序读取源序列的,随后输出目标序列 “WXYZ”,取得的效果很好。

每个 RNN(LSTM) 用的都是 4 层的 LSTM, 参数两多达 380M, 也就是 38 亿

此外,LSTM 在长句翻译中的表现也不俗。这归功于 LSTM 反向读取输入句子,因为这样做会在数据中引入许多短期依赖关系,从而使优化问题更容易。因此,SDG 可以学到不再受长句子困扰的 LSTM。将原句中的单词颠倒过来的简单技巧是对这项工作最关键的科学贡献之一。

LSTM 的一个重要特质是它能够学会将不同长度的句子映射在一个维度固定的向量中实现表达。常规的翻译倾向于逐字逐句翻译,但 LSTM 被鼓励去理解句子的含义,因为同样的句子在不同的语境中的含义会有所不同。

作者说将输入序列倒序后,效果得到了显著地改善,BLEU 从使用该方法之前的 25.9 上升到 30.6,然而自己也对其原因表示不太清楚,只作出了一些猜想 (也就是说,并无明确的理论依据)。

原文中,作者对这个技巧的解释如下

While we do not have a complete explanation to this phenomenon, we believe that it is caused by the introduction of many short term dependencies to the dataset

以及

By reversing the words in the source sentence, the average distance between corresponding words in the source and target language is unchanged. However, the first few words in the source language are now very close to the first few words in the target language, so the problem’s minimal time lag is greatly reduced.

2. The model

RNN

当输入输出之间的映射提前知道时,RNN 可以容易地将 seq 映射到 seq。 然而,因为复杂和非单调关系的问题的输入和输出序列的长度不同,如何将 RNN 应用于这些问题还不清楚。

一般的序列学习的简单策略是用 RNN 将输入映射为定长的向量,然后用另一个 RNN 将向量映射成目标序列。虽然 RNN 原则上可以工作,但是由于序列的长期依赖使得 RNN 很难训练成功。LSTM 可以解决这个问题。

LSTM

LSTM 的目标函数是给定输入序列对应输出序列的条件概率,TTT 和 T′T^{'}T′ 长度不同。

计算过程:首先获取由 LSTM 的最后一个隐藏状态给出来的输入序列的固定维度表示,然后标准的 LSTM-LM 公式来计算概率。

模型三大创新点

  1. 使用了两个不同的 LSTM,一个用输入序列,一个用于输出序列。因为这样做虽然增加模型参数的数量,但计算代价可忽略不计,并且很自然的可以在多语言对上训练 LSTM
  2. 深层 LSTM 明显优于浅层 LSTM,所以我么选择了四层的 LSTM
  3. 颠倒输入句子的单词顺序是非常有价值的

3. Experiments

模型训练时,以最大化条件概率为目标,也就是说,其目标函数为
1∣S∣∑log⁡P(T∣S)\frac{1}{|S|}\sum \log P(T|S) ∣S∣1​∑logP(T∣S)
其中,S 是源语言的句子,T 是对应的正确翻译。

在模型训练好后,用于实际的预测时,则也采用了简单的 beam search 方法,即在模型参数确定的情况下,对输入序列 (S) ,按下面的式子求解输出序列
T^=arg⁡max⁡TP(T∣S)\hat{T} = \arg\max_{T}P(T|S) T^=argTmax​P(T∣S)

Beam Search

seq2seq 问题有序列依赖关系,Beam Search 相较于 greedy search 效果会更好

训练细节

采用四层的 LSTM,每层 1000 个节点和 1000 维的单词嵌入。输入词汇量 160,000,输出词汇量 80,000。我们发现深层的神经网络明显优于浅层,每增加一层的神经网络就会减少 10% 的 perplexity,这可能是由于它有更多的隐层状态。在输出我们使用了朴素的 softmax,每次的输出有超过 8000 个单词。由此产生的 LSTM 有 384M 的参数,其中 64M 是单纯的循环链接(32M 用于编码 LSTM,32M 用于解码 LSTM)。

  • 初始化所有 LSTM 的参数,其均匀分布在 - 0.08 和 0.08 之间
  • 使用无动量的随机梯度下降(SGD),用固定的学习率 0.7。经过 5 个 epoch 之后,每个 epoch 之后学习率降低一半。一共训练了 7.5 个 epoch
  • 使用 batch 是 128
  • 为了避免梯度爆炸问题,当梯度的范数超过阈值时,我们对其进行缩放以对其实施严格限制。每次 training batch 之后,计算 s=∣∣g∣∣2s=||g||_2s=∣∣g∣∣2​,g 是梯度除以 128。如果 s>5s>5s>5,令 g=5gsg=\frac {5g}{s}g=s5g​
  • 不同句子的长度不同。确保所有小批量中的所有句子长度相同。由于随机抽取翻译对进行训练,会导致每一 minibatch 中大部分句子为短句子,只有少部分为长句子,这会导致算力的浪费(不知道背后的原因),因此作者设定每一 minibatch 中的句子长度是相等的,这样能让训练速度加快一倍
  • 利用了 8 个 GPU 并行计算,其中 4 个 GPU 分别计算每一层 LSTM,剩下的 4 个计算 Softmax 层,模型共训练了十天。

实验结果

作者同样将基于短语的统计翻译模型与他的神经翻译模型进行对比,作者将 5 个 LSTMs 模型 ensemble 之后的集成模型,采用搜索范围为 12 的 beam size 生成翻译结果 (Ensemble of 5 reversed LSTMs, beam size 12),其 BLEU 分数超过了 SMT 的 baseline,这也是神经翻译模型首次超过了统计翻译模型的 baseline,但与最好的 SMT 还有些差距。

此外作者还尝试将自己的模型与传统的 SMT 系统进行结合,效果显著,BLEU 最好的达到了 37,超过 baseline system 4 个点。

结果分析

  1. 模型对句子中词的先后顺序较为敏感,但是对其语态并不敏感

John 和 Mary 的顺序颠倒以后,并没有很好的聚合到一起,倒是 admires 和 is in love with 能聚合到一起,由此可见,模型对句子对顺序是十分敏感的。

  1. 该框架模型对长句的翻译表现出乎意料的好

左图呈现了 BLEU 分数随着句子长度的增加,模型表现并没有呈现明显的下降趋势(其实还在上升),只有在超过 35 字以后,才略微有一点下降。这也说明了该模型框架对于长句的处理也是足够能胜任的,能想到的就是在实际应用中可能也不需要特别对长句做特殊处理。

右图呈现的就是对那些比较生僻的句子,模型的泛化能力,可以看到模型下降的趋势还是比较明显的,这倒也不难理解,毕竟生僻句子在数据集本身占比就少,如果有特殊的应用场景,那通常的做法我们都是加该场景下的特殊数据,进行微调,应该也能取得不错的效果。

Key Points

  • 反转输入顺序可显著改善成绩
  • 深度 LSTM 的性能比浅层 LSTM 好得多
  • 用户为编码器 / 解码器使用不同的参数。 这允许并行训练多种语言的解码器。
  • 4 层,每层 1000 个单元。 1000 维单词嵌入。 160k 源词汇。 80k 目标词汇量,训练 1200 万个句子(652M 个单词)。 SGD 的固定学习率为 0.7,在 5 个初始时期后每个时期减少 1/2。 渐变剪裁。 GPU 上的并行化处理可达到 6.3k 字 / 秒。
  • 批处理大致相同长度的语句将使速度提高 2 倍。
  • PCA 投影显示了对被动 / 主动语音具有鲁棒性的有意义的句子簇,表明固定向量表示捕获了含义。
  • “没有完整的解释”,为什么 LSTM 在引入的短程依赖项方面会做得更好。
  • beam search size 1 已经表现良好,beam search size 2 在深度模型中是最好的。

参考链接

源论文地址

【NLP 论文笔记】Sequence to Sequence Learning with Neural Networks

【论文笔记】Sequence to Sequence Learning with Neural Networks

【论文笔记】Sequence to Sequence Learning with Neural Networks

《Sequence to Sequence Learning with Neural Networks》阅读笔记相关推荐

  1. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. NOD32: 教育网、公网超级 病毒更新服务器
  2. Linux 条件变量使用细节(为何调用 pthread_cond_wait 前加锁,函数内部解锁,返回时又加锁)
  3. C#综合揭秘——深入分析委托与事件(上)
  4. java 生成一个空文件系统_如何使用java创建一个空白的PPT文档?
  5. go语言之数组与切片
  6. The method setCharacterEncoding(String) is undefined for the type HttpServletResponse 是什么原因?...
  7. [Java] 蓝桥杯BASIC-30 基础练习 阶乘计算
  8. 正点原子 潘多拉stlink驱动_「正点原子Linux连载」第五十六章Linux自带的LED灯驱动实验...
  9. Windows系统清理随记
  10. 启动U盘更换背景图片和图标的方法
  11. NYOJ-求和求到手软(抖机灵题)
  12. 天道酬勤,仅仅两年,我便做上了那个测试老大···
  13. 美团跑腿地址选择器流程图[小程序]
  14. 不改HOST,另类打开谷歌搜索的方法
  15. 四川多多开店:拼多多如何获取好的评价
  16. 计算机网络部分习题答案
  17. 私有vlan(PVLAN)实验配置步骤
  18. Cadence放置过孔总结:走线过孔、过孔复制和过孔阵列
  19. python 写文件 不存在创建_Python3基础 文件write 与 open(w) 对一个不存在的txt进行创建与写入...
  20. 为什么我手机的科学计算机算的不对,手机计算器出错,原因竟是人性化设计

热门文章

  1. 对接科技侠智能锁(Ble)总结
  2. 自定义 GUID(全局唯一标识符)
  3. Logstash:在实施之前测试 Logstash 管道/过滤器
  4. Barsetto百胜图咖啡——百年精彩创新延续
  5. Apache Sedona(GeoSpark) spatial join 源码解析
  6. 玩过八音符游戏吗?今天教大家用python做一个八音符游戏
  7. 被称为“中国最好的零售店”,服务完虐日本人,开业太火爆被迫暂停营业
  8. 更换NE40E-X16 的防尘网
  9. linux smart工具,使用smart工具安装linux软件包
  10. 安卓手机备份_安卓Android系统,如何备份手机通讯录?