Stanford CS224n 第十讲:神经机器翻译和注意力模型

目录:

1. 神经机器翻译模型(NMT)的四大成功之处

2.多语言翻译模型

  • 多语言翻译模型的发展
  • Google提出的多语言翻译模型

3. Attention机制在神经机器翻译中的应用

4.翻译模型解码器的三种策略

  • 祖先抽样(Ancestral Sampling)
  • 贪婪搜索(Greedy Search)
  • 集束搜索(Beam Search)
    \newline
    \newline

上一节课中我们已经讲解了传统的机器翻译模型和基于RNN的神经机器翻译模型,所以这一节课前面的部分就不再赘述。

1. 神经机器翻译模型(NMT)的四大成功之处
2014年来,神经机器翻译的发展趋势远远超过了传统的机器翻译模型,那么其中的原因是什么呢?
在这里插入图片描述
(1)End-to-End Training。端到端的训练方式(此处详解),一个损失函数就可以同时训练模型的所有参数。我个人理解是由于神经网络的强大拟合学习能力才成就了端到端的模型,使人们能够不用经历苦逼的特征工程,而是将raw数据直接扔给神经网络,利用这个强大的黑盒直接得到结果。

(2)Distributed Representation。分布式表示,其实和one-hot向量来理解更容易一些,如果我们采用one-hot向量来表示数据中的某个单词(维度为字典大小),那么我们根本不能刻画两个单词的相关性,因为他们的内积都为0;而如果我们采用低维的分布式向量来表示一个单词,即低维空间中每个维度都有一定的数值代表其在这个维度的特征的重要程度,由于我们把每个单词的特征都分散到了各个维度,那么我们就可以衡量两个单词或者词组的相关性。

(3)Better exploitation of context。神经机器翻译模型能够更好的利用上下文;传统的机器翻译模型比如4-garam,5-garam,只能利用部分信息。

(4)More fluent text generation。神经机器翻译模型能够生成流畅的翻译文本(即使翻译的效果很差),我觉得还是由于神经网络强大的拟合学习能力,给他足够的数据,他就能学习到一些语法知识,让翻译文本更加流畅。而传统的机器翻译模型需要人为的去定义好多语法规则,让模型去学习,这很低效且不如神经网络方便、傻瓜式。

2.多语言翻译模型

  • 多语言翻译模型的发展

(这一部分我觉得Christopher老师讲的和亚裔小姐姐讲的没有衔接,感觉两个人讲的完全是两个技巧,但是Christopher老师讲的技巧要比小姐姐讲的low啊,纯属个人理解)
前面我们一直在介绍一对一的翻译模型,那么我们如何实现多语言翻译模型呢?
(1)刚开始的时候人们仍然采用一对一模型,只不过面对多少个源语言-目标语言对儿,就训练多少个encoder-decoder对儿,如下图所示。比如80中语言互相翻译,我们就需要训练80*79个模型(简直吓人)。
在这里插入图片描述
(2)后来人们又尝试去采用一对多模式(多种语言共享一个编码器,构建多个解码器)和多对一模式(构架多个编码器,共享一个解码器),如下图所示:
在这里插入图片描述
(3)后面Christopher老师提到了采用‘桥接’技术,就是不管有多少种语言对,先将源语言翻译成一种中间语言(比如英语),然后再将中间语言翻译成目标语言。这样就减少了了模型的训练量。比如我们有80种语言需要互相翻译,那我们就可以训练80个编码器和80个解码器(除去转换过程中英文的解码和编码器)。

  • Google提出的多语言翻译模型

最后,课程中漂亮的亚裔小姐姐介绍了Google是如何来实现多语言翻译的(参考论文在此)。框架如下:
在这里插入图片描述

