Commit 208e4099 by 曹润柘

update chapter16

parent c89aad4c
\begin{tikzpicture}
\begin{scope}
\node [anchor=center] (node1) at (4.9,1) {\small{训练:}};
\node [anchor=center] (node11) at (5.5,1) {};
\node [anchor=center] (node12) at (6.7,1) {};
\node [anchor=center] (node2) at (4.9,0.5) {\small{推理:}};
\node [anchor=center] (node21) at (5.5,0.5) {};
\node [anchor=center] (node22) at (6.7,0.5) {};
\node [anchor=west,line width=0.6pt,draw=black,minimum width=5.6em,minimum height=2.2em,fill=blue!20,rounded corners=2pt] (node1-1) at (0,0) {\footnotesize{双语数据}};
\node [anchor=south,line width=0.6pt,draw=black,minimum width=4.5em,minimum height=2.2em,fill=blue!20,rounded corners=2pt] (node1-2) at ([yshift=-5em]node1-1.south) {\footnotesize{目标语伪数据}};
\node [anchor=west,line width=0.6pt,draw=black,minimum width=4.5em,minimum height=2.2em,fill=red!20,rounded corners=2pt] (node2-1) at ([xshift=-8.8em,yshift=-2.5em]node1-1.west) {\footnotesize{反向NMT系统}};
\node [anchor=west,line width=0.6pt,draw=black,minimum width=4.5em,minimum height=2.2em,fill=red!20,rounded corners=2pt] (node3-1) at ([xshift=3em,yshift=-2.5em]node1-1.east) {\footnotesize{前向NMT系统}};
\draw [->,line width=1pt](node1-1.west)--([xshift=3em]node2-1.north);
\draw [->,line width=1pt](node1-1.east)--([xshift=-3em]node3-1.north);
\draw [->,line width=1pt](node1-2.east)--([xshift=-3em]node3-1.south);
\draw [->,line width=1pt](node11.east)--(node12.west);
\draw [->,line width=1pt,dashed](node21.east)--(node22.west);
\draw [->,line width=1pt,dashed]([xshift=3em]node2-1.south)--(node1-2.west);
\end{scope}
\end{tikzpicture}
\ No newline at end of file
......@@ -162,7 +162,7 @@
}
\end{pgfonlayer}
%%%%%%%%%%%%%%%%%%%底框2
\node [anchor=center] (pos4-212) at ([xshift=-4.5em,yshift=-6em]dictionarylabel4) {};
\node [anchor=center] (pos4-212) at ([xshift=-4.5em,yshift=-10.2em]dictionarylabel4) {};
\node [anchor=center] (pos4-222) at ([yshift=-2.5em]pos4-212) {};
\node [anchor=center] (pos4-232) at ([xshift=9.5em]pos4-212) {};
\node [anchor=center] (pos4-242) at ([yshift=-2.5em]pos4-232) {};
......@@ -173,7 +173,7 @@
}
\end{pgfonlayer}
%%%%%%%%%%%%%%%%%%%底框3
\node [anchor=center] (pos4-313) at ([xshift=-4.5em,yshift=-10.2em]dictionarylabel4) {};
\node [anchor=center] (pos4-313) at ([xshift=-4.5em,yshift=-6em]dictionarylabel4) {};
\node [anchor=center] (pos4-323) at ([yshift=-2.5em]pos4-313) {};
\node [anchor=center] (pos4-333) at ([xshift=9.5em]pos4-313) {};
\node [anchor=center] (pos4-343) at ([yshift=-2.5em]pos4-333) {};
......@@ -308,10 +308,10 @@
\draw [->,thick]([xshift=5.4859em,yshift=0.3em]entry5.east) -- ([xshift=12em,yshift=0.3em]entry5.east) -- ([yshift=-0.57em]cy3-14.south);
\draw[-,thick] ([xshift=0.0em]cy3-17.east) ..controls+(east:1.2em) and + (west:1.2em)..([xshift=-0.19em]pos4-11.west);\draw[-,thick] ([xshift=0.0em]cy3-17.east) ..controls+(east:1.2em) and + (west:1.2em)..([yshift=-2.3em,xshift=-0.19em]pos4-313.west);
\draw[-,thick] ([xshift=0.0em]cy3-17.east) ..controls+(east:1.2em) and + (west:1.2em)..([xshift=-0.19em]pos4-11.west);\draw[-,thick] ([xshift=0.0em]cy3-17.east) ..controls+(east:1.2em) and + (west:1.2em)..([yshift=-2.3em,xshift=-0.19em]pos4-212.west);
\draw [->,thick]([xshift=-1.291em]entry5-5.west) -- ([xshift=0.02em]entry5-5.west);
\draw [-,thick]([xshift=0.415em]pos4-13.east)--([xshift=0.9em]pos4-13.east)--([xshift=0.9em]pos4-343.east)--([xshift=0.415em]pos4-343.east);
\draw [-,thick]([xshift=0.415em]pos4-13.east)--([xshift=0.9em]pos4-13.east)--([xshift=0.9em]pos4-242.east)--([xshift=0.415em]pos4-242.east);
\end{tikzpicture}
......
\begin{tikzpicture}
\node [rectangle,inner sep=2pt,font=\scriptsize] (center) at (0,0) {};
\node [rectangle,inner sep=2pt,font=\scriptsize] (top) at ([yshift=3em,xshift=0em]center.north) {
\begin{tabular}{c}
翻译模型 \\
$\textrm{P}(\mathbf t|\mathbf s)$
\end{tabular}
};
\node [rectangle,inner sep=2pt,font=\scriptsize] (left) at ([yshift=0em,xshift=-4em]center.west) {
\begin{tabular}{c}
今天天气真好。
\end{tabular}
};
\node [rectangle,inner sep=2pt,font=\scriptsize] (right) at ([yshift=0em,xshift=4em]center.east) {
\begin{tabular}{c}
The weather is \\so good today.
\end{tabular}
};
\node [rectangle,inner sep=2pt,font=\scriptsize] (down) at ([yshift=-3em,xshift=0em]center.south) {
\begin{tabular}{c}
翻译模型 \\
$\textrm{P}(\mathbf s|\mathbf t)$
\end{tabular}
};
\draw [->,line width=0.8pt] (left.north) .. controls +(north:0.5) and +(west:0.5) .. (top.west);
\draw [->,line width=0.8pt] (top.east) .. controls +(east:0.5) and +(north:0.5) .. (right.north);
\draw [->,line width=0.8pt] (down.west) .. controls +(west:0.5) and +(south:0.5) .. (left.south);
\draw [->,line width=0.8pt] (right.south) .. controls +(south:0.5) and +(east:0.5) .. (down.east) ;
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\begin{scope}
\tikzstyle{word} = [font=\scriptsize]
\tikzstyle{model} = [rectangle,draw,minimum height=2.5em,minimum width=5em,rounded corners=4pt,fill=blue!15!white,line width=0.7pt]
\node [model,minimum width=10.5em] (encoder0) at (0,0) {Encoder};
\node [word] (w1) at ([yshift=-2em,xshift=1em]encoder0.south) {\#};
\node [word] (w2) at ([xshift=-1em]w1.west) {\#};
\node [word] (w3) at ([xshift=-1em]w2.west) {\small{$x_2$}};
\node [word] (w4) at ([xshift=-1em]w3.west) {\small{$x_1$}};
\node [word] (w5) at ([xshift=1em]w1.east) {\#};
\node [word] (w6) at ([xshift=1em]w5.east) {\small{$x_6$}};
\node [word] (w7) at ([yshift=2em,xshift=1.0em]encoder0.north) {\small{$x_4$}};
\node [word] (w8) at ([yshift=5.95em]w2.north) {\small{$x_3$}};
\node [word] (w9) at ([yshift=5.95em]w5.north) {\small{$x_5$}};
\draw [->,line width=1pt] (w1.north) -- ([yshift=1.35em]w1.north);
\draw [->,line width=1pt] (w2.north) -- ([yshift=1.35em]w2.north);
\draw [->,line width=1pt] (w3.north) -- ([yshift=1.35em]w3.north);
\draw [->,line width=1pt] (w4.north) -- ([yshift=1.35em]w4.north);
\draw [->,line width=1pt] (w5.north) -- ([yshift=1.35em]w5.north);
\draw [->,line width=1pt] (w6.north) -- ([yshift=1.35em]w6.north);
\draw [->,line width=1pt] ([yshift=-1.4em]w7.south) -- (w7.south);
\draw [->,line width=1pt] ([yshift=-1.4em]w8.south) -- (w8.south);
\draw [->,line width=1pt] ([yshift=-1.4em]w9.south) -- (w9.south);
\node [model] (encoder1) at ([xshift=8em]encoder0.east) {Encoder};
\node [model,fill=red!15!white] (decoder) at ([xshift=5em]encoder1.east) {Decoder};
\node [] (sinput) at ([yshift=-3em]encoder1.south) {\footnotesize{源语输入}};
\node [] (tinput) at ([yshift=-3em]decoder.south) {\footnotesize{目标语输入}};
\node [] (output) at ([yshift=3em]decoder.north) {\footnotesize{目标语输出}};
\draw [->,line width=1pt] (sinput) -- (encoder1);
\draw [->,line width=1pt] (tinput) -- (decoder);
\draw [->,line width=1pt] (decoder) -- (output);
\coordinate (do0) at ([yshift=1em]encoder1.north);
\coordinate (do1) at ([xshift=3.5em]do0.east);
\coordinate (do2) at ([yshift=-2.3em]do1.south);
\draw [-,line width=1pt] (encoder1.north) -- (do0);
\draw [-,line width=1pt] (do0) -- (do1);
\draw [-,line width=1pt] (do1) -- (do2);
\draw [->,line width=1pt] (do2) -- (decoder.west);
\begin{pgfonlayer}{background}
\node [rectangle,inner sep=1em,fill=black!5,rounded corners=4pt] [fit =(w4) (w6) (w9) (encoder0) ] (box) {};
\end{pgfonlayer}
\node [font=\footnotesize] (left) at ([yshift=-1.5em]box.south) {编码器使用单语数据预训练};
\node [font=\footnotesize] (right) at ([xshift=11em]left.east) {在翻译任务上进行微调};
\node[anchor=north] (arrow1) at (3.85,0.1){};
\draw[fill=yellow!20,draw=yellow]([yshift=-0.3em]arrow1.north)--([xshift=-1em,yshift=0.5em]arrow1.north west)--([xshift=-1em,yshift=0.1em]arrow1.north west)--([xshift=-2.6em,yshift=0.1em]arrow1.north west)--([xshift=-2.6em,yshift=-0.1em]arrow1.south west)--([xshift=-1em,yshift=-0.1em]arrow1.south west)--([xshift=-1em,yshift=-0.5em]arrow1.south west)--([yshift=-0.3em]arrow1.north);
\end{scope}
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\begin{scope}
\node [anchor=center] (node1) at (9.6,1) {\small{训练:}};
\node [anchor=center] (node11) at (10.2,1) {};
\node [anchor=center] (node12) at (11.4,1) {};
\node [anchor=center] (node2) at (9.6,0.5) {\small{推理:}};
\node [anchor=center] (node21) at (10.2,0.5) {};
\node [anchor=center] (node22) at (11.4,0.5) {};
\node [anchor=west,draw=black,line width=0.6pt,minimum width=5.6em,minimum height=2.2em,fill=blue!20,rounded corners=2pt] (node1-1) at (0,0) {\footnotesize{双语数据}};
\node [anchor=south,draw=black,line width=0.6pt,minimum width=4.5em,minimum height=2.2em,fill=blue!20,rounded corners=2pt] (node1-2) at ([yshift=-5em]node1-1.south) {\footnotesize{目标语伪数据}};
\node [anchor=west,draw=black,line width=0.6pt,minimum width=4.5em,minimum height=2.2em,fill=red!20,rounded corners=2pt] (node2-1) at ([xshift=-7.7em,yshift=-2.5em]node1-1.west) {\footnotesize{前向NMT系统}};
\node [anchor=west,draw=black,line width=0.6pt,minimum width=4.5em,minimum height=2.2em,fill=red!20,rounded corners=2pt] (node3-1) at ([xshift=1.5em,yshift=-2.5em]node1-1.east) {\footnotesize{反向NMT系统}};
\node [anchor=east,draw=black,line width=0.6pt,minimum width=5.6em,minimum height=2.2em,fill=blue!20,rounded corners=2pt] (node4-1) at ([xshift=18em]node1-1) {\footnotesize{双语数据}};
\node [anchor=south,draw=black,line width=0.6pt,minimum width=4.5em,minimum height=2.2em,fill=blue!20,rounded corners=2pt] (node4-2) at ([yshift=-5em]node4-1.south) {\footnotesize{目标语伪数据}};
\node [anchor=east,draw=black,line width=0.6pt,minimum width=4.5em,minimum height=2.2em,fill=red!20,rounded corners=2pt] (node5-1) at ([xshift=15.2em]node3-1.east) {\footnotesize{前向NMT系统}};
\draw [->,line width=1pt](node1-1.west)--([xshift=3em]node2-1.north);
\draw [->,line width=1pt](node1-1.east)--([xshift=-3em]node3-1.north);
\draw [->,line width=1pt](node1-2.east)--([xshift=-3em]node3-1.south);
\draw [->,line width=1pt](node11.east)--(node12.west);
\draw [->,line width=1pt,dashed](node21.east)--(node22.west);
\draw [->,line width=1pt,dashed]([xshift=3em]node2-1.south)--([xshift=-0.1em]node1-2.west);
\draw [->,line width=1pt,dashed]([xshift=3em]node3-1.south)--([xshift=-0.1em]node4-2.west);
\draw [->,line width=1pt](node4-1.east)--([xshift=-3em]node5-1.north);
\draw [->,line width=1pt](node4-2.east)--([xshift=-3em]node5-1.south);
\end{scope}
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\begin{scope}
\tikzstyle{word} = [font=\scriptsize]
\tikzstyle{model} = [rectangle,draw,minimum height=3em,minimum width=6em,rounded corners=4pt,fill=red!15!white]
\node [anchor=center] (ate) at (0,0) {};
\node [model,minimum width=10.5em,line width=0.7pt] (decoder) at ([xshift=6em]ate.east) {Decoder};
\node [word] (w1) at ([yshift=-2em,xshift=1em]decoder.south) {\small{$x_3$}};
\node [word] (w2) at ([xshift=-1em]w1.west) {\#};
\node [word] (w3) at ([xshift=-1em]w2.west) {\#};
\node [word] (w4) at ([xshift=-1em]w3.west) {\#};
\node [word] (w5) at ([xshift=1em]w1.east) {\small{$x_4$}};
\node [word] (w6) at ([xshift=1em]w5.east) {\#};
\node [word] (w7) at ([yshift=2em,xshift=1em]decoder.north) {\small{$x_4$}};
\node [word] (w8) at ([yshift=0em,xshift=-1em]w7.west) {\small{$x_3$}};
\node [word] (w9) at ([yshift=0em,xshift=1em]w7.east) {\small{$x_5$}};
\draw [->,thick] (w1.north) -- ([yshift=1.35em]w1.north);
\draw [->,thick] (w2.north) -- ([yshift=1.35em]w2.north);
\draw [->,thick] (w3.north) -- ([yshift=1.35em]w3.north);
\draw [->,thick] (w4.north) -- ([yshift=1.35em]w4.north);
\draw [->,thick] (w5.north) -- ([yshift=1.35em]w5.north);
\draw [->,thick] (w6.north) -- ([yshift=1.35em]w6.north);
\draw [->,thick] ([yshift=-1.4em]w7.south) -- (w7.south);
\draw [->,thick] ([yshift=-1.4em]w8.south) -- (w8.south);
\draw [->,thick] ([yshift=-1.4em]w9.south) -- (w9.south);
%encoder
\node [model,minimum width=10.5em,line width=0.7pt] (encoder) at ([xshift=-6em]ate.west) {Encoder};
\node [word] (we1) at ([yshift=-2em,xshift=1em]encoder.south) {\#};
\node [word] (we2) at ([xshift=-1em]we1.west) {\#};
\node [word] (we3) at ([xshift=-1em]we2.west) {\small{$x_2$}};
\node [word] (we4) at ([xshift=-1em]we3.west) {\small{$x_3$}};
\node [word] (we5) at ([xshift=1em]we1.east) {\#};
\node [word] (we6) at ([xshift=1em]we5.east) {\small{$x_6$}};
\draw [->,thick] (we1.north) -- ([yshift=1.35em]we1.north);
\draw [->,thick] (we2.north) -- ([yshift=1.35em]we2.north);
\draw [->,thick] (we3.north) -- ([yshift=1.35em]we3.north);
\draw [->,thick] (we4.north) -- ([yshift=1.35em]we4.north);
\draw [->,thick] (we5.north) -- ([yshift=1.35em]we5.north);
\draw [->,thick] (we6.north) -- ([yshift=1.35em]we6.north);
\draw [->,line width=2pt] ([xshift=0.5em]encoder)--([xshift=-0.5em]decoder);
\end{scope}
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\begin{scope}
\node [anchor=center] (node1) at (-2.3,0) {\small{$x,y$:双语数据}};
\node [anchor=center] (node2) at (-2.1,-0.5) {\small{$z$}:单语数据};
\node [anchor=center] (node1-1) at (0,0) {\small{$y'$}};
\node [anchor=center] (node3-1) at ([xshift=5.5em,yshift=-0.1em]node1-1.east) {\small{$z'$}};
\node[anchor=south,line width=0.6pt,draw,rounded corners,minimum height=1.5em,minimum width=4em,fill=blue!20](node1-2) at ([yshift=-3em]node1-1.south) {\small{softmax}};
\node[anchor=south,line width=0.6pt,draw,rounded corners,minimum height=1.5em,minimum width=4em,fill=blue!20](node3-2) at ([yshift=-3em]node3-1.south) {\small{softmax}};
\node[anchor=south,line width=0.6pt,draw,rounded corners,minimum height=2.2em,minimum width=4em,fill=red!20](node1-3) at ([yshift=-4.0em]node1-2.south) {\small{Decoder}};
\node[anchor=south,line width=0.6pt,draw,rounded corners,minimum height=2.2em,minimum width=4em,fill=yellow!20](node3-3) at ([yshift=-4.0em]node3-2.south) {\small{LM}};
\node[anchor=south](node1-4) at ([xshift=-0.6em,yshift=-3em]node1-3.south) {\gray{\small{$y$}}};
\node[anchor=south](node3-41) at ([xshift=-0.6em,yshift=-3em]node3-3.south) {\small{$y$}};
\node[anchor=south](node3-42) at ([xshift=0.6em,yshift=-2.9em]node3-3.south) {\small{$z$}};
\node[anchor=west](node2-2) at ([xshift=-4.9em]node1-4.west) {\small{$x$}};
\node[anchor=north,line width=0.6pt,draw,rounded corners,minimum height=2.2em,minimum width=4em,fill=red!20](node2-1) at ([yshift=4em]node2-2.north) {\small{Encoder}};
\node [rectangle,rounded corners,draw=red,line width=0.2mm,densely dashed,inner sep=0.4em] [fit = (node3-2) (node3-3)] (inputshadow) {};
\draw [->,thick,draw=gray](node1-4.north)--([xshift=-0.6em]node1-3.south);
\draw [->,thick](node1-3.north)--(node1-2);
\draw [->,thick](node1-2.north)--(node1-1);
\draw [->,thick](node2-2.north)--(node2-1);
\draw[->,thick](node2-1.east)--(node1-3.west);
\draw [->,thick](node3-41.north)--([xshift=-0.6em]node3-3.south);
\draw [->,thick](node3-42.north)--([xshift=0.6em]node3-3.south);
\draw [->,thick]([xshift=0.6em]node3-3.north)--([xshift=0.6em]node3-2.south);
\draw [->,thick](node3-2.north)--(node3-1);
\draw[->,thick]([xshift=-0.6em]node3-3.north)--([xshift=-0.6em,yshift=0.6em]node3-3.north)--([xshift=-3em,yshift=0.6em]node3-3.north)--([xshift=-3em,yshift=-3em]node3-3.north)--([xshift=-5.6em,yshift=-3em]node3-3.north)--([xshift=0.6em]node1-3.south);
%\draw[->](node2-1.north)--([yshift=1em]node2-1.north)--([xshift=2.5em,yshift=1em]node2-1.north)--([xshift=2.5em,yshift=-0.4em]node2-1.north)--(node1-3.west);
\end{scope}
\end{tikzpicture}
\ No newline at end of file
......@@ -20,11 +20,484 @@
%----------------------------------------------------------------------------------------
% CHAPTER 16
%----------------------------------------------------------------------------------------
\chapter{低资源神经机器机器翻译}
\chapter{基于多信息源方法}
\parinterval 相比传统的统计机器翻译,神经机器翻译的性能得到了显著的提升,随之带来的问题是对海量训练双语句对的依赖。想要得到一个高质量的神经机器翻译模型,需要大量的训练数据,然而双语句对的获取代价相对较高,在很多场景下都很难获取到充分的训练数据。如汉语、英语这种使用范围广泛或使用人数较多的语言,很容易获取到语言之间大量的双语句对,我们称之为富资源语言,而对于一些少数民族语言或者中小国家的语言,如乌尔都语、斐济语等,很难获取到与其他语言的双语句对,我们称之为稀缺资源语言。世界上现存6000余中语言,仅有很少一部分为富资源语言,绝大多数均为稀缺资源语言。即使在富资源语言对中,对于一些特定的领域,如物理、天文等,双语句对也是十分稀缺的。因此,一直以来,稀缺资源机器翻译都是备受研究人员关注的一个问题。
%----------------------------------------------------------------------------------------
% NEW SECTION
%----------------------------------------------------------------------------------------
\section{}
\section{单语数据的使用}
\parinterval {\red{这里可能需要一段开头}}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{数据增强}
\parinterval 数据增强(Data Augmentation)是为了缓解双语稀缺这一问题,利用单语数据来得到伪双语数据,从而增加训练数据的数量。
常用的数据增强方法包括回译、加噪和双语数据挖掘等。
\subsubsection{1. 回译}
\parinterval 回译(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 在理想情况下,生成的伪数据和真实数据分布越接近越好。不过,在实践中发现,即使一些简单的策略也能带来性能的增长。比如,在一些低资源的语种,仅仅通过将目标语句子复制到源语言端构造的伪数据都能为模型带来增益\cite{DBLP:conf/wmt/CurreyBH17}。相比这些简单的构造策略,利用目标语言单语数据进行回译可以获得更高质量的伪数据。原因主要包括以下两点:
\begin{itemize}
\vspace{0.5em}
\item 伪双语句对的源语是模型生成的翻译结果,相比真实数据存在一定的噪声。神经机器翻译模型在伪双语句对上进行训练,可以学习如何处理带有噪声的输入,提高了模型的鲁棒性;
\vspace{0.5em}
\item 伪双语句对的目标语是真实的句子,保证了神经机器翻译模型生成结果的流利度,因此可以得到更符合人类阅读习惯的翻译结果。
\vspace{0.5em}
\end{itemize}
\parinterval 围绕如何利用回译方法生成对模型更有帮助的伪双语数据,研究人员们进行了详细的分析探讨。在低资源的语种上,由于双语数据稀缺,模型需要更多的高质量伪双语数据。而在富资源的语种中,对回译产生的源语句子添加一些噪音,提高翻译结果的多样性,可以达到更好的效果,比较常用的方法是使用采用TopK或采样解码\cite{DBLP:conf/emnlp/EdunovOAG18}
\parinterval 回译常用的解码方式为束搜索,在生成每个词的时候只考虑预测概率最高的词,因此生成的翻译结果质量更高,但导致的问题是翻译结果缺乏多样性,生成的伪数据也就很难去准确地覆盖真实的数据分布。采样解码方法是指在生成过程中,对词表中所有的词按照预测概率进行随机采样,因此整个词表中的词都有可能被选中,从而使生成结果更具多样性,但翻译质量也会明显下降。TopK解码方法是对束搜索和采样方法的一个折中,在生成过程中,对预测概率最高的前K个词进行随机采样,这样在保证翻译结果的准确性的前提下,也提高了结果的多样性。三种方法如图\ref{fig:16-2-xc}所示。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-contrast-diagram-of-beam-search-topk-and-sampling}
\caption{回译的三种解码方式}
\label{fig:16-2-xc}
\end{figure}
%-------------------------------------------
\parinterval 回译方法的一个问题是:反向翻译模型的训练只依赖于有限的双语数据,生成的源语言端伪数据的质量难以保证。为此,可以采用{\small\sffamily\bfnew{迭代式回译}}\index{迭代式回译}(Iterative Back Translation)\index{Iterative Back Translation}的方法,同时利用源语言端和目标语言端的单语数据,不断通过回译的方式来提升前向和反向翻译模型的性能。图\ref{fig:16-3-xc}展示了迭代式回译的框架。首先使用双语数据训练一个前向翻译模型,然后利用源语言单语数据通过回译的方式来提升反向翻译模型的性能,最后由反向翻译模型和目标端单语数据生成的伪数据来提升前向翻译模型的性能。可以看出,这个往复的过程是闭环的,因此可以一直进行下去,直到两个翻译模型的性能不再提升。
\parinterval 回译的扩展工作还包括如何选择单语数据来生成伪数据\cite{DBLP:conf/emnlp/FadaeeM18,DBLP:conf/nlpcc/XuLXLLXZ19}、如何更有效地在伪数据和真实数据上进行训练\cite{DBLP:conf/wmt/CaswellCG19,DBLP:conf/emnlp/WangLWLS19}、采用迭代回译的方法逐步生成高质量的伪数据\cite{DBLP:journals/corr/abs200111327,DBLP:journals/corr/abs200403672},感兴趣的可以自行阅读相关论文。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-example-of-iterative-back-translation}
\caption{迭代式回译方法的流程}
\label{fig:16-3-xc}
\end{figure}
%-------------------------------------------
\parinterval 与回译的方法类似,源语言的单语数据也可以通过一个双语数据训练的翻译模型获得对应的目标语,构造{\small\sffamily\bfnew{前向翻译}}\index{前向翻译}(Forward Translation)\index{Forward Translation}的伪数据。与回译方法相反,前向翻译伪数据中源语言端是真实的,而目标语言端是生成的,构造的伪数据对译文的流畅性并没有太大帮助,其主要作用是丰富了训练数据中源语的表示,提升翻译模型中编码器的性能。大多数情况下,前向翻译方法带来的性能提升效果要弱于回译。
\subsubsection{2. 加噪}
\parinterval 除了回译方法,另外一种常用的数据增强技术是对真实双语数据加入一些噪声,得到伪双语数据,然后将二者混合来训练神经机器翻译模型。常用的加噪方法包括按照一定的概率将源语句子中的部分词随机丢弃或替换为其它词、轻微打乱源语句子的顺序。{\red{如图X所示。(这里可以加个图描述一下三种方法)}}
\parinterval 这种对训练数据加噪的方法仅在源语句子上进行操作,和回译方法相似,既保证了目标句子的准确性,又可以提高训练数据的量级。加噪方法也被用于训练降噪自编码器,在无监督机器翻译模型中也得到了广泛应用,详细方法可以参考xxx小节。
%(目标语低频词替换方法[Data Augmentation for Low-Resource Neural Machine Translation]是利用语言模型,将目标语句子中词替换为词表中的低频词,从而提高模型对低频词的预测准确率。
%丢词(word dropout)[Edinburgh Neural Machine Translation Systems for WMT 16]在源语或目标语句子中按照一定的概率随机选择一些词,将这些词的词嵌入设为0。
%丢词方法的思想和dropout的思想是一致的,可以提高模型的鲁棒性,避免模型陷入过拟合问题。)
\subsubsection{3. 双语句对挖掘}
\parinterval 从可比语料中挖掘可用的双语句对也是一种常用的方法。可比语料是指源语言和目标语言虽然不是完全互译的文本,但是蕴含了丰富的双语对照知识,可以从中挖掘出可用的双语句对来训练神经机器翻译模型。一般来说,有标注的双语数据的获取代价较高,而可比语料相对容易获取,比如多种语言报道的新闻事件、多种语言的维基百科词条;多种语言翻译的书籍等。(加一个维基百科 机器翻译 词条的中英文截图)
\parinterval 可比语料一般从网页中爬取得到,内容一般较为复杂,可能会存在较大比例的噪声,如HTML字符等,首先需要进行充分的数据清洗操作,得到干净的可比语料,然后从中抽取出可用的双语句对。传统的抽取方法为利用对齐句子或双语词典来挖掘相似的句对({\red{是否要补充具体方法}})。随着神经机器翻译模型的流行,使用神经网络来挖掘双语句对的方法得到了进一步的探索。
\parinterval 首先,对于两种语言的每个句子,使用词嵌入加权平均等方法计算得到蕴含句子语义信息的句向量,然后计算可比语料中每个源语句子和目标语句子之间的余弦相似度,相似度大于一定阈值的句对则认为是可用的双语句对\ref{DBLP:conf/emnlp/WuZHGQLL19}。为了将两种不同语言的句向量保持在同一表示空间,一般使用跨语言词嵌入来表示单词含义,具体内容可以参考xxx(双语词典归纳一节)。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{语言模型}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\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$个词前面生成的词。神经机器翻译模型考虑了结果的忠诚度和流畅度,忠诚度是指目标语翻译结果和源语言句子的语义保持一致,流利度是指翻译结果符合人类的语言习惯。忠实度需要建模源语言和目标语言之间的对应关系,但是流利度只和目标语言有关。因此,使用海量单语数据训练的语言模型可以生成更流利的句子,将其和神经机器翻译模型的解码过程结合,可以在保证忠实度的情况下,得到更加流利的翻译结果。具体的结合方法包括两种,分别是浅融合和深融合。{\red{(加个图)}}
\parinterval 浅融合通过对神经机器翻译模型和语言模型的预测概率进行加权来得到最终的预测概率:
\begin{eqnarray}
\log_{P(y_t | x, y_{<t})} = \log_{P(y_t | x, y_{<t}; \theta_{TM})} + \beta \log_{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_{P(y_t | x, y_{<t})}= \log_{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. 预训练}
\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-4-xc}给出了机器翻译编码器预训练流程的示意图。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-encoder-fin}
\caption{机器翻译编码器预训练流程}
\label{fig:16-4-xc}
\end{figure}
%-------------------------------------------
\parinterval 预训练的做法相当于对目标任务进行了简化,将表示模型的学习任务从目标任务中分离出来了。这样,可以学习一种更加通用的模型,具有更好的泛化能力。此外,预训练的任务相比于机器翻译要简单许多,比如语言模型或者句子调序等。将预训练任务的结果作为机器翻译模型的初始值可以减轻目标任务上的学习负担。在第六章中已经介绍了几种基于预训练的模型,如ELMO、GPT和BERT等。这些模型的结构和神经机器翻译是兼容的,比如,BERT使用的就是Transformer模型。因此可以直接使用这些模型进行面向机器翻译的预训练。
\begin{itemize}
\vspace{0.5em}
\item {\small\sffamily\bfnew{词嵌入预训练}}
\parinterval 词嵌入可以被看作是对每个独立单词进行的表示学习,在自然语言处理的众多任务中都扮演着重要角色\cite{DBLP:journals/corr/abs-1901-09069}。因此,可以使用{\chapternine}介绍的词嵌入方法,在外部单语数据上训练得到词嵌入,并把它作为神经机器翻译系统的词嵌入输入。
\parinterval 需要注意的是,在神经机器翻译中使用预训练的词嵌入有两种方法。一种方法是直接将词嵌入作为固定的输入,也就是在训练机器翻译模型的过程中,并不调整词嵌入的参数。这样做的目的是完全将词嵌入模块独立出来,机器翻译可以被看作是在固定的词嵌入输入上进行的建模。另一种方法是仍然遵循``预训练+微调''的策略,将词嵌入作为翻译模型的初始值。之后在机器翻译训练过程中,词嵌入模型结果会被进一步更新。近些年,在词嵌入预训练的基础上进行微调的方法受到研究者越来越多的青睐。
\vspace{0.5em}
\item {\small\sffamily\bfnew{编码器预训练}}
\parinterval 编码器在神经机器翻译中的作用是对源语句子中的信息进行抽象和提取,将离散的词序列编码成一组上下文相关的向量表示,本质上就是一个源语言端的句子表示模型。因此,可以使用预训练好的句子级表示模型(比如,BERT和XLM等),来初始化编码器参数。然而在实践中发现,这种参数初始化的方法在一些富资源语种上提升效果并不明显,甚至反而有些下降\cite{DBLP:journals/corr/abs-2002-06823}。原因可能在于预训练模型和编码器虽然都是对句子进行表示,但是由于目标任务不一致,二者的参数状态还是存在区别的。因此,也有一些做法将预训练模型和翻译模型在结构上进行融合,将预训练句子模型作为一个独立的模块来为编码器或者解码器提供句子级表示信息\cite{DBLP:journals/corr/abs-2002-06823}
\vspace{0.5em}
\item {\small\sffamily\bfnew{序列到序列预训练}}
\parinterval 传统的预训练模型都是针对自然语言理解任务设计的,比如情感分类和命名实体识别等任务。其目的是获得更好的句子表示结果,并用于下游任务。而在机器翻译和文本摘要等序列到序列的语言生成任务中,不只包含源语言表示学习的问题,还有序列到序列的映射,以及目标端序列生成的问题,这些知识是无法通过(源语言)单语数据学习到的。为了能够在序列到序列任务上更好地使用单语数据,可以同时使用编码器和解码器的结构完成对单语数据的预训练。
\vspace{0.5em}
\end{itemize}
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-mass}
\caption{MASS 预训练方法}
\label{fig:16-5-xc}
\end{figure}
%-------------------------------------------
\parinterval 以MASS方法为例\cite{song2019mass},可以直接对整个编码器-解码器的结构进行预训练。训练中采用掩码的方式,将源语词序列中的片段替换成特殊词<mask>,然后在解码器端预测这个未知片段,如图\ref{fig:16-5-xc}所示,\#号表示特殊词<mask>。这种做法可以使得编码器端捕捉上下文信息,同时迫使解码器依赖于编码器,学习编码器和解码器之间的注意力进行预训练。而解码器端片段的预测也使得解码器能够学习到向前依赖的上下文表示。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{3. 联合训练}
\parinterval {\small\sffamily\bfnew{多任务学习}}\index{多任务学习}(Multitask Learning)\index{Multitask Learning}是机器学习的一个子领域,是指同时学习多个独立但是相关的任务\cite{DBLP:journals/corr/Ruder17a}。多任务学习通过模型共享的方式,对多个模型进行学习,而这些模型都对应不同的任务,这样不同模型可以互相``促进''。在神经机器翻译中,为了使用单语数据,可以将翻译任务作为主任务,同时设置一些仅使用单语数据的子任务,通过这些子任务来捕捉单语数据中的语言知识\cite{DBLP:conf/emnlp/DomhanH17}
\parinterval 语言模型是使用目标端单语数据最直接的方式,但是翻译模型作为一个受限的语言模型,还需要依赖于源语,并不能直接进行多任务学习。针对这个问题,对原有翻译模型结构进行了修改,在解码器中增加了一个语言模型子层,将这个子层用于语言模型任务(图\ref{fig:16-6-xc})。在训练过程中,分别将双语数据和单语数据送入翻译模型和语言模型进行计算,得到的损失相加用于整体模型参数的梯度计算和参数更新,这里语言模型的参数是翻译模型的一部分。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-target-side-multi-task-learning}
\caption{机器翻译中的单任务学习和多任务学习}
\label{fig:16-6-xc}
\end{figure}
%-------------------------------------------
\parinterval 除了多任务学习,还有一些方法将前向模型和反向模型一起训练,在训练过程中同时使用源语言端和目标语言端的单语数据来提升模型性能,双向训练的内容会在\ref{subsection-7.5.4}节中进行介绍。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{翻译建模}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{1. 双向训练}
\label{subsection-7.5.4}
\parinterval 到目前为止,神经机器翻译系统都是每次一次只训练一个方向的模型。比如,给定中英的双语数据,一次只训练一个中到英或者英到中的翻译系统。既然两个方向的系统都使用同样的双语数据进行训练,那么是否可以一次训练同时得到两个方向的翻译系统呢?
\parinterval 回顾神经机器翻译系统的建模过程,给定一个互译的句对$(\mathbf s,\mathbf t)$,一个从源语言句子$\mathbf s$到目标语言句子$\mathbf t$的翻译被表示为求条件概率$\textrm{P}(\mathbf t|\mathbf s)$的问题。类似地,一个从目标语言句子$\mathbf t$到源语言句子$\mathbf s$的翻译可以表示为$\textrm{P}(\mathbf s|\mathbf t)$。通常来说,神经机器翻译的训练一次只得到一个方向的模型,也就是$\textrm{P}(\mathbf t|\mathbf s)$或者$\textrm{P}(\mathbf s|\mathbf t)$。这意味着$\textrm{P}(\mathbf t|\mathbf s)$$\textrm{P}(\mathbf s|\mathbf t)$之间是互相独立的。$\textrm{P}(\mathbf t|\mathbf s)$$\textrm{P}(\mathbf s|\mathbf t)$是否真的没有关系呢?比如,$\mathbf s$$\mathbf t$是相同大小的向量,且$\mathbf s$$\mathbf t$的变换是一个线性变换,也就是与一个方阵$\mathbf{W}$做矩阵乘法:
\begin{eqnarray}
\mathbf t = \mathbf s \cdot \mathbf{W}
\label{eq:16-6-xc}
\end{eqnarray}
\parinterval 这里可以把$\mathbf s$$\mathbf t$都看作分布式的向量表示;$\mathbf{W}$应当是一个满秩矩阵,否则对于任意一个$\mathbf s$经过$\mathbf{W}$变换得到的$\mathbf t$只落在所有可能的$\mathbf t$的一个子空间内,即在给定$\mathbf{W}$的情况下有些$\mathbf t$不能被任何一个$\mathbf s$表达,而这不符合常识,因为不管是什么句子,我们总能找到它的一种译文。若$\mathbf{W}$是满秩矩阵说明$\mathbf{W}$可逆,也就是给定$\mathbf s$$\mathbf t$的变换$\mathbf{W}$下,$\mathbf t$$\mathbf s$的变换必然是$\mathbf{W}$的逆而不是其他矩阵。这个例子说明$\textrm{P}(\mathbf t|\mathbf s)$$\textrm{P}(\mathbf s|\mathbf t)$直觉上应当存在联系。当然,$\mathbf s$$\mathbf t$之间是否存在简单的线性变换关系并没有结论,但是上面的例子给出了一种对源语言句子和目标语言句子进行相互转化的思路。实际上,研究人员已经通过一些数学技巧用目标函数来把$\textrm{P}(\mathbf t|\mathbf s)$$\textrm{P}(\mathbf s|\mathbf t)$联系起来,这样训练神经机器翻译系统一次就可以同时得到两个方向的翻译模型,使得训练变得更加高效\cite{Hassan2018AchievingHP}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{2. 有监督对偶学习}
\parinterval 除了用条件概率$\textrm{P}(\mathbf t|\mathbf s)$建模翻译问题,还可以使用联合分布$\textrm{P}(\mathbf s,\mathbf t)$进行建模\cite{DBLP:conf/icml/XiaQCBYL17}。根据条件概率的定义,有:
\begin{eqnarray}
\textrm{P}(\mathbf s,\mathbf t) &=& \textrm{P}(\mathbf s)\textrm{P}(\mathbf t|\mathbf s) \nonumber \\
&=& \textrm{P}(t)\textrm{P}(\mathbf s|\mathbf t)
\label{eq:16-7-xc}
\end{eqnarray}
\parinterval 公式\ref{eq:16-7-xc}很自然地把两个方向的翻译模型$\textrm{P}(\mathbf t|\mathbf s)$$\textrm{P}(\mathbf s|\mathbf t)$以及两个语言模型$\textrm{P}(\mathbf s)$$\textrm{P}(\mathbf t)$联系起来:$\textrm{P}(\mathbf s)\textrm{P}(\mathbf t|\mathbf s)$应该与$\textrm{P}(\mathbf t)\textrm{P}(\mathbf s|\mathbf t)$接近,因为它们都表达了同一个联合分布$\textrm{P}(\mathbf s,\mathbf t)$。因此,在构建训练两个方向的翻译模型的目标函数时,除了它们单独训练时各自使用的极大似然估计目标函数,可以额外增加一个目标项来鼓励两个方向的翻译模型去满足公式\ref{eq:7-32}
\begin{eqnarray}
\mathcal{L} = (\textrm{log P}(\mathbf s) + \textrm{log P}(\mathbf t|\mathbf s) - \textrm{log P}(\mathbf t) - \textrm{log P}(\mathbf s|\mathbf t))^{2}
\label{eq:16-8-xc}
\end{eqnarray}
\parinterval 这里$\textrm{P}(\mathbf s)$$\textrm{P}(\mathbf t)$这两个语言模型是预先训练好的,并不参与翻译模型的训练。可以看到,对于单独的一个模型来说,其目标函数增加了与另外一个方向的模型相关的项。这样的形式与L1/L2正则化非常类似(见\ref{subsection-7.3.1}节),因此可以把这个方法看作是一种任务特定的正则化的手段(由翻译任务本身的性质所启发而来)。由于两个方向的翻译模型和语言模型相互影响,这种方法能得到比基于单个方向训练效果更好的模型。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{3. 无监督对偶学习}
\parinterval 在有监督对偶学习对联合分布$\textrm{P}(\mathbf s,\mathbf t)$建模的基础上,如果把$\mathbf t$看作一个隐变量,那么可以得到边缘分布$\textrm{P}(\mathbf s)$,也就是关于$\mathbf s$的语言模型:
\begin{eqnarray}
\textrm{P}(\mathbf s) &=& \sum_{\mathbf t}\textrm{P}(\mathbf s,\mathbf t) \nonumber \\
&=& \sum_{\mathbf t}\textrm{P}(\mathbf s|\mathbf t)\textrm{P}(\mathbf t|\mathbf s)
\label{eq:16-9-xc}
\end{eqnarray}
\noindent 公式\ref{eq:16-9-xc}假设$\textrm{P}(\mathbf s|\mathbf t)=\textrm{P}(\mathbf s|\mathbf s,\mathbf t)$。这个假设显然是成立的,因为当知道一个句子的译文时,并不需要知道它的源文就可以把它翻译回去。如果直接优化(最大化)公式\ref{eq:16-9-xc}右侧,相当于对这个等式$\textrm{P}(\mathbf s|\mathbf t)$$\textrm{P}(\mathbf t|\mathbf s)$施加了{\small\sffamily\bfnew{循环一致性}}\index{循环一致性}(Circle Consistency)\index{Circle Consistency}的约束\cite{DBLP:conf/iccv/ZhuPIE17},也就是对于一个句子$\mathbf s$,通过$\textrm{P}(\mathbf t|\mathbf s)$把它翻译成$\mathbf t$后,根据$\textrm{P}(\mathbf s|\mathbf t)$应该能重新翻译出$\mathbf s$,如图\ref{fig:7-43}所示。公式\ref{fig:16-7-xc}给出了同时优化$\textrm{P}(\mathbf s|\mathbf t)$$\textrm{P}(\mathbf t|\mathbf s)$的一个目标函数形式。这个目标函数的一个额外的好处是它本质上是在学习一个由$\textrm{P}(\mathbf s|\mathbf t)$$\textrm{P}(\mathbf t|\mathbf s)$组成的语言模型$\textrm{P}(\mathbf s)$,而$\textrm{P}(\mathbf s)$的学习依赖于单语数据,这意味着这个目标函数可以很自然地直接使用大量单语数据来同时训练两个翻译模型。相同的结论可以推广到$\textrm{P}(\mathbf t)$\cite{DBLP:conf/nips/HeXQWYLM16}
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter16/Figures/figure-cycle-consistency}
\caption{循环一致性}
\label{fig:16-7-xc}
\end{figure}
%----------------------------------------------
\parinterval 但是直接使用公式\ref{eq:16-9-xc}作为目标函数需要解决两个问题:
\begin{itemize}
\vspace{0.5em}
\item 计算公式\ref{eq:16-9-xc}要枚举所有可能的隐变量$\mathbf t$的取值,也就是所有可能产生的目标语句子,而这是不可能的,因此一般会通过平均多个随机产生的$\mathbf t$对应的损失来近似真正的目标函数值;
\vspace{0.5em}
\item 从公式\ref{eq:16-9-xc}可以看到,在$\textrm{P}(\mathbf s)$上计算完目标函数值后,得到的梯度首先传递给$\textrm{P}(\mathbf s|\mathbf t)$,然后通过$\textrm{P}(\mathbf s|\mathbf t)$传递给$\textrm{P}(\mathbf t|\mathbf s)$。由于$\textrm{P}(\mathbf s|\mathbf t)$的输入$\mathbf t$$\textrm{P}(\mathbf t|\mathbf s)$采样得到,而采样操作不可导,导致梯度的传播在$\textrm{P}(\mathbf t|\mathbf s)$的输出处断开了,因此$\textrm{P}(\mathbf t|\mathbf s)$接收不到任何梯度来进行更新。常见的解决方案是使用策略梯度\cite{DBLP:conf/nips/SuttonMSM99}。它把$\textrm{P}(\mathbf t|\mathbf s)$采样得到的$\mathbf t$当成$\textrm{P}(\mathbf t|\mathbf s)$的目标来学习,并使用$\textrm{log P}(\mathbf s|\mathbf t)$$\textrm{P}(\mathbf t|\mathbf s)$的损失进行加权。但是由于仅使用少量样本来近似真正的目标函数,得到的策略梯度方差非常大,系统无法稳定学习,特别是训练的初期,因此通常会需要先使用双语数据预训练两个方向的翻译模型,然后把公式\ref{eq:16-9-xc}作为正常训练的一个正则化项使用。
\vspace{0.5em}
\end{itemize}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{4. 翻译中回译}
\parinterval 重新回顾公式\ref{eq:16-9-xc}对应的目标函数,无监督对偶学习跟回译(假设现在只在一个句对$(\mathbf s,\mathbf t)$上做回译)之间有着很深的内在联系:给定一个句子$\mathbf s$,无监督对偶学习和回译都首先用$\textrm{P}(\mathbf t|\mathbf s)$$\mathbf s$翻译成$\mathbf t$,然后无监督对偶学习最大化$\textrm{P}(\mathbf s|\mathbf t)\textrm{P}(\mathbf t|\mathbf s)$,而回译则是最大化$\textrm{P}(\mathbf s|\mathbf t)$。可以看到,当无监督对偶学习假设$\textrm{P}(\mathbf t|\mathbf s)$是一个完美的翻译模型的时候,它与回译是等价的。此外,在共享两个方向的模型参数$\theta$的情况下,可以看到无监督对偶学习的梯度为$\frac{\partial \textrm{P}(\mathbf s)}{\partial \theta} =\textrm{P}(\mathbf t|\mathbf s) \frac{\partial \textrm{P}(\mathbf s|\mathbf t)}{\partial \theta}+\textrm{P}(\mathbf s|\mathbf t) \frac{\partial \textrm{P}(\mathbf t|\mathbf s)}{\partial \theta} $,而回译的梯度为$\frac{\partial \textrm{P}(\mathbf s|\mathbf t)}{\partial \theta}$。从这个角度出发,无监督对偶学习与回译都在优化语言模型$\textrm{P}(\mathbf s)$这个目标函数,只不过回译使用对$\theta$有偏的梯度估计。
\parinterval 这个事实说明对回译进行适当的增广后应该能取得与无监督对偶学习相似的结果。{\small\sffamily\bfnew{ 翻译中回译}}\index{翻译中回译}(On-the-fly Back-translation)\index{On-the-fly Back-translation}就是这样一个例子。一般回译的过程是先把数据集里所有$\mathbf s$都翻译出来,然后只训练$\textrm{P}(\mathbf s|\mathbf t)$。区别于回译,从数据集中采集到一个$\mathbf s$之后,翻译中回译立刻把$\mathbf s$翻译成$\mathbf t$,然后训练$\textrm{P}(\mathbf s|\mathbf t)$,并且在下一步迭代中采集一个$\mathbf t$然后训练$\textrm{P}(\mathbf t|\mathbf s)$,这样交替更新$\textrm{P}(\mathbf s|\mathbf t)$$\textrm{P}(\mathbf t|\mathbf s)$。尽管翻译中回译无法像无监督对偶学习那样在一个样本里通过梯度把$\textrm{P}(\mathbf s|\mathbf t)$的信息传到$\textrm{P}(\mathbf t|\mathbf s)$,但是它交替更新$\textrm{P}(\mathbf s|\mathbf t)$$\textrm{P}(\mathbf t|\mathbf s)$的策略允许$\textrm{P}(\mathbf s|\mathbf t)$在两个样本间通过其产生的输出$\mathbf s$来把信息传递到$\textrm{P}(\mathbf t|\mathbf s)$,因此也能获得相近的效果,并且在实现和计算上都非常高效。翻译中回译已经在无监督神经机器翻译系统训练中被广泛使用\cite{lample2019cross}
\subsubsection{triangular}
[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.
基本的韵律感和音高感是音乐教师的必备素质。
图1 单词在不同领域的不同词义实例
\parinterval 不同领域间不仅存在一词多义问题,常用词汇也存在着很大的区别。比如在口语领域,常用词一般较为简单,而医学领域的单词结构组成一般较为复杂。
目前的机器翻译模型主要面向通用领域翻译,如新闻、口语等。
对于富资源语种,一般可以获取到充分的通用领域双语句对,从而训练得到高质量的神经机器翻译模型。
然而,由于训练数据中主要集中在通用领域,特定领域的语料库通常比较稀缺或根本不存在,因此模型在一些特定领域上的表现并不佳,如化学、天文学、医学等。
同时,人们对特定领域的机器翻译系统的需求也是十分庞大的。在类似专利翻译这种面向特定领域进行翻译的场景,通用领域的机器翻译模型并不能达到人们期望的水平,因此训练特定领域的翻译模型是十分重要的。
\parinterval
% 然而,特定领域的语料库通常比较稀缺或根本不存在,如果在特定领域上直接使用通用模型则性能较差。
因此,在特定领域的机器翻译模型实际使用中,对特定领域的适应性进行调整是重要的步骤之一,这种利用领域外数据和领域内数据来改进特定领域的翻译效果的方法被称作领域自适应(Domain Adaptation)。
时至今日,领域自适应的方法已经非常丰富,近几年许多基于神经网络机器翻译的领域自适应方法被提出和评估[1, 2]。
下面,我们从数据方法和模型方法对领域自适应的经典方法进行介绍。
数据方法侧重于模型中的数据部分,而不是用于领域自适应的专用模型,包括使用领域外双语数据和领域内单语数据,模型方法是用于领域自适应的神经网络机器翻译模型。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{利用领域外双语数据}
\parinterval 训练一个成型的机器翻译系统往往需要使用大规模的多领域混合的数据,而不同领域的语料涵盖了不同的领域和文体,包括了政治、新闻、科技和体育等各大门类在内,除此之外,还相应地包括书面文体、口语文体和网络语言等等。这种领域和文体的差异性将会带来两个问题:其一,使用某一个领域或文体的双语语料训练得到的系统在处理同一领域的文本时效果最佳,而当应用在其他领域的文本时结果常常不尽如人意,有时的结果甚至不可接受。其二,使用多领域混合的语料训练得到的系统的通用性虽然较好,但由于多个领域数据的相互影响以及相互制约,系统在某一特定领域往往无法达到最佳效果。因此,直接使用混合数据的效果不佳,而特定领域的数据又比较稀缺,所以如何制定最佳的策略有效地利用其它领域的数据是十分重要的。在本节的叙述中,特定领域被称作目标域,其他领域被称作源域。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{1. 多领域数据}
\parinterval 多领域数据方法类似多语言学习理念,把多个领域的数据一起送入模型,让模型可以增加基础性能,从而增强在各个领域的效果。目前比较常用的方法是在数据中加入标签来控制神经网络机器翻译模型对领域的辨别,如图2所示,主要有两个关键点:在各个领域的语料前加上<2领域>的标签来指定语料的归属领域,让神经网络模型可以更好的对不同领域生成句子;此外,把数据量较小的领域复制数倍,对各个领域的数据量进行平衡防止模型对各个领域产生不平等的关注。
图2
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{2. 数据选择}
\parinterval 直接把所有的数据拿来训练模型,虽然最大程度的利用了所有资源,但却不可避免的将一些十分不相关的数据引入了模型造成了干扰,一个自然的想法就是选择出这些数据中跟目标域较为相似的数据来增强目标域的性能。数据选择是通过使用困惑度[3]或领域相似度[4]等方法从域外数据中找到一些与域内数据较为相似的数据以增加数据量,提升模型能力。可以根据句子的词嵌入来找到源域中与目标域最相似的句子,如图3所示,根据相似度排序后选择部分句子用于模型训练[5]。除了静态的保持选择好的数据一成不变,还有一种动态的数据选择方法,在每个不同的训练轮次改变所选择的训练数据子集用于神经网络机器翻译模型训练,如图4所示,逐次减少每轮的数据量,剩下最相似的数据以最后得到效果最好的领域自适应模型[6]。还可以利用课程学习的思想,根据相似度打分,将最相似的句子最先送入模型,让模型能最先学到跟目标域最相关的知识,奠定良好的基础[7]。
图3
图4
多领域数据的优点在于大大提高了数据量,但在实际使用中可能会与使用通用模型一样带来词汇预测错误的问题,数据选择无需划分领域,在混合数据中进行选择,但增加的数据量较小,对低资源改善不大。使用域外双语数据的优点在于充分的利用了全部能利用的双语数据,低资源问题得到了一定程度的缓解,模型学到了更多的语言学知识。但不光引入了一些领域不相关的知识,而且可能域外双语数据本身也寥寥无几,在经过数据选择之后就变得更加不足了,对模型的帮助可能并不足够令人满意。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{利用领域内单语数据}
\parinterval 机器翻译需要使用大量的双语平行数据来训练,而通常双语数据是较少的,但单语数据是大量存在的,如果可以有效地利用领域内的单语数据无疑可以增强机器翻译性能。例如在中英专利翻译任务中,中英新闻平行语料库有100万个句对,而口语领域平行语料库只有20万个句对,口语领域单语语料库却有几百万个句子,因此可以用包含几百万句子的口语单语语料库来提升口语领域的翻译质量。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{1. 直接使用单语数据}
\parinterval 机器翻译任务中,单语数据相对比较充足,所以可以利用单语数据来提升模型性能。即使是把目标端单语复制成平行语料当作双语直接训练神经网络机器翻译模型,这种简单的方法也能使BLEU增加超过一个点[8],可见单语数据在资源比较稀缺的时候是很有帮助的。除了简单地使用单语作为语料训练模型,还可以使用单语数据训练语言模型,把语言模型融合进神经网络机器翻译解码器增强翻译性能[9]。在神经网络机器翻译中可以使用源端单语数据的多任务学习框架,该框架包括翻译模型和句子重新排序模型,使用源端单语数据通过多任务学习来增强NMT编码器,用于预测翻译和重新排序的源句子[10]。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{2. 伪数据}
\parinterval 机器翻译任务中,标注的数据较少,而未标注的单语数据较多,并且标注的成本通常很高,所以可以用单语数据来制作伪数据以增加数据量,如图6所示,平行语料的两种语言用于制作伪数据均有效果[10-12]。通常是使用单语数据来制作平行语料伪数据,使用目标领域的数据来制作伪数据用于领域自适应尤为有效。伪数据还可以用来作为人工噪声,可以把一句话的语序随机打乱来作为伪数据,两个领域的语序可能完全不同,错误的语序可能会带来更好的学习效果[13]。如果数据稀缺程度达到没有双语数据,还可以从目标域中归纳出词汇表,然后对目标域的目标端单语数据使用反向翻译制作伪数据[14],如图7所示。
图6
图7
\parinterval 单语数据的使用大大地增加了领域内的数据量,并且保证了领域的分布不会改变。在WMT等机器翻译比赛中,对单语数据的有效利用是十分关键的一环,语言模型、伪数据等都是必不可少的制胜法宝。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{领域自适应模型方法}
\parinterval 在数据已经被以各种方式充分利用后,为了克服数据稀缺这一先天条件,无疑就要为领域自适应任务开发专门的神经网络模型来提升性能。以模型为中心的方法关注专门用于领域自适应的神经网络机器翻译模型,其可以是训练目标,神经网络结构或解码算法。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{1. 训练目标}
\parinterval 领域自适应的训练方法是指在模型的训练阶段改变获得训练目标的过程或是训练函数的方法,通过加权或者微调、预训练等方法更加充分的利用数据。
因为数据本身十分稀缺,所以如何更充分的利用数据是一个重要问题,最简单的方法是给数据进行加权,对源域样本进行加权采样,从而逼近目标域的分布,让模型有权重的学习样本的知识。然而因为神经网络并不是线性的,所以样本权重无法直接集成到神经网络中,可以从源域和目标域语言模型的交叉熵学习权重,从而让模型根据权重进行样本加权训练[15]。除了使用交叉熵外,还可以使用校验集训练出一个领域分类器,并修改模型的损失函数,把分类器输出的概率转化为句子的权重,让模型根据这个权重学习与目标领域最相似的句子[16]。如果把加权从句子级别精确到词级别,对每个词进行权重评分,根据词的得分综合也可以进行加权训练[17]。
图8 神经网络机器翻译加权
\parinterval 微调是领域自适应最常用的方法,是指整个要训练的网络不是从随机状态开始,而是从一个比较好的初始状态开始微调。如图9所示,其常用方法是在资源丰富的域外语料库上对系统进行训练直至收敛,然后在资源贫乏的目标域语料库上对系统参数进行微调,这种方法经常配合预训练使用。微调会极大地增强在目标域上的翻译性能,但是会降低在源域上的翻译能力,为了解决微调后在源域上性能下降的问题,可以在源域模型上使用前文13章第5节提到的知识蒸馏技术以保证模型在源域上也有较好的翻译能力[18],也可以使用源域数据和目标域数据混合微调使两个领域的性能都有保障[19]。让源域和目标域进行多次循环知识蒸馏,如图10所示迭代地学习对方领域的知识,可以保证在源域和目标域上的翻译性能都逐步上升[20]。在微调时可能会产生过拟合问题,为了解决这一问题,可以通过dropout或L2正则化来降低过拟合现象[21]。
图9微调常用方法
图10循环知识蒸馏
\parinterval 预训练是提前获得一些初始化的参数,这个参数不是随机的,而是通过其他类似数据集上面学习得到的,然后再用目标领域的数据集进行学习,得到适合该领域的参数。预训练现在已成为自然语言处理中非常频繁使用的方法,只需要非常少量的标记数据去微调就可以收获一个高性能的模型。如果数据量较小,很多语言学现象无法覆盖,而预训练可以充分利用海量的无标记的自然语言处理文本,可以把语言学知识抽取出来,加强模型的泛化能力。
\subsubsection{模型结构}
\parinterval 修改训练目标的方法是在训练过程中更充分的利用数据,而更改训练模型时的神经网络结构以进行领域自适应是一种更加直观的模型方法,包括模型融合和领域判别。
\parinterval 模型融合是指通过把不同的模型融合以获得更好的效果,例如可以把循环神经网络语言模型和神经机器翻译集成为一个解码器,让模型在解码时可以从语言模型中得到指导[22],联合训练语言模型和翻译模型并将其融合会获得更好的效果[9]。
\parinterval 领域判别方法是将不同领域的数据混合起来进行训练,如图11所示,判断出要处理的数据属于哪个领域,领域鉴别器和神经网络机器翻译模型可以联合优化模型性能。可以在编码器的基础上加上前向反馈神经网络预测源语句子的领域[23],也可以使用术语频率-逆文档频率方法预测输入句子的领域标签并在嵌入层加上表示领域的嵌入,使模型可以判断输入数据的领域[24]。
图11领域鉴别器
\subsubsection{解码算法}
\parinterval 解码是指将输入序列转换成的向量再次转化为输出序列的过程,领域自适应的解码方法是指通过修改解码的过程获得更好的序列的方法,与其他模型方法互补,包括解码打分、集成解码和优化解码算法。
\parinterval 解码打分是通过打分的方式选择最佳的结果,可以把目标域的目标语的语言模型和神经机器翻译的分数如图12所示加权结合[22],还可以在此基础上加入源域的目标语语言模型的分数共同打分[25]。
图12 解码打分融合
\parinterval 集成解码是把不同的模型集成以获得更好的翻译效果,如图13所示。为了保证在源域的翻译能力不退化,可以把多个目标域模型进行微调后与源域模型进行集成以增强解码能力[26]。集成解码也可以结合加权思想,根据扩展贝叶斯插值方法,不依赖领域标签给模型集成解码加权来获得更佳的解码结果[27]。
图13集成解码
\parinterval 解码算法本身也可以进行优化,比如可以使用一种基于堆栈的字格解码算法,在领域自适应中比常用方法有更好的效果[28]。
\parinterval 训练目标从从训练的步骤和手段角度出发,模型结构从神经网络本身的构造改动,解码方法从解码模型的角度修改,三者相辅相成地增加模型的领域适应性。
参考文献
[1] Alan R, Barbara P. Neural Unsupervised Domain Adaptation in NLP---A Survey[J]. 2020.
[2] Ievgen R, Emilie M, Amaury H, et al. A survey on domain adaptation theory[J]. 2020.
[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] Chen B, Cherry C, Foster F G, et al. Cost Weighting for Neural Machine Translation Domain Adaptation[J]. NMT@ACL. 2017: 40-46.
[17] Yan S, Dahlmann L, Petrushkov P, et al. Word-based Domain Adaptation for Neural Machine Translation[J]. CoRR. 2019.
[18] Dakwale P, Monz C. Fine-Tuning for Neural Machine Translation with Limited Degradation across In- and Out-of-Domain Data[Z]. 2017156-169.
[19] Chu C. Integrated Parallel Data Extraction from Comparable Corpora for Statistical Machine Translation[J]. 2015.
[20] Zeng J, Liu Y, Su J, et al. Iterative Dual Domain Adaptation for Neural Machine Translation[J]. EMNLP/IJCNLP (1). 2019: 845-855.
[21] Barone V M A, Haddow B, Germann U, et al. Regularization techniques for fine-tuning in neural machine translation[J]. EMNLP. 2017: 1489-1494.
[22] Gulcehre C, Firat O, Xu K, et al. On Using Monolingual Corpora in Neural Machine Translation[J]. Computer Science. 2015.
[23] Britz D, Le V Q, Pryzant R. Effective Domain Mixing for Neural Machine Translation[J]. WMT. 2017: 118-126.
[24] Kobus C, Crego M J, Senellart J. Domain Control for Neural Machine Translation[J]. recent advances in natural language processing. 2017.
[25] Dou Z, Wang X, Hu J, et al. Domain Differential Adaptation for Neural Machine Translation[J]. NGT@EMNLP-IJCNLP. 2019: 59-69.
[26] Freitag M, Al-Onaizan Y. Fast Domain Adaptation for Neural Machine Translation[J]. 2016.
[27] 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.
[28] Khayrallah H, Kumar G, Duh K, et al. Neural Lattice Search for Domain Adaptation in Machine Translation[J]. IJCNLP. 2017: 20-25.
......@@ -5313,7 +5313,120 @@ pages ={157-166},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% chapter 16------------------------------------------------------
@inproceedings{DBLP:conf/wmt/CurreyBH17,
author = {Anna Currey and
Antonio Valerio Miceli Barone and
Kenneth Heafield},
title = {Copied Monolingual Data Improves Low-Resource Neural Machine Translation},
pages = {148--156},
publisher = {Annual Meeting of the Association for Computational Linguistics},
year = {2017}
}
@inproceedings{DBLP:conf/emnlp/EdunovOAG18,
author = {Sergey Edunov and
Myle Ott and
Michael Auli and
David Grangier},
title = {Understanding Back-Translation at Scale},
pages = {489--500},
publisher = {Annual Meeting of the Association for Computational Linguistics},
year = {2018}
}
@inproceedings{DBLP:conf/emnlp/FadaeeM18,
author = {Marzieh Fadaee and
Christof Monz},
title = {Back-Translation Sampling by Targeting Difficult Words in Neural Machine
Translation},
pages = {436--446},
publisher = {Annual Meeting of the Association for Computational Linguistics},
year = {2018}
}
@inproceedings{DBLP:conf/nlpcc/XuLXLLXZ19,
author = {Nuo Xu and
Yinqiao Li and
Chen Xu and
Yanyang Li and
Bei Li and
Tong Xiao and
Jingbo Zhu},
title = {Analysis of Back-Translation Methods for Low-Resource Neural Machine
Translation},
volume = {11839},
pages = {466--475},
publisher = {Springer},
year = {2019}
}
@inproceedings{DBLP:conf/wmt/CaswellCG19,
author = {Isaac Caswell and
Ciprian Chelba and
David Grangier},
title = {Tagged Back-Translation},
pages = {53--63},
publisher = {Annual Meeting of the Association for Computational Linguistics},
year = {2019}
}
@inproceedings{DBLP:conf/emnlp/WangLWLS19,
author = {Shuo Wang and
Yang Liu and
Chao Wang and
Huanbo Luan and
Maosong Sun},
title = {Improving Back-Translation with Uncertainty-based Confidence Estimation},
pages = {791--802},
publisher = {Annual Meeting of the Association for Computational Linguistics},
year = {2019}
}
@article{DBLP:journals/corr/abs200111327,
author = {Idris Abdulmumin and
Bashir Shehu Galadanci and
Abubakar Isa},
title = {Iterative Batch Back-Translation for Neural Machine Translation: {A}
Conceptual Model},
journal = {CoRR},
year = {2020}
}
@article{DBLP:journals/corr/abs200403672,
author = {Zi-Yi Dou and
Antonios Anastasopoulos and
Graham Neubig},
title = {Dynamic Data Selection and Weighting for Iterative Back-Translation},
journal = {CoRR},
year = {2020}
}
@inproceedings{DBLP:conf/emnlp/WuZHGQLL19,
author = {Lijun Wu and
Jinhua Zhu and
Di He and
Fei Gao and
Tao Qin and
Jianhuang Lai and
Tie-Yan Liu},
title = {Machine Translation With Weakly Paired Documents},
pages = {4374--4383},
publisher = {Annual Meeting of the Association for Computational Linguistics},
year = {2019}
}
@article{DBLP:journals/corr/abs-1901-09069,
author = {Felipe Almeida and
Geraldo Xex{\'{e}}o},
title = {Word Embeddings: {A} Survey},
journal = {CoRR},
year = {2019}
}
@article{DBLP:journals/corr/abs-2002-06823,
author = {Jinhua Zhu and
Yingce Xia and
Lijun Wu and
Di He and
Tao Qin and
Wengang Zhou and
Houqiang Li and
Tie-Yan Liu},
title = {Incorporating {BERT} into Neural Machine Translation},
journal = {CoRR},
year = {2020}
}
%%%%% chapter 16------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论