Commit 8fd4e521 by 单韦乔

第一章和第二章反馈修改,以及第二章排版

parent e90cda27
......@@ -109,7 +109,7 @@
\parinterval 人工翻译已经存在了上千年,而机器翻译又起源于什么时候呢?机器翻译跌宕起伏的发展史可以分为萌芽期、受挫期、快速成长期和爆发期四个阶段。
\parinterval 早在17世纪,如笛卡儿(Descartes)、莱布尼兹(Leibniz)、贝克(Cave Beck)、基尔施(Athanasius Kircher)和贝希尔(Johann Joachim Becher)等很多学者就提出采用机器词典(电子词典)来克服语言障碍的想法,这种想法在那个连计算机都没有的时代是很超前的。随着语言学、计算机科学等学科中基础知识的累积,在19世纪30年代使用计算模型进行自动翻译的思想开始萌芽,如当时法国科学家G.\ B.\ Artsouni就提出用机器来进行翻译的想法。但是那时依然没有合适的实现手段,所以这种想法的合理性无法被证实,所有的想法都仅仅是猜测。
\parinterval 早在17世纪,如Descartes、Leibniz、Cave\ Beck、Athanasius\ Kircher和Johann\ Joachim\ Becher等很多学者就提出采用机器词典(电子词典)来克服语言障碍的想法,这种想法在那个连计算机都没有的时代是很超前的。随着语言学、计算机科学等学科中基础知识的累积,在19世纪30年代使用计算模型进行自动翻译的思想开始萌芽,如当时法国科学家G.\ B.\ Artsouni就提出用机器来进行翻译的想法。但是那时依然没有合适的实现手段,所以这种想法的合理性无法被证实,所有的想法都仅仅是猜测。
%----------------------------------------------
\begin{figure}[htp]
......@@ -122,9 +122,9 @@
\parinterval 随着第二次世界大战爆发, 由于战争的需要,对文字进行加密和解密成为重要的军事需求,这也使得数学和密码学变得相当发达。残酷的战争使得科学飞速发展,在战争结束一年后,世界上第一台通用电子数字计算机于1946年研制成功(图\ref{fig:1-4}\footnote{\url{https://baike.baidu.com/item/ENIAC}}),至此使用机器进行翻译有了真正实现的可能。
\parinterval 基于战时密码学领域与通讯领域的研究,香农(Claude Elwood Shannon)在1948年提出使用``噪声信道''描述语言的传输过程,并借用热力学中的``熵''(entropy)来刻画消息中的信息量\cite{DBLP:journals/bstj/Shannon48}。次年,香农和韦弗(Warren Weaver)更是合著了著名的《通讯的数学理论》(Communication Theory of Secrecy Systems),这都为后期的统计机器翻译打下了理论基础。
\parinterval 基于战时密码学领域与通讯领域的研究,Claude\ Elwood\ Shannon在1948年提出使用``噪声信道''描述语言的传输过程,并借用热力学中的``{\small\bfnew{}}\index{}''(Entropy)\index{Entropy}来刻画消息中的信息量\cite{DBLP:journals/bstj/Shannon48}。次年,Shannon和Warren\ Weaver更是合著了著名的《通讯的数学理论》\cite{DBLP:journals/bstj/Shannon48a},这都为后期的统计机器翻译打下了理论基础。
\parinterval 1949年,韦弗撰写了一篇名为《翻译》的备忘录,在这个备忘录中韦弗提出用密码学的方法解决人类语言翻译任务的想法,比如把汉语看成英语的一个加密文本,汉语翻译成英语就类似于解密的过程。并且在这篇备忘录中他也第一次提出了机器翻译,正式开创了{\small\bfnew{机器翻译}}\index{机器翻译}(Machine Translation)\index{Machine Translation}的概念,这个概念一直沿用至今。虽然,在那个年代进行机器翻译研究仍有很多不具备的条件,包括使用加密解密技术进行自动翻译的很多尝试很快也被验证是不可行的。不过,这些早期的探索为后来机器翻译的发展提供了思想的火种。
\parinterval 1949年,Weaver撰写了一篇名为《翻译》的备忘录,在这个备忘录中Weaver提出用密码学的方法解决人类语言翻译任务的想法,比如把汉语看成英语的一个加密文本,汉语翻译成英语就类似于解密的过程。并且在这篇备忘录中他也第一次提出了机器翻译,正式开创了{\small\bfnew{机器翻译}}\index{机器翻译}(Machine Translation)\index{Machine Translation}的概念,这个概念一直沿用至今。虽然,在那个年代进行机器翻译研究仍有很多不具备的条件,包括使用加密解密技术进行自动翻译的很多尝试很快也被验证是不可行的。不过,这些早期的探索为后来机器翻译的发展提供了思想的火种。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -134,7 +134,7 @@
\parinterval 随着电子计算机的发展,研究者开始尝试使用计算机来进行自动翻译。1954年,美国乔治敦大学在IBM公司支持下,启动了第一次真正的机器翻译实验。翻译的目标是将几个简单的俄语句子翻译成为英文,翻译系统包含6条翻译规则和250词汇。这次翻译实验中测试了50个化学文本句子,取得了初步成功。在某种意义上来说,这个实验显示了采用基于词典和翻译规则的方法可以实现机器翻译过程。虽然只是取得了初步成功,但却一下子引起了苏联、英国和日本研究机构的机器翻译研究热,大大推动了早期机器翻译研究进展。
\parinterval 1957年,乔姆斯基(Noam Chomsky)在《句法结构》一书中详细描述了转换生成语法,他使用数学方法来研究自然语言,建立了包括上下文有关语法、上下文无关语法等4种类型的语法。这些工作最终为今天计算机中广泛使用的``形式语言''奠定了基础。而他的思想也深深地影响了同时期的语言学和自然语言处理领域的学者,似乎他的``普遍语法''观点:``人类从出生开始就有某种可以让人类学会任何语言的机制''成为了一个普遍真理,也是在这种认识下,早期基于规则的机器翻译被认为是更加合乎逻辑的。
\parinterval 1957年,Noam\ Chomsky在《句法结构》一书中详细描述了转换生成语法,他使用数学方法来研究自然语言,建立了包括上下文有关语法、上下文无关语法等4种类型的语法。这些工作最终为今天计算机中广泛使用的``形式语言''奠定了基础。而他的思想也深深地影响了同时期的语言学和自然语言处理领域的学者,似乎他的``普遍语法''观点:``人类从出生开始就有某种可以让人类学会任何语言的机制''成为了一个普遍真理,也是在这种认识下,早期基于规则的机器翻译被认为是更加合乎逻辑的。
\parinterval 虽然在这段时间,使用机器进行翻译的议题越加火热,但是事情并不总是一帆风顺,怀疑论者对机器翻译一直存有质疑,并很容易找出一些机器翻译无法解决的问题。自然地,人们也期望能够客观地评估一下机器翻译的可行性。当时美国基金资助组织委任自动语言处理咨询会承担了这项任务。经过近两年的调查与分析,该委员会于1966年11月公布了一个题为《语言与机器》的报告(图\ref{fig:1-5}),即ALPAC报告。该报告全面否定了机器翻译的可行性,为机器翻译的研究泼了一盆冷水。
......@@ -161,7 +161,7 @@
\parinterval 上世纪70年代中后期,特别是80年代到90年代初,国家之间往来日益密切,而不同语言之间形成的交流障碍愈发严重,传统的人工作业方式已经远远不能满足需求。与此同时,语料库语言学的发展也为机器翻译提供了新的思路。其中,随着传统纸质文字资料不断电子化,计算机可读的语料越来越多,这使得人们可以用计算机对语言规律进行统计分析。另一方面,随着可用数据越来越多,用数学模型描述这些数据中的规律并进行推理逐渐成为可能。这也衍生出一类数学建模方法\ \dash\ {\small\bfnew{数据驱动}}\index{数据驱动}(Data-Driven)\index{Data-Driven}的方法。同时这类方法也成为了随后出现的统计机器翻译的基础,其中比较有代表性的就是IBM研究人员基于噪声信道模型提出的5种统计模型,后来被称为IBM Model1到IBM Model5\cite{DBLP:journals/coling/BrownCPPJLMR90,DBLP:journals/coling/BrownPPM94}
\parinterval 基于数据驱动的方法不依赖于人写的规则,机器翻译的建模、训练和推断都可以自动地从数据中学习。这使得整个机器翻译的范式发生了翻天覆地的变化,比如,日本学者长尾真(Makoto Nagao)提出的基于实例的方法\cite{DBLP:conf/coling/SatoN90}和统计机器翻译就是在此期间兴起的。此外,这样的方法使得机器翻译系统的开发代价大大地降低。
\parinterval 基于数据驱动的方法不依赖于人写的规则,机器翻译的建模、训练和推断都可以自动地从数据中学习。这使得整个机器翻译的范式发生了翻天覆地的变化,比如,日本学者长尾真提出的基于实例的方法\cite{DBLP:conf/coling/SatoN90}和统计机器翻译就是在此期间兴起的。此外,这样的方法使得机器翻译系统的开发代价大大地降低。
\parinterval 从上世纪90年代到本世纪初,随着语料库的完善与高性能计算机的发展,统计机器翻译很快成为了当时机器翻译研究与应用的代表性方法。一个标志性的事件是谷歌推出了一个在线的免费自动翻译服务,也就是大家熟知的谷歌翻译。这使得机器翻译这种``高大上''的技术快速进入人们的生活,而不再是束之高阁的科研想法。随着机器翻译不断走向实用,机器翻译的应用也越来越多,这反过来进一步促进了机器翻译的研究进程。比如,在2005-2015年间,统计机器翻译这个主题几乎统治了ACL等自然语言处理相关方向顶级会议的论文,可见其在当时的影响力。
......@@ -279,7 +279,7 @@
\parinterval\ref{fig:1-9}展示了一个使用转换法进行翻译的实例。这里,利用一个简单的汉译英规则库完成对句子``我对你感到满意''的翻译。当翻译``我''时,从规则库中找到规则1,该规则表示遇到单词``我''就翻译为``I'';类似地,也可以从规则库中找到规则4,该规则表示翻译调序,即将单词``you''放到``be satisfied with''后面。这种通过规则表示词汇的对应关系,并在翻译中使用的思想也为统计机器翻译方法提供了思路。如统计机器翻译中,基于短语的翻译模型使用短语对对原文进行替换,详细描述可以参考第四章。
\parinterval 在上述例子中可以发现,规则不仅仅可以翻译句子之间词汇的对应,如规则1,还可以表示句法甚至语法之间的对应,如规则6。因此基于规则的方法可以分成多个层次,如图\ref{fig:1-10}所示。不同层次表示采用不同知识来书写规则完成机器翻译过程。对于一个翻译问题,可以构建不同层次的基于规则的机器翻译系统。这里包括四个层次,分别为:词汇转换、句法转换、语义转换和中间语言层。其中,上层可以继承下层的翻译知识,比如说句法转换层会利用词汇转换层知识。早期基于规则的方法属于词汇转换层。
\parinterval 在上述例子中可以发现,规则不仅仅可以翻译句子之间词汇的对应,如规则1,还可以表示句法甚至语法之间的对应,如规则6。因此基于规则的方法可以分成多个层次,如图\ref{fig:1-10}所示。图中不同的层次表示采用不同的知识来书写规则,进而完成机器翻译过程。对于一个翻译问题,可以构建不同层次的基于规则的机器翻译系统。这里包括四个层次,分别为:词汇转换、句法转换、语义转换和中间语言层。其中,上层可以继承下层的翻译知识,比如说句法转换层会利用词汇转换层知识。早期基于规则的方法属于词汇转换层。
%----------------------------------------------
\begin{figure}[htp]
......@@ -297,7 +297,7 @@
\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]
......@@ -342,11 +342,11 @@
\end{figure}
%-------------------------------------------
\parinterval 如图\ref{fig:1-13}所示,基于中间语言的方法最大特点就是采用了一个称之为``中间语言''的知识表示结构,将``中间语言''作为独立源语分析和独立目标语生成的桥梁,真正实现独立分析和独立生成的过程。并且在基于中间语言的方法中不涉及``相关转换''这个过程,这一点十分不同于基于转换的方法
\parinterval 如图\ref{fig:1-13}所示,基于中间语言方法的最大特点就是采用了一个称之为``中间语言''的知识表示结构,将``中间语言''作为独立源语分析和独立目标语生成的桥梁,真正实现独立分析和独立生成。并且在基于中间语言的方法中不涉及``相关转换''这个过程,这一点与基于转换的方法有很大区别
\parinterval 从图\ref{fig:1-10}可以发现,中间语言(知识表示)处于最顶端,本质上是独立于源语言和目标语言的,这也是基于中间语言的方法可以将分析过程和生成过程分开的原因。
\parinterval 虽然基于中间语言的方法有上述优点,但如何定义中间语言一个关键问题。严格上说,所谓中间语言本身是一种知识表示结构,承载着源语言句子的分析结果,应该包含和体现尽可能多的源语言知识,可以用于生成过程使用。如果中间语言的表示能力不强,会导致源语言句子信息丢失,这自然会影响目标语生成结果。
\parinterval 虽然基于中间语言的方法有上述优点,但如何定义中间语言一个关键问题。严格上说,所谓中间语言本身是一种知识表示结构,承载着源语言句子的分析结果,应该包含和体现尽可能多的源语言知识,可以用于生成过程使用。如果中间语言的表示能力不强,会导致源语言句子信息丢失,这自然会影响目标语生成结果。
\parinterval 在基于规则的机器翻译方法中,构建中间语言结构的知识表示方式有很多,比较常见是语法树、语义网、逻辑结构表示或者多种结构的融合等。但不管哪种方法,实际上都无法充分地表达源语言句子所携带的信息。因此,在早期的基于规则的机器翻译研究中,基于中间语言的方法明显弱于基于转换的机器翻译方法。不过,近些年随着神经机器翻译等方法的兴起,使用统一的中间表示来刻画句子又受到了广泛关注。但是,神经机器翻译中的``中间表示''并不是规则系统中的中间语言,二者有着本质区别,这部分内容将会在第十章进行介绍。
......@@ -358,7 +358,7 @@
\parinterval 在基于规则的机器翻译时代,机器翻译技术研究有一个特点就是{\small\bfnew{语法}}\index{语法}(Grammer)\index{Grammer}{\small\bfnew{算法}}\index{算法}(Algorithm)\index{Algorithm}分开,本质上是把语言分析和程序设计分开。传统方式使用程序代码来实现翻译规则,并把所谓的翻译规则隐含在程序代码实现中。其中最大问题是一旦翻译规则发生修改,程序代码也需要进行相应修改,导致维护代价非常高。此外书写翻译规则的语言学家与编代码的程序员沟通代价也非常高,有时候会出现鸡同鸭讲的感觉。把语法和算法分开对于基于规则的机器翻译技术来说最大好处就是可以将语言学家和程序员的工作分开,各自发挥自己的优势。
\parinterval 这种语言分析和程序设计分开的实现方式也使得基于人工书写翻译规则的机器翻译方法非常直观,语言学家可以非常容易将翻译知识利用规则的方法表达出来,并且不需要修改系统代码。例如:1991年,东北大学自然语言处理实验室王宝库教授提出的规则描述语言(CTRDL)\cite{王宝库1991机器翻译系统中一种规则描述语言};1995年,东北大学自然语言处理实验室姚天顺教授提出的词汇语义驱动算法\cite{唐泓英1995基于搭配词典的词汇语义驱动算法},都是在这种思想上对机器翻译方法的一种改进。此外,使用规则本身就具有一定的优势。例如,翻译规则的书写颗粒度具有很大的可伸缩性。较大颗粒度的翻译规则有很强的概括能力,较小颗粒度的翻译规则具有精细的描述能力。同时翻译规则还便于处理复杂的句法结构和进行深层次的语义理解,比如解决翻译过程中的长距离依赖问题。
\parinterval 这种语言分析和程序设计分开的实现方式也使得基于人工书写翻译规则的机器翻译方法非常直观,语言学家可以很容易地将翻译知识利用规则的方法表达出来,并且不需要修改系统代码。例如:1991年,东北大学自然语言处理实验室王宝库教授提出的规则描述语言(CTRDL)\cite{王宝库1991机器翻译系统中一种规则描述语言}。以及1995年,同为东北大学自然语言处理实验室的姚天顺教授提出的词汇语义驱动算法\cite{唐泓英1995基于搭配词典的词汇语义驱动算法},都是在这种思想上对机器翻译方法的一种改进。此外,使用规则本身就具有一定的优势。首先,翻译规则的书写颗粒度具有很大的可伸缩性。其次,较大颗粒度的翻译规则有很强的概括能力,较小颗粒度的翻译规则具有精细的描述能力。最后,翻译规则还便于处理复杂的句法结构和进行深层次的语义理解,比如解决翻译过程中的长距离依赖问题。
\parinterval 通过图\ref{fig:1-9}中规则的翻译实例中可以看出,规则的使用和人类进行翻译时所使用的思想非常类似,可以说基于规则的方法实际上在试图描述人类进行翻译的思维过程。虽然直接模仿人类的翻译方式对翻译问题建模是合理的,但是这一定程度上也暴露了基于规则的方法的弱点。基于规则的机器翻译方法中,人工书写翻译规则的主观因素重,有时与客观事实有一定差距。并且人工书写翻译规则的难度大,代价非常高,这也成为了后来基于数据驱动的机器翻译方法主要改进的方向。
......
\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=red!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=red!20,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[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$sos$>$\\[-0.5ex]$<$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=north,minimum width=1.8em,minimum height=1em,fill=blue!10] (l1) at ([yshift=-1em]eos.south){};
% \node[anchor=north,minimum width=1.8em,minimum height=1em,fill=red!10] (l2) at ([yshift=-0.5em]l1.south){};
\node[anchor=west,unit,fill=red!40,opacity=0.3] (n24) at ([xshift=6em]n11.east){an};
\node[anchor=west,unit,text=red] (w1) at ([xshift=1.5em,yshift=7em]eos.east){$w_1$};
\node[anchor=north,unit,fill=blue!10] (n11) at ([yshift=-0.5em]w1.south){$<$sos$>$};
\node[anchor=west,unit,fill=red!20,opacity=0.3] (n24) at ([xshift=4.5em]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=south,unit,fill=red!20] (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=south,unit,fill=red!20] (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=south,unit,fill=red!20] (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,unit,fill=red!20,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,unit,fill=red!20,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,unit,fill=blue!10,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=west,unit,fill=red!20] (n31) at ([yshift=3em,xshift=6em]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,unit,fill=blue!10] (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,unit,fill=red!20,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,unit,fill=red!20,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,unit,fill=red!20,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,unit,fill=red!20,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,unit,fill=red!20,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,unit,fill=red!20] (n41) at ([yshift=-0.1em]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,unit,fill=red!20,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$};
......
\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=red!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=red!20,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[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$sos$>$\\[-0.5ex]$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2em,yshift=-3em]eos.south){$w_1$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2.5em,yshift=-1em]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{生成顺序:}};
......@@ -16,7 +16,7 @@
\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,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$};
......@@ -24,23 +24,23 @@
\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,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=red!20] (n36) at ([yshift=-0.3em]n35.south){$<$eos$>$};
\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=red!20] (n41) at ([xshift=4em]n31.east){$<$eos$>$};
\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=red!20] (n42) at ([xshift=4em]n32.east){$<$eos$>$};
\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=red!20] (n43) at ([xshift=4em]n34.east){$<$eos$>$};
\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=red!20] (n44) at ([xshift=4em]n35.east){$<$eos$>$};
\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$};
......
\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=red!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=red!20,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[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$sos$>$\\[-0.5ex]$<$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=west,unit,text=red] (w1) at ([xshift=2em,yshift=4.5em]eos.east){$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{生成顺序:}};
\node [anchor=north] (wtranslabel) at ([xshift=0em,yshift=-1em]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=south,unit,fill=red!20] (n21) at ([yshift=0.3em]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,unit,fill=blue!10] (n23) at ([yshift=-0.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$};
......@@ -24,7 +24,7 @@
\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,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]n34.north){$w_3$};
......
\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=red!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=red!20,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[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$sos$>$\\[-0.5ex]$<$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=north,unit,text=red] (w1) at ([yshift=-1.5em]eos.south){$w_1$};
\node[anchor=north,unit,fill=blue!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,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=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=ugreen!20,minimum width=4.3em] (n32) at ([xshift=3em]n21.east){agree};
\node[anchor=south,unit,fill=ugreen!20,minimum width=4.3em] (n31) at ([yshift=0.3em]n32.north){I};
\node[anchor=north,unit,fill=ugreen!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,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$};
......
\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=red!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=red!20,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[fill=blue!10,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$sos$>$\\[-0.5ex]$<$eos$>$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2em,yshift=-3em]eos.south){$w_1$};
\node[anchor=north,unit,text=red] (w1) at ([xshift=2.5em,yshift=-1em]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{生成顺序:}};
\node [anchor=north west,unit] (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};
......
\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=red!40,inner sep=2pt,minimum width=5em](vocab)at(0,0){\color{white}{\small\bfnew{词表}}};
\node[fill=red!20,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[fill=blue!20,anchor=north,align=left,inner sep=3pt,minimum width=5em](eos)at(spe.south){$<$sos$>$\\[-0.5ex]$<$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=north,unit,text=red] (w1) at ([xshift=2.5em,yshift=-1em]eos.south){$w_1$};
\node[anchor=north,unit,fill=blue!10] (n11) at ([yshift=-0.5em]w1.south){{{$<$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=west,unit,fill=red!20] (n22) at ([xshift=3em]n11.east){{{agree}}};
\node[anchor=south,unit,fill=red!20] (n21) at ([yshift=5.5em]n22.north){{{I}}};
\node[anchor=north,unit,fill=blue!10] (n23) at ([yshift=-3em]n22.south){{{$<$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=west,unit,fill=red!20] (n32) at ([xshift=3em]n21.east){{{agree}}};
\node[anchor=south,unit,fill=red!20] (n31) at ([yshift=0.3em]n32.north){{{I}}};
\node[anchor=north,unit,fill=blue!10] (n33) at ([yshift=-0.3em]n32.south){{{$<$eos$>$}}};
\node[anchor=west,unit,fill=red!20] (n35) at ([xshift=3em]n22.east){{{agree}}};
\node[anchor=south,unit,fill=red!20] (n34) at ([yshift=0.3em]n35.north){{{I}}};
\node[anchor=north,unit,fill=blue!10] (n36) at ([yshift=-0.3em]n35.south){{{$<$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=west,unit,fill=blue!10] (n41) at ([xshift=3em]n31.east){{{$<$eos$>$}}};
\node[anchor=west,unit,fill=blue!10] (n42) at ([xshift=3em]n32.east){{{$<$eos$>$}}};
\node[anchor=west,unit,fill=blue!10] (n43) at ([xshift=3em]n34.east){{{$<$eos$>$}}};
\node[anchor=west,unit,fill=blue!10] (n44) at ([xshift=3em]n35.east){{{$<$eos$>$}}};
\node[anchor=south,unit,text=red] (w4) at ([yshift=0.5em]n41.north){$w_4$};
\draw[->,ublue,very thick] (n11.east) -- (n21.west);
......
......@@ -361,7 +361,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\label{eq:2-18}
\end{eqnarray}
\noindent 这里,$\theta_1 \sim \theta_5$可以被看作是模型的参数,因此这个模型的自由度是5。对于这样的模型,参数确定了,模型也就确定了。但是,新的问题来了,在定义骰子每个面的概率后,如何求出具体的概率值呢?一种常用的方法是,从大量实例中学习模型参数,这个方法也是常说的{\small\bfnew{参数估计}}\index{参数估计}(Parameter Estimation)\index{Parameter Estimation}。可以将这个不均匀的骰子先实验性掷很多次,这可以被看作是独立同分布的若干次采样,比如$X$ 次,发现``1'' 出现$X_1$ 次,``2'' 出现$X_2$ 次,以此类推,得到了各个面出现的次数。假设掷骰子中每个面出现的概率符合多项式分布,通过简单的概率论知识可以知道每个面出现概率的极大似然估计为:
\noindent 这里,$\theta_1 \sim \theta_5$可以被看作是模型的参数,因此这个模型的自由度是5。对于这样的模型,参数确定了,模型也就确定了。但是,新的问题来了,在定义骰子每个面的概率后,如何求出具体的概率值呢?一种常用的方法是,从大量实例中学习模型参数,这个方法也是常说的{\small\bfnew{参数估计}}\index{参数估计}(Parameter Estimation)\index{Parameter Estimation}。可以将这个不均匀的骰子先实验性掷很多次,这可以被看作是独立同分布的若干次采样,比如$X$ 次,发现``1'' 出现$X_1$ 次,``2'' 出现$X_2$ 次,以此类推,得到了各个面出现的次数。假设掷骰子中每个面出现的概率符合多项式分布,通过简单的概率论知识可以知道每个面出现概率的极大似然估计为:
\begin{eqnarray}
\textrm{P(``i'')}=\frac {X_i}{X}
\label{eq:2-19}
......@@ -389,7 +389,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\end{figure}
%-------------------------------------------
\parinterval {\small\sffamily\bfseries{上帝是不公平的}},上面这个掷骰子游戏也是如此。在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种{\small\sffamily\bfseries{偏置}}\index{偏置}(Bias)\index{Bias},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。设计统计模型的目的正要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval {\small\sffamily\bfseries{上帝是不公平的}},上面这个掷骰子游戏也是如此。在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种{\small\sffamily\bfseries{偏置}}\index{偏置}(Bias)\index{Bias},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。设计统计模型的目的正要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval 在处理语言问题时,为了评价哪些词更容易在一个句子中出现,或者哪些句子在某些语境下更合理,常常也会使用统计方法对词或句子出现的可能性建模。与掷骰子游戏类似,词出现的概率可以这样理解:每个单词的出现就好比掷一个巨大的骰子,与前面的例子中有所不同的是:
......@@ -397,7 +397,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\vspace{0.5em}
\item 骰子有很多个面,每个面代表一个单词。
\vspace{0.5em}
\item 骰子是不均匀的,代表常用单词所在的那些面的出现次数会远远多于罕见词。
\item 骰子是不均匀的,代表常用单词所在的那些面的出现次数会远远多于罕见词。
\vspace{0.5em}
\end{itemize}
......@@ -447,7 +447,7 @@ F(x)=\int_{-\infty}^x f(x)dx
\parinterval 通过这个学习过程,我们就可以得到每个词出现的概率,成功使用统计方法对“单词的频率”这个问题进行建模。
\parinterval 那么又该如何计算一个句子的概率呢?在自然语言处理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若干单词的联合概率,即$\textrm{P}(w_1 w_2 w_3...w_m)$
\parinterval 那么又该如何计算一个句子的概率呢?在自然语言处理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若干单词的联合概率,即$\textrm{P}(w_1 w_2 w_3...w_m)$
\parinterval 其中,$w$表示句子中的一个单词。此时仍可以使用掷骰子的方式,将骰子的每个面看作一个句子,然后用统计词汇概率的方式统计句子的概率。但是这里有一个问题,一个句子在指定文本中出现的次数一定比词汇在文本出现的次数低得多,此时通过统计的方式求句子的频率会由于样本数太少,导致无法准确的求出句子的概率,因此对句子的统计建模仍需要更好的方式。
......@@ -534,10 +534,9 @@ F(x)=\int_{-\infty}^x f(x)dx
\end{itemize}
\vspace{0.5em}
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此也是自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在第五章和第六章进行详细介绍。
\parinterval $n$-gram语言模型的使用非常简单。可以像\ref{sec2:statistical-seg}节中一样,直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个分词序列的概率:
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此也是自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在{\chapternine}{\chapterten}进行详细介绍。
\parinterval $n$-gram语言模型的使用非常简单。可以直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个分词序列的概率:
\begin{eqnarray}
& &\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 \\
......@@ -763,7 +762,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\sectionnewpage
\section{搜索}
\parinterval 语言模型的应用非常广泛,比如,可以用语言模型来判断一个句子是否通顺;也可以用语言模型在缺失单词的位置选择出最适合的单词,甚至语言模型可以帮助我们完成更加复杂的任务。比如写作文时,并没有指定某个单词序列作为输入,而是要求直接生成一个合理的单词序列,如一个完整的句子甚至一篇完整的文章。这时,语言模型是否能够根据自己的判断来生成一段流畅合理的单词序列呢。
\parinterval 语言模型的应用非常广泛,比如,可以用语言模型来判断一个句子是否通顺;也可以用语言模型在缺失单词的位置选择出最适合的单词;甚至语言模型可以帮助我们完成更加复杂的任务。比如写作文时,并没有指定某个单词序列作为输入,而是要求直接生成一个合理的单词序列,如一个完整的句子甚至一篇完整的文章。这时,语言模型是否能够根据自己的判断来生成一段流畅合理的单词序列呢?
\parinterval 这类问题也对应着一大类自然语言处理问题\ \dash\ {\small\bfnew{序列生成}}\index{序列生成}(Sequence Generation)\index{Sequence Generation}。机器翻译就是一个非常典型的序列生成问题:在机器翻译任务中,需要根据源语言序列直接生成与之相对应的目标语言序列。但是语言模型本身并不能``制造''单词序列的,它的基础功能是评判给定的、已经生成的单词序列是否流畅合理。因此严格地说,序列生成问题的本质并非是语言模型凭空``生成''序列,而是使用语言模型在所有候选的单词序列中找出其中的``最佳''序列。实际上,在序列生成任务中寻找最佳单词序列的本质是经典的{\small\bfnew{搜索问题}}\index{搜索问题}(Search Problem)\index{Search Problem}。也就是,在所有可能的序列中,根据语言模型的打分找出最佳的序列作为生成的结果。下面将着重介绍序列生成背后的搜索问题建模方法,以及在序列生成里常用的搜索技术。相关的搜索算法也会在后续统计机器翻译({{\red XXX}})和神经机器翻译({\red XXX}章)中被深入使用。
......@@ -783,7 +782,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\parinterval 在序列生成问题中,最简单的策略就是对词表中的词汇进行任意组合,通过这种枚举的方式得到全部可能的序列。但是,很多时候并没有预先指定序列的长度,比如,机器翻译中译文的长度是无法预先知道的。那么怎样判断一个序列何时完成了生成过程呢?回顾人类书写文字的过程可以发现,句子的生成首先从一片空白开始,然后从左到右逐词生成,除了第一个单词,所有单词的生成都依赖于前面已经生成的单词。为了方便计算机实现,通常定义单词序列从一个特殊的单词<sos>后开始生成。同样地,一个单词序列的结束也用一个特殊的单词<eos>来表示。
\parinterval 对于序列$<$sos$>$\ \ I\ \ agree\ \ $<$eos$>$
%----------------------------------------------
\begin{figure}[htp]
......@@ -794,7 +793,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:2-13}展示语言模型视角该序列的生成过程。该过程通过在序列的末尾不断附加词表中的单词来逐渐扩展序列,直到这段序列结束。这种生成单词序列的过程被称作{\small\bfnew{自左向右生成}}\index{自左向右生成}(Left-to-right Generation)\index{Left-to-right Generation}
\parinterval 对于一个序列$<$sos$>$\ \ I\ \ agree\ \ $<$eos$>$\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}
......@@ -824,8 +823,6 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\parinterval 当任务对单词序列长度没有限制时,上述两种方法枚举出的单词序列也是无穷无尽的。因此这两种枚举策略并不具备完备性而且会导致枚举过程无法停止。由于日常生活中通常不会见到特别长的句子,因此可以通过限制单词序列的最大长度来避免这个问题。一旦单词序列的最大长度被确定,以上两种枚举策略就可以在一定时间内枚举出所有可能的单词序列,因而一定可以找到最优的单词序列,即具备最优性。
\parinterval 此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表\ref{tab:2-3}所示。其中$|V|$为词表大小,$m$为序列长度,$\ast$表示``当且仅当在所有可能的单词序列数目有限下成立''。值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为$|V|+1$
%------------------------------------------------------
\begin{table}[htp]{
\begin{center}
......@@ -842,6 +839,8 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
}\end{table}
%------------------------------------------------------
\parinterval 此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表\ref{tab:2-3}所示。其中$|V|$为词表大小,$m$为序列长度,$\ast$表示``当且仅当在所有可能的单词序列数目有限下成立''。值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为$|V|+1$
%----------------------------------------------
\begin{figure}[htp]
\centering
......@@ -851,7 +850,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\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})$
\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]
......@@ -862,7 +861,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\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>''的得分为:
\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})$,如图\ref{fig:2-15}所示,可知红线所示单词序列``<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 \\
......@@ -911,7 +910,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\parinterval 上面描述的两个改进后的搜索方法属于无信息搜索策略\cite{sahni1978fundamentals},因为他们依赖的信息仍然来源于问题本身而不是问题以外。改进后的方法虽然有机会更快寻找到分数最高的单词序列,也就是最优解。但是由于没有一个通用的办法来判断当前找到的解是否为最优解,这种策略不会在找到最优解后自动停止,因此最终仍然需要枚举所有可能的单词序列,寻找最优解需要的时间复杂度没有产生任何改变。尽管如此,如果只是需要一个相对好的解而不是最优解,改进后的搜索策略仍然是比原始枚举策略更优秀的算法。
\parinterval 此外,由于搜索过程中将语言模型的打分作为搜索树的边权重,另一种改进思路是:能否借助语言模型的特殊性质来对搜索树进行{\small\bfnew{剪枝}}\index{剪枝}(Pruning)\index{Pruning},从而避免在搜索空间中访问一些不可能产生比当前解更好的结果的区域,提高搜索策略在实际运用当中的效率。简单来说,剪枝是一种可以缩小搜索空间的手段,比如,在搜索的过程中,动态的``丢弃''一些搜索路径,从而减少搜索的总代价。剪枝的程度在一定范围内影响了搜索系统的效率,剪枝越多搜索效率越高,一般找到最优解的可能性也越低;反之,搜索效率越低,但是找到最优解的可能性越大。在{\red6.3.6}中介绍的贪婪搜索和束搜索都可以被看作是剪枝方法的一种特例。
\parinterval 此外,由于搜索过程中将语言模型的打分作为搜索树的边权重,另一种改进思路是:能否借助语言模型的特殊性质来对搜索树进行{\small\bfnew{剪枝}}\index{剪枝}(Pruning)\index{Pruning},从而避免在搜索空间中访问一些不可能产生比当前解更好的结果的区域,提高搜索策略在实际运用当中的效率。简单来说,剪枝是一种可以缩小搜索空间的手段,比如,在搜索的过程中,动态的``丢弃''一些搜索路径,从而减少搜索的总代价。剪枝的程度在一定范围内影响了搜索系统的效率,剪枝越多搜索效率越高,一般找到最优解的可能性也越低;反之,搜索效率越低,但是找到最优解的可能性越大。在{\chapterten}中介绍的贪婪搜索和束搜索都可以被看作是剪枝方法的一种特例。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -923,7 +922,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\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}
\parinterval 通常可以把启发式函数看成是计算当前状态跟最优解的距离的一种方法,并把关于最优解的一些性质的猜测放到启发式函数里。比如,在序列生成中,一般认为最优序列应该在某个特定的长度附近,那么就可以把启发式函数定义成该长度与当前单词序列长度的差值。这样,在搜索过程中,启发式函数会引导搜索倾向于先生成当前得分高且序列长度接近预设长度的单词序列。此外除了手工设计启发式函数,还可以借助强化学习的手段,学习关于未来得分的估计\cite{DBLP:conf/nips/HeLXQ0L17}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -973,7 +972,7 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\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}中还将介绍这些算法的具体应用。
\parinterval 总的来说,虽然局部搜索由于没有遍历完整的解空间,使得这类方法无法保证找到最优解。但是,局部搜索算法大大降低了搜索过程的时间、空间复杂度。因此在语言模型生成和机器翻译的解码过程中常常使用局部搜索算法。在{\chapterseven}{\chapterten}{\chaptereleven}中还将介绍这些算法的具体应用。
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -989,9 +988,9 @@ w^{'} = \argmax_{w \in \chi}\textrm{P}(w)
\begin{adjustwidth}{1em}{}
\begin{itemize}
\vspace{0.5em}
\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}。 在本书的第四章也会使用到判别式模型。
\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}
\item 从现在自然语言处理的前沿看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法,而且在近些年取得了巨大成功\cite{DBLP:conf/nips/BengioDV00}。关于神经语言模型的内容,会在{\cnine}章进行进一步介绍。这里更多的关注了语言模型的基本问题和求解思路,因为对问题的建模是自然语言处理的基础,对问题的本质刻画并不会因为方法的改变而改变。在后续章节还将看到,这里所使用的生成序列的建模方法会作为机器翻译最基本的范式。
\item 从现在自然语言处理的前沿看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法,而且在近些年取得了巨大成功\cite{DBLP:conf/nips/BengioDV00}。关于神经语言模型的内容,会在{\chapternine}进行进一步介绍。这里更多地关注了语言模型的基本问题和求解思路,因为对问题的建模是自然语言处理的基础,对问题的本质刻画并不会因为方法的改变而改变。在后续章节还将看到,这里所使用的生成序列的建模方法会作为机器翻译最基本的范式。
\vspace{0.5em}
\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}
......
......@@ -819,6 +819,21 @@
pages={78-85},
year={1995},
}
@article{DBLP:journals/bstj/Shannon48a,
author = {Claude E. Shannon},
title = {A mathematical theory of communication},
journal = {Bell Syst. Tech. J.},
volume = {27},
number = {4},
pages = {623--656},
year = {1948},
url = {https://doi.org/10.1002/j.1538-7305.1948.tb00917.x},
doi = {10.1002/j.1538-7305.1948.tb00917.x},
timestamp = {Sat, 30 May 2020 20:01:09 +0200},
biburl = {https://dblp.org/rec/journals/bstj/Shannon48a.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
%%%%% chapter 1------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......
......@@ -674,7 +674,3 @@ addtohook={%
\newcommand\chaptersixteen{第十六章}
\newcommand\chapterseventeen{第十七章}
\newcommand\chaptereighteen{第十八章}%*
\newcommand{\chapterseven}{}
\newcommand{\chapterten}{}
\newcommand{\chaptereleven}{十一}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论