Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
Toy-MT-Introduction
概览
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
Toy-MT-Introduction
Commits
e8c5a116
Commit
e8c5a116
authored
May 03, 2020
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
udpates of section 7
parent
890d3491
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
106 行增加
和
78 行删除
+106
-78
Book/Chapter7/Chapter7.tex
+80
-58
Book/Chapter7/Figures/figure-norm.tex
+3
-3
Book/mt-book-xelatex.idx
+17
-12
Book/structure.tex
+6
-5
没有找到文件。
Book/Chapter7/Chapter7.tex
查看文件 @
e8c5a116
...
...
@@ -370,22 +370,24 @@
\subsection
{
正则化
}
\label
{
subsection-7.3.1
}
\parinterval
{
\small\bfnew
{
正则化
}}
\index
{
正则化
}
(Regularization)
\index
{
Regularization
}
是机器学习中的经典技术,通常用于缓解
{
\small\bfnew
{
过拟合问题
}}
\index
{
过拟合问题
}
(
Overfitting Problem)
\index
{
Overfitting Problem
}
。正则化的概念源自线性代数和代数几何。在实践中,它更多的是指对
{
\small\bfnew
{
反问题
}}
\index
{
反问题
}
(
Inverse Problem)
\index
{
Inverse Problem
}
的一种求解方式。假设输入
$
x
$
和输出
$
y
$
之间存在一种映射
$
f
$
\parinterval
{
\small\bfnew
{
正则化
}}
\index
{
正则化
}
(Regularization)
\index
{
Regularization
}
是机器学习中的经典技术,通常用于缓解
{
\small\bfnew
{
过拟合问题
}}
\index
{
过拟合问题
}
(
The Overfitting Problem)
\index
{
Overfitting Problem
}
。正则化的概念源自线性代数和代数几何。在实践中,它更多的是指对
{
\small\bfnew
{
反问题
}}
\index
{
反问题
}
(The
Inverse Problem)
\index
{
Inverse Problem
}
的一种求解方式。假设输入
$
x
$
和输出
$
y
$
之间存在一种映射
$
f
$
\begin{eqnarray}
y = f(x)
\label
{
eqC7.1
}
\end{eqnarray}
\noindent
反问题是指:当观测到
$
y
$
时,能否求出
$
x
$
。反问题对应了很多实际问题,比如,可以把
$
y
$
看作经过美化的图片,
$
x
$
看作原始的图片,反问题就对应了图片还原。机器翻译的训练也是一种反问题,因为可以把
$
y
$
看作是正确的译文,
$
x
$
看作是输入句子或者模型参数
\footnote
{
在训练中,如果把源语言句子看作是不变的量,这时
f
输入只有模型参数。
}
。
\noindent
反问题是指:当观测到
$
y
$
时,能否求出
$
x
$
。反问题对应了很多实际问题,比如,可以把
$
y
$
看作经过美化的图片,
$
x
$
看作原始的图片,反问题就对应了图片还原。机器翻译的训练也是一种反问题,因为可以把
$
y
$
看作是正确的译文,
$
x
$
看作是输入句子或者模型参数
\footnote
{
在训练中,如果把源语言句子看作是不变的量,这时
$
f
$
的
输入只有模型参数。
}
。
\parinterval
理想的情况下,我们希望反问题的解是
{
\small\bfnew
{
适定的
}}
\index
{
适定的
}
(Well-posed)
\index
{
Well-posed
}
。所谓适定解,需要满足三个条件:解是存在的、解是唯一的、解是稳定的(即
$
x
$
微小的变化会导致
$
y
$
微小的变化,也被称作解连续)。所有不存在唯一稳定解的问题都被称作
{
\small\bfnew
{
不适定问题
}}
\index
{
不适定问题
}
(Ill-posed Problem)
\index
{
Ill-posed Problem
}
。对于机器学习问题,解的存在性比较容易理解。解的唯一性大多由问题决定。比如,如果把描述问题的函数
$
f
(
\cdot
)
$
看作一个
$
n
\times
n
$
矩阵
$
\mathbf
{
A
}$
,
$
x
$
和
$
y
$
都看作是
$
n
$
维向量。那么
$
x
$
不唯一的原因在于
$
\mathbf
{
A
}$
不满秩(非奇异矩阵)。不过,存在性和唯一性并不会对机器学习方法造成太大困扰,因为在实践中往往会找到近似的解。
\parinterval
理想的情况下,我们希望反问题的解是
{
\small\bfnew
{
适定的
}}
\index
{
适定的
}
(Well-posed)
\index
{
Well-posed
}
。所谓适定解,需要满足三个条件:解是存在的、解是唯一的、解是稳定的(即
$
y
$
微小的变化会导致
$
x
$
微小的变化,也被称作解连续)。所有不存在唯一稳定解的问题都被称作
{
\small\bfnew
{
不适定问题
}}
\index
{
不适定问题
}
(Ill-posed Problem)
\index
{
Ill-posed Problem
}
。对于机器学习问题,解的存在性比较容易理解。解的唯一性大多由问题决定。比如,如果把描述问题的函数
$
f
(
\cdot
)
$
看作一个
$
n
\times
n
$
矩阵
$
\mathbf
{
A
}$
,
$
x
$
和
$
y
$
都看作是
$
n
$
维向量。那么
$
x
$
不唯一的原因在于
$
\mathbf
{
A
}$
不满秩(非奇异矩阵)。不过,存在性和唯一性并不会对机器学习方法造成太大困扰,因为在实践中往往会找到近似的解。
\parinterval
但是,解的稳定性却
带来了很大的挑战。因为神经机器翻译模型非常复杂,里面存在大量的矩阵乘法和非线性变化。这导致
$
f
(
\cdot
)
$
往往是不稳定的,也就是说,神经机器翻译中输出
$
y
$
的微小变化会导致输入
$
x
$
的巨大变化。比如,在系统研发中经常会发现,即使对训练样本进行细致的调整
,模型训练得到的参数会有非常明显的区别。不仅如此,神经机器翻译模型参数解的稳定性还存在两方面问题:
\parinterval
但是,解的稳定性却
给神经机器翻译带来了很大的挑战。因为神经机器翻译模型非常复杂,里面存在大量的矩阵乘法和非线性变化。这导致
$
f
(
\cdot
)
$
往往是不稳定的,也就是说,神经机器翻译中输出
$
y
$
的微小变化会导致输入
$
x
$
的巨大变化。比如,在系统研发中经常会发现,即使训练样本发生很小的变化
,模型训练得到的参数会有非常明显的区别。不仅如此,神经机器翻译模型参数解的稳定性还存在两方面问题:
\begin{itemize}
\item
观测数据不充分。由于语言现象的多样性,训练样本只能覆盖非常有限的翻译现象。从样本的表示空间上看,对于没有观测样本的区域,我们根本无法知道真实解的样子,更不用说稳定性训练了。
\vspace
{
0.3em
}
\item
观测数据不充分。由于语言现象的多样性,训练样本只能覆盖非常有限的翻译现象。从样本的表示空间上看,对于没有观测样本的区域,根本无法知道真实解的样子,更不用说稳定性训练了。
\vspace
{
0.3em
}
\item
数据中存在噪声。噪声问题是稳定性训练最大的挑战之一。因为,即使是很小的噪声,也可能会导致解的巨大变化。
\vspace
{
0.3em
}
\end{itemize}
\parinterval
以上问题体现出来的现象就是过拟合。因为训练数据有限同时存在噪声,因此模型参数会过分拟合噪声数据。而且,这样的模型参数又与真实(理想)的模型参数相差很远。正则化正是针对这个问题。有时候,正则化也被称作
{
\small\bfnew
{
降噪
}}
\index
{
降噪
}
(Denoising)
\index
{
Denoising
}
,虽然它的出发点并不只是去除噪声的影响。图
\ref
{
fig:7-11
}
对比了不同函数对二维空间中一些数据点的拟合情况。在过拟合现象中,函数可以完美的拟合所有的数据点,即使有些数据点是噪声。
...
...
@@ -402,7 +404,7 @@ y = f(x)
\parinterval
正则化的一种实现是在训练目标中引入一个正则项。在神经机器翻译中,引入正则项的训练目标为:
\begin{eqnarray}
\hat
{
\mathbf
{
w
}}
=
\
textrm
{
argmax
}
_{
\mathbf
{
w
}}
L(
\mathbf
{
w
}
) +
\lambda
R(
\mathbf
{
w
}
)
\hat
{
\mathbf
{
w
}}
=
\
argmax
_{
\mathbf
{
w
}}
L(
\mathbf
{
w
}
) +
\lambda
R(
\mathbf
{
w
}
)
\label
{
eqC7.2
}
\end{eqnarray}
...
...
@@ -436,9 +438,9 @@ R(\mathbf{w}) & = & (\big| |\mathbf{w}| {\big|}_2)^2 \\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection
{
标签平滑
}
\parinterval
神经机器翻译在每个目标语位置
$
j
$
会输出一个分布
$
\mathbf
{
y
}
_
j
$
,这个分布描述了每个目标语言单词出现的可能性。在训练时,每个目标语言位置上的答案是一个单词,也就对应了One-hot分布
$
\tilde
{
y
}_
j
$
,它仅仅在正确答案那一维为1,其它维均为0。模型训练可以被看作是一个调整模型参数让
$
y
_
j
$
逼近
$
\tilde
{
y
}_
j
$
的过程。但是,
$
\tilde
{
y
}_
j
$
的每一个维度是一个非0即1的目标,这样也就无法考虑类别之间的相关性。具体来说,除非模型在答案那一维输出1,否则都会得到惩罚。即使模型把一部分概率分配给与答案相近的单词(比如同义词),这个相近的单词仍被视为完全错误的预测。
\parinterval
神经机器翻译在每个目标语位置
$
j
$
会输出一个分布
$
y
_
j
$
,这个分布描述了每个目标语言单词出现的可能性。在训练时,每个目标语言位置上的答案是一个单词,也就对应了One-hot分布
$
\tilde
{
y
}_
j
$
,它仅仅在正确答案那一维为1,其它维均为0。模型训练可以被看作是一个调整模型参数让
$
y
_
j
$
逼近
$
\tilde
{
y
}_
j
$
的过程。但是,
$
\tilde
{
y
}_
j
$
的每一个维度是一个非0即1的目标,这样也就无法考虑类别之间的相关性。具体来说,除非模型在答案那一维输出1,否则都会得到惩罚。即使模型把一部分概率分配给与答案相近的单词(比如同义词),这个相近的单词仍被视为完全错误的预测。
\parinterval
标签平滑(Label Smoothing)的思想很简单
\cite
{
Szegedy
_
2016
_
CVPR
}
:答案所对应的单词不应该``独享''所有的概率,其它单词应该有机会作为答案。这个观点与第二章中语言模型的平滑非常类似。在复杂模型的参数估计中,往往需要给未见或者低频事件分配一些概率,以保证模型具有更好的泛化能力。具体实现时,标签平滑使用了一个额外的分布
$
q
$
,它是在词汇表
$
V
$
上的一个均匀分布,即
$
q
(
k
)=
\frac
{
1
}{
|V|
}$
,其中
$
q
(
k
)
$
表示分布的第
$
k
$
维。然后,答案分布被重新定义为
$
\tilde
{
y
}_
j
$
和
$
q
$
的线性插值:
\parinterval
{
\small\bfnew
{
标签平滑
}}
\index
{
标签平滑
}
(Label Smoothing)
\index
{
Label Smoothing
}
的思想很简单
\cite
{
Szegedy
_
2016
_
CVPR
}
:答案所对应的单词不应该``独享''所有的概率,其它单词应该有机会作为答案。这个观点与第二章中语言模型的平滑非常类似。在复杂模型的参数估计中,往往需要给未见或者低频事件分配一些概率,以保证模型具有更好的泛化能力。具体实现时,标签平滑使用了一个额外的分布
$
q
$
,它是在词汇表
$
V
$
上的一个均匀分布,即
$
q
(
k
)=
\frac
{
1
}{
|V|
}$
,其中
$
q
(
k
)
$
表示分布的第
$
k
$
维。然后,答案分布被重新定义为
$
\tilde
{
y
}_
j
$
和
$
q
$
的线性插值:
\begin{eqnarray}
y
_{
j
}^{
ls
}
=(1-
\alpha
)
\cdot
\tilde
{
y
}_
j +
\alpha
\cdot
q
\label
{
eqC7.5
}
...
...
@@ -458,12 +460,14 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\parinterval
标签平滑也可以被看作是对损失函数的一种调整,并引入了额外的先验知识(即与
$
q
$
相关的部分)。只不过这种先验知识并不是通过线性插值的方式与原始损失函数融合的公式
\ref
{
eqC7.2
}
)。
\parinterval
标签平滑也可以被看作是对损失函数的一种调整,并引入了额外的先验知识(即与
$
q
$
相关的部分)。只不过这种先验知识并不是通过线性插值的方式与原始损失函数融合的
(
公式
\ref
{
eqC7.2
}
)。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection
{
Dropout
}
\parinterval
神经机器翻译模型是一种典型的多层神经网路模型。每一层网络都包含若干神经元,负责接收前一层所有神经元的输出,并进行诸如代数乘、加等变换,并有选择的使用非线性的激活函数,最终得到当前层每个神经元的输出。从模型最终预测的角度看,每个神经元都在参与最终的预测。理想的情况下,我们希望每个神经元都能相互独立的做出``贡献''。这样的模型会更加健壮,因为即使一部分神经元不能正常工作,其它神经元仍然可以独立做出合理的预测。但是,随着每一层神经元数量的增加以及网络结构的复杂化,研究者发现神经元之间会出现
{
\small\bfnew
{
相互适应
}}
\index
{
相互适应
}
(Co-Adaptation)
\index
{
Co-Adaptation
}
的现象。所谓相互适应是指,一个神经元对输出的贡献与同一层其它神经元的行为是相关的,也就是说这个神经元已经适应到它周围的``环境''中。相互适应的好处在于神经网络可以处理更加复杂的问题,因为联合使用两个神经元要比单独使用每个神经元的表示能力强。这也类似于传统机器学习任务中往往会设计一些高阶特征,比如自然语言序列标注中对bi-gram和tri-gram的使用。不过另一方面,相互适应会导致模型变得更加``脆弱''。因为相互适应的神经元可以更好的描述训练数据中的现象,但是在测试数据上,由于很多现象是未见的,细微的扰动会导致神经元无法适应。具体体现出来就是过拟合问题。
\parinterval
神经机器翻译模型是一种典型的多层神经网路模型。每一层网络都包含若干神经元,负责接收前一层所有神经元的输出,并进行诸如乘法、加法等变换,并有选择的使用非线性的激活函数,最终得到当前层每个神经元的输出。从模型最终预测的角度看,每个神经元都在参与最终的预测。理想的情况下,我们希望每个神经元都能相互独立的做出``贡献''。这样的模型会更加健壮,因为即使一部分神经元不能正常工作,其它神经元仍然可以独立做出合理的预测。但是,随着每一层神经元数量的增加以及网络结构的复杂化,研究者发现神经元之间会出现
{
\small\bfnew
{
相互适应
}}
\index
{
相互适应
}
(Co-Adaptation)
\index
{
Co-Adaptation
}
的现象。所谓相互适应是指,一个神经元对输出的贡献与同一层其它神经元的行为是相关的,也就是说这个神经元已经适应到它周围的``环境''中。
\parinterval
相互适应的好处在于神经网络可以处理更加复杂的问题,因为联合使用两个神经元要比单独使用每个神经元的表示能力强。这也类似于传统机器学习任务中往往会设计一些高阶特征,比如自然语言序列标注中对bi-gram和tri-gram的使用。不过另一方面,相互适应会导致模型变得更加``脆弱''。因为相互适应的神经元可以更好的描述训练数据中的现象,但是在测试数据上,由于很多现象是未见的,细微的扰动会导致神经元无法适应。具体体现出来就是过拟合问题。
\parinterval
Dropout是解决这个问题的一种常用方法
\cite
{
DBLP:journals/corr/abs-1207-0580
}
。方法很简单,在训练时随机让一部分神经元停止工作,这样每次参数更新中每个神经元周围的环境都在变化,它就不会过分适应到环境中。图
\ref
{
fig:7-13
}
中给出了某一次参数训练中使用Dropout之前和之后的状态对比。
...
...
@@ -489,9 +493,9 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\parinterval
对于新的样本,可以使用Dropout训练之后的模型对其进行推断,但是每个神经元的输出要乘以
$
1
-
p
$
,以保证每层神经元输出的期望和训练时是一样的。另一种常用的做法是,在训练时对于每个神经元的输出乘以
$
\frac
{
1
}{
(
1
-
p
)
}$
,这样
在推断时神经网络可以不经过任何调整即可直接使用。
\parinterval
对于新的样本,可以使用Dropout训练之后的模型对其进行推断,但是每个神经元的输出要乘以
$
1
-
p
$
,以保证每层神经元输出的期望和训练时是一样的。另一种常用的做法是,在训练时对于每个神经元的输出乘以
$
\frac
{
1
}{
1
-
p
}$
,然后
在推断时神经网络可以不经过任何调整即可直接使用。
\parinterval
Dropout方法的另一种解释是,训练中屏蔽掉一些神经元相当于从原始的神经网络中抽取出了一个子网络。这样,每次训练都在一个随机生成的子网络上进行,而不同子网络之间的参数是共享的。在推断时,则把所有的子网络集成到一起。这种思想也有一些
{
\small\bfnew
{
集成学习
}}
\index
{
集成学习
}
(Ensemble Learning)
\index
{
Ensemble Learning
}
的味道。只不
过集成学习中子模型(或子网络)大多是启发性设计的,而Dropout中
是在指数级空间中采样出来的。由于Dropout可以很好的缓解复杂神经模型的过拟合问题,因此也成为了大多数神经机器翻译系统的标配。
\parinterval
Dropout方法的另一种解释是,训练中屏蔽掉一些神经元相当于从原始的神经网络中抽取出了一个子网络。这样,每次训练都在一个随机生成的子网络上进行,而不同子网络之间的参数是共享的。在推断时,则把所有的子网络集成到一起。这种思想也有一些
{
\small\bfnew
{
集成学习
}}
\index
{
集成学习
}
(Ensemble Learning)
\index
{
Ensemble Learning
}
的味道。只不
Dropout中子模型(或子网络)
是在指数级空间中采样出来的。由于Dropout可以很好的缓解复杂神经模型的过拟合问题,因此也成为了大多数神经机器翻译系统的标配。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection
{
Layer Dropout
}
...
...
@@ -508,7 +512,7 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\parinterval
Layer Dropout可以被理解为在一个
超网络(即原始网络)中随机采样出一个由若干层网络构成的子网络。不同子
网络所对应的同一层的模型参数是共享的。这也达到了对指数级子网络高效训练的目的。需要注意的是,在推断阶段,每层的输出需要乘以
$
1
-
p
$
,确保训练时每层输出的期望和解码是一致的。Layer Dropout可以非常有效的缓解深层网路中的过拟合问题。在
\ref
{
subsection-7.3.1
}
节还会看到Layer Dropout可以成功的帮助我们训练Deep Transformer模型。
\parinterval
Layer Dropout可以被理解为在一个
深网络(即原始网络)中随机采样出一个由若干层网络构成的``浅''网络。不同``浅''
网络所对应的同一层的模型参数是共享的。这也达到了对指数级子网络高效训练的目的。需要注意的是,在推断阶段,每层的输出需要乘以
$
1
-
p
$
,确保训练时每层输出的期望和解码是一致的。Layer Dropout可以非常有效的缓解深层网路中的过拟合问题。在
\ref
{
subsection-7.3.1
}
节还会看到Layer Dropout可以成功的帮助我们训练Deep Transformer模型。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection
{
增大模型容量
}
...
...
@@ -516,16 +520,20 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\parinterval
神经机器翻译是一种典型的多层神经网络。一方面,可以通过设计合适的网络连接方式和激活函数来捕捉复杂的翻译现象;另一方面,越来越多的可用数据让模型能够得到更有效的训练。在训练数据较为充分的情况下,设计更加``复杂''的模型成为了提升系统性能的有效手段。比如,Transformer模型有两个常用配置Transformer-Base和Transformer-Big。其中,Transformer-Big比Transformer-Base使用了更多的神经元,相应的翻译品质更优
\cite
{
vaswani2017attention
}
。
\parinterval
那么是否还有类似的方法可以改善系统性能呢?答案是显然肯定的。这里,把这类方法统称为基于大容量模型的方法。在传统机器学习的观点中,神经网络的性能不仅依赖于架构设计,同样与容量密切相关。那么什么是模型的
{
\small\bfnew
{
容量
}}
\index
{
容量
}
(Capacity)
\index
{
Capacity
}
?简单理解,容量是指神经网络的参数量,即神经元之间连接权重的个数。另一种定义是把容量看作神经网络所能表示的假设空间大小
\cite
{
deeplearning
}
,也就是神经网络能表示的不同函数所构成的空间。
而学习一个神经网络就是要找到一个``最优''的函数,它可以准确地拟合数据。当假设空间变大时,训练系统有机会找到更好的函数,但是同时也需要依赖更多的训练样本才能完成最优函数的搜索。相反,当假设空间变小时,训练系统会更容易完成函数搜索,但是很多优质的函数可能都没有包含在假设空间里。这也体现了一种简单的辩证思想:如果训练(搜索)的代价高,会有更大的机会找到更好的解;另一方面,如果想少花力气进行训练(搜索),那就设计一个小一些的假设空间,在小一些规模的样本集上进行训练,当然搜索到的解可能不是最好的。
\parinterval
那么是否还有类似的方法可以改善系统性能呢?答案是显然肯定的。这里,把这类方法统称为基于大容量模型的方法。在传统机器学习的观点中,神经网络的性能不仅依赖于架构设计,同样与容量密切相关。那么什么是模型的
{
\small\bfnew
{
容量
}}
\index
{
容量
}
(Capacity)
\index
{
Capacity
}
?简单理解,容量是指神经网络的参数量,即神经元之间连接权重的个数。另一种定义是把容量看作神经网络所能表示的假设空间大小
\cite
{
deeplearning
}
,也就是神经网络能表示的不同函数所构成的空间。
\parinterval
在很多机器翻译任务中,训练数据是相对充分的。这时增加模型容量是提升性能很好的一种选择。常见的方法有三种:
\parinterval
而学习一个神经网络就是要找到一个``最优''的函数,它可以准确地拟合数据。当假设空间变大时,训练系统有机会找到更好的函数,但是同时也需要依赖更多的训练样本才能完成最优函数的搜索。相反,当假设空间变小时,训练系统会更容易完成函数搜索,但是很多优质的函数可能都没有包含在假设空间里。这也体现了一种简单的辩证思想:如果训练(搜索)的代价高,会有更大的机会找到更好的解;另一方面,如果想少花力气进行训练(搜索),那就设计一个小一些的假设空间,在小一些规模的样本集上进行训练,当然搜索到的解可能不是最好的。
\begin{itemize}
\item
{
\small\bfnew
{
增加隐藏层维度
}}
:即增加网络宽度,加强每一层网络的线性拟合能力。
\parinterval
在很多机器翻译任务中,训练数据是相对充分的。这时增加模型容量是提升性能的一种很好的选择。常见的方法有三种:
\item
{
\small\bfnew
{
增加网络的整体层数
}}
:即增加网络深度,利用更多的线性和非线性变换来获得更复杂的特征抽取能力。
\item
{
\small\bfnew
{
增大输入层和输出层的表示能力
}}
:即增强模型对词表中每个词的表示能力。
\begin{itemize}
\vspace
{
0.3em
}
\item
增加隐藏层维度:即增加网络宽度,加强每一层网络的线性拟合能力。
\vspace
{
0.3em
}
\item
增加网络的整体层数:即增加网络深度,利用更多的线性和非线性变换来获得更复杂的特征抽取能力。
\vspace
{
0.3em
}
\item
增大输入层和输出层的表示能力:即增强模型对词表中每个词的表示能力。
\vspace
{
0.3em
}
\end{itemize}
%%%%%%%%%%%%%%%%%%
...
...
@@ -533,7 +541,7 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\parinterval
宽网络通常指隐藏层维度更大的网络,目前在图像处理领域和自然语言处理领域被广泛地使用。第五章已经验证了包含足够多神经元的多层前馈神经网络可以无限逼近任意复杂的连续函数
\cite
{
Hornic1989Multilayer
}
,这也在一定程度上说明了神经网络建模中神经元数目的重要性。
\parinterval
增大隐藏层神经元的数目是网络变宽的基本方式之一。例如,图像处理领域中提出的
{
\small\bfnew
{
宽残差网络
}}
\index
{
宽残差网络
}
(Wide Residual Network)
\index
{
Wide Residual Network
}
使用更大的卷积核来提高每次卷积计算的精度
\cite
{
DBLP:journals/corr/ZagoruykoK16
}
;神经机器翻译中,Transformer-Big模型广受研究人员的认可,它同样是一个典型的宽网络。对比基线模型Transformer-Base,Transformer-Big通过扩大隐藏层维度与滤波器(Filter)维度,取得了显著的翻译性能提升。表
\ref
{
tab:Parameter-setting
}
是相应的参数设置。
\parinterval
增大隐藏层神经元的数目是网络变宽的基本方式之一。例如,图像处理领域中提出的
{
\small\bfnew
{
宽残差网络
}}
\index
{
宽残差网络
}
(Wide Residual Network)
\index
{
Wide Residual Network
}
使用更大的卷积核来提高每次卷积计算的精度
\cite
{
DBLP:journals/corr/ZagoruykoK16
}
;神经机器翻译中,Transformer-Big模型广受研究人员的认可
(
{
\red
参考文献!
}
)
,它同样是一个典型的宽网络。对比基线模型Transformer-Base,Transformer-Big通过扩大隐藏层维度与滤波器(Filter)维度,取得了显著的翻译性能提升。表
\ref
{
tab:Parameter-setting
}
是相应的参数设置。
%----------------------------------------------
% 表
...
...
@@ -558,9 +566,9 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
%%%%%%%%%%%%%%%%%%
\subsubsection
{
深网络
}
\parinterval
虽然,理论上宽网络有能力拟合任意的函数,但是获得这种能力的代价是非常高的。在实践中,往往需要增加相当的宽度,以极大的训练代价才能换来少量的性能提升。
这种现象当神经网络达到一定宽度后
更为严重。``无限''增加宽度显然是不现实的。
\parinterval
虽然,理论上宽网络有能力拟合任意的函数,但是获得这种能力的代价是非常高的。在实践中,往往需要增加相当的宽度,以极大的训练代价才能换来少量的性能提升。
当神经网络达到一定宽度后这种现象
更为严重。``无限''增加宽度显然是不现实的。
\parinterval
因此,另一种思路是使用更深的网络以增加模型的容量。深网络是指包含更多层的神经网络。相比宽网络的参数量随着宽度呈平方增长,深网络的参数量与深度呈线性增长。这带给深网络一个优点:在同样参数量下可以通过更多的非线性变换来对问题进行描述。这也赋予了深网络对复杂问题建模的能力。比如,在图像识别领域
很多先进的系统都是基于很深的神经网络,甚至在一些任务上最好的的结果需要1000
层以上的神经网络。
\parinterval
因此,另一种思路是使用更深的网络以增加模型的容量。深网络是指包含更多层的神经网络。相比宽网络的参数量随着宽度呈平方增长,深网络的参数量与深度呈线性增长。这带给深网络一个优点:在同样参数量下可以通过更多的非线性变换来对问题进行描述。这也赋予了深网络对复杂问题建模的能力。比如,在图像识别领域
,很多先进的系统都是基于很深的神经网络,甚至在一些任务上最好的的结果需要1000
层以上的神经网络。
\parinterval
宽网络和深网络是增加模型表示能力的两个维度。宽网络相当于增强了模型线性变换的能力,将模型的输入在更高维度的空间上进行抽象;深网络通过引入更多的层构建了多个表示空间,通过逐层的变换,在多个表示空间上对输入进行多次抽象。二者在有些情况下甚至可以相互转换。
...
...
@@ -569,11 +577,13 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\parinterval
类似的现象也出现在基于语言模型的预训练任务中。比如,研究人员通过使用
{
\small\bfnew
{
探测任务
}}
\index
{
探测任务
}
(Probing Task)
\index
{
Probing Task
}
来分析12层的BERT模型中的不同层所表示的含义
\cite
{
ethayarajh-2019-contextual
}
\cite
{
DBLP:conf/acl/JawaharSS19
}
:
\begin{itemize}
\item
{
\small\bfnew
{
浅层网络表示
}}
\index
{
浅层网络表示
}
:网络的底层部分更擅长处理词串的
{
\small\bfnew
{
表面信息
}}
\index
{
表面信息
}
(Surface Information)
\index
{
Surface Information
}
,例如词性选择、词义消歧等。
\item
{
\small\bfnew
{
中间层的表示
}}
\index
{
中间层的表示
}
:中间层部分更关注于
{
\small\bfnew
{
语法信息
}}
\index
{
语法信息
}
(Syntactic Information)
\index
{
Syntactic Information
}
\item
{
\small\bfnew
{
顶层网络的表示
}}
\index
{
顶层网络的表示
}
:上层部分更擅长处理
{
\small\bfnew
{
语义信息
}}
\index
{
语义信息
}
(Semantic Information)
\index
{
Semantic Information
}
\vspace
{
0.3em
}
\item
浅层网络表示:网络的底层部分更擅长处理词串的
{
\small\bfnew
{
表面信息
}}
\index
{
表面信息
}
(Surface Information)
\index
{
Surface Information
}
,例如词性选择、词义消歧等。
\vspace
{
0.3em
}
\item
中间层的表示:中间层部分更关注于
{
\small\bfnew
{
语法信息
}}
\index
{
语法信息
}
(Syntactic Information)
\index
{
Syntactic Information
}
\vspace
{
0.3em
}
\item
顶层网络的表示:上层部分更擅长处理
{
\small\bfnew
{
语义信息
}}
\index
{
语义信息
}
(Semantic Information)
\index
{
Semantic Information
}
\vspace
{
0.3em
}
\end{itemize}
\parinterval
目前在神经机器翻译领域,研究人员发现编码端的表示能力对翻译性能有较大的影响,因此通过加深编码网络是一种有效的改进系统的手段(如图
\ref
{
fig:7-16
}
)。而且,增加编码端的深度对模型推断的速度并没有较大影响,因为整个序列可以通过GPU进行并行计算。
...
...
@@ -605,16 +615,16 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection
{
大批量训练
}
\parinterval
在第六章已经介绍了神经机器翻译模型需要使用梯度下降方法进行训练。其中,一项非常重要的技术就是
小批量训练(Mini-batch Training),即每次使用多个样本来获取梯度并对模型参数进行更新。这里将每次参数更新使用的多个样本集合称为批次,将样本的数量称作批次的大小。在机器翻译中,通常用批次中的源语言/目标语言单词数或者句子数来表示批次大小。理论上,过小的批次会带来训练的不稳定,而且参数更新次数会大大增加。因此,很多研究者尝试增加批次大小来提高训练的稳定性。在Transformer模型中,使用更大的批次已经被验证是有效的。这种方法也被称作大批量训练。不过,这里所谓``
大''批量是一个相对的概念。下面就一起看一看如何使用合适的批次大小来训练神经机器翻译模型。
\parinterval
在第六章已经介绍了神经机器翻译模型需要使用梯度下降方法进行训练。其中,一项非常重要的技术就是
{
\small\bfnew
{
小批量训练
}}
\index
{
小批量训练
}
(Mini-batch Training)
\index
{
Mini-batch Training
}
,即每次使用多个样本来获取梯度并对模型参数进行更新。这里将每次参数更新使用的多个样本集合称为批次,将样本的数量称作批次的大小。在机器翻译中,通常用批次中的源语言/目标语言单词数或者句子数来表示批次大小。理论上,过小的批次会带来训练的不稳定,而且参数更新次数会大大增加。因此,很多研究者尝试增加批次大小来提高训练的稳定性。在Transformer模型中,使用更大的批次已经被验证是有效的。这种方法也被称作大批量训练。不过,这里所谓``
大''批量是一个相对的概念。下面就一起看一看如何使用合适的批次大小来训练神经机器翻译模型。
%%%%%%%%%%%%%%%%%%
\subsubsection
{
为什么需要大批量训练
}
\parinterval
在模型训练的过程中,训练批次的大小对模型的收敛状态有很大影响,合理选择批次的大小往往会取得事半功倍的效果。较大的批次可以保证模型每次更新时梯度是在较多的样本上计算,其梯度结果更准确,有效地缓解训练中出现的性能震荡的问题。此外,较大的批次可以让模型在更新次数更少的情况下遍历整个数据集。同时大矩阵运算在GPU上的并行度更高,提高了设备的利用率。
\parinterval
然而,批次也不是越大越好,要根据训练数据集的规模与模型的容量做出合理的选择。此外,GPU显存的大小也对批次大小有约束,因为过大的批次可能无法放入GPU显存中。另一方面,
倘若批次大小增加到一定程度,同时模型的表示能力有限时,梯度方向可能不会对模型更新有很好的指示作用,这时训练更容易陷入局部最优解。此外,
在一些场景例中,如增量式训练、领域迁移,往往需要对模型进行微调。这时,常用的做法是使用小批次并固定较小的学习率,防止现有的模型参数发生较大的偏离。
\parinterval
然而,批次也不是越大越好,要根据训练数据集的规模与模型的容量做出合理的选择。此外,GPU显存的大小也对批次大小有约束,因为过大的批次可能无法放入GPU显存中。另一方面,在一些场景例中,如增量式训练、领域迁移,往往需要对模型进行微调。这时,常用的做法是使用小批次并固定较小的学习率,防止现有的模型参数发生较大的偏离。
\parinterval
那么什么时候需要利用大批次进行训练呢?批次大小是多少为合适呢?大多数情况下讨论批次的大小是指单独一块GPU上的数据量,然而考虑到利用数据并行进行分布式训练时,批次大小等于所有GPU
中批次大小的和。下面以Transformer模型为例。通常Transformer-Base模型使用4096词/GPU的批次在8张GPU上进行训练,此时真实批次大小为
$
4096
\times
8
=
32768
$
词。伴随着模型容量的进一步增加,例如Transformer-Big模型,由于训练过程中网络的中间表示要消耗大量的GPU显存,可能会考虑减小批次的大小并使用累计梯度的方式来保证稳定的训练。累计梯度是一种大批量训练的常用手段,即按照一定频率缓存多个相邻批次的梯度后再进行参数的更新。比如,为了获取大批次,可以考虑将累计的更新频率设置为2或4。图
\ref
{
fig:7-17
}
给出了累计梯度的参数更新方法。
\parinterval
大多数情况下讨论批次的大小是指单独一块GPU上的数据量,然而考虑到利用数据并行进行分布式训练时,批次大小等于所有GPU
中批次大小的和。下面以Transformer模型为例。通常Transformer-Base模型使用4096词/GPU的批次在8张GPU上进行训练,此时真实批次大小为
$
4096
\times
8
=
32768
$
词。伴随着模型容量的进一步增加,例如Transformer-Big模型,由于训练过程中网络的中间表示要消耗大量的GPU显存,可能会考虑减小批次的大小并使用累计梯度的方式来保证稳定的训练。累计梯度是一种大批量训练的常用手段,即按照一定频率缓存多个相邻批次的梯度后再进行参数的更新。比如,为了获取大批次,可以考虑将累计的更新频率设置为2或4。图
\ref
{
fig:7-17
}
给出了累计梯度的参数更新方法。
%----------------------------------------------
% 图7.
...
...
@@ -646,12 +656,13 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
%%%%%%%%%%%%%%%%%%
\subsubsection
{
如何构建批次
}
\parinterval
由于不同句子之间的长度有明显的差异,这时批次所占用的显存/内存大小由其中最长句子的长度决定。
研究人员通常使用填充
(Padding)的方式对一个批次中句长不足的部分用空白填充(见第六章)。但由于生成批次的方式不同,最终批次内的Padding数量各不相同,因此合理选择生成批次的方式也是至关重要的。通常有几种方法:
\parinterval
由于不同句子之间的长度有明显的差异,这时批次所占用的显存/内存大小由其中最长句子的长度决定。
通常使用
{
\small\bfnew
{
填充
}}
(Padding)的方式对一个批次中句长不足的部分用空白填充(见第六章)。但由于生成批次的方式不同,最终批次内的Padding数量各不相同,因此合理选择生成批次的方式也是至关重要的。通常有几种方法:
\begin{itemize}
\item
{
\small\bfnew
{
随机生成
}}
:根据预先定义好的句子数生成批次。最简单的方式是从整个数据集中按照批次的大小随机生成对应的批次。这种方式可以有效地保证样本间的随机性,但随机生成的批次中不同句子之间的长度会有很较大区别,因此Padding数量较多,导致显卡的利用率较低。
\item
{
\small\bfnew
{
按句长排序
}}
:同样是根据句子数量生成批次。为了减少显卡利用率低的问题,可以根据源语言或者目标语言的句子长度进行排序,让相邻句长的样本更为相近(图
\ref
{
fig:7-18
}
)。这样在同一个批次中不会因为句长差异过大造成设备利用率的降低。
\vspace
{
0.3em
}
\item
随机生成:最简单的方式是从整个数据集中随机生成批次。这种方式可以有效地保证样本间的随机性,但随机生成的批次中不同句子之间的长度会有很较大区别,因此Padding数量较多,导致显卡的利用率较低。
\vspace
{
0.3em
}
\item
按句长排序:为了减少显卡利用率低的问题,可以根据源语言或者目标语言的句子长度进行排序,让相邻句长的样本更为相近(图
\ref
{
fig:7-18
}
)。这样在同一个批次中不会因为句长差异过大造成设备利用率的降低。
%----------------------------------------------
% 图7.
...
...
@@ -663,9 +674,12 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\item
{
\small\bfnew
{
按词数排序
}}
:另外一种方式是按照单词数构建批次。对比按照句长生成批次,该方式可以防止某些批次中句子整体长度特别长或者特别短的情况,保证不同批次之间整体的词数处于大致相同的范围,这样所得到的梯度也是可比较的。通常的做法是根据源语言词数、目标语言词数,或者源语词数与目标语言词数的最大值等指标生成批次。
\vspace
{
0.3em
}
\item
按词数排序:另外一种方式是按照单词数构建批次。对比按照句长生成批次,该方式可以防止某些批次中句子整体长度特别长或者特别短的情况,保证不同批次之间整体的词数处于大致相同的范围,这样所得到的梯度也是可比较的。通常的做法是根据源语言词数、目标语言词数,或者源语言词数与目标语言词数的最大值等指标生成批次。
\item
{
\small\bfnew
{
按课程学习的方式
}}
:考虑样本的``难度''也是生成批次的一种策略。比如,可以使用
{
\small\bfnew
{
课程学习
}}
\index
{
课程学习
}
(Curriculum Learning)
\index
{
Curriculum Learning
}
的思想
\cite
{
bengioCurriculumlearning
}
,让系统先学习``简单''的样本,之后逐渐增加样本的难度,达到循序渐进的学习。具体来说,可以利用句子长度、词频等指标计算每个批次的``难度'',记为
$
d
$
。之后,选择满足
$
d
\leq
c
$
的样本构建一个批次。这里,
$
c
$
表示难度的阈值,它可以随着训练的执行不断增大。
\vspace
{
0.3em
}
\item
按课程学习的方式:考虑样本的``难度''也是生成批次的一种策略。比如,可以使用
{
\small\bfnew
{
课程学习
}}
\index
{
课程学习
}
(Curriculum Learning)
\index
{
Curriculum Learning
}
的思想
\cite
{
bengioCurriculumlearning
}
,让系统先学习``简单''的样本,之后逐渐增加样本的难度,达到循序渐进的学习。具体来说,可以利用句子长度、词频等指标计算每个批次的``难度'',记为
$
d
$
。 之后,选择满足
$
d
\leq
c
$
的样本构建一个批次。这里,
$
c
$
表示难度的阈值,它可以随着训练的执行不断增大。
\vspace
{
0.3em
}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
...
...
@@ -679,38 +693,46 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\parinterval
神经机器翻译的推断通常包含三方面问题:
\begin{itemize}
\item
搜索的准确性,也就是搜索到结果的好坏;
\item
搜索的速度,也就是翻译时延(Latency);
\vspace
{
0.3em
}
\item
搜索的
{
\small\bfnew
{
准确性
}}
(Accuracy),也就是搜索到结果的好坏;
\vspace
{
0.3em
}
\item
搜索的
{
\small\bfnew
{
时延
}}
(Latency),也就是翻译速度;
\vspace
{
0.3em
}
\item
搜索所需要的存储,也就是模型运行时的内存或显存消耗。
\vspace
{
0.3em
}
\end{itemize}
\parinterval
准确性通常是研究人员最关心的问题。作为一个搜索过程,需要依据某种指标(如模型得分)找到样本空间中的一个或者若干个样本。不过,机器翻译是一个NP难问题,对整个样本空间进行全搜索显然是十分困难的
\cite
{
Knight1999Decoding
}
。因此,我们需要优化搜索算法,并配合剪枝等策略,最终得到一个尽可能逼近全局最优解的搜索结果。如果搜索算法没有找到全局最优解,这时称系统出现了
{
\small\bfnew
{
搜索错误
}}
\index
{
搜索错误
}
(Search Error)
\index
{
Search Error
}
。如果模型打分不准确造成没有把最好的翻译排序到第一,这时称系统出现了
{
\small\bfnew
{
模型错误
}}
\index
{
模型错误
}
(Modeling Error)
\index
{
Modeling Error
}
。模型错误是由建模和模型训练等因素决定的,而搜索错误一般是由搜索算法决定的。在早期的机器翻译研究中,搜索错误是机器翻译问题的主要来源之一。不过随着技术的进步,研究者逐渐发现,机器翻译系统的错误更多的集中在模型错误上
\cite
{
Stahlberg2019OnNS
}
。特别是在神经机器翻译时代,绝大多数研究工作都是在解决模型错误。
\parinterval
准确性通常是研究人员最关心的问题。作为一个搜索过程,需要依据某种指标(如模型得分)找到样本空间中的一个或者若干个样本。不过,机器翻译是一个NP难问题,对整个样本空间进行全搜索显然是十分困难的
\cite
{
Knight1999Decoding
}
。因此,需要优化搜索算法,并配合剪枝等策略,最终得到一个尽可能逼近全局最优解的搜索结果。
如果搜索算法没有找到全局最优解,这时称系统出现了
{
\small\bfnew
{
搜索错误
}}
\index
{
搜索错误
}
(Search Error)
\index
{
Search Error
}
。如果模型打分不准确造成没有把最好的翻译排序到第一,这时称系统出现了
{
\small\bfnew
{
模型错误
}}
\index
{
模型错误
}
(Modeling Error)
\index
{
Modeling Error
}
。模型错误是由建模和模型训练等因素决定的,而搜索错误一般是由搜索算法决定的。在早期的机器翻译研究中,搜索错误是机器翻译问题的主要来源之一。不过随着技术的进步,研究者逐渐发现,机器翻译系统的错误更多的集中在模型错误上
\cite
{
Stahlberg2019OnNS
}
。特别是在神经机器翻译时代,绝大多数研究工作都是在解决模型错误。
\parinterval
当然,这里并不是说搜索不重要。相反,在很多应用场景中,搜索算法的效率会起到决定性作用,比如,机器同传
\cite
{
DBLP:journals/corr/abs-1810-08398
}
。而且,
我们往往需要在翻译精度和速度之间找到一种折中。下面我们
将对神经机器翻译推断的精度和效率进行讨论。
\parinterval
当然,这里并不是说搜索不重要。相反,在很多应用场景中,搜索算法的效率会起到决定性作用,比如,机器同传
\cite
{
DBLP:journals/corr/abs-1810-08398
}
。而且,
往往需要在翻译精度和速度之间找到一种折中。下面
将对神经机器翻译推断的精度和效率进行讨论。
%%%%%%%%%%%%%%%%%%
\subsubsection
{
推断系统的架构
}
\parinterval
对于神经机器翻译,推断的时间主要消耗在解码端,也就是对源语言进行编码后,解码器生成译文单词序列的过程。因此,神经机器翻译的推断装置的开发大多集中在设计
编
码器及搜索策略上。通用的神经机器翻译搜索算法包括如下几步:
\parinterval
对于神经机器翻译,推断的时间主要消耗在解码端,也就是对源语言进行编码后,解码器生成译文单词序列的过程。因此,神经机器翻译的推断装置的开发大多集中在设计
解
码器及搜索策略上。通用的神经机器翻译搜索算法包括如下几步:
\begin{itemize}
\item
对输入的源语言句子进行编码。由于整个源语言句子是可见的,因此这个步骤可以一步执行完毕;
\item
使用源语言句子的编码结果,在目标语端自左向右逐词生成译文;
\item
目标语的每个位置计算模型得分,同时进行剪枝;
\vspace
{
0.3em
}
\item
对输入的源语言句子进行编码
\footnote
{
由于整个源语言句子是可见的,因此这个步骤可以一步执行完毕
}
;
\vspace
{
0.3em
}
\item
使用源语言句子的编码结果,在目标语言端自左向右逐词生成译文;
\vspace
{
0.3em
}
\item
在目标语言的每个位置计算模型得分,同时进行剪枝;
\vspace
{
0.3em
}
\item
当满足某种条件时终止搜索。
\vspace
{
0.3em
}
\end{itemize}
\parinterval
上面这个算法与统计机器翻译中自左向右翻译的算法基本上是一样的(见第四章),即,在每一个目标语位置,根据已经生成的译文和源语言的信息,生成下一个译文单词。这个过程可以由两个模块实现
\cite
{
DBLP:journals/corr/StahlbergHSB17
}
:
\begin{itemize}
\item
第一个是预测模块,也就是根据已经翻译的历史和源语言句子,预测下一个要生成单词的概率
\footnote
{
在统计机器翻译中,翻译的每一步也可以预测短语。在神经机器翻译中也有类似于生成短语的方法,但是主流的方法还是按单词为单位进行生成。
}
。因此预测模块实际上就是一个模型打分装置;
\item
第二个是搜索模块,它会利用预测结果,当前的翻译假设进行打分,并根据模型得分对翻译假设进行排序和剪枝。
\vspace
{
0.3em
}
\item
预测模块,也就是根据已经翻译的历史和源语言句子,预测下一个要生成单词的概率
\footnote
{
在统计机器翻译中,翻译的每一步也可以预测短语。在神经机器翻译中也有类似于生成短语的方法,但是主流的方法还是按单词为单位进行生成。
}
。因此预测模块实际上就是一个模型打分装置;
\vspace
{
0.3em
}
\item
搜索模块,它会利用预测结果,当前的翻译假设进行打分,并根据模型得分对翻译假设进行排序和剪枝。
\vspace
{
0.3em
}
\end{itemize}
\parinterval
预测模块是由模型决定的,而搜索模块可以与模型无关。也就是说,不同的模型可以共享同一个搜索模块完成推断,系统的代码有更好的复用性。比如,对于RNN模型,预测模块需要读入前一个状态的信息和前一个位置的译文单词,然后预测当前位置的单词概率;对于Transformer,预测模块需要对前面的所有位置做注意力运算,之后预测当前位置的单词概率。不过,这两个模型都可以使用同一个搜索模块。图
\ref
{
fig:7-19
}
给出了这种架构的示意图。
...
...
@@ -720,7 +742,7 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\begin{figure}
[htp]
\centering
\input
{
./Chapter7/Figures/figure-main-module
}
\caption
{
神经机器翻译推断
的主要模块
}
\caption
{
神经机器翻译推断
系统结构
}
\label
{
fig:7-19
}
\end{figure}
%----------------------------------------------
...
...
@@ -737,12 +759,12 @@ y_{j}^{ls}=(1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\parinterval
不过,简单的使用自右向左的翻译方式并不会取得更好的效果。大多数情况下,自右向左比自左向右推断的翻译质量更差。因此很多时候是对二者进行融合,而不是简单的相互替换。有两种思路:
\begin{itemize}
\item
重排序。可以用一个基础模型(比如自左向右的模型)得到每个源语言句子的n-best结果,之后同时用基础模型的得分和自右向左模型对n-best结果进行重排序
\cite
{
DBLP:journals/corr/SennrichHB16
}
\cite
{
DBLP:conf/wmt/LiLXLLLWZXWFCLL19
}
。由于这种方法不会改变基础模型的翻译过程,因此相对``安全'',不会对系统性能造成副作用。特别是对于基于循环神经网络的翻译系统,利用自右向左的翻译模型进行重排序往往会取得较好的效果。
\item
{
\small\bfnew
{
重排序
}}
\index
{
重排序
}
(Re-ranking)
\index
{
Re-ranking
}
。可以用一个基础模型(比如自左向右的模型)得到每个源语言句子的
$
n
$
-best结果,之后同时用基础模型的得分和自右向左模型对
$
n
$
-best结果进行重排序
\cite
{
DBLP:journals/corr/SennrichHB16,
DBLP:conf/wmt/LiLXLLLWZXWFCLL19
}
。由于这种方法不会改变基础模型的翻译过程,因此相对``安全'',不会对系统性能造成副作用。特别是对于基于循环神经网络的翻译系统,利用自右向左的翻译模型进行重排序往往会取得较好的效果。
\item
双向推断。另一种方法是,让自左向右和自右向左模型同步进行,也就是同时考虑译文左侧和右侧的上下文
\cite
{
DBLP:journals/corr/abs-1801-05122
}
。比如
可以同时对左边和右边生成的译文进行注意力计算,得到当前位置的单词预测结果。这种方法能够更加充分的融合双向翻译的优势,不过需要对训练和推断系统进行修改,因此也引入了额外的开发和调试工作。
\item
{
\small\bfnew
{
双向推断
}}
\index
{
双向推断
}
(Bidirectional Inference)
\index
{
Bidirectional Inference
}
。另一种方法是,让自左向右和自右向左模型同步进行,也就是同时考虑译文左侧和右侧的上下文
\cite
{
DBLP:journals/corr/abs-1801-05122
}
。 例如,
可以同时对左边和右边生成的译文进行注意力计算,得到当前位置的单词预测结果。这种方法能够更加充分的融合双向翻译的优势,不过需要对训练和推断系统进行修改,因此也引入了额外的开发和调试工作。
\end{itemize}
\parinterval
不论是自左向右还是自右向左翻译,本质上都是在对上下文信息进行建模。最近,以BERT为代表的预训练语言模型已经证明
\cite
{
devlin2018bert
}
,一个单词的``历史''和``未来''信息对于生成当前单词都是有帮助的
。类似的观点也在神经机器翻译编码器设计中得到验证。比如,在基于循环神经网络的模型中,经常同时使用自左向右和自右向左的方式对源语言句子进行编码,还有,Transformer编码会使用整个句子的信息对每一个源语言位置进行表示。因此,在神经机器翻译的解码端采用类似的策略是有其合理性的。
\parinterval
不论是自左向右还是自右向左翻译,本质上都是在对上下文信息进行建模。最近,以BERT为代表的预训练语言模型已经证明
,一个单词的``历史''和``未来''信息对于生成当前单词都是有帮助的
\cite
{
devlin2018bert
}
。类似的观点也在神经机器翻译编码器设计中得到验证。比如,在基于循环神经网络的模型中,经常同时使用自左向右和自右向左的方式对源语言句子进行编码,还有,Transformer编码会使用整个句子的信息对每一个源语言位置进行表示。因此,在神经机器翻译的解码端采用类似的策略是有其合理性的。
%%%%%%%%%%%%%%%%%%
\subsubsection
{
推断加速
}
...
...
Book/Chapter7/Figures/figure-norm.tex
查看文件 @
e8c5a116
...
...
@@ -18,7 +18,7 @@
\node
[]
(res1) at ([xshift=2.4em]fn1.east)
{
+
}
;
\node
[anchor=west,inputnode]
(output) at ([xshift=1.2em]res1.east)
{$
x
_{
i
}^{
l
+
1
}$}
;
\node
[anchor=west,inputnode]
(legend1) at (
8
em,-1em)
{
(a) 标准Transformer网络
}
;
\node
[anchor=west,inputnode]
(legend1) at (
6
em,-1em)
{
(a) 标准Transformer网络
}
;
%\coordinate (mend) at ([xshift=1em]m.west);
\draw
[-latex',thick]
(input)--(ln);
...
...
@@ -38,7 +38,7 @@
\draw
[-latex',thick,rounded corners]
(h1) -- ([yshift=1.35em]h1.north) -- ([yshift=1em]m1.north) -- (m1.north);
%--------------------------------------------------------
\node
[anchor=south west,inputnode]
(input
_
2) at (0,-
4
em)
{$
x
_{
i
}^{
l
}$}
;
\node
[anchor=south west,inputnode]
(input
_
2) at (0,-
6
em)
{$
x
_{
i
}^{
l
}$}
;
\node
[anchor=west,sublayernode,fill=red!10]
(ln
_
2) at ([xshift=1.2em]input
_
2.east)
{
LN
}
;
\node
[anchor=west,sublayernode,fill=green!10]
(fn
_
2) at ([xshift=1.2em]ln
_
2.east)
{
F
}
;
...
...
@@ -51,7 +51,7 @@
\node
[]
(res1
_
2) at ([xshift=2.4em]fn1
_
2.east)
{
+
}
;
\node
[anchor=west,inputnode]
(output
_
2) at ([xshift=1.2em]res1
_
2.east)
{$
x
_{
i
}^{
l
+
1
}$}
;
\node
[anchor=west,inputnode]
(legend2) at (
6.5em,-5
.5em)
{
(b) 引入Layer Dropout后的Transformer网络
}
;
\node
[anchor=west,inputnode]
(legend2) at (
2.5em,-7
.5em)
{
(b) 引入Layer Dropout后的Transformer网络
}
;
\node
[anchor=south west,inputnode,red,font=\tiny]
(mlable) at ([xshift=-2.2em,yshift=-0.6em]m
_
2.south)
{
M=1
}
;
...
...
Book/mt-book-xelatex.idx
查看文件 @
e8c5a116
...
...
@@ -31,31 +31,32 @@
\indexentry{Denoising|hyperpage}{21}
\indexentry{泛化|hyperpage}{21}
\indexentry{Generalization|hyperpage}{21}
\indexentry{标签平滑|hyperpage}{23}
\indexentry{Label Smoothing|hyperpage}{23}
\indexentry{相互适应|hyperpage}{24}
\indexentry{Co-Adaptation|hyperpage}{24}
\indexentry{集成学习|hyperpage}{25}
\indexentry{Ensemble Learning|hyperpage}{25}
\indexentry{容量|hyperpage}{26}
\indexentry{Capacity|hyperpage}{26}
\indexentry{宽残差网络|hyperpage}{2
6
}
\indexentry{Wide Residual Network|hyperpage}{2
6
}
\indexentry{宽残差网络|hyperpage}{2
7
}
\indexentry{Wide Residual Network|hyperpage}{2
7
}
\indexentry{探测任务|hyperpage}{28}
\indexentry{Probing Task|hyperpage}{28}
\indexentry{浅层网络表示|hyperpage}{28}
\indexentry{表面信息|hyperpage}{28}
\indexentry{Surface Information|hyperpage}{28}
\indexentry{中间层的表示|hyperpage}{28}
\indexentry{语法信息|hyperpage}{28}
\indexentry{Syntactic Information|hyperpage}{28}
\indexentry{顶层网络的表示|hyperpage}{28}
\indexentry{语义信息|hyperpage}{28}
\indexentry{Semantic Information|hyperpage}{28}
\indexentry{词嵌入|hyperpage}{2
8
}
\indexentry{Embedding|hyperpage}{2
8
}
\indexentry{词嵌入|hyperpage}{2
9
}
\indexentry{Embedding|hyperpage}{2
9
}
\indexentry{数据并行|hyperpage}{29}
\indexentry{Data Parallelism|hyperpage}{29}
\indexentry{模型并行|hyperpage}{29}
\indexentry{Model Parallelism|hyperpage}{29}
\indexentry{小批量训练|hyperpage}{29}
\indexentry{Mini-batch Training|hyperpage}{29}
\indexentry{课程学习|hyperpage}{31}
\indexentry{Curriculum Learning|hyperpage}{31}
\indexentry{推断|hyperpage}{32}
...
...
@@ -66,6 +67,10 @@
\indexentry{Search Error|hyperpage}{32}
\indexentry{模型错误|hyperpage}{32}
\indexentry{Modeling Error|hyperpage}{32}
\indexentry{重排序|hyperpage}{34}
\indexentry{Re-ranking|hyperpage}{34}
\indexentry{双向推断|hyperpage}{34}
\indexentry{Bidirectional Inference|hyperpage}{34}
\indexentry{批量推断|hyperpage}{37}
\indexentry{Batch Inference|hyperpage}{37}
\indexentry{批量处理|hyperpage}{37}
...
...
@@ -92,10 +97,10 @@
\indexentry{Diversity|hyperpage}{45}
\indexentry{重排序|hyperpage}{45}
\indexentry{Re-ranking|hyperpage}{45}
\indexentry{动态线性层聚合方法|hyperpage}{5
0
}
\indexentry{Dynamic Linear Combination of Layers,DLCL|hyperpage}{5
0
}
\indexentry{相互适应|hyperpage}{5
4
}
\indexentry{Co-adaptation|hyperpage}{5
4
}
\indexentry{动态线性层聚合方法|hyperpage}{5
1
}
\indexentry{Dynamic Linear Combination of Layers,DLCL|hyperpage}{5
1
}
\indexentry{相互适应|hyperpage}{5
5
}
\indexentry{Co-adaptation|hyperpage}{5
5
}
\indexentry{数据增强|hyperpage}{57}
\indexentry{Data Augmentation|hyperpage}{57}
\indexentry{回译|hyperpage}{57}
...
...
@@ -111,7 +116,7 @@
\indexentry{多任务学习|hyperpage}{60}
\indexentry{Multitask Learning|hyperpage}{60}
\indexentry{模型压缩|hyperpage}{61}
\indexentry{Model Compression|hyperpage}{6
1
}
\indexentry{Model Compression|hyperpage}{6
2
}
\indexentry{学习难度|hyperpage}{62}
\indexentry{Learning Difficulty|hyperpage}{62}
\indexentry{教师模型|hyperpage}{62}
...
...
Book/structure.tex
查看文件 @
e8c5a116
...
...
@@ -2,19 +2,20 @@
% !TEX encoding = UTF-8 Unicode
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This file was modified on top of
% The Legrand Orange Book
% Structural Definitions File
% Version 2.1 (26/09/2018)
%
% Original author:
% Mathias Legrand (legrand.mathias@gmail.com) with modifications by:
% Vel (vel@latextemplates.com)
%
% This file was downloaded from:
% http://www.LaTeXTemplates.com
% Current Version is maintained by
% Tong Xiao (xiaotong@mail.neu.edu.cn)
% Runzhe Cao (854581319@qq.com)
%
% License:
% CC BY-NC-SA
3.0 (http://creativecommons.org/licenses/by-nc-sa/3
.0/)
% License
of This File
:
% CC BY-NC-SA
4.0 (http://creativecommons.org/licenses/by-nc-sa/4
.0/)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论