% !Mode:: "TeX:UTF-8"
% !TEX encoding = UTF-8 Unicode

%----------------------------------------------------------------------------------------
% 机器翻译：统计建模与深度学习方法
% Machine Translation: Statistical Modeling and Deep Learning Methods
%
% Copyright 2020
% 肖桐(xiaotong@mail.neu.edu.cn) 朱靖波 (zhujingbo@mail.neu.edu.cn)
%----------------------------------------------------------------------------------------

%----------------------------------------------------------------------------------------
%    CONFIGURATIONS
%----------------------------------------------------------------------------------------

\renewcommand\figurename{图}%将figure改为图
\renewcommand\tablename{表}%将figure改为图
\chapterimage{fig-NEU-7.jpg} % Chapter heading image

%----------------------------------------------------------------------------------------
%	CHAPTER 16
%----------------------------------------------------------------------------------------
\chapter{低资源神经机器机器翻译}

\parinterval 相比传统的统计机器翻译，神经机器翻译的性能得到了显著的提升，随之带来的问题是对海量训练双语句对的依赖。想要得到一个高质量的神经机器翻译模型，需要大量的训练数据，然而双语句对的获取代价相对较高，在很多场景下都很难获取到充分的训练数据。如汉语、英语这种使用范围广泛或使用人数较多的语言，很容易获取到语言之间大量的双语句对，我们称之为富资源语言，而对于一些少数民族语言或者中小国家的语言，如乌尔都语、斐济语等，很难获取到与其他语言的双语句对，我们称之为低资源语言。世界上现存6000余种语言，仅有很少一部分为富资源语言，绝大多数均为低资源语言。即使在富资源语言对中，对于一些特定的领域，如物理、天文等，双语句对也是十分稀缺的。因此，一直以来，低资源机器翻译都是备受研究人员关注的一个问题。

{\red{（几种方法的概述，最后加）}}

%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\section{单语数据的使用}

\parinterval 在统计机器翻译时代，使用单语数据训练语言模型就是构建机器翻译系统的关键步骤。好的语言模型往往会带来性能的增益。而这个现象在神经机器翻译中似乎并不明显，因为在大多数神经机器翻译的范式中，并不要求使用大规模单语数据来帮助机器翻译系统。甚至，连语言模型都不会作为一个独立的模块。这一方面是由于神经机器翻译系统的解码端本身就起着语言模型的作用，另一方面是由于数据的增多使得翻译模型可以更好的捕捉目标语言的规律。但是，双语数据总是有限的。很多场景下，单语数据的规模会远大于双语数据。比如，在专利翻译的很多细分领域中，双语数据的规模十分有限，但是有大量的和领域相关的单语数据。如果能够让这些单语数据发挥作用，显然是一种非常好的选择。在神经机器翻译中使用单语数据主要面临着两方面问题：

\begin{itemize}
    \vspace{0.5em}
    \item 从单语数据中学习什么样的知识？
    \vspace{0.5em}
    \item 如何在神经机器翻译中集成单语数据的知识？
    \vspace{0.5em}
\end{itemize}

下面将从数据增强、基于语言模型的单语数据使用、翻译建模等方面对这两个问题展开讨论。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{数据增强}

\parinterval {\small\bfnew{数据增强}}（Data Augmentation）是为了缓解双语数据稀缺这一问题，利用单语数据来得到伪双语数据，从而增加训练数据量的方法。
常用的数据增强方法包括回译、加噪和双语数据挖掘等。

\subsubsection{1. 回译}

\parinterval {\small\bfnew{回译}}（Back Translation, BT）是目前机器翻译任务上最常用的一种数据增强的方法。回译的主要思想是利用目标语言-源语言模型（反向翻译模型）来生成伪双语句对，用于训练源语言-目标语言翻译模型（正向翻译模型）。比如我们的目标是训练一个英汉翻译模型，首先使用双语数据训练汉英翻译模型，然后通过该模型将汉语的单语句子翻译为英语句子，从而得到大量的生成英语-真实汉语伪双语句对。然后，将回译得到的伪双语句对和真实双语句对混合，训练得到英汉神经机器翻译模型。
回译方法是模型无关的，只需要训练一个反向翻译模型，就可以简单有效地利用单语数据来提高训练数据的数量，因此在工业界也得到了广泛采用。图\ref{fig:16-1-xc}给出了回译方法的一个简要流程。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-application-process-of-back-translation}
\caption{回译方法的流程}
\label{fig:16-1-xc}
\end{figure}
%-------------------------------------------

\parinterval 一般情况下，我们认为，反向模型的性能越好，生成的源语言译文质量越高，从而伪数据的分布和真实数据的分布越接近。不过，在实践中发现，即使一些简单的策略也能带来性能的增长。比如，在一些低资源的语种，仅仅通过将目标语句子复制到源语言端构造的伪数据都能为模型带来增益\upcite{DBLP:conf/wmt/CurreyBH17}。相比这些简单的构造策略，利用目标语言单语数据进行回译可以获得更高质量的伪数据。原因主要包括以下两点：

\begin{itemize}
\vspace{0.5em}
\item 伪双语句对的源语言是模型生成的翻译结果，保留了两种语言之间的互译信息，相比真实数据又存在一定的噪声。神经机器翻译模型在伪双语句对上进行训练，可以学习到如何处理带有噪声的输入，提高了模型的鲁棒性；
\vspace{0.5em}
\item 伪双语句对的目标语言是真实的句子，保证了神经机器翻译模型生成结果的流畅度，因此可以得到更符合人类阅读习惯的翻译结果。
\vspace{0.5em}
\end{itemize}

\parinterval 围绕如何利用回译方法生成对模型更有帮助的伪双语数据，研究人员们进行了详细的分析探讨。一般观点认为，反向模型的性能越好，生成的伪数据质量也就更高，对前向模型的性能提升也就越大。回译方法面临的一个问题是：反向翻译模型的训练只依赖于有限的双语数据，生成的源语言端伪数据的质量难以保证。为此，可以采用{\small\sffamily\bfnew{迭代式回译}}\index{迭代式回译}（Iterative Back Translation）\index{Iterative Back Translation}的方法\upcite{DBLP:conf/aclnmt/HoangKHC18}，同时利用源语言端和目标语言端的单语数据，不断通过回译的方式来提升前向和反向翻译模型的性能。图\ref{fig:16-2-xc}展示了迭代式回译的框架。首先，使用双语数据训练一个前向翻译模型，然后利用源语言单语数据通过回译的方式生成伪双语数据，来提升反向翻译模型的性能，最后由反向翻译模型和目标语言单语数据生成的伪双语数据来提升前向翻译模型的性能。可以看出，这个往复的过程是闭环的，因此可以一直重复进行，直到两个翻译模型的性能均不再提升。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-example-of-iterative-back-translation}
\caption{迭代式回译方法的流程}
\label{fig:16-2-xc}
\end{figure}
%-------------------------------------------

\parinterval 然而，研究人员发现，在低资源语种上，由于缺乏双语数据，高质量的伪双语数据对于模型来说更有帮助。而在富资源语种中，对回译产生的源语言句子添加一些噪声，提高翻译结果的多样性，反而可以达到更好的效果，比较常用的方法是使用采样或{\rm{TopK}}解码\upcite{DBLP:conf/emnlp/EdunovOAG18}。

\parinterval 回译常用的解码方式为束搜索，在生成每个词的时候只考虑预测概率最高的词，因此生成的翻译结果质量更高，但导致的问题是翻译结果主要都是一些高频词，缺乏多样性，生成的伪数据也就很难去准确地覆盖真实的数据分布\upcite{DBLP:conf/icml/OttAGR18}。采样解码是指在解码过程中，对词表中所有的词按照预测概率进行随机采样，因此整个词表中的词都有可能被选中，从而使生成结果更具多样性，但翻译质量和流畅度也会明显下降。{\rm{TopK}}解码是对束搜索和采样解码的一个折中方法。在解码过程中，{\rm{TopK}}解码对词表中预测概率最高的前K个词进行随机采样，这样在保证翻译结果准确性的前提下，也提高了结果的多样性。由于采样和{\rm{TopK}}解码只在生成的源语言句子中引入了多样性，因此也可以提高对包含低频词或噪声句子的训练次数。三种方法如图\ref{fig:16-3-xc}所示。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-contrast-diagram-of-beam-search-TopK-and-sampling}
\caption{回译的三种解码方式}
\label{fig:16-3-xc}
\end{figure}
%-------------------------------------------

