Commit 32a02f38 by xiaotong

bug fixes

parent 97531df9
......@@ -73,7 +73,7 @@
\subsection{随机变量和概率}\index{Chapter2.2.1}
\parinterval 在自然界中,有这样一类具有偶然性的事件,它在一定条件下是否会发生是不确定的。例如,明天会下雨、掷一枚硬币是正面朝上、扔一个骰子的点数是5$\cdots\cdots$这类可能会发生也可能不会发生,通过大量的重复试验,能发现其发生具有某种规律性的事件叫做\textbf{随机事件}
\parinterval \textbf{随机变量(random variable)}是对随机事件发生可能状态的描述,是随机事件的数量表征。设$\Omega = \{ \omega \}$为一个随机试验的样本空间,$X=X(\omega)$就是定义在样本空间$\omega$上的、取值为实数的单值函数,即$X=X(\omega)$为随机变量,记为$X$。随机变量是一种能随机选取数值的变量,常用大写的英文字母或希腊字母表示,其取值通常用小写字母来表示。例如,用$A$表示一个随机变量,用$a$表示变量$A$的一个取值。根据随机变量可以选取的值,可以将其划分为离散变量和连续变量。
\parinterval \textbf{随机变量}(random variable)是对随机事件发生可能状态的描述,是随机事件的数量表征。设$\Omega = \{ \omega \}$为一个随机试验的样本空间,$X=X(\omega)$就是定义在样本空间$\omega$上的、取值为实数的单值函数,即$X=X(\omega)$为随机变量,记为$X$。随机变量是一种能随机选取数值的变量,常用大写的英文字母或希腊字母表示,其取值通常用小写字母来表示。例如,用$A$表示一个随机变量,用$a$表示变量$A$的一个取值。根据随机变量可以选取的值,可以将其划分为离散变量和连续变量。
\parinterval 离散变量是指在其取值区间内可以被一一列举,总数有限并且可计算的数值变量。例如,用随机变量$X$代表某次投骰子出现的点数,点数只可能取1$\sim$6这6个整数,$X$是一个离散变量。
......@@ -81,7 +81,7 @@
\parinterval 概率是度量随机事件呈现其每个可能状态的可能性的数值,本质上它是一个测度函数\cite{mao-prob-book-2011}\cite{kolmogorov2018foundations}。概率的大小表征了随机事件在一次试验中发生的可能性大小。用$\textrm{P}(\cdot )$表示一个随机事件的可能性,即事件发生的概率。比如$\textrm{P}(\textrm{太阳从东方升起})$表示``太阳从东方升起的可能性'',同理,$\textrm{P}(A=B)$表示的就是``$A=B$'' 这件事的可能性。
\parinterval 在实际问题中,我们往往需要得到某些概率值。但是,真实的概率值往往是无法准确知道的,这时就需要对概率进行\textbf{估计},得到的结果是概率的\textbf{估计值(estimate)}。在概率论中,一个很简单的获取概率的方式是利用相对频度作为概率的估计值。如果$\{x_1,x_2,\dots,x_n \}$是一个试验的样本空间,在相同情况下重复试验N次,观察到样本$x_i (1\leq{i}\leq{n})$的次数为$n_N (x_i )$,那么$x_i$在这N次试验中的相对频率是$\frac{n_N (x_i )}{N}$。当N越来越大时,相对概率也就越来越接近真实概率$\textrm{P}(x_i)$,即$\lim_{N \to \infty}\frac{n_N (x_i )}{N}=\textrm{P}(x_i)$。 实际上,很多概率模型都等同于相对频度估计,比如,对于一个多项式分布变量的概率的极大似然估计就可以用相对频度估计实现。
\parinterval 在实际问题中,我们往往需要得到某些概率值。但是,真实的概率值往往是无法准确知道的,这时就需要对概率进行\textbf{估计},得到的结果是概率的\textbf{估计值}(estimate)。在概率论中,一个很简单的获取概率的方式是利用相对频度作为概率的估计值。如果$\{x_1,x_2,\dots,x_n \}$是一个试验的样本空间,在相同情况下重复试验N次,观察到样本$x_i (1\leq{i}\leq{n})$的次数为$n_N (x_i )$,那么$x_i$在这N次试验中的相对频率是$\frac{n_N (x_i )}{N}$。当N越来越大时,相对概率也就越来越接近真实概率$\textrm{P}(x_i)$,即$\lim_{N \to \infty}\frac{n_N (x_i )}{N}=\textrm{P}(x_i)$。 实际上,很多概率模型都等同于相对频度估计,比如,对于一个多项式分布变量的概率的极大似然估计就可以用相对频度估计实现。
\parinterval 概率函数是用函数形式给出离散变量每个取值发生的概率,其实就是将变量的概率分布转化为数学表达形式。如果我们把$A$看做一个离散变量,$a$看做变量$A$的一个取值,那么$\textrm{P}(A)$被称作变量$A$的概率函数,$\textrm{P}(A=a)$被称作$A = a$的概率值,简记为$\textrm{P}(a)$。例如,在相同条件下掷一个骰子50次,用$A$表示投骰子出现的点数这个离散变量,$a_i$表示点数的取值,$\textrm{P}_i$表示$A=a_i$的概率值。下表为$A$的概率分布,给出了$A$的所有取值及其概率。
%表1--------------------------------------------------------------------
......@@ -97,11 +97,11 @@
\end{table}
%表1--------------------------------------------------------------------
\parinterval 除此之外,概率函数$\textrm{P(·)}$还具有非负性、归一性等特点,非负性是指,所有的概率函数$\textrm{P(·)}$都必须是大于等于0的数值,概率函数中不可能出现负数:$\forall{x},\textrm{P}{(x)}\geq{0}$。归一性,又称规范性,简单的说就是所有可能发生的事件的概率总和为一,$\sum_{x}\textrm{P}{(x)}={1}$
\parinterval 除此之外,概率函数$\textrm{P}(\cdot)$还具有非负性、归一性等特点,非负性是指,所有的概率函数$\textrm{P}(\cdot)$都必须是大于等于0的数值,概率函数中不可能出现负数:$\forall{x},\textrm{P}{(x)}\geq{0}$。归一性,又称规范性,简单的说就是所有可能发生的事件的概率总和为一,$\sum_{x}\textrm{P}{(x)}={1}$
\parinterval 对于离散变量$A$$\textrm{P}(A=a)$是个确定的值,可以表示事件$A=a$的可能性大小;而对于连续变量,求在某个定点处的概率是无意义的,只能求其落在某个取值区间内的概率。因此,用\textbf{概率分布函数$\textrm{F}(x)$}\textbf{概率密度函数$\textrm{f}(x)$}来统一描述随机变量的取值分布情况。概率分布函数$\textrm{F}(x)$取值小于某个值的概率,是概率的累加形式。假设$A$是一个随机变量,$a$是任意实数,将函数$\textrm{F}(a)=\textrm{P}\{A\leq a\}$$-\infty<a<\infty $定义为$A$的分布函数。通过分布函数,我们可以清晰地表示任何随机变量的概率。
\parinterval 对于离散变量$A$$\textrm{P}(A=a)$是个确定的值,可以表示事件$A=a$的可能性大小;而对于连续变量,求在某个定点处的概率是无意义的,只能求其落在某个取值区间内的概率。因此,用\textbf{概率分布函数$F(x)$}\textbf{概率密度函数}$f(x)$来统一描述随机变量的取值分布情况。概率分布函数$F(x)$取值小于某个值的概率,是概率的累加形式。假设$A$是一个随机变量,$a$是任意实数,将函数$F(a)=\textrm{P}\{A\leq a\}$$-\infty<a<\infty $定义为$A$的分布函数。通过分布函数,我们可以清晰地表示任何随机变量的概率。
\parinterval 对于连续变量,我们不能像离散变量一样列出所有的概率取值,而是用概率密度函数来描述分布情况。概率密度函数反映了变量在某个区间内的概率变化快慢,概率密度函数的值是概率的变化率,该连续变量的概率也就是对概率密度函数求积分得到的结果。设$\textrm{f}(x) \geq 0$是连续变量$X$的概率密度函数,$X$的分布函数就可以用$\textrm{F}(X)=\int_{-\infty}^x \textrm{f}(x)dx \ (x\in \mathbb{R})$来表示。
\parinterval 对于连续变量,我们不能像离散变量一样列出所有的概率取值,而是用概率密度函数来描述分布情况。概率密度函数反映了变量在某个区间内的概率变化快慢,概率密度函数的值是概率的变化率,该连续变量的概率也就是对概率密度函数求积分得到的结果。设$f(x) \geq 0$是连续变量$X$的概率密度函数,$X$的分布函数就可以用$F(X)=\int_{-\infty}^x f(x)dx \ (x\in \mathbb{R})$来表示。
%----------------------------------------------
% 图2.3
......@@ -114,9 +114,9 @@
%-------------------------------------------
\subsection{联合概率、条件概率和边缘概率}\index{Chapter2.2.2}
\parinterval \textbf{联合概率(joint probability)}是指多个事件同时发生,每个随机变量满足各自条件的概率,表示为$\textrm{P}(AB)$
\parinterval \textbf{联合概率}(joint probability)是指多个事件同时发生,每个随机变量满足各自条件的概率,表示为$\textrm{P}(AB)$
\parinterval \textbf{条件概率(conditional probability)}是指$A$$B$为任意的两个事件,在事件$A$已出现的前提下,事件$B$出现的概率,使用$\textrm{P}(B \mid A)$表示。通常来说,$\textrm{P}(B \mid A) \neq \textrm{P}(B)$
\parinterval \textbf{条件概率}(conditional probability)是指$A$$B$为任意的两个事件,在事件$A$已出现的前提下,事件$B$出现的概率,使用$\textrm{P}(B \mid A)$表示。通常来说,$\textrm{P}(B \mid A) \neq \textrm{P}(B)$
\parinterval 贝叶斯法则是条件概率计算时的重要依据,条件概率可以表示为
......@@ -127,7 +127,7 @@
\end{eqnarray}
%----------------------------------------------
\parinterval \textbf{边缘概率(marginal probability)}是和联合概率对应的,它指的是$\textrm{P}(X=a)$$\textrm{P}(Y=b)$,即仅与单个随机变量有关的概率称为边缘概率。
\parinterval \textbf{边缘概率}(marginal probability)是和联合概率对应的,它指的是$\textrm{P}(X=a)$$\textrm{P}(Y=b)$,即仅与单个随机变量有关的概率称为边缘概率。
\parinterval 对于离散随机变量$X$$Y$,我们知道$\textrm{P}(X,Y)$,则边缘概率$\textrm{P}(X)$可以通过求和的方式得到,如下式所示
\begin{eqnarray}
......@@ -245,7 +245,7 @@
\end{eqnarray}
%--------------------------------------------
\parinterval \textbf{贝叶斯法则(Bayes’ rule)}是概率论中的一个定理,通常用于知$\textrm{P}(A \mid B)$$\textrm{P}(B \mid A)$。其内容如下:
\parinterval \textbf{贝叶斯法则}(Bayes’ rule)是概率论中的一个定理,通常用于知$\textrm{P}(A \mid B)$$\textrm{P}(B \mid A)$。其内容如下:
%--------------------------------------------
\parinterval$B_1,…,B_n$是S的一个划分,A为事件,则对于$i=1,…,n$,有如下公式
......@@ -295,7 +295,7 @@
\subsubsection{(一)信息熵}\index{Chapter2.2.5.1}
\parinterval \textbf{(entropy)}是热力学中的一个概念,同时也是对系统无序性的一种度量标准,在自然语言处理领域也会使用到信息熵这一概念,比如描述文字的信息量大小。一条信息的信息量大小与它的不确定性有着直接的关系,如果我们需要确认一件非常不确定甚至于一无所知的事情,那么需要理解大量的相关信息才能确认清楚;同样的,如果我们对某件事已经非常确定,那么就不需要太多的信息就可以把它搞清楚。
\parinterval \textbf{}(entropy)是热力学中的一个概念,同时也是对系统无序性的一种度量标准,在自然语言处理领域也会使用到信息熵这一概念,比如描述文字的信息量大小。一条信息的信息量大小与它的不确定性有着直接的关系,如果我们需要确认一件非常不确定甚至于一无所知的事情,那么需要理解大量的相关信息才能确认清楚;同样的,如果我们对某件事已经非常确定,那么就不需要太多的信息就可以把它搞清楚。
\begin{example}
确定性和不确定性的事件
......@@ -364,7 +364,7 @@
\vspace{-1.0em}
\section{中文分词}\index{Chapter2.3}
\parinterval 对于机器翻译系统而言,输入的是已经切分好的单词序列,而不是原始的字符串。比如,对于一个中文句子,单词之间是没有间隔的,因此我们需要把一个个的单词切分出来,这样机器翻译系统可以区分不同单元。甚至,我们可以对语言学上的单词进行进一步切分,得到词片段序列(比如:中国人$\Rightarrow$中国 人)。我们可以把上述过程看作是一种\textbf{分词(segmentation)}过程,即:将一个输入的自然语言字符串切割成单元序列(token序列),每个单元都对应可以处理的最小单位。
\parinterval 对于机器翻译系统而言,输入的是已经切分好的单词序列,而不是原始的字符串。比如,对于一个中文句子,单词之间是没有间隔的,因此我们需要把一个个的单词切分出来,这样机器翻译系统可以区分不同单元。甚至,我们可以对语言学上的单词进行进一步切分,得到词片段序列(比如:中国人$\Rightarrow$中国 人)。我们可以把上述过程看作是一种\textbf{分词}(segmentation)过程,即:将一个输入的自然语言字符串切割成单元序列(token序列),每个单元都对应可以处理的最小单位。
%----------------------------------------------
% 图2.7
......@@ -471,11 +471,11 @@
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:word-segmentation-based-on-statistics} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为P(·)。模型通过在标注数据上的学习达到能够很好描述问题的状态。最后,对于新的未分词的句子,使用模型P(·)对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\parinterval\ref{fig:word-segmentation-based-on-statistics} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为$\textrm{P}(\cdot)$。模型通过在标注数据上的学习达到能够很好描述问题的状态。最后,对于新的未分词的句子,使用模型$\textrm{P}(\cdot)$对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\vspace{-0.5em}
\subsubsection{掷骰子游戏}\index{Chapter2.3.2.2}
\parinterval 上述过程的核心在于从数据中学习一种对分词现象的统计描述,即学习函数P(·)。如何让计算机利用分词好的数据学习到分词结果呢?可以先看一个有趣的实例,用我们生活中比较常见的掷骰子来说,掷一个骰子,玩家猜一个数字,猜中就算赢,按照一般的常识,随便选一个数字,获胜的概率是一样的,即我们所有选择的获胜概率仅是1/6。因此这个游戏玩家很难获胜,除非运气很好。假如,我们进行一次游戏,玩家随便选了一个数字,比如是1,投掷30骰子,得到命中7/30 > 1/6,还不错。
\parinterval 上述过程的核心在于从数据中学习一种对分词现象的统计描述,即学习函数$\textrm{P}(\cdot)$。如何让计算机利用分词好的数据学习到分词结果呢?可以先看一个有趣的实例,用我们生活中比较常见的掷骰子来说,掷一个骰子,玩家猜一个数字,猜中就算赢,按照一般的常识,随便选一个数字,获胜的概率是一样的,即我们所有选择的获胜概率仅是1/6。因此这个游戏玩家很难获胜,除非运气很好。假如,我们进行一次游戏,玩家随便选了一个数字,比如是1,投掷30骰子,得到命中7/30 > 1/6,还不错。
\vspace{-0.5em}
%----------------------------------------------
% 图2.11
......@@ -540,7 +540,7 @@
在这样的预先实验基础上,我们知道如果再次玩掷骰子游戏的话,选则数字``4''获胜的可能性是最大的。
\parinterval 通过上面这个掷骰子的游戏,可以得到一个道理:\textbf{上帝是不公平的}。因为在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种\textbf{偏置(bias)},也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。我们设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval 通过上面这个掷骰子的游戏,可以得到一个道理:\textbf{上帝是不公平的}。因为在``公平''的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的``不公平''实际上这是客观事物中蕴含的一种\textbf{偏置}(bias),也就是很多事情天然就有对某些情况有倾向。而图像处理、自然语言处理等问题绝大多数都存在着偏置。比如,我们翻译一个英文单词的时候,它最可能的翻译结果往往就是那几个词。我们设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\subsubsection{全概率分词方法}\index{Chapter2.3.2.3}
......@@ -633,9 +633,9 @@
\end{figure}
%-------------------------------------------
\parinterval 最后让我们再整体看一下分词系统的学习和使用过程。如图\ref {fig:examples-of-Chinese-word-segmentation-based-on-1-gram-model}所示,我们利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型P(·),给定任意分词结果$W=w_1 w_2…w_m$,都能通过$\textrm{P}(W)=\textrm{P}(w_1) \times \textrm{P}(w_2 ) \times\textrm{P}(w_m)$计算这种切分的概率值。
\parinterval 最后让我们再整体看一下分词系统的学习和使用过程。如图\ref {fig:examples-of-Chinese-word-segmentation-based-on-1-gram-model}所示,我们利用大量人工标注好的分词数据,通过统计学习方法获得一个统计模型$\textrm{P}(\cdot)$,给定任意分词结果$W=w_1 w_2…w_m$,都能通过$\textrm{P}(W)=\textrm{P}(w_1) \times \textrm{P}(w_2 ) \times\textrm{P}(w_m)$计算这种切分的概率值。
\parinterval 经过充分训练的统计模型P(·)就是我们得到分词模型。对于任意输入的新句子S,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子S是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是我们的目标输出。
\parinterval 经过充分训练的统计模型$\textrm{P}(\cdot)$就是我们得到分词模型。对于任意输入的新句子S,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子S是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是我们的目标输出。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词,使用标注好的分词数据进行学习,获得分词模型。这种方法最大的优点是整个学习过程(模型训练过程)和推导过程(处理新句子进行切分的过程)都是全自动进行的。虽然这种方法十分简单,但是其效率很高,因此被广泛使用在工业界系统里。
......@@ -649,7 +649,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{建模}\index{Chapter2.4.1}
\parinterval \textbf{语言模型(language model)}的目的是描述文字序列出现的规律。这个对问题建模的过程被称作\textbf{语言建模(language modeling)}。如果使用统计建模的方式,语言模型可以被定义为计算$\textrm{P}(w_1 w_2...w_m)$,也就是计算整个词序列$w_1 w_2...w_m$出现的可能性大小。具体定义如下,
\parinterval \textbf{语言模型}(language model)的目的是描述文字序列出现的规律。这个对问题建模的过程被称作\textbf{语言建模}(language modeling)。如果使用统计建模的方式,语言模型可以被定义为计算$\textrm{P}(w_1 w_2...w_m)$,也就是计算整个词序列$w_1 w_2...w_m$出现的可能性大小。具体定义如下,
%----------------------------------------------
% 定义3.1
......@@ -682,7 +682,7 @@
\label{tab:n-gram-model-of-different-n}
{\scriptsize
\begin{tabular}{l|l|l l|l}
\textbf{链式法则} & \textbf{1-gram} & \textbf{2-gram} & $...$ & \textbf{$n$-gram}\\
链式法则 & 1-gram & 2-gram & $...$ & $n$-gram\\
\hline
\rule{0pt}{10pt} $\textrm{P}(w_1 w_2...w_m)$ = & $\textrm{P}(w_1 w_2...w_m)$ = & $\textrm{P}(w_1 w_2...w_m)$ = & $...$ & $\textrm{P}(w_1 w_2...w_m)$ = \\
\rule{0pt}{10pt} $\textrm{P}(w_1)\times$ & $\textrm{P}(w_1)\times$ & $\textrm{P}(w_1)\times$ & $...$ & $\textrm{P}(w_1)\times$ \\
......@@ -732,7 +732,7 @@
\label{eqC2.31-new}
\end{eqnarray}
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,但是这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。更常见的问题是那些根本没有出现在词表中的词,称为\textbf{未登录词(Out-of-Vocabulary, OOV)},比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0概率。图\ref{fig:word-frequency-distribution}展示了词语出现频度的分布,可以看到绝大多数词都是低频词。
\parinterval 显然,这个结果是不能接受的。因为即使语料中没有 ``确实''和``现在''两个词连续出现,但是这种搭配也是客观存在的。这时简单的用极大似然估计得到概率却是0,导致整个切分结果的概率为0。更常见的问题是那些根本没有出现在词表中的词,称为\textbf{未登录词}(Out-of-Vocabulary, OOV),比如一些生僻词,可能模型训练阶段从来没有看到过,这时模型仍然会给出0概率。图\ref{fig:word-frequency-distribution}展示了词语出现频度的分布,可以看到绝大多数词都是低频词。
%----------------------------------------------
% 图2.18
......@@ -753,7 +753,7 @@
\parinterval 加法平滑方法可以说是简单的平滑技术,我们首先介绍这一方法,希望通过它了解平滑算法的思想。
\parinterval 通常情况下,我们会利用采集到的语料库来模拟现实生活中真实全部的语料库。但是采集总是不充分的,比如无法涵盖所有的词汇,直接依据这样语料所获得的统计信息计算现实中的语言概率就会产生偏差。假设依据某语料C(从未出现``确实 现在''二元语法),评估一个已经分好词的句子S =``确实 现在 物价 很 高''的概率,当计算``确实 现在''的概率时使得评估$\textrm{P}(S) = 0$。显然这个结果是不够准确的,根据我们的常识,句子$S$是有出现的可能性的,这样句子的概率值不应该是0。
\parinterval 通常情况下,我们会利用采集到的语料库来模拟现实生活中真实全部的语料库。但是采集总是不充分的,比如无法涵盖所有的词汇,直接依据这样语料所获得的统计信息计算现实中的语言概率就会产生偏差。假设依据某语料$C$(从未出现``确实 现在''二元语法),评估一个已经分好词的句子$S$ =``确实 现在 物价 很 高''的概率,当计算``确实 现在''的概率时使得评估$\textrm{P}(S) = 0$。显然这个结果是不够准确的,根据我们的常识,句子$S$是有出现的可能性的,这样句子的概率值不应该是0。
\begin{eqnarray}
\textrm{P}(\textrm{现在}|\textrm{确实}) & = & \frac{\textrm{count}(\textrm{确实}\,\textrm{现在})}{\textrm{count}(\textrm{确实})} \nonumber \\
& = & \frac{0}{\textrm{count}(\textrm{确实})} \nonumber \\
......@@ -827,7 +827,7 @@ N & = & \sum_{r>0}{p_r n_r} \nonumber \\
\label{tab:results-of-en-vocabulary-extraction}
{
\begin{tabular}{l|lll}
\rule{0pt}{10pt} \textbf{$r$} & \textbf{$n_r$} & \textbf{$n^*$} & \textbf{$p_r$}\\ \hline
\rule{0pt}{10pt} $r$ & $n_r$ & $n^*$ & $p_r$\\ \hline
\rule{0pt}{10pt} 0 & 14 & 0.21 & 0.018 \\
\rule{0pt}{10pt} 1 & 3 & 0.67 & 0.056 \\
\rule{0pt}{10pt} 2 & 1 & 3 & 0.25 \\
......@@ -898,9 +898,9 @@ N & = & \sum_{r>0}{p_r n_r} \nonumber \\
\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{eqC2.44-new} \\
c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\ highest\ order \\ \textrm{continuationcount}(\cdot)\quad for\ lower\ order \end{cases} \label{eqC2.45-new}
c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad \textrm{for\ highest\ order} \\ \textrm{catcount}(\cdot)\quad \textrm{for\ lower\ order} \end{cases} \label{eqC2.45-new}
\end{eqnarray}
\noindent 其中continuationcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$元语法的种类数目。
\noindent 其中catcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$-gram的种类数目。
\parinterval 我们前面提到Kneser-Ney Smoothing 是当前一个标准的、广泛采用的、先进的平滑算法。还有很多基于此为基础衍生出来的算法,有兴趣的读者可以查找更多资料了解。\cite{parsing2009speech}\cite{ney1994structuring}\cite{chen1999empirical}
......@@ -912,7 +912,7 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{句子的句法树表示}\index{Chapter2.5.1}
\parinterval \textbf{句法(syntax)}是研究句子的每个组成部分和它们之间的组合方式。一般来说,句法和语言是相关的,比如,英文是主谓宾结构,而日语是主宾谓结构。因此不同的语言也会有不同的句法描述方式。这里我们将介绍自然语言处理领域最常用的两种句法分析形式 – \textbf{短语结构分析(phrase structure parsing)}\textbf{依存分析(dependency parsing)}。它们在汉语、英语等多种语言的处理中都有广泛应用。
\parinterval \textbf{句法}(syntax)是研究句子的每个组成部分和它们之间的组合方式。一般来说,句法和语言是相关的,比如,英文是主谓宾结构,而日语是主宾谓结构。因此不同的语言也会有不同的句法描述方式。这里我们将介绍自然语言处理领域最常用的两种句法分析形式 – \textbf{短语结构分析}(phrase structure parsing)和\textbf{依存分析}(dependency parsing)。它们在汉语、英语等多种语言的处理中都有广泛应用。
\parinterval\ref{fig:phrase-structure-tree-and-dependency-tree}展示了这两种的句法表示形式的实例。其中,左侧是短语结构树。它描述的是短语的结构功能,比如``吃''是动词(记为VV),``鱼''是名词(记为NN),``吃鱼''组成动词短语,这个短语再与``喜欢''这一动词组成新的动词短语。每个子树都是一个句法功能单元,比如,VP(VV(吃) NN(鱼))这个子树就表示了``吃鱼''这个动词短语的结构,其中子树根节点VP是句法功能标记。短语结构树利用嵌套和递归的方式描述了语言学的功能。短语结构树中,每个词都有词性(或词类),不同的词或者短语可以组成名动结构、动宾结构等语言学短语结构。短语结构分析一般也被称为成分分析(constituency parsing),也被称作完全分析(full parsing)。
......@@ -1008,7 +1008,7 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad for\ the\
\parinterval 上面这个文法蕴含了不同``层次''的句法信息。比如,规则$r_1$$r_2$$r_3$$r_4$表达了词性对单词的抽象;规则$r_6$$r_7$$r_8$是表达了短语结构的抽象,其中,规则$r_8$表达了$\textrm{NP}+\textrm{VP}$描述了汉语中名词短语(主语)+动词短语(谓语)的结构。在实际应用中,像$r_8$这样的规则可以覆盖很大的片段(试想一下一个包含50个词的主谓结构的句子,都可以使用进行$r_8$描述)。
\parinterval 下文无关文法的规则是一种\textbf{产生式规则(production rule)},形如$\alpha \to \beta $,它表示把规则左端的非终结符$\alpha$替换为规则右端的符号序列$\beta$。通常,$\alpha$被称作规则的左部(left-hand side),$\beta$被称作规则的右部(right-hand side)。使用右边$\beta$替换左部$\alpha$的过程也被称作规则的使用,而这个过程的逆过程称为规约。规则的使用可以如下定义:
\parinterval 下文无关文法的规则是一种\textbf{产生式规则}(production rule),形如$\alpha \to \beta $,它表示把规则左端的非终结符$\alpha$替换为规则右端的符号序列$\beta$。通常,$\alpha$被称作规则的左部(left-hand side),$\beta$被称作规则的右部(right-hand side)。使用右边$\beta$替换左部$\alpha$的过程也被称作规则的使用,而这个过程的逆过程称为规约。规则的使用可以如下定义:
\vspace{0.5em}
%-------------------------------------------
......
......@@ -5,8 +5,8 @@
width=6cm, height=4.5cm,
xtick={-5,-2.5,...,6},
ytick={0,0.5,1.0},
xlabel={\textbf{x}},
ylabel={\textbf{y}},
xlabel={$x$},
ylabel={$y$},
xlabel style={xshift=2.4cm,yshift=0.7cm},
axis y line=middle,%y轴居中
ylabel style={xshift=0.1cm,yshift=0cm},
......@@ -17,7 +17,7 @@
xmax=6,
ymin=0,
ymax=1.4]
\addplot[draw=red,thick]{1/(1 + exp( -x))};
\addplot[draw=red,very thick]{1/(1 + exp( -x))};
\end{axis}
\node [anchor=north] (labelc) at (2.3,-0.5) {\footnotesize{(a)}};
\begin{axis}[
......@@ -28,8 +28,8 @@
width=6cm, height=4.5cm,
xtick={-4,-2,...,4},
ytick={0,0.1,0.2},
xlabel={\textbf{x}},
ylabel={\textbf{y}},
xlabel={$x$},
ylabel={$y$},
xlabel style={xshift=2.4cm,yshift=0.7cm},
axis y line=middle,%y轴居中
ylabel style={xshift=0.1cm,yshift=0cm},
......@@ -40,7 +40,7 @@
xmax=6,
ymin=0,
ymax=0.3]
\addplot[draw=ublue,thick]{(1/(1 + exp( -x)))*(1-(1/(1 + exp( -x))))};
\addplot[draw=ublue,very thick]{(1/(1 + exp( -x)))*(1-(1/(1 + exp( -x))))};
\end{axis}
\node [anchor=north] (labelc) at (8.2,-0.5) {\footnotesize{(b)}};
\end{tikzpicture}
......
......@@ -5,8 +5,8 @@
width=6cm, height=4.5cm,
xtick={-5,-2.5,...,6},
ytick={-1.0,-0.5,0,0.5,1.0},
xlabel={\textbf{x}},
ylabel={\textbf{y}},
xlabel={$x$},
ylabel={$y$},
xlabel style={xshift=2.4cm,yshift=2.5cm},
axis y line=middle,%y轴居中
ylabel style={xshift=0.1cm,yshift=0cm},
......@@ -17,7 +17,7 @@
xmax=6,
ymin=-1.2,
ymax=1.2]
\addplot[draw=red,thick]{tanh(x)};
\addplot[draw=red,very thick]{tanh(x)};
\end{axis}
\node [anchor=north] (labelc) at (2.3,-0.5) {\footnotesize{(a)}};
\begin{axis}[
......@@ -28,8 +28,8 @@
width=6cm, height=4.5cm,
xtick={-10,-5,...,10},
ytick={0,0.5,1},
xlabel={\textbf{x}},
ylabel={\textbf{y}},
xlabel={$x$},
ylabel={$y$},
xlabel style={xshift=2.4cm,yshift=0.7cm},
axis y line=middle,%y轴居中
ylabel style={xshift=0.1cm,yshift=0cm},
......@@ -40,7 +40,7 @@
xmax=10,
ymin=0,
ymax=1.2]
\addplot[draw=ublue,thick]{1-tanh(x)*tanh(x)};
\addplot[draw=ublue,very thick]{1-tanh(x)*tanh(x)};
\end{axis}
\node [anchor=north] (labelc) at (8.2,-0.5) {\footnotesize{(b)}};
\end{tikzpicture}
......
......@@ -5,8 +5,8 @@
width=6cm, height=4.5cm,
xtick={-1.0,-0.5,...,1.0},
ytick={0.5,1.0},
xlabel={\textbf{x}},
ylabel={\textbf{y}},
xlabel={$x$},
ylabel={$y$},
xlabel style={xshift=2.4cm,yshift=0.7cm},
axis y line=middle,%y轴居中
ylabel style={xshift=0.1cm,yshift=0cm},
......@@ -17,8 +17,8 @@
xmax=1.2,
ymin=0,
ymax=1.2]
\addplot[domain=-1:0,draw=red,thick]{0};
\addplot[domain=0:1,draw=red,thick]{x};
\addplot[domain=-1:0,draw=red,very thick]{0};
\addplot[domain=0:1,draw=red,very thick]{x};
\end{axis}
\node [anchor=north] (labelc) at (2.3,-0.5) {\footnotesize{(a)}};
\begin{axis}[
......@@ -29,8 +29,8 @@
width=6cm, height=4.5cm,
xtick={-4,-2,...,4},
ytick={0,0.2,...,1.0},
xlabel={\textbf{x}},
ylabel={\textbf{y}},
xlabel={$x$},
ylabel={$y$},
xlabel style={xshift=2.4cm,yshift=0.7cm},
axis y line=middle,%y轴居中
ylabel style={xshift=0.1cm,yshift=0cm},
......@@ -41,8 +41,8 @@
xmax=5,
ymin=0,
ymax=1.2]
\addplot[domain=-4:0,draw=ublue,thick]{0};
\addplot[domain=0:4,draw=ublue,thick]{1};
\addplot[domain=-4:0,draw=ublue,very thick]{0};
\addplot[domain=0:4,draw=ublue,very thick]{1};
\end{axis}
\node [anchor=north] (labelc) at (8.2,-0.5) {\footnotesize{(b)}};
\end{tikzpicture}
......
......@@ -32,7 +32,7 @@
\parinterval 最初,神经网络设计的初衷是用计算模型来模拟生物大脑中神经元的运行机理,这种想法哪怕在现在看来也是十分超前的,甚至仍然影响着目前很多的研究方向。例如,目前很多机构关注的概念\raisebox{0.5mm}{------}``类脑计算''就是希望研究人脑的运行机制及相关的计算机实现方法。然而模拟大脑这件事并没有想象中的那么简单,众所周知,生物学中对人脑机制的研究是十分困难的,人们对人脑的运行机制尚不明确又何谈模拟呢?因而,神经网络技术的发展一直是在几乎没有任何参照的情况下摸索着进行的,神经网络发展到现在,其计算过程与人脑的运行机制已经大相径庭。
\parinterval 人工神经网络的第一个发展阶段是在二十世纪40年代到70年代,这个时期的人工神经网络还停留在利用线性模型模拟生物神经元的阶段,比如使用线性加权函数来描述输入$ \mathbf x $和输出$ y $之间的联系:$ f(\mathbf x,\mathbf w)=x_1 \cdot w_1 + \dots + x_n \cdot w_n $,举一个简单例子,输入$ \mathbf x $是这个地区的坐标和时间,输出$ y $是这个地区的温度,尽管真实的问题可能要复杂的多,但是线性模型确实有能力去拟合简单的函数关系。
\parinterval 人工神经网络的第一个发展阶段是在二十世纪40年代到70年代,这个时期的人工神经网络还停留在利用线性模型模拟生物神经元的阶段,比如使用线性加权函数来描述输入$ \mathbf x $和输出$ y $ 之间的联系:$ f(\mathbf x,\mathbf w)=x_1 \cdot w_1 + \dots + x_n \cdot w_n $,举一个简单例子,输入$ \mathbf x $是这个地区的坐标和时间,输出$ y $是这个地区的温度,尽管真实的问题可能要复杂的多,但是线性模型确实有能力去拟合简单的函数关系。
\parinterval 这种线性模型在现在看来可能比较``简陋'',但是这类模型对后来的随机下降等经典方法产生了深远影响。不过,显而易见的是,这种结构也存在着非常明显的缺陷,单层结构限制了它的学习能力,使它无法描述非线性问题,如著名的异或函数(XOR)学习问题,然而非线性才是现实世界的普遍特征,第一代人工神经网络对现实世界中的大部分事物规律都无法准确描述。此后,神经网络的研究陷入了很长一段时间的低迷期。
%--5.1.1.2神经网络的第二次高潮和第二次寒冬---------------------
......@@ -163,10 +163,10 @@
\parinterval \textbf{向量}(Vector):向量是由一组实数组成的有序数组。与标量不同,向量既有大小也有方向。我们可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标。公式\ref{eqa1.1}和公式\ref{eqa1.2}展示了一个行向量和一个列向量。本章默认使用行向量,如$ \mathbf a=(a_1, a_2, a_3) $$ \mathbf a $对应的列向量记为$ \mathbf a^{\rm T} $
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf x &=& \begin{pmatrix}
\mathbf a &=& \begin{pmatrix}
1 & 2 & 5 & 7
\end{pmatrix}\label{eqa1.1}\\
\mathbf x &=& \begin{pmatrix}
\mathbf{a^{\textrm{T}}} &=& \begin{pmatrix}
&1& \\
&2&\\
&5& \\
......@@ -177,7 +177,7 @@
\parinterval \textbf{矩阵}(Matrix):在数学中,矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$ \mathbf a $表示一个矩阵,如果该矩阵有$ m $$ n $列,那么我们说$ \mathbf a\in R^{m\times n} $。我们通常用不加粗的形式来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引。例如,$ a_{ij} $表示第$ i $行、第$ j $列的矩阵元素。如下,$ \mathbf a $就定义了一个2行2列的矩阵。
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf a = \begin{pmatrix}
\mathbf a = \begin{pmatrix}
a_{11} & a_{12}\\
a_{21} & a_{22}
\end{pmatrix} = \begin{pmatrix}
......@@ -192,9 +192,8 @@
\parinterval \textbf{转置}(transpose)是矩阵的重要操作之一。矩阵的转置可以看作是将矩阵以对角线为镜像进行翻转:假设$ \mathbf a $$ m $$ n $列的矩阵,第$ i $行第$ j $列的元素是$ a_{ij} $,即:$ \mathbf a={(a_{ij})}_{m\times n} $,把$ m\times n $矩阵$ \mathbf a $的行换成同序数的列得到一个$ n\times m $矩阵,则得到$ \mathbf a $的转置矩阵,记为$ \mathbf a^{\rm T} $,其中$ a_{ji}^{\rm T}=a_{ij} $。例如:
\begin{eqnarray}
\mathbf a = \begin{pmatrix} 1 & 3 & 2 & 6\\5 & 4 & 8 & 2\end{pmatrix} \qquad
{\mathbf a}^{\rm T} = \begin{pmatrix} 1 & 5\\3 & 4\\2 & 8\\6 & 2\end{pmatrix}
\label{}
\mathbf a & = & \begin{pmatrix} 1 & 3 & 2 & 6\\5 & 4 & 8 & 2\end{pmatrix} \\
{\mathbf a}^{\rm T} & = &\begin{pmatrix} 1 & 5\\3 & 4\\2 & 8\\6 & 2\end{pmatrix}
\end{eqnarray}
\parinterval 向量可以看作只有一行(列)的矩阵。对应地,向量的转置可以看作是只有一列(行)的矩阵。标量可以看作是只有一个元素的矩阵。因此,标量的转置等于它本身,即$ a^{\rm T}=a $
%--5.2.1.3矩阵加法和数乘---------------------
......@@ -233,19 +232,17 @@
\parinterval (4)$ \mathbf a+(-\mathbf a)=\mathbf 0 $,其中$ -\mathbf a $是矩阵$ \mathbf a $的负矩阵,即将矩阵$ \mathbf a $的每个元素取负得到的矩阵。
\parinterval 矩阵的数乘是指标量(实数)与矩阵的乘法运算,计算过程是将标量与矩阵的每个元素相乘,最终的到与原矩阵形状相同的矩阵。例如,矩阵$ \mathbf a={(a_{ij})}_{m\times n} $与标量$ k $进行数乘运算,其结果矩阵$ \mathbf b={(ka_{ij})}_{m\times n} $,即$ k{(a_{ij})}_{m\times n}={(ka_{ij})}_{m\times n} $公式\ref{eqa1.5}展示了矩阵数乘的计算过程。
\parinterval 矩阵的数乘是指标量(实数)与矩阵的乘法运算,计算过程是将标量与矩阵的每个元素相乘,最终的到与原矩阵形状相同的矩阵。例如,矩阵$ \mathbf a={(a_{ij})}_{m\times n} $与标量$ k $进行数乘运算,其结果矩阵$ \mathbf b={(ka_{ij})}_{m\times n} $,即$ k{(a_{ij})}_{m\times n}={(ka_{ij})}_{m\times n} $下面的式子展示了矩阵数乘的计算过程。
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf a=
\mathbf a & = &
\begin{pmatrix}
3 & 2 & 7\\
5 & 8 & 1
\end{pmatrix}\qquad
2\mathbf a=2\times
\end{pmatrix}
\\
2\mathbf a & = &
\begin{pmatrix}
3 & 2 & 7\\
5 & 8 & 1
\end{pmatrix}=\begin{pmatrix}
6 & 4 & 14\\
10 & 16 & 2
\end{pmatrix}
......@@ -259,13 +256,14 @@
\parinterval (2)左分配律:$ (k+l)\mathbf a=k\mathbf a+l\mathbf a $
\parinterval (3)结合律:$ (kl)\mathbf a=k(l\mathbf a) $
%--5.2.1.4矩阵乘法和矩阵点乘---------------------
\subsubsection{(四)矩阵乘法和矩阵点乘}\index{Chapter5.2.1.4}
\parinterval 矩阵乘法是矩阵运算中最重要的操作之一,为了与矩阵点乘区分,我们通常也把矩阵乘法叫做矩阵的叉乘。假设$ \mathbf a $$ m\times p $的矩阵,$ \mathbf b $$ p\times n $的矩阵,对$ \mathbf a $$ \mathbf b $作矩阵乘积的结果是一个$ m\times n $的矩阵$ \mathbf c $,其中矩阵$ \mathbf c $中第$ i $行、第$ j $列的元素可以表示为:
%公式--------------------------------------------------------------------
\begin{eqnarray}
{(\mathbf a\mathbf b)}_{ij} = \prod_{k=1}^p a_{ik}b_{kj}
{(\mathbf a\mathbf b)}_{ij} = \prod_{k=1}^p a_{ik}b_{kj}
\label{eqa1.6}
\end{eqnarray}
%公式--------------------------------------------------------------------
......@@ -288,22 +286,24 @@
\parinterval (3)右分配律:若$ \mathbf a\in R^{m\times n} $$ \mathbf b\in R^{n\times p} $$ \mathbf c\in R^{n\times p} $,则$ \mathbf a(\mathbf b+\mathbf c)\mathbf c=\mathbf {ab}+\mathbf {ac} $
\begin{spacing}{1.4}
\parinterval 可以将线性方程组用矩阵乘法表示,如对于线性方程组$ \begin{cases} 5x_1+2x_2=y_1\\3x_1+x_2=y_2\end{cases} $,可以表示为$ \mathbf {ax}^{\rm T}=\mathbf y^{\rm T}$,其中$ \mathbf a = \begin{pmatrix} 5 & 2\\3 & 1\end{pmatrix} $$ \mathbf x^{\rm T} = \begin{pmatrix} x_1\\x_2\end{pmatrix} $$ \mathbf y^{\rm T} = \begin{pmatrix} y_1\\y_2\end{pmatrix} $
\end{spacing}
\end{spacing}
\parinterval 矩阵的点乘就是两个形状相同的矩阵各个对应元素相乘,矩阵点乘也被称为也被称为按元素乘积(element-wise product)或Hadamard乘积,记为$ \mathbf a \odot \mathbf b$。矩阵点乘的计算过程如公式\ref{eqa1.8}所示:
\parinterval 矩阵的点乘就是两个形状相同的矩阵各个对应元素相乘,矩阵点乘也被称为也被称为按元素乘积(element-wise product)或Hadamard乘积,记为$ \mathbf a \odot \mathbf b$。矩阵点乘的计算过程如所示:
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf a=
\mathbf a &=&
\begin{pmatrix}
1 & 0\\
-1 & 3
\end{pmatrix}\qquad
\mathbf b=
\end{pmatrix}
\\
\mathbf b &=&
\begin{pmatrix}
3 & 1\\
2 & 1
\end{pmatrix}\qquad
\mathbf c=\mathbf a\odot \mathbf b=\begin{pmatrix}
\end{pmatrix}
\\
\mathbf c& = &\mathbf a\odot \mathbf b=\begin{pmatrix}
1\times 3 & 0\times1\\
-1\times2 & 3\times1
\end{pmatrix}
......@@ -701,7 +701,7 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2=0\cdot 1+0\cdot 1+1\cdot 1=1
\parinterval 众所周知,单层神经网络无法解决线性不可分问题,比如经典的异或问题。但是具有一个隐藏层的两层神经网络在理论上就可以拟合所有的函数了。有些神奇?接下来我们分析一下为什么仅仅是多了一层,神经网络就能变得如此强大。在此之前,需要明确的一点是,``拟合''是把平面上一系列的点,用一条光滑的曲线连接起来,并用函数来表示这条拟合的曲线。在用神经网络解决问题时,我们是通过拟合训练数据中的``数据点''来获得输入与输出之间的函数关系,并利用其对未知数据做出判断。我们可以认为输入与输出之间存在一种函数关系,而神经网络的``拟合''能力并不是可以完全准确的计算某输入对应的原函数输出值,而是尽可能地逼近原函数输出值,与原函数输出值越逼近,则意味着拟合得越优秀。
\parinterval 如图\ref{fig:two-layer-neural-network}是一个以sigmoid作为隐藏层激活函数的两层神经网络。通过调整参数$ \mathbf w=(w_1,w_2) $$ \mathbf b=(b_1,b_2) $$ \mathbf w’=(w’_0,w’_1) $的值,我们可以不断地改变目标函数的形状。
\parinterval 如图\ref{fig:two-layer-neural-network}是一个以sigmoid作为隐藏层激活函数的两层神经网络。通过调整参数$ \mathbf w=(w_1,w_2) $$ \mathbf b=(b_1,b_2) $$ \mathbf w’=(w’_0,w’_1) $ 的值,我们可以不断地改变目标函数的形状。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -804,7 +804,7 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2=0\cdot 1+0\cdot 1+1\cdot 1=1
%--5.3.1.1张量---------------------
\subsubsection{(一)张量}\index{Chapter5.3.1.1}
\parinterval 对于神经网络中的某层神经元$ \mathbf y=f(\mathbf x\cdot \mathbf w+\mathbf b) $,其中$ \mathbf w $是权重矩阵,例如$ \begin{pmatrix} 1 & 2\\ 3 & 4\end{pmatrix} $\\$ \mathbf b $是偏移向量,例如$ (1,3) $。在这里,输入$ \mathbf x $和输出$ \mathbf y $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\raisebox{0.5mm}{------}张量,比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\parinterval 对于神经网络中的某层神经元$ \mathbf y=f(\mathbf x\cdot \mathbf w+\mathbf b) $,其中$ \mathbf w $是权重矩阵,例如$ \begin{pmatrix} 1 & 2\\ 3 & 4\end{pmatrix} $\\$ \mathbf b $ 是偏移向量,例如$ (1,3) $。在这里,输入$ \mathbf x $和输出$ \mathbf y $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\raisebox{0.5mm}{------}张量,比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf x=\begin{pmatrix} -1 & 3\end{pmatrix}\qquad
......@@ -830,7 +830,7 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2=0\cdot 1+0\cdot 1+1\cdot 1=1
\parinterval 张量的严格定义是利用线性映射来描述的。与矢量相类似,定义由若干坐标系改变时满足一定坐标转化关系的有序数组成的集合为张量。从几何角度讲,它是一个真正的几何量,也就是说,它是不随参照系的坐标变换而变化的,是若干向量和协向量通过张量乘法定义的量。
\parinterval 不过,更广泛接受的定义是:张量是多重线性函数,是定义在一些向量空间和笛卡尔积上的多重线性映射。张量的多重线性表现在,对于每一个输入函数都是线性的。比如,张量$ \mathbf T(v_0,v_1,\dots,v_r) $,其输入是r个向量$ \{v_0,v_1,\dots,v_r\} $,对于张量$ \mathbf T $的任意一个$ v_i $,都有$ \mathbf T(v_0,\dots,v_i+c\cdot u,\dots,v_r)=\mathbf T(v_0,\dots,v_i,\dots,v_r)+c\cdot{\mathbf T(v_0,\dots,u,\dots,v_r)} $。其中,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\parinterval 不过,更广泛接受的定义是:张量是多重线性函数,是定义在一些向量空间和笛卡尔积上的多重线性映射。张量的多重线性表现在,对于每一个输入函数都是线性的。比如,张量$ \mathbf T(v_0,v_1,\dots,v_r) $,其输入是$r$个向量$ \{v_0,v_1,\dots,v_r\} $,对于张量$ \mathbf T $的任意一个$ v_i $,都有$ \mathbf T(v_0,\dots,v_i+c\cdot u,\dots,v_r)=\mathbf T(v_0,\dots,v_i,\dots,v_r)+c\cdot{\mathbf T(v_0,\dots,u,\dots,v_r)} $。其中,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\parinterval 从我们物理世界看,如果一个物理量在物体的某个位置上只是一个单值,那么它是一个标量,例如密度;如果一个物理量在同一个位置、从多个方向上看,有不同的值,那么这个物理量就是一个的张量。比如物理学中常用的应力的描述就是一个典型的张量。举一个简单的例子:$ \mathbf T(\mathbf v,\mathbf u) $是一个三维空间(x,y,z)上的2阶张量,其中$ \mathbf v $$ \mathbf u $是两个向量,如图\ref{fig:tensor}所示,向量$ \mathbf v $在某个两两垂直的三维坐标系中可以表示为$ {(\begin{array}{ccc} a & b & c\end{array})}^{\rm T} $,同理向量$ \mathbf u $在某个两两垂直的三维坐标系中可以表示为$ {(\begin{array}{ccc} a' & b' & c' \end{array})}^{\rm T} $。但在三维空间(x,y,z)中,向量$ \mathbf v $和向量$ \mathbf u $分别被表示为$ {(\begin{array}{ccc} v_x & v_y & v_z\end{array})}^{\rm T} $$ {(\begin{array}{ccc} u_x & u_y & u_z\end{array})}^{\rm T} $
%----------------------------------------------
......@@ -861,7 +861,7 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2=0\cdot 1+0\cdot 1+1\cdot 1=1
\parinterval 对于一层神经网络,$ \mathbf y=f(\mathbf x\cdot \mathbf w+\mathbf b) $中的$ \mathbf x\cdot \mathbf w $表示对输入$ \mathbf x $进行线性变换,其中$ \mathbf x $是输入张量,$ \mathbf w $是权重矩阵。$ \mathbf x\cdot \mathbf w $表示的是矩阵乘法,需要注意的是这里是矩阵乘法而不是张量乘法。
\parinterval 张量乘以矩阵是怎样计算呢?我们可以先回忆一下5.2.1节的线性代数的知识。假设$ \mathbf a $$ m\times p $的矩阵,$ \mathbf b $$ p\times n $的矩阵,对$ \mathbf a $$ \mathbf b $作矩阵乘积的结果是一个$ m\times n $的矩阵$ \mathbf c $,其中矩阵$ \mathbf c $中第$ i $行第$ j $列的元素可以表示为:
\parinterval 张量乘以矩阵是怎样计算呢?我们可以先回忆一下5.2.1节的线性代数的知识。假设$ \mathbf a $$ m\times p $的矩阵,$ \mathbf b $$ p\times n $的矩阵,对$ \mathbf a $$ \mathbf b $ 作矩阵乘积的结果是一个$ m\times n $的矩阵$ \mathbf c $,其中矩阵$ \mathbf c $中第$ i $行第$ j $列的元素可以表示为:
%公式--------------------------------------------------------------------
\begin{eqnarray}
{(\mathbf a\mathbf b)}_{ij}=\sum_{k=1}^{p}{a_{ik}b_{kj}}
......@@ -950,7 +950,7 @@ f(x)=\begin{cases} 0 & x\leqslant0 \\x & x>0\end{cases}
%-------------------------------------------
\parinterval 高阶张量的物理存储方式与多维数组在C++、Python中的物理存储方式相同。
%--5.3.3 使用开源框架实现张量计算---以NiuTensor为例---------------------
\subsection{使用开源框架实现张量计算\raisebox{0.5mm}{------}以NiuTensor为例}\index{Chapter5.3.3}
\subsection{使用开源框架实现张量计算}\index{Chapter5.3.3}
\parinterval 实现神经网络的开源系统有很多,比如,一个简单好用的Python工具包\raisebox{0.5mm}{------}Num\\-py(https://numpy.org/)。Numpy提供了张量表示和使用的范式,可以很方便地定义、使用多维数组。
......@@ -1288,7 +1288,7 @@ J(\mathbf w)=L(\mathbf x_i,\mathbf {\widetilde y}_i;\mathbf w)
\noindent \textbf{c)小批量梯度下降(Mini-Batch Gradient Descent)}
\vspace{0.5em}
\parinterval 为了综合批量梯度下降和随机梯度下降的优缺点,在实际应用中一般采用这两个算法的折中\raisebox{0.5mm}{------}小批量梯度下降。其思想是:每次迭代计算一小部分训练数据的损失函数,并对参数进行更新。这一小部分数据被称为一个批次(mini-batch或者batch)。小批量梯度下降的参数优化的目标函数如下:
\parinterval 为了综合批量梯度下降和随机梯度下降的优缺点,在实际应用中一般采用这两个算法的折中\raisebox{0.5mm}{------}小批量梯度下降。其思想是:每次迭代计算一小部分训练数据的损失函数,并对参数进行更新。这一小部分数据被称为一个批次(mini-batch或者batch)。小批量梯度下降的参数优化的目标函数如下:
%公式--------------------------------------------------------------------
\begin{eqnarray}
J(\mathbf w)=\frac{1}{m}\sum_{j=i}^{j+m-1}{L(\mathbf x_i,\mathbf {\widetilde y}_i;\mathbf w)}
......@@ -1341,11 +1341,11 @@ J(\mathbf w)=\frac{1}{m}\sum_{j=i}^{j+m-1}{L(\mathbf x_i,\mathbf {\widetilde y}_
\begin{tabular}{l | l l}
\rule{0pt}{18pt} \textbf{函数} & \textbf{微分表达式} & \textbf{化简的微分表达式} \\
\hline
\rule{0pt}{18pt} $x$ & $1$ & $1$ \\
\rule{0pt}{18pt} $x\cdot(x+1)$ & $(x+1)+x$ & $2x + 1$ \\
\rule{0pt}{18pt} $x$ & $1$ & $1$ \\
\rule{0pt}{18pt} $x\cdot(x+1)$ & $(x+1)+x$ & $2x + 1$ \\
\rule{0pt}{18pt} $x\cdot(x+1)\cdot$ & $(x+1)\cdot(x^2+x+1)$ & $4x^3+6x^2$ \\
$(x^2+x+1)$ & $+x\cdot(x^2+x+1)$ & $+4x+1$ \\
& $+x\cdot(x+1)\cdot(2x+1)$ & \\
& $+x\cdot(x+1)\cdot(2x+1)$ & \\
\rule{0pt}{18pt} $(x^2+x)\cdot$ & $(2x+1)\cdot(x^2+x+1)\cdot$ & $8x^7+28x^6$ \\
$(x^2+x+1)\cdot$ & $(x^4+2x^3+2x^2+x+1)$ & $+48x^5+50x^4$ \\
$(x^4+2x^3$ & $+(2x+1)\cdot(x^2+x)\cdot$ & $+36x^3+18x^2$ \\
......@@ -1401,7 +1401,7 @@ $+2x^2+x+1)$ & \ \ $(x^4+2x^3+2x^2+x+1)$ & $+6x+1$ \\
\parinterval 参数优化通常基于梯度下降算法,即在每个更新步骤$ t $,沿梯度方向更新参数:
\begin{eqnarray}
\mathbf w_{t+1}=\mathbf w_{t}-\alpha \cdot \frac{\partial J(\mathbf w_t)}{\partial \mathbf w_t}
\mathbf w_{t+1}=\mathbf w_{t}-\alpha \cdot \frac{\partial J(\mathbf w_t)}{\partial \mathbf w_t}
\label{}
\end{eqnarray}
\noindent 其中$ \alpha $是一个参数,表示更新步幅的大小,称作学习率(learning rate)。当然,这是一种最基本的梯度下降方法。如果函数的形状非均向,比如呈延伸状,搜索最优点的路径就会非常低效,因为这时梯度的方向并没有指向最小值的方向,并且随着参数的更新,梯度方向往往呈锯齿状,这将是一条相当低效的路径;此外这种梯度下降算法并不是总能到达最优点,而是在其附近徘徊;还有一个最令人苦恼的问题\raisebox{0.5mm}{------}设置学习率,如果学习率设置的比较小,会导致训练收敛速度慢,如果学习率设置的比较大,会导致训练过程中因为优化幅度过大而频频跳过最优点。我们希 望网络在优化的时候损失函数有一个很好的收敛速度同时又不至于摆动幅度太大。
......@@ -1410,7 +1410,7 @@ $+2x^2+x+1)$ & \ \ $(x^4+2x^3+2x^2+x+1)$ & $+6x+1$ \\
%--Momentum---------------------
\vspace{0.5em}
\noindent \textbf{a)Momentum }
\noindent \textbf{Momentum }
\vspace{0.5em}
\parinterval Momentum梯度下降算法的参数更新公式如下在\footnote{在梯度下降算法的几种改进方法的公式中,其更新对象是某个具体参数而非参数矩阵,因此不再使用加粗样式}
......@@ -1435,7 +1435,7 @@ w_{t+1}&=&w_t-\alpha v_t
%-------------------------------------------
%--AdaGrad---------------------
\noindent \textbf{b)AdaGrad }
\noindent \textbf{AdaGrad }
\vspace{0.5em}
\parinterval 在神经网络的学习中,学习率的设置很重要。学习率过小, 会导致学习花费过多时间;反过来,学习率过大,则会导致学习发散,甚至造成模型的``跑偏''。在深度学习实现过程中,有一种被称为学习率衰减(learning rate decay)的方法,即最初设置较大的学习率,随着学习的进行,使学习率逐渐减小,这种方法相当于将``全体''参数的学习率值一起降低。AdaGrad梯度下降算法进一步发展了这个思想\cite{duchi2011adaptive}
......@@ -1452,7 +1452,7 @@ w_{t+1}&=&w_t-\eta \frac{1}{\sqrt{z_t}}\cdot \frac{\partial L}{\partial w_t}
%--RMSprop ---------------------
\vspace{0.5em}
\noindent \textbf{c)RMSprop }
\noindent \textbf{RMSprop }
\vspace{0.5em}
\parinterval RMSprop算法是一种自适应学习率的方法\cite{tieleman2012rmsprop},它是对AdaGrad算法的一种改进,可以避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点。
......@@ -1471,7 +1471,7 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}}\cdot \frac{\partial L}{\partial w
%--Adam ---------------------
\vspace{0.5em}
\noindent \textbf{d)Adam }
\noindent \textbf{Adam }
\vspace{0.5em}
\parinterval Adam梯度下降算法是在RMSProp算法的基础上进行改进的,我们可以将其看成是带有动量项的RMSProp算法\cite{kingma2014adam},该算法是目前最流行的优化算法。Adam 算法的参数更新公式如下,可以看到Adam算法相当于在RMSProp算法中引入了Momentum算法中的动量项,这样做使得Adam算法兼具了Momentum算法和\\RMSProp算法的优点:既能使梯度更为``平滑''地更新,同时可以为神经网络中的每个参数设置不同的学习率。
......@@ -1743,7 +1743,7 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}} v_t
\label{eqa1.50}
\end{eqnarray}
%公式--------------------------------------------------------------------
其中${[\cdot]}^{\rm T}$表示转置操作\footnote{如果$ \mathbf h^{K-1} $是一个向量,$ {\left[\mathbf h^{K-1}\right]}^{\rm T} $表示向量的转置,比如,行向量变成列向量;如果$ \mathbf h^{K-1} $是一个高阶张量,$ {\left[\mathbf h^{K-1}\right]}^{\rm T} $表示沿着张量最后两个方向的转置}
其中${[\cdot]}^{\rm T}$表示转置操作\footnote{如果$ \mathbf h^{K-1} $是一个向量,$ {\left[\mathbf h^{K-1}\right]}^{\rm T} $表示向量的转置,比如,行向量变成列向量;如果$ \mathbf h^{K-1} $ 是一个高阶张量,$ {\left[\mathbf h^{K-1}\right]}^{\rm T} $表示沿着张量最后两个方向的转置}
\vspace{0.5em}
\item 计算$ \frac{\partial L}{\partial \mathbf h^{K-1}} $ :与求解$ \frac{\partial L}{\partial \mathbf w^K} $类似,可以得到
%公式--------------------------------------------------------------------
......@@ -1766,7 +1766,7 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}} v_t
\label{eqa1.53}
\end{eqnarray}
%公式--------------------------------------------------------------------
\noindent 其中,$ \mathbf h^k $$ \mathbf s^k $$\mathbf w^k $和分别表示隐藏层的输出、中间状态、输入和参数矩阵。隐藏层的前向计算过程如图\ref{fig:forward-propagation-hid}所示,第$ k-1 $层神经元的输出$ \mathbf h^{k-1} $经过线性变换和激活函数后,将计算结果$ \mathbf h^k $向后一层传递。
\noindent 其中,$ \mathbf h^k $$ \mathbf s^k $$\mathbf w^k $和分别表示隐藏层的输出、中间状态、输入和参数矩阵。隐藏层的前向计算过程如图\ref{fig:forward-propagation-hid}所示,第$ k-1 $ 层神经元的输出$ \mathbf h^{k-1} $经过线性变换和激活函数后,将计算结果$ \mathbf h^k $向后一层传递。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -2084,7 +2084,7 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}} v_t
%--5.5.3句子表示模型及预训练---------------------
\subsection{句子表示模型及预训练}\index{Chapter5.5.3}
\parinterval 目前,词嵌入已经成为诸多自然语言处理系统的标配,也衍生出很多有趣的研究法方向,甚至有人开玩笑的喊出``embedding everything''的口号。但是,冷静的看,词嵌入依旧存在一些问题:每个词都对应唯一的向量表示,那么对于一词多义现象,词义需要通过上下文进行区分,这时使用简单的词嵌入式是无法处理的。有一个著名的例子:
\parinterval 目前,词嵌入已经成为诸多自然语言处理系统的标配,也衍生出很多有趣的研究法方向,甚至有人开玩笑的喊出``embedding everything''的口号。但是,冷静的看,词嵌入依旧存在一些问题:每个词都对应唯一的向量表示,那么对于一词多义现象,词义需要通过上下文进行区分,这时使用简单的词嵌入式是无法处理的。有一个著名的例子:
\vspace{0.3em}
\begin{example}
Jobs was the CEO of {\red{\underline{apple}}}.
......@@ -2216,7 +2216,7 @@ Jobs was the CEO of {\red{\underline{apple}}}.
\vspace{0.5em}
\item 预训练是表示学习的重要产物。预训练已经在图像处理等领域得到应用。在自然语言处理中,以BERT为代表的预训练模型席卷了很多自然语言处理任务,在阅读理解等比赛(如Stanford Question Answering)中已经成为了所有参赛系统的标配。除了ELMO、GPT、BERT,还有很多优秀的预训练模型,包括GPT-2\cite{radford2019language}、XLM\cite{lample2019cross}、MASS\cite{song2019mass}、XLNet\cite{yang2019xlnet},等等。但是,预训练往往依赖大规模的数据和并行运算设备,这使得很多普通研究者对训练这样的模型望而却步。不过,也有一些研究关注轻量的预训练方法,也受到了很多关注,例如ALBERT\cite{lan2019albert}
\end{itemize}
\vspace{0.5em}
\vspace{0.5em}
......
......@@ -62,16 +62,16 @@
\cleardoublepage %保证章节页在奇数页
\pagestyle{fancy} % Enable headers and footers again
%----------------------------------------------------------------------------------------
% CHAPTERS
%----------------------------------------------------------------------------------------
%\include{Chapter1/chapter1}
%\include{Chapter2/chapter2}
%\include{Chapter3/chapter3}
\include{Chapter1/chapter1}
\include{Chapter2/chapter2}
\include{Chapter3/chapter3}
\include{Chapter5/chapter5}
%\include{Chapter6/chapter6}
\include{Chapter6/chapter6}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论