Commit e53c8158 by zengxin

16

parent 4f6bb1ef
......@@ -33,72 +33,71 @@
\section{数据的有效使用}
\parinterval 数据稀缺是低资源机器翻译所面临的主要问题。因此,充分使用既有数据是一种解决问题的思路。比如,在双语训练不充分的时候,可以考虑用转述等方式生成更多的双语训练数据({\color{red} 参考文献!})。也可以简单地对双语数据的部分单词用近义词进行替换,达到丰富双语数据的目的({\color{red} 参考文献!}
\parinterval 数据稀缺是低资源机器翻译所面临的主要问题。因此,充分使用既有数据是一种解决问题的思路。比如,在双语训练不充分的时候,可以简单地对双语数据的部分单词用近义词进行替换,达到丰富双语数据的目的\upcite{DBLP:conf/acl/FadaeeBM17a,DBLP:conf/emnlp/WangPDN18},也可以考虑用转述等方式生成更多的双语训练数据\upcite{DBLP:conf/emnlp/MartonCR09,DBLP:conf/eacl/LapataSM17}
\parinterval 另一种思路是使用单语数据,因此单语数据相比双语数据更容易获取。实际上,在统计机器翻译时代,使用单语数据训练语言模型是构建机器翻译系统的关键步骤。好的语言模型往往会带来性能的增益。而这个现象在神经机器翻译中似乎并不明显,因为在大多数神经机器翻译的范式中,并不要求使用大规模单语数据来帮助机器翻译系统。甚至,连语言模型都不会作为一个独立的模块。这一方面是由于神经机器翻译系统的解码端本身就起着语言模型的作用,另一方面是由于数据的增多使得翻译模型可以更好的捕捉目标语言的规律。但是,双语数据总是有限的。很多场景下,单语数据的规模会远大于双语数据。如果能够让这些单语数据发挥作用,显然是一种非常好的选择。针对以上问题,下面将从数据增强、基于语言模型的单语数据使用等方面展开讨论。
\parinterval 另一种思路是使用相比双语数据更容易获取的单语数据。实际上,在统计机器翻译时代,使用单语数据训练语言模型是构建机器翻译系统的关键步骤。好的语言模型往往会带来性能的增益。而这个现象在神经机器翻译中似乎并不明显,因为在大多数神经机器翻译的范式中,并不要求使用大规模单语数据来帮助机器翻译系统。甚至,连语言模型都不会作为一个独立的模块。这一方面是由于神经机器翻译系统的解码端本身就起着语言模型的作用,另一方面是由于数据的增多使得翻译模型可以更好的捕捉目标语言的规律。但是,双语数据总是有限的。很多场景下,单语数据的规模会远大于双语数据。如果能够让这些单语数据发挥作用,显然是一种非常好的选择。针对以上问题,下面将从数据增强、基于语言模型的单语数据使用等方面展开讨论。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{数据增强}
\parinterval {\small\bfnew{数据增强}}(Data Augmentation)是一种增加训练数据的方法,通常通过对既有数据进行修改或者生成新的伪数据等方式实现。有时候,数据增强也可以被看做是一种防止模型过拟合的手段\upcite{DBLP:journals/jbd/ShortenK19}。在机器翻译中,典型的数据增强方法包括回译、加噪等。
\parinterval {\small\bfnew{数据增强}}(Data Augmentation)是一种增加训练数据的方法,通常通过对既有数据进行修改或者生成新的伪数据等方式实现。有时候,数据增强也可以被看做是一种防止模型过拟合的手段\upcite{DBLP:journals/jbd/ShortenK19}。在机器翻译中,典型的数据增强方法包括回译、修改双语数据、双语数据挖掘等。
\subsubsection{1. 回译}
\parinterval {\small\bfnew{回译}}(Back Translation, BT)是目前机器翻译任务上最常用的一种数据增强方法({\color{red} 参考文献!有很多})。回译的主要思想是:利用目标语言$-$源语言模型(反向翻译模型)来生成伪双语句对,用于训练源语言$-$目标语言翻译模型(前向翻译模型)。假设我们的目标是训练一个英汉翻译模型。首先,使用双语数据训练汉英翻译模型,即反向翻译模型。然后通过该模型将额外的汉语单语句子翻译为英语句子,从而得到大量的生成英语- 真实汉语伪双语句对。然后,将回译得到的伪双语句对和真实双语句对混合,训练得到最终的英汉神经机器翻译模型。
\parinterval 回译方法是模型无关的,只需要训练一个反向翻译模型,就可以简单有效地利用单语数据来增加训练数据的数量,因此在工业界也得到了广泛采用({\color{red} 参考文献!可以引用google和fb的论文,是不是多语言或者无监督的方法里有})。图\ref{fig:16-1-xc} 给出了回译方法的一个简要流程。
\parinterval {\small\bfnew{回译}}(Back Translation, BT)是目前机器翻译任务上最常用的一种数据增强方法\upcite{Sennrich2016ImprovingNM,DBLP:conf/emnlp/EdunovOAG18,DBLP:conf/aclnmt/HoangKHC18}。回译的主要思想是:利用目标语言-源语言模型(反向翻译模型)来生成伪双语句对,用于训练源语言-目标语言翻译模型(正向翻译模型)。假设我们的目标是训练一个英汉翻译模型。首先,使用双语数据训练汉英翻译模型,即反向翻译模型。然后通过该模型将额外的汉语单语句子翻译为英语句子,从而得到大量的生成英语- 真实汉语伪双语句对。然后,将回译得到的伪双语句对和真实双语句对混合,训练得到最终的英汉神经机器翻译模型。
回译方法是模型无关的,只需要训练一个反向翻译模型,就可以简单有效地利用单语数据来增加训练数据的数量,因此在工业界也得到了广泛采用\upcite{Hassan2018AchievingHP,DBLP:conf/iclr/LampleCDR18,DBLP:conf/emnlp/LampleOCDR18}。图\ref{fig:16-1-xc} 给出了回译方法的一个简要流程。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-application-process-of-back-translation}
\caption{\red{回译方法的流程}}
\caption{\red{回译方法的流程(新)} {\color{blue} 图比以前清晰了,但是还是有些乱,可能你陷入到固有思维里了,可以找我再讨论下!}}
\label{fig:16-1-xc}
\end{figure}
%-------------------------------------------
\parinterval 通常认为,反向模型的性能越好,生成的源语言译文质量越高,从而伪数据的分布和真实数据的分布越接近。不过,在实践中发现,即使一些简单的策略也能带来性能的增长。比如,对于一些低资源翻译任务,通过将目标语句子复制到源语言端构造的伪数据都能为模型带来增益\upcite{DBLP:conf/wmt/CurreyBH17}。原因在于,即使构造的双语伪数据是不准确的,其目标语言端仍然是真实数据,因此保证了神经机器翻译模型生成结果的流畅度。相比这些简单的伪数据生成策略,利用目标语言单语数据进行回译可以获得更高质量的数据。一种可能的解释是,双语伪数据的源语言是模型生成的翻译结果,保留了两种语言之间的互译信息,相比真实数据又存在一定的噪声。神经机器翻译模型在伪双语句对上进行训练,可以学习到如何处理带有噪声的输入,提高了模型的鲁棒性。
\parinterval 围绕如何利用回译方法生成伪双语数据,研究人员们进行了详细的分析探讨。一般观点认为,反向模型的性能越好,生成的伪数据质量也就更高,对正向模型的性能提升也就越大\upcite{Sennrich2016ImprovingNM,DBLP:conf/aclnmt/HoangKHC18}。不过,在实践中发现,即使一些简单的策略也能带来性能的增长。比如,对于一些低资源翻译任务,通过将目标语句子复制到源语言端构造的伪数据都能为模型带来增益\upcite{DBLP:conf/wmt/CurreyBH17}。原因在于,即使构造的双语伪数据是不准确的,其目标语言端仍然是真实数据,可以使解码器训练地更加充分,因此保证了神经机器翻译模型生成结果的流畅度。但是,相比这些简单的伪数据生成策略,利用目标语言单语数据进行回译可以获得更高质量的数据\upcite{DBLP:conf/wmt/CurreyBH17}。一种可能的解释是,双语伪数据的源语言是模型生成的翻译结果,保留了两种语言之间的互译信息,相比真实数据又存在一定的噪声。神经机器翻译模型在伪双语句对上进行训练,可以学习到如何处理带有噪声的输入,提高了模型的健壮性。
\parinterval 围绕如何利用回译方法生成伪双语数据,研究人员们进行了详细的分析探讨。一般观点认为,反向模型的性能越好,生成的伪数据质量也就更高,对前向模型的性能提升也就越大({\color{red} 参考文献!})。回译方法面临的一个问题是:反向翻译模型的训练只依赖于有限的双语数据,生成的源语言端伪数据的质量难以保证。为此,可以采用{\small\sffamily\bfnew{迭代式回译}}\index{迭代式回译}(Iterative Back Translation)\index{Iterative Back Translation}的方法\upcite{DBLP:conf/aclnmt/HoangKHC18},同时利用源语言端和目标语言端的单语数据,不断通过回译的方式来提升前向和反向翻译模型的性能。图\ref{fig:16-2-xc}展示了迭代式回译的框架。首先,使用双语数据训练一个前向翻译模型,然后利用源语言单语数据通过回译的方式生成伪双语数据,来提升反向翻译模型的性能,最后由反向翻译模型和目标语言单语数据生成的伪双语数据来提升前向翻译模型的性能。可以看出,这个往复的过程是闭环的,因此可以一直重复进行,直到两个翻译模型的性能均不再提升。
\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{\red{迭代式回译方法的流程}}
\caption{\red{迭代式回译方法的流程,未修改} {\color{blue} 这个图的逻辑我觉得是ok的,主要是这些线和过程需要再清晰一下,再找我讨论下!}}
\label{fig:16-2-xc}
\end{figure}
%-------------------------------------------
\parinterval 然而,研究人员发现,对于低资源语种,由于缺乏双语数据,高质量的伪双语数据对于模型来说更有帮助。而在富资源语种中,对回译产生的源语言句子添加一些噪声,提高翻译结果的多样性,反而可以达到更好的效果,比较常用的方法是使用采样或$n$-best解码\upcite{DBLP:conf/emnlp/EdunovOAG18}{\color{red} 其它参考文献?})。
\parinterval 然而,研究人员发现,在低资源场景中,由于缺乏双语数据,高质量的伪双语数据对于模型来说更有帮助。而在富资源场景下,对回译产生的源语言句子添加一些噪声,提高翻译结果的多样性,反而可以达到更好的效果,比较常用的方法是使用采样、Top-$k$解码和加噪\upcite{DBLP:conf/emnlp/EdunovOAG18,DBLP:conf/aclnmt/ImamuraFS18,DBLP:conf/emnlp/WuWXQLL19}{\color{red} 许:这里应该是TopK,跟老师再确认一下,nbest一般指生成的翻译结果吧,topk指的是预测概率前k的词} {\color{blue} 你说的对,topk如果是k个词,没问题,不用nbest即可,但是这个地方需要解释一下啥是topk解码,或者在脚注里说明}
\parinterval 回译常用的解码方式为束搜索,在生成每个词的时候只考虑预测概率最高的词,因此生成的翻译结果质量更高,但导致的问题是翻译结果主要都是一些高频词,缺乏多样性,生成的伪数据也就很难去准确地覆盖真实的数据分布\upcite{DBLP:conf/icml/OttAGR18}。采样解码是指在解码过程中,对词表中所有的词按照预测概率进行随机采样,因此整个词表中的词都有可能被选中,从而使生成结果更具多样性,但翻译质量和流畅度也会明显下降。$n$-best解码是对束搜索和采样解码的一个折中方法。在解码过程中,$n$-best解码对词表中预测概率最高的前$n$个词进行随机采样,这样在保证翻译结果准确性的前提下,也提高了结果的多样性。由于采样和$n$-best解码只在生成的源语言句子中引入了多样性,因此也可以提高对包含低频词或噪声句子的训练次数
\parinterval 回译中常用的解码方式为束搜索,在生成每个词的时候只考虑预测概率最高的词,因此生成的翻译结果质量更高,但导致的问题是翻译结果主要集中在部分高频词上,生成的伪数据缺乏多样性,也就很难去准确地覆盖真实的数据分布\upcite{DBLP:conf/icml/OttAGR18}。采样解码是指在解码过程中,对词表中所有的词按照预测概率进行随机采样,因此整个词表中的词都有可能被选中,从而使生成结果更具多样性,但翻译质量和流畅度也会明显下降。Top-$k$解码是对束搜索和采样解码的一个折中方法。在解码过程中,Top-$k$解码对词表中预测概率最高的前$k$个词进行随机采样,这样在保证翻译结果准确性的前提下,也提高了结果的多样性。加噪方法对束搜索的解码结果加入一些噪声,如丢掉或掩码部分词、打乱句子顺序等。这些方法在生成的源语言句子中引入了噪声,不仅提高了对包含低频词或噪声句子的训练次数,同时也可以提高模型的鲁棒性和泛化能力\upcite{DBLP:conf/icml/VincentLBM08}
\parinterval 与回译方法类似,源语言的单语数据也可以通过一个双语数据训练的前向翻译模型获得对应的目标语译文,从而构造前向翻译的伪数据。与回译方法相反,这时的伪数据中源语言句子是真实的,而目标语言句子是生成的,构造的伪数据对译文的流畅性并没有太大帮助,其主要作用是丰富了训练数据中源语言的表示,提升翻译模型中编码器的性能。很多时候,利用前向翻译模型生成伪数据的方法带来的性能提升效果要弱于回译({\color{red} 参考文献!}
\parinterval 与回译方法类似,源语言的单语数据也可以通过一个双语数据训练的正向翻译模型获得对应的目标语译文,从而构造正向翻译的伪数据\upcite{DBLP:conf/emnlp/ZhangZ16}。与回译方法相反,这时的伪数据中源语言句子是真实的,而目标语言句子是生成的,构造的伪数据对译文的流畅性并没有太大帮助,其主要作用是提升了编码器的特征提取能力。然而,由于伪数据中生成的译文质量很难保证,因此利用正向翻译模型生成伪数据的方法带来的性能提升效果要弱于回译,甚至可能是有害的\upcite{DBLP:conf/emnlp/WuWXQLL19}
\subsubsection{2. 修改双语数据}
\parinterval 除利用回译方法生成伪数据外,另外一种数据增强技术是对原始双语数据上进行修改得到伪数据,常用的方法包括加噪、词替换等。
\parinterval 回译方法是利用单语数据来生成伪数据,另外一种数据增强技术是对原始双语数据进行修改来得到伪双语数据,常用的方法包括加噪、词替换和转述等。
\begin{itemize}
\vspace{0.5em}
\item {\small\sffamily\bfnew{加噪}}{\color{red} 用四级标题?}{\color{red} 这节缺少参考文献!}
\item {\small\sffamily\bfnew{加噪}}\label{add-noise}{\color{red}许: 用四级标题?}{\color{red} 四级标题感觉不是很合适,考虑是否把修改双语数据这节的内容精简一下,就不用标题了,每个方法分段去写} {\color{blue} 可以!!!}
\parinterval 加噪是指在保证句子整体语义的情况下,对原始的双语数据适当加入一些噪声,从而生成伪双语数据来增加训练数据量。常用的加噪方法主要有以下三种:
\parinterval 加噪是自然语言处理任务中广泛使用的一种方法\upcite{DBLP:conf/icml/VincentLBM08,DBLP:journals/ipm/FarhanTAJATT20,DBLP:conf/iclr/LampleCDR18,devlin2019bert}。比如,在广泛使用的降噪自编码器中({\color{blue} 降噪自编码是第一次出现不?如果是,需要加粗,并加英文和index。焱洋那部分就不用写了。}),在原始数据中加入噪声作为模型的输入,模型通过学习如何预测原始数据进行训练。而在神经机器翻译中,利用加噪方法进行数据增强的常用方法是,在保证句子整体语义的情况下,对原始的双语数据适当加入一些噪声,从而生成伪双语数据来增加训练数据的规模。常用的加噪方法主要有以下三种:
\begin{itemize}
\vspace{0.5em}
\item 丢掉单词:句子中的每个词均有$\funp{P}_{\rm{drop}}$的概率被丢弃。
\item 丢掉单词:句子中的每个词均有$\funp{P}_{\rm{Drop}}$的概率被丢弃。
\vspace{0.5em}
\item 屏蔽单词:句子中的每个词均有$\funp{P}_{\rm{mask}}$的概率被替换为一个额外的[mask]词。[mask]表示{\color{red} XXXXXX}
\item 掩码单词:句子中的每个词均有$\funp{P}_{\rm{Mask}}$的概率被替换为一个额外的[Mask]词。[Mask]的作用类似于占位符,可以理解为一个句子中的部分词被涂抹掉,无法得知该位置词的准确含义。
\vspace{0.5em}
\item 打乱顺序:将句子中距离较近的某些词的位置进行{\color{red} 随机?}交换,打乱句子中的单词顺序。
\item 打乱顺序:将句子中距离较近的某些词的位置进行随机交换,打乱句子中的单词顺序。
\vspace{0.5em}
\end{itemize}
\ref{fig:16-4-xc}展示了三种加噪方法的示例。这里,$\funp{P}_{\rm{drop}}$$\funp{P}_{\rm{mask}}$均设置为0.1,表示每个词有$10\%$的概率被丢弃或屏蔽。打乱顺序的操作略微复杂,一种实现方法是,通过一个数字来表示每个词在句子中的位置,如“我”是第一个词,“你”是第三个词,然后,在每个位置生成一个$1$$n$的随机数,$n$一般设置为3,然后将每个词的位置数和对应的随机数相加,即图中的$\mathbi{S}$。 对$\mathbi{S}$ 按照从小到大排序,根据排序后每个位置的索引从原始句子中选择对应的词,从而得到最终打乱顺序后的结果。比如,在排序后,$S_2$的值小于$S_1$,其余词则保持递增顺序,则将原始句子中的第零个词和第一个词的顺序进行交换,其他词保持不变。
\parinterval\ref{fig:16-4-xc}展示了三种加噪方法的示例。这里,$\funp{P}_{\rm{Drop}}$$\funp{P}_{\rm{Mask}}$均设置为0.1,表示每个词有$10\%$的概率被丢弃或掩码。打乱顺序的操作略微复杂,一种实现方法是,通过一个数字来表示每个词在句子中的位置,如“我”是第一个词,“你”是第三个词,然后,在每个位置生成一个$1$$n$的随机数,$n$一般设置为3,然后将每个词的位置数和对应的随机数相加,即图中的$\mathbi{S}${\color{blue} S为啥要加粗???}。 对$\mathbi{S}$ 按照从小到大排序,根据排序后每个位置的索引从原始句子中选择对应的词,从而得到最终打乱顺序后的结果。比如,在排序后,$S_2$的值小于$S_1$,其余词则保持递增顺序,则将原始句子中的第零个词和第一个词的顺序进行交换,其他词保持不变。
%----------------------------------------------
\begin{figure}[htp]
......@@ -109,41 +108,38 @@
\end{figure}
%-------------------------------------------
\parinterval 和回译方法相似,加噪方法一般仅在源语言句子上进行操作,既保证了目标语言句子的流畅度,又可以提高训练数据量,增加数据的多样性({\color{red} 参考文献!})。加噪方法也被用于训练降噪自编码器,在无监督机器翻译中也得到了广泛应用,详细方法可以参考\ref{unsupervised-NMT}节。
\parinterval 和回译方法相似,加噪方法一般仅在源语言句子上进行操作,既保证了目标语言句子的流畅度,又可以提高训练数据量,增加数据的多样性,也可以提高模型的鲁棒性和泛化能力\upcite{DBLP:conf/icml/VincentLBM08}。加噪作为一种简单有效的方法,实际的应用场景很多,比如:
\begin{itemize}
\vspace{0.5em}
\item 对单语数据加噪。通过一个端到端模型预测源语言句子的调序结果,该模型和神经机器翻译模型的编码器共享参数,从而增强编码器的特征提取能力\upcite{DBLP:conf/emnlp/ZhangZ16}
\vspace{0.5em}
\item 训练降噪自编码器。将加噪后的句子作为输入,原始句子作为输出,用来训练降噪自编码器,这一思想在无监督机器翻译中得到了广泛应用,详细方法可以参考\ref{unsupervised-NMT}节;
\vspace{0.5em}
\item 对伪数据进行加噪。比如在上文中提到的对伪数据加入噪声的方法中,通常也使用上述这三种加噪方法来提高伪数据的多样性;
\vspace{0.5em}
\end{itemize}
\vspace{0.5em}
\item {\small\sffamily\bfnew{词替换}}
\item {\small\sffamily\bfnew{词替换}}
\parinterval 将一个句子中的某个词替换为其他词,可能并不会影响句子的合理性和流畅度。比如,对于“我出去玩。”这句话,将“我”替换为“你”、“他”、“我们”或是将“玩”替换为“骑车”、“学习”、“吃饭”等,虽然改变了语义,但句子仍然是合理的。词替换方法即是将双语数据中的部分词替换为词表中的其他词,在保证句子的语义或语法正确性的前提下,增加了训练数据的多样性。
\parinterval 一种策略是对目标语中的稀有词进行替换\upcite{DBLP:conf/acl/FadaeeBM17a}{\color{red} 就一篇文章?})。词表中的稀有词由于出现次数较少,很容易导致训练不充分问题,从而无法准确预测稀有词。对于一个双语句对$(\mathbi{x}, \mathbi{y})$,其中$\mathbi{x} = (x_1, \dots, x_m)$$\mathbi{y} = (y_1, \dots, y_n)$。假定对源语言句子$\mathbi{x}$中的单词进行替换,那么在源语言句子的位置$i$,可以根据前面的文本和自左向右语言模型得到前向候选稀有词集合$\overrightarrow{C}$,如公式所示:
\begin{eqnarray}
\overrightarrow{C} = \{x_i^{'} \in V_R: {\rm{Top}}_K (\funp{P}_{\rm{l2r}}(x_i^{'} | x_{<i}))\}
\end{eqnarray}
\parinterval 一种策略是对目标语中的稀有词替换为语义相近的词\upcite{DBLP:conf/acl/FadaeeBM17a}。词表中的稀有词由于出现次数较少,很容易导致训练不充分问题,从而无法准确预测稀有词\upcite{DBLP:conf/acl/SennrichHB16a}。通过语言模型将源语言句子中的某个词替换为满足语法或语义条件的稀有词,然后根据词对齐工具找到替换词在目标语言句子中对应的位置,借助翻译词典等方法将目标语言句子中的对应位置的词替换为源语言句子中被替换词对应的翻译结果,从而生成得到伪双语数据。
这里,$V_R$表示稀有词词表,可以设定为训练数据中出现次数最少的部分词或出现次数小于一定阈值的部分词。$\funp{P}_{\rm{l2r}}(x_i^{'} | x_{<i})$表示自左向右语言模型预测$x_i^{'}$出现的概率。$\funp{{\rm{Top}}}_K(\cdot)$ 表示选择概率最高的前$K$个词({\color{red} 这个公式感觉有些问题,因为直接看,它是返回最大的$K$个概率,不是$K$个词})。如果这$K$个词在稀有词词表$V_R$ 中,则将其加入到前向候选稀有词集合中。同样,利用后面的文本和自右向左语言模型得到反向候选稀有词:
\parinterval 此外,通过在源语言或目标语言中随机选择某些词,将这些词替换为词表中随机的一个词,也可以得到伪双语数据\upcite{DBLP:conf/emnlp/WangPDN18};随机选择句子中的某个词,将这个词的词嵌入替换为其他词的词嵌入加权表示融合,权重可以通过语言模型来计算,相比离散的替换方式(替换为其他词等),这种丰富的分布式表示相比词嵌入可以包含更多的语义信息,同一个词在不同的上下文也会被替换为不同的上下文表示\upcite{DBLP:conf/acl/GaoZWXQCZL19}{\color{red} 许:可以再找几篇}
\begin{eqnarray}
\overleftarrow{C} = \{x_i^{'} \in V_R: {\rm{TopK}} (\funp{P}_{\rm{r2l}}(x_i^{'} | x_i^{i-1}))\}
\end{eqnarray}
\parinterval 然后,就可以选择同时出现在$\overrightarrow{C}$$\overleftarrow{C}$的单词:
\begin{eqnarray}
{C} = \{x_i | x_i^{'} \in \overrightarrow{C} \wedge x_i^{'} \in \overleftarrow{C}\}
\end{eqnarray}
\parinterval 前向和反向语言模型均可以使用海量的单语数据训练得到。通过这种方法,选取到的稀有词保证了替换后句子的句法合理性以及流畅度。最后,根据词对齐找到替换词在目标语言句子中对应的位置$j$,根据翻译词典等方法,就可以将目标语言句子中的$y_j$替换为$x_i^{'}$对应的翻译结果$y_j^{'}$,从而生成得到伪双语数据。
\vspace{0.5em}
\item {\small\sffamily\bfnew{转述}}{\color{red} 许:没有找到NMT上进行数据增强的强相关工作,如果内容较少就放在扩展阅读,找到其他内容的话再扩充}{\color{blue} 这部分可以,还是放到这儿吧,转述还是很重要的技术!}
{\color{red} 就介绍这一篇文章?可以再看一下我发给许晨的一篇文章,上面也有一些相关工作的整理。我们是对一个方向进行整理,对典型工作进行描述,适当的还应该有些扩展,可以看一下14章的写法。单词替换的方式有很多,我印象里也有几篇。即使不是在数据增强方面的,包括张家俊的论文都提过类似的内容。我们写东西的全面性也是非常必要的。也可以再看一下李垠桥写的内容,他那个风格介绍还是很全面的。现在不是翻译一篇论文。}
\parinterval 相比上述两种方法只是对句子做轻微的修改,{\small\bfnew{转述}}(Paraphrasing)\index{转述}\index{Paraphrasing}方法考虑到了自然语言表达的多样性,通过对原始句子进行改写,使用不同的句式来传达相同含义的信息\upcite{DBLP:journals/coling/BhagatH13,2010Generating}。比如对于“东北大学NLP实验室的室训是精益求精、百炼成钢。”这句话,可以使用其他的句式来表达同样的含义,“精益求精、百炼成钢是东北大学NLP实验室的室训”。转述在机器翻译任务上得到了广泛引用\upcite{DBLP:conf/wmt/GuoH19,DBLP:conf/acl/ZhouSW19,DBLP:conf/eacl/LapataSM17}。通过转述方法对原始的双语数据进行改写,训练数据可以覆盖更多的语言学现象,同时由于每个句子可以对应多个不同的翻译,可以避免模型过拟合,提高泛化能力。
\vspace{0.5em}
\end{itemize}
\subsubsection{3. 双语句对挖掘}
\parinterval 在双语平行语料缺乏的时候,从可比语料中挖掘可用的双语句对也是一种常用的方法({\color{red} 参考文献!})。可比语料是指源语言和目标语言虽然不是完全互译的文本,但是蕴含了丰富的双语对照知识,可以从中挖掘出可用的双语句对来训练。相比双语平行语料来说,可比语料相对容易获取,比如,多种语言报道的新闻事件、多种语言的维基百科词条;多种语言翻译的书籍等。如图\ref{fig:16-5-xc}中展示的维基百科词条所示。
\parinterval 在双语平行语料缺乏的时候,从可比语料中挖掘可用的双语句对也是一种有效的方法\upcite{finding2006adafre,yasuda2008method,2005Improving,DBLP:conf/naacl/SmithQT10,DBLP:conf/emnlp/WuZHGQLL19}。可比语料是指源语言和目标语言虽然不是完全互译的文本,但是蕴含了丰富的双语对照知识,可以从中挖掘出可用的双语句对来训练。相比双语平行语料来说,可比语料相对容易获取,比如,多种语言报道的新闻事件、多种语言的维基百科词条和多种语言翻译的书籍(如圣经等)等。如图\ref{fig:16-5-xc}中展示的维基百科词条所示。
%----------------------------------------------
\begin{figure}[htp]
......@@ -154,9 +150,11 @@
\end{figure}
%-------------------------------------------
\parinterval 可比语料大多存在于网页中,内容较为复杂,可能会存在较大比例的噪声,如HTML字符、乱码等。首先需要进行充分的数据清洗操作,得到干净的可比语料,然后从中抽取出可用的双语句对。传统的抽取方法一般通过统计模型或双语词典来得到,比如,通过计算两个不同语言句子之间的单词重叠数或BLEU值\upcite{finding2006adafre,method2008keiji},通过排序模型或二分类器判断一个目标语言句子和一个源语言句子互译的可能性\upcite{DBLP:journals/coling/MunteanuM05,DBLP:conf/naacl/SmithQT10}
\parinterval 可比语料大多存在于网页中,内容较为复杂,可能会存在较大比例的噪声干扰,如HTML字符、乱码等。首先需要对内容进行充分的数据清洗操作,得到干净的可比语料,然后从中抽取出可用的双语句对。传统的抽取方法一般通过统计模型或双语词典来得到,比如,通过计算两个不同语言句子之间的单词重叠数或BLEU值\upcite{finding2006adafre,method2008keiji};通过排序模型或二分类器判断一个目标语言句子和一个源语言句子互译的可能性\upcite{DBLP:journals/coling/MunteanuM05,DBLP:conf/naacl/SmithQT10}
\parinterval 另外一种比较有效的方法是根据两种语言中每个句子的表示向量来抽取\upcite{DBLP:conf/emnlp/WuZHGQLL19}。首先,对于两种语言的每个句子,分别使用词嵌入加权平均等方法计算得到句子的表示向量,然后计算每个源语言句子和目标语言句子之间的余弦相似度,相似度大于一定阈值的句对则认为是可用的双语句对\upcite{DBLP:conf/emnlp/WuZHGQLL19}。然而,不同语言单独训练得到的词嵌入可能多对应不同的表示空间,因此得到的表示向量无法用于衡量两个句子的相似度\upcite{DBLP:journals/corr/MikolovLS13}。为了解决这个问题,一般使用在同一表示空间的跨语言词嵌入来表示两种语言的单词\upcite{DBLP:journals/jair/RuderVS19}。在跨语言词嵌入中,不同语言相同意思的词对应的词嵌入具有较高的相似性,因此得到的句向量也就可以用于衡量两个句子是否表示相似的语义\upcite{DBLP:conf/icml/LeM14}。关于跨语言词嵌入的具体内容,可以参考\ref{unsupervised-dictionary-induction}节的内容。
\parinterval 另外一种比较有效的方法是根据两种语言中每个句子的表示向量来抽取。首先,对于两种语言的每个句子,分别使用词嵌入加权平均等方法计算得到句子的表示向量,然后计算每个源语言句子和目标语言句子之间的余弦相似度,相似度大于一定阈值的句对则认为是可用的双语句对\upcite{DBLP:conf/emnlp/WuZHGQLL19}。然而,不同语言单独训练得到的词嵌入可能多对应不同的表示空间,因此得到的句向量无法用于衡量两个句子的相似度。为了解决这个问题,一般使用在同一表示空间的跨语言词嵌入来表示两种语言的单词。在跨语言词嵌入中,不同语言相同意思的词对应的词嵌入具有较高的相似性,因此得到的句向量也就可以用于衡量两个句子是否表示相似的语义({\color{red} 参考文献!})。关于跨语言词嵌入的具体内容,可以参考\ref{unsupervised-dictionary-induction}节。
\parinterval 另外一种比较有效的方法是根据两种语言中每个句子的表示向量来抽取\upcite{DBLP:conf/emnlp/WuZHGQLL19}。首先,对于两种语言的每个句子,分别使用词嵌入加权平均等方法计算得到句子的表示向量,然后计算每个源语言句子和目标语言句子之间的余弦相似度,相似度大于一定阈值的句对则认为是可用的双语句对\upcite{DBLP:conf/emnlp/WuZHGQLL19}。然而,不同语言单独训练得到的词嵌入可能多对应不同的表示空间,因此得到的表示向量无法用于衡量两个句子的相似度\upcite{DBLP:journals/corr/MikolovLS13}。为了解决这个问题,一般使用在同一表示空间的跨语言词嵌入来表示两种语言的单词\upcite{DBLP:journals/jair/RuderVS19}。在跨语言词嵌入中,不同语言相同意思的词对应的词嵌入具有较高的相似性,因此得到的句向量也就可以用于衡量两个句子是否表示相似的语义\upcite{DBLP:conf/icml/LeM14}。关于跨语言词嵌入的具体内容,可以参考\ref{unsupervised-dictionary-induction}节。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -167,25 +165,24 @@
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\parinterval 除了构造双语平行数据,直接利用单语数据也是机器翻译中的常用方法。通常,单语数据会被用于语言模型的学习(见{\chaptertwo})。对于机器翻译系统,使用语言模型也是一件十分“自然”的事情。在目标语言端,语言模型可以帮助系统产生更加流畅的译文。在源语言端,语言模型也可以用于句子编码,进而更好地生成句子的表示结果。在传统方法中,语言模型更多的被使用在目标语端。不过,近些年来随着预训练技术的发展,语言模型也被使用在神经机器翻译的编码端。下面从语言模型在目标端的融合、预训练编码器、联合训练等方向介绍基于语言模型的单语数据使用方法。
\parinterval 除了构造双语数据进行数据增强,直接利用单语数据也是机器翻译中的常用方法。通常,单语数据会被用于语言模型的学习(见{\chaptertwo})。对于机器翻译系统,使用语言模型也是一件十分自然的事情。在目标语言端,语言模型可以帮助系统产生更加流畅的译文。在源语言端,语言模型也可以用于句子编码,进而更好地生成句子的表示结果。在传统方法中,语言模型更多的被使用在目标语端。不过,近些年来随着预训练技术的发展,语言模型也被使用在神经机器翻译的编码端。下面从语言模型在目标端的融合、预训练词嵌入、预训练编码器和多任务学习等方向介绍基于语言模型的单语数据使用方法。
\subsubsection{1. 语言模型融合({\color{red} 参考文献较少}}
\subsubsection{1. 语言模型在目标端的融合}{\color{red}许:这部分介绍有点详细,跟其他部分的风格有点不统一,是否需要重新组织一下?}{\color{blue} 我觉得可以稍微精简一下,特别是低下那个图,如果说不清楚就不用说了,不画就行。要不说的内容多,没有介绍清楚,反倒造成读者的误解!}
\parinterval 融合目标语言端的语言模型是一种最直接的使用单语数据的方法。实际上,神经机器翻译模型本身也具备了语言模型的作用,因为在解码器本质上也是一个语言模型,用于描述生成译文词串的规律。类似于语言模型,神经机器翻译模型可以自回归地生成翻译结果。对于一个双语句对$(\mathbi{x}, \mathbi{y})$,神经机器翻译模型根据源语言句子$\mathbi{x}$和前面生成的词来预测当前位置词的概率分布:
\parinterval 融合目标语言端的语言模型是一种最直接的使用单语数据的方法\upcite{2015OnGulcehre,DBLP:journals/csl/GulcehreFXCB17,DBLP:conf/wmt/StahlbergCS18}。实际上,神经机器翻译模型本身也具备了语言模型的作用,因为在解码器本质上也是一个语言模型,用于描述生成译文词串的规律。类似于语言模型,神经机器翻译模型可以自回归地生成翻译结果。对于一个双语句对$(\mathbi{x}, \mathbi{y})$,神经机器翻译模型根据源语言句子$\mathbi{x}$和前面生成的词来预测当前位置词的概率分布:
\begin{eqnarray}
\log{P(\mathbi{y} | \mathbi{x}; \theta)} = \sum_{t}{\log{P(y_t | \mathbi{x}, {\mathbi{y}}_{<t}; \theta)}}
\label{eq:16-1-xc}
\end{eqnarray}
\noindent 这里,$\theta$是神经机器翻译模型的参数,$y_{<t}$表示第$t$个词前面生成的词。语言模型可以与上述过程融合,具体分为浅融合和深融合两种方法\upcite{2015OnGulcehre},如图\ref{fig:16-6-xc}所示。
\noindent 这里,$\theta$是神经机器翻译模型的参数,$y_{<t}$表示第$t$个词前面生成的词。语言模型可以与上述解码过程融合,具体分为浅融合和深融合两种方法\upcite{2015OnGulcehre},如图\ref{fig:16-6-xc}所示。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/lm-fusion}
\caption{\red{语言模型的浅融合与深融合}}
\caption{\red{语言模型的浅融合与深融合,未修改} {\color{blue} 图可以考虑删除了,要不也增加阅读的负担!}}
\label{fig:16-6-xc}
\end{figure}
%-------------------------------------------
......@@ -198,9 +195,7 @@
\noindent 其中,$\theta_{TM}$$\theta_{LM}$分别表示翻译模型和语言模型的参数。$\beta$是一个超参数,表示语言模型预测概率在解码过程中的权重。
\parinterval 深融合是在解码过程中,动态地融合翻译模型和语言模型的隐藏层表示来计算预测概率。
浅融合在解码过程对每个词均采用相同的语言模型权重,而深融合可以根据解码不同的词,动态选择语言模型的权重。
比如,在汉语-英语翻译系统中,英语句子中的冠词可能在汉语句子中没有显式的单词对应,这种情况下,英语模型可以提供更多帮助,保证翻译结果更加符合英语的语言结构;而在翻译某些名词的时候,语言模型由于没有源语言句子的信息,反而会对解码过程产生干扰,因此权重越小越好。
\parinterval 深融合是在解码过程中,动态地融合翻译模型和语言模型的隐藏层表示来计算预测概率。浅融合在解码过程对每个词均采用相同的语言模型权重,而深融合可以根据解码不同的词,动态选择语言模型的权重。比如,在汉语-英语翻译系统中,英语句子中的冠词可能在汉语句子中没有显式的单词对应,这种情况下,英语语言模型可以提供更多帮助,保证翻译结果更加符合英语的语言结构;而在翻译某些名词的时候,语言模型由于没有源语言句子的信息,反而会对解码过程产生干扰,因此权重越小越好。
\parinterval 深融合的预测方式为:
\begin{eqnarray}
......@@ -222,105 +217,87 @@ g_{t} = \sigma (w^{T}s_{t}^{TM} + b)
\noindent 其中,$w$$b$是可学习的参数。$\sigma$是Sigmoid函数,将结果压缩到$(0, 1)$范围内。
\parinterval 大多数情况下,译文端语言模型的使用可以提高翻译结果的流畅度。不过,它并不会增加翻译结果对源语言句子表达的{\small\bfnew{充分性}}\index{充分性}(Adequacy\index{Adequacy}),即源语言句子的信息是否被充分提现到了译文中。也有一些研究发现,神经机器翻译过于关注译文的流畅度,但是充分性的问题没有很好的考虑,比如,神经机器翻译系统的结果中经常出现漏译等问题。也有一些研究者提出控制翻译充分性的方法,让译文在流畅度和充分性之间达到平衡({\color{red} 参考文献!Zhaopeng Tu组应该有工作,还有其它一些工作都可以引用})。
\parinterval 大多数情况下,译文端语言模型的使用可以提高翻译结果的流畅度。不过,它并不会增加翻译结果对源语言句子表达的{\small\bfnew{充分性}}\index{充分性}(Adequacy\index{Adequacy}),即源语言句子的信息是否被充分体现到了译文中。也有一些研究发现,神经机器翻译过于关注译文的流畅度,但是充分性的问题没有很好的考虑,比如,神经机器翻译系统的结果中经常出现漏译等问题。也有一些研究者提出控制翻译充分性的方法,让译文在流畅度和充分性之间达到平衡\upcite{DBLP:conf/acl/TuLLLL16,li-etal-2018-simple,DBLP:journals/tacl/TuLLLL17}
\parinterval 扩展阅读:语言模型除了应用在解码过程中来提高翻译结果的流畅度之外,另外一种常用的做法是用来对翻译结果进行重排序。翻译模型在解码过程中可以生成多个候选,可以利用语言模型、不同的翻译模型等分别对每个候选打分,选择分数最高的句子作为最终的翻译结果\upcite{DBLP:conf/wmt/WangCJYCLSWY17,ng2019facebook,DBLP:conf/wmt/WangLLJZLLXZ18,DBLP:conf/wmt/LiLXLLLWZXWFCLL19},这一方法在各种机器翻译评测任务中得到了广泛使用。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{2. 预训练{\color{red} 参考文献较少}}
\subsubsection{2. 预训练词嵌入}
{\red 预训练模型ELMo、GPT、BERT等在这里是否要详细介绍?}{\color{blue} 还是介绍一下,但是并不是深入讲,要不一些基础的概念大家可能不知道}
% \subsubsection{2. 预训练}
\parinterval 神经机器翻译模型所使用的编码器-解码器框架天然就包含了对输入(源语言)和输出(目标语言)进行表示学习的过程。在编码端,需要学习一种分布式表示来表示源语言句子的信息,这种分布式表示可以包含序列中每个位置的表示结果(见{\chapternine})。从结构上看,神经机器翻译所使用的编码器与神经语言模型无异,或者说神经机器翻译的编码器其实就是一个源语言的语言模型。唯一的区别在于,神经机器翻译的编码器并不直接输出源语言句子的生成概率,而传统语言模型是建立在序列生成任务上的。既然神经机器翻译的编码器可以与解码器一起在双语数据上联合训练,那为什么不使用更大规模的数据单独对编码器进行训练呢?或者说,直接使用一个预先训练好的编码器,与机器翻译的解码器配合完成翻译过程。
\parinterval 编码器-解码器框架天然就包含了对输入(源语言)和输出(目标语言)进行表示学习的过程。在编码端,需要学习一种分布式表示来表示源语言句子的信息,这种分布式表示可以包含序列中每个位置的表示结果(见{\chapternine})。从结构上看,神经机器翻译所使用的编码器与神经语言模型无异,或者说神经机器翻译的编码器其实就是一个源语言的语言模型。唯一的区别在于,神经机器翻译的编码器并不直接输出源语言句子的生成概率,而传统语言模型是建立在序列生成任务上的。既然神经机器翻译的编码器可以与解码器一起在双语数据上联合训练,那为什么不使用更大规模的数据单独对编码器进行训练呢?或者说,直接使用一个预先训练好的编码器,与机器翻译的解码器配合完成翻译过程
\parinterval 实现上述想法的一种手段是{\small\sffamily\bfnew{预训练}}\index{预训练}(Pre-training)\index{Pre-training,DBLP:conf/nips/DaiL15,DBLP:journals/corr/abs-1802-05365,radford2018improving,devlin2019bert}。预训练的做法相当于将表示模型的学习任务从目标任务中分离出来,这样可以利用额外的更大规模的数据进行学习。常用的一种方法是使用语言建模等方式在大规模单语数据上进行训练,来得到神经机器翻译模型中的一部分(比如词嵌入和编码器等)的模型参数,作为模型的初始值。然后,神经机器翻译模型在双语数据上进行{\small\sffamily\bfnew{微调}}\index{微调}(Fine-tuning)\index{Fine-tuning},以得到最终的翻译模型
\parinterval 实现上述想法的一种手段是{\small\sffamily\bfnew{预训练}}\index{预训练}(Pre-training)\index{Pre-training}{\color{red} 参考文献!})。常用的方法是将机器翻译模型中的一部分(比如,编码器)单独提抽取出来,之后用语言建模等方式在大规模单语数据上进行训练。得到优化后的参数后,将其重新放入神经机器翻译模型中,作为模型的初始值。最后,神经机器翻译模型在双语数据上进行{\small\sffamily\bfnew{微调}}\index{微调}(Fine-tuning)\index{Fine-tuning},以得到最终的翻译模型。图\ref{fig:16-7-xc}给出了机器翻译编码器预训练流程的示意图。
% \begin{itemize}
% \vspace{0.5em}
% \item {\small\sffamily\bfnew{词嵌入预训练}({\color{red} 四级标题,这部分我感觉用四级标题不太恰当,但是如果不分开写,又显得内容太多了})}
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-encoder-fin}
\caption{机器翻译编码器预训练流程({\color{red} 图要重新构思}}
\label{fig:16-7-xc}
\end{figure}
%-------------------------------------------
\parinterval 词嵌入可以被看作是对每个独立单词进行的表示学习,在自然语言处理的众多任务中都扮演着重要角色\upcite{DBLP:conf/icml/CollobertW08,2011Natural,DBLP:journals/corr/abs-1901-09069}。到目前为止已经有大量的词嵌入学习方法被提出(见{\chapternine}),因此可以直接应用这些方法在海量的单语数据上训练得到词嵌入,用来初始化神经机器翻译模型的词嵌入矩阵\upcite{DBLP:conf/aclwat/NeishiSTIYT17,2018When}
\parinterval 预训练的做法相当于将表示模型的学习任务从目标任务中分离出来了。这样,可以在更大规模的数据上学习一种更加通用的模型。此外,预训练的任务相比于机器翻译要更加“简单”,其学习过程相对“容易”。比如,最近非常流行的BERT就是一种基于Transformer结构的预训练模型,它可以给自然语言处理下游任务提供句子的表示结果({\color{red} 参考文献!})。对于机器翻译,预训练可以在单词、句子等多个层次上使用
\parinterval 需要注意的是,在神经机器翻译中使用预训练词嵌入有两种方法。一种方法是直接将词嵌入作为固定的输入,也就是在训练机器翻译模型的过程中,并不调整词嵌入的参数。这样做的目的是完全将词嵌入模块独立出来,机器翻译可以被看作是在固定的词嵌入输入上进行的建模,降低了机器翻译系统学习的难度。另一种方法是仍然遵循``预训练+微调''的策略,将词嵌入作为翻译模型的初始值。之后在机器翻译训练过程中,词嵌入模型结果会被进一步更新。近些年,在词嵌入预训练的基础上进行微调的方法受到研究者越来越多的青睐({\color{red} 许:看一下是否有对应的参考文献,暂时没找到,没有的话考虑重写一下这部分}{\color{blue} 没有就不用加了!})。因为在实践中发现,完全用单语数据学习的单词表示,与双语上的翻译任务并不完全匹配。目标语言的信息也会影响源语言的表示学习,在预训练词嵌入的基础上进一步进行微调是更加有效的方案
\begin{itemize}
\vspace{0.5em}
\item {\small\sffamily\bfnew{词嵌入预训练}{\color{red} 四级标题}}
\parinterval 虽然预训练词嵌入在海量的单语数据上学习到了丰富的表示,但词嵌入很主要的一个缺点是无法解决一词多义问题。在不同的上下文中,同一个单词经常表示不同的意思,但词嵌入是完全相同的。模型需要在编码过程中通过上下文去理解每个词在当前语境下的含义,从而增加了建模的复杂度。因此,上下文词向量在近些年得到了广泛的关注\upcite{DBLP:conf/acl/PetersABP17,mccann2017learned,DBLP:conf/naacl/PetersNIGCLZ18}。上下文词嵌入是指一个词的表示不仅依赖于单词自身,还要根据所在的上下文语境来得到。由于在不同的上下文中,每个词对应的词嵌入是不同的,因此无法简单地通过词嵌入矩阵来表示,通常的做法是使用海量的单语数据预训练语言模型任务,使模型具备丰富的特征提取能力\upcite{DBLP:conf/naacl/PetersNIGCLZ18,radford2018improving,devlin2019bert}。比如,ELMo(Embeddings from Language Models)通过BiLSTM模型预训练语言模型任务,通过线性融合不同层的表示来得到每个词的上下文词嵌入,在很多自然语言处理任务上均得到了最佳的性能\upcite{DBLP:conf/naacl/PetersNIGCLZ18}。({\color{red} 许:可以加个图,类似于ELMo里的}
{\red(词嵌入预训练和语言模型关系不大,是否要放在这儿?)}{\color{blue} 没问题,用预训练的word embedding的工作还是不少的}
\parinterval 虽然预训练词嵌入在海量的单语数据上学习到了丰富的表示,但词嵌入很主要的一个缺点是无法解决一词多义问题。在不同的上下文中,同一个单词经常表示不同的意思,但词嵌入是完全相同的。模型需要在编码过程中通过上下文去理解每个词在当前语境下的含义,从而增加了建模的复杂度。因此,上下文词向量在近些年得到了广泛的关注\upcite{DBLP:conf/acl/PetersABP17,mccann2017learned,DBLP:conf/naacl/PetersNIGCLZ18}。上下文词嵌入是指一个词的表示不仅依赖于单词自身,还要根据所在的上下文语境来得到。由于在不同的上下文中,每个词对应的词嵌入是不同的,因此无法简单地通过词嵌入矩阵来表示,通常的做法是使用海量的单语数据预训练语言模型任务,使模型具备丰富的特征提取能力\upcite{DBLP:conf/naacl/PetersNIGCLZ18,radford2018improving,devlin2019bert}。比如,{\small\bfnew{来自语言模型的嵌入}}(Embeddings from Language Models,ELMo)\index{ELMo}\index{来自语言模型的嵌入}通过BiLSTM模型预训练语言模型任务,通过线性融合不同层的表示来得到每个词的上下文词嵌入,在很多自然语言处理任务上均得到了最佳的性能\upcite{DBLP:conf/naacl/PetersNIGCLZ18}。({\color{red} 许:可以加个图,类似于ELMo里的}
\parinterval 词嵌入可以被看作是对每个独立单词进行的表示学习,在自然语言处理的众多任务中都扮演着重要角色\upcite{DBLP:journals/corr/abs-1901-09069}{\color{red} 参考文献!})。到目前为止已经有大量的词嵌入学习方法被提出(见{\chapternine}),因此可以直接应用这些方法在外部单语数据上训练得到词嵌入,并把它作为神经机器翻译系统的词嵌入输入。
\subsubsection{3. 预训练模型}
\parinterval 需要注意的是,在神经机器翻译中使用预训练的词嵌入有两种方法。一种方法是直接将词嵌入作为固定的输入,也就是在训练机器翻译模型的过程中,并不调整词嵌入的参数。这样做的目的是完全将词嵌入模块独立出来,机器翻译可以被看作是在固定的词嵌入输入上进行的建模,降低了机器翻译系统学习的难度。另一种方法是仍然遵循``预训练+微调''的策略,将词嵌入作为翻译模型的初始值。之后在机器翻译训练过程中,词嵌入模型结果会被进一步更新。近些年,在词嵌入预训练的基础上进行微调的方法受到研究者越来越多的青睐({\color{red} 参考文献!})。因为在实践中发现,完全用单语数据学习的单词表示,与双语上的翻译任务并不完全匹配。目标语言的信息也会影响源语言的表示学习。这时,在预训练词嵌入的基础上进一步进行微调是更加有效的方案。
\parinterval 相比固定的词嵌入,上下文词嵌入包含了在当前语境中的语义信息,丰富了模型的输入表示,降低了训练难度。但是,模型仍有大量的参数需要从零学习,来进一步提取整个句子的表示。那么,能不能在预训练阶段中直接得到预训练好的模型参数,在下游任务中仅仅通过任务特定的数据对模型参数进行微调,来得到一个较强的模型呢?{\small\bfnew{生成式预训练}}(Generative Pre-Training,GPT)\index{生成式预训练}\index{GPT}和来自Transformer的{\small\bfnew{双向编码器表示}}(Bidirectional Encoder Representations from Transformers,BERT)\index{双向编码器表示}\index{BERT}对这种方法进行了探索,并取得了令人振奋的实验结果。({\color{red} 许:来个两种模型结构的对比图}
\vspace{0.5em}
\item {\small\sffamily\bfnew{编码器预训练}}
\parinterval GPT\upcite{radford2018improving}通过Transformer模型自回归地训练单向语言模型,类似于神经机器翻译模型的解码器,相比ELMo中使用的BiLSTM模型,Tranformer架构的表示能力更强。在大规模单语数据上预训练得到的模型结构只需要进行简单的修改,然后通过任务特定的训练数据进行微调,就可以在很好的适配到下游任务中,在多个任务中均取得了当时最佳的结果。之后提出的BERT模型更是将预训练的作用提升到了新的水平\upcite{devlin2019bert}。GPT模型十分严重的一个缺陷在于模型只能进行单向编码,也就是前面的文本在建模时无法获取到后面的信息。BERT提出了一种自编码的方式,使模型在预训练阶段可以通过双向编码的方式进行建模,进一步增强了模型的表示能力。
\parinterval 编码器在神经机器翻译中的作用是对源语句子中的信息进行抽象和提取。通常这个过程会将离散的词序列编码成一组上下文相关的向量表示,即:序列的每个位置都会有一个向量。句子级预训练模型正是要学习这种序列的表示向量。从学习方式上看,预训练模型可以分为:自回归模型、自编吗模型 xxx {\color{red} 找一些综述看看,论文非常多,可以引用一些在这小节。然后进一步描述,稍微介绍一下基本概念和模型结构,还有训练方式}
\parinterval BERT的核心思想是通过{\small\bfnew{掩码语言模型}}(Masked Language model,MLM)\index{掩码语言模型}\index{MLM}任务进行预训练。掩码语言模型的思想类似于完形填空,随机选择输入句子中的部分词掩码,模型来预测这些被掩码的词。掩码的具体做法是将被选中的词替换为一个特殊的词[Mask],这样模型在训练过程中,无法得到掩码位置词的信息,需要联合上下文内容进行预测,因此提高了模型对上下文的特征提取能力。实验表明,相比在下游任务中仅利用上下文词嵌入,在大规模单语输数据上预训练的模型具有更强的表示能力。同时,对比单向预训练模型GPT,BERT这种双向编码的训练方式也展示出了更好的效果。
预训练的结果可以作为编码器的初始状态。然而在实践中发现,这种参数初始化的方法在一些富资源语种上提升效果并不明显,甚至反而有些下降\upcite{DBLP:journals/corr/abs-2002-06823}{\color{red} 参考文献!})。原因可能在于预训练模型和编码器虽然都是对句子进行表示,但是由于目标任务不一致,二者的参数状态还是存在区别的。因此,也有一些做法将预训练模型和翻译模型在结构上进行融合,将预训练句子模型作为一个独立的模块来为编码器或者解码器提供句子级表示信息\upcite{DBLP:journals/corr/abs-2002-06823}
\parinterval BERT的提出引发了人们对预训练方法的关注,从多个维度对预训练方法进行了更广泛和更深入的探讨。{\color{red} 许:这部分内容较多,但是和NMT不是强相关,我再整理一下加到扩展阅读,比如训练方式、压缩、微调、下游任务使用等} {\color{blue} 很好!!!}
\vspace{0.5em}
\item {\small\sffamily\bfnew{序列到序列预训练}}
\parinterval 在神经机器翻译任务中,预训练模型可以用于初始化编码器的模型参数\upcite{DBLP:conf/emnlp/ClinchantJN19,DBLP:conf/emnlp/ImamuraS19,DBLP:conf/naacl/EdunovBA19}。之所以用在编码器而不是解码器端,主要的原因在于编码器的作用主要在于特征提取,训练难度相对较高,而解码器的作用主要在于生成,和编码器提取到的表示是强依赖的,相对比较脆弱\upcite{DBLP:journals/corr/abs-1908-06259}。模型在预训练阶段的生成过程中并没有考虑到额外的表示信息,因此和神经机器翻译的编码器存在着明显的不一致问题,所以目前主流的做法是仅利用预训练模型对编码器的模型参数进行初始化。({\color{red} 许:再找一下参考文献支撑}
\parinterval 然而,在实践中发现,参数初始化的方法在一些富资源语种上提升效果并不明显,甚至反而有些下降\upcite{DBLP:journals/corr/abs-2002-06823}。原因可能在于,预训练模型可以带来显著提升的一个重要原因在于预训练阶段的训练数据规模是非常大的,因此在下游任务数据量较少的情况下帮助较大。而在一些富资源语种上,双语句对的数据量可以达到千万级别,因此简单通过预训练模型来初始化模型参数无法带来明显的提升。此外,预训练模型的训练目标并没有考虑到序列到序列的生成,与神经机器翻译的训练目标并不完全一致,两者训练得到的模型参数可能存在一些区别。
\parinterval 机器翻译是一种典型的语言生成任务,它不仅包含源语言表示学习的问题,还有序列到序列的映射,以及目标端序列生成的问题,这些知识是无法单独通过(源语言)单语数据学习到的。为了能够在序列到序列任务上更好地使用单语数据,另一种思路是用单语数据对编码器-解码器结构进行预训练({\color{red} 参考文献!})。相比对解码器结构进行单独预训练,对编码器-解码器的预训练更加贴合机器翻译的需要。
\parinterval 因此,一些做法将预训练模型和翻译模型进行融合,将预训练模型作为一个独立的模块来为编码器或者解码器提供句子级表示信息\upcite{DBLP:journals/corr/abs-2002-06823,DBLP:conf/aaai/YangW0Z00020}。另外一种做法是针对生成任务进行预训练。机器翻译是一种典型的语言生成任务,不仅包含源语言表示学习的问题,还有序列到序列的映射,以及目标端序列生成的问题,这些知识是无法单独通过(源语言)单语数据学习到的。因此,可以使用单语数据对编码器-解码器结构进行预训练\upcite{song2019mass,DBLP:conf/acl/LewisLGGMLSZ20,DBLP:conf/emnlp/QiYGLDCZ020}
\parinterval{\small\bfnew{掩码端到端预训练}}(MAsked Sequence to Sequence pre-training,MASS)\index{掩码端到端预训练}\index{MASS}方法为例\upcite{song2019mass},其思想与BERT十分相似,也是在预训练过程中采用掩码的方式,随机选择编码器输入句子中的连续片段替换为特殊词[Mask],然后在解码器端预测这个连续片段,如图\ref{fig:16-8-xc} 所示。这种做法可以使得编码器端捕捉上下文信息,同时迫使解码器依赖于编码器进行自回归地生成,从而学习到编码器和解码器之间的注意力。为了适配下游的机器翻译任务,使预训练模型可以学习到不同语言的表示,MASS对不同语言的句子采用共享词汇表和模型参数的方法,利用同一个预训练模型来进行不同语言句子的预训练。通过这种方式,模型既学到了对源语言句子的编码,也学习到了对目标语言句子的生成,之后通过双语句对对预训练模型的参数进行微调,模型可以快速收敛到较好的水平。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-mass}
\caption{MASS 预训练方法}
\caption{\red{MASS 预训练方法,重画}}
\label{fig:16-8-xc}
\end{figure}
%-------------------------------------------
\parinterval 这里以MASS方法为例\upcite{song2019mass}。其思想与BERT预训练有相似之处,训练中采用掩码的方式,将源语词序列中的片段随机替换成特殊词<mask>,然后在解码器端预测这个未知片段,如图\ref{fig:16-8-xc} 所示,\#号表示特殊词<mask>。这种做法可以使得编码器端捕捉上下文信息,同时迫使解码器依赖于编码器,学习编码器和解码器之间的注意力进行预训练。同时。解码器端片段的预测也使得解码器能够学习到向前依赖的上下文表示。这种设计的好处在于,使用一种语言的数据同时学习了编码和解码的能力。而且这种预训练的结果可以直接用于初始化机器翻译模型。
{\color{red} 没有其它的工作了?参考文献?}
\parinterval 此外,还有很多工作对如何将语言模型应用到神经机器翻译模型中进行了研究。研究人员分析了预训练词嵌入何时为何在神经机器翻译模型中有效\cite{2018When};如何在神经机器翻译模型中利用预训练的BERT模型\cite{DBLP:conf/emnlp/ClinchantJN19,DBLP:conf/emnlp/ImamuraS19,DBLP:conf/aaai/YangW0Z00020,DBLP:conf/aaai/WengYHCL20};如何针对神经机器翻译任务进行预训练\cite{DBLP:journals/corr/abs-2001-08210,DBLP:conf/aaai/JiZDZCL20,DBLP:conf/acl/LewisLGGMLSZ20};针对机器翻译中的Code-switching问题进行预训练\cite{DBLP:journals/corr/abs-2009-08088};如何在微调过程中避免遗忘原始的语言模型任务\cite{DBLP:journals/corr/abs-2010-09403}。({\color{red} 许:和NMT比较相关,放在正文,再全面一些}
\vspace{0.5em}
\end{itemize}
(扩展阅读){\color{red} 是否放在扩展阅读,还是分布在这节的各个部分?}
\parinterval 此外,还有很多工作对如何将语言模型应用到神经机器翻译模型中进行了研究。研究人员分析了预训练词嵌入何时为何在神经机器翻译模型中有效\upcite{2018When};如何在神经机器翻译模型中利用预训练的BERT模型\upcite{DBLP:conf/emnlp/ClinchantJN19,DBLP:conf/emnlp/ImamuraS19,DBLP:conf/aaai/YangW0Z00020,DBLP:conf/aaai/WengYHCL20};如何针对神经机器翻译任务进行预训练\upcite{DBLP:journals/corr/abs-2001-08210,DBLP:conf/aaai/JiZDZCL20,DBLP:conf/acl/LewisLGGMLSZ20};针对机器翻译中的Code-switching问题进行预训练\upcite{DBLP:journals/corr/abs-2009-08088};如何在微调过程中避免遗忘原始的语言模型任务\upcite{DBLP:journals/corr/abs-2010-09403}
% \vspace{0.5em}
% \end{itemize}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{3. 联合训练}
\subsubsection{4. 多任务学习}
\parinterval {\small\sffamily\bfnew{多任务学习}}\index{多任务学习}(Multitask Learning)\index{Multitask Learning}是机器学习的一个子领域,是指同时学习多个独立但是相关的任务\upcite{DBLP:journals/corr/Ruder17a}{\color{red} 多一些参考文献?})。多任务学习通过模型共享的方式,对多个模型进行学习,而这些模型都对应不同的任务,这样不同模型可以互相``促进''。在神经机器翻译中,为了使用单语数据,可以将翻译任务作为主任务,同时设置一些仅使用单语数据的子任务,通过这些子任务来捕捉单语数据中的语言知识\upcite{DBLP:conf/emnlp/DomhanH17}{\color{red} 多一些参考文献?})。
\parinterval 在训练一个神经网络的时候,往往会给定模型一个训练目标,希望模型通过不断训练在这个目标上表现地越来越好。我们希望模型在训练过程中可以自动提取到与训练目标相关的所有信息。然而,过分地关注单个训练目标,可能使模型忽略掉其他可能有帮助的信息,这些信息可能来自于一些其他相关的任务\upcite{DBLP:journals/corr/Ruder17a}。通过联合多个独立但相关的任务共同学习,任务之间相互``促进'',就是{\small\sffamily\bfnew{多任务学习}}\index{多任务学习}(Multitask Learning)\index{Multitask Learning}方法\upcite{DBLP:journals/corr/Ruder17a,DBLP:books/sp/98/Caruana98,liu2019multi}。多任务学习的常用做法是针对多个相关的任务,共享模型的部分参数来学习不同任务之间相似的特征,并通过特定的模块来学习每个任务独立的特征。常用的策略是对底层的模型参数进行共享,顶层的模型参数用于独立学习各个不同的任务,如图所示。({\color{red} 许:加个图我感觉会合适一点,大致表达的意思是底层共享,上层接不同的任务} {\color{blue} 张裕浩也写了多任务,可以考虑直接引用15章,图张裕浩那里也画了!})
\parinterval 语言模型是使用目标端单语数据最直接的方式,但是翻译模型作为一个受限的语言模型,还需要依赖于源语言,并不能直接进行多任务学习。针对这个问题,对原有翻译模型结构进行了修改,在解码器中增加了一个语言模型子层,将这个子层用于语言模型任务(图\ref{fig:16-9-xc})。在训练过程中,分别将双语数据和单语数据送入翻译模型和语言模型进行计算,得到的损失相加用于整体模型参数的梯度计算和参数更新,这里语言模型的参数是翻译模型的一部分。
\parinterval 在神经机器翻译中,应用多任务学习的主要策略是将翻译任务作为主任务,同时设置一些仅使用单语数据的子任务,通过这些子任务来捕捉单语数据中的语言知识\upcite{DBLP:conf/emnlp/DomhanH17,DBLP:conf/emnlp/ZhangZ16,DBLP:journals/corr/LuongLSVK15}。一种多任务学习的方法是利用源语言单语数据,通过单个编码器对源语言数据进行建模,然后分别使用两个解码器来学习源语言排序和翻译任务。源语言排序任务是指对句子的顺序进行调整,可以通过单语数据来构造训练数据,从而使编码器训练地更加充分\upcite{DBLP:conf/emnlp/ZhangZ16},如图所示。({\color{red}许: 加个图,单编码器,双解码器})
\parinterval 虽然神经翻译模型可以看作一个受限的语言模型,但生成过程中需要依赖于源语言信息,因此无法直接利用目标语单语数据进行多任务学习。针对这个问题,可以对原有翻译模型结构进行修改,在解码器底层增加一个语言模型子层,这个子层用于学习语言模型任务,与编码器端是完全独立的,如图\ref{fig:16-9-xc}所示\upcite{DBLP:conf/emnlp/DomhanH17}。在训练过程中,可以分别将双语数据和单语数据送入翻译模型和语言模型进行计算,双语数据训练产生的梯度用于对整个模型进行参数更新,而单语数据产生的梯度只对语言模型子层进行参数更新。通过这种方式,可以有效利用单语数据使解码器端的底层网络训练地更加充分,从而提取到更有效的特征来生成翻译结果。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-target-side-multi-task-learning}
\caption{\red{机器翻译中的单任务学习和多任务学习}}
\caption{\red{机器翻译中的多任务学习,重画}}
\label{fig:16-9-xc}
\end{figure}
%-------------------------------------------
\parinterval 除了多任务学习,还有一些方法将前向模型和反向模型一起训练,在训练过程中同时使用源语言端和目标语言端的单语数据来提升模型性能,在{\color{red} XXX}节中进行详细介绍。
{\color{red}
要说就全面一些,比如:
Multi-task learning for multiple language translation
Multi-task sequence to sequence learning
Exploiting source-side monolingual data in neural machine translation
在Neural Machine Translation: A Review and Survey中搜索一下关键词,还有别的survey
}
\parinterval 此外,还有一些工作对多任务学习进行了探讨。比如利用多任务学习来训练多到一模型(多个编码器,单个解码器)、一到多模型(单个编码器、多个解码器)和多到多模型(多个编码器、多个解码器),从而借助单语数据或其他数据来使编码器或解码器训练地更加充分\upcite{DBLP:journals/corr/LuongLSVK15},任务的形式包括翻译任务、成分句法分析任务、图像标注等。另外一种策略是利用多任务学习的思想同时训练多个语言的翻译任务\upcite{DBLP:conf/acl/DongWHYW15,DBLP:journals/tacl/JohnsonSLKWCTVW17},同样包括多到一翻译(多个语种到一个语种)、一到多翻译(一个语种到多个语种)以及多到多翻译(多个语种到多个语种),这种方法可以利用多种语言的训练数据进行学习,具有较大的潜力,逐渐受到了研究人员们的关注,具体内容可以参考\ref{multilingual-translation-model}一节。
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -433,7 +410,7 @@ Joint training for neural machine translation models with monolingual data
%----------------------------------------------------------------------------------------
% NEW SECTION
%----------------------------------------------------------------------------------------
\section{多语言翻译模型}
\section{多语言翻译模型}\label{multilingual-translation-model}
\parinterval 低资源机器翻译面临的主要挑战是缺乏大规模高质量的双语数据。这个问题往往伴随着多语言的翻译任务\upcite{dabre2019brief}\upcite{dabre2020survey}。也就是,要同时开发多个不同语言之间的机器翻译系统,其中少部分语言是富资源语言,而其它语言是低资源语言。针对低资源语种双语数据稀少或者缺失的情况,一种常见的思路是利用富资源语种的数据或者系统帮助低资源机器翻译系统。这也构成了多语言翻译的思想,并延伸出大量的研究工作。有三个典型研究方向:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论