\parinterval 与回译方法类似，源语言的单语数据也可以通过一个双语数据训练的前向翻译模型获得对应的目标语译文，从而构造{\small\sffamily\bfnew{前向翻译}}\index{前向翻译}（Forward Translation）\index{Forward Translation}的伪数据。与回译方法相反，前向翻译伪数据中源语言句子是真实的，而目标语言句子是生成的，构造的伪数据对译文的流畅性并没有太大帮助，甚至有害，其主要作用是丰富了训练数据中源语言的表示，提升翻译模型中编码器的性能。大多数情况下，利用前向翻译模型生成伪数据的方法带来的性能提升效果要弱于回译。

\subsubsection{2. 修改双语数据}

{\red{（这种方法并没有使用单语数据，放在这一节是否合适？或者要修改一下章节题目。）}}

\parinterval 除利用回译方法生成伪数据外，另外一种数据增强技术是在原始的双语数据上进行操作得到伪数据，常用的方法包括加噪、词替换等。

\begin{itemize}
    \vspace{0.5em}
    \item {\small\sffamily\bfnew{加噪}}

\parinterval 加噪是指在保证句子整体语义的情况下，对原始的双语数据适当加入一些噪声，从而生成伪双语数据来增加训练数据量。常用的加噪方法主要有以下三种：

\begin{itemize}
    \vspace{0.5em}
    \item 丢词：句子中的每个词均有$\funp{P}_{\rm{drop}}$的概率被丢弃。
    \vspace{0.5em}
    \item 屏蔽词：句子中的每个词均有$\funp{P}_{\rm{mask}}$的概率被替换为一个额外的[mask]词。
    \vspace{0.5em}
    \item 乱序：将句子中距离较近的某些词的位置进行交换，打乱句子中的单词顺序。
    \vspace{0.5em}
\end{itemize}

图\ref{fig:16-4-xc}展示了三种加噪方法的示例。这里，$\funp{P}_{\rm{drop}}$和$\funp{P}_{\rm{mask}}$均设置为0.1，表示每个词有$10\%$的概率被丢弃或屏蔽，乱序的操作略微复杂，一种实现方法是，通过一个数字来表示每个词在句子中的位置，如“我”是第零个词，“你”是第二个词，然后，在每个位置生成一个$0$到$n$的随机数，n一般设置为3，然后将每个词的位置数和对应的随机数相加，即图中的$S$。对$S$按照从小到大排序，根据排序后每个位置的索引从原始句子中选择对应的词，从而得到最终打乱顺序后的结果。比如，在排序后，$S_1$的值小于$S_0$，其余词则保持递增顺序，则将原始句子中的第零个词和第一个词的顺序进行交换，其他词保持不变。

%----------------------------------------------
\begin{figure}[htp]
    \centering
    \input{./Chapter16/Figures/figure-three-common-methods-of-adding-noise}
    \caption{三种加噪方法}
    \label{fig:16-4-xc}
\end{figure}
%-------------------------------------------

\parinterval 和回译方法相似，加噪方法一般仅在源语言句子上进行操作，既保证了目标语言句子的流畅度，又可以提高训练数据量，增加数据的多样性。加噪方法也被用于训练降噪自编码器，在无监督机器翻译中也得到了广泛应用，详细方法可以参考xxx小节。

\vspace{0.5em}
\item {\small\sffamily\bfnew{词替换}}

\parinterval 将一个句子中的某个词替换为其他词，可能并不会影响句子的合理性和流畅度。比如，对于“我出去玩。”这句话，将“我”替换为“你”、“他”、“我们”或是将“玩”替换为“骑车”、“学习”、“吃饭”等，虽然改变了语义，但句子仍然是合理的。词替换方法即是将双语数据中的部分词替换为词表中的其他词，在保证句子的语义或语法的前提下，增加了训练数据的多样性。

\parinterval 一种替换策略是对目标语中的稀有词进行替换\upcite{DBLP:conf/acl/FadaeeBM17a}。词表中的稀有词由于出现次数较少，很容易导致训练不充分问题，从而无法准确预测稀有词。对于一个双语句对$(\mathbi{s}, \mathbi{t})$，$\mathbi{s} = (s_1, \dots, s_i, \dots, s_n)$，$\mathbi{t} = (t_1, \dots, t_j, \dots, t_m)$，假定选择源语言句子$\mathbi{s}$进行替换，那么在源语言句子的位置$i$，可以根据前面的文本和前向语言模型得到前向候选稀有词，如公式所示：

\begin{eqnarray}
    \overrightarrow{C} = \{s_i^{'} \in V_R: {\rm{TopK}} \funp{P}_{\rm{ForwardLM}}(s_i^{'} | s_i^{i-1})\}
\end{eqnarray}

\parinterval 这里，$V_R$表示稀有词词表，可以设定为训练数据中出现次数最少的部分词或出现次数小于一定阈值的部分词，$\funp{{\rm{TopK}}}$表示选择预测概率最高的前K个词。如果这K个词在稀有词词表$V_R$中，则将其加入到前向候选稀有词中。同样，利用后面的文本和反向语言模型得到后向候选稀有词：

\begin{eqnarray}
    \overleftarrow{C} = \{s_i^{'} \in V_R: {\rm{TopK}} \funp{P}_{\rm{BackwardLM}}(s_i^{'} | s_i^{i-1})\}
\end{eqnarray}

\parinterval 然后，就可以选择同时出现在前向候选稀有词和反向候选稀有词的单词：

\begin{eqnarray}
    {C} = \{s_i | s_i^{'} \in \overrightarrow{C} \wedge s_i^{'} \in \overleftarrow{C}\}
\end{eqnarray}

\parinterval 前向和反向语言模型均可以使用海量的单语数据训练得到。通过这种方法，选取到的稀有词保证了替换后句子的句法合理性以及流畅度。最后，根据词对齐找到替换词在目标语言句子中对应的位置$j$，根据翻译词典等方法，就可以将目标语言句子中的$t_j$替换为$s_i^{'}$对应的翻译结果$t_j^{'}$，从而生成得到伪双语数据。

\vspace{0.5em}
\end{itemize}

\subsubsection{3. 双语句对挖掘}

\parinterval 从可比语料中挖掘可用的双语句对也是一种常用的数据增强方法。可比语料是指源语言和目标语言虽然不是完全互译的文本，但是蕴含了丰富的双语对照知识，可以从中挖掘出可用的双语句对来训练。相比有标注的双语语料来说,可比语料相对容易获取，比如多种语言报道的新闻事件、多种语言的维基百科词条；多种语言翻译的书籍等。如图\ref{fig:16-5-xc}中展示的维基百科词条所示。

%----------------------------------------------
\begin{figure}[htp]
    \centering
    \input{./Chapter16/Figures/figure-examples-of-comparable-corpora}
    \caption{维基百科中的可比预料}
    \label{fig:16-5-xc}
\end{figure}
%-------------------------------------------

\parinterval 可比语料一般从网页中爬取得到，内容一般较为复杂，可能会存在较大比例的噪声，如HTML字符、乱码等，首先需要进行充分的数据清洗操作，得到干净的可比语料，然后从中抽取出可用的双语句对。传统的抽取方法一般通过模型或双语词典来得到，比如通过计算两个不同语言句子之间的单词重叠数或BLEU值\upcite{finding2006adafre,method2008keiji},通过排序模型或二分类器判断一个目标语言句子和一个源语言句子互译的可能性\upcite{DBLP:journals/coling/MunteanuM05,DBLP:conf/naacl/SmithQT10} 。

