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
c303d0b7
Commit
c303d0b7
authored
Mar 10, 2021
by
曹润柘
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
更新 chapter16.tex
parent
0932e9b2
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
9 行增加
和
9 行删除
+9
-9
Chapter16/chapter16.tex
+9
-9
没有找到文件。
Chapter16/chapter16.tex
查看文件 @
c303d0b7
...
...
@@ -154,7 +154,7 @@
%----------------------------------------------------------------------------------------
\subsection
{
基于语言模型的方法
}
\parinterval
除了构造双语数据进行数据增强,直接利用单语数据也是机器翻译中的常用方法。通常,单语数据会被用于训练语言模型(见
{
\chaptertwo
}
)。对于机器翻译系统,使用语言模型也是一件十分自然的事情,在目标语言端,语言模型可以帮助系统选择更加流畅的译文;在源语言端,语言模型也可以用于句子编码,进而更好地生成句子的表示结果。在传统方法中,语言模型更多地被使用在目标语言端。不过,近些年来随着预训练技术的发展,语言模型也被使用在神经机器翻译的编码器端。下面将从语言模型在
解码器端的融合、预训练词嵌入、预训练编码器
和多任务学习四方面介绍基于语言模型的单语数据使用方法。
\parinterval
除了构造双语数据进行数据增强,直接利用单语数据也是机器翻译中的常用方法。通常,单语数据会被用于训练语言模型(见
{
\chaptertwo
}
)。对于机器翻译系统,使用语言模型也是一件十分自然的事情,在目标语言端,语言模型可以帮助系统选择更加流畅的译文;在源语言端,语言模型也可以用于句子编码,进而更好地生成句子的表示结果。在传统方法中,语言模型更多地被使用在目标语言端。不过,近些年来随着预训练技术的发展,语言模型也被使用在神经机器翻译的编码器端。下面将从语言模型在
目标语言端的融合、预训练词嵌入、预训练模型
和多任务学习四方面介绍基于语言模型的单语数据使用方法。
%----------------------------------------------------------------------------------------
% NEW SUB-SUB-SECTION
...
...
@@ -181,7 +181,7 @@
\parinterval
神经机器翻译模型所使用的编码器-解码器框架天然就包含了对输入(源语言)和输出(目标语言)进行表示学习的过程。在编码端,需要学习一种分布式表示来表示源语言句子的信息,这种分布式表示可以包含序列中每个位置的表示结果(见
{
\chapternine
}
)。从结构上看,神经机器翻译所使用的编码器与语言模型无异,或者说神经机器翻译的编码器其实就是一个源语言的语言模型。唯一的区别在于,神经机器翻译的编码器并不直接输出源语言句子的生成概率,而传统语言模型是建立在序列生成任务上的。既然神经机器翻译的编码器可以与解码器一起在双语数据上联合训练,那为什么不使用更大规模的数据单独对编码器进行训练呢?或者说,直接使用一个预先训练好的编码器,与机器翻译的解码器配合完成翻译过程。
\parinterval
实现上述想法的一种手段是
{
\small\sffamily\bfnew
{
预训练
}}
\index
{
预训练
}
(Pre-training)
\index
{
Pre-training
}
\upcite
{
DBLP:conf/nips/DaiL15,Peters2018DeepCW,radford2018improving,devlin2019bert
}
。预训练的做法相当于将句子的表示学习任务从目标任务中分离出来,这样可以利用额外的更大规模的数据进行学习。常用的一种方法是使用语言建模等方式在大规模单语数据上进行训练,
来得到神经机器翻译模型中的一部分(比如词嵌入和编码器等)的模型
参数初始值。然后,神经机器翻译模型在双语数据上进行
{
\small\sffamily\bfnew
{
微调
}}
\index
{
微调
}
(Fine-tuning)
\index
{
Fine-tuning
}
,以得到最终的翻译模型。
\parinterval
实现上述想法的一种手段是
{
\small\sffamily\bfnew
{
预训练
}}
\index
{
预训练
}
(Pre-training)
\index
{
Pre-training
}
\upcite
{
DBLP:conf/nips/DaiL15,Peters2018DeepCW,radford2018improving,devlin2019bert
}
。预训练的做法相当于将句子的表示学习任务从目标任务中分离出来,这样可以利用额外的更大规模的数据进行学习。常用的一种方法是使用语言建模等方式在大规模单语数据上进行训练,
得到神经机器翻译模型中的部分模型(如词嵌入和编码器等)的
参数初始值。然后,神经机器翻译模型在双语数据上进行
{
\small\sffamily\bfnew
{
微调
}}
\index
{
微调
}
(Fine-tuning)
\index
{
Fine-tuning
}
,以得到最终的翻译模型。
\parinterval
词嵌入可以被看作是对每个独立单词进行的表示学习的结果,在自然语言处理的众多任务中都扮演着重要角色
\upcite
{
DBLP:conf/icml/CollobertW08,2011Natural,DBLP:journals/corr/abs-1901-09069
}
。到目前为止已经有大量的词嵌入学习方法被提出(见
{
\chapternine
}
),因此可以直接应用这些方法在海量的单语数据上训练得到词嵌入,用来初始化神经机器翻译模型的词嵌入参数矩阵
\upcite
{
DBLP:conf/aclwat/NeishiSTIYT17,2018When
}
。
...
...
@@ -257,7 +257,7 @@
\end{figure}
%----------------------------------------------
\parinterval
此外,
也可以
利用多任务学习的思想来训练多到一模型(多个编码器、单个解码器)、一到多模型(单个编码器、多个解码器)和多到多模型(多个编码器、多个解码器),从而借助单语数据或其他数据来使编码器或解码器训练得更加充分
\upcite
{
DBLP:journals/corr/LuongLSVK15
}
,任务的形式包括翻译任务、句法分析任务、图像分类等。另外一种策略是利用多任务学习的思想同时训练多个语言的翻译任务
\upcite
{
DBLP:conf/acl/DongWHYW15,DBLP:journals/tacl/JohnsonSLKWCTVW17
}
,同样包括多到一翻译(多个语种到一个语种)、一到多翻译(一个语种到多个语种)以及多到多翻译(多个语种到多个语种),这种方法可以利用多种语言的训练数据进行学习,具有较大的潜力,逐渐受到了研究人员们的关注,具体内容可以参考
\ref
{
multilingual-translation-model
}
节。
\parinterval
此外,
一种策略是
利用多任务学习的思想来训练多到一模型(多个编码器、单个解码器)、一到多模型(单个编码器、多个解码器)和多到多模型(多个编码器、多个解码器),从而借助单语数据或其他数据来使编码器或解码器训练得更加充分
\upcite
{
DBLP:journals/corr/LuongLSVK15
}
,任务的形式包括翻译任务、句法分析任务、图像分类等。另外一种策略是利用多任务学习的思想同时训练多个语言的翻译任务
\upcite
{
DBLP:conf/acl/DongWHYW15,DBLP:journals/tacl/JohnsonSLKWCTVW17
}
,同样包括多到一翻译(多个语种到一个语种)、一到多翻译(一个语种到多个语种)以及多到多翻译(多个语种到多个语种),这种方法可以利用多种语言的训练数据进行学习,具有较大的潜力,逐渐受到了研究人员们的关注,具体内容可以参考
\ref
{
multilingual-translation-model
}
节。
%----------------------------------------------------------------------------------------
% NEW SECTION 16.2
...
...
@@ -472,7 +472,7 @@
\parinterval
另外,使用多语言单模型系统进行零资源翻译的一个优势在于,它可以最大程度上利用其它语言的数据。还是以上面提到法语到德语的零资源翻译任务为例,除了使用法语到英语、英语到德语的数据之外,所有法语到其它语言、其它语言到德语的数据都是有价值的,这些数据可以强化对法语句子的表示能力,同时强化对德语句子的生成能力。这个优点也是
\ref
{
sec:pivot-based-translation
}
节所介绍的传统基于枢轴语言方法所不具备的。
\parinterval
不过,多语言单模型系统经常面临脱靶翻译问题,即把源语言翻译成错误的目标语言,比如要求翻译成英语,结果却是汉语或者英语夹杂其他语言的字符。这是因为多语言单模型系统对所有语言都使用一样的参数,导致
不同语言字符混合时不容易让模型进行区分
。针对这个问题,可以在原来共享参数的基础上为每种语言添加额外的独立的参数,使得每种语言拥有足够的建模能力,以便于更好地完成特定语言的翻译
\upcite
{
DBLP:conf/acl/ZhangWTS20,DBLP:journals/corr/abs-2010-11125
}
。
\parinterval
不过,多语言单模型系统经常面临脱靶翻译问题,即把源语言翻译成错误的目标语言,比如要求翻译成英语,结果却是汉语或者英语夹杂其他语言的字符。这是因为多语言单模型系统对所有语言都使用一样的参数,导致
模型不容易区分出来不同语言字符混合的句子属于哪种语言
。针对这个问题,可以在原来共享参数的基础上为每种语言添加额外的独立的参数,使得每种语言拥有足够的建模能力,以便于更好地完成特定语言的翻译
\upcite
{
DBLP:conf/acl/ZhangWTS20,DBLP:journals/corr/abs-2010-11125
}
。
%----------------------------------------------------------------------------------------
% NEW SECTION 16.4
...
...
@@ -569,7 +569,7 @@
%----------------------------------------------------------------------------------------
\subsubsection
{
2. 健壮性问题
}
\parinterval
目前很多无监督词典归纳方法在相似语言对比如英-法、英-德上已经取得不错的结果,然而在远距离语言对比如英-中,英-日上的性能仍然很差
\upcite
{
DBLP:conf/emnlp/VulicGRK19,A2020Li
}
。研发健壮的无监督词典归纳方法仍然存在挑战。
这有多个层面的原因
:
\parinterval
目前很多无监督词典归纳方法在相似语言对比如英-法、英-德上已经取得不错的结果,然而在远距离语言对比如英-中,英-日上的性能仍然很差
\upcite
{
DBLP:conf/emnlp/VulicGRK19,A2020Li
}
。研发健壮的无监督词典归纳方法仍然存在挑战。
因此研发健壮的无监督词典归纳方法仍然面临许多挑战
:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -613,7 +613,7 @@
\parinterval
经过上述的无监督模型调优后,就获得了一个效果更好的翻译模型。这时候,可以使用这个翻译模型去产生质量更高的数据,再用这些数据来继续对翻译模型进行调优,如此反复迭代一定次数后停止。这个方法也被称为
{
\small\bfnew
{
迭代优化
}}
\index
{
迭代优化
}
(Iterative Refinement
\index
{
Iterative Refinement
}
)
\upcite
{
DBLP:conf/emnlp/ArtetxeLA18
}
。
\parinterval
迭代优化也会带来另外一个问题:在每一次迭代中都会产生新的模型,应该什么时候停止生成新模型,挑选哪一个模型呢?因为在无监督的场景当中,没有任何真实的双语数据可以使用,所以无法使用监督学习里的校验集来对每个模型进行检验并筛选。另外,即使有很少量的双语数据(比如数百条双语句对),直接在上面挑选模型和调整超参数会导致过拟合问题,使得最后结果越来越差。一个经验上非常高效的模型选择方法是:事先从训练集里挑选一部分句子作为校验集不参与训练,再使用当前的模型把这些句子翻译过去之后再翻译回来(源语言
$
\to
$
目标语言
$
\to
$
源语言,或者目标语言
$
\to
$
源语言
$
\to
$
目标语言),得到的结果跟原始的结果计算BLEU,得分越高则效果越好。这种方法已被证明跟使用大规模双语校验集的结果是高度相关的
\upcite
{
DBLP:conf/emnlp/LampleOCDR18
}
。
\parinterval
迭代优化也会带来另外一个问题:在每一次迭代中都会产生新的模型,应该什么时候停止生成新模型,挑选哪一个模型呢?因为在无监督的场景当中,没有任何真实的双语数据可以使用,所以无法使用监督学习里的校验集来对每个模型进行检验并筛选。另外,即使有很少量的双语数据(比如数百条双语句对),直接在上面挑选模型和调整超参数会导致过拟合问题,使得最后结果越来越差。一个经验上非常高效的模型选择方法是:事先从训练集里挑选一部分句子作为校验集不参与训练,再使用当前的模型把这些句子翻译过去之后再翻译回来(源语言
$
\to
$
目标语言
$
\to
$
源语言,或者目标语言
$
\to
$
源语言
$
\to
$
目标语言),得到的结果跟原始的结果计算BLEU
的值
,得分越高则效果越好。这种方法已被证明跟使用大规模双语校验集的结果是高度相关的
\upcite
{
DBLP:conf/emnlp/LampleOCDR18
}
。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -669,7 +669,7 @@
%----------------------------------------------------------------------------------------
\subsubsection
{
4. 其它问题
}
\parinterval
一般可以认为,在生成的伪数据上优化模型会使模型变得更好,这时候对这个更好的模型使用数据增强的手段(如回译等)就可以生成更好的训练数据。这样的一个数据优化过程依赖于一个假设:模型经过优化后会生成比原始数据更好的数据。而在数据优化和参数优化的共同影响下,模型非常容易拟合数据中的简单模式,使得模型倾向产生包含这种简单模式的数据,造成模型对这种类型数据过拟合的现象。一个常见的问题就是模型对任何输入都输出相同的译文,这时候翻译模型无法产生任何有意义的结果,也就是,数据优化产生的数据里无论什么目标语言对应的源语言都是同一个句子。这种情况下翻译模型虽然能降低损失,但是它不能学会任何源语言跟目标语言之间的对应关系,也就无法进行正确翻译。这个现象也反映出无监督机器翻译训练的脆弱性。
\parinterval
一般可以认为,在生成的伪数据上优化模型会使模型变得更好,这时候对这个更好的模型使用数据增强的手段(如回译等)就可以生成更好的训练数据。这样的一个数据优化过程依赖于一个假设:模型经过优化后会生成比原始数据更好的数据。而在数据优化和参数优化的共同影响下,模型非常容易拟合数据中的简单模式,使得模型倾向产生包含这种简单模式的数据,造成模型对这种类型数据过拟合的现象。一个常见的问题就是模型对任何输入都输出相同的译文,这时候翻译模型无法产生任何有意义的结果,也就是,数据优化产生的数据里无论什么目标语言对应的源语言都是同一个句子。这种情况下翻译模型虽然能降低
过拟合现象造成的
损失,但是它不能学会任何源语言跟目标语言之间的对应关系,也就无法进行正确翻译。这个现象也反映出无监督机器翻译训练的脆弱性。
\parinterval
比较常见的解决方案是在双语数据对应的目标函数外增加一个语言模型的目标函数。因为,在初始阶段,由于数据中存在大量不通顺的句子,额外的语言模型目标函数能把部分句子纠正过来,使得模型逐渐生成更好的数据
\upcite
{
DBLP:conf/emnlp/LampleOCDR18
}
。这个方法在实际应用中非常有效,尽管目前还没有太多理论上的支持。
...
...
@@ -699,7 +699,7 @@
\noindent
{
\small\bfnew
{
2)语言模型的使用
}}
\parinterval
无监督神经机器翻译的一个重要部分就是来自语言模型的目标函数。因为翻译模型本质上是在完成文本生成任务,所以只有文本生成类型的语言模型建模方法才可以应用到无监督神经机器翻译里。比如,给定前文预测下一词就是一个典型的自回归生成任务(见
{
\chaptertwo
}
),因此可以
运
用到无监督神经机器翻译里。但是,目前在预训练里流行的BERT等模型是掩码语言模型
\upcite
{
devlin2019bert
}
,不能直接在无监督神经机器翻译里使用。
\parinterval
无监督神经机器翻译的一个重要部分就是来自语言模型的目标函数。因为翻译模型本质上是在完成文本生成任务,所以只有文本生成类型的语言模型建模方法才可以应用到无监督神经机器翻译里。比如,给定前文预测下一词就是一个典型的自回归生成任务(见
{
\chaptertwo
}
),因此可以
应
用到无监督神经机器翻译里。但是,目前在预训练里流行的BERT等模型是掩码语言模型
\upcite
{
devlin2019bert
}
,不能直接在无监督神经机器翻译里使用。
\parinterval
另外一个在无监督神经机器翻译中比较常见的语言模型目标函数则是降噪自编码器。它也是文本生成类型的语言模型建模方法。对于一个句子
$
\seq
{
x
}$
,首先使用一个噪声函数
$
\seq
{
x
}
'
=
\mathrm
{
noise
}
(
\seq
{
x
}
)
$
来对
$
\seq
{
x
}$
注入噪声,产生一个质量较差的句子
$
\seq
{
x
}
'
$
。然后,让模型学习如何从
$
\seq
{
x
}
'
$
还原出
$
\seq
{
x
}$
。这样的目标函数比预测下一词更贴近翻译任务,因为它是一个序列到序列的映射,并且输入、输出两个序列在语义上是等价的。这里之所以采用
$
\seq
{
x
}
'
$
而不是
$
\seq
{
x
}$
自己来预测
$
\seq
{
x
}$
,是因为模型可以通过简单的复制输入作为输出来完成从
$
\seq
{
x
}$
预测
$
\seq
{
x
}$
的任务,很难学到有价值的信息。并且在输入中注入噪声会让模型更加健壮,因此模型可以学会如何利用句子中噪声以外的信息来得到正确的输出。通常来说,噪声函数有三种形式,如表
\ref
{
tab:16-1
}
所示。
%----------------------------------------------
...
...
@@ -813,7 +813,7 @@
%----------------------------------------------------------------------------------------
\subsubsection
{
1. 多目标学习
}
\parinterval
在使用多领域数据时,混合多个相差较大的领域数据进行训练会使单个领域的翻译性能下降
\upcite
{
DBLP:conf/eacl/NegriTFBF17
}
。 为了解决这一问题,可以对所有训练数据的来源领域进行区分,一个比较典型的做法是在使用多领域数据训练时,在神经机器翻译模型的编码器顶部中添加一个判别器
\upcite
{
britz2017effective
}
,该判别器使用源语言句子
$
x
$
的编码器表示作为输入,预测句子所属的领域标签
$
d
$
,如图
\ref
{
fig:16-21
}
所示。为了使预测领域标签
$
d
$
的正确概率
$
\funp
{
P
(
d|
\mathbi
{
H
}
)
}$
最大(其中
$
\mathbi
{
H
}$
为编码器的隐藏状态),模型在训练过程中最小化如下损失函数
$
\funp
{
L
}_{
\rm
{
disc
}}$
:
\parinterval
在使用多领域数据时,混合多个相差较大的领域数据进行训练会使单个领域的翻译性能下降
\upcite
{
DBLP:conf/eacl/NegriTFBF17
}
。 为了解决这一问题,可以对所有训练数据的来源领域进行区分,一个比较典型的做法是在使用多领域数据训练时,在神经机器翻译模型的编码器顶部中添加一个判别器
\upcite
{
britz2017effective
}
,该判别器使用源语言句子
$
x
$
的编码器表示作为输入,预测句子所属的领域标签
$
d
$
,如图
\ref
{
fig:16-21
}
所示。为了使预测领域标签
$
d
$
的正确概率
$
\funp
{
P
(
d|
\mathbi
{
H
}
)
}$
最大(其中
$
\mathbi
{
H
}$
为编码器的隐藏状态),模型在训练过程中
应该
最小化如下损失函数
$
\funp
{
L
}_{
\rm
{
disc
}}$
:
\begin{eqnarray}
\funp
{
L
}_{
\rm
{
disc
}}&
=
&
-
\log\funp
{
P
}
(d|
\mathbi
{
H
}
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论