赞
踩
通过构造一个大型的神经网络,以端到端的方式来训练模型,实现这个过程的系统就称为神经机器翻译系统(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(zt−1,xt,Y),当然反向传播时
Y
Y
Y 的梯度为:
∑
t
∂
z
t
∂
Y
\sum_t \frac{\partial z_t}{\partial Y}
∑t∂Y∂zt
这种方法使得每个时刻都能接收这个输入 Y Y Y,所以就无须在整个Decoder序列中一直保存它了,这种思想在之后的注意力机制中也有体现。
当然除了上述的一些优点,神经机器翻译还有很多其他的好处。比如我们无须像构造传统的机器翻译模型那样去分别构造几个组件,而是通过一个端到端的系统进行训练,而且在模型的学习过程中也不用显式地添加语义语法等规则信息,当然在之后的研究发现也可以添加一些语法信息来获得性能提升。
我们可以通过一个例句来看这些年翻译系统的发展:
例句: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解码的过程中,根据翻译的需要访问对应的源状态。这样的机制其实也隐式地建立了两种语言的词之间的对应关系(像传统的基于统计的翻译模型中的对齐过程一样)。
在Encoder编码的过程中,我们要保存中间所有过程的隐藏层状态,比如分别记为
h
0
h_0
h0 ~
h
T
h_T
hT。那么在Decoder解码的过程中,对于每个时刻
j
j
j,分别计算Decoder前一时刻的隐层状态
h
ˉ
j
−
1
\bar{h}_{j-1}
hˉj−1 与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ˉj−1)
其中
s
c
o
r
e
(
∗
)
score(*)
score(∗) 是计算分数的函数,计算分数其实可以有很多种方法,比如直接求两个状态向量的内积
h
i
T
h
ˉ
j
−
1
h_i^T\bar{h}_{j-1}
hiThˉj−1(这在某种程度上其实表示了词之间的相似度),或者将两个向量相连后输入到一个单层的神经网络当中,输出二者的分数。除此之外,斯坦福的研究人员还提出了另一种计算方法,就是在第一种方法两个向量的内积之间添加一个矩阵
W
W
W,也就是
h
i
T
W
h
ˉ
j
−
1
h_i^TW\bar{h}_{j-1}
hiTWhˉj−1 的形式,这个矩阵实际上可以学习将不同的权重分配到两个向量点积的不同部分之中。用曼宁教授的话来说,这种方式能够用很少的参数量来实现两个向量的交互,并且这种交互比两个向量单纯的点乘更加复杂。
在计算完每个隐层状态
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=0∑Taijhi
s
j
=
f
(
y
j
−
1
,
s
j
−
1
,
c
j
)
s_j=f(y_{j-1}, s_{j-1}, c_j)
sj=f(yj−1,sj−1,cj)
实验效果的对比如图所示,可以看到带有注意力机制的模型在表现上远远胜过不带注意力的模型。而且这个实验数据还表明了注意力机制的一个优点,就是对于句子长度的增长性能能够保持稳定,而对比不带注意力机制的模型,即便LSTM具有一定的记忆能力,但是一旦句子长度超过30后,模型表现就开始迅速下降。
当然,这样的模型也并不是完美无缺,它仍然会犯一些错误,比如可能将源语言中的两个同义词翻译成目标语言的同一个词(比如繁荣和昌盛这样的词)。
这种方法很容易理解,就是暴力地生成所有可能的序列,然后对每个序列进行评估,选取最优的序列。但这种方法显然是不可行的,因为要穷举的序列个数与序列长度呈指数关系,而且词汇表本身也十分巨大,所以这种方法完全无法实现。
这种方法每次根据之前生成的结果得到当前生成词的一个概率分布,根据这个概率分布随机的抽取一个词作为当前时刻的生成结果。这种方法的优点在于它相比穷举要高效的多,并且是一个无偏的模型。但是缺点在于生成的结果方差很大,对于同一个句子可能每次生成的结果都不一样。
贪婪搜索是一种很高效并且很直观的方法。在Decoding过程中,每次的解码都根据之前的状态信息选出最优的(概率最大的)词作为当前时刻的输出,这样的方法寻求的是一种局部最优的方案,但它产生的句子却不一定是整体最优的。
束搜索的主要思想就是在生成序列的过程中始终维护 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 时的束搜索过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。