课程内容概述

  • 机器翻译
  • 注意力机制
  • 带有注意力机制的seq2seq模型

神经机器翻译(NMT)

通过构造一个大型的神经网络,以端到端的方式来训练模型,实现这个过程的系统就称为神经机器翻译系统(Neural Machine Translation, NMT)。

神经机器翻译的架构

通常一个神经机器翻译系统都是按照Encoder-Decoder的结构建立的,也就是如下图所示的结构。
在这个结构中,我们将源语言序列作为输入,输入到Encoder中进行编码,得到中间的隐藏层表示,然后在用Decoder将编码处理为目标语言,输出一个与源语言同义的目标语言序列。


构造Encoder有很多方法,比如最常用的是使用RNN或者LSTM、GRU等时序模型来处理输入序列,每个时刻处理一个单词,那么最后一个时刻的隐藏层单元就记录了整个序列的信息。当然除了使用这些时序模型之外,还可以将广泛应用于计算机视觉领域的卷积神经网络CNN应用到语言序列的编码当中。


当使用Encoder获得包含整个源序列信息的编码 YYY 之后,应该怎样在Decoder中使用这个 YYY 呢?

一种方法就是按照下图所介绍的sequence-to-sequence模型,将 YYY 作为Decoder开始状态的输入。这种方法就要求Decoder所使用的模型要一直记忆 YYY 的信息,这样才不会在解码的过程中遗忘 YYY 所包含的整个序列的语义信息。所以Decoder部分最好使用有长距离记忆能力的LSTM或GRU。


另一种方法是将 YYY 作为Decoder中每一时刻状态的输入,也就是每个状态的输入有两个,分别是上一个单词和 YYY 。其结构如图所示。

所以对于这种结构,每次时序转换的过程就是:zt=f(zt−1,xt,Y)z_t=f(z_{t-1},x_{t},Y)zt​=f(zt−1​,xt​,Y),当然反向传播时 YYY 的梯度为:∑t∂zt∂Y\sum_t \frac{\partial z_t}{\partial Y}∑t​∂Y∂zt​​

这种方法使得每个时刻都能接收这个输入 YYY,所以就无须在整个Decoder序列中一直保存它了,这种思想在之后的注意力机制中也有体现。

神经机器翻译的四个优点

  • 能够端到端训练

    • 使用神经网络的方式构造一个机器翻译系统能够实现端到端的训练,即只通过一个损失函数就能同时优化模型中的所有参数。其实这也是所有深度学习模型能够成功的一个原因,这些模型往往具有巨大的计算图,使得我们可以通过反向传播对整个模型进行优化。这种特性让神经网络模型能够很容易地进行端到端的训练。
  • 分布式表示方法
    • 分布式的表示方法能够更好的表示词与词之间或者短语之间的相似性,以此获得更好的预测结果
  • 更好地利用上下文
    • 基于统计的语言模型如4-gram,5-gram等无法捕捉长距离的上下文关系,而在神经网络构造的模型中可以做到;并且词的分布式表示方法使得共享统计关系成为可能,而在使用独热编码的传统的翻译系统中就无法实现。
  • 生成的文本更加通顺
    • 正是因为深度学习能够更好地利用长文本的上下文,所以使用深度学习模型生成的自然语言相较于其他方法更加通顺流畅。

当然除了上述的一些优点,神经机器翻译还有很多其他的好处。比如我们无须像构造传统的机器翻译模型那样去分别构造几个组件,而是通过一个端到端的系统进行训练,而且在模型的学习过程中也不用显式地添加语义语法等规则信息,当然在之后的研究发现也可以添加一些语法信息来获得性能提升。

机器翻译的发展

我们可以通过一个例句来看这些年翻译系统的发展:
例句:1519年600名西班牙人在墨西哥登陆,去征服几百万人口的阿兹特克帝国,初次交锋他们损兵三分之二。

谷歌翻译(2009):1519 600 Spaniards landed in Mexico, millions of people to conquer the Aztec empire, the first two-thirds of soldiers against their loss.

谷歌翻译(2013):1519 600 Spaniards landed in Mexico to conquer the Aztec empire, hundreds of millions of people, the initial confrontation loss of soldiers two-thirds.

谷歌翻译(2017):In 1519, 600 Spaniards landed in Mexico, to conquer the millions of people of the Aztec empire, the first confrontation they killed two-third.

谷歌翻译(2020):In 1519, 600 Spaniards landed in Mexico to conquer the Aztec Empire with millions of people, and they lost two-thirds of their troops for the first time.

微软必应词典(2020):In 1519, 600 Spaniards landed in Mexico to conquer the Aztec Empire, which was millions of people, and lost two-thirds of their troops in the first battle.

