Commit a2e4bb4f by 单韦乔

第一章、第二章更新,修改积分号为正体

parent 9a105140
......@@ -9,14 +9,14 @@
\begin{scope}
{
{\footnotesize
\node [anchor=north west] (rule1) at (0,0) {\textbf{1: If} 源=“我”, \textbf{then} 译=“I”};
\node [anchor=north west] (rule2) at ([yshift=0.1em]rule1.south west) {\textbf{2: If} 源=“你”, \textbf{then} 译=“you”};
\node [anchor=north west] (rule3) at ([yshift=0.1em]rule2.south west) {\textbf{3: If} 源=“感到\ 满意”,};
\node [anchor=north west] (rule3part2) at ([yshift=0.5em]rule3.south west) {\textbf{\hspace{0.95em} then} 译=“be satisfied with”};
\node [anchor=north west] (rule4) at ([yshift=0.1em]rule3part2.south west) {\textbf{4: If} 源=“对 ... 动词[表态度]”};
\node [anchor=north west] (rule1) at (0,0) {\textbf{1: If} 源=我, \textbf{then} 译=\ I};
\node [anchor=north west] (rule2) at ([yshift=0.1em]rule1.south west) {\textbf{2: If} 源=你, \textbf{then} 译=\ you};
\node [anchor=north west] (rule3) at ([yshift=0.1em]rule2.south west) {\textbf{3: If} 源=感到\ 满意,};
\node [anchor=north west] (rule3part2) at ([yshift=0.5em]rule3.south west) {\textbf{\hspace{0.95em} then} 译=\ be satisfied with};
\node [anchor=north west] (rule4) at ([yshift=0.1em]rule3part2.south west) {\textbf{4: If} 源=对 ... 动词[表态度]};
\node [anchor=north west] (rule4part2) at ([yshift=0.5em]rule4.south west) {\textbf{\hspace{0.95em} then} 调序[动词 + 对象]};
\node [anchor=north west] (rule5) at ([yshift=0.1em]rule4part2.south west) {\textbf{5: If} 译文主语是“I”};
\node [anchor=north west] (rule5part2) at ([yshift=0.5em]rule5.south west) {\textbf{\hspace{0.95em} then} be动词为“am/was”};
\node [anchor=north west] (rule5) at ([yshift=0.1em]rule4part2.south west) {\textbf{5: If} 译文主语是\ I};
\node [anchor=north west] (rule5part2) at ([yshift=0.5em]rule5.south west) {\textbf{\hspace{0.95em} then} be动词为\ am/was};
\node [anchor=north west] (rule6) at ([yshift=0.1em]rule5part2.south west) {\textbf{6: If} 源语是主谓结构};
\node [anchor=north west] (rule6part2) at ([yshift=0.5em]rule6.south west) {\textbf{\hspace{0.95em} then} 译文为主谓结构};
\node [anchor=south west] (rulebaselabel) at (rule1.north west) {{\color{ublue} 资源:规则库}};
......
......@@ -9,12 +9,12 @@
{
\begin{scope}
{\scriptsize
\node [anchor=north west] (example1) at (0,0) {\textbf{1:} 源=“他\ \ \ ?”};
\node [anchor=north west] (example1part2) at ([yshift=0.2em]example1.south west) {\hspace{1em} 译=“Where is he ?”};
\node [anchor=north west] (example2) at ([yshift=0.1em]example1part2.south west) {\textbf{2:} 源=“我\ 真高兴”};
\node [anchor=north west] (example2part2) at ([yshift=0.2em]example2.south west) {\hspace{1em} 译=“I'm so happy”};
\node [anchor=north west] (example3) at ([yshift=0.1em]example2part2.south west) {\textbf{3:} 源=“出发\ !”};
\node [anchor=north west] (example3part2) at ([yshift=0.2em]example3.south west) {\hspace{1em} 译=“Let's go!”};
\node [anchor=north west] (example1) at (0,0) {\textbf{1:} 源=\ \ \ ?};
\node [anchor=north west] (example1part2) at ([yshift=0.2em]example1.south west) {\hspace{1em} 译=\ Where is he ?};
\node [anchor=north west] (example2) at ([yshift=0.1em]example1part2.south west) {\textbf{2:} 源=\ 真高兴};
\node [anchor=north west] (example2part2) at ([yshift=0.2em]example2.south west) {\hspace{1em} 译=\ I'm so happy};
\node [anchor=north west] (example3) at ([yshift=0.1em]example2part2.south west) {\textbf{3:} 源=出发\ };
\node [anchor=north west] (example3part2) at ([yshift=0.2em]example3.south west) {\hspace{1em} 译=\ Let's go!};
\node [anchor=north west] (example4) at ([yshift=0.1em]example3part2.south west) {\hspace{1em} ...};
\node [anchor=north west] (example5) at ([yshift=0.1em]example4.south west) {\hspace{1em}\quad};
\node [anchor=north west] (example6) at ([yshift=0.1em]example5.south west) {\hspace{1em}\quad};
......
......@@ -10,10 +10,10 @@
\begin{scope}
{
{\footnotesize
\node [anchor=north west] (example1) at (0,0) {\textbf{1:} 源=“什么\ 时候\ 开始\ ?”};
\node [anchor=north west] (example1part2) at ([yshift=0.5em]example1.south west) {\hspace{1em} 译=“When will it start ?”};
\node [anchor=north west] (example2) at ([yshift=0.1em]example1part2.south west) {\textbf{2:} 源=“我\ \ \ 感到\ 高兴”};
\node [anchor=north west] (example2part2) at ([yshift=0.5em]example2.south west) {\hspace{1em} 译=“I am happy with him”};
\node [anchor=north west] (example1) at (0,0) {\textbf{1:} 源=什么\ 时候\ 开始\ ?};
\node [anchor=north west] (example1part2) at ([yshift=0.5em]example1.south west) {\hspace{1em} 译=\ When will it start ?};
\node [anchor=north west] (example2) at ([yshift=0.1em]example1part2.south west) {\textbf{2:} 源=\ \ \ 感到\ 高兴};
\node [anchor=north west] (example2part2) at ([yshift=0.5em]example2.south west) {\hspace{1em} 译=\ I am happy with him};
\node [anchor=north west] (example3) at ([yshift=0.1em]example2part2.south west) {\hspace{1em} ...};
\node [anchor=south west] (examplebaselabel) at (example1.north west) {{\color{ublue} 资源1:翻译实例库}};
}
......@@ -36,7 +36,7 @@
\node [anchor=north west] (entry4) at ([yshift=0.1em]entry3.south west) {\hspace{1em} ...};
\node [anchor=south west] (dictionarylabel) at (entry1.north west) {{\color{ublue} 资源2:翻译词典}};
\node [anchor=west,opacity=0.0] (empty) at ([yshift=-0.2em]entry3.west) {\hspace{1em} 译=“I am happy with him”};
\node [anchor=west,opacity=0.0] (empty) at ([yshift=-0.2em]entry3.west) {\hspace{1em} 译=\ I am happy with him};
}
}
......
......@@ -171,9 +171,9 @@
\subsection{机器翻译的爆发}
\parinterval 2005年拉开了统计机器翻译发展十年黄金时期的序幕。在这一时期,各种基于统计机器翻译模型层出不穷,经典的基于短语的模型和基于句法的模型也先后被提出。在2013年以后,机器学习的进步带来了机器翻译技术的进一步提升。特别是基于神经网络的深度学习方法在机器视觉、语音识别中被成功应用,带来性能的飞跃式提升。很快,{\red 依据深度学习开发的}相关模型和方法也被用于机器翻译。
\parinterval 2005年拉开了统计机器翻译发展十年黄金时期的序幕。在这一时期,各种基于统计机器翻译模型层出不穷,经典的基于短语的模型和基于句法的模型也先后被提出。在2013年以后,机器学习的进步带来了机器翻译技术的进一步提升。特别是基于神经网络的深度学习方法在机器视觉、语音识别中被成功应用,带来性能的飞跃式提升。很快,依据深度学习开发的相关模型和方法也被用于机器翻译。
\parinterval {\red 实际上,对于机器翻译任务来说,深度学习方法被广泛使用也是一种必然},原因如下:
\parinterval 实际上,对于机器翻译任务来说,深度学习方法被广泛使用也是一种必然,原因如下:
\begin{itemize}
\vspace{0.5em}
......@@ -185,7 +185,7 @@
\vspace{0.5em}
\end{itemize}
\parinterval {\red 今天,神经机器翻译已经成为新的范式,与统计机器翻译一同推动了机器翻译技术与应用产品的发展}。比如,从世界上著名的机器翻译比赛WMT和CCMT中就可以看出这个趋势。如图\ref{fig:1-6}所示,其中左图是WMT\ 19全球机器翻译比赛的参赛队伍的截图,这些参赛队伍基本上都在使用深度学习完成机器翻译的建模。而在WMT\ 19各个项目夺冠系统中(\ref{fig:1-6}右图),神经机器翻译也几乎一统天下。
\parinterval 今天,神经机器翻译已经成为新的范式,与统计机器翻译一同推动了机器翻译技术与应用产品的发展。比如,从世界上著名的机器翻译比赛WMT和CCMT中就可以看出这个趋势。如图\ref{fig:1-6}所示,其中左图是WMT\ 19全球机器翻译比赛的参赛队伍的截图,这些参赛队伍基本上都在使用深度学习完成机器翻译的建模。而在WMT\ 19各个项目夺冠系统中(\ref{fig:1-6}右图),神经机器翻译也几乎一统天下。
%----------------------------------------------
\begin{figure}[htp]
......@@ -430,15 +430,15 @@
%-------------------------------------------
\parinterval 相比统计机器翻译,神经机器翻译的优势体现在其不需要特征工程,所有信息由神经网络自动从原始输入中提取。而且,相比离散化的表示,词和句子的分布式连续空间表示可以为建模提供更为丰富的信息,同时可以使用相对成熟的基于梯度的方法优化模型。此外,神经网络的存储需求较小,天然适合小设备上的应用。但是,神经机器翻译也存在问题。
\begin{enumerate}
\begin{itemize}
\vspace{0.5em}
\item 虽然脱离了特征工程,但神经网络的结构需要人工设计,即使设计好结构,系统的调优、超参数的设置等仍然依赖大量的实验。
\item 首先,虽然脱离了特征工程,但神经网络的结构需要人工设计,即使设计好结构,系统的调优、超参数的设置等仍然依赖大量的实验。
\vspace{0.5em}
\item 神经机器翻译现在缺乏可解释性,其过程和人的认知差异很大,通过人的先验知识干预的程度差。
\item 其次,神经机器翻译现在缺乏可解释性,其过程和人的认知差异很大,通过人的先验知识干预的程度差。
\vspace{0.5em}
\item 神经机器翻译对数据的依赖很大,数据规模、质量对性能都有很大影响,特别是在数据稀缺的情况下,充分训练神经网络很有挑战性。
\item 再次,神经机器翻译对数据的依赖很大,数据规模、质量对性能都有很大影响,特别是在数据稀缺的情况下,充分训练神经网络很有挑战性。
\vspace{0.5em}
\end{enumerate}
\end{itemize}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -501,9 +501,9 @@
\parinterval 《统计自然语言处理(第2版)》\upcite{宗成庆2013统计自然语言处理}由中国科学院自动化所宗成庆教授所著。该书中系统介绍了统计自然语言处理的基本概念、理论方法和最新研究进展,既有对基础知识和理论模型的介绍,也有对相关问题的研究背景、实现方法和技术现状的详细阐述。可供从事自然语言处理、机器翻译等研究的相关人员参考。
\parinterval Ian Goodfellow、Yoshua Bengio、Aaron Courville三位机器学习领域的学者所写的《Deep Learning》\upcite{Goodfellow-et-al-2016}也是值得一读的参考书。其讲解了有关深度学习常用的方法,其中很多都会在深度学习模型设计和使用中用到。同时在该书的应用一章中也简单讲解了神经机器翻译的任务定义和发展过程。
\parinterval Ian Goodfellow、Yoshua Bengio、Aaron Courville三位机器学习领域的学者所写的\emph{Deep Learning}\upcite{Goodfellow-et-al-2016}也是值得一读的参考书。其讲解了有关深度学习常用的方法,其中很多都会在深度学习模型设计和使用中用到。同时在该书的应用一章中也简单讲解了神经机器翻译的任务定义和发展过程。
\parinterval $Neural\ Network\ Methods\ for\ Natural\ Language\ Processing$\upcite{goldberg2017neural}是Yoav Goldberg编写的面向自然语言处理的深度学习参考书。相比《Deep Learning》,该书聚焦在自然语言处理中的深度学习方法,内容更加易读,非常适合刚入门自然语言处理及深度学习应用的人员参考。
\parinterval $Neural\ Network\ Methods\ for\ Natural\ Language\ Processing$\upcite{goldberg2017neural}是Yoav Goldberg编写的面向自然语言处理的深度学习参考书。相比\emph{Deep Learning},该书聚焦在自然语言处理中的深度学习方法,内容更加易读,非常适合刚入门自然语言处理及深度学习应用的人员参考。
\parinterval 《机器学习》\upcite{周志华2016机器学习}由南京大学周志华教授所著,作为机器学习领域入门教材,该书尽可能地涵盖了机器学习基础知识的各个方面,试图尽可能少地使用数学知识介绍机器学习方法与思想。
......@@ -516,31 +516,31 @@
%----------------------------------------------------------------------------------------
\subsection{专业组织和会议}
许多自然语言处理的相关学术组织会定期举办学术会议。与机器翻译相关的会议有:{\red 改一下顺序}
\parinterval 许多自然语言处理的相关学术组织会定期举办学术会议。与机器翻译相关的会议有:
\begin{itemize}
\vspace{0.5em}
\item AACL,全称Conference of the Asia-Pacific Chapter of the Association for Computational Linguistics,为ACL亚太地区分会。2020年会议首次召开,是亚洲地区自然语言处理领域最具影响力的会议之一。
\vspace{0.5em}
\item ACL,全称Annual Conference of the Association for Computational Linguistics,是自然语言处理领域最高级别的会议。每年举办一次,主题涵盖计算语言学的所有方向。
\vspace{0.5em}
\item NAACL,全称Annual Conference of the North American Chapter of the Association for Computational Linguistics,为ACL北美分会,在自然语言处理领域也属于顶级会议,每年会选择一个北美城市召开会议
\item AMTA,全称Conference of the Association for Machine Translation in the Americas。AMTA会议汇聚了学术界、产业界和政府的研究人员、开发人员和用户,让工业界和学术界进行交流
\vspace{0.5em}
\item EMNLP,全称Conference on Empirical Methods in Natural Language Processing ,自然语言处理另一个顶级会议之一,由ACL当中对语言数据和经验方法有特殊兴趣的团体主办,始于1996年。会议比较偏重于方法和经验性结果。
\item CCL,全称China National Conference on Computational Linguistics,中文为中国计算语言学大会。中国计算语言学大会创办于1991年,由中国中文信息学会计算语言学专业委员会负责组织。经过20余年的发展,中国计算语言学大会已成为国内自然语言处理领域权威性最高、规模和影响最大的学术会议。作为中国中文信息学会(国内一级学会)的旗舰会议,CCL聚焦于中国境内各类语言的智能计算和信息处理,为研讨和传播计算语言学最新学术和技术成果提供了最广泛的高层次交流平台。
\vspace{0.5em}
\item CCMT,全称China Conference on Machine Translation,中国机器翻译研讨会,由中国中文信息学会主办,旨在为国内外机器翻译界同行提供一个平台,促进中国机器翻译事业。CCMT不仅是国内机器翻译领域最具影响力、最权威的学术和评测活动,而且也代表着汉语与民族语言翻译技术的最高水准,对民族语言技术发展具有重要意义。
\vspace{0.5em}
\item COLING,全称International Conference on Computational Linguistics,自然语言处理老牌顶级会议之一。该会议始于1965年,是由ICCL国际计算语言学委员会主办。会议简称为COLING,是谐音瑞典著名作家 Albert Engstr$\ddot{\textrm{o}}$m小说中的虚构人物Kolingen。COLING每两年举办一次。
\vspace{0.5em}
\item EACL,全称Conference of the European Chapter of the Association for Computational Linguistics,为ACL欧洲分会,虽然在欧洲召开,会议也吸引了全世界的大量学者投稿并参会。
\vspace{0.5em}
\item AACL,全称Conference of the Asia-Pacific Chapter of the Association for Computational Linguistics,为ACL亚太地区分会。2020年会议首次召开,是亚洲地区自然语言处理领域最具影响力的会议之一。
\vspace{0.5em}
\item WMT,全称Conference on Machine Translation。机器翻译领域一年一度研讨会,是国际公认的顶级机器翻译赛事之一。
\vspace{0.5em}
\item AMTA,全称Conference of the Association for Machine Translation in the Americas。AMTA会议汇聚了学术界、产业界和政府的研究人员、开发人员和用户,让工业界和学术界进行交流。
\item EMNLP,全称Conference on Empirical Methods in Natural Language Processing ,自然语言处理另一个顶级会议之一,由ACL当中对语言数据和经验方法有特殊兴趣的团体主办,始于1996年。会议比较偏重于方法和经验性结果。
\vspace{0.5em}
\item CCL,全称China National Conference on Computational Linguistics,中文为中国计算语言学大会。中国计算语言学大会创办于1991年,由中国中文信息学会计算语言学专业委员会负责组织。经过20余年的发展,中国计算语言学大会已成为国内自然语言处理领域权威性最高、规模和影响最大的学术会议。作为中国中文信息学会(国内一级学会)的旗舰会议,CCL聚焦于中国境内各类语言的智能计算和信息处理,为研讨和传播计算语言学最新学术和技术成果提供了最广泛的高层次交流平台
\item NAACL,全称Annual Conference of the North American Chapter of the Association for Computational Linguistics,为ACL北美分会,在自然语言处理领域也属于顶级会议,每年会选择一个北美城市召开会议
\vspace{0.5em}
\item NLPCC,全称CCF International Conference on Natural Language Processing and Chinese Computing。NLPCC 是由中国计算机学会(CCF)主办的 CCF 中文信息技术专业委员会年度学术会议,专注于自然语言处理及中文处理领域的研究和应用创新。会议自 2012 年开始举办,主要活动有主题演讲、论文报告、技术测评等多种形式。
\vspace{0.5em}
\item CCMT,全称China Conference on Machine Translation,中国机器翻译研讨会,由中国中文信息学会主办,旨在为国内外机器翻译界同行提供一个平台,促进中国机器翻译事业。CCMT不仅是国内机器翻译领域最具影响力、最权威的学术和评测活动,而且也代表着汉语与民族语言翻译技术的最高水准,对民族语言技术发展具有重要意义
\item WMT,全称Conference on Machine Translation。机器翻译领域一年一度研讨会,是国际公认的顶级机器翻译赛事之一
\vspace{0.5em}
\end{itemize}
......
......@@ -60,10 +60,11 @@
\draw[->,ublue,very thick] (pt34.south) -- (n43.west);
\draw[->,ublue,very thick] (pt35.south) -- (n44.west);
\begin{pgfonlayer}{background}
{
\draw[->,red,ultra thick,opacity=0.7,line width=4pt]([xshift=-1em]n11.west) -- (n11.east) -- (n22.west) -- (pt22.south) -- (n36.west) -- ([xshift=1em]pt36.south);
}
\end{pgfonlayer}
% \draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em]n11.west) -- (n11.east) -- (n22.west) -- (pt22.south) -- (n36.west) -- ([xshift=1em]pt36.south);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em]n11.west) -- (n11.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](n11.east) -- (n22.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt22.south) -- (n36.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt36.south) -- ([xshift=1em]pt36.south);
\end{tikzpicture}
\ No newline at end of file
......@@ -36,10 +36,10 @@
\draw[->,ublue,very thick] (pt22.south) -- (n35.west);
\draw[->,ublue,very thick] (pt22.south) -- (n36.west);
\begin{pgfonlayer}{background}
{
\draw[->,red,ultra thick,opacity=0.7,line width=4pt]([xshift=-1em]n11.west) -- (n11.east) -- (n22.west) -- (pt22.south) -- (n36.west) -- ([xshift=1em]pt36.south);
}
\end{pgfonlayer}
% \draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em]n11.west) -- (n11.east) -- (n22.west) -- (pt22.south) -- (n36.west) -- ([xshift=1em]pt36.south);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em]n11.west) -- (n11.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](n11.east) -- (n22.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt22.south) -- (n36.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt36.south) -- ([xshift=1em]pt36.south);
\end{tikzpicture}
\ No newline at end of file
......@@ -11,16 +11,16 @@
\begin{tikzpicture}
\node [anchor=west] (label1) at (0,0) {总词数:$6 + 8 + 5 = 20$};
\node [anchor=north west] (p1) at (label1.south west) {$P(\textrm{``很''})=1/20=0.05$};
\node [anchor=north west] (p2) at (p1.south west) {$P(\textrm{``。''})=3/20=0.15$};
\node [anchor=north west] (p3) at (p2.south west) {$P(\textrm{``确实''})=1/20=0.05$};
\node [anchor=north west] (p1) at (label1.south west) {$P(\textrm{})=1/20=0.05$};
\node [anchor=north west] (p2) at (p1.south west) {$P(\textrm{})=3/20=0.15$};
\node [anchor=north west] (p3) at (p2.south west) {$P(\textrm{确实})=1/20=0.05$};
\node [anchor=north west] (label11) at ([xshift=18.0em,yshift=1.63em]label1.south west) {更多数据-总词数:100K $\sim$ 1M};
\node [anchor=north west] (p12) at (label11.south west) {$P(\textrm{``很''})=0.000010$};
\node [anchor=north west] (p22) at (p12.south west) {$P(\textrm{``。''})=0.001812$};
\node [anchor=north west] (p32) at (p22.south west) {$P(\textrm{``确实''})=0.000001$};
\node [anchor=north west] (p12) at (label11.south west) {$P(\textrm{})=0.000010$};
\node [anchor=north west] (p22) at (p12.south west) {$P(\textrm{})=0.001812$};
\node [anchor=north west] (p32) at (p22.south west) {$P(\textrm{确实})=0.000001$};
......
......@@ -60,10 +60,12 @@
\draw[->,ublue,very thick] (pt34.south) -- (n43.west);
\draw[->,ublue,very thick] (pt35.south) -- (n44.west);
\begin{pgfonlayer}{background}
{
\draw[->,red,ultra thick,opacity=0.7,line width=4pt]([xshift=-1em]n11.west) -- (n11.east) -- (n21.west) -- (n21.east) -- ([xshift=1em]pt42.south);
}
\end{pgfonlayer}
% \draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em]n11.west) -- (n11.west) -- ([xshift=0.5em,yshift=-0.5em]n11.west) -- ([xshift=-0.5em,yshift=-0.5em]n11.east) -- (n11.east) -- (n21.west) -- ([xshift=0.5em,yshift=-0.5em]n21.west) -- ([xshift=-0.5em,yshift=-0.5em]n21.east) -- (n21.east) -- (n32.west) -- ([xshift=0.5em,yshift=-0.5em]n32.west) -- ([xshift=0.5em,yshift=-0.5em]n32.east) -- (n32.east) -- (n42.west) -- ([xshift=0.5em,yshift=-0.5em]n42.west) -- ([xshift=-0.5em,yshift=-0.5em]n42.east) -- (n42.east) -- ([xshift=1em]pt42.south);
% \draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em,yshift=-0.5em]n11.west) -- ([yshift=-0.5em]n11.east) -- (n11.east) -- ([xshift=-0.3em,yshift=-0.5em]n21.west) -- ([xshift=0.5em,yshift=-0.5em]n21.west) -- ([xshift=-0.5em,yshift=-0.5em]n21.east) -- (n21.east) -- (n32.west) -- ([xshift=0.5em,yshift=-0.5em]n32.west) -- ([xshift=-0.5em,yshift=-0.5em]n32.east) -- (n32.east) -- (n42.west) -- ([xshift=0.5em,yshift=-0.5em]n42.west) -- ([xshift=-0.5em,yshift=-0.5em]n42.east) -- (n42.east) -- ([xshift=1em]pt42.south);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt]([xshift=-1em]n11.west) -- (n11.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](n11.east) -- (n21.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt21.south) -- (n32.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt32.south) -- (n42.west);
\draw[->,red,ultra thick,opacity=0.7,line width=2pt](pt42.south) -- ([xshift=1em]pt42.south);
\end{tikzpicture}
\ No newline at end of file
......@@ -13,7 +13,7 @@
\node [draw,thick,minimum size=10pt] at (\i,0) {1};
}
}
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{1}) = 5/30$};
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{1}) = 5/30$};
\end{scope}
\begin{scope}[yshift=-2.5em]
......@@ -22,7 +22,7 @@
\node [draw,thick,minimum size=10pt] at (\i,0) {{\color{red} 2}};
}
}
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{2}) = 4/30$};
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{2}) = 4/30$};
\end{scope}
\begin{scope}[yshift=-5.0em]
......@@ -31,7 +31,7 @@
\node [draw,thick,minimum size=10pt] at (\i,0) {{\color{ublue} 3}};
}
}
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{3}) = 6/30$};
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{3}) = 6/30$};
\end{scope}
\begin{scope}[yshift=-7.5em]
......@@ -40,7 +40,7 @@
\node [draw,thick,minimum size=10pt] at (\i,0) {{\color{ugreen} 4}};
}
}
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{4}) = 12/30$};
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{4}) = 12/30$};
\end{scope}
\begin{scope}[yshift=-10.0em]
......@@ -49,7 +49,7 @@
\node [draw,thick,minimum size=10pt] at (\i,0) {{\color{purple} 5}};
}
}
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{5}) = 2/30$};
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{5}) = 2/30$};
\end{scope}
\begin{scope}[yshift=-12.5em]
......@@ -58,7 +58,7 @@
\node [draw,thick,minimum size=10pt] at (\i,0) {{\color{orange} 6}};
}
}
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{6}) = 1/30$};
\node [anchor=west] at (33em,0) {$\textrm{P}(\text{6}) = 1/30$};
\end{scope}
\end{tikzpicture}
......
......@@ -47,7 +47,7 @@
\parinterval 连续变量是在其取值区间内连续取值,无法被一一列举,具有无限个取值的变量。例如,图书馆的开馆时间是8:30-22:00,用$X$代表某人进入图书馆的时间,时间的取值范围是[8:30,22:00]这个时间区间,$X$就是一个连续变量。
\parinterval {\small\bfnew{概率}}\index{概率}(Probability)\index{Probability}是度量随机事件呈现其每个可能状态的可能性的数值,本质上它是一个测度函数\upcite{mao-prob-book-2011}\upcite{kolmogorov2018foundations}。概率的大小表征了随机事件在一次试验中发生的可能性大小。用$P(\cdot )$表示一个随机事件的可能性,即事件发生的概率。比如$P(\textrm{太阳从东方升起})$表示“太阳从东方升起的可能性”,同理,$P(A=B)$ 表示的就是``$A=B$'' 这件事的可能性。
\parinterval {\small\bfnew{概率}}\index{概率}(Probability)\index{Probability}是度量随机事件呈现其每个可能状态的可能性的数值,本质上它是一个测度函数\upcite{mao-prob-book-2011}\upcite{kolmogorov2018foundations}。概率的大小表征了随机事件在一次试验中发生的可能性大小。用$P(\cdot )$表示一个随机事件的可能性,即事件发生的概率。比如$P(\textrm{太阳从东方升起})$表示“太阳从东方升起的可能性”,同理,$P(A=B)$ 表示的就是$A=B$这件事的可能性。
\parinterval 在实际问题中,往往需要得到随机变量的概率值。但是,真实的概率值可能是无法准确知道的,这时就需要对概率进行{\small\sffamily\bfseries{估计}}\index{估计},得到的结果是概率的{\small\sffamily\bfseries{估计值}}\index{估计值}(Estimate)\index{Estimate}。在概率论中,一个很简单的方法是利用相对频度作为概率的估计值。如果$\{x_1,x_2,\dots,x_n \}$是一个试验的样本空间,在相同情况下重复试验$N$次,观察到样本$x_i (1\leq{i}\leq{n})$的次数为$n (x_i )$,那么$x_i$在这$N$次试验中的相对频率是$\frac{n(x_i )}{N}$。当$N$越来越大时,相对概率也就越来越接近真实概率$P(x_i)$,即$\lim_{N \to \infty}\frac{n(x_i )}{N}=P(x_i)$。 实际上,很多概率模型都等同于相对频度估计,比如,对于一个服从多项式分布的变量的极大似然估计就可以用相对频度估计实现。
......@@ -148,7 +148,7 @@ P(A,B,C) & = & P(A \mid B ,C)P(B,C) \nonumber \\
\parinterval 推广到$n$个事件,可以得到了链式法则的公式
\begin{eqnarray}
P(x_1,x_2,...,x_n)=P(x_1) \prod_{i=2}^n P(x_i \mid x_1,x_2,...,x_{i-1})
P(x_1,x_2, \ldots ,x_n)=P(x_1) \prod_{i=2}^n P(x_i \mid x_1,x_2, \ldots ,x_{i-1})
\label{eq:2-6}
\end{eqnarray}
......@@ -185,7 +185,7 @@ P(A,B,C,D,E)=P(E \mid C) \cdot P(D) \cdot P(C \mid B) \cdot P(B)\cdot P(A \mid B
\subsection{贝叶斯法则}\label{sec:2.2.3}
\parinterval 首先介绍一下全概率公式:{\small\bfnew{全概率公式}}\index{全概率公式}(Law Of Total Probability)\index{Law Of Total Probability}是概率论中重要的公式,它可以将一个复杂事件发生的概率分解成不同情况的小事件发生概率的和。这里先介绍一个概念——划分。集合$S$的一个划分事件为$\{B_1,...,B_n\}$是指它们满足$\bigcup_{i=1}^n B_i=S \textrm{}B_iB_j=\varnothing , i,j=1,...,n,i\neq j$。此时事件$A$的全概率公式可以被描述为:
\parinterval 首先介绍一下全概率公式:{\small\bfnew{全概率公式}}\index{全概率公式}(Law Of Total Probability)\index{Law Of Total Probability}是概率论中重要的公式,它可以将一个复杂事件发生的概率分解成不同情况的小事件发生概率的和。这里先介绍一个概念——划分。集合$S$的一个划分事件为$\{B_1, \ldots ,B_n\}$是指它们满足$\bigcup_{i=1}^n B_i=S \textrm{}B_iB_j=\varnothing , i,j=1, \ldots ,n,i\neq j$。此时事件$A$的全概率公式可以被描述为:
\begin{eqnarray}
P(A)=\sum_{k=1}^n P(A \mid B_k)P(B_k)
......@@ -214,7 +214,7 @@ P(A)=\sum_{k=1}^n P(A \mid B_k)P(B_k)
\label{eq:2-10}
\end{eqnarray}
\parinterval {\small\sffamily\bfseries{贝叶斯法则}}\index{贝叶斯法则}(Bayes' rule)\index{Bayes' rule}是概率论中的一个经典公式,通常用于已知$P(A \mid B)$$P(B \mid A)$。可以表述为:设$\{B_1,...,B_n\}$$S$的一个划分,$A$为事件,则对于$i=1,...,n$,有如下公式
\parinterval {\small\sffamily\bfseries{贝叶斯法则}}\index{贝叶斯法则}(Bayes' rule)\index{Bayes' rule}是概率论中的一个经典公式,通常用于已知$P(A \mid B)$$P(B \mid A)$。可以表述为:设$\{B_1, \ldots ,B_n\}$$S$的一个划分,$A$为事件,则对于$i=1, \ldots ,n$,有如下公式
\begin{eqnarray}
P(B_i \mid A) & = & \frac {P(A B_i)} { P(A) } \nonumber \\
& = & \frac {P(A \mid B_i)P(B_i) } { \sum_{k=1}^nP(A \mid B_k)P(B_k) }
......@@ -240,7 +240,7 @@ P(B \mid A) & = & \frac { P(A \mid B)P(B) } {P(A)} \nonumber \\
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{信息熵}
\subsubsection{1.信息熵}
\parinterval {\small\sffamily\bfseries{}}\index{}(Entropy)\index{Entropy}是热力学中的一个概念,同时也是对系统无序性的一种度量标准。在自然语言处理领域也会使用到信息熵这一概念,比如描述文字的信息量大小。一条信息的信息量可以被看作是这条信息的不确定性。如果需要确认一件非常不确定甚至于一无所知的事情,那么需要理解大量的相关信息才能进行确认;同样的,如果对某件事已经非常确定,那么就不需要太多的信息就可以把它搞清楚。如下就是两个例子,
......@@ -253,13 +253,13 @@ P(B \mid A) & = & \frac { P(A \mid B)P(B) } {P(A)} \nonumber \\
\label{eg:2-1}
\end{example}
\parinterval 在这两句话中,“太阳从东方升起”是一件确定性事件(在地球上),几乎不需要查阅更多信息就可以确认,因此这件事的信息熵相对较低;而“明天天气多云”这件事,需要关注天气预报,才能大概率确定这件事,它的不确定性很高,因而它的信息熵也就相对较高。因此,信息熵也是对事件不确定性的度量。进一步,定义{\small\bfnew{自信息}}\index{自信息}(Self-Information)\index{Self-Information}为一个事件$X=x$的自信息的表达式为:{\red 将原来的“$X=x$的自信息的表达式为:”改为“$X=x$的自信息的表达式为:”}
\parinterval 在这两句话中,“太阳从东方升起”是一件确定性事件(在地球上),几乎不需要查阅更多信息就可以确认,因此这件事的信息熵相对较低;而“明天天气多云”这件事,需要关注天气预报,才能大概率确定这件事,它的不确定性很高,因而它的信息熵也就相对较高。因此,信息熵也是对事件不确定性的度量。进一步,定义{\small\bfnew{自信息}}\index{自信息}(Self-Information)\index{Self-Information}为一个事件$X$的自信息的表达式为:
\begin{eqnarray}
I(x)=-\log P(x)
\label{eq:2-13}
\end{eqnarray}
\noindent 其中,$P(x)$表示$x$发生的概率。自信息用来衡量单一事件发生时所包含的信息多少,当底数为e时,单位为nats,其中1nats是通过观察概率为$\frac{1}{\textrm{e}}$的事件而获得的信息量;当底数为2时,单位为bits或shannons。$I(x)$$P(x)$的函数关系如图\ref{fig:2-4} 所示。
\noindent 其中,{\red $x$$X$的一个取值}$P(x)$表示$x$发生的概率。自信息用来衡量单一事件发生时所包含的信息多少,当底数为e时,单位为nats,其中1nats是通过观察概率为$\frac{1}{\textrm{e}}$的事件而获得的信息量;当底数为2时,单位为bits或shannons。$I(x)$$P(x)$的函数关系如图\ref{fig:2-4} 所示。
%----------------------------------------------
\begin{figure}[htp]
......@@ -283,7 +283,7 @@ H(x) & = & \sum_{x \in \textrm{X}}[ P(x) I(x)] \nonumber \\
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{KL距离}
\subsubsection{2.KL距离}
\parinterval 如果同一个随机变量$X$上有两个概率分布$P(x)$$Q(x)$,那么可以使用KL距离(“Kullback-Leibler”散度)来衡量这两个分布的不同,这种度量就是{\small\bfnew{相对熵}}\index{相对熵}(Relative Entropy)\index{Relative Entropy}。其公式如下:
\begin{eqnarray}
......@@ -306,7 +306,7 @@ D_{\textrm{KL}}(P\parallel Q) & = & \sum_{x \in \textrm{X}} [ P(x)\log \frac{P(x
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{交叉熵}
\subsubsection{3.交叉熵}
\parinterval {\small\bfnew{交叉熵}}\index{交叉熵}(Cross-Entropy)\index{Cross-Entropy}是一个与KL距离密切相关的概念,它的公式是:
\begin{eqnarray}
......@@ -338,29 +338,29 @@ H(P,Q)=-\sum_{x \in \textrm{X}} [P(x) \log Q(x) ]
\parinterval 此时玩家的胜利似乎只能来源于运气。不过,请注意,这里的假设“随便选一个数字”本身就是一个概率模型,它对骰子的六个面的出现做了均匀分布假设。
\begin{eqnarray}
P(\text{``1''})=P(\text{``2''})=...=P(\text{``5''})=P(\text{``6''})=1/6
P(\text{1})=P(\text{2})= \ldots =P(\text{5})=P(\text{6})=1/6
\label{eq:2-17}
\end{eqnarray}
\vspace{-0.5em}
\parinterval 但是这个游戏没有人规定骰子是均匀的(有些被坑了的感觉)。如果骰子的六个面不均匀呢?这里可以用一种更加“聪明”的方式定义一种新的模型,即定义骰子的每一个面都以一定的概率出现,而不是相同的概率。描述如下:
\begin{eqnarray}
P(\text{``1''}) &=&\theta_1 \nonumber \\
P(\text{``2''}) &=&\theta_2 \nonumber \\
P(\text{``3''}) &=&\theta_3 \nonumber \\
P(\text{``4''}) &=&\theta_4 \nonumber \\
P(\text{``5''}) &=&\theta_5 \nonumber \\
P(\text{``6''}) &=&1-\sum_{1 \leq i \leq 5}\theta_i \qquad \lhd \textrm {归一性}
P(\text{1}) &=&\theta_1 \nonumber \\
P(\text{2}) &=&\theta_2 \nonumber \\
P(\text{3}) &=&\theta_3 \nonumber \\
P(\text{4}) &=&\theta_4 \nonumber \\
P(\text{5}) &=&\theta_5 \nonumber \\
P(\text{6}) &=&1-\sum_{1 \leq i \leq 5}\theta_i \qquad \lhd \textrm {归一性}
\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}
P(\textrm{``}i\text{''})=\frac {X_i}{X}
P(i)=\frac {X_i}{X}
\label{eq:2-19}
\end{eqnarray}
\parinterval$X$足够大的时,$\frac{X_i}{X}$可以无限逼近$P(\textrm{``}i\textrm{''})$的真实值,因此可以通过大量的实验推算出掷骰子各个面的概率的准确估计值。回归到原始的问题,如果在正式开始游戏前,预先掷骰子30次,得到如图\ref{fig:2-6}的结果。
\parinterval$X$足够大的时,$\frac{X_i}{X}$可以无限逼近$P(i)$的真实值,因此可以通过大量的实验推算出掷骰子各个面的概率的准确估计值。回归到原始的问题,如果在正式开始游戏前,预先掷骰子30次,得到如图\ref{fig:2-6}的结果。
%----------------------------------------------
\begin{figure}[htp]
......@@ -371,7 +371,7 @@ P(\textrm{``}i\text{''})=\frac {X_i}{X}
\end{figure}
%-------------------------------------------
\parinterval 此时,可以注意到,这是一个有倾向性的模型(图 \ref{fig:2-7}):在这样的预先实验基础上,可以知道这个骰子是不均匀的,如果用这个骰子玩掷骰子游戏,选择数字``4''获胜的可能性是最大的。
\parinterval 此时,可以注意到,这是一个有倾向性的模型(图 \ref{fig:2-7}):在这样的预先实验基础上,可以知道这个骰子是不均匀的,如果用这个骰子玩掷骰子游戏,选择数字4获胜的可能性是最大的。
%----------------------------------------------
\begin{figure}[htp]
......@@ -382,7 +382,7 @@ P(\textrm{``}i\text{''})=\frac {X_i}{X}
\end{figure}
%-------------------------------------------
\parinterval {\small\sffamily\bfseries{世界是不公平的}}{\red 此处将上帝改成了世界},上面这个掷骰子游戏也是如此。在“公平”的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的“不公平”实际上这是客观事物中蕴含的一种{\small\sffamily\bfseries{偏置}}\index{偏置}(Bias)\index{Bias},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏置。比如,当翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval 世界上的事物并不是平等出现的,上面这个掷骰子游戏也是如此。在“公平”的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的“不公平”实际上这是客观事物中蕴含的一种{\small\sffamily\bfseries{偏置}}\index{偏置}(Bias)\index{Bias},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏置。比如,当翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval 在处理语言问题时,为了评价哪些词更容易在一个句子中出现,或者哪些句子在某些语境下更合理,常常也会使用统计方法对词或句子出现的可能性建模。与掷骰子游戏类似,词出现的概率可以这样理解:每个单词的出现就好比掷一个巨大的骰子,与前面的例子中有所不同的是:
......@@ -413,7 +413,7 @@ P(\textrm{``}i\text{''})=\frac {X_i}{X}
\parinterval 45\; = \;
\parinterval ...
\parinterval \ldots
\parinterval 就可以得到图\ref{fig:2-9}所示的结果。
......@@ -440,7 +440,7 @@ P(\textrm{``}i\text{''})=\frac {X_i}{X}
\parinterval 通过这个学习过程,就可以得到每个词出现的概率,成功使用统计方法对“单词的频率”这个问题进行建模。
\parinterval 那么又该如何计算一个句子的概率呢?在自然语言处理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若干单词的联合概率,即$P(w_1 w_2 w_3...w_m)$
\parinterval 那么又该如何计算一个句子的概率呢?在自然语言处理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若干单词的联合概率,即$P(w_1 w_2 w_3 \ldots w_m)$
\parinterval 其中,$w$表示句子中的一个单词。此时仍可以使用掷骰子的方式,将骰子的每个面看作一个句子,然后用统计词汇概率的方式统计句子的概率。但是这里有一个问题,一个句子在指定文本中出现的次数一定比词汇在文本出现的次数低得多,此时通过统计的方式求句子的频率会由于样本数太少,导致无法准确的求出句子的概率,因此对句子的统计建模仍需要更好的方式。
......@@ -451,7 +451,7 @@ P(\textrm{``}i\text{''})=\frac {X_i}{X}
\sectionnewpage
\section{$n$-gram语言模型}
\parinterval 在骰子游戏中,可以通过一种统计的方式,估计出在文本中词和句子出现的概率。但是在计算句子概率时往往会因为句子的样本过少而无法正确估计出句子出现的频率,为了能够准确地衡量句子出现的频率,本章引入了计算整个单词序列概率$P(w_1 w_2 w_3...w_m)$的方法---统计语言模型的概念。并且本章进一步介绍更加通用的$n$-gram语言模型,它在机器翻译及其他自然语言处理任务中有更加广泛的应用。
\parinterval 在骰子游戏中,可以通过一种统计的方式,估计出在文本中词和句子出现的概率。但是在计算句子概率时往往会因为句子的样本过少而无法正确估计出句子出现的频率,为了能够准确地衡量句子出现的频率,本章引入了计算整个单词序列概率$P(w_1 w_2 w_3 \ldots w_m)$的方法---统计语言模型的概念。并且本章进一步介绍更加通用的$n$-gram语言模型,它在机器翻译及其他自然语言处理任务中有更加广泛的应用。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -459,46 +459,46 @@ P(\textrm{``}i\text{''})=\frac {X_i}{X}
\subsection{建模}
\parinterval {\small\sffamily\bfseries{语言模型}}\index{语言模型}(Language Model)\index{Language Model}的目的是描述文字序列出现的规律。这个对问题建模的过程被称作{\small\sffamily\bfseries{语言建模}}\index{语言建模}(Language Modeling)\index{Language Modeling}。如果使用统计建模的方式,语言模型可以被定义为计算$P(w_1 w_2...w_m)$的问题,也就是计算整个词序列$w_1 w_2...w_m$出现的可能性大小。具体定义如下,
\parinterval {\small\sffamily\bfseries{语言模型}}\index{语言模型}(Language Model)\index{Language Model}的目的是描述文字序列出现的规律。这个对问题建模的过程被称作{\small\sffamily\bfseries{语言建模}}\index{语言建模}(Language Modeling)\index{Language Modeling}。如果使用统计建模的方式,语言模型可以被定义为计算$P(w_1 w_2 \ldots w_m)$的问题,也就是计算整个词序列$w_1 w_2 \ldots w_m$出现的可能性大小。具体定义如下,
%----------------------------------------------
% 定义3.1
\vspace{0.5em}
\begin{definition}[]
词汇表V上的语言模型是一个函数$P(w_1 w_2...w_m)$,它表示$V^+$上的一个概率分布。其中,对于任何词串$w_1 w_2...w_m\in{V^+}$,有$P(w_1 w_2...w_m)\geq{0}$。而且对于所有的词串,函数满足归一化条件$\sum{_{w_1 w_2...w_m\in{V^+}}P(w_1 w_2...w_m)}=1$
词汇表V上的语言模型是一个函数$P(w_1 w_2 \ldots w_m)$,它表示$V^+$上的一个概率分布。其中,对于任何词串$w_1 w_2 \ldots w_m\in{V^+}$,有$P(w_1 w_2 \ldots w_m)\geq{0}$。而且对于所有的词串,函数满足归一化条件$\sum{_{w_1 w_2 \ldots w_m\in{V^+}}P(w_1 w_2 \ldots w_m)}=1$
\end{definition}
%-------------------------------------------
\parinterval 直接求$P(w_1 w_2...w_m)$并不简单,因为如果把整个词串$w_1 w_2...w_m$作为一个变量,模型的参数量会非常大。$w_1 w_2...w_m$$|V|^m$种可能性,这里$|V|$表示词汇表大小。显然,当$m$ 增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。既然把$w_1 w_2...w_m$作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则,很容易得到
\parinterval 直接求$P(w_1 w_2 \ldots w_m)$并不简单,因为如果把整个词串$w_1 w_2 \ldots w_m$作为一个变量,模型的参数量会非常大。$w_1 w_2 \ldots w_m$$|V|^m$种可能性,这里$|V|$表示词汇表大小。显然,当$m$ 增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。既然把$w_1 w_2 \ldots w_m$作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则,很容易得到
\begin{eqnarray}
P(w_1 w_2...w_m)=P(w_1)P(w_2|w_1)P(w_3|w_1 w_2)...P(w_m|w_1 w_2...w_{m-1})
P(w_1 w_2 \ldots w_m)=P(w_1)P(w_2|w_1)P(w_3|w_1 w_2) \ldots P(w_m|w_1 w_2 \ldots w_{m-1})
\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$。这个模型把联合概率$P(w_1 w_2...w_m)$分解为多个条件概率的乘积,虽然对生成序列的过程进行了分解,但是模型的复杂度和以前是一样的,比如,$P(w_m|w_1 w_2...w_{m-1})$ 仍然不好计算。
这样,$w_1 w_2 \ldots w_m$的生成可以被看作是逐个生成每个单词的过程,即首先生成$w_1$,然后根据$w_1$再生成$w_2$,然后根据$w_1 w_2$再生成$w_3$,以此类推,直到根据所有前$m-1$个词生成序列的最后一个单词$w_m$。这个模型把联合概率$P(w_1 w_2 \ldots w_m)$分解为多个条件概率的乘积,虽然对生成序列的过程进行了分解,但是模型的复杂度和以前是一样的,比如,$P(w_m|w_1 w_2 \ldots w_{m-1})$ 仍然不好计算。
\parinterval 换一个角度看,$P(w_m|w_1 w_2...w_{m-1})$体现了一种基于“历史”的单词生成模型,也就是把前面生成的所有单词作为“历史”,并参考这个“历史”生成当前单词。但是这个“历史”的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面$n-1$个历史单词来生成当前单词,这就是$n$-gram语言模型。这个模型的数学描述如下:
\parinterval 换一个角度看,$P(w_m|w_1 w_2 \ldots w_{m-1})$体现了一种基于“历史”的单词生成模型,也就是把前面生成的所有单词作为“历史”,并参考这个“历史”生成当前单词。但是这个“历史”的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面$n-1$个历史单词来生成当前单词,这就是$n$-gram语言模型。这个模型的数学描述如下:
\begin{eqnarray}
P(w_m|w_1 w_2...w_{m-1}) \approx P(w_m|w_{m-n+1}...w_{m-1})
P(w_m|w_1 w_2 \ldots w_{m-1}) \approx P(w_m|w_{m-n+1} \ldots w_{m-1})
\label{eq:2-21}
\end{eqnarray}
\parinterval 这样,整个序列$w_1 w_2...w_m$的生成概率可以被重新定义为:
\parinterval 这样,整个序列$w_1 w_2 \ldots w_m$的生成概率可以被重新定义为:
%------------------------------------------------------
\begin{table}[htp]{
\begin{center}
{\footnotesize
\begin{tabular}{l|l|l l|l}
链式法则 & 1-gram & 2-gram & $...$ & $n$-gram\\
链式法则 & 1-gram & 2-gram & $ \ldots $ & $n$-gram\\
\hline
\rule{0pt}{10pt} $P(w_1 w_2...w_m)$ = & $P(w_1 w_2...w_m)$ = & $P(w_1 w_2...w_m)$ = & $...$ & $P(w_1 w_2...w_m)$ = \\
\rule{0pt}{10pt} $P(w_1)\times$ & $P(w_1)\times$ & $P(w_1)\times$ & $...$ & $P(w_1)\times$ \\
\rule{0pt}{10pt} $P(w_2|w_1)\times$ & $P(w_2)\times$ & $P(w_2|w_1)\times$ & $...$ & $P(w_2|w_1)\times$\\
\rule{0pt}{10pt} $P(w_3|w_1 w_2)\times$ & $P(w_3)\times$ & $P(w_3|w_2)\times$ & $...$ & $P(w_3|w_1 w_2)\times$ \\
\rule{0pt}{10pt} $P(w_4|w_1 w_2 w_3)\times$ & $P(w_4)\times$ & $P(w_4|w_3)\times$ & $...$ & $P(w_4|w_1 w_2 w_3)\times$ \\
\rule{0pt}{10pt} $...$ & $...$ & $...$ & $...$ & $...$ \\
\rule{0pt}{10pt} $P(w_m|w_1 ... w_{m-1})$ & $P(w_m)$ & $P(w_m|w_{m-1})$ & $...$ & $P(w_m|w_{m-n+1} ... w_{m-1})$
\rule{0pt}{10pt} $P(w_1 w_2 \ldots w_m)$ = & $P(w_1 w_2 \ldots w_m)$ = & $P(w_1 w_2 \ldots w_m)$ = & $ \ldots $ & $P(w_1 w_2 \ldots w_m)$ = \\
\rule{0pt}{10pt} $P(w_1)\times$ & $P(w_1)\times$ & $P(w_1)\times$ & $ \ldots $ & $P(w_1)\times$ \\
\rule{0pt}{10pt} $P(w_2|w_1)\times$ & $P(w_2)\times$ & $P(w_2|w_1)\times$ & $ \ldots $ & $P(w_2|w_1)\times$\\
\rule{0pt}{10pt} $P(w_3|w_1 w_2)\times$ & $P(w_3)\times$ & $P(w_3|w_2)\times$ & $ \ldots $ & $P(w_3|w_1 w_2)\times$ \\
\rule{0pt}{10pt} $P(w_4|w_1 w_2 w_3)\times$ & $P(w_4)\times$ & $P(w_4|w_3)\times$ & $ \ldots $ & $P(w_4|w_1 w_2 w_3)\times$ \\
\rule{0pt}{10pt} $ \ldots $ & $ \ldots $ & $ \ldots $ & $ \ldots $ & $ \ldots $ \\
\rule{0pt}{10pt} $P(w_m|w_1 \ldots w_{m-1})$ & $P(w_m)$ & $P(w_m|w_{m-1})$ & $ \ldots $ & $P(w_m|w_{m-n+1} \ldots w_{m-1})$
\end{tabular}
}
\end{center}
......@@ -509,13 +509,13 @@ P(w_m|w_1 w_2...w_{m-1}) \approx P(w_m|w_{m-n+1}...w_{m-1})
\parinterval $n$-gram的优点在于,它所使用的历史信息是有限的,即$n-1$个单词。这种性质也反映了经典的马尔可夫链的思想\upcite{liuke-markov-2004}\upcite{resnick1992adventures},有时也被称作马尔可夫假设或者马尔可夫属性。因此$n$-gram也可以被看作是变长序列上的一种马尔可夫模型,比如,2-gram语言模型对应着1阶马尔可夫模型,3-gram语言模型对应着2阶马尔可夫模型,以此类推。
\parinterval 那么,如何计算$P(w_m|w_{m-n+1} ... w_{m-1})$呢?有很多种选择,比如:
\parinterval 那么,如何计算$P(w_m|w_{m-n+1} \ldots w_{m-1})$呢?有很多种选择,比如:
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{极大似然估计}}\index{极大似然估计}。直接利用词序列在训练数据中出现的频度计算出$P(w_m|w_{m-n+1}$\\$... w_{m-1})$
\item {\small\bfnew{极大似然估计}}\index{极大似然估计}。直接利用词序列在训练数据中出现的频度计算出$P(w_m|w_{m-n+1}$\\$ \ldots w_{m-1})$
\begin{eqnarray}
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})}
P(w_m|w_{m-n+1} \ldots w_{m-1})=\frac{\textrm{count}(w_{m-n+1} \ldots w_m)}{\textrm{count}(w_{m-n+1} \ldots w_{m-1})}
\label{eq:2-22}
\vspace{0.5em}
\end{eqnarray}
......@@ -523,17 +523,17 @@ P(w_m|w_{m-n+1}...w_{m-1})=\frac{\textrm{count}(w_{m-n+1}...w_m)}{\textrm{count}
其中,$\textrm{count}(\cdot)$是在训练数据中统计频次的函数。
\vspace{0.5em}
\item {\small\bfnew{人工神经网络方法}}\index{人工神经网络方法}。构建一个人工神经网络估计$P(w_m|w_{m-n+1} ... w_{m-1})$的值,比如,可以构建一个前馈神经网络来对$n$-gram进行建模。
\item {\small\bfnew{人工神经网络方法}}\index{人工神经网络方法}。构建一个人工神经网络估计$P(w_m|w_{m-n+1} \ldots w_{m-1})$的值,比如,可以构建一个前馈神经网络来对$n$-gram进行建模。
\end{itemize}
\vspace{0.5em}
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此也是自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$P(w_m|w_{m-n+1} ... w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在{\chapternine}{\chapterten}进行详细介绍。
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此也是自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1} \ldots w_{m-1})$和输出$P(w_m|w_{m-n+1} \ldots w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在{\chapternine}{\chapterten}进行详细介绍。
\parinterval $n$-gram语言模型的使用非常简单。可以直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个分词序列的概率:
\begin{eqnarray}
& &P_{2-gram}{(\textrm{``确实}/\textrm{现在}/\textrm{数据}/\textrm{}/\textrm{多''})} \nonumber \\
&= & P(\textrm{``确实''}) \times P(\textrm{``现在''}|\textrm{``确实''})\times P(\textrm{``数据''}|\textrm{``现在''}) \times \nonumber \\
& & P(\textrm{``很''}|\textrm{``数据''})\times P(\textrm{``多''}|\textrm{``很''})
& &P_{2-\textrm{gram}}{(\textrm{确实}/\textrm{现在}/\textrm{数据}/\textrm{}/\textrm{})} \nonumber \\
&= & P(\textrm{确实}) \times P(\textrm{现在}|\textrm{确实})\times P(\textrm{数据}|\textrm{现在}) \times \nonumber \\
& & P(\textrm{}|\textrm{数据})\times P(\textrm{}|\textrm{})
\label{eq:2-23}
\end{eqnarray}
......@@ -547,8 +547,8 @@ P(w_m|w_{m-n+1}...w_{m-1})=\frac{\textrm{count}(w_{m-n+1}...w_m)}{\textrm{count}
\parinterval 在式\ref{eq:2-23}所示的例子中,如果语料中从没有“确实”和“现在”两个词连续出现的情况,那么使用2-gram计算切分“确实/现在/数据/很/多”的概率时,会出现如下情况
\begin{eqnarray}
P(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\textrm{count}(\textrm{``确实}\,\textrm{现在''})}{\textrm{count}(\textrm{``确实''})} \nonumber \\
& = & \frac{0}{\textrm{count}(\textrm{``确实''})} \nonumber \\
P(\textrm{现在}|\textrm{确实}) & = & \frac{\textrm{count}(\textrm{确实}\,\textrm{现在})}{\textrm{count}(\textrm{确实})} \nonumber \\
& = & \frac{0}{\textrm{count}(\textrm{确实})} \nonumber \\
& = & 0
\label{eq:2-24}
\end{eqnarray}
......@@ -572,15 +572,15 @@ P(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\textrm{count}(\textrm{`
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{加法平滑方法}
\subsubsection{1.加法平滑方法}
\parinterval {\small\bfnew{加法平滑}}\index{加法平滑}(Additive Smoothing)\index{Additive Smoothing}是一种简单的平滑技术。本小节首先介绍这一方法,希望通过它了解平滑算法的思想。通常情况下,系统研发者会利用采集到的语料库来模拟真实的全部语料库。当然,没有一个语料库能覆盖所有的语言现象。常见的一个问题是,使用的语料无法涵盖所有的词汇。因此,直接依据这样语料所获得的统计信息来获取语言模型就会产生偏差。假设依据某语料$C$ (从未出现“确实\ 现在”二元语法),评估一个已经分好词的句子$S$ =“确实/现在/物价/很/高”的概率。当计算“确实/现在”的概率时,$P(S) = 0$。显然这个结果是不合理的。
\parinterval 加法平滑方法假设每个$n$-gram出现的次数比实际统计次数多$\theta$次,$0 \le \theta\le 1$。这样,计算概率的时候分子部分不会为0。重新计算$P(\textrm{现在}|\textrm{确实})$,可以得到:
\begin{eqnarray}
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{``确实''})}
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-25}
\end{eqnarray}
......@@ -601,7 +601,7 @@ P(\textrm{``现在''}|\textrm{``确实''}) & = & \frac{\theta + \textrm{count}(
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{古德-图灵估计法}
\subsubsection{2.古德-图灵估计法}
\vspace{-0.5em}
\parinterval {\small\bfnew{古德-图灵估计法}}\index{古德-图灵估计法}(Good-Turing Estimate)\index{Good-Turing Estimate}是Alan Turing和他的助手I.J.Good开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953 年I.J.Good将其发表。这一方法也是很多平滑算法的核心,其基本思路是:把非零的$n$元语法单元的概率降低匀给一些低概率$n$元语法单元,以减小最大似然估计与真实概率之间的偏离\upcite{good1953population}\upcite{gale1995good}
......@@ -670,11 +670,11 @@ P(r>0) & = & \sum_{r>0}{P_r} \nonumber \\
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{Kneser-Ney平滑方法}
\subsubsection{3.Kneser-Ney平滑方法}
\parinterval Kneser-Ney平滑方法是由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\upcite{kneser1995improved}\upcite{chen1999empirical},并被广泛认为是最有效的平滑方法。这种平滑方法改进了absolute discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想。
\parinterval Kneser-Ney平滑方法是由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\upcite{kneser1995improved}\upcite{chen1999empirical},并被广泛认为是最有效的平滑方法。这种平滑方法改进了Absolute Discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想。
\parinterval 首先介绍一下absolute discounting平滑算法,公式如下所示:
\parinterval 首先介绍一下Absolute Discounting平滑算法,公式如下所示:
\begin{eqnarray}
P_{\textrm{AbsDiscount}}(w_i | w_{i-1}) = \frac{c(w_{i-1},w_i )-d}{c(w_{i-1})} + \lambda(w_{i-1})P(w)
\label{eq:2-31}
......@@ -728,12 +728,12 @@ P_{\textrm{KN}}(w_i|w_{i-1}) = \frac{\max(c(w_{i-1},w_i )-d,0)}{c(w_{i-1})}+ \la
\parinterval 为了更具普适性,不仅局限为2-gram和1-gram的插值模型,利用递归的方式可以得到更通用的Kneser-Ney平滑公式
\begin{eqnarray}
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})P_{\textrm{KN}}(w_i|w_{i-n+2}...w_{i-1})
P_{\textrm{KN}}(w_i|w_{i-n+1} \ldots w_{i-1}) & = & \frac{\max(c_{\textrm{KN}}(w_{i-n+1} \ldots w_{i-1})-d,0)}{c_{\textrm{KN}}(w_{i-n+1} \ldots w_{i-1})} + \nonumber \\
& & \lambda(w_{i-n+1} \ldots w_{i-1})P_{\textrm{KN}}(w_i|w_{i-n+2} \ldots w_{i-1})
\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\}
\lambda(w_{i-1}) = \frac{d}{c_{\textrm{KN}}(w_{i-n+1}^{i-1})}|\{w:c_{\textrm{KN}}(w_{i-n+1} \ldots w_{i-1}w)>0\}
\label{eq:2-38}
\end{eqnarray}
\begin{eqnarray}
......@@ -754,9 +754,9 @@ 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}。也就是,在所有可能的序列中,根据语言模型的打分找出最佳的序列作为生成的结果。下面将着重介绍序列生成背后的搜索问题建模方法,以及在序列生成里常用的搜索技术。相关的搜索算法也会在后续统计机器翻译和神经机器翻译中被深入使用。
\parinterval 这类问题也对应着一大类自然语言处理问题\ \dash\ {\small\bfnew{序列生成}}\index{序列生成}(Sequence Generation)\index{Sequence Generation}。机器翻译就是一个非常典型的序列生成问题:在机器翻译任务中,需要根据源语言序列直接生成与之相对应的目标语言序列。但是语言模型本身并不能“制造”单词序列的,它的基础功能是评判给定的、已经生成的单词序列是否流畅合理。因此严格地说,序列生成问题的本质并非是语言模型凭空“生成”序列,而是使用语言模型在所有候选的单词序列中找出其中的“最佳”序列。实际上,在序列生成任务中寻找最佳单词序列过程的本质是经典的{\small\bfnew{搜索问题}}\index{搜索问题}(Search Problem)\index{Search Problem}。也就是,在所有可能的序列中,根据语言模型的打分找出最佳的序列作为生成的结果。下面将着重介绍序列生成背后的搜索问题建模方法,以及在序列生成里常用的搜索技术。相关的搜索算法也会在后续统计机器翻译和神经机器翻译中被深入使用。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -764,15 +764,15 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\subsection{搜索问题的建模}
\parinterval 具体来说,基于语言模型的序列生成问题的本质是在无数任意排列的单词序列中搜索出最合理、最流畅的“最优解”。这里单词序列$w = w_1 w_2...w_m$的合理性和流畅性可以通过语言模型的打分$P(w)$衡量。因此在序列生成中,基于语言模型的搜索问题可以被建模为如下形式:
\parinterval 具体来说,基于语言模型的序列生成问题的本质是在无数任意排列的单词序列中搜索出最合理、最流畅的“最优解”。这里单词序列$w = w_1 w_2 \ldots w_m$的合理性和流畅性可以通过语言模型的打分$P(w)$衡量。因此在序列生成中,基于语言模型的搜索问题可以被建模为如下形式:
\begin{eqnarray}
w^{'} = \argmax_{w \in \chi}P(w)
\label{eq:2-40}
\end{eqnarray}
\parinterval 这里arg即argument,$\argmax_{w \in \chi}P(w)$表示想要找到使语言模型得分$P(w)$达到最大的单词序列$w$$\chi$是搜索问题的解空间 \footnote[1]{解空间,是一个算法执行后,所得到的所有解构成的集合。},在这里是所有可能的单词序列$w$的集合。$w^{'}$可以被看做该搜索问题中的“最优解”,即“出现概率最大的单词序列”。
\parinterval 这里$\arg$即argument,$\argmax_{w \in \chi}P(w)$表示想要找到使语言模型得分$P(w)$达到最大的单词序列$w$$\chi$是搜索问题的解空间 \footnote[1]{解空间,是一个算法执行后,所得到的所有解构成的集合。},在这里是所有可能的单词序列$w$的集合。$w^{'}$可以被看做该搜索问题中的“最优解”,即“出现概率最大的单词序列”。
\parinterval 在序列生成问题中,最简单的策略就是对词表中的词汇进行任意组合,通过这种枚举的方式得到全部可能的序列。但是,很多时候并没有预先指定序列的长度,比如,机器翻译中译文的长度是无法预先知道的。那么怎样判断一个序列何时完成了生成过程呢?回顾人类书写文字的过程可以发现,句子的生成首先从一片空白开始,然后从左到右逐词生成,除了第一个单词,所有单词的生成都依赖于前面已经生成的单词。为了方便计算机实现,通常定义单词序列从一个特殊的单词<sos>后开始生成。同样地,一个单词序列的结束也用一个特殊的单词<eos>来表示。
\parinterval 在序列生成问题中,最简单的策略就是对词表中的词汇进行任意组合,通过这种枚举的方式得到全部可能的序列。但是,很多时候并没有预先指定序列的长度。比如,机器翻译中译文的长度是无法预先知道的。那么怎样判断一个序列何时完成了生成过程呢?回顾人类书写文字的过程可以发现,句子的生成首先从一片空白开始,然后从左到右逐词生成,除了第一个单词,所有单词的生成都依赖于前面已经生成的单词。为了方便计算机实现,通常定义单词序列从一个特殊的符号<sos>后开始生成。同样地,一个单词序列的结束也用一个特殊的符号<eos>来表示。
\parinterval 对于一个序列$<$sos$>$\ \ I\ \ agree\ \ $<$eos$>$,图\ref{fig:2-13}展示语言模型视角该序列的生成过程。该过程通过在序列的末尾不断附加词表中的单词来逐渐扩展序列,直到这段序列结束。这种生成单词序列的过程被称作{\small\bfnew{自左向右生成}}\index{自左向右生成}(Left-To-Right Generation)\index{Left-To-Right Generation}
......@@ -829,22 +829,22 @@ w^{'} = \argmax_{w \in \chi}P(w)
}\end{table}
%------------------------------------------------------
\parinterval 此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表\ref{tab:2-3}所示。其中$|V|$为词表大小,$m$为序列长度,$\ast$表示“当且仅当在所有可能的单词序列数目有限下成立”。值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为$|V|+1$
\parinterval 此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表\ref{tab:2-3}所示。其中$|V|$为词表大小,$m$为序列长度,$\ast$表示“当且仅当在单词序列的最大长度被确定”。值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为$|V|+1$
\parinterval 那么是否能改进枚举策略使得它更高效呢?答案是肯定的。首先从图\ref{fig:2-14}可以看到,对于一个最大长度为4的序列的搜索过程,生成某个单词序列的过程实际上就是访问解空间树\footnote[2]{解空间树是搜索路径的树型表示,它包含了搜索过程中可生成的全部序列。该树的根节点恒为$<$sos$>$,代表序列均从$<$sos$>$开始。该树结构中非叶子节点的兄弟节点有$|V|$个,由词表和结束符号$<$eos$>$构成。}中从根节点<sos>开始一直到叶子节点<eos>结束的某条路径,而这条的路径上节点按顺序组成了一段独特的单词序列。此时对所有可能单词序列的枚举就变成了对解空间树的遍历。并且枚举的过程与语言模型打分的过程也是一致的,每枚举一个词$i$也就是在上图选择$w_i$一列的一个节点,语言模型就可以为当前的树节点$w_i$给出一个分值,即$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$给出一个分值,即$P(w_i | w_1 w_2 \ldots w_{i-1})$
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter2/Figures/figure-solution-space-tree-of-enumeration-search}
\caption{枚举搜索时的解空间树}
\caption{对有限长序列进行枚举搜索时的解空间树}
\label{fig:2-14}
\end{figure}
%-------------------------------------------
\parinterval 从这个角度来看,可以很自然地引入语言模型打分来对枚举的解空间树的遍历进行增广:在解空间树中引入节点的权重\ \dash\ 将当前节点$i$的得分重设为语言模型打分$\log P(w_i | w_1 w_2...w_{i-1})$,其中$w_1 w_2...w_{i-1}$是该节点的全部祖先。与先前不同的是,由于在使用语言模型打分时,词的概率通常小于1,因此句子很长时概率会非常小,容易造成浮点误差,所以这里使用概率的对数形式$\log P(w_i | w_1 w_2...w_{i-1})$代替原始的$P(w_i | w_1 w_2...w_{i-1})$。此时对于图中一条包含<eos>的完整序列来说,它的最终得分为$\log P(w_1 w_2...w_m) = \sum_{i=1}^{m}\log P(w_i | w_1 w_2...w_{i-1})$如图\ref{fig:2-15}所示,可知红线所示单词序列“<sos>\ I\ agree\ <eos>”的得分为:
\parinterval 从这个角度来看,可以很自然地引入语言模型打分来对枚举的解空间树的遍历进行增广:在解空间树中引入节点的权重\ \dash\ 将当前节点$i$的得分重设为语言模型打分$\log P(w_i | w_1 w_2 \ldots w_{i-1})$,其中$w_1 w_2 \ldots w_{i-1}$是该节点的全部祖先。与先前不同的是,由于在使用语言模型打分时,词的概率通常小于1,因此句子很长时概率会非常小,容易造成浮点误差,所以这里使用概率的对数形式$\log P(w_i | w_1 w_2 \ldots w_{i-1})$代替$P(w_i | w_1 w_2 \ldots w_{i-1})$。此时对于图中一条包含<eos>的完整序列来说,它的最终得分为$\log P(w_1 w_2 \ldots w_m) = \sum_{i=1}^{m}\log P(w_i | w_1 w_2 \ldots w_{i-1})$如图\ref{fig:2-15}所示,可知红线所示单词序列“<sos>\ I\ agree\ <eos>”的得分为:
\begin{eqnarray}
&&\textrm{score(“<sos>\ I\ agree\ <eos>”)} \nonumber \\
&&\textrm{score(<sos>\ I\ agree\ <eos>)} \nonumber \\
& = & \log P(\textrm{I} | \textrm{<sos>}) + \log P(\textrm{agree} | \textrm{<sos>\ I}) + \log P(\textrm{<sos>}| \textrm{<sos>\ I\ agree}) \nonumber \\
& = & -0.5-0.2-0.8 \nonumber \\
& = & -1.5
......@@ -872,7 +872,7 @@ w^{'} = \argmax_{w \in \chi}P(w)
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{无信息搜索策略}
\subsubsection{1.无信息搜索策略}
\parinterval 上述搜索过程中,在每次对当前节点进行扩展的时候,可以借助语言模型计算从当前节点的权重。因此很自然的一个想法是:在单词序列的生成过程中使用权重信息可以帮助系统更快找到合适的解。
......@@ -898,7 +898,7 @@ w^{'} = \argmax_{w \in \chi}P(w)
\end{figure}
%-------------------------------------------
\parinterval 上面描述的两个改进后的搜索方法属于无信息搜索策略\upcite{sahni1978fundamentals},因为他们依赖的信息仍然来源于问题本身而不是问题以外。改进后的方法虽然有机会更快寻找到分数最高的单词序列,也就是最优解。但是由于没有一个通用的办法来判断当前找到的解是否为最优解,这种策略不会在找到最优解后自动停止,因此最终仍然需要枚举所有可能的单词序列,寻找最优解需要的时间复杂度没有产生任何改变。尽管如此,如果只是需要一个相对好的解而不是最优解,改进后的搜索策略仍然是比原始枚举策略更优秀的算法。
\parinterval 上面描述的两个改进后的搜索方法属于无信息搜索策略\upcite{sahni1978fundamentals},因为他们依赖的信息仍然来源于问题本身而不是问题以外。改进后的方法虽然有机会更快寻找到分数最高的单词序列,也就是最优解。但是由于没有一个通用的办法来判断当前找到的解是否为最优解,这种策略不会在找到最优解后自动停止,因此最终仍然需要枚举所有可能的单词序列,寻找最优解需要的时间复杂度没有产生任何改变。尽管如此,如果只是需要一个相对好的解而不是最优解,改进后的搜索策略仍然是比原始枚举策略更优秀的算法。
\parinterval 此外,由于搜索过程中将语言模型的打分作为搜索树的节点权重,另一种改进思路是:能否借助语言模型的特殊性质来对搜索树进行{\small\bfnew{剪枝}}\index{剪枝}(Pruning)\index{Pruning},从而避免在搜索空间中访问一些不可能产生比当前解更好的结果的区域,提高搜索策略在实际运用当中的效率。简单来说,剪枝是一种可以缩小搜索空间的手段,比如,在搜索的过程中,动态的“丢弃”一些搜索路径,从而减少搜索的总代价。剪枝的程度在一定范围内影响了搜索系统的效率,剪枝越多搜索效率越高,一般找到最优解的可能性也越低;反之,搜索效率越低,但是找到最优解的可能性越大。在{\chapterten}中介绍的贪婪搜索和束搜索都可以被看作是剪枝方法的一种特例。
......@@ -906,11 +906,11 @@ w^{'} = \argmax_{w \in \chi}P(w)
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{启发式搜索策略}
\subsubsection{2.启发式搜索策略}
\parinterval 在搜索问题中,一个单词序列的生成可以分为两部分:已生成部分和未生成部分。既然最终目标是使得一个完整的单词序列得分最高,那么关注未生成部分的得分也许能为现有搜索策略的改进提供思路。
\parinterval 但是,问题在于未生成部分来自搜索树中未被搜索过的区域,直接得到其得分并不现实。既然仅依赖于问题本身的信息无法得到未生成部分的得分,那么是否可以通过一些外部信息来估计未生成部分得分$\textrm{h}(w_1 w_2...w_m)$呢?在前面所提到的剪枝技术中,借助语言模型的特性可以使得搜索变得高效。与其类似,利用语言模型的其他特性也可以实现对未生成部分得分的估计。这个对未生成部分得分的估计通常被称为{\small\bfnew{启发式函数}}\index{启发式函数}(Heuristic Function)\index{Heuristic Function}。在扩展假设过程中,可以优先挑选当前得分$\log 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}\upcite{DBLP:journals/tssc/HartNR68}
\parinterval 但是,问题在于未生成部分来自搜索树中未被搜索过的区域,直接得到其得分并不现实。既然仅依赖于问题本身的信息无法得到未生成部分的得分,那么是否可以通过一些外部信息来估计未生成部分得分$\textrm{h}(w_1 w_2 \ldots w_m)$呢?在前面所提到的剪枝技术中,借助语言模型的特性可以使得搜索变得高效。与其类似,利用语言模型的其他特性也可以实现对未生成部分得分的估计。这个对未生成部分得分的估计通常被称为{\small\bfnew{启发式函数}}\index{启发式函数}(Heuristic Function)\index{Heuristic Function}。在扩展假设过程中,可以优先挑选当前得分$\log P(w_1 w_2 \ldots w_m)$和启发式函数值$\textrm{h}(w_1 w_2 \ldots w_m)$最大的候选进行扩展,从而大大提高搜索的效率。这种基于启发式函数的一致代价搜索通常也被称为$\textrm{A}^{\ast}$搜索或{\small\bfnew{启发式搜索}}\index{启发式搜索}(Heuristically Search)\index{Heuristically Search}\upcite{DBLP:journals/tssc/HartNR68}
\parinterval 通常可以把启发式函数看成是计算当前状态跟最优解的距离的一种方法,并把关于最优解的一些性质的猜测放到启发式函数里。比如,在序列生成中,一般认为最优序列应该在某个特定的长度附近,那么就可以把启发式函数定义成该长度与当前单词序列长度的差值。这样,在搜索过程中,启发式函数会引导搜索倾向于先生成当前得分高且序列长度接近预设长度的单词序列。此外除了手工设计启发式函数,还可以借助强化学习的手段,学习关于未来得分的估计\upcite{DBLP:conf/nips/HeLXQ0L17}
......@@ -920,13 +920,13 @@ w^{'} = \argmax_{w \in \chi}P(w)
\subsection{非经典搜索(局部搜索)}
\parinterval 由于全局搜索策略大都要遍历整个解空间,所以全局搜索策略的时间、空间复杂度一般都比较高。在对于完备性与最优性要求不那么严格的搜索问题上,可以使用局部搜索策略。局部搜索策略不必遍历完整的解空间,因此降低了时间、空间复杂度,但是这也导致可能会丢失最优解甚至找不到解,所以局部搜索都是不完备的而且非最优的。但是,在自然语言处理中,很多问题由于搜索空间过大无法使用全局搜索,因此使用局部搜索是非常普遍的。
\parinterval 由于全局搜索策略大都要遍历整个解空间,所以全局搜索策略的时间、空间复杂度一般都比较高。在对于完备性与最优性要求不那么严格的搜索问题上,可以使用局部搜索策略。局部搜索策略不必遍历完整的解空间,因此降低了时间、空间复杂度,但是这也导致可能会丢失最优解甚至找不到解,所以局部搜索都是不完备的而且非最优的。但是,在自然语言处理中,很多问题由于搜索空间过大无法使用全局搜索,因此使用局部搜索是非常普遍的。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{贪婪搜索}
\subsubsection{1.贪婪搜索}
\parinterval {\small\bfnew{贪婪搜索}}\index{贪婪搜索}(Greedy Search)\index{Greedy Search}基于一种假设,当一个问题可以拆分为多个子问题时,如果一直选择子问题的最优解就能得到原问题的最优解。基于这种假设,它每次都优先挑选得分最高的词进行扩展,这一点与改进过的深度优先搜索类似。但是它们的区别在于,贪婪搜索在搜索到一个完整的序列,也就是搜索到<eos>即停止,而改进的深度优先搜索会遍历整个解空间。因此贪婪搜索非常高效,其时间和空间复杂度仅为$\textrm{O}(m)$,这里$m$为单词序列的长度。
......@@ -945,11 +945,11 @@ w^{'} = \argmax_{w \in \chi}P(w)
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{束搜索}
\subsubsection{2.束搜索}
\parinterval 贪婪搜索会产生质量比较差的解是由于当前单词的错误选择造成的。既然每次只挑选一个单词可能会产生错误,那么可以通过同时考虑更多候选单词来缓解这个问题,也就是对于一个位置,可以同时将其扩展到若干个节点。这样就扩大了搜索的范围,进而使得优质解被找到的概率增大。
\parinterval 常见的做法是每一次生成新单词的时候都挑选得分最高的前$B$个单词,然后扩展这$B$个单词的$V$个孩子节点,得到$BV$条新路径,最后保留其中得分最高的$B$条路径。从另外一个角度理解,它相当于比贪婪搜索看到了更多的假设,因而它更有可能找到好的解。这个方法通常被称为{\small\bfnew{束搜索}}\index{束搜索}(Beam Search)\index{Beam Search}。图\ref{fig:2-19}展示了一个束大小为3的例子,其中束大小代表每次选择单词时保留的词数。比起贪婪搜索,束搜索在实际表现中非常优秀,它的时间、空间复杂度仅为贪婪搜索的常数倍,也就是$\textrm{O}(Bm)$
\parinterval 常见的做法是每一次生成新单词的时候都挑选得分最高的前$B$个单词,然后扩展这$B$个单词的$V$个孩子节点,得到$BV$条新路径,最后保留其中得分最高的$B$条路径。从另外一个角度理解,它相当于比贪婪搜索看到了更多的假设,因而它更有可能找到好的解。这个方法通常被称为{\small\bfnew{束搜索}}\index{束搜索}(Beam Search)\index{Beam Search}。图\ref{fig:2-19}展示了一个束大小为3的例子,其中束大小代表每次选择单词时保留的词数。比起贪婪搜索,束搜索在实际表现中非常优秀,它的时间、空间复杂度仅为贪婪搜索的常数倍,也就是$\textrm{O}(Bm)$
%----------------------------------------------
\begin{figure}[htp]
......@@ -960,7 +960,9 @@ w^{'} = \argmax_{w \in \chi}P(w)
\end{figure}
%-------------------------------------------
\parinterval 束搜索也有很多的改进版本。比如,在无信息搜索策略中可以使用剪枝技术来提升搜索的效率。而实际上,束搜索本身也是一种剪枝方法。因此有时也把束搜索称作{\small\bfnew{束剪枝}}\index{束剪枝}(Beam Pruning)\index{Beam Pruning}。在这里有很多其它的剪枝策略可供选择,例如可以只保留与当前最佳路径得分相差在$\theta$之内的路径,也就是搜索只保留得分差距在一定范围内的路径,这种方法也被称作{\small\bfnew{直方图剪枝}}\index{直方图剪枝}(Histogram Pruning)\index{Histogram Pruning}。对于语言模型来说,当进行搜索时正在搜索的多个路径中最高得分比当前搜索到的最好的解的得分低之后也可以立刻停止搜索,因为此时序列越长语言模型得分$\log P(w_1 w_2...w_m)$会越低,因此继续扩展这些路径不会产生更好的结果。这个技术通常也被称为{\small\bfnew{最佳停止条件}}\index{最佳停止条件}(Optimal Stopping Criteria)\index{Optimal Stopping Criteria}
\parinterval 束搜索也有很多的改进版本。比如,在无信息搜索策略中可以使用剪枝技术来提升搜索的效率。而实际上,束搜索本身也是一种剪枝方法。因此有时也把束搜索称作{\small\bfnew{束剪枝}}\index{束剪枝}(Beam Pruning)\index{Beam Pruning}。在这里有很多其它的剪枝策略可供选择,例如可以只保留与当前最佳路径得分相差在$\theta$之内的路径,也就是搜索只保留得分差距在一定范围内的路径,这种方法也被称作{\small\bfnew{直方图剪枝}}\index{直方图剪枝}(Histogram Pruning)\index{Histogram Pruning}
\parinterval 对于语言模型来说,当进行搜索时正在搜索的多个路径中最高得分比当前搜索到的最好的解的得分低之后可以立刻停止搜索,因为此时序列越长语言模型得分$\log P(w_1 w_2 \ldots w_m)$会越低,因此继续扩展这些路径不会产生更好的结果。这个技术通常也被称为{\small\bfnew{最佳停止条件}}\index{最佳停止条件}(Optimal Stopping Criteria)\index{Optimal Stopping Criteria}
\parinterval 总的来说,虽然局部搜索由于没有遍历完整的解空间,使得这类方法无法保证找到最优解。但是,局部搜索算法大大降低了搜索过程的时间、空间复杂度。因此在语言模型生成和机器翻译的解码过程中常常使用局部搜索算法。在{\chapterseven}{\chapterten}{\chaptereleven}中还将介绍这些算法的具体应用。
......@@ -982,7 +984,7 @@ w^{'} = \argmax_{w \in \chi}P(w)
\vspace{0.5em}
\item 从现在{\small\sffamily\bfseries{自然语言处理的前沿}}看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法,而且在近些年取得了巨大成功\upcite{DBLP:conf/nips/BengioDV00}。关于神经语言模型的内容,会在{\chapternine}进行进一步介绍。这里更多地关注了语言模型的基本问题和求解思路,因为对问题的建模是自然语言处理的基础,对问题的本质刻画并不会因为方法的改变而改变。在后续章节还将看到,这里所使用的生成序列的建模方法会作为机器翻译最基本的范式。
\vspace{0.5em}
\item 此外,本章结合序列生成任务对{\small\sffamily\bfseries{搜索技术}}进行了介绍。而搜索问题也是语言建模和机器翻译中的最基本问题之一。在这些任务中,搜索空间往往较大,因此枚举与大多数全局搜索方法是不可行的。但是,由于启发式搜索不仅具有完备性,并且兼顾了搜索效率,因此也有研究尝试使用启发式搜索\upcite{DBLP:conf/acl/OchUN01,DBLP:conf/acl/WangW97}。同时现在许多基于强化学习的方法本质上也是一种对启发式搜索的引申\upcite{DBLP:conf/nips/HeLXQ0L17}。对于局部搜索算法,除了经常在翻译任务中使用的束搜索\upcite{DBLP:journals/corr/LiMJ16}以外还有模拟退火搜索。他们都可以被理解为是对贪婪搜索的一种改进,并且遗传算法作为随机束搜索的变形也常常被使用。最后,在机器翻译任务中,搜索技术也被应用于结构搜索。其中常用的方法包括使用强化学习的方法\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/iclr/SchrimpfM0S18}或使用遗传算法搜索网络结构。由于整个模型结构的表示空间巨大,因此在搜索过程中也往往采用束搜索等方式对结构空间进行裁剪,以达到在有限算力条件下搜索到最佳模型结构的目的。
\item 此外,本章结合序列生成任务对{\small\sffamily\bfseries{搜索技术}}进行了介绍。而搜索问题也是语言建模和机器翻译中的最基本问题之一。在这些任务中,搜索空间往往较大,因此枚举与大多数全局搜索方法是不可行的。但是,由于启发式搜索不仅具有完备性,并且兼顾了搜索效率,因此也有研究尝试使用启发式搜索\upcite{DBLP:conf/acl/OchUN01,DBLP:conf/acl/WangW97}。同时现在许多基于强化学习的方法本质上也是一种对启发式搜索的引申\upcite{DBLP:conf/nips/HeLXQ0L17}。对于局部搜索算法,除了经常在翻译任务中使用的束搜索\upcite{DBLP:journals/corr/LiMJ16}以外还有模拟退火搜索,他们都是对贪婪搜索的一种改进,并且遗传算法作为随机束搜索的变形也常常被使用。最后,在机器翻译任务中,搜索技术也被应用于神经结构搜索。其中常用的方法包括使用强化学习的方法\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/iclr/SchrimpfM0S18}或使用遗传算法搜索网络结构。由于整个模型结构的表示空间巨大,因此在搜索过程中也往往采用束搜索等方式对结构空间进行裁剪,以达到在有限算力条件下搜索到最佳模型结构的目的。
\vspace{0.5em}
\end{itemize}
\end{adjustwidth}
......@@ -212,6 +212,12 @@
\usepackage{amsmath,amsfonts,amssymb,amsthm} % For math equations, theorems, symbols, etc
\DeclareSymbolFont{EulerExtension}{U}{euex}{m}{n}%将积分号修改为正体
\DeclareMathSymbol{\euintop}{\mathop} {EulerExtension}{"52}
%\DeclareMathSymbol{\euointop}{\mathop} {EulerExtension}{"48}
\let\intop\euintop
%\let\ointop\euointop
\newcommand{\intoo}[2]{\mathopen{]}#1\,;#2\mathclose{[}}
\newcommand{\ud}{\mathop{\mathrm{{}d}}\mathopen{}}
\newcommand{\intff}[2]{\mathopen{[}#1\,;#2\mathclose{]}}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论