Commit 24a69d29 by 曹润柘

update 2 & 5

parent b2288d76
......@@ -63,7 +63,7 @@
{
\node [anchor=west] (mtinputlabel) at ([xshift=0.29in]inputlabel.east) {{\scriptsize \color{red}{\textbf{实际的输入}}}};
\node [anchor=west] (mtoutputlabel) at ([xshift=0.86in]mtinputlabel.east) {{\scriptsize \color{red}{\textbf{实际的输出}}}};
\node [anchor=west] (mtoutputlabel) at ([xshift=1.0in]mtinputlabel.east) {{\scriptsize \color{red}{\textbf{实际的输出}}}};
\node[rectangle,draw=ublue, inner sep=0mm] [fit = (mtinputlabel) (mtoutputlabel) (inputmarking) (outputmarking)] {};
}
......
......@@ -45,7 +45,7 @@
{
\node [anchor=west,thick,draw,minimum width=3.4em,minimum height=1.5em] (w1) at (c3.west){};
\draw [->,thick] (entry3.30) ..controls +(70:1) and +(south:1.5).. ([xshift=0.3em]w1.south) node [pos=0.5, above] {\color{red}{\footnotesize{命中}}};
\draw [->,thick] (entry3.30) ..controls +(70:1) and +(south:1.5).. ([xshift=0.3em]w1.south) node [pos=0.5, above] {\footnotesize{命中}};
}
......
......@@ -53,12 +53,12 @@
\node [anchor=north west] (sent) at (sentlabel.south west) {\textbf{确实现在数据很多}};
}
{
\node [anchor=north west] (seg1) at ([xshift=0.5em]sent.south west) {确/实现/在/数/据很/多};
\node [anchor=north west] (seg1) at ([xshift=1.0em]sent.south west) {确/实现/在/数/据很/多};
\node [anchor=north west] (seg2) at (seg1.south west) {确实/现在/数据/很/多};
\node [anchor=north west] (seg3) at (seg2.south west) {确实/现在/数/据/很/多};
}
{
\node [anchor=north west] (seg4) at ([yshift=0.5em]seg3.south west) {...};
\node [anchor=north west] (seg4) at ([xshift=-1.0em,yshift=0.4em]seg3.south west) {...};
\node [anchor=east,ugreen] (p1seg1) at ([xshift=0.5em]seg1.west) {P(};
\node [anchor=west,ugreen] (p2seg1) at ([xshift=-0.5em]seg1.east) {)=.1};
\node [anchor=east,ugreen] (p1seg2) at ([xshift=0.5em]seg2.west) {P(};
......@@ -68,10 +68,10 @@
}
{
\node [anchor=east,draw,dashed,red,thick,minimum width=13em,minimum height=1.5em] (final) at (p2seg2.east) {};
\node [anchor=west,red] (finallabel) at ([xshift=2.5em]sentlabel.east) {输出概率最大};
\node [anchor=north east,red] (finallabel2) at ([yshift=0.5em]finallabel.south east) {的结果};
\draw [->,thick,red] ([xshift=0.0em,yshift=-0.5em]final.north east) ..controls +(east:0.3) and +(south:0.0).. ([xshift=1.0em]finallabel2.south);
\node [anchor=east,draw,dashed,red,thick,minimum width=12.6em,minimum height=1.4em] (final) at (p2seg2.east) {};
\node [anchor=west,red] (finallabel) at ([xshift=2.7em]sentlabel.east) {输出概率最大的结果};
%\node [anchor=north east,red] (finallabel2) at ([yshift=0.5em]finallabel.south east) {的结果};
\draw [->,thick,red] ([xshift=0.0em,yshift=-0.5em]final.north east) ..controls +(east:0.3) and +(south:0.0).. ([xshift=1.0em]finallabel.south);
}
}
......
......@@ -12,13 +12,13 @@
\chapter{词法、语法及统计建模基础}
\parinterval 机器翻译并非是一个孤立的系统,它依赖于很多模块,并且需要很多学科知识的融合。现在的机器翻译系统大多使用统计模型对翻译问题进行建模,同时也会用到一些的自然语言处理工具对不同语言的文字进行分析。因此,在正式开始机器翻译内容的介绍之前,本章将会对相关的基础知识进行概述,包括:概率论与统计建模基础、语言分析、语言建模等。
\parinterval 机器翻译并非是一个孤立的系统,它依赖于很多模块,并且需要很多学科知识的融合。现在的机器翻译系统大多使用统计模型对翻译问题进行建模,同时也会用到一些自然语言处理工具来对不同语言的文字进行分析。因此,在正式开始机器翻译内容的介绍之前,本章将会对相关的基础知识进行概述,包括:概率论与统计建模基础、语言分析、语言建模等。
\parinterval 概率论与统计建模是机器翻译方法的基础。这里会对机器翻译所涉及的基本数学概念进行简要描述,确保后续使用到的数学工具是完备的。本章会重点关注如何利用统计建模的方式对自然语言处理问题进行描述,这种手段在统计机器翻译和神经机器翻译中会被使用。
\parinterval 语言分析部分将以汉语为例介绍词法和句法分析的基本概念。它们都是自然语言处理中的经典问题,而且在机器翻译中也会经常被使用。同样,本章会介绍这两个任务的定义和求解问题的思路。
\parinterval 语言建模是机器翻译中最常用的一种技术,它主要用于句子的生成和流畅度评价。本章会以传统统计语言模型为例,对语言建模的相关概念进行介绍。但是,这里并不深入探讨语言模型技术,在后面的章节中还有会单独的内容对神经网络语言模型等前沿技术进行讨论。
\parinterval 语言建模是机器翻译中最常用的一种技术,它主要用于句子的生成和流畅度评价。本章会以传统统计语言模型为例,对语言建模的相关概念进行介绍。但是,这里并不深入探讨语言模型技术,在后面的章节中还会有单独的内容对神经网络语言模型等前沿技术进行讨论。
%--问题概述-----------------------------------------
\section{问题概述 }\index{Chapter2.1}
......@@ -52,7 +52,7 @@
\begin{itemize}
\item {\small\bfnew{分词}}(Segmentation):这个过程会把词串进行切分,切割成最小的单元。因为只有知道了什么是待处理字符串的最小单元,机器翻译系统才能对其进行表示、分析和生成。
\vspace{0.5em}
\item {\small\bfnew{句法分析}}(Parsing):这个过程会对分词的结果进行进一步分析,得到句子的句法结构,这种结构是对句子的进一步抽象。比如,NP+VP就可以表示由名词短语(NP)和动词短语(VP)构成的主谓结构。利用这些信息,机器翻译可以更加准确的对语言的结构进行分析和生成。
\item {\small\bfnew{句法分析}}(Parsing):这个过程会对分词的结果进行进一步分析,得到句子的句法结构,这种结构是对句子的进一步抽象。比如,NP+VP就可以表示由名词短语(NP)和动词短语(VP)构成的主谓结构。利用这些信息,机器翻译可以更加准确的对语言的结构进行分析和生成。
\end{itemize}
\vspace{0.5em}
......@@ -62,7 +62,7 @@
\parinterval 值得注意的是,有些观点认为,不论是分词还是句法分析,对于机器翻译来说并不要求符合人的认知和语言学约束。换句话说,机器翻译所使用的``单词''和``结构''本身并不是为了符合人类的解释,它们更直接目的是为了进行翻译。从系统开发的角度,有时候即使进行一些与人类的语言习惯有差别的处理,仍然会带来性能的提升,比如在神经机器翻译中,在传统分词的基础上进一步使用双字节编码(Byte Pair Encoding,BPE)子词切分会使得机器翻译性能大幅提高。当然,自然语言处理中语言学信息的使用一直是学界关注的焦点。甚至关于语言学结构对机器翻译是否有作用这个问题也有争论。但是不能否认的是,无论是语言学的知识,还是计算机自己学习到的知识,对机器翻译都是有价值的。在后续章节会看到,这两种类型的知识对机器翻译帮助很大 \footnote[1]{笔者并不认同语言学结构对机器翻译的帮助有限,相反机器翻译需要更多的人类先验知识的指导。当然,这个问题不是这里讨论的重点。}
\parinterval 剩下的问题是如何进行句子的切分和结构的分析。思路有很多,一种常用的方法是对问题进行概率化,用统计模型来描述问题并求解之。比如,一个句子切分的好坏,并不是非零即一的判断,而是要估计出这种切分的可能性大小,最终选择可能性最大的结果进行输出。这也是一种典型的用统计建模的方式来描述自然语言处理问题。
\parinterval 剩下的问题是如何进行句子的切分和结构的分析。思路有很多,一种常用的方法是对问题进行概率化,用统计模型来描述问题并求解之。比如,一个句子切分的好坏,并不是非零即一的判断,而是要估计出这种切分的可能性大小,最终选择可能性最大的结果进行输出。这也是一种典型的用统计建模的方式来描述自然语言处理问题的方法
\parinterval 本章将会对上述问题及求解问题的方法进行介绍。首先,会用一个例子给出统计建模的基本思路,之后会应用这种方法进行中文分词、语言建模和句法分析。
\vspace{-1em}
......@@ -99,7 +99,7 @@
\parinterval 除此之外,概率函数$\textrm{P}(\cdot)$还具有非负性、归一性等特点,非负性是指,所有的概率函数$\textrm{P}(\cdot)$都必须是大于等于0的数值,概率函数中不可能出现负数:$\forall{x},\textrm{P}{(x)}\geq{0}$。归一性,又称规范性,简单的说就是所有可能发生的事件的概率总和为1,即$\sum_{x}\textrm{P}{(x)}={1}$
\parinterval 对于离散变量$A$$\textrm{P}(A=a)$是个确定的值,可以表示事件$A=a$的可能性大小;而对于连续变量,求在某个定点处的概率是无意义的,只能求其落在某个取值区间内的概率。因此,用{\small\sffamily\bfseries{概率分布函数$F(x)$}}{\small\sffamily\bfseries{概率密度函数}}$f(x)$来统一描述随机变量的取值分布情况。概率分布函数$F(x)$表示取值小于某个值的概率,是概率的累加(或积分)形式。假设$A$是一个随机变量,$a$是任意实数,将函数$F(a)=\textrm{P}\{A\leq a\}$$-\infty<a<\infty $定义为$A$的分布函数。通过分布函数,可以清晰地表示任何随机变量的概率。
\parinterval 对于离散变量$A$$\textrm{P}(A=a)$是个确定的值,可以表示事件$A=a$的可能性大小;而对于连续变量,求在某个定点处的概率是无意义的,只能求其落在某个取值区间内的概率。因此,用{\small\sffamily\bfseries{概率分布函数$F(x)$}}{\small\sffamily\bfseries{概率密度函数}}$f(x)$来统一描述随机变量取值的分布情况。概率分布函数$F(x)$表示取值小于某个值的概率,是概率的累加(或积分)形式。假设$A$是一个随机变量,$a$是任意实数,将函数$F(a)=\textrm{P}\{A\leq a\}$$-\infty<a<\infty $定义为$A$的分布函数。通过分布函数,可以清晰地表示任何随机变量的概率。
\parinterval 概率密度函数反映了变量在某个区间内的概率变化快慢,概率密度函数的值是概率的变化率,该连续变量的概率也就是对概率密度函数求积分得到的结果。设$f(x) \geq 0$是连续变量$X$的概率密度函数,$X$的分布函数就可以用如下公式定义:
......@@ -238,7 +238,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\begin{eqnarray}
{\textrm{P}(L)} &=& {\textrm{P}( L| S_a )\textrm{P}(S_a )+\textrm{P}( L| S_b )\textrm{P}(S_b )+\textrm{P}( L| S_c )\textrm{P}(S_c )}\nonumber \\
& = &{\textrm{P}({S_{a}^{'}})\textrm{P}(S_a)+\textrm{P}({S_{b}^{'}})\textrm{P}(S_b)+\textrm{P}({S_{c}^{'}})\textrm{P}(S_c) }\nonumber \\
& = &{0.36}\nonumber
& = &{0.36}
\end{eqnarray}
%--------------------------------------------
......@@ -351,7 +351,7 @@ F(X)=\int_{-\infty}^x f(x)dx
%\vspace{-0.5em}
\parinterval 分词得到的单元序列可以是语言学上的词序列,也可以是根据其他方式定义的基本处理单元。在本章中,可以把分词得到的一个个单元称为{\small\bfnew{单词}}(Word),或{\small\bfnew{}},尽管这些单元可以不是语言学上的完整单词。而这个过程也被称作{\small\bfnew{词法分析}}(Lexical Analysis)。除了汉语,词法分析在日语、泰语等单词之间无明确分割符的语言中有着广泛的应用,芬兰语、维吾尔语等一些形态学十分丰富的语言,也需要使用词法分析来解决复杂的词尾、词缀变化等形态学变化。
\parinterval 在机器翻译中,分词系统的好坏往往会决定译文的质量。分词的目的是定义系统处理的基本单元,那么什么叫做``词''呢?关于词的定义有很多,比如:\\
\parinterval 在机器翻译中,分词系统的好坏往往会决定译文的质量。分词的目的是定义系统处理的基本单元,那么什么叫做``词''呢?关于词的定义有很多,比如:
%-------------------------------------------
\begin{definition}
......@@ -371,9 +371,9 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{definition}
%-------------------------------------------
\parinterval 从语言学的角度,普遍认为词是可以单独运用的、包含意义的基本单位。这样可以使用有限的词可以组合出无限的句子,这也正体现出自然语言的奇妙之处。
\parinterval 从语言学的角度来看,普遍认为词是可以单独运用的、包含意义的基本单位。这样可以使用有限的词组合出无限的句子,这也正体现出自然语言的奇妙之处。
\parinterval 不过,机器翻译并不仅仅局限在语言学定义的单词。比如,神经机器翻译中广泛使用的BPE子词切分方法(第七章),可以被理解为将词的一部分也进行切开,也就是得到词片段送给机器翻译系统使用。比如,对如下英文字符串,可以得到如下切分结果
\parinterval 不过,机器翻译并不仅仅局限在语言学定义的单词。比如,神经机器翻译中广泛使用的BPE子词切分方法(第七章),可以被理解为将词的一部分也进行切开,也就是得到词片段送给机器翻译系统使用。比如,对如下英文字符串,可以得到如下切分结果
\vspace{0.5em}
\parinterval Interesting \; $\to$ \; Interest/ing selection \hspace{0.08em} $\to$ \;se/lect/ion procession \hspace{0.43em} $\to$ \; pro/cess/ion
......@@ -415,11 +415,11 @@ F(X)=\int_{-\infty}^x f(x)dx
\parinterval 类似的例子在生活中也很常见。再比如``答辩结束的和尚未答辩的同学都请留在教室''一句中,正常的分词结果是``答辩/结束/的/和/尚未/答辩/的/同学/都/请/留在/教室'',但是由于``尚未''、`` 和尚''都是常见词汇,使用基于词典的分词方法在这时很容易出现切分错误。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图\ref{fig:2.3-2}中的例子实际上就是这种使用这种策略得到的分词结果。但是,启发式的消岐方法对人工的依赖程度很高,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
\parinterval 基于词典的分词方法是典型的基于规则的方法,完全依赖于人工给定的词典。在遇到歧义时,需要人工定义消除歧义的规则,比如,可以自左向右扫描每次匹配最长的单词,这是一种简单的启发式的消歧策略。图\ref{fig:2.3-2}中的例子实际上就是使用这种策略得到的分词结果。但是,启发式的消岐方法对人工的依赖程度很高,而且启发式规则也不能处理所有的情况。所以说简单的基于词典的方法还不能很好的解决分词问题。
\subsection{基于统计的分词方法}\label{sec2:statistical-seg}\index{Chapter2.3.2}
\parinterval 既然基于词典的方法有很多问题,那么就需要一种更为有效的方法。在上文中提到,想要搭建一个分词系统,需要让计算机知道什么是``词'',那么可不可以给出已经切分好的分词数据,让计算机在这些数据中学习到规律呢?答案是肯定的 - 利用``数据''来让计算机明白``词''的定义,让计算机直接在数据中学到知识,这就常说的数据驱动的方法。这个过程也是一个典型的基于统计建模的学习过程。
\parinterval 既然基于词典的方法有很多问题,那么就需要一种更为有效的方法。在上文中提到,想要搭建一个分词系统,需要让计算机知道什么是``词'',那么可不可以给出已经切分好的分词数据,让计算机在这些数据中学习到规律呢?答案是肯定的利用``数据''来让计算机明白``词''的定义,让计算机直接在数据中学到知识,这就常说的数据驱动的方法。这个过程也是一个典型的基于统计建模的学习过程。
\subsubsection{统计模型的学习与推断}\index{Chapter2.3.2.1}
......@@ -445,7 +445,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{figure}
%-------------------------------------------
\parinterval\ref{fig:2.3-4} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中的每个句子已经经过人工标注分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为$\textrm{P}(\cdot)$。模型通过在标注数据上的学习来对问题进行描述,即学习$\textrm{P}(\cdot)$。最后,对于新的未分词的句子,使用模型$\textrm{P}(\cdot)$对每个可能的分切进行概率估计,之后选择概率最高的切分结果输出。
\parinterval\ref{fig:2.3-4} 给出了一个基于统计建模的汉语分词实例。左侧是标注数据,其中每个句子是已经经过人工标注的分词结果(单词用斜杠分开)。之后,建立一个统计模型,记为$\textrm{P}(\cdot)$。模型通过在标注数据上的学习来对问题进行描述,即学习$\textrm{P}(\cdot)$。最后,对于新的未分词的句子,使用模型$\textrm{P}(\cdot)$对每个可能的切分方式进行概率估计,之后选择概率最高的切分结果输出。
\vspace{-0.5em}
\subsubsection{掷骰子游戏}\index{Chapter2.3.2.2}
......@@ -472,7 +472,6 @@ F(X)=\int_{-\infty}^x f(x)dx
\vspace{-0.5em}
\parinterval 但是这个游戏没有人规定骰子是均匀的(有些被坑了的感觉)。但是如果骰子的六个面不均匀呢?我们可以用一种更加``聪明''的方式定义一种新的模型,即定义骰子的每一个面都以一定的概率出现,而不是相同的概率。描述如下:
\vspace{-1.0em}
\begin{eqnarray}
\textrm{P(``1'')} &=&\theta_1 \nonumber \\
\textrm{P(``2'')} &=&\theta_2 \nonumber \\
......@@ -608,7 +607,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\parinterval 经过充分训练的统计模型$\textrm{P}(\cdot)$就是得到的分词模型。对于输入的新句子$S$,通过这个模型找到最佳的分词结果$W^*$输出。假设输入句子$S$是``确实现在数据很多'',可以通过列举获得不同切分方式的概率,其中概率最高的切分方式,就是系统的目标输出。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词,使用标注好的分词数据进行学习,获得分词模型。这种方法最大的优点是整个学习过程(模型训练过程)和推导过程(处理新句子进行切分的过程)都是全自动进行的。虽然这种方法十分简单,但是其效率很高,因此被广泛使用在工业界系统里。
\parinterval 这种分词方法也被称作基于1-gram语言模型的分词,或全概率分词,使用标注好的分词数据进行学习,获得分词模型。这种方法最大的优点是整个学习过程(模型训练过程)和推导过程(处理新句子进行切分的过程)都是全自动进行的。这种方法虽然简单,但是其效率很高,因此被广泛应用在工业界系统里。
\parinterval 当然,真正的分词系统还需要解决很多其他问题,比如使用动态规划等方法高效搜索最优解以及如何处理未见过的词等等,由于本节的重点是介绍中文分词的基础方法和统计建模思想,因此无法覆盖所有中文分词的技术内容,有兴趣的读者可以参考\ref{sec2:summary}节的相关文献做进一步深入研究。
......@@ -681,7 +680,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\end{itemize}
\vspace{0.3em}
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此是也自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在第五章和第六章进行详细介绍。
\parinterval 极大似然估计方法和前面介绍的统计分词中的方法是一致的,它的核心是使用$n$-gram出现的频度进行参数估计,因此也是自然语言处理中一类经典的$n$-gram方法。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入$(w_{m-n+1}...w_{m-1})$和输出$\textrm{P}(w_m|w_{m-n+1} ... w_{m-1})$进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于$n$-gram的方法,或者说它并没有显性记录$n$-gram的生成概率,也不依赖$n$-gram的频度进行参数估计。为了保证内容的连贯性,本章将仍以传统$n$-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在第五章和第六章进行详细介绍。
\parinterval $n$-gram语言模型的使用非常简单。可以像\ref{sec2:statistical-seg}节中一样,直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个分词序列的概率:
......@@ -736,7 +735,7 @@ F(X)=\int_{-\infty}^x f(x)dx
\noindent 其中,$V$表示所有词汇的词表,$|V|$为词表中单词的个数,$w$为词典中的一个词。有时候,加法平滑方法会将$\theta$取1,这时称之为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此也往往被用于对系统的快速原型中。
\parinterval 举一个例子。假设在一个英文文档中随机一些单词(词表大小$|V|=20$),各个单词出现的次数为:``look'': 4,``people'': 3,``am'': 2,``what'': 1,``want'': 1,``do'': 1。图\ref{fig:2.4-2} 给出了在平滑之前和平滑之后的概率分布。
\parinterval 举一个例子。假设在一个英文文档中随机采样一些单词(词表大小$|V|=20$),各个单词出现的次数为:``look'': 4,``people'': 3,``am'': 2,``what'': 1,``want'': 1,``do'': 1。图\ref{fig:2.4-2} 给出了在平滑之前和平滑之后的概率分布。
%----------------------------------------------
% 图2.19
......@@ -751,7 +750,7 @@ F(X)=\int_{-\infty}^x f(x)dx
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{古德-图灵估计法}\index{Chapter2.4.2.2}
\parinterval {\small\bfnew{古德-图灵估计法}}(Good-Turing Estimate)是图灵(Alan Turing)和他的助手古德(I.J.Good)开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953 年古德将其发表,这一方法也是很多平滑算法的核心,其基本思路是:把非零的$n$元语法单元的概率降低匀给一些低概率$n$元语法单元,以减小最大似然估计与真实概率之间的偏离\cite{good1953population}\cite{gale1995good}
\parinterval {\small\bfnew{古德-图灵估计法}}(Good-Turing Estimate)是图灵(Alan Turing)和他的助手古德(I.J.Good)开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953 年古德将其发表,这一方法也是很多平滑算法的核心,其基本思路是:把非零的$n$元语法单元的概率降低匀给一些低概率$n$元语法单元,以减小最大似然估计与真实概率之间的偏离\cite{good1953population}\cite{gale1995good}
\parinterval 假定在语料库中出现$r$次的$n$-gram有$n_r$个,特别的,出现0次的$n$-gram(即未登录词及词串)出现的次数为$n_0$个。语料库中全部词语的个数为$N$,显然
\begin{eqnarray}
......@@ -817,7 +816,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{Kneser-Ney平滑方法}\index{Chapter2.4.2.3}
\parinterval Kneser-Ney平滑方法由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\cite{kneser1995improved}\cite{chen1999empirical},并被广泛认为是最有效的平滑方法。这种平滑方法改进了absolute discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想。
\parinterval Kneser-Ney平滑方法由R.Kneser和H.Ney于1995年提出的用于计算$n$元语法概率分布的方法\cite{kneser1995improved}\cite{chen1999empirical},并被广泛认为是最有效的平滑方法。这种平滑方法改进了absolute discounting中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想。
\parinterval 首先介绍一下absolute discounting平滑算法,公式如下所示:
\begin{eqnarray}
......@@ -877,8 +876,13 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ }
& & \lambda(w_{i-n+1}...w_{i-1})\textrm{P}_{\textrm{KN}}(w_i|w_{i-n+2}...w_{i-1})
\end{eqnarray}
\begin{eqnarray}
\lambda(w_{i-1}) & = & \frac{d}{c_{\textrm{KN}}(w_{i-n+1}^{i-1})}|\{w:c_{\textrm{KN}}(w_{i-n+1}...w_{i-1}w)>0\}| \label{eq:2.4-18} \\
c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad\quad \textrm{for\ highest\ order} \\ \textrm{catcount}(\cdot)\quad \textrm{for\ lower\ order} \end{cases} \label{eq:2.4-19}
\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\}
\end{eqnarray} \label{eq:2.4-18}
\begin{eqnarray}
c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\textrm{count}(\cdot) & \textrm{for\ highest\ order} \\
\textrm{catcount}(\cdot) & \textrm{for\ lower\ order}
\end{array}\right. \label{eq:2.4-19}
\end{eqnarray}
\noindent 其中catcount$(\cdot)$表示的是基于某个单个词作为第$n$个词的$n$-gram的种类数目。
......@@ -908,7 +912,7 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad\quad \text
\parinterval 短语结构树和依存句法树的结构和功能有很大不同。短语结构树的叶子节点是单词,中间节点是词性或者短语句法标记。在短语结构分析中,通常把单词称作{\small\bfnew{终结符}}(Terminal),把词性称为{\small\bfnew{预终结符}}(Pre-terminal),而把其他句法标记称为{\small\bfnew{非终结符}}(Non-terminal)。依存句法树没有预终结符和非终结符,所有的节点都是句子里的单词,通过不同节点间的连线表示句子中各个单词之间的依存关系。每个依存关系实际上都是有方向的,头和尾分别指向``接受''和``发出''依存关系的词。依存关系也可以进行分类,图\ref{fig:2.5-1}中我们对每个依存关系的类型都进行了标记,这也被称作是有标记的依存分析。如果不生成这些标记,这样的句法分析被称作无标记的依存分析。
\parinterval 虽然短语结构树和依存树的句法表现形式有很大不同,但是它们在某些条件下能相互转化。比如,可以使用启发性规则将短语结构树自动转化为依存树。从应用的角度,依存分析由于形式更加简单,而且直接建模词语之间的依赖,因此在自然语言处理领域中受到很多关注。在机器翻译中,不过无论是哪种句法树结构,都已经被证明会对机器翻译系统产生帮助。特别是短语结构树,在机器翻译中的应用历史更长,研究更为深入,因此本节将会以短语结构分析为例介绍句法分析的相关概念。
\parinterval 虽然短语结构树和依存树的句法表现形式有很大不同,但是它们在某些条件下能相互转化。比如,可以使用启发性规则将短语结构树自动转化为依存树。从应用的角度,依存分析由于形式更加简单,而且直接建模词语之间的依赖,因此在自然语言处理领域中受到很多关注。在机器翻译中,无论是哪种句法树结构,都已经被证明会对机器翻译系统产生帮助。特别是短语结构树,在机器翻译中的应用历史更长,研究更为深入,因此本节将会以短语结构分析为例介绍句法分析的相关概念。
\parinterval 而句法分析到底是什么呢?简单的理解,句法分析就是在小学语文课程中学习的句子成分的分析,以及对句子中各个成分内部、外部关系的判断。更规范一些的定义,可以参照维基百科和百度百科的句法分析的解释。
......@@ -938,7 +942,7 @@ c_{\textrm{KN}}(\cdot) & = & \begin{cases} \textrm{count}(\cdot)\quad\quad \text
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{上下文无关文法}\index{Chapter2.5.2}
\parinterval 句法树是对句子的一种抽象。这种树形结构表达了一种对句子结构的归纳过程,比如,从树的叶子开始,把每一个树节点看作一次抽象,最终形成一个根节点。那这个过程是如何用计算机实现出来呢?这就需要使用到形式文法。
\parinterval 句法树是对句子的一种抽象。这种树形结构表达了一种对句子结构的归纳过程,比如,从树的叶子开始,把每一个树节点看作一次抽象,最终形成一个根节点。那这个过程如何用计算机来实现呢?这就需要使用到形式文法。
\parinterval 形式文法是分析自然语言的一种重要工具。根据乔姆斯基的定义\cite{chomsky2002syntactic},形式文法分为四种类型:无限制文法(0型文法)、上下文相关文法(1型文法)、上下文无关文法(2型文法)和正规文法(3型文法)。不同类型的文法有不同的应用,比如,正规文法可以用来描述有限状态自动机,因此也会被使用在语言模型等系统中。对于短语结构分析问题,常用的是{\small\bfnew{上下文无关文法}}(Context-Free Grammar)。上下文无关文法的具体形式如下:
......@@ -985,9 +989,9 @@ S=\{\textrm{IP}\} \nonumber
\end{figure}
%---------------------------
\parinterval 上面这个文法蕴含了不同``层次''的句法信息。比如,规则$r_1$$r_2$$r_3$$r_4$表达了词性对单词的抽象;规则$r_6$$r_7$$r_8$是表达了短语结构的抽象,其中,规则$r_8$描述了汉语中名词短语(主语)+动词短语(谓语)的结构。在实际应用中,像$r_8$这样的规则可以覆盖很大的片段(试想一下一个包含50个词的主谓结构的句子,可以使用进行$r_8$描述)。
\parinterval 上面这个文法蕴含了不同``层次''的句法信息。比如,规则$r_1$$r_2$$r_3$$r_4$表达了词性对单词的抽象;规则$r_6$$r_7$$r_8$是表达了短语结构的抽象,其中,规则$r_8$描述了汉语中名词短语(主语)+动词短语(谓语)的结构。在实际应用中,像$r_8$这样的规则可以覆盖很大的片段(试想一下一个包含50个词的主谓结构的句子,可以使用$r_8$进行描述)。
\parinterval 下文无关文法的规则是一种{\small\sffamily\bfseries{产生式规则}}(Production Rule),形如$\alpha \to \beta $,它表示把规则左端的非终结符$\alpha$替换为规则右端的符号序列$\beta$。 通常,$\alpha$被称作规则的左部(Left-hand Side),$\beta$被称作规则的右部(Right-hand Side)。使用右部$\beta$替换左部$\alpha$的过程也被称作规则的使用,而这个过程的逆过程称为规约。规则的使用可以如下定义:
\parinterval 下文无关文法的规则是一种{\small\sffamily\bfseries{产生式规则}}(Production Rule),形如$\alpha \to \beta $,它表示把规则左端的非终结符$\alpha$替换为规则右端的符号序列$\beta$。 通常,$\alpha$被称作规则的左部(Left-hand Side),$\beta$被称作规则的右部(Right-hand Side)。使用右部$\beta$替换左部$\alpha$的过程也被称作规则的使用,而这个过程的逆过程称为规约。规则的使用可以如下定义:
\vspace{0.5em}
%-------------------------------------------
......@@ -999,7 +1003,7 @@ S=\{\textrm{IP}\} \nonumber
\end{center}
\end{definition}
\parinterval 给定起始非终结符,可以不断地使用规则,最终生成一个终结符串,这个过程也被称为{\small\bfnew{推导}}(Derivation)。形式化的定义为:
\parinterval 给定起始非终结符,可以不断地使用规则,最终生成一个终结符串,这个过程也被称为{\small\bfnew{推导}}(Derivation)。形式化的定义为:
\vspace{0.5em}
%-------------------------------------------
......@@ -1057,7 +1061,7 @@ s_0 \overset{r_1}{\Rightarrow} s_1 \overset{r_2}{\Rightarrow} s_2 \overset{r_3}{
\parinterval 这样,对于一个上下文无关文法,每一棵句法树都有唯一的最左推导与之对应。于是,句法分析可以被描述为:对于一个句子找到能够生成它的最佳推导,这个推导所对应的句法树就是这个句子的句法分析结果。
\parinterval 不过问题又回来了,怎样才能知道什么样的推导或者句法树是``最佳''的呢?对于语言学专来说,可以很确定的分辨出哪些句法树是正确的,哪些句法树是错误。甚至对于普通人,也通过一些课本中学到知识产生一些模糊的判断。而计算机如何进行判别呢?沿着前面介绍的统计建模的思想,计算机可以得出不同句法树出现的概率,进而选择概率最高的句法树作为输出,而这正是统计句法分析所做的事情
\parinterval 不过问题又回来了,怎样才能知道什么样的推导或者句法树是``最佳''的呢?对于语言学专来说,可以很确定的分辨出哪些句法树是正确的,哪些句法树是错误。甚至对于普通人,也通过一些课本中学到知识产生一些模糊的判断。而计算机如何进行判别呢?沿着前面介绍的统计建模的思想,计算机可以得出不同句法树出现的概率,进而选择概率最高的句法树作为输出,而这正是统计句法分析所做的事情
%-------------------------------------------
%图2.5.2.5
......@@ -1170,11 +1174,11 @@ r_6: & & \textrm{VP} \to \textrm{VV}\ \textrm{NN} \nonumber
\parinterval 本章重点介绍了如何对自然语言处理问题进行统计建模,并从数据中自动学习统计模型的参数,最终使用学习到的模型对新的问题进行处理。之后,本章将这种思想应用到三个自然语言处理任务中,包括:中文分词、语言建模、句法分析,它们也和机器翻译有着紧密的联系。通过系统化的建模,可以发现:经过适当的假设和化简,统计模型可以很好的描述复杂的自然语言处理问题。相关概念和方法也会在后续章节的内容中被广泛使用。
\parinterval 由于本章重点关注介绍如何用统计的思想对自然语言处理任务进行建模,因此并没有对具体的问题展开深入讨论。有几方面内容,读者可以继续关注:
\parinterval 由于本章重点介绍如何用统计的思想对自然语言处理任务进行建模,因此并没有对具体的问题展开深入讨论。有几方面内容,读者可以继续关注:
\begin{adjustwidth}{1em}{}
\begin{itemize}
\item 在建模方面,本章介绍的三个任务均采用的是基于人工先验知识进行模型设计的思路。也就是,问题所表达的现象被``一步一步''生成出来。这是一种典型的生成式建模思想,它把要解决的问题看作一些观测结果的隐含变量(比如,句子是观测结果,分词结果是隐含在背后的变量),之后通过对隐含变量生成观测结果的过程进行建模,以达到对问题进行数学描述的目的。这类模型一般需要依赖一些独立性假设,假设的合理性对最终的性能有较大影响。相对{\small\sffamily\bfseries{生成模型}}(Generative Model),另一类方法{\small\sffamily\bfseries{判别模型}}(Discriminative Model),它直接描述了从隐含变量生成观测结果的过程,这样对问题的建模更加直接,同时这类模型可以更加灵活的引入不同的特征。判别式模型在自然语言处理中也有广泛应用\cite{shannon1948mathematical}\cite{ng2002discriminative}。 在本书的第四章也会使用到判别式模型。
\item 在建模方面,本章介绍的三个任务均采用的是基于人工先验知识进行模型设计的思路。也就是,问题所表达的现象被``一步一步''生成出来。这是一种典型的生成式建模思想,它把要解决的问题看作一些观测结果的隐含变量(比如,句子是观测结果,分词结果是隐含在背后的变量),之后通过对隐含变量生成观测结果的过程进行建模,以达到对问题进行数学描述的目的。这类模型一般需要依赖一些独立性假设,假设的合理性对最终的性能有较大影响。相对{\small\sffamily\bfseries{生成模型}}(Generative Model),另一类方法{\small\sffamily\bfseries{判别模型}}(Discriminative Model),它直接描述了从隐含变量生成观测结果的过程,这样对问题的建模更加直接,同时这类模型可以更加灵活的引入不同的特征。判别模型在自然语言处理中也有广泛应用\cite{shannon1948mathematical}\cite{ng2002discriminative}。 在本书的第四章也会使用到判别式模型。
\item 从现在自然语言处理的前沿看,基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。但是,本章并没有涉及深度学习及相关方法,这是由于笔者认为:对问题的建模是自然语言处理的基础,对问题的本质刻画并不会因为方法的改变而改变。因此,本章的内容没有太多的陷入到更加复杂的模型和算法设计中,相反,我们希望关注对基本问题的理解和描述。不过,一些前沿方法仍可以作为参考,包括:基于条件随机场和双向长短时记忆模型的序列标注模型\cite{lafferty2001conditional}\cite{huang2015bidirectional}\cite{ma2016end}、神经语言模型\cite{bengio2003neural}\cite{mikolov2010recurrent}、神经句法分析模型\cite{chen2014fast}\cite{zhu2015long}
......
......@@ -25,13 +25,13 @@
\node [rectangle,inner sep=0.2em,fill=red!20] [fit = (neuron01) (neuron05)] (layer01) {};
\end{pgfonlayer}
\node [anchor=west] (layer00label) at ([xshift=1.25em]x5.east) {\footnotesize{\red{{输入层}}}};
\node [anchor=west] (layer00label) at ([xshift=1.25em]x5.east) {\footnotesize{{输入层}}};
{
\node [anchor=west] (layer01label) at ([xshift=1em]layer01.east) {\footnotesize{第二层}};
}
{
\node [anchor=west] (layer01label2) at (layer01label.east) {\footnotesize{\red{({隐层})}}};
\node [anchor=west] (layer01label2) at (layer01label.east) {\footnotesize{(隐层)}};
}
%%% layer 2
......@@ -57,7 +57,7 @@
\node [anchor=west] (layer02label) at ([xshift=4.5em]layer02.east) {\footnotesize{第三层}};
{
\node [anchor=west] (layer02label2) at (layer02label.east) {\footnotesize{\red{({隐层})}}};
\node [anchor=west] (layer02label2) at (layer02label.east) {\footnotesize{({隐层})}};
}
}
......@@ -87,7 +87,7 @@
\node [anchor=west] (layer03label) at ([xshift=1em]layer03.east) {\footnotesize{第四层}};
{
\node [anchor=west] (layer03label2) at (layer03label.east) {\footnotesize{\red{({输出层})}}};
\node [anchor=west] (layer03label2) at (layer03label.east) {\footnotesize{({输出层})}};
}
}
......
......@@ -8,13 +8,13 @@
\node [anchor=west] (y) at ([xshift=2em]neuron.east) {$y$:去?还是不去?};
\draw [->,thin,red] (x0.east) -- (neuron.150) node [pos=0.5,above,yshift=0.2em] {\small{$w_0=.5$}};
\draw [->,line width=0.5mm,red] (x1.east) -- (neuron.180) node [pos=0.5,above,yshift=-0.1em] {\textbf{\small{$w_1=2$}}};
\draw [->,thin,red] (x2.east) -- (neuron.210) node [pos=0.5,above,yshift=0.1em] {\small{$w_2=.5$}};
\draw [->,thin] (x0.east) -- (neuron.150) node [pos=0.5,above,yshift=0.2em] {\small{$w_0=.5$}};
\draw [->,line width=0.5mm] (x1.east) -- (neuron.180) node [pos=0.5,above,yshift=-0.1em] {\textbf{\small{$w_1=2$}}};
\draw [->,thin] (x2.east) -- (neuron.210) node [pos=0.5,above,yshift=0.1em] {\small{$w_2=.5$}};
\draw [->,thick] (neuron.east) -- (y.west);
\node [anchor=center] (neuronmath) at (neuron.center) {\small{$\sum \ge \sigma$}};
\node [anchor=south] (ylabel) at (y.north) {\red{\textbf{不去了!}}};
\node [anchor=south] (ylabel) at (y.north) {\textbf{不去了!}};
\end{scope}
......
......@@ -162,7 +162,7 @@
%--5.2.1.1标量、向量和矩阵---------------------
\subsubsection{标量、向量和矩阵}\index{Chapter5.2.1.1}
\parinterval {\small\sffamily\bfseries{标量}}(Scalar):标量亦称``无向量'',是一种只具有数值大小而没有方向的量,通俗地说,一个标量就是一个单独的数,这里特指实数\footnote{严格意义上,标量可以是复数等其他形式,这里为了方便讨论,这里仅以实数为对象。}。一般用小写斜体表示标量。比如,对于$ a=5 $$ a $就是一个标量。
\parinterval {\small\sffamily\bfseries{标量}}(Scalar):标量亦称``无向量'',是一种只具有数值大小而没有方向的量,通俗地说,一个标量就是一个单独的数,这里特指实数\footnote{严格意义上,标量可以是复数等其他形式。这里为了方便讨论,仅以实数为对象。}。一般用小写斜体表示标量。比如,对于$ a=5 $$ a $就是一个标量。
\parinterval {\small\sffamily\bfseries{向量}}(Vector):向量是由一组实数组成的有序数组。与标量不同,向量既有大小也有方向。可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标。公式\ref{eqa1.1}和公式\ref{eqa1.2}展示了一个行向量和一个列向量。本章默认使用行向量,如$ \mathbf a=(a_1, a_2, a_3) $$ \mathbf a $对应的列向量记为$ \mathbf a^{\rm T} $
%公式--------------------------------------------------------------------
......@@ -178,13 +178,14 @@
\label{eqa1.2}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval {\small\sffamily\bfseries{矩阵}}(Matrix):在数学中,矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$ \mathbf a $表示一个矩阵,如果该矩阵有$ m $$ n $列,那么有$ \mathbf a\in R^{m\times n} $。这里,用不加粗的形式来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引所确定。例如,$ a_{ij} $表示第$ i $行、第$ j $列的矩阵元素。如下,$ \mathbf a $就定义了一个2行2列的矩阵。
\parinterval {\small\sffamily\bfseries{矩阵}}(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}
\end{pmatrix} \nonumber \\
& = & \begin{pmatrix}
1 & 2\\
3 & 4
\end{pmatrix}
......@@ -194,7 +195,7 @@
%--5.2.1.2矩阵的转置---------------------
\subsubsection{矩阵的转置}\index{Chapter5.2.1.2}
\parinterval {\small\sffamily\bfseries{转置}}(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} $。例如:
\parinterval {\small\sffamily\bfseries{转置}}(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} \\
{\mathbf a}^{\rm T} & = &\begin{pmatrix} 1 & 5\\3 & 4\\2 & 8\\6 & 2\end{pmatrix}
......@@ -228,15 +229,14 @@
%公式--------------------------------------------------------------------
\parinterval 矩阵加法满足以下运算规律:
\parinterval (1)交换律:$ \mathbf a+\mathbf b = \mathbf b +\mathbf a $
\parinterval (2)结合律:$ (\mathbf a+\mathbf b)+\mathbf c = \mathbf a+(\mathbf b+\mathbf c) $
\parinterval (3)$ \mathbf a+\mathbf 0=\mathbf a $,其中$ \mathbf 0 $指的是零矩阵,即元素皆为0的矩阵。
\parinterval (4)$ \mathbf a+(-\mathbf a)=\mathbf 0 $,其中$ -\mathbf a $是矩阵$ \mathbf a $的负矩阵,即将矩阵$ \mathbf a $的每个元素取负得到的矩阵。
\begin{itemize}
\item 交换律:$ \mathbf a+\mathbf b = \mathbf b +\mathbf a $
\item 结合律:$ (\mathbf a+\mathbf b)+\mathbf c = \mathbf a+(\mathbf b+\mathbf c) $
\item $ \mathbf a+\mathbf 0=\mathbf a $,其中$ \mathbf 0 $指的是零矩阵,即元素皆为0的矩阵。
\item $ \mathbf a+(-\mathbf a)=\mathbf 0 $,其中$ -\mathbf a $是矩阵$ \mathbf a $的负矩阵,即将矩阵$ \mathbf a $的每个元素取负得到的矩阵。
\end{itemize}
\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} $。下面的式子展示了矩阵数乘的计算过程。
\parinterval 矩阵的{\small\bfnew{数乘}}(Scalar Multiplication)是指标量(实数)与矩阵的乘法运算,计算过程是将标量与矩阵的每个元素相乘,最终得到与原矩阵形状相同的矩阵。例如,矩阵$ \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 & = &
......@@ -255,11 +255,11 @@
%公式--------------------------------------------------------------------
\parinterval 矩阵的数乘满足以下运算规律,其中$ k $$ l $是实数,$ \mathbf a $$ \mathbf b $是矩阵:
\parinterval (1)右分配律:$ k(\mathbf a+\mathbf b)=k\mathbf a+k\mathbf b $
\parinterval (2)左分配律:$ (k+l)\mathbf a=k\mathbf a+l\mathbf a $
\parinterval (3)结合律:$ (kl)\mathbf a=k(l\mathbf a) $
\begin{itemize}
\item 右分配律:$ k(\mathbf a+\mathbf b)=k\mathbf a+k\mathbf b $
\item 左分配律:$ (k+l)\mathbf a=k\mathbf a+l\mathbf a $
\item 结合律:$ (kl)\mathbf a=k(l\mathbf a) $
\end{itemize}
%--5.2.1.4矩阵乘法和矩阵点乘---------------------
\subsubsection{矩阵乘法和矩阵点乘}\index{Chapter5.2.1.4}
......@@ -272,9 +272,11 @@
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval 注意只有当第一个矩阵的列数与第二个矩阵的行数相等时,两个矩阵才可以作矩阵乘法。公式\ref{eqa1.7}展示了矩阵乘法的运算过程,若$\mathbf a=\begin{pmatrix}a_{11} & a_{12}& a_{13}\\a_{21} & a_{22} & a_{23}\end{pmatrix}$\\$\mathbf b=\begin{pmatrix}b_{11} & b_{12}\\b_{21} & b_{22}\\b_{31} & b_{32}\end{pmatrix} $,则有:
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf c = \mathbf a\mathbf b = \begin{pmatrix}
\mathbf c & = & \mathbf a\mathbf b \nonumber \\
& = & \begin{pmatrix}
a_{11}b_{11}+a_{12}b_{21}+a_{13}b_{31} & a_{11}b_{12}+a_{12}b_{22}+a_{13}b_{32}\\
a_{21}b_{11}+a_{22}b_{21}+a_{23}b_{31} & a_{21}b_{12}+a_{22}b_{22}+a_{23}b_{32}
\end{pmatrix}
......@@ -283,16 +285,18 @@
%公式--------------------------------------------------------------------
\parinterval 矩阵乘法满足以下运算规律:
\parinterval (1)结合律:若$ \mathbf a\in R^{m\times n} $$ \mathbf b\in R^{n\times p} $$ \mathbf c\in R^{p\times q} $,则$ (\mathbf {ab})\mathbf c=\mathbf a(\mathbf {bc}) $
\parinterval (2)左分配律:若$ \mathbf a\in R^{m\times n} $$ \mathbf b\in R^{m\times n} $$ \mathbf c\in R^{n\times p} $,则$ (\mathbf a+\mathbf b)\mathbf c=\mathbf {ac}+\mathbf {bc} $
\begin{itemize}
\item 结合律:若$ \mathbf a\in R^{m\times n} $$ \mathbf b\in R^{n\times p} $$ \mathbf c\in R^{p\times q} $,则$ (\mathbf {ab})\mathbf c=\mathbf a(\mathbf {bc}) $
\item 左分配律:若$ \mathbf a\in R^{m\times n} $$ \mathbf b\in R^{m\times n} $$ \mathbf c\in R^{n\times p} $,则$ (\mathbf a+\mathbf b)\mathbf c=\mathbf {ac}+\mathbf {bc} $
\item 右分配律:若$ \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 {ab}+\mathbf {ac} $
\end{itemize}
\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}
\parinterval 矩阵的点乘就是两个形状相同的矩阵各个对应元素相乘,矩阵点乘也被称为按元素乘积(element-wise product)或Hadamard乘积,记为$ \mathbf a \odot \mathbf b$。矩阵点乘的计算过程如下所示:
\parinterval 矩阵的点乘就是两个形状相同的矩阵各个对应元素相乘,矩阵点乘也被称为{\small\bfnew{按元素乘积}}(Element-wise Product)或Hadamard乘积,记为$ \mathbf a \odot \mathbf b$。例如,对于
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf a &=&
......@@ -306,8 +310,13 @@
3 & 1\\
2 & 1
\end{pmatrix}
\\
\mathbf c& = &\mathbf a\odot \mathbf b\;\;=\;\;\begin{pmatrix}
\end{eqnarray}
\parinterval 矩阵点乘的计算如下:
\begin{eqnarray}
\mathbf c & = & \mathbf a\odot \mathbf b \nonumber \\
& = & \begin{pmatrix}
1\times 3 & 0\times1\\
-1\times2 & 3\times1
\end{pmatrix}
......@@ -317,7 +326,7 @@
%--5.2.1.5线性映射---------------------
\subsubsection{线性映射}\index{Chapter5.2.1.5}
\parinterval {\small\sffamily\bfseries{线性映射}}( Linear Mapping)或{\small\sffamily\bfseries{线性变换}}(Linear Transformation)是从一个向量空间V到另一个向量空间W的映射函数$ f:v\rightarrow w$,且该映射函数保持加法运算和数量乘法运算,即对于空间V中任何两个向量$ \mathbf u $$ \mathbf v $以及任何标量$ c $
\parinterval {\small\sffamily\bfseries{线性映射}}( Linear Mapping)或{\small\sffamily\bfseries{线性变换}}(Linear Transformation)是从一个向量空间V到另一个向量空间W的映射函数$ f:v\rightarrow w$,且该映射函数保持加法运算和数量乘法运算,即对于空间V中任何两个向量$ \mathbf u $$ \mathbf v $以及任何标量$ c $,有
%公式--------------------------------------------------------------------
\begin{eqnarray}
f(\mathbf u+\mathbf v)&=&f(\mathbf u)+f(\mathbf v)\label{eqa1.9}\\
......@@ -325,9 +334,9 @@ f(c\mathbf v)&=&cf(\mathbf v)
\label{eqa1.10}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval 利用矩阵$ \mathbf a\in R^{m\times n} $,可以实现两个有限维欧氏空间的映射函数$f:R^n\rightarrow R^m$。例如$ n $维列向量$ \mathbf x $$ m\times n $的矩阵$ \mathbf a $,向量$ \mathbf x $左乘矩阵$ \mathbf a $,可将向量$ \mathbf x $映射为$ m $列向量,如下
\parinterval 利用矩阵$ \mathbf a\in R^{m\times n} $,可以实现两个有限维欧氏空间的映射函数$f:R^n\rightarrow R^m$。例如$ n $维列向量$ \mathbf x $$ m\times n $的矩阵$ \mathbf a $,向量$ \mathbf x $左乘矩阵$ \mathbf a $,可将向量$ \mathbf x $映射为$ m $列向量,对于
\begin{eqnarray}
\mathbf x&=&{\begin{pmatrix} x_1 & x_2 & \dots & x_n \end{pmatrix}}^{\rm T}
\mathbf x^{\textrm{T}} & = & {\begin{pmatrix} x_1, & x_2, & \dots &, x_n \end{pmatrix}}^{\rm T}
\label{eqa1.11}
\end{eqnarray}
\begin{eqnarray}
......@@ -341,8 +350,10 @@ f(c\mathbf v)&=&cf(\mathbf v)
\label{eqa1.12}
\end{eqnarray}
\parinterval 可以得到:
\begin{eqnarray}
\mathbf y& = &\mathbf a\mathbf x \nonumber \\
\mathbf y^{\textrm{T}}& = &\mathbf a\mathbf x^{\textrm{T}} \nonumber \\
& = &
\begin{pmatrix}
a_{11}x_{1}+a_{12}x_{2}+\dots+a_{1n}x_{n}\\
......@@ -353,16 +364,19 @@ f(c\mathbf v)&=&cf(\mathbf v)
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval 上例中矩阵$ \mathbf a $定义了一个从$ R^n $$ R^m $的线性映射:向量$ \mathbf x\in R^n $$ \mathbf y\in R^m $别为两个空间中的列向量,即大小为$ n\times 1 $$ m\times 1 $的矩阵。
\parinterval 上例中矩阵$ \mathbf a $定义了一个从$ R^n $$ R^m $的线性映射:向量$ \mathbf x^{\textrm{T}}\in R^n $$ \mathbf y^{\textrm{T}}\in R^m $别为两个空间中的列向量,即大小为$ n\times 1 $$ m\times 1 $ 的矩阵。
%--5.2.1.6范数---------------------
\subsubsection{范数}\index{Chapter5.2.1.6}
\parinterval 工程领域,经常会使用被称为{\small\bfnew{范数}}(Norm)的函数衡量向量大小,范数为向量空间内的所有向量赋予非零的正长度或大小。对于一个n维向量$ \mathbf x $,一个常见的范数函数为$ l_p $ 范数,通常表示为$ {\Vert{\mathbf x}\Vert}_p $ ,其中$p\geqslant 0$,是一个标量形式的参数。常用的$ p $的取值有$ 1 $$ 2 $$ \infty $等。范数的计算公式为:
\parinterval 工程领域,经常会使用被称为{\small\bfnew{范数}}(Norm)的函数衡量向量大小,范数为向量空间内的所有向量赋予非零的正长度或大小。对于一个$n$维向量$ \mathbf x $,一个常见的范数函数为$ l_p $ 范数,通常表示为$ {\Vert{\mathbf x}\Vert}_p $ ,其中$p\ge 0$,是一个标量形式的参数。常用的$ p $的取值有$ 1 $$ 2 $$ \infty $等。范数的计算公式为:
%公式--------------------------------------------------------------------
\begin{eqnarray}
l_p(\mathbf x)&=&{\Vert{\mathbf x}\Vert}_p\;\;=\;\;{\left (\sum_{i=1}^{n}{{\vert x_{i}\vert}^p}\right )}^{\frac{1}{p}}
l_p(\mathbf x) & = & {\Vert{\mathbf x}\Vert}_p \nonumber \\
& = & {\left (\sum_{i=1}^{n}{{\vert x_{i}\vert}^p}\right )}^{\frac{1}{p}}
\label{eqa1.14}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval $ l_1 $范数为向量的各个元素的绝对值之和:
%公式--------------------------------------------------------------------
......@@ -379,7 +393,7 @@ l_p(\mathbf x)&=&{\Vert{\mathbf x}\Vert}_p\;\;=\;\;{\left (\sum_{i=1}^{n}{{\vert
\label{eqa1.16}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval $ l_2 $范数被称为欧几里得范数(Euclidean norm)。从几何角度,向量也可以表示为从原点出发的一个带箭头的有向线段,其$ l_2 $范数为线段的长度,也常被称为向量的模。$ l_2 $范数在机器学习中出现地十分频繁,向量$ \mathbf x $$ l_2 $范数经常简化为$ \Vert{\mathbf x}\Vert $,可以简单地通过点积$ {\mathbf x}^{\rm T}\mathbf x $计算。
\parinterval $ l_2 $范数被称为{\small\bfnew{欧几里得范数}}(Euclidean Norm)。从几何角度,向量也可以表示为从原点出发的一个带箭头的有向线段,其$ l_2 $范数为线段的长度,也常被称为向量的模。$ l_2 $ 范数在机器学习中非常常用,向量$ \mathbf x $$ l_2 $范数经常简化为$ \Vert{\mathbf x}\Vert $,可以简单地通过点积$ {\mathbf x}^{\rm T}\mathbf x $计算。
\parinterval $ l_{\infty} $范数为向量的各个元素的最大绝对值:
%公式--------------------------------------------------------------------
......@@ -388,15 +402,15 @@ l_p(\mathbf x)&=&{\Vert{\mathbf x}\Vert}_p\;\;=\;\;{\left (\sum_{i=1}^{n}{{\vert
\label{eqa1.17}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval 范数是将向量映射到非负值的函数,其作用是衡量向量$ \mathbf x $到坐标原点的距离。更严格的说,范数并不拘于$ l_p $范数,任何一个同时满足下列性质的函数都可以作为范数:
\parinterval 广义上讲,范数是将向量映射到非负值的函数,其作用是衡量向量$ \mathbf x $到坐标原点的距离。更严格的说,范数并不拘于$ l_p $范数,任何一个同时满足下列性质的函数都可以作为范数:
\parinterval (1)若$ f(x)=0 $,则$ x=0 $
\parinterval (2)三角不等式:$ f(x+y)\leqslant f(x)+f(y) $
\parinterval (3)任意实数$ \alpha $$ f(\alpha x)=\vert \alpha \vert f(x) $
\begin{itemize}
\item$ f(x)=0 $,则$ x=0 $
\item 三角不等式:$ f(x+y)\leqslant f(x)+f(y) $
\item 任意实数$ \alpha $$ f(\alpha x)=\vert \alpha \vert f(x) $
\end{itemize}
\parinterval 在深度学习中,有时候希望衡量矩阵的大小,最常见的做法是使用 {\small\bfnew{Frobenius 范数}}(Frobenius Norm),其类似于向量的$ l_2 $范数,计算方式为:
\parinterval 在深度学习中,有时候希望衡量矩阵的大小,这时可以考虑使用 {\small\bfnew{Frobenius 范数}}(Frobenius Norm)。计算方式为:
%公式--------------------------------------------------------------------
\begin{eqnarray}
{\Vert{\mathbf A}\Vert}_F&=&\sqrt{\sum_{i,j} A_{i,j}^2}
......@@ -417,7 +431,7 @@ l_p(\mathbf x)&=&{\Vert{\mathbf x}\Vert}_p\;\;=\;\;{\left (\sum_{i=1}^{n}{{\vert
\end{figure}
%-------------------------------------------
\parinterval 同样,人工神经元是人工神经网络的基本单元,在人们的想象中,人工神经元应该与生物神经元类似,实际在形态上,人工神经元和生物神经元还是有一定差别的。如图\ref{fig:artificial-neuron}是一个典型的人工神经元,其本质是一个形似$ y=f(\mathbf x\cdot \mathbf w+b) $的函数。显而易见,一个神经元主要由$ \mathbf x $$ \mathbf w $$ b $$ f $四个部分构成。其中$ \mathbf x $是一个形如$ (x_0,x_1,\dots,x_n) $的实数向量,在一个神经元中担任``输入''的角色。$ \mathbf w $是一个权重矩阵,其中的每一个元素都对应着一个输入和一个输出,代表着``某输入对某输出的贡献程度'',通常也被理解为神经元连接的{\small\sffamily\bfseries{权重}}(weight)。$ b $被称作偏置,是一个实数。$ f $叫做激活函数,其本质是一个非线性函数。可见,一个人工神经元的功能是将输入向量与权重矩阵右乘(做内积)后,加上偏置量,经过一个非线性激活函数得到一个标量结果。
\parinterval 同样,人工神经元是人工神经网络的基本单元。在人们的想象中,人工神经元应该与生物神经元类似。但事实上,二者在形态上是有明显差别的。如图\ref{fig:artificial-neuron} 是一个典型的人工神经元,其本质是一个形似$ y=f(\mathbf x\cdot \mathbf w+b) $的函数。显而易见,一个神经元主要由$ \mathbf x $$ \mathbf w $$ b $$ f $四个部分构成。其中$ \mathbf x $是一个形如$ (x_0,x_1,\dots,x_n) $的实数向量,在一个神经元中担任``输入''的角色。$ \mathbf w $是一个权重矩阵,其中的每一个元素都对应着一个输入和一个输出,代表着``某输入对某输出的贡献程度'',通常也被理解为神经元连接的{\small\sffamily\bfseries{权重}}(weight)。$ b $被称作偏置,是一个实数。$ f $被称作激活函数,其本质是一个非线性函数。可见,一个人工神经元的功能是将输入向量与权重矩阵右乘(做内积)后,加上偏置量,经过一个非线性激活函数得到一个标量结果。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -429,9 +443,9 @@ l_p(\mathbf x)&=&{\Vert{\mathbf x}\Vert}_p\;\;=\;\;{\left (\sum_{i=1}^{n}{{\vert
%-------------------------------------------
%--5.2.2.1感知机\ \dash \ 最简单的人工神经元模型---------------------
\subsubsection{(一)感知机\ \dash \ 最简单的人工神经元模型}\index{Chapter5.2.2.1}
\subsubsection{感知机\ \dash \ 最简单的人工神经元模型}\index{Chapter5.2.2.1}
\parinterval 感知机是人工神经元的一种实例,在上世纪50-60年代被提出后,对神经网络研究产生了深远的影响。感知机模型如图\ref {fig:perceptron-mode}所示,其输入是一个n维二值向量$ \mathbf x=(x_0,x_1,\dots,x_n) $,其中$ x_i=0 $$ 1 $。权重$ \mathbf w=(w_0,w_1,\dots,w_n) $,每个输入变量对应一个权重$ w_i $(实数)。偏置$ b $是一个实数变量($ -\sigma $)。输出也是一个二值结果,即$ y=0 $$ 1 $$ y $值的判定由输入的加权和是否大于(或小于)一个阈值$ \sigma $决定
\parinterval 感知机是人工神经元的一种实例,在上世纪50-60年代被提出后,对神经网络研究产生了深远的影响。感知机模型如图\ref {fig:perceptron-mode}所示,其输入是一个$n$维二值向量$ \mathbf x=(x_0,x_1,\dots,x_n) $,其中$ x_i=0 $$ 1 $。权重$ \mathbf w=(w_0,w_1,\dots,w_n) $,每个输入变量对应一个权重$ w_i $(实数)。偏置$ b $是一个实数变量($ -\sigma $)。输出也是一个二值结果,即$ y=0 $$ 1 $$ y $值的判定由输入的加权和是否大于(或小于)一个阈值$ \sigma $决定(图\ref{fig:perceptron-mode}
%公式--------------------------------------------------------------------
\begin{eqnarray}
y=\begin{cases} 0 & \sum_{i}{x_i\cdot w_i}-\sigma <0\\1 & \sum_{i}{x_i\cdot w_i}-\sigma \geqslant 0\end{cases}
......@@ -451,11 +465,11 @@ y=\begin{cases} 0 & \sum_{i}{x_i\cdot w_i}-\sigma <0\\1 & \sum_{i}{x_i\cdot w_i}
\parinterval 感知机可以做一些简单的决策。举一个非常简单的例子,有一场音乐会,你正在纠结是否去参加,有三个因素会影响你的决定:
\parinterval $ x_0 $:剧场是否离你足够近(是,则$ x_0=1 $;否则$ x_0=0 $
\parinterval $ x_1 $:票价是否低于300元(是,则$ x_1=1 $;否则$ x_1=0 $
\parinterval $ x_2 $:女朋友是否喜欢音乐会(是,则$ x_2=1 $;否则$ x_2=0 $
\begin{itemize}
\item $ x_0 $:剧场是否离你足够近(是,则$ x_0=1 $;否则$ x_0=0 $);
\item $ x_1 $:票价是否低于300元(是,则$ x_1=1 $;否则$ x_1=0 $);
\item $ x_2 $:女朋友是否喜欢音乐会(是,则$ x_2=1 $;否则$ x_2=0 $)。
\end{itemize}
\parinterval 在这种情况下应该如何做出决定呢?比如,女朋友很希望和你一起去看音乐会,但是剧场很远而且票价500元,如果这些因素对你都是同等重要的(即$ w_0=w_1=w_2 $,假设这三个权重都设置为1)那么会得到一个综合得分:
%公式--------------------------------------------------------------------
......@@ -465,7 +479,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 \nonumbe
\label{eqa1.20}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval 如果你不是十分纠结的人,能够接受不完美的事情,你可能会把$ \sigma $设置为1,于是$ \sum{w_i\cdot x_i}-\sigma \geqslant 0 $,那么你会去音乐会。可以看出,上面的例子的本质就是一个如图\ref{fig:perceptron-to-predict-1}的感知机:
\parinterval 如果你不是十分纠结的人,能够接受不完美的事情,你可能会把$ \sigma $设置为1,于是$ \sum{w_i\cdot x_i}-\sigma \ge 0 $,那么你会去音乐会。可以看出,上面的例子的本质就是一个如图\ref{fig:perceptron-to-predict-1}的感知机:
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -476,11 +490,9 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
\end{figure}
%-------------------------------------------
%--5.2.2.2神经元内部权重---------------------
\subsubsection{(二)神经元内部权重}\index{Chapter5.2.2.2}
\subsubsection{神经元内部权重}\index{Chapter5.2.2.2}
\parinterval 上面例子中的决策过程本质是一个感知机,其中的连接权重代表着每个输入因素对最终输出结果的重要程度,为了得到令人满意的决策,需要不断调整权重。
\parinterval 在上面的例子中,如果你是守财奴,则会对票价看得更重一些,这样你会用不均匀的权重计算每个因素的影响,比如:$ w_0=0.5 $$ w_1=2 $$ w_2=0.5 $,此时感知机模型如图\ref{fig:perceptron-to-predict-2}所示。在这种情况下,女友很希望和你一起去看音乐会,但是剧场很远而且票价有500元,会导致你不去看音乐会,因为
\parinterval 在上面的例子中,连接权重代表着每个输入因素对最终输出结果的重要程度,为了得到令人满意的决策,需要不断调整权重。如果你是守财奴,则会对票价看得更重一些,这样你会用不均匀的权重计算每个因素的影响,比如:$ w_0=0.5 $$ w_1=2 $$ w_2=0.5 $,此时感知机模型如图\ref{fig:perceptron-to-predict-2}所示。在这种情况下,女友很希望和你一起去看音乐会,但是剧场很远而且票价有500元,会导致你不去看音乐会,因为
%公式--------------------------------------------------------------------
\begin{eqnarray}
\sum_{i}{x_i\cdot w_i} & = & 0\cdot 0.5+0\cdot 2+1\cdot 0.5 \nonumber \\
......@@ -500,8 +512,9 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
%-------------------------------------------
\parinterval 当然,结果是女友对这个结果非常不满意,让你跪键盘上反思一下自己。
%--5.2.2.3神经元的输入\ \dash \ 离散 vs 连续---------------------
\subsubsection{(三)神经元的输入\ \dash \ 离散 vs 连续}\index{Chapter5.2.2.3}
\subsubsection{神经元的输入\ \dash \ 离散 vs 连续}\index{Chapter5.2.2.3}
\parinterval 在遭受了女友一万点伤害之后,你意识到决策考虑的因素(即输入)不应该只是非0即1,而应该把``程度''考虑进来,于是你改变了三个输入的形式:
......@@ -533,7 +546,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 \nonumbe
%公式--------------------------------------------------------------------
\parinterval 虽然剧场很远,价格有点贵,但是女友很满意,你还是很高兴。
%--5.2.2.4神经元内部的参数学习---------------------
\subsubsection{(四)神经元内部的参数学习}\index{Chapter5.2.2.4}
\subsubsection{神经元内部的参数学习}\index{Chapter5.2.2.4}
\parinterval 一次成功的音乐会之后,你似乎掌握了一个真理:其他什么都不重要,女友的喜好最重要,所以你又将决策模型的权重做出了调整:最简单的方式就是$ w_0=w_1=0 $,同时令$ w_2>0 $,相当于只考虑$ x_2 $的影响而忽略其他因素,于是你得到了如图\ref {fig:perceptron-to-predict-3}所示的决策模型:
%----------------------------------------------
......@@ -554,23 +567,32 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
\vspace{0.5em}
\begin{itemize}
\item 对问题建模即定义输入$ \{x_i\} $的形式。
\item 对问题建模即定义输入$ \{x_i\} $的形式。
\vspace{0.5em}
\item 设计有效的决策模型即定义$ y $
\item 设计有效的决策模型即定义$ y $
\vspace{0.5em}
\item 决定模型所涉及的参数(如权重$ \{w_i\} $)的最优值。
\end{itemize}
\vspace{0.5em}
\parinterval 上面的例子对这三个问题都简要的做出了回答。下面的内容将继续对它们进行详细阐述。
%--5.2.3多层神经网络---------------------
\subsection{多层神经网络}\index{Chapter5.2.3}
\parinterval 感知机也被称作一种最简单的单层神经网络。一个非常自然的问题是:能否把多个这样的网络叠加在一起,获得建模更复杂问题的能力?如果可以,那么在多层神经网络的每一层,神经元之间是怎么组织、工作的呢?单层网络又是通过什么方式构造成多层的呢?
\parinterval 感知机一种最简单的单层神经网络。一个非常自然的问题是:能否把多个这样的网络叠加在一起,获得建模更复杂问题的能力?如果可以,那么在多层神经网络的每一层,神经元之间是怎么组织、工作的呢?单层网络又是通过什么方式构造成多层的呢?
%--5.2.3.1线性变换和激活函数---------------------
\subsubsection{线性变换和激活函数}\index{Chapter5.2.3.1}
\parinterval 为了建立多层神经网络,首先需要把前面提到的简单的神经元进行扩展,把多个神经元组成一``层''神经元。比如,很多实际问题需要同时有多个输出,这时可以把多个相同的神经元并列起来,每个神经元都会有一个单独的输出,这就构成一``层'',形成了单层神经网络。单层神经网络中的每一个神经元都对应着一组权重和一个输出,可以把单层神经网络中的不同输出看作一个事物不同角度的描述。举个简单的例子,预报天气时,往往需要预测温度、湿度和风力,这就意味着如果使用单层神经网络进行预测,需要设置3个神经元。如图\ref{fig:corresponence-between-matrix-element-and-output},权重矩阵$ \mathbf w=\begin{pmatrix} w_{00} & w_{01} & w_{02}\\ w_{10} & w_{11} & w_{12}\end{pmatrix} $中第一列元素$ \begin{pmatrix} w_{00}\\ w_{10}\end{pmatrix} $是输入相对第一个输出$ y_0 $ 的权重,参数向量$ \mathbf b=(b_0,b_1,b_2) $的第一个元素$ b_0 $是对应于第一个输出$ y_0 $的偏置量;类似的,可以得到$ y_1 $$ y_2 $。预测天气的单层模型如图\ref{fig:single-layer-of-neural-network-for-weather-prediction}所示(在本例中,假设输入$ \mathbf x=(x_0,x_1) $)。
\parinterval 为了建立多层神经网络,首先需要把前面提到的简单的神经元进行扩展,把多个神经元组成一``层''神经元。比如,很多实际问题需要同时有多个输出,这时可以把多个相同的神经元并列起来,每个神经元都会有一个单独的输出,这就构成一``层'',形成了单层神经网络。单层神经网络中的每一个神经元都对应着一组权重和一个输出,可以把单层神经网络中的不同输出看作一个事物不同角度的描述。
举个简单的例子,预报天气时,往往需要预测温度、湿度和风力,这就意味着如果使用单层神经网络进行预测,需要设置3个神经元。如图\ref{fig:corresponence-between-matrix-element-and-output},权重矩阵为:
\begin{equation}
\mathbf w=\begin{pmatrix} w_{00} & w_{01} & w_{02}\\ w_{10} & w_{11} & w_{12}\end{pmatrix}
\end{equation}
\noindent 它的第一列元素$ \begin{pmatrix} w_{00}\\ w_{10}\end{pmatrix} $是输入相对第一个输出$ y_0 $ 的权重,参数向量$ \mathbf b=(b_0,b_1,b_2) $的第一个元素$ b_0 $是对应于第一个输出$ y_0 $ 的偏置量;类似的,可以得到$ y_1 $$ y_2 $。预测天气的单层模型如图\ref{fig:single-layer-of-neural-network-for-weather-prediction}所示(在本例中,假设输入$ \mathbf x=(x_0,x_1) $)。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -591,15 +613,17 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
\end{figure}
%-------------------------------------------
\parinterval 在神经网络中,对于输入向量$ \mathbf x\in R^m $,一层神经网络首先将其经过线性变换映射到$ R^n $,再经过激活函数变成$ \mathbf y\in R^n $。还是上面天气预测的例子,每个神经元获得相同的输入,权重矩阵$ \mathbf w $是一个$ 2\times 3 $矩阵,矩阵中每个元素$ w_{ij} $代表第$ j $个神经元中$ x_{i} $对应的权重值,假设编号为0的神经元负责预测温度,则$ w_{0j} $含义为预测温度时,输入$ x_{i} $对其影响程度。此外所有神经元的偏置$ b_{0} $$ b_{1} $$ b_{2} $组成了最终的偏置向量$ \mathbf b $
\parinterval 在该例中则有,权重矩阵$ \mathbf w=\begin{pmatrix} w_{00} & w_{01} & w_{02}\\ w_{10} & w_{11} & w_{12}\end{pmatrix} $,偏置向量$ \mathbf b=(b_0,b_1,b_2) $
\parinterval 在神经网络中,对于输入向量$ \mathbf x\in R^m $,一层神经网络首先将其经过线性变换映射到$ R^n $,再经过激活函数变成$ \mathbf y\in R^n $。还是上面天气预测的例子,每个神经元获得相同的输入,权重矩阵$ \mathbf w $是一个$ 2\times 3 $矩阵,矩阵中每个元素$ w_{ij} $代表第$ j $个神经元中$ x_{i} $对应的权重值,假设编号为0的神经元负责预测温度,则$ w_{0j} $含义为预测温度时,输入$ x_{i} $对其影响程度。此外所有神经元的偏置$ b_{0} $$ b_{1} $$ b_{2} $组成了最终的偏置向量$ \mathbf b $。在该例中则有,权重矩阵$ \mathbf w=\begin{pmatrix} w_{00} & w_{01} & w_{02}\\ w_{10} & w_{11} & w_{12}\end{pmatrix} $,偏置向量$ \mathbf b=(b_0,b_1,b_2) $
\parinterval 那么,线性变换的本质是什么?
\begin{itemize}
\item 从代数角度看,对于线性空间$ \rm V $,任意$ a,b\in {\rm V} $和数域中的任意$ \alpha $,线性变换$ T(\cdot) $需满足:$ T(a+b)=T(a)+T(b) $$ T(\alpha a)=\alpha T(a) $
\item 从几何角度上看,公式中的$ \mathbf x\cdot \mathbf w+\mathbf b $$ \mathbf x $右乘$ \mathbf w $相当于对$ \mathbf x $进行旋转变换,如图\ref{fig:rotation}所示,对三个点$ (0,0) $$ (0,1) $$ (1,0) $及其围成的矩形区域右乘$ \mathbf w=\begin{pmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1\end{pmatrix} $\\后,矩形区域由第一象限旋转90度到了第四象限。
\item 从代数角度看,对于线性空间$ \rm V $,任意$ a,b\in {\rm V} $和数域中的任意$ \alpha $,线性变换$ T(\cdot) $需满足:$ T(a+b)=T(a)+T(b) $,且$ T(\alpha a)=\alpha T(a) $
\item 从几何角度上看,公式中的$ \mathbf x\cdot \mathbf w+\mathbf b $$ \mathbf x $右乘$ \mathbf w $相当于对$ \mathbf x $进行旋转变换,如图\ref{fig:rotation}所示,对三个点$ (0,0) $$ (0,1) $$ (1,0) $及其围成的矩形区域右乘如下矩阵:
\begin{equation}
\mathbf w=\begin{pmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1\end{pmatrix}
\end{equation}
这样,矩形区域由第一象限旋转90度到了第四象限。
\end{itemize}
%----------------------------------------------
......@@ -623,7 +647,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 \nonumbe
\end{figure}
%-------------------------------------------
\parinterval 也就是说,线性变换提供了对输入数据进行空间中旋转、平移的能力。当然,线性变换也适用于更加复杂的情况,这也为神经网络提供了拟合不同函数的能力。比如,可以利用线性变换将三维图形投影到二维平面上,或者将二维平面上的图形映射到三维平面。如图\ref{fig:linear-transformation},通过一个简单的线性变换,将三维图形投影到二维平面上。
\parinterval 也就是说,线性变换提供了对输入数据进行空间中旋转、平移的能力。当然,线性变换也适用于更加复杂的情况,这也为神经网络提供了拟合不同函数的能力。比如,可以利用线性变换将三维图形投影到二维平面上,或者将二维平面上的图形映射到三维平面。如图\ref{fig:linear-transformation},通过一个简单的线性变换,可以将三维图形投影到二维平面上。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -634,9 +658,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 \nonumbe
\end{figure}
%-------------------------------------------
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$ \mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为描述更加复杂的问题提供了工具。
\parinterval 神经网络方法的本质是拟合输入与输出的函数关系,正是激活函数赋予了神经网络拟合任何函数的能力。常见的非线性函数有Sigmoid、Relu、Tanh等。如图\ref{fig:activation}列举了几种激活函数的函数曲线。
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$ \mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为描述更加复杂的问题提供了工具。常见的非线性函数有Sigmoid、Relu、Tanh等。如图\ref{fig:activation}列举了几种激活函数的形式。
%----------------------------------------------
% 图
\begin{figure}\centering
......@@ -688,7 +710,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 \nonumbe
%--5.2.3.2单层神经网络->多层神经网络---------------------
\subsubsection{单层神经网络$\rightarrow$多层神经网络}\index{Chapter5.2.3.2}
\parinterval 单层神经网络由线性变换和激活函数两部分构成,但在实际问题中,单层网络并不足以拟合所有函数关系,因此很自然的想到将单层网络扩展到多层神经网络即深层神经网络。将一层神经网络的最终输出向量作为另一层神经网络的输入向量,通过这种方式可以将多层神经网络连接在一起,如图\ref{fig:more-layers}所示.
\parinterval 单层神经网络由线性变换和激活函数两部分构成,但在实际问题中,单层网络并不能很好的拟合复杂函数。因此很自然的想到将单层网络扩展到多层神经网络即深层神经网络。将一层神经网络的最终输出向量作为另一层神经网络的输入向量,通过这种方式可以将多层神经网络连接在一起,如图\ref{fig:more-layers}所示。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -713,11 +735,11 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
%--5.2.4函数拟合能力---------------------
\subsection{函数拟合能力}\index{Chapter5.2.4}
\parinterval 神经网络方法本质上就是在构造一个函数,将输入$ \mathbf x $转化为输出$ \mathbf y $。神经网络方法之所以受到青睐一方面是由于它提供了端到端学习的模式,另一方面是由于它强大的函数拟合能力。理论上说,神经网络可以拟合任何形状的函数。下面就来看一下为什么神经网络会有这样的能力。
\parinterval 神经网络方法之所以受到青睐一方面是由于它提供了端到端学习的模式,另一方面是由于它强大的函数拟合能力。理论上说,神经网络可以拟合任何形状的函数。下面就来看一下为什么神经网络会有这样的能力。
\parinterval 众所周知,单层神经网络无法解决线性不可分问题,比如经典的异或问题。但是具有一个隐藏层的两层神经网络在理论上就可以拟合所有的函数了。有些神奇?接下来我们分析一下为什么仅仅是多了一层,神经网络就能变得如此强大。在此之前,需要明确的一点是,``拟合''是把平面上一系列的点,用一条光滑的曲线连接起来,并用函数来表示这条拟合的曲线。在用神经网络解决问题时,可以通过拟合训练数据中的``数据点''来获得输入与输出之间的函数关系,并利用其对未知数据做出判断。可以假设输入与输出之间存在一种函数关系,而神经网络的``拟合''能力并不是可以完全准确的计算某输入对应的原函数输出值,而是尽可能地逼近原函数输出值,与原函数输出值越逼近,则意味着拟合得越优秀。
\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]
......@@ -808,12 +830,13 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
\vspace{0.5em}
\parinterval 在本书后面的内容中还会看到,深层网络在机器翻译中可以带来明显的性能提升。
%--5.3神经网络的张量实现-----------------------------------------
\section{神经网络的张量实现}\index{Chapter5.3}
\parinterval 在神经网络内部,输入经过若干次变换,最终得到输出的结果。这个过程类似于一种逐层的数据``流动''。不禁会产生这样的疑问:在神经网络中,数据是以哪种形式``流动''的?如何去编程实现这种数据``流动''呢?
\parinterval 在神经网络内部,输入经过若干次变换,最终得到输出的结果。这个过程类似于一种逐层的数据``流动''。不禁会产生这样的疑问:在神经网络中,数据是以哪种形式``流动''的?如何去编程实现这种数据``流动''呢?
\parinterval 为了解决上面的问题,本节将介绍人工神经网络的更加通用的描述形式 \ \dash \ 张量计算。随后也会看到,基于张量这个数学工具,可以方便的用深度学习框架搭建神经网络。
\parinterval 为了解决上面的问题,本节将介绍人工神经网络更加通用的描述形式 \ \dash \ 张量计算。随后也会看到,基于张量用数学工具,可以方便的搭建神经网络。
%--5.3.1 张量及其计算---------------------
\subsection{ 张量及其计算}\index{Chapter5.3.1}
......@@ -829,9 +852,9 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
\label{}
\end{eqnarray}
%公式--------------------------------------------------------------------
\parinterval 简单来说,张量可以为描述数据提供更多方便,是一种通用的工具。比如,输入的量有三个维度在变化,用矩阵不容易描述,但是用张量却很容易。
\parinterval 简单来说,是一种通用的工具,用于描述由多个数据构成的量。比如,输入的量有三个维度在变化,用矩阵不容易描述,但是用张量却很容易。
\parinterval 从计算机实现的角度来看,现在所有深度学习框架都把张量定义为``多维数组''。张量有一个非常重要的属性\ \dash \ 阶(rank)。可以将多维数组中``维''的属性与张量的``阶''的属性作类比,这两个属性都表示多维数组(张量)有多少个独立的方向。例如,3是一个标量(scalar),相当于一个0维数组或0阶张量;$ {(\begin{array}{cccc} 2 & -3 & 0.8 & 0.2\end{array})}^{\rm T} $是一个向量(vector),相当于一个1维数组或1阶张量;$ \begin{pmatrix} -1 & 3 & 7\\ 0.2 & 2 & 9\end{pmatrix} $是一个矩阵(matrix),相当于一个2维数组或2阶张量;如图\ref{fig:tensor-sample},这是一个3维数组或3阶张量,其中,每个$4 \times 4$的方形代表一个2阶张量,这样的方形有4个,最终形成3阶张量。
\parinterval 从计算机实现的角度来看,现在所有深度学习框架都把张量定义为``多维数组''。张量有一个非常重要的属性\ \dash \ {\small\bfnew{}}(Rank)。可以将多维数组中``维''的属性与张量的``阶''的属性作类比,这两个属性都表示多维数组(张量)有多少个独立的方向。例如,3是一个标量(Scalar),相当于一个0维数组或0阶张量;$ {(\begin{array}{cccc} 2 & -3 & 0.8 & 0.2\end{array})}^{\rm T} $ 是一个向量(Vector),相当于一个1维数组或1阶张量;$ \begin{pmatrix} -1 & 3 & 7\\ 0.2 & 2 & 9\end{pmatrix} $是一个矩阵(Matrix),相当于一个2维数组或2阶张量;如图\ref{fig:tensor-sample},这是一个3 维数组或3阶张量,其中,每个$4 \times 4$的方形代表一个2阶张量,这样的方形有4个,最终形成3阶张量。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -846,9 +869,9 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2 & = & 0\cdot 1+0\cdot 1+1\cdot 1 \nonumbe
\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} $
\parinterval 从我们的物理世界看,如果一个物理量在物体的某个位置上只是一个单值,那么它是一个标量,例如密度;如果一个物理量在同一个位置、从多个方向上看,有不同的值,那么这个物理量就是一个的张量。比如物理学中常用的应力的描述就是一个典型的张量。举一个简单的例子:$ \mathbf T(\mathbf v,\mathbf u) $是一个三维空间$(\textrm{x},\textrm{y},\textrm{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} $。但在三维空间$(\textrm{x},\textrm{y},\textrm{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} $
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -872,6 +895,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 \nonumbe
\parinterval 其中,$ \begin{pmatrix} v_x\\v_y\\v_z\end{pmatrix} $是向量$ \mathbf v $在基向量(x,y,z)上的投影,$ \begin{pmatrix} u_x\\u_y\\u_z\end{pmatrix} $是向量$ \mathbf u $在基向量(x,y,z)上的投影,$ \begin{pmatrix}T_{xx} & T_{xy} & T_{xz}\\T_{yx} & T_{yy} & T_{yz}\\T_{zx} & T_{zy} & T_{zz}\end{pmatrix} $是张量$ \mathbf T $在3*3个方向上的分量,恰巧用``矩阵''表示,记为$ [\mathbf T] $
\parinterval 上面讲了很多和神经网络不太相关的内容,目的是要明确张量的原始定义,以避免对这个概念的误解。但是,在本书中,我们仍然遵循深度学习中常用的概念,把张量理解为多维数组。使用张量,我们可以更容易的表示更高阶的数学形式。在保证数学表达的简洁性的同时,使程序实现接口更加统一。
%--5.3.1.2张量的矩阵乘法---------------------
\subsubsection{张量的矩阵乘法}\index{Chapter5.3.1.2}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论