可以看到在2009年的时候谷歌翻译的结果不但没有理解汉语的语法,甚至语义也完全错误,而2017年谷歌有了神经机器翻译系统时,终于能够将1519年和600人成功地分离出来。到了2020年,可以看到谷歌和必应等翻译系统的翻译的果已经十分优秀,非常接近人工翻译的水准。
神经机器翻译系统除了在效果上优势显著外,它在规模上还具有紧凑的特点,这使得这样的翻译系统能够在手机等便携式移动设备上运行,更好地应用于生活中。

注意力机制

在之前所提到的普通的sequence-to-sequence模型中,将Encoder的最后一个隐层状态 YYY 作为Decoder最初状态的输入,然而这样的方法并不利于处理长序列的语义。机器翻译系统中引入注意力机制可以改善这个问题。

机器翻译系统中的注意力机制主要思想就是将Encoder编码过程中所有步的编码都用于Decoder的解码过程。这个过程其实就是在Encoder编码的过程中要记录每个隐层的源状态,将他们像内存一样储存起来,在Decoder解码的过程中,根据翻译的需要访问对应的源状态。这样的机制其实也隐式地建立了两种语言的词之间的对应关系(像传统的基于统计的翻译模型中的对齐过程一样)。

seq2seq中注意力机制的具体实现

在Encoder编码的过程中,我们要保存中间所有过程的隐藏层状态,比如分别记为 h0h_0h0​ ~ hTh_ThT​。那么在Decoder解码的过程中,对于每个时刻 jjj,分别计算Decoder前一时刻的隐层状态 hˉj−1\bar{h}_{j-1}hˉj−1​ 与Encoder各个隐层的状态 hih_ihi​ 的分数(这个分数刻画了当前时刻的解码过程应该将注意力放在哪个词上)。 分数计算的过程用公式表示也就是:
eij=score(hi,hˉj−1)e_{ij}=score(h_i, \bar{h}_{j-1})eij​=score(hi​,hˉj−1​)
其中 score(∗)score(*)score(∗) 是计算分数的函数,计算分数其实可以有很多种方法,比如直接求两个状态向量的内积 hiThˉj−1h_i^T\bar{h}_{j-1}hiT​hˉj−1​(这在某种程度上其实表示了词之间的相似度),或者将两个向量相连后输入到一个单层的神经网络当中,输出二者的分数。除此之外,斯坦福的研究人员还提出了另一种计算方法,就是在第一种方法两个向量的内积之间添加一个矩阵 WWW,也就是 hiTWhˉj−1h_i^TW\bar{h}_{j-1}hiT​Whˉj−1​ 的形式,这个矩阵实际上可以学习将不同的权重分配到两个向量点积的不同部分之中。用曼宁教授的话来说,这种方式能够用很少的参数量来实现两个向量的交互,并且这种交互比两个向量单纯的点乘更加复杂。

在计算完每个隐层状态 hih_ihi​ 的分数 eije_{ij}eij​ 后,使用 softmaxsoftmaxsoftmax 归一化得到各个状态的权重 aija_{ij}aij​,然后用这些权重乘上对应的 hih_ihi​ 再相加,得到一个上下文向量 cjc_jcj​ 作为解码器当前时刻的输入。即:
aij=exp(eij)∑k=0Texp(ekj)a_{ij}=\frac{exp(e_{ij})}{\sum_{k=0}^{T}exp(e_{kj})}aij​=∑k=0T​exp(ekj​)exp(eij​)​cj=∑i=0Taijhic_{j}=\sum_{i=0}^{T}a_{ij}h_{i}cj​=i=0∑T​aij​hi​sj=f(yj−1,sj−1,cj)s_j=f(y_{j-1}, s_{j-1}, c_j)sj​=f(yj−1​,sj−1​,cj​)

实验效果


实验效果的对比如图所示,可以看到带有注意力机制的模型在表现上远远胜过不带注意力的模型。而且这个实验数据还表明了注意力机制的一个优点,就是对于句子长度的增长性能能够保持稳定,而对比不带注意力机制的模型,即便LSTM具有一定的记忆能力,但是一旦句子长度超过30后,模型表现就开始迅速下降。

当然,这样的模型也并不是完美无缺,它仍然会犯一些错误,比如可能将源语言中的两个同义词翻译成目标语言的同一个词(比如繁荣和昌盛这样的词)。

更多改进

  • coverage:用于计算机视觉的机制,可以引入到机器翻译当中,可以解决翻译过程中的遗失和重复问题。
  • position:开头对开头,结尾对结尾。
  • fertility:也可以解决翻译过程中的遗失和重复问题。

Decoding方法

0、穷举搜索(Exhausitive Search)

这种方法很容易理解,就是暴力地生成所有可能的序列,然后对每个序列进行评估,选取最优的序列。但这种方法显然是不可行的,因为要穷举的序列个数与序列长度呈指数关系,而且词汇表本身也十分巨大,所以这种方法完全无法实现。

1、祖先采样(Ancestral Sampling)

