Commit 94b2cdf8 by 曹润柘

合并分支 'caorunzhe' 到 'master'

Caorunzhe

查看合并请求 !981
parents 6e807eec 05c69cad
......@@ -15,7 +15,7 @@
\node [neuronnode] (neuron_y') at (2.4 * \nodespace,-1.5 * \neuronsep) {\scriptsize{$x_{i}^{l+1}$}};
\node [anchor=north] (standard) at ([yshift=-4em]neuron_z.south) {\scriptsize{标准网络}};
\node [] (standard) at ([xshift=-1em]neuron_z.west) {\scriptsize{$\mathbf{w}_{i}^{l}$}};
\node [] (standard) at ([xshift=-1em]neuron_z.west) {\scriptsize{$\mathbi{w}_{i}^{l}$}};
\node [] (standard) at ([xshift=0.6em,yshift=0.3em]neuron_z.east) {\scriptsize{$f$}};
\draw [->,line width=0.3mm] (neuron_b.east) -- (neuron_z.130);
......@@ -41,7 +41,7 @@
\node [neuronnode] (drop_neuron_r1) at (4.4*\nodespace,-2.5*\neuronsep) {\scriptsize{$r_{1}^{l}$}};
\node [anchor=north] (standard) at ([xshift=2em,yshift=-4em]drop_neuron_z.south) {\scriptsize{应用Dropout后的网络}};
\node [] (standard) at ([xshift=-1em]drop_neuron_z.west) {\scriptsize{$\mathbf{w}_{i}^{l}$}};
\node [] (standard) at ([xshift=-1em]drop_neuron_z.west) {\scriptsize{$\mathbi{w}_{i}^{l}$}};
\node [] (standard) at ([xshift=0.6em,yshift=0.3em]drop_neuron_z.east) {\scriptsize{$f$}};
%structure
\draw [->,line width=0.3mm] (drop_neuron_b.east) -- (drop_neuron_z.130);
......@@ -60,12 +60,12 @@
%equ
\node [anchor=west,inner sep = 2pt] (line1) at (9*\nodespace,0) {未应用Dropout:};
\node [anchor=north west,inner sep = 2pt] (line2) at (line1.south west) {$z_{i}^{l+1}=\mathbf{w}^{l} \mathbf{x}^{l} + b^{l}$};
\node [anchor=north west,inner sep = 2pt] (line2) at (line1.south west) {$z_{i}^{l+1}=\mathbi{w}^{l} \mathbi{x}^{l} + b^{l}$};
\node [anchor=north west,inner sep = 2pt] (line3) at (line2.south west) {$x_{i}^{l+1}=f\left(z_{i}^{l+1}\right)$};
\node [anchor=north west,inner sep = 2pt] (line4) at (line3.south west) {应用Dropout:};
\node [anchor=north west,inner sep = 2pt] (line5) at (line4.south west) {$r_{j}^{l} \sim$ Bernoulli $(1-p)$};
\node [anchor=north west,inner sep = 2pt] (line6) at (line5.south west) {$\tilde{\mathbf{x}}=\mathbf{r} * \mathbf{x}$};
\node [anchor=north west,inner sep = 2pt] (line7) at (line6.south west) {$z_{i}^{l+1}=\mathbf{w}^{l} \widetilde{\mathbf{x}}^{l} + b^{l}$};
\node [anchor=north west,inner sep = 2pt] (line6) at (line5.south west) {$\tilde{\mathbi{x}}=\mathbi{r} * \mathbi{x}$};
\node [anchor=north west,inner sep = 2pt] (line7) at (line6.south west) {$z_{i}^{l+1}=\mathbi{w}^{l} \widetilde{\mathbi{x}}^{l} + b^{l}$};
\node [anchor=north west,inner sep = 2pt] (line8) at (line7.south west) {$x_{i}^{l+1}=f\left(z_{i}^{l+1}\right)$};
\end{tikzpicture}
\ No newline at end of file
......@@ -4,10 +4,10 @@
\begin{scope}[]
% Column 1
\node [prob,minimum size=0.1cm] (prob11) at (0,0) {};
\node [prob,minimum size=0.5cm,anchor=center] (prob21) at ([yshift=-0.5cm]prob11.center) {$.7$};
\node [prob,minimum size=0.5cm,anchor=center] (prob21) at ([yshift=-0.5cm]prob11.center) {$0.7$};
\node [prob,minimum size=0.1cm,anchor=center] (prob31) at ([yshift=-0.5cm]prob21.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob41) at ([yshift=-0.5cm]prob31.center) {};
\node [prob,minimum size=0.3cm,anchor=center] (prob51) at ([yshift=-0.5cm]prob41.center) {$.2$};
\node [prob,minimum size=0.3cm,anchor=center,font=\tiny] (prob51) at ([yshift=-0.5cm]prob41.center) {$0.2$};
\begin{pgfonlayer}{background}
\coordinate (bottomleft) at ([shift={(-0.25cm,-0.25cm)}]prob51.center);
\coordinate (topright) at ([shift={(0.25cm,0.25cm)}]prob11.center);
......@@ -18,8 +18,8 @@
% Column 2
\node [prob,minimum size=0.1cm,anchor=center] (prob12) at ([xshift=1cm]prob11.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob22) at ([yshift=-0.5cm]prob12.center) {};
\node [prob,minimum size=0.4cm,anchor=center] (prob32) at ([yshift=-0.5cm]prob22.center) {$.4$};
\node [prob,minimum size=0.3cm,anchor=center] (prob42) at ([yshift=-0.5cm]prob32.center) {$.3$};
\node [prob,minimum size=0.4cm,anchor=center,font=\tiny] (prob32) at ([yshift=-0.5cm]prob22.center) {0$.4$};
\node [prob,minimum size=0.3cm,anchor=center,font=\tiny] (prob42) at ([yshift=-0.5cm]prob32.center) {$0.3$};
\node [prob,minimum size=0.1cm,anchor=center] (prob52) at ([yshift=-0.5cm]prob42.center) {};
\begin{pgfonlayer}{background}
\coordinate (bottomleft) at ([shift={(-0.25cm,-0.25cm)}]prob52.center);
......@@ -33,7 +33,7 @@
\node [prob,minimum size=0.1cm,anchor=center] (prob23) at ([yshift=-0.5cm]prob13.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob33) at ([yshift=-0.5cm]prob23.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob43) at ([yshift=-0.5cm]prob33.center) {};
\node [prob,minimum size=0.4cm,anchor=center] (prob53) at ([yshift=-0.5cm]prob43.center) {$.6$};
\node [prob,minimum size=0.4cm,anchor=center,font=\tiny] (prob53) at ([yshift=-0.5cm]prob43.center) {$0.6$};
\begin{pgfonlayer}{background}
\coordinate (bottomleft) at ([shift={(-0.25cm,-0.25cm)}]prob53.center);
\coordinate (topright) at ([shift={(0.25cm,0.25cm)}]prob13.center);
......@@ -42,7 +42,7 @@
% \node [anchor=center] (word13) at ([yshift=0.7cm]prob13.center) {fine};
% Column 4
\node [prob,minimum size=0.5cm,anchor=center] (prob14) at ([xshift=1cm]prob13.center) {$.8$};
\node [prob,minimum size=0.5cm,anchor=center] (prob14) at ([xshift=1cm]prob13.center) {$0.8$};
\node [prob,minimum size=0.1cm,anchor=center] (prob24) at ([yshift=-0.5cm]prob14.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob34) at ([yshift=-0.5cm]prob24.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob44) at ([yshift=-0.5cm]prob34.center) {};
......@@ -92,7 +92,7 @@
\begin{scope}[xshift=2.7in]
% Column 1
\node [prob,minimum size=0.1cm] (prob11) at (0,0) {};
\node [prob,minimum size=0.5cm,anchor=center] (prob21) at ([yshift=-0.5cm]prob11.center) {$1.$};
\node [prob,minimum size=0.5cm,anchor=center] (prob21) at ([yshift=-0.5cm]prob11.center) {$1$};
\node [prob,minimum size=0.1cm,anchor=center] (prob31) at ([yshift=-0.5cm]prob21.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob41) at ([yshift=-0.5cm]prob31.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob51) at ([yshift=-0.5cm]prob41.center) {};
......@@ -106,7 +106,7 @@
% Column 2
\node [prob,minimum size=0.1cm,anchor=center] (prob12) at ([xshift=1cm]prob11.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob22) at ([yshift=-0.5cm]prob12.center) {};
\node [prob,minimum size=0.5cm,anchor=center] (prob32) at ([yshift=-0.5cm]prob22.center) {$1.$};
\node [prob,minimum size=0.5cm,anchor=center] (prob32) at ([yshift=-0.5cm]prob22.center) {$1$};
\node [prob,minimum size=0.1cm,anchor=center] (prob42) at ([yshift=-0.5cm]prob32.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob52) at ([yshift=-0.5cm]prob42.center) {};
\begin{pgfonlayer}{background}
......@@ -121,7 +121,7 @@
\node [prob,minimum size=0.1cm,anchor=center] (prob23) at ([yshift=-0.5cm]prob13.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob33) at ([yshift=-0.5cm]prob23.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob43) at ([yshift=-0.5cm]prob33.center) {};
\node [prob,minimum size=0.5cm,anchor=center] (prob53) at ([yshift=-0.5cm]prob43.center) {$1.$};
\node [prob,minimum size=0.5cm,anchor=center] (prob53) at ([yshift=-0.5cm]prob43.center) {$1$};
\begin{pgfonlayer}{background}
\coordinate (bottomleft) at ([shift={(-0.25cm,-0.25cm)}]prob53.center);
\coordinate (topright) at ([shift={(0.25cm,0.25cm)}]prob13.center);
......@@ -130,7 +130,7 @@
\node [anchor=center] (word13) at ([yshift=0.68cm]prob13.center) {good};
% Column 4
\node [prob,minimum size=0.5cm,anchor=center] (prob14) at ([xshift=1cm]prob13.center) {$1.$};
\node [prob,minimum size=0.5cm,anchor=center] (prob14) at ([xshift=1cm]prob13.center) {$1$};
\node [prob,minimum size=0.1cm,anchor=center] (prob24) at ([yshift=-0.5cm]prob14.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob34) at ([yshift=-0.5cm]prob24.center) {};
\node [prob,minimum size=0.1cm,anchor=center] (prob44) at ([yshift=-0.5cm]prob34.center) {};
......
......@@ -20,21 +20,21 @@
\foreach \curr / \prev in {1/0,2/1,3/2}
{
% models
\node[modelnode,fill=yellow!20] (stu\curr1) at ([yshift=-3em]stu\prev1.south) {\rotatebox{90}{学生模型 $1$}};
\node[modelnode,fill=yellow!20] (stu\curr2) at ([yshift=-3em]stu\prev2.south) {\rotatebox{90}{学生模型 $2$}};
\node[modelnode,fill=yellow!20] (stu\curr3) at ([yshift=-3em]stu\prev3.south) {\rotatebox{90}{学生模型 $3$}};
\node[modelnode,fill=yellow!20] (stu\curr4) at ([yshift=-3em]stu\prev4.south) {\rotatebox{90}{学生模型 $4$}};
\node[modelnode,fill=yellow!20] (stu\curr5) at ([yshift=-3em]stu\prev5.south) {\rotatebox{90}{学生模型 $5$}};
\node[modelnode] (tea\curr1) at ([yshift=-3em]tea\prev1.south) {\rotatebox{90}{\color{red!60} 教师模型 $1$}};
\node[modelnode] (tea\curr2) at ([yshift=-3em]tea\prev2.south) {\rotatebox{90}{\color{blue!60} 教师模型 $2$}};
\node[modelnode,fill=yellow!20,align=center] (stu\curr1) at ([yshift=-3em]stu\prev1.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$1$};
\node[modelnode,fill=yellow!20,align=center] (stu\curr2) at ([yshift=-3em]stu\prev2.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$2$};
\node[modelnode,fill=yellow!20,align=center] (stu\curr3) at ([yshift=-3em]stu\prev3.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$3$};
\node[modelnode,fill=yellow!20,align=center] (stu\curr4) at ([yshift=-3em]stu\prev4.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$4$};
\node[modelnode,fill=yellow!20,align=center] (stu\curr5) at ([yshift=-3em]stu\prev5.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$5$};
\node[modelnode,align=center,text=red!60] (tea\curr1) at ([yshift=-3em]tea\prev1.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$1$};
\node[modelnode,align=center,text=blue!60] (tea\curr2) at ([yshift=-3em]tea\prev2.south) {\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]\\[-0.5ex]$2$};
% 集成 labels
\draw[->,very thick] ([xshift=2pt]stu\curr5.east) to node [auto] {\small 集成} ([xshift=-2pt]tea\curr1.west);
}
% iteration labels
\node[font=\small,anchor=east,purple!80] (iterate1) at ([xshift=-1em]stu21.west) {\rotatebox{90}{轮数 $1$}};
\node[font=\small,anchor=east,purple!80] (iterate2) at ([xshift=-1em]stu31.west) {\rotatebox{90}{轮数 $2$}};
\node[font=\small,anchor=east,purple!80,align=center] (iterate1) at ([xshift=-1em]stu21.west) {\\\\$1$};
\node[font=\small,anchor=east,purple!80,align=center] (iterate2) at ([xshift=-1em]stu31.west) {\\\\$2$};
% distillation labels
\node[font=\small,anchor=south west] (distill1) at ([yshift=1.2em]iterate1.north west) {知识蒸馏};
......
......@@ -55,8 +55,8 @@
\node [anchor=south,font=\scriptsize] (w8) at (label7.north) {$0.1$};
\node[font=\scriptsize] (line1) at ([xshift=13em,yshift=-1.5em]model_label7.east) {$Loss =-0.3 \log p_{3}-\sum_{i=1}^{7} 0.1 \log p_{i}$};
\node[font=\scriptsize] (line2) at ([xshift=9.5em,yshift=3em]model_label7.east) {$Loss =-\log p_{3}$};
\node[font=\scriptsize] (line1) at ([xshift=13em,yshift=-1.5em]model_label7.east) {$\textrm{Loss} =-0.3 \log p_{3}-\sum_{i=1}^{7} 0.1 \log p_{i}$};
\node[font=\scriptsize] (line2) at ([xshift=9.5em,yshift=3em]model_label7.east) {$\textrm{Loss} =-\log p_{3}$};
\begin{pgfonlayer}{background}
\node [rectangle,inner sep=0.5em,rounded corners=1pt,very thick,dotted,draw=red] [fit =(model_w3) (model_label1) (model_label7) (one_hot_w3)] (box1) {};
......
......@@ -76,14 +76,14 @@
\parinterval 但是字符级翻译也面临着新的问题\ \dash\ 使用字符增加了系统捕捉不同语言单元之间搭配的难度。假设平均一个单词由5个字符组成,系统所处理的序列长度便增大5倍。这使得具有独立意义的不同语言单元需要跨越更远的距离才能产生联系。此外,基于字符的方法也破坏了单词中天然存在的构词规律,或者说破坏了单词内字符的局部依赖。比如,英语单词“telephone”中的“tele”和“phone”都是有具体意义的词缀,但是如果把它们打散为字符就失去了这些含义。
\parinterval 那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并通过特殊的标记将其与普通的单词区分开来\upcite{luong2016acl_hybrid}。而另一种方式是将单词切分为{\small\bfnew{子词}}\index{子词}(Sub-word)\index{Sub-word},它是介于单词和字符中间的一种语言单元表示形式。比如,将英语单词“doing”切分为“do”+“ing”。对于形态学丰富的语言来说,子词体现了一种具有独立意义的构词基本单元。如图\ref{fig:13-2},子词“do”和“new”可以用于组成其他不同形态的单词。
\parinterval 那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并通过特殊的标记将其与普通的单词区分开来\upcite{luong2016acl_hybrid}。而另一种方式是将单词切分为{\small\bfnew{子词}}\index{子词}(Sub-word)\index{Sub-word},它是介于单词和字符中间的一种语言单元表示形式。比如,将英语单词“doing”切分为“do”+“ing”。对于形态学丰富的语言来说,子词体现了一种具有独立意义的构词基本单元。如图\ref{fig:13-1},子词“do”和“new”可以用于组成其他不同形态的单词。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-word-root}
\caption{不同单词共享相同的子词(前缀)}
\label{fig:13-2}
\label{fig:13-1}
\end{figure}
%----------------------------------------------
......@@ -109,14 +109,14 @@
\parinterval 字节对编码或双字节编码(BPE)是一种常用的子词词表构建方法。BPE方法最早用于数据压缩,该方法将数据中常见的连续字符串替换为一个不存在的字符,之后通过构建一个替换关系的对应表,对压缩后的数据进行还原\upcite{Gage1994ANA}。机器翻译借用了这种思想,把子词切分看作是学习对自然语言句子进行压缩编码表示的问题\upcite{DBLP:conf/acl/SennrichHB16a}。其目的是,保证编码(即子词切分)后的结果占用的字节尽可能少。这样,子词单元会尽可能被不同单词复用,同时又不会因为使用过小的单元造成子词切分后的序列过长。
\parinterval 使用BPE算法进行子词切分包含两个步骤。首先,通过统计的方法构造符号合并表,具体的方式为:先对分过词的文本进行统计,得到词表和词频,同时将词表中的单词分割为字符表示;其次统计词表中所有出现的二元组的频次,选择当前频次最高的二元组加入符号合并表,并将所有词表中出现的该二元组合并为一个单元;不断地重复上述过程,直到合并表的大小达到预先设定的大小,或者无法继续合并。图\ref{fig:13-4}给出了一个使用字符合并表对单词进行子词切分的实例。红色单元为每次合并后得到的新符号,直至无法合并,或遍历结束,得到最终的合并结果。其中每一个单元为一个子词。
\parinterval 使用BPE算法进行子词切分包含两个步骤。首先,通过统计的方法构造符号合并表(见图\ref{fig:13-2}),具体的方式为:先对分过词的文本进行统计,得到词表和词频,同时将词表中的单词分割为字符表示;其次统计词表中所有出现的二元组的频次,选择当前频次最高的二元组加入符号合并表,并将所有词表中出现的该二元组合并为一个单元;不断地重复上述过程,直到合并表的大小达到预先设定的大小,或者无法继续合并。图\ref{fig:13-3}给出了一个使用字符合并表对单词进行子词切分的实例。红色单元为每次合并后得到的新符号,直至无法合并,或遍历结束,得到最终的合并结果。其中每一个单元为一个子词。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-bpe}
\caption{BPE算法中符号合并表的生成过程}
\label{fig:13-3}
\label{fig:13-2}
\end{figure}
%----------------------------------------------
......@@ -125,7 +125,7 @@
\centering
\input{./Chapter13/Figures/figure-unk-of-bpe}
\caption{BPE中的子词切分过程}
\label{fig:13-4}
\label{fig:13-3}
\end{figure}
%----------------------------------------------
......@@ -182,24 +182,24 @@ y &=& f(x)
\vspace{0.5em}
\end{itemize}
\parinterval 以上问题体现出来的现象就是过拟合。因为训练数据有限且存在噪声,因此模型参数会过分拟合噪声数据。而且,这样的模型参数又与真实(理想)的模型参数相差很远。正则化正是针对这个问题。有时候,正则化也被称作{\small\bfnew{降噪}}\index{降噪}(Denoising)\index{Denoising},虽然它的出发点并不只是去除噪声的影响。图\ref{fig:13-11}对比了不同函数对二维空间中一些数据点的拟合情况。在过拟合现象中,函数可以完美的拟合所有的数据点,即使有些数据点是噪声。
\parinterval 以上问题体现出来的现象就是过拟合。因为训练数据有限且存在噪声,因此模型参数会过分拟合噪声数据。而且,这样的模型参数又与真实(理想)的模型参数相差很远。正则化正是针对这个问题。有时候,正则化也被称作{\small\bfnew{降噪}}\index{降噪}(Denoising)\index{Denoising},虽然它的出发点并不只是去除噪声的影响。图\ref{fig:13-4}对比了不同函数对二维空间中一些数据点的拟合情况。在过拟合现象中,函数可以完美的拟合所有的数据点,即使有些数据点是噪声。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-underfitting-vs-overfitting}
\caption{欠拟合 vs 过拟合}
\label{fig:13-11}
\label{fig:13-4}
\end{figure}
%----------------------------------------------
\parinterval 正则化的一种实现是在训练目标中引入一个正则项。在神经机器翻译中,引入正则项的训练目标为:
\begin{eqnarray}
\widehat{\mathbi{w}} &=& \argmin_{\mathbi{w}}Loss(\mathbi{w}) + \lambda R(\mathbi{w})
\widehat{\mathbi{w}} &=& \argmin_{\mathbi{w}}\textrm{Loss}(\mathbi{w}) + \lambda R(\mathbi{w})
\label{eq:13-2}
\end{eqnarray}
\noindent 其中,$\mathbi{w}$是模型参数,$Loss(\mathbi{w})$是损失函数,$R(\mathbi{w})$是正则项,$\lambda$是正则项的系数,用于控制正则化对训练影响的程度。$R(\mathbi{w})$通常也可以被看作是一种先验,因为在数据不充分且存在噪声的情况下,可以根据一些先验知识让模型偏向正确的方向一些,而不是一味地根据受噪声影响的$Loss(\mathbi{w})$进行优化。相应的,引入正则化后的模型可以获得更好的{\small\bfnew{泛化}}\index{泛化}(Generalization)\index{Generalization}能力,即模型在新的未见数据上表现会更好。
\noindent 其中,$\mathbi{w}$是模型参数,$\textrm{Loss}(\mathbi{w})$是损失函数,$R(\mathbi{w})$是正则项,$\lambda$是正则项的系数,用于控制正则化对训练影响的程度。$R(\mathbi{w})$通常也可以被看作是一种先验,因为在数据不充分且存在噪声的情况下,可以根据一些先验知识让模型偏向正确的方向一些,而不是一味地根据受噪声影响的$\textrm{Loss}(\mathbi{w})$进行优化。相应的,引入正则化后的模型可以获得更好的{\small\bfnew{泛化}}\index{泛化}(Generalization)\index{Generalization}能力,即模型在新的未见数据上表现会更好。
\parinterval 实践中已经证明,正则化方法有助于使得像神经机器翻译模型这样复杂模型获得稳定的模型参数。甚至有些情况下,如果不引入正则化,训练得到的翻译模型根本无法使用。此外,正则化方法不仅可以用于提高模型的泛化能力,也可以作为干预模型学习的一种手段,比如,可以将一些先验知识作为正则项约束机器翻译模型的学习。类似的手段在本书后续的内容中也会被使用。
......@@ -245,14 +245,14 @@ R(\mathbi{w}) & = & ({\Vert{\mathbi{w}}\Vert}_2)^2 \\
\noindent 这里,$\alpha$表示一个系数,用于控制分布$\mathbi{q}$的重要性,$\mathbi{y}_{j}^{ls}$表示使用标签平滑后的学习目标。
\parinterval 标签平滑实际上定义了一种“软”标签,使得所有标签都可以分到一些概率。一方面可以缓解数据中噪声的影响,另一方面目标分布会更合理(显然,真实的分布不应该是One-hot分布)。图\ref{fig:13-6}展示了标签平滑前后的损失函数计算结果的对比。
\parinterval 标签平滑实际上定义了一种“软”标签,使得所有标签都可以分到一些概率。一方面可以缓解数据中噪声的影响,另一方面目标分布会更合理(显然,真实的分布不应该是One-hot分布)。图\ref{fig:13-5}展示了标签平滑前后的损失函数计算结果的对比。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-label-smoothing}
\caption{不使用标签平滑 vs 使用标签平滑}
\label{fig:13-6}
\label{fig:13-5}
\end{figure}
%----------------------------------------------
......@@ -264,29 +264,29 @@ R(\mathbi{w}) & = & ({\Vert{\mathbi{w}}\Vert}_2)^2 \\
\subsection{Dropout}
\parinterval 神经机器翻译模型是一种典型的多层神经网络模型。每一层都包含若干神经元,负责接收前一层所有神经元的输出,之后进行诸如乘法、加法等变换操作,并有选择地使用非线性的激活函数,最终得到当前层每个神经元的输出。从模型最终预测的角度看,每个神经元都在参与最终的预测。理想的情况下,研究人员希望每个神经元都能相互独立的做出“贡献”。这样的模型会更加健壮,因为即使一部分神经元不能正常工作,其它神经元仍然可以独立做出合理的预测。但是,随着每一层神经元数量的增加以及网络结构的复杂化,神经元之间会出现{\small\bfnew{相互适应}}\index{相互适应}(Co-Adaptation)\index{Co-Adaptation}的现象。所谓相互适应是指,一个神经元对输出的贡献与同一层其它神经元的行为是相关的,也就是说这个神经元已经适应到它周围的“环境”中。
\parinterval 神经机器翻译模型是一种典型的多层神经网络模型。每一层都包含若干神经元,负责接收前一层所有神经元的输出,之后进行诸如乘法、加法等变换操作,并有选择地使用非线性的激活函数,最终得到当前层每个神经元的输出。从模型最终预测的角度看,每个神经元都在参与最终的预测。理想的情况下,研究人员希望每个神经元都能相互独立的做出“贡献”。这样的模型会更加健壮,因为即使一部分神经元不能正常工作,其它神经元仍然可以独立做出合理的预测。但是,随着每一层神经元数量的增加以及网络结构的复杂化,神经元之间会出现{\small\bfnew{相互适应}}\index{相互适应}(Co-adaptation)\index{Co-adaptation}的现象。所谓相互适应是指,一个神经元对输出的贡献与同一层其它神经元的行为是相关的,也就是说这个神经元已经适应到它周围的“环境”中。
\parinterval 相互适应的好处在于神经网络可以处理更加复杂的问题,因为联合使用两个神经元要比单独使用每个神经元的表示能力强。这也类似于传统机器学习任务中往往会设计一些高阶特征,比如自然语言序列标注中对2-gram和3-gram的使用。不过另一方面,相互适应会导致模型变得更加“脆弱”。因为相互适应的神经元可以更好的描述训练数据中的现象,但是在测试数据上,由于很多现象是未见的,细微的扰动会导致神经元无法适应。具体体现出来就是过拟合问题。
\parinterval Dropout也是解决过拟合问题的一种常用方法\upcite{DBLP:journals/corr/abs-1207-0580}。该方法很简单,在训练时随机让一部分神经元停止工作,这样每次参数更新中每个神经元周围的环境都在变化,它就不会过分适应到环境中。图\ref{fig:13-7}中给出了某一次参数更新中使用Dropout之前和之后神经网络的状态对比。
\parinterval Dropout也是解决过拟合问题的一种常用方法\upcite{DBLP:journals/corr/abs-1207-0580}。该方法很简单,在训练时随机让一部分神经元停止工作,这样每次参数更新中每个神经元周围的环境都在变化,它就不会过分适应到环境中。图\ref{fig:13-6}中给出了某一次参数更新中使用Dropout之前和之后神经网络的状态对比。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-network-with-dropout}
\caption{使用Dropout之前(左)和之后(右)神经网络状态的对比}
\label{fig:13-7}
\label{fig:13-6}
\end{figure}
%----------------------------------------------
\parinterval 具体实现时,可以设置一个参数$p \in (0,1)$。在每次参数更新所使用的前向和反向计算中,每个神经元都以概率$p$停止工作。相当于每层神经网络会有以$p$为概率的神经元被“屏蔽”掉。每一次参数更新中会随机屏蔽不同的神经元,图\ref{fig:13-8}给出了Dropout方法和传统方法计算方式的对比。其中,$x_{i}^{l}$代表第$l$层神经网络的第$i$个输入,$w_{i}^{l}$为输入所对应的权重,$b^{l}$表示第$l$层神经网络输入的偏置,$z_{i}^{l+1}$表示第$l$层神经网络的线性运算的结果,$f(\cdot)$表示激活函数,$r_{i}^{l}$的值服从于参数为$1-p$的伯努利分布。
\parinterval 具体实现时,可以设置一个参数$p \in (0,1)$。在每次参数更新所使用的前向和反向计算中,每个神经元都以概率$p$停止工作。相当于每层神经网络会有以$p$为概率的神经元被“屏蔽”掉。每一次参数更新中会随机屏蔽不同的神经元,图\ref{fig:13-7}给出了Dropout方法和传统方法计算方式的对比。其中,$x_{i}^{l}$代表第$l$层神经网络的第$i$个输入,$w_{i}^{l}$为输入所对应的权重,$b^{l}$表示第$l$层神经网络输入的偏置,$z_{i}^{l+1}$表示第$l$层神经网络的线性运算的结果,$f(\cdot)$表示激活函数,$r_{i}^{l}$的值服从于参数为$1-p$的伯努利分布。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-computation-of-dropout}
\caption{使用Dropout之前(左)和之后(右)一层神经网络}
\label{fig:13-8}
\label{fig:13-7}
\end{figure}
%----------------------------------------------
......@@ -380,7 +380,7 @@ R(\mathbi{w}) & = & ({\Vert{\mathbi{w}}\Vert}_2)^2 \\
\parinterval 在机器翻译中,常用的回译技术也是生成对抗样本的一种有效方式。回译就是,通过反向模型将目标语言翻译成源语言,并将翻译得到的双语数据用于模型训练(见{\chaptersixteen})。除了翻译模型,语言模型也可以用于生成对抗样本。{\chaptertwo}已经介绍过,语言模型可以用于检测句子的流畅度,它根据上文预测当前位置可能出现的单词。因此,此时可以使用语言模型预测出当前位置最可能出现的多个单词,并用这些词替换序列中原本的单词。在机器翻译任务中,可以通过与神经机器翻译系统联合训练,共享词向量矩阵的方式得到语言模型\upcite{DBLP:conf/acl/GaoZWXQCZL19}
\parinterval 此外,{\small\bfnew{生成对抗网络}}\index{生成对抗网络}(Generative Adversarial Networks\index{Generative Adversarial Networks}, GANs)也可以被用来生成对抗样本\upcite{DBLP:conf/iclr/ZhaoDS18}。与回译方法类似,基于生成对抗网络的方法将原始的输入映射为潜在分布$\funp{P}$,并在其中搜索出服从相同分布的文本构成对抗样本。一些研究也对这种方法进行了优化\upcite{DBLP:conf/iclr/ZhaoDS18},在稠密的向量空间中进行搜索,也就是说在定义$\funp{P}$的基础稠密向量空间中找到对抗性表示$\mathbi{z}'$,然后利用生成模型将其映射回$\mathbi{x}'$,使最终生成的对抗样本在语义上接近原始输入。
\parinterval 此外,{\small\bfnew{生成对抗网络}}\index{生成对抗网络}(Generative Adversarial Networks\index{Generative Adversarial Networks}GANs)也可以被用来生成对抗样本\upcite{DBLP:conf/iclr/ZhaoDS18}。与回译方法类似,基于生成对抗网络的方法将原始的输入映射为潜在分布$\funp{P}$,并在其中搜索出服从相同分布的文本构成对抗样本。一些研究也对这种方法进行了优化\upcite{DBLP:conf/iclr/ZhaoDS18},在稠密的向量空间中进行搜索,也就是说在定义$\funp{P}$的基础稠密向量空间中找到对抗性表示$\mathbi{z}'$,然后利用生成模型将其映射回$\mathbi{x}'$,使最终生成的对抗样本在语义上接近原始输入。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -404,14 +404,14 @@ R(\mathbi{w}) & = & ({\Vert{\mathbi{w}}\Vert}_2)^2 \\
\parinterval 在进行对抗性训练时,可以在原有的训练损失上增加三个额外的损失,最终的损失函数被定义为:
\begin{eqnarray}
Loss(\theta_{\textrm{mt}},\theta_{\textrm{lm}}^{\mathbi{x}},\theta_{\textrm{lm}}^{\mathbi{y}}) &=& Loss_{\textrm{clean}}(\theta_{\textrm{mt}}) + Loss_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{x}}) + \nonumber \\
& & Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) + Loss_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{y}})
\textrm{Loss}(\theta_{\textrm{mt}},\theta_{\textrm{lm}}^{\mathbi{x}},\theta_{\textrm{lm}}^{\mathbi{y}}) &=& \textrm{Loss}_{\textrm{clean}}(\theta_{\textrm{mt}}) + \textrm{Loss}_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{x}}) + \nonumber \\
& & \textrm{Loss}_{\textrm{robust}}(\theta_{\textrm{mt}}) + \textrm{Loss}_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{y}})
\label{eq:13-11}
\end{eqnarray}
\noindent 其中,$Loss_{\textrm{clean}}(\theta_{\textrm{mt}})$为正常情况下的损失,$Loss_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{x}})$$Loss_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{y}})$为生成对抗样本所用到的源语言与目标语言的模型的损失,$Loss_{\textrm{robust}}(\theta_{\textrm{mt}})$是使用修改后得到的对抗样本作为输入,并以原始的译文$\mathbi{y}$作为答案时计算得到的损失。假设有$N$个样本,则损失函数的具体形式如下:
\noindent 其中,$\textrm{Loss}_{\textrm{clean}}(\theta_{\textrm{mt}})$为正常情况下的损失,$\textrm{Loss}_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{x}})$$\textrm{Loss}_{\textrm{lm}}(\theta_{\textrm{lm}}^{\mathbi{y}})$为生成对抗样本所用到的源语言与目标语言的模型的损失,$\textrm{Loss}_{\textrm{robust}}(\theta_{\textrm{mt}})$是使用修改后得到的对抗样本作为输入,并以原始的译文$\mathbi{y}$作为答案时计算得到的损失。假设有$N$个样本,则损失函数的具体形式如下:
\begin{eqnarray}
Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\mathbi{y})}-\log \funp{P}(\mathbi{y}|\mathbi{x}',\mathbi{y}';\theta_{\textrm{mt}})
\textrm{Loss}_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\mathbi{y})}-\log \funp{P}(\mathbi{y}|\mathbi{x}',\mathbi{y}';\theta_{\textrm{mt}})
\label{eq:13-12}
\end{eqnarray}
......@@ -436,7 +436,7 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{曝光偏置问题}}。在训练过程中,模型使用标注数据进行训练,因此模型在预测下一个单词时,解码器的输入是正确的译文片段。也就是,预测第$j$个单词时,系统使用了标准答案$\{{y}_1,...,{y}_{j-1}\}$作为历史信息。但是对新的句子进行翻译时,预测第$j$个单词时使用的是模型自己生成的前$j-1$个单词,即$\{\hat{{y}}_1,...,\hat{{y}}_{j-1}\}$。这意味着,训练时使用的输入数据(目标语言端)与真实翻译时的情况不符,如图\ref{fig:13-9} 所示。由于在训练过程中暴露于标注数据,因此模型也适应了标注数据,在推断阶段无法很好地适应模型自动生成的数据,这就是曝光偏置问题\upcite{Bengio2015ScheduledSF,Ranzato2016SequenceLT}
\item {\small\bfnew{曝光偏置问题}}。在训练过程中,模型使用标注数据进行训练,因此模型在预测下一个单词时,解码器的输入是正确的译文片段。也就是,预测第$j$个单词时,系统使用了标准答案$\{{y}_1,...,{y}_{j-1}\}$作为历史信息。但是对新的句子进行翻译时,预测第$j$个单词时使用的是模型自己生成的前$j-1$个单词,即$\{\hat{{y}}_1,...,\hat{{y}}_{j-1}\}$。这意味着,训练时使用的输入数据(目标语言端)与真实翻译时的情况不符,如图\ref{fig:13-8}所示。由于在训练过程中暴露于标注数据,因此模型也适应了标注数据,在推断阶段无法很好地适应模型自动生成的数据,这就是曝光偏置问题\upcite{Bengio2015ScheduledSF,Ranzato2016SequenceLT}
\vspace{0.5em}
%----------------------------------------------
......@@ -444,7 +444,7 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\centering
\input{./Chapter13/Figures/figure-exposure-bias}
\caption{曝光偏置问题(基于循环神经网络的翻译模型)}
\label{fig:13-9}
\label{fig:13-8}
\end{figure}
%----------------------------------------------
......@@ -466,14 +466,14 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\subsubsection{1. 调度采样}
\parinterval 对于一个目标语言序列$\seq{y}=\{{y}_1,\ldots,{y}_n\}$,在预测第$j$个单词时,训练过程与推断过程之间的主要区别在于:训练过程中使用标准答案$\{{y}_{1},...,{y}_{j-1}\}$,而推断过程使用的是来自模型本身的预测结果$\{\hat{{y}}_{1},...,\hat{{y}}_{j-1}\}$。此时可以采取一种{\small\bfnew{调度采样}}\index{调度采样}(Scheduled Sampling\index{Scheduled Sampling})机制\upcite{Bengio2015ScheduledSF}。以基于循环神经网络的模型为例,在训练中预测第$j$个单词时,随机决定使用${y}_{j-1}$还是$\hat{{y}}_{j-1}$作为输入。 假设训练时使用的是基于小批量的随机梯度下降方法,在第$i$ 个批次中,对序列每一个位置进行预测时以概率$\epsilon_i$使用标准答案${y}_{j-1}$,或以概率${1-\epsilon_i}$使用来自模型本身的预测$\hat{{y}}_{j-1}$。具体到序列中的一个位置$j$,可以根据模型单词预测的概率进行采样,在$\epsilon_i$控制的调度策略下,同${y}_{j-1}$一起作为输入。此过程如图\ref{fig:13-10}所示,并且这个过程可以很好地与束搜索融合。
\parinterval 对于一个目标语言序列$\seq{y}=\{{y}_1,\ldots,{y}_n\}$,在预测第$j$个单词时,训练过程与推断过程之间的主要区别在于:训练过程中使用标准答案$\{{y}_{1},...,{y}_{j-1}\}$,而推断过程使用的是来自模型本身的预测结果$\{\hat{{y}}_{1},...,\hat{{y}}_{j-1}\}$。此时可以采取一种{\small\bfnew{调度采样}}\index{调度采样}(Scheduled Sampling\index{Scheduled Sampling})机制\upcite{Bengio2015ScheduledSF}。以基于循环神经网络的模型为例,在训练中预测第$j$个单词时,随机决定使用${y}_{j-1}$还是$\hat{{y}}_{j-1}$作为输入。 假设训练时使用的是基于小批量的随机梯度下降方法,在第$i$ 个批次中,对序列每一个位置进行预测时以概率$\epsilon_i$使用标准答案${y}_{j-1}$,或以概率${1-\epsilon_i}$使用来自模型本身的预测$\hat{{y}}_{j-1}$。具体到序列中的一个位置$j$,可以根据模型单词预测的概率进行采样,在$\epsilon_i$控制的调度策略下,同${y}_{j-1}$一起作为输入。此过程如图\ref{fig:13-9}所示,并且这个过程可以很好地与束搜索融合。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-of-scheduling-sampling-method}
\caption{调度采样方法的示意图}
\label{fig:13-10}
\label{fig:13-9}
\end{figure}
%----------------------------------------------
......@@ -499,14 +499,14 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\parinterval 调度采样解决曝光偏置的方法是,把模型前$j-1$步的预测结果作为输入,来预测第$j$步的输出。但是,如果模型预测的结果中有错误,再使用错误的结果预测未来的序列也会产生问题。解决这个问题就需要知道模型预测的好与坏,并在训练中有效的使用它们。如果生成好的结果,那么可以使用它进行模型训练,否则就不使用。生成对抗网络就是这样一种技术,它引入了一个额外的模型(判别器)来对原有模型(生成器)的生成结果进行评价,并根据评价结果同时训练两个模型。
\parinterval\ref{sec:adversarial-examples}小节已经提到了生成对抗网络,这里稍微进行一些展开。 在机器翻译中,基于对抗神经网络的架构被命名为{\small\bfnew{对抗神经机器翻译}}\index{对抗神经机器翻译}(Adversarial-NMT)\index{Adversarial-NMT}\upcite{DBLP:conf/acml/WuXTZQLL18}。这里,令$(\seq{x},\seq{y})$表示一个训练样本,令$\hat{\seq{y}}$ 表示神经机器翻译系统对源语言句子$\seq{x}$ 的翻译结果。此时,对抗神经机器翻译的总体框架可以表示为图\ref{fig:13-11},其中。绿色部分表示神经机器翻译模型$G$,该模型将源语言句子$\seq{x}$翻译为目标语言句子$\hat{\seq{y}}$。红色部分是对抗网络$D$,它的作用是判断目标语言句子是否是源语言句子$\seq{x}$ 的真实翻译。$G$$D$相互对抗,用$G$生成的翻译结果$\hat{\seq{y}}$来训练$D$,并生成奖励信号,再使用奖励信号通过策略梯度训练$G$
\parinterval\ref{sec:adversarial-examples}小节已经提到了生成对抗网络,这里稍微进行一些展开。 在机器翻译中,基于对抗神经网络的架构被命名为{\small\bfnew{对抗神经机器翻译}}\index{对抗神经机器翻译}(Adversarial-NMT)\index{Adversarial-NMT}\upcite{DBLP:conf/acml/WuXTZQLL18}。这里,令$(\seq{x},\seq{y})$表示一个训练样本,令$\hat{\seq{y}}$ 表示神经机器翻译系统对源语言句子$\seq{x}$ 的翻译结果。此时,对抗神经机器翻译的总体框架可以表示为图\ref{fig:13-10},其中。绿色部分表示神经机器翻译模型$G$,该模型将源语言句子$\seq{x}$翻译为目标语言句子$\hat{\seq{y}}$。红色部分是对抗网络$D$,它的作用是判断目标语言句子是否是源语言句子$\seq{x}$ 的真实翻译。$G$$D$相互对抗,用$G$生成的翻译结果$\hat{\seq{y}}$来训练$D$,并生成奖励信号,再使用奖励信号通过策略梯度训练$G$
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-framework-of-Adversarial-Neural-machine-translation}
\caption{对抗神经机器翻译框架图}
\label{fig:13-11}
\label{fig:13-10}
\end{figure}
%----------------------------------------------
......@@ -543,11 +543,11 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\noindent 这里,$\hat{\seq{y}}$是模型预测的译文,$\chi(\seq{x}^{[k]})$$\seq{x}^{[k]}$所对应的所有候选翻译的集合。损失函数$\vartriangle(\hat{\seq{y}},\seq{y}^{[k]})$用来衡量模型预测$\hat{\seq{y}}$与标准答案$\seq{y}^{[k]}$间的差异,损失函数一般用翻译质量评价指标定义,例如,BLEU,TER等\footnote{对于BLEU,损失函数可以被定义为$1-$BLEU。}。在最小风险训练中,对模型参数$\theta$的偏导数为:
\begin{eqnarray}
\frac{\partial \funp{R}(\theta)}{\partial \theta} & = & \sum_{k=1}^N \mathbb{E}_{\hat{\seq{y}}|\seq{x}^{[k]};\theta}[\vartriangle(\hat{\seq{y}},\seq{y}^{[k]}) \times \frac{\partial \funp{P}(\hat{\seq{y}}|\seq{x}^{[k]};\theta)/\partial \theta}{\funp{P}(\hat{\seq{y}}|\seq{x}^{[k]};\theta)}] \nonumber \\
& = & {\red \sum_{k=1}^N \mathbb{E}_{\hat{\seq{y}}|\seq{x}^{[k]};\theta}[\vartriangle(\hat{\seq{y}},\seq{y}^{[k]}) \times \frac{\partial \log{\funp{P}(\hat{\seq{y}}|\seq{x}^{[k]};\theta)}}{\partial \theta}]}
& = & \sum_{k=1}^N \mathbb{E}_{\hat{\seq{y}}|\seq{x}^{[k]};\theta}[\vartriangle(\hat{\seq{y}},\seq{y}^{[k]}) \times \frac{\partial \log{\funp{P}(\hat{\seq{y}}|\seq{x}^{[k]};\theta)}}{\partial \theta}]
\label{eq:13-15}
\end{eqnarray}
\noindent 公式\eqref{eq:13-15}使用了{\small\bfnew{策略梯度}}\index{策略梯度}(Policy Gradient\index{Policy Gradient})的手段将$\vartriangle(\hat{\seq{y}},\seq{y}^{[k]})$提到微分操作之外\upcite{DBLP:conf/nips/Kakade01,DBLP:journals/corr/abs-1810-02525}。这样,就无需对$\vartriangle(\hat{\seq{y}},\seq{y}^{[k]})$进行微分,因此最小风险训练允许任意不可微的损失函数,包括BLEU等常用的评价函数。{\red 同时,等式右侧将对概率的求导操作转化为了对log函数的求导,更易于模型进行优化。因此,}使用公式\eqref{eq:13-15}就可以求出模型参数相对于风险函数的损失,进而进行基于梯度的优化。
\noindent 公式\eqref{eq:13-15}使用了{\small\bfnew{策略梯度}}\index{策略梯度}(Policy Gradient\index{Policy Gradient})的手段将$\vartriangle(\hat{\seq{y}},\seq{y}^{[k]})$提到微分操作之外\upcite{DBLP:conf/nips/Kakade01,DBLP:journals/corr/abs-1810-02525}。这样,就无需对$\vartriangle(\hat{\seq{y}},\seq{y}^{[k]})$进行微分,因此最小风险训练允许任意不可微的损失函数,包括BLEU等常用的评价函数。同时,等式右侧将对概率的求导操作转化为了对log函数的求导,更易于模型进行优化。因此,使用公式\eqref{eq:13-15}就可以求出模型参数相对于风险函数的损失,进而进行基于梯度的优化。
\parinterval 这里需要注意的是,公式\eqref{eq:13-15}中求期望的过程是无法直接实现的,因为无法遍历所有的译文句子。通常,会使用采样的方法搜集一定数量的译文,来模拟译文空间。例如,可以使用推断系统生成若干译文。同时,为了保证生成的译文之间具有一定的差异性,也可以对推断过程进行一些“干扰”。从实践的角度看,采样方法是影响强化学习系统的重要因素,因此往往需要对不同的任务设计相适应的采样方法。最简单的方法就是在产生译文的每一个词时候,根据模型产生的下一个词的分布随机选取词当作模型预测,直到选到句子结束符或者达到特定长度的时候停止\upcite{DBLP:conf/emnlp/EdunovOAG18}。其他方法还包括随机束搜索,它把束搜索中选取Top-$k$的操作替换成随机选取$k$个词。这个方法不会采集到重复的样本。还可以使用基于Gumbel-Top-$k$的随机束搜索更好地控制了样本里的噪声\upcite{DBLP:conf/icml/KoolHW19}
......@@ -575,13 +575,8 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
& & \sum_{i=j}^J\funp{r}_i(\hat{{y}}_i;\hat{{y}}_{1 \ldots j-1}a\hat{{y}}_{j+1 \ldots i},\seq{y})]
\label{eq:13-16}
\end{eqnarray}
{\blue ---------------------------------------------讨论\\
{{ (学长,$\sum_{i=j+1}^J\funp{r}_i(\hat{{y}}_i;\hat{{y}}_{1 \ldots j-1}a\hat{{y}}_{j+1 \ldots i},\seq{y})$想表达的应该是:\\$\funp{r}_{j+1}(\hat{{y}}_{j+1};\hat{{y}}_{1 \ldots j-1}a,\seq{y})$\\$\funp{r}_{j+2}(\hat{{y}}_{j+2};\hat{{y}}_{1 \ldots j-1}a\hat{{y}}_{j+1},\seq{y})$\\$\funp{r}_{j+3}(\hat{{y}}_{j+3};\hat{{y}}_{1 \ldots j-1}a\hat{{y}}_{j+1,j+2},\seq{y})$\\$\cdots$\\这些项的加和对吧,那$a$后面的$y$的最后一项改成$i-1$也不合理,因为$i-1$就是$j$,会跟$a$重复(因为$a$也是$\hat{{y}}_j$,只不过$\hat{{y}}_j$是固定的状态,$a$是任意动作),要不这里就把a改成$\hat{{y}}_j$行吗?或者$a_{\hat{{y}}_j}$这种形式,但是这种形式仍然会和$a$后面的加和冲突。)}}
{{ 学长觉得这样行吗,公式1.16把a删掉,改成:$\sum_{i=j}^J\funp{r}_i(\hat{{y}}_i;\hat{{y}}_{1 \ldots j-1}\hat{{y}}^{a}_{j \ldots i},\seq{y})$,(下面的段落加说明,此处的$\hat{{y}}^{a}_{j \ldots i}$表示由动作a决定的$\hat{{y}}_{j \ldots i}$\\}}
---------------------------------------------讨论\\
}
\noindent 其中,$\funp{r}_j(a;\hat{{y}}_{1 \ldots j-1},\seq{y})$$j$时刻做出行动$a$获得的奖励,$\funp{r}_i(\hat{{y}}_i;\hat{{y}}_{1 \ldots j-1}a\hat{{y}}_{j+1 \ldots i},\seq{y})$是在$j$时刻的行动为$a$的前提下,$i$时刻的做出行动$\hat{{y}}_i$获得的奖励,{\red $\hat{y}_{j+1 \ldots J} \sim \funp{p}(\cdot|\hat{y}_{1 \ldots j-1} a,\seq{x})$表示序列$\hat{y}_{j+1 \ldots J}$是根据$\funp{p}(\cdot|\hat{y}_{1 \ldots j-1} a,\seq{x})$得到的采样结果,概率函数$\funp{p}$中的$\cdot$表示序列$\hat{y}_{j+1 \ldots J}$服从的随机变量,}$\seq{x}$是源语言句子,$\seq{y}$是正确译文,$\hat{{y}}_{1 \ldots j-1}$是策略$\funp{p}$产生的译文的前$j-1$个词,$J$是生成译文的长度。{\red 特别的,对于公式\ref{eq:13-16}$\hat{{y}}_{j+1 \ldots i}$来说,如果$i<j+1$,则$\hat{{y}}_{j+1 \ldots i}$不存在,}对于源语句子$x$,最优策略$\hat{p}$可以被定义为:
\noindent 其中,$\funp{r}_j(a;\hat{{y}}_{1 \ldots j-1},\seq{y})$$j$时刻做出行动$a$获得的奖励,$\funp{r}_i(\hat{{y}}_i;\hat{{y}}_{1 \ldots j-1}a\hat{{y}}_{j+1 \ldots i},\seq{y})$是在$j$时刻的行动为$a$的前提下,$i$时刻的做出行动$\hat{{y}}_i$获得的奖励,$\hat{y}_{j+1 \ldots J} \sim \funp{p}(\cdot|\hat{y}_{1 \ldots j-1} a,\seq{x})$表示序列$\hat{y}_{j+1 \ldots J}$是根据$\funp{p}(\cdot|\hat{y}_{1 \ldots j-1} a,\seq{x})$得到的采样结果,概率函数$\funp{p}$中的$\cdot$表示序列$\hat{y}_{j+1 \ldots J}$服从的随机变量,$\seq{x}$是源语言句子,$\seq{y}$是正确译文,$\hat{{y}}_{1 \ldots j-1}$是策略$\funp{p}$产生的译文的前$j-1$个词,$J$是生成译文的长度。特别的,对于公式\ref{eq:13-16}$\hat{{y}}_{j+1 \ldots i}$来说,如果$i<j+1$,则$\hat{{y}}_{j+1 \ldots i}$不存在,对于源语句子$x$,最优策略$\hat{p}$可以被定义为:
\begin{eqnarray}
\hat{p} & = & \argmax_{\funp{p}}\mathbb{E}_{\hat{\seq{y}} \sim \funp{p}(\hat{\seq{y}} | \seq{x})}\sum_{j=1}^J\sum_{a \in A}\funp{p}(a|\hat{{y}}_{1 \ldots j},\seq{x})\funp{Q}(a;\hat{{y}}_{1 \ldots j},\seq{y})
\label{eq:13-17}
......@@ -610,26 +605,26 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\label{eq:13-19}
\end{eqnarray}
\parinterval 这个等式也被称为{\small\bfnew{贝尔曼方程}}\index{贝尔曼方程}(Bellman Equation\index{Bellman Equation}\upcite{sutton2018reinforcement}。它表达了$j-1$时刻的动作价值函数$\funp{Q}(\hat{{y}}_j;\hat{{y}}_{1 \ldots j-1},\seq{y})$跟下一时刻$j$的动作价值函数$\funp{Q}(a;\hat{{y}}_{1 \ldots j},\seq{y})$之间的关系。{\red 在理想情况下,动作价值函数$\funp{Q}$应该满足上述等式,因此可以使用该等式作为可学习的函数$\tilde{\funp{Q}}$的目标}{\red \sout{,因此可以很自然的使用等式右部作为等式左部$\funp{Q}(\hat{{y}}_j;\hat{{y}}_{1 \ldots j-1},\seq{y})$的等价形式}}。于是,可以定义$j$时刻动作价值函数为:
\parinterval 这个等式也被称为{\small\bfnew{贝尔曼方程}}\index{贝尔曼方程}(Bellman Equation\index{Bellman Equation}\upcite{sutton2018reinforcement}。它表达了$j-1$时刻的动作价值函数$\funp{Q}(\hat{{y}}_j;\hat{{y}}_{1 \ldots j-1},\seq{y})$跟下一时刻$j$的动作价值函数$\funp{Q}(a;\hat{{y}}_{1 \ldots j},\seq{y})$之间的关系。在理想情况下,动作价值函数$\funp{Q}$应该满足上述等式,因此可以使用该等式作为可学习的函数$\tilde{\funp{Q}}$的目标。于是,可以定义$j$时刻动作价值函数为:
\begin{eqnarray}
\funp{q}_j & = & \funp{r}_j(\hat{{y}}_j;\hat{{y}}_{1 \ldots j-1},\seq{y}) + \sum_{a \in A}\funp{p}(a|\hat{{y}}_{1 \ldots j},\seq{x})\tilde{\funp{Q}}(a;\hat{{y}}_{1 \ldots j},\seq{y})
\label{eq:13-20}
\end{eqnarray}
\noindent {\red 相应的,}评论家对应的目标定义如下:
\noindent 相应的,评论家对应的目标定义如下:
\begin{eqnarray}
\hat{\tilde{\funp{Q}}} & = & \argmin_{\tilde{\funp{Q}}}\sum_{j=1}^J{(\tilde{\funp{Q}}(\hat{{y}}_j;\hat{{y}}_{1 \ldots j-1},\seq{y}) - \funp{q}_j)}^2
\label{eq:13-21}
\end{eqnarray}
\parinterval {\red 此时,公式\ref{eq:13-20}与公式\ref{eq:13-21}共同组成了评论家的学习目标,使得可学习的函数$\tilde{\funp{Q}}$逼近理想的$\funp{Q}$}最后,通过同时优化演员和评论家直到收敛,获得的演员(也就是策略$\funp{p}$)就是我们期望的翻译模型。图\ref{fig:13-12}展示了演员和评论家的关系。
\parinterval 此时,公式\ref{eq:13-20}与公式\ref{eq:13-21}共同组成了评论家的学习目标,使得可学习的函数$\tilde{\funp{Q}}$逼近理想的$\funp{Q}$。最后,通过同时优化演员和评论家直到收敛,获得的演员(也就是策略$\funp{p}$)就是我们期望的翻译模型。图\ref{fig:13-11}展示了演员和评论家的关系。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-reinforcement-learning-method-based-on-actor-critic}
\caption{基于演员-评论家的强化学习方法}
\label{fig:13-12}
\label{fig:13-11}
\end{figure}
%----------------------------------------------
......@@ -713,7 +708,7 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\label{eq:13-24}
\end{eqnarray}
这样的损失函数最直接的好处是,知识蒸馏的流程会非常简单。因为只需要利用教师模型将训练数据(源语言)翻译一遍,之后把它的输出替换为训练数据的目标语言部分。之后,利用新得到的双语数据训练学生模型即可。图\ref{fig:13-13}对比了词级和序列级知识蒸馏方法。
这样的损失函数最直接的好处是,知识蒸馏的流程会非常简单。因为只需要利用教师模型将训练数据(源语言)翻译一遍,之后把它的输出替换为训练数据的目标语言部分。之后,利用新得到的双语数据训练学生模型即可。图\ref{fig:13-12}对比了词级和序列级知识蒸馏方法。
\vspace{0.5em}
\end{itemize}
......@@ -722,7 +717,7 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\centering
\input{./Chapter13/Figures/figure-difference-between-word-level-and-sequence-level-in-knowledge-distillation}
\caption{词级和序列级知识蒸馏的差异}
\label{fig:13-13}
\label{fig:13-12}
\end{figure}
%-------------------------------------------
......@@ -748,14 +743,14 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\vspace{0.5em}
\end{itemize}
\parinterval 此外还可以采用迭代式知识蒸馏的方式。首先,通过模型集成得到较强的教师模型,再将知识迁移到不同的学生模型上,随后继续使用这些学生模型集成新的教师模型。不断的重复上述过程可以逐步提升集成模型的性能,如图\ref{fig:13-42}所示。值得注意的是,随着迭代次数的增加,集成所带来的收益也会随着子模型之间差异性的减小而减少。
\parinterval 此外还可以采用迭代式知识蒸馏的方式。首先,通过模型集成得到较强的教师模型,再将知识迁移到不同的学生模型上,随后继续使用这些学生模型集成新的教师模型。不断的重复上述过程可以逐步提升集成模型的性能,如图\ref{fig:13-13}所示。值得注意的是,随着迭代次数的增加,集成所带来的收益也会随着子模型之间差异性的减小而减少。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-ensemble-knowledge-distillation}
\caption{迭代式知识蒸馏}
\label{fig:13-42}
\label{fig:13-13}
\end{figure}
%-------------------------------------------
......@@ -790,7 +785,7 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\parinterval 当机器翻译系统应用于不同领域时,训练语料与所应用领域的相关性就显得非常重要\upcite{DBLP:journals/mt/EetemadiLTR15,britz2017effective}。不同领域往往具有自己独特的属性,比如语言风格、句子结构、专业术语等,例如,“bank”这个英语单词,在金融领域通常被翻译为“银行”,而在计算机领域,一般被解释为“库”、“存储体”等。这也会导致,使用通用领域数据训练出来的模型在特定领域上的翻译效果往往不理想,这本质上是训练数据和测试数据的领域属性不匹配造成的。
\parinterval 一种解决办法是只使用特定领域的数据进行模型训练,然而这种数据往往比较稀缺。那能不能利用通用领域数据来帮助数据稀少的领域呢?这个研究方向被称为机器翻译的{\small\bfnew{领域适应}}\index{领域适应}(Domain Adaptation\index{Domain Adaptation}),即从资源丰富的领域(称为{\small\bfnew{源领域}}\index{源领域}, Source Domain\index{Source Domain})向资源稀缺的领域(称为{\small\bfnew{目标领域}}\index{目标领域} Target Domain\index{Target Domain})迁移。这本身也对应着资源稀缺场景下的机器翻译问题,这类问题会在{\chaptersixteen}进行详细讨论。本章更加关注如何有效地利用训练样本以更好地适应目标领域。具体来说,可以使用{\small\bfnew{数据选择}}\index{数据选择}(Data Selection\index{Selection})从源领域训练数据中选择与目标领域更加相关的样本进行模型训练。这样做的一个好处是,源领域中混有大量与目标领域不相关的样本,数据选择可以有效降低这部分数据的比例,这样可以更加突出与领域相关样本的作用。
\parinterval 一种解决办法是只使用特定领域的数据进行模型训练,然而这种数据往往比较稀缺。那能不能利用通用领域数据来帮助数据稀少的领域呢?这个研究方向被称为机器翻译的{\small\bfnew{领域适应}}\index{领域适应}(Domain Adaptation\index{Domain Adaptation}),即从资源丰富的领域(称为{\small\bfnew{源领域}}\index{源领域}, Source Domain\index{Source Domain})向资源稀缺的领域(称为{\small\bfnew{目标领域}}\index{目标领域},Target Domain\index{Target Domain})迁移。这本身也对应着资源稀缺场景下的机器翻译问题,这类问题会在{\chaptersixteen}进行详细讨论。本章更加关注如何有效地利用训练样本以更好地适应目标领域。具体来说,可以使用{\small\bfnew{数据选择}}\index{数据选择}(Data Selection\index{Selection})从源领域训练数据中选择与目标领域更加相关的样本进行模型训练。这样做的一个好处是,源领域中混有大量与目标领域不相关的样本,数据选择可以有效降低这部分数据的比例,这样可以更加突出与领域相关样本的作用。
\parinterval 数据选择所要解决的核心问题是:给定一个目标领域/任务数据集(如,目标任务的开发集),如何衡量原始训练样本与目标领域/任务的相关性?主要方法可以分为以下几类:
......@@ -869,27 +864,27 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\seq{y}} | \seq{x})
\vspace{0.5em}
\end{itemize}
\parinterval 这里,把这两个问题抽象成两个模块:难度评估器和训练调度器,那么课程学习的一个大致的流程如图\ref{fig:13-15}所示。首先,难度评估器对训练样本按照由易到难的顺序进行排序,最开始调度器从相对容易的数据块中采样训练样本,发送给模型进行训练,随着训练时间的推移,训练调度器将逐渐从更加困难的数据块中进行采样(至于何时,以及选择何种采样方式则取决于设定的策略),持续这个过程,直到从整个训练集进行均匀采样。
\parinterval 这里,把这两个问题抽象成两个模块:难度评估器和训练调度器,那么课程学习的一个大致的流程如图\ref{fig:13-14}所示。首先,难度评估器对训练样本按照由易到难的顺序进行排序,最开始调度器从相对容易的数据块中采样训练样本,发送给模型进行训练,随着训练时间的推移,训练调度器将逐渐从更加困难的数据块中进行采样(至于何时,以及选择何种采样方式则取决于设定的策略),持续这个过程,直到从整个训练集进行均匀采样。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-curriculum-learning-framework}
\caption{课程学习框架}
\label{fig:13-15}
\label{fig:13-14}
\end{figure}
%-------------------------------------------
\parinterval 评估样本的难度和具体的任务相关,在神经机器翻译中,有很多种评估方法,可以利用语言学上的困难准则,比如句子长度、句子平均词频、句法树深度等\upcite{DBLP:conf/naacl/PlataniosSNPM19,DBLP:conf/ranlp/KocmiB17}。这些准则本质上属于人类的先验知识,符合人类的直觉,但不一定和模型相匹配。对人类来说简单的句子对模型来说可能并不简单,所以研究人员也提出了基于模型的方法,比如:语言模型\upcite{DBLP:conf/acl/WangCC19,DBLP:conf/naacl/ZhangSKMCD19},或者神经机器翻译模型\upcite{zhang2018empirical,DBLP:conf/coling/XuHJFWHJXZ20}都可以用于评价样本的难度。值得注意的是,利用神经机器翻译来打分的方法分为静态和动态两种。静态的方法是利用在小数据集上训练的、更小的翻译模型来打分\upcite{zhang2018empirical}。动态的方法则是利用当前模型的状态来打分,这在广义上也叫作{\small\bfnew{自步学习}}\index{自步学习}(Self-paced Learning\index{Self-paced Learning}),通常可以利用模型的训练误差或变化率等指标进行样本难度的估计\upcite{DBLP:conf/coling/XuHJFWHJXZ20}
\parinterval 虽然样本难度的度量在不同任务中有所不同,但课程规划通常与数据和任务无关。在各种场景中,大多数课程学习都利用了类似的调度策略。具体而言,调度策略可以分为预定义的和自动的两种。预定义的调度策略通常将按照难易程度排序好的样本划分为块,每个块中包含一定数量的难度相似的样本。然后按照“先易后难”的原则人工定义一个调度策略,比如,一种较为流行的方法是:在训练早期,模型只在简单块中进行采样,随着训练过程的进行,将下一个块的样本合并到当前训练子集中,继续训练,直到合并了整个数据块,即整个训练集可见为止,之后再继续训练直到收敛。这个过程如图\ref{fig:13-16}所示。类似的还有一些其他变体,比如,训练到模型可见整个数据集之后,将最难的样本块复制并添加到训练集中,或者是将最容易的数据块逐渐删除,然后再添加回来等,这些方法的基本想法都是想让模型在具备一定的能力之后更多关注于困难样本。
\parinterval 虽然样本难度的度量在不同任务中有所不同,但课程规划通常与数据和任务无关。在各种场景中,大多数课程学习都利用了类似的调度策略。具体而言,调度策略可以分为预定义的和自动的两种。预定义的调度策略通常将按照难易程度排序好的样本划分为块,每个块中包含一定数量的难度相似的样本。然后按照“先易后难”的原则人工定义一个调度策略,比如,一种较为流行的方法是:在训练早期,模型只在简单块中进行采样,随着训练过程的进行,将下一个块的样本合并到当前训练子集中,继续训练,直到合并了整个数据块,即整个训练集可见为止,之后再继续训练直到收敛。这个过程如图\ref{fig:13-15}所示。类似的还有一些其他变体,比如,训练到模型可见整个数据集之后,将最难的样本块复制并添加到训练集中,或者是将最容易的数据块逐渐删除,然后再添加回来等,这些方法的基本想法都是想让模型在具备一定的能力之后更多关注于困难样本。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter13/Figures/figure-a-predefined-course-planning}
\caption{“先易后难”数据块选择}
\label{fig:13-16}
\label{fig:13-15}
\end{figure}
%-------------------------------------------
......
......@@ -190,7 +190,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\label{eq:14-6}
\end{eqnarray}
\noindent 其中,$\textrm{cp}(\seq{x},\seq{y}) $表示覆盖度模型,它度量了译文对源语言每个单词的覆盖程度。$\textrm{cp}(\seq{x},\seq{y}) $的定义中,$\beta$是一需要自行设置的超参数,$a_{ij}$表示源语言第$i$个位置与译文 第$j$个位置的注意力权重,这样$\sum \limits_{j}^{|\seq{y}|} a_{ij}$就可以用来衡量源语言第$i$个单词被翻译了“多少”,如果它大于1,表明翻译多了;如果小于1,表明翻译少了。公式\eqref{eq:14-6}会惩罚那些欠翻译的翻译假设。对覆盖度模型的一种改进形式是\upcite{li-etal-2018-simple}
\noindent 其中,$\textrm{cp}(\seq{x},\seq{y}) $表示覆盖度模型,它度量了译文对源语言每个单词的覆盖程度。$\textrm{cp}(\seq{x},\seq{y}) $的定义中,$\beta$是一需要自行设置的超参数,$a_{ij}$表示源语言第$i$个位置与译文 第$j$个位置的注意力权重,这样$\sum \limits_{j}^{|\seq{y}|} a_{ij}$就可以用来衡量源语言第$i$个单词中的信息被翻译的程度,如果它大于1,表明翻译多了;如果小于1,表明翻译少了。公式\eqref{eq:14-6}会惩罚那些欠翻译的翻译假设。对覆盖度模型的一种改进形式是\upcite{li-etal-2018-simple}
\begin{eqnarray}
\textrm{cp}(\seq{x},\seq{y}) &=& \sum_{i=1}^{|\seq{x}|} \log( \textrm{max} ( \sum_{j}^{|\seq{y}|} a_{ij},\beta))
\label{eq:14-7}
......@@ -282,7 +282,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval 神经机器翻译需要对输入和输出的单词进行分布式表示。但是,由于真实的词表通常很大,因此计算并保存这些单词的向量表示会消耗较多的计算和存储资源。特别是对于基于Softmax 的输出层,大词表的计算十分耗时。虽然可以通过BPE 和限制词汇表规模的方法降低输出层计算的负担\upcite{DBLP:conf/acl/SennrichHB16a},但是为了获得可接受的翻译品质,词汇表也不能过小,因此输出层的计算代价仍然很高。
\parinterval 通过改变输出层的结构,可以一定程度上缓解这个问题\upcite{DBLP:conf/acl/JeanCMB15}。一种比较简单的方法是对可能输出的单词进行筛选,即词汇选择。这里,可以利用类似于统计机器翻译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机制找到每个目标语言位置对应的源语言位置,之后获得这些源语言单词最可能的翻译候选。之后,Softmax 只需要在这个有限的翻译候选单词集合上进行计算,大大降低了输出层的计算量。尤其对于CPU 上的系统,这个方法往往会带来明显的速度提升。图\ref{fig:14-4}给出了词汇选择方法的示意图
\parinterval 通过改变输出层的结构,可以一定程度上缓解这个问题\upcite{DBLP:conf/acl/JeanCMB15}。一种比较简单的方法是对可能输出的单词进行筛选,即词汇选择。这里,可以利用类似于统计机器翻译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机制找到每个目标语言位置对应的源语言位置,之后获得这些源语言单词最可能的翻译候选。之后,Softmax 只需要在这个有限的翻译候选单词集合上进行计算,大大降低了输出层的计算量。尤其对于CPU 上的系统,这个方法往往会带来明显的速度提升。图\ref{fig:14-4}对比了标准Softmax与词汇选择方法中的Softmax
%----------------------------------------------
\begin{figure}[htp]
......@@ -313,7 +313,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\label{fig:14-5}
\end{figure}
%----------------------------------------------
\parinterval 一种消除冗余计算的方法是将不同层的注意力权重进行共享,这样顶层的注意力权重可以复用底层的注意力权重\upcite{Xiao2019SharingAW}。在编码-解码注意力中,由于注意力机制中输入的Value 都是一样的\footnote{在Transformer解码器,编码-解码注意力输入的Value是编码器的输出,因此是相同的(见\chaptertwelve)。},甚至可以直接复用前一层注意力计算的结果。图\ref{fig:14-6}给出了不同方法的对比,其中$S$表示注意力权重,$A$表示注意模型的输出。可以看到,使用共享的思想,可以大大减少冗余的计算。
\parinterval 一种消除冗余计算的方法是将不同层的注意力权重进行共享,这样顶层的注意力权重可以复用底层的注意力权重\upcite{Xiao2019SharingAW}。在编码-解码注意力中,由于注意力机制中输入的Value 都是一样的\footnote{在Transformer解码器,编码-解码注意力输入的Value是编码器的输出,因此是相同的(见\chaptertwelve)。},甚至可以直接复用前一层注意力计算的结果。图\ref{fig:14-6}给出了不同方法的对比,其中$S$表示注意力权重,$A$表示注意模型的输出。可以看到,使用共享的思想,可以大大减少冗余的计算。
%----------------------------------------------
\begin{figure}[htp]
......@@ -356,7 +356,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\begin{itemize}
\vspace{0.5em}
\item {\small\sffamily\bfseries{批次生成策略}}。对于源语言文本预先给定的情况,通常是按句子长度组织每个批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保证一个批次中的内容是“满” 的,否则如果句长差异过大会造成批次中有很多位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复杂。由于有翻译时延的限制,可能无法等到有足够多的句子就要进行翻译。常见的做法是,设置一个等待的时间,在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并发的情况,也可以考虑使用不同的{\small\sffamily\bfseries{}}\index{}(Bucket\index{Bucket})保存不同长度范围的句子,之后将同一个桶中的句子进行批量推断。这个问题在{\chaptereighteen}中还会做进一步讨论。
\item {\small\sffamily\bfseries{批次生成策略}}。对于源语言文本预先给定的情况,通常是按句子长度组织每个批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保证一个批次中的内容是“满” 的,否则如果句长差异过大会造成批次中有很多位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复杂。在机器翻译系统的实际应用中,由于有翻译时延的限制,可能待翻译句子未积累到标准批次数量就要进行翻译。常见的做法是,设置一个等待的时间,在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并发的情况,也可以考虑使用不同的{\small\sffamily\bfseries{}}\index{}(Bucket\index{Bucket})保存不同长度范围的句子,之后将同一个桶中的句子进行批量推断。这个问题在{\chaptereighteen}中还会做进一步讨论。
\vspace{0.5em}
\item {\small\sffamily\bfseries{批次大小的选择}}。一个批次中的句子数量越多,GPU 设备的利用率越高,系统吞吐越大。但是,一个批次中所有句子翻译结束后才能拿到翻译结果,因此批次中有些句子即使已经翻译结束也要等待其它没有完成的句子。也就是说,从单个句子来看,批次越大翻译的延时越长,这也导致在翻译实时性要求较高的场景中,不能使用过大的批次。而且,大批次对GPU 显存的消耗更大,因此也需要根据具体任务合理选择批次大小。为了说明这些问题,图\ref{fig:14-7}展示了不同批次大小下的时延和显存消耗。
\vspace{0.5em}
......@@ -426,7 +426,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\label{eq:14-9}
\end{eqnarray}
\parinterval 对比公式\eqref{eq:14-1}可以看出,公式\eqref{eq:14-9}中位置$j$上的输出$y_j$只依赖于输入句子$\seq{x}$,与其它位置上的输出无关。于是,所有位置上${y_j}$都可以并行生成。理想情况下,这种方式一般可以带来几倍甚至十几倍的速度提升。
\parinterval 对比公式\eqref{eq:14-1}可以看出,公式\eqref{eq:14-9}中位置$j$上的输出$y_j$只依赖于输入句子$\seq{x}$,与其它位置上的输出无关。于是,可以并行生成所有位置上的${y_j}$。理想情况下,这种方式一般可以带来几倍甚至十几倍的速度提升。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -509,9 +509,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval 虽然非自回归翻译可以显著提升翻译速度,但是很多情况下其翻译质量还是低于传统的自回归翻译\upcite{Gu2017NonAutoregressiveNM,Kaiser2018FastDI,Guo2020FineTuningBC}。因此,很多工作致力于缩小自回归模型和非自回归模型的性能差距\upcite{Ran2020LearningTR,Tu2020ENGINEEI,Shu2020LatentVariableNN}
\parinterval 一种直接的方法是层级知识蒸馏\upcite{Li2019HintBasedTF}。由于自回归模型和非自回归模型的结构相差不大,因此可以将翻译质量更高的自回归模型作为“教师”,通过给非自回归模型提供监督信号,使其逐块地学习前者的分布。研究人员发现了两点非常有意思的现象:1)非自回归模型容易出现“重复翻译”的现象,这些相邻的重复单词所对应的位置的隐藏状态非常相似。2)非自回归模型的注意力分布比自回归模型的分布更加尖锐。这两点发现启发了研究人员使用自回归模型中的隐层状态和注意力矩阵等中间表示来指导非自回归模型学习。可以计算两个模型隐层状态的距离以及注意力矩阵的KL散度\footnote{KL散度即相对熵。},将它们作为额外的损失指导非自回归模型的训练。类似的做法也出现在基于模仿学习的方法中\upcite{Wei2019ImitationLF},它也可以被看作是对自回归模型不同层行为的模拟。不过,基于模仿学习的方法会使用更复杂的模块来完成自回归模型对非自回归模型的指导,比如,在自回归模型和非自回归模型中都使用一个额外的神经网络,用于传递自回归模型提供给非自回归模型的层级监督信号。
\parinterval 一种直接的方法是层级知识蒸馏\upcite{Li2019HintBasedTF}。由于自回归模型和非自回归模型的结构相差不大,因此可以将翻译质量更高的自回归模型作为“教师”,通过给非自回归模型提供监督信号,使其逐块地学习前者的分布。研究人员发现了两点非常有意思的现象:1)非自回归模型容易出现“重复翻译”的现象,这些相邻的重复单词所对应的位置的隐藏状态非常相似。2)非自回归模型的注意力分布比自回归模型的分布更加尖锐。这两点发现启发了研究人员使用自回归模型中的隐层状态和注意力矩阵等中间表示来指导非自回归模型的学习过程。可以计算两个模型隐层状态的距离以及注意力矩阵的KL散度\footnote{KL散度即相对熵。},将它们作为额外的损失指导非自回归模型的训练。类似的做法也出现在基于模仿学习的方法中\upcite{Wei2019ImitationLF},它也可以被看作是对自回归模型不同层行为的模拟。不过,基于模仿学习的方法会使用更复杂的模块来完成自回归模型对非自回归模型的指导,比如,在自回归模型和非自回归模型中都使用一个额外的神经网络,用于传递自回归模型提供给非自回归模型的层级监督信号。
\parinterval 此外,也可以使用基于正则化因子的方法\upcite{Wang2019NonAutoregressiveMT}。非自回归模型的翻译结果中存在着两种非常严重的错误:重复翻译和不完整的翻译。重复翻译问题是因为解码器隐层状态中相邻的两个位置过于相似,因此翻译出来的单词也一样。对于不完整翻译,或者说欠翻译,通常将其归咎于非自回归模型在翻译的过程中丢失了一些源语言句子的信息。针对这两个问题,可以通过在相邻隐层状态间添加相似度约束来计算一个重构损失。具体实践时,对于翻译$\seq{x}\to\seq{y}$,通过一个反向的自回归模型再将$\seq{y}$翻译成$\seq{x'}$,最后计算$\seq{x}$$\seq{x'}$的差异性作为损失。
\parinterval 此外,也可以使用基于正则化因子的方法\upcite{Wang2019NonAutoregressiveMT}。非自回归模型的翻译结果中存在着两种非常严重的错误:重复翻译和不完整的翻译。重复翻译问题是因为解码器隐层状态中相邻的两个位置过于相似,因此翻译出来的单词也一样。对于不完整翻译,即欠翻译问题,通常是由于非自回归模型在翻译的过程中丢失了一些源语言句子的信息。针对这两个问题,可以通过在相邻隐层状态间添加相似度约束来计算一个重构损失。具体实践时,对于翻译$\seq{x}\to\seq{y}$,通过一个反向的自回归模型再将$\seq{y}$翻译成$\seq{x'}$,最后计算$\seq{x}$$\seq{x'}$的差异性作为损失。
%----------------------------------------------------------------------------------------
......@@ -651,7 +651,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\vspace{0.5em}
\item 改变模型宽度和深度,即用不同层数或者不同隐藏层大小得到多个模型;
\vspace{0.5em}
\item 不同的参数初始化,即用不同的随机种子初始化参数训练多个模型;
\item 使用不同的参数进行初始化,即用不同的随机种子初始化参数训练多个模型;
\vspace{0.5em}
\item 不同模型(局部)架构的调整,比如,使用不同的位置编码模型\upcite{Shaw2018SelfAttentionWR}、多层融合模型\upcite{WangLearning}等;
\vspace{0.5em}
......
......@@ -94,7 +94,7 @@
\node [anchor=south,colnode,minimum height=4.2em,minimum width=1em] (b2) at ([xshift=1.67em,yshift=0em]b1.south) {};
\node [anchor=south,colnode,minimum height=3.7em,minimum width=1em] (b3) at ([xshift=1.67em,yshift=0em]b2.south) {};
\node [anchor=south,colnode,minimum height=4.2em,minimum width=1em] (b4) at ([xshift=1.67em,yshift=0em]b3.south) {};
\node [anchor=south,colnode,minimum height=0.8em,minimum width=1em] (b5) at ([xshift=1.67em,yshift=0em]b4.south) {};
\node [anchor=south,colnode,minimum height=1.4em,minimum width=1em] (b5) at ([xshift=1.67em,yshift=0em]b4.south) {};
\node [anchor=south,colnode,minimum height=0.15em,minimum width=1em] (b6) at ([xshift=1.67em,yshift=0em]b5.south) {};
{\scriptsize
......
......@@ -253,7 +253,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\vspace{0.5em}
\item {\small\bfnew{使用轻量卷积和动态卷积神经网络}}\upcite{Wu2019PayLA,DBLP:conf/interspeech/GulatiQCPZYHWZW20}。比如,分别在编码器和解码器利用轻量卷积或动态卷积神经网络(见{\chapternine})替换Transformer的自注意力机制,同时保留解码器的编码-解码注意力机制,一定程度上加强了模型对局部信息的建模能力,同时提高了计算效率。
\vspace{0.5em}
\item {\small\bfnew{使用1维卷积注意力网络}}(图\ref{fig:15-5}(b))。可以使用一维的卷积自注意力网络(1D-CSAN)将关注的范围限制在相近的元素窗口中。其形式上十分简单,只需预先设定好局部建模的窗口大小$D$,并在进行注意力权重计算和对Value值进行加权求和时,将其限制在设定好的窗口范围内。
\item {\small\bfnew{使用1维卷积注意力网络}}(图\ref{fig:15-5}(b)){\red (没引用?)}。可以使用一维的卷积自注意力网络(1D-CSAN)将关注的范围限制在相近的元素窗口中。其形式上十分简单,只需预先设定好局部建模的窗口大小$D$,并在进行注意力权重计算和对Value值进行加权求和时,将其限制在设定好的窗口范围内。
\vspace{0.5em}
\item {\small\bfnew{使用2维卷积注意力网络}}(图\ref{fig:15-5}(c))。在一维卷积注意力网络的基础上,对多个注意力头之间的信息进行交互建模,打破了注意力头之间的界限。 1D-CDAN{\red (S?)}的关注区域为$1\times D$,当将其扩展为二维矩形$D \times N$,长和宽分别为局部窗口的大小和参与建模的自注意力头的个数。这样,模型可以计算某个头中的第$i$个元素和另一个头中的第$j$个元素之间的相关性系数,实现了对不同子空间之间关系的建模,所得到的注意力分布{\red (哪里得到了?)}表示了头之间的依赖关系。
......
......@@ -1732,7 +1732,7 @@ z_t&=&\gamma z_{t-1}+(1-\gamma) \frac{\partial J}{\partial {\theta}_t} \cdot \f
\parinterval 这个过程可以得到$ {\mathbi{s}}^K $节点处的梯度$ {\bm \pi}^K= \frac{\partial L}{\partial {\mathbi{s}}^K} $,在后续的过程中可以直接使用其作为前一层提供的梯度计算结果,而不需要从$ {\mathbi{h}}^K $节点处重新计算。这也体现了自动微分与符号微分的差别,对于计算图的每一个阶段,并不需要得到完成的微分表达式,而是通过前一层提供的梯度,直接计算当前的梯度即可,这样避免了大量的重复计算。
\parinterval 在得到$ {\bm \pi}^K= \frac{\partial L}{\partial {\mathbi{s}}^K} $之后,下一步的目标是:1)计算损失函数$ L $相对于第$ K-1 $层与输出层之间连接权重$ {\mathbi{W}}^K $的梯度;2)计算损失函数$ L $相对于神经网络网络$ K-1 $层输出结果$ {\mathbi{h}}^{K-1} $的梯度。这部分内容如图\ref{fig:9-55}所示。
\parinterval 在得到$ {\bm \pi}^K= \frac{\partial L}{\partial {\mathbi{s}}^K} $之后,下一步的目标是:1)计算损失函数$ L $相对于第$ K-1 $层与输出层之间连接权重$ {\mathbi{W}}^K $的梯度;2)计算损失函数$ L $相对于神经网络第$ K-1 $层输出结果$ {\mathbi{h}}^{K-1} $的梯度。这部分内容如图\ref{fig:9-55}所示。
%----------------------------------------------
\begin{figure}[htp]
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论