\parinterval 另外一种比较有效的方法是根据两种语言中每个句子的句向量来抽取。首先，对于两种语言的每个句子，分别使用词嵌入加权平均等方法计算得到蕴含句子语义信息的句向量，然后计算每个源语言句子和目标语言句子之间的余弦相似度，相似度大于一定阈值的句对则认为是可用的双语句对\cite{DBLP:conf/emnlp/WuZHGQLL19}。然而，不同语言单独训练得到的词嵌入可能在不同的表示空间，因此得到的句向量无法用于衡量两个句子的相似度。为了解决这个问题，一般使用在同一表示空间的跨语言词嵌入来表示两种语言的单词，在跨语言词嵌入中，不同语言相同意思的词对应的词嵌入具有较高的相似性，因此得到的句向量也就可以用于衡量两个句子是否表示相似的语义。关于跨语言词嵌入的具体内容，可以参考xxx(双语词典归纳一节)。

(扩展阅读)
\parinterval 除此之外，还有很多工作对数据增强方法进行了深入的研究与探讨。探索源语言单语数据在神经机器翻译中的使用方法\upcite{DBLP:conf/emnlp/ZhangZ16}；选择何种单语数据来生成伪数据带来的收益更大\upcite{DBLP:conf/emnlp/FadaeeM18,DBLP:conf/nlpcc/XuLXLLXZ19}；通过特别标识对真实双语和回译生成的伪双语数据进行区分\upcite{DBLP:conf/wmt/CaswellCG19}；在回译过程中对训练数据进行动态选择与加权\upcite{DBLP:journals/corr/abs200403672};利用目标端单语数据和相关的富资源语言进行数据增强\upcite{DBLP:conf/acl/XiaKAN19}；通过在源语或目标语中随机选择某些词，将这些词替换为词表中随机的一个词，可以得到伪双语数据\upcite{DBLP:conf/emnlp/WangPDN18}；随机选择句子中的某个词，将这个词的词嵌入替换为多个语义相似词的加权表示融合\upcite{DBLP:conf/acl/GaoZWXQCZL19}；基于模型的不确定性来量化预测结果的置信度，从而提升回译方法的性能\upcite{DBLP:conf/emnlp/WangLWLS19}；探索如何利用大规模单语数据\upcite{DBLP:conf/emnlp/WuWXQLL19}；还有一些工作对数据增强进行了理论分析\upcite{DBLP:conf/emnlp/LiLHZZ19}。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{基于语言模型的单语数据使用}

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\parinterval 单语数据是一种无标注的数据形式，而自然语言处理领域中最常用的无监督任务是语言模型，用来描述文字序列出现的规律。语言模型在训练过程中逐渐具备了特征提取的作用，并且考虑了生成结果的流畅度。因此，通过单语数据训练语言模型，然后应用在神经机器翻译模型中，也是一种有效的辅助方法。下面从语言模型融合、预训练、联合训练等方向介绍基于语言模型的单语数据使用。

\subsubsection{1. 语言模型融合}

\parinterval 单语数据是一种无标注的数据形式，而自然语言处理领域中最常用的无监督任务是语言模型，用来描述文字序列出现的规律。神经机器翻译模型本身也具备了语言模型的作用，在解码阶段，不仅考虑和源语言句子的语义对应，也考虑了预测的目标语言句子的流畅度。然而，训练神经机器翻译模型的双语数据是较为有限的，而语言模型可以使用海量的单语数据进行训练，预测结果的流畅度更高。因此，融合语言模型和神经机器翻译模型来生成翻译结果也是一种有效的单语数据使用方法。

\parinterval 神经机器翻译模型自回归地生成翻译结果。对于一个双语句对$(x, y)$，神经机器翻译模型根据源语言句子$x$和前面生成的词来预测当前位置词的概率分布：

\begin{eqnarray}
\log_{P(y | x; \theta)} = \sum_{t}{\log_{P(y_t | x, y_{<t}; \theta)}}
\label{eq:16-1-xc}
\end{eqnarray}

\parinterval 这里，$\theta$是神经机器翻译模型的参数，$y_{<t}$表示第$t$个词前面生成的词。神经机器翻译模型考虑了结果的忠诚度和流畅度，忠诚度是指目标语翻译结果和源语言句子的语义保持一致，流畅度是指翻译结果符合人类的语言习惯。忠诚度需要建模源语言和目标语言之间的对应关系，但是流畅度只和目标语言有关。使用海量单语数据训练的语言模型可以生成更流利的句子，将其和神经机器翻译模型的解码过程结合，可以在保证忠诚度的情况下，得到更加流利的翻译结果。具体的结合方法包括两种，分别是浅融合和深融合\cite{2015OnGulcehre}，如图\ref{fig:16-6-xc}所示。

%----------------------------------------------
\begin{figure}[htp]
    \centering
    \input{./Chapter16/Figures/lm-fusion}
    \caption{语言模型的浅融合与深融合} 
    \label{fig:16-6-xc}
\end{figure}
%-------------------------------------------

\parinterval 浅融合通过对神经机器翻译模型和语言模型的预测概率进行加权来得到最终的预测概率：
\begin{eqnarray}
\log_{\funp{P}(y_t | x, y_{<t})} = \log_{\funp{P}(y_t | x, y_{<t}; \theta_{TM})} + \beta \log_{\funp{P}(y_t | y_{<t}; \theta_{LM})}
\label{eq:16-2-xc}
\end{eqnarray}

\parinterval 这里，$\theta_{TM}$和$\theta_{LM}$分别表示翻译模型和语言模型的参数，$\beta$是一个超参数，表示语言模型预测概率在解码过程中的权重，通过对比不同权重在校验集上的性能表现来进行选择。

\parinterval 深融合是在解码过程中，动态地融合翻译模型和语言模型的隐藏层表示来计算预测概率。
浅融合在解码过程对每个词均采用相同的语言模型权重，而深融合可以根据解码不同的词，动态选择语言模型的权重。
比如，在汉语-英语翻译系统中，英语句子中的冠词可能在汉语句子中没有显式的单词对应，这种情况下，英语语言模型可以提供更多帮助，保证翻译结果更加符合英语的语言结构；而在翻译某些名词的时候，语言模型由于没有源语言句子的信息，反而会对解码过程产生干扰，因此权重越小越好。

\parinterval 深融合的预测方式为：
\begin{eqnarray}
\log_{\funp{P}(y_t | x, y_{<t})}= \log_{\funp{P}(y_t | x, y_{<t}; s_{t})}
\label{eq:16-3-xc}
\end{eqnarray}

\parinterval 这里，$s_{t}$表示当前时刻$t$的隐藏层表示。
\begin{eqnarray}
s_{t} = s_{t}^{TM} + g_{t} s_{t}^{LM}
\label{eq:16-4-xc}
\end{eqnarray}

\parinterval 这里，$s_{t}^{TM}$和$s_{t}^{LM}$分别表示翻译模型和语言模型在时刻$t$的隐藏层表示，$g_{t}$用来控制语言模型隐藏层表示的权重，通过下面的计算得到：
\begin{eqnarray}
g_{t} = \sigma (w^{T}s_{t}^{TM} + b)
\label{eq:16-5-xc}
\end{eqnarray}

\parinterval 这里，$w$和$b$是可学习的参数，在训练过程中不断调整得到，$\sigma$是Sigmoid函数，将结果压缩到$(0, 1)$范围内。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 预训练}

{\red 预训练模型ELMo、GPT、BERT等在这里是否要详细介绍？}

\parinterval 编码器-解码器框架天然就包含了对输入（源语言）和输出（目标语言）进行表示学习的过程。比如，在编码端需要学习一种分布式表示（Distributed Representation）来表示源语言句子的信息，这种分布式表示既包含单词的表示也包括整个序列的表示。因此，可以使用更大规模的源语言单语数据完成编码器的训练。