Google的模型和普通的NMT模型没啥区别,但是他们对于不同的语言,即共享encoder,又共享decoder。如果两个都共享,他们怎么区分语言呢?此时他们就采用了一个小tric,解决了大问题—在源语言前加标签,简直666:
在这里插入图片描述
课程中讲,Google这个模型还有以下优点:

  • 模型简单,仅仅一对encod-decoder就解决了多语言的翻译问题。
  • 对于训练数据比较少的语言对(源语言-目标语言),和其他训练数据多的语言对一起训练,训练数据少的语言对也能获得不错的翻译结果,根据模型分析,可能是他们共享同一个encoder-decoder参数。
  • 该模型还有zero-shot的翻译功能,即他可以翻译训练过程中没有遇到的语言对。例如我们训练了,葡萄牙语→英语、英语→西班牙语,那么我们就可以得到翻译质量不错的葡萄牙语→西班牙语。

3. Attention机制在神经机器翻译中的应用
在普通的encoder-decoder模型中,我们通过编码器将源语言压缩到一个向量Y中,然后将Y作为解码器的输入,但是在语句过长时面临一个问题,那就是可能解码过程中,某个时刻解码器不知道该翻译源语言中对应的哪一部分内容,因此提出了attention机制。
在这里插入图片描述
attention机制其实和传统的机器翻译模型中的分配对齐过程类似,就是将要翻译的内容和源语言中的一些部分对应起来。

  • 下面我们来看看attention机制是怎么样起作用的:
    (1)通过解码器中上一时刻传入的隐向量 h t − 1 h_{t-1} ht1和编码器中每个单词输出的隐向量通过某种计算方式,计算得分(其实就是相关性)
    在这里插入图片描述
    (2)对(1)中计算的得分进行归一化,其实就是将其转化为0-1之间的概率值,用来刻画相关性。
    在这里插入图片描述
    (3)通过计算到了 h t − 1 h_{t-1} ht1与源语言中各个隐向量的相关性 a t a_t at,将源语言的隐向量以 a t a_t at为权重,进行加权求和,得到 c t c_t ct
    在这里插入图片描述
    这样就可以不简单的使用一个隐层状态Y作为全部的语义表示了,而是用到了编码器全部隐状态的全部信息。

  • 具体score的计算方式,课程中计算了以下三种:
    在这里插入图片描述
    课程中比较了三种方法:
    (1)直接将解码器某时刻的隐向量 h t h_t ht与编码器的每个单词的隐向量进行点积。
    (2)在(1)的基础上加了一个attention矩阵,充分考虑了 h t h_t ht h s h_s hs的交叉影响, W a W_a Wa需要模型学习其参数。其实我觉得这个计算socre的公式很像度量学习,即 W a W_a Wa是一个计算两者相似度的一个度量,考虑到了各个方面的交叉影响而计算的相似度,感兴趣的可以去看看度量学习(Metric Learning)
    (3)简单的拼接 h t h_t ht h s h_s hs,接 h t h_t ht h s h_s hs没有产生交叉影响;然后经过一层的神经网络也不会有很好的拟合,所以这个方法也没(2)好。

  • 局部attention的使用
    如果句子过长,在计算attention的过程中会产生很大的开销,因此发明了局部attention机制,如下图所示:
    在这里插入图片描述

-attention机制在实际应用中的效果:
在这里插入图片描述
由上图我们可以明显看出,LSTM在30个词内的翻译效果还是不错的,说明LSTM的记忆力极限可能是30个词左右。句子长度增加超过30个词后,attention机制的模型表现不错,而且稳定。

