Commit 1b4bfe82 by 曹润柘

合并分支 'caorunzhe' 到 'master'

Caorunzhe

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