\parinterval 实现上述想法的一种手段是{\small\sffamily\bfnew{预训练}}\index{预训练}（Pre-training）\index{Pre-training}。常用的方法是将机器翻译模型中的一部分（比如，编码器）单独提抽取出来，之后用语言建模等方式在大规模单语数据上进行训练。得到优化后的参数后，将其重新放入神经机器翻译模型中，作为模型的初始值。最后，神经机器翻译模型在双语数据上进行{\small\sffamily\bfnew{微调}}\index{微调}（Fine-tuning）\index{Fine-tuning}，以得到最终的翻译模型。图\ref{fig:16-7-xc}给出了机器翻译编码器预训练流程的示意图。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-encoder-fin}
\caption{机器翻译编码器预训练流程}
\label{fig:16-7-xc}
\end{figure}
%-------------------------------------------

\parinterval 预训练的做法相当于对目标任务进行了简化，将表示模型的学习任务从目标任务中分离出来了。这样，可以学习一种更加通用的模型，具有更好的泛化能力。此外，预训练的任务相比于机器翻译要简单许多，比如语言模型或者句子调序等。将预训练任务的结果作为机器翻译模型的初始值可以减轻目标任务上的学习负担。在第六章中已经介绍了几种基于预训练的模型，如ELMo、GPT和BERT等。这些模型的结构和神经机器翻译是兼容的，比如，BERT使用的也是目前神经机器翻译中主流的Transformer模型。因此，可以直接在神经机器翻译中使用这些开放的预训练模型。

\begin{itemize}
\vspace{0.5em}
\item {\small\sffamily\bfnew{词嵌入预训练}}

{\red（词嵌入预训练和语言模型关系不大，是否要放在这儿？）}

\parinterval 词嵌入可以被看作是对每个独立单词进行的表示学习，在自然语言处理的众多任务中都扮演着重要角色\upcite{DBLP:journals/corr/abs-1901-09069}。因此，可以使用{\chapternine}介绍的词嵌入方法，在外部单语数据上训练得到词嵌入，并把它作为神经机器翻译系统的词嵌入输入。

\parinterval 需要注意的是，在神经机器翻译中使用预训练的词嵌入有两种方法。一种方法是直接将词嵌入作为固定的输入，也就是在训练机器翻译模型的过程中，并不调整词嵌入的参数。这样做的目的是完全将词嵌入模块独立出来，机器翻译可以被看作是在固定的词嵌入输入上进行的建模。另一种方法是仍然遵循``预训练+微调''的策略，将词嵌入作为翻译模型的初始值。之后在机器翻译训练过程中，词嵌入模型结果会被进一步更新。近些年，在词嵌入预训练的基础上进行微调的方法受到研究者越来越多的青睐。
\vspace{0.5em}
\item {\small\sffamily\bfnew{编码器预训练}}

\parinterval 编码器在神经机器翻译中的作用是对源语句子中的信息进行抽象和提取，将离散的词序列编码成一组上下文相关的向量表示，本质上就是一个源语言端的句子表示模型。因此，可以使用预训练好的句子级表示模型（比如，BERT和XLM等），来初始化编码器参数。然而在实践中发现，这种参数初始化的方法在一些富资源语种上提升效果并不明显，甚至反而有些下降\upcite{DBLP:journals/corr/abs-2002-06823}。原因可能在于预训练模型和编码器虽然都是对句子进行表示，但是由于目标任务不一致，二者的参数状态还是存在区别的。因此，也有一些做法将预训练模型和翻译模型在结构上进行融合，将预训练句子模型作为一个独立的模块来为编码器或者解码器提供句子级表示信息\upcite{DBLP:journals/corr/abs-2002-06823}。

\vspace{0.5em}
\item {\small\sffamily\bfnew{序列到序列预训练}}

\parinterval 传统的预训练模型都是针对自然语言理解任务设计的，比如情感分类和命名实体识别等任务，其目的是获得更好的句子表示结果，并用于下游任务。而在机器翻译和文本摘要等序列到序列的语言生成任务中，不仅包含源语言表示学习的问题，还有序列到序列的映射，以及目标端序列生成的问题，这些知识是无法通过（源语言）单语数据学习到的。为了能够在序列到序列任务上更好地使用单语数据，可以同时使用编码器和解码器的结构完成对单语数据的预训练。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-mass}
\caption{MASS 预训练方法}
\label{fig:16-8-xc}
\end{figure}
%-------------------------------------------

\parinterval 以MASS方法为例\upcite{song2019mass}，可以直接对整个编码器-解码器的结构进行预训练。训练中采用掩码的方式，将源语词序列中的片段替换成特殊词<mask>，然后在解码器端预测这个未知片段，如图\ref{fig:16-8-xc}所示，\#号表示特殊词<mask>。这种做法可以使得编码器端捕捉上下文信息，同时迫使解码器依赖于编码器，学习编码器和解码器之间的注意力进行预训练。同时。解码器端片段的预测也使得解码器能够学习到向前依赖的上下文表示。

\vspace{0.5em}
\end{itemize}

（扩展阅读）
\parinterval  此外，还有很多工作对如何将语言模型应用到神经机器翻译模型中进行了研究。研究人员分析了预训练词嵌入何时为何在神经机器翻译模型中有效[When and Why are Pre-trained Word Embeddings Useful for NMT]；如何在神经机器翻译模型中利用预训练的BERT模型[On the use of BERT for Neural Machine Translation][Recycling a Pre-trained BERT Encoder for Neural Machine Translation][Towards Making the Most of BERT in Neural Machine Translation][Acquiring Knowledge from Pre-trained Model to Neural Machine Translation]；如何针对神经机器翻译任务进行预训练[Multilingual Denoising Pre-training for Neural Machine Translation][Cross-Lingual Pre-Training Based Transfer for Zero-Shot Neural Machine Translation][ BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension]；针对机器翻译中的Code-switching问题进行预训练[Code-switching pre-training for neural machine translation]；如何在微调过程中避免遗忘原始的语言模型任务[Unsupervised Pretraining for Neural Machine Translation Using Elastic Weight Consolidation]。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. 联合训练}

\parinterval {\small\sffamily\bfnew{多任务学习}}\index{多任务学习}（Multitask Learning）\index{Multitask Learning}是机器学习的一个子领域，是指同时学习多个独立但是相关的任务\upcite{DBLP:journals/corr/Ruder17a}。多任务学习通过模型共享的方式，对多个模型进行学习，而这些模型都对应不同的任务，这样不同模型可以互相``促进''。在神经机器翻译中，为了使用单语数据，可以将翻译任务作为主任务，同时设置一些仅使用单语数据的子任务，通过这些子任务来捕捉单语数据中的语言知识\upcite{DBLP:conf/emnlp/DomhanH17}。

\parinterval 语言模型是使用目标端单语数据最直接的方式，但是翻译模型作为一个受限的语言模型，还需要依赖于源语，并不能直接进行多任务学习。针对这个问题，对原有翻译模型结构进行了修改，在解码器中增加了一个语言模型子层，将这个子层用于语言模型任务（图\ref{fig:16-9-xc}）。在训练过程中，分别将双语数据和单语数据送入翻译模型和语言模型进行计算，得到的损失相加用于整体模型参数的梯度计算和参数更新，这里语言模型的参数是翻译模型的一部分。

{\red 参考一下上面的参考文献，图重画，不太准确}

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-target-side-multi-task-learning}
\caption{机器翻译中的单任务学习和多任务学习}
\label{fig:16-9-xc}
\end{figure}
%-------------------------------------------

\parinterval 除了多任务学习，还有一些方法将前向模型和反向模型一起训练，在训练过程中同时使用源语言端和目标语言端的单语数据来提升模型性能，在下一节中进行详细介绍。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{翻译建模}

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