这种方法每次根据之前生成的结果得到当前生成词的一个概率分布,根据这个概率分布随机的抽取一个词作为当前时刻的生成结果。这种方法的优点在于它相比穷举要高效的多,并且是一个无偏的模型。但是缺点在于生成的结果方差很大,对于同一个句子可能每次生成的结果都不一样。

2、贪婪搜索(Greedy Search)

贪婪搜索是一种很高效并且很直观的方法。在Decoding过程中,每次的解码都根据之前的状态信息选出最优的(概率最大的)词作为当前时刻的输出,这样的方法寻求的是一种局部最优的方案,但它产生的句子却不一定是整体最优的。

3、束搜索(Beam Search)

束搜索的主要思想就是在生成序列的过程中始终维护 kkk 个最优的子序列,比如在 ttt 时刻生成了 kkk 个最优的子序列,那么每个子序列在 t+1t+1t+1 时刻又能够生成 kkk 个候选词,那模型在 t+1t+1t+1 时刻生成的子序列就是从这 k2k^2k2 个序列中选取最优的 kkk 个(也就是每次条件概率最大的 kkk 个),这样在生成过程中始终保持 kkk 个最优的序列,最后再从其中选取最好的那个作为最后的结果。

下图的例子展示了当 k=2k=2k=2 时的束搜索过程。

斯坦福CS224N学习笔记-10 机器翻译和注意力模型相关推荐

  1. 【笔记3-7】CS224N课程笔记 - 神经网络机器翻译seq2seq注意力机制

    CS224N(七)Neural Machine Translation, Seq2seq and Attention seq2seq神经网络机器翻译 历史方法 seq2seq基础 seq2seq - ...

  2. 深度学习笔记——Attention Model(注意力模型)学习总结

    深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个 ...

  3. 斯坦福CS224N学习笔记-6 依存分析

    课程内容概述 句法结构:一致性与依赖性 依存文法和Treebank 基于转移的依存分析 使用神经网络的依存分析 描述语言结构的两种方法 上下文无关文法 上下文无关文法=短语结构文法=句子成分 依存文法 ...

  4. cs224n学习笔记

    *. Tips: loga(x)log_a(x)loga​(x)在机器学习中默认为ln(x)ln(x)ln(x) 0. 主要参考: CS224n专栏 AILearners/blog/nlp/cs224 ...

  5. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  6. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  7. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...

  8. Hadoop学习笔记—10.Shuffle过程那点事儿

    Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...

  9. Linux学习笔记10

    Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...

  10. HALCON 20.11:深度学习笔记(10)---分类

    HALCON 20.11:深度学习笔记(10)---分类 HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何在训练和推理阶段使用基于深度学习的分类. 基于深度学习的分类是一种对一 ...

最新文章

  1. cocos2dxFlappyBird开发总结二:开发环境介绍
  2. 研究partner determination的逻辑能否抽出来,以API的形式被我们Odata service implementation code里调用?
  3. 中国互联网大佬江湖拼什么?拼财力拼出身拼前景拼造势
  4. EYQiPa,梦开始的地方
  5. 嘉年华回顾丨李海翔带你解密腾讯TDSQL数据库的技术与未来
  6. 35岁遭遇互联网公司无情裁员,面试屡屡碰壁,原因竟是……
  7. 计算机考试c语言真题及答案,计算机二级c语言考试试题及答案
  8. SqlServer根据表中ID加序号
  9. VS 2003/VS 2005 迅雷资源下载网址
  10. 可视化技巧:显示带colorbar的热图(matplotlib)
  11. Atitit.jquery 版本新特性attilax总结
  12. 使用内网穿透实现外网访问内网地址
  13. 无线上外网,有线上内网的方式(转)
  14. 手机端rem布局详解(淘宝无限适配)
  15. 学习 Linux 有哪些好处?
  16. Tungsten Fabric SDN — 与 Kubernetes 的集成部署(CN)
  17. SLAM论文粗译:3D Mapping with an RGB-D Camera
  18. 性能功能LocustJmeter LoadRunner优缺点
  19. solar2lunar 实现农历、天干地支
  20. pytorch的使用:卷积神经网络模块

热门文章

  1. python乒乓球比赛规则介绍_乒乓球比赛规则及赛制
  2. 线性代数学习笔记(二)——n阶行列式
  3. 2 月份看了 17 本书,我只推荐这 8 本!
  4. 2020春节假期延长至正月初九(2月2日)
  5. matlab 柯西黎曼方程,柯西-黎曼方程
  6. 使用JS获取当前地理位置方法汇总
  7. 英语汉语对比学习:名词(一)
  8. CPE/CPA/CPL/CPC/CPM/CPO/CPS/CPV/CPT/CPP广告
  9. 脉歌蓝牙耳机线评测_以腔调和功能取胜 脉歌TX90运动挂脖式蓝牙耳机评测
  10. asp.net实现一个简易购物车功能。