Commit 5cf68ea7 by 曹润柘

chapter5 bug fix

parent fbf70844
......@@ -13,7 +13,7 @@
\draw [-] (s1.south) -- (t0.north);
\draw [-] (s2.south) -- (t0.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -29,7 +29,7 @@
\draw [-] (s1.south) -- (t0.north);
\draw [-] (s2.south) -- (t1.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -45,7 +45,7 @@
\draw [-] (s1.south) -- (t0.north);
\draw [-] (s2.south) -- (t2.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -61,7 +61,7 @@
\draw [-] (s1.south) -- ([yshift=-0.2em]t1.north);
\draw [-] (s2.south) -- (t0.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -77,7 +77,7 @@
\draw [-] (s1.south) -- ([yshift=-0.2em]t1.north);
\draw [-] (s2.south) -- ([yshift=-0.2em]t1.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -93,7 +93,7 @@
\draw [-] (s1.south) -- ([yshift=-0.2em]t1.north);
\draw [-] (s2.south) -- (t2.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -109,7 +109,7 @@
\draw [-] (s1.south) -- (t2.north);
\draw [-] (s2.south) -- (t0.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -125,7 +125,7 @@
\draw [-] (s1.south) -- (t2.north);
\draw [-] (s2.south) -- (t1.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\small{+}};
}
......@@ -141,9 +141,9 @@
\draw [-] (s1.south) -- (t2.north);
\draw [-] (s2.south) -- (t2.north);
{
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P(}}};
\node [anchor=south east,inner sep=0pt] (p) at (t0.north west) {\small{{\color{ugreen} P\;(}}};
\node [anchor=south west,inner sep=0pt] (p2) at ([yshift=0.2em]t2.north east) {\small{{\color{ugreen} )}}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\normalsize{= \ P($\mathbf{s}|\mathbf{t}$)}};
\node [anchor=west] (eq) at ([xshift=0.7em]p2.east) {\normalsize{= \ P\,($\mathbf{s}|\mathbf{t}$)}};
}
}
\end{scope}
......
......@@ -8,10 +8,10 @@
\node [anchor=north west,inner sep=2pt,align=left] (line4) at ([yshift=-1pt]line3.south west) {\textrm{3: \textbf{for} $i$ in $[1,m]$ \textbf{do}}};
\node [anchor=north west,inner sep=2pt,align=left] (line5) at ([yshift=-1pt]line4.south west) {\textrm{4: \hspace{1em} $h = \phi$}};
\node [anchor=north west,inner sep=2pt,align=left] (line6) at ([yshift=-1pt]line5.south west) {\textrm{5: \hspace{1em} \textbf{foreach} $j$ in $[1,m]$ \textbf{do}}};
\node [anchor=north west,inner sep=2pt,align=left] (line7) at ([yshift=-1pt]line6.south west) {\textrm{6: \hspace{2em} \textbf{if} $used[j]=$ \textbf{true} \textbf{then}}};
\node [anchor=north west,inner sep=2pt,align=left] (line7) at ([yshift=-1pt]line6.south west) {\textrm{6: \hspace{2em} \textbf{if} $used[j]=$ \textbf{false} \textbf{then}}};
\node [anchor=north west,inner sep=2pt,align=left] (line8) at ([yshift=-1pt]line7.south west) {\textrm{7: \hspace{3em} $h = h \cup \textrm{\textsc{Join}}(best,\pi[j])$}};
\node [anchor=north west,inner sep=2pt,align=left] (line9) at ([yshift=-1pt]line8.south west) {\textrm{8: \hspace{1em} $best = \textrm{\textsc{PruneForTop1}}(h)$}};
\node [anchor=north west,inner sep=2pt,align=left] (line10) at ([yshift=-1pt]line9.south west) {\textrm{9: \hspace{1em} $used[best.j] = \textrm{\textsc{\textbf{true}}}$}};
\node [anchor=north west,inner sep=2pt,align=left] (line10) at ([yshift=-1pt]line9.south west) {\textrm{9: \hspace{1em} $used[best.j] = \textrm{\textbf{true}}$}};
\node [anchor=north west,inner sep=2pt,align=left] (line11) at ([yshift=-1pt]line10.south west) {\textrm{10: \textbf{return} $best.translatoin$}};
\node [anchor=south west,inner sep=2pt,align=left] (head1) at ([yshift=1pt]line1.north west) {输出: 找的最佳译文};
......
......@@ -47,8 +47,8 @@
}
{
\node [anchor=north west] (label1) at ([xshift=0.6em,yshift=0.0em]sent-1.south east) {{分析}};
\node [anchor=north west] (label2) at ([yshift=-1.8em]label1.south west) {{转换}};
\node [anchor=north west] (label3) at ([yshift=-1.3em]label2.south west) {{生成}};
\node [anchor=north west] (label2) at ([yshift=-1.5em]label1.south west) {{转换}};
\node [anchor=north west] (label3) at ([yshift=-1.1em]label2.south west) {{生成}};
}
{\scriptsize
\begin{scope}
......
......@@ -24,9 +24,9 @@
\chapter{基于词的机器翻译建模}
\parinterval 使用统计方法对翻译问题进行建模是机器翻译发展中的重要里程碑。这种思想也影响了当今的统计机器翻译和神经机器翻译范式。虽然技术不断发展,传统的统计模型已经不再``新鲜'',但它对于今天机器翻译的研究仍然有着重要的启示作用。在了解前沿、展望未来的同时,更要冷静思考前人给我们带来了什么。基于此,这里将介绍统计机器翻译的开山之作\ \dash \ IBM 模型,它提出了使用统计模型进行翻译的思想,并在建模中引入了单词对齐这一重要概念。
\parinterval 使用统计方法对翻译问题进行建模是机器翻译发展中的重要里程碑。这种思想也影响了当今的统计机器翻译和神经机器翻译范式。虽然技术不断发展,传统的统计模型已经不再``新鲜'',但它对于今天机器翻译的研究仍然有着重要的启示作用。在了解前沿、展望未来的同时,更要冷静思考前人给我们带来了什么。基于此,这里将介绍统计机器翻译的开山之作\ \dash \ IBM 模型,它提出了使用统计模型进行翻译的思想,并在建模中引入了单词对齐这一重要概念。
IBM模型由Peter F. Brown等人于上世纪九十年代初提出\cite{DBLP:journals/coling/BrownPPM94}。客观的说,这项工作的视野和对问题的理解,已经超过当时很多人所能看到的东西,其衍生出来的一系列方法和新的问题还被后人花费将近10年的时间来进行研究与讨论。时至今日,IBM模型中的一些思想仍然影响着很多研究工作。本章将重点介绍一种简单的基于单词的统计翻译模型(IBM模型1),以及在这种建模方式下的模型训练方法。这些内容可以作为后续章节中统计机器翻译和神经机器翻译的建模方法基础。
IBM模型由Peter F. Brown等人于上世纪九十年代初提出\cite{DBLP:journals/coling/BrownPPM94}。客观地说,这项工作的视野和对问题的理解,已经超过当时很多人所能看到的东西,其衍生出来的一系列方法和新的问题还被后人花费将近10年的时间来进行研究与讨论。时至今日,IBM模型中的一些思想仍然影响着很多研究工作。本章将重点介绍一种简单的基于单词的统计翻译模型(IBM模型1),以及在这种建模方式下的模型训练方法。这些内容可以作为后续章节中统计机器翻译和神经机器翻译建模方法的基础。
%----------------------------------------------------------------------------------------
......@@ -50,7 +50,7 @@ IBM模型由Peter F. Brown等人于上世纪九十年代初提出\cite{DBLP:jour
\end{figure}
%----------------------------------------------
\parinterval 上面的例子反映了人在做翻译时所使用的一些知识:首先,两种语言单词的顺序可能不一致,而且译文需要符合目标语的习惯,这也就是常说的翻译的{\small\sffamily\bfseries{流畅度}}\index{流畅度}问题(Fluency)\index{Fluency};其次,源语言单词需要准确被翻译出来,也就是常说的翻译的{\small\sffamily\bfseries{准确性}}\index{准确性}(Accuracy)\index{Accuracy}问题和{\small\sffamily\bfseries{充分性}}\index{充分性}(Adequacy)\index{Adequacy}问题。为了达到以上目的,传统观点认为翻译过程需要包含三个步骤\cite{parsing2009speech}
\parinterval 上面的例子反映了人在做翻译时所使用的一些知识:首先,两种语言单词的顺序可能不一致,而且译文需要符合目标语的习惯,这也就是常说的翻译的{\small\sffamily\bfseries{流畅度}}\index{流畅度}问题(Fluency)\index{Fluency};其次,源语言单词需要准确被翻译出来,也就是常说的翻译的{\small\sffamily\bfseries{准确性}}\index{准确性}(Accuracy)\index{Accuracy}问题和{\small\sffamily\bfseries{充分性}}\index{充分性}(Adequacy)\index{Adequacy}问题。为了达到以上目的,传统观点认为翻译过程需要包含三个步骤\cite{parsing2009speech}
\begin{itemize}
\vspace{0.5em}
......@@ -71,7 +71,7 @@ IBM模型由Peter F. Brown等人于上世纪九十年代初提出\cite{DBLP:jour
\end{figure}
%----------------------------------------------
\parinterval\ref{fig:5-2}给出了上述过程的一个示例。对于今天的自然语言处理研究,``分析、转换和生成''依然是一个非常深刻的观点。包括机器翻译在内的很多自然语言处理问题都可以用这个过程来解释。比如,对于现在比较前沿的神经机器翻译方法,从大的框架来说,依然在做分析(编码器)、转换(编码-解码注意力)和生成(解码器),只不过这些过程隐含在神经网络的设计中。当然,这里并不会对``分析、转换和生成''的架构展开过多的讨论,随着后面技术内容讨论的深入,这个观念会进一步体现。
\parinterval\ref{fig:5-2}给出了上述过程的一个示例。对于今天的自然语言处理研究,``分析、转换和生成''依然是一个非常深刻的观点。包括机器翻译在内的很多自然语言处理问题都可以用这个过程来解释。比如,对于现在比较前沿的神经机器翻译方法,从大的框架来说,依然在做分析(编码器)、转换(编码-解码注意力)和生成(解码器),只不过这些过程隐含在神经网络的设计中。当然,这里并不会对``分析、转换和生成''的架构展开过多的讨论,随着后面技术内容讨论的深入,这个观念会进一步体现。
%----------------------------------------------------------------------------------------
% NEW SECTION
%----------------------------------------------------------------------------------------
......@@ -80,7 +80,7 @@ IBM模型由Peter F. Brown等人于上世纪九十年代初提出\cite{DBLP:jour
\section{一个简单实例}
\label{sec:simple-mt-example}
\parinterval 本节首先对比人工翻译和机器翻译过程的异同点,从中归纳出完成机器翻译过程的两个主要步骤:训练和解码。之后,会从学习翻译知识和运用翻译知识两个方面描述如何构建一个简单的机器翻译系统。
\parinterval 本节首先对比人工翻译和机器翻译过程的异同点,从中归纳出实现机器翻译过程的两个主要步骤:训练和解码。之后,会从学习翻译知识和运用翻译知识两个方面描述如何构建一个简单的机器翻译系统。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -134,9 +134,9 @@ IBM模型由Peter F. Brown等人于上世纪九十年代初提出\cite{DBLP:jour
\vspace{0.5em}
\end{itemize}
\parinterval 对于第一个问题,可以给计算机一个翻译词典,这样计算机可以发挥计算方面的优势,尽可能多的把翻译结果拼装出来。比如,可以把每个翻译结果看作是对单词翻译的拼装,这可以被形象的比做贯穿多个单词的一条路径,计算机所做的就是尽可能多的生成这样的路径。图\ref{fig:5-4}中蓝色和红色的折线就分别表示了两条不同的译文选择路径,区别在于``满意''和``对''的翻译候选是不一样的,蓝色折线选择的是``satisfy''和``to'',而红色折线是``satisfied''和``with''。换句话说,不同的译文对应不同的路径(即使词序不同也会对应不同的路径)。
\parinterval 对于第一个问题,可以给计算机一个翻译词典,这样计算机可以发挥计算方面的优势,尽可能多地把翻译结果拼装出来。比如,可以把每个翻译结果看作是对单词翻译的拼装,这可以被形象地比做贯穿多个单词的一条路径,计算机所做的就是尽可能多地生成这样的路径。图\ref{fig:5-4}中蓝色和红色的折线就分别表示了两条不同的译文选择路径,区别在于``满意''和``对''的翻译候选是不一样的,蓝色折线选择的是``satisfy''和``to'',而红色折线是``satisfied''和``with''。换句话说,不同的译文对应不同的路径(即使词序不同也会对应不同的路径)。
\parinterval 对于第二个问题,尽管机器能够找到很多译文选择路径,但它并不知道哪些路径是好的。说的再直白一些,简单的枚举路径实际上就是一个体力活,没有太多的智能。因此计算机还需要再聪明一些,运用它的能够``掌握''的知识判断翻译结果的好与坏。这一步是最具挑战的,当然也有很多思路。在统计机器翻译中,这个问题被定义为:设计一种统计模型,它可以给每个译文一个可能性,而这个可能性越高表明译文越接近人工翻译。
\parinterval 对于第二个问题,尽管机器能够找到很多译文选择路径,但它并不知道哪些路径是好的。说地再直白一些,简单地枚举路径实际上就是一个体力活,没有太多的智能。因此计算机还需要再聪明一些,运用它的能够``掌握''的知识判断翻译结果的好与坏。这一步是最具挑战的,当然也有很多思路。在统计机器翻译中,这个问题被定义为:设计一种统计模型,它可以给每个译文一个可能性,而这个可能性越高表明译文越接近人工翻译。
\parinterval 如图\ref{fig:5-4}所示,每个单词翻译候选的右侧黑色框里的数字就是单词的翻译概率,使用这些单词的翻译概率,可以得到整句译文的概率(用符号P表示)。这样,就用概率化的模型描述了每个翻译候选的可能性。基于这些翻译候选的可能性,机器翻译系统可以对所有的翻译路径进行打分,比如,图\ref{fig:5-4}中第一条路径的分数为0.042,第二条是0.006,以此类推。最后,系统可以选择分数最高的路径作为源语言句子的最终译文。
......@@ -401,7 +401,7 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) = \prod_{(j,i)\in \widehat{A}}\funp{P}(
\label{eq:5-9}
\end{eqnarray}
\noindent 其中,$\vectorn{\emph{t}}=t_1...t_l$表示由$l$个单词组成的句子,$\funp{P}_{\textrm{lm}}(\vectorn{\emph{t}})$表示语言模型给句子$\vectorn{\emph{t}}$的打分。具体而言,$\funp{P}_{\textrm{lm}}(\vectorn{\emph{t}})$被定义为$\funp{P}(t_i|t_{i-1})(i=1,2,...,l)$的连乘\footnote{为了确保数学表达的准确性,书中定义$\funp{P}(t_1|t_0) \equiv \funp{P}(t_1)$},其中$\funp{P}(t_i|t_{i-1})(i=1,2,...,l)$表示前面一个单词为$t_{i-1}$时,当前单词为$t_i$的概率。语言模型的训练方法可以参看{\chaptertwo}相关内容。
\noindent 其中,$\vectorn{\emph{t}}=t_1...t_l$表示由$l$个单词组成的句子,$\funp{P}_{\textrm{lm}}(\vectorn{\emph{t}})$表示语言模型给句子$\vectorn{\emph{t}}$的打分。具体而言,$\funp{P}_{\textrm{lm}}(\vectorn{\emph{t}})$被定义为$\funp{P}(t_i|t_{i-1})(i=1,2,...,l)$的连乘\footnote{为了确保数学表达的准确性,书中定义$\funp{P}(t_1|t_0) \equiv \funp{P}(t_1)$},其中$\funp{P}(t_i|t_{i-1})(i=1,2,...,l)$表示前面一个单词为$t_{i-1}$时,当前单词为$t_i$的概率。语言模型的训练方法可以参看{\chaptertwo}相关内容。
\parinterval 回到建模问题上来。既然语言模型可以帮助系统度量每个译文的流畅度,那么可以使用它对翻译进行打分。一种简单的方法是把语言模型$\funp{P}_{\textrm{lm}}{(\vectorn{\emph{t}})}$ 和公式\ref{eq:5-7}中的$g(\vectorn{\emph{s}},\vectorn{\emph{t}})$相乘,这样就得到了一个新的$g(\vectorn{\emph{s}},\vectorn{\emph{t}})$,它同时考虑了翻译准确性($\prod_{j,i \in \widehat{A}}{\funp{P}(s_j,t_i)}$)和流畅度($\funp{P}_{\textrm{lm}}(\vectorn{\emph{t}})$):
\begin{eqnarray}
......@@ -446,7 +446,7 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\label{eq:5-13}
\end{eqnarray}
\parinterval 公式\ref{eq:5-13}定义了解码的目标,剩下的问题是实现$\argmax$,以快速准确找到最佳译文$\widehat{\vectorn{\emph{t}}}$。但是,简单遍历所有可能的译文并计算$g(\vectorn{\emph{s}},\vectorn{\emph{t}})$ 的值是不可行的,因为所有潜在译文构成的搜索空间是十分巨大的。为了理解机器翻译的搜索空间的规模,假设源语言句子$\vectorn{\emph{s}}$$m$个词,每个词有$n$个可能的翻译候选。如果从左到右一步步翻译每个源语言单词,那么简单的顺序翻译会有$n^m$种组合。如果进一步考虑目标语单词的任意调序,每一种对翻译候选进行选择的结果又会对应$m!$种不同的排序。因此,源语句子$\vectorn{\emph{s}}$至少有$n^m \cdot m!$ 个不同的译文。
\parinterval 公式\ref{eq:5-13}定义了解码的目标,剩下的问题是实现$\argmax$,以快速准确找到最佳译文$\widehat{\vectorn{\emph{t}}}$。但是,简单遍历所有可能的译文并计算$g(\vectorn{\emph{s}},\vectorn{\emph{t}})$ 的值是不可行的,因为所有潜在译文构成的搜索空间是十分巨大的。为了理解机器翻译的搜索空间的规模,假设源语言句子$\vectorn{\emph{s}}$$m$个词,每个词有$n$个可能的翻译候选。如果从左到右一步步翻译每个源语言单词,那么简单的顺序翻译会有$n^m$种组合。如果进一步考虑目标语单词的任意调序,每一种对翻译候选进行选择的结果又会对应$m!$种不同的排序。因此,源语句子$\vectorn{\emph{s}}$至少有$n^m \cdot m!$ 个不同的译文。
\parinterval $n^{m}\cdot m!$是什么样的概念呢?如表\ref{tab:5-2}所示,当$m$$n$分别为2和10时,译文只有200个,不算多。但是当$m$$n$分别为20和10时,即源语言句子的长度20,每个词有10个候选译文,系统会面对$2.4329 \times 10^{38}$个不同的译文,这几乎是不可计算的。
......@@ -483,22 +483,22 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\vspace{0.3em}
%----------------------------------------------
\begin{figure}[htp]
\centering
\subfigure{\input{./Chapter5/Figures/figure-greedy-mt-decoding-process-1}}
%\begin{figure}[htp]
% \centering
%\subfigure{\input{./Chapter5/Figures/figure-greedy-mt-decoding-process-1}}
%\subfigure{\input{./Chapter5/Figures/greedy-mt-decoding-process-3}}
%\setlength{\belowcaptionskip}{14.0em}
%\caption{贪婪的机器翻译解码过程实例}
%\label{fig:5-11}
\end{figure}
%\end{figure}
%----------------------------------------------
%----------------------------------------------
\begin{figure}[htp]
\centering
%\subfigure{\input{./Chapter5/Figures/greedy-mt-decoding-process-1}}
\subfigure{\input{./Chapter5/Figures/figure-greedy-mt-decoding-process-1}}
\subfigure{\input{./Chapter5/Figures/figure-greedy-mt-decoding-process-3}}
\setlength{\belowcaptionskip}{2.0em}
%\setlength{\belowcaptionskip}{2.0em}
\caption{贪婪的机器翻译解码过程实例}
\label{fig:5-11}
\end{figure}
......@@ -515,9 +515,9 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\vspace{0.5em}
\parinterval\ref{sec:simple-mt-example}节中,我们实现了一个简单的基于词的统计机器翻译模型,内容涉及建模、训练和解码。但是,还有很多问题还没有进行深入讨论,比如,如何处理空翻译?如何对调序问题进行建模?如何用更严密的数学模型描述翻译过程?如何对更加复杂的统计模型进行训练?等等。针对以上问题,本节将系统的介绍IBM统计机器翻译模型。作为经典的机器翻译模型,对IBM模型的学习将将有助于对自然语言处理问题的建立系统化建模思想,特别是对问题的数学描述方法将会成为理解本书后续内容的基础工具。
\parinterval\ref{sec:simple-mt-example}节中,我们实现了一个简单的基于词的统计机器翻译模型,内容涉及建模、训练和解码。但是,还有很多问题还没有进行深入讨论,比如,如何处理空翻译?如何对调序问题进行建模?如何用更严密的数学模型描述翻译过程?如何对更加复杂的统计模型进行训练?等等。针对以上问题,本节将系统地介绍IBM统计机器翻译模型。作为经典的机器翻译模型,对IBM模型的学习将有助于对自然语言处理问题建立系统化建模思想,特别是对问题的数学描述方法将会成为理解本书后续内容的基础工具。
\parinterval 首先,重新思考一下人类进行翻译的过程。对于给定的源语句$\vectorn{\emph{s}}$,人不会像计算机一样尝试很多的可能,而是快速准确翻译出一个或者少数几个正确的译文。在人看来,除了正确的译文外,其他的翻译都是不正确的,或者说除了少数的译文人甚至都不会考虑太多其他的可能性。但是,在统计机器翻译的世界里,没有译文是不可能的。换句话说,对于源语言句子$\vectorn{\emph{s}}$,所有目标语词串$\vectorn{\emph{t}}$都是可能的译文,只是可能性大小不同。这个思想可以通过统计模型实现:每对$(\vectorn{\emph{s}},\vectorn{\emph{t}})$都有一个概率值$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$来描述$\vectorn{\emph{s}}$翻译为$\vectorn{\emph{t}}$ 的好与坏(图\ref{fig:5-12})。
\parinterval 首先,重新思考一下人类进行翻译的过程。对于给定的源语句$\vectorn{\emph{s}}$,人不会像计算机一样尝试很多的可能,而是快速准确翻译出一个或者少数几个正确的译文。在人看来,除了正确的译文外,其他的翻译都是不正确的,或者说除了少数的译文人甚至都不会考虑太多其他的可能性。但是,在统计机器翻译的世界里,没有译文是不可能的。换句话说,对于源语言句子$\vectorn{\emph{s}}$,所有目标语词串$\vectorn{\emph{t}}$都是可能的译文,只是可能性大小不同。这个思想可以通过统计模型实现:每对$(\vectorn{\emph{s}},\vectorn{\emph{t}})$都有一个概率值$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$来描述$\vectorn{\emph{s}}$翻译为$\vectorn{\emph{t}}$ 的好与坏(图\ref{fig:5-12})。
%----------------------------------------------
\begin{figure}[htp]
......@@ -542,8 +542,8 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\end{figure}
%----------------------------------------------
\parinterval 举个例子,对于汉译英的翻译任务,汉语句子$\vectorn{\emph{s}}$可以被看作是英语句子$\vectorn{\emph{t}}$加入噪声通过信道后得到的结果。换句话说,英语句子经过噪声-信道传输时发生了变化,在信道的输出端呈现为汉语句子。于是需要根据观察到的汉语特征,通过概率$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$猜测最为可能的英语句子。这个找到最可能的目标语句(信源)的过程也被称为
{\small\sffamily\bfseries{解码}}(Decoding)。直到今天,解码这个概念也被广泛使用在机器翻译及相关任务中。这个过程也可以表述为:给定输入$\vectorn{\emph{s}}$,找到最可能的输出$\vectorn{\emph{t}}$,使得$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$达到最大:
\parinterval 举个例子,对于汉译英的翻译任务,英语句子$\vectorn{\emph{t}}$可以被看作是汉语句子$\vectorn{\emph{s}}$加入噪声通过信道后得到的结果。换句话说,汉语句子经过噪声-信道传输时发生了变化,在信道的输出端呈现为英语句子。于是需要根据观察到的汉语特征,通过概率$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$猜测最为可能的英语句子。这个找到最可能的目标语句(信源)的过程也被称为
{\small\sffamily\bfseries{解码}}(Decoding)。直到今天,解码这个概念也被广泛使用在机器翻译及相关任务中。这个过程也可以表述为:给定输入$\vectorn{\emph{s}}$,找到最可能的输出$\vectorn{\emph{t}}$,使得$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$达到最大:
\begin{eqnarray}
\widehat{\vectorn{\emph{t}}}=\argmax_{\vectorn{\emph{t}}}\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})
\label{eq:5-14}
......@@ -560,7 +560,7 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\begin{itemize}
\vspace{0.5em}
\item 第一部分是由译文$\vectorn{\emph{t}}$到源语言句子$\vectorn{\emph{s}}$的翻译概率$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$,也被称为翻译模型。它表示给定目标语句$\vectorn{\emph{t}}$生成源语句$\vectorn{\emph{s}}$的概率。需要注意是翻译的方向已经从$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$转向了$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$,但无须刻意区分,可以简单地理解为翻译模型刻画了$\vectorn{\emph{s}}$$\vectorn{\emph{t}}$的翻译对应程度;
\item 第一部分是由译文$\vectorn{\emph{t}}$到源语言句子$\vectorn{\emph{s}}$的翻译概率$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$,也被称为翻译模型。它表示给定目标语句$\vectorn{\emph{t}}$生成源语句$\vectorn{\emph{s}}$的概率。需要注意是翻译的方向已经从$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$转向了$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$,但无须刻意区分,可以简单地理解为翻译模型刻画了$\vectorn{\emph{s}}$$\vectorn{\emph{t}}$的翻译对应程度;
\vspace{0.5em}
\item 第二部分是$\funp{P}(\vectorn{\emph{t}})$,也被称为语言模型。它表示的是目标语言句子$\vectorn{\emph{t}}$出现的可能性;
\vspace{0.5em}
......@@ -576,7 +576,7 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\label{eq:5-16}
\end{eqnarray}
\parinterval 公式\ref{eq:5-16}展示了IBM模型最基础的建模方式,它把模型分解为两项:(反向)翻译模型$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$和语言模型$\funp{P}(\vectorn{\emph{t}})$。一个很自然的问题是:直接用$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$定义翻译问题不就可以了吗,为什么要用$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$$\funp{P}(\vectorn{\emph{t}})$的联合模型?从理论上来说,正向翻译模型$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$和反向翻译模型$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$的数学建模可以是一样的,因为我们只需要在建模的过程中把两个语言调换即可。使用$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$$\funp{P}(\vectorn{\emph{t}})$的联合模型的意义在于引入了语言模型,它可以很好对译文的流畅度进行评价,确保结果是通顺的目标语言句子。
\parinterval 公式\ref{eq:5-16}展示了IBM模型最基础的建模方式,它把模型分解为两项:(反向)翻译模型$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$和语言模型$\funp{P}(\vectorn{\emph{t}})$。一个很自然的问题是:直接用$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$定义翻译问题不就可以了吗,为什么要用$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$$\funp{P}(\vectorn{\emph{t}})$的联合模型?从理论上来说,正向翻译模型$\funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$和反向翻译模型$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$的数学建模可以是一样的,因为我们只需要在建模的过程中把两个语言调换即可。使用$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$$\funp{P}(\vectorn{\emph{t}})$的联合模型的意义在于引入了语言模型,它可以很好对译文的流畅度进行评价,确保结果是通顺的目标语言句子。
\parinterval 可以回忆一下\ref{sec:sentence-level-translation}节中讨论的问题,如果只使用翻译模型可能会造成一个局面:译文的单词都和源语言单词对应的很好,但是由于语序的问题,读起来却不像人说的话。从这个角度说,引入语言模型是十分必要的。这个问题在Brown等人的论文中也有讨论\cite{DBLP:journals/coling/BrownPPM94},他们提到单纯使用$\funp{P}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$会把概率分配给一些翻译对应比较好但是不合法的目标语句子,而且这部分概率可能会很大,影响模型的决策。这也正体现了IBM模型的创新之处,作者用数学技巧把$\funp{P}(\vectorn{\emph{t}})$引入进来,保证了系统的输出是通顺的译文。语言模型也被广泛使用在语音识别等领域以保证结果的流畅性,甚至应用的历史比机器翻译要长得多,这里的方法也有借鉴相关工作的味道。
......@@ -678,11 +678,11 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\parinterval 接下来的问题是如何定义$\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})$\ \dash \ 即定义词对齐的生成概率。但是,隐含变量$\vectorn{\emph{a}}$仍然很复杂,因此直接定义$\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})$也很困难,在IBM模型中,为了化简问题,$\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})$被进一步分解。使用链式法则,可以得到:
\begin{eqnarray}
\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})=\funp{P}(m|\vectorn{\emph{t}})\prod_{j=1}^{m}{\funp{P}(a_j|a_1^{j-1},s_1^{j-1},m,\vectorn{\emph{t}})\funp{P}(s_j|a_1^{j},s_1^{j-1},m,\vectorn{\emph{t}})}
\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})=\funp{P}(m|\vectorn{\emph{t}})\prod_{j=1}^{m}{\funp{P}(a_j|\vectorn{\emph{a}}{}_1^{j-1},\vectorn{\emph{s}}{}_1^{j-1},m,\vectorn{\emph{t}})\funp{P}(s_j|\vectorn{\emph{a}}{}_1^{j},\vectorn{\emph{s}}{}_1^{j-1},m,\vectorn{\emph{t}})}
\label{eq:5-18}
\end{eqnarray}
\noindent 其中$s_j$$a_j$分别表示第$j$个源语言单词及第$j$个源语言单词对齐到的目标位置,$s_1^{j-1}$表示前$j-1$个源语言单词(即$s_1^{j-1}=s_1...s_{j-1}$),$a_1^{j-1}$表示前$j-1$个源语言的词对齐(即$a_1^{j-1}=a_1...a_{j-1}$),$m$表示源语句子的长度。公式\ref{eq:5-18}$\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})$分解为四个部分,具体含义如下:
\noindent 其中$s_j$$a_j$分别表示第$j$个源语言单词及第$j$个源语言单词对齐到的目标位置,\vectorn{\emph{s}}${{}_1^{j-1}}$表示前$j-1$个源语言单词(即\vectorn{\emph{s}}${}_1^{j-1}=s_1...s_{j-1}$),\vectorn{\emph{a}}${}_1^{j-1}$表示前$j-1$个源语言的词对齐(即\vectorn{\emph{a}}${}_1^{j-1}=a_1...a_{j-1}$),$m$表示源语句子的长度。公式\ref{eq:5-18}$\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})$分解为四个部分,具体含义如下:
\begin{itemize}
\vspace{0.5em}
......@@ -690,9 +690,9 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\vspace{0.5em}
\item 当确定源语言句子的长度$m$后,循环每个位置$j$逐次生成每个源语言单词$s_j$,也就是$\prod_{j=1}^m \cdot$计算的内容;
\vspace{0.5em}
\item 对于每个位置$j$,根据译文$\vectorn{\emph{t}}$、源文长度$m$、已经生成的源语言单词$s_1^{j-1}$和对齐$a_1^{j-1}$,生成第$j$个位置的对齐结果$a_j$,用$\funp{P}(a_j|a_1^{j-1},s_1^{j-1},m,\vectorn{\emph{t}})$表示;
\item 对于每个位置$j$,根据译文$\vectorn{\emph{t}}$、源文长度$m$、已经生成的源语言单词$\vectorn{\emph{s}}_1^{j-1}$和对齐$\vectorn{\emph{a}}_1^{j-1}$,生成第$j$个位置的对齐结果$a_j$,用$\funp{P}(a_j|\vectorn{\emph{a}}_1^{j-1},\vectorn{\emph{s}}_1^{j-1},m,\vectorn{\emph{t}})$表示;
\vspace{0.5em}
\item 对于每个位置$j$,根据译文$\vectorn{\emph{t}}$、源文长度$m$、已经生成的源语言单词$s_1^{j-1}$和对齐$a_1^j$,生成第$j$个位置的源语言单词$s_j$,用$\funp{P}(s_j|a_1^{j},s_1^{j-1},m,\vectorn{\emph{t}})$表示。
\item 对于每个位置$j$,根据译文$\vectorn{\emph{t}}$、源文长度$m$、已经生成的源语言单词$\vectorn{\emph{s}}_1^{j-1}$和对齐$\vectorn{\emph{a}}_1^j$,生成第$j$个位置的源语言单词$s_j$,用$\funp{P}(s_j|\vectorn{\emph{a}}_1^{j},\vectorn{\emph{s}}_1^{j-1},m,\vectorn{\emph{t}})$表示。
\vspace{0.5em}
\end{itemize}
\parinterval 换句话说,当求$\funp{P}(\vectorn{\emph{s}},\vectorn{\emph{a}}|\vectorn{\emph{t}})$时,首先根据译文$\vectorn{\emph{t}}$确定源语言句子$\vectorn{\emph{s}}$的长度$m$;当知道源语言句子有多少个单词后,循环$m$次,依次生成第1个到第$m$个源语言单词;当生成第$j$个源语言单词时,要先确定它是由哪个目标语译文单词生成的,即确定生成的源语言单词对应的译文单词的位置;当知道了目标语译文单词的位置,就能确定第$j$个位置的源语言单词。
......@@ -711,7 +711,7 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\vspace{0.5em}
\item 首先根据译文确定源文$\vectorn{\emph{s}}$的单词数量($m=3$),即$\funp{P}(m=3|\textrm{``}t_0\;\textrm{on\;the\;table''})$
\vspace{0.5em}
\item 再确定源语言单词$s_1$由谁生成的且生成的是什么。可以看到$s_1$由第0个目标语单词生成,也就是$t_0$,表示为$\funp{P}(a_1\;= 0\;\; |\phi,\phi,3,\textrm{``}t_0\;\textrm{on\;the\;table''})$,其中$\phi$表示空。当知道了$s_1$是由$t_0$生成的,就可以通过$t_0$生成源语言第一个单词``在'',即$\funp{P}(s_1\;= \textrm{`` 在''}\;|\{1-0\},\phi,3,\textrm{``$t_0$\;on\;the\;table''}) $
\item 再确定源语言单词$s_1$由谁生成的且生成的是什么。可以看到$s_1$由第0个目标语单词生成,也就是$t_0$,表示为$\funp{P}(a_1\;= 0\;\; |\phi,\phi,3,\textrm{``}t_0\;\textrm{on\;the\;table''})$,其中$\phi$表示空。当知道了$s_1$是由$t_0$生成的,就可以通过$t_0$生成源语言第一个单词``在'',即$\funp{P}(s_1\;= \textrm{`` 在''}\;|\{1-0\},\phi,3,\textrm{``$t_0$\;on\;the\;table''}) $
\vspace{0.5em}
\item 类似于生成$s_1$,依次确定源语言单词$s_2$$s_3$由谁生成且生成的是什么;
\vspace{0.5em}
......@@ -883,7 +883,7 @@ g(\vectorn{\emph{s}},\vectorn{\emph{t}}) \equiv \prod_{j,i \in \widehat{A}}{\fun
\noindent 其中,$\argmax_{\theta}$表示求最优参数的过程(或优化过程)。
\parinterval 公式\ref{eq:5-30}实际上也是一种基于极大似然的模型训练方法。这里,可以把$\funp{P}_{\theta}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$看作是模型对数据描述的一个似然函数,记$L(\vectorn{\emph{s}},\vectorn{\emph{t}};\theta)$。也就是,优化目标是对似然函数的优化:$\{\widehat{\theta}\}=\{\argmax_{\theta \in \Theta}L(\vectorn{\emph{s}},\vectorn{\emph{t}};\theta)\}$,其中\{$\widehat{\theta}$\} 表示可能有多个结果,$\Theta$表示参数空间。
\parinterval 公式\ref{eq:5-30}实际上也是一种基于极大似然的模型训练方法。这里,可以把$\funp{P}_{\theta}(\vectorn{\emph{s}}|\vectorn{\emph{t}})$看作是模型对数据描述的一个似然函数,记$L(\vectorn{\emph{s}},\vectorn{\emph{t}};\theta)$。也就是,优化目标是对似然函数的优化:$\{\widehat{\theta}\}=\{\argmax_{\theta \in \Theta}L(\vectorn{\emph{s}},\vectorn{\emph{t}};\theta)\}$,其中\{$\widehat{\theta}$\} 表示可能有多个结果,$\Theta$表示参数空间。
\parinterval 回到IBM模型的优化问题上。以IBM模型1为例,优化的目标是最大化翻译概率$\funp{P}(\vectorn{\emph{s}}| \vectorn{\emph{t}})$。使用公式\ref{eq:5-64} ,可以把这个目标表述为:
\begin{eqnarray}
......@@ -1088,7 +1088,7 @@ c_{\mathbb{E}}(s_u|t_v)=\sum\limits_{i=1}^{N} c_{\mathbb{E}}(s_u|t_v;s^{[i]},t^
\sectionnewpage
\section{小结及深入阅读}
\parinterval 本章对IBM系列模型中的IBM模型1进行了详细的介绍和讨论,从一个简单的基于单词的翻译模型开始,本章从建模、解码、训练多个维度对统计机器翻译进行了描述,期间涉及了词对齐、优化等多个重要概念。IBM模型共分为5个模型,对翻译问题的建模依次由浅入深,同时模型复杂度也依次增加,我们将在{\chaptersix}对IBM模型2-5进行详细的介绍和讨论。IBM模型作为入门统计机器翻译的``必经之路'',其思想对今天的机器翻译仍然产生着影响。虽然单独使用IBM模型进行机器翻译现在已经不多见,甚至很多从事神经机器翻译等前沿研究的人对IBM模型已经逐渐淡忘,但是不能否认IBM模型标志着一个时代的开始。从某种意义上讲,当使用公式$\hat{\vectorn{\emph{t}}} = \argmax_{\vectorn{\emph{t}}} \funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$描述机器翻译问题的时候,或多或少都在与IBM模型使用相似的思想。
\parinterval 本章对IBM系列模型中的IBM模型1进行了详细的介绍和讨论,从一个简单的基于单词的翻译模型开始,本章从建模、解码、训练多个维度对统计机器翻译进行了描述,期间涉及了词对齐、优化等多个重要概念。IBM模型共分为5个模型,对翻译问题的建模依次由浅入深,同时模型复杂度也依次增加,我们将在{\chaptersix}对IBM模型2-5进行详细的介绍和讨论。IBM模型作为入门统计机器翻译的``必经之路'',其思想对今天的机器翻译仍然产生着影响。虽然单独使用IBM模型进行机器翻译现在已经不多见,甚至很多从事神经机器翻译等前沿研究的人对IBM模型已经逐渐淡忘,但是不能否认IBM模型标志着一个时代的开始。从某种意义上讲,当使用公式$\hat{\vectorn{\emph{t}}} = \argmax_{\vectorn{\emph{t}}} \funp{P}(\vectorn{\emph{t}}|\vectorn{\emph{s}})$描述机器翻译问题的时候,或多或少都在使用与IBM模型相似的思想。
\parinterval 当然,本书也无法涵盖IBM模型的所有内涵,很多内容需要感兴趣的读者继续研究和挖掘。其中最值得关注的是统计词对齐问题。由于词对齐是IBM模型训练的间接产物,因此IBM模型成为了自动词对齐的重要方法。比如IBM模型训练装置GIZA++更多的是被用于自动词对齐任务,而非简单的训练IBM模型参数\upcite{och2003systematic}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论