{\red 下面这部分是从以前的内容中拷贝过来的，对偶学习和无监督部分的关联比较大，可以把对偶学习拆出去变成新的一小节？把Semi-Supervised Learning for Neural Machine Translation和Mirror-Generative Neural Machine Translation加进来？}

\subsubsection{1. 双向训练}

\parinterval 到目前为止，神经机器翻译系统都是每次一次只训练一个方向的模型。比如，给定中英的双语数据，一次只训练一个中到英或者英到中的翻译系统。既然两个方向的系统都使用同样的双语数据进行训练，那么是否可以一次训练同时得到两个方向的翻译系统呢？

\parinterval 回顾神经机器翻译系统的建模过程，给定一个互译的句对$(\mathbi{s},\mathbi{t})$，一个从源语言句子$\mathbi{s}$到目标语言句子$\mathbi{t}$的翻译被表示为求条件概率$\funp{P}(\mathbi{t}|\mathbi{s})$的问题。类似地，一个从目标语言句子$\mathbi{t}$到源语言句子$\mathbi{s}$的翻译可以表示为$\funp{P}(\mathbi{s}|\mathbi{t})$。通常来说，神经机器翻译的训练一次只得到一个方向的模型，也就是$\funp{P}(\mathbi{t}|\mathbi{s})$或者$\funp{P}(\mathbi{s}|\mathbi{t})$。这意味着$\funp{P}(\mathbi{t}|\mathbi{s})$和$\funp{P}(\mathbi{s}|\mathbi{t})$之间是互相独立的。$\funp{P}(\mathbi{t}|\mathbi{s})$和$\funp{P}(\mathbi{s}|\mathbi{t})$是否真的没有关系呢？比如，$\mathbi{s}$和$\mathbi{t}$是相同大小的向量，且$\mathbi{s}$到$\mathbi{t}$的变换是一个线性变换，也就是与一个方阵$\mathbi{W}$做矩阵乘法：

\begin{eqnarray}
\mathbi{t} = \mathbi{s} \cdot \mathbi{W}
\label{eq:16-6-xc}
\end{eqnarray}

\parinterval 这里可以把$\mathbi{s}$和$\mathbi{t}$都看作分布式的向量表示；$\mathbi{W}$应当是一个满秩矩阵，否则对于任意一个$\mathbi{s}$经过$\mathbi{W}$变换得到的$\mathbi{t}$只落在所有可能的$\mathbi{t}$的一个子空间内，即在给定$\mathbi{W}$的情况下有些$\mathbi{t}$不能被任何一个$\mathbi{s}$表达，而这不符合常识，因为不管是什么句子，我们总能找到它的一种译文。若$\mathbi{W}$是满秩矩阵说明$\mathbi{W}$可逆，也就是给定$\mathbi{s}$到$\mathbi{t}$的变换$\mathbi{W}$下，$\mathbi{t}$到$\mathbi{s}$的变换必然是$\mathbi{W}$的逆而不是其他矩阵。这个例子说明$\funp{P}(\mathbi{t}|\mathbi{s})$和$\funp{P}(\mathbi{s}|\mathbi{t})$直觉上应当存在联系。当然，$\mathbi{s}$和$\mathbi{t}$之间是否存在简单的线性变换关系并没有结论，但是上面的例子给出了一种对源语言句子和目标语言句子进行相互转化的思路。实际上，研究人员已经通过一些数学技巧用目标函数来把$\funp{P}(\mathbi{t}|\mathbi{s})$和$\funp{P}(\mathbi{s}|\mathbi{t})$联系起来，这样训练神经机器翻译系统一次就可以同时得到两个方向的翻译模型，使得训练变得更加高效\upcite{Hassan2018AchievingHP}。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 有监督对偶学习}

\parinterval 除了用条件概率$\funp{P}(\mathbi{t}|\mathbi{s})$建模翻译问题，还可以使用联合分布$\funp{P}(\mathbi{s},\mathbi{t})$进行建模\upcite{DBLP:conf/icml/XiaQCBYL17}。根据条件概率的定义，有：
\begin{eqnarray}
\funp{P}(\mathbi{s},\mathbi{t}) &=& \funp{P}(\mathbi{s})\funp{P}(\mathbi{t}|\mathbi{s}) \nonumber \\
&=& \funp{P}(t)\funp{P}(\mathbi{s}|\mathbi{t})
\label{eq:16-7-xc}
\end{eqnarray}

\parinterval 公式\ref{eq:16-7-xc}很自然地把两个方向的翻译模型$\funp{P}(\mathbi{t}|\mathbi{s})$和$\funp{P}(\mathbi{s}|\mathbi{t})$以及两个语言模型$\funp{P}(\mathbi{s})$和$\funp{P}(\mathbi{t})$联系起来：$\funp{P}(\mathbi{s})\funp{P}(\mathbi{t}|\mathbi{s})$应该与$\funp{P}(\mathbi{t})\funp{P}(\mathbi{s}|\mathbi{t})$接近，因为它们都表达了同一个联合分布$\funp{P}(\mathbi{s},\mathbi{t})$。因此，在构建训练两个方向的翻译模型的目标函数时，除了它们单独训练时各自使用的极大似然估计目标函数，可以额外增加一个目标项来鼓励两个方向的翻译模型去满足公式\ref{eq:16-8-xc}：
\begin{eqnarray}
\mathcal{L} = (\textrm{log P}(\mathbi{s}) + \textrm{log P}(\mathbi{t}|\mathbi{s}) - \textrm{log P}(\mathbi{t}) - \textrm{log P}(\mathbi{s}|\mathbi{t}))^{2}
\label{eq:16-8-xc}
\end{eqnarray}

\parinterval 这里$\funp{P}(\mathbi{s})$和$\funp{P}(\mathbi{t})$这两个语言模型是预先训练好的，并不参与翻译模型的训练。可以看到，对于单独的一个模型来说，其目标函数增加了与另外一个方向的模型相关的项。这样的形式与L1/L2正则化非常类似（见\ref{subsection-7.3.1}节），因此可以把这个方法看作是一种任务特定的正则化的手段（由翻译任务本身的性质所启发而来）。由于两个方向的翻译模型和语言模型相互影响，这种方法能得到比基于单个方向训练效果更好的模型。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. 无监督对偶学习}

\parinterval 在有监督对偶学习对联合分布$\funp{P}(\mathbi{s},\mathbi{t})$建模的基础上，如果把$\mathbf  t$看作一个隐变量，那么可以得到边缘分布$\funp{P}(\mathbi{s})$，也就是关于$\mathbi{s}$的语言模型：

\begin{eqnarray}
\funp{P}(\mathbi{s}) &=& \sum_{\mathbi{t}}\funp{P}(\mathbi{s},\mathbi{t}) \nonumber \\
&=& \sum_{\mathbi{t}}\funp{P}(\mathbi{s}|\mathbi{t})\funp{P}(\mathbi{t}|\mathbi{s})
\label{eq:16-9-xc}
\end{eqnarray}

\noindent  公式\ref{eq:16-9-xc}假设$\funp{P}(\mathbi{s}|\mathbi{t})=\funp{P}(\mathbi{s}|\mathbi{s},\mathbi{t})$。这个假设显然是成立的，因为当知道一个句子的译文时，并不需要知道它的源文就可以把它翻译回去。如果直接优化（最大化）公式\ref{eq:16-9-xc}右侧，相当于对这个等式$\funp{P}(\mathbi{s}|\mathbi{t})$和$\funp{P}(\mathbi{t}|\mathbi{s})$施加了{\small\sffamily\bfnew{循环一致性}}\index{循环一致性}（Circle Consistency）\index{Circle Consistency}的约束\upcite{DBLP:conf/iccv/ZhuPIE17}，也就是对于一个句子$\mathbi{s}$，通过$\funp{P}(\mathbi{t}|\mathbi{s})$把它翻译成$\mathbi{t}$后，根据$\funp{P}(\mathbi{s}|\mathbi{t})$应该能重新翻译出$\mathbi{s}$，如图\ref{fig:16-7-xc}所示。公式\ref{fig:16-7-xc}给出了同时优化$\funp{P}(\mathbi{s}|\mathbi{t})$和$\funp{P}(\mathbi{t}|\mathbi{s})$的一个目标函数形式。这个目标函数的一个额外的好处是它本质上是在学习一个由$\funp{P}(\mathbi{s}|\mathbi{t})$和$\funp{P}(\mathbi{t}|\mathbi{s})$组成的语言模型$\funp{P}(\mathbi{s})$，而$\funp{P}(\mathbi{s})$的学习依赖于单语数据，这意味着这个目标函数可以很自然地直接使用大量单语数据来同时训练两个翻译模型。相同的结论可以推广到$\funp{P}(\mathbi{t})$上\upcite{DBLP:conf/nips/HeXQWYLM16}。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-cycle-consistency}
\caption{循环一致性}
\label{fig:16-10-xc}
\end{figure}
%----------------------------------------------

