Commit e0a07675 by 单韦乔

合并分支 'shanweiqiao' 到 'caorunzhe'

Shanweiqiao

查看合并请求 !39
parents c2bac0db 147edc5e
...@@ -256,7 +256,7 @@ ...@@ -256,7 +256,7 @@
\sectionnewpage \sectionnewpage
\section{基于规则的方法} \section{基于规则的方法}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval 机器翻译技术大体上可以分为三种方法,分别为基于规则的机器翻译、统计机器翻译以及神经机器翻译。第一代机器翻译技术是主要使用基于规则的机器翻译方法,其主要思想是通过形式文法定义的规则引入源语言和目标语中的语言学知识。此类方法在机器翻译技术诞生之初就被人所关注,特别是在上世纪70年代,以基于规则方法为代表的专家系统是人工智能中最具代表性的研究领域。甚至到了统计机器翻译时代,很多系统中也大量使用了基于规则的翻译知识表达形式。 \parinterval 机器翻译技术大体上可以分为三种方法,分别为基于规则的机器翻译、统计机器翻译以及神经机器翻译。第一代机器翻译技术是主要使用基于规则的机器翻译方法,其主要思想是通过形式文法定义的规则引入源语言和目标语中的语言学知识。此类方法在机器翻译技术诞生之初就被人所关注,特别是在上世纪70年代,以基于规则方法为代表的专家系统是人工智能中最具代表性的研究领域。甚至到了统计机器翻译时代,很多系统中也大量使用了基于规则的翻译知识表达形式。
\parinterval 早期,基于规则的机器翻译大多依赖人工定义及书写的规则。主要有两类方法\cite{tripathi2010approaches}:一类是基于转换规则的机器翻译方法,简称转换法。另一类是基于中间语言的方法。它们都以词典和人工书写的规则库作为翻译知识,用一系列规则的组合完成翻译。 \parinterval 早期,基于规则的机器翻译大多依赖人工定义及书写的规则。主要有两类方法\cite{tripathi2010approaches}:一类是基于转换规则的机器翻译方法,简称转换法。另一类是基于中间语言的方法。它们都以词典和人工书写的规则库作为翻译知识,用一系列规则的组合完成翻译。
...@@ -279,6 +279,8 @@ ...@@ -279,6 +279,8 @@
\parinterval\ref{fig:1-9}展示了一个使用转换法进行翻译的实例。这里,利用一个简单的汉译英规则库完成对句子``我对你感到满意''的翻译。当翻译``我''时,从规则库中找到规则1,该规则表示遇到单词``我''就翻译为``I'';类似地,也可以从规则库中找到规则4,该规则表示翻译调序,即将单词``you''放到``be satisfied with''后面。这种通过规则表示词汇的对应关系,并在翻译中使用的思想也为统计机器翻译方法提供了思路。如统计机器翻译中,基于短语的翻译模型使用短语对对原文进行替换,详细描述可以参考第四章。 \parinterval\ref{fig:1-9}展示了一个使用转换法进行翻译的实例。这里,利用一个简单的汉译英规则库完成对句子``我对你感到满意''的翻译。当翻译``我''时,从规则库中找到规则1,该规则表示遇到单词``我''就翻译为``I'';类似地,也可以从规则库中找到规则4,该规则表示翻译调序,即将单词``you''放到``be satisfied with''后面。这种通过规则表示词汇的对应关系,并在翻译中使用的思想也为统计机器翻译方法提供了思路。如统计机器翻译中,基于短语的翻译模型使用短语对对原文进行替换,详细描述可以参考第四章。
\parinterval 在上述例子中可以发现,规则不仅仅可以翻译句子之间词汇的对应,如规则1,还可以表示句法甚至语法之间的对应,如规则6。因此基于规则的方法可以分成多个层次,如图\ref{fig:1-10}所示。不同层次表示采用不同知识来书写规则完成机器翻译过程。对于一个翻译问题,可以构建不同层次的基于规则的机器翻译系统。这里包括四个层次,分别为:词汇转换、句法转换、语义转换和中间语言层。其中,上层可以继承下层的翻译知识,比如说句法转换层会利用词汇转换层知识。早期基于规则的方法属于词汇转换层。
%---------------------------------------------- %----------------------------------------------
\begin{figure}[htp] \begin{figure}[htp]
\centering \centering
...@@ -289,15 +291,13 @@ ...@@ -289,15 +291,13 @@
\end{figure} \end{figure}
%------------------------------------------- %-------------------------------------------
\parinterval 在上述例子中可以发现,规则不仅仅可以翻译句子之间词汇的对应,如规则1,还可以表示句法甚至语法之间的对应,如规则6。因此基于规则的方法可以分成多个层次,如图\ref{fig:1-10}所示。不同层次表示采用不同知识来书写规则完成机器翻译过程。对于一个翻译问题,可以构建不同层次的基于规则的机器翻译系统。这里包括四个层次,分别为:词汇转换、句法转换、语义转换和中间语言层。其中,上层可以继承下层的翻译知识,比如说句法转换层会利用词汇转换层知识。早期基于规则的方法属于词汇转换层。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SUB-SECTION % NEW SUB-SECTION
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
\subsection{转换法} \subsection{转换法}
\parinterval 通常一个典型的{\small\bfnew{基于转换规则的机器翻译}}\index{基于转换规则的机器翻译}(Transfer Based Translation)\index{Transfer Based Translation}过程可以被视为``独立分析-独立生成-相关转换''的过程\cite{jurafsky2000speech}。如图\ref{fig:1-11}所示,整个完整的机器翻译过程可以分成六个步骤,其中每一个步骤都是通过相应的翻译规则来完成,比如第一个步骤中需要构建源语词法分析规则,第二个步骤中需要构建源语句法分析规则,第三个和第四个步骤中需要构建源语-目标语词汇和结构转换规则等等。 \parinterval 通常一个典型的{\small\bfnew{基于转换规则的机器翻译}}\index{基于转换规则的机器翻译}(Transfer Based Translation)\index{Transfer Based Translation}过程可以被视为``独立分析-独立生成-相关转换''的过程\cite{jurafsky2000speech}。如图\ref{fig:1-11}所示,完整的机器翻译过程可以分成六个步骤,其中每一个步骤都是通过相应的翻译规则来完成,比如第一个步骤中需要构建源语词法分析规则,第二个步骤中需要构建源语句法分析规则,第三个和第四个步骤中需要构建源语-目标语词汇和结构转换规则等等。
%---------------------------------------------- %----------------------------------------------
\begin{figure}[htp] \begin{figure}[htp]
...@@ -321,9 +321,9 @@ ...@@ -321,9 +321,9 @@
\parinterval 如一个中文源文``她把一束花放在桌上。'',经过词法和句法分析之后可以被表示成如图\ref{fig:1-12}所示的结构,对应于图\ref{fig:1-11}中的源文结构。这种使用语言学提取句子结构化表示,并使用某种规则匹配源文结构和译文结构的方式也为统计机器翻译中基于语言学句法的模型提供了思路。 \parinterval 如一个中文源文``她把一束花放在桌上。'',经过词法和句法分析之后可以被表示成如图\ref{fig:1-12}所示的结构,对应于图\ref{fig:1-11}中的源文结构。这种使用语言学提取句子结构化表示,并使用某种规则匹配源文结构和译文结构的方式也为统计机器翻译中基于语言学句法的模型提供了思路。
\parinterval 在转换法中,翻译规则通常会分成两类:通用规则和个性规则。所谓通用的规则主要用于句法分析、语义分析、结构转换和句法生成等,不具体依赖于某个源语言或者目标语言词汇而设计的翻译规则;个性规则通常以具体源语言词汇来做索引,比如图\ref{fig:1-9}中规则5就是针对主语是``I''的个性规则,它直接针对某个具体词汇进行分析和翻译。 \parinterval 在转换法中,翻译规则通常会分成两类:通用规则和个性规则。所谓通用的规则主要用于句法分析、语义分析、结构转换和句法生成等,不具体依赖于某个源语言或者目标语言词汇而设计的翻译规则;个性规则通常以具体源语言词汇来做索引,比如图\ref{fig:1-9}中规则5就是针对主语是``I''的个性规则,它直接针对某个具体词汇进行分析和翻译。
\parinterval 个性规则通常会保留在词库中,每条具体的个性规则会与某具体词汇关联,一个词汇可能会关联多条个性规则。在翻译的过程中,根据当前被分析的单词来激活所关联的个性规则。通用规则通常会统一保存在一个规则库里,根据通用规则的用途来组织,比如词法分析通用规则库、句法分析通用规则库等等。通用规则库中可能包含很多不同的通用翻译规则,由于这些规则没有有优先级,所以在使用的时候。这里,比较简单的方式就是从头开始匹配通用规则,一旦某一条通用规则被激活使用后,继续从头开始匹配,直到找不到可用的具体通用翻译规则为止。在实际应用中,为了避免因通用翻译规则的覆盖度不全使得找不到合适的通用翻译规则进行匹配,导致最后分析和翻译失败,通常会默认设置一条缺省通用翻译规则作为最后的选择,比如默认采用最有可能的操作保证分析和翻译过程能够继续下去。 \parinterval 个性规则通常会保留在词库中,每条具体的个性规则会与某具体词汇关联,一个词汇可能会关联多条个性规则。在翻译的过程中,根据当前被分析的单词来激活所关联的个性规则。通用规则通常会统一保存在一个规则库里,根据通用规则的用途来组织,比如词法分析通用规则库、句法分析通用规则库等等。通用规则库中可能包含很多不同的通用翻译规则,由于这些规则没有优先级,所以比较简单的方式就是从头开始匹配通用规则,一旦某一条通用规则被激活使用后,继续从头开始匹配,直到找不到可用的具体通用翻译规则为止。在实际应用中,为了避免因通用翻译规则的覆盖度不全使得找不到合适的通用翻译规则进行匹配,导致最后分析和翻译失败,通常会默认设置一条缺省通用翻译规则作为最后的选择,比如默认采用最有可能的操作保证分析和翻译过程能够继续下去。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SUB-SECTION % NEW SUB-SECTION
...@@ -331,7 +331,7 @@ ...@@ -331,7 +331,7 @@
\subsection{基于中间语言的方法} \subsection{基于中间语言的方法}
\parinterval 基于转换的方法可以通过词汇层、句法层和语义层完成源语和目标的转换过程,虽然采用了独立分析和独立生成的两个子过程,但中间包含一个从源语到目标语的相关转换过程。这就会导致一个实际问题,假设需要实现$N$个语言之间互译的机器翻译系统,采用基于转换的方法,需要构建$N(N-1)$个不同的机器翻译系统,这个构建代价是非常高的。为了解决这个问题,一种有效的解决方案是使用{\small\bfnew{基于中间语言的机器翻译}}\index{基于中间语言的机器翻译}(Interlingua Based Translation)\index{Interlingua Based Translation}方法。 \parinterval 基于转换的方法可以通过词汇层、句法层和语义层完成从源语到目标语的转换过程,虽然采用了独立分析和独立生成两个子过程,但中间包含一个从源语到目标语的相关转换过程。这就会导致一个实际问题,假设需要实现$N$个语言之间互译的机器翻译系统,采用基于转换的方法,需要构建$N(N-1)$个不同的机器翻译系统,这个构建代价是非常高的。为了解决这个问题,一种有效的解决方案是使用{\small\bfnew{基于中间语言的机器翻译}}\index{基于中间语言的机器翻译}(Interlingua Based Translation)\index{Interlingua Based Translation}方法。
%---------------------------------------------- %----------------------------------------------
\begin{figure}[htp] \begin{figure}[htp]
...@@ -342,7 +342,7 @@ ...@@ -342,7 +342,7 @@
\end{figure} \end{figure}
%------------------------------------------- %-------------------------------------------
\parinterval 如图\ref{fig:1-13}所示,基于中间语言的方法最大特点就是采用了一个称之为``中间语言''的知识表示结构,将``中间语言''作为独立源语分析和独立目标语生成的桥梁,真正实现独立分析和独立生成的思想。并且在基于中间语言的方法中不涉及``相关转换''这个过程,这一点十分不同于基于转换的方法。 \parinterval 如图\ref{fig:1-13}所示,基于中间语言的方法最大特点就是采用了一个称之为``中间语言''的知识表示结构,将``中间语言''作为独立源语分析和独立目标语生成的桥梁,真正实现独立分析和独立生成的过程。并且在基于中间语言的方法中不涉及``相关转换''这个过程,这一点十分不同于基于转换的方法。
\parinterval 从图\ref{fig:1-10}可以发现,中间语言(知识表示)处于最顶端,本质上是独立于源语言和目标语言的,这也是基于中间语言的方法可以将分析过程和生成过程分开的原因。 \parinterval 从图\ref{fig:1-10}可以发现,中间语言(知识表示)处于最顶端,本质上是独立于源语言和目标语言的,这也是基于中间语言的方法可以将分析过程和生成过程分开的原因。
...@@ -369,7 +369,7 @@ ...@@ -369,7 +369,7 @@
\sectionnewpage \sectionnewpage
\section{数据驱动的方法} \section{数据驱动的方法}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parinterval 虽然基于规则的方法有种种优势,但是该方法人工代价过高的特点是与使用机器进行翻译的初衷相违背的。所以研究者们开始尝试,是否可以更好利用数据,从数据中学习到某些规律,而不是完全依靠人类来制定规则。在这样的思想下,基于数据驱动的方法诞生了。 \parinterval 虽然基于规则的方法有种种优势,但是该方法人工代价过高的特点是与使用机器进行翻译的初衷相违背的。所以研究者们开始尝试,是否可以更好利用数据,从数据中学习到某些规律,而不是完全依靠人类来制定规则。在这样的思想下,基于数据驱动的方法诞生了。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SUB-SECTION % NEW SUB-SECTION
......
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em,font=\large]
\node[fill=blue!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](words)at(vocab.south){There\\[-0.5ex]Here\\[-0.5ex]is\\[-0.5ex]one\\[-0.5ex]an\\[-0.5ex]appple};
\node[fill=blue!40,anchor=north,align=left,inner sep=2pt,minimum width=5em](spe)at(words.south){\color{white}{\small\bfnew{特殊符号}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2em,yshift=-1em]eos.south){$w_1$};
\node[anchor=north,unit,fill=red!10] (n11) at ([yshift=-0.5em]w1.south){$<$sos$>$};
\node[anchor=west,unit,fill=red!40,opacity=0.3] (n24) at ([xshift=6em]n11.east){an};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt24) at (n24.east) {\small{{\color{white} \textbf{-1.4}}}};
\node[anchor=south,unit,fill=red!40] (n23) at ([yshift=0.1em]n24.north){one};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt23) at (n23.east) {\small{{\color{white} \textbf{-0.6}}}};
\node[anchor=south,unit,fill=red!40] (n22) at ([yshift=0.1em]n23.north){Here};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt22) at (n22.east) {\small{{\color{white} \textbf{-0.3}}}};
\node[anchor=south,unit,fill=red!40] (n21) at ([yshift=0.1em]n22.north){There};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt21) at (n21.east) {\small{{\color{white} \textbf{-0.2}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n25) at ([yshift=-0.1em]n24.south){is};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt25) at (n25.east) {\small{{\color{white} \textbf{-2.2}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n26) at ([yshift=-0.1em]n25.south){apple};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt26) at (n26.east) {\small{{\color{white} \textbf{-2.6}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n27) at ([yshift=-0.1em]n26.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt27) at (n27.east) {\small{{\color{white} \textbf{-7.2}}}};
\node[anchor=south,unit,text=red] (w2) at ([yshift=0.5em]n21.north){$w_2$};
\node[anchor=west,unit,fill=red!40] (n31) at ([yshift=6em,xshift=7em]n21.east){is};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt31) at (n31.east) {\small{{\color{white} \textbf{-0.1}}}};
\node[anchor=north,unit,fill=red!40] (n32) at ([yshift=-0.1em]n31.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt32) at (n32.east) {\small{{\color{white} \textbf{-0.6}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n33) at ([yshift=-0.1em]n32.south){an};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt33) at (n33.east) {\small{{\color{white} \textbf{-2.4}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n34) at ([yshift=-0.1em]n33.south){one};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt34) at (n34.east) {\small{{\color{white} \textbf{-2.6}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n35) at ([yshift=-0.1em]n34.south){Here};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt35) at (n35.east) {\small{{\color{white} \textbf{-2.9}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n36) at ([yshift=-0.1em]n35.south){apple};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt36) at (n36.east) {\small{{\color{white} \textbf{-3.2}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3] (n37) at ([yshift=-0.1em]n36.south){There};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black,opacity=0.3] (pt37) at (n37.east) {\small{{\color{white} \textbf{-4.1}}}};
\node[anchor=north,unit,fill=red!40] (n41) at ([yshift=-0.5em]n37.south){is};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt41) at (n41.east) {\small{{\color{white} \textbf{-0.1}}}};
\node[anchor=north,unit,fill=red!40,opacity=0.3,minimum width=3.5em,minimum height=2.5em] (n51) at ([yshift=-0.1em]n41.south){};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2.5em,fill=black,opacity=0.3] (pt51) at (n51.east) {\small{{\color{white} \textbf{$<$-0.7}}}};
\node[anchor=south,unit,text=red] (w3) at ([yshift=0.5em]n31.north){$w_2$};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
\draw[->,ublue,very thick] (n11.east) -- (n22.west);
\draw[->,ublue,very thick] (n11.east) -- (n23.west);
\draw[->,ublue!20,very thick] (n11.east) -- (n24.west);
\draw[->,ublue!20,very thick] (n11.east) -- (n25.west);
\draw[->,ublue!20,very thick] (n11.east) -- (n26.west);
\draw[->,ublue!20,very thick] (n11.east) -- (n27.west);
\draw[->,ublue!20,very thick] (pt21.south) -- (n33.west);
\draw[->,ublue!20,very thick] (pt21.south) -- (n34.west);
\draw[->,ublue!20,very thick] (pt21.south) -- (n35.west);
\draw[->,ublue!20,very thick] (pt21.south) -- (n36.west);
\draw[->,ublue!20,very thick] (pt21.south) -- (n37.west);
\draw[->,ublue,very thick] (pt21.south) -- (n31.west);
\draw[->,ublue,very thick] (pt21.south) -- (n32.west);
\draw[->,ublue!20,very thick] (pt22.south) -- (n51.west);
\draw[->,ublue,very thick] (pt22.south) -- (n41.west);
\draw[->,ublue!20,very thick] (pt23.south) -- (n51.west);
\draw[decorate,decoration={brace},red,very thick] (pt24.south east) -- (pt27.south west);
\node[inner sep=0pt,text=red] at ([yshift=-2em,xshift=2em]pt25.east){剪枝};
\draw[decorate,decoration={brace},red,very thick] (pt33.south east) -- (pt37.south west);
\node[inner sep=0pt,text=red] at ([xshift=2em,yshift=-1em]pt35.east){剪枝};
\node[inner sep=0pt,text=red] at ([yshift=-1.5em,xshift=2em]pt51.east){剪枝};
\draw[->,ublue,very thick] (pt31.south) -- ([yshift=0.6em,xshift=0.6em]pt31.south);
\draw[->,ublue,very thick] (pt31.south) -- ([xshift=0.7em]pt31.south);
\draw[->,ublue,very thick] (pt31.south) -- ([yshift=-0.6em,xshift=0.6em]pt31.south);
\draw[->,ublue,very thick] (pt41.south) -- ([yshift=0.6em,xshift=0.6em]pt41.south);
\draw[->,ublue,very thick] (pt41.south) -- ([xshift=0.7em]pt41.south);
\draw[->,ublue,very thick] (pt41.south) -- ([yshift=-0.6em,xshift=0.6em]pt41.south);
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em,font=\large]
\node[fill=blue!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](words)at(vocab.south){I\\[-0.5ex]agree};
\node[fill=blue!40,anchor=north,align=left,inner sep=2pt,minimum width=5em](spe)at(words.south){\color{white}{\small\bfnew{特殊符号}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2em,yshift=-3em]eos.south){$w_1$};
\node[anchor=north,unit,fill=red!10] (n11) at ([yshift=-0.5em]w1.south){$<$sos$>$};
\node [anchor=north west] (wtranslabel) at ([xshift=-5em,yshift=-3em]n11.south) {\small{生成顺序:}};
\draw [->,ultra thick,red,line width=1.5pt,opacity=0.7] (wtranslabel.east) -- ([xshift=1.5em]wtranslabel.east);
\node[anchor=west,unit,fill=red!20] (n22) at ([xshift=3em]n11.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt22) at (n22.east) {\small{{\color{white} \textbf{-0.4}}}};
\node[anchor=south,unit,fill=red!20] (n21) at ([yshift=5.5em]n22.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt21) at (n21.east) {\small{{\color{white} \textbf{-0.5}}}};
\node[anchor=north,unit,fill=red!20] (n23) at ([yshift=-3em]n22.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt23) at (n23.east) {\small{{\color{white} \textbf{-2.2}}}};
\node[anchor=south,unit,text=red] (w2) at ([yshift=0.5em]n21.north){$w_2$};
\node[anchor=west,unit,fill=red!20] (n32) at ([xshift=4em]n21.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt32) at (n32.east) {\small{{\color{white} \textbf{-0.2}}}};
\node[anchor=south,unit,fill=red!20] (n31) at ([yshift=0.3em]n32.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt31) at (n31.east) {\small{{\color{white} \textbf{-1.8}}}};
\node[anchor=north,unit,fill=red!20] (n33) at ([yshift=-0.3em]n32.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt33) at (n33.east) {\small{{\color{white} \textbf{-1.3}}}};
\node[anchor=west,unit,fill=red!20] (n35) at ([xshift=4em]n22.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt35) at (n35.east) {\small{{\color{white} \textbf{-1.5}}}};
\node[anchor=south,unit,fill=red!20] (n34) at ([yshift=0.3em]n35.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt34) at (n34.east) {\small{{\color{white} \textbf{-2.0}}}};
\node[anchor=north,unit,fill=red!20] (n36) at ([yshift=-0.3em]n35.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt36) at (n36.east) {\small{{\color{white} \textbf{-1.3}}}};
\node[anchor=south,unit,text=red] (w3) at ([yshift=0.5em]n31.north){$w_3$};
\node[anchor=west,unit,fill=red!20] (n41) at ([xshift=4em]n31.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt41) at (n41.east) {\small{{\color{white} \textbf{-0.9}}}};
\node[anchor=west,unit,fill=red!20] (n42) at ([xshift=4em]n32.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt42) at (n42.east) {\small{{\color{white} \textbf{-0.8}}}};
\node[anchor=west,unit,fill=red!20] (n43) at ([xshift=4em]n34.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt43) at (n43.east) {\small{{\color{white} \textbf{-1.4}}}};
\node[anchor=west,unit,fill=red!20] (n44) at ([xshift=4em]n35.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt44) at (n44.east) {\small{{\color{white} \textbf{-0.1}}}};
\node[anchor=south,unit,text=red] (w4) at ([yshift=0.5em]n41.north){$w_4$};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
\draw[->,ublue,very thick] (n11.east) -- (n22.west);
\draw[->,ublue,very thick] (n11.east) -- (n23.west);
\draw[->,ublue,very thick] (pt21.south) -- (n31.west);
\draw[->,ublue,very thick] (pt21.south) -- (n32.west);
\draw[->,ublue,very thick] (pt21.south) -- (n33.west);
\draw[->,ublue,very thick] (pt22.south) -- (n34.west);
\draw[->,ublue,very thick] (pt22.south) -- (n35.west);
\draw[->,ublue,very thick] (pt22.south) -- (n36.west);
\draw[->,ublue,very thick] (pt31.south) -- (n41.west);
\draw[->,ublue,very thick] (pt32.south) -- (n42.west);
\draw[->,ublue,very thick] (pt34.south) -- (n43.west);
\draw[->,ublue,very thick] (pt35.south) -- (n44.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-0.5em]n11.west) -- (n11.east) -- (n22.west) -- (pt22.south) -- (n36.west) -- ([xshift=0.5em]pt36.south);
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em,font=\large]
\node[fill=blue!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](words)at(vocab.south){I\\[-0.5ex]agree};
\node[fill=blue!40,anchor=north,align=left,inner sep=2pt,minimum width=5em](spe)at(words.south){\color{white}{\small\bfnew{特殊符号}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2em,yshift=-3em]eos.south){$w_1$};
\node[anchor=north,unit,fill=red!10] (n11) at ([yshift=-0.5em]w1.south){$<$sos$>$};
\node [anchor=north west] (wtranslabel) at ([xshift=-5em,yshift=-3em]n11.south) {\small{生成顺序:}};
\draw [->,ultra thick,red,line width=1.5pt,opacity=0.7] (wtranslabel.east) -- ([xshift=1.5em]wtranslabel.east);
\node[anchor=west,unit,fill=red!20] (n22) at ([xshift=5em]n11.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt22) at (n22.east) {\small{{\color{white} \textbf{-0.4}}}};
\node[anchor=south,unit,fill=red!20] (n21) at ([yshift=5.5em]n22.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt21) at (n21.east) {\small{{\color{white} \textbf{-0.5}}}};
\node[anchor=north,unit,fill=red!20] (n23) at ([yshift=-3em]n22.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt23) at (n23.east) {\small{{\color{white} \textbf{-2.2}}}};
\node[anchor=south,unit,text=red] (w2) at ([yshift=0.5em]n21.north){$w_2$};
\node[anchor=west,unit,fill=red!20] (n35) at ([xshift=6em]n22.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt35) at (n35.east) {\small{{\color{white} \textbf{-1.5}}}};
\node[anchor=south,unit,fill=red!20] (n34) at ([yshift=0.3em]n35.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt34) at (n34.east) {\small{{\color{white} \textbf{-2.0}}}};
\node[anchor=north,unit,fill=red!20] (n36) at ([yshift=-0.3em]n35.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt36) at (n36.east) {\small{{\color{white} \textbf{-1.3}}}};
\node[anchor=south,unit,text=red] (w3) at ([yshift=0.5em]n34.north){$w_3$};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
\draw[->,ublue,very thick] (n11.east) -- (n22.west);
\draw[->,ublue,very thick] (n11.east) -- (n23.west);
\draw[->,ublue,very thick] (pt22.south) -- (n34.west);
\draw[->,ublue,very thick] (pt22.south) -- (n35.west);
\draw[->,ublue,very thick] (pt22.south) -- (n36.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-0.5em]n11.west) -- (n11.east) -- (n22.west) -- (pt22.south) -- (n36.west) -- ([xshift=0.5em]pt36.south);
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em,font=\large]
\node[fill=blue!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](words)at(vocab.south){I\\[-0.5ex]agree};
\node[fill=blue!40,anchor=north,align=left,inner sep=2pt,minimum width=5em](spe)at(words.south){\color{white}{\small\bfnew{特殊符号}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([yshift=-2em]eos.south){$w_1$};
\node[anchor=north,unit,fill=red!10] (n11) at ([yshift=-0.5em]w1.south){$<$sos$>$};
\node[anchor=west,unit,fill=red!20] (n22) at ([xshift=2.5em]n11.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt22) at (n22.east) {\small{{\color{white} \textbf{-0.4}}}};
\node[anchor=south,unit,fill=red!20] (n21) at ([yshift=5.5em]n22.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt21) at (n21.east) {\small{{\color{white} \textbf{-0.5}}}};
\node[anchor=north,unit,fill=red!20] (n23) at ([yshift=-3em]n22.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt23) at (n23.east) {\small{{\color{white} \textbf{-2.2}}}};
\node[anchor=south,unit,text=red] (w2) at ([yshift=0.5em]n21.north){$w_2$};
\node[anchor=west,unit,fill=green!20,minimum width=4.3em] (n32) at ([xshift=3em]n21.east){agree};
\node[anchor=south,unit,fill=green!20,minimum width=4.3em] (n31) at ([yshift=0.3em]n32.north){I};
\node[anchor=north,unit,fill=green!20,minimum width=4.3em] (n33) at ([yshift=-0.3em]n32.south){$<$eos$>$};
\node[anchor=west,unit,fill=red!20] (n35) at ([xshift=3em]n22.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt35) at (n35.east) {\small{{\color{white} \textbf{-1.5}}}};
\node[anchor=south,unit,fill=red!20] (n34) at ([yshift=0.3em]n35.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt34) at (n34.east) {\small{{\color{white} \textbf{-2.0}}}};
\node[anchor=north,unit,fill=red!20] (n36) at ([yshift=-0.3em]n35.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt36) at (n36.east) {\small{{\color{white} \textbf{-1.3}}}};
\node[anchor=south,unit,text=red] (w3) at ([yshift=0.5em]n31.north){$w_3$};
\node[anchor=west,unit] (s1) at ([xshift=1em]n32.east){score($<$sos$>$\ I)\ =\ {\red {-0.5}}};
\node[anchor=north west,unit] (s2) at ([yshift=-3em]s1.south west){score($<$sos$>$\ agree\ I)\ =\ -2.4};
\node[anchor=north west,unit] (s3) at ([yshift=-0.3em]s2.south west){score($<$sos$>$\ agree\ agree)\ =\ -1.9};
\node[anchor=north west,unit] (s4) at ([yshift=-0.3em]s3.south west){score($<$sos$>$\ agree\ $<$eos$>$)\ =\ -1.7};
\node[anchor=north west,unit] (s5) at ([yshift=-1em]s4.south west){score($<$sos$>$\ $<$eos$>$)\ =\ -2.2};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
\draw[->,ublue,very thick] (n11.east) -- (n22.west);
\draw[->,ublue,very thick] (n11.east) -- (n23.west);
\draw[->,ublue,very thick,dashed] (pt21.south) -- (n31.west);
\draw[->,ublue,very thick,dashed] (pt21.south) -- (n32.west);
\draw[->,ublue,very thick,dashed] (pt21.south) -- (n33.west);
\draw[->,ublue,very thick] (pt22.south) -- (n34.west);
\draw[->,ublue,very thick] (pt22.south) -- (n35.west);
\draw[->,ublue,very thick] (pt22.south) -- (n36.west);
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em,font=\large]
\node[fill=blue!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](words)at(vocab.south){I\\[-0.5ex]agree};
\node[fill=blue!40,anchor=north,align=left,inner sep=2pt,minimum width=5em](spe)at(words.south){\color{white}{\small\bfnew{特殊符号}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2em,yshift=-3em]eos.south){$w_1$};
\node[anchor=north,unit,fill=blue!10] (n11) at ([yshift=-0.5em]w1.south){$<$sos$>$};
\node [anchor=north west] (wtranslabel) at ([xshift=-5em,yshift=-3em]n11.south) {\small{生成顺序:}};
\draw [->,ultra thick,red,line width=1.5pt,opacity=0.7] (wtranslabel.east) -- ([xshift=1.5em]wtranslabel.east);
\node[anchor=west,unit,fill=red!20] (n22) at ([xshift=3em]n11.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt22) at (n22.east) {\small{{\color{white} \textbf{-0.4}}}};
\node[anchor=south,unit,fill=red!20] (n21) at ([yshift=5.5em]n22.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt21) at (n21.east) {\small{{\color{white} \textbf{-0.5}}}};
\node[anchor=north,unit,fill=blue!10] (n23) at ([yshift=-3em]n22.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt23) at (n23.east) {\small{{\color{white} \textbf{-2.2}}}};
\node[anchor=south,unit,text=red] (w2) at ([yshift=0.5em]n21.north){$w_2$};
\node[anchor=west,unit,fill=red!20] (n32) at ([xshift=4em]n21.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt32) at (n32.east) {\small{{\color{white} \textbf{-0.2}}}};
\node[anchor=south,unit,fill=red!20] (n31) at ([yshift=0.3em]n32.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt31) at (n31.east) {\small{{\color{white} \textbf{-1.8}}}};
\node[anchor=north,unit,fill=blue!10] (n33) at ([yshift=-0.3em]n32.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt33) at (n33.east) {\small{{\color{white} \textbf{-1.3}}}};
\node[anchor=west,unit,fill=red!20] (n35) at ([xshift=4em]n22.east){agree};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt35) at (n35.east) {\small{{\color{white} \textbf{-1.5}}}};
\node[anchor=south,unit,fill=red!20] (n34) at ([yshift=0.3em]n35.north){I};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt34) at (n34.east) {\small{{\color{white} \textbf{-2.0}}}};
\node[anchor=north,unit,fill=blue!10] (n36) at ([yshift=-0.3em]n35.south){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt36) at (n36.east) {\small{{\color{white} \textbf{-1.3}}}};
\node[anchor=south,unit,text=red] (w3) at ([yshift=0.5em]n31.north){$w_3$};
\node[anchor=west,unit,fill=blue!10] (n41) at ([xshift=4em]n31.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt41) at (n41.east) {\small{{\color{white} \textbf{-0.9}}}};
\node[anchor=west,unit,fill=blue!10] (n42) at ([xshift=4em]n32.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt42) at (n42.east) {\small{{\color{white} \textbf{-0.8}}}};
\node[anchor=west,unit,fill=blue!10] (n43) at ([xshift=4em]n34.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt43) at (n43.east) {\small{{\color{white} \textbf{-1.4}}}};
\node[anchor=west,unit,fill=blue!10] (n44) at ([xshift=4em]n35.east){$<$eos$>$};
\node [anchor=north,rotate=90,inner sep=1pt,minimum width=2em,fill=black] (pt44) at (n44.east) {\small{{\color{white} \textbf{-0.1}}}};
\node[anchor=south,unit,text=red] (w4) at ([yshift=0.5em]n41.north){$w_4$};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
\draw[->,ublue,very thick] (n11.east) -- (n22.west);
\draw[->,ublue,very thick] (n11.east) -- (n23.west);
\draw[->,ublue,very thick] (pt21.south) -- (n31.west);
\draw[->,ublue,very thick] (pt21.south) -- (n32.west);
\draw[->,ublue,very thick] (pt21.south) -- (n33.west);
\draw[->,ublue,very thick] (pt22.south) -- (n34.west);
\draw[->,ublue,very thick] (pt22.south) -- (n35.west);
\draw[->,ublue,very thick] (pt22.south) -- (n36.west);
\draw[->,ublue,very thick] (pt31.south) -- (n41.west);
\draw[->,ublue,very thick] (pt32.south) -- (n42.west);
\draw[->,ublue,very thick] (pt34.south) -- (n43.west);
\draw[->,ublue,very thick] (pt35.south) -- (n44.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-0.5em]n11.west) -- (n11.east) -- (n21.west) -- (n21.east) -- ([xshift=0.5em]pt42.south);
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em]
\tikzstyle{word} = [inner sep=1pt,align=center,minimum width=3.5em,minimum height=2em]
\node[anchor=west,unit,text=red] (w1) at (0,0){{$w_1$}};
\node[anchor=north,unit,fill=blue!10] (n11) at ([yshift=-0.8em]w1.south){$<$sos$>$};
\node[anchor=north,unit,fill=blue!10] (n12) at ([yshift=-1.5em]n11.south){$<$sos$>$};
\node[anchor=north,unit,fill=blue!10] (n13) at ([yshift=-1.5em]n12.south){$<$sos$>$};
\node[anchor=north,unit,fill=blue!10] (n14) at ([yshift=-1.5em]n13.south){$<$sos$>$};
\node[anchor=east,unit] (step1) at ([xshift=-1em]n11.west){Step1:};
\node[anchor=east,unit] (step2) at ([xshift=-1em]n12.west){Step2:};
\node[anchor=east,unit] (step3) at ([xshift=-1em]n13.west){Step3:};
\node[anchor=east,unit] (step4) at ([xshift=-1em]n14.west){Step4:};
\node[anchor=west,unit,text=red] (w2) at ([xshift=1.5em]w1.east){$w_2$};
\node[anchor=north,unit] (n21) at ([yshift=-0.8em]w2.south){};
\node[anchor=north,word,fill=red!20] (n22) at ([yshift=-1.5em]n21.south){I};
\node[anchor=north,word,fill=red!20] (n23) at ([yshift=-1.5em]n22.south){I};
\node[anchor=north,word,fill=red!20] (n24) at ([yshift=-1.5em]n23.south){I};
\node[anchor=west,unit,text=red] (w3) at ([xshift=1.5em]w2.east){$w_3$};
\node[anchor=north,unit] (n31) at ([yshift=-0.8em]w3.south){};
\node[anchor=north,unit] (n32) at ([yshift=-1.5em]n31.south){};
\node[anchor=north,word,fill=red!20] (n33) at ([yshift=-1.5em]n32.south){agree};
\node[anchor=north,word,fill=red!20] (n34) at ([yshift=-1.5em]n33.south){agree};
\node[anchor=west,unit,text=red] (w4) at ([xshift=1.5em]w3.east){$w_4$};
\node[anchor=north,unit] (n41) at ([yshift=-0.8em]w4.south){};
\node[anchor=north,unit] (n42) at ([yshift=-1.5em]n41.south){};
\node[anchor=north,unit] (n43) at ([yshift=-1.5em]n42.south){};
\node[anchor=north,unit,fill=blue!10] (n44) at ([yshift=-1.5em]n43.south){$<$eos$>$};
\begin{pgfonlayer}{background}
\node [draw=red,very thick,rectangle,inner sep=2.5pt,rounded corners=2pt,dashed] [fit = (n12)] (box1) {};
\node [draw=red,very thick,rectangle,inner sep=2.5pt,rounded corners=2pt,dashed] [fit = (n13)(n23)] (box2) {};
\node [draw=red,very thick,rectangle,inner sep=2.5pt,rounded corners=2pt,dashed] [fit = (n14)(n24)(n34)] (box3) {};
\end{pgfonlayer}
\draw[-latex,red,thick] (box1.south).. controls +(300:0.45) and +(240:0.45) .. (n22.south);
\draw[-latex,red,thick] (box2.south).. controls +(290:0.45) and +(250:0.45) .. (n33.south);
\draw[-latex,red,thick] (box3.south).. controls +(280:0.5) and +(260:0.5) .. (n44.south);
\end{tikzpicture}
\ No newline at end of file
\begin{tikzpicture}
\tikzstyle{unit} = [inner sep=1pt,align=center,minimum width=4em,minimum height=2em]
\node[fill=blue!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](words)at(vocab.south){I\\[-0.5ex]agree};
\node[fill=blue!40,anchor=north,align=left,inner sep=2pt,minimum width=5em](spe)at(words.south){\color{white}{\small\bfnew{特殊符号}}};
\node[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([yshift=-1em]eos.south){$w_1$};
\node[anchor=north,unit,fill=blue!10] (n11) at ([yshift=-0.5em]w1.south){{\small\bfnew{$<$sos$>$}}};
\node[anchor=west,unit,fill=red!20] (n22) at ([xshift=3em]n11.east){{\small\bfnew{agree}}};
\node[anchor=south,unit,fill=red!20] (n21) at ([yshift=5.5em]n22.north){{\small\bfnew{I}}};
\node[anchor=north,unit,fill=blue!10] (n23) at ([yshift=-3em]n22.south){{\small\bfnew{$<$eos$>$}}};
\node[anchor=south,unit,text=red] (w2) at ([yshift=0.5em]n21.north){$w_2$};
\node[anchor=west,unit,fill=red!20] (n32) at ([xshift=3em]n21.east){{\small\bfnew{agree}}};
\node[anchor=south,unit,fill=red!20] (n31) at ([yshift=0.3em]n32.north){{\small\bfnew{I}}};
\node[anchor=north,unit,fill=blue!10] (n33) at ([yshift=-0.3em]n32.south){{\small\bfnew{$<$eos$>$}}};
\node[anchor=west,unit,fill=red!20] (n35) at ([xshift=3em]n22.east){{\small\bfnew{agree}}};
\node[anchor=south,unit,fill=red!20] (n34) at ([yshift=0.3em]n35.north){{\small\bfnew{I}}};
\node[anchor=north,unit,fill=blue!10] (n36) at ([yshift=-0.3em]n35.south){{\small\bfnew{$<$eos$>$}}};
\node[anchor=south,unit,text=red] (w3) at ([yshift=0.5em]n31.north){$w_3$};
\node[anchor=west,unit,fill=blue!10] (n41) at ([xshift=3em]n31.east){{\small\bfnew{$<$eos$>$}}};
\node[anchor=west,unit,fill=blue!10] (n42) at ([xshift=3em]n32.east){{\small\bfnew{$<$eos$>$}}};
\node[anchor=west,unit,fill=blue!10] (n43) at ([xshift=3em]n34.east){{\small\bfnew{$<$eos$>$}}};
\node[anchor=west,unit,fill=blue!10] (n44) at ([xshift=3em]n35.east){{\small\bfnew{$<$eos$>$}}};
\node[anchor=south,unit,text=red] (w4) at ([yshift=0.5em]n41.north){$w_4$};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
\draw[->,ublue,very thick] (n11.east) -- (n22.west);
\draw[->,ublue,very thick] (n11.east) -- (n23.west);
\draw[->,ublue,very thick] (n21.east) -- (n31.west);
\draw[->,ublue,very thick] (n21.east) -- (n32.west);
\draw[->,ublue,very thick] (n21.east) -- (n33.west);
\draw[->,ublue,very thick] (n22.east) -- (n34.west);
\draw[->,ublue,very thick] (n22.east) -- (n35.west);
\draw[->,ublue,very thick] (n22.east) -- (n36.west);
\draw[->,ublue,very thick] (n31.east) -- (n41.west);
\draw[->,ublue,very thick] (n32.east) -- (n42.west);
\draw[->,ublue,very thick] (n34.east) -- (n43.west);
\draw[->,ublue,very thick] (n35.east) -- (n44.west);
\end{tikzpicture}
...@@ -22,15 +22,7 @@ ...@@ -22,15 +22,7 @@
% CHAPTER 2 % CHAPTER 2
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
\chapter{统计建模基础及$n$-gram语言模型} \chapter{统计语言建模基础}
\parinterval 机器翻译并非是一个孤立的系统,它依赖于很多模块,并且需要很多学科知识的融合。现在的机器翻译系统大多使用统计模型对翻译问题进行建模,同时也会用到一些自然语言处理工具来对不同语言的文字进行分析。因此,在正式开始机器翻译内容的介绍之前,本章将会对相关的基础知识进行概述,包括:概率论与统计建模基础、语言分析、语言建模等。
\parinterval 概率论与统计建模是机器翻译方法的基础。这里会对机器翻译所涉及的基本数学概念进行简要描述,确保后续使用到的数学工具是完备的。本章会重点关注如何利用统计建模的方式对自然语言处理问题进行描述,这种手段在统计机器翻译和神经机器翻译中会被使用。
\parinterval 语言分析部分将以汉语为例介绍词法和句法分析的基本概念。它们都是自然语言处理中的经典问题,而且在机器翻译中也会经常被使用。同样,本章会介绍这两个任务的定义和求解问题的思路。
\parinterval 语言建模是机器翻译中最常用的一种技术,它主要用于句子的生成和流畅度评价。本章会以传统统计语言模型为例,对语言建模的相关概念进行介绍。但是,这里并不深入探讨语言模型技术,在后面的章节中还会单独对神经网络语言模型等前沿技术进行讨论。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SECTION % NEW SECTION
...@@ -487,7 +479,7 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -487,7 +479,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\parinterval 直接求$\textrm{P}(w_1 w_2...w_m)$并不简单,因为如果把整个词串$w_1 w_2...w_m$作为一个变量,模型的参数量会非常大。$w_1 w_2...w_m$$|V|^m$种可能性,这里$|V|$表示词汇表大小。显然,当$m$ 增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。既然把$w_1 w_2...w_m$作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则,很容易得到 \parinterval 直接求$\textrm{P}(w_1 w_2...w_m)$并不简单,因为如果把整个词串$w_1 w_2...w_m$作为一个变量,模型的参数量会非常大。$w_1 w_2...w_m$$|V|^m$种可能性,这里$|V|$表示词汇表大小。显然,当$m$ 增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。既然把$w_1 w_2...w_m$作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则,很容易得到
\begin{eqnarray} \begin{eqnarray}
\textrm{P}(w_1 w_2...w_m)=\textrm{P}(w_1)\textrm{P}(w_2|w_1)\textrm{P}(w_3|w_1 w_2)...\textrm{P}(w_m|w_1 w_2...w_{m-1}) \textrm{P}(w_1 w_2...w_m)=\textrm{P}(w_1)\textrm{P}(w_2|w_1)\textrm{P}(w_3|w_1 w_2)...\textrm{P}(w_m|w_1 w_2...w_{m-1})
\label{eq:2-22} \label{eq:2-20}
\end{eqnarray} \end{eqnarray}
这样,$w_1 w_2...w_m$的生成可以被看作是逐个生成每个单词的过程,即首先生成$w_1$,然后根据$w_1$再生成$w_2$,然后根据$w_1 w_2$再生成$w_3$,以此类推,直到根据所有前$m-1$个词生成序列的最后一个单词$w_m$。这个模型把联合概率$\textrm{P}(w_1 w_2...w_m)$分解为多个条件概率的乘积,虽然对生成序列的过程进行了分解,但是模型的复杂度和以前是一样的,比如,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$ 仍然不好计算。 这样,$w_1 w_2...w_m$的生成可以被看作是逐个生成每个单词的过程,即首先生成$w_1$,然后根据$w_1$再生成$w_2$,然后根据$w_1 w_2$再生成$w_3$,以此类推,直到根据所有前$m-1$个词生成序列的最后一个单词$w_m$。这个模型把联合概率$\textrm{P}(w_1 w_2...w_m)$分解为多个条件概率的乘积,虽然对生成序列的过程进行了分解,但是模型的复杂度和以前是一样的,比如,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$ 仍然不好计算。
...@@ -495,12 +487,13 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -495,12 +487,13 @@ F(x)=\int_{-\infty}^x f(x)dx
\parinterval 换一个角度看,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$体现了一种基于``历史''的单词生成模型,也就是把前面生成的所有单词作为``历史'',并参考这个``历史''生成当前单词。但是这个``历史''的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面$n-1$个历史单词来生成当前单词,这就是$n$-gram语言模型。这个模型的数学描述如下: \parinterval 换一个角度看,$\textrm{P}(w_m|w_1 w_2...w_{m-1})$体现了一种基于``历史''的单词生成模型,也就是把前面生成的所有单词作为``历史'',并参考这个``历史''生成当前单词。但是这个``历史''的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面$n-1$个历史单词来生成当前单词,这就是$n$-gram语言模型。这个模型的数学描述如下:
\begin{eqnarray} \begin{eqnarray}
\textrm{P}(w_m|w_1 w_2...w_{m-1}) \approx \textrm{P}(w_m|w_{m-n+1}...w_{m-1}) \textrm{P}(w_m|w_1 w_2...w_{m-1}) \approx \textrm{P}(w_m|w_{m-n+1}...w_{m-1})
\label{eq:2-23} \label{eq:2-21}
\end{eqnarray} \end{eqnarray}
\parinterval 这样,整个序列$w_1 w_2...w_m$的生成概率可以被重新定义为:\\ \\ \\ \parinterval 这样,整个序列$w_1 w_2...w_m$的生成概率可以被重新定义为:
\vspace{0.5em} %------------------------------------------------------
\begin{table}[htp]{
\begin{center} \begin{center}
{\footnotesize {\footnotesize
\begin{tabular}{l|l|l l|l} \begin{tabular}{l|l|l l|l}
...@@ -516,6 +509,8 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -516,6 +509,8 @@ F(x)=\int_{-\infty}^x f(x)dx
\end{tabular} \end{tabular}
} }
\end{center} \end{center}
}\end{table}
%------------------------------------------------------
\parinterval 可以看到,1-gram语言模型只是$n$-gram语言模型的一种特殊形式。基于独立性假设,1-gram假定当前词出现与否与任何历史都无关,这种方法大大化简了求解句子概率的复杂度。但是,实际上句子中的词汇并非完全相互独立的,这种语言模型并不能完美的描述客观世界的问题。如果需要更精确地获取句子的概率,就需要使用$n$-gram语言模型。 \parinterval 可以看到,1-gram语言模型只是$n$-gram语言模型的一种特殊形式。基于独立性假设,1-gram假定当前词出现与否与任何历史都无关,这种方法大大化简了求解句子概率的复杂度。但是,实际上句子中的词汇并非完全相互独立的,这种语言模型并不能完美的描述客观世界的问题。如果需要更精确地获取句子的概率,就需要使用$n$-gram语言模型。
...@@ -528,7 +523,7 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -528,7 +523,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\item {\small\bfnew{极大似然估计}}\index{极大似然估计}。直接利用词序列在训练数据中出现的频度计算出$\textrm{P}(w_m|w_{m-n+1}$\\$... w_{m-1})$ \item {\small\bfnew{极大似然估计}}\index{极大似然估计}。直接利用词序列在训练数据中出现的频度计算出$\textrm{P}(w_m|w_{m-n+1}$\\$... w_{m-1})$
\begin{eqnarray} \begin{eqnarray}
\textrm{P}(w_m|w_{m-n+1}...w_{m-1})=\frac{\textrm{count}(w_{m-n+1}...w_m)}{\textrm{count}(w_{m-n+1}...w_{m-1})} \textrm{P}(w_m|w_{m-n+1}...w_{m-1})=\frac{\textrm{count}(w_{m-n+1}...w_m)}{\textrm{count}(w_{m-n+1}...w_{m-1})}
\label{eq:2-24} \label{eq:2-22}
\vspace{0.5em} \vspace{0.5em}
\end{eqnarray} \end{eqnarray}
...@@ -547,7 +542,7 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -547,7 +542,7 @@ F(x)=\int_{-\infty}^x f(x)dx
& &\textrm{P}_{2-gram}{(\textrm{``确实}/\textrm{现在}/\textrm{数据}/\textrm{}/\textrm{多''})} \nonumber \\ & &\textrm{P}_{2-gram}{(\textrm{``确实}/\textrm{现在}/\textrm{数据}/\textrm{}/\textrm{多''})} \nonumber \\
&= & \textrm{P}(\textrm{``确实''}) \times\textrm{P}(\textrm{``现在''}|\textrm{``确实''})\times\textrm{P}(\textrm{``数据''}|\textrm{``现在''}) \times \nonumber \\ &= & \textrm{P}(\textrm{``确实''}) \times\textrm{P}(\textrm{``现在''}|\textrm{``确实''})\times\textrm{P}(\textrm{``数据''}|\textrm{``现在''}) \times \nonumber \\
& & \textrm{P}(\textrm{``很''}|\textrm{``数据''})\times\textrm{P}(\textrm{``多''}|\textrm{``很''}) & & \textrm{P}(\textrm{``很''}|\textrm{``数据''})\times\textrm{P}(\textrm{``多''}|\textrm{``很''})
\label{eq:2-25} \label{eq:2-23}
\end{eqnarray} \end{eqnarray}
\parinterval$n$-gram语言模型为代表的统计语言模型的应用非常广泛。除了将要在第三章中介绍的全概率分词方法,在文本生成、信息检索、摘要等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型为解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。很快我们就会看到,这种建模方式会被广泛地用于机器翻译建模,在统计机器翻译和神经机器翻译中都会有明显的体现。 \parinterval$n$-gram语言模型为代表的统计语言模型的应用非常广泛。除了将要在第三章中介绍的全概率分词方法,在文本生成、信息检索、摘要等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型为解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。很快我们就会看到,这种建模方式会被广泛地用于机器翻译建模,在统计机器翻译和神经机器翻译中都会有明显的体现。
...@@ -558,12 +553,12 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -558,12 +553,12 @@ F(x)=\int_{-\infty}^x f(x)dx
\subsection{未登录词和平滑算法}\label{sec2:smoothing} \subsection{未登录词和平滑算法}\label{sec2:smoothing}
\parinterval 在式\ref{eq:2-25}所示的例子中,如果语料中从没有``确实''和``现在''两个词连续出现的情况,那么使用2-gram计算切分``确实/现在/数据/很/多''的概率时,会出现如下情况 \parinterval 在式\ref{eq:2-23}所示的例子中,如果语料中从没有``确实''和``现在''两个词连续出现的情况,那么使用2-gram计算切分``确实/现在/数据/很/多''的概率时,会出现如下情况
\begin{eqnarray} \begin{eqnarray}
\textrm{P}(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\textrm{count}(\textrm{``确实}\,\textrm{现在''})}{\textrm{count}(\textrm{``确实''})} \nonumber \\ \textrm{P}(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\textrm{count}(\textrm{``确实}\,\textrm{现在''})}{\textrm{count}(\textrm{``确实''})} \nonumber \\
& = & \frac{0}{\textrm{count}(\textrm{``确实''})} \nonumber \\ & = & \frac{0}{\textrm{count}(\textrm{``确实''})} \nonumber \\
& = & 0 & = & 0
\label{eq:2-26} \label{eq:2-24}
\end{eqnarray} \end{eqnarray}
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。 更常见的问题是那些根本没有出现在词表中的词,称为{\small\sffamily\bfseries{未登录词}}\index{未登录词}(Out-of-Vocabulary Word,OOV Word)\index{Out-of-Vocabulary Word,OOV Word},比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0 概率。图\ref{fig:2-11}展示了一个真实语料库中词语出现频度的分布,可以看到绝大多数词都是低频词。 \parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。 更常见的问题是那些根本没有出现在词表中的词,称为{\small\sffamily\bfseries{未登录词}}\index{未登录词}(Out-of-Vocabulary Word,OOV Word)\index{Out-of-Vocabulary Word,OOV Word},比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0 概率。图\ref{fig:2-11}展示了一个真实语料库中词语出现频度的分布,可以看到绝大多数词都是低频词。
...@@ -594,7 +589,7 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -594,7 +589,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\begin{eqnarray} \begin{eqnarray}
\textrm{P}(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\theta + \textrm{count}(\textrm{``确实''/``现在''})}{\sum_{w}^{|V|}(\theta + \textrm{count}(\textrm{``确实''/}w))} \nonumber \\ \textrm{P}(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\theta + \textrm{count}(\textrm{``确实''/``现在''})}{\sum_{w}^{|V|}(\theta + \textrm{count}(\textrm{``确实''/}w))} \nonumber \\
& = & \frac{\theta + \textrm{count}(\textrm{``确实''/``现在''})}{\theta{|V|} + \textrm{count}(\textrm{``确实''})} & = & \frac{\theta + \textrm{count}(\textrm{``确实''/``现在''})}{\theta{|V|} + \textrm{count}(\textrm{``确实''})}
\label{eq:2-27} \label{eq:2-25}
\end{eqnarray} \end{eqnarray}
\noindent 其中,$V$表示所有词汇的词表,$|V|$为词表中单词的个数,$w$为词典中的一个词。有时候,加法平滑方法会将$\theta$取1,这时称之为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此也往往被用于对系统的快速原型中。 \noindent 其中,$V$表示所有词汇的词表,$|V|$为词表中单词的个数,$w$为词典中的一个词。有时候,加法平滑方法会将$\theta$取1,这时称之为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此也往往被用于对系统的快速原型中。
...@@ -622,19 +617,19 @@ F(x)=\int_{-\infty}^x f(x)dx ...@@ -622,19 +617,19 @@ F(x)=\int_{-\infty}^x f(x)dx
\parinterval 假定在语料库中出现$r$次的$n$-gram有$n_r$个,特别的,出现0次的$n$-gram(即未登录词及词串)出现的次数为$n_0$个。语料库中全部词语的个数为$N$,显然 \parinterval 假定在语料库中出现$r$次的$n$-gram有$n_r$个,特别的,出现0次的$n$-gram(即未登录词及词串)出现的次数为$n_0$个。语料库中全部词语的个数为$N$,显然
\begin{eqnarray} \begin{eqnarray}
N = \sum_{r=1}^{\infty}{r\,n_r} N = \sum_{r=1}^{\infty}{r\,n_r}
\label{eq:2-28} \label{eq:2-26}
\end{eqnarray} \end{eqnarray}
\parinterval 这时,出现$r$次的$n$-gram的相对频率为$r/N$,也就是不做平滑处理时的概率估计。为了解决零概率问题,对于任何一个出现$r$次的$n$-gram,古德-图灵估计法利用出现$r+1$次的$n$-gram统计量重新假设它出现$r^*$次,这里 \parinterval 这时,出现$r$次的$n$-gram的相对频率为$r/N$,也就是不做平滑处理时的概率估计。为了解决零概率问题,对于任何一个出现$r$次的$n$-gram,古德-图灵估计法利用出现$r+1$次的$n$-gram统计量重新假设它出现$r^*$次,这里
\begin{eqnarray} \begin{eqnarray}
r^* = (r + 1)\frac{n_{r + 1}}{n_r} r^* = (r + 1)\frac{n_{r + 1}}{n_r}
\label{eq:2-29} \label{eq:2-27}
\end{eqnarray} \end{eqnarray}
\parinterval 基于这个公式,就可以估计所有0次$n$-gram的频次$n_0 r^*=(r+1)n_1=n_1$。要把这个重新估计的统计数转化为概率,需要进行归一化处理:对于每个统计数为$r$的事件,其概率为 \parinterval 基于这个公式,就可以估计所有0次$n$-gram的频次$n_0 r^*=(r+1)n_1=n_1$。要把这个重新估计的统计数转化为概率,需要进行归一化处理:对于每个统计数为$r$的事件,其概率为
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_r=\frac{r^*}{N} \textrm{P}_r=\frac{r^*}{N}
\label{eq:2-30} \label{eq:2-28}
\end{eqnarray} \end{eqnarray}
\vspace{5em} \vspace{5em}
...@@ -643,7 +638,7 @@ r^* = (r + 1)\frac{n_{r + 1}}{n_r} ...@@ -643,7 +638,7 @@ r^* = (r + 1)\frac{n_{r + 1}}{n_r}
N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
& = & \sum_{r=0}^{\infty}{(r + 1)n_{r + 1}} \nonumber \\ & = & \sum_{r=0}^{\infty}{(r + 1)n_{r + 1}} \nonumber \\
& = & \sum_{r=1}^{\infty}{r\,n_r} & = & \sum_{r=1}^{\infty}{r\,n_r}
\label{eq:2-31} \label{eq:2-29}
\end{eqnarray} \end{eqnarray}
也就是说,$N$仍然为这个整个样本分布最初的计数。样本中所有事件的概率之和为: 也就是说,$N$仍然为这个整个样本分布最初的计数。样本中所有事件的概率之和为:
...@@ -651,7 +646,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\ ...@@ -651,7 +646,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
\textrm{P}(r>0) & = & \sum_{r>0}{\textrm{P}_r} \nonumber \\ \textrm{P}(r>0) & = & \sum_{r>0}{\textrm{P}_r} \nonumber \\
& = & 1 - \frac{n_1}{N} \nonumber \\ & = & 1 - \frac{n_1}{N} \nonumber \\
& < & 1 & < & 1
\label{eq:2-32} \label{eq:2-30}
\end{eqnarray} \end{eqnarray}
\noindent 其中$n_1/N$就是分配给所有出现为0次事件的概率。古德-图灵方法最终通过出现1次的$n$-gram估计了出现为0次的事件概率,达到了平滑的效果。 \noindent 其中$n_1/N$就是分配给所有出现为0次事件的概率。古德-图灵方法最终通过出现1次的$n$-gram估计了出现为0次的事件概率,达到了平滑的效果。
...@@ -677,7 +672,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\ ...@@ -677,7 +672,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
}\end{table} }\end{table}
%------------------------------------------------------ %------------------------------------------------------
\vspace{-1.5em} %\vspace{-1.5em}
\parinterval$r$很大的时候经常会出现$n_{r+1}=0$的情况,而且这时$n_r$也会有噪音存在。通常,简单的古德-图灵方法可能无法很好的处理这种复杂的情况,不过古德-图灵方法仍然是其他一些平滑方法的基础。 \parinterval$r$很大的时候经常会出现$n_{r+1}=0$的情况,而且这时$n_r$也会有噪音存在。通常,简单的古德-图灵方法可能无法很好的处理这种复杂的情况,不过古德-图灵方法仍然是其他一些平滑方法的基础。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
...@@ -691,7 +686,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\ ...@@ -691,7 +686,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
\parinterval 首先介绍一下absolute discounting平滑算法,公式如下所示: \parinterval 首先介绍一下absolute discounting平滑算法,公式如下所示:
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_{\textrm{AbsDiscount}}(w_i | w_{i-1}) = \frac{c(w_{i-1},w_i )-d}{c(w_{i-1})} + \lambda(w_{i-1})\textrm{P}(w) \textrm{P}_{\textrm{AbsDiscount}}(w_i | w_{i-1}) = \frac{c(w_{i-1},w_i )-d}{c(w_{i-1})} + \lambda(w_{i-1})\textrm{P}(w)
\label{eq:2-33} \label{eq:2-31}
\end{eqnarray} \end{eqnarray}
\noindent 其中$d$表示被裁剪的值,$\lambda$是一个正则化常数。可以看到第一项是经过减值调整过的2-gram的概率值,第二项则相当于一个带权重$\lambda$的1-gram的插值项。然而这种插值模型极易受到原始1-gram 模型的干扰。 \noindent 其中$d$表示被裁剪的值,$\lambda$是一个正则化常数。可以看到第一项是经过减值调整过的2-gram的概率值,第二项则相当于一个带权重$\lambda$的1-gram的插值项。然而这种插值模型极易受到原始1-gram 模型的干扰。
...@@ -711,31 +706,31 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ } ...@@ -711,31 +706,31 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ }
\parinterval 为了评估$\textrm{P}_{\textrm{cont}}$,统计使用当前词作为第二个词所出现二元语法的种类,二元语法种类越多,这个词作为第二个词出现的可能性越高,呈正比: \parinterval 为了评估$\textrm{P}_{\textrm{cont}}$,统计使用当前词作为第二个词所出现二元语法的种类,二元语法种类越多,这个词作为第二个词出现的可能性越高,呈正比:
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_{\textrm{cont}}(w_i) \varpropto |w_{i-1}: c(w_{i-1} w_i )>0| \textrm{P}_{\textrm{cont}}(w_i) \varpropto |w_{i-1}: c(w_{i-1} w_i )>0|
\label{eq:2-34} \label{eq:2-32}
\end{eqnarray} \end{eqnarray}
通过全部的二元语法的种类做归一化可得到评估的公式 通过全部的二元语法的种类做归一化可得到评估的公式
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{|\{ (w_{j-1}, w_j):c(w_{j-1}w_j )>0 \}|} \textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{|\{ (w_{j-1}, w_j):c(w_{j-1}w_j )>0 \}|}
\label{eq:2-35} \label{eq:2-33}
\end{eqnarray} \end{eqnarray}
\parinterval 基于分母的变化还有另一种形式 \parinterval 基于分母的变化还有另一种形式
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{\sum_{w^{\prime}}|\{ w_{i-1}^{\prime}:c(w_{i-1}^{\prime} w_i^{\prime} )>0 \}|} \textrm{P}_{\textrm{cont}}(w_i) = \frac{|\{ w_{i-1}:c(w_{i-1} w_i )>0 \}|}{\sum_{w^{\prime}}|\{ w_{i-1}^{\prime}:c(w_{i-1}^{\prime} w_i^{\prime} )>0 \}|}
\label{eq:2-36} \label{eq:2-34}
\end{eqnarray} \end{eqnarray}
结合基础的absolute discounting计算公式,从而得到了Kneser-Ney平滑方法的公式 结合基础的absolute discounting计算公式,从而得到了Kneser-Ney平滑方法的公式
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_{\textrm{KN}}(w_i|w_{i-1}) = \frac{\max(c(w_{i-1},w_i )-d,0)}{c(w_{i-1})}+ \lambda(w_{i-1})\textrm{P}_{\textrm{cont}}(w_i) \textrm{P}_{\textrm{KN}}(w_i|w_{i-1}) = \frac{\max(c(w_{i-1},w_i )-d,0)}{c(w_{i-1})}+ \lambda(w_{i-1})\textrm{P}_{\textrm{cont}}(w_i)
\label{eq:2-37} \label{eq:2-35}
\end{eqnarray} \end{eqnarray}
\noindent 其中 \noindent 其中
\begin{eqnarray} \begin{eqnarray}
\lambda(w_{i-1}) = \frac{d}{c(w_{i-1})}|\{w:c(w_{i-1},w)>0\}| \lambda(w_{i-1}) = \frac{d}{c(w_{i-1})}|\{w:c(w_{i-1},w)>0\}|
\label{eq:2-38} \label{eq:2-36}
\end{eqnarray} \end{eqnarray}
\noindent 这里$\max(\cdot)$保证了分子部分为不小0的数,原始1-gram更新成$\textrm{P}_{\textrm{cont}}$概率分布,$\lambda$是正则化项。 \noindent 这里$\max(\cdot)$保证了分子部分为不小0的数,原始1-gram更新成$\textrm{P}_{\textrm{cont}}$概率分布,$\lambda$是正则化项。
...@@ -744,18 +739,18 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ } ...@@ -744,18 +739,18 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ }
\begin{eqnarray} \begin{eqnarray}
\textrm{P}_{\textrm{KN}}(w_i|w_{i-n+1} ...w_{i-1}) & = & \frac{\max(c_{\textrm{KN}}(w_{i-n+1}...w_{i-1})-d,0)}{c_{\textrm{KN}}(w_{i-n+1}...w_{i-1})} + \nonumber \\ \textrm{P}_{\textrm{KN}}(w_i|w_{i-n+1} ...w_{i-1}) & = & \frac{\max(c_{\textrm{KN}}(w_{i-n+1}...w_{i-1})-d,0)}{c_{\textrm{KN}}(w_{i-n+1}...w_{i-1})} + \nonumber \\
& & \lambda(w_{i-n+1}...w_{i-1})\textrm{P}_{\textrm{KN}}(w_i|w_{i-n+2}...w_{i-1}) & & \lambda(w_{i-n+1}...w_{i-1})\textrm{P}_{\textrm{KN}}(w_i|w_{i-n+2}...w_{i-1})
\label{eq:2-39} \label{eq:2-37}
\end{eqnarray} \end{eqnarray}
\begin{eqnarray} \begin{eqnarray}
\lambda(w_{i-1}) = \frac{d}{c_{\textrm{KN}}(w_{i-n+1}^{i-1})}|\{w:c_{\textrm{KN}}(w_{i-n+1}...w_{i-1}w)>0\} \lambda(w_{i-1}) = \frac{d}{c_{\textrm{KN}}(w_{i-n+1}^{i-1})}|\{w:c_{\textrm{KN}}(w_{i-n+1}...w_{i-1}w)>0\}
\label{eq:2-40} \label{eq:2-38}
\end{eqnarray} \end{eqnarray}
\begin{eqnarray} \begin{eqnarray}
c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll} c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\textrm{count}(\cdot) & \textrm{for\ highest\ order} \\ \textrm{count}(\cdot) & \textrm{for\ highest\ order} \\
\textrm{catcount}(\cdot) & \textrm{for\ lower\ order} \textrm{catcount}(\cdot) & \textrm{for\ lower\ order}
\end{array}\right. \end{array}\right.
\label{eq:2-41} \label{eq:2-39}
\end{eqnarray} \end{eqnarray}
\noindent 其中catcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$-gram的种类数目。 \noindent 其中catcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$-gram的种类数目。
...@@ -768,6 +763,218 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll} ...@@ -768,6 +763,218 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\sectionnewpage \sectionnewpage
\section{搜索} \section{搜索}
\parinterval 语言模型的应用非常广泛,比如,可以用语言模型来判断一个句子是否通顺;也可以用语言模型在缺失单词的位置选择出最适合的单词,甚至语言模型可以帮助我们完成更加复杂的任务。比如写作文时,并没有指定某个单词序列作为输入,而是要求直接生成一个合理的单词序列,如一个完整的句子甚至一篇完整的文章。这时,语言模型是否能够根据自己的判断来生成一段流畅合理的单词序列呢。
\parinterval 这类问题也对应着一大类自然语言处理问题\ \dash\ {\small\bfnew{序列生成}}\index{序列生成}(Sequence Generation)\index{Sequence Generation}。机器翻译就是一个非常典型的序列生成问题:在机器翻译任务中,需要根据源语言序列直接生成与之相对应的目标语言序列。但是语言模型本身并不能``制造''单词序列的,它的基础功能是评判给定的、已经生成的单词序列是否流畅合理。因此严格地说,序列生成问题的本质并非是语言模型凭空``生成''序列,而是使用语言模型在所有候选的单词序列中找出其中的``最佳''序列。实际上,在序列生成任务中寻找最佳单词序列的本质是经典的{\small\bfnew{搜索问题}}\index{搜索问题}(Search Problem)\index{Search Problem}。也就是,在所有可能的序列中,根据语言模型的打分找出最佳的序列作为生成的结果。下面将着重介绍序列生成背后的搜索问题建模方法,以及在序列生成里常用的搜索技术。相关的搜索算法也会在后续统计机器翻译({{\red XXX}})和神经机器翻译({\red XXX}章)中被深入使用。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{搜索问题的建模}
\parinterval 具体来说,基于语言模型的序列生成问题的本质是在无数任意排列的单词序列中搜索出最合理、最流畅的``最优解''。这里单词序列$w = w_1 w_2...w_m$的合理性和流畅性可以通过语言模型的打分$\textrm{P}(w)$衡量。因此在序列生成中,基于语言模型的搜索问题可以被建模为如下形式:
\begin{eqnarray}
w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\label{eq:2-40}
\end{eqnarray}
\parinterval 这里arg即argument,$\argmax_{w \in \chi}\textrm{P}(w)$表示想要找到使语言模型得分$\textrm{P}(w)$达到最大的单词序列$w$$\chi$是搜索问题的解空间 \footnote[1]{解空间,是一个算法执行后,所得到的所有解构成的集合。},在这里是所有可能的单词序列$w$的集合。$w^{'}$可以被看做该搜索问题中的``最优解'',即``出现概率最大的单词序列''。
\parinterval 在序列生成问题中,最简单的策略就是对词表中的词汇进行任意组合,通过这种枚举的方式得到全部可能的序列。但是,很多时候并没有预先指定序列的长度,比如,机器翻译中译文的长度是无法预先知道的。那么怎样判断一个序列何时完成了生成过程呢?回顾人类书写文字的过程可以发现,句子的生成首先从一片空白开始,然后从左到右逐词生成,除了第一个单词,所有单词的生成都依赖于前面已经生成的单词。为了方便计算机实现,通常定义单词序列从一个特殊的单词<sos>后开始生成。同样地,一个单词序列的结束也用一个特殊的单词<eos>来表示。
\parinterval 对于序列$<$sos$>$\ \ I\ \ agree\ \ $<$eos$>$
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-sequence-generation-process}
\caption{序列生成过程}
\label{fig:2-13}
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:2-13}展示语言模型视角该序列的生成过程。该过程通过在序列的末尾不断附加词表中的单词来逐渐扩展序列,直到这段序列结束。这种生成单词序列的过程被称作{\small\bfnew{自左向右生成}}\index{自左向右生成}(Left-to-right Generation)\index{Left-to-right Generation}
\parinterval 在这种序列生成方式的基础上,实现对候选序列的搜索过程通常有两种方法\ \dash\ 深度优先遍历和宽度优先遍历\cite{cormen1990introduction}。在深度优先遍历中,每次从词表中可重复地选择一个单词,然后从左至右地生成序列,直到<eos>被选择,此时一个完整的单词序列被生成出来。然后从<eos>回退到上一个单词,选择之前没有被选择到的候选单词代替<eos>,并继续挑选下一个单词直到<eos>被选到,如果上一个单词的所有可能都被枚举过,那么回退到上上一个单词继续枚举,直到回退到<sos>,这时候枚举结束。在宽度优先遍历中,每次不是只选择一个单词而是枚举所有单词。一个简单的例子是一个只有两个单词\{a, b\}的词表,从<sos>开始枚举所有单词,可以生成:
\begin{eqnarray}
\text{\{<sos> a, <sos> b, <sos> <eos>\}} \nonumber
\end{eqnarray}
\parinterval 其中可以划分成长度为0的完整的单词序列集合\{<sos> <eos>\}和长度为1的未结束的单词序列片段集合\{<sos> a, <sos> b\},然后下一步对未结束的单词序列枚举词表中的所有单词,可以生成:
\begin{eqnarray}
\text{\{<sos> a a, <sos> a b, <sos> a <eos>, <sos> b a, <sos> b b, <sos> b <eos>\}} \nonumber
\end{eqnarray}
\parinterval 此时可以划分出长度为1的完整单词序列集合\{<sos> a <eos>, <sos> b <eos>\},以及长度为2的未结束的单词序列片段集合\{<sos> a a, <sos> a b, <sos> b a, <sos> b b\}。如此类推,继续生成未结束序列,直到单词序列的长度达到所允许的最大长度。
\parinterval 对于搜索算法,通常可以从以下四个方面评价:
\begin{itemize}
\vspace{0.5em}
\item 完备性:当问题有解时,使用该策略能否找到问题的解。
\vspace{0.5em}
\item 最优性:搜索策略能否找到最优解。
\vspace{0.5em}
\item 时间复杂度:找到最优解需要多长时间。
\vspace{0.5em}
\item 空间复杂度:执行策略需要多少内存。
\vspace{0.5em}
\end{itemize}
\parinterval 当任务对单词序列长度没有限制时,上述两种方法枚举出的单词序列也是无穷无尽的。因此这两种枚举策略并不具备完备性而且会导致枚举过程无法停止。由于日常生活中通常不会见到特别长的句子,因此可以通过限制单词序列的最大长度来避免这个问题。一旦单词序列的最大长度被确定,以上两种枚举策略就可以在一定时间内枚举出所有可能的单词序列,因而一定可以找到最优的单词序列,即具备最优性。
\parinterval 此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表\ref{tab:2-3}所示。其中$|V|$为词表大小,$m$为序列长度,$\ast$表示``当且仅当在所有可能的单词序列数目有限下成立''。值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为$|V|+1$
%------------------------------------------------------
\begin{table}[htp]{
\begin{center}
\caption{枚举的两种实现方式比较}
{
\begin{tabular}{c|c|c|c|c}
\rule{0pt}{10pt} & 完备性 & 最优性 & 时间复杂度 & 空间复杂度\\ \hline
\rule{0pt}{10pt} 深度优先 & $\surd^{\ast}$ & $\surd^{\ast}$ & $\textrm{O}({(|V|+1)}^{m-1})$ & $\textrm{O}(m)$ \\
\rule{0pt}{10pt} 宽度优先 & $\surd$ & $\surd^{\ast}$ & $\textrm{O}({(|V|+1)}^{m-1}$) & $\textrm{O}({(|V|+1)}^{m})$ \\
\end{tabular}
\label{tab:2-3}
}
\end{center}
}\end{table}
%------------------------------------------------------
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-solution-space-tree-of-enumeration-search}
\caption{枚举搜索时的解空间树}
\label{fig:2-14}
\end{figure}
%-------------------------------------------
\parinterval 那么是否能改进枚举策略使得它更高效呢?答案是肯定的。首先从图\ref{fig:2-14}可以看到,对于一个限制序列长度为4的搜索过程,生成某个单词序列的过程实际上就是访问解空间树\footnote[2]{解空间树是搜索路径的树型表示,它包含了搜索过程中可生成的全部序列。该树的根节点恒为$<$sos$>$,代表序列均从$<$sos$>$开始。该树结构中非叶子节点的兄弟节点有$|V|$个,由词表和结束符号$<$eos$>$构成}中从根节点<sos>开始一直到叶子节点<eos>结束的某条路径,而这条的路径上节点按顺序组成了一段独特的单词序列。此时对所有可能单词序列的枚举就变成了对解空间树的遍历。并且枚举的过程与语言模型打分的过程也是一致的,每枚举一个词$i$也就是在上图选择$w_i$一列的一个节点,语言模型就可以为当前的树节点$w_i$给出一个分值,即$\textrm{P}(w_i | w_1 w_2...w_{i-1})$
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-score-solution-space-tree-by-lm}
\caption{通过语言模型对解空间树打分}
\label{fig:2-15}
\end{figure}
%-------------------------------------------
\parinterval 从这个角度来看,可以很自然地引入语言模型打分来对枚举的解空间树的遍历进行增广:在解空间树中引入边的权重\ \dash\ 将当前节点$i$的得分重设为语言模型打分$\log\textrm{P}(w_i | w_1 w_2...w_{i-1})$,其中$w_1 w_2...w_{i-1}$是该节点的全部祖先。与先前不同的是,由于在使用语言模型打分时,词的概率通常小于1,因此句子很长时概率会非常小,容易造成浮点误差,所以这里使用概率的对数形式$\log\textrm{P}(w_i | w_1 w_2...w_{i-1})$代替原始的$\textrm{P}(w_i | w_1 w_2...w_{i-1})$。此时对于图中一条包含<eos>的完整序列来说,它的最终得分为$\log\textrm{P}(w_1 w_2...w_m) = \sum_{i=1}^{m}\log\textrm{P}(w_i | w_1 w_2...w_{i-1})$,如图3所示,可知红线所示单词序列``<sos>\ I\ agree\ <eos>''的得分为:
\begin{eqnarray}
&&\textrm{score(``<sos>\ I\ agree\ <eos>'')} \nonumber \\
& = & \log\textrm{P}(\textrm{I} | \textrm{<sos>}) + \log\textrm{P}(\textrm{agree} | \textrm{<sos>\ I}) + \log\textrm{P}(\textrm{<sos>}| \textrm{<sos>\ I\ agree}) \nonumber \\
& = & -0.5-0.2-0.8 \nonumber \\
& = & -1.5
\label{eq:2-41}
\end{eqnarray}
\parinterval 现在已经把枚举过程跟语言模型打分过程统一起来,变成解空间树的遍历问题。而单词序列生成的问题即可定义为这样一个搜索问题:寻找所有单词序列组成的解空间树中权重总和最大的一条路径。前面提到的两种枚举的实现方式就是经典搜索里{\small\bfnew{深度优先搜索}}\index{深度优先搜索}(Depth-first Search)\index{Depth-first Search}{\small\bfnew{宽度优先搜索}}\index{宽度优先搜索}(Breadth-first Search)\index{Breadth-first Search}的雏形。在后面的内容中可以看到,从遍历解空间树的角度出发,可以对原始的枚举策略的效率进行优化。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{经典搜索}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{无信息搜索策略}
\parinterval 上述搜索过程中,在每次对当前节点进行扩展的时候,可以借助语言模型计算从当前节点到孩子节点的边所对应的权重。因此很自然的一个想法是:在单词序列的生成过程中使用权重信息可以帮助系统更快找到合适的解。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-example-of-dfs-extension-method}
\caption{深度优先搜索扩展方法实例}
\label{fig:2-16}
\end{figure}
%-------------------------------------------
\parinterval 在深度优先搜索中,每次总是先挑选一个单词,等枚举完当前单词全部子节点构成的序列后,才会选择下一个兄弟节点继续进行搜索。但是在挑选过程中先枚举词表中的哪个词是未定义的,也就是先选择哪个兄弟节点进行搜索是随机的。既然最终目标是寻找权重之和最大的路径,那么可以优先挑选分数较高的单词进行枚举。因为在路径长度有限的情况下,权重和最大的路径上每条边的权重也会比较大,而先尝试分数大的单词可以让系统更快地找到最优解。如图\ref{fig:2-16}所示,红色线表示了第一次搜索的路径。这是对深度优先搜索的一个自然的扩展。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-example-of-uniform-cost-search}
\caption{一致代价搜索实例}
\label{fig:2-17}
\end{figure}
%-------------------------------------------
\parinterval 类似的思想也可以应用于宽度优先搜索,由于宽度优先搜索每次都选择了所有的单词,因此简单使用边的权重来选择单词是不可行的。重新回顾宽度优先搜索的过程:它维护了一个未结束单词序列的集合,每次扩展单词序列后根据长度往集合里面加入单词序列。而搜索问题关心的是单词序列的得分而非其长度。因此可以在搜索过程中维护未结束的单词序列集合里每个单词序列的得分,然后优先扩展该集合中得分最高的单词序列,使得扩展过程中未结束的单词序列集合包含的单词序列分数逐渐变高。如图\ref{fig:2-17}所示,由于``<sos>\ I''在图右侧的5条路径中分数最高,因此下一步将要扩展$W_2$一列``I''节点后的全部后继。图中绿色节点表示下一步将要扩展的节点。普通宽度优先搜索中,扩展后生成的单词序列长度相同,但是分数却参差不齐。而改造后的宽度优先搜索则不同,它会优先生成得分较高的单词序列,这种宽度优先搜索也叫做{\small\bfnew{一致代价搜索}}\index{一致代价搜索}(Uniform-cost Search)\index{Uniform-cost Search}\cite{russell2003artificial}
\parinterval 上面描述的两个改进后的搜索方法属于无信息搜索策略\cite{sahni1978fundamentals},因为他们依赖的信息仍然来源于问题本身而不是问题以外。改进后的方法虽然有机会更快寻找到分数最高的单词序列,也就是最优解。但是由于没有一个通用的办法来判断当前找到的解是否为最优解,这种策略不会在找到最优解后自动停止,因此最终仍然需要枚举所有可能的单词序列,寻找最优解需要的时间复杂度没有产生任何改变。尽管如此,如果只是需要一个相对好的解而不是最优解,改进后的搜索策略仍然是比原始枚举策略更优秀的算法。
\parinterval 此外,由于搜索过程中将语言模型的打分作为搜索树的边权重,另一种改进思路是:能否借助语言模型的特殊性质来对搜索树进行{\small\bfnew{剪枝}}\index{剪枝}(Pruning)\index{Pruning},从而避免在搜索空间中访问一些不可能产生比当前解更好的结果的区域,提高搜索策略在实际运用当中的效率。简单来说,剪枝是一种可以缩小搜索空间的手段,比如,在搜索的过程中,动态的``丢弃''一些搜索路径,从而减少搜索的总代价。剪枝的程度在一定范围内影响了搜索系统的效率,剪枝越多搜索效率越高,一般找到最优解的可能性也越低;反之,搜索效率越低,但是找到最优解的可能性越大。在{\red6.3.6}章中介绍的贪婪搜索和束搜索都可以被看作是剪枝方法的一种特例。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{启发式搜索策略}
\parinterval 在搜索问题中,一个单词序列的生成可以分为两部分:已生成部分和未生成部分。既然最终目标是使得一个完整的单词序列得分最高,那么关注未生成部分的得分也许能为现有搜索策略的改进提供思路。
\parinterval 但是,问题在于未生成部分来自搜索树中未被搜索过的区域,直接得到其得分并不现实。既然仅依赖于问题本身的信息无法得到未生成部分的得分,那么是否可以通过一些外部信息来估计未生成部分得分$\textrm{h}(w_1 w_2...w_m)$呢?在前面所提到的剪枝技术中,借助语言模型的特性可以使得搜索变得高效。与其类似,利用语言模型的其他特性也可以实现对未生成部分得分的估计。这个对未生成部分得分的估计通常被称为{\small\bfnew{启发式函数}}\index{启发式函数}(Heuristic Function)\index{Heuristic Function}。在扩展假设过程中,可以优先挑选当前得分$\log\textrm{P}(w_1 w_2...w_m)$和启发式函数值$\textrm{h}(w_1 w_2...w_m)$最大的候选进行扩展,从而大大提高搜索的效率。这种基于启发式函数的一致代价搜索通常也被称为$\textrm{A}^{\ast}$搜索或{\small\bfnew{启发式搜索}}\index{启发式搜索}(Heuristically Search)\index{Heuristically Search}\cite{DBLP:journals/tssc/HartNR68}
\parinterval 通常可以把启发式函数看成是计算当前状态跟最优解的距离的一种方法。通常,可以把关于最优解的一些性质的猜测放到启发式函数里。比如,在序列生成中,一般认为最优序列应该在某个特定的长度附近,那么就可以把启发式函数定义成该长度与当前单词序列长度的差值。这样,在搜索过程中,启发式函数会引导搜索倾向于先生成当前得分高且序列长度接近预设长度的单词序列。此外除了手工设计启发式函数,还可以借助强化学习的手段,学习关于未来得分的估计\cite{DBLP:conf/nips/HeLXQ0L17}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection{非经典搜索(局部搜索)}
\parinterval 由于全局搜索策略大都要遍历整个解空间,所以全局搜索策略的时间、空间复杂度一般都比较高。在对于完备性与最优性要求不那么严格的搜索问题上,可以使用局部搜索策略。局部搜索策略不必遍历完整的解空间,因此降低了时间、空间复杂度,但是这也导致可能会丢失最优解甚至找不到解,所以局部搜索都是不完备的而且非最优的。但是,在自然语言处理中,很多问题由于搜索空间过大都无法使用全局搜索,因此使用局部搜索是非常普遍的。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{贪婪搜索}
\parinterval {\small\bfnew{贪婪搜索}}\index{贪婪搜索}(Greedy Search)\index{Greedy Search}基于一种假设,当一个问题可以拆分为多个子问题时,如果一直选择子问题的最优解就能得到原问题的最优解。基于这种假设,它每次都优先挑选得分最高的词进行扩展,这一点与改进过的深度优先搜索类似。但是它们的区别在于,贪婪搜索在搜索到一个完整的序列,也就是搜索到<eos>即停止,而改进的深度优先搜索会遍历整个解空间。因此贪婪搜索非常高效,其时间和空间复杂度仅为$\textrm{O}(m)$,这里$m$为单词序列的长度。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-example-of-greedy-search}
\caption{贪婪搜索实例}
\label{fig:2-18}
\end{figure}
%-------------------------------------------
\parinterval 由于贪婪搜索并没有遍历解空间,所以该方法不保证一定能找到最优解。比如对于如图\ref{fig:2-18}所示的一个搜索结构,贪婪搜索将选择红线所示的序列,该序列的最终得分是-1.7。但是,对比图\ref{fig:2-16}可以发现,在另一条路径上有得分更高的序列``<sos>\ I\ agree\ <eos>'',它的得分为-1.5。此时贪婪搜索并没有找到最优解,由于贪婪搜索选择的单词是当前步骤得分最高的,但是最后生成的单词序列的得分取决于它未生成部分的得分。因此当得分最高的单词的子树中未生成部分的得分远远小于其他子树时,贪婪搜索提供的解的质量会非常差。同样的问题可以出现在使用贪婪搜索的任意时刻。在第四章还将看到贪婪搜索在机器翻译中的具体应用。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{束搜索}
\parinterval 贪婪搜索会产生质量比较差的解是由于当前单词的错误选择造成的。既然每次只挑选一个单词可能会产生错误,那么可以通过同时考虑更多候选单词来缓解这个问题,也就是对于一个位置,可以同时将其扩展到若干个节点。这样就扩大了搜索的范围,进而使得优质解被找到的概率增大。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-example-of-beam-search}
\caption{束搜索实例}
\label{fig:2-19}
\end{figure}
%-------------------------------------------
\parinterval 常见的做法是每一次生成新单词的时候都挑选得分最高的前$B$个单词,然后扩展这$B$个单词的$V$个孩子节点,得到$BV$条新路径,最后保留其中得分最高的$B$条路径。从另外一个角度理解,它相当于比贪婪搜索看到了更多的假设,因而它更有可能找到好的解。这个方法通常被称为{\small\bfnew{束搜索}}\index{束搜索}(Beam Search)\index{Beam Search}。图\ref{fig:2-19}展示了一个束大小为3的例子,其中束大小代表每次选择单词时保留的词数。比起贪婪搜索,束搜索在实际表现中非常优秀,而它的时间、空间复杂度仅为贪婪搜索的常数倍,也就是$\textrm{O}(Bm)$
\parinterval 束搜索也有很多的改进版本。比如,在无信息搜索策略中可以使用剪枝技术来提升搜索的效率。而实际上,束搜索本身也是一种剪枝方法。因此有时也把束搜索称作{\small\bfnew{束剪枝}}\index{束剪枝}(Beam Pruning)\index{Beam Pruning}。在这里有很多其它的剪枝策略可供选择,例如可以只保留与当前最佳路径得分相差在$\theta$之内的路径,也就是搜索只保留得分差距在一定范围内的路径,这种方法也被称作{\small\bfnew{直方图剪枝}}\index{直方图剪枝}(Histogram Pruning)\index{Histogram Pruning}。对于语言模型来说,当进行搜索时正在搜索的多个路径中最高得分比当前搜索到的最好的解的得分低之后也可以立刻停止搜索,因为此时序列越长语言模型得分$\log\textrm{P}(w_1 w_2...w_m)$会越低,因此继续扩展这些路径不会产生更好的结果。这个技术通常也被称为{\small\bfnew{最佳停止条件}}\index{最佳停止条件}(Optimal Stopping Criteria)\index{Optimal Stopping Criteria}
\parinterval 总的来说,虽然局部搜索由于没有遍历完整的解空间,使得这类方法无法保证找到最优解。但是,局部搜索算法大大降低了搜索过程的时间、空间复杂度。因此在语言模型生成和机器翻译的解码过程中常常使用的局部搜索算法。在第{\cseven}{\cten}{\celeven}章中还将介绍这些算法的具体应用。
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
% NEW SECTION % NEW SECTION
%---------------------------------------------------------------------------------------- %----------------------------------------------------------------------------------------
...@@ -775,18 +982,18 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll} ...@@ -775,18 +982,18 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\sectionnewpage \sectionnewpage
\section{小结及深入阅读} \label{sec2:summary} \section{小结及深入阅读} \label{sec2:summary}
\parinterval 本章重点介绍了如何对自然语言处理问题进行统计建模,并从数据中自动学习统计模型的参数,最终使用学习到的模型对新的问题进行处理。之后,本章将这种思想应用到三个自然语言处理任务中,包括:中文分词、语言建模、句法分析,它们也和机器翻译有着紧密的联系。通过系统化的建模,可以发现:经过适当的假设和化简,统计模型可以很好的描述复杂的自然语言处理问题。相关概念和方法也会在后续章节的内容中被广泛使用。 \parinterval 本章重点介绍了如何对自然语言处理问题进行统计建模,并从数据中自动学习统计模型的参数,最终使用学习到的模型对新的问题进行处理。之后,本章将这种思想应用到语言建模这个自然语言处理任务中,它也和机器翻译有着紧密的联系。通过系统化的建模,可以发现:经过适当的假设和化简,统计模型可以很好的描述复杂的自然语言处理问题。相关概念和方法也会在后续章节的内容中被广泛使用。
\parinterval 由于本章重点介绍如何用统计的思想对自然语言处理任务进行建模,因此并没有对具体的问题展开深入讨论。有几方面内容,读者可以继续关注: \parinterval 由于本章重点介绍如何用统计的思想对自然语言处理任务进行建模,因此并没有对具体的问题展开深入讨论。关于不同语言模型的对比和分析可以进一步参考相关综述\cite{Joshua2001A,jing2019survey}。此外,有几方面内容,读者可以继续关注:
\begin{adjustwidth}{1em}{} \begin{adjustwidth}{1em}{}
\begin{itemize} \begin{itemize}
\vspace{0.5em} \vspace{0.5em}
\item 在建模方面,本章介绍的三个任务均采用的是基于人工先验知识进行模型设计的思路。也就是,问题所表达的现象被``一步一步''生成出来。这是一种典型的生成式建模思想,它把要解决的问题看作一些观测结果的隐含变量(比如,句子是观测结果,分词结果是隐含在背后的变量),之后通过对隐含变量生成观测结果的过程进行建模,以达到对问题进行数学描述的目的。这类模型一般需要依赖一些独立性假设,假设的合理性对最终的性能有较大影响。相对于{\small\sffamily\bfseries{生成模型}}\index{生成模型}(Generative Model)\index{Generative Model},另一类方法是{\small\sffamily\bfseries{判别模型}}\index{判别模型}(Discriminative Model)\index{Discriminative Model},它直接描述了从隐含变量生成观测结果的过程,这样对问题的建模更加直接,同时这类模型可以更加灵活的引入不同的特征。判别模型在自然语言处理中也有广泛应用\cite{shannon1948mathematical}\cite{ng2002discriminative}。 在本书的第四章也会使用到判别式模型。 \item 在建模方面,本章介绍的语言建模采用的是基于人工先验知识进行模型设计的思路。也就是,问题所表达的现象被``一步一步''生成出来。这是一种典型的生成式建模思想,它把要解决的问题看作一些观测结果的隐含变量(比如,句子是观测结果,分词结果是隐含在背后的变量),之后通过对隐含变量生成观测结果的过程进行建模,以达到对问题进行数学描述的目的。这类模型一般需要依赖一些独立性假设,假设的合理性对最终的性能有较大影响。相对于{\small\sffamily\bfseries{生成模型}}\index{生成模型}(Generative Model)\index{Generative Model},另一类方法是{\small\sffamily\bfseries{判别模型}}\index{判别模型}(Discriminative Model)\index{Discriminative Model},它直接描述了从隐含变量生成观测结果的过程,这样对问题的建模更加直接,同时这类模型可以更加灵活的引入不同的特征\cite{DBLP:conf/acl/OchN02}。判别模型在自然语言处理中也有广泛应用\cite{shannon1948mathematical}\cite{ng2002discriminative}。 在本书的第四章也会使用到判别式模型。
\vspace{0.5em} \vspace{0.5em}
\item 从现在自然语言处理的前沿看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。但是,本章并没有涉及深度学习及相关方法,这是由于笔者认为:对问题的建模是自然语言处理的基础,对问题的本质刻画并不会因为方法的改变而改变。因此,本章的内容没有太多地陷入到更加复杂的模型和算法设计中,相反,我们希望关注对基本问题的理解和描述。不过,一些前沿方法仍可以作为参考,包括:基于条件随机场和双向长短时记忆模型的序列标注模型\cite{lafferty2001conditional}\cite{huang2015bidirectional}\cite{ma2016end}、神经语言模型\cite{bengio2003neural}\cite{mikolov2010recurrent}、神经句法分析模型\cite{chen2014fast}\cite{zhu2015long} \item 从现在自然语言处理的前沿看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法,而且在近些年取得了巨大成功\cite{DBLP:conf/nips/BengioDV00}。关于神经语言模型的内容,会在第{\cnine}章进行进一步介绍。这里更多的关注了语言模型的基本问题和求解思路,因为对问题的建模是自然语言处理的基础,对问题的本质刻画并不会因为方法的改变而改变。在后续章节还将看到,这里所使用的生成序列的建模方法会作为机器翻译最基本的范式
\vspace{0.5em} \vspace{0.5em}
\item 此外,本章并没有对模型的推断方法进行深入介绍。比如,对于一个句子如何有效的找到概率最大的分词结果?显然,简单枚举是不可行的。对于这类问题比较简单的解决方法是使用动态规划\cite{huang2008advanced}。如果使用动态规划的条件不满足,可以考虑使用更加复杂的搜索策略,并配合一定剪枝方法。实际上,无论是$n$-gram语言模型还是简单的上下文无关文法都有高效的推断方法。比如,$n$-gram语言模型可以被视为概率有限状态自动机,因此可以直接使用成熟的自动机工具。对于更复杂的句法分析问题,可以考虑使用移进-规约方法来解决推断问题\cite{aho1972theory} \item 此外,本章结合序列生成任务对搜索技术进行了介绍。而搜索问题也是语言建模和机器翻译中的最基本问题之一。在这些任务中,搜索空间往往较大,因此枚举与大多数全局搜索方法是不可行的。但是,由于启发式搜索不仅具有完备性,并且兼顾了搜索效率,因此也有研究尝试使用启发式搜索\cite{DBLP:conf/acl/OchUN01,DBLP:conf/acl/WangW97}。同时现在许多基于强化学习的方法本质上也是一种对启发式搜索的引申\cite{DBLP:conf/nips/HeLXQ0L17}。对于局部搜索算法,除了经常在翻译任务中使用的束搜索\cite{DBLP:journals/corr/LiMJ16}以外还有模拟退火搜索。他们都可以被理解为是对贪婪搜索的一种改进,并且遗传算法作为随机束搜索的变形也常常被使用。最后,在机器翻译任务中,搜索技术也被应用于结构搜索。其中常用的方法包括使用强化学习的方法\cite{DBLP:conf/iclr/ZophL17,DBLP:conf/iclr/SchrimpfM0S18}或使用遗传算法搜索网络结构。由于整个模型结构的表示空间巨大,因此在搜索过程中也往往采用束搜索等方式对结构空间进行裁剪,以达到在有限算力条件下搜索到最佳模型结构的目的
\vspace{0.5em} \vspace{0.5em}
\end{itemize} \end{itemize}
\end{adjustwidth} \end{adjustwidth}
...@@ -1137,6 +1137,209 @@ ...@@ -1137,6 +1137,209 @@
year ={2011}, year ={2011},
publisher ={北京: 高等教育出版社} publisher ={北京: 高等教育出版社}
} }
@book{cormen1990introduction,
title="Introduction to Algorithms",
author="Thomas T. {Cormen} and Charles E. {Leiserson} and Ronald L. {Rivest}",
notes="Sourced from Microsoft Academic - https://academic.microsoft.com/paper/2752885492",
year="1990"
}
@book{russell2003artificial,
title="Artificial Intelligence : A Modern Approach",
author="Stuart J. {Russell} and Peter {Norvig}",
notes="Sourced from Microsoft Academic - https://academic.microsoft.com/paper/2122410182",
year="2003"
}
@book{sahni1978fundamentals,
title="Fundamentals of Computer Algorithms",
author="Sartaj {Sahni} and Ellis {Horowitz}",
notes="Sourced from Microsoft Academic - https://academic.microsoft.com/paper/1554451661",
year="1978"
}
@article{DBLP:journals/tssc/HartNR68,
author = {Peter E. Hart and
Nils J. Nilsson and
Bertram Raphael},
title = {A Formal Basis for the Heuristic Determination of Minimum Cost Paths},
journal = {{IEEE} Trans. Syst. Sci. Cybern.},
volume = {4},
number = {2},
pages = {100--107},
year = {1968},
url = {https://doi.org/10.1109/TSSC.1968.300136},
doi = {10.1109/TSSC.1968.300136},
timestamp = {Sat, 25 Apr 2020 13:57:19 +0200},
biburl = {https://dblp.org/rec/journals/tssc/HartNR68.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{DBLP:conf/nips/HeLXQ0L17,
author = {Di He and
Hanqing Lu and
Yingce Xia and
Tao Qin and
Liwei Wang and
Tie{-}Yan Liu},
editor = {Isabelle Guyon and
Ulrike von Luxburg and
Samy Bengio and
Hanna M. Wallach and
Rob Fergus and
S. V. N. Vishwanathan and
Roman Garnett},
title = {Decoding with Value Networks for Neural Machine Translation},
booktitle = {Advances in Neural Information Processing Systems 30: Annual Conference
on Neural Information Processing Systems 2017, 4-9 December 2017,
Long Beach, CA, {USA}},
pages = {178--187},
year = {2017},
url = {http://papers.nips.cc/paper/6622-decoding-with-value-networks-for-neural-machine-translation},
timestamp = {Fri, 06 Mar 2020 16:58:12 +0100},
biburl = {https://dblp.org/rec/conf/nips/HeLXQ0L17.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@article{Joshua2001A,
author={Joshua T. Goodman},
title={A bit of progress in language modeling},
journal={Comput. Speech Lang.},
volume={15},
number={4},
pages={403--434},
year={2001},
url={https://doi.org/10.1006/csla.2001.0174},
doi={10.1006/csla.2001.0174},
timestamp={Thu, 20 Feb 2020 11:32:09 +0100},
biburl={https://dblp.org/rec/journals/csl/Goodman01.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@article{jing2019survey,
title={A survey on neural network language models},
author={Jing, Kun and Xu, Jungang},
journal={arXiv preprint arXiv:1906.03591},
year={2019}
}
@inproceedings{DBLP:conf/acl/OchUN01,
author = {Franz Josef Och and
Nicola Ueffing and
Hermann Ney},
title = {An Efficient A* Search Algorithm for Statistical Machine Translation},
booktitle = {Proceedings of the {ACL} Workshop on Data-Driven Methods in Machine
Translation, Toulouse, France, July 7, 2001},
year = {2001},
url = {https://www.aclweb.org/anthology/W01-1408/},
timestamp = {Wed, 11 Sep 2019 16:27:20 +0200},
biburl = {https://dblp.org/rec/conf/acl/OchUN01.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{DBLP:conf/acl/WangW97,
author = {Ye{-}Yi Wang and
Alex Waibel},
editor = {Philip R. Cohen and
Wolfgang Wahlster},
title = {Decoding Algorithm in Statistical Machine Translation},
booktitle = {35th Annual Meeting of the Association for Computational Linguistics
and 8th Conference of the European Chapter of the Association for
Computational Linguistics, Proceedings of the Conference, 7-12 July
1997, Universidad Nacional de Educaci{\'{o}}n a Distancia (UNED),
Madrid, Spain},
pages = {366--372},
publisher = {Morgan Kaufmann Publishers / {ACL}},
year = {1997},
url = {https://www.aclweb.org/anthology/P97-1047/},
doi = {10.3115/976909.979664},
timestamp = {Mon, 18 May 2020 15:12:40 +0200},
biburl = {https://dblp.org/rec/conf/acl/WangW97.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@article{DBLP:journals/corr/LiMJ16,
author = {Jiwei Li and
Will Monroe and
Dan Jurafsky},
title = {A Simple, Fast Diverse Decoding Algorithm for Neural Generation},
journal = {CoRR},
volume = {abs/1611.08562},
year = {2016},
url = {http://arxiv.org/abs/1611.08562},
archivePrefix = {arXiv},
eprint = {1611.08562},
timestamp = {Mon, 13 Aug 2018 16:48:46 +0200},
biburl = {https://dblp.org/rec/journals/corr/LiMJ16.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{DBLP:conf/iclr/ZophL17,
author = {Barret Zoph and
Quoc V. Le},
title = {Neural Architecture Search with Reinforcement Learning},
booktitle = {5th International Conference on Learning Representations, {ICLR} 2017,
Toulon, France, April 24-26, 2017, Conference Track Proceedings},
publisher = {OpenReview.net},
year = {2017},
url = {https://openreview.net/forum?id=r1Ue8Hcxg},
timestamp = {Thu, 04 Apr 2019 13:20:08 +0200},
biburl = {https://dblp.org/rec/conf/iclr/ZophL17.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{DBLP:conf/iclr/SchrimpfM0S18,
author = {Martin Schrimpf and
Stephen Merity and
James Bradbury and
Richard Socher},
title = {A Flexible Approach to Automated {RNN} Architecture Generation},
booktitle = {6th International Conference on Learning Representations, {ICLR} 2018,
Vancouver, BC, Canada, April 30 - May 3, 2018, Workshop Track Proceedings},
publisher = {OpenReview.net},
year = {2018},
url = {https://openreview.net/forum?id=BJDCPSJPM},
timestamp = {Thu, 04 Apr 2019 13:20:09 +0200},
biburl = {https://dblp.org/rec/conf/iclr/SchrimpfM0S18.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{DBLP:conf/acl/OchN02,
author = {Franz Josef Och and
Hermann Ney},
title = {Discriminative Training and Maximum Entropy Models for Statistical
Machine Translation},
booktitle = {Proceedings of the 40th Annual Meeting of the Association for Computational
Linguistics, July 6-12, 2002, Philadelphia, PA, {USA}},
pages = {295--302},
publisher = {{ACL}},
year = {2002},
url = {https://www.aclweb.org/anthology/P02-1038/},
doi = {10.3115/1073083.1073133},
timestamp = {Mon, 18 May 2020 15:12:39 +0200},
biburl = {https://dblp.org/rec/conf/acl/OchN02.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@inproceedings{DBLP:conf/nips/BengioDV00,
author = {Yoshua Bengio and
R{\'{e}}jean Ducharme and
Pascal Vincent},
editor = {Todd K. Leen and
Thomas G. Dietterich and
Volker Tresp},
title = {A Neural Probabilistic Language Model},
booktitle = {Advances in Neural Information Processing Systems 13, Papers from
Neural Information Processing Systems {(NIPS)} 2000, Denver, CO, {USA}},
pages = {932--938},
publisher = {{MIT} Press},
year = {2000},
url = {http://papers.nips.cc/paper/1839-a-neural-probabilistic-language-model},
timestamp = {Fri, 06 Mar 2020 17:00:45 +0100},
biburl = {https://dblp.org/rec/conf/nips/BengioDV00.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
%%%%% chapter 2------------------------------------------------------ %%%%% chapter 2------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论