Commit a0d4147d by xiaotong

wording (sec 16)

parent 08919291
......@@ -14,7 +14,7 @@
\draw [->,thick] ([yshift=1pt]data.north) .. controls +(90:2em) and +(90:2em) .. ([yshift=1pt]model.north) node[above,midway] {\small{参数优化}};
\draw [->,thick] ([yshift=1pt]model.south) .. controls +(-90:2em) and +(-90:2em) .. ([yshift=1pt]data.south) node[below,midway] {\small{数据优化}};
\node[word] at ([xshift=-0.5em,yshift=-4em]data.south){\small{(a) 基于数据的初始化方法}};
\node[word] at ([xshift=-0.5em,yshift=-4em]data.south){\small{(a) 基于数据的初始化}};
\end{scope}
\end{tikzpicture}
......@@ -33,7 +33,7 @@
\draw [->,thick] ([yshift=1pt]data.north) .. controls +(90:2em) and +(90:2em) .. ([yshift=1pt]model.north) node[above,midway] {\small{参数优化}};
\draw [->,thick] ([yshift=1pt]model.south) .. controls +(-90:2em) and +(-90:2em) .. ([yshift=1pt]data.south) node[below,midway] {\small{数据优化}};
\node[word] at ([xshift=-0.5em,yshift=-4em]model.south){\small{(b) 基于模型的初始化方法}};
\node[word] at ([xshift=-0.5em,yshift=-4em]model.south){\small{(b) 基于模型的初始化}};
\end{scope}
\end{tikzpicture}
......
......@@ -633,7 +633,7 @@
%----------------------------------------------------------------------------------------
\subsubsection{2. 基于无监督词典归纳的方法}
\parinterval 既然无监督神经机器翻译问题的核心在于通过无监督方法提供初始的监督信号,另一个思路就是直接从无监督词典归纳中得到神经机器翻译模型,从而避免繁琐的无监督统计机器翻译模型的训练,同时也避免神经机器翻译模型继承统计机器翻译模型的错误。这种方法的核心就是把翻译看成一个两阶段的过程:
\parinterval 另一个思路是直接从无监督词典归纳中得到神经机器翻译模型,从而避免繁琐的无监督统计机器翻译模型的训练,同时也避免神经机器翻译模型继承统计机器翻译模型的错误。这种方法的核心就是把翻译看成一个两阶段的过程:
\begin{itemize}
\vspace{0.5em}
......@@ -643,19 +643,21 @@
\vspace{0.5em}
\end{itemize}
\parinterval 而第二阶段的改写任务其实也是一个特殊的翻译任务,只不过现在的源语言和目标语言是使用不同的方式表达的同一种语言的句子。因此可以使用神经机器翻译模型来完成这个任务,而且由于这里不涉及双语数据而只需要单语数据,模型的训练也将是无监督的。这样的方法不再需要无监督统计机器翻译,并且适应能力很强。对于新语种,不需要重新训练神经机器翻译模型,只需要训练无监督词典归纳进行词的翻译,再使用相同的模型进行改写。但是,目前训练数据需要使用其他语种的双语数据来进行构造(把源语言句子里每个词使用双语词典进行翻译作为输入,输出的目标语言句子不变)。虽然可以通过把单语句子根据规则或者随机进行打乱来生成训练数据,但是这些句子不符合语言学的规律,并且跟真实句子所服从的数据分布不一致,导致训练-测试不一致的问题。而且这样一个两阶段的过程会产生错误传播的问题,比如无监督词典归纳对一些词进行了错误的翻译,那么这些错误的翻译会被送到神经机器翻译模型里进行改写,因为翻译模型这时候已经无法看到源语言句子来进行修正,所以最终的结果将继承无监督词典归纳的错误\upcite{DBLP:conf/acl/PourdamghaniAGK19}
\parinterval 而第二阶段的改写任务其实也是一个特殊的翻译任务,只不过现在的源语言和目标语言是使用不同的方式表达的同一种语言的句子。因此可以使用神经机器翻译模型来完成这个任务,而且由于这里不涉及双语数据而只需要单语数据,模型的训练也将是无监督的。这样的方法不再需要无监督统计机器翻译,并且适应能力很强。对于新语种,不需要重新训练神经机器翻译模型,只需要训练无监督词典归纳进行词的翻译,再使用相同的模型进行改写。
\parinterval 但是,目前训练数据需要使用其他语种的双语数据来进行构造(把源语言句子里每个词使用双语词典进行翻译作为输入,输出的目标语言句子不变)。虽然可以通过把单语句子根据规则或者随机进行打乱来生成训练数据,但是这些句子与真实的句子差异较大,导致训练-测试不一致的问题。而且这样一个两阶段的过程会产生错误传播的问题,比如无监督词典归纳对一些词进行了错误的翻译,那么这些错误的翻译会被送下一阶段进行改写,因为翻译模型这时候已经无法看到源语言句子来进行修正,所以最终的结果将继承无监督词典归纳的错误\upcite{DBLP:conf/acl/PourdamghaniAGK19}
%----------------------------------------------------------------------------------------
% NEW SUB-SUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{3. 更深层的融合}
\parinterval 为了获得更好的神经机器翻译模型,可以对训练流程和模型做更深度的整合。{\chapterten}已经介绍,神经机器翻译模型的训练包含两个阶段:初始化和优化。而无监督神经机器翻译的核心思路也对应这两个阶段:无监督方法提供初始的监督信号和数据优化,因此可以考虑在模型的初始化阶段使用无监督方法提供初始的监督信号,然后优化过程不但优化模型的参数,还优化训练使用的数据,从而避免流水线带来的错误传播。其中初始的监督信号可以通过两种方法提供给模型,一种是直接使用无监督方法提供最初的伪双语数据来训练最初的翻译模型,另一种则是借助无监督方法来初始化模型,得到最初的翻译模型后直接使用初始化好的翻译模型产生伪双语数据来训练自己,如图\ref{fig:16-18}所示。图\ref{fig:16-18}(a)的一个简单实现是利用无监督词典归纳得到的词典对单语数据进行逐词的翻译,得到最初的伪双语数据,再在这些数据上训练最初的翻译模型,最后不断地交替优化数据和模型,得到更好的翻译模型和质量更好的伪数据\upcite{DBLP:conf/iclr/LampleCDR18}。这样的做法通过不断优化训练用的双语数据,摆脱了无监督词典归纳在最初的伪双语数据中遗留下来的错误,同时也避免了使用无监督统计机器翻译模型的代价。图\ref{fig:16-18}(b)的实现则依赖于具体的翻译模型初始化方法,下一节会讨论翻译模型的不同初始化方法。
\parinterval 为了获得更好的神经机器翻译模型,可以对训练流程和模型做更深度的整合。{\chapterten}已经介绍,神经机器翻译模型的训练包含两个阶段:初始化和优化。而无监督神经机器翻译的核心思路也对应这两个阶段,因此可以考虑在模型的初始化阶段使用无监督方法提供初始的监督信号,然后不但优化模型的参数,还优化训练使用的数据,从而避免流水线带来的错误传播。其中初始的监督信号可以通过两种方法提供给模型。一种是直接使用无监督方法提供最初的伪双语数据,然后训练最初的翻译模型。另一种则是借助无监督方法来初始化模型,得到最初的翻译模型后,直接使用初始化好的翻译模型产生伪双语数据,然后训练自己,如图\ref{fig:16-18}所示。图\ref{fig:16-18}(a)的一个简单实现是利用无监督词典归纳得到词典,用这个词典对单语数据进行逐词的翻译,得到最初的伪双语数据,再在这些数据上训练最初的翻译模型,最后不断地交替优化数据和模型,得到更好的翻译模型和质量更好的伪数据\upcite{DBLP:conf/iclr/LampleCDR18}。这样的做法通过不断优化训练用的双语数据,摆脱了无监督词典归纳在最初的伪双语数据中遗留下来的错误,同时也避免了使用无监督统计机器翻译模型的代价。图\ref{fig:16-18}(b)的实现则依赖于具体的翻译模型初始化方法,下一节会讨论翻译模型的不同初始化方法。
%----------------------------------------------
\begin{figure}[h]
\centering
\input{Chapter16/Figures/figure-optimization-of-the-model-initialization-method}
\caption{模型参数初始化方法的优化}
\caption{模型参数初始化策略}
\label{fig:16-18}
\end{figure}
%----------------------------------------------
......@@ -665,17 +667,17 @@
%----------------------------------------------------------------------------------------
\subsubsection{4. 其它问题}
\parinterval 实际上无监督神经机器翻译模型的训练并不简单。一般可以认为,在生成的伪数据上优化模型会使模型变得更好,这时候对这个更好的模型使用数据增强的手段(如回译等)就可以生成更好的训练数据。这样的一个数据优化过程依赖于一个假设:模型经过参数优化后会生成比原始数据更好的数据。而在数据优化和参数优化的共同影响下,模型非常容易拟合数据中的简单模式,使得在数据优化过程中模型倾向产生包含这种简单模式的数据,造成模型对这种类型数据过拟合的现象。一个常见的问题就是模型对任何输入都输出相同的译文,这时候翻译模型无法产生任何有意义的结果,而它的训练过程则退化成普通的语言模型(数据优化产生的数据里无论什么目标语言对应的源语言都是同一个句子)。这种情况下翻译模型虽然能降低损失(训练语言模型),但是它不能学会任何源语言跟目标语言之间的对应关系,也就无法进行正确翻译。这个现象也反映出无监督机器翻译训练的脆弱性。
\parinterval 一般可以认为,在生成的伪数据上优化模型会使模型变得更好,这时候对这个更好的模型使用数据增强的手段(如回译等)就可以生成更好的训练数据。这样的一个数据优化过程依赖于一个假设:模型经过优化后会生成比原始数据更好的数据。而在数据优化和参数优化的共同影响下,模型非常容易拟合数据中的简单模式,使得模型倾向产生包含这种简单模式的数据,造成模型对这种类型数据过拟合的现象。一个常见的问题就是模型对任何输入都输出相同的译文,这时候翻译模型无法产生任何有意义的结果,也就是,数据优化产生的数据里无论什么目标语言对应的源语言都是同一个句子。这种情况下翻译模型虽然能降低损失,但是它不能学会任何源语言跟目标语言之间的对应关系,也就无法进行正确翻译。这个现象也反映出无监督机器翻译训练的脆弱性。
\parinterval 比较常见的解决方案是在双语数据对应的目标函数外增加一个语言模型的目标函数。因为,在初始阶段,由于数据中存在大量不通顺的句子,额外的语言模型目标函数能把部分句子纠正过来,使得模型逐渐生成更好的数据\upcite{DBLP:conf/emnlp/LampleOCDR18}。这个方法在实际应用中非常有效,尽管目前还没有太多理论上的支持。
\parinterval 无监督神经机器翻译还有两个关键的技巧:
\begin{itemize}
\vspace{0.5em}
\item 词表共享:对于源语言和目标语言里都一样的词使用同一个词嵌入,而不是源语言和目标语言各自对应一个词嵌入,比如,阿拉伯数字或者一些实体名字。这样相当于在模型设计上告诉模型这个词在源语言和目标语言里面表达同一个意思,隐式地引入了单词翻译的监督信号。在无监督神经机器翻译里词表共享搭配子词切分会更加有效,因为子词的覆盖范围广,比如,多个不同的词可以包含同一个子词。
\item 词表共享:对于源语言和目标语言里都一样的词使用同一个词嵌入,而不是源语言和目标语言各自对应一个词嵌入,比如,阿拉伯数字或者一些实体名字。这样相当于告诉模型这个词在源语言和目标语言里面表达同一个意思,隐式地引入了单词翻译的监督信号。在无监督神经机器翻译里词表共享搭配子词切分会更加有效,因为子词的覆盖范围广,比如,多个不同的词可以包含同一个子词。
\vspace{0.5em}
\item 模型共享:与多语言翻译系统类似,使用同一个翻译模型来进行正向翻译(源语言$\to$目标语言)和反向翻译(目标语言$\to$源语言)。这样做降低了模型的参数量,减少了过拟合的风险。
\item 模型共享:与多语言翻译系统类似,使用同一个翻译模型来进行正向翻译(源语言$\to$目标语言)和反向翻译(目标语言$\to$源语言)。这样做降低了模型的参数量。而且,两个翻译方向可以互相为对方起到正则化的作用,减小了过拟合的风险。
\vspace{0.5em}
\end{itemize}
......@@ -691,7 +693,7 @@
\noindent{\small\bfnew{1)模型参数初始化}}
\parinterval 无监督神经机器翻译的关键在于如何提供最开始的监督信号,从而启动后续的迭代流程。无监督词典归纳已经可以提供一些可靠的监督信号,那么如何在模型初始化中融入这些信息?既然神经机器翻译模型都使用词嵌入层作为输入,而无监督词典归纳总是先把两个语言各自的单语词嵌入映射到一个空间后才归纳双语词典,那么可以使用这些映射后的词嵌入来初始化模型的词嵌入层,然后在这个基础上训练模型,因为这些映射后的词嵌入天然就包含了大量的监督信号,比如,两个语言里意思相近的词对应的词嵌入会比其他词更靠近对方\upcite{DBLP:journals/ipm/FarhanTAJATT20}。 为了防止机器翻译训练过程中模型参数的更新会破坏词嵌入中蕴含的信息,通常初始化后会固定模型的词嵌入层不让其更新\upcite{DBLP:conf/emnlp/ArtetxeLA18}
\parinterval 无监督神经机器翻译的关键在于如何提供最开始的监督信号,从而启动后续的迭代流程。无监督词典归纳已经可以提供一些可靠的监督信号,那么如何在模型初始化中融入这些信息?既然神经机器翻译模型都使用词嵌入作为输入,而且无监督词典归纳也是基于两种语言共享的词嵌入空间,那么可以使用共享词嵌入空间的词嵌入结果来初始化模型的词嵌入层,然后在这个基础上训练模型。比如,两个语言里意思相近的词对应的词嵌入会比其他词更靠近对方\upcite{DBLP:journals/ipm/FarhanTAJATT20}。 为了防止机器翻译训练过程中模型参数的更新会破坏词嵌入中蕴含的信息,通常初始化后会固定模型的词嵌入层不让其更新\upcite{DBLP:conf/emnlp/ArtetxeLA18}
\parinterval 进一步,无监督神经机器翻译能在提供更少监督信号的情况下启动,也就是可以去除无监督词典归纳这一步骤\upcite{DBLP:conf/nips/ConneauL19}。这时候模型的初始化直接使用共享词表的预训练模型的参数作为起始点。这个预训练模型直接使用前面提到的预训练方法(如MASS)进行训练,区别在于模型的结构需要严格匹配翻译模型。此外,这个模型不仅仅只在一个语言的单语数据上进行训练,而是同时在两个语言的单语数据上进行训练,并且两个语言的词表进行共享。前面提到,在共享词表特别是共享子词词表的情况下,已经隐式地告诉模型源语言和目标语言里一样的(子)词互为翻译,相当于模型使用了少量的监督信号。在这基础上使用两个语言的单语数据进行预训练,通过模型共享进一步挖掘了语言之间共通的部分。因此,使用预训练模型进行初始化后,无监督神经机器翻译模型已经得到大量的监督信号,从而得以不断通过优化来提升模型性能。
......@@ -699,11 +701,11 @@
\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}所示。
\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}所示。
%----------------------------------------------
\begin{table}[h]
\centering
\caption{三种噪声函数(原句为``我\ 喜欢\ \ 苹果\ 。'')}
\caption{三种噪声加噪方式示例(原句为``我\ 喜欢\ \ 苹果\ 。'')}
\begin{tabular}{l|l|l}
\multicolumn{1}{c|}{噪声函数} & \multicolumn{1}{c|}{描述} & \multicolumn{1}{c}{例子} \\
\hline
......@@ -715,7 +717,7 @@
\end{table}
%----------------------------------------------
\parinterval 实际应用中以上三种形式的噪声函数都会被使用到,其中在交换方法中距离越相近的词越容易被交换,并且保证被交换的词的对数有限,而删除和空白方法里词的删除和替换概率通常都会设置的非常低,如$0.1$等。
\parinterval 实际应用中以上三种形式的噪声函数都会被使用到,其中在交换方法中距离越近的词越容易被交换,并且要保证交换次数有上限,而删除和空白方法里词的删除和替换概率通常都非常低,如$0.1$ 等。
%----------------------------------------------------------------------------------------
% NEW SECTION 16.5
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论