\parinterval 但是直接使用公式\ref{eq:16-9-xc}作为目标函数需要解决两个问题：

\begin{itemize}
\vspace{0.5em}
\item 计算公式\ref{eq:16-9-xc}要枚举所有可能的隐变量$\mathbi{t}$的取值，也就是所有可能产生的目标语句子，而这是不可能的，因此一般会通过平均多个随机产生的$\mathbi{t}$对应的损失来近似真正的目标函数值；
\vspace{0.5em}
\item 从公式\ref{eq:16-9-xc}可以看到，在$\funp{P}(\mathbi{s})$上计算完目标函数值后，得到的梯度首先传递给$\funp{P}(\mathbi{s}|\mathbi{t})$，然后通过$\funp{P}(\mathbi{s}|\mathbi{t})$传递给$\funp{P}(\mathbi{t}|\mathbi{s})$。由于$\funp{P}(\mathbi{s}|\mathbi{t})$的输入$\mathbi{t}$由$\funp{P}(\mathbi{t}|\mathbi{s})$采样得到，而采样操作不可导，导致梯度的传播在$\funp{P}(\mathbi{t}|\mathbi{s})$的输出处断开了，因此$\funp{P}(\mathbi{t}|\mathbi{s})$接收不到任何梯度来进行更新。常见的解决方案是使用策略梯度\upcite{DBLP:conf/nips/SuttonMSM99}。它把$\funp{P}(\mathbi{t}|\mathbi{s})$采样得到的$\mathbi{t}$当成$\funp{P}(\mathbi{t}|\mathbi{s})$的目标来学习，并使用$\textrm{log P}(\mathbi{s}|\mathbi{t})$对$\funp{P}(\mathbi{t}|\mathbi{s})$的损失进行加权。但是由于仅使用少量样本来近似真正的目标函数，得到的策略梯度方差非常大，系统无法稳定学习，特别是训练的初期，因此通常会需要先使用双语数据预训练两个方向的翻译模型，然后把公式\ref{eq:16-9-xc}作为正常训练的一个正则化项使用。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{4. 翻译中回译}

\parinterval 重新回顾公式\ref{eq:16-9-xc}对应的目标函数，无监督对偶学习跟回译（假设现在只在一个句对$(\mathbi{s},\mathbi{t})$上做回译）之间有着很深的内在联系：给定一个句子$\mathbi{s}$，无监督对偶学习和回译都首先用$\funp{P}(\mathbi{t}|\mathbi{s})$把$\mathbi{s}$翻译成$\mathbi{t}$，然后无监督对偶学习最大化$\funp{P}(\mathbi{s}|\mathbi{t})\funp{P}(\mathbi{t}|\mathbi{s})$，而回译则是最大化$\funp{P}(\mathbi{s}|\mathbi{t})$。可以看到，当无监督对偶学习假设$\funp{P}(\mathbi{t}|\mathbi{s})$是一个完美的翻译模型的时候，它与回译是等价的。此外，在共享两个方向的模型参数$\theta$的情况下，可以看到无监督对偶学习的梯度为$\frac{\partial \funp{P}(\mathbi{s})}{\partial \theta} =\funp{P}(\mathbi{t}|\mathbi{s}) \frac{\partial \funp{P}(\mathbi{s}|\mathbi{t})}{\partial \theta}+\funp{P}(\mathbi{s}|\mathbi{t}) \frac{\partial \funp{P}(\mathbi{t}|\mathbi{s})}{\partial \theta} $，而回译的梯度为$\frac{\partial \funp{P}(\mathbi{s}|\mathbi{t})}{\partial \theta}$。从这个角度出发，无监督对偶学习与回译都在优化语言模型$\funp{P}(\mathbi{s})$这个目标函数，只不过回译使用对$\theta$有偏的梯度估计。

\parinterval 这个事实说明对回译进行适当的增广后应该能取得与无监督对偶学习相似的结果。{\small\sffamily\bfnew{ 翻译中回译}}\index{翻译中回译}（On-the-fly Back-translation）\index{On-the-fly Back-translation}就是这样一个例子。一般回译的过程是先把数据集里所有$\mathbi{s}$都翻译出来，然后只训练$\funp{P}(\mathbi{s}|\mathbi{t})$。区别于回译，从数据集中采集到一个$\mathbi{s}$之后，翻译中回译立刻把$\mathbi{s}$翻译成$\mathbi{t}$，然后训练$\funp{P}(\mathbi{s}|\mathbi{t})$，并且在下一步迭代中采集一个$\mathbi{t}$然后训练$\funp{P}(\mathbi{t}|\mathbi{s})$，这样交替更新$\funp{P}(\mathbi{s}|\mathbi{t})$和$\funp{P}(\mathbi{t}|\mathbi{s})$。尽管翻译中回译无法像无监督对偶学习那样在一个样本里通过梯度把$\funp{P}(\mathbi{s}|\mathbi{t})$的信息传到$\funp{P}(\mathbi{t}|\mathbi{s})$，但是它交替更新$\funp{P}(\mathbi{s}|\mathbi{t})$和$\funp{P}(\mathbi{t}|\mathbi{s})$的策略允许$\funp{P}(\mathbi{s}|\mathbi{t})$在两个样本间通过其产生的输出$\mathbi{s}$来把信息传递到$\funp{P}(\mathbi{t}|\mathbi{s})$，因此也能获得相近的效果，并且在实现和计算上都非常高效。翻译中回译已经在无监督神经机器翻译系统训练中被广泛使用\upcite{lample2019cross}。


\subsubsection{三角结构训练}

{\red [Triangular Architecture for Rare Language Translation]也不是利用单语数据，而是类似于枢轴语，在这里加是否合适？}


%----------------------------------------------------------------------------------------
% NEW SECTION
%----------------------------------------------------------------------------------------

\section{领域自适应}

\parinterval 在自然语言中，同一个词在不同的上下文中经常会有不同的含义，我们一般称之为一词多义问题。
这种现象在不同的领域中表现更加明显，如图1所示。


【体育】The rugby tour was a disaster both on and off the pitch.

这次橄榄球巡回赛在场上、场下都彻底失败。

【化学】The timbers of similar houses were painted with pitch.

类似房屋所用的栋木刷了沥青。

【声学】A basic sense of rhythm and pitch is essential in a music teacher.

基本的韵律感和音高感是音乐教师的必备素质。

图 不同领域中一词多义实例


\parinterval 不同领域间不仅存在一词多义问题，常用词汇也存在着很大的区别。比如在口语领域，常用词一般较为简单，而医学领域的单词结构组成一般较为复杂。
目前的机器翻译模型主要面向通用领域翻译，如新闻、口语等。
对于富资源语种，一般可以获取到充分的通用领域双语句对，从而训练得到高质量的神经机器翻译模型。
然而，由于训练数据中主要集中在通用领域，特定领域的语料库通常比较稀缺或根本不存在，因此模型在一些特定领域上的表现并不佳，如化学、天文学、医学等。
同时，人们对特定领域的机器翻译系统的需求也是十分庞大的。在类似专利翻译这种面向特定领域进行翻译的场景，通用领域的机器翻译模型并不能达到人们期望的水平，因此训练特定领域的翻译模型是十分重要的。