4.翻译模型解码器的三种策略
当decoder进行解码时,目的是每个单词的候选集中选出来一句翻译质量最好的,但是如果采用穷举法的话,就会造成指数级的计算量,是不可行的。那么下面我们就来看看有什么方法可以解决这个问题。

  • 祖先抽样(Ancestral Sampling)
    其实就是以t时刻前面所有的词为条件的概率分布里面,选取t时刻的单词,一直重复这样的过程,直到最后一个单词选取完毕。
    虽然此方法比穷举法节省时间,但是此方法是按照概率随机讯取得单词,因此,同一个句子可能会得到不同的翻译,所以这个方法out。
    在这里插入图片描述
  • 贪婪搜索(Greedy Search)
    贪婪搜索,顾名思义就是在每一次选取单词的时候都根据目前条件概率选取概率最大的,其实就是和祖先抽样在决策的时候不一样了。祖先抽样是在遵循条件概率的情况下随机抽取,而贪婪搜索实在遵循条件概率的情况下选择概率最大的。
    虽然这样在时间和空间上都很有效率,但是这面临着贪婪搜索的通病(缺点),可能得不到全局的最优解。
    在这里插入图片描述
  • 集束搜索(Beam Search)
    在这里插入图片描述
    不要看他公式写的天花乱坠,其实就是每个t时刻,针对这个时刻所有的可能单词,选取k的概率最大的单词,k就是beam size。此处有具体例子的详细过程
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

步骤七:回溯得到翻译结果
在这里插入图片描述

-三种策略的对比实验结果
在这里插入图片描述
明显beam search实验效果更好一些,目前也是用的最多的。
课程中讲到K的值在比较小的时候翻译性能是随着k增大而增大的,但是当到达一个临界点时,由于过度的探索可能导致翻译性能下降,而且模型效率会是k的平方级别下降。

去年,谷歌发布了 Google Neural Machine Translation (GNMT),即谷歌神经机器翻译,一个 sequence-to-sequence (“seq2seq”) 的模型。现在,它已经用于谷歌翻译的产品系统。   虽然消费者感受到的提升并不十分明显,谷歌宣称,GNMT 对翻译质量带来了巨大飞跃。   但谷歌想做的显然不止于此。其在官方博客表示:“由于外部研究人员无法获取训练这些模型的框架,GNMT 的影响力受到了束缚。”   如何把该技术的影响力最大化?答案只有一个——开源。   因而,谷歌于昨晚发布了 tf-seq2seq —— 基于 TensorFlow 的 seq2seq 框架。谷歌表示,它使开发者试验 seq2seq 模型变得更方便,更容易达到一流的效果。另外,tf-seq2seq 的代码库很干净并且模块化,保留了全部的测试覆盖,并把所有功能写入文件。   该框架支持标准 seq2seq 模型的多种配置,比如编码器/解码器的深度、注意力机制(attention mechanism)、RNN 单元类型以及 beam size。这样的多功能性,能帮助研究人员找到最优的超参数,也使它超过了其他框架。详情请参考谷歌论文《Massive Exploration of Neural Machine Translation Architectures》。   上图所示,是一个从中文到英文的 seq2seq 翻译模型。每一个时间步骤,编码器接收一个汉字以及它的上一个状态(黑色箭头),然后生成输出矢量(蓝色箭头)。下一步,解码器一个词一个词地生成英语翻译。在每一个时间步骤,解码器接收上一个字词、上一个状态、所有编码器的加权输出和,以生成下一个英语词汇。雷锋网(公众号:雷锋网)提醒,在谷歌的执行中,他们使用 wordpieces 来处理生僻字词。   据雷锋网了解,除了机器翻译,tf-seq2seq 还能被应用到其他 sequence-to-sequence 任务上;即任何给定输入顺序、需要学习输出顺序的任务。这包括 machine summarization、图像抓取、语音识别、对话建模。谷歌自承,在设计该框架时可以说是十分地仔细,才能维持这个层次的广适性,并提供人性化的教程、预处理数据以及其他的机器翻译功能。   谷歌在博客表示: “我们希望,你会用 tf-seq2seq 来加速(或起步)你的深度学习研究。我们欢迎你对 GitHub 资源库的贡献。有一系列公开的问题需要你的帮助!”   GitHub 地址:https://github.com/google/seq2seq   GitHub 资源库:https://google.github.io/seq2seq/nmt/ 标签:tensorflow  seq2seq  谷歌  机器学习
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值