Commit d4d708b2 by zengxin

18

parent 1e8e3be2
\begin{tabular}{c c c}
\begin{tikzpicture}
\begin{scope}
% ,minimum height =1em,minimum width=2em
\tikzstyle{model} = [draw,black,very thick,inner sep=3.5pt,rounded corners=4pt,fill=blue!20,minimum width=4em,minimum height=1.5em,font=\footnotesize]
\tikzstyle{data} = [draw,black,very thick,inner sep=3.5pt,rounded corners=4pt,fill=green!20,minimum width=4em,minimum height=1.5em,font=\footnotesize]
\tikzstyle{word} = [inner sep=3.5pt,font=\footnotesize]
\node[data] (old) at (0,0) {旧数据};
\node[data] (new) at ([xshift=3em]old.east) {新数据};
\node[data] (all) at ([xshift=2.55em,yshift=-4em]old.south) {最终数据};
\node[model] (final_model) at ([xshift=0em,yshift=-4em]all.south) {最终模型};
\draw [->,thick] ([yshift=-0.2em]old.south) .. controls +(south:2.5em) and +(north:2.5em) .. ([xshift=-0.2em,yshift=0.2em]all.north);
\draw [->,thick] ([yshift=-0.2em]new.south) .. controls +(south:2.5em) and +(north:2.5em) .. ([xshift=0.2em,yshift=0.2em]all.north);
\draw [->,thick] ([yshift=-0.2em]all.south) -- ([yshift=0.2em]final_model.north)node[pos=0.5,right,align=center,font=\footnotesize] {训练};
\node[word] at ([yshift=-2em]final_model.south){(a)数据混合};
\end{scope}
\end{tikzpicture}
&
\begin{tikzpicture}
\begin{scope}
\tikzstyle{model} = [draw,black,very thick,inner sep=3.5pt,rounded corners=4pt,fill=blue!20,minimum width=4em,minimum height=1.5em,font=\footnotesize]
\tikzstyle{data} = [draw,black,very thick,inner sep=3.5pt,rounded corners=4pt,fill=green!20,minimum width=4em,minimum height=1.5em,font=\footnotesize]
\tikzstyle{word} = [inner sep=3.5pt,font=\footnotesize]
\node[data] (old) at (0,0) {旧数据};
\node[data] (new) at ([xshift=3em]old.east) {新数据};
\node[model] (old_model) at ([yshift=-4em]old.south) {旧模型};
\node[model] (new_model) at ([yshift=-4em]new.south) {新模型};
\node[model] (final_model) at ([xshift=2.55em,yshift=-4em]old_model.south) {最终模型};
\draw [->,thick] ([yshift=-0.2em]old.south) -- ([yshift=0.2em]old_model.north) node[pos=0.5,left,align=center,font=\footnotesize] {训练};
\draw [->,thick] ([yshift=-0.2em]new.south) -- ([yshift=0.2em]new_model.north) node[pos=0.5,right,align=center,font=\footnotesize] {训练};
\draw [->,thick] ([yshift=-0.2em]old_model.south) .. controls +(south:2.5em) and +(north:2.5em) .. ([xshift=-0.2em,yshift=0.2em]final_model.north);
\draw [->,thick] ([yshift=-0.2em]new_model.south) .. controls +(south:2.5em) and +(north:2.5em) .. ([xshift=0.2em,yshift=0.2em]final_model.north);
\node[word] at ([yshift=2em]final_model.north) {插值};
\node[word] at ([yshift=-2em]final_model.south){(b)模型插值};
%空白占位
\node[word] at ([xshift=-3em]old.west) {};
\node[word] at ([xshift=3em]new.east) {};
\end{scope}
\end{tikzpicture}
&
\begin{tikzpicture}
\begin{scope}
\tikzstyle{model} = [draw,black,very thick,inner sep=3.5pt,rounded corners=4pt,fill=blue!20,minimum width=4em,minimum height=1.5em,font=\footnotesize]
\tikzstyle{data} = [draw,black,very thick,inner sep=3.5pt,rounded corners=4pt,fill=green!20,minimum width=4em,minimum height=1.5em,font=\footnotesize]
\tikzstyle{word} = [inner sep=3.5pt,font=\footnotesize]
\node[data] (old) at (0,0) {旧数据};
\node[data] (new) at ([xshift=3em]old.east) {新数据};
\node[model] (final_model) at ([yshift=-8.8em]new.south) {最终模型};
\draw [->,thick] ([yshift=-0.2em]new.south) -- ([xshift=0.2em,yshift=0.2em]final_model.north) node[pos=0.5,right,align=center,font=\footnotesize] {目标\\函数1};
\draw [->,thick,dashed] ([yshift=-0.2em]old.south) .. controls +(south:4.5em) and +(north:4.5em) .. ([xshift=-0.2em,yshift=0.2em]final_model.north) node[align=center,font=\footnotesize] at ([xshift=-0.1em,yshift=-4em]old.south) {目标\\函数2};
\node[word] at ([yshift=-2em,xshift=-2.55em]final_model.south){(c)多目标训练};
\end{scope}
\end{tikzpicture}
\end{tabular}
\ No newline at end of file
\begin{tabular}{c c}
\begin{tikzpicture}
\begin{scope}
% ,minimum height =1em,minimum width=2em
\tikzstyle{memory} = [draw,black,very thick,inner sep=2pt,rounded corners=0pt,fill=blue!20,minimum width=2em,minimum height=1.5em,anchor=west]
\tikzstyle{thread} = [very thick,inner sep=3.5pt,rounded corners=0pt,minimum width=3em,minimum height=1.5em]
\tikzstyle{word} = [inner sep=3.5pt,font=\scriptsize]
\node[thread] (one) at (0,0) {};
\node [word] at (one.north) {\scriptsize 数据1};
\draw[|-|,very thick] (-1.5em,0em) -- (1.6em,0em);
\node[thread,minimum width=5em] (two) at ([yshift=-1em,xshift=2.6em]one.south east) {};
\node [word] at (two.north) {\scriptsize 数据2};
\draw[|-|,very thick] (1.8em,-1.8em) -- (6.5em,-1.8em);
\node[thread,minimum width=4em] (three) at ([yshift=-1em,xshift=0.3em]two.south east) {};
\node [word] at (three.north) {\scriptsize 数据3};
\draw[|-|,very thick] (5em,-1.8*2em) -- (9em,-1.8*2em);
\node[thread,minimum width=2em] (four) at ([yshift=-1em,xshift=1.2em]three.south east) {};
\node [word] at (four.north) {\scriptsize 数据4};
\draw[|-|,very thick] (9.3em,-1.8*3em) -- (11em,-1.8*3em);
\node [memory] (mone) at ([yshift=4em,xshift=1em]one.north) {};
\node [memory] (mtwo) at ([xshift=0em]mone.east) {};
\node [memory] (mthree) at ([xshift=0em]mtwo.east) {};
\node [memory] (mfour) at ([xshift=0em]mthree.east) {};
\draw[->,very thick] (-0.8,-2.5) -- (4.7,-2.5);
\draw[->,very thick] (-0.8,-2.5) -- (-0.8,1);
\node [word] (time) at ([yshift=-1.5em,xshift=0.3em]four.south) {\scriptsize 时间线};
\node [word] (time) at ([yshift=1.5em,xshift=-2.2em]one.west) {\scriptsize 数据};
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em]one.north) .. controls +(north:1.5em) and +(south:1.5em) .. ([yshift=-0.2em]mone.south);
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em]two.north) -- ([yshift=-0.2em]mtwo.south);
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em,xshift=0.5em]three.north) .. controls +(north:3.5em) and +(south:4.5em) .. ([yshift=-0.2em]mthree.south);
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em]four.north) .. controls +(north:4.5em) and +(south:4.5em) .. ([yshift=-0.2em]mfour.south);
\node [word] at ([yshift=-6em]two.south) {(a)显存不复用};
%占位
\node[word] at ([xshift=1em]four.east) {};
\node [word] at ([xshift=1.5em,yshift=5.6em]one.north) {\scriptsize 显存};
\begin{pgfonlayer}{background}
\node [rectangle,inner sep=0.5em,rounded corners=1pt,minimum width=10em,minimum height=3.6em,fill=gray!10,drop shadow] at ([yshift=6.6em,xshift=1em]two.north) {};
\end{pgfonlayer}
\end{scope}
\end{tikzpicture}
&
\begin{tikzpicture}
\begin{scope}
%\tikzstyle{memory} = [draw,black,very thick,inner sep=2pt,rounded corners=0pt,fill=blue!20,minimum width=2em,minimum height=1.5em,anchor=west]
%\tikzstyle{thread} = [draw,black,very thick,inner sep=3.5pt,rounded corners=0pt,fill=green!20,minimum width=3em,minimum height=1.5em]
\tikzstyle{memory} = [draw,black,very thick,inner sep=2pt,rounded corners=0pt,fill=blue!20,minimum width=2em,minimum height=1.5em,anchor=west]
\tikzstyle{thread} = [very thick,inner sep=3.5pt,rounded corners=0pt,minimum width=3em,minimum height=1.5em]
\tikzstyle{word} = [inner sep=3.5pt,font=\scriptsize]
\node[thread] (one) at (0,0) {};
\node [word] at (one.north) {\scriptsize 数据1};
\draw[|-|,very thick] (-1.5em,0em) -- (1.6em,0em);
\node[thread,minimum width=5em] (two) at ([yshift=-1em,xshift=2.6em]one.south east) {};
\node [word] at (two.north) {\scriptsize 数据2};
\draw[|-|,very thick] (1.8em,-1.8em) -- (6.5em,-1.8em);
\node[thread,minimum width=4em] (three) at ([yshift=-1em,xshift=0.3em]two.south east) {};
\node [word] at (three.north) {\scriptsize 数据3};
\draw[|-|,very thick] (5em,-1.8*2em) -- (9em,-1.8*2em);
\node[thread,minimum width=2em] (four) at ([yshift=-1em,xshift=1.2em]three.south east) {};
\node [word] at (four.north) {\scriptsize 数据4};
\draw[|-|,very thick] (9.3em,-1.8*3em) -- (11em,-1.8*3em);
\node [memory] (mone) at ([yshift=4em,xshift=1em]one.north) {};
\node [memory] (mtwo) at ([xshift=0em]mone.east) {};
\node [memory,fill=white,minimum width=4em] (mthree) at ([xshift=0em]mtwo.east) {};
%\node [memory,fill=white] (mfour) at ([xshift=0em]mthree.east) {};
\draw[->,very thick] (-0.8,-2.5) -- (4.7,-2.5);
\draw[->,very thick] (-0.8,-2.5) -- (-0.8,1);
\node [word] (time) at ([yshift=-1.5em,xshift=0.3em]four.south) {\scriptsize 时间线};
\node [word] (time) at ([yshift=1.5em,xshift=-2.2em]one.west) {\scriptsize 数据};
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em]one.north) .. controls +(north:1.5em) and +(south:1.5em) .. ([yshift=-0.2em,xshift=-0.4em]mone.south);
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em]two.north) .. controls +(north:3.5em) and +(south:3.5em) .. ([yshift=-0.2em,xshift=0.4em]mone.south);
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em,xshift=0.5em]three.north) .. controls +(north:3.5em) and +(south:3.5em) .. ([yshift=-0.2em,xshift=-0.4em]mtwo.south);
\draw [->,dashed,line width=0.7pt] ([yshift=0.5em]four.north) .. controls +(north:4.5em) and +(south:3.5em) .. ([yshift=-0.2em,xshift=0.4em]mtwo.south);
\node [word] at ([xshift=1.5em,yshift=5.6em]one.north) {\scriptsize 显存};
\node [word] at ([yshift=-6em]two.south) {(b)显存复用};
\begin{pgfonlayer}{background}
\node [rectangle,inner sep=0.5em,rounded corners=1pt,minimum width=10em,minimum height=3.6em,fill=gray!10,drop shadow] at ([yshift=6.6em,xshift=1em]two.north) {};
\end{pgfonlayer}
\end{scope}
\end{tikzpicture}
\end{tabular}
\ No newline at end of file
%%% outline
%-------------------------------------------------------------------------
\begin{tikzpicture}[scale=0.8]
\tikzstyle{every node}=[scale=0.8]
\tikzstyle{node}=[rounded corners=4pt, draw,minimum width=3em, minimum height=2em, drop shadow={shadow xshift=0.14em, shadow yshift=-0.14em}]
\begin{scope}
%\draw[fill=yellow!20] (-5em, 0) -- (-6em, 1em) -- (5em, 1em) -- (6em, 0em) -- (5em, -1em) -- (-6em, -1em) -- (-5em, 0em);
%\draw[fill=yellow!20] (-5em, 10em) -- (-6em, 11.2em) -- (5em, 11.2em) -- (6em, 10em) -- (5em,8.8em) -- (-6em, 8.8em) -- (-5em, 10em);
\node[] (n1) at (0,0){小牛翻译的总部在哪里?};
\node[node,fill=blue!20] (c1) at (0, 5em){\scriptsize\bfnew{机器翻译}};
\node[align=left] (n2) at (0,10em){Where is the headquarters \\ of {\color{red} Mavericks Translation}?};
\node [draw,single arrow,inner ysep=0.3em, minimum height=2.4em, rotate=90,fill=cyan!40,very thin] (arrow1) at (0, 2.4em) {};
\node [draw,single arrow,inner ysep=0.3em, minimum height=2em, rotate=90,fill=cyan!40,very thin] (arrow1) at (0, 7.2em) {};
\node[font=\Large,text=red] at (0, -2em){\ding{56}};
\end{scope}
\begin{scope}[xshift=14em]
%\draw[fill=yellow!20] (-5em, 0) -- (-6em, 1em) -- (5em, 1em) -- (6em, 0em) -- (5em, -1em) -- (-6em, -1em) -- (-5em, 0em);
%\draw[fill=yellow!20] (-5em, 10em) -- (-6em, 11.2em) -- (5em, 11.2em) -- (6em, 10em) -- (5em,8.8em) -- (-6em, 8.8em) -- (-5em, 10em);
\node[] (n3) at (0,0){小牛翻译的总部在哪里?};
\node[node,fill=blue!20] (c2) at (-3em, 5em){\scriptsize\bfnew{机器翻译}};
\node[node,fill=red!20] (c3) at (3em, 5em){\scriptsize\bfnew{术语词典}};
\node[font=\scriptsize,draw,inner sep=3pt,fill=red!20,minimum height=1em] (w1) at (9em, 6.5em){小牛翻译};
\node[font=\scriptsize,draw,inner sep=3pt,fill=red!20,minimum height=1em] (w2) at (9em, 3.5em){NiuTrans};
\node[font=\Large] (add) at (0em, 5em){+};
\node[align=left] (n4) at (0,10em){Where is the headquarters \\ of {\color{red} NiuTrans}?};
\node [draw,single arrow,inner ysep=0.3em, minimum height=2.4em, rotate=90,fill=cyan!40,very thin] (arrow1) at (0, 2.4em) {};
\node [draw,single arrow,inner ysep=0.3em, minimum height=2em, rotate=90,fill=cyan!40,very thin] (arrow1) at (0, 7.2em) {};
\draw[dash pattern=on 1pt off 0.5pt,black,line width=1.2pt,->, out=180, in=45] ([xshift=-0.2em]w1.180) to ([xshift=0.2em]c3.20);
\draw[dash pattern=on 1pt off 0.5pt,black,line width=1.2pt,->,out=180,in=-45] ([xshift=-0.2em]w2.180) to ([xshift=0.2em]c3.-20);
\node[font=\Large,text=ugreen] at (0, -2em){\ding{52}};
\end{scope}
\end{tikzpicture}
......@@ -33,17 +33,17 @@
\section{机器翻译的应用并不简单}
\parinterval 机器翻译一直是自然语言处理的热点,无论从评测比赛的结果,还是论文发表数量上看,机器翻译的研究可谓火热。但是,客观的说,我们离机器翻译完美的应用还有相当的距离。这主要是因为,成熟的系统需要很多技术的融合。因此,机器翻译系统研发也是一项复杂的系统工程。而机器翻译研究大多是对局部模型和方法的调整,这也会造成一个现象很多论文里报道的技术方法可能无法直接应用于真实场景的系统。因此,需要关注如何对具体的机器翻译应用问题进行求解,使机器翻译技术能够落地。有几方面挑战:
\parinterval 机器翻译一直是自然语言处理的热点,无论从评测比赛的结果,还是论文发表数量上看,机器翻译的研究可谓火热。但是,客观的说,我们离机器翻译完美的应用还有相当的距离。这主要是因为,成熟的系统需要很多技术的融合。因此,机器翻译系统研发也是一项复杂的系统工程。而机器翻译研究大多是对局部模型和方法的调整,这也会造成一个现象很多论文里报道的技术方法可能无法直接应用于真实场景的系统。因此,需要关注如何对具体的机器翻译应用问题进行求解,使机器翻译技术能够落地。有几方面挑战:
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{机器翻译模型很脆弱}}。实验环境下,给定翻译任务,甚至给定训练和测试数据,机器翻译模型可以表现的很好。但是,应用场景是不断变化的。经常会出现训练数据缺乏、应用领域与训练数据不匹配、用户的测试方法与开发者不同等等一系列问题。特别是,对于不同的任务,神经机器翻译等模型需要进行非常细致的调整,理想中一套``包打天下''的模型和设置是不存在的。这些都导致一个结果:直接使用既有机器翻译模型很难满足真实应用的需求
\item {\small\bfnew{机器翻译模型很脆弱}}。实验环境下,给定翻译任务,甚至给定训练和测试数据,机器翻译模型可以表现的很好。但是,应用场景是不断变化的。经常会出现训练数据缺乏、应用领域与训练数据不匹配、用户的测试方法与开发者不同等等一系列问题。特别是,对于不同的任务,神经机器翻译模型需要进行非常细致的调整,理想中“一套包打天下”的模型和设置是不存在的。这些都导致一个结果:直接使用既有机器翻译模型很难满足不断变化的应用场景
\vspace{0.5em}
\item {\small\bfnew{机器翻译缺少针对场景的应用技术}}。目前为止,机器翻译的研究进展已经为我们提供很好的机器翻译基础模型。但是,用户并不是简单的与这些模型“打交道”,他们更加关注如何解决自身的业务需求,例如,机器翻译应用的交互方式、系统是否可以自己预估翻译可信度等等。甚至,在某些场景中,用户对翻译模型的体积和速度都有非常严格的要求。
\vspace{0.5em}
\item {\small\bfnew{优秀系统的研发需要长时间的打磨}}。工程打磨也是研发优秀机器翻译系统的必备条件,有些时候甚至是决定性的。从科学研究的角度看,我们需要对更本质的科学问题进行探索,而非简单的工程开发与调试。但是,对一个初级的系统进行研究往往会掩盖掉``真正的问题'',因为很多问题在更优秀的系统中并不存在。
\item {\small\bfnew{优秀系统的研发需要长时间的打磨}}。工程打磨也是研发优秀机器翻译系统的必备条件,有些时候甚至是决定性的。从科学研究的角度看,我们需要对更本质的科学问题进行探索,而非简单的工程开发与调试。但是,对一个初级的系统进行研究往往会掩盖掉“真正的问题”,因为很多问题在更优秀的系统中并不存在。
\vspace{0.5em}
\end{itemize}
......@@ -69,22 +69,32 @@
\parinterval 增量训练就是满足上述需求的一种方法。本质上来说,神经机器翻译中使用的随机梯度下降方法就是典型的增量训练方法,其基本思想是:每次选择一个样本对模型进行更新,这个过程反复不断执行,每次模型更新都是一次增量训练。当多个样本构成了一个新数据集时,可以把这些新样本作为训练数据,把当前的模型作为初始模型,之后正常执行机器翻译的训练过程即可。如果新增加的数据量不大(比如,几万句对),训练的代价非常低。
\parinterval 这里面的一个问题是,新的数据虽然能代表一部分的翻译现象,但是如果仅仅依赖新数据进行更新,会使模型对新数据过分拟合,进而造成无法很好地处理新数据之外的样本。这也可以被看做是一种灾难性遗忘的问题{\color{red} 参考文献!},即:模型过分注重对新样本的拟合,丧失了旧模型的一部分能力。解决这个问题,有几种思路:
\parinterval 这里面的一个问题是,新的数据虽然能代表一部分的翻译现象,但是如果仅仅依赖新数据进行更新,会使模型对新数据过分拟合,进而造成无法很好地处理新数据之外的样本。这也可以被看做是一种灾难性遗忘的问题\upcite{DBLP:conf/coling/GuF20},即:模型过分注重对新样本的拟合,丧失了旧模型的一部分能力。解决这个问题,有几种思路:
\begin{itemize}
\vspace{0.5em}
\item 数据混合。在增量训练时,除了使用新的数据,再混合一定量的旧数据,混合的比例可以根据训练的代价进行调整。这样,模型相当于在全量数据的一个采样结果上进行更新。
\item 数据混合\upcite{DBLP:journals/corr/ChuDK17}。在增量训练时,除了使用新的数据,再混合一定量的旧数据,混合的比例可以根据训练的代价进行调整。这样,模型相当于在全量数据的一个采样结果上进行更新。
\vspace{0.5em}
\item 模型插值{\color{red} 参考文献!}。在增量训练之后,将新模型与旧模型进行插值。
\item 模型插值\upcite{DBLP:conf/emnlp/WangULCS17}。在增量训练之后,将新模型与旧模型进行插值。
\vspace{0.5em}
\item 多目标训练{\color{red} 参考文献!}。在增量训练时,除了在新数据上定义损失函数之外,可以再定义一个在旧数据上的损失函数,这样确保模型可以在两个数据上都有较好的表现。另一种方案是引入正则化项,使新模型的参数不会偏离旧模型的参数太远。
\item 多目标训练\upcite{barone2017regularization,DBLP:conf/aclnmt/KhayrallahTDK18,DBLP:conf/naacl/ThompsonGKDK19}。在增量训练时,除了在新数据上定义损失函数之外,可以再定义一个在旧数据上的损失函数,这样确保模型可以在两个数据上都有较好的表现。另一种方案是引入正则化项,使新模型的参数不会偏离旧模型的参数太远。
\vspace{0.5em}
\end{itemize}
\parinterval {\color{red} 图XXX}给出了上述方法的对比。在实际应用中,还有很多细节会影响增量训练的效果,比如,学习率大小的选择等。另外,新的数据积累到何种规模可以进行增量训练也是实践中需要解决问题。一般来说,增量训练使用的数据量越大,训练的效果越稳定。但是,这并不是说数据量少就不可以进行增量训练,而是如果数据量过少时,需要考虑训练代价和效果之间的平衡。而且,过于频繁的增量训练也会带来更多的灾难性遗忘的风险,因此合理进行增量训练也是应用中需要实践的。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter18/Figures/figure-comparison-of-incremental-model-optimization-methods}
%\setlength{\abovecaptionskip}{-0.2cm}
\caption{增量式模型优化方法}
\label{fig:18-1}
\end{figure}
%----------------------------------------------
\parinterval\ref{fig:18-1}给出了上述方法的对比。在实际应用中,还有很多细节会影响增量训练的效果,比如,学习率大小的选择等。另外,新的数据积累到何种规模可以进行增量训练也是实践中需要解决问题。一般来说,增量训练使用的数据量越大,训练的效果越稳定。但是,这并不是说数据量少就不可以进行增量训练,而是如果数据量过少时,需要考虑训练代价和效果之间的平衡。而且,过于频繁的增量训练也会带来更多的灾难性遗忘的风险,因此合理进行增量训练也是应用中需要实践的。
\parinterval 主要注意的是,理想状态下,系统使用者会希望系统看到少量句子就可以很好地解决一类翻译问题,即:进行真正的小样本学习。但是,现实的情况是,现在的机器翻译系统还无法很好的做到“举一反三”。增量训练也需要专业人士完成才能得到相对较好的效果。
......@@ -101,6 +111,38 @@
%----------------------------------------------------------------------------------------
\section{翻译结果可干预性}
\parinterval 尽管目前神经机器翻译的质量已经很高,但语言现象是复杂多样的,模型在一些特定场景下仍然存在问题,最典型的一个是句子中术语的翻译。在实际应用中,经常会遇到公司名称、品牌名称、产品名称等专有名词和行业术语,以及不同含义的缩写,比如对于“小牛翻译”这个专有术语,不同的机器翻译系统给出的结果不一样:“Maverick translation”、“Calf translation”、“The mavericks translation”……而它正确的翻译应该为“NiuTrans”。对于这些类似的特殊词汇,大多数机器翻译引擎很难翻译得准确,一方面,因为模型大多是在通用数据集上训练出来的,并不能保证数据集能涵盖所有的语言现象,另一方面,即使是这些术语在训练数据中出现,它们通常也是低频的,模型比较难学到。为了保证翻译的准确性,对模型的翻译结果进行干预是十分有必要的,这些干预措施在比如交互式机器翻译、领域适应等一系列环境中也是很有用的。
\parinterval{\small\bfnew 术语翻译}\index{术语翻译}(Lexically Constrained Translation)\index{Lexically Constrained Translation}而言,在不干预的情况下让模型直接翻译出正确术语是很难的,因为目标术语翻译词很可能是未登录词,因此必须人为提供额外的术语词典,那么我们的目标就是让模型的翻译输出遵守用户提供的术语约束。一个例子如下图所示:
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter18/Figures/figure-translation-interfered}
%\setlength{\abovecaptionskip}{-0.2cm}
\caption{翻译结果可干预性}
\label{fig:18-2}
\end{figure}
%----------------------------------------------
\parinterval 在统计机器翻译中,翻译过程是基于符号匹配的概率计算和推导,因此在强制某些词的翻译输出方面比较容易,而神经机器翻译是一个端到端训练的模型,内部基于连续空间的实数向量表示,翻译过程本质上是连续空间元素的一系列映射、组合和计算,因此这种干预存在一定的困难。目前主要有两种解决思路:
\begin{itemize}
\item {\small\bfnew 基于硬约束}。在模型解码过程中按照一定的策略来实施约束,这类方法大部分是在修改束搜索算法以强迫输出必须包含指定的词或者短语\upcite{DBLP:conf/acl/HokampL17,DBLP:conf/naacl/PostV18,DBLP:conf/wmt/ChatterjeeNTFSB17,DBLP:conf/naacl/HaslerGIB18}
\item {\small\bfnew 基于软约束}。这类方法本质上属于数据增强类的方法,是通过修改神经机器翻译模型的数据和训练过程来实现约束。通常是根据术语词典对源语句进行一定的修改,比如将目标术语编辑到源语中,之后将原始语料库和合成语料库进行混合训练,期望模型能够自动利用术语信息来指导解码,或者是利用占位符来替换源语中的术语,待翻译完成后再进行还原\upcite{DBLP:conf/naacl/SongZYLWZ19,DBLP:conf/acl/DinuMFA19,DBLP:journals/corr/abs-1912-00567,DBLP:conf/ijcai/ChenCWL20}
\end{itemize}
\parinterval 基于硬约束的方式是在搜索策略上进行限制,与模型无关,这类方法能保证输出满足约束,但是会影响解码速度。基于软约束的方式是通过构造特定格式的数据让模型训练,从而让模型具有一定的泛化能力,这类方法需要进行译前译后编辑,通常不会影响解码速度,但并不能保证输出能满足约束。
\parinterval 此外,神经机器翻译在应用时通常还需要进行译前译后的处理,译前处理指的是在翻译前对源文进行修改和规范,使之适合机器翻译的特点,从而能生成比较顺畅的译文,提高译文的可读性和准确率。在实际应用时,由于用户输入的源文形式多样,可能会包含比如术语、缩写、数学公式等,有些甚至可能还包含网页标签,因此对源文进行预处理是很有必要的。常见的处理工作包括对原文进行格式转换、标点符号检査、术语编辑、标签识别等,待翻译完成后,则需要对机器译文进行进一步的编辑和修正,从而使其符合使用规范,比如进行标点、格式检查,术语、标签还原等,这些过程通常都是按照设定的处理策略自动完成的。
\parinterval 另外机器翻译中还有一些常见的干预(以上具体的内容可以参考{\chapterfourteen}),比如:
\begin{itemize}
\item 译文长度的控制,由于神经机器翻译模型使用单词概率的乘积表示整个句子的翻译概率,因此它天然倾向生成短译文,解决策略是在推断过程中引入译文长度控制机制,本质上是修改模型译文评分函数使其能够感知到长度信息,从而形成约束,比如引入长度惩罚因子、覆盖度等手段;
\item 译文的多样性,神经机器翻译通常会面临$n$-best 输出的译文十分相似的问题,即译文缺乏多样性,这会造成重排序的不准确,而且从人工翻译的角度看,同一个源文的译文应该是多样的,过于相似的译文也无法反映足够多的翻译现象,解决的方法可以从建模和解码出发,比如在引入隐变量来建模或者推断过程中引入额外的模型来惩罚相似的译文等手段。
\end{itemize}
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -110,7 +152,7 @@
\parinterval 在机器翻译研究中,一般会假设计算资源是充足的。但是,在很多应用场景中,机器翻译使用的计算资源非常有限,比如,一些离线设备上没有GPU处理器,而且CPU的处理能力也很弱,甚至内存也非常有限。这时,让模型变得更小、系统变得更快就成为了一个重要的需求。
\parinterval 本书中已经讨论了大量的技术方法,可用于小设备上的机器翻译,例如:
\parinterval 本书中已经讨论了大量的可用于小设备上的机器翻译技术方法,例如:
\begin{itemize}
\vspace{0.5em}
......@@ -126,7 +168,7 @@
\item 面向设备的结构学习({\chapterfifteen})。可以把设备的存储及延时作为目标函数的一部分,自动搜索高效的翻译模型结构。
\vspace{0.5em}
\item 动态适应性模型(引用:王强emnlp findings,还有Adaptive neural networks for fast test-time prediction,Multi-scale dense networks for resource efficient image classification)。模型可以动态调整大小或者计算规模,以达到在不同设备上平衡延时和精度的目的。比如,可以根据延时的要求,动态生成合适深度的神经网络模型进行翻译。
\item 动态适应性模型\upcite{DBLP:conf/emnlp/WangXZ20,DBLP:journals/corr/BolukbasiWDS17,DBLP:conf/iclr/HuangCLWMW18}。模型可以动态调整大小或者计算规模,以达到在不同设备上平衡延时和精度的目的。比如,可以根据延时的要求,动态生成合适深度的神经网络模型进行翻译。
\vspace{0.5em}
\end{itemize}
......@@ -156,10 +198,19 @@
\item GPU部署中,由于GPU成本较高,因此可以考虑在单GPU设备上部署多套不同的系统。如果这些系统之间的并发不频繁,翻译延时不会有明显增加。这种多个模型共享一个设备的方法比较适合翻译请求相对低频但是翻译任务又很多样的情况。
\vspace{0.5em}
\item 机器翻译大规模GPU部署对显存的使用也很严格。由于GPU显存较为有限,因此模型运行的显存消耗也是需要考虑的。一般来说,除了模型压缩和结构优化之外({\chapterfourteen}{\chapterfifteen}),也需要对模型的显存分配和使用进行单独的优化。例如,使用显存池来缓解频繁申请和释放显存空间造成的延时。另外,也可以尽可能让同一个显存块保存生命期不重叠的数据,避免重复开辟新的存储空间。图XXX 展示了一个显存复用的示例。
\item 机器翻译大规模GPU部署对显存的使用也很严格。由于GPU显存较为有限,因此模型运行的显存消耗也是需要考虑的。一般来说,除了模型压缩和结构优化之外({\chapterfourteen}{\chapterfifteen}),也需要对模型的显存分配和使用进行单独的优化。例如,使用显存池来缓解频繁申请和释放显存空间造成的延时。另外,也可以尽可能让同一个显存块保存生命期不重叠的数据,避免重复开辟新的存储空间。图\ref{fig:18-3}展示了一个显存复用的示例。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter18/Figures/figure-memory-multi-use}
%\setlength{\abovecaptionskip}{-0.2cm}
\caption{显存复用示例}
\label{fig:18-3}
\end{figure}
%----------------------------------------------
\vspace{0.5em}
\item 在翻译请求高并发的场景中,使用批量翻译也是有效利用GPU设备的方式。不过,机器翻译是一个处理不定长序列的任务,输入的句子长度差异较大。而且,由于译文长度无法预知,进一步增加了不同长度的句子所消耗计算资源的不确定性。这时,可以让长度相近的句子在一个批次里处理,减小由于句子长度不统一造成的补全过多、设备利用率低的问题。例如,可以按输入句子长度范围分组,如图XXX。 也可以设计更加细致的方法对句子进行分组,以最大化批量翻译中设备的利用率({\color{red} 参考文献:TurboTransformers: An Efficient GPU Serving System For Transformer Models}
\item 在翻译请求高并发的场景中,使用批量翻译也是有效利用GPU设备的方式。不过,机器翻译是一个处理不定长序列的任务,输入的句子长度差异较大。而且,由于译文长度无法预知,进一步增加了不同长度的句子所消耗计算资源的不确定性。这时,可以让长度相近的句子在一个批次里处理,减小由于句子长度不统一造成的补全过多、设备利用率低的问题。例如,可以按输入句子长度范围分组。 也可以设计更加细致的方法对句子进行分组,以最大化批量翻译中设备的利用率\upcite{DBLP:journals/corr/abs-2010-05680}
\vspace{0.5em}
\end{itemize}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论