\parinterval 
% 然而，特定领域的语料库通常比较稀缺或根本不存在，如果在特定领域上直接使用通用模型则性能较差。
因此，在特定领域的机器翻译模型实际使用中，对特定领域的适应性进行调整是重要的步骤之一，这种利用领域外数据和领域内数据来改进特定领域的翻译效果的方法被称作领域自适应（Domain Adaptation）。

%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{早期领域自适应方法}

\parinterval 在统计机器翻译的年代，特定领域的领域自适应问题就已经备受关注了，为了克服数据缺乏的问题，人们提出了许多领域自适应的方法。大多数SMT领域自适应方法可以分为两类：数据方法和模型方法。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 数据方法}

\parinterval 当有足够多的其他领域双语语料时，主要是通过对域外数据评分的方式选择数据，通过语言模型、卷积神经网络模型等方式进行选择。当域外数据较少时，主要通过造伪数据的方式进行句子生成。

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 模型方法}

\parinterval 在模型的训练过程中，对数据进行评分，在训练中通过规则或者统计来给每个实例进行权重评估，并进行加权训练。针对模型本身，训练与语料库对应的语言模型、翻译模型和重排序模型等各种模型，再将这些模型进行组合以实现最佳性能。

时至今日，领域自适应的方法已经非常丰富，近几年许多基于神经网络机器翻译的领域自适应方法被提出和评估[1]。
下面，我们从数据方法和模型方法对领域自适应的经典方法进行介绍。
数据方法侧重于模型中的数据部分，而不是用于领域自适应的专用模型，包括使用领域外双语数据和领域内单语数据，模型方法是用于领域自适应的神经网络机器翻译模型。

%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{利用领域外双语数据}

\parinterval 训练一个特定领域的机器翻译系统需要使用大量的数据，因为这些数据包含政治、体育、新闻、专利等不同的领域，直接使用混合数据的效果不佳，而特定领域的数据又比较稀缺，所以如何制定最佳的策略有效地利用其它领域的数据是十分重要的。在本节的叙述中，特定领域被称作目标域，其他领域被称作源域。

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 多领域数据}

\parinterval 把多个领域的数据一起送入模型，可以让模型增加基础性能，从而增强在各个领域的效果。
目前比较常用的方法是在数据中加入标签来控制神经网络机器翻译模型对领域的辨别，如图2所示，主要有两个关键点：在各个领域的语料前加上<2领域>的标签来指定语料的归属领域，让神经网络模型可以更好的对不同领域生成句子；此外，把数据量较小的领域复制数倍，对各个领域的数据量进行平衡防止模型对各个领域产生不平等的关注[2]。这一类方法在16.2.3中有详细介绍。

图2

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 数据选择}

\parinterval 数据选择方法不需要数据有领域标签，可以使用未知领域的混合数据。直接把所有的数据拿来训练模型，虽然最大程度的利用了所有资源，但却不可避免地将一些十分不相关的数据引入了模型造成了干扰，一个自然的想法就是选择出这些数据中跟目标域较为相似的数据来增强目标域的性能。
数据选择是通过使用困惑度[3]或领域相似度[4]等方法从域外数据中找到一些与域内数据较为相似的数据以增加数据量，提升模型能力。
根据句子的词嵌入来找到源域中与目标域最相似的句子，计算源域句子向量中心CFin和目标域句子向量中心CFout与每个训练数据句子嵌入向量vf的欧氏距离差作为相似度，

式1

以相似度排序后选择部分句子用于模型训练[5]，除了静态地保持选择好的数据一成不变，还可以在每个不同的训练轮次动态地改变所选择的训练数据子集用于神经网络机器翻译模型训练，如图3所示，先将完整的数据送入模型，再根据相似度逐次减少每轮的数据量，剩下最相似的数据在最后一轮送入，以最后得到在目标域上效果最好的领域自适应模型[6]。
还可以利用课程学习的思想，根据相似度打分，将最相似的句子最先送入模型，让模型能最先学到跟目标域最相关的知识，奠定良好的基础[7]。

图3

多领域数据的优点在于大大提高了数据量，但在实际使用中可能会与使用通用模型一样带来词汇预测错误的问题，而数据选择无需划分领域，在混合数据中进行选择，但增加的数据量较小，对低资源改善不大。使用域外双语数据的优点在于充分地利用了全部能利用的双语数据，低资源问题得到了一定程度的缓解，模型学到了更多的语言学知识。但不光引入了一些领域不相关的知识，而且可能域外双语数据本身也寥寥无几，在经过数据选择之后就变得更加不足了，对模型的帮助可能并不足够令人满意。

%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{利用领域内单语数据}

\parinterval 机器翻译需要使用大量的双语平行数据来训练，而通常双语数据是较少的，但单语数据是大量存在的，如果可以有效地利用领域内的单语数据无疑可以增强机器翻译性能。
例如在中英专利翻译任务中，中英新闻平行语料库有100万个句对，而口语领域平行语料库只有20万个句对，口语领域单语语料库却有几百万个句子，因此可以用包含几百万句子的口语单语语料库来提升口语领域的翻译质量。

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 直接使用单语数据}

\parinterval 机器翻译任务中，单语数据相对比较充足，所以可以利用单语数据来提升模型性能。
即使是把目标端单语复制成平行语料当作双语直接训练神经网络机器翻译模型，这种简单的方法也能使BLEU增加超过一个点[8],可见单语数据在资源比较稀缺的时候是很有帮助的。
除了简单地使用单语作为语料训练模型，比较常用的方法是使用单语数据训练语言模型，如图4所示，使用单语数据训练一个RNN语言模型，并修改推断器RNN，以在语言模型层输出上操作，把语言模型融合进神经网络机器翻译推断器增强翻译性能[9]。

图4

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 使用单语数据造伪数据}

\parinterval 机器翻译任务中，标注的数据较少，而未标注的单语数据较多，并且标注的成本通常很高，所以可以用单语数据来制作伪数据以增加数据量，源语和目标语单语数据用于制作伪数据均有效果[10-12]，使用目标域的数据来制作伪数据用于领域自适应尤为有效。将伪数据和真实数据混合，增加了数据量和数据多样性，也丰富了语言的表示，可以对模型的性能有一定程度的提升。
伪数据还可以用来作为人工噪声，可以把一句话的语序随机打乱来作为伪数据，两个领域的语序可能完全不同，错误的语序可能会带来更好的学习效果[13]。
如果数据稀缺程度达到没有双语数据，还可以从目标域中归纳出词汇表，然后对目标域的目标端单语数据使用回译法制作伪数据[14]，如图5所示。

图5

\parinterval 单语数据的使用大大地增加了领域内的数据量，并且保证了领域的分布不会改变，在16.1中对此类方法进行了详细的介绍。在WMT等机器翻译比赛中，对单语数据的有效利用是十分关键的一环，语言模型、伪数据等都是必不可少的制胜法宝。

%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{领域自适应模型方法}

\parinterval 在数据已经被以各种方式充分利用后，为了克服数据稀缺这一先天条件，无疑就要为领域自适应任务开发专门的神经网络模型来提升性能。以模型为中心的方法关注专门用于领域自适应的神经网络机器翻译模型，一个机器翻译模型首先需要初始化一个模型，然后根据数据进行训练，最后训练好的模型对新的句子进行推断，所以可以从训练方法，模型结构和推断方法三个角度进行领域自适应。

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 修改训练方法}

\parinterval 领域自适应的训练方法是指在模型的训练阶段改变获得训练目标的过程或是训练函数的方法，通过加权或者微调等方法更加充分的利用数据。
因为数据本身十分稀缺，所以如何更充分地利用数据是一个重要问题，最简单的方法是给数据进行加权，对源域样本进行加权采样，从而逼近目标域的分布，让模型有权重的学习样本的知识。然而因为神经网络并不是线性的，所以样本权重无法直接集成到神经网络中，可以从句子与语言模型的交叉熵学习权重，从而让模型根据权重进行样本加权训练[15]。

