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

课程内容概述

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

神经机器翻译(NMT)

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

神经机器翻译的架构

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

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

在这里插入图片描述
当使用Encoder获得包含整个源序列信息的编码 Y Y Y 之后,应该怎样在Decoder中使用这个 Y Y Y 呢?

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

在这里插入图片描述
另一种方法是将 Y Y Y 作为Decoder中每一时刻状态的输入,也就是每个状态的输入有两个,分别是上一个单词和 Y Y Y 。其结构如图所示。
在这里插入图片描述
所以对于这种结构,每次时序转换的过程就是: z t = f ( z t − 1 , x t , Y ) z_t=f(z_{t-1},x_{t},Y) zt=f(zt1,xt,Y),当然反向传播时 Y Y Y 的梯度为: ∑ t ∂ z t ∂ Y \sum_t \frac{\partial z_t}{\partial Y} tYzt

这种方法使得每个时刻都能接收这个输入 Y Y Y,所以就无须在整个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的最后一个隐层状态 Y Y Y 作为Decoder最初状态的输入,然而这样的方法并不利于处理长序列的语义。机器翻译系统中引入注意力机制可以改善这个问题。

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

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

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

在计算完每个隐层状态 h i h_i hi 的分数 e i j e_{ij} eij 后,使用 s o f t m a x softmax softmax 归一化得到各个状态的权重 a i j a_{ij} aij,然后用这些权重乘上对应的 h i h_i hi 再相加,得到一个上下文向量 c j c_j cj 作为解码器当前时刻的输入。即:
a i j = e x p ( e i j ) ∑ k = 0 T e x p ( e k j ) a_{ij}=\frac{exp(e_{ij})}{\sum_{k=0}^{T}exp(e_{kj})} aij=k=0Texp(ekj)exp(eij) c j = ∑ i = 0 T a i j h i c_{j}=\sum_{i=0}^{T}a_{ij}h_{i} cj=i=0Taijhi s j = f ( y j − 1 , s j − 1 , c j ) s_j=f(y_{j-1}, s_{j-1}, c_j) sj=f(yj1,sj1,cj)

实验效果

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

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

更多改进

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

Decoding方法

0、穷举搜索(Exhausitive Search)

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

1、祖先采样(Ancestral Sampling)

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

2、贪婪搜索(Greedy Search)

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

3、束搜索(Beam Search)

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

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

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值