Commit 29da486c by 曹润柘

合并分支 'master' 到 'caorunzhe'

Master

查看合并请求 !653
parents 4a458dc0 e0392d26
...@@ -318,7 +318,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x} ...@@ -318,7 +318,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\parinterval 前面提到Transformer模型完全摒弃了循环单元与卷积单元,仅通过绝对位置编码来区分序列中的不同位置。另一方面,由于循环神经网络也非常适用于处理序列结构,且其结构成熟、易于优化。因此,将其与Transformer模型融合,一方面发挥循环神经网络简单高效的特点,另一方面发挥Transformer模型在特征提取方面的优势,也是一种非常值得探索的思路({\color{red} 引用RNMT?})。 \parinterval 前面提到Transformer模型完全摒弃了循环单元与卷积单元,仅通过绝对位置编码来区分序列中的不同位置。另一方面,由于循环神经网络也非常适用于处理序列结构,且其结构成熟、易于优化。因此,将其与Transformer模型融合,一方面发挥循环神经网络简单高效的特点,另一方面发挥Transformer模型在特征提取方面的优势,也是一种非常值得探索的思路({\color{red} 引用RNMT?})。
\parinterval 一种方法是,对深层网络的不同层使用循环机制。早在残差网络提出时,研究人员已经开始尝试探讨残差网络成功背后的原因({\color{red} 参考文献})。本质上,在卷积神经网络中引入残差连接后,网络从深度上隐性地利用循环的特性。区别在于不同层的参数独立,而非共享。Transformer网络的编码端与解码端分别由$N$个相同结构但参数独立的块堆叠而成,其中编码块与解码块中分别包含2/3个子层。同时,子层之间引入了残差连接保证了网络信息传递的高效性。因此,一个自然的想法是通过共享不同块之间的参数,引入循环神经网络中的归纳偏置\upcite{DBLP:conf/iclr/DehghaniGVUK19}。其中每层的权重是共享的,并引入了基于时序的编码向量用于显著区分不同深度下的时序信息。之后,在训练大容量预训练模型时同样也采取了共享层间参数的方式\upcite{Lan2020ALBERTAL} \parinterval 一种方法是,对深层网络的不同层使用循环机制。早在残差网络提出时,研究人员已经开始尝试探讨残差网络成功背后的原因({\color{red} 参考文献})。本质上,在卷积神经网络中引入残差连接后,网络从深度上隐性地利用循环的特性。区别在于不同层的参数独立,而非共享。Transformer网络的编码端与解码端分别由$N$个相同结构但参数独立的块堆叠而成,其中编码块与解码块中分别包含2/3个子层。同时,子层之间引入了残差连接保证了网络信息传递的高效性。因此,一个自然的想法是通过共享不同块之间的参数,引入循环神经网络中的归纳偏置\upcite{DBLP:conf/iclr/DehghaniGVUK19}。其中每层的权重是共享的,并引入了基于时序的编码向量用于显著区分不同深度下的时序信息。之后,在训练大容量预训练模型时同样也采取了共享层间参数的方式\upcite{Lan2020ALBERTAL}
\parinterval 另一种方法是,利用循环神经网络对输入序列进行编码,之后通过门控机制将得到的结果与Transformer进行融合\upcite{DBLP:conf/naacl/HaoWYWZT19}。融合机制可以采用顺序计算或并行计算。 \parinterval 另一种方法是,利用循环神经网络对输入序列进行编码,之后通过门控机制将得到的结果与Transformer进行融合\upcite{DBLP:conf/naacl/HaoWYWZT19}。融合机制可以采用顺序计算或并行计算。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
...@@ -857,9 +857,9 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5} ...@@ -857,9 +857,9 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
\sectionnewpage \sectionnewpage
\section{基于树结构的模型} \section{基于句法的神经机器翻译模型}
\parinterval 在统计机器翻译时代,使用句法树是一种非常有效的机器翻译建模手段(见{\chaptereight})。由于句法树是人类运用语言的高级抽象结果,使用句法树可以非常有效地帮助机器翻译系统捕捉句子的结构。将这种知识引入到机器翻译中,能使得翻译系统在译文语法正确性以及流畅度等方面获得进一步的提升,同时也可以消除译文中的歧义,进而得到更准确的译文。在神经机器翻译中,虽然标准的框架大多基于词串,但是引入句法树结构仍然很有潜力\upcite{DBLP:conf/acl/LiXTZZZ17}。具体来说,由于神经机器翻译模型缺少对于句子结构的理解,会导致一些明显的翻译问题: \parinterval 在统计机器翻译时代,使用句法信息是一种非常有效的机器翻译建模手段(见{\chaptereight})。由于句法是人类运用语言的高级抽象结果,使用句法信息(如句法树)可以非常有效地帮助机器翻译系统捕捉句子的结构。将这种知识引入到机器翻译中,能使得翻译系统在译文语法正确性以及流畅度等方面获得进一步的提升,同时也可以消除译文中的歧义,进而得到更准确的译文。在神经机器翻译中,虽然标准的框架大多基于词串,但是引入句法树等结构仍然很有潜力\upcite{DBLP:conf/acl/LiXTZZZ17}。具体来说,由于神经机器翻译模型缺少对句子结构的理解,会导致一些明显的翻译问题:
\begin{itemize} \begin{itemize}
\vspace{0.5em} \vspace{0.5em}
...@@ -877,15 +877,15 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5} ...@@ -877,15 +877,15 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
\vspace{0.5em} \vspace{0.5em}
\end{itemize} \end{itemize}
\parinterval 显然,神经机器翻译系统并没有按照合理的句法结构生成译文。也就是说,模型并没有理解句子的结构\upcite{DBLP:conf/acl/LiXTZZZ17}。甚至对于一些语言差异很大的语言对,会出现将介词短语翻译成一个词的情况。虽然可以通过不同的手段对上述问题进行求解,但是使用句法树是最直接的一种解决问题的方法\upcite{DBLP:conf/acl/EriguchiHT16} \parinterval 显然,神经机器翻译系统并没有按照合理的句法结构生成译文。也就是说,模型并没有理解句子的结构\upcite{DBLP:conf/acl/LiXTZZZ17}。甚至对于一些语言差异很大的语言对,会出现将介词短语翻译成一个词的情况。虽然可以通过很多手段对上述问题进行求解,但是使用句法树是最直接的一种解决问题的方法\upcite{DBLP:conf/acl/EriguchiHT16}
\parinterval 那么在神经机器翻译中,如何将这种离散化的树结构融入到基于分布式表示的翻译模型中呢?有以下两种策略: \parinterval 那么在神经机器翻译中,如何将这种离散化的树结构融入到基于分布式表示的翻译模型中呢?有以下两种策略:
\begin{itemize} \begin{itemize}
\vspace{0.5em} \vspace{0.5em}
\item 将句法树结构加入到编码端,使得编码端更加充分地表示源语言句子。 \item 将句法树结构加入到编码器,使得编码器更加充分地表示源语言句子。
\vspace{0.5em} \vspace{0.5em}
\item 将句法树结构加入到解码,使得翻译模型能生成更符合句法的译文。 \item 将句法树结构加入到解码,使得翻译模型能生成更符合句法的译文。
\vspace{0.5em} \vspace{0.5em}
\end{itemize} \end{itemize}
...@@ -895,7 +895,7 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5} ...@@ -895,7 +895,7 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
\subsection{编码端使用句法信息} \subsection{编码端使用句法信息}
\parinterval 编码器中使用句法信息有两种思路,一种是在解码器中显性使用树结构进行建模,另一种是把句法信息作为特征输入到序列编码器中。这两种思路与统计机器翻译中基于句法树结构的模型和基于句法特征的模型十分相似(见{\chaptereight})。 \parinterval 编码器中使用句法信息有两种思路,一种是在解码器中显性使用树结构进行建模,另一种是把句法信息作为特征输入到传统的序列编码器中。这两种思路与统计机器翻译中基于句法树结构的模型和基于句法特征的模型十分相似(见{\chaptereight})。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION % NEW SUBSUB-SECTION
...@@ -935,9 +935,9 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5} ...@@ -935,9 +935,9 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
\textrm{“私は緑茶を飲んでいます”} \nonumber \textrm{“私は緑茶を飲んでいます”} \nonumber
\end{equation} \end{equation}
\noindent 其中,“a cup of green tea”实际上只对应“緑茶”一个词({\color{red} 怎么看出来只对应一个词???})。使用句法树后,“a cup of green tea”会作为树中一个节点,这样可以更好地把它作为一个整体进行翻译。 \noindent 其中,“a cup of green tea”实际上只对应“緑茶”一个词({\color{red} 怎么看出来只对应一个词???})。使用句法树后,“a cup of green tea”会作为树中一个节点,这样可以容易把它作为一个整体进行翻译。
\parinterval 但是,这种自底向上的树结构表示方法也存在问题:每个树节点的状态并不能包含树中其它位置的信息。也就是说,从每个节点上看,其表示结果没有很好的利用上下文。因此,可以同时使用自下而上和自上而下的信息传递进行句法树的表示\upcite{Yang2017TowardsBH,DBLP:conf/acl/ChenHCC17},这样增加了树中每个节点对其覆盖的子树以及周围上下文的建模能力。如图\ref{fig:15-21}所示,图中$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$分别代表向上传输节点和向下传输节点的状态,虚线框代表了$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$会拼接到一起,并作为这个节点的整体表示参与注意力模型的计算。 \parinterval 但是,这种自底向上的树结构表示方法也存在问题:每个树节点的状态并不能包含树中其它位置的信息。也就是说,从每个节点上看,其表示结果没有很好的利用上下文。因此,可以同时使用自下而上和自上而下的信息传递方式进行句法树的表示\upcite{Yang2017TowardsBH,DBLP:conf/acl/ChenHCC17},这样增加了树中每个节点对其覆盖的子树以及周围上下文的建模能力。如图\ref{fig:15-21}所示,$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$分别代表向上传输节点和向下传输节点的状态,虚线框代表了$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$会拼接到一起,并作为这个节点的整体表示参与注意力模型的计算。
%---------------------------------------------- %----------------------------------------------
\begin{figure}[htp] \begin{figure}[htp]
...@@ -954,40 +954,39 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5} ...@@ -954,40 +954,39 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
\subsubsection{2. 基于句法特征的编码} \subsubsection{2. 基于句法特征的编码}
\parinterval 不同于直接对树结构进行编码,另一种方法是将词语、句法信息等信息直接转换为特征向量拼接到一起,作为机器翻译系统的输入\upcite{DBLP:conf/wmt/SennrichH16}。这种方法的优点在于,句法信息可以无缝融入到现有神经机器翻译框架,对系统结构的修改很小。以基于循环神经网络的翻译模型为例,对于输入序列的$i$个单词,可以用公式\eqref{eq:15-52}计算其表示向量$\mathbi{h}_i$时添加特征向量 \parinterval 不同于直接对树结构进行编码,另一种方法是将单词、句法信息等信息直接转换为特征向量拼接到一起,作为机器翻译系统的输入\upcite{DBLP:conf/wmt/SennrichH16}。这种方法的优点在于,句法信息可以无缝融入到现有神经机器翻译框架,对系统结构的修改很小。以基于循环神经网络的翻译模型为例,对于输入序列的$i$个单词,可以用如下方式计算$i$时刻的表示结果
\begin{eqnarray} \begin{eqnarray}
\mathbi{h}_i &=& \textrm{tanh}(\mathbi{W}(\|_{k=1}^{|F|}\mathbi{E}_h x_{ik}) + \mathbi{U}\mathbi{h}_{i-1}) \mathbi{h}_i &=& \textrm{tanh}(\mathbi{W}(\|_{k=1}^{|F|}\mathbi{E}_h x_{ik}) + \mathbi{U}\mathbi{h}_{i-1})
\label{eq:15-52} \label{eq:15-52}
\end{eqnarray} \end{eqnarray}
\noindent 其中,$\mathbi{W}$是转换矩阵,$\mathbi{U}$是权重矩阵,$F$代表了特征的数量,而$\mathbi{E}$是一个特征矩阵,它包含了不同种类特征的数量,$x_{ik}$代表了第$i$个词在第$k$种特征中所表达的值,$\|$操作为拼接操作。公式\eqref{eq:15-52}将从共$F$个特征向量连接成固定大小的向量,作为编码端的输入。这种方法可以很容易地融合如词根,子词,形态,词性以及依存标签等特征。 \noindent 其中,$\mathbi{W}$是转换矩阵,$\mathbi{U}$是权重矩阵,$F$代表了特征的数量({\color{red} 特征的数量为啥还要加绝对值});而$\mathbi{E}$是一个特征矩阵,它包含了不同种类特征的数量,$x_{ik}$ 代表了第$i$ 个词在第$k$ 种特征中所表达的值,$\|$操作为拼接操作。公式\eqref{eq:15-52}将从共$F$个特征向量连接成固定大小的向量,作为编码端的输入。这种方法可以很容易地融合如词根、子词、形态、词性以及依存标签等特征。
\parinterval 此外是否有更有效的方法,将句法信息融入到编码器呢?如图\ref{fig:15-22}(a)所示,对于英语句子“I love dogs”,可以得到如图\ref{fig:15-22}(a)所示的句法树。这里,使用$w_i$表示第$i$个单词,如图\ref{fig:15-22}(b)所示。使用$l_j$表示句法解析树中第$j$个语法标签({\color{red}$l$是不是在前面也用到过?而且怎么定义$j$?怎么遍历的树?}),如图\ref{fig:15-22}(c)所示。通过观察句法树的结构可以看出,对一个单词来说,句法树中该单词的父节点({\color{red} 祖先节点及路径?})代表了描述该单词最准确的句法信息。因此可以单词祖先节点及路径信息与原始的词信息构造出新的融合表示${\mathbi{h}'}_i$,并使用这种新的表示计算上下文向量$\mathbi{C}$,即:
\parinterval 此外是否有更有效的方法,将句法信息融入到编码端呢?如图\ref{fig:15-22}(a)所示,对于英文“I love dogs”,有如下句法解析树: \begin{eqnarray}
\mathbi{C}_j &=& \sum_{i=1}^m \alpha_{i,j} {\mathbi{h}'}_i
\label{eq:15-53}
\end{eqnarray}
%---------------------------------------------- %----------------------------------------------
\begin{figure}[htp] \begin{figure}[htp]
\centering \centering
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-parsing-tree-of-a-sentence.png} \includegraphics[scale=0.5]{./Chapter15/Figures/figure-parsing-tree-of-a-sentence.png}
\caption{一个句子的句法解析树} \caption{一个句子的句法树、词序列、词性标记序列}
\label{fig:15-22} \label{fig:15-22}
\end{figure} \end{figure}
%------------------------------------------- %-------------------------------------------
\parinterval 对于该句法解析树,可以使用$w_i$表示句法解析树中第$i$个单词,如图\ref{fig:15-22}(b)所示。使用$l_j$表示句法解析树中第$j$个语法标签,如图\ref{fig:15-22}(c)所示。通过观察句法树的结构可以看出,对一个单词来说,句法树中该单词的父节点代表了该单词最精确的句法信息,因此一个直观的想法是直接使用单词父节点的句法信息与原始的词信息构造出新的融合表示${\mathbi{h}'}_i$,并使用这种新的表示计算上下文向量$\mathbi{C}$,如公式\eqref{eq:15-53}所示: \noindent 其中,$m$是源语言句子的长度。计算${\mathbi{h}'}_i$有如下几种方式({\color{red} 实现啥?}\upcite{DBLP:conf/acl/LiXTZZZ17}
\begin{eqnarray}
\mathbi{C}_j &=& \sum_{i=1}^m \alpha_{i,j} {\mathbi{h}'}_i
\label{eq:15-53}
\end{eqnarray}
\parinterval 其中,$m$是源语言句子的长度。基于这种想法,有如下几种实现方式\upcite{DBLP:conf/acl/LiXTZZZ17}
\begin{itemize} \begin{itemize}
\vspace{0.5em} \vspace{0.5em}
\item 平行结构。利用两个编码端构成平行结构,分别对源语言词汇和线性化的句法树进行建模,之后在词语RNN和句法RNN中寻找句法解析树中每个词汇以及他们的父节点,将他们的隐层状态相融合,得到新的表示。如图\ref{fig:15-23}(a)所示,图中$\mathbi{h}_{w_i}$为词$w_i$在词语RNN中的隐藏状态,$\mathbi{h}_{l_j}$为树结构标签$l_i$在句法RNN中的隐藏状态,其中如果词语$w_i$是标签$l_j$在句法树中的子节点,则将$\mathbi{h}_{w_i}$$\mathbi{h}_{l_j}$向量拼接到一起作为这个词的新表示${\mathbi{h}'}_i$ \item 平行结构。利用两个编码端构成平行结构,分别对源语言单词和线性化的句法树进行建模,之后在句法树节点序列中寻找每个单词的父节点(或者祖先),将这个单词和它的父节点的状态相融合,得到新的表示。如图\ref{fig:15-23}(a)所示,图中$\mathbi{h}_{w_i}$为词$w_i$在单词序列中的状态,$\mathbi{h}_{l_j}$为树节点$l_j$在句法表示(序列)中的隐藏状态。如果单词$w_i$是节点$l_j$ 在句法树中的子节点,则将$\mathbi{h}_{w_i}$$\mathbi{h}_{l_j}$向量拼接到一起作为这个词的新表示${\mathbi{h}'}_i$
\vspace{0.5em} \vspace{0.5em}
\item 分层结构。将句法RNN与源语言单词的词嵌入向量进行融合,如图\ref{fig:15-23}(b)所示,其中$\mathbi{e}_{w_i}$为第$i$个词的词嵌入。类似地,如果$w_i$词语是$l_j$标签在句法树中的子节点,则将$\mathbi{e}_{w_i}$$\mathbi{h}_{l_j}$向量拼接到一起作为词语RNN的输入,输出得${\mathbi{h}'}_i$直接参与注意力计算 \item 分层结构。将句法表示结果与源语言单词的词嵌入向量进行融合,如图\ref{fig:15-23}(b)所示,其中$\mathbi{e}_{w_i}$为第$i$个词的词嵌入。类似地,如果$w_i$词语是节点$l_j$在句法树中的子节点,则将$\mathbi{e}_{w_i}$$\mathbi{h}_{l_j}$向量拼接到一起作为原始模型的输入,这样${\mathbi{h}'}_i$直接参与注意力计算({\color{red} 这段话看不懂,不是和“平行结构”一样了吗?})。注意,分层结构和平行结构的区别在于,分层结构实际上最终还是使用一个编码器,句法信息只是与词嵌入进行融合,因此最终的结构和原始的模型是一致的;平行结构相当于使用了两个编码器,因此单词和句法信息的融合是在两个编码的输出上进行的
\vspace{0.5em} \vspace{0.5em}
\item 混合结构。使用混合结构的方式在编码端融入句法信息,首先对图\ref{fig:15-22}(a)中句法解析树进行先序遍历,将句法标签和源语言单词融合到同一个序列中,得到如图\ref{fig:15-23}(c)所示序列,之后使用同一个RNN结构处理这些表示,然后使用源语言词汇位置的隐藏信息参与注意力的计算。有趣的是,相比于前两种方法,使用混合结构的方式不仅参数量最少而且最为有效\upcite{DBLP:conf/acl/LiXTZZZ17} \item 混合结构。首先对图\ref{fig:15-22}(a)中句法树进行先序遍历,将句法标记和源语言单词融合到同一个序列中,得到如图\ref{fig:15-23}(c)所示序列。之后使用传统的序列编码器对这个序列进行编码,然后使用序列中源语言单词所对应的状态参与注意力模型的计算。有趣的是,相比于前两种方法,这种方法参数量少而且也十分有效\upcite{DBLP:conf/acl/LiXTZZZ17}
\vspace{0.5em} \vspace{0.5em}
\end{itemize} \end{itemize}
...@@ -1002,7 +1001,7 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5} ...@@ -1002,7 +1001,7 @@ lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
\end{figure} \end{figure}
%------------------------------------------- %-------------------------------------------
\parinterval 总的来说,对于在源语言端使用句法信息的情况,由于句法信息的生成依赖于句法分析装置,因此句法分析的错误会在很大程度上影响源语言句子的表示结果。如果获得的句法信息不够精确,可能会对翻译系统带来负面的作用。此外,也有研究发现基于词串的神经机器翻译模型本身就能学习到源语言的句法信息\upcite{DBLP:conf/emnlp/ShiPK16},这表明了神经机器翻译模型也有一定的归纳句法的能力。除了循环神经网络结构,也有学者探索如何在Transformer中引入树结构信息。比如,可以在计算编码端自注意力分布的时候,将词与词之间的依存变换成距离表示作为额外的语法信息融入到注意力计算中\upcite{DBLP:conf/acl/BugliarelloO20} \parinterval 总的来说,由于句法信息的生成依赖于句法分析装置,因此句法分析的错误会在很大程度上影响源语言句子的表示结果。如果获得的句法信息不够精确,可能会对翻译系统带来负面的作用。此外,也有研究发现基于词串的神经机器翻译模型本身就能学习到源语言的句法信息\upcite{DBLP:conf/emnlp/ShiPK16},这表明了神经机器翻译模型也有一定的归纳句法的能力。除了循环神经网络结构,也有学者探索如何在Transformer中引入树结构信息。比如,可以在计算编码端自注意力分布的时候,将词与词之间的依存变换成距离表示作为额外的语法信息融入到注意力计算中\upcite{DBLP:conf/acl/BugliarelloO20}
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SUB-SECTION % NEW SUB-SECTION
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论