式2

如式2所示，计算训练集中每个句对（xi，yi）与源域语言模型和目标域语言模型的交叉熵的差作为权重，越大越好。
如果把加权从句子级别精确到词级别，对每个词进行权重评分，根据词的得分综合也可以进行加权训练[16]。

\parinterval 微调是领域自适应最常用的方法，是指整个要训练的网络不是从随机状态开始，而是从一个比较好的初始状态开始微调。
微调的常用方法是在资源丰富的源域语料库上对系统进行训练直至收敛，然后在资源贫乏的目标域语料库上对系统参数进行微调，这种方法经常配合预训练使用。
为了解决微调后在源域上性能下降的问题，比较常用的方法是进行混合微调，具体做法是先在源域数据上训练一个NMT模型，然后将目标域数据复制数倍于源域数据量相等并混合，使用混合数据对NMT模型进行微调。这种方法既降低了目标域数据量小导致的过拟合问题，又带来了更好的微调性能。
在混合微调外，还可以让源域和目标域进行多次循环知识蒸馏，如图6所示迭代地学习对方领域的知识，可以保证在源域和目标域上的翻译性能都逐步上升[17]，知识蒸馏方法在第13章第6节中有详细介绍。还可以使用前文13.2中提到的正则化方法来降低过拟合。

图6循环知识蒸馏

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 修改模型结构}

\parinterval 修改训练目标的方法是在训练过程中更充分的利用数据，而更改训练模型时的神经网络结构以进行领域自适应是一种更加直观的模型方法，包括模型融合和领域判别。

\parinterval 模型融合是指通过把不同的模型融合以获得更好的效果，例如可以如前文16.1.2中把循环神经网络语言模型和神经机器翻译集成为一个推断器，联合训练语言模型和翻译模型，让模型在推断时可以从语言模型中得到指导。

\parinterval 领域判别的经典做法是将不同领域的数据混合起来进行训练，在编码器的基础上加上前向反馈神经网络作为分类器，使用3.34中的分类器方法预测源语句子的领域，领域鉴别器和神经网络机器翻译模型可以联合优化模型性能[18]。也可以使用术语频率-逆文档频率方法预测输入句子的领域标签，并如图7所示，在嵌入层加上表示领域的嵌入，使模型可以判断输入数据的领域[19]。

图7

%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. 修改推断算法}

\parinterval 推断是指将输入序列转换成的向量再次转化为输出序列的过程，领域自适应的推断方法是指通过修改推断的过程获得更好的序列的方法，与其他模型方法互补，包括优化推断算法和集成推断。

\parinterval 推断算法本身也可以进行优化，通过更好的推断过程选择最佳的结果，比如可以使用一种基于堆栈的字格推断算法，在领域自适应中比常用方法有更好的效果[20]。
在推断的时候对每个新词的候选假设可以如式3计算分数，分别使用目标域的目标语语言模型和NMT的分数加权计算，选择分数最高的词作为结果[21]，还可以在此基础上加入源域的目标语语言模型的分数共同打分[22]。 

式3

\parinterval 集成推断是把不同的模型集成以获得更好的翻译效果，如图13所示。为了保证在源域的翻译能力不退化，可以把多个目标域模型进行微调后与源域模型进行集成以增强推断能力[23]。集成推断也可以结合加权思想，根据扩展贝叶斯插值方法，不依赖领域标签给模型集成推断加权来获得更佳的推断结果[24]。在14.5中对集成方法进行了详细介绍。

\parinterval 训练目标从从训练的步骤和手段角度出发，模型结构从神经网络本身的构造改动，推断方法从推断模型的角度修改，三者相辅相成地增加模型的领域适应性。






参考文献
 [1] Chu, Chenhui, and Rui Wang. "A Survey of Domain Adaptation for Neural Machine Translation.." abs/1806.00258 (2018): 1304-1319.
 [2] Chu C, Dabre R, Kurohashi S. An Empirical Com-parison of Domain Adaptation Methods for Neural Machine Translation[J]. ACL. 2017: 385-391.
 [3] Axelrod A, He X, Gao J. Domain Adaptation via Pseudo In-Domain Data Selection[Z]. Edinburgh(GB): 2011355-362.
 [4] Remus R. Domain Adaptation Using Domain Similarity- and Domain Complexity-Based Instance Selection for Cross-Domain Sentiment Analysis[J]. ICDM Workshops. 2012: 717-723.
 [5] Wang R, Finch M A, Utiyama M, et al. Sentence Embedding for Neural Machine Translation Domain Adaptation[J]. ACL. 2017: 560-566.
 [6] Wees V D M, Bisazza A, Monz C. Dynamic Data Selection for Neural Machine Translation[J]. empirical methods in natural language processing. 2017: 1411-1421.
 [7] Zhang X, Shapiro P, Kumar G, et al. Curriculum Learning for Domain Adaptation in Neural Machine Translation[J]. north american chapter of the association for computational linguistics. 2019.
 [8] Currey A, Barone V M A, Heafield K. Copied Monolingual Data Improves Low-Resource Neural Machine Translation[J]. WMT. 2017: 148-156.
 [9] Domhan T, Hieber F. Using Target-side Monolingual Data for Neural Machine Translation through Multi-task Learning[J]. EMNLP. 2017: 1501-1506.
[10] Zhang J, Zong C. Exploiting Source-side Monolingual Data in Neural Machine Translation[Z]. 2016.
[11] Sennrich R, Haddow B, Birch A. Improving Neural Machine Translation Models with Monolingual Data[J]. Computer ence. 2015.
[12] Park J, Song J, Yoon S. Building a Neural Machine Translation System Using Only Synthetic Parallel Data[J]. arXiv: Computation and Language. 2017.
[13] Kim Y, Gao Y, Ney H. Effective Cross-lingual Transfer of Neural Machine Translation Models without Shared Vocabularies[J]. Meeting of the Association for Computational Linguistics. 2019.
[14] Hu J, Xia M, Neubig G, et al. Domain Adaptation of Neural Machine Translation by Lexicon Induction[J]. ACL (1). 2019: 2989-3001.
[15] Wang R, Utiyama M, Liu L, et al. Instance Weighting for Neural Machine Translation Domain Adaptation[J]. EMNLP. 2017: 1483-1489.
[16] Yan S, Dahlmann L, Petrushkov P, et al. Word-based Domain Adaptation for Neural Machine Translation[J]. CoRR. 2019.
[17] Zeng J, Liu Y, Su J, et al. Iterative Dual Domain Adaptation for Neural Machine Translation[J]. EMNLP/IJCNLP (1). 2019: 845-855.
[18] Britz D, Le V Q, Pryzant R. Effective Domain Mixing for Neural Machine Translation[J]. WMT. 2017: 118-126.
[19] Kobus C, Crego M J, Senellart J. Domain Control for Neural Machine Translation[J]. recent advances in natural language processing. 2017.
[20] Khayrallah H, Kumar G, Duh K, et al. Neural Lattice Search for Domain Adaptation in Machine Translation[J]. IJCNLP. 2017: 20-25.
[21] Gulcehre C, Firat O, Xu K, et al. On Using Monolingual Corpora in Neural Machine Translation[J]. Computer Science. 2015.
[22] Dou Z, Wang X, Hu J, et al. Domain Differential Adaptation for Neural Machine Translation[J]. NGT@EMNLP-IJCNLP. 2019: 59-69.
[23] Freitag M, Al-Onaizan Y. Fast Domain Adaptation for Neural Machine Translation[J]. 2016.
[24] Saunders D, Stahlberg F, Gispert D A A, et al. Domain Adaptive Inference for Neural Machine Translation[J]. Meeting of the Association for Computational Linguistics. 2019.



