Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
mtbookv2
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
NiuTrans
mtbookv2
Commits
29b196a1
Commit
29b196a1
authored
Nov 30, 2020
by
孟霞
Browse files
Options
Browse Files
Download
Plain Diff
合并分支 'mengxia' 到 'caorunzhe'
Mengxia 查看合并请求
!527
parents
026c03cc
1b387556
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
31 行增加
和
31 行删除
+31
-31
Chapter14/Figures/figure-reproduction-rate.tex
+1
-1
Chapter14/chapter14.tex
+30
-30
没有找到文件。
Chapter14/Figures/figure-reproduction-rate.tex
查看文件 @
29b196a1
...
...
@@ -27,7 +27,7 @@
\node
[font=\footnotesize,anchor=east]
(w1) at ([xshift=-0.5em]w2.west)
{
\scriptsize\textbf
{
1
}}
;
\node
[font=\footnotesize,anchor=west]
(w4) at ([xshift=0.5em]w3.east)
{
\scriptsize\textbf
{
0
}}
;
\node
[font=\footnotesize,anchor=west]
(w5) at ([xshift=0.5em]w4.east)
{
\scriptsize\textbf
{
1
}}
;
\node
[font=\footnotesize,anchor=south]
(output) at ([yshift=1em]tgt
_
sf.north)
{
\scriptsize\
textbf
{
Wir akzeptieren das voll und ganz
}}
;
\node
[font=\footnotesize,anchor=south]
(output) at ([yshift=1em]tgt
_
sf.north)
{
\scriptsize\
sffamily\bfseries
{
我们
\quad
完全
\quad
接受
\quad
它
\quad
。
}}
;
\node
[font=\footnotesize,anchor=north]
(src) at ([yshift=-1em]src
_
emb.south)
{
\scriptsize\textbf
{
We totally accept it .
}}
;
\node
[font=\footnotesize,anchor=north]
(tgt) at ([yshift=-1em]tgt
_
emb.south)
{
\scriptsize\textbf
{
We totally accept accept .
}}
;
...
...
Chapter14/chapter14.tex
查看文件 @
29b196a1
...
...
@@ -141,7 +141,7 @@
\subsection
{
译文长度控制
}
\parinterval
机器翻译推断的一个特点是译文长度需要额外的机制进行控制
\upcite
{
Kikuchi2016ControllingOL,Takase2019PositionalET,Murray2018CorrectingLB,Sountsov2016LengthBI
}
。这是因为机器翻译在建模时仅考虑了将训练样本(即标准答案)上的损失最小化,但是推断的时候会看到从未见过的样本,而且这些未见样本占据了样本空间的绝大多数。这时,模型会产生偏置,即模型仅仅能够对见过的样本进行准确建模,而对于未见样本的建模并不准确。该问题导致的一个现象是:直接使用训练好的模型会翻译出长度短的离谱的译文。由于神经机器翻译模型使用单词概率的乘积表示整个句子的翻译概率,它天然就倾向生成短译文,因为短译文会使用更少的概率因式相乘。在使用极大似然估计进行模型训练时,这个问题会更加严重,因为模型只关心每个目标语位置
的正确预测,对于译文长度没有考虑。译文长度不合理的问题也出现在统计机器翻译模型中,当时的策略是在推断过程中引入译文长度控制机制
\upcite
{
Koehn2007Moses
}
。神经机器翻译也借用了类似的思想来控制译文长度,有
几种的方法:
\parinterval
机器翻译推断的一个特点是译文长度需要额外的机制进行控制
\upcite
{
Kikuchi2016ControllingOL,Takase2019PositionalET,Murray2018CorrectingLB,Sountsov2016LengthBI
}
。这是因为机器翻译在建模时仅考虑了将训练样本(即标准答案)上的损失最小化,但是推断的时候会看到从未见过的样本,而且这些未见样本占据了样本空间的绝大多数。这时,模型会产生偏置,即模型仅仅能够对见过的样本进行准确建模,而对于未见样本的建模并不准确。该问题导致的一个现象是:直接使用训练好的模型会翻译出长度短的离谱的译文。由于神经机器翻译模型使用单词概率的乘积表示整个句子的翻译概率,它天然就倾向生成短译文,因为短译文会使用更少的概率因式相乘。在使用极大似然估计进行模型训练时,这个问题会更加严重,因为模型只关心每个目标语位置
是否被正确预测,对于译文长度没有考虑。译文长度不合理的问题也出现在统计机器翻译模型中,当时的策略是在推断过程中引入译文长度控制机制
\upcite
{
Koehn2007Moses
}
。神经机器翻译也借用了类似的思想来控制译文长度,有以下
几种的方法:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -152,7 +152,7 @@
\label
{
eq:14-12
}
\end{eqnarray}
通常
$
\textrm
{
lp
}
(
\seq
{
y
}
)
$
随
$
\vert\seq
{
y
}
\vert
$
的增大而增大,因此这种方式相当于对
$
\log
\funp
{
P
}
(
\seq
{
y
}
\vert\seq
{
x
}
)
$
按长度进行归一化
\upcite
{
Jean2015MontrealNM
}
。
$
\textrm
{
lp
}
(
\seq
{
y
}
)
$
的定义方式
很多,比如表
\ref
{
tab:14-1
}
就
列出了一些常用的形式,其中
$
\alpha
$
是需要人为设置的参数。
通常
$
\textrm
{
lp
}
(
\seq
{
y
}
)
$
随
$
\vert\seq
{
y
}
\vert
$
的增大而增大,因此这种方式相当于对
$
\log
\funp
{
P
}
(
\seq
{
y
}
\vert\seq
{
x
}
)
$
按长度进行归一化
\upcite
{
Jean2015MontrealNM
}
。
$
\textrm
{
lp
}
(
\seq
{
y
}
)
$
的定义方式
有很多,表
\ref
{
tab:14-1
}
列出了一些常用的形式,其中
$
\alpha
$
是需要人为设置的参数。
%----------------------------------------------------------------------------------------------------
\begin{table}
[htp]
...
...
@@ -170,14 +170,14 @@
\end{table}
%----------------------------------------------------------------------------------------------------
\vspace
{
0.5em
}
\item
译文长度范围约束。为了让译文的长度落在合理的范围
,神经机器翻译的推断也会有
一个译文长度约束
\upcite
{
Vaswani2018Tensor2TensorFN,KleinOpenNMT
}
。令
$
[
a,b
]
$
表示一个长度范围,可以定义:
\item
译文长度范围约束。为了让译文的长度落在合理的范围
内,神经机器翻译的推断也会设置
一个译文长度约束
\upcite
{
Vaswani2018Tensor2TensorFN,KleinOpenNMT
}
。令
$
[
a,b
]
$
表示一个长度范围,可以定义:
\begin{eqnarray}
a
&
=
&
\omega
_{
\textrm
{
low
}}
\cdot
|
\seq
{
x
}
|
\label
{
eq:14-3
}
\\
b
&
=
&
\omega
_{
\textrm
{
high
}}
\cdot
|
\seq
{
x
}
|
\label
{
eq:14-4
}
\end{eqnarray}
\vspace
{
0.5em
}
\noindent
其中,
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
分别是表示译文长度的下限和上限的参数,比如,很多系统中
有
$
\omega
_{
\textrm
{
low
}}
=
1
/
2
$
,
$
\omega
_{
\textrm
{
high
}}
=
2
$
,表示译文至少有源语言句子一半长,最多有源语言句子两倍长。
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
的设置对推断效率影响很大,
$
\omega
_{
\textrm
{
high
}}$
可以被看作是一个推断的终止条件,最理想的情况是
$
\omega
_{
\textrm
{
high
}}
\cdot
|
\seq
{
x
}
|
$
恰巧就等于最佳译文的长度,这时没有任何计算的浪费。反过来的一种情况,
$
\omega
_{
\textrm
{
high
}}
\cdot
|
\seq
{
x
}
|
$
远大于最佳译文的长度,这时很多计算都是无用的。为了找到长度预测的准确率和召回率之间的平衡,一般需要大量的实验最终确定
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
。当然,利用统计模型预测
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
也是非常值得探索的方向,比如基于产出率的模型
\upcite
{
Gu2017NonAutoregressiveNM,Feng2016ImprovingAM
}
。
\noindent
其中,
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
分别是表示译文长度的下限和上限的参数,比如,很多系统中
设置为
$
\omega
_{
\textrm
{
low
}}
=
1
/
2
$
,
$
\omega
_{
\textrm
{
high
}}
=
2
$
,表示译文至少有源语言句子一半长,最多有源语言句子两倍长。
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
的设置对推断效率影响很大,
$
\omega
_{
\textrm
{
high
}}$
可以被看作是一个推断的终止条件,最理想的情况是
$
\omega
_{
\textrm
{
high
}}
\cdot
|
\seq
{
x
}
|
$
恰巧就等于最佳译文的长度,这时没有任何计算的浪费。反过来的一种情况,
$
\omega
_{
\textrm
{
high
}}
\cdot
|
\seq
{
x
}
|
$
远大于最佳译文的长度,这时很多计算都是无用的。为了找到长度预测的准确率和召回率之间的平衡,一般需要大量的实验最终确定
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
。当然,利用统计模型预测
$
\omega
_{
\textrm
{
low
}}$
和
$
\omega
_{
\textrm
{
high
}}$
也是非常值得探索的方向,比如基于产出率的模型
\upcite
{
Gu2017NonAutoregressiveNM,Feng2016ImprovingAM
}
。
\vspace
{
0.5em
}
\item
覆盖度模型。译文长度过长或过短的问题,本质上对应着
{
\small\sffamily\bfseries
{
过翻译
}}
\index
{
过翻译
}
(Over Translation)
\index
{
Over Translation
}
和
{
\small\sffamily\bfseries
{
欠翻译
}}
\index
{
欠翻译
}
(Under Translation)
\index
{
Under Translation
}
的问题
\upcite
{
Yang2018OtemUtemOA
}
。这两种问题出现的原因主要在于:神经机器翻译没有对过翻译和欠翻译建模,即机器翻译覆盖度问题
\upcite
{
TuModeling
}
。针对此问题,最常用的方法是在推断的过程中引入一个度量覆盖度的模型。比如,使用GNMT 覆盖度模型
\upcite
{
Wu2016GooglesNM
}
,其中翻译模型得分被定义为:
\begin{eqnarray}
...
...
@@ -185,7 +185,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\textrm
{
cp
}
(
\seq
{
x
}
,
\seq
{
y
}
)
&
=
&
\beta
\cdot
\sum
_{
i=1
}^{
|
\seq
{
x
}
|
}
\log
(
\textrm
{
min
}
(
\sum
_{
j
}^{
|
\seq
{
y
}
|
}
a
_{
ij
}
, 1))
\label
{
eq:14-6
}
\end{eqnarray}
\noindent
其中,
$
\textrm
{
cp
}
(
\seq
{
x
}
,
\seq
{
y
}
)
$
表示覆盖度模型,它度量了译文对源语言每个单词的覆盖程度。
$
\textrm
{
cp
}
(
\seq
{
x
}
,
\seq
{
y
}
)
$
的定义中,
$
a
_{
ij
}$
表示源语言第
$
i
$
个位置与目标语第
$
j
$
个位置的注意力权重,这样
$
\sum
\limits
_{
j
}^{
|
\seq
{
y
}
|
}
a
_{
ij
}$
就可以
被当作是
源语言第
$
i
$
个单词被翻译了“多少”,如果它大于1,表明翻译多了;如果小于1,表明翻译少了。公式
\eqref
{
eq:14-6
}
会惩罚那些欠翻译的翻译假设。覆盖度模型的一种改进形式是
\upcite
{
li-etal-2018-simple
}
:
\noindent
其中,
$
\textrm
{
cp
}
(
\seq
{
x
}
,
\seq
{
y
}
)
$
表示覆盖度模型,它度量了译文对源语言每个单词的覆盖程度。
$
\textrm
{
cp
}
(
\seq
{
x
}
,
\seq
{
y
}
)
$
的定义中,
$
a
_{
ij
}$
表示源语言第
$
i
$
个位置与目标语第
$
j
$
个位置的注意力权重,这样
$
\sum
\limits
_{
j
}^{
|
\seq
{
y
}
|
}
a
_{
ij
}$
就可以
用来衡量
源语言第
$
i
$
个单词被翻译了“多少”,如果它大于1,表明翻译多了;如果小于1,表明翻译少了。公式
\eqref
{
eq:14-6
}
会惩罚那些欠翻译的翻译假设。覆盖度模型的一种改进形式是
\upcite
{
li-etal-2018-simple
}
:
\begin{eqnarray}
\textrm
{
cp
}
(
\seq
{
x
}
,
\seq
{
y
}
) =
\sum
_{
i=1
}^{
|
\seq
{
x
}
|
}
\log
(
\textrm
{
max
}
(
\sum
_{
j
}^{
|
\seq
{
y
}
|
}
a
_{
ij
}
,
\beta
))
...
...
@@ -201,13 +201,13 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
搜索终止条件
}
\parinterval
在机器翻译推断中,何时终止搜索是一个非常基础的问题。如
\chaptertwo
所述,系统研发者一方面希望尽可能遍历更大的搜索空间,找到更好的结果,另一方面也希望在尽可能短的时间内得到结果。这时搜索的终止条件就是一个非常关键的指标。在束搜索中有很多终止条件可以使用,比如,在生成一定数量的译文之后就终止搜索,或者当最佳译文
比排名第二的译文分数的差
超过一个阈值时就终止搜索等。
\parinterval
在机器翻译推断中,何时终止搜索是一个非常基础的问题。如
\chaptertwo
所述,系统研发者一方面希望尽可能遍历更大的搜索空间,找到更好的结果,另一方面也希望在尽可能短的时间内得到结果。这时搜索的终止条件就是一个非常关键的指标。在束搜索中有很多终止条件可以使用,比如,在生成一定数量的译文之后就终止搜索,或者当最佳译文
与排名第二的译文之间的分数差距
超过一个阈值时就终止搜索等。
\parinterval
在统计机器翻译中,搜索的终止条件相对容易设计。因为所有的翻译结果都可以用相同步骤的搜索过程生成,比如,在CYK解码中搜索的步骤仅与构建的分析表大小有关。在神经机器翻译
,这个问题要更加复杂。当系统找到一个完整的译文之后,可能还有很多译文没有被生成完,这时就面临着如何决定是否继续搜索的问题
。
\parinterval
在统计机器翻译中,搜索的终止条件相对容易设计。因为所有的翻译结果都可以用相同步骤的搜索过程生成,比如,在CYK解码中搜索的步骤仅与构建的分析表大小有关。在神经机器翻译
中,这个问题要更加复杂。当系统找到一个完整的译文之后,可能还有很多译文没有被生成完,这时就面临着一个问题
\ \dash
\
如何决定是否继续搜索
。
\parinterval
针对这些问题,研究者们设计了很多新的方法。比如,有研究者
可以在束搜索中使用启发性信息让搜索尽可能早的停止,同时保证搜索结果是“最优的”
\upcite
{
DBLP:conf/emnlp/HuangZM17
}
。也有研究者将束搜索建模为优化问题
\upcite
{
Wiseman2016SequencetoSequenceLA,DBLP:conf/emnlp/Yang0M18
}
,进而设计出新的终止条件
\upcite
{
Ma2019LearningTS
}
。很多开源机器翻译系统也都使用了巧妙的终止条件,比如,在OpenNMT系统中当搜索束中当前最好的假设生成了完整的译文搜索就会停止
\upcite
{
KleinOpenNMT
}
,在RNNSearch系统中当找到与
预设数量的译文时搜索就会停止,同时在这个过程中会不断减小搜索束的大小
\upcite
{
bahdanau2014neural
}
。
\parinterval
针对这些问题,研究者们设计了很多新的方法。比如,有研究者
提出可以在束搜索中使用启发性信息让搜索尽可能早的停止,同时保证搜索结果是“最优的”
\upcite
{
DBLP:conf/emnlp/HuangZM17
}
。也有研究者将束搜索建模为优化问题
\upcite
{
Wiseman2016SequencetoSequenceLA,DBLP:conf/emnlp/Yang0M18
}
,进而设计出新的终止条件
\upcite
{
Ma2019LearningTS
}
。很多开源机器翻译系统也都使用了巧妙的终止条件,比如,在OpenNMT系统中当搜索束中当前最好的假设生成了完整的译文搜索就会停止
\upcite
{
KleinOpenNMT
}
,在RNNSearch系统中当找到
预设数量的译文时搜索就会停止,同时在这个过程中会不断减小搜索束的大小
\upcite
{
bahdanau2014neural
}
。
\parinterval
实际上,设计搜索终止条件反映了搜索
延时
和搜索精度之间的一种折中
\upcite
{
Eisner2011LearningST,Jiang2012LearnedPF
}
。在很多应用中,这个问题会非常关键。比如,在同声传译中,对于输入的长文本,何时开始翻译、何时结束翻译都是十分重要的
\upcite
{
Zheng2020OpportunisticDW,Ma2019STACLST
}
。在很多线上翻译应用中,翻译结果的响应不能超过一定的时间,这时就需要一种
{
\small\sffamily\bfseries
{
时间受限的搜索
}}
\index
{
时间受限的搜索
}
(Time-constrained Search)
\index
{
Time-constrained Search
}
策略
\upcite
{
DBLP:conf/emnlp/StahlbergHSB17
}
。
\parinterval
实际上,设计搜索终止条件反映了搜索
时延
和搜索精度之间的一种折中
\upcite
{
Eisner2011LearningST,Jiang2012LearnedPF
}
。在很多应用中,这个问题会非常关键。比如,在同声传译中,对于输入的长文本,何时开始翻译、何时结束翻译都是十分重要的
\upcite
{
Zheng2020OpportunisticDW,Ma2019STACLST
}
。在很多线上翻译应用中,翻译结果的响应不能超过一定的时间,这时就需要一种
{
\small\sffamily\bfseries
{
时间受限的搜索
}}
\index
{
时间受限的搜索
}
(Time-constrained Search)
\index
{
Time-constrained Search
}
策略
\upcite
{
DBLP:conf/emnlp/StahlbergHSB17
}
。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
...
...
@@ -236,7 +236,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
%----------------------------------------------------------------------
\parinterval
机器翻译输出缺乏多样性会带来很多问题。一个直接的问题是在重排序时无法选择到更好的译文,因为所有候选都没有太大的差别。另一方面,当需要利用
$
n
$
-best输出来表示翻译假设空间时,缺乏多样性的译文也会使得翻译后验概率的估计不够准确,造成建模的偏差。在一些模型训练方法中,这种后验概率估计的偏差也会造成较大的影响
\upcite
{
DBLP:conf/acl/ShenCHHWSL16
}
。从人工翻译的角度,同一个源语言句子的译文应该是多样的,因此过于相似的译文也无法反映足够多的翻译现象。
\parinterval
因此增加译文多样性成为了机器翻译
研究中一个有价值的
方向。在统计机器翻译中就有很多尝试
\upcite
{
DBLP:conf/emnlp/DuanLXZ09,DBLP:conf/acl/XiaoZZW10,xiao2013bagging
}
。主要思路是通过加入一些“扰动”让翻译模型的行为发生变化,进而得到区别更大的译文。类似的方法也同样适用于神经机器翻译。例如,可以在推断过程中加入额外的模型,用于惩罚出现相似译文的情况
\upcite
{
Li2016ADO,Li2016MutualIA
}
。也有研究者在翻译模型中引入新的隐含变量或者加入新的干扰,进而控制多样性译文的输出
\upcite
{
He2018SequenceTS,Shen2019MixtureMF,Wu2020GeneratingDT
}
。类似的,也可以利用模型中局部结构的多样性来生成多样的译文
\upcite
{
Sun2020GeneratingDT
}
。除了考虑每个译文之间的多样性,也可以对译文进行分组,之后增加不同组之间的多样性
\upcite
{
Vijayakumar2016DiverseBS
}
。
\parinterval
因此增加译文多样性成为了机器翻译
中一个有价值的研究
方向。在统计机器翻译中就有很多尝试
\upcite
{
DBLP:conf/emnlp/DuanLXZ09,DBLP:conf/acl/XiaoZZW10,xiao2013bagging
}
。主要思路是通过加入一些“扰动”让翻译模型的行为发生变化,进而得到区别更大的译文。类似的方法也同样适用于神经机器翻译。例如,可以在推断过程中加入额外的模型,用于惩罚出现相似译文的情况
\upcite
{
Li2016ADO,Li2016MutualIA
}
。也有研究者在翻译模型中引入新的隐含变量或者加入新的干扰,进而控制多样性译文的输出
\upcite
{
He2018SequenceTS,Shen2019MixtureMF,Wu2020GeneratingDT
}
。类似的,也可以利用模型中局部结构的多样性来生成多样的译文
\upcite
{
Sun2020GeneratingDT
}
。除了考虑每个译文之间的多样性,也可以对译文进行分组,之后增加不同组之间的多样性
\upcite
{
Vijayakumar2016DiverseBS
}
。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
...
...
@@ -244,9 +244,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
搜索错误
}
\parinterval
机器翻译的错误分为两类:搜索错误和模型错误。搜索错误是指由于搜索算法的限制,即使
在
潜在的搜索空间中有更好的解,模型也无法找到。比较典型的例子是,在对搜索进行剪枝的时候,如果剪枝过多,找到的结果很有可能不是最优的。这时就出现了搜索错误。
\parinterval
机器翻译的错误分为两类:搜索错误和模型错误。搜索错误是指由于搜索算法的限制,即使潜在的搜索空间中有更好的解,模型也无法找到。比较典型的例子是,在对搜索进行剪枝的时候,如果剪枝过多,找到的结果很有可能不是最优的。这时就出现了搜索错误。
\parinterval
在统计机器翻译中,搜索错误可以通过减少剪枝进行缓解。比较简单的方式是增加
束宽度,这往往会带来一定的性能提升
\upcite
{
Xiao2016ALA
}
。也可以对搜索问题单独建模,以保证学习到的模型出现更少的搜索错误
\upcite
{
Liu2014SearchAwareTF,Yu2013MaxViolationPA
}
。但是,在神经机器翻译中,这个问题却表现出不同的现象。在很多神经机器翻译系统中,随着搜索束的增大,系统的BLEU不升反降。图
\ref
{
fig:14-3
}
展示了BLEU随着
束大小的变化曲线。这个现象与传统的常识是相违背的,因此也有一些研究尝试解释这个现象
\upcite
{
Stahlberg2019OnNS,Niehues2017AnalyzingNM
}
。在实验中,研究者也发现增加搜索束的大小会导致翻译生成的结果变得更短。他们将这个现象归因于:增加搜索束的大小,会导致更多的模型错误,因为神经机器翻译的建模是基于局部归一的最大似然估计
\upcite
{
Sountsov2016LengthBI,Murray2018CorrectingLB,StahlbergNeural
}
。另一方面,也有研究者把这种翻译过短的现象归因于搜索错误
\upcite
{
Stahlberg2019OnNS
}
。由于搜索时所面临的搜索空间是十分巨大的,因此搜索时可能无法找到模型定义的“最好”的译文。在某种意义上,这也体现了一种训练和推断不一致的问题。
\parinterval
在统计机器翻译中,搜索错误可以通过减少剪枝进行缓解。比较简单的方式是增加
搜索束宽度,这往往会带来一定的性能提升
\upcite
{
Xiao2016ALA
}
。也可以对搜索问题进行单独建模,以保证学习到的模型出现更少的搜索错误
\upcite
{
Liu2014SearchAwareTF,Yu2013MaxViolationPA
}
。但是,在神经机器翻译中,这个问题却表现出不同的现象:在很多神经机器翻译系统中,随着搜索束的增大,系统的BLEU不升反降。图
\ref
{
fig:14-3
}
展示了BLEU随
束大小的变化曲线。这个现象与传统的常识是相违背的,因此也有一些研究尝试解释这个现象
\upcite
{
Stahlberg2019OnNS,Niehues2017AnalyzingNM
}
。在实验中,研究者也发现增加搜索束的大小会导致翻译生成的结果变得更短。他们将这个现象归因于:增加搜索束的大小,会导致更多的模型错误,因为神经机器翻译的建模是基于局部归一的最大似然估计
\upcite
{
Sountsov2016LengthBI,Murray2018CorrectingLB,StahlbergNeural
}
。另一方面,也有研究者把这种翻译过短的现象归因于搜索错误
\upcite
{
Stahlberg2019OnNS
}
。由于搜索时所面临的搜索空间是十分巨大的,因此搜索时可能无法找到模型定义的“最好”的译文。在某种意义上,这也体现了一种训练和推断不一致的问题。
%----------------------------------------------------------------------
\begin{figure}
[htp]
...
...
@@ -257,7 +257,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\end{figure}
%----------------------------------------------------------------------
\parinterval
也有研究者针对降低搜索错误提出了一些解决方案。典型的思路是从训练和推断的行为和目标不一致的角度切入。比如,为了解决
{
\small\sffamily\bfseries
{
曝光偏置
}}
\index
{
曝光偏置
}
(Exposure Bias)
\index
{
Exposure Bias
}
问题
\upcite
{
Ranzato2016SequenceLT
}
,可以让系统使用前面步骤的预测结果作为预测下一个词所需要的历史信息,而不是依赖于标准答案
\upcite
{
Bengio2015ScheduledSF,Zhang2019BridgingTG
}
。另一方面,为了解决训练和推断目标不一致的问题,可以在训练的时候模拟推断的行为,同时让模型训练的目标与评价系统的
方法
尽可能一致
\upcite
{
DBLP:conf/acl/ShenCHHWSL16
}
。
\parinterval
也有研究者针对降低搜索错误提出了一些解决方案。典型的思路是从训练和推断的行为和目标不一致的角度切入。比如,为了解决
{
\small\sffamily\bfseries
{
曝光偏置
}}
\index
{
曝光偏置
}
(Exposure Bias)
\index
{
Exposure Bias
}
问题
\upcite
{
Ranzato2016SequenceLT
}
,可以让系统使用前面步骤的预测结果作为预测下一个词所需要的历史信息,而不是依赖于标准答案
\upcite
{
Bengio2015ScheduledSF,Zhang2019BridgingTG
}
。另一方面,为了解决训练和推断目标不一致的问题,可以在训练的时候模拟推断的行为,同时让模型训练的目标与评价系统的
标准
尽可能一致
\upcite
{
DBLP:conf/acl/ShenCHHWSL16
}
。
\parinterval
需要注意的是,前面提到的搜索束变大造成的翻译品质下降的问题还有其它解决方法。比如,可以通过对结果重排序来缓解这个问题
\upcite
{
DBLP:conf/emnlp/Yang0M18
}
,也可以通过设计更好的覆盖度模型来生成长度更加合理的译文
\upcite
{
li-etal-2018-simple
}
。从这个角度说,上述问题的成因也较为复杂,因此需要同时考虑模型错误和搜索错误。
...
...
@@ -267,7 +267,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\section
{
轻量模型
}
\label
{
sec:14-3
}
\parinterval
翻译速度和翻译精度之间的平衡是机器翻译系统研发中的常见问题。即使是以提升翻译品质为目标的任务(如用BLEU进行评价),也不得不考虑翻译速度的影响。比如,在WMT 和CCMT 的一些任务中可能会使用反向翻译构造伪数据,
需要大量的机器翻译;无监督机器翻译中也会频繁地使用神经机器翻译系统构造训练数据。如果翻译速度过慢会增大实验的周期。从应用的角度看,在很多场景下翻译速度甚至比品质更重要。比如,在线翻译和一些小设备上的机器翻译系统都需要保证相对低的翻译延时,以满足用户体验的最基本要求。虽然,我们希望能有一套又好又快的翻译系统,但是现实的情况是:往往需要通过牺牲一些翻译品质来换取
速度的提升。下面就列举一些常用的神经机器翻译轻量模型和加速方法。这些方法通常是应用在解码端,因为相比编码端,神经机器翻译的解码端是推断过程中最耗时的部分。
\parinterval
翻译速度和翻译精度之间的平衡是机器翻译系统研发中的常见问题。即使是以提升翻译品质为目标的任务(如用BLEU进行评价),也不得不考虑翻译速度的影响。比如,在WMT 和CCMT 的一些任务中可能会使用反向翻译构造伪数据,
涉及大量的机器翻译过程;无监督机器翻译中也会频繁地使用神经机器翻译系统构造训练数据。如果翻译速度过慢会增大实验的周期。从应用的角度看,在很多场景下翻译速度甚至比翻译品质更重要。比如,在线翻译和一些小设备上的机器翻译系统都需要保证相对低的翻译时延,以满足用户体验的最基本要求。虽然,我们希望能有一套又好又快的翻译系统,但是现实的情况是:往往需要通过牺牲一些翻译品质来换取翻译
速度的提升。下面就列举一些常用的神经机器翻译轻量模型和加速方法。这些方法通常是应用在解码端,因为相比编码端,神经机器翻译的解码端是推断过程中最耗时的部分。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
...
...
@@ -275,9 +275,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
输出层的词汇选择
}
\parinterval
神经机器翻译需要对输入和输出的单词进行分布式表示,比如,每一个单词都用一个512 维向量进行表示。但是,由于真实的词表通常很大,因此计算并保存这些单词的向量表示
就会消耗较多的计算和存储资源。特别是对于基于Softmax 的输出层,使用大词表往往会占用较多的系统运算时间。虽然可以通过BPE 和限制词汇表规模的方法降低输出层计算的负担
\upcite
{
Gage1994ANA,DBLP:conf/acl/SennrichHB16a
}
,但是为了获得可接受的翻译品质,词汇表也不能过小,因此输出层
仍然十分耗时。
\parinterval
神经机器翻译需要对输入和输出的单词进行分布式表示,比如,每一个单词都用一个512 维向量进行表示。但是,由于真实的词表通常很大,因此计算并保存这些单词的向量表示
会消耗较多的计算和存储资源。特别是对于基于Softmax 的输出层,使用大词表往往会占用较多的系统运算时间。虽然可以通过BPE 和限制词汇表规模的方法降低输出层计算的负担
\upcite
{
Gage1994ANA,DBLP:conf/acl/SennrichHB16a
}
,但是为了获得可接受的翻译品质,词汇表也不能过小,因此输出层的计算
仍然十分耗时。
\parinterval
对于这个问题,可以通过改变输出层的网络结构进行缓解
\upcite
{
DBLP:conf/acl/JeanCMB15
}
。一种比较简单的方法是对可能输出的单词进行筛选,简称词汇选择。这里,可以利用类似于统计机器翻译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机制找到每个目标语位置对应的源语言位置,之后获得这些源语言单词最可能的翻译候选。之后,Softmax 只需要在这个有限的翻译候选单词集合上
计算,大大降低了输出层的计算量。尤其是
对于CPU 上的系统,这个方法往往会带来明显的速度提升,同时保证翻译品质。图
\ref
{
fig:14-4
}
给出了词汇选择方法的示意图。
\parinterval
对于这个问题,可以通过改变输出层的网络结构进行缓解
\upcite
{
DBLP:conf/acl/JeanCMB15
}
。一种比较简单的方法是对可能输出的单词进行筛选,简称词汇选择。这里,可以利用类似于统计机器翻译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机制找到每个目标语位置对应的源语言位置,之后获得这些源语言单词最可能的翻译候选。之后,Softmax 只需要在这个有限的翻译候选单词集合上
进行计算,大大降低了输出层的计算量。尤其
对于CPU 上的系统,这个方法往往会带来明显的速度提升,同时保证翻译品质。图
\ref
{
fig:14-4
}
给出了词汇选择方法的示意图。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -287,7 +287,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\label
{
fig:14-4
}
\end{figure}
%----------------------------------------------
\parinterval
实际上,词汇选择也是一种典型的处理大词表的方法(见
\chapterthirteen
)。这种方法最大的优点在于,它可以与其它方法结合,比如与BPE等方法结合。本质上,这种方法与传统基于统计的机器翻译中的短语表剪枝有类似之处
\upcite
{
DBLP:conf/emnlp/ZensSX12,DBLP:conf/emnlp/JohnsonMFK07,DBLP:conf/emnlp/LingGTB12
}
,当翻译候选过多的时候,可以根据翻译候选
的质量
对候选集进行剪枝。这种技术已经在统计机器翻译系统中得到成功应用。
\parinterval
实际上,词汇选择也是一种典型的处理大词表的方法(见
\chapterthirteen
)。这种方法最大的优点在于,它可以与其它方法结合,比如与BPE等方法结合。本质上,这种方法与传统基于统计的机器翻译中的短语表剪枝有类似之处
\upcite
{
DBLP:conf/emnlp/ZensSX12,DBLP:conf/emnlp/JohnsonMFK07,DBLP:conf/emnlp/LingGTB12
}
,当翻译候选过多的时候,可以根据翻译候选对候选集进行剪枝。这种技术已经在统计机器翻译系统中得到成功应用。
%----------------------------------------------------------------------------------------
...
...
@@ -296,7 +296,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
消除冗余计算
}
\parinterval
消除不必要的计算是加速机器翻译的常用技术。比如,在统计机器翻译时代,假设重组就是一种典型的避免冗余计算的手段(
\chapterfour
)。对于神经机器翻译中的Transformer 模型,一种简单有效的方法是对解码端的注意力结果进行缓存。在生成每个目标语译文时,Transformer 模型会对当前位置之前的所有位置进行自注意力操作,但是这些计算里只有和当前位置相关的计算是“新” 的,前面位置之间的注意力结果已经在之前的解码步骤里计算过,因此可以对其进行缓存。
\parinterval
消除不必要的计算是加速机器翻译的常用技术。比如,在统计机器翻译时代,假设重组就是一种典型的避免冗余计算的手段(
\chapterfour
)。对于神经机器翻译中的Transformer 模型,
消除冗余计算的
一种简单有效的方法是对解码端的注意力结果进行缓存。在生成每个目标语译文时,Transformer 模型会对当前位置之前的所有位置进行自注意力操作,但是这些计算里只有和当前位置相关的计算是“新” 的,前面位置之间的注意力结果已经在之前的解码步骤里计算过,因此可以对其进行缓存。
\parinterval
此外,由于Transformer 模型较为复杂,还存在很多冗余。比如,Transformer 的每一层会包含自注意力机制、层正则化、残差连接、前馈神经网络等多种不同的结构。同时,不同结构之间还会包含一些线性变换。多层Transformer(通常为6 层)模型会更加复杂。但是,这些层可能在做相似的事情,甚至有些计算根本就是重复的。图
\ref
{
fig:14-5
}
中展示了解码端自注意力和编码-解码注意力中不同层的注意力权重的相似性,这里的相似性利用JensenShannon散度进行度量
\upcite
{
61115
}
。可以看到,自注意力中,2-5层之间的注意力权重的分布非常相似。编码-解码注意力也有类似的现象,临近的层之间有非常相似的注意力权重。这个现象说明:在多层神经网络中有些计算是冗余的,因此很自然的想法是消除这些冗余使得机器翻译变得更“轻”。
...
...
@@ -321,7 +321,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval
另一种方法是对不同层的参数进行共享。这种方法虽然不能带来直接的提速,但是可以大大减小模型的体积。比如,可以重复使用同一层的参数完成多层的计算。极端一些的情况下,六层网络可以只使用一层网络的参数
\upcite
{
DBLP:conf/aaai/DabreF19
}
。不过,在深层模型中(层数> 20),浅层部分的差异往往较大,而深层(远离输出)之间的相似度会更高。这时可以考虑对深层的部分进行更多的共享。
\parinterval
减少冗余计算也代表了一种剪枝的思想。本质上,是
在
利用模型参数的稀疏性假设
\upcite
{
Narang2017BlockSparseRN,Gale2019TheSO
}
:一部分参数对模型整体的行为影响不大,因此可以直接被抛弃掉。这类方法也被使用在神经机器翻译模型的不同部分。比如,对于Transformer模型,也有研究发现多头注意力中的有些头是有冗余的
\upcite
{
Michel2019AreSH
}
,因此可以直接对其进行剪枝
\upcite
{
DBLP:journals/corr/abs-1905-09418
}
。
\parinterval
减少冗余计算也代表了一种剪枝的思想。本质上,是利用模型参数的稀疏性假设
\upcite
{
Narang2017BlockSparseRN,Gale2019TheSO
}
:一部分参数对模型整体的行为影响不大,因此可以直接被抛弃掉。这类方法也被使用在神经机器翻译模型的不同部分。比如,对于Transformer模型,也有研究发现多头注意力中的有些头是有冗余的
\upcite
{
Michel2019AreSH
}
,因此可以直接对其进行剪枝
\upcite
{
DBLP:journals/corr/abs-1905-09418
}
。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
...
...
@@ -331,13 +331,13 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval
在推断时,神经机器翻译的解码端是最耗时的,因为每个目标语位置需要单独输出单词的分布,同时在搜索过程中每一个翻译假设都要被扩展成多个翻译假设,进一步增加了计算量。因此,另一种加速系统的思路是使用更加轻量的解码器
\upcite
{
DBLP:journals/corr/HintonVD15,Munim2019SequencelevelKD
}
。
\parinterval
比较简单的做法是把解码端的网络变得更“浅”、更“窄”。所谓浅网络是指使用更少的层构建神经网络,比如,使用3 层,甚至1 层网络的Transformer 解码器。所谓窄网络是指将网络中某些层中神经元的数量减少。不过,直接训练这样的小模型会带来翻译品质的下降。这时会考虑使用知识
精炼
等技术来提升小模型的品质。
\parinterval
比较简单的做法是把解码端的网络变得更“浅”、更“窄”。所谓浅网络是指使用更少的层构建神经网络,比如,使用3 层,甚至1 层网络的Transformer 解码器。所谓窄网络是指将网络中某些层中神经元的数量减少。不过,直接训练这样的小模型会带来翻译品质的下降。这时会考虑使用知识
蒸馏(也称作知识精炼)
等技术来提升小模型的品质。
\parinterval
另一种思路是化简Transformer
的解码端神经网络。比如,可以使用平均注意力机制代替原始的Transformer
自注意力机制
\upcite
{
DBLP:journals/corr/abs-1805-00631
}
,也可以使用运算更轻的卷积操作代替注意力模块
\upcite
{
Wu2019PayLA
}
。前面提到的基于共享注意力机制的模型也是一种典型的轻量模型
\upcite
{
Xiao2019SharingAW
}
。
\parinterval
另一种思路是化简Transformer
解码端的神经网络。比如,可以使用平均注意力机制代替原始Transformer 中的
自注意力机制
\upcite
{
DBLP:journals/corr/abs-1805-00631
}
,也可以使用运算更轻的卷积操作代替注意力模块
\upcite
{
Wu2019PayLA
}
。前面提到的基于共享注意力机制的模型也是一种典型的轻量模型
\upcite
{
Xiao2019SharingAW
}
。
\parinterval
此外,使用异构神经网络也是一种平衡精度和速度的有效方法。在很多研究中发现,基于Transformer 的编码器对翻译品质的影响更大,而解码端的作用会小一些。因此,一种想法是
用更快速的解码端结构,比如,用基于循环神经网络的解码端替换
基于Transformer 的解码端
\upcite
{
Chen2018TheBO
}
。这样,既能发挥Transformer 在编码上的优势,同时也能利用循环神经网络在解码端速度上的优势。使用类似的思想,也可以用卷积网络等结构进行解码端网络的设计。此外,也有研究者对注意力机制进行优化,以达到加速Transformer模型的目的
\upcite
{
DBLP:journals/corr/abs-1805-00631,Kitaev2020ReformerTE,Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2006-04768
}
。
\parinterval
此外,使用异构神经网络也是一种平衡精度和速度的有效方法。在很多研究中发现,基于Transformer 的编码器对翻译品质的影响更大,而解码端的作用会小一些。因此,一种想法是
使用更快速的解码端结构,比如,用基于循环神经网络的解码端代替
基于Transformer 的解码端
\upcite
{
Chen2018TheBO
}
。这样,既能发挥Transformer 在编码上的优势,同时也能利用循环神经网络在解码端速度上的优势。使用类似的思想,也可以用卷积网络等结构进行解码端网络的设计。此外,也有研究者对注意力机制进行优化,以达到加速Transformer模型的目的
\upcite
{
DBLP:journals/corr/abs-1805-00631,Kitaev2020ReformerTE,Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2006-04768
}
。
\parinterval
针对轻量级Transformer模型的设计也包括层级的结构剪枝,这类方法试图通过跳过某些操作或者某些层来降低计算量。典型的相关工作是样本自适应网络结构,如 FastBERT
\upcite
{
Liu2020FastBERTAS
}
、Depth Adaptive Transformer
\upcite
{
Elbayad2020DepthAdaptiveT
}
和LayerDrop
\upcite
{
DBLP:conf/iclr/FanGJ20
}
等,与传统的Transformer的解码过程不同,这类网络结构在推断时不需要计算全部
解码层,而是根据输入自动选择模型的部分层进行计算,达到加速和减少参数量的目的。此外,矩阵分解也是一种轻量级模型解决方案,这类方法通过矩阵分解的方法提升计算效率,通过简化复杂的矩阵计算来达到加速模型训练和推断的目的。例如 Adaptive Input Representations
\upcite
{
DBLP:conf/iclr/BaevskiA19
}
提出词频自适应表示,词频越高则对应的词向量维度越大,反之越小,显著减少了
词向量矩阵大小。此外还有一些工作尝试消除注意力机制中的冗余计算,对层与层之间的参数进行共享
\upcite
{
Xiao2019SharingAW
}
或者是对跨层参数进行共享
\upcite
{
Lan2020ALBERTAL
}
,以达到加速Transformer模型的目的
\upcite
{
DBLP:journals/corr/abs-1805-00631,Kitaev2020ReformerTE,Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2006-04768
}
。
\parinterval
针对轻量级Transformer模型的设计也包括层级的结构剪枝,这类方法试图通过跳过某些操作或者某些层来降低计算量。典型的相关工作是样本自适应网络结构,如 FastBERT
\upcite
{
Liu2020FastBERTAS
}
、Depth Adaptive Transformer
\upcite
{
Elbayad2020DepthAdaptiveT
}
和LayerDrop
\upcite
{
DBLP:conf/iclr/FanGJ20
}
等,与传统的Transformer的解码过程不同,这类网络结构在推断时不需要计算全部
的解码层,而是根据输入自动选择模型的部分层进行计算,达到加速和减少参数量的目的。此外,矩阵分解也是一种轻量级模型解决方案,这类方法通过矩阵分解的方法提升计算效率,通过简化复杂的矩阵计算来达到加速模型训练和推断的目的。例如 Adaptive Input Representations
\upcite
{
DBLP:conf/iclr/BaevskiA19
}
提出词频自适应表示,词频越高则对应的词向量维度越大,反之越小,该方法可以显著减少
词向量矩阵大小。此外还有一些工作尝试消除注意力机制中的冗余计算,对层与层之间的参数进行共享
\upcite
{
Xiao2019SharingAW
}
或者是对跨层参数进行共享
\upcite
{
Lan2020ALBERTAL
}
,以达到加速Transformer模型的目的
\upcite
{
DBLP:journals/corr/abs-1805-00631,Kitaev2020ReformerTE,Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2006-04768
}
。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
...
...
@@ -347,13 +347,13 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval
深度学习时代下,使用GPU(图形处理单元)已经成为绝大多数神经网络模型研究的基本要求。特别是对于机器翻译这样的复杂任务,GPU 的并行运算能力会带来明显的速度提升。为了充分利用GPU 的并行能力,可以同时对多个句子进行翻译,即
{
\small\sffamily\bfseries
{
批量推断
}}
\index
{
批量推断
}
(Batch Inference)
\index
{
Batch Inference
}
。
\parinterval
在
\chaptersix
已经介绍了神经机器翻译中
{
\small\sffamily\bfseries
{
批量处理
}}
\index
{
批量处理
}
(Batching)
\index
{
Batching
}
的基本概念
。
其实现并不困难,不过有两方面问题需要注意:
\parinterval
在
\chaptersix
已经介绍了神经机器翻译中
{
\small\sffamily\bfseries
{
批量处理
}}
\index
{
批量处理
}
(Batching)
\index
{
Batching
}
的基本概念
,
其实现并不困难,不过有两方面问题需要注意:
\begin{itemize}
\vspace
{
0.5em
}
\item
批次生成策略。对于源语言文本预先给定的情况,通常是按句子长度组织每个批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保证一个批次中的内容是“满” 的,否则如果句长差异过大会造成批次中有很多位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复杂。由于有翻译
延时
的限制,可能无法等到有足够多的句子就要进行翻译。常见的做法是,设置一个等待的时间,在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并发的情况,也可以考虑使用不同的Bucket保存不同长度范围的句子,之后将同一个Bucket 中的句子进行批量推断。
\item
批次生成策略。对于源语言文本预先给定的情况,通常是按句子长度组织每个批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保证一个批次中的内容是“满” 的,否则如果句长差异过大会造成批次中有很多位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复杂。由于有翻译
时延
的限制,可能无法等到有足够多的句子就要进行翻译。常见的做法是,设置一个等待的时间,在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并发的情况,也可以考虑使用不同的Bucket保存不同长度范围的句子,之后将同一个Bucket 中的句子进行批量推断。
\vspace
{
0.5em
}
\item
批次大小的选择。一个批次中的句子数量越多,GPU 设备的利用率越高,系统吞吐越大。但是,一个批次中所有句子翻译结束后才能拿到翻译结果,因此批次中有些句子即使已经翻译结束也要等待其它没有完成的句子。也就是说,从单个句子来看,批次越大翻译的延时越长,这也导致在翻译实时性要求较高的场景中,不能使用过大的批次。而且,大批次对GPU 显存的消耗更大,因此也需要根据具体任务合理选择批次大小。为了说明这些问题,图
\ref
{
fig:14-7
}
展示了不同批次大小下的吞吐、
延时
和显存消耗。
\item
批次大小的选择。一个批次中的句子数量越多,GPU 设备的利用率越高,系统吞吐越大。但是,一个批次中所有句子翻译结束后才能拿到翻译结果,因此批次中有些句子即使已经翻译结束也要等待其它没有完成的句子。也就是说,从单个句子来看,批次越大翻译的延时越长,这也导致在翻译实时性要求较高的场景中,不能使用过大的批次。而且,大批次对GPU 显存的消耗更大,因此也需要根据具体任务合理选择批次大小。为了说明这些问题,图
\ref
{
fig:14-7
}
展示了不同批次大小下的吞吐、
时延
和显存消耗。
\vspace
{
0.5em
}
\end{itemize}
...
...
@@ -725,13 +725,13 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\begin{itemize}
\vspace
{
0.5em
}
\item
机器翻译系统中的推断也借用了
{
\small\sffamily\bfseries
{
统计推断
}}
\index
{
统计推断
}
(Statistical Inference)
\index
{
Statistical Inference
}
的概念。传统意义上讲,这类方法都是在利用样本数据去推测总体的趋势和特征。因此,从统计学的角度也有很多不同的思路。例如,贝叶斯学习等方法就在自然语言处理中得到广泛应用
\upcite
{
Held2013AppliedSI,Silvey2018StatisticalI
}
。其中比较有代表性的是
{
\small\sffamily\bfseries
{
变分方法
}}
\index
{
变分方法
}
(Variational Methods)
\index
{
Variational Methods
}
。这类方法通过引入新的隐含变量来对样本的分布进行建模,
某种意义上说它是在描述“分布的分布”,因此这种方法对事物的统计规律描述的会更加细致
\upcite
{
Beal2003VariationalAF
}
。这类方法也被成功的
用于统计机器翻译
\upcite
{
Li2009VariationalDF,xiao2011language,
}
和神经机器翻译
\upcite
{
Bastings2019ModelingLS,Shah2018GenerativeNM,Su2018VariationalRN,Zhang2016VariationalNM
}
。
\item
机器翻译系统中的推断也借用了
{
\small\sffamily\bfseries
{
统计推断
}}
\index
{
统计推断
}
(Statistical Inference)
\index
{
Statistical Inference
}
的概念。传统意义上讲,这类方法都是在利用样本数据去推测总体的趋势和特征。因此,从统计学的角度也有很多不同的思路。例如,贝叶斯学习等方法就在自然语言处理中得到广泛应用
\upcite
{
Held2013AppliedSI,Silvey2018StatisticalI
}
。其中比较有代表性的是
{
\small\sffamily\bfseries
{
变分方法
}}
\index
{
变分方法
}
(Variational Methods)
\index
{
Variational Methods
}
。这类方法通过引入新的隐含变量来对样本的分布进行建模,
从某种意义上说它是在描述“分布的分布”,因此这种方法对事物的统计规律描述得更加细致
\upcite
{
Beal2003VariationalAF
}
。这类方法也被成功地
用于统计机器翻译
\upcite
{
Li2009VariationalDF,xiao2011language,
}
和神经机器翻译
\upcite
{
Bastings2019ModelingLS,Shah2018GenerativeNM,Su2018VariationalRN,Zhang2016VariationalNM
}
。
\vspace
{
0.5em
}
\item
推断系统也可以受益于更加高效的网络结构。这方面工作集中在结构化剪枝、减少模型的冗余计算、低秩分解等方向。结构化剪枝中的代表性工作是LayerDrop
\upcite
{
DBLP:conf/iclr/FanGJ20,DBLP:conf/emnlp/WangXZ20,DBLP:journals/corr/abs-2002-02925
}
,这类方法在训练时随机选择
层
,在推断时根据输入来选择模型中的部分层进行计算,而跳过其余层,达到加速和减少参数量的目的。有关减少冗余计算的研究主要集中在改进注意力机制上,本章正文中已经有所介绍。低秩分解则针对词向量或者注意力的映射矩阵进行改进,例如词频自适应表示
\upcite
{
DBLP:conf/iclr/BaevskiA19
}
,词频越高则对应的向量维度越大,反之则越小,或者层数越高注意力映射矩阵维度越小
\upcite
{
DBLP:journals/corr/abs-2006-04768,DBLP:journals/corr/abs-1911-12385,DBLP:journals/corr/abs-1906-09777,DBLP:conf/nips/YangLSL19
}
。在实践中比较有效的是较深的编码器与较浅的解码器结合的方式,极端情况下解码器仅使用1层神经网络即可取得与多层神经网络相媲美的翻译精度,而极大地提升翻译效率
\upcite
{
DBLP:journals/corr/abs-2006-10369,DBLP:conf/aclnmt/HuLLLLWXZ20,DBLP:journals/corr/abs-2010-02416
}
。
\item
推断系统也可以受益于更加高效的网络结构。这方面工作集中在结构化剪枝、减少模型的冗余计算、低秩分解等方向。结构化剪枝中的代表性工作是LayerDrop
\upcite
{
DBLP:conf/iclr/FanGJ20,DBLP:conf/emnlp/WangXZ20,DBLP:journals/corr/abs-2002-02925
}
,这类方法在训练时随机选择
部分子结构
,在推断时根据输入来选择模型中的部分层进行计算,而跳过其余层,达到加速和减少参数量的目的。有关减少冗余计算的研究主要集中在改进注意力机制上,本章正文中已经有所介绍。低秩分解则针对词向量或者注意力的映射矩阵进行改进,例如词频自适应表示
\upcite
{
DBLP:conf/iclr/BaevskiA19
}
,词频越高则对应的向量维度越大,反之则越小,或者层数越高注意力映射矩阵维度越小
\upcite
{
DBLP:journals/corr/abs-2006-04768,DBLP:journals/corr/abs-1911-12385,DBLP:journals/corr/abs-1906-09777,DBLP:conf/nips/YangLSL19
}
。在实践中比较有效的是较深的编码器与较浅的解码器结合的方式,极端情况下解码器仅使用1层神经网络即可取得与多层神经网络相媲美的翻译精度,而极大地提升翻译效率
\upcite
{
DBLP:journals/corr/abs-2006-10369,DBLP:conf/aclnmt/HuLLLLWXZ20,DBLP:journals/corr/abs-2010-02416
}
。
\vspace
{
0.5em
}
\item
机器翻译推断系统实际部署时,对存储的消耗也是需要考虑的因素。因此如何让模型变得更小也是研发人员所关注的方向。当前的模型压缩方法主要可以分为几类:剪枝、量化、知识蒸馏和轻量方法,其中轻量方法主要是更轻量模型结构的设计,这类方法已经在上文进行了介绍。剪枝主要包括权重大小剪枝
\upcite
{
Han2015LearningBW,Lee2019SNIPSN,Frankle2019TheLT,Brix2020SuccessfullyAT
}
、面向多头注意力的剪枝
\upcite
{
Michel2019AreSH,DBLP:journals/corr/abs-1905-09418
}
、网络层以及其他部分的剪枝等
\upcite
{
Liu2017LearningEC,Liu2019RethinkingTV
}
,还有一些方法也通过在训练期间采用正则化的方式来提升剪枝能力
\upcite
{
DBLP:conf/iclr/FanGJ20
}
。量化方法主要通过截断浮点数来减少模型的存储大小,使其仅使用几个比特位的数字表示方法便能存储整个模型,虽然会导致舍入误差,但压缩效果显著
\upcite
{
DBLP:journals/corr/abs-1906-00532,Cheong2019transformersZ,Banner2018ScalableMF,Hubara2017QuantizedNN
}
。知识蒸馏又名知识精炼,一些方法
还将Transformer模型蒸馏成如LSTMs 等其他各种推断速度更快的架构
\upcite
{
DBLP:journals/corr/HintonVD15,Munim2019SequencelevelKD,Tang2019DistillingTK
}
。另外还有一些其他方法不仅在输出上,还在权重矩阵和隐藏的激活层上对“教师模型”知识进行更深入的挖掘
\upcite
{
Jiao2020TinyBERTDB
}
。
\item
在对机器翻译推断系统进行实际部署时,对存储的消耗也是需要考虑的因素。因此如何让模型变得更小也是研发人员所关注的方向。当前的模型压缩方法主要可以分为几类:剪枝、量化、知识蒸馏和轻量方法,其中轻量方法主要是更轻量模型结构的设计,这类方法已经在上文进行了介绍。剪枝主要包括权重大小剪枝
\upcite
{
Han2015LearningBW,Lee2019SNIPSN,Frankle2019TheLT,Brix2020SuccessfullyAT
}
、面向多头注意力的剪枝
\upcite
{
Michel2019AreSH,DBLP:journals/corr/abs-1905-09418
}
、网络层以及其他部分的剪枝等
\upcite
{
Liu2017LearningEC,Liu2019RethinkingTV
}
,还有一些方法也通过在训练期间采用正则化的方式来提升剪枝能力
\upcite
{
DBLP:conf/iclr/FanGJ20
}
。量化方法主要通过截断浮点数来减少模型的存储大小,使其仅使用几个比特位的数字表示方法便能存储整个模型,虽然会导致舍入误差,但压缩效果显著
\upcite
{
DBLP:journals/corr/abs-1906-00532,Cheong2019transformersZ,Banner2018ScalableMF,Hubara2017QuantizedNN
}
。一些方法利用知识蒸馏手段
还将Transformer模型蒸馏成如LSTMs 等其他各种推断速度更快的架构
\upcite
{
DBLP:journals/corr/HintonVD15,Munim2019SequencelevelKD,Tang2019DistillingTK
}
。另外还有一些其他方法不仅在输出上,还在权重矩阵和隐藏的激活层上对“教师模型”知识进行更深入的挖掘
\upcite
{
Jiao2020TinyBERTDB
}
。
\vspace
{
0.5em
}
\item
目前的翻译模型使用交叉熵损失作为优化函数,这在自回归模型上取得了非常优秀的性能。交叉熵是一个严格的损失函数,预测时
不在位置
的单词都会受到惩罚,即使是编辑距离很小的输出序列。回归模型会避免这种惩罚,因为单词是根据句子前一个词来生成的,而非自回归模型无法获知这个信息。为此,一些研究工作通过改进损失函数来提高非自回归模型的性能。一种做法使用对齐交叉熵函数
\upcite
{
Ghazvininejad2020AlignedCE
}
,其基于标签序列和目标词分布预测序列之间的对齐来计算交叉熵损失,采用动态规划的方法寻找单调对齐使交叉熵损失最小化。也可以使用基于
$
n
$
-gram的训练目标
\upcite
{
Shao2020MinimizingTB
}
,希望能最小化模型与参考译文间
$
n
$
-gram的差异。该训练目标在
$
n
$
-gram的层面上评估预测结果,因此能够建模序列依赖关系。
\item
目前的翻译模型使用交叉熵损失作为优化函数,这在自回归模型上取得了非常优秀的性能。交叉熵是一个严格的损失函数,预测时
位置错误
的单词都会受到惩罚,即使是编辑距离很小的输出序列。回归模型会避免这种惩罚,因为单词是根据句子前一个词来生成的,而非自回归模型无法获知这个信息。为此,一些研究工作通过改进损失函数来提高非自回归模型的性能。一种做法使用对齐交叉熵函数
\upcite
{
Ghazvininejad2020AlignedCE
}
,其基于标签序列和目标词分布预测序列之间的对齐来计算交叉熵损失,采用动态规划的方法寻找单调对齐使交叉熵损失最小化。也可以使用基于
$
n
$
-gram的训练目标
\upcite
{
Shao2020MinimizingTB
}
,希望能最小化模型与参考译文间
$
n
$
-gram的差异。该训练目标在
$
n
$
-gram的层面上评估预测结果,因此能够建模序列依赖关系。
\vspace
{
0.5em
}
\item
自回归模型预测目标句时,当前词的生成是以之前已生成的词作为条件的,已生成词提供了较强的目标端上下文信息。然而,非自回归模型并行地生成所有词,因此不存在这样的信息。与自回归模型相比,非自回归模型的解码器需要在信息更少的情况下执行翻译任务。因此很多做法通过给非自回归模型的解码器端引入更多的信息,来降低模型的搜索空间。一些研究工作
\upcite
{
Ma2019FlowSeqNC
}
通过将条件随机场引入非自回归模型中来对结构依赖进行建模;也有工作引入了一个词嵌入转换矩阵来将源端的词嵌入转换为目标端的词嵌入来增强解码端的输入
\upcite
{
Guo2019NonAutoregressiveNM
}
;此外,也有研究者提出了轻量级的重排序模块来显式的建模重排序信息,以指导非自回归模型的解码
\upcite
{
Ran2019GuidingNN
}
。
\vspace
{
0.5em
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论