摘要
近来提出的完全基于神经网络的神经机器翻译,相比于传统方法比如基于短语的统计机器翻译,取得了令人满意的成绩。但是在神经机器翻译对词表的大小有限制,随着词表的增大,训练的复杂度以及解码的复杂度都会相应增大。本文提出了一种基于重要性采样的方法,可以在不加大训练复杂度的情况下,使用非常大的目标词表。通过选择目标词表的一个较小的子集,较大目标词表的解码的效率也可以有效的提高。通过这种方法训练的模型,追平甚至在某些情况下超过了小词表的基准模型和基于LSTM的模型。并且,通过组合若干个使用了较大词表的模型,在WMT’14的英文到德文以及英文到法文的任务上,我们的模型相对于目前最先进的模型取得了进展(BLEU方式)。
1.简介
神经机器翻译(NMT)是近来提出的一种机器翻译的方法(Kalchbrenner and Blunsom,2013;Bahdanauet al., 2014;Sutskever et al., 2014)。按神经机器翻译的方法,研究者构建一个神经网络,输入为一条源语句,输出为输入对应的翻译语句。神经网络的训练目标是最大话给定源语句条件下目标语句的条件概率。
相比目前的统计翻译模型,特别是基于短语的统计翻译模型(Koehn et al., 2003),神经机器翻译有很多优点。首先,NMT需要极少领域知识。比如(Sutskever et al.,2014), (Bahdanau et al., 2014) or (Kalchbrenner and Blunsom, 2013) 提出的所有模型,都不需要假定源语句和目标语句的任何语言学特征,只要求他们是单词序列。第二,整个系统的训练目标是优化翻译的效果,不像基于短语的统计翻译模型,它们包含了很多特征函数,需要单独进行优化。最后,NMT的内存占用通常远小于目前的系统。
虽然有这些优点和令人满意的效果,NMT相对于传统方法,有一个主要的限制。就是目标词汇的数量的限制。主要是因为随着目标词汇量的增大,NMT模型的训练和使用的复杂度会相应的增大。
通常的做法是构建一个最常用的词汇组成的词汇表(称为shortlist),词表的大小通常在30,000((Bahdanau et al., 2014)到80,000(Sutskever et al., 2014).不在词表内的单词全部用[UNK]表示(未知词)。在未知词较少时,这种方式的效果还可以,但是随着未知词数量的增多,翻译的效果先显著的下降(Cho et al., 2014a; Bahdanau etal., 2014)。
本文提出了一种基于(有偏)重要性采样的方法,使NMT在较大的目标词表上训练,并且保持训练的计算复杂度不变。当模型训练完成后,可以选在在全部的大词汇表上使用,也可以选择在词表的子集上使用。
2.神经机器翻译与有限词表问题
本节我们基于(Bahdanau et al., 2014)提出的神经机器翻译模型,来解释一下有限词表的问题
2.1 神经机器翻译
神经机器翻译是近来提出的一种基于神经网络的机器翻译方法,神经网络的训练目标是优化翻译效果(Forcada and Neco, 1997; Kalchbrenner and Blunsom, 2013; Cho etal.,2014b;Sutskever et al., 2014; Bahdanau et al.,2014).
神经机器翻译使用的神经网络通常是一种称为编码器-解码器的网络结构。编码器读入源语句
x
=
(
x
1
,
x
2
,
.
.
.
,
x
T
)
x=(x_1, x_2, ..., x_T)
x = ( x 1 , x 2 , . . . , x T ) 并编码生成中间状态序列
h
=
(
h
1
,
h
2
,
.
.
.
,
h
T
)
h=(h_1, h_2, ..., h_T)
h = ( h 1 , h 2 , . . . , h T ) :
h
t
=
f
(
x
t
,
h
t
−
1
)
(
1
)
h_t=f(x_t, h_{t-1})\qquad(1)
h t = f ( x t , h t − 1 ) ( 1 )
然后,解码器,另一个RNN,基于隐藏序列产生对应的翻译
y
=
(
y
1
,
y
2
,
.
.
.
,
y
T
′
)
y=(y_1, y_2, ..., y_{T'})
y = ( y 1 , y 2 , . . . , y T ′ ) :
p
(
y
t
∣
y
<
t
,
x
)
∝
e
x
p
{
q
(
y
t
−
1
,
z
t
,
c
t
)
}
(
2
)
p(y_t|y_{<t,x})\varpropto exp\{q(y_{t-1}, z_t, c_t)\}\qquad(2)
p ( y t ∣ y < t , x ) ∝ e x p { q ( y t − 1 , z t , c t ) } ( 2 )
其中:
z
t
=
g
(
y
t
−
1
,
z
t
−
1
,
c
t
)
(
3
)
z_t=g(y_{t-1},z_{t-1},c_t)\qquad(3)
z t = g ( y t − 1 , z t − 1 , c t ) ( 3 )
c
t
=
r
(
z
t
−
1
,
h
1
,
.
.
.
,
h
T
)
(
4
)
c_t=r(z_{t-1},h_1,...,h_T)\qquad(4)
c t = r ( z t − 1 , h 1 , . . . , h T ) ( 4 )
其中
y
<
t
=
(
y
1
,
y
2
,
.
.
.
,
y
t
−
1
)
y_{<t}=(y_1,y_2,...,y_{t-1})
y < t = ( y 1 , y 2 , . . . , y t − 1 ) .
模型的训练目标是最大化给定源语句的情况下目标语句的条件概率:
θ
∗
=
a
r
g
m
a
x
θ
∑
n
=
1
N
∑
t
=
1
T
n
l
o
g
p
(
y
t
n
∣
y
<
t
n
,
x
n
)
\theta^*=argmax_{\theta}\sum_{n=1}^{N}\sum_{t=1}^{T_n}logp(y_t^n|y_{<t}^n,x^n)
θ ∗ = a r g m a x θ n = 1 ∑ N t = 1 ∑ T n l o g p ( y t n ∣ y < t n , x n )
其中
(
x
n
,
y
n
)
(x^n, y^n)
( x n , y n ) 是第n个训练样本。
2.1.1 模型细节
本文采用的模型引入了一种称为注意力机制的模型(Bahdanau etal., 2014)。
(Bahdanau et al., 2014)的解码器中,中间隐状态的生成采用了双向RNN结构:
h
t
=
[
h
t
←
,
h
t
→
]
h_t=[\overleftarrow{h_t}, \overrightarrow{h_t}]
h t = [ h t
, h t
]
其中:
h
t
←
=
f
(
x
t
,
h
t
+
1
←
)
\overleftarrow{h_t}=f(x_t, \overleftarrow{h_{t+1}})
h t
= f ( x t , h t + 1
)
h
t
→
=
f
(
x
t
,
h
t
−
1
→
)
\overrightarrow{h_t}=f(x_t, \overrightarrow{h_{t-1}})
h t
= f ( x t , h t − 1
)
其中函数f采用了GRU(gated recurrent unit)网络。
解码器中,环境向量
c
t
c_t
c t 隐状态序列
(
h
1
,
h
2
,
.
.
.
,
h
T
)
(h_1, h_2, ..., h_T)
( h 1 , h 2 , . . . , h T ) 的加权和,权重为
(
α
1
,
.
.
.
,
α
T
)
(\alpha_1,...,\alpha_T)
( α 1 , . . . , α T ) :
α
t
=
e
x
p
{
a
(
h
t
,
z
t
−
1
)
}
∑
k
e
x
p
{
a
(
h
k
,
z
t
−
1
)
}
\alpha_t=\frac{exp\{a(h_t, z_{t-1})\}}{\sum_kexp\{a(h_k,z_{t-1})\}}
α t = ∑ k e x p { a ( h k , z t − 1 ) } e x p { a ( h t , z t − 1 ) }
其中a为前向神经网络。
解码器中新的隐状态
z
t
z_t
z t 基于前隐状态
z
t
−
1
z_{t-1}
z t − 1 ,前输出符号
y
t
−
1
y_{t-1}
y t − 1 以及当前环境向量
c
t
c_t
c t ,同样使用了GRU结构。
下一目标单词的概率计算方式为:
p
(
y
t
∣
y
<
t
,
x
)
=
1
Z
e
x
p
{
w
t
⊤
ϕ
(
y
t
−
1
,
z
t
,
c
t
)
+
b
t
}
(
6
)
p(y_t|y_{<t}, x)=\frac{1}{Z}exp\{\textbf{w}_t^\top\phi(y_{t-1}, z_t, c_t)+b_t\} \qquad (6)
p ( y t ∣ y < t , x ) = Z 1 e x p { w t ⊤ ϕ ( y t − 1 , z t , c t ) + b t } ( 6 )
其中
ϕ
\phi
ϕ 为仿射变换,
w
t
,
b
t
\textbf{w}_t,b_t
w t , b t 分别为目标词向量和目标词偏移。
Z
Z
Z 表示归一化常量,计算方式为:
Z
=
∑
k
:
y
k
∈
V
e
x
p
{
w
k
⊤
ϕ
(
y
t
−
1
,
z
t
,
c
t
)
+
b
k
}
Z=\sum_{k:y_k\in V}exp\{\textbf{w}_k^\top \phi(y_{t-1}, z_t, c_t) + b_k\}
Z = k : y k ∈ V ∑ e x p { w k ⊤ ϕ ( y t − 1 , z t , c t ) + b k }
其中
V
V
V 表示目标词的组成的集合。
2.2 有限词表问题和传统解决办法
NMT模型的主要困难来自方程式(6),在计算条件概率的时候,我们需要将特征
ϕ
(
y
t
−
1
,
z
t
,
c
t
)
\phi(y_{t-1},z_t,c_t)
ϕ ( y t − 1 , z t , c t ) 与目标词表内的每个词的词向量
w
t
\textbf{w}_t
w t 相乘。随着词表的增大,计算复杂度和需要的内存都相应的增大。
新近提出的模型,按照词频排序将最常出现的30,000到80,000常用词作为目标词表,称为shortlist(Bahdanau et al., 2014;Sutskever et al., 2014)。降低的计算复杂度,但同时也引入了新的问题。首先,但目标词表内不包含翻译源语言所需的必要词汇的时候,模型的效果会极大下降。其次,对于词汇量很丰富的语言,比如德语,这种方法不适用。
目前有两种模型专用的解决办法。第一种方法是近似计算目标词概率。由(Mnih and Kavukcuoglu, 2013; Mikolov et al.,2013)提出,基于噪音对比估计(Gutmann and Hyvarinen, 2010)。第二种方法将目标词进行聚类层若干种类,或进行层次聚类,目标词的概率
p
(
y
t
∣
y
<
t
,
x
)
p(y_t|y_{<t},x)
p ( y t ∣ y < t , x ) 分解为类概率
p
(
c
t
∣
y
t
−
1
,
x
)
p(c_t|y_{t-1},x)
p ( c t ∣ y t − 1 , x ) 和类中概率
p
(
y
t
∣
c
t
,
y
t
−
1
,
x
)
p(y_t|c_t, y_{t-1},x)
p ( y t ∣ c t , y t − 1 , x ) 乘积.这些方法主要目标是降低训练的计算复杂度,并不会加速使用阶段的效率。
除了这些模型专用的方法,还有一些翻译专用的方法。有一种翻译专用的方法利用了稀有目标词的特点。((Luong et al., 2014)提出了一种这类方法。他们将源码语言和目标语言的稀有词(不在词表内的)替换为对应的
<
O
O
V
n
>
<OOV_n>
< O O V n > token.
3 较大目标词表的近似学习方法
本文提出了一种模型专用的方法,将训练复杂度降低为常量级别,不再随目标词表的增大而增大。并且,因为有效降低了模型的内存占用,我们可以使用GPU进行模型训练。
正如前文的阐述,模型的主要计算复杂度来自公式(6)。为了避免这种计算复杂度,我们每次只在目标词表
V
V
V 的一个子集
V
′
V'
V ′ 上计算。我们的工作基于(Bengio and Sen´ ecal, 2008)的早期工作。
我们来考虑公式(6)的梯度,它有一个正数和一个负数部门组成:
∇
l
o
g
p
(
y
t
∣
y
t
−
1
,
x
)
\nabla logp(y_t|y_{t-1},x)
∇ l o g p ( y t ∣ y t − 1 , x )
=
∇
ε
(
y
t
)
−
∑
k
:
y
k
∈
V
p
(
y
k
∣
y
<
t
,
x
)
∇
ε
(
y
k
)
=\nabla\varepsilon(y_t)-\sum_{k:y_k\in V}p(y_k|y_{<t},x)\nabla\varepsilon(y_k)
= ∇ ε ( y t ) − k : y k ∈ V ∑ p ( y k ∣ y < t , x ) ∇ ε ( y k )
其中我们定义能力函数
ε
\varepsilon
ε 为:
ε
(
y
i
)
=
w
j
⊤
ϕ
(
y
j
−
1
,
z
j
,
c
j
)
+
b
j
\varepsilon(y_i)=\textbf{w}_j^\top\phi(y_{j-1},z_j,c_j)+b_j
ε ( y i ) = w j ⊤ ϕ ( y j − 1 , z j , c j ) + b j .
可以看出第二项本质上是能量梯度的期望:
E
P
[
∇
ε
(
y
k
)
]
E_P[\nabla\varepsilon(y_k)]
E P [ ∇ ε ( y k ) ]
其中P表示分布
p
(
y
∣
y
<
t
,
x
)
p(y|y_{<t},x)
p ( y ∣ y < t , x ) . 本文提出的方法的核心思想,就是通过重要性采样来近似计算此期望值。给定分布Q和样本子集
V
′
V'
V ′ ,近似计算的方式为:
E
P
[
∇
ε
(
y
)
]
=
∑
k
:
y
k
∈
V
′
ω
k
∑
k
′
:
y
k
′
∈
V
′
ω
k
′
∇
ε
(
y
k
)
(
10
)
E_P[\nabla\varepsilon(y)]=\sum_{k:y_k\in V'}\frac{\omega_k}{\sum_{k':y_{k'}\in V'}\omega_k'}\nabla\varepsilon(y_k)\qquad(10)
E P [ ∇ ε ( y ) ] = k : y k ∈ V ′ ∑ ∑ k ′ : y k ′ ∈ V ′ ω k ′ ω k ∇ ε ( y k ) ( 1 0 )
其中:
ω
k
=
e
x
p
{
ε
(
y
k
)
−
l
o
g
Q
(
y
k
)
}
(
11
)
\omega_{k}=exp\{\varepsilon(y_k)-logQ(y_k)\}\qquad(11)
ω k = e x p { ε ( y k ) − l o g Q ( y k ) } ( 1 1 )
这个方法是我们可以在一个很小的集合上近似计算归一化因子,极大的降低计算的复杂度。每次训练的时候,只更新目标词的词向量
w
t
\textbf{w}_t
w t 以及采样集合
V
′
V'
V ′ 中的词向量。当训练结束之后,我们可以使用目标词表的整体
V
V
V 计算目标词的概率。
此方法虽然很自然的解决了计算复杂度的问题。但简单的应用此方法,并不能很好的控制每次更新的参数的数量(译者注:每条样本包含一个源语句和一个目标语句,一个目标语句包含多个目标词,虽然针对每个目标词的采样子集V’大小变小了,但是这些多个子集的并集规模没有很好的控制)。对于使用内存容量有限的GPU设备来说,这也是一个问题。
因此,实践中,我们通常将训练语料划分为若干份,并在训练前为每一份语料预先定义好目标词表子集
V
′
V'
V ′ .训练开始前,我们顺序的检查并收集训练语料内目标语句中出现的目标词,直到目标词表大小达到预设的阈值
τ
\tau
τ 为止,我们将这时的词表作为检查过的训练语料的目标词表。重复以上的过程,直到遍历完所有的训练语料。我们将都
i
i
i 份语料的词表记为
V
i
′
V_i'
V i ′ .
可以理解为每一份语料都有一个单独的分布
Q
i
Q_i
Q i :
Q
i
(
y
k
)
=
{
1
∣
V
i
′
∣
i
f
y
k
∈
V
i
′
0
其
他
情
况
Q_i(y_k)=\left\{ \begin{aligned} \frac{1}{|V_i'|}\qquad if y_k\in V_i'\\ 0\qquad 其他情况 \end{aligned} \right.
Q i ( y k ) = ⎩ ⎪ ⎨ ⎪ ⎧ ∣ V i ′ ∣ 1 i f y k ∈ V i ′ 0 其 他 情 况
在这种分布假设下,公式(10),(11)中的重要性权重项中的
−
l
o
g
Q
(
y
k
)
-logQ(y_k)
− l o g Q ( y k ) 可以去掉。这种假设下,本文提出的近似计算概率的方法为:
p
(
y
t
∣
y
<
t
,
x
)
=
e
x
p
{
w
t
⊤
ϕ
(
y
t
−
1
,
z
t
,
c
t
)
+
b
t
}
∑
k
:
y
k
∈
V
′
e
x
p
{
w
k
⊤
ϕ
(
y
t
−
1
,
z
t
,
c
t
)
+
b
k
}
p(y_t|y_{<t},x)=\frac{exp\{\textbf{w}_t^\top\phi(y_{t-1},z_t,c_t)+b_t\}}{\sum_{k:y_k\in V'}exp\{\textbf{w}_k^\top\phi(y_{t-1},z_t,c_t)+b_k\}}
p ( y t ∣ y < t , x ) = ∑ k : y k ∈ V ′ e x p { w k ⊤ ϕ ( y t − 1 , z t , c t ) + b k } e x p { w t ⊤ ϕ ( y t − 1 , z t , c t ) + b t }
需要注意的是这种分布Q的选择导致估计有偏估计。
3.1.1 结果的非正式讨论
公式(6)可以理解为最大化最优可能的、正确的、目标词的词向量与当前隐状态向量的积。归一化的过程只是将向量的积转化为正确的概率形式。
随着训练的进行,相似目标词的向量会互相对齐。这是通过将正确目标词的词向量向
ϕ
(
y
t
−
1
,
z
t
,
c
t
)
\phi(y_{t-1},z_t,c_t)
ϕ ( y t − 1 , z t , c t ) 的方向移动,并将其他词的词向量推开实现的。在我们的近似计算方法中,则是将正确的词向量向正确的方向移动,而将采样子集V’中的词的词向量推开。
3.2 解码
当训练完成之后,我们可以使用整个目标词表进行翻译。但是这样做,对于实时应用来说,计算代价可能太大。
因为训练过程中,我们只将可能正确的词的词向量对齐解码器的隐状态向量,所以在解码阶段,我们可以使用目标词表的子集进行解码。
最简单的方式就是选择Top-K个词频最高的目标词,作为目标词表。但是这种方方式违背了我们使用大词表训练模型的初衷。另外,我们可以通过现有的词对齐模型构建一个词对齐词表。通过这个词表,为每个待翻译的语句构建一个目标词集合,由词频最高的K个词组成。并且每个源词最多对应K’个目标词。K和K’的大小,可以选择取决于计算复杂度和翻译效果的权衡。我们把这种方式构造的子集称为候选集。