Commit 8eb661b8 by xiaotong

update chapter 3.2

parent 15f8cf40
......@@ -57,6 +57,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{构建一个简单的机器翻译系统}\index{Chapter3.2}%Index的作用,目前不清晰
\label{sec:simple-mt-example}
\noindent\hspace{2em}本节首先对比人工翻译流程和机器翻译流程的异同点,从中我们归纳出构建机器翻译系统的两个主要流程:训练和解码。其次从单词翻译模型学习、句子级翻译模型学习和解码三个方面描述如何构建一个简单的机器翻译系统。
......@@ -95,6 +96,7 @@
\vspace{0.5em}
\begin{itemize}
\item 如何让计算机得到单词的译文并将它们拼装成句?
\vspace{0.5em}
\item 如果可以形成译文,如何让计算机知道不同译文的好坏?
\end{itemize}
\vspace{0.5em}
......@@ -115,7 +117,7 @@
\vspace{0.5em}
\textbf{(三)人工 vs. 机器}\index{Chapter3.2.1.3}
\noindent\hspace{2em}人在翻译时的决策和推断是非常确定并且快速的,但机器翻译处理这个问题却充满了不确定性和概率化的思想。当然它们也有类似的地方。首先,计算机使用统计模型目的是建立处理翻译问题的基本模式,并储存相关的模型参数,这个和我们大脑的作用是类似的\footnote{这里,并不是要把统计模型类比为生物学或者认知科学上的人脑,我们指的是他们处理问题时发挥的作用类似。};其次,计算机对统计模型进行训练的过程相当于人学习知识的过程,或者二者都可以称为学习;再有,计算机使用学习到的模型对新的句子进行翻译的过程相当于人运用知识进行翻译的过程。在统计机器翻译中,模型学习的过程称为\textbf{训练},目的是从双语平行数据中自动学习翻译知识;我们把应用模型的过程称为\textbf{解码}\textbf{推断},目的是使用学习的知识对新的句子进行翻译。这就是当前机器实现翻译的两个核心步骤:训练和解码。图\ref{figureC3.4}右侧标注了在机器翻译过程中这两个部分的体现。这样,统计机器翻译的核心由三部分构成 - 建模、训练和解码。本章后续内容会围绕这三个问题展开
\noindent\hspace{2em}人在翻译时的决策和推断是非常确定并且快速的,但机器翻译处理这个问题却充满了不确定性和概率化的思想。当然它们也有类似的地方。首先,计算机使用统计模型目的是建立处理翻译问题的基本模式,并储存相关的模型参数,这个和我们大脑的作用是类似的\footnote{这里,并不是要把统计模型等同于生物学或者认知科学上的人脑,我们指的是他们处理问题时发挥的作用类似。};其次,计算机对统计模型进行训练的过程相当于人学习知识的过程,或者二者都可以称为学习;再有,计算机使用学习到的模型对新的句子进行翻译的过程相当于人运用知识进行翻译的过程。在统计机器翻译中,模型学习的过程称为\textbf{训练},目的是从双语平行数据中自动学习翻译知识;我们把应用模型的过程称为\textbf{解码}\textbf{推断},目的是使用学习的知识对新的句子进行翻译。这就是当前机器实现翻译的两个核心步骤:训练和解码。图\ref{figureC3.4}右侧标注了在机器翻译过程中这两个部分的体现。这样,统计机器翻译的核心由三部分构成 - 建模、训练和解码。本章后续内容会围绕这三个问题展开讨论
%----------------------------------------------
% 图3.5
......@@ -126,160 +128,221 @@
\label{figureC3.5}
\end{figure}
%---------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{基本框架}\index{Chapter3.2.2}
\noindent\hspace{2em}下面我们将介绍如何构建一个简易的基于词的机器翻译系统。本小节首先进行简单的建模。如图\ref{figureC3.6}所示,表示的是基于数据驱动的方法的框架,它主要包括两个步骤。
\noindent\hspace{2em}为了可以对统计机器翻译有一个简单且直观的认识,下面我们将介绍如何构建一个非常简单的基于词的统计机器翻译系统,其中用到的很多方法的思想来自IBM模型。这里,我们仍然使用数据驱动的统计建模方法。图\ref{figureC3.6}展示了系统的主要流程,包括两个主要步骤。
\noindent\hspace{2em}第一、模型学习。从双语平行数据中学习模型,这个模型称为$\textrm{P}(t|s)$。其中$s$表示源语言,$t$表示目标语,它表示给定源语句的条件下,翻译为目标语句子的概率。总而言之,这一步我们需要从大量的双语平行数据中求解$\textrm{P}(t|s)$
\vspace{0.5em}
\begin{itemize}
\item 训练。从双语平行数据中学习翻译模型,这个模型称为$\textrm{P}(t|s)$。其中$s$表示源语言,$t$表示目标语,它表示给定源语句的条件下,翻译为目标语句子的概率。简言之,这一步需要从大量的双语平行数据中学习到$\textrm{P}(t|s)$的计算方法。
\vspace{0.5em}
\item 解码。当面对一个新的待翻译句子时,我们需要使用学习得到的模型进行推断。推断可以被视为一个搜索和计算的过程,换句话说,我们尽可能的搜索更多的翻译结果,然后对每个翻译结果进行打分,最后选择得分最高的翻译结果。
\end{itemize}
\vspace{0.5em}
\noindent\hspace{2em}第二、解码。当面对一个新的句子时,我们需要使用学习得到的模型进行推断。推断的方式可描述为穷举和计算,换句话说,我们尽可能的枚举更多的翻译结果,然后对每个翻译结果进行打分,最后选择得分最高的翻译结果。
%----------------------------------------------
% 图3.6
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure36}
\caption{此处为图片的描述...例:基于数据驱动的方法的框架}
\caption{简单的统计机器翻译流程}
\label{figureC3.6}
\end{figure}
%---------------------------
\noindent\hspace{2em}接下来,我们将介绍这个简易机器翻译系统的模型学习和解码的过程。在模型学习中,我们分两小节进行描述,即单词翻译概率和句子级翻译模型,它们属于递进的关系。换言之,句子级翻译概率模型是建立在单词翻译概率之上。
\noindent\hspace{2em}接下来,我们将介绍模型训练和解码的方法。在模型学习中,我们分两小节进行描述 - 单词翻译概率和句子级翻译模型。实现单词级的翻译是实现句子级翻译的基础。换言之,句子级翻译统计模型是建立在单词翻译统计之上。在解码中,我们将介绍一个高效的搜索算法,其中也使用到了剪枝、启发式搜索的思想。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{单词翻译概率}\index{Chapter3.2.3}\label{chapter3.2.3}
\textbf{什么是单词翻译概率?}\index{Chapter3.2.3.1}
\noindent\hspace{2em}单词翻译概率主要解决的是翻译时的“择词”问题,即选择什么样的目标语单词作为候选译文。当人在翻译某个单词时,可以利用积累的知识,快速地得到它的候选译文。举个汉译英的例子,当翻译“我”这个单词时,可能会想到用“I”、“me”或“I’m”作为它的译文,而几乎不会选择“you”、“satisfied”等含义相差太远的目标语单词。这是为什么呢?如果从概率的角度来分析这个问题,无论是我们的课本还是其他学习材料,绝大部分情况下“我”都翻译成了“I”、“me”等,几乎没有看到翻译成“you”或“satisfied”等的情况。换句话说,“我”翻译成“I”、“me”等属于高频事件,而翻译成“you”、“satisfied”等属于低频或小概率事件,它们在整个语料中出现的概率是不一样的。因此人在翻译时也是选择概率更大的目标语单词作为候选译文。
\vspace{0.5em}
\textbf{(一)什么是单词翻译概率?}\index{Chapter3.2.3.1}
\vspace{0.5em}
\noindent\hspace{2em}如何用概率化模型描述上述思想呢?下面我们先介绍如何从一个双语平行数据中估计或者学习单词翻译概率,再介绍如何从大量的双语平行数据中学习更准确的单词翻译概率
\noindent\hspace{2em}单词翻译概率描述的是一个源语言单词与目标语言译文构成正确翻译的可能性,这个概率越高表明单词翻译的越可靠。使用单词翻译概率,可以帮助我们解决翻译时的“择词”问题,即选择什么样的目标语译文是合适的。当人在翻译某个单词时,可以利用积累的知识,快速得到它的高质量候选译文。以汉译英为例,当翻译``我''这个单词时,我们直接会想到用``I''、``me''或``I’m''作为它的译文,而几乎不会选择``you''、``satisfied''等含义相差太远的译文。这是为什么呢?如果从单词翻译概率的角度来看,无论是何种语料,包括教材、新闻、小说等,绝大部分情况下“我”都翻译成了``I''、``me''等,几乎不会看到我被翻译成``you''或``satisfied''的情况。从数据上分析,``我''翻译成``I''、``me''等属于高频事件,而翻译成``you''、``satisfied''等属于低频或小概率事件,它们在整个语料中出现的概率是不一样的。因此人在翻译时也是选择在统计意义上概率更大的译文,这也间接反映出统计模型可以在一定程度上描述人的翻译习惯和模式
\noindent\textbf{如何从一个双语平行数据中学习?}\index{Chapter3.2.3.2}
\noindent\hspace{2em}\ref{tab:word-translation-examples}展示了汉语到英语的单词翻译实例及翻译概率。可以看到,``我''的常见翻译的概率较高,比如,翻译成``I''的概率是0.5,这样系统可以更好的使用这些译文。而且概率化的模型避免了非0即1的判断,所有的译文都是可能的,只是概率不同。这也使得统计模型可以覆盖更多的翻译现象,甚至捕捉到一些人所忽略的现象。
\noindent\hspace{2em}在上一节的骰子游戏中,我们重复地掷骰子很多次,然后计算“1”到“6”各出现的次数,再除以掷的总次数,最后得到它们出现的近似概率。我们同样用类似的方式估计单词翻译概率。假设$x$表示任意源语单词,所有的目标语单词$y \in Y$都可能是它的译文。当给定一个互译的句对$(s,t)$,我们定义$\textrm{P}(x \leftrightarrow y; s, t)$表示在$(s,t)$$x$$y$互译的可能性或概率。其中$x$属于句子$s$中的词,而$y$属于$t$中的词,具体计算如公式\ref{eqC3.1}所示。
\begin{equation}
\textrm{P}(x \leftrightarrow y; s,t) \equiv \textrm{P}(x,y;s,t) = \frac{c(x,y;s,t)}{\sum_{x',y'} c(x',y';s,t)}
%----------------------------------------------
% 表
\begin{table}[htp]
\centering
\begin{tabular}{l | l | l}
源语言 & 目标语言 & 翻译概率 \\ \hline
& I & 0.50 \\
& me & 0.20 \\
& I'm & 0.10 \\
& we & 0.05 \\
& am & 0.10 \\
... & ... & ... \\
\end{tabular}
\caption{汉译英单词翻译概率}
\label{tab:word-translation-examples}
\end{table}
%---------------------------
\vspace{0.5em}
\noindent\textbf{(二)如何从一个双语平行数据中学习?}\index{Chapter3.2.3.2}
\vspace{0.5em}
\noindent\hspace{2em}下面要解决的问题是如何学习单词翻译的概率。假设我们拥有一定数量的双语对照的平行数据,是否可以从中自动获得单词之间的翻译概率呢?回忆一下第二章中的掷骰子游戏,我们使用了相对频率估计来自动获得骰子不同面出现概率的估计值。其中,重复投掷骰子很多次,然后统计“1”到“6”各面出现的次数,再除以投掷的总次数,最后得到它们出现的概率的估计值。这里,我们使用类似的方式计算单词翻译概率。但是,我们现在拥有的是句子一级对齐的数据,但是并不知道两种语言之间单词的对应关系。因此,我们要从句子以及对齐的平行数据中学习单词之间对齐的概率。我们使用一种稍微``复杂''一些的模型来描述这个问题。
假设$x$表示任意源语单词,所有的目标语单词$y \in Y$都可能是它的译文,这里$Y$表示目标语言的词表。给定一个互译的句对$(s,t)$,我们定义$\textrm{P}(x \leftrightarrow y; s, t)$表示在观测到$(s,t)$的前提下$x$$y$互译的概率。其中$x$是属于句子$s$中的词,而$y$是属于$t$中的词。计算公式描述如下:
\begin{eqnarray}
\textrm{P}(x \leftrightarrow y; s,t) & \equiv & \textrm{P}(x,y;s,t) \nonumber \\
& = & \frac{c(x,y;s,t)}{\sum_{x',y'} c(x',y';s,t)}
\label{eqC3.1}
\end{equation}
\end{eqnarray}
\noindent\hspace{2em}上式中分子$c(x,y;s,t)$表示$x$$y$在句对$(s,t)$中共现的总次数,分母$\sum_{x',y'} c(x',y';$ $s,t)$表示任意的$x'$和任意的$y'$$(s,t)$共现的总次数。为了更加清晰的理解如何计算$c(x,y;s,t)$,我们用图\ref{figureC3.7}描述的算法进行了说明。由图可得,计算$c(x,y;s,t)$的过程主要是两层\textbf{for}循环,外层的\textbf{for}循环用于遍历$s$中的词,内层的\textbf{for}循环用于遍历$t$中的词,当$s$中的词等于$x$$t$中的词等于$y$时,count加1,最后count的值就是$x$$y$的总共现次数。
\noindent其中,$\equiv$表示定义式。分子$c(x,y;s,t)$表示$x$$y$在句对$(s,t)$中共现的总次数,分母 $\sum_{x',y'} c(x',y';$ $s,t)$表示任意的源语言单词$x'$和任意的目标语言单词$y'$$(s,t)$共现的总次数。为了更加清晰的理解如何计算$c(x,y;s,t)$,可以参看图\ref{figureC3.7}描述的算法。可以看到,计算$c(x,y;s,t)$的过程主要是两层循环,外层的循环用于遍历$s$中的词,内层的循环用于遍历$t$中的词。当$s$中的词等于$x$$t$中的词等于$y$时,计数器$count$加1,最后$count$的值就是$x$$y$的总共现次数。
%----------------------------------------------
% 图3.7
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure37}
\caption{此处为图片的描述...单词x和y在句对(s, t)中的共现总次数的算法}
\caption{统计源语言单词$x$和目标语言单词$y$在句对$(s, t)$中的共现总次数的算法 ({\red 图里的问题很多,包括符号、斜体,对照着上面的文字内容仔细确认})}
\label{figureC3.7}
\end{figure}
%---------------------------
\noindent\hspace{2em}举个例子,如果互译的句对$(s,t)$分别如图\ref{figureC3.8}所示,$x$$y$分别是“翻译”和“transl-\\ation”,那么它们的单词翻译概率是多少呢?
%----------------------------------------------
% 图3.8
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure38}
\caption{此处为图片的描述...一个互译的句对}
\caption{一个汉英互译的句对}
\label{figureC3.8}
\end{figure}
%---------------------------
\noindent\hspace{2em}在上述例子中,”翻译”和”translation”分别在$s$$t$中出现了2次,因此$c('\text{翻译}',$\\$'\text{translation}';s,t)$等于4。而对于$\sum_{x',y'} c(x',y';s,t)$,因为$x'$$y'$分别是$s$$t$的任意的词,所以等于$s$的词数乘以$t$的词数。最后“翻译”和“translation”的单词翻译概率如式\ref{eqC3.2}所示。
\begin{equation}
\textrm{P}('\text{翻译}','translation'; s,t) = \frac{c(x,y;s,t)}{\sum_{x',y'} c(x',y';s,t)} = \frac{4}{|s|\times |t|} = \frac{4}{63}
\noindent\hspace{2em}看一个具体的例子,有一个汉英互译的句对$(s,t)$如图\ref{figureC3.8}所示。假设,$x=\textrm{``翻译''}$$y=\textrm{``transaltion''}$,现在要计算$x$$y$共现的总次数。``翻译''和``translation''分别在$s$$t$中出现了2次,因此$c(\textrm{``翻译''},\textrm{``translation''};s,t)$ 等于4。而对于$\sum_{x',y'} c(x',y';s,t)$,因为$x'$$y'$分别表示的是$s$$t$中的任意词,所以$\sum_{x',y'} c(x',y';s,t)$表示所有单词对的数量 - 即$s$的词数乘以$t$的词数。最后,“翻译”和“translation”的单词翻译概率可以如下计算:
\begin{eqnarray}
\textrm{P}(\text{``翻译''},\text{``translation''}; s,t) & = & \frac{c(\textrm{``翻译''},\textrm{``translation''};s,t)}{\sum_{x',y'} c(x',y';s,t)} \nonumber \\
& = & \frac{4}{|s|\times |t|} \nonumber \\
& = & \frac{4}{63}
\label{eqC3.2}
\end{equation}
\end{eqnarray}
\noindent\hspace{2em}公式\ref{eqC3.2}中运算$|\bullet|$表示计算句长。类似的可以得到“机器”和“translation”、“机器”和“look”的单词翻译概率,如式\ref{eqC3.3}\ref{eqC3.4}所示。
\begin{equation}
\textrm{P}('\text{机器}','translation'; s,t) = \frac{2}{63}
\label{eqC3.3}
\end{equation}
\begin{equation}
\textrm{P}('\text{机器}','look'; s,t) = \frac{0}{63}
\noindent这里运算$|\cdot|$表示句子长度。类似的,可以得到``机器''和``translation''、“机器”和“look”的单词翻译概率:
\begin{eqnarray}
\textrm{P}(\text{``机器''},\text{``translation''}; s,t) & = & \frac{2}{63} \\
\textrm{P}(\text{``机器''},\text{``look''}; s,t) & = & \frac{0}{63}
\label{eqC3.4}
\end{equation}
\textbf{如何从大量的双语平行数据中学习?}\index{Chapter3.2.3.3}
\end{eqnarray}
\noindent注意,由于``look''没有出现在数据中,因此$\textrm{P}(\text{``机器''},\text{``look''}; s,t)=0$。这时,我们可以使用第二章介绍的平滑算法赋予它一个非零的值,以保证在后续的步骤中整个翻译模型不会出现0概率的情况。
\vspace{0.5em}
\textbf{(三)如何从大量的双语平行数据中学习?}\index{Chapter3.2.3.3}
\vspace{0.5em}
\noindent\hspace{2em}在很多时候,我们有多个互译句对$(s^1,t^1),...,(s^n,t^n)$。如果能从更多的数据中进行统计,那么单词翻译概率也会更加的准确。当我们从大规模的双语平行数据中计算单词翻译概率时,其可定义为公式\ref{eqC3.5}。与公式\ref{eqC3.1}相比,分子分母都多了一项累加符号$\sum_{i-1}^{n}\bullet$,它表示遍历语料库中所有的句对,其中$n$表示语料库中句对的数量。换句话说,当我们计算词的共现次数时,需要对每个句对上的结果进行累加。
\noindent\hspace{2em}上面提到的方法需要能在更多的句子上使用。假设,有多个互译句对$(s^1,t^1)$,...,$(s^n,t^n)$。这时,我们仍然可以使用基于相对频度的方法进行估计,具体方法如下
\begin{equation}
\textrm{P}(x,y) = \frac{{\sum_{i=1}^{n} c(x,y;s^i,t^i)}}{\sum_{i=1}^{n}{{\sum_{x',y'} c(x',y';x^i,y^i)}}}
\label{eqC3.5}
\end{equation}
\noindent\hspace{2em}举个例子。如图\ref{figureC3.9}所示,表示的是两个双语句对。我们使用$s^1$$s^2$分别表示第一个句对和第二个句对的源语句,$t^1$$t^2$表示目标语句。
\noindent与公式\ref{eqC3.1}相比,分子分母都多了一项累加符号$\sum_{i-1}^{n} \cdot$,它表示遍历语料库中所有的句对,其中$n$表示语料库中句对的数量。换句话说,当我们计算词的共现次数时,需要对每个句对上的计数结果进行累加。从统计学习的角度,使用更大规模的数据进行参数估计可以提高估计的准确性。在自然语言处理任务中,使用更大规模的数据往往是提高系统性能的捷径。计算单词的翻译概率也是一样,在小规模的数据上看,很多翻译现象的特征并不明显,但是当使用的数据量增加到一定程度,翻译的规律会很明显的体现出来。
%----------------------------------------------
% 图3.9
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure39}
\caption{此处为图片的描述...多个互译的句对}
\caption{两个个汉英互译的句对}
\label{figureC3.9}
\end{figure}
%---------------------------
\noindent\hspace{2em}如公式\ref{eqC3.6}所示,表示的是词对“翻译”和“translation”基于上述双语句对计算得到的单词翻译概率。分子是两个句对的“翻译”和“translation”共现次数的累计,分母是两个句对的源语词和目标语词的组合数的累加。
{\footnotesize
\begin{equation}
\begin{split}
{\textrm{P}(\textrm{'翻译'},\textrm{'translation'})}&={\frac{c(\textrm{'翻译'},\textrm{'translation'};s^{1},t^{1})+c(\textrm{'翻译'},\textrm{'translation'};s^{2},t^{2})}{\sum_{x',y'} c(x',y';s^{1},t^{1}) + \sum_{x',y'} c(x',y';s^{2},t^{2})}}\\
&={{\frac{4 + 1}{|s^{1}| \times |t^{1}| + |s^{2}| \times |t^{2}|} = \frac{4 + 1}{9 \times 7 + 5 \times 7} = \frac{5}{102}}}
\noindent\hspace{2em}举个例子来说明在多个句子上计算单词翻译概率的方法。图\ref{figureC3.9}展示了一个由两个句对构成的平行语料库。我们用$s^1$$s^2$分别表示第一个句对和第二个句对的源语句子,$t^1$$t^2$表示对应的目标语句子。于是,“翻译”和“translation”的翻译概率的计算过程如下,
{\small
\begin{eqnarray}
{\textrm{P}(\textrm{``翻译''},\textrm{``translation''})} & = & {\frac{c(\textrm{``翻译''},\textrm{``translation''};s^{1},t^{1})+c(\textrm{``翻译''},\textrm{``translation''};s^{2},t^{2})}{\sum_{x',y'} c(x',y';s^{1},t^{1}) + \sum_{x',y'} c(x',y';s^{2},t^{2})}} \nonumber \\
& = & \frac{4 + 1}{|s^{1}| \times |t^{1}| + |s^{2}| \times |t^{2}|} \nonumber \\
& = & \frac{4 + 1}{9 \times 7 + 5 \times 7} \nonumber \\
& = & \frac{5}{102}
\label{eqC3.6}
\end{split}
\end{equation}
\end{eqnarray}
}
公式\ref{eqC3.6}所展示的计算过程很简单。分子是两个句对中``翻译''和``translation''共现次数的累计,分母是两个句对的源语词和目标语词的组合数的累加。显然,这个方法也很容易推广到处理更多句子的情况中,我们仅需要对每个句子的计数进行累加即可。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{句子级翻译模型}\index{Chapter3.2.4}
\noindent\hspace{2em}本节介绍如何获取句子级翻译概率。如图\ref{figureC3.10}所示,我们用条件概率$\textrm{P}(t|s)$表示句子级翻译模型,它表示给定源语句$s$时,目标语句$t$的概率或者可能性。下面展开详细的描述
\noindent\hspace{2em}在获得单词翻译概率的基础上,本节继续介绍如何获取句子级翻译概率。如图\ref{figureC3.10}所示,条件概率$\textrm{P}(t|s)$表示给出源语言句子$s$的情况下译文为$t$的概率。这也是整个句子级翻译模型的核心,它处于整个统计机器翻译流程的中心,一方面我们需要从数据中学习这个模型的参数,另一方面,对于新输入的句子,我们需要使用这个模型得到最佳的译文。下面介绍句子级翻译的建模方法
%----------------------------------------------
% 图3.10
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure310}
\caption{此处为图片的描述...句子级翻译模型就是翻译模型$\textrm{P}(t|s)$}
\caption{$\textrm{P}(t|s)$在句子级翻译中的作用}
\label{figureC3.10}
\end{figure}
%---------------------------
\noindent\textbf{初级句子级翻译模型}\index{Chapter3.2.4.1}
\vspace{0.5em}
\noindent\textbf{(一)句子级翻译的基础模型}\index{Chapter3.2.4.1}
\vspace{0.5em}
\noindent\hspace{2em}直接定义句子级翻译概率并不容易。一个退而求其次的方法是:找到一个函数$g(s,t)$来衡量翻译结果的质量。它描述了这样一个事:当翻译结果$t$的质量越好,则它的值越大;当$t$的翻译质量越差,则它的值越小。换句话说,$g(s,t)$的单调性和翻译质量呈正相关。假如我们已经找到了一个这样的函数$g(s,t)$,就能够间接地定义句子级翻译概率,如公式\ref{eqC3.7}所示。
\noindent\hspace{2em}计算句子级翻译概率并不容易。因为自然语言句子非常灵活,任何数据无法覆盖足够多的句子,因此也我们无法像公式\ref{eqC3.5}一样直接用简单计数的方式对句子的翻译概率进行估计。这里,我们采用一个退而求其次的方法:找到一个函数$g(s,t)$来衡量翻译结果的质量。我们假设:$g(s,t) \ge 0$翻译结果$t$的质量越好,$g(s,t)$的值越大;$t$的翻译质量越差,$g(s,t)$的值越小。换句话说,$g(s,t)$的单调性和翻译质量呈正相关。如果存在这样的函数$g(s,t)$,可以利用$g(s,t)$近似表示句子级翻译概率,如下:
\begin{equation}
\textrm{P}(t|s) = \frac{g(s,t)}{\sum_{t}g(s,t)}
\textrm{P}(t|s) \approx \frac{g(s,t)}{\sum_{t'}g(s,t')}
\label{eqC3.7}
\end{equation}
\noindent\hspace{2em}公式\ref{eqC3.7}相当于在函数$g$上做了归一化,使其具有概率的意义。具体来说,我们枚举了源语句$s$的所有翻译结果$t$,并把所有$t$对应的函数$g$的计算结果相加作为分母,而分子是某个翻译结果$t$的函数$g$的值。
\noindent\hspace{2em}公式\ref{eqC3.7}相当于在函数$g$上做了归一化,这样等式右端的结果具有一些概率的属性,比如,$0 \le \frac{g(s,t)}{\sum_{t}g(s,t)} \le 1$。具体来说,对于源语句枚举其所有的翻译结果,并把这些翻译结果所对应的函数$g(\cdot)$的计算结果相加作为分母,而分子是某个翻译结果$t$所对应的$g(\cdot)$的值。
\noindent\hspace{2em}上述过程初步建立了句子级翻译模型,我们并没有求句子翻译概率的值,而是把问题转为对$g(\cdot)$的设计和计算上。但是,面临着两个新的问题:
\vspace{0.5em}
\begin{itemize}
\item 如何定义函数$g(s,t)$定义?即,在知道单词翻译概率的前提下,如何计算$g(s,t)$
\vspace{0.5em}
\item 公式\ref{eqC3.7}中分母$\sum_{t}g(s,t')$需要累加所有翻译结果所对应函数$g(s,t')$的计算结果,但枚举所有$t'$是不可能的。
\end{itemize}
\vspace{0.5em}
\noindent\hspace{2em}上述过程初步建立了句子级翻译模型,但发现一些问题不好解决。我们主要面临两个问题,第一、函数$g(s,t)$怎么定义。即给定单词翻译概率,如何求句子级互译概率。第二、公式\ref{eqC3.7}中分母的计算需要累加所有翻译结果$t$的函数$g$的计算结果,但求解所有$t$几乎是不可能。实际上最核心的问题还是函数$g(s,t)$的定义或计算。而第二个问题其实不需要解决,这是因为我们通常只关注于可能性最大的翻译结果,即$g(s,t)$的计算结果最大时对应译文
\noindent 当然,最核心的问题还是函数$g(s,t)$的定义。而第二个问题其实不需要解决,因为我们通常只关注于可能性最大的翻译结果,即$g(s,t)$的计算结果最大时对应译文。这个问题会在随后进行讨论
\noindent\hspace{2em}因此如何定义$g(s,t)$成为关键。换句话说,如何表示两个词串之间的对应关系呢?这里我们使用的一个基础思想是大题小做。具体来说,直接表示句子之间的对应太困难了,但可以利用词之间的对应来描述句子之间的对应。这里就用到了上一小节的单词翻译概率。
\noindent\hspace{2em}回到设计$g(s,t)$的问题上。这里,我们采用``大题小作''的方法,这个技巧在第二章已经进行了充分的介绍。具体来说,直接建模句子之间的对应比较困难,但可以利用词之间的对应来描述句子之间的对应关系。这里,就用到了上一小节所介绍的单词翻译概率。
\noindent\hspace{2em}我们首先引入一个非常重要的概率—词对齐,它是统计机器翻译中最基本的概念之一。词对齐描述了句子间的对应,它指出本质上句子之间的对应是由词之间的对应表示的。如图\ref{figureC3.11}所示,$s$$t$分别表源语句和目标语句,单词的右下标表示的是该词在句中的位置,而虚线描述的是句子$s$$t$中的词对齐关系。比如“满意”的右下表“5”表示该词在句子$s$中处于第5个位置,“satisfied”的右下表“3”表示在句子$t$中处于第3个位置,并且“满意”和“satisfied”用虚线连接来表示对应。为方便描述,我们用二元组$(j,i)$来描述词对齐,它表示源语句第$j$个单词对应目标语句第$i$个单词,即单词$s_j$$t_i$对应。图\ref{figureC3.11}中共有5条虚线,表示有5组单词之间的对应。我们把它们构成集合称为$A$,并按如下方式记录下所有的对齐链接,即$A={(1,1),(2,4),(3,5),(4,2)(5,3)}$
\noindent\hspace{2em}我们首先引入一个非常重要的概\ \ \textbf{词对齐},它是统计机器翻译中最基本的概念之一。词对齐描述了并行句对中单词之间的对应关系,它体现了一种观点:本质上句子之间的对应是由词之间的对应表示的。当然,这个观点在神经机器翻译或者其它模型中可能会有不同的理解,但是翻译句子的过程中我们考虑词一级的对应关系是符合我们对语言的认知的。图\ref{figureC3.11}展示了一个句对$s$$t$,单词的右下标数字表示了该词在句中的位置,而虚线表示的是句子$s$$t$中的词对齐关系。比如,``满意''的右下标数字5表示在句子$s$中处于第5个位置,``satisfied''的右下标数字3表示在句子$t$中处于第3个位置,``满意''和``satisfied''之间的虚线表示两个单词之间是对齐的。为方便描述,我们用二元组$(j,i)$来描述词对齐,它表示源语句第$j$个单词对应目标语句第$i$个单词,即单词$s_j$$t_i$对应。通常,也会把$(j,i)$称作一条词对齐连接。图\ref{figureC3.11}中共有5条虚线,表示有5组单词之间的词对齐连接。我们把这些词对齐连接构成的集合称为$A$,即$A={\{(1,1),(2,4),(3,5),(4,2)(5,3)}\}$
%----------------------------------------------
% 图3.11
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure311}
\caption{此处为图片的描述...蓝色的虚线表示的是对齐关系(词对齐}
\caption{汉英互译句对及词对齐连接(蓝色虚线}
\label{figureC3.11}
\end{figure}
%---------------------------
\noindent\hspace{2em}当给定一个源语和目标语的句对$(s,t)$,以及它们的最优词对齐$\widehat{A}$,可以使用单词翻译概率计算$g(s,t)$,如公式\ref{eqC3.8}所示。其中$g(s,t)$被定义为句子$s$中的单词和句子$t$中的单词的翻译概率的乘积,并且这两个单词必须对齐或具有对齐链接。$\textrm{P}(s_j,t_i)$表示具有对齐链接的源语词$s_j$和目标语词$t_i$的单词翻译概率。
\noindent\hspace{2em}对于源语和目标语的句对$(s,t)$,假设我们可以得到最优词对齐$\widehat{A}$,于是可以使用单词翻译概率计算$g(s,t)$,如下
\begin{equation}
g(s,t) = \prod_{(j,i)\in \widehat{A}}\textrm{P}(s_j,t_i)
\label{eqC3.8}
\end{equation}
\noindent\hspace{2em}用图\ref{figureC3.11}表示的句对$(s,t)$进行举例。其中“我”与“I”、“对”与“with”、“你”与“you”\\等相互对应,它们的翻译概率相乘就是$g(s,t)$的计算结果。如公式\ref{eqC3.9}所示。显然如果每个单词的翻译概率都高,那么整句的模型得分也高。
\begin{equation}
\begin{split}
{g(s,t)}&={ \textrm{P}(\textrm{'我','I'}) \times \textrm{P}(\textrm{'对','with'}) \times \textrm{P}(\textrm{'你','you'}) \times}\\
&{\textrm{P}(\textrm{'感到','am'}) \times \textrm{P}(\textrm{'满意','satisfied'})}
\noindent其中$g(s,t)$被定义为句子$s$中的单词和句子$t$中的单词的翻译概率的乘积,并且这两个单词之间必须有对齐连接。$\textrm{P}(s_j,t_i)$表示具有对齐链接的源语词$s_j$和目标语词$t_i$的单词翻译概率。以图\ref{figureC3.11}中的句对为例,其中``我''与``I''、``对''与``with''、``你''与``you''\\等相互对应,可以把它们的翻译概率相乘得到$g(s,t)$的计算结果,如下:
\begin{eqnarray}
{g(s,t)}&= & \textrm{P}(\textrm{``我'',``I''}) \times \textrm{P}(\textrm{``对'',``with''}) \times \textrm{P}(\textrm{``你'',``you''}) \times \nonumber \\
& & \textrm{P}(\textrm{``感到'', ``am''}) \times \textrm{P}(\textrm{``满意'',``satisfied''})
\label{eqC3.9}
\end{split}
\end{equation}
\textbf{语言模型加强的句子翻译概率}\index{Chapter3.2.4.2}
\end{eqnarray}
\noindent\hspace{2em}公式\ref{eqC3.8}定义的$g(s,t)$存在的问题是没有考虑词序信息。我们用一个简单的例子说明这个问题。如图\ref{figureC3.12}所示,表示源语句“我 对 你 感到 满意”的两个翻译结果,第一个翻译结果是“I am satisfied with you”,第二个是“I with you am satisfied”。虽然它们选择的目标语单词是一样的,但词序存在很大差异。比如它们都选择“satisfied”作为源语单词“满意”的译文,但是在第一个翻译结果中处于第3个位置,而第二个中处于最后的位置。显然第一个翻译结果更符合英文的表达习惯,翻译的质量更高。但是当用公式\ref{eqC3.8}计算得到的函数$g$的值却是一样的。
\noindent 显然,如果每个词对齐连接所对应的翻译概率变大,那么整个句子翻译的得分也会提高。也就是说,词对齐越准确,翻译模型的打分越高,$s$$t$之间存在翻译关系的可能性越大。
\textbf{(二)生成流畅的译文}\index{Chapter3.2.4.2}
\noindent\hspace{2em}公式\ref{eqC3.8}定义的$g(s,t)$存在的问题是没有考虑词序信息。我们用一个简单的例子说明这个问题。如图\ref{figureC3.12}所示,源语句``我 对 你 感到 满意''有两个翻译结果,第一个翻译结果是``I am satisfied with you'',第二个是``I with you am satisfied''。虽然这两个译文包含的目标语单词是一样的,但词序存在很大差异。比如,它们都选择了``satisfied''作为源语单词``满意''的译文,但是在第一个翻译结果中``satisfied''处于第3个位置,而第二个结果中处于最后的位置。显然第一个翻译结果更符合英文的表达习惯,翻译的质量更高。可遗憾的,对于有明显差异的两个译文,公式\ref{eqC3.8}计算得到的函数$g(\cdot)$的值却是一样的。
%----------------------------------------------
% 图3.12
\begin{figure}[htp]
......@@ -290,170 +353,142 @@ g(s,t) = \prod_{(j,i)\in \widehat{A}}\textrm{P}(s_j,t_i)
\end{figure}
%---------------------------
\noindent\hspace{2em}如何在$g(s,t)$引入词序信息呢?我们希望函数$g(s,t)$对符合自然语言表达习惯的翻译结果给更高的分数,对于不合符的或不通顺的句子给更低的分数。因此我们引入一种常用于衡量句子流畅度的方法—$n$元文法(n-gram)语言模型。
\noindent\hspace{2em}$n$元文法语言模型是统计机器翻译中非常重要的特征。它用概率化模型描述了句子的流畅度。概率越高表示句子的流畅度越高,越贴近于人的表达习惯。概率越低表示句子越不符合人的表达。一个常用的$n$元文法(unigram)语言模型的定义见公式\ref{eqC3.10}$\textrm{P}_{lm}(t)$表示语言模型给句子$t$的打分,其中$t$依次由单词$t_1t_2...t_m$组成。具体而言,$\textrm{P}_{lm}(t)$被定义为$\textrm{P}(t_i|t_{i-1})(i=1,2,...,m)$的连乘,其中$\textrm{P}(t_i|t_{i-1})(i=1,2,...,m)$表示当前一个单词是$t_{i-1}$时,当前单词是$t_i$的概率。
\begin{equation}
\textrm{P}_{lm}(t)=\textrm{P}_{lm}(t_1...t_m)=\textrm{P}(t_1)\times \textrm{P}(t_2|t_1)\times \textrm{P}(t_3|t_2)\times ... \times \textrm{P}(t_m|t_{m-1})
\label{eqC3.10}
\end{equation}
\noindent\hspace{2em}如何在$g(s,t)$引入词序信息呢?我们希望函数$g(s,t)$对符合自然语言表达习惯的翻译结果给出更高的分数,对于不合符的或不通顺的句子给出更低的分数。这里很自然想到使用语言模型,因为语言模型可以度量一个句子出现的可能性,流畅的句子语言模型得分越高,反之越低。
\noindent\hspace{2em}概率$\textrm{P}(t_i|t_{i-1})(i=1,2,...,m)$也是从大规模的单语数据中统计得到的,它的计算如公式\ref{eqC3.11}所示。其中$c(t_i,t_{i-1})$表示单词$t_{i-1}$$t_i$在单语语料中依次连续出现的次数,而$c(t',t_{i-1})$表示$t_{i-1}$和任意单词$t'$在语料中依次连续出现的次数,它们相除就表示$\textrm{P}(t_i|t_{i-1})$
\begin{equation}
\textrm{P}(t_i|t_{i-1})=\frac{c(t_i|t_{i-1})}{c(t'|t_{i-1})}
\label{eqC3.11}
\end{equation}
\noindent\hspace{2em}举个例子说明。如图\ref{figureC3.13}所示,表示的是4个英文句子$t^1\textrm{}t^2\textrm{}t^3$$t^4$。其中<s>\\和</s>也是单词,用于标识句子的开头和结尾。我们将从这4个句子中估计 ,即“machine”后面是“translation”的概率。
%----------------------------------------------
% 图3.13
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure313}
\caption{此处为图片的描述...}
\label{figureC3.13}
\end{figure}
%---------------------------
\noindent\hspace{2em}我们可以使用第二章介绍的$n$-gram语言模型,它也是统计机器翻译中确保流畅翻译结果的重要模型之一。$n$-gram语言模型用概率化方法描述了句子的生成过程。以2-gram语言模型为例,可以使用如下公式计算一个词串的概率:
\noindent\hspace{2em}如公式\ref{eqC3.12}所示。分母是“machine”后面跟任意单词的次数,在4个句子中各出现一个。分子是“machine”后面跟“translation”的次数,仅在第一个句子中出现一次。因此$\textrm{P}('translation'|'machine')$等于$1/4$。当单语语料的规模更大时,我们得到的计算结果将越来越准确。
\begin{equation}
\textrm{P}('translation'|'machine')=\frac{1}{1+1+1+1}=\frac{1}{4}
\label{eqC3.12}
\end{equation}
\begin{eqnarray}
\textrm{P}_{lm}(t) & = & \textrm{P}_{lm}(t_1...t_m) \nonumber \\
& = & \textrm{P}(t_1)\times \textrm{P}(t_2|t_1)\times \textrm{P}(t_3|t_2)\times ... \times \textrm{P}(t_m|t_{m-1})
\label{eqC3.10}
\end{eqnarray}
\noindent\hspace{2em}语言模型$\textrm{P}_{lm}{(t)}$概率化地描述了目标语句的流畅度,这里将不再对语言模型做过多的介绍,而将重点放在句子级翻译模型的构建
\noindent 其中,$t=t_1...t_m$表示由$m$个单词组成的句子,$\textrm{P}_{lm}(t)$表示语言模型给句子$t$的打分。具体而言,$\textrm{P}_{lm}(t)$被定义为$\textrm{P}(t_i|t_{i-1})(i=1,2,...,m)$的连乘\footnote{为了确保数学表达的准确性,我们定义$\textrm{P}(t_1|t_0) \equiv \textrm{P}(t_1)$},其中$\textrm{P}(t_i|t_{i-1})(i=1,2,...,m)$表示前面一个单词是$t_{i-1}$时,当前单词是$t_i$的概率。语言模型的训练方法可以参看第二章相关内容,这里将不再对语言模型做过多的介绍
\noindent\hspace{2em}如果我们将语言模型$\textrm{P}_{lm}{(t)}$和公式\ref{eqC3.8}表示$g(s,t)$相乘,就得到了一个考虑词序信息的$g(s,t)$。如公式\ref{eqC3.13}所示。但这样做能否筛选出词序正确的翻译结果呢?
\noindent\hspace{2em}回到翻译问题的建模问题上来。我们已经又了语言模型可以帮助系统度量衡每个译文的流畅度,因此可以把它加入模型打分中。一种简单的方法是把语言模型$\textrm{P}_{lm}{(t)}$和公式\ref{eqC3.8}中的$g(s,t)$相乘,这样就得到了一个新的$g(s,t)$,它同时考虑了翻译准确性($\prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)}$)和流畅度($\textrm{P}_{lm}(t)$):
\begin{equation}
g(s,t) \equiv \prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i) \times \textrm{P}_{lm}(t)}
g(s,t) \equiv \prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)} \times \textrm{P}_{lm}(t)
\label{eqC3.13}
\end{equation}
\noindent\hspace{2em}如图\ref{figureC3.14}所示,语言模型$\textrm{P}_{lm}(t)$给分别$t^{'}$$t^{''}$赋予0.0107和0.0009的概率,这表明句子$t^{'}$更符合英文的表达。这与我们的观察相吻合。当再分别乘以$\prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)}$\\的值,就得到公式\ref{eqC3.13}定义的函数$g$的值。显然句子$t^{'}$的分数更高。同时它也是我们希望得到的翻译结果。至此我们完成了对函数$g(s,t)$的定义,当代入公式\ref{eqC3.7}就得到了考虑词序的句子级翻译模型。
\noindent\hspace{2em}如图\ref{figureC3.14}所示,语言模型$\textrm{P}_{lm}(t)$给分别$t^{'}$$t^{''}$赋予0.0107和0.0009的概率,这表明句子$t^{'}$更符合英文的表达。这与我们的期望是相吻合的。它们再分别乘以$\prod_{j,i \in \widehat{A}}{\textrm{P}(s_j,t_i)}$的值,就得到公式\ref{eqC3.13}定义的函数$g(\cdot)$的值。显然句子$t^{'}$的分数更高。同时它也是我们希望得到的翻译结果。至此,我们完成了对函数$g(s,t)$的一个简单定义,把它带入公式\ref{eqC3.7}就得到了同时考虑准确性和流畅性的句子级统计翻译模型。
%----------------------------------------------
% 图3.14
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure314}
\caption{此处为图片的描述...}
\caption{不同译文的语言模型得分和翻译模型得分}
\label{figureC3.14}
\end{figure}
%---------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{解码}\index{Chapter3.2.5}
\noindent\hspace{2em}当我们得到句子级翻译模型后,做的一件事就是对于输入模型的任意句子翻译为对应的目标语译文,这个过程称为解码。具体地说,当给定任意的源语句$s$,找到翻译概率最大的目标语译文$\widehat{t}$。如公式\ref{eqC3.14}所示。这里$\emph{argmax}_t{\textrm{P}(t|s)}$表示找到使$\textrm{P}(t|s)$达到最大时的$t$进行输出。换句话说,我们想找到这样一个$t$,它使得$\textrm{P}(t|s)$的计算结果最大。
\noindent\hspace{2em}\textbf{解码}是指,在得到翻译模型后,对于新输入的句子生成最佳译文的过程。具体来说,当给定任意的源语句$s$,解码系统要找到翻译概率最大的目标语译文$\hat{t}$。这个过程可以被形式化描述为:
\begin{equation}
\widehat{t}=\emph{argmax}\textrm{P}(t|s)
\widehat{t}=\argmax_{t} \textrm{P}(t|s)
\label{eqC3.14}
\end{equation}
\noindent\hspace{2em}结合上一小节对句子级翻译模型的定义和公式\ref{eqC3.14}得到一个新的解码描述。如公式\ref{eqC3.15}所示。
\noindent 其中$\argmax_{t} \textrm{P}(t|s)$表示找到使$\textrm{P}(t|s)$达到最大时的译文$t$。结合上一小节中关于$\textrm{P}(t|s)$的定义,把公式\ref{eqC3.7}带入公式\ref{eqC3.14}得到:
\begin{equation}
\widehat{t}=\argmax_{t}\frac{g(s,t)}{\sum_{t^{'}g(s,t^{'})}}
\label{eqC3.15}
\end{equation}
\noindent\hspace{2em}在公式\ref{eqC3.15}中,我们发现${\sum_{t^{'}g(s,t^{'})}}$仅是关于$s$的函数,当给定源语句$s$时,它是一个常数,不影响对$\widehat{t}$的求解,因此可以进行化简。化简后的解码形式化描述,如公式\ref{eqC3.16}所示。其中g函数的计算见公式\ref{eqC3.13}
\noindent\hspace{2em}在公式\ref{eqC3.15}中,我们发现${\sum_{t^{'}g(s,t^{'})}}$是一个关于$s$的函数,当给定源语句$s$时,它是一个常数,而且$g(\cdot) \ge 0$,因此${\sum_{t^{'}g(s,t^{'})}}$不影响对$\widehat{t}$的求解,也不需要计算。基于此,公式\ref{eqC3.15}可以被化简为:
\begin{equation}
\widehat{t}=\argmax_{t}g(s,t)
\label{eqC3.16}
\end{equation}
\noindent\hspace{2em}现在的问题是当面对一个新的源语句$s$时,我们怎么实现公式\ref{eqC3.16}。一个简单粗暴的做法是枚举所有可能的$t$,然后计算函数$g(s,t)$,将分数最高对于的$t$作为最终的翻译结果
\noindent\hspace{2em}公式\ref{eqC3.16}定义了解码的目标,剩下的问题是实现$\argmax$并快速准确的找到最佳译文$\hat{t}$。但是,简单枚举所有可能的译文并计算$g(s,t)$的值是不可行的,因为所有潜在译文构成的搜索空间是十分巨大的。为了理解机器翻译的搜索空间的规模,我们假设源语句$s$$m$个词,每个词有$n$个可能的翻译候选。如果从左到右一步步翻译每个源语言单词,每个源语言单词有$n$翻译候选,那么简单的顺序翻译会有$n^m$种组合。如果进一步考虑目标语单词的任意调序,每一种对翻译候选进行选择的结果又会对应$m!$种不同的排序。因此,源语句子$s$至少有$n^m \cdot m!$个不同的译文
\noindent\hspace{2em}如何枚举所有的$t$呢?假设源语句$s$$m$个词,每个词有$n$个翻译候选。我们从左到右一步步地扩展译文单词。因为词的候选翻译可以任意调序,所以每一步需要扩展所有没有被翻译的源语单词的翻译候选。换句话说,第一步扩展$m \times n$个候选翻译;第二步扩展$(m-1)\times n$个单词;...... ;第$m-1$步扩展$2\times n$个单词;第$m$步扩展$1 \times n$个单词,直到源语句的全部单词都被翻译。上述过程可以用图3.15表示。其中$\phi$表示空,$w_j^i$表示第$i$步的第$j$个候选翻译,实线表示连接成句。因此源语句$S$对应的可能译文至少有$n^m \bullet m!$。计算见公式\ref{eqC3.17}
\begin{equation}
(m \times n) \times((m-1)\times n) \times((m-2) \times n) \times ...\times (1 \times n)= n^m \bullet m!
\label{eqC3.17}
\end{equation}
%----------------------------------------------
% 图3.15
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure315}
\caption{此处为图片的描述...}
\label{figureC3.15}
\end{figure}
%---------------------------
\noindent\hspace{2em}$n^{m}\bullet m!$是什么样的概念呢?当$m$$n$分别为2和10时,译文可能有200个,这个计算量并不大。但是当$m$$n$分别为20和10时,即源语句的词数20,每个词有10个候选译文。此时约有$2.4329 \times 10^{38}$个候选翻译,这几乎是不可计算的。这说明潜在翻译结果的非常多,几乎无法枚举,因此我们需要高效的搜索算法找到理想的解。
\noindent\hspace{2em}$n^{m}\cdot m!$是什么样的概念呢?如表\ref{figureC3.16}{\red 此处应该是表,不是图})所示,当$m$$n$分别为2和10时,译文只有200个,不算多。但是当$m$$n$分别为20和10时,即源语句的词数为20,每个词有10个候选译文,我们会面对$2.4329 \times 10^{38}$个不同的译文,这几乎是不可计算的。
%----------------------------------------------
% 图3.16
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure316}
\caption{此处为图片的描述...}
\caption{机器翻译搜索空间大小的示例}
\label{figureC3.16}
\end{figure}
%---------------------------
\noindent\hspace{2em}这里介绍一种贪婪的解码算法,它并不从整体最优考虑译文的生成。换句话说,贪婪算法不枚举所有可能的译文,而是每步选择一个源语言单词,利用它的翻译候选扩展译文,并只保留当前步“最好”的结果,直到所有源语言的单词都被翻译。
\noindent\hspace{2em}对于如此巨大的搜索空间,我们需要一种十分有效的搜索算法才能实现机器翻译的解码。这里介绍一种贪婪的解码算法,把解码分成若干步骤,每步只翻译一个单词,并保留当前``最好''的结果,直至所有源语言单词都被翻译完毕。
\noindent\hspace{2em}\ref{figureC3.18}给出了贪婪解码算法的伪代码。其中$\pi$保存所有源语单词的候选译文,$\pi[j]$表示第$j$个源语单词的候选翻译集合,$best$保存当前最好翻译结果,$h$保存当前步生成的所有译文候选。算法的主体有两层循环,在内层循环中如果第$j$个源语单词没有被翻译过,则用$best$和它的候选译文$\pi[j]$生成新的翻译,再存于$h$中,即操作$h=h\cup{\textrm{JOIN}(best,\pi[j])}$。外层循环再从$h$中选择得分最好的结果存于$best$中,即操作$best=\textrm{PruneForTop1}(h)$,并标识相应的源语单词已翻译,即$used[best.j]=true$。该算法的核心在于,我们一直维护一个当前最好的结果,之后每一步考虑扩展这个结果的所有可能,并计算模型得分,然后再保留扩展后的最好结果。注意,在每一步中,只有排名第一的结果才会被保留,其它结果都会被丢弃。这也体现了贪婪的思想。显然这个方法不能保证搜索到全局最优的结果,但是由于每次扩展只考虑一个最好的结果,因此该方法速度很快。图\ref{figureC3.18-2}给出了算法执行过程的简单示例。当然,机器翻译的解码方法有很多,这里我们仅仅使用简单的贪婪搜索方法来解决机器翻译的解码问题,在后续章节会对更加优秀的解码方法进行介绍。
%----------------------------------------------
% 图3.17
% 图3.18
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure317}
\caption{此处为图片的描述...}
\label{figureC3.17}
\input{./Chapter3/Figures/figure318}
\caption{贪婪的机器翻译解码算法}
\label{figureC3.18}
\end{figure}
%---------------------------
\noindent\hspace{2em}如图\ref{figureC3.17}所示,表示的是贪婪解码的示意图。其中红色实线上的单词串联在一起就得到最终的翻译结果。每一步的计算都是基于上一步的翻译结果,比如在第二步的计算,是基于第一步生成的译文$w_1^1$进行扩展的。换句话说,我们需要选择一个单词$w_{?}^2$,使得$w_1^1$$w_{?}^2$的句子级翻译概率最大。
%----------------------------------------------
% 图3.18
% 图3.17
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure318}
\caption{此处为图片的描述...}
\label{figureC3.18}
\caption{贪婪的机器翻译解码过程实例({\red 这个地方要补一个图,利用我课间上的动画,截几个关键帧,曾信写的第六章里并行训练那个图也是类似的,可以参考}}
\label{figureC3.18-2}
\end{figure}
%---------------------------
\noindent\hspace{2em}贪婪解码的伪代码见图\ref{figureC3.18}。简略地分析下代码。其中$\pi$保存所有源语单词的候选译文,$\pi[j]$表示第$j$个源语单词的候选翻译集合,$best$保存当前最好翻译结果,$h$保存当前步生成的所有译文候选。主体是两层循环,在内层循环中如果第$j$个源语单词没有被翻译过,则用$best$和它的候选译文$\pi[j]$生成新的译文翻译,再存于$h$中,即操作$h=h\cup{JOIN(best,\pi[j])}$。外层循环再从$h$中选择得分最好的结果存于$best$中,即操作$best=PruneForTop1(h)$,并标识相应的源语单词已翻译,即$used[best.j]=true$
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{基于词的翻译建模}\index{Chapter3.3}
\noindent\hspace{2em}上一节中,我们以实现为目的简单地介绍了基于词的机器翻译的建模、训练和解码,但很多问题并没有深入思考。比如如何用更严密的数学模型描述翻译过程,更科学的优化方法完成训练以及更多系统化的方法进行解码,还包括空翻译问题、调序模型问题等等还待解决。只有把这些问题解决了才能接近今天的机器翻译水平。本节将介绍统计机器翻译模型基础,即噪声信道模型以及建模方法,这也是IBM模型中最基本的建模思想
\noindent\hspace{2em}\ref{sec:simple-mt-example}节中,我们实现了一个简单的基于词的统计机器翻译模型,内容涉及建模、训练和解码。但是,很多问题还没有进行深入讨论,比如,如何处理空翻译?如何对调序问题进行建模?如何用更严密的数学模型描述翻译过程?如何对更加复杂的统计模型进行训练?等等。针对以上问题,本节将系统的介绍IBM统计机器翻译模型。作为经典的统计器翻译模型,对IBM模型的学习将帮助我们建立对自然语言处理问题的系统化建模思想,特别是对问题的数学描述方法将会成为理解本书后续内容的基础工具
\subsection{噪声信道模型}\index{Chapter3.3.1}
\noindent\hspace{2em}首先分析下统计机器翻译或IBM模型是从什么角度去完成翻译的。人在做翻译时比较简单。对于给定的源语句$s$,不会尝试太多的可能性,而是快速地翻译一个或者若干个正确的译文$\widehat{t}$。因此在人看来除了正确的译文外,其他的翻译都是不正确的。而统计机器翻译更多地强调可能性大小,即所有的译文都是可能的。换句话说,对于源语句$s$,所有可能的目标语词串$t$都是可能的译文,只是可能性大小不同。即每对$(s,t)$都有一个概率值$\textrm{P}(t|s)$来描述$s$翻译为$t$的好与坏。如图\ref{figureC3.19}所示
\noindent\hspace{2em}首先,重新思考一下人类进行翻译的过程。对于给定的源语句$s$,人不会像计算机一样尝试很多的可能,而是快速准确的翻译出一个或者少数几个正确的译文。因此在人看来除了正确的译文外,其他的翻译都是不正确的,或者说除了少数的译文人甚至都不会考虑太多其它的可能性。但是,在统计机器翻译的世界里,没有译文是不可能的。换句话说,对于源语句$s$,所有可能的目标语词串$t$都是可能的译文,只是可能性大小不同。即每对$(s,t)$都有一个概率值$\textrm{P}(t|s)$来描述$s$翻译为$t$的好与坏(图\ref{figureC3.19}
%----------------------------------------------
% 图3.19
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure319}
\caption{此处为图片的描述...}
\caption{不同翻译候选空间的对比:人(左)vs 机器翻译 (右)({\red 这个图还要调整一下,左右之间有一些间隔,同时下面需要表明是啥意思}}
\label{figureC3.19}
\end{figure}
%---------------------------
\noindent\hspace{2em}总之统计机器翻译模型是用概率化的思想指导翻译过程。那如何对这种思想进行建模呢?在IBM模型中使用的建模方式是噪声信道模型,它是由香农在上世纪40年代末提出来的,并于上世纪80年代应用在语言识别领域,后来又被Brown等人用于统计机器翻译中。
\noindent\hspace{2em}IBM模型也是建立在如上统计模型之上。具体来说,IBM模型的基础是\textbf{噪声信道模型}(Noise Channel Model),它是由香农在上世纪40年代末提出来的({\red 参考文献?}),并于上世纪80年代应用在语言识别领域,后来又被Brown等人用于统计机器翻译中({\red 参考文献?2篇 Brown等人还有一篇})
\noindent\hspace{2em}在噪声信道模型中,源语言句子$s$(信宿)被看作是由目标语言句子$t$(信源)经过一个有噪声的信道得到的。如果知道了$s$和信道的性质,我们可以通过$\textrm{P}(t|s)$得到信源的信息,这个过程如图\ref{figureC3.20}所示。
\noindent\hspace{2em}噪声信道模型这样看待翻译问题,即源语言句子$s$(信宿)是由目标语句子$t$(信源)经过一个有噪声的信道得到的。如果知道了$s$和信道的性质,我们可以通过$\textrm{P}(t|s)$得到可能的信源的概率,这个过程如图\ref{figureC3.20}所示。
%----------------------------------------------
% 图3.20
\begin{figure}[htp]
\centering
\input{./Chapter3/Figures/figure320}
\caption{此处为图片的描述...}
\caption{噪声信道模型,其中$s$表示信宿,$t$表示信源}
\label{figureC3.20}
\end{figure}
%---------------------------
\noindent\hspace{2em}举个例子来说明噪声信道模型。对于汉译英的翻译任务,汉语句子$s$可以看做英语句子$t$加入噪声后得到的。换句话说,英语经过噪声-信道传输时发生了扭曲变形,在信道的输出端呈现汉语。于是我们需要根据观察到的汉语特征,通过概率$\textrm{P}(t|s)$猜测最为可能的英语句子。
\noindent\hspace{2em}举个例子。对于汉译英的翻译任务,汉语句子$s$可以被看作是英语句子$t$加入噪声通过信道后得到的结果。换句话说,英语句子经过噪声-信道传输时发生了变化,在信道的输出端呈现为汉语句子。于是我们需要根据观察到的汉语特征,通过概率$\textrm{P}(t|s)$猜测最为可能的英语句子。这个找到最可能的目标语句(信源)的过程也被称为\textbf{解码}(decoding)。直到今天,解码这个概念也被广泛的使用在机器翻译及相关任务中。这个过程也可以表述为:给定输入$s$,找到最可能的输出$t$,使得$\textrm{P}(t|s)$达到最大:
\noindent\hspace{2em}通过上述过程找到最可能的目标语句(信源)的过程称之为解码或翻译。该过程也可以表述为给定源语句$s$,寻找最可能的目标语译文$t$,使得概率$\textrm{P}(\widehat{t}|s)$最大。如公式\ref{eqC3.18}所示。
\begin{equation}
\widehat{t}=\argmax_t\textrm{P}(t|s)
\label{eqC3.18}
\end{equation}
\noindent\hspace{2em}对于公式\ref{eqC3.18}中的 ,我们利用贝叶斯公式进行简单的变换,变换后的形式见公式\ref{eqC3.19}
\begin{equation}
\textrm{P}(t|s)=\frac{\textrm{P}(s,t)}{\textrm{P}(s)}=\frac{\textrm{P}(s|t)\textrm{P(t)}}{\textrm{P}(s)}
\noindent\hspace{2em}公式\ref{eqC3.18}的核心内容之一是定义$\textrm{P}(t|s)$。在IBM模型中,我们使用贝叶斯准则对$\textrm{P}(t|s)$进行如下变换:
\begin{eqnarray}
\textrm{P}(t|s) & = &\frac{\textrm{P}(s,t)}{\textrm{P}(s)} \nonumber \\
& = & \frac{\textrm{P}(s|t)\textrm{P(t)}}{\textrm{P}(s)}
\label{eqC3.19}
\end{equation}
\end{eqnarray}
\noindent\hspace{2em}公式\ref{eqC3.19}可以分为三部分。第一部分是$\textrm{P}(s|t)$,也称为翻译模型。它表示给定目标语句$t$生成源语句$s$的概率,需要注意翻译的方向已经从$\textrm{P}(s|t)$转向了$\textrm{P}(t|s)$,但无须刻意的区分,可以简单地理解为翻译模型刻画了$s$$t$的翻译对应程度。第二部分是$\textrm{P}(t)$,也称为语言模型。它表示的是目标语句$t$的通顺程度。第三部分是$\textrm{P}(s)$,也是语言模型,但刻画的是源语句$s$的通顺程度,在后续的建模中这一项是可以被化简的。
......
......@@ -58,23 +58,23 @@
\end{CJK}
%公式字体设置为计算机现代罗马
\AtBeginDocument{
\SetSymbolFont{operators} {normal}{OT1}{cmr} {m}{n}
\SetSymbolFont{letters} {normal}{OML}{cmm} {m}{it}
\SetSymbolFont{symbols} {normal}{OMS}{cmsy}{m}{n}
\SetSymbolFont{operators}{normal}{OT1}{cmr}{m}{n}
\SetSymbolFont{letters}{normal} {OML}{cmm}{m}{it}
\SetSymbolFont{symbols}{normal}{OMS}{cmsy}{m}{n}
\SetSymbolFont{largesymbols}{normal}{OMX}{cmex}{m}{n}
\SetSymbolFont{operators} {bold} {OT1}{cmr} {bx}{n}
\SetSymbolFont{letters} {bold} {OML}{cmm} {b}{it}
\SetSymbolFont{symbols} {bold} {OMS}{cmsy}{b}{n}
\SetSymbolFont{largesymbols}{bold} {OMX}{cmex}{m}{n}
\SetSymbolFont{operators}{bold}{OT1}{cmr}{bx}{n}
\SetSymbolFont{letters}{bold}{OML}{cmm}{b}{it}
\SetSymbolFont{symbols}{bold}{OMS}{cmsy}{b}{n}
\SetSymbolFont{largesymbols}{bold}{OMX}{cmex}{m}{n}
\SetMathAlphabet{\mathbf}{normal}{OT1}{cmr}{bx}{n}
\SetMathAlphabet{\mathsf}{normal}{OT1}{cmss}{m}{n}
\SetMathAlphabet{\mathit}{normal}{OT1}{cmr}{m}{it}
\SetMathAlphabet{\mathtt}{normal}{OT1}{cmtt}{m}{n}
\SetMathAlphabet{\mathbf}{bold} {OT1}{cmr}{bx}{n}
\SetMathAlphabet{\mathsf}{bold} {OT1}{cmss}{bx}{n}
\SetMathAlphabet{\mathit}{bold} {OT1}{cmr}{bx}{it}
\SetMathAlphabet{\mathtt}{bold} {OT1}{cmtt}{m}{n}
\SetMathAlphabet{\mathbf}{bold}{OT1}{cmr}{bx}{n}
\SetMathAlphabet{\mathsf}{bold}{OT1}{cmss}{bx}{n}
\SetMathAlphabet{\mathit}{bold}{OT1}{cmr}{bx}{it}
\SetMathAlphabet{\mathtt}{bold}{OT1}{cmtt}{m}{n}
}
\renewcommand{\baselinestretch}{1.2}%设置行间距
\begin{document}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论