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
2c703976
Commit
2c703976
authored
Jan 25, 2021
by
单韦乔
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
13章,图label
parent
7fb45ecd
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
29 行增加
和
29 行删除
+29
-29
Chapter13/chapter13.tex
+29
-29
没有找到文件。
Chapter13/chapter13.tex
查看文件 @
2c703976
...
...
@@ -76,14 +76,14 @@
\parinterval
但是字符级翻译也面临着新的问题
\ \dash\
使用字符增加了系统捕捉不同语言单元之间搭配的难度。假设平均一个单词由5个字符组成,系统所处理的序列长度便增大5倍。这使得具有独立意义的不同语言单元需要跨越更远的距离才能产生联系。此外,基于字符的方法也破坏了单词中天然存在的构词规律,或者说破坏了单词内字符的局部依赖。比如,英语单词“telephone”中的“tele”和“phone”都是有具体意义的词缀,但是如果把它们打散为字符就失去了这些含义。
\parinterval
那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并通过特殊的标记将其与普通的单词区分开来
\upcite
{
luong2016acl
_
hybrid
}
。而另一种方式是将单词切分为
{
\small\bfnew
{
子词
}}
\index
{
子词
}
(Sub-word)
\index
{
Sub-word
}
,它是介于单词和字符中间的一种语言单元表示形式。比如,将英语单词“doing”切分为“do”+“ing”。对于形态学丰富的语言来说,子词体现了一种具有独立意义的构词基本单元。如图
\ref
{
fig:13-
2
}
,子词“do”和“new”可以用于组成其他不同形态的单词。
\parinterval
那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并通过特殊的标记将其与普通的单词区分开来
\upcite
{
luong2016acl
_
hybrid
}
。而另一种方式是将单词切分为
{
\small\bfnew
{
子词
}}
\index
{
子词
}
(Sub-word)
\index
{
Sub-word
}
,它是介于单词和字符中间的一种语言单元表示形式。比如,将英语单词“doing”切分为“do”+“ing”。对于形态学丰富的语言来说,子词体现了一种具有独立意义的构词基本单元。如图
\ref
{
fig:13-
1
}
,子词“do”和“new”可以用于组成其他不同形态的单词。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-word-root
}
\caption
{
不同单词共享相同的子词(前缀)
}
\label
{
fig:13-
2
}
\label
{
fig:13-
1
}
\end{figure}
%----------------------------------------------
...
...
@@ -109,14 +109,14 @@
\parinterval
字节对编码或双字节编码(BPE)是一种常用的子词词表构建方法。BPE方法最早用于数据压缩,该方法将数据中常见的连续字符串替换为一个不存在的字符,之后通过构建一个替换关系的对应表,对压缩后的数据进行还原
\upcite
{
Gage1994ANA
}
。机器翻译借用了这种思想,把子词切分看作是学习对自然语言句子进行压缩编码表示的问题
\upcite
{
DBLP:conf/acl/SennrichHB16a
}
。其目的是,保证编码(即子词切分)后的结果占用的字节尽可能少。这样,子词单元会尽可能被不同单词复用,同时又不会因为使用过小的单元造成子词切分后的序列过长。
\parinterval
使用BPE算法进行子词切分包含两个步骤。首先,通过统计的方法构造符号合并表
,具体的方式为:先对分过词的文本进行统计,得到词表和词频,同时将词表中的单词分割为字符表示;其次统计词表中所有出现的二元组的频次,选择当前频次最高的二元组加入符号合并表,并将所有词表中出现的该二元组合并为一个单元;不断地重复上述过程,直到合并表的大小达到预先设定的大小,或者无法继续合并。图
\ref
{
fig:13-4
}
给出了一个使用字符合并表对单词进行子词切分的实例。红色单元为每次合并后得到的新符号,直至无法合并,或遍历结束,得到最终的合并结果。其中每一个单元为一个子词。
\parinterval
使用BPE算法进行子词切分包含两个步骤。首先,通过统计的方法构造符号合并表
(见图
\ref
{
fig:13-2
}
),具体的方式为:先对分过词的文本进行统计,得到词表和词频,同时将词表中的单词分割为字符表示;其次统计词表中所有出现的二元组的频次,选择当前频次最高的二元组加入符号合并表,并将所有词表中出现的该二元组合并为一个单元;不断地重复上述过程,直到合并表的大小达到预先设定的大小,或者无法继续合并。图
\ref
{
fig:13-3
}
给出了一个使用字符合并表对单词进行子词切分的实例。红色单元为每次合并后得到的新符号,直至无法合并,或遍历结束,得到最终的合并结果。其中每一个单元为一个子词。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-bpe
}
\caption
{
BPE算法中符号合并表的生成过程
}
\label
{
fig:13-
3
}
\label
{
fig:13-
2
}
\end{figure}
%----------------------------------------------
...
...
@@ -125,7 +125,7 @@
\centering
\input
{
./Chapter13/Figures/figure-unk-of-bpe
}
\caption
{
BPE中的子词切分过程
}
\label
{
fig:13-
4
}
\label
{
fig:13-
3
}
\end{figure}
%----------------------------------------------
...
...
@@ -182,14 +182,14 @@ y &=& f(x)
\vspace
{
0.5em
}
\end{itemize}
\parinterval
以上问题体现出来的现象就是过拟合。因为训练数据有限且存在噪声,因此模型参数会过分拟合噪声数据。而且,这样的模型参数又与真实(理想)的模型参数相差很远。正则化正是针对这个问题。有时候,正则化也被称作
{
\small\bfnew
{
降噪
}}
\index
{
降噪
}
(Denoising)
\index
{
Denoising
}
,虽然它的出发点并不只是去除噪声的影响。图
\ref
{
fig:13-
11
}
对比了不同函数对二维空间中一些数据点的拟合情况。在过拟合现象中,函数可以完美的拟合所有的数据点,即使有些数据点是噪声。
\parinterval
以上问题体现出来的现象就是过拟合。因为训练数据有限且存在噪声,因此模型参数会过分拟合噪声数据。而且,这样的模型参数又与真实(理想)的模型参数相差很远。正则化正是针对这个问题。有时候,正则化也被称作
{
\small\bfnew
{
降噪
}}
\index
{
降噪
}
(Denoising)
\index
{
Denoising
}
,虽然它的出发点并不只是去除噪声的影响。图
\ref
{
fig:13-
4
}
对比了不同函数对二维空间中一些数据点的拟合情况。在过拟合现象中,函数可以完美的拟合所有的数据点,即使有些数据点是噪声。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-underfitting-vs-overfitting
}
\caption
{
欠拟合 vs 过拟合
}
\label
{
fig:13-
11
}
\label
{
fig:13-
4
}
\end{figure}
%----------------------------------------------
...
...
@@ -245,14 +245,14 @@ R(\mathbi{w}) & = & ({\Vert{\mathbi{w}}\Vert}_2)^2 \\
\noindent
这里,
$
\alpha
$
表示一个系数,用于控制分布
$
\mathbi
{
q
}$
的重要性,
$
\mathbi
{
y
}_{
j
}^{
ls
}$
表示使用标签平滑后的学习目标。
\parinterval
标签平滑实际上定义了一种“软”标签,使得所有标签都可以分到一些概率。一方面可以缓解数据中噪声的影响,另一方面目标分布会更合理(显然,真实的分布不应该是One-hot分布)。图
\ref
{
fig:13-
6
}
展示了标签平滑前后的损失函数计算结果的对比。
\parinterval
标签平滑实际上定义了一种“软”标签,使得所有标签都可以分到一些概率。一方面可以缓解数据中噪声的影响,另一方面目标分布会更合理(显然,真实的分布不应该是One-hot分布)。图
\ref
{
fig:13-
5
}
展示了标签平滑前后的损失函数计算结果的对比。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-label-smoothing
}
\caption
{
不使用标签平滑 vs 使用标签平滑
}
\label
{
fig:13-
6
}
\label
{
fig:13-
5
}
\end{figure}
%----------------------------------------------
...
...
@@ -268,25 +268,25 @@ R(\mathbi{w}) & = & ({\Vert{\mathbi{w}}\Vert}_2)^2 \\
\parinterval
相互适应的好处在于神经网络可以处理更加复杂的问题,因为联合使用两个神经元要比单独使用每个神经元的表示能力强。这也类似于传统机器学习任务中往往会设计一些高阶特征,比如自然语言序列标注中对2-gram和3-gram的使用。不过另一方面,相互适应会导致模型变得更加“脆弱”。因为相互适应的神经元可以更好的描述训练数据中的现象,但是在测试数据上,由于很多现象是未见的,细微的扰动会导致神经元无法适应。具体体现出来就是过拟合问题。
\parinterval
Dropout也是解决过拟合问题的一种常用方法
\upcite
{
DBLP:journals/corr/abs-1207-0580
}
。该方法很简单,在训练时随机让一部分神经元停止工作,这样每次参数更新中每个神经元周围的环境都在变化,它就不会过分适应到环境中。图
\ref
{
fig:13-
7
}
中给出了某一次参数更新中使用Dropout之前和之后神经网络的状态对比。
\parinterval
Dropout也是解决过拟合问题的一种常用方法
\upcite
{
DBLP:journals/corr/abs-1207-0580
}
。该方法很简单,在训练时随机让一部分神经元停止工作,这样每次参数更新中每个神经元周围的环境都在变化,它就不会过分适应到环境中。图
\ref
{
fig:13-
6
}
中给出了某一次参数更新中使用Dropout之前和之后神经网络的状态对比。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-network-with-dropout
}
\caption
{
使用Dropout之前(左)和之后(右)神经网络状态的对比
}
\label
{
fig:13-
7
}
\label
{
fig:13-
6
}
\end{figure}
%----------------------------------------------
\parinterval
具体实现时,可以设置一个参数
$
p
\in
(
0
,
1
)
$
。在每次参数更新所使用的前向和反向计算中,每个神经元都以概率
$
p
$
停止工作。相当于每层神经网络会有以
$
p
$
为概率的神经元被“屏蔽”掉。每一次参数更新中会随机屏蔽不同的神经元,图
\ref
{
fig:13-
8
}
给出了Dropout方法和传统方法计算方式的对比。其中,
$
x
_{
i
}^{
l
}$
代表第
$
l
$
层神经网络的第
$
i
$
个输入,
$
w
_{
i
}^{
l
}$
为输入所对应的权重,
$
b
^{
l
}$
表示第
$
l
$
层神经网络输入的偏置,
$
z
_{
i
}^{
l
+
1
}$
表示第
$
l
$
层神经网络的线性运算的结果,
$
f
(
\cdot
)
$
表示激活函数,
$
r
_{
i
}^{
l
}$
的值服从于参数为
$
1
-
p
$
的伯努利分布。
\parinterval
具体实现时,可以设置一个参数
$
p
\in
(
0
,
1
)
$
。在每次参数更新所使用的前向和反向计算中,每个神经元都以概率
$
p
$
停止工作。相当于每层神经网络会有以
$
p
$
为概率的神经元被“屏蔽”掉。每一次参数更新中会随机屏蔽不同的神经元,图
\ref
{
fig:13-
7
}
给出了Dropout方法和传统方法计算方式的对比。其中,
$
x
_{
i
}^{
l
}$
代表第
$
l
$
层神经网络的第
$
i
$
个输入,
$
w
_{
i
}^{
l
}$
为输入所对应的权重,
$
b
^{
l
}$
表示第
$
l
$
层神经网络输入的偏置,
$
z
_{
i
}^{
l
+
1
}$
表示第
$
l
$
层神经网络的线性运算的结果,
$
f
(
\cdot
)
$
表示激活函数,
$
r
_{
i
}^{
l
}$
的值服从于参数为
$
1
-
p
$
的伯努利分布。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-computation-of-dropout
}
\caption
{
使用Dropout之前(左)和之后(右)一层神经网络
}
\label
{
fig:13-
8
}
\label
{
fig:13-
7
}
\end{figure}
%----------------------------------------------
...
...
@@ -436,7 +436,7 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\begin{itemize}
\vspace
{
0.5em
}
\item
{
\small\bfnew
{
曝光偏置问题
}}
。在训练过程中,模型使用标注数据进行训练,因此模型在预测下一个单词时,解码器的输入是正确的译文片段。也就是,预测第
$
j
$
个单词时,系统使用了标准答案
$
\{
{
y
}_
1
,...,
{
y
}_{
j
-
1
}
\}
$
作为历史信息。但是对新的句子进行翻译时,预测第
$
j
$
个单词时使用的是模型自己生成的前
$
j
-
1
$
个单词,即
$
\{\hat
{{
y
}}_
1
,...,
\hat
{{
y
}}_{
j
-
1
}
\}
$
。这意味着,训练时使用的输入数据(目标语言端)与真实翻译时的情况不符,如图
\ref
{
fig:13-
9
}
所示。由于在训练过程中暴露于标注数据,因此模型也适应了标注数据,在推断阶段无法很好地适应模型自动生成的数据,这就是曝光偏置问题
\upcite
{
Bengio2015ScheduledSF,Ranzato2016SequenceLT
}
。
\item
{
\small\bfnew
{
曝光偏置问题
}}
。在训练过程中,模型使用标注数据进行训练,因此模型在预测下一个单词时,解码器的输入是正确的译文片段。也就是,预测第
$
j
$
个单词时,系统使用了标准答案
$
\{
{
y
}_
1
,...,
{
y
}_{
j
-
1
}
\}
$
作为历史信息。但是对新的句子进行翻译时,预测第
$
j
$
个单词时使用的是模型自己生成的前
$
j
-
1
$
个单词,即
$
\{\hat
{{
y
}}_
1
,...,
\hat
{{
y
}}_{
j
-
1
}
\}
$
。这意味着,训练时使用的输入数据(目标语言端)与真实翻译时的情况不符,如图
\ref
{
fig:13-
8
}
所示。由于在训练过程中暴露于标注数据,因此模型也适应了标注数据,在推断阶段无法很好地适应模型自动生成的数据,这就是曝光偏置问题
\upcite
{
Bengio2015ScheduledSF,Ranzato2016SequenceLT
}
。
\vspace
{
0.5em
}
%----------------------------------------------
...
...
@@ -444,7 +444,7 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\centering
\input
{
./Chapter13/Figures/figure-exposure-bias
}
\caption
{
曝光偏置问题(基于循环神经网络的翻译模型)
}
\label
{
fig:13-
9
}
\label
{
fig:13-
8
}
\end{figure}
%----------------------------------------------
...
...
@@ -466,14 +466,14 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\subsubsection
{
1. 调度采样
}
\parinterval
对于一个目标语言序列
$
\seq
{
y
}
=
\{
{
y
}_
1
,
\ldots
,
{
y
}_
n
\}
$
,在预测第
$
j
$
个单词时,训练过程与推断过程之间的主要区别在于:训练过程中使用标准答案
$
\{
{
y
}_{
1
}
,...,
{
y
}_{
j
-
1
}
\}
$
,而推断过程使用的是来自模型本身的预测结果
$
\{\hat
{{
y
}}_{
1
}
,...,
\hat
{{
y
}}_{
j
-
1
}
\}
$
。此时可以采取一种
{
\small\bfnew
{
调度采样
}}
\index
{
调度采样
}
(Scheduled Sampling
\index
{
Scheduled Sampling
}
)机制
\upcite
{
Bengio2015ScheduledSF
}
。以基于循环神经网络的模型为例,在训练中预测第
$
j
$
个单词时,随机决定使用
${
y
}_{
j
-
1
}$
还是
$
\hat
{{
y
}}_{
j
-
1
}$
作为输入。 假设训练时使用的是基于小批量的随机梯度下降方法,在第
$
i
$
个批次中,对序列每一个位置进行预测时以概率
$
\epsilon
_
i
$
使用标准答案
${
y
}_{
j
-
1
}$
,或以概率
${
1
-
\epsilon
_
i
}$
使用来自模型本身的预测
$
\hat
{{
y
}}_{
j
-
1
}$
。具体到序列中的一个位置
$
j
$
,可以根据模型单词预测的概率进行采样,在
$
\epsilon
_
i
$
控制的调度策略下,同
${
y
}_{
j
-
1
}$
一起作为输入。此过程如图
\ref
{
fig:13-
10
}
所示,并且这个过程可以很好地与束搜索融合。
\parinterval
对于一个目标语言序列
$
\seq
{
y
}
=
\{
{
y
}_
1
,
\ldots
,
{
y
}_
n
\}
$
,在预测第
$
j
$
个单词时,训练过程与推断过程之间的主要区别在于:训练过程中使用标准答案
$
\{
{
y
}_{
1
}
,...,
{
y
}_{
j
-
1
}
\}
$
,而推断过程使用的是来自模型本身的预测结果
$
\{\hat
{{
y
}}_{
1
}
,...,
\hat
{{
y
}}_{
j
-
1
}
\}
$
。此时可以采取一种
{
\small\bfnew
{
调度采样
}}
\index
{
调度采样
}
(Scheduled Sampling
\index
{
Scheduled Sampling
}
)机制
\upcite
{
Bengio2015ScheduledSF
}
。以基于循环神经网络的模型为例,在训练中预测第
$
j
$
个单词时,随机决定使用
${
y
}_{
j
-
1
}$
还是
$
\hat
{{
y
}}_{
j
-
1
}$
作为输入。 假设训练时使用的是基于小批量的随机梯度下降方法,在第
$
i
$
个批次中,对序列每一个位置进行预测时以概率
$
\epsilon
_
i
$
使用标准答案
${
y
}_{
j
-
1
}$
,或以概率
${
1
-
\epsilon
_
i
}$
使用来自模型本身的预测
$
\hat
{{
y
}}_{
j
-
1
}$
。具体到序列中的一个位置
$
j
$
,可以根据模型单词预测的概率进行采样,在
$
\epsilon
_
i
$
控制的调度策略下,同
${
y
}_{
j
-
1
}$
一起作为输入。此过程如图
\ref
{
fig:13-
9
}
所示,并且这个过程可以很好地与束搜索融合。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-of-scheduling-sampling-method
}
\caption
{
调度采样方法的示意图
}
\label
{
fig:13-
10
}
\label
{
fig:13-
9
}
\end{figure}
%----------------------------------------------
...
...
@@ -499,14 +499,14 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\parinterval
调度采样解决曝光偏置的方法是,把模型前
$
j
-
1
$
步的预测结果作为输入,来预测第
$
j
$
步的输出。但是,如果模型预测的结果中有错误,再使用错误的结果预测未来的序列也会产生问题。解决这个问题就需要知道模型预测的好与坏,并在训练中有效的使用它们。如果生成好的结果,那么可以使用它进行模型训练,否则就不使用。生成对抗网络就是这样一种技术,它引入了一个额外的模型(判别器)来对原有模型(生成器)的生成结果进行评价,并根据评价结果同时训练两个模型。
\parinterval
在
\ref
{
sec:adversarial-examples
}
小节已经提到了生成对抗网络,这里稍微进行一些展开。 在机器翻译中,基于对抗神经网络的架构被命名为
{
\small\bfnew
{
对抗神经机器翻译
}}
\index
{
对抗神经机器翻译
}
(Adversarial-NMT)
\index
{
Adversarial-NMT
}
\upcite
{
DBLP:conf/acml/WuXTZQLL18
}
。这里,令
$
(
\seq
{
x
}
,
\seq
{
y
}
)
$
表示一个训练样本,令
$
\hat
{
\seq
{
y
}}$
表示神经机器翻译系统对源语言句子
$
\seq
{
x
}$
的翻译结果。此时,对抗神经机器翻译的总体框架可以表示为图
\ref
{
fig:13-1
1
}
,其中。绿色部分表示神经机器翻译模型
$
G
$
,该模型将源语言句子
$
\seq
{
x
}$
翻译为目标语言句子
$
\hat
{
\seq
{
y
}}$
。红色部分是对抗网络
$
D
$
,它的作用是判断目标语言句子是否是源语言句子
$
\seq
{
x
}$
的真实翻译。
$
G
$
和
$
D
$
相互对抗,用
$
G
$
生成的翻译结果
$
\hat
{
\seq
{
y
}}$
来训练
$
D
$
,并生成奖励信号,再使用奖励信号通过策略梯度训练
$
G
$
。
\parinterval
在
\ref
{
sec:adversarial-examples
}
小节已经提到了生成对抗网络,这里稍微进行一些展开。 在机器翻译中,基于对抗神经网络的架构被命名为
{
\small\bfnew
{
对抗神经机器翻译
}}
\index
{
对抗神经机器翻译
}
(Adversarial-NMT)
\index
{
Adversarial-NMT
}
\upcite
{
DBLP:conf/acml/WuXTZQLL18
}
。这里,令
$
(
\seq
{
x
}
,
\seq
{
y
}
)
$
表示一个训练样本,令
$
\hat
{
\seq
{
y
}}$
表示神经机器翻译系统对源语言句子
$
\seq
{
x
}$
的翻译结果。此时,对抗神经机器翻译的总体框架可以表示为图
\ref
{
fig:13-1
0
}
,其中。绿色部分表示神经机器翻译模型
$
G
$
,该模型将源语言句子
$
\seq
{
x
}$
翻译为目标语言句子
$
\hat
{
\seq
{
y
}}$
。红色部分是对抗网络
$
D
$
,它的作用是判断目标语言句子是否是源语言句子
$
\seq
{
x
}$
的真实翻译。
$
G
$
和
$
D
$
相互对抗,用
$
G
$
生成的翻译结果
$
\hat
{
\seq
{
y
}}$
来训练
$
D
$
,并生成奖励信号,再使用奖励信号通过策略梯度训练
$
G
$
。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-framework-of-Adversarial-Neural-machine-translation
}
\caption
{
对抗神经机器翻译框架图
}
\label
{
fig:13-1
1
}
\label
{
fig:13-1
0
}
\end{figure}
%----------------------------------------------
...
...
@@ -617,14 +617,14 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\label
{
eq:13-21
}
\end{eqnarray}
\parinterval
此时,公式
\ref
{
eq:13-20
}
与公式
\ref
{
eq:13-21
}
共同组成了评论家的学习目标,使得可学习的函数
$
\tilde
{
\funp
{
Q
}}$
逼近理想的
$
\funp
{
Q
}$
。最后,通过同时优化演员和评论家直到收敛,获得的演员(也就是策略
$
\funp
{
p
}$
)就是我们期望的翻译模型。图
\ref
{
fig:13-1
2
}
展示了演员和评论家的关系。
\parinterval
此时,公式
\ref
{
eq:13-20
}
与公式
\ref
{
eq:13-21
}
共同组成了评论家的学习目标,使得可学习的函数
$
\tilde
{
\funp
{
Q
}}$
逼近理想的
$
\funp
{
Q
}$
。最后,通过同时优化演员和评论家直到收敛,获得的演员(也就是策略
$
\funp
{
p
}$
)就是我们期望的翻译模型。图
\ref
{
fig:13-1
1
}
展示了演员和评论家的关系。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-reinforcement-learning-method-based-on-actor-critic
}
\caption
{
基于演员-评论家的强化学习方法
}
\label
{
fig:13-1
2
}
\label
{
fig:13-1
1
}
\end{figure}
%----------------------------------------------
...
...
@@ -708,7 +708,7 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\label
{
eq:13-24
}
\end{eqnarray}
这样的损失函数最直接的好处是,知识蒸馏的流程会非常简单。因为只需要利用教师模型将训练数据(源语言)翻译一遍,之后把它的输出替换为训练数据的目标语言部分。之后,利用新得到的双语数据训练学生模型即可。图
\ref
{
fig:13-1
3
}
对比了词级和序列级知识蒸馏方法。
这样的损失函数最直接的好处是,知识蒸馏的流程会非常简单。因为只需要利用教师模型将训练数据(源语言)翻译一遍,之后把它的输出替换为训练数据的目标语言部分。之后,利用新得到的双语数据训练学生模型即可。图
\ref
{
fig:13-1
2
}
对比了词级和序列级知识蒸馏方法。
\vspace
{
0.5em
}
\end{itemize}
...
...
@@ -717,7 +717,7 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\centering
\input
{
./Chapter13/Figures/figure-difference-between-word-level-and-sequence-level-in-knowledge-distillation
}
\caption
{
词级和序列级知识蒸馏的差异
}
\label
{
fig:13-1
3
}
\label
{
fig:13-1
2
}
\end{figure}
%-------------------------------------------
...
...
@@ -743,14 +743,14 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\vspace
{
0.5em
}
\end{itemize}
\parinterval
此外还可以采用迭代式知识蒸馏的方式。首先,通过模型集成得到较强的教师模型,再将知识迁移到不同的学生模型上,随后继续使用这些学生模型集成新的教师模型。不断的重复上述过程可以逐步提升集成模型的性能,如图
\ref
{
fig:13-
42
}
所示。值得注意的是,随着迭代次数的增加,集成所带来的收益也会随着子模型之间差异性的减小而减少。
\parinterval
此外还可以采用迭代式知识蒸馏的方式。首先,通过模型集成得到较强的教师模型,再将知识迁移到不同的学生模型上,随后继续使用这些学生模型集成新的教师模型。不断的重复上述过程可以逐步提升集成模型的性能,如图
\ref
{
fig:13-
13
}
所示。值得注意的是,随着迭代次数的增加,集成所带来的收益也会随着子模型之间差异性的减小而减少。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-ensemble-knowledge-distillation
}
\caption
{
迭代式知识蒸馏
}
\label
{
fig:13-
42
}
\label
{
fig:13-
13
}
\end{figure}
%-------------------------------------------
...
...
@@ -864,27 +864,27 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\vspace
{
0.5em
}
\end{itemize}
\parinterval
这里,把这两个问题抽象成两个模块:难度评估器和训练调度器,那么课程学习的一个大致的流程如图
\ref
{
fig:13-1
5
}
所示。首先,难度评估器对训练样本按照由易到难的顺序进行排序,最开始调度器从相对容易的数据块中采样训练样本,发送给模型进行训练,随着训练时间的推移,训练调度器将逐渐从更加困难的数据块中进行采样(至于何时,以及选择何种采样方式则取决于设定的策略),持续这个过程,直到从整个训练集进行均匀采样。
\parinterval
这里,把这两个问题抽象成两个模块:难度评估器和训练调度器,那么课程学习的一个大致的流程如图
\ref
{
fig:13-1
4
}
所示。首先,难度评估器对训练样本按照由易到难的顺序进行排序,最开始调度器从相对容易的数据块中采样训练样本,发送给模型进行训练,随着训练时间的推移,训练调度器将逐渐从更加困难的数据块中进行采样(至于何时,以及选择何种采样方式则取决于设定的策略),持续这个过程,直到从整个训练集进行均匀采样。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-curriculum-learning-framework
}
\caption
{
课程学习框架
}
\label
{
fig:13-1
5
}
\label
{
fig:13-1
4
}
\end{figure}
%-------------------------------------------
\parinterval
评估样本的难度和具体的任务相关,在神经机器翻译中,有很多种评估方法,可以利用语言学上的困难准则,比如句子长度、句子平均词频、句法树深度等
\upcite
{
DBLP:conf/naacl/PlataniosSNPM19,DBLP:conf/ranlp/KocmiB17
}
。这些准则本质上属于人类的先验知识,符合人类的直觉,但不一定和模型相匹配。对人类来说简单的句子对模型来说可能并不简单,所以研究人员也提出了基于模型的方法,比如:语言模型
\upcite
{
DBLP:conf/acl/WangCC19,DBLP:conf/naacl/ZhangSKMCD19
}
,或者神经机器翻译模型
\upcite
{
zhang2018empirical,DBLP:conf/coling/XuHJFWHJXZ20
}
都可以用于评价样本的难度。值得注意的是,利用神经机器翻译来打分的方法分为静态和动态两种。静态的方法是利用在小数据集上训练的、更小的翻译模型来打分
\upcite
{
zhang2018empirical
}
。动态的方法则是利用当前模型的状态来打分,这在广义上也叫作
{
\small\bfnew
{
自步学习
}}
\index
{
自步学习
}
(Self-paced Learning
\index
{
Self-paced Learning
}
),通常可以利用模型的训练误差或变化率等指标进行样本难度的估计
\upcite
{
DBLP:conf/coling/XuHJFWHJXZ20
}
。
\parinterval
虽然样本难度的度量在不同任务中有所不同,但课程规划通常与数据和任务无关。在各种场景中,大多数课程学习都利用了类似的调度策略。具体而言,调度策略可以分为预定义的和自动的两种。预定义的调度策略通常将按照难易程度排序好的样本划分为块,每个块中包含一定数量的难度相似的样本。然后按照“先易后难”的原则人工定义一个调度策略,比如,一种较为流行的方法是:在训练早期,模型只在简单块中进行采样,随着训练过程的进行,将下一个块的样本合并到当前训练子集中,继续训练,直到合并了整个数据块,即整个训练集可见为止,之后再继续训练直到收敛。这个过程如图
\ref
{
fig:13-1
6
}
所示。类似的还有一些其他变体,比如,训练到模型可见整个数据集之后,将最难的样本块复制并添加到训练集中,或者是将最容易的数据块逐渐删除,然后再添加回来等,这些方法的基本想法都是想让模型在具备一定的能力之后更多关注于困难样本。
\parinterval
虽然样本难度的度量在不同任务中有所不同,但课程规划通常与数据和任务无关。在各种场景中,大多数课程学习都利用了类似的调度策略。具体而言,调度策略可以分为预定义的和自动的两种。预定义的调度策略通常将按照难易程度排序好的样本划分为块,每个块中包含一定数量的难度相似的样本。然后按照“先易后难”的原则人工定义一个调度策略,比如,一种较为流行的方法是:在训练早期,模型只在简单块中进行采样,随着训练过程的进行,将下一个块的样本合并到当前训练子集中,继续训练,直到合并了整个数据块,即整个训练集可见为止,之后再继续训练直到收敛。这个过程如图
\ref
{
fig:13-1
5
}
所示。类似的还有一些其他变体,比如,训练到模型可见整个数据集之后,将最难的样本块复制并添加到训练集中,或者是将最容易的数据块逐渐删除,然后再添加回来等,这些方法的基本想法都是想让模型在具备一定的能力之后更多关注于困难样本。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-a-predefined-course-planning
}
\caption
{
“先易后难”数据块选择
}
\label
{
fig:13-1
6
}
\label
{
fig:13-1
5
}
\end{figure}
%-------------------------------------------
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论