From 66198ccc2ee8c8326366eed05bc5fa836b1a7f60 Mon Sep 17 00:00:00 2001 From: Sword York Date: Wed, 7 Dec 2016 20:02:45 +0800 Subject: [PATCH] Chapter 1,4,7,10,14 Former-commit-id: 7d563fbc2a45afcc328a120a5b16a14f9f48fe68 --- .gitignore | 19 + Chapter1/introduction.tex | 558 +++ Chapter10/sequence_modeling_rnn.tex | 1201 +++++++ Chapter14/autoencoders.tex | 660 ++++ Chapter4/numerical_computation.tex | 530 +++ Chapter7/regularization.tex | 1270 +++++++ Makefile | 5 + README.md | 37 + acknowledgments.tex | 2 + breakcites.sty | 17 + dlbook_cn.pdf.REMOVED.git-id | 1 + dlbook_cn.tex | 147 + figure.pdf | Bin 0 -> 41600 bytes math_symbol.tex | 281 ++ natbib.bst | 1288 +++++++ notation.tex | 13 + terminology.tex | 5059 +++++++++++++++++++++++++++ 17 files changed, 11088 insertions(+) create mode 100644 .gitignore create mode 100644 Chapter1/introduction.tex create mode 100644 Chapter10/sequence_modeling_rnn.tex create mode 100644 Chapter14/autoencoders.tex create mode 100644 Chapter4/numerical_computation.tex create mode 100644 Chapter7/regularization.tex create mode 100644 Makefile create mode 100644 README.md create mode 100644 acknowledgments.tex create mode 100644 breakcites.sty create mode 100644 dlbook_cn.pdf.REMOVED.git-id create mode 100644 dlbook_cn.tex create mode 100644 figure.pdf create mode 100644 math_symbol.tex create mode 100644 natbib.bst create mode 100644 notation.tex create mode 100644 terminology.tex diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..09089cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +.* +*.aux +*.gz +*.aux +*.backup +*.log +*.kilepr +*.toc +*.out +agreement.jpg +dlbook_cn.acn +dlbook_cn.acr +dlbook_cn.alg +dlbook_cn.brf +dlbook_cn.xdy +dlbook_cn.bbl +dlbook_cn.blg +dlbook_cn.idx +dlbook_cn.ind diff --git a/Chapter1/introduction.tex b/Chapter1/introduction.tex new file mode 100644 index 0000000..16112b6 --- /dev/null +++ b/Chapter1/introduction.tex @@ -0,0 +1,558 @@ +% Translator: Shenjian Zhao +\chapter{前言} +\label{chap:introduction} +自古以来,创造者就梦想着创造能思考的机器。 +这个愿望至少可以追溯到古希腊的时期。 +神话人物皮格马利翁(Pygmalion)、代达罗斯(Daedalus)和赫淮斯托斯(Hephaestus)都可以被视为传说中的发明家,而加拉蒂亚(Galatea)、塔洛斯(Talos)和潘多拉(Pandora)都可以被看作是人造生命\citep{ovid2004metamorphoses,sparkes1996red,1997works}。 + +当人类第一次构思可编程计算机时,就已经在思考计算机能否变得智能,尽管这距造出一台还有一百年多年之久\citep{Lovelace1842}。 +如今,\firstacr{AI}是一个具有许多实际应用和活跃研究课题的领域,并蓬勃发展着。 +我们指望通过智能软件自动化处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究。 + +在\gls{AI}的早期,那些对人类智力来说是困难但对计算机来说是相对简单的问题得到迅速解决,比如那些可以通过一系列形式的数学规则来描述的问题。 +\gls{AI}的真正挑战被证明是解决对人来说很容易执行,但很难形式化描述的任务,也就是我们人类能自动的靠直观解决的问题,比如识别说的话或图像中的脸。 + +这本书讨论这些更直观的问题一种解决方案。 +这种解决方案是为了让计算机从经验中学习,并通过层次化概念体系来理解世界,其中每个概念通过与较简单概念之间的联系来定义。 +让计算机通过经验获取知识可以避免人工形式地指定的计算机需要的所有知识。 +层次化的概念让计算机通过构建较简单的概念来学习复杂概念。 +如果绘制出这些概念如何建立在彼此之上的图,我们将得到一张``深''(层次很多)的图。 +出于这个原因,我们称这种方法为\glssymbol{AI}\firstgls{DL}。 + +% -- 1 -- + +许多\glssymbol{AI}的早期成功发生在相对干净且正式的环境中, 计算机不需要具备很多关于世界的知识。 +例如,IBM的深蓝(Deep Blue)国际象棋系统在1997年击败了世界冠军\ENNAME{Garry Kasparov}\citep{Hsu2002}。 +当然国际象棋是一个非常简单的领域,仅含有64个位置并只能以严格限制的方式移动32个棋子。 +设计一种成功的国际象棋策略是一个巨大的成就,但挑战并不是向计算机描述棋子和允许的移动的困难性。 +国际象棋完全可以由一个非常简短的、完全形式化的规则列表描述,并可以轻松由程序员提前提供。 + +讽刺的是,抽象和形式的任务对人类而言是最困难的脑力任务之一,对计算机而言却属于最容易的。 +计算机早已能够打败即便是最好的人类棋手,但直到最近才在识别对象或语音的任务中到达匹配人类平均的能力。 +一个人的日常生活需要关于世界的巨量知识。 +很多这方面的知识是主观的、直观的,因此很难通过形式的方式表达清楚。 +为了表现出智能,计算机需要获取同样的知识。 +\gls{AI}的一个关键挑战就是如何将这些非形式的知识传达给计算机。 + +一些\gls{AI}项目都力求将关于世界的知识用形式化的语言进行硬编码。 +计算机可以通过这些形式化语言自动地使用逻辑推理规则来理解声明。 +这就是所谓的\gls{AI}的\firstgls{knowledge_base}方法。 +这些项目都没有导致重大的成功。 +其中最著名的项目是的Cyc \citep{Lenat-1989-book}。 +Cyc包括一个\gls{inference}引擎和一个使用CycL语言描述的声明数据库。 +这些声明是由人类监督者输入的。 +这是一个笨拙的过程。 +人们设法设计出具有足够复杂性,能准确描述世界的形式规则。 +例如,Cyc不能理解一个关于名为\ENNAME{Fred}的人在早上剃须的故事\citep{MachineChangedWorld}。 +它的推理引擎检测到故事中的不一致性:它知道人没有电气零件,但由于\ENNAME{Fred}拿着一个电动剃须刀,它认为实体``FredWhileShaving''含有电气部件。 +因此就会产生这样的疑问——\ENNAME{Fred}在刮胡子的时候是否仍然是一个人。 + +依靠硬编码的知识体系面对的困难表明,\glssymbol{AI}系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力。 +这种能力被称为\firstgls{ML}。 +引入\gls{ML}使计算机能够解决涉及现实世界知识的问题,并能作出看似主观的决策。 +所谓\firstgls{logistic_regression}的简单\gls{ML}算法可以决定是否建议剖腹产\citep{MorYosef90}。 +所谓\firstgls{naive_bayes}的简单\gls{ML}算法可以从垃圾邮件中区分合法的电子邮件。 + +% -- 2 -- + +这些简单的\gls{ML}算法的性能在很大程度上依赖于给定数据的\firstgls{representation}。 +例如,当\gls{logistic_regression}被用于推荐剖腹产时,\glssymbol{AI}系统不直接检查患者。 +相反,需要医生告诉系统几条相关的信息,诸如子宫疤痕是否存在。 +表示患者的每条信息被称为一个特征。 +\gls{logistic_regression}学习病人的这些特征如何与各种结果相关联。 +然而,它丝毫不能影响该特征定义的方式。 +如果将病人的MRI扫描作为\gls{logistic_regression}的输入,而不是医生正式的报告,它将无法作出有用的预测。 +MRI扫描的单一像素与分娩过程中的并发症只有微不足道的相关性。 + +对\gls{representation}的依赖是在整个计算机科学乃至日常生活中出现的普遍现象。 +在计算机科学中,如果数据集合已经过明智地结构化并建立索引,数据操作的处理速度可以成倍的加快(如搜索)。 +人们可以很容易地在阿拉伯数字的表示下进行算术运算,但在罗马数字的表示下运算会更耗时。 +毫不奇怪,表示的选择会对机器学习算法的性能产生巨大的影响。 +图\ref{fig:chap1_polar}显示了一个简单的可视化例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/polar_color}} +\fi +\caption{TODO} +\label{fig:chap1_polar} +\end{figure} + +许多\gls{AI}的任务都可以通过提取一个合适的特征集,然后将这些特征提供给简单的\gls{ML}算法来解决。 +例如,从声音鉴别说话者的一个有用特征是说话者声道大小的估计。 +这个特征为判断说话者是一个男性,女性还是儿童提供了有力线索。 + +然而,对于许多任务来说,很难知道应该提取哪些特征。 +例如,假设我们想编写一个程序来检测照片中的车。 +我们知道,汽车有轮子,所以我们可能会想用车轮的存在作为特征。 +不幸的是,我们难以准确地从像素值的角度描述一个车轮看起来如何。 +车轮具有简单的几何形状,但它的图像可以因为环境而变得很复杂,如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者遮挡的车轮一部分的前景物体,等等。 + +% -- 3 -- + +解决这个问题一个途径的是使用\gls{ML}来发现\gls{representation}本身,而不仅仅把表示映射到输出。 +这种方法被称为\firstgls{representation_learning}。 +学习到的表示往往获得比手动设计的表示更好的性能。 +并且它们只需最少的人工干预, 就能让\glssymbol{AI}系统迅速适应新的任务。 +\gls{representation_learning}算法只需几分钟就可以为简单的任务发现一个很好的特征集,对于复杂任务则需要几小时到几个月。 +手动为一个复杂的任务设计特征需要耗费大量的人工时间和精力;甚至需要花费整个社群研究人员几十年时间。 + +一个\gls{representation_learning}算法的典型例子是\firstgls{AE}。 +\gls{AE}是组合了将输入转换到不同表示\firstgls{encoder}函数和将新的表示转回原来形式的\firstgls{decoder}函数。 +\gls{AE}的训练目标是,输入经过\gls{encoder}和\gls{decoder}之后尽可能多的保留信息,同时希望新的\gls{representation}有各种好的属性。不同种类的\gls{AE}的目标是实现不同种类的属性。 + +当设计特征或学习特征的算法时,我们的目标通常是分离出能解释观察数据的\textbf{变化因素}(factors of variation)。 +在此背景下,``因素''这个词仅指代的影响不同来源;因素通常不是乘性组合。 +这些因素通常是不能被直接观察到的量。 +相反,他们可能是现实世界中观察不到的物体或者不可观测的力,但影响能观测到的量。 +他们还存在于人类的思维构造中,为了给观察到的数据提供有用的简化解释或推断原因。 +它们可以被看作帮助我们了解富有变化的数据的概念或者抽象。 +当分析语音记录时,变化的因素包括说话者的年龄、性别、他们的口音和他们正在说的词语。 +当分析汽车的图像时,变化的因素包括汽车的位置、它的颜色、太阳的角度和亮度。 + +% -- 4 -- + +在许多现实世界的\gls{AI}应用困难的一个重要原因是很多因素的变化影响着我们能够观察到的每一个数据。 +在夜间,一张图片中红色汽车的单个像素可能是非常接近黑色。 +汽车轮廓的形状取决于视角。 +大多数应用程序需要我们\emph{理清}变化的因素并丢弃我们不关心的因素。 + +当然,从原始数据中提取这样的高层次、抽象的特征是非常困难的。 +许多这样的变化因素,诸如说话者的口音,只能对数据进行复杂的、接近人类水平的理解来确定。 +它几乎与获得原来问题的表示一样困难,乍一看,\gls{representation_learning}似乎并不能帮助我们。 + +\firstgls{DL}通过其它较简单的表示来表达复杂表示,解决了\gls{representation_learning}中核心问题。 + +\gls{DL}让计算机通过较简单概念构建复杂的概念。 +图\ref{fig:chap1_deep_learning}显示了\gls{DL}系统通过组合较简单的概念,例如转角和轮廓,转而定义边缘来表示图像中一个人的概念。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/deep_learning}} +\fi +\caption{TODO} +\label{fig:chap1_deep_learning} +\end{figure} +\gls{DL}模型的典型例子是前馈深度网络或\firstacr{MLP}。 +\gls{MLP}仅仅是一个将一组输入值映射到输出的数学函数。 +该函数由许多较简单的函数组合而构成。 +我们可以认为每个应用具有不同的数学函数,并为输入提供新的表示。 + +学习数据的正确表示的想法是解释\gls{DL}的一个观点。 +另一个观点是深度允许计算机学习一个多步骤的计算机程序。 +表示的每一层可以被认为是并行执行另一组指令后计算机的存储器状态。 +更深的网络可以按顺序执行更多的指令。 +顺序指令提供了极大的能力,因为后面的指令可以参考早期指令的结果。 +根据\gls{DL}这个观点,一层的激活函数没有必要对解释输入变化的因素进行编码。 +\gls{representation}还存储着协助程序执行的状态信息,使输入更加有意义。 +这里的状态信息是类似于传统计算机程序中的计数器或指针。 +它与具体的输入内容无关,但有助于模型组织其处理过程。 + +% -- 6 -- + +主要有两种测量模型深度的方式。 +第一观点是基于评估架构所需执行的顺序指令的数目。 +我们可以认为这是描述每个给定输入后,计算模型输出的流程图的最长路径。 +正如两个等价的计算机程序根据不同的语言将具有不同的长度,相同的函数可以被绘制为具有不同深度的流程图,这取决于我们允许使用的单一步骤的函数。 +图\ref{fig:chap1_language}说明了语言的选择怎样给相同的架构两个不同的衡量。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/language}} +\fi +\caption{TODO} +\label{fig:chap1_language} +\end{figure} + +另一种是在深度概率模型中使用的方法,不是将计算图的深度视为模型深度,而是将描述概念如何彼此相关的图的深度视为模型深度。 +在这种情况下,计算每个概念表示的计算流程图的深度可能比概念本身的图更深。 +这是因为系统对较简单概念的理解可以在给出更复杂概念的信息后进一步细化。 +例如,一个\glssymbol{AI}系统观察一张其中一只眼睛在阴影中的脸部图像,最初可能只看到一只眼睛。 +当检测到的脸部的存在后,它可以推断的第二只眼睛也可能是存在的。 +在这种情况下,概念的图仅包括两层——关于眼睛的层和关于脸的层,但是,如果我们根据每个概念给出的其它$n$次估计进行改进,计算的图将包括$2n$个层。 + +% -- 7 -- + +由于并不总是清楚计算图的深度或概率模型图的深度哪一个是最相关的,并且由于不同的人选择不同的最小元素集来构建相应的图,导致架构的深度不存在单一的正确值,就像计算机程序的长度不存在单一的正确值。 +也不存在模型多少深才能被修饰为``深''的共识。 +但是,\gls{DL}可以可靠地被视为比传统机器学习涉及更大量的学到函数或学到概念组合的模型的研究。 + +总之, 这本书的主题——\gls{DL}是\glssymbol{AI}的途径之一。 +具体地讲,它是\gls{ML}的一种,一种允许计算机系统能从经验和数据中得到提高的技术。 + +我们主张\gls{ML}是构建能在复杂实际环境下运行的\glssymbol{AI}系统的唯一可行方法。 +\gls{DL}是一种特定类型的\gls{ML},通过将世界表示为由较简单概念定义复杂概念,从一般抽象到高级抽象的嵌套概念体系获得极大的能力和灵活性。 +图\ref{fig:chap1_venn}说明了这些不同的\glssymbol{AI}学科之间的关系。图\ref{fig:chap1_which_part_learned}给出了每个学科如何工作的一个高层次的原理。 +\begin{figure}[!hbt] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/venn}} +\fi +\caption{TODO} +\label{fig:chap1_venn} +\end{figure} +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/which_part_learned}} +\fi +\caption{TODO} +\label{fig:chap1_which_part_learned} +\end{figure} + +\section{谁应该读这本书?} +\label{sec:who_should_read_this_book} + +这本书对各类读者都一定用处的,但我们是基于两个主要目标受众而写的。 +其中一个目标受众是学习\gls{ML}的大学生(本科或研究生),包括那些开始了职业生涯的\gls{DL}和\gls{AI}研究者。 +另一个目标群体是没有\gls{ML}或统计背景但要迅速在他们的产品或平台开始使用\gls{DL}的软件工程师。 +\gls{DL}在许多软件领域都已被证明是有用的,包括计算机视觉、语音和音频处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、网络广告和金融。 + +% -- 8 -- + +为了最好地适应各类读者,这本书被组织为三个部分。 +第一部分介绍了基本的数学工具和\gls{ML}的概念。 +第二部分介绍了本质上已解决的技术、最成熟的\gls{DL}算法。 +第三部分介绍了被广泛认为是深度学习未来研究重点的但更具猜测性的想法。 + +读者可以随意跳过不感兴趣或与自己背景不相关的部分。 +熟悉线性代数、概率和基本\gls{ML}概念的读者可以跳过第一部分,例如,当读者只是想实现一个能工作的系统则不需要阅读超出第二部分的内容。 +为了帮助读者选择章节,图\ref{fig:chap1_dependency}展示了这本书的高层组织结构的流程图。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/dependency}} +\fi +\caption{TODO} +\label{fig:chap1_dependency} +\end{figure} + +% -- 10 -- + +我们假设所有读者都具备计算机科学背景。 +也假设读者熟悉编程,并且对计算的性能问题、复杂性理论、入门级微积分和一些图论的术语有基本的了解。 + +\section{深度学习的历史趋势} +\label{sec:historical_trends_in_deep_learning} +通过历史背景了解\gls{DL}是最简单的方式。 +我们指出了\gls{DL}的几个关键趋势,而不是提供详细的历史: +\begin{itemize} + \item \gls{DL}有着悠久而丰富的历史,但伴随着很多反映不同哲学观点名称的尘封而渐渐消逝。 + \item 可用的训练数据的量已经增加,使得\gls{DL}变得更加有用。 + \item 随着时间的推移,针对\gls{DL}的计算机软硬件基础设施都有所改善,\gls{DL}模型的规模也随之增长。 + \item \gls{DL}已经解决日益复杂的应用,并随着时间的推移,精度不断提高。 +\end{itemize} + +\subsection{神经网络的众多名称和命运变迁} +\label{sec:the_many_names_and_changing_fortunes_of_neural_networks} + +我们期待这本书的许多读者都听说过\gls{DL}这一激动人心的新技术,并为一本书提及关于一个新兴领域的``历史''而感到惊讶。 +事实上,\gls{DL}的历史可以追溯到20世纪40年代。 +\gls{DL}只是\emph{看上去像}一个新的领域,因为在目前流行的前几年它是相对冷门的,同时也因为它被赋予了许多不同的已经消逝的名称,最近才成为所谓的``深度学习''。 +这个邻域已经更换了很多名称,反映了不同的研究人员和不同观点的影响。 + +讲述整个综合性的\gls{DL}历史超出了本书的范围。 +然而,一些基本的背景对理解\gls{DL}是有用的。 +一般来说,目前为止已经有三次\gls{DL}的发展浪潮:在20世纪40年代到60年代\gls{DL}被称为\firstgls{cybernetics},20世纪80年代到90年代\gls{DL}被誉为\firstgls{connectionism},并于2006年开始,\gls{DL}在当前的名称下开始复苏。 +这在图\ref{fig:chap1_cybernetics_connectionism_ngrams_color}中定量给出。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/cybernetics_connectionism_ngrams_color}} +\fi +\caption{TODO} +\label{fig:chap1_cybernetics_connectionism_ngrams_color} +\end{figure} + +% -- 12 -- + +我们现在认识的一些最早的学习算法,旨在模拟生物学习的计算模型,即大脑怎样学习或为什么能学习的模型。 +其结果是,已经消逝的\gls{DL}的名称之一——\firstacr{ANN}。 +此时\gls{DL}模型对应的观点是他们设计的系统是受生物大脑(无论人类大脑或其他动物的大脑)所启发。 +尽管有些\gls{ML}的\gls{NN}有时被用来理解大脑功能\citep{hinton1991lesioning},它们一般都没有被设计成生物功能的真实模型。 +\gls{DL}的神经观点受两个主要思想启发的。 +一个想法是,大脑这个例子证明智能行为的可能性,因此建立智能概念上的直接途径是逆向大脑背后的计算原,并复制其功能。 +另一种看法是,理解大脑和人类智力背后的原则将是非常有趣的,因此\gls{ML}模型除了解决工程应用的能力, 如果能阐明这些基本的科学问题也将会很有用。 + +% -- 13 -- + +现代术语``\gls{DL}''超越了目前\gls{ML}模型的神经科学观点。 +学习的\emph{多层次组合}这一更普遍的原则更加吸引人,这可以应用于\gls{ML}框架且不必是受神经启发的。 + + +现代\gls{DL}的最早前身是从神经科学的角度出发的简单线性模型。 +这些模型被设计为使用一组$\Sn$个输入$\Sx_1, \dots ,\Sx_n$并将它们与一个输出$\Sy$相关联。 +这些模型将学习一组权重$\Sw_1, \dots, \Sw_n $ 并计算它们的输出$f(\Vx, \Vw) = \Sx_1 \Sw_1 + \dots + \Sx_n \Sw_n$。 +这第一波\gls{NN}研究的浪潮被称为\gls{cybernetics},如图\ref{fig:chap1_cybernetics_connectionism_ngrams_color}所示。 + +\ENNAME{McCulloch-Pitts}神经元\citep{McCulloch43}是脑功能的早期模型。 +该线性模型通过测试函数$f(\Vx,\Vw)$的是正还是负来识别两种不同类型的输入。 +当然,为了使模型对应于期望的类别定义,需要正确地设置权重。 +这些权重可以由操作人员设定。 +在20世纪50年代,感知机\citep{Rosenblatt-1956,Rosenblatt-1958}成为第一个能根据了每个类别输入的\gls{example}来学习权重的模型。 +约在同一时期,\textbf{自适应线性元件}(ADALINE),简单地返回函数$f(\Vx)$本身的值来预测一个实数\citep{Widrow60},并且还可以学习从数据预测这些数。 + +这些简单的学习算法大大影响了\gls{ML}的现代景象。 +用于调节ADALINE的权重的训练算法是称为\firstgls{SGD}的一种特例。 +稍加修改的\gls{SGD}算法仍然是当今\gls{DL}的主要训练算法。 + +基于感知机和ADALINE中使用的函数$f(\Vx, \Vw)$的模型被称为\firstgls{linear_model}。 +这些模型仍然是最广泛使用的\gls{ML}模型,尽管在许多情况下,它们以不同于原始模型的方式进行\emph{训练}。 + +\gls{linear_model}有很多局限性。 +最著名的是,它们无法学习XOR函数,即$f([0,1], \Vw) = 1, f([1,0], \Vw)=1$, +但是$f([1,1], \Vw)=0, f([0,0],\Vw)= 0$。 +在\gls{linear_model}中观察到这些缺陷的评论家开始反对受生物学启发的学习\citep{Minsky69}。 +这是\gls{NN}第一次热度较多的下降。 + +现在,神经科学被视为\gls{DL}研究的一个重要灵感来源,但它已不再是该领域的主要导向。 + +% -- 14 -- + +如今神经科学在\gls{DL}研究中的作用被削弱,主要的原因只是我们根本没有足够的关于大脑信息来作为指导。 +要获得对大脑实际使用算法的深刻理解,我们需要有能力同时监测(至少是)数千相连神经元的活动。 +我们不能够做到这一点,甚至连大脑的最简单、最深入研究的部分我们都还远远没有理解\citep{olshausen:2005}。 + +神经科学已经给了我们依靠单一\gls{DL}算法解决许多不同任务的理由。 +神经学家们发现,如果将雪貂的大脑重新连接,使视觉信号传送到听觉区域,它们可以学会用大脑的听觉处理区域``看''\citep{von2000visual}。 +这表明,多数哺乳动物大脑的可能使用单一的算法解决大部分大脑可以解决的不同任务。 +这个假设之前,\gls{ML}研究更加分散,研究人员在不同的社区研究自然语言处理、计算机视觉、运动规划和语音识别。 +如今,这些应用的社区仍然是独立的,但是\gls{DL}研究小组同时研究许多或甚至所有这些应用领域是很常见的。 + +我们能够从神经科学得到一些粗略的指南。 +仅通过计算单元之间的相互作用而变得智能的基本思想是受大脑启发的。 +新认知机\citep{Fukushima80}受哺乳动物视觉系统的结构启发,引入了一个处理图片的强大模型架构,后来成为了现代卷积网络的基础\citep{LeCun98-small},我们将会在\ref{sec:the_neuroscientific_basis_for_convolutional_networks}节看到。 +目前大多数\gls{NN}基于称为\firstgls{ReLU}的神经单元模型。 +原始认知机\citep{Fukushima75}受我们关于大脑功能知识的启发, 引入了一个更复杂的版本。 +简化的现代版基于许多观点进化发展,\citet{Nair-2010}和\citet{Glorot+al-AI-2011-small}援引神经科学作为影响,\citet{Jarrett-ICCV2009}援引更多面向工程的影响。 +虽然神经科学是灵感的重要来源,它不需要被视为刚性指导。 +我们知道,实际的神经元与现代\gls{ReLU}计算着非常不同函数,但更接近真实神经网络的系统并没有导致\gls{ML}性能的提升。 +此外,虽然神经科学已经成功地启发了一些\gls{NN}\emph{架构},但我们还没有足够的了解生物学习的神经科学,因此在训练这些架构时,不能提供给我们很多关于\emph{学习算法}的指导。 + +媒体报道经常强调\gls{DL}与大脑的相似性。 +虽然\gls{DL}研究人员更可能比其他\gls{ML}领域(如核机器或贝叶斯统计工作的研究人员)引用大脑作为影响,人们不应该认为\gls{DL}是对模拟大脑的尝试。 +现代\gls{DL}从许多领域获取灵感,特别是应用数学的基本内容如线性代数、概率论、信息论和数值优化。 +虽然一些\gls{DL}的研究人员引用神经科学作为灵感的重要来源,但其他学者完全不关心神经科学。 + +% -- 15 -- + +值得注意的是,了解大脑是如何在算法层面上工作的尝试是鲜活且发展良好的。 +这项尝试主要是被称为``计算神经科学'',并且是独立于\gls{DL}一个领域。 +研究人员两个领域之间反复研究是很常见的。 +\gls{DL}领域主要是关注如何构建智能的计算机系统,用来解决需要智能才能解决的任务,而计算神经科学领域主要是关注构建大脑如何工作的更精确的模型。 + +在20世纪80年代,神经网络研究的第二次浪潮在很大程度上是伴随一个被称为\firstgls{connectionism}或\textbf{并行分布处理}运动而出现的\citep{Rumelhart86,mcclelland1995appeal}。 +\gls{connectionism}是在认知科学的背景下出现的。 +认知科学是理解心智,并结合多个不同层次分析的跨学科方法。 +在20世纪80年代初期,大多数认知科学家研究符号推理的模型。 +尽管这很流行,符号模型很难解释大脑如何真正使用神经元实现推理功能。 +连接主义者开始研究实际能基于神经实现的认知模型\citep{Touretzky1985},其中很多复苏的想法可以追溯到心理学家\ENNAME{Donald Hebb}在20世纪40年代的工作\citep{Hebb49}。 + +\gls{connectionism}的中心思想是,当网络将大量简单计算单元连接在一起时可以实现智能行为。 +这种见解同样适用于与计算模型中隐层单元类似作用的生物神经系统中的神经元。 + +上世纪80年代的\gls{connectionism}运动过程中形成的几个关键概念在今天的\gls{DL}中仍然是非常重要的。 + +其中一个概念是\firstgls{distributed_representation}\citep{Hinton-et-al-PDP1986}。 +这一想法是,系统每个的输入应该由许多特征表示的,并且每个特征应参与许多可能输入的表示。 +例如,假设我们有一个能够识别红色、绿色、或蓝色的汽车、卡车和鸟类的视觉系统。 +表示这些输入的其中一个方法是将九个可能的组合:红卡车,红汽车,红鸟,绿卡车等等使用单独的神经元或\gls{hidden_unit}激活。 +这需要九个不同的神经元,并且每个神经必须独立地学习颜色和对象身份的概念。 +改善这种情况的方法之一是使用\gls{distributed_representation},即用三个神经元描述颜色,三个神经元描述对象身份。 +这仅仅需要6个神经元而不是9个,并且描述红色的神经元能够从汽车、卡车和鸟类的图像中学习红色,而不仅仅是从一个特定类别的图像中学习。 +\gls{distributed_representation}的概念是本书的核心,我们将在\ref{chap:representation_learning}章中更加详细地描述。 + +% -- 16 -- + +\gls{connectionism}运动的另一个重要成就是反向传播算法的成功运用(训练具有内部表示的深度\gls{NN})和普及\citep{RHW,Lecun-these87}。 +这个算法虽然已经黯然失色不再流行,但截至写书之时,仍是训练深度模型的主要方法。 + +在20世纪90年代,研究人员在使用\gls{NN}进行序列建模的方面取得了重要进展。 +\citet{Hochreiter91}和\citet{Bengio1994ITNN}指出了建模长序列的一些根本数学难题,将在\ref{sec:the_challenge_of_longterm_dependencies}节中描述。 +\citet{Hochreiter+Schmidhuber-1997}引入\gls{LSTM}(\glssymbol{LSTM})网络来解决这些难题。 +如今,\glssymbol{LSTM}在许多序列建模任务中广泛应用,包括Google的许多自然语言处理任务。 + +\gls{NN}研究的第二次浪潮一直持续到上世纪90年代中期。 +基于\gls{NN}等其他\glssymbol{AI}技术的企业开始在寻求投资的同时,做不切实际野心勃勃的主张。 +当\glssymbol{AI}研究不能实现这些不合理的期望时,投资者感到失望。 +同时,\gls{ML}的其他领域取得进步。 +核学习机\citep{Boser92,Cortes95,SchBurSmo99}和图模型\citep{Jordan98}都在很多重要任务上实现了很好的效果。 +这两个因素导致了\gls{NN}热度的第二次下降,一直持续到2007年。 + +在此期间,\gls{NN}持续在某些任务上获得令人印象深刻的表现\citep{LeCun98-small,Bengio-nnlm2001}。 +加拿大高级研究所(CIFAR)通过其神经计算和自适应感知(NCAP)研究计划帮助维持\gls{NN}研究。 +这个计划统一了由分别由\ENNAME{Geoffrey Hinton},\ENNAME{Yoshua Bengio}和\ENNAME{Yann LeCun}引导的多伦多大学、蒙特利尔大学和纽约大学的\gls{ML}研究小组。 +CIFAR NCAP研究计划具有多学科的性质,其中还包括在人类神经科学家和计算机视觉专家。 + +% -- 17 -- + +在那个时间点上,普遍认为深度网络被难以训练的。 +现在我们知道,从20世纪80年代就存在的算法能工作得非常好,但是直到在2006年前后都没有体现出来。 +这个问题可能是单纯的因为计算复杂性太高,而以当时可用的硬件难以进行足够的实验。 + +神经网络研究的第三次浪潮开始于2006年的突破。 +\ENNAME{Geoffrey Hinton}表明名为\gls{DBN}的\gls{NN}可以使用一种称为贪婪逐层训练的策略进行有效地训练\citep{Hinton06},我们将在\ref{sec:greedy_layerwise_unsupervised_pretraining}中更详细地描述。 +CIFAR附属的其他研究小组很快表明,同样的策略可以被用来训练许多其他类型的深度网络\citep{Bengio+Lecun-chapter2007-small,ranzato-07},并能系统地帮助提高在测试样例上的泛化能力。 +\gls{NN}研究的这一次浪潮普及了``\gls{DL}''这一术语的使用,强调研究人员现在可以训练以前不可能训练的更深的神经网络,并把注意力集中于深度的理论意义\citep{Bengio+Lecun-chapter2007,Delalleau+Bengio-2011-small,Pascanu-et-al-ICLR2014,Montufar-et-al-NIPS2014}。 +此时,深度\gls{NN}已经优于与之竞争的基于其他\gls{ML}技术以及手工设计函数的\glssymbol{AI}系统。 +神经网络流行的第三次浪潮在写这本书的时候还在继续,尽管深度学习的研究重点在这一段时间内发生了巨大变化。 +第三次浪潮开始把重点放在新的无监督学习技术和深度模型从小数据集进行推广的能力,但现在更多的注意点是在更古老的监督学习算法和深度模型充分利用大型标注数据集的能力。 + +\subsection{与日俱增的数据量} +\label{sec:increasing_dataset_sizes} +人们可能想问,尽管人工\gls{NN}的第一个实验在20世纪50年代就完成了,为什么\gls{DL}直到最近才被认为是关键技术。 +自20世纪90年代以来,\gls{DL}就已经成功用于商业应用,但通常被视为是一种艺术而不是一种技术,且只有专家可以使用的艺术,这种观点持续到最近。 +确实,要从一个\gls{DL}算法获得良好的性能需要一些技巧。 +幸运的是,随着训练数据的增加,所需的技巧正在减少。 +目前在复杂的任务达到与人类表现的学习算法,与20世纪80年代努力解决的玩具问题(toy problem)的学习算法几乎是一样的,尽管这些算法训练的模型经历了变革,简化了极深架构的训练。 +最重要的新进展是现在我们有了这些算法成功训练所需的资源。 +图\ref{fig:chap1_dataset_size_color}展示了基准数据集的大小如何随着时间的推移显着增加。 +这种趋势是由社会日益数字化驱动的。 +由于我们的活动越来越多发生在计算机上,我们做什么也越来越多地被记录。 +我们的计算机越来越多地联网在一起,变得更容易集中管理这些记录,并将它们整理成适于\gls{ML}应用的数据集。 +因为``大数据''的时代\gls{ML}要容易得多,因为统计估计的主要负担——观察少量数据以在新数据上泛化——已经减轻。 +截至2016年,一个粗略的经验法则是,监督\gls{DL}算法一般在每类给定约5000标注样本情况下可以实现可接受的性能,当至少有1000万标注样本的数据集用于训练时将达到或超过人类表现。 +在更小的数据集上成功工作是一个重要的研究领域,我们应特别侧重于如何通过无监督或半监督学习充分利用大量的未标注样本。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/dataset_size_color}} +\fi +\caption{TODO} +\label{fig:chap1_dataset_size_color} +\end{figure} +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics[width=0.8\textwidth]{Chapter1/figures/mnist}} +\fi +\caption{TODO} +\label{fig:chap1_mnist} +\end{figure} + +% -- 20 -- + +\subsection{与日俱增的模型规模} +\label{sec:increasing_model_sizes} + +相对20世纪80年代较少的成功,现在\gls{NN}非常成功的另一个重要原因是现在我们拥有的计算资源可以运行更大的模型。 +\gls{connectionism}的主要见解之一是,当动物的许多神经元一起工作时会变得聪明。 +单独神经元或小集合的神经元不是特别有用。 + +生物神经元没有连接的特别密集。 +如图\ref{fig:chap1_number_of_synapses_color}所示,几十年来,我们的\gls{ML}模型中每个神经元的连接数量甚至与哺乳动物大脑的在同一数量级。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/number_of_synapses_color}} +\fi +\caption{TODO} +\label{fig:chap1_number_of_synapses_color} +\end{figure} + +如图\ref{fig:chap1_number_of_neurons_color}所示,就神经元的总数目而言,直到最近\gls{NN}都是惊人的少。 +自从引入\gls{hidden_unit}以来,人工\gls{NN}的规模大约每2.4年扩大一倍。 +这种增长是由更大内存、更快的计算机和更大的可用数据集驱动的。 +较大的网络能够在更复杂的任务中实现更高的精度。 +这种趋势看起来将持续数十年。 +除非有允许迅速扩展的新技术,否则至少直到21世纪50年代,人工\gls{NN}将才能具备与人脑相同数量级的神经元。 +生物神经元表示的函数可能比目前的人工神经元更复杂,因此生物神经网络可能比图中描绘的更大。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/number_of_neurons_color}} +\fi +\caption{TODO} +\label{fig:chap1_number_of_neurons_color} +\end{figure} + + +现在回想起来,比一个水蛭的神经元还少的\gls{NN}不能解决复杂的\gls{AI}问题是不足为奇的。 +即使是现在从一个计算系统角度来看可能相当大的网络, 实际上比相对原始的脊椎动物如青蛙的神经系统更小。 + +由于有更快的CPU、通用GPU的到来(在\ref{sec:gpu_implementations}节中讨论)、更快的网络连接和更好的分布式计算的软件基础设施,模型的规模随着时间的推移不断增加是\gls{DL}历史中最重要的趋势之一。 +普遍预计这种趋势将很好地持续到未来。 + +% -- 21 -- + +\subsection{与日俱增的精度、复杂度和对现实世界的冲击} +\label{sec:increasing_accuracy_complexity_and_real_world_impact} + +20世纪80年代以来,\gls{DL}一直在提高提供识别精度和预测的能力。 +此外,\gls{DL}持续地被成功应用到越来越广泛的应用中去。 + +最早的深度模型被用来识别裁剪的很合适且非常小的图像中的单个对象\citep{Rumelhart86}。 +自那时以来,\gls{NN}可以处理的图像尺寸逐渐增加。 +现代对象识别网络能处理丰富的高分辨率照片,并且不要求在被识别的对象附近进行裁剪\citep{Krizhevsky-2012}。 +类似地,最早网络只能识别两种对象(或在某些情况下,单一种类的对象的存在与否),而这些现代网络通常识别至少\NUMTEXT{1000}个不同类别的对象。 +对象识别中最大的比赛是每年举行的ImageNet大型视觉识别挑战(ILSVRC)。 +\gls{DL}迅速崛起的一个戏剧性的时刻是卷积网络第一次大幅赢得这一挑战,将最高水准的前5错误率从\NUMTEXT{26.1\%}降到\NUMTEXT{15.3\%}\citep{Krizhevsky-2012},这意味着该卷积网络产生针对每个图像的可能类别的分级列表,尽管\NUMTEXT{15.3\%}的测试样例的正确类别不会出现在此列表中的前5。 + +此后,深度卷积网络一直能在这些比赛中取胜,截至写书时,\gls{DL}的进步将这个比赛中的前5错误率降到\NUMTEXT{3.6%}, 如图\ref{fig:chap1_imagenet_color}所示。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter1/figures/imagenet_color}} +\fi +\caption{TODO} +\label{fig:chap1_imagenet_color} +\end{figure} + +% -- 23 -- + +\gls{DL}也对语音识别产生了巨大影响。 +语音识别在20世纪90年代提高后,直到约2000年都停滞不前。 +\gls{DL}的引入\citep{dahl2010phonerec,Deng-2010,Seide2011,Hinton-et-al-2012}导致语音识别错误率的陡然下降,有些错误率甚至降低了一半。 +我们将在\ref{sec:speech_recognition}节更详细地探讨这个历史。 + +深度网络在行人检测和图像分割中也有引人注目的成功\citep{sermanet-cvpr-13,Farabet-et-al-2013,couprie-iclr-13},在交通标志分类上取得了超越人类的表现\citep{Ciresan-et-al-2012}。 + +在深度网络的规模和的精度有所提高的同时,它们可以解决的任务也日益复杂。 +\citet{Goodfellow+et+al-ICLR2014a}表明,\gls{NN}可以学习输出描述图像的整个字符序列,而不是仅仅识别单个对象。 +此前,人们普遍认为,这种学习需要对序列中的单个元素进行标注\citep{Gulcehre+Bengio-arxiv-2013}。 +\gls{RNN},如之前提到的\glssymbol{LSTM}序列模型,现在用于建模序列和其他序列之间的关系,而不是仅仅固定输入之间的关系。 +这个序列到序列的学习似乎处于另一个应用演进的浪尖:机器翻译\citep{Sutskever-et-al-NIPS2014,Bahdanau-et-al-ICLR2015-small}。 + +% -- 24 -- + +日益复杂的趋势已将其推向逻辑结论,即神经图灵机\citep{Graves-et-al-arxiv2014}的引入,它能学习读取存储单元和向存储单元写入任意内容。 +这样的\gls{NN}可以从期望行为的\gls{example}中学习简单的程序。 +例如,从杂乱和排好序的\gls{example}中学习对一系列数进行排序。 +这种自我编程技术正处于起步阶段,但原则上未来可以适用于几乎所有的任务。 + + +\gls{DL}的另一个冠军成就是在\firstgls{RL}领域的扩展。 +在\gls{RL}的背景下,一个自主体必须通过试错来学习执行任务,而无需人类操作者的任何指导。 +DeepMind表明,基于\gls{DL}的\gls{RL}系统能够学会玩Atari视频游戏,并在多种任务中可与人类匹敌\citep{Mnih-et-al-2015}。 +\gls{DL}也显著改善了机器人\gls{RL}的性能\citep{finn2015learning}。 + +许多\gls{DL}应用都是高利润的。现在\gls{DL}被许多顶级的技术公司使用,包括Google、Microsoft、Facebook、IBM、Baidu、Apple、Adobe、Netflix、NVIDIA和NEC。 + +\gls{DL}的进步也严重依赖于软件基础架构的进展。 +软件库如Theano\citep{bergstra+al:2010-scipy,Bastien-2012}、PyLearn2\citep{pylearn2_arxiv_2013}、Torch\citep{Torch-2011}、DistBelief\citep{Dean-et-al-NIPS2012}、Caffe\citep{Jia13caffe}、MXNet\citep{chen2015mxnet}和TensorFlow\citep{tensorflow}都能支持重要的研究项目或商业产品。 + +\gls{DL}也为其他科学做出了贡献。 +识别对象的现代卷积网络提供给神经科学家可以研究的视觉处理模型\citep{dicarlo-tutorial-2013}。 +\gls{DL}也为处理海量数据、在科学领域作出的有效预测提供了非常有用的工具。 +它已成功地用于预测分子如何相互作用,这能帮助制药公司设计新的药物\citep{Dahl-et-al-arxiv2014}、搜索的亚原子粒子\citep{baldi2014searching}和自动解析用于构建人脑三维图的显微镜图像\citep{knowlesdeep}。 +我们期待\gls{DL}未来出现在越来越多的科学领域。 + +% -- 25 -- + +总之,\gls{DL}是\gls{ML}的一种方法, 过去几十年的发展中,它深深地吸收了我们关于人脑、统计学与应用数学的知识。 +近年来,\gls{DL}的普及性和实用性有了极大的发展,这在很大程度上得益于更强大的计算机、更大的数据集和能够训练更深网络的技术。 +未来几年充满了进一步提高\gls{DL}并将它带到新领域挑战和机遇。 + +% -- 26 -- diff --git a/Chapter10/sequence_modeling_rnn.tex b/Chapter10/sequence_modeling_rnn.tex new file mode 100644 index 0000000..fd5ab88 --- /dev/null +++ b/Chapter10/sequence_modeling_rnn.tex @@ -0,0 +1,1201 @@ +% Translator: Shenjian Zhao +\chapter{序列建模:循环和递归网络} +\label{chap:sequence_modeling_recurrent_and_recursive_nets} +\firstgls{RNN}或\glssymbol{RNN}\citep{RHW}是一类用于处理序列数据的\gls{NN}。 +就像\gls{convolutional_network}是专门用于处理网格化数据$\TSX$(如一个图像)的\gls{NN},\gls{RNN}是专门用于处理序列$\Vx^{(1)}, \dots, \Vx^{(\tau)}$的\gls{NN}。 +正如\gls{convolutional_network}可以很容易地扩展到具有很大宽度和高度的图像,以及处理大小可变的图像,\gls{recurrent_network}可以扩展到更长的序列(比不基于序列的特化网络长得多)。 +大多数\gls{recurrent_network}也能处理可变长度的序列。 + + + +从多层网络出发到\gls{recurrent_network},我们需要利用上世纪80年代\gls{ML}和统计模型早期思想的优点:在模型的不同部分共享参数。 +\gls{parameter_sharing}使得模型能够扩展到不同形式的样本(如不同的长度)并进行泛化。 +如果我们在每个时间点都有一个单独的参数,我们不但不能泛化到训练时没有见过序列长度,也不能在时间上共享不同序列长度和不同位置的统计强度。 +当信息的特定部分能够在该序列内多个位置出现时,这样的共享尤为重要。 +例如,考虑这两句话:``I went to Nepal in 2009''和``In 2009, I went to Nepal.'' +如果我们让一个\gls{ML}模型读取这两个句子,并提取叙述者去\ENNAME{Nepal}的年份,无论``2009年''出现在句子的第六个单词或第二个单词,我们都希望它能认出``2009年''作为相关资料片段。 +假设我们训练一个处理固定长度句子的\gls{feedforward_network}。 +传统的全连接\gls{feedforward_network}会给每个输入特征一个单独的参数,所以需要分别学习句子每个位置的所有语言规则。 +相比之下,\gls{RNN}在几个\gls{time_step}内共享相同的权重。 + +% -- 363 -- + +一个相关的想法是跨越1维时间序列的卷积。 +这种卷积方法是\gls{TDNNs}的基础\citep{Lang+Hinton88,Waibel89b,lang1990time}。 +卷积操作允许网络跨越时间共享参数,但是浅层的。 +卷积的输出是一个序列,其中输出中的每一项是相邻几项的函数。 +\gls{parameter_sharing}的概念体现在每个\gls{time_step}中使用的相同卷积核。 +\gls{RNN}以不同的方式共享参数。 +输出的每一项是输出前一项的函数。 +输出的每一项对先前的输出应用相同的更新规则而产生。 +这种循环导致参数在一个很深的\gls{computational_graph}中共享。 + + + +为简单起见,我们说的\glssymbol{RNN}是指在序列上的操作,并且该序列在时刻$t$(从1到$\tau$)包含向量$\Vx^{(t)}$。 +在实践中,\gls{recurrent_network}通常在序列的\gls{minibatch}上操作,并且\gls{minibatch}的每项具有不同序列长度$\tau$。 +我们省略了\gls{minibatch}索引来简化记号。 +此外,\gls{time_step}索引不必是字面上现实世界中流逝的时间,也可以是序列中的位置。 +\glssymbol{RNN}也可以应用于跨越两个维度的空间数据(如图像),并且当应用于涉及的时间数据时,该网络可具有在时间上向后的连接,只要在将整个序列提供给网络之前,让网络观察整个序列。 + + + +本章将\gls{computational_graph}的想法扩展到包括周期。 +这些周期代表变量自身的值在未来某一\gls{time_step}对自身值的影响。 +这样的\gls{computational_graph}允许我们定义\gls{RNN}。 +然后,我们对构建、训练和使用\gls{RNN}的许多不同方式进行描述。 + + + +除了本章中关于\gls{RNN}的介绍, 我们建议读者参考\cite{Graves-book2012}的著作获取更多详细信息。 + +% -- 364 -- + +\section{\gls{unfolding}\gls{computational_graph}} +\label{sec:unfolding_computational_graphs} +\gls{computational_graph}是一种形式化一组计算结构的方式,如那些涉及将输入和参数映射到输出和损失的计算。 +综合的介绍请参考\ref{sec:computational_graphs}。 +在本节中,我们对\firstgls{unfolding}递归或循环计算得到的重复结构进行解释,这通常对应于一个事件链。 +\firstgls{unfolding}这个图导致深度网络结构中的\gls{parameter_sharing}。 + + + +例如,考虑动态系统的经典形式: +\begin{align} +\label{eq:101s} +\Vs^{(t)} = f(\Vs^{(t-1)}; \Vtheta), +\end{align} +其中$ \Vs^{(t)}$称为系统的状态。 + + + +$\Vs$在时刻$t$的定义需要参考时刻$t-1$时同样的定义,因此式\eqref{eq:101s}是循环的。 + + + +对一个有限\gls{time_step}$\tau$, $\tau-1$次应用这个定义可以展开这个图。 +例如,如果我们对式\eqref{eq:101s}关于$\tau = 3$展开,可以得到: +\begin{align} + \Vs^{(3)} &= f(\Vs^{(2)}; \Vtheta) \\ + & = f(f(\Vs^{(1)}; \Vtheta) ; \Vtheta). + \label{eq:103s} +\end{align} + + + +以这种方式重复应用定义,\gls{unfolding}等式,就能得到不涉及循环的表达。 +现在可以通过一个传统的有向无环\gls{computational_graph}来表示这样的表达。 + + + +式\eqref{eq:101s}和式\eqref{eq:103s}的\gls{unfolding}\gls{computational_graph}如图\ref{fig:chap10_unfolded_dynsys}所示。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/unfolded_dynsys}} +\fi +\caption{TODO} +\label{fig:chap10_unfolded_dynsys} +\end{figure} + + +% -- 365 -- + +作为另一个例子,让我们考虑由外部信号$\Vx^{(t)}$驱动的动态系统, +\begin{align} + \label{eq:104s} + \Vs^{(t)} = f(\Vs^{(t-1)}, \Vx^{(t)} ; \Vtheta), +\end{align} +我们可以看到,当前状态包含了整个过去序列的信息。 + + + +\gls{RNN}可以通过许多不同的方式建立。 +就像几乎所有函数都可以被认为是\gls{feedforward_network},基本上任何涉及循环的函数可以被认为是一个\gls{RNN}。 + + + +很多\gls{RNN}使用式\eqref{eq:105h}或类似的公式定义\gls{hidden_unit}的值。 +为了表明状态是网络的\gls{hidden_unit},我们使用变量$h$代表状态来重写式\eqref{eq:104s}: +\begin{align} + \label{eq:105h} + \Vh^{(t)} = f(\Vh^{(t-1)}, \Vx^{(t)} ; \Vtheta), +\end{align} +如图\ref{fig:chap10_rnn_circuit_unfolded}所示,典型\glssymbol{RNN}会增加额外的架构,如读取状态信息$\Vh$进行预测的输出层。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/rnn_circuit_unfolded}} +\fi +\caption{TODO} +\label{fig:chap10_rnn_circuit_unfolded} +\end{figure} + + + +当\gls{recurrent_network}被训练为根据过去预测未来,网络通常要学会使用$\Vh^{(t)}$作为过去序列(直到$t$)与任务相关方面的有损摘要。 +此摘要一般而言一定是有损的,因为其映射任意长度的序列$(\Vx^{(t)},\Vx^{(t-1)}, \Vx^{(t-2)},\dots,\Vx^{(2)}, \Vx^{(1)})$到一固定长度的向量$\Vh^{(t)}$。 +根据不同的训练\gls{criterion},摘要可能选择性地精确保留过去序列的某些方面。 +例如,如果在统计语言建模中使用的\glssymbol{RNN},通常给定前一个词预测下一个词,可能没有必要存储$t$前所有输入序列中的信息;而仅仅存储足够预测句子的其余部分信息。 +最苛刻的情况是我们要求$\Vh^{(t)}$足够丰富,并能大致恢复输入序列,如\gls{AE}框架(第\ref{chap:autoencoders}章)。 + +% -- 366 -- + +式\eqref{eq:105h}可以用两种不同的方式绘制。 +一种方法是为可能在模型的物理实现中存在的部分赋予一个节点,如生物神经网络。 +在这个观点下,网络定义了实时操作的回路,如图\ref{fig:chap10_rnn_circuit_unfolded}的左侧,其当前状态可以影响其未来的状态。 +在本章中,我们使用回路图的黑色方块表明在时刻$t$的状态到时刻$t+1$的状态单个时刻延迟中的相互作用。 +另一个绘制\glssymbol{RNN}的方法是展开的\gls{computational_graph},其中每一个组件是由许多不同的变量表示,每个\gls{time_step}一个变量,表示在该时间点组件的状态。 +每个时刻的每个变量绘制为\gls{computational_graph}的一个单独的节点,如图\ref{fig:chap10_rnn_circuit_unfolded}的右侧。 +我们所说的\gls{unfolding}是左图中的回路映射为右图中包含重复组件的\gls{computational_graph}的操作。 +目前,\gls{unfolded_graph}的大小取决于序列长度。 + + + +我们可以用一个函数$g^{(t)}$代表经$t$步展开后的循环: +\begin{align} + \Vh^{(t)} &=g^{(t)}(\Vx^{(t)},\Vx^{(t-1)}, \Vx^{(t-2)},\dots,\Vx^{(2)}, \Vx^{(1)}) \\ + & = f(\Vh^{(t-1)}, \Vx^{(t)} ; \Vtheta) +\end{align} +函数$g^{(t)}$将全部的过去序列$(\Vx^{(t)},\Vx^{(t-1)}, \Vx^{(t-2)},\dots,\Vx^{(2)}, \Vx^{(1)})$作为输入来生成当前状态,但是展开的循环架构允许我们将$g^{(t)}$分解为函数$f$重复的应用。 +因此,展开过程引入两个主要优点: +\begin{enumerate} + \item 无论序列的长度,学习好的模型始终具有相同的输入大小,因为它指定的是从一种状态到另一种状态的\gls{transition}, 而不是在可变长度的历史状态上操作。 + \item 我们可以在每个\gls{time_step}使用具有相同参数的\emph{相同}\gls{transition}函数$f$。 +\end{enumerate} +这两个因素使得学习在所有\gls{time_step}和所有序列长度上操作的单一模型$f$是可能的,而不需要在所有可能\gls{time_step}学习独立的模型$g^{(t)}$。 +学习单一的共享模型允许泛化到没有见过的序列长度(没有出现在训练集中),并且估计模型需要的训练样本远远少于不带\gls{parameter_sharing}的模型。 + +% -- 367 -- + +无论是循环图和\gls{unfolded_graph}都有其用途。 +循环图简洁。 +\gls{unfolded_graph}能够明确描述其中的计算流程。 +\gls{unfolded_graph}还通过显式的信息流动路径帮助说明信息在时间上向前(计算输出和损失)和向后(计算\gls{gradient})的思想。 + + + +\section{\gls{RNN}} +\label{sec:recurrent_neural_networks} +基于\ref{sec:unfolding_computational_graphs}节中的图展开和\gls{parameter_sharing}的思想,我们可以设计各种\gls{RNN}。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/hidden_recurrence_rnn}} +\fi +\caption{TODO} +\label{fig:chap10_hidden_recurrence_rnn} +\end{figure} +\gls{RNN}中一些重要的设计模式包括以下几种: +\begin{enumerate} + \item 每个\gls{time_step}都有输出,并且\gls{hidden_unit}之间有循环连接的\gls{recurrent_network},如图\ref{fig:chap10_hidden_recurrence_rnn}所示。 + \item 每个\gls{time_step}都产生一个输出,只有当前时刻的输出到下个时刻的\gls{hidden_unit}之间有循环连接的\gls{recurrent_network},如图\ref{fig:chap10_output_recurrence_rnn}所示。 + \item \gls{hidden_unit}之间存在循环连接,但读取整个序列后产生单个输出的\gls{recurrent_network},如图\ref{fig:chap10_single_output_rnn}所示。 +\end{enumerate} +图\ref{fig:chap10_hidden_recurrence_rnn}是一个非常具有代表性的例子,我们将会在本章大部分涉及这个例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/output_recurrence_rnn}} +\fi +\caption{TODO} +\label{fig:chap10_output_recurrence_rnn} +\end{figure} + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/single_output_rnn}} +\fi +\caption{TODO} +\label{fig:chap10_single_output_rnn} +\end{figure} + +任何图灵可计算的函数都可以通过这样一个有限维的\gls{recurrent_network}计算,在这个意义上图\ref{fig:chap10_hidden_recurrence_rnn}和式\eqref{eq:108a}的\gls{RNN}是万能的。 +\glssymbol{RNN}经过若干\gls{time_step}后读取输出,这与由图灵机所用\gls{time_step}是渐近线性的,与输入长度也是渐近线性的\citep{Siegelmann+Sontag-1991,Siegelmann-1995,Siegelmann+Sontag-1995,Hyotyniemi-1996}。 +由图灵机计算的函数是离散的,所以这些结果都是函数的具体实现,而不是近似。 +\glssymbol{RNN}作为图灵机使用时,需要一个二进制序列作为输入,其输出必须离散化以提供二进制输出。 +有可能利用单个有限大小的特定\glssymbol{RNN}来计算在此设置下的所有函数(\cite{Siegelmann+Sontag-1995}用了886个单元)。 +图灵机的``输入''是要计算函数的详细说明(specification),所以模拟此图灵机的相同网络足以应付所有问题。 +用于证明的理论\glssymbol{RNN}可以通过激活和权重(由无限精度的有理数表示)来模拟无限堆栈。 + +% -- 368 -- + +现在我们研究图\ref{fig:chap10_hidden_recurrence_rnn}中\glssymbol{RNN}的\gls{forward_propagation}公式。 +这个图没有指定\gls{hidden_unit}的激活函数。 +我们假设使用双曲正切激活函数。 +此外,图中没有明确指定何种形式的输出和\gls{loss_function}。 +我们假定输出是离散的,如用于预测词或字符的\glssymbol{RNN}。 +一种代表离散变量的自然方式是把输出$\Vo$作为每个离散变量可能值的非标准化对数概率。 +然后,我们可以应用\gls{softmax}后续处理后,获得标准化后概率的输出向量$\hat \Vy$。 +\glssymbol{RNN}从特定的初始状态$\Vh^{(0)}$开始\gls{forward_propagation}。 +从$t= 1$到$t = \tau$的每个\gls{time_step},我们应用以下更新方程: +\begin{align} +\label{eq:108a} + \Va^{(t)} &= \Vb + \MW \Vh^{(t-1)} + \MU \Vx^{(t)}, \\ + \Vh^{(t)} &= \tanh(\Va^{(t)} ), \\ + \Vo^{(t)} &= \Vc + \MV \Vh^{(t)}, \\ + \hat \Vy^{(t)} &= \text{softmax}(\Vo^{(t)}), +\end{align} +其中的参数的\gls{bias_aff}向量$\Vb$和$\Vc$连同权重矩阵$\MU$、$\MV$和$\MW$,分别对应于输入到隐藏、隐藏至输出和隐藏到隐藏的连接。 +这是一个输入序列映射到相同长度的输出序列的\gls{recurrent_network}例子。 +与$\Vx$序列配对的$\Vy$的总损失就是所有\gls{time_step}的损失之和。 +例如,$L^{(t)}$为给定的$\Vx^{(1)}, \dots, \Vx^{(t)}$后$\Vy^{(t)}$的负对数似然,则 +\begin{align} \label{eq:1012L} + & L\big( \{ \Vx^{(1)}, \dots, \Vx^{(\tau)} \}, \{ \Vy^{(1)}, \dots, \Vy^{(\tau)} \} \big) \\ + & = \sum_t L^{(t)} \\ + & = - \sum_t \log p_{\text{model}} \big( y^{(t)} | \{ \Vx^{(1)}, \dots, \Vx^{(t)} \} \big) , +\end{align} +其中$p_{\text{model}} \big( y^{(t)} | \{ \Vx^{(1)}, \dots, \Vx^{(t)} \} \big) $需要读取模型输出向量$\hat \Vy^{(t)}$中对应于$y^{(t)}$的项。 +关于各个参数计算这个\gls{loss_function}的\gls{gradient}是昂贵的操作。 +\gls{gradient}计算涉及执行一次\gls{forward_propagation}(如在图\ref{fig:chap10_hidden_recurrence_rnn}\gls{unfolded_graph}中从左到右的传播),接着是由右到左的\gls{backward_propagation}。 +运行时间是$\CalO(\tau)$,并且不能通过并行化来降低,因为\gls{forward_propagation}图顺序是固有的;每个\gls{time_step}只能一前一后地计算。 +在\gls{forward_propagation}中各个状态必须保存,直到它们被\gls{backward_propagation}中再次使用,因此内存代价也是$\CalO(\tau)$。 +应用于\gls{unfolded_graph}且代价为$\CalO(\tau)$的\gls{backward_propagation}算法称为\firstgls{BPTT}或\glssymbol{BPTT},并会在\ref{sec:computing_the_gradient_in_a_recurrent_neural_network}节中进一步讨论。 +因此\gls{hidden_unit}之间存在循环的网络非常强大但训练代价也很大。 +我们是否有其他选择呢? + +% -- 371 -- + +\subsection{\gls{teacher_forcing}和输出\gls{recurrent_network}} +\label{sec:teacher_forcing_and_networks_with_output_recurrence} +仅在一个\gls{time_step}的输出和下一个\gls{time_step}的\gls{hidden_unit}间存在循环连接的网络(示于图\ref{fig:chap10_output_recurrence_rnn})确实没有那么强大(因为缺乏隐藏到隐藏的循环连接)。 +例如,它不能模拟通用图灵机。 +因为这个网络缺少隐藏到隐藏的循环,它要求输出单元捕捉将用于预测未来的所有关于过去的信息。 +因为输出单元明确地训练成匹配训练集的目标,它们不太能捕获关于过去输入历史的必要信息,除非用户知道如何描述系统的全部状态,并将它作为训练目标的一部分。 +消除隐藏到隐藏循环的优点在于,任何基于比较时刻$t$的预测和时刻$t$的训练目标的\gls{loss_function},所有\gls{time_step}都解耦了。 +因此训练可以并行化,在各时刻$t$分别计算\gls{gradient}。 +因为训练集提供输出的理想值,所以没有必要先计算前一时刻的输出。 + +从输出导致循环连接的模型可用\gls{teacher_forcing}进行训练。 +\gls{teacher_forcing}是使用最大似然\gls{criterion}的程序,并且训练模型时在时刻$t+1$接收真实值$y^{(t)}$作为输入。 +我们可以通过检查两个\gls{time_step}的序列得知这一点。 +条件最大似然\gls{criterion}是 +\begin{align} + &\log p(\Vy^{(1)},\Vy^{(2)} ~|~ \Vx^{(1)}, \Vx^{(2)} ) \\ + &= \log p(\Vy^{(2)} ~|~\Vy^{(1)}, \Vx^{(1)}, \Vx^{(2)} ) + \log p(\Vy^{(1)} ~|~ \Vx^{(1)}, \Vx^{(2)}) . +\end{align} + +% -- 372 -- + +在这个例子中,我们可以看到在时刻$t=2$时,\emph{同时}给定迄今为止的$\Vx$序列和来自训练集的前一$\Vy$值,模型被训练为最大化$\Vy^{(2)}$的条件概率。 +因此最大似然在训练时指定正确反馈,而不是将自己的输出反馈到模型。 +如图\ref{fig:chap10_teacher_forcing}所示。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/teacher_forcing}} +\fi +\caption{TODO} +\label{fig:chap10_teacher_forcing} +\end{figure} + +我们使用\gls{teacher_forcing}的最初动机是为了避免缺乏隐藏到隐藏连接的\gls{BPTT}。 +\gls{teacher_forcing}仍然可以应用到有隐藏到隐藏连接的模型,只要它们在一个\gls{time_step}的输出与下一\gls{time_step}计算的值存在连接。 +然而,只要\gls{hidden_unit}成为较早\gls{time_step}的函数,\glssymbol{BPTT}算法是必要的。 +因此训练某些模型时要同时使用\gls{teacher_forcing}和\glssymbol{BPTT}。 + +% -- 373 -- + +如果之后网络在\textbf{开环}(open-loop)模式下使用,即网络输出(或输出分布的样本)反馈作为输入,那么\gls{teacher_forcing}的缺点就会出现。 +在这种情况下,训练期间该网络看到的输入与测试时看到的会有很大的不同。 +减轻此问题的一种方法是同时使用\gls{teacher_forcing}和自由运行的输入进行训练,比如在展开循环的输出到输入路径预测几个步骤的正确目标值。 +通过这种方式,网络可以学会考虑在训练时没有接触到的输入条件(如自由运行模式下,自身生成自身),以及将状态映射回使网络几步之后生成正确输出的状态。 +另外一种方式\citep{SamyBengio-et-al-arxiv2015}是通过随意选择生成值或真实的数据值作为输入以减小训练时和测试时看到的输入之间的差别。 +这种方法利用了\gls{curriculum_learning}策略,逐步使用更多生成值作为输入。 + + +\subsection{计算\gls{RNN}的\gls{gradient}} +\label{sec:computing_the_gradient_in_a_recurrent_neural_network} +计算\gls{RNN}的\gls{gradient}是容易的。 +可以简单地将\ref{sec:general_back_propagation}节中的推广\gls{backward_propagation}算法应用于展开的\gls{computational_graph}。 +不需要特殊化的算法。 +由\gls{backward_propagation}计算得到的\gls{gradient},并结合任何通用的基于\gls{gradient}的技术就可以训练\glssymbol{RNN}。 + +为了获得\glssymbol{BPTT}算法行为的一些直观理解,我们举例说明如何通过\glssymbol{BPTT}计算上述\glssymbol{RNN}公式(式\eqref{eq:108a}和式\eqref{eq:1012L})的\gls{gradient}。 +\gls{computational_graph}的节点包括参数$\MU,\MV,\MW, \Vb$和$\Vc$,以及以$t$索引的顺序节点$\Vx^{(t)}, \Vh^{(t)},\Vo^{(t)}$和$L^{(t)}$。 +对于每一个节点$\TSN$,我们需要基于它后面节点的\gls{gradient},递归地计算\gls{gradient}$\nabla_{\TSN} L$。 +我们从紧接着最终损失的节点开始递归: +\begin{align} + \frac{\partial L}{\partial L^{(t)}} = 1. +\end{align} +在这个导数中,我们假设输出$\Vo^{(t)}$是作为\gls{softmax}函数的参数来获得关于输出概率的向量$\hat{\Vy}$。 +我们也假设损失是迄今为止给定了输入后的真实目标$y^{(t)}$的负对数似然。 +对于所有$i,t$,关于\gls{time_step}$t$输出的\gls{gradient}$\nabla_{\Vo^{(t)}} L$如下: +\begin{align} + (\nabla_{\Vo^{(t)}} L)_i = \frac{\partial L}{\partial o_i^{(t)}} + = \frac{\partial L}{\partial L^{(t)}} \frac{\partial L^{(t)}}{\partial o_i^{(t)}} + = \hat y_i^{(t)} - \mathbf{1}_{i,y^{(t)}}. +\end{align} +我们从序列的末尾开始,反向进行计算。 +在最后的\gls{time_step}$\tau$, $\Vh^{(\tau)}$只有$\Vo^{(\tau)}$作为后续节点,因此这个\gls{gradient}很简单: +\begin{align} + \nabla_{\Vh_{(\tau)}} L = \MV^\top \nabla_{\Vo^{(\tau)}} L. +\end{align} +然后,我们可以从时刻$t=\tau-1$到$t=1$反向迭代, 通过时间\gls{backward_propagation}\gls{gradient},注意$\Vh^{(t)}(t < \tau)$同时具有$\Vo^{(t)}$和$\Vh^{(t+1)}$两个后续节点。 +因此,它的\gls{gradient}由下式计算 +\begin{align} + \nabla_{\Vh_{(\tau)}} L = \Big( \frac{\partial \Vh^{(t+1)}}{ \Vh^{(t)}} \Big)^\top(\nabla_{\Vh^{(t+1)}} L) + + \Big( \frac{\partial \Vo^{(t)}}{ \Vh^{(t)}} \Big)^\top (\nabla_{\Vo^{(t)}} L) \\ + = \MW^\top (\nabla_{\Vh^{(t+1)}} L) \text{diag} \Big( 1 - (\Vh^{(t+1)})^2 \Big) + + \MV^\top \nabla_{\Vo^{(\tau)}} L, +\end{align} +其中$\text{diag} \Big( 1 - (\Vh^{(t+1)})^2 \Big) $ 表示一个包含元素$1 - (h_i^{(t+1)})^2$的对角矩阵。 +这是关于时刻$t+1$与\gls{hidden_unit}$i$关联的双曲正切的\gls{jacobian}。 + +% -- 374 -- + +一旦获得了\gls{computational_graph}内部节点的\gls{gradient},我们就可以得到关于参数节点的\gls{gradient}。 +因为参数在许多\gls{time_step}共享,必须在表示这些变量的微积分操作时谨慎对待。 +我们希望实现的等式使用\ref{sec:general_back_propagation}中的{\tt bprop}方法计算\gls{computational_graph}中单一边对\gls{gradient}贡献。 +然而微积分中的$\nabla_{\MW} f$算子,计算$\MW$对于$f$的贡献时将\gls{computational_graph}中\emph{所有}边都考虑进去了。 +为了消除这种歧义,我们定义只在$t$时刻使用的虚拟变量$\MW^{(t)}$作为$\MW$的副本。 +然后,我们可以使用$\nabla_{\MW^{(t)}}$来表示权重在\gls{time_step}$t$对\gls{gradient}的贡献。 + +使用这个表示,关于剩下参数的\gls{gradient}可以由下式给出: +\begin{align} + \nabla_{\Vc} L &= \sum_t \Big( \frac{\partial \Vo^{(t)}}{\partial \Vc} \Big)^\top \nabla_{\Vo^{(t)}} L + = \sum_t \nabla_{\Vo^{(t)}} L ,\\ + \nabla_{\Vb} L &= \sum_t \Big( \frac{\partial \Vh^{(t)}}{\partial \Vb^{(t)}} \Big)^\top \nabla_{\Vh^{(t)}} L + = \sum_t \text{diag} \Big( 1 - \big( \Vh^{(t)} \big)^2 \Big) \nabla_{\Vh^{(t)}} L ,\\ + \nabla_{\MV} L &= \sum_t \sum_i \Big( \frac{\partial L} {\partial o_i^{(t)}}\Big) \nabla_{\MV} o_i^{(t)} + = \sum_t (\nabla_{\Vo^{(t)}} L) \Vh^{(t)^\top},\\ + \nabla_{\MW} L &= \sum_t \sum_i \Big( \frac{\partial L} {\partial h_i^{(t)}}\Big) + \nabla_{\MW^{(t)}} h_i^{(t)} \\ +&= \sum_t \text{diag} \Big( 1 - \big( \Vh^{(t)} \big)^2 \Big) ( \nabla_{\Vh^{(t)}} L) \Vh^{(t-1)^\top} ,\\ + \nabla_{\MU} L &= \sum_t \sum_i \Big( \frac{\partial L} {\partial h_i^{(t)}}\Big) + \nabla_{\MU^{(t)}} h_i^{(t)} \\ +&= \sum_t \text{diag} \Big( 1 - \big( \Vh^{(t)} \big)^2 \Big) ( \nabla_{\Vh^{(t)}} L) \Vx^{(t)^\top} +\end{align} +因为\gls{computational_graph}中定义的损失的任何参数都不是训练数据$\Vx^{(t)}$的父节点,所以我们不需要计算关于它的\gls{gradient}。 + +% -- 375 -- + +\subsection{作为\gls{directed_graphical_model}的\gls{recurrent_network}} +\label{sec:recurrent_networks_as_directed_graphical_models} +目前为止,我们接触的\gls{recurrent_network}例子中损失$L^{(t)}$是训练目标$\Vy^{(t)}$和输出$\Vo^{(t)}$之间的\gls{cross_entropy}。 +与\gls{feedforward_network}类似,原则上\gls{recurrent_network}几乎可以使用任何损失。 +但必须根据任务来选择损失。 +如\gls{feedforward_network},我们通常希望将\glssymbol{RNN}的输出解释为一个概率分布,并且我们通常使用与分布相关联的\gls{cross_entropy}来定义损失。 +均方误差是与单位高斯分布的输出相关联的\gls{cross_entropy}损失,例如\gls{feedforward_network}中所使用的。 + +当我们使用一个预测性对数似然的训练目标,如式\eqref{eq:1012L},我们将\glssymbol{RNN}训练为能够根据之前的输入估计下一个序列元素$\Vy^{(t)}$的条件分布。 +这可能意味着,我们最大化对数似然 +\begin{align} + \log p(\Vy^{(t)} ~|~ \Vx^{(1)},\dots, \Vx^{(t)}), +\end{align} +或者,如果模型包括来自一个\gls{time_step}的输出到下一个\gls{time_step}的连接, +\begin{align} + \log p(\Vy^{(t)} ~|~ \Vx^{(1)},\dots, \Vx^{(t)},\Vy^{(1)},\dots, \Vy^{(t-1)} ). +\end{align} +将整个序列$\Vy$的联合分布分解为一系列单步的概率预测是捕获关于整个序列完整联合分布的一种方法。 +当我们不把过去的$\Vy$值反馈给下一步作为预测的条件时,那么\gls{directed_graphical_model}不包含任何从过去$\Vy^{(i)}$到当前$\Vy^{(t)}$的边。 +在这种情况下,输出$\Vy$与给定的$\Vx$序列是条件独立的。 +当我们反馈真实的$\Vy$值(不是它们的预测值,而是真正观测到或生成的值)给网络时,那么\gls{directed_graphical_model}包含所有从过去$\Vy^{(i)}$到当前$\Vy^{(t)}$的边。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/fully_connected_chain}} +\fi +\caption{TODO} +\label{fig:chap10_fully_connected_chain} +\end{figure} + +% -- 376 -- + +举一个简单的例子,让我们考虑只有一个标量随机变量序列$ \SetY = \{\RSy^{(1)},\dots,\RSy^{(\tau)}\}$的\glssymbol{RNN}模型,也没有额外的输入$\RSx$。 +在\gls{time_step}$t$的输入仅仅是\gls{time_step}$t-1$的输出。 +该\glssymbol{RNN}则定义了关于$\RSy$变量的\gls{directed_graphical_model}。 +我们使用链式法则(|||c|||)参数化这些条件联合分布: +\begin{align} + P(\SetY) = P(\RVy^{(1)},\dots,\RVy^{(\tau)}) = \prod_{t=1}^{\tau}P(\RVy^{(t)} ~|~ \RVy^{(t-1)},\RVy^{(t-2)}, + \dots,\RVy^{(1)}), +\end{align} +其中当$t=1$时竖杠右侧显然为空。 +因此,根据这样一个模型,一组值$\{y^{(1)},\dots,y^{(\tau)} \}$的负对数似然为 +\begin{align} + L = \sum_{t} L^{(t)}, +\end{align} +其中 +\begin{align} + L^{(t)} = -\log P(\RSy^{(t)} = y^{(t)} ~|~ y^{(t-1)},y^{(t-2)}, \dots, y^{(1)}). +\end{align} +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/rnn_graphical_model_with_state}} +\fi +\caption{TODO} +\label{fig:chap10_rnn_graphical_model_with_state} +\end{figure} + +\gls{graphical_model}中的边表示哪些变量直接依赖于其他变量。 +许多\gls{graphical_model}的目标是省略不存在强相互作用的边以实现统计和计算的效率。 +例如,通常可以作\ENNAME{Markov}假设,即\gls{graphical_model}应该只包含从$\{ \RSy^{(t-k)}, \dots, \RSy^{(t-1)}\}$到$\RSy^{(t)}$的边,而不是包含整个过去历史的边。 +然而,在一些情况下,我们认为整个过去的输入会对序列的下一个元素有一定影响。 +当我们认为$\RSy^{(t)}$的分布可能取决于遥远过去(在某种程度)的$y^{(i)}$的值,且无法通过$y^{(t-1)}$捕获$y^{(i)}$的影响时,\glssymbol{RNN}将会很有用。 + +解释\glssymbol{RNN}作为\gls{graphical_model}的一种方法是将\glssymbol{RNN}视为定义一个结构为完全图,能够表示任何一对的$y$值之间直接相关性的\gls{graphical_model}。 +图\ref{fig:chap10_fully_connected_chain}是关于$y$值且具有完全图结构的\gls{graphical_model}。 +该\glssymbol{RNN}完全图的解释基于排除并忽略模型中的\gls{hidden_unit}$\Vh^{(t)}$。 + +% -- 377 -- + +更有趣的是,将\gls{hidden_unit}$\Vh^{(t)}$视为随机变量,从而产生\glssymbol{RNN}的\gls{graphical_model}结构\footnote{给定这些变量的父变量,其条件分布是确定性的。 +尽管设计具有这样确定性的\gls{hidden_unit}的\gls{graphical_model}是很少见的,但这是完全合理的。}。 +在\gls{graphical_model}中包括隐藏单元预示\glssymbol{RNN}能对观测的联合分布提供非常有效的参数化。 +假设我们用表格表示法来表示离散值上任意的联合分布,即对每个值可能的赋值有一个单独条目的数组,该条目表示发生该赋值的概率。 +如果$y$可以取$k$个不同的值,表格表示法将有$\CalO(k^\tau)$个参数。 +比较\glssymbol{RNN},由于\gls{parameter_sharing},\glssymbol{RNN}的参数数目为$\CalO(1)$且是序列长度的函数。 +可以调节\glssymbol{RNN}的参数数量来控制模型容量,但不用被迫与序列长度成比例。 +式\eqref{eq:105h}展示了所述\glssymbol{RNN}通过循环应用相同的函数$f$以及在每个\gls{time_step}的相同参数$\Vtheta$,有效地参数化的变量之间的长期联系。 +图\ref{fig:chap10_rnn_graphical_model_with_state}说明了这个\gls{graphical_model}的解释。 +在\gls{graphical_model}中结合$\Vh^{(t)}$节点可以用作过去和未来之间的中间量,从而将它们解耦。 +遥远过去的变量$y^{(i)}$可以通过其对$\Vh$的影响来影响变量$y^{(t)}$。 +该图的结构表明可以在\gls{time_step}使用相同的条件概率分布来有效地参数化模型,并且当观察到全部变量时,可以有效地评估联合地分配给所有变量的概率。 + +% -- 378 -- + +即便使用高效参数化的\gls{graphical_model},某些操作在计算上仍然具有挑战性。 +例如,难以预测序列中缺少的值。 + +\gls{recurrent_network}为其减少的参数数目付出的代价是\emph{优化}参数可能变得困难。 + +在\gls{recurrent_network}中使用的\gls{parameter_sharing}依赖于相同参数可用于不同\gls{time_step}的假设。 +等效地,假设在时刻$t +1$变量的条件概率分布在时刻$t$给定的变量是\firstgls{stationary},这意味着之前的\gls{time_step}与下个\gls{time_step}之间的关系并不依赖于$t$。 +原则上,可以使用$t$作为每个\gls{time_step}的额外输入,并让学习器在发现任何时间依赖性的同时,在不同\gls{time_step}之间尽可能多地共享。 +相比在每个$t$使用不同的条件概率分布已经好很多了,但网络将必须在面对新$t$时进行推断。 + +为了完整描述将\glssymbol{RNN}作为\gls{graphical_model}的观点,我们必须描述如何从模型采样。 +我们需要执行的主要操作是简单地从每一\gls{time_step}的条件分布采样。 +然而,这会导致额外的复杂性。 +\glssymbol{RNN}必须有某种机制来确定序列的长度。 +这可以通过多种方式实现。 + +在当输出是从词汇表获取的符号的情况下,我们可以添加一个对应于序列末端的特殊符号\citep{schmidhuber2012self}。 +当产生该符号时,采样过程停止。 +在训练集中,我们将该符号作为序列的一个额外成员,即紧跟每个训练样本$\Vx^{(\tau)}$之后。 + +% -- 379 -- + +另一种选择是在模型中引入一个额外的\ENNAME{Bernoulli}输出,表示在每个\gls{time_step}决定是否继续产生或停止产生。 +这种方法比向词汇表增加一个额外符号的方法更普遍的,因为它可以适用于任何\glssymbol{RNN},而不仅仅是输出符号序列的\glssymbol{RNN}。 +例如,它可以应用于一个产生实数序列的\glssymbol{RNN}。 +新的输出单元通常使用\ENNAME{sigmoid}单元,并通过\gls{cross_entropy}训练。 +在这种方法中,\ENNAME{sigmoid}被训练为最大化正确预测的对数似然,即在每个\gls{time_step}序列是否结束或继续。 + +确定序列长度$\tau$的另一种方法是将一个额外的输出添加到模型并预测整数$\tau$本身。 +模型可以采出$\tau$的值,然后采$\tau$步有价值的数据。 +这种方法需要在每个\gls{time_step}的循环更新中增加一个额外输入,使得循环更新知道它是否是靠近所产生序列的末尾。 +这种额外的输入可以是$\tau$的值,也可以是$\tau - t$即剩下\gls{time_step}的数量。 +如果没有这个额外的输入,\glssymbol{RNN}可能会产生突然结束序列,如一个句子在最终完整前结束。 +此方法是基于分解 +\begin{align} + P(\Vx^{(1)},\dots, \Vx^{(\tau)}) = P(\tau) P(\Vx^{(1)},\dots,\Vx^{(\tau)} ~|~ \tau) +\end{align} +直接预测$\tau$的例子见\cite{Goodfellow+et+al-ICLR2014a}。 + + +\subsection{基于上下文的\glssymbol{RNN}序列建模} +\label{sec:modeling_sequences_conditioned_on_context_with_rnns} +上一节描述了没有输入$\Vx$时,关于随机变量序列$y^{(t)}$的\glssymbol{RNN}如何对应于\gls{directed_graphical_model}。 +当然,如式\eqref{eq:108a}所示的\glssymbol{RNN}包含一个输入序列$\Vx^{(1)},\Vx^{(2)},\dots,\Vx^{(\tau)}$。 +一般情况下,\glssymbol{RNN}允许将\gls{graphical_model}的观点扩展到不仅代表$y$变量的联合分布也能表示给定$\Vx$后$y$条件分布。 +如在\ref{sec:learning_conditional_distributions_with_maximum_likelihood}节的\gls{feedforward_network}情形中所讨论的,任何代表变量$P(\Vy;\Vtheta)$的模型都能被解释为代表条件分布$P(\Vy;\Vomega)$的模型,其中$\Vomega=\Vtheta$。 +我们能像之前一样使用$P(\Vy;\Vomega)$代表分布$P(\Vy;\Vx)$来扩展这样的模型,但要令$\Vomega$是关于$\Vx$的函数。 +在\glssymbol{RNN}的情况,这可以通过不同的方式来实现。 +此处,我们回顾最常见和最明显的选择。 + +% -- 380 -- + +之前,我们已经讨论了将$t =1, \dots, \tau$的向量$\Vx^{(t)}$序列作为输入的\glssymbol{RNN}。 +另一种选择是只使用单个向量$\Vx$作为输入。 +当$\Vx$是一个固定大小的向量,我们可以简单地将其看作产生$\Vy$序列\glssymbol{RNN}的额外输入。 +将额外输入提供到\glssymbol{RNN}的一些常见方法是: +\begin{enumerate} + \item 在每个时刻作为一个额外输入,或 + \item 作为初始状态$\Vh^{(0)}$,或 + \item 结合两种方式。 +\end{enumerate} + +第一个也是最常用的方法如图\ref{fig:chap10_conditional_rnn}所示。 +输入$\Vx$和每个隐藏单元向量$\Vh^{(t)}$之间的相互作用通过新引入的权重矩阵$\MR$参数化的,这是只包含$y$序列的模型所没有的。 +同样的乘积$\Vx^\top\MR$在每个\gls{time_step}作为\gls{hidden_unit}的一个额外输入。 +我们可以认为$\Vx$的选择(确定$\Vx^\top\MR$值),是有效地用于每个\gls{hidden_unit}的一个新\gls{bias_aff}参数。 +权重与输入保持独立。 +我们可以把这种模型视为采取非条件模型$\Vtheta$并使之成为$\Vomega$,其中$\Vomega$内的\gls{bias_aff}参数是输入的函数。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/conditional_rnn}} +\fi +\caption{TODO} +\label{fig:chap10_conditional_rnn} +\end{figure} + +% -- 381 -- + +\glssymbol{RNN}可以接收向量序列$\Vx^{(t)}$作为输入,而不是仅接收单个向量$\Vx$作为输入。 +式\eqref{eq:108a}描述的\glssymbol{RNN}对应条件分布$P(\Vy^{(1)}, \dots, \Vy^{(\tau)} ~|~ \Vx^{(1)}, \dots, \Vx^{(\tau)})$,并在条件独立的假设下这个分布分解为 +\begin{align} + \prod_t P(\Vy^{(t)} ~|~ \Vx^{(1)}, \dots, \Vx^{(t)}). +\end{align} +为去掉条件独立的假设,我们可以在时刻$t$的输出到时间$t+1$\gls{hidden_unit}添加连接,如图\ref{fig:chap10_causal_rnn}所示。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/causal_rnn}} +\fi +\caption{TODO} +\label{fig:chap10_causal_rnn} +\end{figure} +该模型就可以代表关于$\Vy$序列的任意概率分布。 +这种给定一个序列表示另一个序列分布的模型的还是有一个限制,就是这两个序列的长度必须是相同的。 +我们将在\ref{sec:encoder_decoder_sequence_to_sequence_architectures}节描述如何消除这种限制。 + +% -- 382 -- + +\section{双向\glssymbol{RNN}} +\label{sec:bidirectional_rnns} +目前为止我们考虑的所有\gls{RNN}有一个``因果''结构,意味着在时刻$t$的状态只能从过去的序列$\Vx^{(1)},\dots,\Vx^{(t-1)}$以及当前的输入$\Vx^{(t)}$捕获信息。 +我们还讨论了某些在$\Vy$可用时,允许过去的$\Vy$值信息影响当前状态的模型。 + +然而,在许多应用中,我们要输出的$\Vy^{(t)}$的预测可能依赖于整个输入序列。 +例如,在语音识别中,由于协同发音,当前声音作为音素的正确解释可能取决于未来几个音素,甚至潜在的可能取决于未来的几个词,因为词与附近的词之间的存在语义依赖:如果当前的词有两种声学上合理的解释,我们可能要在更远的未来(和过去)来寻找信息区分它们。 +这在手写识别和许多其他序列到序列学习的任务中也是如此,将会在下一节中描述。 + +双向\gls{RNN}(或双向\glssymbol{RNN})为满足这种需要而被发明\citep{Schuster+Paliwal-1997}。 +他们在需要双向信息的应用中非常成功\citep{Graves-book2012},如手写识别\citep{Graves-et-al-NIPS2007,Graves+Schmidhuber-2009},语音识别\citep{Graves+Schmidhuber-2005,Graves-et-al-ICASSP2013}以及生物信息学\citep{Baldi-et-al-1999}。 + +顾名思义,双向\glssymbol{RNN}结合时间上从序列起点开始移动的\glssymbol{RNN}和另一个时间上从序列末尾开始移动的\glssymbol{RNN}。 +图\ref{fig:chap10_bidirectional_rnn}展示了典型的双向\glssymbol{RNN},其中$\Vh^{(t)}$代表通过时间向前移动的子\glssymbol{RNN}的状态,$\Vg^{(t)}$代表通过时间向后移动的子\glssymbol{RNN}的状态。 +这允许输出单元$\Vo^{(t)}$能够计算同时依赖于过去和未来且对时刻$t$的输入值最敏感的表示,而不必指定$t$周围固定大小的窗口(这是\gls{feedforward_network}、\gls{convolutional_network}或具有固定大小的先行缓存器的\glssymbol{RNN}必须要做的)。 + +% -- 383 -- + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/bidirectional_rnn}} +\fi +\caption{TODO} +\label{fig:chap10_bidirectional_rnn} +\end{figure} + +这个想法可以自然扩展到2维输入,如图像,由\emph{四个}\glssymbol{RNN}组成,每一个沿着四个方向中的一个计算:上、下、左、右。 +如果\glssymbol{RNN}能够学习到承载长期信息,那在2维网格每个点$(i, j)$的输出$O_{i,j}$就能计算一个能捕捉到大多局部信息并且依赖于长期输入的表示。 +相比\gls{convolutional_network},应用于图像的\glssymbol{RNN}通常更昂贵,但允许同一特征图的特征之间存在长期横向的相互作用\citep{Visin-et-al-arxiv2015-renet,kalchbrenner2015grid}。 +实际上,对于这样的\glssymbol{RNN},\gls{forward_propagation}公式可以写成表示使用卷积的形式,计算自底向上到每一层的输入(在整合横向相互作用的特征图的循环传播之前)。 + +% -- 384 -- + +\section{基于编码-解码的序列到序列架构} +\label{sec:encoder_decoder_sequence_to_sequence_architectures} +我们已经在图\ref{fig:chap10_single_output_rnn}看到\glssymbol{RNN}如何将输入序列映射成固定大小的向量,在图\ref{fig:chap10_conditional_rnn}中看到\glssymbol{RNN}如何将固定大小的向量映射成一个序列,在图\ref{fig:chap10_hidden_recurrence_rnn}、\ref{fig:chap10_output_recurrence_rnn}、\ref{fig:chap10_causal_rnn}和\ref{fig:chap10_bidirectional_rnn}中看到\glssymbol{RNN}如何将一个输入序列映射到等长的输出序列。 + +本节我们讨论如何训练\glssymbol{RNN},使其将输入序列映射到不一定等长的输出序列。 +这在许多场景中都有应用,如语音识别、机器翻译或问答,其中训练集的输入和输出序列的长度通常不相同(虽然它们的长度可能相关)。 + +我们经常将\glssymbol{RNN}的输入称为``上下文''。 +我们希望产生此上下文的表示,$C$。 +这个上下文$C$可能是一个概括输入序列$\MX=(\Vx^{(1)},\dots,\Vx^{(n_x)})$的向量或者向量序列。 + +用于映射可变长度序列到另一可变长度序列最简单的\glssymbol{RNN}架构最初由\cite{cho-al-emnlp14}提出,之后不久由\cite{Sutskever-et-al-NIPS2014}独立开发,并且第一个使用这种方法获得翻译的最好结果。 +前一系统是对另一个机器翻译系统产生的建议进行评分,而后者使用独立的\gls{recurrent_network}来生成翻译。 +这些作者分别将该架构称为编码-解码或序列到序列架构,如图\ref{fig:chap10_rnn_encdec}所示。 +这个想法非常简单:(1)\firstgls{encoder}或\textbf{读取器}(reader)或\textbf{输入}(input)\glssymbol{RNN}处理输入序列。 +\gls{encoder}输出上下文$C$(通常是最终隐藏状态的简单函数)。 +(2)\firstgls{decoder}或\textbf{写入器}(writer)或\textbf{输出}(output)\glssymbol{RNN}则以固定长度的向量(如图\ref{fig:chap10_conditional_rnn})为条件产生输出序列$\MY=(\Vy^{(1)}, \dots, \Vy^{(n_y)})$。 +这种架构对比本章前几节提出的架构的创新之处在于长度$n_x$和$n_y$可以彼此不同,而之前的架构约束$n_x = n_y = \tau$。 +在一个序列到序列的架构中,两个\glssymbol{RNN}共同训练以最大化$\log P( \Vy^{(1)}, \dots, \Vy^{(n_y)} ~|~ \Vx^{(1)},\dots,\Vx^{(n_x)} )$(关于训练集中所有$\Vx$和$\Vy$对的平均)。 +\gls{encoder}\glssymbol{RNN}的最后一个状态$\Vh_{n_x}$通常被当作输入的表示$C$并作为\gls{decoder}\glssymbol{RNN}的输入。 + +% -- 385 -- +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/rnn_encdec}} +\fi +\caption{TODO} +\label{fig:chap10_rnn_encdec} +\end{figure} + +如果上下文$C$是一个向量,则\gls{encoder}\glssymbol{RNN}只是在\ref{sec:modeling_sequences_conditioned_on_context_with_rnns}节描述的向量到序列\glssymbol{RNN}。 +正如我们所见,向量到序列\glssymbol{RNN}至少有两种接受输入的方法。 +输入可以被提供为\glssymbol{RNN}的初始状态,或连接到每个\gls{time_step}中的\gls{hidden_unit}。 +这两种方式也可以结合。 + +这里并不强制要求\gls{encoder}与\gls{decoder}的隐藏层具有相同的大小。 + +此架构的一个明显限制是,\gls{encoder}\glssymbol{RNN}输出的上下文$C$的维度太小而难以适当地概括一个长序列。 +这种现象由\cite{Bahdanau-et-al-ICLR2015-small}在机器翻译中观察到。 +他们提出让$C$成为可变长度的序列,而不是一个固定大小的向量。 +此外,他们还引入了将序列$C$的元素和输出序列的元素相关联的\firstgls{attention_mechanism}。 +可在\ref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}了解更多详情。 + +% -- 386 -- + +\section{深度\gls{recurrent_network}} +\label{sec:deep_recurrent_networks} +大多数\glssymbol{RNN}中的计算可以分解成三块参数及其相关的变换: +\begin{enumerate} + \item 从输入到隐藏状态, + \item 从前一隐藏状态到下一隐藏状态,以及 + \item 从隐藏状态到输出。 +\end{enumerate} +根据图\ref{fig:chap10_hidden_recurrence_rnn}中的\glssymbol{RNN}架构,这三个块都与单个权重矩阵相关联。 +换句话说,当网络被\gls{unfolding}时,每个块对应一个浅的变换。 +能通过深度\glssymbol{MLP}内单个层来表示的变换称为浅变换。 +通常,这是由学好的仿射变换和一个固定非线性表示的转换。 + +在这些操作中引入深度会有利的吗? +实验证据\citep{Graves-arxiv2013,Pascanu-et-al-ICLR2014}强烈暗示理应如此。 +实验证据与我们需要足够的深度以执行所需映射的想法一致。 +可以参考\cite{Schmidhuber96,ElHihi+Bengio-nips8}或\cite{Jaeger2007}了解更早的关于深度\glssymbol{RNN}的研究。 + +\cite{Graves-arxiv2013}第一个展示了将\glssymbol{RNN}的状态分为多层的显著好处,如图\ref{fig:chap10_deep}(左)。 +我们可以认为,在图\ref{fig:chap10_deep}(a)所示层次结构中较低的层起到了将原始输入转化为对更高层的隐藏状态更合适表示的作用。 +\cite{Pascanu-et-al-ICLR2014}更进一步提出在上述三个块中各使用一个单独的\glssymbol{MLP}(可能是深度的),如图\ref{fig:chap10_deep}(b)所示。 +考虑表示容量,我们建议在这三个步中都分配足够的容量,但增加深度可能会因为优化困难而损害学习效果。 +在一般情况下,更容易优化较浅的架构,加入图\ref{fig:chap10_deep}(b)的额外深度导致从\gls{time_step}$t$的变量到\gls{time_step}$t+1$的最短路径变得更长。 +例如,如果具有单个隐藏层的\glssymbol{MLP}被用于状态到状态的转换,那么与图\ref{fig:chap10_hidden_recurrence_rnn}相比,我们就会加倍任何两个不同\gls{time_step}变量之间最短路径的长度。 +然而\cite{Pascanu-et-al-ICLR2014}认为,在隐藏到隐藏的路径中引入\gls{skip_connection}可以缓和这个问题,如图\ref{fig:chap10_deep}(c)所示。 + +% -- 387 -- + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/deep}} +\fi +\caption{TODO} +\label{fig:chap10_deep} +\end{figure} + +\section{递归神经网络} +\label{sec:recursive_neural_networks} +递归神经网络\footnote{我们建议不要将``递归神经网络''缩写为``\glssymbol{RNN}'',以免与``\gls{RNN}''混淆。}代表\gls{recurrent_network}的另一个扩展,它被构造为深的树状结构而不是\glssymbol{RNN}的链状结构,因此是不同类型的\gls{computational_graph}。 +对于递归网络的典型的\gls{computational_graph}如图\ref{fig:chap10_recursive_net}所示。 +递归神经网络由\cite{Pollack90}引入,而\cite{tr-bottou-2011}描述了这类网络的潜在用途——学习推论。 +递归网络已成功地应用于输入是\emph{数据结构}的\gls{NN}\citep{Frasconi97,Frasconi-1998},如自然语言处理\citep{Socher+al-NIPS2011,Socher+al-EMNLP2011-small,Socher-et-al-EMNLP2013}和计算机视觉\citep{Socher-2011}。 + +% -- 388 -- + +递归网络的一个明显优势是,对于相同的长度为$\tau$的序列,深度(通过非线性操作的组合数量来衡量)可以急剧地从$\tau$减小为$\CalO(\log \tau)$,这可能有助于解决\gls{long_term_dependency}。 +一个悬而未决的问题是如何以最佳的方式构造树。 +一种选择是使用不依赖于数据的树结构,如平衡二叉树。 +在某些应用领域,外部方法可以为选择适当的树结构提供借鉴。 +例如,处理自然语言的句子时,用于递归网络的树结构可以被固定为句子语法分析树的结构(可以由自然语言语法分析程序提供)\citep{Socher+al-NIPS2011,Socher+al-EMNLP2011-small}。 +理想的情况下,人们希望学习器自行发现和推断适合于任意给定输入的树结构,如\citep{tr-bottou-2011}所建议。 + +% -- 389 -- + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/recursive_net}} +\fi +\caption{TODO} +\label{fig:chap10_recursive_net} +\end{figure} + +许多递归网络想法的变种是可能的。 +例如,\cite{Frasconi97}和\cite{Frasconi-1998}将数据与树结构相关联,并将输入和目标与树的单独节点相关联。 +由每个节点执行的计算无须是传统的人工神经计算(所有输入的仿射变换后跟一个单调非线性)。 +例如,\cite{Socher-et-al-EMNLP2013}提出用张量运算和双线性形式,在这之前人们已经发现当概念是由连续向量(嵌入)表示时,这种方式有利于建模概念之间的关系\citep{Weston+Bengio+Usunier-2010,Bordes-et-al-AISTATS2012-small}。 + +\section{\gls{long_term_dependency}的挑战} +\label{sec:the_challenge_of_long_term_dependencies} +学习\gls{recurrent_network}\gls{long_term_dependency}的数学挑战在\ref{sec:long_term_dependencies}中引入。 +根本问题是,经过许多阶段传播后的\gls{gradient}倾向于消失(大部分时间)或爆炸(很少,但对优化过程影响很大)。 +即使我们假设\gls{recurrent_network}是参数稳定的(可存储记忆,且\gls{gradient}不爆炸),但\gls{long_term_dependency}的困难来自比短期相互作用指数小的权重(涉及许多\gls{jacobian}相乘)。 +许多资料提供了更深层次的讨论\citep{Hochreiter91-small,Doya93,Bengio1994ITNN,Pascanu+al-ICML2013-small}。 +在这一节中,我们会更详细地描述该问题。 +其余几节介绍克服这个问题的方法。 + +% -- 390 -- + +\gls{recurrent_network}涉及相同函数的多次组合,每个\gls{time_step}一次。 +这些组合可以导致极端非线性行为,如图\ref{fig:chap10_composition_color}所示。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/composition_color}} +\fi +\caption{TODO} +\label{fig:chap10_composition_color} +\end{figure} + +特别地,\gls{RNN}所使用的函数组合有点像矩阵乘法。 +我们可以认为,循环联系 +\begin{align} + \Vh^{(t)} = \MW^\top \Vh^{(t-1)}, +\end{align} +是一个非常简单的、缺少非线性激活函数和输入$\Vx$的\gls{RNN}。 +如\ref{sec:long_term_dependencies}描述,这种递推关系本质上描述了幂法。 +它可以被简化为 +\begin{align} + \Vh^{(t)} = (\MW^t)^\top \Vh^{(0)}, +\end{align} +而当$\MW$符合下列形式的特征分解 +\begin{align} + \MW = \MQ \VLambda \MQ^\top, +\end{align} +其中$\MQ$正交,循环性可进一步简化为 +\begin{align} + \Vh^{(t)} = \MQ^\top \VLambda^t \MQ \Vh^{(0)}. +\end{align} +特征值提升到$t$次后,导致幅值不到一的特征值衰减到零,而幅值大于一的就会激增。 +任何不与最大特征向量对齐的$\Vh^{(0)}$的部分将最终被丢弃。 + + +这个问题是针对\gls{recurrent_network}的。 +在标量情况下,想象多次乘一个权重$w$。 +根据$w$的幅值,该乘积$w^t$要么消失要么激增。 +然而,如果每个时刻使用不同权重$w^{(t)}$的非\gls{recurrent_network},情况就不同了。 +如果初始状态给定为$1$,那么时刻$t$的状态可以由$\prod_t w^{(t)}$给出。 +假设$w^{(t)}$的值是随机生成的,各自独立,且有$0$均值$v$方差。 +乘积的方差就为$\CalO(v^n)$。 +为了获得某些期望的方差$v^*$,我们可以选择单个方差为$v=\sqrt[n]{v^*}$权重。 +因此,非常深的\gls{feedforward_network}通过精心设计的比例可以避免\gls{gradient}消失和爆炸问题,如\cite{Sussillo14}所主张的。 + +% -- 391 -- + +\glssymbol{RNN}\gls{gradient}消失和爆炸问题是由不同研究人员独立发现\citep{Hochreiter91-small,Bengio_icnn93,Bengio1994ITNN}。 +有人可能会希望通过简单地停留在\gls{gradient}不消失或爆炸的参数空间来避免这个问题。 +不幸的是,为了储存记忆并对小扰动的鲁棒,\glssymbol{RNN}必须进入参数空间中的\gls{gradient}消失区域\citep{Bengio_icnn93,Bengio1994ITNN}。 +具体来说,每当模型能够表示\gls{long_term_dependency},长期相互作用的\gls{gradient}幅值就会变得指数小(相比短期相互作用的\gls{gradient}幅值)。 +这并不意味着这是不可能学习的,由于\gls{long_term_dependency}关系的信号很容易被短期相关性产生的最小波动隐藏,因而可能需要很长的时间去学习\gls{long_term_dependency}。 +实践中,\cite{Bengio1994ITNN}的实验表明,当我们增加了需要捕获的依赖关系的跨度,基于\gls{gradient}的优化变得越来越困难,\glssymbol{SGD}在长度仅为10或20的序列上成功训练传统\glssymbol{RNN}的概率迅速变为0。 + +将\gls{recurrent_network}作为动力系统更深入探讨的资料见\cite{Doya93,Bengio1994ITNN,Siegelmann+Sontag-1995}及 +\cite{Pascanu-et-al-ICML2013}的回顾。 +本章的其余部分将讨论目前已经提出的降低学习\gls{long_term_dependency}(在某些情况下,允许一个\glssymbol{RNN}学习横跨数百步的依赖)难度的不同方法,但学习\gls{long_term_dependency}的问题仍是\gls{DL}中的一个主要挑战。 + + +\section{\gls{ESN}} +\label{sec:echo_state_networks} +从$\Vh^{(t-1)}$到$\Vh^{(t)}$的循环权重映射以及从$\Vx^{(t)}$到$\Vh^{(t)}$的输入权重映射是一个\gls{recurrent_network}中最难学习的参数。 +研究者\citep{Jaeger-NIPS2002,Maass-et-al-2002,Jaeger+Haas-2004}提出避免这种困难的方法是设定循环\gls{hidden_unit},使其能很好地捕捉过去输入历史,并且\emph{只学习输出权重}。 +\firstgls{ESN}或\glssymbol{ESN}\citep{Jaeger+Haas-2004,Jaeger-2007},以及\firstgls{liquid_state_machines}\citep{Maass-et-al-2002}分别独立地提出了这种想法。 +后者是类似的,只不过它使用脉冲神经元(二进制输出)而不是\glssymbol{ESN}中的连续\gls{hidden_unit}。 +\glssymbol{ESN}和\gls{liquid_state_machines}都被称为\firstgls{reservoir_computing}\citep{Lukosevicius+Jaeger-2009},因为\gls{hidden_unit}形成了可能捕获输入历史不同方面的临时特征池。 + +% -- 392 -- + +\gls{reservoir_computing}\gls{recurrent_network}类似于\gls{kernel_machines},这是思考它们的一种方式:它们将任意长度的序列(到时刻$t$的输入历史)映射为一个长度固定的向量(循环状态$\Vh^{(t)}$),之后可以施加一个线性预测算子(通常是一个\gls{linear_regression})以解决感兴趣的问题。 +训练\gls{criterion}就可以很容易地设计为输出权重的凸函数。 +例如,如果输出是从\gls{hidden_unit}到输出目标的\gls{linear_regression},训练\gls{criterion}就是\gls{mean_squared_error},由于是凸的就可以用简单的学习算法可靠地解决\citep{Jaeger-NIPS2002}。 + +因此,重要的问题是:我们如何设置输入和循环权重才能让一组丰富的历史可以在\gls{RNN}的状态中表示? +\gls{reservoir_computing}研究所给出的答案是将\gls{recurrent_network}视为动态系统,并设定让动态系统接近稳定边缘的输入和循环权重。 + +最初的想法是使状态到状态转换函数的\gls{jacobian}的特征值接近1。 +如\ref{sec:long_term_dependencies}解释,\gls{recurrent_network}的一个重要特征就是\gls{jacobian}的特征值谱$\MJ^{(t)} = \frac{\partial s^{(t)}}{\partial s^{(t-1)}}$。 +特别重要的是$\MJ^{(t)}$的\firstgls{spectral_radius},定义为特征值的最大绝对值。 + +为了解\gls{spectral_radius}的影响,可以考虑\gls{backward_propagation}中\gls{jacobian}矩阵$\MJ$不随$t$改变的简单情况。 +例如当网络是纯线性时,会发生这种情况。 +假设$\MJ$特征值$\lambda$对应的特征向量为$\Vv$。 +考虑当我们通过时间向后传播\gls{gradient}向量时会发生什么。 +如果我们刚开始有\gls{gradient}向量$\Vg$,然后经过\gls{backward_propagation}的一个步骤后,我们将有$\MJ \Vg$,在$n$步之后我们会得到$\MJ^n \Vg$。 +现在考虑如果我们向后传播扰动版本的$\Vg$会发生什么。 +如果我们刚开始是$\Vg + \delta \Vv$,一步之后,我们会得到$\MJ(\Vg + \delta \Vv)$。 +$n$步之后,我们将得到$\MJ^n(\Vg + \delta \Vv)$。 +由此我们可以看出,由$\Vg$开始的\gls{backward_propagation}和由$\Vg+\delta \Vv$开始的\gls{backward_propagation},$n$步之后偏离$\delta \MJ^n \Vv$。 +如果$\Vv$选择为$\MJ$特征值$\lambda$对应的一个单位特征向量,那么在每一步乘\gls{jacobian}只是简单地缩放。 +\gls{backward_propagation}的两次执行分离的距离为$\delta | \lambda |^n$。 +当$\Vv$对应于最大特征值$|\lambda|$,初始扰动为$\delta$时这个扰动达到可能的最宽分离。 + +当$ | \lambda | > 1$,偏差$\delta | \lambda |^n$就会指数增长。 +当$ | \lambda | < 1$,偏差就会变得指数小。 + +% -- 393 -- + +当然,这个例子假定\gls{jacobian}在每个\gls{time_step}是相同的,即对应于没有非线性\gls{recurrent_network}。 +当非线性存在时,非线性的导数将在许多\gls{time_step}后接近零,并有助于防止因过大的\gls{spectral_radius}而导致的爆炸。 +事实上,关于\gls{ESN}的最近工作提倡使用远大于1的\gls{spectral_radius}\citep{yildiz2012re,jaeger2012long}。 + +我们已经说过多次,通过反复矩阵乘法的\gls{backward_propagation}同样适用于没有非线性的正向传播的网络,其状态为$\Vh^{(t+1)} = \Vh^{(t)\top} \MW $。 + +当线性映射$\MW^\top$在$L^2$范数的测度下总是缩小$\Vh$,那么我们说这个映射是\firstgls{contractive}的。 +当\gls{spectral_radius}小于一,则从$\Vh^{(t)}$到$\Vh^{(t+1)}$的映射是\gls{contractive}的,因此小变化在每个\gls{time_step}后变得更小。 +当我们使用有限精度(如32位整数)来存储状态向量时,必然会使得网络忘掉过去的信息。 + +\gls{jacobian}矩阵告诉我们$\Vh^{(t)}$一个微小的变化如何向前传播,或等价的,$\Vh^{(t+1)}$的\gls{gradient}如何向后传播。 +需要注意的是,$\MW$和$\MJ$都不需要是对称的(尽管它们是实方阵),因此它们可能有复的特征值和特征向量,其中虚数分量对应于潜在的振荡行为(如果迭代地应用同一\gls{jacobian})。 +即使$\Vh^{(t)}$或$\Vh^{(t)}$感兴趣的小变化在\gls{backward_propagation}中是实值的,它们可以以复数基来表示。 +重要的是,当向量乘以矩阵时,这些复数基的系数幅值(复数的绝对值)会发生什么变化。 +幅值大于1的特征值对应于放大(如果反复应用则指数增长)或收缩(如果反复应用则指数减小)。 + +非线性映射情况时,\gls{jacobian}会在每一步任意变化。 +因此,动态量变得更加复杂。 +然而,一个小的初始变化多步之后仍然会变成一个大的变化。 +纯线性和非线性情况的一个不同之处在于使用压缩非线性(如$\tanh$)可以使循环动态量有界。 +注意,即使\gls{forward_propagation}动态量有界,\gls{backward_propagation}的动态量仍然可能无界,例如,当$\tanh$序列都在它们状态中间的线性部分,并且由\gls{spectral_radius}大于1的权重矩阵连接。 +然而,所有$\tanh$单元同时位于它们的线性激活点是非常罕见的。 + +% -- 394 -- + +\gls{ESN}的策略是简单地固定权重使其具有一定的\gls{spectral_radius}如3,其中信息通过时间向前传播,但会由于饱和非线性单元(如$\tanh$)的稳定作用而不会爆炸。 + +最近,已经有研究表明,用于设置\glssymbol{ESN}权重的技术可以用来\emph{初始化}完全可训练的\gls{recurrent_network}的权重(通过时间\gls{backward_propagation}来训练隐藏到隐藏的循环权重),帮助学习\gls{long_term_dependency}\citep{Sutskever-thesis2012,sutskeverimportance}。 +在这种设定下,结合\ref{sec:parameter_initialization_strategies}中稀疏初始化的方案,设置$1.2$的初始\gls{spectral_radius}表现不错。 + + +\section{\gls{leaky_unit}和其他多时间尺度的策略} +\label{sec:leaky_units_and_other_strategiesfor_multiple_time_scales} +处理\gls{long_term_dependency}的一种方法是设计工作在多个时间尺度的模型,使其某些部分在细粒度时间尺度上操作并能处理小细节,而其他部分在粗时间尺度上操作并能把遥远过去的信息更有效地传递过来。 +存在多种同时构建粗细时间尺度的策略。 +这些策略包括在时间轴增加\gls{skip_connection},``\gls{leaky_unit}''使用不同时间常数整合信号,并去除一些用于建模细粒度时间尺度的连接。 + + +\subsection{时间维度的\gls{skip_connection}} +\label{sec:adding_skip_connections_through_time} +增加从遥远过去的变量到目前变量的直接连接是得到粗时间尺度的一种方法。 +使用这样\gls{skip_connection}的想法可以追溯到\cite{Lin-ieeetnn96},紧接是向\gls{feedforward_network}引入延迟的想法\citep{Lang+Hinton88}。 +在普通的\gls{recurrent_network}中,循环从时刻$t$的单元连接到时刻$t+1$单元。 +可以构造较长的延迟\gls{recurrent_network}\citep{Bengio91z}。 + +正如我们在\ref{sec:long_term_dependencies}看到,\gls{gradient}可能\emph{关于时间步数数消失或成倍爆炸}。 +\citep{Lin-ieeetnn96}引入了$d$延时的循环连接以减轻这个问题。 +现在导数指数减小的速度与$\frac{\tau}{d}$相关而不是$\tau$。 +既然同时存在延迟和单步连接,\gls{gradient}仍可能成$t$指数爆炸。 +这允许学习算法捕获更长的依赖性,但不是所有的\gls{long_term_dependency}都能在这种方式下良好地表示。 + +% -- 395 -- + +\subsection{\gls{leaky_unit}和一系列不同时间尺度} +\label{sec:leaky_units_and_a_spectrum_of_different_time_scales} +获得导数乘积接近1的另一方式是设置\emph{线性}自连接单元,并且这些连接的权重接近1。 + +我们对某些$v$值应用更新$\mu^{(t)} \gets \alpha \mu^{(t-1)} + (1-\alpha) v^{(t)}$累积一个滑动平均值$\mu^{(t)}$,其中$\alpha$是一个从$ \mu^{(t-1)}$到$ \mu^{(t)}$线性自连接的例子。 +当$\alpha$接近1时,滑动平均值能记住过去很长一段时间的信息,而当$\alpha$接近0,关于过去的信息被迅速丢弃。 +线性自连接的\gls{hidden_unit}可以模拟滑动平均的行为。 +这种\gls{hidden_unit}称为\firstgls{leaky_unit}。 + +$d$\gls{time_step}的\gls{skip_connection}是确保单元总能被之前$d$个\gls{time_step}的值影响的一个方法。 +使用权重接近1的线性自连接是确保该单元可以访问过去值的不同方式。 +线性自连接通过调节实值$\alpha$更平滑灵活地调整这种效果,而不是调整整数值的跳跃长度。 + +这个想法由\cite{Mozer-nips92}和\cite{ElHihi+Bengio-nips8}提出。 +在\gls{ESN}中,\gls{leaky_unit}也被发现很有用\citep{JaegerLPS07}。 + +两个基本策略可以设置\gls{leaky_unit}使用的时间常数。 +一种策略是手工将其固定为常数,例如在初始化时从某些分布进行采样它们的值。 +另一种策略是使时间常数成为自由变量,并学习出来。 +在不同时间尺度使用这样的\gls{leaky_unit}似乎能帮助学习\gls{long_term_dependency}\citep{Mozer-nips92,Pascanu+al-ICML2013-small}。 + +\subsection{删除连接} +\label{sec:removing_connections} +处理\gls{long_term_dependency}另一种方法是在多个时间尺度组织\glssymbol{RNN}状态的想法\citep{ElHihi+Bengio-nips8},信息在较慢的时间尺度上更容易长距离流动。 + +这个想法与之前讨论的时间维度上的\gls{skip_connection}不同,因为它涉及主动\emph{删除}长度为一的连接并用更长的连接替换它们。 +以这种方式修改的单元被迫在长时间尺度上运作。 +通过时间\gls{skip_connection}是\emph{添加}边。 +收到这种新连接的单元,可以学习在长时间尺度上运作,但也可以选择专注于自己其他的短期连接。 + +% -- 396 -- + +强制一组循环单元在不同时间尺度上运作有不同的方式。 +一种选择是使循环单元变成\gls{leaky_unit},但不同的单元组关联不同的固定时间尺度。 +这由\cite{Mozer-nips92}提出,并被成功应用于\cite{Pascanu+al-ICML2013-small}。 +另一种选择是使显式且离散的更新发生在不同的时间,不同的单元组有不同的频率。 +这是\cite{ElHihi+Bengio-nips8}和\cite{Koutnik-et-al-ICML2014}的方法。 +它在一些基准数据集上表现不错。 + +\section{\gls{LSTM}和其他\gls{gated_rnn}} +\label{sec:the_long_short_term_memory_and_other_gated_rnns} +本文撰写之时,实际应用中最有效的序列模型称为\firstgls{gated_rnn}。 +包括基于\firstgls{LSTM}和基于\firstgls{gated_recurrent_unit}的网络。 + +像\gls{leaky_unit}一样,\gls{gated_rnn}想法也是基于生成通过时间的路径,其中导数既不消失也不发生爆炸。 +\gls{leaky_unit}通过手动选择常量的连接权重或参数化的连接权重来达到这一目的。 +\gls{gated_rnn}将其推广为在每个\gls{time_step}都可能改变的连接权重。 + +\gls{leaky_unit}允许网络在较长持续时间内\emph{积累}信息(诸如用于特定特征或类的线索)。 +然而,一旦该信息被使用,让\gls{NN}\emph{遗忘}旧的状态可能是有用的。 +例如,如果一个序列是由子序列组成,我们希望\gls{leaky_unit}能在各子序列内积累线索,我们需要将状态设置为0以忘记旧状态的的机制。 +我们希望\gls{NN}学会决定何时清除状态,而不是手动决定。 +这就是\gls{gated_rnn}要做的事。 + +\subsection{\glssymbol{LSTM}} +\label{sec:lstm} +引入自循环的巧妙构思,以产生\gls{gradient}长时间持续流动的路径是初始\firstall{LSTM}的核心贡献\citep{Hochreiter+Schmidhuber-1997}。 +其中一个关键扩展是使自循环的权重视上下文而定,而不是固定的\citep{Gers-et-al-2000}。 +门限此自循环(由另一个\gls{hidden_unit}控制)的权重,累积的时间尺度可以动态地改变。 +在这种情况下,即使是具有固定参数的\glssymbol{LSTM},累积的时间尺度也可以因输入序列而改变,因为时间常数是模型本身的输出。 +\glssymbol{LSTM}已经在许多应用中取得重大成功,如无约束手写识别\citep{Graves+Schmidhuber-2009}、语音识别\citep{Graves-et-al-ICASSP2013,Graves+Jaitly-ICML2014}、手写识别\citep{Graves-et-al-ICASSP2013}、机器翻译\citep{Sutskever-et-al-NIPS2014},为图像生成标题\citep{Kiros-et-al-arxiv2014,Vinyals-et-al-arxiv2014,Xu-et-al-ICML2015}和解析\citep{Vinyals2014}。 + +% -- 397 -- + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/lstm}} +\fi +\caption{TODO} +\label{fig:chap10_lstm} +\end{figure} + +\glssymbol{LSTM}块如图\ref{fig:chap10_lstm}所示。 +在浅\gls{recurrent_network}的架构下,相应的\gls{forward_propagation}公式如下。 +更深的架构也成功地应用于\citep{Graves-et-al-ICASSP2013,Pascanu-et-al-ICLR2014}。 +\glssymbol{LSTM}\gls{recurrent_network}除了外部\glssymbol{RNN}的循环外,还具有内部的循环(自环)的``\glssymbol{LSTM}细胞'',因此不是简单地向输入和循环单元的仿射变换之后施加一个逐元素的非线性。 +与普通的\gls{recurrent_network}类似,每个单元有相同的输入和输出,但也有更多的参数和控制信息流动的门限单元系统。 +最重要的组成部分是状态单元$s_i^{(t)}$,与前一节讨论的\gls{leaky_unit}有类似的线性自环。 +然而,此处自环的权重(或相关联的时间常数)由\firstgls{forget_gate}$f_i^{(t)}$控制(时刻$t$和细胞$i$),由\ENNAME{sigmoid}单元将权重设置为0和1之间的值: +\begin{align} + f_i^{(t)} = \sigma \Big( b_i^f + \sum_j U_{i,j}^f x_j^{(t)} + \sum_j W_{i,j}^f h_j^{(t-1)} \Big), +\end{align} +其中$\Vx^{(t)}$是当前输入向量,$\Vh^{t}$是当前隐藏层向量,$\Vh^{t}$包含所有\glssymbol{LSTM}细胞的输出。 +$\Vb^f, \MU^f, \MW^f$分别是\gls{bias_aff}、输入权重和\gls{forget_gate}的循环权重。 +因此\glssymbol{LSTM}细胞内部状态以如下方式更新,其中有一个条件的自环权重$f_i^{(t)}$: +\begin{align} + s_i^{(t)} = f_i^{(t)} s_i^{(t-1)} + g_i^{(t)} + \sigma \Big( b_i + \sum_j U_{i,j} x_j^{(t)} + \sum_j W_{i,j} h_j^{(t-1)} \Big), +\end{align} +其中$\Vb, \MU, \MW$分别是LSTM细胞中的\gls{bias_aff}、输入权重和\gls{forget_gate}的循环权重。 +\textbf{外部输入门}(external input gate)单元$g_i^{(t)}$以类似\gls{forget_gate}(使用一个\ENNAME{sigmoid}获得一个0和1之间的值)的方式更新,但有自身的参数: +\begin{align} + g_i^{(t)} = \sigma \Big( b_i^g + \sum_j U_{i,j}^g x_j^{(t)} + \sum_j W_{i,j}^g h_j^{(t-1)} \Big). +\end{align} +\glssymbol{LSTM}细胞的输出$h_i^{(t)}$也可以由\textbf{输出门}(output gate)~$q_i^{(t)}$关闭(使用\ENNAME{sigmoid}单元作为门限): +\begin{align} + h_i^{(t)} &= \text{tanh}\big( s_i^{(t)} \big) q_i^{(t)}, \\ + q_i^{(t)} &= \sigma \Big( b_i^o + \sum_j U_{i,j}^o x_j^{(t)} + \sum_j W_{i,j}^o h_j^{(t-1)} \Big), +\end{align} +其中$\Vb^o, \MU^o, \MW^o$分别是其\gls{bias_aff}、输入权重和\gls{forget_gate}的循环权重。 +在这些变体中,可以选择使用细胞状态$s_i^{(t)}$作为额外的输入(及其权重),输入到第$i$个单元的三个门,如图\ref{fig:chap10_lstm}所示。 +这将需要三个额外的参数。 + +% -- 399 -- + +\glssymbol{LSTM}网络比简单的循环架构更易于学习\gls{long_term_dependency},先是用于测试\gls{long_term_dependency}学习能力的人工数据集\citep{Bengio-trnn94,Hochreiter+Schmidhuber-1997,chapter-gradient-flow-2001},然后是在具有挑战性的序列处理任务上获得最先进的表现(\citep{Graves-book2012,Graves-arxiv2013,Sutskever-et-al-NIPS2014})。 +\glssymbol{LSTM}的变体和替代也已经被研究和使用,会在下文进行讨论。 + +\subsection{其他\gls{gated_rnn}} +\label{sec:other_gated_rnns} +\glssymbol{LSTM}架构中哪些部分是真正必须的? +还可以设计哪些其他成功架构允许网络动态地控制的时间尺度和不同单元的遗忘行为? + +最近关于\gls{gated_rnn}的工作给出了这些问题的某些答案,其单元也被称为门限循环单元或GRU\citep{cho-al-arxiv14-ssst8,Chung-et-al-NIPSDL2014-small,chung-icml15-gated,Jozefowicz-et-al-ICML2015,Chrupala-et-al-arxiv2015}。 +与\glssymbol{LSTM}的主要区别是,单个门限单元同时控制遗忘因子和更新状态单元的决定。 +更新公式如下: +\begin{align} + h_i^{(t)} = u_i^{(t-1)} h_i^{(t-1)} + (1 - u_i^{(t-1)}) \sigma + \Big( b_i + \sum_j U_{i,j} x_j^{(t)} + \sum_j W_{i,j} r_j^{(t-1)} h_j^{(t-1)} \Big), +\end{align} +其中$\Vu$代表``更新''门,$\Vr$表示``复位''门。 +它们的值就如通常所定义的: +\begin{align} + u_i^{(t)} = \sigma \Big( b_i^u + \sum_j U_{i,j}^u x_j^{(t)} + \sum_j W_{i,j}^u h_j^{(t)} \Big), +\end{align} +和 +\begin{align} + r_i^{(t)} = \sigma \Big( b_i^r + \sum_j U_{i,j}^r x_j^{(t)} + \sum_j W_{i,j}^r h_j^{(t)} \Big). +\end{align} +复位和更新门能独立地``忽略''的状态向量的一部分。 +更新门像条件渗漏累积器一样可以线性门限任意维度,从而选择将它复制(在\ENNAME{sigmoid}的一个极端)或完全由新的``目标状态''值(朝向渗漏累积器的收敛方向)替换并完全忽略它(在另一个极端)。 +复位门控制状态用于计算下一个目标状态的某部分,引入了过去状态和未来状态之间的关系附加非线性效应。 + +% -- 400 -- + +围绕这一主题可以设计更多的变种。 +例如复位门(或\gls{forget_gate})的输出可以在多个\gls{hidden_unit}间共享。 +或者,全局门的乘积(覆盖一整组的单元,例如整一层)和一个局部门(每单元)可用于结合全局控制和局部控制。 +然而,一些调查发现没有\glssymbol{LSTM}和GRU架构的变种能明显在广泛的任务中同时击败这两个\citep{Greff-et-al-arxiv2015,Jozefowicz-et-al-ICML2015}。 +\cite{Greff-et-al-arxiv2015}发现其中的关键因素是 +\gls{forget_gate},而\cite{Jozefowicz-et-al-ICML2015}发现向\glssymbol{LSTM}\gls{forget_gate}加入1的\gls{bias_aff}(由\cite{Gers-et-al-2000}提倡)能让\glssymbol{LSTM}变得与已探索的最佳变种一样健壮。 + + +\section{优化\gls{long_term_dependency}} +\label{sec:optimization_for_long_term_dependencies} +\ref{sec:long_term_dependencies}和\ref{sec:the_challenge_of_long_term_dependencies}节已经描述过在许多\gls{time_step}上优化\glssymbol{RNN}时发生的\gls{gradient}消失和爆炸的问题。 + +由\cite{Martens+Sutskever-ICML2011}提出了一个有趣的想法是,二阶导数可能在一阶导数消失的同时消失。 +二阶优化算法可以大致被理解为将一阶导数除以二阶导数(在更高维数,由\gls{gradient}乘以\gls{hessian}的逆)。 +如果二阶导数与一阶导数以类似的速率收缩,那么一阶和二阶导数的比率可保持相对恒定。 +不幸的是,二阶方法有许多缺点,包括高的计算成本、需要一个大的\gls{minibatch}、并且倾向于被吸引到鞍点。 +\cite{Martens+Sutskever-ICML2011}发现,采用二阶方法有前途的结果。 +之后,\cite{sutskeverimportance}发现使用较简单的方法可以达到类似的结果,例如细心初始化的\ENNAME{Nesterov}动量法。 +更详细的内容参考\cite{Sutskever-thesis2012}。 +应用于\glssymbol{LSTM}时,这两种方法在很大程度上被单纯的\glssymbol{SGD}(甚至没有动量)取代。 +这是\gls{ML}中一个延续的主题,设计一个易于优化模型通常比设计出更加强大的优化算法更容易。 + +% -- 401 -- + +\subsection{\gls{clipping_gradient}} +\label{sec:clipping_gradients} +如\ref{sec:cliffs_and_exploding_gradients}节讨论,强非线性函数如由许多\gls{time_step}计算的\gls{recurrent_network}往往倾向于非常大或非常小幅度的\gls{gradient}。 +如图|||c|||和图\ref{fig:chap10_cliff_clipping_color}所示,我们可以看到,\gls{objective_function}(作为参数的函数)有一个``地形''伴随一个``悬崖'':宽且相当平坦区域被\gls{objective_function}变化快的小区域隔开,形成了一种悬崖。 + +这导致的困难是,当参数\gls{gradient}非常大时,\gls{gradient}下降的参数更新可以将参数抛出很远,进入\gls{objective_function}较大的区域,到达当前解所作的努力变成了无用功。 +\gls{gradient}告诉我们,围绕当前参数的无穷小区域内最速下降的方向。 +这个无穷小区域之外,\gls{cost_function}可能开始沿曲线背面而上。 +更新必须被选择为足够小,以避免过分穿越向上的曲面。 +我们通常使用衰减速度足够慢的学习率,使连续的步骤具有大致相同的学习率。 +适合于一个相对线性的地形部分的步长经常在下一步进入地形中更加弯曲的部分时变得不适合,会导致上坡运动。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/cliff_clipping_color}} +\fi +\caption{TODO} +\label{fig:chap10_cliff_clipping_color} +\end{figure} + +% -- 402 -- + +一个简单的解决方案已被从业者使用多年:\firstgls{clipping_gradient}。 +此想法有不同实例\citep{Mikolov-thesis-2012,Pascanu+al-ICML2013-small}。 +一种选择是在参数更新之前,\emph{逐元素}地截断\gls{minibatch}产生的参数\gls{gradient}\citep{Mikolov-thesis-2012}。 +另一种是在参数更新之前\emph{截断\gls{gradient}$\Vg$的范数$\norm{ \Vg }$}\citep{Pascanu+al-ICML2013-small}: +\begin{align} + \text{if} \norm{\Vg} &> v \\ + \Vg &\gets \frac{\Vg v}{\norm{g}}, +\end{align} +其中$v$是范数上界,$\Vg$用来更新参数。 +因为所有参数(包括不同的参数组,如权重和\gls{bias_aff})的\gls{gradient}被单个缩放因子联合重整化,所以后一方法具有的优点是保证了每个步骤仍然是在\gls{gradient}方向上的,但实验表明两种形式类似。 +虽然参数更新与真实\gls{gradient}具有相同的方向\gls{gradient},经过\gls{gradient}范数截断,参数更新的向量范数现在变得有界。 +这种有界\gls{gradient}能避免执行\gls{gradient}爆炸时的有害一步。 +事实上,当\gls{gradient}大小高于阈值时,即使是采取简单的\emph{随机步骤}往往工作得几乎一样好。 +如果爆炸非常严重,\gls{gradient}数值上为Inf或Nan(无穷大或不是一个数字),则可以采取大小为$v$的随机一步,通常会离开数值不稳定的状态。 +截断每\gls{minibatch}\gls{gradient}范数不会改变单个\gls{minibatch}的\gls{gradient}方向。 +然而,许多\gls{minibatch}使用范数截断\gls{gradient}后的平均值不等同于截断真实\gls{gradient}(使用所有的实例所形成的\gls{gradient})的范数。 +大导数范数的样本,和像这样的出现在同一\gls{minibatch}的样本,其对最终方向的贡献将消失。 +不像传统\gls{minibatch}\gls{gradient}下降,其中真实\gls{gradient}的方向是等于所有\gls{minibatch}\gls{gradient}的平均。 +换句话说,传统的\gls{SGD}使用\gls{gradient}的无偏估计,而与使用范数截断的\gls{gradient}下降引入了经验上是有用的启发式\gls{bias_aff}。 +通过逐元素截断,更新的方向与真实\gls{gradient}或\gls{minibatch}的\gls{gradient}不再对齐,但是它仍然是一个下降方向。 +还有提出\citep{Graves-arxiv2013}(相对于隐藏单元)截断\gls{backward_propagation}\gls{gradient},但与这些变种之间没有发布比较; 我们推测,所有这些方法表现类似。 + +% -- 403 -- + +\subsection{引导信息流的正则化} +\label{sec:regularizing_to_encourage_information_flow} +\gls{gradient_clipping}有助于处理爆炸的\gls{gradient},但它无助于消失的\gls{gradient}。 +为了解决消失的\gls{gradient}和更好地捕获\gls{long_term_dependency},我们讨论了在展开循环架构的\gls{computational_graph},沿着与弧度相关联的\gls{gradient}乘积接近1的部分创建路径的想法。 +在上节\ref{sec:the_long_short_term_memory_and_other_gated_rnns}节中已经讨论过,实现这一点的一种方法是使用\glssymbol{LSTM}以及其他自循环和门限机制。 +另一个想法是\gls{regularization}或约束参数,以引导``信息流''。 +特别是,我们希望\gls{gradient}向量$\nabla_{\Vh^{(t)}} L$在\gls{backward_propagation}时能维持其幅度,即使\gls{loss_function}只对序列未部的输出作惩罚。 +形式的,我们要使 +\begin{align} + (\nabla_{\Vh^{(t)}} L) \frac{\partial \Vh^{(t)}}{\partial \Vh^{(t-1)}} +\end{align} +与 +\begin{align} +\nabla_{\Vh^{(t)}} L +\end{align} +一样大。 +在这个目标下,\citep{Pascanu+al-ICML2013-small}提出以下正则项: +\begin{align} + \Omega = \sum_t \Bigg( \frac{ + \norm{ (\nabla_{\Vh^{(t)}} L) \frac{\partial \Vh^{(t)}}{\partial \Vh^{(t-1)}}}} + {\norm{\nabla_{\Vh^{(t)}} L}} -1 \Bigg)^2. +\end{align} +计算这一\gls{gradient}的正则项可能会出现困难,但\citep{Pascanu+al-ICML2013-small}提出可以将后向传播向量$\nabla_{\Vh^{(t)}} L$考虑为近乎恒定的近似(为了计算正则化的目的,没有必要通过它们向后传播)。 +使用该正则项的实验表明,如果与标准的启发式截断(处理梯度爆炸)相结合,该正则项可以显著地增加\glssymbol{RNN}可以学习的依赖的跨度。 +\gls{gradient_clipping}特别重要,因为它保持了爆炸\gls{gradient}边缘的\glssymbol{RNN}动态。 +如果没有\gls{gradient_clipping},\gls{gradient}爆炸将阻碍成功学习。 + +这种方法的一个主要弱点是,在处理数据冗余的任务时如语言模型时,它并不像\glssymbol{LSTM}一样有效。 + +% -- 404 -- + +\section{外显记忆} +\label{sec:explicit_memory} +智能需要知识并且可以通过学习获取知识,这已促使大型深度架构的发展。 +然而,存在不同种类的知识。 +有些知识是隐含的、潜意识的并且难以用语言表达——比如怎么行走或狗与猫的样子有什么不同。 +其他知识可以是明确的、可陈述的以及可以相对简单地使用词语表达——每天常识性的知识,如``猫是一种动物'',或者需要知道的实现自己目前目标非常具体的事实,如``与销售团队会议在141室于下午3:00开始``。 + + +\gls{NN}擅长存储隐性知识,但是他们很难记住事实。 +被存储在\gls{NN}参数中之前,\gls{SGD}需要多次提供相同的输入,即使如此,该输入也不会被特别精确地存储。 +\citep{Graves-et-al-arxiv2014}推测这是因为\gls{NN}缺乏\textbf{工作存储}(working memory)系统,即类似人类为实现一些目标而明确保存和操作相关信息片段的系统。 +这种外显记忆组件将使我们的系统不仅能够快速``故意''地存储和检索具体的事实,也能利用他们循序推论。 +\gls{NN}处理序列信息的需要,改变了每个步骤向网络注入输入的方式,长期以来推理能力被认为是重要的,而不是对输入做出自动的、直观的反应\citep{hinton1990mapping} 。 + + +为了解决这一难题,\citep{Weston2014}引入了\firstgls{memory_network},其中包括一组可以通过寻址机制来访问的记忆单元。 +\gls{memory_network}原本需要监督信号指示他们如何使用自己的记忆单元。 +\citep{Graves-et-al-arxiv2014}引入的\firstgls{NTM},不需要明确的监督指示采取哪些行动而能学习从记忆单元读写任意内容,并通过使用基于内容的软注意机制(见\citep{Bahdanau-et-al-ICLR2015-small}和\ref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}节),允许端到端的训练。 +这种软寻址机制已成为其他允许基于\gls{gradient}优化的模拟算法机制的相关架构的标准\citep{Sukhbaatar2015,Joulin+Mikolov-2015,Kumar-et-al-2015,Vinyals2015,Grefenstette-et-al-NIPS2015}。 + +每个记忆单元可以被认为是\glssymbol{LSTM}和GRU中记忆单元的扩展。 +不同的是,网络输出一个内部状态来选择从哪个单元读取或写入,正如数字计算机读或写入到特定地址的内存访问。 + +% -- 405 -- + +产生确切整数地址的函数很难优化。 +为了缓解这一问题,\glssymbol{NTM}实际同时从多个记忆单元写入或读取。 +读取时,它们采取许多单元的加权平均值。 +写入时,他们对多个单元修改不同的数值。 +用于这些操作的系数被选择为集中在一个小数目的单元,如通过\ENNAME{softmax}函数产生它们。 +使用这些具有非零导数的权重允许函数控制访问存储器,从而能使用梯度下降法优化。 +关于这些系数的\gls{gradient}指示着其中每个参数是应该增加还是减少,但\gls{gradient}通常只在接收大系数的存储器地址上变大。 + +这些记忆单元通常扩充为包含向量,而不是由\glssymbol{LSTM}或GRU存储单元所存储的单个标量。 +增加记忆单元大小的原因有两个。 +原因之一是,我们已经增加了访问记忆单元的成本。 +我们为产生用于许多单元的系数付出计算成本,但我们预期这些系数聚集在周围小数目的单元。 +通过读取向量值,而不是一个标量,我们可以抵消部分成本。 +使用向量值的记忆单元的另一个原因是,它们允许\textbf{基于内容的寻址}(content-based addressing),其中从一个单元读或写的权重是该单元的函数。 +如果我们能够生产符合某些但并非所有元素的模式,向量值单元允许我们检索一个完整向量值的记忆。 +这类似于人们能够通过几个歌词回忆起一首歌曲的方式。 +我们可以认为基于内容的读取指令是说,``检索一首副歌歌词中带有'我们都住在黄色潜水艇'的歌''。 +当我们要检索的对象很大时,基于内容的寻址更为有用——如果歌曲的每一个字母被存储在单独的记忆单元中,我们将无法通过这种方式找到他们。 +通过比较,\textbf{基于位置的寻址}(location-based addressing)不允许引用存储器的内容。 +我们可以认为基于位置的读取指令是说``检索347档的歌的歌词''。 +即使当存储单元是很小时,基于位置的寻址通常是完全合理的机制。 + +如果一个存储单元的内容在大多数\gls{time_step}上会被复制(不被忘记),则它包含的信息可以在时间上向前传播,随时间向后传播的\gls{gradient}也不会消失或爆炸。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter10/figures/memory_network}} +\fi +\caption{TODO} +\label{fig:chap10_memory_network} +\end{figure} + +外显记忆的方法在图\ref{fig:chap10_memory_network}说明,其中我们看到一个与存储器耦接的``任务神经网络''。 +虽然这一任务神经网络可以是前馈或循环的,但整个系统是一个\gls{recurrent_network}。 +任务网络可以选择读取或写入的特定内存地址。 +外显记忆似乎允许模型学习普通\glssymbol{RNN}或\glssymbol{LSTM} \glssymbol{RNN}不能学习的任务。 +这种优点的一个原因可能是因为信息和\gls{gradient}可以在非常长的持续时间内传播(分别在时间上向前或向后)。 + +% -- 406 -- + +作为存储器单元的加权平均值\gls{backward_propagation}的替代,我们可以将存储器寻址系数解释为概率,并随机从一个单元读取\citep{Zaremba+Sutskever-arxiv2015}。 +优化离散决策的模型需要专门的优化算法,在\ref{sec:back_propagating_through_discrete_stochastic_operations}中描述。 +目前为止,训练这些做离散决策的随机架构,仍比训练进行软判决的确定性算法更难。 + +无论是软(允许\gls{backward_propagation})或随机硬性的,用于选择一个地址的机制与先前在机器翻译的背景下引入的\gls{attention_mechanism}形式相同\citep{Bahdanau-et-al-ICLR2015-small},这在\ref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}中也有讨论。 +甚至更早之前,\gls{attention_mechanism}的想法就被引入了\gls{NN},在手写生成的情况下\citep{Graves-arxiv2013},有一个被约束为通过序列只向前移动的\gls{attention_mechanism}。 +在机器翻译和\gls{memory_network}的情况下,每个步骤中关注的焦点可以移动到一个完全不同的地方(相比之前的步骤)。 + +\gls{RNN}提供了将\gls{DL}扩展到序列数据的一种方法。 +他们是我们的\gls{DL}工具箱中最后一个主要的工具。 +现在我们的讨论将转移到如何选择和使用这些工具,以及如何将它们应用到真实世界的任务。 diff --git a/Chapter14/autoencoders.tex b/Chapter14/autoencoders.tex new file mode 100644 index 0000000..f9f755e --- /dev/null +++ b/Chapter14/autoencoders.tex @@ -0,0 +1,660 @@ +% Translator: Shenjian Zhao +\chapter{\gls{AE}} +\label{chap:autoencoders} +\firstgls{AE}是\gls{NN}的一种,经过训练后能尝试将输入复制到输出。 +\firstgls{AE}内部有一个隐含层$\Vh$,可以产生\firstgls{code}来表示输入。 +该网络可以看作由两部分组成:一个\gls{encoder}函数$ \Vh = f(\Vx)$和一个生成\gls{reconstruction}的\gls{decoder}$\Vr=g(\Vh)$。 +图\ref{fig:chap14_autoencoder}展示了这种架构。 +如果一个\gls{AE}学会简单地设置$g(f(\Vx)) =\Vx$,那么这个\gls{AE}不会很有用。 +相反,\gls{AE}应该被设计成不能学会完美地复制。 +这通常需要强加一些约束,使\gls{AE}只能近似地复制,并只能复制类似训练数据的输入。 +这些约束强制模型划定输入数据不同方面的主次顺序,因此它往往能学习到数据的有用特性。 + + +现代\gls{AE}将\gls{encoder}和\gls{decoder}的思想推广,将其中的确定函数推广为随机映射$p_{\text{encoder}} (\Vh | \Vx)$和$p_{\text{decoder}}(\Vx | \Vh)$。 + + +数十年间,\gls{AE}的想法一直是\gls{NN}历史景象的一部分~\citep{Lecun-these87,Bourlard88,hinton1994amd-small}。 +传统上,\gls{AE}被用于\gls{dimensionality_reduction}或特征学习。 +近年来,\gls{AE}与隐变量模型理论的联系将\gls{AE}带到了生成建模的前沿,我们将在\ref{chap:generative_models}章看到更多细节。 +\gls{AE}可以被看作是\gls{feedforward_network}的一种特殊情况,并且可以使用完全相同的技术进行训练,通常使用\gls{minibatch}\gls{GD}法(基于\gls{back_propagation}计算的梯度)。 +不像一般的\gls{feedforward_network},\gls{AE}也可以使用\firstgls{recirculation}训练\citep{Hinton+McClelland-NIPS1987},这是一种基于比较原始输入和\gls{reconstruction}输入激活的学习算法。 +相比\gls{back_propagation}算法,\gls{recirculation}算法从生物学上看似更有道理,但很少用于\gls{ML}。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/autoencoder}} +\fi +\caption{TODO} +\label{fig:chap14_autoencoder} +\end{figure} + +% -- 493 -- + +\section{\gls{undercomplete}\gls{AE}} +\label{sec:undercomplete_autoencoders} +将输入复制到输出听起来没什么用,但我们通常不关心\gls{decoder}的输出。 +相反,我们希望通过训练\gls{AE}对输入进行复制的任务使$\Vh$获得有用的特性。 + + +从\gls{AE}获得有用特征的一种方法是限制$\Vh$的维度比$\Vx$小,这种\gls{code}维度小于输入维度的\gls{AE}称为\firstgls{undercomplete}\gls{AE}。 +学习\gls{undercomplete}的\gls{representation}将强制\gls{AE}捕捉训练数据中最显著的特征。 + + +学习过程可以简单地描述为最小化一个\gls{loss_function} +\begin{align} +L(\Vx, g(f(\Vx)), +\end{align} +其中$L$是一个\gls{loss_function},衡量$g(f(\Vx))$与$\Vx$的不相似性,如\gls{mean_squared_error}。 + + +当\gls{decoder}是线性的且$L$是\gls{mean_squared_error},\gls{undercomplete}的\gls{AE}会学习出与\glssymbol{PCA}相同生成子空间。 +在这种情况下,\gls{AE}学到了训练数据的主元子空间(执行复制任务的副效用)。 + + +因此拥有非线性编码函数$f$和非线性\gls{decoder}函数$g$的\gls{AE}能够学习出更强大的\glssymbol{PCA}非线性推广。 +不幸的是,如果\gls{encoder}和\gls{decoder}被赋予太大的\gls{capacity},\gls{AE}会执行复制任务而捕捉不到有关数据分布的有用信息。 +从理论上说,我们可以想象只有一维\gls{code}的\gls{AE},但具有一个非常强大的非线性\gls{encoder},能够将每个训练数据$\Vx^{(i)}$表示为\gls{code}$~i$。 +\gls{decoder}可以学习将这些整数索引映射回特定训练样本的值。 +这种特定情形不会在实践中发生,但它清楚地说明,如果\gls{AE}的\gls{capacity}太大,那训练来执行复制任务的\gls{AE}可能无法学习到数据集的任何有用信息。 + +% -- 494 -- + +\section{正则\gls{AE}} +\label{sec:regularized_autoencoders} +\gls{code}维数小于输入维数的\gls{undercomplete}\gls{AE}可以学习数据分布最显著的特征。 +我们已经看到,如果这类\gls{AE}被赋予过大的\gls{capacity},它就不能学到任何有用的信息。 + + +如果隐藏层\gls{code}的维数允许与输入相等,或隐藏层\gls{code}维数大于输入的\firstgls{overcomplete}情况下,会发生类似的问题。 +在这些情况下,即使是线性\gls{encoder}和线性\gls{decoder}也可以学会将输入复制到输出,而学不到任何有关数据分布的有用信息。 + + +理想情况下,根据要建模的数据分布的复杂性,选择合适的\gls{code}维数和\gls{encoder}、\gls{decoder} +\gls{capacity},就可以成功训练任意架构的\gls{AE}。 +正则\gls{AE}提供这样做的可能。 +正则\gls{AE}使用的\gls{loss_function}可以鼓励模型学习其它特性(除了将输入复制到输出),而不用限制使用浅层的\gls{encoder}和\gls{decoder}以及小的\gls{code}维数来限制模型的\gls{capacity}。 +这些特性包括\gls{sparse}\gls{representation}、\gls{representation}的小导数、以及对噪声或输入缺失的鲁棒性。 +即使模型\gls{capacity}大到足够学习一个简单的复制功能,非线性且\gls{overcomplete}的正则\gls{AE}仍然能学到一些与数据分布相关的有用信息。 + + +除了这里所描述的方法(\gls{regularization}\gls{AE}最自然的解释),几乎任何带有隐变量并配有一个\gls{inference}过程(计算给定输入的隐含表示)的\gls{generative_model},都可以看作是\gls{AE}的一种特殊形式。 +强调与\gls{AE}联系的两个生成建模方法是\gls{helmholtz_machine}~\citep{Hinton95}的衍生模型,如\gls{VAE}(\ref{sec:variational_autoencoders}节)和\gls{GSN}(\ref{sec:generative_stochastic_networks}节)。 +这些模型能自然地学习大\gls{capacity}、对输入\gls{overcomplete}的有用编码,而不需要\gls{regularization}。 +这些\gls{code}显然是有用的,因为这些模型被训练为近似训练数据的最大概率而不是将输入复制到输出。 + +% -- 495 -- + +\subsection{\gls{sparse}\gls{AE}} +\label{sec:sparse_autoencoders} +\gls{sparse}\gls{AE}简单地在训练时结合\gls{code}层的\gls{sparse}惩罚$\Omega(\Vh)$和\gls{reconstruction_error}: +\begin{align} +L(\Vx, g(f(\Vx)) + \Omega(\Vh), +\end{align} +其中$g(\Vh)$是\gls{decoder}的输出,通常$\Vh$是\gls{encoder}的输出,即$\Vh = f(\Vx)$。 + + +\gls{sparse}\gls{AE}通常用于学习特征,以便用于其他任务如分类。 +\gls{sparse}\gls{regularization}的\gls{AE}必须反映训练数据集的独特统计特征,而不是简单地充当恒等函数。 +以这种方式训练,执行附带\gls{sparse}罚的复制任务可以得到能学习有用特征的模型。 + + +我们可以简单地将惩罚项$\Omega(\Vh)$视为加到\gls{feedforward_network}的正则项,这个\gls{feedforward_network}的主要任务是将输入复制到输出(\gls{unsupervised_learning}的目标),并尽可能地根据这些\gls{sparse}特征执行一些\gls{supervised_learning}任务(根据\gls{supervised_learning}的目标)。 +不像其它正则项如\gls{weight_decay},这个\gls{regularization}没有直观的贝叶斯解释。 +如\ref{sec:maximum_a_posteriori_map_estimation}节描述,\gls{weight_decay}和其他正则惩罚可以被解释为一个\glssymbol{MAP}近似贝叶斯\gls{inference},\gls{regularization}的惩罚对应于模型参数的先验概率分布。 +这种观点认为,\gls{regularization}的最大似然对应最大化$p(\Vtheta | \Vx)$, 相当于最大化$\log p(\Vx ~|~ \Vtheta) + \log p(\Vtheta)$。 $\log p(\Vx | \Vtheta)$即通常的数据似然项,参数的对数先验项$\log p(\Vtheta)$则包含了对$\Vtheta$特定值的偏好。 +这种观点在\ref{sec:bayesian_statistics}节有所描述。 +正则\gls{AE}不适用这样的解释是因为正则项取决于数据,因此根据定义上(从文字的正式意义)来说,它不是一个先验。 +我们仍可以认为这些正则项隐式地表达了对函数的偏好。 + +% -- 496 -- + +我们可以认为整个\gls{sparse}\gls{AE}框架是对带有隐变量的\gls{generative_model}的近似最大似然训练,而不将\gls{sparse}惩罚视为复制任务的\gls{regularization}。 +假如我们有一个带有可见变量$\Vx$和隐变量$\Vh$的模型,且具有明确的联合分布$p_{\text{model}}(\Vx,\Vh)=p_{\text{model}}(\Vh)p_{\text{model}} (\Vx ~|~ \Vh)$。 +我们将$p_{\text{model}}(\Vh)$视为模型关于隐变量的先验分布,表示模型看到$\Vx$的信念先验。 +这与我们之前使用``先验''的方式不同,之前指分布$p(\Vtheta)$在我们看到数据前就对模型参数的先验进行编码。 +对数似然函数可分解为 +\begin{align} +\log p_{\text{model}}(\Vx)=\log \sum_{\Vh} p_{\text{model}}(\Vh, \Vx) . +\end{align} +我们可以认为\gls{AE}使用一个高似然值$\Vh$的点估计来近似这个总和。 +这类似于\gls{sparse_coding}\gls{generative_model}(\ref{sec:sparse_coding}节),但$\Vh$是参数\gls{encoder}的输出,而不是从优化结果推断出的最可能的$\Vh$。 +从这个角度看,我们根据这个选择的$\Vh$,最大化如下 +\begin{align} +\log p_{\text{model}}(\Vh, \Vx)=\log p_{\text{model}}(\Vh) + \log p_{\text{model}}(\Vx ~|~ \Vh) . +\end{align} +$\log p_{\text{model}}(\Vh) $ 项能被\gls{sparse}诱导。 +如\ENNAME{Laplace}先验, +\begin{align} +p_{\text{model}}(h_i) = \frac{\lambda}{2} e^{-\lambda | h_i |}, +\end{align} +对应于绝对值\gls{sparse}惩罚。 +将对数先验表示为绝对值惩罚,我们得到 +\begin{align} +\Omega(\Vh) &= \lambda \sum_{i} | h_i |,\\ +-\log p_{\text{model}}(\Vh) &= +\sum_i (\lambda | h_i | - \log \frac{\lambda}{2}) = \Omega(\Vh) + \text{const}, +\end{align} +这里的常数项只跟$\lambda$有关。 +通常我们将$\lambda$视为超参数,因此可以丢弃不影响参数学习的常数项。 +其它如\ENNAME{Student-t}先验也能诱导\gls{sparse}性。 +从\gls{sparse}性导致$p_{\text{model}}(\Vh)$学习成近似最大似然的结果看,\gls{sparse}惩罚完全不是一个正则项。 +这仅仅影响模型关于隐变量的分布。 +这个观点提供了训练\gls{AE}的另一个动机:这是近似训练\gls{generative_model}的一种途径。 +这也给出了为什么\gls{AE}学到的特征是有用的另一个解释:它们描述的隐变量可以解释输入。 + +% -- 497 -- + +\gls{sparse}\gls{AE}的早期工作~\citep{ranzato-07-small,ranzato-08-small}探讨了各种形式的\gls{sparse}性,并提出了\gls{sparse}惩罚和$\log Z$项(将最大似然应用到无向概率模型$p(\Vx)=\frac{1}{Z}\tilde{p}(\Vx)$时产生)之间的联系。 +这个想法是最小化$\log Z$防止概率模型处处具有高概率,同理强制\gls{sparse}可以防止\gls{AE}处处具有低的\gls{reconstruction_error} 。 +这种情况下,这种联系是对通用机制的直观理解而不是数学上的对应。 +在数学上更容易解释\gls{sparse}惩罚对应于有向模型$p_{\text{model}}(\Vh)p_{\text{model}}(\Vx ~|~ \Vh) $中的$\log p_{\text{model}}(\Vh)$。 + + +\citet{Glorot+al-ICML-2011-small}提出了一种在\gls{sparse}(和\gls{denoising})\gls{AE}的$\Vh$中实现\emph{真正为零}的方式。 +该想法是使用\gls{ReLU}来产生\gls{code}层。 +基于将\gls{representation}真正推向零(如绝对值惩罚)的先验,可以间接控制\gls{representation}中零的平均数量。 + + + +\subsection{\gls{DAE}} +\label{sec:sub_denoising_autoencoders} +除了向\gls{cost_function}增加一个惩罚项,我们也可以改变\gls{reconstruction_error}项得到一个能学到有用信息的\gls{AE}。 + + +传统的\gls{AE}最小化以下目标 +\begin{align} +L(\Vx, g(f(\Vx)), +\end{align} +其中$L$是一个\gls{loss_function},衡量$g(f(\Vx))$与$\Vx$的不相似性,如它们不相似度的$L^2$范数。 +如果模型被赋予足够的\gls{capacity},$L$仅仅鼓励$g \circ f$学成一个恒等函数。 + + +相反,\firstall{DAE}最小化 +\begin{align} +L(\Vx, g(f(\tilde \Vx)), +\end{align} +其中 $\tilde \Vx$是被某种噪声损坏的$\Vx$的副本。 +因此\gls{DAE}必须撤消这些损坏,而不是简单地复制输入。 + +\citet{Alain+Bengio-ICLR2013-small}和\citet{Bengio-et-al-NIPS2013-small}指出\gls{denoising}训练过程强制$f$和$g$隐式地学习$p_{\text{data}} (\Vx)$的结构。 +因此\gls{DAE}也是一个通过最小化\gls{reconstruction_error}来获取有用特性的例子。 +这也是将\gls{overcomplete}、高\gls{capacity}的模型用作\gls{AE}的一个例子——只要小心防止这些模型仅仅学习一个恒等函数。 +\gls{DAE}将在\ref{sec:denoising_autoencoders}节给出更多细节。 + +% -- 498 -- + +\subsection{惩罚导数作为正则} +\label{sec:regularizing_by_penalizing_derivatives} +另一正则化\gls{AE}的策略是使用一个类似\gls{sparse}\gls{AE}中的惩罚项$\Omega$, +\begin{align} +L(\Vx, g(f(\Vx)) + \Omega(\Vh, \Vx), +\end{align} +但$\Omega$的形式不同: +\begin{align} +\Omega(\Vh, \Vx) = \lambda \sum_i \| \nabla_{\Vx}h_i \|^2. +\end{align} + + +这迫使模型学习一个在$\Vx$变化小时目标也没有太大变化的函数。 +因为这个惩罚只对训练数据适用,它迫使\gls{AE}学习可以反映训练数据分布信息的特征。 + + +这样\gls{regularization}的\gls{AE}被称为\firstall{CAE}。 +这种方法与\gls{DAE}、\gls{manifold_learning}和概率模型存在一定理论联系。 +\gls{CAE}在\ref{sec:contractive_autoencoders}节有更详细的描述。 + + +\section{表示能力、层的大小和深度} +\label{sec:representational_power_layer_size_and_depth} +\gls{AE}通常只有单层的\gls{encoder}和\gls{decoder},但这不是必然的。 +实际上深度\gls{encoder}和\gls{decoder}能提供更多优势。 + + +回忆\ref{sec:universal_approximation_properties_and_depth}节,其中提到加深\gls{feedforward_network}有很多优势。 +这些优势也同样适用于\gls{AE},因为它也属于\gls{feedforward_network}。 +此外,\gls{encoder}和\gls{decoder}自身都是一个\gls{feedforward_network},因此这两个部分也能各自从深度中获得好处。 + + +普遍逼近定理保证至少有一层隐含层且\gls{hidden_unit}足够多的\gls{feedforward_neural_network}能以任意精度近似任意函数(在很大范围里),这是非平凡深度的一个主要优点。 +这意味着单层隐藏层的\gls{AE}在数据范围能表示任意接近数据的恒等函数。 +但是,从输入到\gls{code}的映射是浅层的。 +这意味这我们不能任意添加约束,比如约束\gls{code}\gls{sparse}。 +\gls{encoder}至少包含一层额外隐藏层的深度\gls{AE}能够在给定足够多\gls{hidden_unit}的情况,以任意精度近似任何从输入到\gls{code}的映射。 + +% -- 499 -- + +深度可以指数减少表示某些函数的计算成本。 +深度也能指数减少学习一些函数所需的训练数据量。 +可以参考\ref{sec:universal_approximation_properties_and_depth}节巩固深度在\gls{feedforward_network}中的优势。 + + +实验中,深度\gls{AE}能比相应的浅层或线性\gls{AE}产生更好的压缩效率\citep{Hinton-Science2006}。 + +训练深度\gls{AE}的普遍的策略是训练一堆浅层的\gls{AE}来贪心地预训练相应的深度架构。 +所以我们经常会遇到浅层\gls{AE},即使最终目标是训练深度\gls{AE}。 + + +\section{随机\gls{encoder}和\gls{decoder}} +\label{sec:stochastic_encoders_and_decoders} +\gls{AE}仅仅是一个\gls{feedforward_network},可以使用与传统的\gls{feedforward_network}同样的\gls{loss_function}和输出单元。 + + +如\ref{sec:other_output_types}节中描述,设计\gls{feedforward_network}的输出单元和\gls{loss_function}普遍策略是定义一个输出分布$p(\Vy ~|~ \Vx) $并最小化负的对数似然$-\log p(\Vy ~|~ \Vx)$。 +在这种情况下,$\Vy$是关于目标的向量(如类标)。 + + +在\gls{AE}中,$\Vx$既是输入也是目标。 +然而,我们仍然可以使用与之前相同的架构。 +给定一个隐藏层\gls{code}$\Vh$,我们可以认为\gls{decoder}提供了一个条件分布$p_{\text{model}}(\Vx ~|~ \Vh)$. +接着我们根据最小化$-\log p_{\text{decoder}}(\Vx ~|~ \Vh)$来训练\gls{AE}。 +\gls{loss_function}的具体形式视$p_{\text{decoder}}$的形式而定。 +就传统的\gls{feedforward_network}来说,我们通常使用线性输出单元来参数化高斯分布的均值(如果$\Vx$是实的)。 +在这种情况下,负对数似然就对应\gls{mean_squared_error}\gls{criterion}。 +类似地,二值$\Vx$对应参数由\ENNAME{sigmoid}单元确定的\gls{bernoulli_distribution},离散的$\Vx$对应\ENNAME{softmax}分布等等。 +为了便于计算概率分布,通常认为输出变量与给定$\Vh$是条件独立的,但一些技术(如混合密度输出)可以解决输出相关的建模。 + +% -- 500 -- + +为了更彻底地区别之前看到的\gls{feedforward_network},我们也可以将\textbf{编码函数}(encoding function)~$f(\Vx)$的概念推广为\textbf{编码分布}(encoding distribution)~$ p_{\text{encoder}}(\Vh | \Vx)$, 如图\ref{fig:chap14_stochastic-autoencoder}中所示。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/stochastic-autoencoder}} +\fi +\caption{TODO} +\label{fig:chap14_stochastic-autoencoder} +\end{figure} + +任何隐变量模型$p_{\text{model}}(\Vh, \Vx)$定义了一个随机\gls{encoder} +\begin{align} +p_{\text{encoder}}(\Vh ~|~ \Vx) = p_{\text{model}}(\Vh~|~\Vx) +\end{align} +以及一个随机\gls{decoder} +\begin{align} +p_{\text{decoder}}(\Vx ~|~ \Vh) = p_{\text{model}}(\Vx~|~\Vh). +\end{align} +一般情况下,\gls{encoder}和\gls{decoder}的分布没有必要与一个唯一的联合分布$p_{\text{model}}(\Vx, \Vh)$的条件分布相容。 +\citet{Alain-et-al-arxiv2015}指出将\gls{encoder}和\gls{decoder}作为\gls{DAE}来训练能使它们渐近地相容(有足够的\gls{capacity}和样本)。 + + + +\section{\gls{DAE}} +\label{sec:denoising_autoencoders} +\firstall{DAE}是一类接受损坏数据作为输入,并训练来预测原始未被损坏数据作为输出的\gls{AE}。 + +% -- 501 -- + +\glssymbol{DAE}的训练过程如图\ref{fig:chap14_DAE}中所示。 +我们引入一个损坏过程$C(\tilde{\RVx} ~|~ \RVx)$,这个条件分布代表给定数据样本$\RVx$产生损坏样本$\tilde \RVx$的概率。 +\gls{AE}则根据以下过程,从训练数据对$(\Vx, \tilde \Vx)$中学习\textbf{重构分布}(reconstruction distribution)~$p_{\text{reconstruct}} (\RVx ~|~ \tilde \RVx)$: +\begin{enumerate} +\item 从训练数据中采一个训练样本$\Vx$。 +\item 从$C(\tilde{\RVx} ~|~ \RVx=\Vx)$采一个损坏样本$\tilde \Vx$。 +\item 将$(\Vx, \tilde \Vx)$作为训练样本来估计\gls{AE}的\gls{reconstruction}分布 +$p_{\text{reconstruct}} (\Vx ~|~ \tilde \Vx) = p_{\text{decoder}}(\Vx ~|~\Vh)$,其中$\Vh$是\gls{encoder}$f(\tilde \Vx)$的输出,$p_{\text{decoder}}$根据解码函数$g(\Vh)$定义。 +\end{enumerate} +通常我们可以简单地对负对数似然$-\log p_{\text{decoder}} (\Vx | \Vh)$进行基于梯度法(如\gls{minibatch}\gls{GD})的近似最小化。 +只要\gls{encoder}是确定性的,\gls{DAE}就是一个\gls{feedforward_network},并且可以使用与其他\gls{feedforward_network}完全相同的方式进行训练。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/DAE}} +\fi +\caption{TODO} +\label{fig:chap14_DAE} +\end{figure} + +因此我们可以认为\glssymbol{DAE}是在以下期望下进行\gls{SGD}: +\begin{align} + - \SetE_{\RVx \sim \hat{p}_{\text{data}}(\RVx)} \SetE_{\tilde{\RVx} \sim C(\tilde{\RVx}\mid\Vx)} \log p_{\text{decoder}}(\Vx \mid \Vh = f(\tilde{\Vx})), +\end{align} +其中$\hat{p}_{\text{data}}(\Vx)$是训练数据的分布。 + +% -- 502 -- + +\subsection{\gls{score}估计} +\label{sec:estimating_the_score} +\gls{score_matching}\citep{Hyvarinen-2005}是最大似然的代替。 +它提供了概率分布的一致估计,鼓励模型在各个数据点$\Vx$上获得与数据分布相同的\firstgls{score}。 +在这种情况下,\gls{score}是一个特定的梯度场: +\begin{align} + \nabla_{\Vx} \log p(\Vx) . +\end{align} + +将在\ref{sec:score_matching_and_ratio_matching}中更详细的讨论\gls{score_matching}。 +对于现在讨论的\gls{AE},理解学习$\log p_{\text{data}}$的梯度场是学习$p_{\text{data}}$结构的一种方式就足够了。 + + +\glssymbol{DAE}的训练\gls{criterion})(条件高斯$p(\Vx \mid \Vh)$)能让\gls{AE}学到能估计数据分布得分的向量场$(g(f(\Vx))-\Vx)$ ,这是\glssymbol{DAE}的一个重要特性。 +具体如图\ref{fig:chap14_denoising_task}所示。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/denoising_task}} +\fi +\caption{TODO} +\label{fig:chap14_denoising_task} +\end{figure} + +\gls{denoising}地训练一类采用高斯噪声和\gls{mean_squared_error}作为\gls{reconstruction_error}的特定\gls{DAE}(sigmoid\gls{hidden_unit}, 线性\gls{reconstruction}单元),与训练一类特定的被称为\glssymbol{RBM}的无向概率模型是等价的\citep{Vincent-NC-2011-small}。 +这类模型将在\ref{sec:gaussian_bernoulli_rbms}给出更详细的介绍;对于现在的讨论,我们只需知道这个模型能显式的给出$p_{\text{model}}(\Vx; \Vtheta)$。 +当\glssymbol{RBM}使用\firstgls{denoising_score_matching}~\citep{Kingma+LeCun-2010-small}训练时,它的学习算法与训练对应的\gls{DAE}是等价的。 +在一个确定的噪声水平下,\gls{regularization}的\gls{score_matching}不是一致估计量;相反它会恢复分布的一个模糊版本。 +然而,当噪声水平趋向于0且训练样本数趋向与无穷时,一致性就会恢复。 +将会在\ref{sec:denoising_score_matching}更详细地讨论\gls{denoising_score_matching}。 + + +\gls{AE}和\glssymbol{RBM}还存在其它联系。 +\gls{score_matching}应用于\glssymbol{RBM}后,其\gls{cost_function}将等价于\gls{reconstruction_error}结合类似\glssymbol{CAE}惩罚的正则项 \citep{Swersky-ICML2011}。 +\citet{Bengio+Delalleau-2009}指出\gls{AE}的\gls{gradient}是对\glssymbol{RBM}\gls{contrastive_divergence}训练的近似。 + + +对于连续的$\Vx$,高斯损坏和\gls{reconstruction}分布的\gls{denoising}\gls{criterion}得到的\gls{score}估计适用于一般\gls{encoder}和\gls{decoder}的参数化\citep{Alain+Bengio-ICLR2013-small}。 +这意味着一个使用平方误差\gls{criterion} +\begin{align} + \| g(f(\tilde \Vx)) - \Vx \|^2 +\end{align} +和噪声方差为$\sigma^2 $的损坏 +\begin{align} + C(\tilde x = \tilde \Vx | \Vx) = N(\tilde \Vx; \mu=\Vx, \Sigma = \sigma^2 I) +\end{align} +的通用\gls{encoder}-\gls{decoder}架构可以用来训练估计\gls{score}。 +图\ref{fig:chap14_vector_field_color}展示其中的工作原理。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics[width=0.8\textwidth]{Chapter14/figures/vector_field_color}} +\fi +\caption{TODO} +\label{fig:chap14_vector_field_color} +\end{figure} + +一般情况下,不能保证\gls{reconstruction}函数$g(f(\Vx))$减去输入$\Vx$后对应于某个函数的\gls{gradient},更不用说\gls{score} 。 +这是早期工作~\citep{Vincent-NC-2011-small}专用于特定参数化的原因(其中$g(f(\Vx)) - \Vx$能通过另一个函数的导数获得)。 +\citet{Kamyshanska+Memisevic-2015}通过标识一类特殊的浅层\gls{AE}家族,使$g(f(\Vx)) - \Vx$对应于这个家族所有成员的一个\gls{score},以此推广\citet{Vincent-NC-2011-small}的结果。 + +% -- 504 -- + +目前为止我们所讨论的仅限于\gls{DAE}如何学习表示一个概率分布。 +更一般的,我们可能希望使用\gls{AE}作为\gls{generative_model},并从该分布中进行采样。 +这将在\ref{sec:drawing_samples_from_autoencoders}中讨论。 + +% -- 505 -- + +\subsection{历史观点} +\label{sec:historical_perspective} +采用\glssymbol{MLP}\gls{denoising}的想法可以追溯到\cite{Lecun-these87}和\citet{Gallinari87}的工作。 +\citet{Behnke-2001}也曾使用\gls{recurrent_network}对图像去噪。 +在某种意义上,\gls{DAE}仅仅是被训练\gls{denoising}的\glssymbol{MLP}。 +然而,``\gls{DAE}''的命名指的不仅仅是学习\gls{denoising},而且可以学到一个好的内部\gls{representation}(作为学习\gls{denoising}的副效用)。 +这个想法提出较晚\citep{VincentPLarochelleH2008-small,Vincent-JMLR-2010-small}。 +学习到的\gls{representation}可以被用来预训练更深的\gls{unsupervised}网络或\gls{supervised}网络。 +与\gls{sparse}\gls{AE}、\gls{sparse_coding}、\gls{CAE}等\gls{regularization}的\gls{AE}类似, \glssymbol{DAE}的动机是允许使用一个\gls{capacity}非常大的\gls{encoder},同时防止在\gls{encoder}和\gls{decoder}学习一个毫无用处的恒等函数 。 + + +在引入现代\glssymbol{DAE}之前,\citet{Inayoshi-and-Kurita-2005}探讨了与一些相同的方法和相同的目标。 +他们的做法在有\gls{supervised}目标的情况下最小化\gls{reconstruction_error} ,并在监督\glssymbol{MLP}的隐藏层注入噪声,通过引入\gls{reconstruction_error}和注入噪声提升泛化能力。 +然而,他们的方法基于线性\gls{encoder},因此无法学习到现代\glssymbol{DAE}能学习的强大函数族。 + + + +\section{使用\gls{AE}学习\gls{manifold}} +\label{sec:learning_manifolds_with_autoencoders} + +如\ref{sec:manifold_learning}描述,\gls{AE}跟其它很多\gls{ML}算法一样,也应用了将数据集中在一个低维\gls{manifold}或者一小组这样的\gls{manifold}的思想。 +其中一些\gls{ML}算法仅能学习到在\gls{manifold}上表现良好但给定不在\gls{manifold}上的输入会导致异常的函数。 +\gls{AE}进一步借此想法,旨在学习\gls{manifold}的结构。 + + +要了解\gls{AE}如何做到这一点,我们必须介绍\gls{manifold}的一些重要特性。 + + +\gls{manifold}的一个重要特征是\firstgls{tangent_plane}的集合。 +$d$维\gls{manifold}上的一点$\Vx$,\gls{tangent_plane}由能张成\gls{manifold}上允许变动的局部方向的$d$维基向量给出。 +如图\ref{fig:chap14_tangent_plane_color}所示,这些局部方向说明了我们能如何微小地改变$\Vx$但一直处于\gls{manifold}上。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/tangent_plane_color}} +\fi +\caption{TODO} +\label{fig:chap14_tangent_plane_color} +\end{figure} + +% -- 506 -- + +所有\gls{AE}的训练过程涉及两种推动力的折衷: +\begin{enumerate} + \item 学习训练样本$\Vx$的\gls{representation}$\Vh$使得$\Vx$能通过\gls{decoder}近似地从$\Vh$中恢复。 +$\Vx$是从训练数据挑出的事实是关键的,因为这意味着在\gls{AE}不需要成功\gls{reconstruction}不属于数据生成分布下的输入。 + \item 满足约束或正则惩罚。 +这可以是限制\gls{AE}\gls{capacity}的架构约束,也可以是加入到\gls{reconstruction}代价的一个正则项。 +这些技术一般倾向那些对输入较不敏感的解。 +\end{enumerate} + +% -- 507 -- + +显然,单一的推动力是无用的——从它本身将输入复制到输出是无用的,同样忽略输入也是没用的。 +相反,两种推动力结合是有用的,因为它们迫使隐藏的表示能捕获有关数据分布结构的信息。 +重要的原则是,\gls{AE}必须有能力表示\emph{\gls{reconstruction}训练实例所需的变化}。 +如果该数据生成分布集中靠近一个低维\gls{manifold},\gls{AE}能隐式产生捕捉这个\gls{manifold}局部坐标系的表示:仅在$\Vx$周围关于\gls{manifold}的相切变化需要对应于$\Vh=f(\Vx)$中的变化。 +因此,\gls{encoder}学习从输入空间$\Vx$到表示空间的映射,映射仅对沿着\gls{manifold}方向的变化敏感,并且对\gls{manifold}正交方向的变化不敏感。 + + +图\ref{fig:chap14_1d_autoencoder_color}中一维的例子,说明使\gls{reconstruction}函数对数据点周围的扰动输入不敏感,我们可以让\gls{AE}恢复\gls{manifold}的结构。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/1d_autoencoder_color}} +\fi +\caption{TODO} +\label{fig:chap14_1d_autoencoder_color} +\end{figure} + +% -- 508 -- + +对比其他的方法是有用且受启发的,可以了解\gls{AE}为什么对\gls{manifold_learning}是有用的。 +学习表征\gls{manifold}最常见的是\gls{manifold}上(或附近)数据点的\gls{representation}。 +对于特定的实例,这样的表示也被称为\gls{embedding}。 +它通常由一个低维向量给出,具有比这个\gls{manifold}的``外围''空间更少的维数。 +有些算法(下面讨论的\gls{nonparametric}\gls{manifold_learning}算法)直接学习每个训练样例的\gls{embedding},而其他算法学习一个更一般的映射(有时被称为\gls{encoder}或表示函数),将周围空间(输入空间)的任意点映射到它的\gls{embedding}。 + + +\gls{manifold_learning}大多专注于试图捕捉到这些\gls{manifold}的\gls{unsupervised_learning}过程。 +最初始的学习非线性\gls{manifold}的\gls{ML}研究专注基于\firstgls{nearest_neighbor_graph}的\firstgls{nonparametric}方法。 +该图中每个训练样例对应一个节点,它的边连接近邻点对。 +如图\ref{fig:chap14_faces_graph_manifold}所示,这些方法\citep{Scholkopf98,Roweis2000-lle-small,Tenenbaum2000-isomap,Brand2003-small,Belkin+Niyogi-2003,Donoho+Carrie-03,Weinberger04a-small,SNE-nips15-small,VanDerMaaten08-small}将每个节点与张成实例和近邻之间的差向量变化方向的\gls{tangent_plane}相关联。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter14/figures/faces_graph_manifold}} +\fi +\caption{TODO} +\label{fig:chap14_faces_graph_manifold} +\end{figure} + +全局坐标系就可以通过优化或求解线性系统获得。 +图\ref{fig:chap14_tiling-a-manifold}展示了如何通过大量局部线性的类高斯样平铺(或``薄煎饼'',因为高斯块在\gls{tangent_plane}方向是扁平的)得到一个\gls{manifold}。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics[width=0.8\textwidth]{Chapter14/figures/tiling-a-manifold}} +\fi +\caption{TODO} +\label{fig:chap14_tiling-a-manifold} +\end{figure} + +然而,\citet{Bengio+Monperrus-2005}指出了这些局部\gls{nonparametric}方法应用于\gls{manifold_learning}的根本困难:如果\gls{manifold}不是很光滑(它们有许多波峰、波谷和弯曲),我们可能需要非常多的训练样本以覆盖其中的每一个变化,导致没有能力泛化到没见过的变化。 +实际上,这些方法只能通过内插,概括相邻实例之间\gls{manifold}的形状。 +不幸的是,\glssymbol{AI}问题中涉及的\gls{manifold}可能具有非常复杂的结构,难以仅从局部插值捕获特征。 +考虑图\ref{fig:chap14_tangent_plane_color}转换所得的\gls{manifold}样例。 +如果我们只观察输入向量内的一个坐标$\Vx_i$,当平移图像,我们可以观察到当这个坐标遇到波峰或波谷时,图像的亮度也会经历一个波峰或波谷。 +换句话说,底层图像模板亮度的模式复杂性决定执行简单的图像变换所产生的\gls{manifold}的复杂性。 +这是采用\gls{distributed_representation}和\gls{DL}来捕获\gls{manifold}结构的动机。 + +% -- 509 -- + +\section{\gls{CAE}} +\label{sec:contractive_autoencoders} +\gls{CAE}\citep{Rifai+al-2011-small,Salah+al-2011-small}在\gls{code}$\Vh = f(\Vx)$的基础上添加了显式的正则项,鼓励$f$的导数尽可能小: +\begin{align} + \Omega(\Vh) = \lambda \Bigg\| \frac{\partial f(\Vx)}{\partial \Vx} \Bigg\|_F^2 . +\end{align} +惩罚项$\Omega(\Vh)$为平方\ENNAME{Frobenius}范数(元素平方之和),作用于与\gls{encoder}的函数相关\gls{partial_derivatives}的\gls{jacobian}矩阵。 + + +\gls{DAE}和\gls{CAE}之间存在一定联系:\citet{Alain+Bengio-ICLR2013-small}指出在小高斯噪声的限制下,当\gls{reconstruction}函数将$\Vx$映射到$\Vr = g(f(\Vx))$时,\gls{denoising}\gls{reconstruction_error}与\gls{contractive}惩罚项是等价的。 +换句话说,\gls{DAE}能抵抗小且有限的输入扰动,而\gls{CAE}使特征提取函数能抵抗极小的输入扰动。 + +分类任务中,基于\gls{jacobian}的\gls{contractive}惩罚预训练特征函数$f(\Vx)$,将收缩惩罚应用在$f(\Vx)$而不是$g(f(\Vx))$可以产生最好的分类精度。 +如\ref{sec:estimating_the_score}节所讨论,应用于$f(\Vx)$的\gls{contractive}惩罚与\gls{score_matching}也有紧密的联系。 + +\firstgls{contractive}源于\glssymbol{CAE}弯曲空间的方式。 +具体来说,由于\glssymbol{CAE}是训练成能抵抗输入扰动,鼓励将输入点邻域映射到输出点一更小的邻域。 +我们能认为这是将输入的邻域\gls{contractive}到更小的输出邻域。 + + +说得更清楚一点,\glssymbol{CAE}只在局部\gls{contractive}——一个训练样本$\Vx$的所有扰动都映射到$f(\Vx)$的附近。 +全局来看,两个不同的点$\Vx$和$\Vx'$会分别被映射到远离原点的两个点$f(\Vx)$和$f(\Vx')$。 +$f$扩展到数据\gls{manifold}的中间或远处是合理的(见图\ref{fig:chap14_1d_autoencoder_color}中小例子的情况)。 +当$\Omega(\Vh)$惩罚应用于\ENNAME{sigmoid}单元时,\gls{contractive}\gls{jacobian}的简单方式是令\ENNAME{sigmoid}趋向饱和的0或1。 +这鼓励\glssymbol{CAE}使用\ENNAME{sigmoid}的极值编码输入点,或许可以解释为二进制\gls{code}。 +它也保证了\glssymbol{CAE}可以穿过大部分\ENNAME{sigmoid}\gls{hidden_unit}能张成的超立方体,进而扩散其\gls{code}值。 + +我们可以认为点$\Vx$处的\gls{jacobian}矩阵$\MJ$能将非线性\gls{encoder}近似为线性算子。 +这允许我们更形式地使用``\gls{contractive}''这个词。 +在线性理论中,当$\MJ\Vx$的范数对于所有单位$\Vx$都小于等于1时,$\MJ$被称为\gls{contractive}的。 +换句话说,如果$\MJ$收缩了单位球,他就是\gls{contractive}的。 +我们可以认为\glssymbol{CAE}为了鼓励每个局部线性算子具有收缩性,而在每个训练数据点上将\ENNAME{Frobenius}范数作为$f(\Vx)$的局部线性近似的惩罚。 + + +如\ref{sec:learning_manifolds_with_autoencoders}中描述,正则\gls{AE}基于两种相反的推动力学习\gls{manifold}。 +在\glssymbol{CAE}的情况下,这两种推动力是\gls{reconstruction_error}和\gls{contractive}惩罚$\Omega(\Vh)$。 +单独的\gls{reconstruction_error}鼓励\glssymbol{CAE}学习一个恒等函数。 +单独的\gls{contractive}惩罚将鼓励\glssymbol{CAE}学习关于$\Vx$是恒定的特征。 +这两种推动力的的折衷产生一个导数$\frac{\partial f(\Vx)}{\partial \Vx}$大多是微小的\gls{AE}。 +只有少数\gls{hidden_unit},对应于一小部分输入数据的方向,可能有显著的导数。 + + +\glssymbol{CAE}的目标是学习数据的\gls{manifold}结构。 +大的$\MJ\Vx$快速改变$\Vh$的方向$\Vx$很可能是近似\gls{manifold}\gls{tangent_plane}的方向。 +\citet{Rifai+al-2011-small,Salah+al-2011-small}的实验显示训练\glssymbol{CAE}会导致$\MJ$中大部分奇异值(幅值)比1小,因此是收缩的。 +然而,有些奇异值仍然比1大,因为\gls{reconstruction_error}的惩罚鼓励\glssymbol{CAE}对最大局部变化的方向进行编码。 +对应于最大奇异值的方向被解释为\gls{CAE}学到的切方向。 +理想情况下,这些切方向应对应于数据的真实变化。 +比如,一个应用于图像的\glssymbol{CAE}应该能学到显示图像改变的切向量,如\ref{fig:chap14_tangent_plane_color}图中物体渐渐改变状态。 +如图\ref{fig:chap14_cifar_cae}所示,实验获得的奇异向量的可视化似乎真的对应于输入图象有意义的变换。 + +% -- 512 -- + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics[width=0.8\textwidth]{Chapter14/figures/cifar_cae}} +\fi +\caption{TODO} +\label{fig:chap14_cifar_cae} +\end{figure} + +\gls{CAE}\gls{regularization}\gls{criterion}的一个实际问题是,尽管它在单一隐含层的\gls{AE}情况下是容易计算的,但在更深的\gls{AE}情况下会变的难以计算。 +根据\citet{Rifai+al-2011-small}的策略,分别训练一系列单层的\gls{AE},并且每个被训练为\gls{reconstruction}前一个\gls{AE}的隐含层。 +这些\gls{AE}的组合就组成了一个深度\gls{AE}。 +因为每个层分别训练成局部\gls{contractive},深度\gls{AE}自然也是\gls{contractive}的。 +这个结果与联合训练深度模型完整架构(带有关于\gls{jacobian}的惩罚项)获得的结果是不同的,但它抓住了许多理想的定性特征。 + + +另一个实际问题是,如果我们不对\gls{decoder}强加一些约束,\gls{contractive}惩罚可能导致无用的结果。 +例如,\gls{encoder}将输入乘一个小常数$\epsilon$,\gls{decoder}将\gls{code}除以一个小常数$\epsilon$。 +随着$\epsilon$趋向于0,\gls{encoder}会使\gls{contractive}惩罚项$\Omega(\Vh)$趋向于0而学不到任何关于分布的信息。 +同时,\gls{decoder}保持完美的\gls{reconstruction}。 +\citet{Rifai+al-2011-small}通过绑定$f$和$g$的权重来防止这种情况。 +$f$和$g$都是由线性仿射变换后进行逐元素非线性变换的标准\gls{NN}层组成,因此将$g$的权重矩阵设成$f$权重矩阵的转置是很直观的。 + +% -- 513 -- + +\section{\gls{PSD}} +\label{sec:predictive_sparse_decomposition} + +\firstall{PSD}是\gls{sparse_coding}和参数化\gls{AE}\citep{koray-psd-08}的混合模型。 +参数化\gls{encoder}被训练为能预测迭代推断的输出。 +\glssymbol{PSD}被应用与图片和视频中对象识别的\gls{unsupervised}特征学习\citep{Koray-08-small,koray-nips-10-small,Jarrett-ICCV2009-small,farabet-suml-11},在音频中也有所应用\citep{henaff-ismir-11-small}。 +这个模型由一个\gls{encoder}$f(\Vx)$和一个\gls{decoder}$g(\Vh)$组成,并且都是参数化的。 +在训练过程中,$\Vh$由优化算法控制。 +优化过程是最小化 +\begin{align} + \| \Vx - g(\Vh) \| ^2 + \lambda | \Vh |_1 + \gamma \| \Vh - f(\Vx) \|^2. +\end{align} +就像\gls{sparse_coding},训练算法交替地相对$\Vh$和模型的参数最小化上述目标。 +相对$\Vh$最小化较快,因为$f(\Vx)$提供$\Vh$的良好初始值以及\gls{loss_function}将$\Vh$约束在$f(\Vx)$附近。 +简单的\gls{GD}算法只需10步左右就能获得理想的$\Vh$。 + + +\glssymbol{PSD}所使用的训练程序不是先训练\gls{sparse_coding}模型,然后训练$f(\Vx)$来预测\gls{sparse_coding}的特征。 +\glssymbol{PSD}训练过程正则化\gls{decoder},使用$f(\Vx)$可以推断出良好\gls{code}的参数。 + + +\gls{PSD}是\firstgls{learned_approximate_inference}的一个例子。 +在\ref{sec:learned_approximate_inference}节中,这个话题将会进一步展开。 +\ref{chap:approximate_inference}章中展示的工具能让我们了解到,\glssymbol{PSD}能够被解释为最大化模型的对数似然下界来训练有向\gls{sparse_coding}的概率模型。 + + +在\glssymbol{PSD}的实际应用中,迭代优化仅在训练过程中使用。 +模型被部署后,参数\gls{encoder}$f$用于计算学习好的特征。 +相比于通过\gls{GD}来推断$\Vh$,计算$f$是很容易的。 +因为$f$是一个可微带参函数,\glssymbol{PSD}模型可堆叠,并用于初始化其他训练\gls{criterion}的深度网络。 + +% -- 514 -- + +\section{\gls{AE}的应用} +\label{sec:applications_of_autoencoders} + +\gls{AE}已成功应用于\gls{dimensionality_reduction}和\gls{information_retrieval}任务。 +\gls{dimensionality_reduction}是\gls{representation_learning}和\gls{DL}的第一批应用之一。 +它是研究\gls{AE}早期动机之一。 +例如, \citet{Hinton-Science2006}训练了一个堆叠\glssymbol{RBM},然后利用它们的权重初始化一个深度\gls{AE}并逐渐变小隐藏层,在30个单元的瓶颈处达到极值。 +生成的\gls{code}比30维的\glssymbol{PCA}产生更少的\gls{reconstruction_error},所学的表示更容易定性解释,并能联系基础类别,这些类别表现为分离良好的集群。 + + +低维\gls{representation}可以提高许多任务的性能,例如分类。 +小空间的模型消耗更少的内存和运行时间。 +据\citet{Salakhutdinov+Hinton2007-small}和\citet{Torralba+Fergus+Weiss-2008}观察,\gls{dimensionality_reduction}的许多形式是跟彼此邻近的例子语义相关的。 +映射到低维空间能帮助泛化提示了这个想法。 + + +从\gls{dimensionality_reduction}中比普通任务受益更多的是\gls{information_retrieval},即在数据库中查询类似条目的任务。 +此任务从\gls{dimensionality_reduction}获得类似其他任务的一般益处,同时在某些种低维空间中的搜索变得极为高效。 +特别的,如果我们训练\gls{dimensionality_reduction}算法来生成一个低维且\emph{二值}的\gls{code},那么我们就可以将所有数据库条目在哈希表映射为二进制编码向量。 +这个哈希表允许我们返回具有相同二进制代码的数据库条目作为查询结果进行\gls{information_retrieval}。 +我们也可以非常高效地搜索稍有不同条目,只需反转查询编码的各个位。 +这种通过\gls{dimensionality_reduction}和二值化的\gls{information_retrieval}方法被称为\firstgls{semantic_hashing}\citep{Salakhutdinov+Hinton2007-small,Salakhutdinov+Geoff-2009},已经被用于文本输入\citep{Salakhutdinov+Hinton2007-small,Salakhutdinov+Geoff-2009}和图像\citep{Torralba+Fergus+Weiss-2008,WeissTF08,KrizhevskyH11}。 + + +通常在最终层上使用\ENNAME{sigmoid}的编码函数来产生\gls{semantic_hashing}的二值\gls{code}。 +\ENNAME{sigmoid}单元必须被训练为到达饱和,对所有输入值都接近0或接近1。 +能做到这一点的窍门就是训练时在\ENNAME{sigmoid}非线性单元前简单地注入加性噪声。 +噪声的大小应该随时间增加。 +要对抗这种噪音并且保存尽可能多的信息,网络必须加大输入到\ENNAME{sigmoid}函数的幅度,直到饱和。 + +% -- 515 -- + +学习哈希函数的思想也在其他几个方向进一步探讨,包括改变损失训练\gls{representation}的想法,这个表示与哈希表中查找附近样本的任务有更直接的联系\citep{Norouzi+Fleet-ICML2011}。 diff --git a/Chapter4/numerical_computation.tex b/Chapter4/numerical_computation.tex new file mode 100644 index 0000000..4bfa7d2 --- /dev/null +++ b/Chapter4/numerical_computation.tex @@ -0,0 +1,530 @@ +% Translator: Shenjian Zhao +\chapter{数值计算} +\label{chap:numerical_computation} + +\gls{ML}算法通常需要大量的数值计算。 +数值计算通常指的是通过迭代地更新解来解决数学问题的算法,而不是解析地提供正确解的符号表达。 +常见的操作包括优化(找到最小化或最大化函数值的参数)和线性方程的求解。 +对数字计算机来说,即使计算只涉及实数的函数也是困难的,因为实数无法在有限内存下精确表示。 + +\section{\gls{overflow}和\gls{underflow}} +\label{sec:overflow_and_underflow} +在数字计算机上实现连续数学的基本困难是,我们需要通过有限数量的位模式来表示无限多的实数。 +这意味着我们在计算机中表示实数时,几乎都会引入一些近似误差。 +在许多情况下,这仅仅是舍入误差。 +如果在理论上可行的算法没有被设计为最小化舍入误差的累积,可能会在实践中失效,因此舍入误差是有问题的(特别是许多操作复合时)。 + +一种特别的毁灭性舍入误差是\firstgls{underflow}。 +当接近零的数被四舍五入为零时发生\gls{underflow}。 +许多函数会在其参数为零而不是一个很小的正数时才会表现出质的不同。 +例如,我们通常要避免被零除(一些软件环境将在这种情况抛出异常,有些会返回一个非数字(not-a-number)的占位符)或取零的对数(这通常被视为$-\infty$,进一步的算术运算会使其变成非数字)。 + +% -- 77 -- + +另一个极具破坏力的数值错误形式是\firstgls{overflow}。 +当大量级的数被近似为$\infty$或$-\infty$时发生\gls{overflow}。 +进一步的运算通常将这些无限值变为非数字。 + +必须对\gls{overflow}和\gls{underflow}进行数值稳定的一个例子是\firstgls{softmax}。 +\gls{softmax}经常用于预测与\gls{multinoulli}相关联的概率,定义为 +\begin{align} + \text{softmax}(\Vx)_i = \frac{\exp(\Sx_i)}{\sum_{j=1}^n \exp(\Sx_j)} +\end{align} +考虑一下当所有$\Sx_i$都等于某个常数$\Sc$时会发生什么。 +从理论分析上说,我们可以发现所有的输出都应该为$\frac{1}{n}$。 +从数值计算上说,当$\Sc$量级很大时,这可能不会发生。 +如果$\Sc$是很小的负数,$\exp(c)$就会\gls{underflow}。 +这意味着\gls{softmax}的分母会变成0,所以最后的结果是未定义的。 +当$\Sc$是非常大的正数时,$\exp(c)$的\gls{overflow}再次导致整个表达式未定义。 +这两个困难能通过计算$\text{softmax}(\Vz)$同时解决,其中$\Vz = \Vx - \max_i \Sx_i$。 +简单的代数计算表明,$\text{softmax}$解析上的函数值不会因为从输入向量减去或加上标量而改变。 +减去$\max_i x_i$导致$\exp$的最大参数为$0$,这排除了\gls{overflow}的可能性。 +同样地,分母中至少有一个值为1的项,这就排除了因分母\gls{underflow}而导致被零除的可能性。 + +还有一个小问题。 +分子中的\gls{underflow}仍可以导致整体表达式被计算为零。 +这意味着,如果我们在计算$\log ~\text{softmax}(\Vx)$时先计算$\text{softmax}$再把结果传给$\log$函数,会错误地得到$-\infty$。 +相反,我们必须实现一个单独的函数,并以数值稳定的方式计算$\log \text{softmax}$。 +可以使用相同的技巧稳定$\log \text{softmax}$函数。 + +在大多数情况下,我们没有明确地对实现本书描述的各种算法时所涉及的数值考虑进行详细说明。 +底层库的开发者在实现\gls{DL}算法时应该牢记数值问题。 +本书的大多数读者可以简单地依赖保证数值稳定的底层库。 +在某些情况下,有可能在实现一个新的算法时自动保持数值稳定。 +Theano\citep{bergstra+al:2010-scipy,Bastien-2012}就是这样软件包的一个例子,它能自动检测并稳定\gls{DL}中许多常见的数值不稳定的表达式。 + +% -- 78 -- + +\section{\gls{poor_conditioning}} +\label{sec:poor_conditioning} + +条件数表明函数相对于输入的微小变化而变化的快慢程度。 +输入被轻微扰动而迅速改变的函数对于科学计算来说是可能是有问题的,因为输入中的舍入误差可能导致输出的巨大变化。 + +考虑函数$f(\Vx) = \MA^{-1} \Vx$。 +当$\MA \in \SetR^{n \times n}$ 具有特征值分解时,其条件数为 +\begin{align} + \underset{i,j}{\max} \Bigg| \frac{\lambda_i}{ \lambda_j} \Bigg|. +\end{align} +这是最大和最小特征值的模之比。 +当该数很大时,矩阵求逆对输入的误差特别敏感。 + +这种敏感性是矩阵本身的固有特性,而不是矩阵求逆期间舍入误差的结果。 +即使我们乘以完全正确的矩阵逆,\gls{poor_conditioning}的矩阵也会放大预先存在的误差。 +在实践中,该错误将与求逆过程本身的数值误差进一步复合。 + + + +\section{基于梯度的优化方法} +\label{sec:gradient_based_optimization} + +大多数\gls{DL}算法涉及某种形式的优化。 +优化指的是改变$\Vx$以最小化或最大化的某个函数$f(\Vx)$的任务。 +我们通常以最小化$f(\Vx)$指代大多数最优化问题。 +最大化可经由最小化算法最小化$-f(\Vx)$来实现。 + +我们希望最小化或最大化的函数叫做\firstgls{objective_function}或\firstgls{criterion}。 +当我们对其进行最小化时,我们也把它叫做\firstgls{cost_function},\firstgls{loss_function}或\firstgls{error_function}。 +虽然有些机器学习著作赋予这些名称特殊的意义,但在这本书中我们交替使用这些术语。 + +我们经常使用一个上标$*$表示最小化或最大化函数的$\Vx$值。 +如我们记$\Vx^*=\argmin f(\Vx)$。 + +我们假设读者已经熟悉微积分,这里简要回顾微积分概念如何与优化联系。 + +% -- 79 -- + +假设我们有一个函数$\Sy = f(\Sx)$, 其中$\Sx$和$\Sy$是实数。 +这个函数的\firstgls{derivative}记为$f^\prime(x)$或$\frac{dy}{dx}$。 +导数$f^\prime(\Sx)$代表$f(\Sx)$在点$x$处的斜率。 +换句话说,它表明需要如何缩放输入的小变化以在输出获得相应的变化: +$f(\Sx+\epsilon) \approx f(\Sx) + \epsilon f^\prime(\Sx) $。 + +因此\gls{derivative}对于最小化一个函数很有用,因为它告诉我们如何更改$x$来略微地改善$y$。 +例如,我们知道对于足够小的$\epsilon$来说, $f(\Sx-\epsilon \text{sign}(f^\prime(\Sx)) )$是比$f(\Sx)$小的。 +因此我们可以将$\Sx$往\gls{derivative}的反方向移动一小步来减小$f(\Sx)$。 +这个技术被称为\firstgls{GD}\citep{cauchy1847}。 +图\ref{fig:chap4_gradient_descent_color}展示了一个例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter4/figures/gradient_descent_color}} +\fi +\caption{TODO} +\label{fig:chap4_gradient_descent_color} +\end{figure} + +% -- 80 -- + +当$f^\prime(\Sx)=0$,\gls{derivative}无法提供往哪个方向移动的信息。 +$ f^\prime(\Sx)=0 $的点称为\firstgls{critical_points}或\firstgls{stationary_point}。 +一个\firstgls{local_minimum}意味着这个点的$f(\Sx)$小于所有邻近点,因此不可能通过移动无穷小的步长来减小$f(\Sx)$。 +一个\firstgls{local_maximum}是$f(x)$意味着这个点的$f(\Sx)$大于所有邻近点,因此不可能通过移动无穷小的步长来增大$f(x)$。 +有些\gls{critical_points}既不是最小点也不是最大点。这些点被称为\firstgls{saddle_points}。 +见图\ref{fig:chap4_critical_color}给出的各种临界点的例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter4/figures/critical_color}} +\fi +\caption{TODO} +\label{fig:chap4_critical_color} +\end{figure} + +使$f(x)$取得全局最小值的点是\firstgls{global_minimum}。 +只有一个\gls{global_minimum}或存在多个\gls{global_minimum}的函数是有可能的。 +还可能存在不是全局最优的\gls{local_minimum}。 +在\gls{DL}的背景下,我们优化的函数可能含有许多不是最优的\gls{local_minimum},或许多被非常平坦的区域包围的\gls{saddle_points}。 +尤其是当输入是多维的时候,所有这些都将使优化变得困难。 +因此,我们通常寻找$f$非常小的值,但在任何形式意义下并不一定是最小。 +见图\ref{fig:chap4_approx_opt_color}的例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter4/figures/approx_opt_color}} +\fi +\caption{TODO} +\label{fig:chap4_approx_opt_color} +\end{figure} + +我们经常最小化具有多维输入的函数:$f: \SetR^n \rightarrow \SetR $。 +为了使``最小化''的概念有意义,输出必须是一维的(标量)。 + +% -- 81 -- + +我们必须利用\firstgls{partial_derivatives}的概念针对具有多维输入的函数。 +\gls{partial_derivatives}$\frac{\partial}{\partial \Sx_i}f(\Vx)$衡量点$\Vx$处只有$x_i$增加时$f(\Vx)$如何变化。 +\firstgls{gradient}是相对一个向量求导的\gls{derivative}:$f$的导数是包含所有\gls{partial_derivatives}的向量,记为$\nabla_{\Vx} f(\Vx)$。 +\gls{gradient}的第$i$的元素是$f$关于$x_i$的\gls{partial_derivatives}。 +在多维情况下,\gls{critical_points}是\gls{gradient}中所有元素都为零的点。 + +在$\Vu$(单位向量)方向的\firstgls{directional_derivative}是函数$f$在$\Vu$方向的斜率。 +换句话说,\gls{directional_derivative}是函数$f(\Vx + \alpha \Vu)$关于$\alpha$的\gls{derivative}(在$\alpha = 0$时取得)。 +使用链式法则,我们可以看到当$\alpha=0$时,$\frac{\partial}{\partial \alpha} f(\Vx + \alpha \Vu) = \Vu^\Tsp \nabla_{\Vx} f(\Vx)$。 + +为了最小化$f$,我们希望找到使$f$下降得最快的方向。 +计算\gls{directional_derivative}: +\begin{align} + \underset{\Vu, \Vu^\Tsp\Vu = 1}{\min} \Vu^\Tsp & \nabla_{\Vx} f(\Vx) \\ + = \underset{\Vu, \Vu^\Tsp\Vu = 1}{\min} \| \Vu \|_2 \| &\nabla_{\Vx}f(\Vx) \|_2 \cos \theta +\end{align} +其中$\theta$是$\Vu$与\gls{gradient}的夹角。 +将$ \| \Vu \|_2 = 1$代入,并忽略与$\Vu$无关的项,就能简化得到$ \underset{\Vu}{\min} \cos \theta $。 +这在$\Vu$与\gls{gradient}方向相反时取得最小。 +换句话说,\gls{gradient}向量指向上坡,负\gls{gradient}向量指向下坡。 +我们在负\gls{gradient}方向上移动可以减小$f$。 +这被称为\textbf{最速下降法}(method of steepest descent)或\firstgls{GD}。 + +最速下降建议新的点为 +\begin{align} + \Vx' = \Vx - \epsilon \nabla_{\Vx} f(\Vx) +\end{align} +其中$\epsilon$为学习速率,是一个确定步长大小的正标量。 +我们可以通过几种不同的方式选择$\epsilon$。 +普遍的方式是选择一个小常数。 +有时我们通过计算,选择使\gls{directional_derivative}消失的步长。 +还有一种方法是根据几个$\epsilon$计算$f(\Vx - \epsilon \nabla_{\Vx} f(\Vx))$, 并选择其中能产生最小\gls{objective_function}值的$\epsilon$。 +这种策略被称为\gls{line_search}。 + +最速下降在\gls{gradient}的每一个元素为零时收敛(或在实践中,很接近零)。 +在某些情况下,我们也许能够避免运行该迭代算法,并通过解方程$\nabla_{\Vx} f(\Vx)= 0$直接跳到\gls{critical_points}。 + +% -- 82 -- + +虽然\gls{GD}被限制在连续空间中的优化问题,但不断向更好的情况移动一小步(即近似最佳的小移动)的一般概念可以被推广到离散空间。 +递增带有离散参数的\gls{objective_function}被称为\firstgls{hill_climbing}算法\citep{Russel+Norvig-book2003}。 + +\subsection{\gls{gradient}之上:\gls{jacobian}和\gls{hessian}矩阵} +\label{sec:beyond_the_gradient_jacobian_and_hessian_matrices} +有时我们需要计算输入和输出都为向量的函数的所有\gls{partial_derivatives}。 +包含所有这样的偏导数的矩阵被称为\firstgls{jacobian}矩阵。 +具体来说,如果我们有一个函数:$\Vf: \SetR^m \rightarrow \SetR^n$,$\Vf$的\gls{jacobian}矩阵$\MJ \in \SetR^{n \times m}$定义为$J_{i,j} = \frac{\partial}{\partial \Sx_j} f(\Vx)_i$。 + +有时,我们也对\gls{derivative}的\gls{derivative}感兴趣,即\firstgls{second_derivative}。 +例如,有一个函数$f: \SetR^m \rightarrow \SetR$,$f$的一阶\gls{derivative}(关于$\Sx_j$)关于$x_i$的\gls{derivative}记为$\frac{\partial^2}{\partial \Sx_i \partial \Sx_j} f$。 +在一维情况下,我们可以将$\frac{\partial^2}{\partial \Sx^2} f$为$f''(\Sx)$。 +\gls{second_derivative}告诉我们的一阶\gls{derivative}将如何随着输入的变化而改变。 +它表示只基于\gls{gradient}信息的\gls{GD}步骤是否会产生如我们预期的那样大的改善,因此是重要的。 +我们可以认为,\gls{second_derivative}是对\gls{curvature}的衡量。 +假设我们有一个二次函数(虽然很多实践中的函数都不是二次,但至少在局部可以很好地用二次近似)。 +如果这样的函数具有零\gls{second_derivative},那就没有\gls{curvature}。 +也就是一条完全平坦的线,仅用\gls{gradient}就可以预测它的值。 +我们使用沿负\gls{gradient}方向大小为$\epsilon$的下降步,当该\gls{gradient}是$1$时,\gls{cost_function}将下降$\epsilon$。 +如果\gls{second_derivative}是负的,函数曲线向下凹陷(向上凸出),因此\gls{cost_function}将下降的比$\epsilon$多。 +如果\gls{second_derivative}是正的,函数曲线是向上凹陷(向下凸出), +因此\gls{cost_function}将下降的比$\epsilon$少。 +从图\ref{fig:chap4_curvature_color}可以看出不同形式的\gls{curvature}如何影响基于\gls{gradient}的预测值与真实的\gls{cost_function}值的关系。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter4/figures/curvature_color}} +\fi +\caption{TODO} +\label{fig:chap4_curvature_color} +\end{figure} + +当我们的函数具有多维输入时,\gls{second_derivative}也有很多。 +可以这些导数合并成一个矩阵,称为\firstgls{hessian}矩阵。 +\gls{hessian}矩阵$\MH(f)(\Vx)$定义为 +\begin{align} + \MH(f)(\Vx)_{i,j} = \frac{\partial^2}{\partial \Sx_i \partial \Sx_j} f(\Vx). +\end{align} +\gls{hessian}等价于\gls{gradient}的\gls{jacobian}矩阵。 + +% -- 83 -- + +微分算子在任何二阶偏导连续的点处可交换,也就是它们的顺序可以互换: +\begin{align} + \frac{\partial^2}{\partial \Sx_i \partial \Sx_j} f(\Vx) = \frac{\partial^2}{\partial \Sx_j\partial \Sx_i} f(\Vx) . +\end{align} +这意味着$H_{i,j} = H_{j,i}$, 因此\gls{hessian}矩阵在这些点上是对称的。 +在\gls{DL}背景下,我们遇到的大多数函数的\gls{hessian}几乎处处都是对称的。 +因为\gls{hessian}矩阵是实对称的,我们可以将其分解成一组实特征值和特征向量的正交。 +在特定方向$\Vd$上的\gls{second_derivative}可以写成$\Vd^\Tsp \MH \Vd$。 +当$\Vd$是$\MH$的一个特征向量时,这个方向的\gls{second_derivative}就是对应的特征值。 +对于其他的方向$\Vd$,方向\gls{second_derivative}是所有特征值的加权平均,权重在0和1之间,且与$\Vd$夹角越小的特征向量有更大的权重。 +最大特征值确定最大\gls{second_derivative},最小特征值确定最小\gls{second_derivative}。 + +% -- 84 -- + +我们可以通过(方向)\gls{second_derivative}预期一个\gls{GD}步骤能表现得多好。 +我们在当前点$\Vx^{(0)}$处作函数$f(\Vx)$的近似二阶\gls{taylor}级数: +\begin{align} + f(\Vx) \approx f(\Vx^{(0)}) + (\Vx - \Vx^{(0)})^\Tsp \Vg + + \frac{1}{2} (\Vx - \Vx^{(0)})^\Tsp \MH (\Vx - \Vx^{(0)}), +\end{align} +其中$\Vg$是梯度,$\MH$是$ \Vx^{(0)}$点的\gls{hessian}。 +如果我们使用学习速率$\epsilon$,那么新的点$\Vx$将会是$\Vx^{(0)}-\epsilon \Vg$。 +代入上述的近似,可得 +\begin{align} + f(\Vx^{(0)} - \epsilon \Vg ) \approx f(\Vx^{(0)}) - \epsilon \Vg^\Tsp \Vg + \frac{1}{2} \epsilon^2 \Vg^\Tsp \MH \Vg. +\end{align} +其中有3项:函数的原始值、函数斜率导致的预期改善、函数\gls{curvature}导致的校正。 +当这最后一项太大时,\gls{GD}实际上是可能向上移动的。 +当$\Vg^\Tsp \MH \Vg$为零或负时,近似的\gls{taylor}级数表明增加$\epsilon$将永远导致$f$的下降。 +在实践中,\gls{taylor}级数不会在$\epsilon$大的时候也保持准确,因此在这种情况下我们必须采取更启发式的选择。 +当$\Vg^\Tsp \MH \Vg$为正时,通过计算可得,使近似\gls{taylor}级数下降最多的最优步长为 +\begin{align} + \epsilon^* = \frac{ \Vg^\Tsp \Vg}{ \Vg^\Tsp \MH \Vg} +\end{align} +最坏的情况下,$\Vg$与$\MH$最大特征值$\lambda_{\max}$对应的特征向量对齐,则最优步长是$\frac{1}{\lambda_{\max}}$。 +我们要最小化的函数能用二次函数很好地近似的情况下,\gls{hessian}的特征值决定了学习速率的量级。 + +\gls{second_derivative}还可以被用于确定一个\gls{critical_points}是否是\gls{local_maximum}、\gls{local_minimum}或\gls{saddle_points}。 +回想一下,在\gls{critical_points}处$f'(x) = 0$。 +而$f''(x) > 0$意味着$f'(x)$会随着我们移向右边而增加,移向左边而减小,也就是 $f'(x - \epsilon) < 0$ 和 $f'(x+\epsilon)>0$对足够小的$\epsilon$成立。 换句话说,当我们移向右边,斜率开始指向右边的上坡,当我们移向左边,斜率开始指向左边的上坡。 +因此我们得出结论,当$f'(x) = 0$且$f''(x) > 0$时,$\Vx$是一个\gls{local_minimum}。 +同样,当$f'(x) = 0$且$f''(x) < 0$时,$\Vx$是一个\gls{local_maximum}。 +这就是所谓的\firstgls{second_derivative_test}。 +不幸的是,当$f''(x) = 0$时测试是不确定的。 +在这种情况下,$\Vx$可以是一个\gls{saddle_points}或平坦区域的一部分。 + +% -- 85 -- + +在多维情况下,我们需要检测函数的所有\gls{second_derivative}。 +利用\gls{hessian}的特征值分解,我们可以将\gls{second_derivative_test}扩展到多维情况。 +在\gls{critical_points}处($\nabla_{\Vx} f(\Vx) = 0$),我们通过检测\gls{hessian}的特征值来判断该\gls{critical_points}是一个\gls{local_maximum}、\gls{local_minimum}还是\gls{saddle_points}。 +当\gls{hessian}是正定的(所有特征值都是正的),则该\gls{critical_points}是\gls{local_minimum}。 +因为方向\gls{second_derivative}在任意方向都是正的,参考单变量的\gls{second_derivative_test}就能得出此结论。 +同样的,当\gls{hessian}是负定的(所有特征值都是负的),这个点就是\gls{local_maximum}。 +在多维情况下,实际上可以找到确定该点是否为\gls{saddle_points}的积极迹象(某些情况下)。 +如果\gls{hessian}的特征值中至少一个是正的且至少一个是负的,那么$\Vx$是$f$某个横截面的\gls{local_maximum},却是另一个横截面的\gls{local_minimum}。 +见图\ref{fig:chap4_saddle_3d_color}中的例子。 +最后,多维\gls{second_derivative_test}可能像单变量版本那样是不确定的。 +当所有非零特征值是同号的且至少有一个特征值是$0$时,这个检测就是不确定的。 +这是因为单变量的\gls{second_derivative_test}在零特征值对应的横截面上是不确定的。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter4/figures/saddle_3d_color}} +\fi +\caption{TODO} +\label{fig:chap4_saddle_3d_color} +\end{figure} + +多维情况下,单个点处每个方向上的\gls{second_derivative}是不同。 +\gls{hessian}的条件数衡量这些\gls{second_derivative}的变化范围。 +当\gls{hessian}的条件数很差时,\gls{GD}法也会表现得很差。 +这是因为一个方向上的\gls{derivative}增加得很快,而在另一个方向上增加得很慢。 +\gls{GD}不知道导数的这种变化,所以它不知道应该优先探索导数长期为负的方向。 +\gls{poor_conditioning}也导致很难选择合适的步长。 +步长必须足够小,以免冲过最小而向具有较强的正\gls{curvature}方向上升。 +这通常意味着步长太小,以致于在其它较小\gls{curvature}的方向上进展不明显。 +见图\ref{fig:chap4_poor_conditioning_color}的例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter4/figures/poor_conditioning_color}} +\fi +\caption{TODO} +\label{fig:chap4_poor_conditioning_color} +\end{figure} + +% -- 86 -- + +使用\gls{hessian}矩阵的信息指导搜索可以解决这个问题。 +其中最简单的方法是\firstgls{newton_method}。 +\gls{newton_method}基于一个二阶\gls{taylor}展开来近似$\Vx^{(0)}$附近的$f(\Vx)$: +\begin{align} + f(\Vx) \approx f(\Vx^{(0)}) + (\Vx - \Vx^{(0)})^\Tsp \nabla_{\Vx} f(\Vx^{(0)}) + + \frac{1}{2} (\Vx - \Vx^{(0)})^\Tsp \MH(f)(\Vx^{(0)}) (\Vx - \Vx^{(0)}). +\end{align} +接着通过计算,我们可以得到这个函数的\gls{critical_points}: +\begin{align} \label{eq:newtonstep} + \Vx^* = \Vx^{(0)} - \MH(f)(\Vx^{(0)})^{-1} \nabla_{\Vx} f(\Vx^{(0)}) +\end{align} +当$f$是一个正定二次函数时,\gls{newton_method}只要应用一次式\ref{eq:newtonstep}就能直接跳到函数的最小点。 +如果$f$不是一个真正二次但能在局部近似为正定二次,\gls{newton_method}则需要多次迭代应用式 \ref{eq:newtonstep}。 +迭代地更新近似函数和跳到近似函数的最小点可以比\gls{GD}更快地到达临界点。 +这在接近\gls{local_minimum}时是一个特别有用的性质,但是在\gls{saddle_points}附近是有害的。 +如\ref{sec:plateaus_saddle_points_and_other_flat_regions}节所讨论的,当附近的\gls{critical_points}是最小点(\gls{hessian}的所有特征值都是正的)时\gls{newton_method}才适用,而\gls{GD}不会被吸引到\gls{saddle_points}(除非\gls{gradient}指向\gls{saddle_points})。 + +仅使用\gls{gradient}信息的优化算法被称为\textbf{一阶优化算法}(first-order optimization algorithms),如\gls{GD}。 +使用\gls{hessian}矩阵的优化算法被称为\textbf{二阶最优化算法}(second-order optimization algorithms)\citep{NumOptBook},如\gls{newton_method}。 + +在本书的大多数上下文中使用的优化算法适用于各种各样的函数,但几乎都没有保证。 +因为在\gls{DL}中使用的函数族是相当复杂的,所以\gls{DL}算法往往缺乏保证。 +在许多其他领域,优化的主要方法是为有限的函数族设计优化算法。 + +在\gls{DL}的背景下,限制函数满足\firstgls{lipschitz_continuous}或其导数\gls{lipschitz}连续可以获得一些保证。 +\gls{lipschitz}连续函数的变化速度以\firstgls{lipschitz_constant}$\CalL$为界: +\begin{align} + \forall \Vx, \forall \Vy, | f(\Vx) - f(\Vy)| \leq \CalL \| \Vx - \Vy \|_2 . +\end{align} +这个属性允许我们量化我们的假设——\gls{GD}等算法导致的输入的微小变化将使输出只产生微小变化,因此是很有用的。 +\gls{lipschitz}连续性也是相当弱的约束,并且\gls{DL}中很多优化问题经过相对较小的修改后就能变得\gls{lipschitz_continuous}。 + +% -- 88 -- + +最成功的特定优化邻域或许是\firstgls{convex_optimization}。 +\gls{convex_optimization}通过更强的限制提供更多的保证。 +\gls{convex_optimization}算法只对凸函数适用——即\gls{hessian}处处半正定的函数。 +因为这些函数没有\gls{saddle_points}而且其所有\gls{local_minimum}必然是\gls{global_minimum},所以表现很好。 +然而,\gls{DL}中的大多数问题都难以表示成\gls{convex_optimization}的形式。 +\gls{convex_optimization}仅用作的一些\gls{DL}算法的子程序。 +\gls{convex_optimization}中的分析思路对证明\gls{DL}算法的收敛性非常有用,然而一般来说,\gls{DL}的背景下的\gls{convex_optimization}的重要性大大减少。 +有关\gls{convex_optimization}的详细信息,见\cite{Boyd04}或\cite{rockafellar1997convex}。 + + +\section{\gls{constrained_optimization}} +\label{sec:constrained_optimization} +有时候,在$\Vx$的所有可能值下最大化或最小化一个函数$f(x)$不是我们所希望的。 +相反,我们可能希望在$\Vx$的某些集合$\SetS$中找$f(\Vx)$的最大值或最小值。 +这被称为\firstgls{constrained_optimization}。 +在\gls{constrained_optimization}术语中,集合$\SetS$内的点$\Vx$被称为\firstgls{feasible}点。 + +我们常常希望找到在某种意义上小的解。 +针对这种情况下的常见方法是强加一个范数约束,如$\| \Vx \| \leq 1$。 + +\gls{constrained_optimization}的一个简单方法是将约束考虑在内后简单地对\gls{GD}进行修改。 +如果我们使用一个小的恒定步长$\epsilon$,我们可以先取\gls{GD}的单步结果,然后将结果投影回$\SetS$。 +如果我们使用\gls{line_search},我们只能在步长为$\epsilon$范围内搜索\gls{feasible}的新$\Vx$点,或者我们可以将线上的每个点投影到约束区域。 +如果可能的话,在\gls{GD}或\gls{line_search}前将\gls{gradient}投影到\gls{feasible}域的切空间会更高效\citep{rosen1960}。 + +一个更复杂的方法是设计一个不同的、无约束的优化问题,其解可以转化成原始\gls{constrained_optimization}问题的解。 +例如,我们要在$\Vx \in \SetR^2$中最小化$f(\Vx)$,其中$\Vx$约束为具有单位$L^2$范数。 +我们可以关于$\theta$最小化$g(\theta) = f([\cos \theta, \sin \theta]^\Tsp)$,最后返回$[\cos \theta, \sin \theta]$作为原问题的解。 +这种方法需要创造性;优化问题之间的转换必须专门根据我们遇到的每一种情况进行设计。 + +% -- 89 -- + +\firstacr{KKT}方法\footnote{\glssymbol{KKT}方法是\textbf{Lagrange乘子法}(只允许等式约束)的推广}是针对\gls{constrained_optimization}非常通用的解决方案。 +为介绍\glssymbol{KKT}方法,我们引入一个称为\firstgls{generalized_lagrangian}或\firstgls{generalized_lagrange_function}的新函数。 + +为了定义\ENNAME{Lagrangian},我们先要通过等式和不等式的形式描述$\SetS$。 +我们希望通过$m$个函数$g^{(i)}$和$n$个函数$h^{(j)}$描述$\SetS$,那么$\SetS$可以表示为$\SetS = \{ \Vx ~|~ \forall i, g^{(i)}(\Vx) = 0 ~\text{and}~ \forall j, h^{(j)}(\Vx) \leq 0 \}$。 +其中涉及$g^{(i)}$的等式称为\firstgls{equality_constraints},涉及$h^{(j)}$的不等式称为\firstgls{inequality_constraints}。 + +我们为每个约束引入新的变量$\lambda_i$和$\alpha_j$,这些新变量被称为\glssymbol{KKT}乘子。\gls{generalized_lagrangian}可以如下定义: +\begin{align} + L(\Vx, \Vlambda, \Valpha) = f(\Vx) + \sum_i \lambda_i g^{(i)}(\Vx) + \sum_j \alpha_j h^{(j)}(\Vx). +\end{align} + +现在,我们可以通过优化无约束的\gls{generalized_lagrangian}解决约束最小化问题。 +只要存在至少一个\gls{feasible}点且$f(\Vx)$不允许取$\infty$,那么 +\begin{align} + \underset{\Vx}{\min}~ \underset{\Vlambda}{\max}~ + \underset{\Valpha, \Valpha \geq 0}{\max} L(\Vx, \Vlambda, \Valpha) +\end{align} +与如下函数有相同的最优\gls{objective_function}值和最优点集$\Vx$ +\begin{align} + \underset{\Vx \in \SetS}{\min} f(\Vx). +\end{align} +这是因为当约束满足时, +\begin{align} + \underset{\Vlambda}{\max}~ + \underset{\Valpha, \Valpha \geq 0}{\max} L(\Vx, \Vlambda, \Valpha) = f(\Vx) +\end{align} +而违反任意约束时, +\begin{align} + \underset{\Vlambda}{\max} + \underset{\Valpha, \Valpha \geq 0}{\max} L(\Vx, \Vlambda, \Valpha) = \infty . +\end{align} +这些性质保证不可行点不会是最佳的,并且\gls{feasible}点范围内的最优点不变。 + +% -- 90 -- + +要解决约束最大化问题,我们可以构造$-f(\Vx)$的\gls{generalized_lagrange_function},从而导致以下优化问题: +\begin{align} + \underset{\Vx}{\min}~ \underset{\Vlambda}{\max} ~ + \underset{\Valpha, \Valpha \geq 0}{\max} + -f(\Vx) + \sum_i \lambda_i g^{(i)}(\Vx) + \sum_j \alpha_j h^{(j)}(\Vx). +\end{align} +我们也可将其转换为在外层最大化的一个问题: +\begin{align} + \underset{\Vx}{\max}~ \underset{\Vlambda}{\min}~ + \underset{\Valpha, \Valpha \geq 0}{\min} + f(\Vx) + \sum_i \lambda_i g^{(i)}(\Vx) - \sum_j \alpha_j h^{(j)}(\Vx). +\end{align} +\gls{equality_constraints}对应项的符号并不重要;因为优化可以自由选择每个$\lambda_i$的符号,我们可以随意将其定义为加法或减法, + +\gls{inequality_constraints}特别有趣。 +如果$h^{(i)}(\Vx^*)= 0$,我们就说说这个约束$h^{(i)}(\Vx)$是\textbf{活跃}(active)的。 +如果约束不是活跃的,则有该约束的问题的解与去掉该约束的问题的解至少存在一个相同的局部解。 +一个不活跃约束有可能排除其他解。 +例如,整个区域(代价相等的宽平区域)都是全局最优点的的凸问题可能因约束消去其中的某个子区域,或在非凸问题的情况下,收敛时不活跃的约束可能排除了较好的局部\gls{stationary_point}。 +然而,无论不活跃的约束是否被包括在内,收敛时找到的点仍然是一个\gls{stationary_point}。 +因为一个不活跃的约束$h^{(i)}$必有负值,那么$ + \underset{\Vx}{\min}~ \underset{\Vlambda}{\max}~ + \underset{\Valpha, \Valpha \geq 0}{\max} L(\Vx, \Vlambda, \Valpha) +$中的$\alpha_i = 0$。 +因此,我们可以观察到在该解中$\Valpha \odot \Vh(\Vx) = 0$。 +换句话说,对于所有的$i$, $\alpha_i \geq 0$或$ h^{(j)}(\Vx) \leq 0$在收敛时必有一个是活跃的。 +为了获得关于这个想法的一些直观解释,我们可以说这个解是由不等式强加的边界,我们必须通过对应的\glssymbol{KKT}乘子影响$\Vx$的解,或者不等式对解没有影响,我们则归零\glssymbol{KKT}乘子。 + +可以使用一组简单性质描述\gls{constrained_optimization}问题的最优点。 +这些性质称为\firstacr{KKT}条件\citep{Karush39,kuhn1951}。 +这些是确定一个点是最优点的必要条件,但不一定是充分条件。 +这些条件是: +\begin{itemize} + \item \gls{generalized_lagrangian}的\gls{gradient}为零。 + \item 所有关于$\Vx$和\glssymbol{KKT}乘子的约束都满足。 + \item \gls{inequality_constraints}显示的``互补松弛性'':$\Valpha \odot \Vh(\Vx) = 0$。 +\end{itemize} +有关\glssymbol{KKT}方法的详细信息,请参阅\cite{NumOptBook}。 + +% -- 91 -- + +\section{实例:线性最小二乘} +\label{sec:example_linear_least_squares} +假设我们希望找到最小化下式的$\Vx$的值 +\begin{align} + f(\Vx) = \frac{1}{2}\| \MA \Vx - \Vb \|_2^2 +\end{align} +专门线性代数算法能够高效地解决这个问题;但是,我们也可以探索如何使用基于\gls{gradient}的优化来解决这个问题,这可以作为这些技术是如何工作的一个简单例子。 + +首先,我们计算\gls{gradient}: +\begin{align} + \nabla_{\Vx} f(\Vx) = \MA^\Tsp (\MA \Vx - \Vb) = \MA^\Tsp \MA \Vx - \MA^\Tsp \Vb . +\end{align} + +然后,我们可以采用小的步长,按照这个\gls{gradient}下降。见算法|||c|||中的详细信息。 + +我们也可以使用\gls{newton_method}解决这个问题。 +因为在这个情况下真正的函数是二次的,\gls{newton_method}所用的二次近似是精确的,该算法会在一步后收敛到\gls{global_minimum}。 + +现在假设我们希望最小化同样的函数,但受 $\Vx^\Tsp \Vx \leq 1$ 的约束。 +要做到这一点,我们引入\ENNAME{Lagrangian} +\begin{align} + L(\Vx, \lambda) = f(\Vx) + \lambda (\Vx^\Tsp \Vx - 1). +\end{align} +现在,我们解决以下问题 +\begin{align} + \underset{\Vx}{\min}~ + \underset{\lambda, \lambda \geq 0}{\max} L(\Vx, \lambda) +\end{align} + +% -- 92 -- + +可以用\ENNAME{Moore-Penrose}伪逆:$\Vx = \MA^+ \Vb$找到无约束最小二乘问题的最小范数解。 +如果这一点是\gls{feasible},那么这也是约束问题的解。 +否则,我们必须找到约束是活跃的解。 +关于$\Vx$对\ENNAME{Lagrangian}微分,我们得到方程 +\begin{align} + \MA^\Tsp \MA \Vx - \MA^\Tsp \Vb + 2 \lambda \Vx = 0. +\end{align} +这就告诉我们,该解的形式将会是 +\begin{align} +\Vx = (\MA^\Tsp \MA + 2 \lambda \MI )^{-1} \MA^\Tsp \Vb. +\end{align} +$\lambda$的选择必须使结果服从约束。 +我们可以关于$\lambda$进行\gls{gradient}上升找到这个值。 +为了做到这一点,观察 +\begin{align} + \frac{\partial}{\partial \lambda} L(\Vx, \lambda) = \Vx^\Tsp \Vx - 1. +\end{align} +当$\Vx$的范数超过1时,该导数是正的,所以为了跟随\gls{derivative}上坡并相对$\lambda$增加\ENNAME{Lagrangian},我们需要增加$\lambda$。 +因为$\Vx^\Tsp \Vx$的惩罚系数增加了,求解关于$\Vx$的线性方程现在将得到具有较小范数的解。 +求解线性方程和调整$\lambda$的过程一直持续到$\Vx$具有正确的范数并且关于$\lambda$的\gls{derivative}是$0$。 + +本章总结了开发\gls{ML}算法所需的数学基础。 +现在,我们已经做好了建立和分析一些成熟学习系统的准备。 + +% -- 93 -- + diff --git a/Chapter7/regularization.tex b/Chapter7/regularization.tex new file mode 100644 index 0000000..559d803 --- /dev/null +++ b/Chapter7/regularization.tex @@ -0,0 +1,1270 @@ +% Translator: Shenjian Zhao +\chapter{\gls{DL}的正则化} +\label{chap:regularization_for_deep_learning} +\gls{ML}中的一个核心问题是设计不只在训练数据表现好,而且能在新输入上泛化的算法。 +在\gls{ML}中,许多策略被明确设计为以增大训练误差为代价来减少测试误差。 +这些策略统称为\gls{regularization}。 +正如我们会看到的,\gls{DL}工作者可以使用许多形式的\gls{regularization}。 +事实上,开发更有效的\gls{regularization}策略已成为本领域的主要研究工作之一。 + +第\ref{chap:machine_learning_basics}章介绍了\gls{generalization}、\gls{underfitting}、\gls{overfitting}、\gls{bias_sta}、\gls{variance}和\gls{regularization}的基本概念。 +如果你不熟悉这些概念,请参考该章节再继续阅读本章。 + +在本章中,我们会更详细地描述\gls{regularization},重点描述深度模型(或模块)的\gls{regularization}策略。 + +本章某些节涉及\gls{ML}中的标准概念。 +如果你已经熟悉了这些概念,可以随意跳过相关章节。 +然而,本章的大多数内容涉及这些基本概念到特定\gls{NN}的扩展。 + +在\ref{sec:regularization}节,我们将\gls{regularization}定义为``旨在减少学习算法的\gls{generalization}误差而不是训练误差的修改''。 +目前有许多\gls{regularization}策略。 +有些向\gls{ML}模型添加额外的约束,如增加对参数的限制。 +有些向\gls{objective_function}增加额外项,对应于参数值的软约束。 +如果仔细选择,这些额外的约束和惩罚可以改善模型在测试集上的表现。 +有时,这些约束和惩罚设计为编码特定类型的先验知识。 +其他时候,这些约束和惩罚的目的是表达对简单模型的一般偏好,以便提高\gls{generalization}能力。 +有时候,惩罚和约束对于确定欠定的问题是必要的。 +其他形式的\gls{regularization},如\gls{ensemble}方法,结合多个假说来解释训练数据。 + +% -- 221 -- + +在\gls{DL}的背景下,大多数\gls{regularization}策略都基于对\gls{estimator}进行\gls{regularization}。 +\gls{estimator}的\gls{regularization}以\gls{bias_sta}的增加换取\gls{variance}的减少。 +一个有效的\gls{regularization}是有利的``交易'',也就是能显著减少\gls{variance}而不过度增加\gls{bias_sta}。 +我们在第\ref{chap:machine_learning_basics}中讨论\gls{generalization}和\gls{overfitting}时,主要侧重模型族训练的3个情形:(1)不包括真实的数据生成过程——对应于\gls{underfitting}和\gls{bias_sta}引入,(2)匹配真实数据生成过程,(3)除了包含真实的数据生成过程,还包含了许多其他可能的生成过程——\gls{variance}(而不是\gls{bias_sta})主导的\gls{overfitting}。 +\gls{regularization}的目标是使模型从第三种情况进入到第二个情况。 + +在实践中,过于复杂的模型族不一定包括目标函数或真实数据生成过程,甚至近似的都不包含。 +我们几乎从来无法知晓真实数据的生成过程,所以我们永远不知道被估计的模型族是否包括生成过程。 +然而,\gls{DL}算法的大多数应用都是针对这样的领域,其中真实数据的生成过程几乎可以肯定是模型族之外。 +\gls{DL}算法通常应用于极为复杂的领域,如图像、音频序列和文本,本质上这些领域的真正生成过程涉及模拟整个宇宙。 +从某种程度上说,我们总是持方枘(数据生成过程)而欲内圆凿(我们的模型族)。 + +这意味着控制模型的复杂性不是找到合适规模的模型(带有正确的参数个数)这样一个简单的事情。 +相反,我们可能会发现,在实际的深度学习场景中我们几乎总是发现 +,最好的拟合模型(最小化\gls{generalization}误差的意义上)是一个适当\gls{regularization}的大型模型。 + +现在我们回顾几种创建这样的大型深度\gls{regularization}模型的策略。 + +% -- 222 -- + +\section{参数范数惩罚} +\label{sec:parameter_norm_penalties} +\gls{regularization}在\gls{DL}的出现前就已经应用了数十年。 +\gls{linear_model},如\gls{linear_regression}和\gls{logistic_regression}可以使用简单、直接有效的\gls{regularization}策略。 + +许多\gls{regularization}方法通过对\gls{objective_function}$J$添加一个参数范数惩罚$\Omega(\Vtheta)$,以限制模型(如\gls{NN}、\gls{linear_regression}或\gls{logistic_regression})的学习能力。 +我们将正则化后的\gls{objective_function}记为$\tilde{J}$: +\begin{align} + \tilde{J}(\Vtheta;\MX, \Vy) = J(\Vtheta;\MX, \Vy) + \alpha \Omega(\Vtheta) +\end{align} +其中$\alpha \in [0, \infty)$是权衡范数惩罚项$\Omega$和标准\gls{objective_function}$J(\MX;\Vtheta)$相对贡献的超参数。 +将$\alpha$设为0就是没有\gls{regularization}。 +越大的$\alpha$,对应于越多的\gls{regularization}惩罚。 + +当我们的训练算法最小化\gls{regularization}后的\gls{objective_function}$\tilde{J}$时,它会降低原始目标$J$关于训练数据的误差并同时减小参数$\Vtheta$的规模(或在某些衡量下参数子集的规模)。 +参数规范$\Omega$的不同选择可以导致不同优先解。 +在本节中,我们讨论各种范数惩罚模型参数时的影响。 + +在探究不同范数的\gls{regularization}表现之前,我们需要提一下,在神经网络中我们通常只对每一层仿射变换的\emph{权重}做惩罚而不对\gls{bias_aff}做正则惩罚。 +通常使用比拟合权重更少的数据,就能精确拟合\gls{bias_aff}。 +每个权重指定两个变量如何相互作用。 +需要在各种条件下观察这两个变量才能拟合权重。 +而每个\gls{bias_aff}仅控制一个单变量。 +这意味着,我们不对其进行\gls{regularization}也不会引起太大\gls{variance}。 +另外,\gls{regularization}的\gls{bias_aff}参数可能会引起显著的\gls{underfitting}。 +因此,我们使用向量$\Vw$表示所有应受范数惩罚影响的权重,而向量$\Vtheta$表示所有参数(包括$\Vw$和不用\gls{regularization}的参数)。 + +在\gls{NN}的情况下,有时希望对网络的每个层使用单独的惩罚,并分配不同的$\alpha$系数。 +搜索多个正确超参数的代价很大,因此在所有层使用相同\gls{weight_decay}以减少搜索空间是合理的。 + +% -- 223 -- + +\subsection{$L^2$ 参数\gls{regularization}} +\label{sec:l2_parameter_regularization} +在\ref{sec:capacity_overfitting_and_underfitting}节中我们已经看到最简单和最常见的参数范数惩罚是,通常被称为\firstgls{weight_decay}的$L^2$参数范数惩罚。 +这个\gls{regularization}策略通过向\gls{objective_function}添加一个正则项$\Omega(\Vtheta) = \frac{1}{2} \norm{\Vw}_2^2$,使权重更加接近原点\footnote{更一般地,我们可以将参数\gls{regularization}为接近空间中的任意特定点,令人惊讶的是仍有\gls{regularization}效果,并且更接近真实值将获得更好的结果。 +当我们不知道正确的值应该是正还是负,零是有意义的默认值。 +由于将模型参数\gls{regularization}为零的情况更常见,我们将关注这种特殊情况。}。 +在其他学术圈,$L^2$也被称为\gls{ridge_regression}或\gls{tikhonov_regularization}。 + +我们可以通过研究\gls{regularization}化后\gls{objective_function}的\gls{gradient}洞察一些\gls{weight_decay}的\gls{regularization}表现。 +为了简单起见,我们假定其中没有\gls{bias_aff}参数,因此$\Vtheta$就是$\Vw$。 +这样一个模型具有以下总的\gls{objective_function}: +\begin{align} + \tilde{J}(\Vw;\MX, \Vy) =\frac{\alpha}{2} \Vw^\top \Vw + J(\Vw;\MX, \Vy), +\end{align} +与之对应的\gls{gradient}为 +\begin{align} + \nabla_{\Vw} \tilde{J}(\Vw;\MX,\Vy) =\alpha \Vw + \nabla_{\Vw} J(\Vw;\MX, \Vy). +\end{align} +使用单步\gls{gradient}下降更新的权重,即执行以下更新: +\begin{align} + \Vw \leftarrow \Vw - \epsilon(\alpha \Vw + \nabla_{\Vw} J(\Vw;\MX, \Vy)). +\end{align} +换种写法就是: +\begin{align} + \Vw \leftarrow (1-\epsilon \alpha)\Vw - \epsilon \nabla_{\Vw} J(\Vw;\MX, \Vy). +\end{align} +我们可以看到,在加入\gls{weight_decay}后会修改学习规则——在每一步执行通常的\gls{gradient}更新之前对权重向量乘以一个常数因子以收缩权重向量。 +这是单一步骤发生的变化。 +但是,在训练的整个过程会发生什么? + +% -- 224 -- + +我们进一步简化分析,令$\Vw^*$为没有\gls{regularization}的\gls{objective_function}取得最小训练误差的权重向量,即$\Vw^* = \argmin_{\Vw} J(\Vw)$, 并在$\Vw^*$的邻域作二次近似。 +如果\gls{objective_function}确实是二次的(如以均方误差拟合\gls{linear_regression}模型的情况下),则该近似是完美的。 +近似的$\hat J(\Vtheta)$如下 +\begin{align} + \hat J(\Vtheta) = J(\Vw^*) + \frac{1}{2}(\Vw - \Vw^*)^\top \MH (\Vw - \Vw^*), +\end{align} +其中$\MH$是$J$在$\Vw^*$处计算的\gls{hessian}矩阵(关于$\Vw$)。 +因为$\Vw^*$被定义为最小,即梯度消失为0,所以该二次近似中没有一阶项。 +同样,因为$\Vw^*$是$J$的一个最小点,我们可以得出$\MH$是半正定的结论。 + +当$\hat J$取最小时,其梯度 +\begin{align} +\label{eq:gradient} + \nabla_{\Vw} \hat{J}(\Vw) = \MH (\Vw - \Vw^*) +\end{align} +为0。 + +为了研究\gls{weight_decay}的影响,我们将\gls{weight_decay}的梯度加到式\ref{eq:gradient}中。 +现在我们要找\gls{regularization}版本$\hat J$的最小值。 +我们使用变量$\tilde{\Vw}$表示最小值的位置: +\begin{align} + \alpha \tilde{\Vw} + \MH (\tilde{\Vw} - \Vw^*) = 0 \\ + (\MH + \alpha \MI) \tilde{\Vw} = \MH \Vw^* \\ + \tilde{\Vw} = (\MH + \alpha \MI)^{-1} \MH \Vw^* \label{eq:final_w} + \end{align} + +当$\alpha$趋向于0, \gls{regularization}的解$\tilde{\Vw}$趋向$\Vw^*$。 +那么当$\alpha$增加时会发生什么? +因为$\MH$是实对称的,我们可以将其分解为一个对角矩阵$\VLambda$和一个正交特征向量$\MQ$,并且$\MH = \MQ \VLambda \MQ^\top$。 +将其应用于式\ref{eq:final_w},可得: +\begin{align} + \tilde \Vw &= ( \MQ \VLambda \MQ^\top + \alpha \MI)^{-1} \MQ \VLambda \MQ^\top \Vw^* \\ + &= [ \MQ( \VLambda+ \alpha \MI) \MQ^\top ]^{-1} \MQ \VLambda \MQ^\top \Vw^* \\ + &= \MQ( \VLambda+ \alpha \MI)^{-1} \VLambda \MQ^\top \Vw^*. \label{eq:713L2} +\end{align} +我们可以看到\gls{weight_decay}的效果是沿着由$\MH$的特征向量所定义的轴缩放$\Vw^*$。 +具体来说,与$\MH$第$i$个特征向量对齐的$\Vw^*$的分量根据$\frac{\lambda_i}{\lambda_i + \alpha}$因子缩放。 +(不妨查看|||c|||回顾这种缩放的原理)。 + +沿着$\MH$特征值较大的方向(如$\lambda_i \gg \alpha$)\gls{regularization}的影响较小。 +而$\lambda_i \ll \alpha$的分量将会被缩小到几乎为零。 +这种效应在图\ref{fig:chap7_reg_l2}示出。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/reg_l2}} +\fi +\caption{TODO} +\label{fig:chap7_reg_l2} +\end{figure} + +% -- 225 -- + +只有显著减小\gls{objective_function}方向的参数会被保留得相对完好。 +无助于\gls{objective_function}减小的方向,即\gls{hessian}的小的特征值告诉我们,在这个方向的移动不会显著增加\gls{gradient}。 +对应于这种不重要方向的分量会随训练过程中使用的\gls{regularization}而衰减掉。 + + +目前为止,我们讨论了\gls{weight_decay}对优化一个抽象通用的二次\gls{cost_function}的影响。 +这些影响怎么影响具体的机器学习? +我们可以研究\gls{linear_regression},其真实\gls{cost_function}是二次的,因此适合目前为止我们使用的分析。 +再次应用分析,我们将能够获得相同结果的一个特例,但这次通过训练数据的术语表述。 +\gls{linear_regression}的\gls{cost_function}是平方误差之和: +\begin{align} + (\MX \Vw - \Vy)^\top (\MX \Vw - \Vy). +\end{align} +我们添加$L^2$正则项后,\gls{objective_function}变为 +\begin{align} + (\MX \Vw - \Vy)^\top (\MX \Vw - \Vy) + \frac{1}{2}\alpha \Vw^\top \Vw. +\end{align} +这会将普通方程的解从 +\begin{align} +\label{eq:716w} + \Vw = (\MX^\top \MX)^{-1} \MX^\top \Vy +\end{align} +变为 +\begin{align} +\label{eq:717mw} + \Vw = (\MX^\top \MX + \alpha \MI)^{-1} \MX^\top \Vy +\end{align} +式\ref{eq:716w}中的矩阵$\MX^\top\MX$与\gls{covariance}矩阵$\frac{1}{m}\MX^\top\MX$成正比。 +$L^2$正则项将这个矩阵替换为式\ref{eq:717mw}中的$ (\MX^\top \MX + \alpha \MI)^{-1}$ +这个新矩阵与原来的是一样的,不同的仅仅是在对角加了$\alpha$。 +这个矩阵的对角项对应于每个输入特征的\gls{variance}。 +我们可以看到,$L^2$\gls{regularization}能让学习算法``感知''到具有较高方差的输入$\Vx$, 因此与输出目标的\gls{covariance}较小(相对增加方差)的特征的权重将会被收缩。 + +\subsection{$L^1$ 参数\gls{regularization}} +\label{sec:l1_regularization} +$L^2$\gls{weight_decay}是\gls{weight_decay}最常见的形式,还有其他的方法来惩罚模型参数的大小。 +另一种选择是使用$L^1$\gls{regularization}。 + +对模型参数$\Vw$的$L^1$\gls{regularization}形式定义为: +\begin{align} + \Omega(\Vtheta) = \norm{ \Vw }_1 = \sum_i | w_i |, + \end{align} +即各个参数的绝对值之和\footnote{如同$L^2$\gls{regularization},我们能将参数\gls{regularization}其他非零值$\Vw^{(o)}$。在这种情况下,$L^1$\gls{regularization}将会引入不同的项$\Omega(\Vtheta)= +\|\Vw - \Vw^{(o)} \|_1 = \sum_i | w_i - w_i^{(o)} |$。}。 +现在我们将讨论$L^1$\gls{regularization}对简单\gls{linear_regression}模型的影响, 与分析$L^2$\gls{regularization}时一样不考虑\gls{bias_aff}参数。 +我们尤其感兴趣的是找出$L^1$和$L^2$\gls{regularization}之间的差异。 +与$L^2$\gls{weight_decay}类似,$L^1$\gls{weight_decay}的强度也可以通过缩放惩罚项$\Omega$的正超参数$\alpha$控制。 +因此,\gls{regularization}的\gls{objective_function}$\tilde{J}(\Vw;\MX, \Vy)$如下给出 +\begin{align} +\tilde{J}(\Vw;\MX, \Vy) = \alpha \| \Vw \|_1 + J(\Vw;\MX, \Vy) +\end{align} +对应的梯度(实际上是次梯度): +\begin{align} +\label{eq:subgradient} + \nabla_{\Vw} \tilde{J}(\Vw; \MX, \Vy) = \alpha~ \text{sign}(\Vw) + \nabla_{\Vw} J(\Vw; \MX, \Vy) +\end{align} +其中$\text{sign}(\Vw)$只是简单地取$\Vw$各个元素的符号。 + +% -- 227 -- + +观察式\ref{eq:subgradient},我们立刻发现$L^1$的\gls{regularization}效果与$L^2$大不一样。 +具体来说,我们可以看到\gls{regularization}对\gls{gradient}的贡献不再是线性地缩放每个$w_i$;而是用与$\text{sign}(w_i)$同号的常数因子。 +这种形式的\gls{gradient}的一个后果是,我们不一定能得到$J(\MX, \Vy;\Vw)$二次近似的直接算术解($L^2$\gls{regularization}时可以)。 + +我们可以通过\gls{taylor}级数表示\gls{cost_function}是二次的简单\gls{linear_model}。 +或者我们可以设想,这是一个逼近更复杂模型的\gls{cost_function}的截断\gls{taylor}级数。 +在这个设定下,\gls{gradient}由下式给出 +\begin{align} + \nabla_{\Vw} \hat{J}(\Vw) = \MH (\Vw - \Vw^*), +\end{align} +同样,$\MH$是$J$在$\Vw^*$处计算的\gls{hessian}矩阵(关于$\Vw$)。 + +由于$L^1$惩罚项在满的、一般的\gls{hessian}的情况下,无法得到直接干净的代数表达式,因此我们将进一步简化假设\gls{hessian}是对角的,即$\MH = \text{diag}([H_{1,1},\dots, H_{n,n}])$,其中每个$H_{i,i}>0$。 +如果用于\gls{linear_regression}问题的数据已被预处理(如可以使用PCA),去除了输入特征之间的相关性,那么这一假设成立。 + +我们可以将$L^1$\gls{regularization}目标函数的二次近似分解成一个关于参数的求和: +\begin{align} + \hat J(\Vw; \MX, \Vy) = J(\Vw^*; \MX, \Vy) + \sum_i \Bigg [\frac{1}{2} H_{i,i} (w_i - w_i^*)^2 + + \alpha |w_i| \Bigg]. +\end{align} +有解析解(对每一维$i$)可以最小化这个近似\gls{cost_function},如下列形式: +\begin{align} +w_i = \text{sign}(w_i^*) \max\{ |w_i^*| - \frac{\alpha}{H_{i,i}} , 0\} +\end{align} +考虑所有$i$且$w_i^* > 0$的情形,会有两种可能输出: +\begin{enumerate} +\item $w_i^* \leq \frac{\alpha}{H_{i,i}}$的情况。 +\gls{regularization}后的目标中$w_i$的最优值是$w_i = 0$。 +这是因为在方向$i$上$J(\Vw; \MX, \Vy) $对于$ \hat J(\Vw; \MX, \Vy)$的贡献受到压制,$L^1$\gls{regularization}项将$w_i$推向0。 +\item $w_i^* > \frac{\alpha}{H_{i,i}}$的情况。在这种情况,\gls{regularization}不会将$w_i$的最优值移向0,而仅仅在那个方向移动$\frac{\alpha}{H_{i,i}}$的距离。 +\end{enumerate} +$w_i^* < 0$的情况与之类似,但是$L^1$惩罚项使$w_i$更接近0(减少$ \frac{\alpha}{H_{i,i}}$)或者为0。 + +相比$L^2$\gls{regularization},$L^1$\gls{regularization}会产生更\firstgls{sparse}的解。 +在此\gls{sparse}性指的是一些参数具有0的最优值。 +$L^1$\gls{regularization}的\gls{sparse}性是相比$L^2$\gls{regularization}是质的不同。 +式\ref{eq:713L2}给出了$L^2$\gls{regularization}的解$\tilde \Vw$。 +如果我们使用$L^1$\gls{regularization}分析时\gls{hessian}$\MH$为对角正定的假设,重新考虑这个等式,我们发现 +$\tilde{w_i} = \frac{H_{i,i}}{H_{i,i} + \alpha} w_i^*$。 +如果$w_i^*$不是0,那$\tilde{w_i}$也会保持非0。 +这表明$L^2$\gls{regularization}不会导致参数变得\gls{sparse},而$L^1$\gls{regularization}有可能通过足够大的$\alpha$实现\gls{sparse}。 + +由$L^1$\gls{regularization}导出的\gls{sparse}性质已经被广泛地用作\firstgls{feature_selection}机制。 +\gls{feature_selection}从可用的特征子集选择应该使用的子集,简化了\gls{ML}问题。 +特别是著名的LASSO\citep{Tibshirani95}(Least Absolute Shrinkage and +Selection Operator)模型将$L^1$惩罚和\gls{linear_model}结合,并使用最小二乘\gls{cost_function}。 +$L^1$惩罚使部分子集的权重为零,表明相应的特征可以被安全地忽略。 + +在\ref{sec:maximum_a_posteriori_estimation}节,我们看到许多\gls{regularization}策略可以被解释为\glssymbol{MAP}贝叶斯推断, + 特别是$L^2$\gls{regularization}相当于权重是高斯先验的\glssymbol{MAP}贝叶斯推断。 + 对于$L^1$\gls{regularization}, +用于\gls{regularization}一个\gls{cost_function}的惩罚项$\alpha \Omega(\Vw) = \alpha \sum_i |w_i |$与先验是各向同性拉普拉斯分布|||c|||($\Vw \in \SetR^n$)的\glssymbol{MAP}贝叶斯推断的最大化对数先验项是等价的: +\begin{align} +\log p(\Vw) = \sum_i \log ~\text{Laplace}(w_i;0,\frac{1}{\alpha}) = + -\alpha \norm{\Vw}_1 + n \log \alpha - n \log 2. +\end{align} +因为是关于$\Vw$最大化进行学习,我们可以忽略$\log \alpha - \log 2$项,因为它们与$\Vw$无关。 + + % -- 229 -- + + \section{作为约束的范数惩罚} + \label{sec:7.2} +考虑通过参数范数\gls{regularization}的\gls{cost_function}: +\begin{align} + \tilde{J}(\Vtheta;\MX, \Vy) = J(\Vtheta;\MX, \Vy) + \alpha \Omega(\Vtheta) +\end{align} + +回顾\ref{sec:constrained_optimization}节我们可以通过构造一个\gls{generalized_lagrange_function}来最小化受约束的函数,即在原始\gls{objective_function}加上一系列惩罚项。 +每个惩罚是一个系数之间的乘积,称为\firstgls{KKT}乘子,以及一个表示约束是否满足的函数。 +如果我们想约束$\Omega(\Vtheta)$小于某个常数$k$,我们可以构建\gls{generalized_lagrange_function} +\begin{align} + \CalL(\Vtheta, \alpha; \MX, \Vy) = J(\Vtheta; \MX, \Vy) + \alpha (\Omega(\Vtheta) - k). +\end{align} + +这个约束问题的解由下式给出 +\begin{align} + \Vtheta^* = \underset{\Vtheta}{ \argmin} \underset{\alpha, \alpha>0}{\max} \CalL(\Vtheta, \alpha). +\end{align} + +如\ref{sec:constrained_optimization}节中描述,解决这个问题需要同时改变$\Vtheta$和$\alpha$。 +\ref{sec:example_linear_least_squares}给出了一个带$L^2$约束的\gls{linear_regression}实例。 +许多不同的程序是可能的,有些可能会利用\gls{GD}而其他可能使用\gls{gradient}为0的解析解,但在所有程序中$\alpha$在$\Omega(\Vtheta) > k$时必须增加,在$\Omega(\Vtheta) < k$时必须减小。 +所有正的$\alpha$鼓励$\Omega(\Vtheta)$收缩。 +最佳值$\alpha^*$也将鼓励$\Omega(\Vtheta)$收缩,但不会如$\Omega(\Vtheta)$小于$k$时那么强烈。 + +为了洞察约束的影响,我们可以固定$\alpha^*$,把这个问题看成只跟$\Vtheta$有关的函数: +\begin{align} + \Vtheta^* = \underset{\Vtheta}{ \argmin} ~\CalL(\Vtheta, \alpha) = + \underset{\Vtheta}{ \argmin}~ + J(\Vtheta; \MX, \Vy) + \alpha^* \Omega(\Vtheta) +\end{align} +这和最小化$\tilde J$的\gls{regularization}训练问题是完全一样的。 +因此,我们可以把参数范数惩罚看作对权重强加的约束。 +如果$\Omega$是$L^2$范数,那么权重就是被约束在一个$L^2$球中。 +如果$\Omega$是$L^1$范数,那么权重就是被约束在一个$L^1$范数限制的区域中。 +通常我们不知道通过使用\gls{weight_decay}的系数$\alpha^*$约束的区域大小,因为$\alpha^*$的值不直接告诉我们$k$的值。 +原则上可以解得$k$,但$k$和$\alpha^*$之间的关系取决于的$J$的形式。 +虽然我们不知道约束区域的确切大小,但我们可以通过增加或者减小$\alpha$来大致扩大或收缩约束区域。 +较大的$\alpha$,将导致一个较小的约束区域。 +较小的$\alpha$,将导致一个较大的约束区域。 + +% -- 230 -- + +有时候,我们希望使用显式的限制,而不是惩罚。 +如\ref{sec:constrained_optimization}所描述,我们能修改下降算法(如\gls{SGD}算法),使其先计算$J(\Vtheta)$的下降步,然后将$\Vtheta$投影到满足$\Omega(\Vtheta) < k$的最近点。 +如果我们知道什么样的$k$是合适的,而不想花时间寻找对应于此$k$处的$\alpha$值,这会非常有用。 + +另一个使用显式约束和重投影而不是使用惩罚强加约束的原因是惩罚可能导致非凸优化程序而陷入局部极小(对应于小的$\Vtheta$)。 +当训练\gls{NN},这通常表现为训练带有几个``死单元''的\gls{NN}。 +这些单元不会对网络学到的函数的行为有太大贡献,因为进入或离开他们的权重都非常小。 +当使用权重范数的惩罚训练,这些配置可以是局部最优,即使可能通过增加权重以显著减少$J$。 +通过重投影实现的显式约束可以在这些情况下工作得更好,因为它们不鼓励权重接近原点。 +通过重投影实现的显式约束只在权重变大并试图离开限制区域时产生作用。 + +最后,因为重投影的显式约束还对优化过程增加了一定的稳定性,因此是另一个好处。 +当使用较高的学习率时,很可能进入的正反馈,即大的权重诱导大\gls{gradient},然后诱发权重的大更新。 +如果这些更新持续增加权重的大小,$\Vtheta$就会迅速增大,直到离原点很远而发生溢出。 +重投影的显式约束可以防止这种反馈环引起的权重无限制持续增加。 +\cite{Hinton-et-al-arxiv2012}建议结合使用约束和高学习速率,能更快地参数空间探索,并保持一定的稳定性。 + +% -- 231 -- + +\cite{Hinton-et-al-arxiv2012}尤其推荐由\cite{Srebro05}引入的策略:约束\gls{NN}层的权重矩阵每列的范数,而不是限制整个权重矩阵的\ENNAME{Frobenius}范数。 +分别限制每一列的范数可以防止某一\gls{hidden_unit}有非常大的权重。 +如果我们将此约束转换成\ENNAME{Lagrange}函数中的一个惩罚,这将与$L^2$ \gls{weight_decay}类似但每个\gls{hidden_unit}的权重都具有单独的\glssymbol{KKT}乘子。 +每个\glssymbol{KKT}乘子分别会被动态更新,以使每个\gls{hidden_unit} 服从约束。 +在实践中,列范数的限制总是通过重投影的显式约束实现。 + +\section{\gls{regularization}和欠约束问题} +\label{sec:regularization_and_under_constrained_problems} +在某些情况下,为了正确定义\gls{ML}问题,\gls{regularization}是必要的。 +\gls{ML}中许多\gls{linear_model},包括\gls{linear_regression}和PCA,都依赖于求逆矩阵$\MX^\top\MX$。 +只要$\MX^\top\MX$是奇异的这就是不可能的。 +每当数据生成分布的一些方向上真的没有差异时,或因为例子较少(即相对输入特征,$\MX$的列来说)而在一些方向没有观察到\gls{variance},这个矩阵都是奇异的。 +在这种情况下,\gls{regularization}的许多形式对应于求逆$\MX^\top\MX + \alpha \MI$。 +这个\gls{regularization}矩阵可以保证是可逆的。 + +相关矩阵可逆时,这些线性问题有封闭形式的解。 +没有闭合形式解的问题也可能是欠定。 +一个例子是应用于线性可分问题的\gls{logistic_regression}。 +如果权重向量$\Vw$是能够实现完美分类,那么$2 \Vw$也以较高似然实现完美分类。 +类似\gls{SGD}的迭代优化算法将持续增加$\Vw$的大小,理论上将永远不会停止。 +在实践中,数值实现的\gls{GD}最终会达到导致数值溢出的超大权重,此时的行为将取决于程序员如何处理这些不是真正数字的值。 + +大多数形式的\gls{regularization}能够保证应用于欠定问题的迭代方法收敛。 +例如,当似然的斜率等于\gls{weight_decay}的系数时, \gls{weight_decay}将导致\gls{GD}不再增加权重的大小。 + +使用\gls{regularization}来解决欠定问题的想法超出了\gls{ML}范畴。 +同样的想法在几个基本线性代数问题中也非常有用。 + +% -- 232 -- + +正如我们在\ref{sec:the_moore_penrose_pseudoinverse}节看到,我们可以使用\ENNAME{Moore-Penrose}求解欠定线性方程。 +回想$\MX$伪逆$\MX^+$的一个定义: +\begin{align} +\label{eq:729pseudo} + \MX^+ = \lim_{\alpha \searrow 0} (\MX^\top \MX + \alpha \MI)^{-1}\MX^\top. +\end{align} +现在我们可以将式\ref{eq:729pseudo}看作执行具有\gls{weight_decay}的\gls{linear_regression}。 +具体来说,当\gls{regularization}系数趋向0时,式\ref{eq:729pseudo}是式\ref{eq:717mw}的极限。 +因此,我们可以将伪逆解释为使用\gls{regularization}来稳定欠定问题。 + + +\section{数据集增强} +\label{sec:dataset_augmentation} +让\gls{ML}模型泛化得更好的最好办法是用更多的数据来训练。 +当然,在实践中,我们拥有数据量是有限的。 +解决这个问题的一种方法是创建假数据并把它添加到训练集。 +对于一些\gls{ML}任务,创造新的假数据是相当简单。 + +对分类来说这种方法是最简单的。 +分类器需要一个复杂的高维输入$\Vx$,并用单一类别的身份$y$总结$\Vx$。 +这意味着分类面临的一个主要任务是要对各种各样的变换保持不变。 +我们可以轻易通过转换训练集中的$\Vx$来生成新的$(\Vx, y)$对。 + +这种方法对于其他许多任务来说并不那么容易。 +例如,在一个密度估计任务中的产生新的假数据是困难的,除非我们已经解决了密度估计问题。 + +数据集增强对一个具体的分类问题来说是一个特别有效的方法:对象识别。 +图像是高维的并包括各种巨大的变化因素,其中有许多可以容易地模拟。 +即使模型已使用卷积和\gls{pooling}技术(\ref{chap:convolutional_networks})对部分平移保持不变,沿训练图像每个方向平移几个像素的操作通常可以大大改善泛化。 +许多其他操作如旋转图像或缩放图像也已被证明非常有效。 + +我们必须要小心,不能应用改变正确类别的转换。 +例如,光学字符识别任务需要认识``b''和``d''以及``6''和``9''的区别,所以对这些任务来说,水平翻转和旋转$180^{\circ}$并不是适当的数据集增强方式。 + +% -- 233 -- + +能保持我们希望的分类不变,但不容易执行的转换也是存在的。 +例如,平面外绕轴转动难以通过简单的几何运算在输入像素上实现。 + +数据集增强对语音识别任务也是有效的\citep{Jaitly_VTLP_2013}。 + +在\gls{NN}的输入层注入噪声\citep{SietsmaDow91}也可以被看作是数据增强的一种形式。 +对于许多分类甚至一些回归任务,即使小的随机噪声被加到输入,任务仍应该是能解决的。 +然而 ,\gls{NN}被证明对噪声不是非常健壮\citep{TangElias10}。 +改善\gls{NN}健壮性的方法之一是简单地将随机噪声施加到其输入再进行训练。 +输入噪声注入是一些无监督学习算法的一部分,如降噪\gls{AE}\citep{VincentPLarochelleH2008}。 +当噪声被施加到\gls{hidden_unit}也是可行的,这可以被看作是在多个抽象层上进行的数据集增强。 +\cite{Poole14}最近表明,噪声的幅度被细心调整后,该方法是非常高效的。 +\gls{dropout},一个将在\ref{sec:dropout}节描述的强大的\gls{regularization}策略,可以被看作是通过\emph{乘}噪声来构建新输入的过程。 + +当比较\gls{ML}基准测试的结果时,将其采取的数据集增强的影响考虑在内是很重要的。 +通常情况下,人工设计的数据集增强方案可以大大减少\gls{ML}技术的泛化误差。 +将一个\gls{ML}算法的性能与另一个进行对比时,对照实验是必要的。 +当比较\gls{ML}算法A和\gls{ML}算法B时,应该确保这两个算法使用同一个人工设计的数据集增强方案进行评估。 +假设算法A在没有数据集增强时表现不佳,而B结合大量人工转换的数据后表现良好。 +在这样的情况下,很可能是合成转化引起了性能改进,而不是\gls{ML}算法B。 +有时候,确定实验是否已经适当控制需要主观判断。 +例如,噪声注入输入的\gls{ML}算法是执行数据集增强的一种形式。 +通常,普适操作(例如,向输入添加高斯噪声)被认为是\gls{ML}算法的一部分, +而特定于一个应用邻域(如随机地裁剪图像)的操作被认为是独立的预处理步骤。 + +% -- 234 -- + +\section{噪声鲁棒性} +\label{sec:noise_robustness} + +\ref{sec:dataset_augmentation}节已经将噪声作用于输入的数据集增强策略。 +对于某些模型,在模型的输入加上方差极小的噪音等价于对权重施加范数惩罚\citep{Bishop1995,bishop95training}。 +在一般情况下,噪声注入远远比简单地收缩参数强大,特别是噪声被添加到\gls{hidden_unit}时。 +向\gls{hidden_unit}添加噪音是值得单独讨论重要的话题;在\ref{sec:dropout}节所述\gls{dropout}算法这种做法主要发展方向。 + +另一种\gls{regularization}模型的噪声使用方式是将其加到的权重。 +这项技术主要被用于\gls{RNN}的情况下\citep{JimGilesHorne1996,Graves-2011}。 +这可以解释为一个关于权重的贝叶斯\gls{inference}的随机实现。 +使用贝叶斯处理学习过程将权重视为不确定的,且能通过概率分布表示的这种不确定性。 +向权重添加噪声是反映这种不确定的一种实用的随机方法。 + +在某些假设下,施加于权重的噪声可以被解释为与更传统\gls{regularization}形式等同,鼓励要学习函数的稳定性。 +我们研究回归的情形,也就是训练一个将一组特征$\Vx$映射成一个标量的函数$\hat y(\Vx)$,并使用最小二乘\gls{cost_function}衡量模型预测值$\hat y(\Vx)$与真实值$y$的误差: +\begin{align} + J = \SetE_{p(x,y)}[(\hat y(\Vx) - y)^2]. +\end{align} +训练集包含$m$对标注样例$\{(\Vx^{(1)}, y^{(1)}),\dots,(\Vx^{(m)}, y^{(m)})\}$ + +现在我们假设我们在对每个输入表示上添加网络权重的随机扰动$\epsilon_{\Vw} \sim \CalN(\Vepsilon;0, \eta\MI )$ +想象我们有一个标准的$l$层MLP。 +我们将扰动模型记为$\hat y_{\epsilon_{\MW}} (\Vx)$。 +尽管有噪声的注入,我们仍对减少网络输出误差的平方感兴趣。 +因此目标函数变为: +\begin{align} + \tilde J_{\MW} &= \SetE_{p(\Vx,y,\epsilon_{\MW})}[(\hat y_{\epsilon_{\MW}}(\Vx) - y)^2] \\ + &= \SetE_{p(\Vx,y,\epsilon_{\MW})}[\hat y_{\epsilon_{\MW}}^2(\Vx) - 2y\hat y_{\epsilon_{\MW}} + (\Vx)+ y^2] +\end{align} + +对于小的$\eta$,最小化带权重噪声(方差为$\eta \MI$)的$J$等同于最小化附加上\gls{regularization}项的$J$: +$ \eta \SetE_{p(\Vx,y)}[\norm{\nabla_{\MW}~\hat y(\Vx)}^2]$。 +这种形式的\gls{regularization}鼓励参数进入权重小扰动对输出相对影响较小的参数空间区域。 +换句话说,它推动模型进入对权重小的变化相对不敏感的区域,找到的点不只是极小点,还是由平坦区域所包围的最小点\citep{Hochreiter95}。 +在简化的线性回归(例如,$\hat y(\Vx) = \Vw^\top \Vx + b$),正则项退化为$ \eta \SetE_{p(\Vx)}[\norm{\Vx}^2]$,这与 +函数的参数无关,因此不会对$\tilde J_{\Vw}$关于模型参数的梯度有贡献。 + +% -- 235 -- + +\subsection{向输出目标注入噪声} +\label{sec:injecting_noise_at_the_output_targets} +大多数数据集的$y$标签都有一定错误。 +当$y$是错误的,那对最大化$\log p(y | \Vx)$会是有害的。 +为了防止这一点的一种方法是显式地对标签上的噪声进行建模。 +例如,我们可以假设,对于一些小常数$\epsilon$,训练集标记$y$是正确的概率是$1-\epsilon$,任何其他可能的标签可能是正确的。 +这个假设很容易就能解析地与\gls{cost_function}结合,而不用显式地采噪声样本。 +例如, \textbf{标签平滑}(label smoothing)基于$k$个输出的\gls{softmax},把明确分类0和1替换成$\frac{\epsilon}{k-1}$和$1-\epsilon$,对模型进行\gls{regularization}。 +标准交叉熵损失可以用在这些非确切目标的输出上。 +使用\gls{softmax}和明确目标的最大似然学习可能永远不会收敛—— +\gls{softmax}永远无法真正预测0概率或1概率,因此它会继续学习越来越大的权重,使预测更极端。 +使用如\gls{weight_decay}等其他\gls{regularization}策略能够防止这种情况。 +标签平滑的优势是能防止模型追求明确概率而不妨碍正确分类。 +这种策略自20世纪80年代就已经被使用,并在现代神经网络继续保持显著特色\citep{Szegedy-et-al-2015}。 + +% -- 236 -- + +\section{半监督学习} +\label{sec:semi_supervised_learning} +在半监督学习的框架下,$P(\RVx)$产生的未标记样本和$P(\RVx, \RVy)$中的标记样本都用于估计$P(\RVy | \RVx)$或者根据$\RVx$预测$\RVy$。 + +在\gls{DL}的背景下,半监督学习通常指的是学习一个\gls{representation}$h = f(\Vx)$。 +学习\gls{representation}的目标是使相同类中的\gls{example}有类似的表示。 +无监督学习可以为如何在\gls{representation}空间聚集\gls{example}提供有用的线索。 +在输入空间紧密聚集的\gls{example}应该被映射到类似的表示。 +在新空间上的线性分类器在许多情况下可以达到较好的泛化\citep{Belkin+Niyogi-2002,Chapelle+al-2003}。 +这种方法的长期存在的一个变种是应用主成分分析作为分类前(在投影后的数据上分类)的预处理步骤。 + +我们可以构建一个模型,其中生成模型$P(\RVx)$或$P(\RVx, \RVy)$与判别模型$P(\RVy | \RVx)$共享参数,而不用将无监督和监督部分分离。 +可以对监督\gls{criterion}$-\log P(\Vy | \Vx)$与无监督或生成的\gls{criterion}(如$-\log P(\Vx)$或$-\log P(\Vx, \Vy)$)进行权衡。 +生成模型\gls{criterion}表达了对监督学习问题解的特殊形式的先验知识\citep{LasserreJ2006},即$P(\RVx)$的结构通过某种共享参数的方式连接到$P(\RVy | \RVx)$。 +通过控制在总\gls{criterion}中的生成\gls{criterion},我们可以找到比纯生成或纯判别训练\gls{criterion}更好的权衡\citep{LasserreJ2006,Larochelle2008}。 + +\cite{Russ+Geoff-nips-2007}描述了一种学习回归内核机中内核函数的方法,其中建模的$P(\RVx)$时使用的未标记的样本大大提高了$P(\RVy | \RVx)$。 + +更多半监督学习的信息,请参阅\cite{SSL-Book-2006}。 + +\section{多任务学习} +\label{sec:multitask_learning} +多任务学习\citep{caruana93a}是通过合并几个任务中的样例(可以视为对参数施加的软约束)来提高泛化的一种方式。 +额外的训练样本以同样的方式将模型的参数推向泛化更好的方向,当模型的一部分在任务之间共享时,模型的这一部分被更多地约束为良好的值(假设共享是合理的),往往能更好的泛化。 + +图\ref{fig:chap7_multi_factor_output}展示了多任务学习中非常普遍的一种形式,其中不同的监督任务(给定$\RVx$预测$\RVy^{(i)}$)共享相同的输入$\RVx$以及一些中间层表示$\Vh^{(\text{share})}$,能学习共同的因素池。 +该模型通常可以分为两个部分和相关参数: +\begin{enumerate} + \item 具体任务的参数 (只能从各自任务的样本中实现良好的泛化)。如图\ref{fig:chap7_multi_factor_output}中的上层。 + \item 所有任务共享的通用参数(从所有任务的汇集数据中获益)。如图\ref{fig:chap7_multi_factor_output}中的下层。 +\end{enumerate} +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/multi_factor_output}} +\fi +\caption{TODO} +\label{fig:chap7_multi_factor_output} +\end{figure} + +因为共享参数,其统计强度可大大提高(共享参数的样本数量相对于单任务模式增加的比例),能改善泛化和泛化误差的范围\citep{baxter95a}。 +当然,仅当不同的任务之间存在某些统计关系的假设是合理时才会发生,也就是意味着某些参数能通过不同任务共享。 + +从\gls{DL}的观点看,底层的先验知识如下:\emph{能解释数据变化(在与之相关联的不同任务中观察到)的因素中,一些是跨两个或更多任务共享的。} + +% -- 238 -- + +\section{\gls{early_stopping}} +\label{sec:early_stopping} +当训练有足够的表示能力甚至会过度拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。 +图|||c|||是这些现象的一个例子,这种现象几乎一定会出现。 + +这意味着我们可以返回使验证集误差最低的参数设置来获得更好的模型(因此,有希望获得更好的测试误差)。 +在每次验证集误差有所改善后,我们存储模型参数的副本。 +当训练算法终止时,我们返回这些参数而不是最新的参数。 +当验证集上的误差在事先指定的循环内没有进一步改善时,算法就会终止。 +此过程在算法|||c|||有更正式的说明。 + +% -- 239 -- + +这种策略被称为\firstgls{early_stopping}。 +这可能是\gls{DL}中最常用的\gls{regularization}形式。 +它的流行主要是因为有效性和简单性。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/learning_curve_color}} +\fi +\caption{TODO} +\label{fig:chap7_learning_curve_color} +\end{figure} + +我们可以认为\gls{early_stopping}是非常高效的超参数选择算法。 +按照这种观点,训练步数仅是另一个超参数。 +我们从图\ref{fig:chap7_learning_curve_color}可以看到的,这个超参数在验证集上的具有U形性能曲线。 +很多控制模型容量的超参数在验证集上都是这样的U型性能曲线,如图|||c|||。 +在\gls{early_stopping}的情况下,我们通过拟合训练集的步数来控制模型的有效容量。 +大多数超参数的选择必须使用昂贵的猜测和检查过程,我们需要在训练开始时猜测一个超参数,然后运行几个步骤检查它的训练效果。 +``训练时间''唯一只要跑一次训练就能尝试很多值的超参数。 +通过\gls{early_stopping}自动选择超参数的唯一显著的代价是训练期间要定期评估验证集。 +理想情况下,这是可以并行在与主训练过程分离的机器,或独立的CPU,或独离的GPU上完成。 +如果没有这些额外的资源,可以使用比训练集小的验证集或较不频繁地评估验证集来减小评估代价,较粗略地估算取得最佳的训练时间。 + +另一个\gls{early_stopping}的额外代价是需要保持最佳的参数副本。 +这种代价一般是可忽略的,因为将它储存在较慢的较大的存储器上,(例如,在GPU内存中训练,但将最佳参数存储在主存储器或磁盘驱动器上)。 +由于最佳参数的写入很少发生而且从不在训练过程中读取,这些偶发的慢写入对总训练时间的影响不大。 + +% -- 240 -- + +\gls{early_stopping}是\gls{regularization}的非常不显眼的形式,它几乎不需要对基本训练过程、\gls{objective_function}或一组允许的参数值进行变化。 +这意味着,无需破坏学习动态就能很容易地使用\gls{early_stopping}。 +相对于\gls{weight_decay},必须小心不能使用太多的\gls{weight_decay},防止网络陷入不良\gls{local_minimum}(对应于病态的小权重)。 + +\gls{early_stopping}可单独使用或与其它的\gls{regularization}策略相结合。 +即使修改\gls{objective_function}以鼓励更好泛化的\gls{regularization}策略,在训练目标的\gls{local_minimum}达到最好泛化也是非常罕见的。 + +\gls{early_stopping}需要验证集,这意味着某些训练数据不能被馈送到模型。 +为了更好地利用这一额外的数据,我们可以使用\gls{early_stopping}初步训练之后,进行额外的训练。 +在第二轮额外的训练步骤中,所有的训练数据都被包括在内。 +有两个基本的策略可以用于第二轮训练过程。 + +% -- 241 -- + +一种策略(算法|||c|||)是再次初始化模型,然后使用所有数据再次训练。 +在这个第二轮训练过程,我们使用第一轮\gls{early_stopping}训练确定的最佳步数。 +此过程有一些细微之处。 +例如,我们没有办法知道重新训练时对参数进行相同次数的更新和对数据集进行相同的遍数哪一个更好。 +由于训练集变大了,在第二轮训练时,每遍历一次数据集将会对应更多次的参数更新。 + +另一个策略是保持从第一轮训练获得的参数,然后使用全部的数据\emph{继续}训练。 +在这个阶段中,现在我们已经在训练多少步停止上不再有指导。 +相反,我们可以监控验证集的平均损失函数,并继续训练,直到它低于\gls{early_stopping}过程停止时的目标值。 +此策略避免了重新训练模型的高成本,但表现并没有那么好。 +例如,验证集的目标不一定能达到之前的目标值,所以这种策略甚至不能保证终止。 +这个过程在算法|||c|||中更正式地展示。 + +\gls{early_stopping}对减少训练过程的计算成本也是有用的。 +除了由于限制训练的迭代次数而明显减少的计算成本,还带来了\gls{regularization}的益处(不需要添加惩罚项的\gls{cost_function}或计算这种附加项的\gls{gradient})。 + +% -- 242 -- + +\paragraph{\gls{early_stopping}是如何充当\gls{regularization}的:} +目前为止,我们已经声明\gls{early_stopping}是一种\gls{regularization} 策略,但我们只通过展示验证集误差的学习曲线是一个U形的来支持这种说法。 +\gls{early_stopping}\gls{regularization}模型的真正机制是什么? +\cite{Bishop1995}和\cite{Sjoberg95}认为\gls{early_stopping}具有将优化过程的参数空间限制在初始参数值$\Vtheta_0$相对小的邻域内的效果。 +更具体地,想象用学习率$\epsilon$进行$\tau$个优化步骤(对应于$\tau$个训练迭代)。 +我们可以将$\epsilon \tau$作为有效容量的度量。 +假设\gls{gradient}有界,限制迭代的次数和学习速率会限制从$\Vtheta_0$到达的参数空间大小,如图\ref{fig:chap7_reg_l1_vs_l2_mistake}所示。 +在这个意义上,$\epsilon \tau$的行为就好像它是\gls{weight_decay}系数的倒数。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics[width=0.8\textwidth]{Chapter7/figures/reg_l1_vs_l2_mistake}} +\fi +\caption{TODO} +\label{fig:chap7_reg_l1_vs_l2_mistake} +\end{figure} + +事实上,在二次误差的简单\gls{linear_model}和简单的\gls{GD}情况下,我们可以展示\gls{early_stopping}相当于$L^2$\gls{regularization} 。 + +为了与经典$L^2$\gls{regularization}比较,我们考察唯一的参数是线性权重($\Vtheta = \Vw$)的简单设定。 +我们在权重$\Vw$的经验最佳值$\Vw^*$附近以二次近似建模\gls{cost_function} $J$: +\begin{align} + \hat J(\Vtheta) = J(\Vw^*) + \frac{1}{2} (\Vw- \Vw^*)^\top \MH (\Vw - \Vw^*), +\end{align} +其中$\MH$是$J$关于$\Vw$在$\Vw^*$点的\gls{hessian}。 +鉴于假设$\Vw^*$是$J(\Vw)$的最小点,我们知道$\MH$为半正定。 +在局部\gls{taylor}级数逼近下,\gls{gradient}由下式给出: +\begin{align} + \nabla_{\Vw} \hat J (\Vw) = \MH (\Vw - \Vw^*). +\end{align} + +% -- 243 -- + +我们要研究训练时参数向量的轨迹。 +为简化起见,我们参数向量初始化为原点\footnote{对于\gls{NN},我们需要打破\gls{hidden_unit}间的对称平衡因此不能将所有参数都初始化为$\mathbf{0}$(如\ref{sec:gradient_based_learning}节所讨论的)。 +然而,对于其他任何初始值$\Vw_{(0)}$该论证都成立},也就是$\Vw^{(0)} = 0$。 +我们通过分析$\hat{J}$的\gls{GD}研究$J$上近似的\gls{GD}行为: +\begin{align} +\Vw^{(\tau)} &= \Vw^{(\tau-1)} -\epsilon \nabla_{\Vw} \hat{J}( \Vw^{(\tau-1)} ) \\ +&= \Vw^{(\tau-1)} - \epsilon \MH ( \Vw^{(\tau-1)} - \Vw^* ), \\ +\Vw^{(\tau)} - \Vw^* &= (\MI - \epsilon \MH) ( \Vw^{(\tau-1)} - \Vw^* ). + \end{align} +现在让我们在$\MH$特征向量的空间中改写表达式,利用$\MH$的特征分解:$\MH = \MQ \VLambda \MQ^\top$,其中$\VLambda$是对角矩阵,$\MQ$是特征向量的一组正交基。 +\begin{align} +\Vw^{(\tau)} - \Vw^* &= (\MI - \epsilon \MQ \VLambda \MQ^\top) ( \Vw^{(\tau-1)} - \Vw^* ), \\ +\MQ^\top (\Vw^{(\tau)} - \Vw^*) &= (\MI - \epsilon \VLambda)\MQ^\top ( \Vw^{(\tau-1)} - \Vw^* ). +\end{align} +假定$\Vw^{(0)} = 0$并且$\epsilon$选择得足够小以保证$|1 - \epsilon \lambda_i |<1$,经过$\tau$次参数更新后轨迹如下: +\begin{align} \label{eq:740qw} +\MQ^\top \Vw^{(\tau)} = [\MI - (\MI - \epsilon \VLambda)^\tau] \MQ^\top \Vw^* . +\end{align} +现在,式\ref{eq:713L2}中$\MQ^\top \tilde \Vw$的表达式能被重写为: +\begin{align} +\MQ^\top \tilde \Vw &= (\VLambda + \alpha \MI)^{-1} \VLambda \MQ^\top \Vw^*, \\ +\MQ^\top \tilde \Vw &= [\MI - (\VLambda + \alpha \MI)^{-1} \alpha] \VLambda \MQ^\top \Vw^*. +\label{eq:742qw} +\end{align} +比较式\ref{eq:740qw}和式\ref{eq:742qw},我们能够发现,如果超参数$\epsilon, \alpha$和$\tau$满足如下: +\begin{align} +(\MI - \epsilon \VLambda)^\tau = (\VLambda + \alpha \MI)^{-1} \alpha, +\end{align}\ +那么$L^2$\gls{regularization}和\gls{weight_decay}可以被看作是等价的(至少在\gls{objective_function}的二次近似下)。 +进一步取对数,使用$\log~(1+x)$的级数展开,我们可以得出结论,如果所有$\lambda_i$是小的(即$\epsilon \lambda_i \ll 1$且$\lambda_i / \alpha \ll 1$),那么 +\begin{align} +\tau \approx \frac{1}{\epsilon \alpha}, \\ +\alpha \approx \frac{1}{\tau \epsilon}. +\end{align} +也就是说,在这些假设下,训练迭代次数$\tau$起着与$L^2$参数成反比的作用,$\tau \epsilon$的倒数与\gls{weight_decay}系数的作用类似。 + +对应显著曲率(\gls{objective_function})方向的参数值\gls{regularization}小于小曲率方向。 +当然,在\gls{early_stopping}的情况下,这实际上意味着对应于显著曲率方向的参数比较小的曲率方向的参数学习得更早。 + +本节中的推导表明长度为$\tau$的轨迹结束于最小的$L^2$\gls{regularization} 目标的最小点。 +当然,\gls{early_stopping}比仅仅的轨迹长度限制更丰富;相反,\gls{early_stopping}通常涉及监控验证集的错误,以便在空间特别好的点处停止轨迹。 +因此\gls{early_stopping}比\gls{weight_decay}更具有优势,\gls{early_stopping}能自动确定\gls{regularization}的正确量,而\gls{weight_decay}需要多个训练实验来测试其超参数的不同值。 + +% -- 245 -- + +\section{参数绑定和参数共享} +\label{sec:parameter_tying_and_parameter_sharing} +目前为止,本章讨论对参数添加约束或惩罚时,一直是相对于固定的区域或点。 +例如,$L^2$\gls{regularization}(或\gls{weight_decay})对参数偏离零的固定值进行惩罚。 +然而,有时我们可能需要其他的方式来表达我们对模型参数适当值的先验知识。 +有时候,我们可能无法准确地知道应该采取什么样的参数,但我们从领域和模型结构方面的知识知道,模型参数之间应该存在一些相关性。 + +我们经常想要表达的常见类型的依赖是某些参数应当彼此接近。 +考虑以下情形:我们有两个模型执行相同的分类任务(具有相同类别),但输入分布稍有不同。 +形式地,我们有参数为$\Vw^{(A)}$的模型A和参数为$\Vw^{(B)}$的模型B。 +这两种模型将输入映射到两个不同但相关的输出:$\hat y^{(A)} = f(\Vw^{(A)}, \Vx)$和$\hat y^{(B)} = f(\Vw^{(B)}, \Vx)$。 + +我们可以想象,这些任务是足够相似(或许具有相似的输入和输出分布),因此我们认为模型参数应彼此靠近: +$\forall i, w_i^{(A)}$应该与$ w_i^{(B)}$接近。 +我们可以通过\gls{regularization}利用此信息。 +具体来说,我们可以使用以下形式的参数范数惩罚: +$\Omega(\Vw^{(A)}, \Vw^{(B)}) = \norm{\Vw^{(A)}-\Vw^{(B)}}_2^2$。 +在这里我们使用$L^2$惩罚,但也可以有其它选择。 + +这种方法由\cite{LasserreJ2006}提出,\gls{regularization}一个模型(监督模式下训练的分类器)的参数接近另一个无监督模式下训练的模型(捕捉观察到的输入数据的分布)。 +这个架构的构造成使得许多分类模型中的参数能与对应的无监督模型的参数匹配。 + +参数范数惩罚是\gls{regularization}参数彼此接近的一种方式,在更流行的方法是使用约束:强迫某些集合中的参数相等。 +由于我们将各种模型或模型组件解释为共享唯一的一组参数,这种\gls{regularization}方法通常被称为\firstgls{parameter_sharing}。 +\gls{parameter_sharing}相对于\gls{regularization}参数接近(通过范数惩罚)的一个显著优点是,只有参数(唯一一个集合)的子集需要被存储在内存中。 +对于某些特定模型,如\gls{CNN},这可能导致内存占用的显著减少。 + + +% -- 246 -- +\subsection{\gls{CNN}} +目前为止,最流行和广泛使用的\gls{parameter_sharing}出现在应用于\gls{CV}的\firstacr{CNN}。 +自然图像有许多统计属性是对转换不变的。 +例如,猫的照片即使向右边移了一个像素,仍保持猫的相片,。 +\glssymbol{CNN}通过在图像多个位置共享参数考虑这个特性。 +相同的特征(具有相同权重的\gls{hidden_unit})在输入的不同位置上计算。 +这意味着无论猫出现在图像中的第$i$列或$i + 1$列,我们都可以使用相同的猫探测器找到猫。 + +\gls{parameter_sharing}显著降低\glssymbol{CNN}模型不同参数的数量,并显著提高了网络的大小而不需要增加相应的训练数据。 +它仍然是将领域知识有效地整合到网络架构的最佳范例之一。 + +\gls{CNN}将会在第\ref{char:convolutional_networks}章更详细地讨论。 + +\section{\gls{sparse}\gls{representation}} +\label{sec:sparse_representations} +\gls{weight_decay}施加直接作用于模型参数的惩罚。 +另一种策略是将惩罚放在\gls{NN}的激活单元,鼓励对应的激活是\gls{sparse}。 +这间接的对模型参数施加了复杂惩罚。 + +我们已经讨论过(在\ref{sec:l1_regularization})$L^1$惩罚如何诱导\gls{sparse}的参数,意味着许多参数为零(或接近于零)。 +\gls{representation}的\gls{sparse},在另一方面描述了一种其中许多的元素是零(或接近零)的\gls{representation}。 +可以\gls{linear_regression}情况下简单说明这种区别: +\begin{align} +\underset{\Vy ~\in~ \SetR^m}{ + \begin{bmatrix} + 18 \\ 5 \\ 15 \\ -9 \\ -3 + \end{bmatrix}} = + \underset{\MA ~\in~ \SetR^{m \times n}}{ + \begin{bmatrix} + 4 & 0 & 0 & -2 & 0 & 0 \\ + 0 & 0 & -1 & 0 & 3 & 0 \\ + 0 & 5 & 0 & 0 & 0 & 0 \\ + 1 & 0 & 0 & -1 & 0 & -4 \\ + 1 & 0 & 0 & 0 & -5 & 0 + \end{bmatrix}} + \underset{\Vx ~\in~ \SetR^n}{ + \begin{bmatrix} + 2 \\ 3\\ -2\\ -5 \\ 1 \\ 4 + \end{bmatrix} }\\ + \underset{\Vy ~\in~ \SetR^m}{ + \begin{bmatrix} + -14 \\ 1 \\ 19 \\ 2 \\ 23 + \end{bmatrix}} = + \underset{\MB ~\in~ \SetR^{m \times n}}{ + \begin{bmatrix} + 3 & -1 & 2 & -5 & 4 & 1 \\ + 4 & 2 & -3 & -1 & 1 & 3 \\ + -1 & 5 & 4 & 2 & -3 & -2 \\ + 3 & 1 & 2 & -3 & 0 & -3 \\ + -5 & 4 & -2 & 2 & -5 & -1 + \end{bmatrix}} + \underset{\Vh \in \SetR^n}{ + \begin{bmatrix} + 0 \\ 2 \\ 0 \\ 0 \\ -3 \\ 0 + \end{bmatrix} } +\end{align} + +% -- 247 -- + +第一个表达式是参数\gls{sparse}的\gls{linear_regression}模型的例子。 +第二个是数据$\Vx$具有\gls{sparse}\gls{representation}$\Vh$的线性回归。 +也就是说,$\Vh$是$\Vx$的一个函数,在某种意义上\gls{representation}存在于$\Vx$中的信息,但是用一个\gls{sparse}向量\gls{representation}。 + +\gls{representation}的\gls{regularization}可以通过在参数\gls{regularization}中使用的同种类型的机制来实现的。 + +\gls{representation}的范数惩罚\gls{regularization}是通过向\gls{loss_function}$J$添加对\gls{representation}的范数惩罚。 +记这个惩罚为$\Omega(\Vh)$。 +和以前一样,我们将\gls{regularization}后的损失函数记为$\tilde J$: +\begin{align} + \tilde J(\Vtheta; \MX, \Vy) = J(\Vtheta; \MX, \Vy) + \alpha \Omega(\Vh) +\end{align} +其中$\alpha \in [0, \infty]$ 权衡范数惩罚项的相对贡献,越大的$\alpha$对应更多的\gls{regularization}。 + +正如对参数的$L^1$惩罚诱导参数\gls{sparse}性,对\gls{representation}元素的$L^1$惩罚诱导\gls{sparse}的\gls{representation}: +$\Omega(\Vh) = \norm(\Vh)_1 = \sum_i |h_i|$。 +当然$L^1$惩罚是导致\gls{sparse}\gls{representation}的选择之一。 +其他包括从\gls{representation}上\ENNAME{Student} $t$先验导出的惩罚\citep{Olshausen+Field-1996,Bergstra-Phd-2011}和\gls{KL}惩罚\citep{Larochelle+Bengio-2008}有利于表示元素约束于单位区间上。 +\cite{HonglakL2008-small}和\cite{Goodfellow2009}都提供了基于平均几个实例激活的\gls{regularization}策略的例子,$\sum_i^m \Vh^{(i)}$,使其接近某些目标值,如每项都是$.01$的向量。 + +其他的方法使用激活值的硬性约束获得\gls{representation}\gls{sparse}。 +例如,\textbf{正交匹配追踪}(orthogonal matching pursuit)\citep{pati93orthogonal}通过解决\gls{constrained_optimization}问题将输入值$\Vx$编码成\gls{representation}$\Vh$ +\begin{align} + \underset{\Vh, \norm{\Vh}_0 < k}{\argmin} \norm{\Vx - \MW \Vh}^2, +\end{align} +其中$\norm{\Vh}_0 $是$\Vh$中非零项的个数。 +当$\MW$被约束为正交时,这个问题可以高效地解决。 +这种方法通常被称为\ENNAME{OMP-k},通过$k$指定允许非零特征的数量。 +\cite{Coates2011b}证明\ENNAME{OMP-1}可以成为深度架构中非常有效的特征提取器。 + +% -- 248 -- + +有\gls{hidden_unit}的模型本质上都能变得\gls{sparse}。 +在这本书中,我们将看到各种情况下使用\gls{sparse}\gls{regularization}的例子。 + +\section{\gls{bagging}和其他\gls{ensemble}的方法} +\label{sec:bagging_and_other_ensemble_methods} +\firstgls{bagging}是通过结合几个模型降低泛化误差的技术\citep{ML:Breiman:bagging}。 +主要想法是分别训练几个不同的模型,然后让所有模型表决测试样例的输出。 +这在\gls{ML}中普通策略的一个例子,被称为模型平均\firstgls{model_averaging}。 +采用这种策略的技术被称为\gls{ensemble}方法。 + +\firstgls{model_averaging}奏效的原因是不同的模型通常不会在测试集上产生完全相同的错误。 + +考虑$k$个回归模型的例子。 +假设每个模型在每个例子上的误差是$\epsilon_i$,这个误差服从零均值\gls{variance}为$\SetE[\epsilon_i^2] = v$且\gls{covariance}为$\SetE[\epsilon_i \epsilon_j] = c$的多维正态分布。 +通过所有\gls{ensemble}模型的平均预测所得误差是$\frac{1}{k} \sum_i \epsilon_i$。 +\gls{ensemble}预测器平方误差的期望是 +\begin{align} + \SetE \Bigg[\Big(\frac{1}{k} \sum_i \epsilon_i \Big)^2\Bigg] &= \frac{1}{k^2} + \SetE \Bigg[\sum_i \Bigg(\epsilon_i^2 + \sum_{j \neq i} \epsilon_i \epsilon_j\Bigg)\Bigg], \\ +&= \frac{1}{k} v + \frac{k-1}{k} c . +\end{align} +在误差完全相关即$c=v$的情况下,均方误差减少到$v$,所以\gls{model_averaging}没有任何帮助。 +在错误完全不相关即$c =0$的情况下,该\gls{ensemble}平方误差的期望仅为$\frac{1}{k}v$。 +这意味着\gls{ensemble}平方误差的期望会随着\gls{ensemble}的大小线性地减小。 +换言之,\gls{ensemble}平均上至少与它的任何成员表现得一样好,并且如果成员的误差是独立的,\gls{ensemble}将显著地比其成员表现得更好。 + +不同的\gls{ensemble}方法以不同的方式构建\gls{ensemble}模型。 +例如,\gls{ensemble}的每个成员可以使用不同的算法和\gls{objective_function}训练成完全不同的模型。 +\gls{bagging}是一种允许重复多次使用同一种模型、训练算法和\gls{objective_function}的方法。 + +% -- 249 -- + +具体来说,\gls{bagging}涉及构造$k$个不同的数据集。 +每个数据集与原始数据集具有相同数量的样例,但从原始数据集中有替换采样构成。 +这意味着,每个数据集以高概率缺少一些来自原始数据集的例子,还包含若干重复的例子(如果所得训练集与原始数据集大小相同,那所得数据集中大概有原始数据集$2/3$的实例)。 +模型$i$在数据集$i$上训练。 +每个数据集包含样本的差异导致训练模型之间的差异。 +图\ref{fig:chap7_bagging}是一个例子。 + +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/bagging}} +\fi +\caption{TODO} +\label{fig:chap7_bagging} +\end{figure} + +\gls{NN}的解能达到足够多的变化意味着他们可以从\gls{model_averaging}中受益(即使所有模型都在同一数据集上训练)。 +\gls{NN}中随机初始化的差异、\gls{minibatch}的随机选择、超参数的差异或不同输出的非确定性的实现往往足以引起\gls{ensemble}中不同成员的误差部分独立。 + +% -- 250 -- + +\gls{model_averaging}是减少泛化误差一个非常强大可靠的方法。 +作为科学论文算法的基准时,它通常是不鼓励使用的,因为任何\gls{ML}算法可从\gls{model_averaging}中大幅获益(以增加计算和存储的代价)。 + +\gls{ML}比赛通常使用超过几十种\gls{model_averaging}的方法取胜。 +最近一个突出的例子是\ENNAME{Netflix Grand Prize}\citep{Koren09}。 + +不是所有构建\gls{ensemble}的技术都是为了让\gls{ensemble}模型比单一模型更加\gls{regularization}。 +例如,一种被称为\firstgls{boosting}的技术\citep{ConfLT:Freund:gametheorie,ConfLT:Freund:gametheorie}构建比单一模型容量更高\gls{ensemble}模型。 +向\gls{ensemble}逐步添加\gls{NN},\gls{boosting}已经应用于构建神经网络的\gls{ensemble}\citep{Schwenk-nips10}。 +\gls{boosting}也可以将单个神经网络解释为单个\gls{ensemble},即通过逐渐增加\gls{NN}的\gls{hidden_unit}。 + +\section{\gls{dropout}} +\label{sec:dropout} +\firstgls{dropout}\citep{Srivastava14}提供了\gls{regularization}一大类模型的方法,计算方便但功能强大的。 +第一个近似下,\gls{dropout}可以被认为是\gls{ensemble}非常多的大\gls{NN}的实用\gls{bagging}方法。 +\gls{bagging}涉及训练多个模型,并在每个测试样本上评估多个模型。 +当每个模型是一个大型\gls{NN}时,这似乎是不切实际的,因为训练和评估这样的网络需要花费很多运行时间和内存。 +通常\gls{ensemble}五至十个神经网络,如\cite{Szegedy-et-al-arxiv2014}用六个赢得ILSVRC,超过这个数量就会迅速变得难处理。 +\gls{dropout}提供了一种廉价的\gls{bagging}\gls{ensemble}近似, +能够训练和评估指数级的\gls{NN}。 + +具体而言,\gls{dropout}训练的\gls{ensemble}包括所有从基本的基础网络除去非输出单元形成子网络,如在图\ref{fig:chap7_subnetworks}所示。 +最先进的\gls{NN}基于一系列仿射变换和非线性变换,我们可以将一些单元的输出乘零以有效地删除一个单元。 +这个过程需要对模型一些修改,如径向基函数网络,单元的状态和参考值之间存在一定区别。 +为了简单起见,我们在这里提出乘零的简单\gls{dropout}算法,但是它被简单地修改后,可以与从网络中移除单元的其他操作一起工作。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/subnetworks}} +\fi +\caption{TODO} +\label{fig:chap7_subnetworks} +\end{figure} + +% -- 251 -- + +回想一下使用\gls{bagging}学习,我们定义$k$个不同的模型,从训练集有替换采样构造$k$个不同的数据集,然后在训练集$i$上训练模型$i$。 +\gls{dropout}的目标是在指数级数量的\gls{NN}上近似这个过程。 +具体来说,训练中使用\gls{dropout},我们使用基于\gls{minibatch}的学习算法和小的步长,如\gls{GD}等。 +我们每次在\gls{minibatch}加载一个样本,我们随机抽样应用与网络中所有输入和\gls{hidden_unit}的不同二值\gls{mask}。 +对于每个单元,\gls{mask}是独立采样的。 +\gls{mask}值为1的采样概率(导致包含一个单元)是训练开始前固定一个超参数。 +它不是模型当前参数值或输入样本的函数。 +通常一个输入单元包括的概率为$0.8$,一个\gls{hidden_unit}包括的概率为$0.5$。 +然后,我们运行之前一样的前向传播、反向传播以及学习更新。 +图\ref{fig:chap7_dropout_fprop}说明了在\gls{dropout}下的前向传播。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/dropout_fprop}} +\fi +\caption{TODO} +\label{fig:chap7_dropout_fprop} +\end{figure} +% -- 252 -- + +更正式地说,假设一个\gls{mask}向量$\Vmu$指定被包括的单元,$J(\Vtheta, \Vmu)$是由参数$\Vtheta$和\gls{mask}$\Vmu$定义的模型代价。 +那么\gls{dropout}训练在于最小化$\SetE_{\Vmu} J(\Vtheta, \Vmu)$。 +期望包含指数多的项,但我们可以通过抽样$\Vmu$获得梯度的无偏估计。 + +\gls{dropout}训练与\gls{bagging}训练不太一样。 +在\gls{bagging}的情况下,所有模型是独立的。 +在\gls{dropout}的情况下,模型是共享参数的,其中每个模型继承的父\gls{NN}参数的不同子集。 +\gls{parameter_sharing}使得在有限可用的内存下代表指数数量的模型变得可能。 +在\gls{bagging}的情况下,每一个模型被训练在其相应训练集上收敛。 +在\gls{dropout}的情况下,通常大部分模型都没有显式地被训练,通常该模型很大,以致到宇宙毁灭都不能采样所有可能的子网络。 +取而代之的是,可能的子网络的一小部分训练单个步骤,\gls{parameter_sharing}导致剩余的子网络能有好的参数设定。 +这些是仅有的区别。 +除了这些,\gls{dropout}与\gls{bagging}算法一样。 +例如,每个子网络中遇到的训练集确实是有替换采样的原始训练集的一个子集。 + +\gls{bagging}\gls{ensemble}必须从所有成员的积累投票做一个预测。 +在这种背景下,我们将这个过程称为\gls{inference}。 +目前为止,\gls{bagging}和\gls{dropout}的描述中没有要求模型具有明确的概率。 +现在,我们假定该模型的作用是输出一个概率分布。 +在\gls{bagging}的情况下,每个模型$i$产生一个概率分布$p^{(i)}(y | \Vx)$。 +\gls{ensemble}的预测由这些分布的算术平均值给出, +\begin{align} + \frac{1}{k} \sum_{i=1}^k p^{(i)}(y | \Vx) +\end{align} + +在\gls{dropout}的情况下,通过\gls{mask}$\Vmu$定义每个子模型的概率分布$p(y | \Vx, \Vmu)$。 +关于所有\gls{mask}的算术平均值由下式给出 +\begin{align} + \sum_{u} p(\Vmu) p(y | \Vx, \Vmu) +\end{align} +其中$p(\Vmu)$是训练时采$\Vmu$的概率分布。 + +% -- 254 -- + +因为这个求和包含指数多的项,除非在该模型的结构允许某种形式的简化,否则是不可能计算的。 +目前为止,无法得知深度\gls{NN}是否允许任何可行的简化。 +相反,我们可以通过采样近似\gls{inference},即平均许多\gls{mask}的输出。 +即使是$10-20$个\gls{mask}就足以获得不错的表现。 + +然而,有一个更好的方法能得到一个不错的近似整个\gls{ensemble}的预测,且只需一个前向传播的代价。 +要做到这一点,我们改用\gls{ensemble}成员的预测分布的几何平均而不是算术平均。 +\cite{WardeFarley+al-ICLR2014}提出的论点和经验证据表明,在这个情况下几何平均与算术平均表现得差不多。 + +多个概率分布的几何平均不能保证是一个概率分布。 +为了保证结果是一个概率分布,我们要求没有子模型给某一事件分配概率0,并重新标准化所得分布。 +通过几何平均直接定义的非标准化概率分布由下式给出 +\begin{align} +\tilde{p}_{\text{ensemble}}(y | \Vx) = \sqrt[2^d]{\prod_{\Vmu} p(y | \Vx, \Vmu)}, +\end{align} +其中$d$是可被丢弃的单元数。 +在这里,我们使用一个均匀分布的$\Vmu$以简化介绍,但非均匀分布也是可能的。 +为了作出预测,我们必须重新标准化\gls{ensemble}: +\begin{align} +p_{\text{ensemble}}(y | \Vx) = \frac{\tilde{p}_{\text{ensemble}}(y | \Vx)} + {\sum_{y'}\tilde{p}_{\text{ensemble}}(y' | \Vx) }. +\end{align} + +涉及\gls{dropout}的一个重要观点\citep{Hinton-et-al-arxiv2012}是,我们可以通过评估模型中$p(y | \Vx)$近似$ p_{\text{ensemble}}(y | \Vx) $: +该模型具有所有单元,但单元$i$输出的权重乘以包括单元$i$的概率。 +这个修改的动机是捕获从该单元输出的正确期望值。 +我们把这种方法称为\firstgls{weight_scaling_inference_rule}。 +目前还没有在深度非线性网络上对这种近似推理规则的准确性作任何理论上的说法,但经验上表现得很好。 + + % -- 255 -- + +因为我们通常使用一个$\frac{1}{2}$的包含概率,权重比例规则一般相当于在训练结束后将权重除$2$,然后像平常一样使用模型。 +实现相同的结果的另一种方法是在训练期间将单元的状态乘$2$。 +无论哪种方式,我们的目标是确保在测试时一个单元的期望总输入是与在训练时该单元的期望总输入是大致相同(即使近半单位在训练时丢失)。 + +对许多不具有非线性\gls{hidden_unit}的模型族,\gls{weight_scaling_inference_rule}是精确的。 +举个简单的例子,考虑\gls{softmax}回归分类,其中由向量$\RVv$表示$n$个输入变量: +\begin{align} + P(\RSy = \Sy ~|~ \RVv) = \text{softmax}\big(\MW^\top\RVv + \Vb\big)_y. +\end{align} +我们可以根据二值向量$\Vd$逐元素的乘法将一类子模型进行索引: +\begin{align} +P(\RSy = \Sy ~|~ \RVv; \Vd) = \text{softmax}\big(\MW^\top(\Vd \odot \RVv) + \Vb \big)_y. +\end{align} +\gls{ensemble}预测器被定义为重新标准化所有\gls{ensemble}成员预测的几何平均: +\begin{align} \label{eq:758pe} +P_{\text{ensemble}}(\RSy = \Sy ~|~ \RVv) = \frac{\tilde{P}_{\text{ensemble}}(\RSy = \Sy ~|~ \RVv)} + {\sum_{y'}\tilde{P}_{\text{ensemble}}(\RSy = \Sy' ~|~ \RVv) }, +\end{align} +其中 +\begin{align} +\tilde{P}_{\text{ensemble}}(\RSy=\Sy ~|~ \RVv) = +\sqrt[2^n]{\prod_{\Vd \in \{0,1\}^n} P(\RSy = \Sy ~|~ \RVv; \Vd)}. +\end{align} + +为了证明\gls{weight_scaling_inference_rule}是精确的,我们简化$ \tilde{P}_{\text{ensemble}}$: +\begin{align} +\tilde{P}_{\text{ensemble}}(\RSy=\Sy ~|~ \RVv) = +\sqrt[2^n]{\prod_{\Vd \in \{0,1\}^n} P(\RSy = \Sy ~|~ \RVv; \Vd)} \\ += \sqrt[2^n]{\prod_{\Vd \in \{0,1\}^n} \text{softmax}(\MW^\top(\Vd \odot \RVv) + \Vb)_y} \\ += \sqrt[2^n]{\prod_{\Vd \in \{0,1\}^n} \frac{\exp (\MW_{y,:}^\top(\Vd \odot \RVv) + \Vb_y)} +{\sum_{y'}\exp (\MW_{y',;}^\top(\Vd \odot \RVv) + \Vb_{y'})}}\\ += \frac{\sqrt[2^n]{\prod_{\Vd \in \{0,1\}^n}\exp (\MW_{y,:}^\top(\Vd \odot \RVv) + \Vb_y)}} +{ \sqrt[2^n] \prod_{\Vd \in \{0,1\}^n} \sum_{y'}\exp (\MW_{y',:}^\top(\Vd \odot \RVv) + \Vb_{y'})} +\end{align} + +由于$\tilde P$将被标准化,我们可以放心地忽略那些相对$y$不变的乘法: +\begin{align} +\tilde{P}_{\text{ensemble}}(\RSy=\Sy ~|~ \RVv) &\propto +\sqrt[2^n]{\prod_{\Vd \in \{0,1\}^n} \exp (\MW_{y,:}^\top(\Vd \odot \RVv) + \Vb_y)} \\ +& = \exp \Big(\frac{1}{2^n} \sum_{\Vd \in \{0,1\}^n} \MW_{y,;}^\top(\Vd \odot \RVv) + \Vb_y \Big) \\ +& = \exp \big(\frac{1}{2}\MW_{y,:}^\top \RVv + \Vb_y \big) +\end{align} +将其代入式\ref{eq:758pe},我们得到了一个权重为$\frac{1}{2}\MW$的\gls{softmax}分类器。 + +% -- 256 -- + +\gls{weight_scaling_inference_rule}在其他设定下也是精确的,包括条件正态输出的回归网络以及那些隐藏层不包含非线性的深度网络。 +然而,\gls{weight_scaling_inference_rule}对具有非线性的深度模型仅仅是一个近似。 +虽然这个近似尚未有理论上的分析,但在实践中往往效果很好。 +\cite{Goodfellow-et-al-ICML2013}实验发现,\gls{ensemble}预测\gls{weight_scaling_inference_rule}可以比\gls{monte_carlo}近似工作得更好(在分类精度方面)。 +即使允许\gls{monte_carlo}近似采样多达1000子网络时也比不过。 +\cite{gal2015bayesian}发现一些模型可以通过二十个样本和\gls{monte_carlo}近似获得更好的分类精度。 +似乎\gls{inference}近似的最佳选择是与问题相关的。 + +\cite{Srivastava14}显示,\gls{dropout}比其他标准的计算开销小的\gls{regularization} 项,如\gls{weight_decay}、过滤器范数约束和\gls{sparse}激活的\gls{regularization}更有效。 +\gls{dropout}也可以与其他形式的\gls{regularization}合并,得到进一步的提升。 + +计算方便是\gls{dropout}的一个优点。 +训练过程中使用\gls{dropout}产生$n$个随机二进制数与状态相乘,每个样本每次更新只需$\CalO(n)$的计算复杂度。 +根据实现,也可能需要$\CalO(n)$的存储空间来持续保存这些二进制数(直到反向传播阶段)。 +使用训练好的模型\gls{inference}时,计算每个样本的代价是与不使用\gls{dropout}一样的,尽管我们必须在开始运行\gls{inference}前将权重除以2。 + +% -- 257 -- + +\gls{dropout}的另一个显著优点是不怎么限制适用的模型或训练过程。 +几乎在所有使用\gls{distributed_representation}且可以用\gls{SGD}训练的模型上都表现很好。 +包括前馈神经网络、概率模型,如\gls{RBM}\citep{Srivastava14},以及\gls{RNN}\citep{Bayer-et-al-arXiv-2014,Pascanu-et-al-ICLR2014}。 +许多其他差不多强大\gls{regularization}策略对模型结构的限制更严格。 + +虽然\gls{dropout}在特定模型上每一步的代价是微不足道的,但在一个完整的系统使用\gls{dropout}的代价可能非常显著。 +因为\gls{dropout}是一个\gls{regularization}技术,它减少了模型的有效容量。 +为了抵消这种影响,我们必须增大模型规模。 +不出意外的话,使用\gls{dropout}时最佳验证集的误差会低很多,但这是以更大的模型和更多训练算法的迭代次数为代价换来的。 +对于非常大的数据集,\gls{regularization}带来的泛化误差减少得很小。 +在这些情况下,使用\gls{dropout}和更大模型的计算代价可能超过\gls{regularization}带来的好处。 + +只有极少的训练样本可用时,\gls{dropout}不会很有效。 +在只有不到5000的样本的\ENNAME{Alternative Splicing}数据集上\citep{Xiong2011},贝叶斯神经网络\citep{Neal1996}比\gls{dropout}表现更好\citep{Srivastava14}。 +当有其他未分类的数据可用时,无监督特征学习比\gls{dropout}更有优势。 + + +\cite{Wager+al-2013}表明,当\gls{dropout}作用于\gls{linear_regression}时,相当于每个输入特征具有不同\gls{weight_decay}系数的$L^2$\gls{weight_decay}。 每个特征的\gls{weight_decay}系数的大小是由其方差来确定。 +其他\gls{linear_model}有类似的结果。 +而对于深度模型,\gls{dropout}与\gls{weight_decay}是不等同的。 + + +使用\gls{dropout}训练时的随机性不是这个方法成功的必要条件。 +它仅仅是近似所有子模型总和的一个方法。 +\cite{WangManning-ICML2013-small}导出近似这种边缘分布的解析解。 +他们的近似被称为\firstgls{fast_dropout}, 由于梯度计算中的随机性减小导致更快的收敛时间。 +这种方法也可以在测试时应用,比\gls{weight_scaling_inference_rule}更合理地(但计算也更昂贵)近似所有子网络的平均。 +\gls{fast_dropout}在小神经网络上的性能几乎与标准的\gls{dropout}相当,但在大问题上尚未产生显著地改善或尚未应用。 + +% -- 258 -- + +正如随机性对实现\gls{dropout}的\gls{regularization}效果不是必要的,这也不是充分的。 +为了证明这一点,\cite{WardeFarley+al-ICLR2014}使用一种称为\firstgls{dropout_boosting}的方法设计了一个对照实验,与传统\gls{dropout}方法完全相同的噪声\gls{mask}, 但缺乏\gls{regularization}效果。 +\gls{dropout_boosting}训练整个\gls{ensemble}以最大化训练集上的似然。 +在相同意义上,传统的\gls{dropout}类似于\gls{bagging},这种方式类似于\gls{boosting}。 +如预期一样,比较单一模型训练整个网络的情况,\gls{dropout_boosting}几乎没有\gls{regularization}效果。 +这表明,\gls{dropout}\gls{bagging}的解释超过\gls{dropout}作为稳健性的噪音的解释。 +当随机抽样的\gls{ensemble}成员相互独立地训练好后,\gls{bagging}\gls{ensemble}的\gls{regularization}效果才能达到。 + +\gls{dropout}启发其它以随机方法训练指数量级的共享权重的\gls{ensemble}。 +\ENNAME{DropConnect}是\gls{dropout}的一个特殊情况,其中一个标量权重和单个\gls{hidden_unit}状态之间的每个乘积被认为是可以丢弃的一个单元\citep{Wan+al-ICML2013-small}。 +随机\gls{pooling}是构造\gls{CNN}\gls{ensemble}的一种随机\gls{pooling}的形式(见\ref{sec:pooling}节),其中每个卷积网络参与每个特征图的不同空间位置。 +目前为止,\gls{dropout}仍然是最广泛使用的隐式\gls{ensemble}方法。 + +关于\gls{dropout}的一个重要见解是,通过随机行为训练网络并平均多个随机决定进行预测,通过\gls{parameter_sharing}实现了\gls{bagging}的一种形式。 +早些时候,我们将\gls{dropout}描述为通过包括或排除单元形成模型\gls{ensemble}的\gls{bagging}。 +然而,这种\gls{parameter_sharing}策略不一定要基于包括和排除。 +原则上,任何一种随机的修改都是可接受的。 +在实践中,我们必须选择能让\gls{NN}能够学习对抗的修改类型。 +理想情况下,我们也应该使用可以快速近似\gls{inference}的模型类。 +我们可以认为由向量$\Vmu$作为任何形式修改的参数,对于$\Vmu$所有可能的值训练$p(y ~|~ \Vx, \Vmu)$的\gls{ensemble}。 +这里不要求$\Vmu$具有有限值。 +例如,$\Vmu$可以是实值。 +\cite{Srivastava14}表明,权重乘以$\Vmu \sim \CalN(1, \MI)$比基于二值\gls{mask} \gls{dropout}表现更好。 +由于$\SetE[\Vmu] = 1$,标准网络自动实现\gls{ensemble}的近似\gls{inference},而不需要\gls{weight_scaling_inference_rule}。 + +% -- 259 -- + +到目前为止,我们已经介绍\gls{dropout}纯粹作为一种高效近似\gls{bagging}的手段。 +然而,有比这更进一步的\gls{dropout}观点。 +\gls{dropout}不仅仅是训练一个\gls{bagging}的\gls{ensemble}模型, +并且是共享\gls{hidden_unit}的\gls{ensemble}模型。 +这意味着无论其它\gls{hidden_unit}是否在模型中,每个\gls{hidden_unit}必须都能够表现良好。 +\gls{hidden_unit}必须准备好进行模型之间的交换和互换。 +\cite{Hinton-et-al-arxiv2012-small}由生物学的想法受到启发:有性繁殖涉及到两个不同生物体之间交换基因,进化产生的压力使得基因不仅是良好的而且要准备好不同有机体之间的交换。 +这样的基因和这些特点对环境的变化是非常稳健的,因为它们一定会正确适应任何一个有机体或模型不寻常的特性。 +因此\gls{dropout}\gls{regularization}每个\gls{hidden_unit}不仅是一个很好的特征,更要在许多情况下良好的特征。 +\cite{WardeFarley+al-ICLR2014}将\gls{dropout}与大\gls{ensemble}的训练相比并得出结论:相比独立模型的\gls{ensemble}获得的泛化误差,\gls{dropout}会提供的额外改进。 + +\gls{dropout}的强大大部分是由于被施加到\gls{hidden_unit}的\gls{mask}噪声,了解这一事实是重要的。 +这可以看作是对输入内容的信息高度智能化的、自适应破坏的一种形式,而不是对输入原始值的破坏。 +例如,如果模型学得通过鼻检测脸的\gls{hidden_unit}$h_i$,那么丢失$h_i$对应于擦除图像中有鼻子的信息。 +模型必须学习另一种$h_i$,要么是鼻子存在的冗余编码,要么是脸部的另一特征,如嘴。 +传统的噪声注入技术,在输入端加非结构化的噪声不能够随机地从脸部图像中抹去关于鼻子的信息,除非噪声的幅度大到几乎能抹去图像中所有的信息。 +破坏提取的特征而不是原始值,让破坏过程充分利用该模型迄今获得的输入分布的所有知识。 + +\gls{dropout}的另一个重要方面是噪声是乘性的。 +如果是固定规模的加性噪声,那么加了噪声$\epsilon$的修正线性\gls{hidden_unit}可以简单地学会使$h_i$变得很大(使增加的噪声$\epsilon$变得不显著)。 +乘性噪声不允许这样病态地解决噪声鲁棒性问题。 + +% -- 260 -- + +另一种\gls{DL}算法,\gls{batch_normalization},在训练时向\gls{hidden_unit}引入加性和乘性噪声的方法重参数化模型。 +\gls{batch_normalization}的主要目的是改善优化,但噪音具有\gls{regularization}的效果,有时使\gls{dropout}变得没有必要。 +\gls{batch_normalization}将会在\ref{sec:batch_normalization}节更详细的讨论。 + + + +\section{对抗训练} +\label{sec:adversarial_training} +在许多情况下,\gls{NN}在独立同分布的测试集上进行评估时已经达到人类表现。 +因此,自然要怀疑这些模型在这些任务上是否获得了真正的人类层次的理解。 +为了探测网络对底层任务的理解层次,我们可以搜索这个模型错误分类的例子。 +\cite{Szegedy-ICLR2014}发现,精度达到人类水平的\gls{NN}在通过优化过程故意构造的点上的误差率接近\NUMTEXT{100\%},模型在这个输入点$\Vx'$的输出与附近的数据点$\Vx$非常不同。 +在许多情况下,$\Vx'$与$\Vx$非常近似,人类观察者不知道原始样本和\firstgls{adversarial_example}之间的差异,但是网络会作出非常不同的预测。 +见图\ref{fig:chap7_panda_577}的例子。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/panda_577}} +\fi +\caption{TODO} +\label{fig:chap7_panda_577} +\end{figure} + +% -- 261 -- + +\gls{adversarial_example}有很多的影响,例如计算机安全,这超出了本章的范围。 +然而,它们在\gls{regularization}的背景下很有意思,因为我们可以通过\firstgls{adversarial_training}减少原有独立同分布的测试集上错误率——在对抗扰动的训练集样本上训练\citep{Szegedy-ICLR2014,Goodfellow-2015-adversarial}。 + + +\cite{Goodfellow-2015-adversarial}表明,这些\gls{adversarial_example}的主要原因之一是过度线性。 +\gls{NN}主要基于线性块构建的。 +因此在一些实验中,他们实现的整体函数被证明是高度线性。 +这些线性函数很容易优化。 +不幸的是,如果一个线性函数具有许多输入,那么它的值可以非常迅速地改变。 +如果我们用$\epsilon$改变每个输入,那么权重为$\Vw$线性函数可以改变$\epsilon \norm{\Vw}_1$之多,如果$\Vw$是高维的这会是一个非常大的数。 +\gls{adversarial_training}通过鼓励网络在训练数据附近的局部区域恒定来限制这一高度敏感的局部线性行为。 +这可以被看作是明确地向监督\gls{NN}引入局部恒定的先验的方法。 + +对抗训练有助于说明积极\gls{regularization}与大型函数族结合的力量。 +纯粹的\gls{linear_model},如\gls{logistic_regression},由于他们被限制为线性而无法抵抗\gls{adversarial_example}。 +\gls{NN}是能够将函数从接近线性转化为局部近似恒定,从而可以灵活地捕获到训练数据中的线性趋势同时学习抵抗局部扰动。 + +\gls{adversarial_example}也提供了实现半监督学习的一种手段。 +与数据集中的标签不相关联的点$\Vx$处,模型本身为其分配一些标签$\hat y$。 +模型的标记$\hat y$未必是真正的标签,但如果模型是高品质,那么$\hat y$提供真正标签的可能性很大。 +我们可以搜索一个\gls{adversarial_example}$\Vx'$,导致分类器输出一个标签$y'$且$y' \neq \hat y$。 +不使用真正的标签,而是由训练好的模型提供标签产生的\gls{adversarial_example}称为\firstgls{virtual_adversarial_example}\citep{miyato2015distributional}。 +分类器可以被训练成对$\Vx$和$\Vx'$分配相同的标签。 +这鼓励分类器学习一个沿着未标签数据所在流形上任意微小变化都是鲁棒的函数。 +驱动这种方法的假设是,不同的类通常位于分离的流形上,并且小的扰动不能从一类的流形跳到另一个类的流形。 + +% -- 262 -- + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Hard to translate +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{\gls{tangent_distance}、\gls{tangent_prop}和流形切分类} +\label{sec:tangent_distance_tangent_prop_and_manifold_tangent_classifier} +许多\gls{ML}的目标旨在假设数据位于低维流形附近来克服维数灾难,如\ref{sec:manifold_learning}描述。 + +一个利用流形假设的早期尝试是\firstgls{tangent_distance}算法\citep{Simard93-small,Simard98}。 +它是一种非参数最近邻算法,其中度量使用的不是通用的欧几里德距离,而是是从邻近流形关于聚集概率的知识导出的。 +这假设我们正在尝试的分类样本,且同一流形上的样本共享相同的类别。 +由于分类器应该对变化的局部因素(对应于流形上的移动)不变,将点$\Vx_1$和$\Vx_2$分别所在的流形$M_1$和$M_2$的距离作为点$\Vx_1$和$\Vx_2$的最近邻距离是合理的。 +尽管这可能是在计算上是困难(它需要解决一个找到$M_1$和$M_2$最近对点的优化问题),一种廉价的替代是局部合理的,即使用$\Vx_i$点处切平面近似$M_i$,并测量两条切平面或一个切平面和点的距离。 +可以通过求解一个低维线性系统(流形的维数)实现。 +当然,这种算法需要制定一个的切向量。 + +受相关启发,\firstgls{tangent_prop}算法\citep{Simard92-short}(图\ref{fig:chap7_mtc_color})训练带有额外惩罚的\gls{NN}分类器,使\gls{NN}的每个输出$f(\Vx)$对已知的变化因素是局部不变的。 +这些变化因素对应于沿着的相同样本聚集的流形的移动。 +局部不变性是通过要求$\nabla_{\Vx} f(\Vx)$与已知流形的切向$\Vv^{(i)}$正交实现的,或者等价地通过\gls{regularization}惩罚$\Omega$使$f$在$\Vx$的$\Vv^{(i)}$方向的导数是小的: +\begin{align} \label{eq:767} + \Omega(f) = \sum_i \Big((\nabla_{\Vx} f(\Vx)^\top \Vv^{(i)}) \Big)^2 . +\end{align} +这个\gls{regularization}项当然可以通过适当的超参数缩放,并且对于大多数\gls{NN},我们将需要对许多输出求和(此处为描述简单,$f(\Vx)$为唯一输出)。 +与\gls{tangent_distance}算法一样,切向量推导先验,通常是从变换,如平移、旋转和缩放图像的效果获得形式知识。 +\gls{tangent_prop}不仅用于监督学习\citep{Simard92-short},还在强化学习\citep{Thrun-NIPS1994}中有所应用。 +\begin{figure}[!htb] +\ifOpenSource +\centerline{\includegraphics{figure.pdf}} +\else +\centerline{\includegraphics{Chapter7/figures/mtc_color}} +\fi +\caption{TODO} +\label{fig:chap7_mtc_color} +\end{figure} +% -- 263 -- + +\gls{tangent_prop}与数据集增强密切相关。 +在这两种情况下,该算法的用户通过指定一组不改变网络输出的转换,编码其先验知识。 +不同的是在数据集增强的情况下,网络是显式地训练正确分类这些施加大量变换后产生的不同输入。 +\gls{tangent_prop}不需要显式访问一个新的输入点。 +取而代之,它解析地对模型\gls{regularization}在对应于指定转换的方向抵抗扰动。 +虽然这种分析方法是聪明优雅的,它有两个主要的缺点。 +首先,模型的\gls{regularization}只能抵抗无穷小扰动。 +显式的数据集增强能对抗较大扰动。 +二是无限小的做法对基于\gls{ReLU}的模型是困难的。 +这些模型只能通过关闭单元或缩小它们的权重才能缩小它们的导数。 +他们不能像\ENNAME{sigmoid}或\ENNAME{tanh}单元一样通过大的权重在高值处饱和以收缩导数。 +数据集增强在\gls{ReLU}上工作得很好,因为修正单元的不同子集针对每一个原始输入不同的转换版本激活。 + +% -- 264 -- + +\gls{tangent_prop}也涉及到\gls{double_backprop}\citep{DruckerLeCun92}和\gls{adversarial_training}\citep{Szegedy-et-al-arxiv2014,Goodfellow-2015-adversarial}。 +\gls{double_backprop}\gls{regularization}\gls{jacobian}要小,而\gls{adversarial_training}找到原输入附近的点,训练模型以在这些点产生与原来输入相同的输出。 +\gls{tangent_prop}和手工指定转换的数据集增强都要求模型对输入变化的某些特定的方向是不变的。 +\gls{double_backprop}和\gls{adversarial_training}都要求模型对输入所有方向中的变化(只要该变化较小)都应当是不变的。 +正如数据集增强是\gls{tangent_prop}非无限小的版本,\gls{adversarial_training}是\gls{double_backprop}非无限小的版本。 + +流形切面分类器\citep{Dauphin-et-al-NIPS2011}无需知道切线向量的先验。 +正如我们将在第\ref{chap:autoencoders}章看到,\gls{AE}可以估算流形的切向量。 +流形切面分类器使用这种技术来避免用户指定切向量。 +如图\ref{fig:14iotv}所示,这些估计的切向量超出了图像(如转化、旋转和缩放)几何的经典不变,还必须掌握因为特定对象(如移动身体的部分)的因素。 +因此根据流形切面分类提出的算法是简单: +(1)使用\gls{AE}通过无监督学习来学习流形的结构,以及(2)如\gls{tangent_prop}(式\ref{eq:767})一样使用这些切面\gls{regularization}\gls{NN}分类器。 + +在本章中,我们已经描述了大多数用于\gls{regularization}\gls{NN}的通用策略。 +\gls{regularization}是\gls{ML}的中心主题,因此将定期在其余各章中重新回顾。 +\gls{ML}的另一个中心主题是优化,将在下章描述。 + +% -- 265 -- diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..535e4ff --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +all: + xelatex dlbook_cn.tex && bibtex dlbook_cn.aux && texindy dlbook_cn.idx && makeglossaries dlbook_cn && xelatex dlbook_cn.tex + +clean: + find . -type f -iregex '.*\.\(aux\|log\|toc\|backup\|acr\|brf\|gz\|acn\|xdy\|alg\)$$' -delete diff --git a/README.md b/README.md new file mode 100644 index 0000000..f20beeb --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Deep Learning 中文翻译 + +就经过3多个月,我们终于完成了翻译草稿。当然这是草稿中的草稿,我们会不断改进,就像梯度下降一样,要迭代好几轮才能找的一个不错的解。 + +目前的版本是直译版,尽可能地保留原书中的每一个字。 +如 + +> Inventors have long dreamed of creating machines that think. This desire dates back to at least the time of ancient Greece. +> 自古以来,创造者就梦想着创造能思考的机器。这个愿望至少可以追溯到古希腊的时期。 + +之后我们可能会翻译成 +> 远在古希腊的时期,创造者就梦想着创造能思考的机器。 + +语句流畅度的提高必然伴随精度下降(我们水平有限)。因此我们需要ensemble,需要大家的建议。 + +面向的读者 +-------------------- +这一版读起来肯定费劲,我们建议英文好的或者研究者直接读原版。 +这一版面向的读者是英语不好,急于想入门深度学习的同学。或者希望帮忙校对的各路大哥也可以读读,只要不嫌弃。 + + +注意 +----------- +各种问题或者建议可以提issue,建议使用中文。 +由于版权问题,我们不能将图片和bib上传,请见谅。 +可用于学习研究目的,不得用于任何商业行为。谢谢! + + +TODO +--------- + + 1. 翻译图片描述 + 2. 链接补全 + 3. 语句通顺 + 4. 第20章正在校对,这章比较难估计还需2周 + +Updating..... diff --git a/acknowledgments.tex b/acknowledgments.tex new file mode 100644 index 0000000..044c17a --- /dev/null +++ b/acknowledgments.tex @@ -0,0 +1,2 @@ +%TODO +TODO diff --git a/breakcites.sty b/breakcites.sty new file mode 100644 index 0000000..f1e8b9b --- /dev/null +++ b/breakcites.sty @@ -0,0 +1,17 @@ +% breakcites +% Style file to allow citations to be broken across lines. +% - Don Hosek 3/14/89 (LaTeX209-Version) +% - Leo Broska 02/20/97 (LaTeX-2e-Version) +% +\def\@citex[#1]#2{% + \let\@citea\@empty + \@cite{\@for\@citeb:=#2\do + {\@citea\def\@citea{,\penalty\@m\ }% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi + \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\csname b@\@citeb\endcsname}}}{#1}} + diff --git a/dlbook_cn.pdf.REMOVED.git-id b/dlbook_cn.pdf.REMOVED.git-id new file mode 100644 index 0000000..0d8a500 --- /dev/null +++ b/dlbook_cn.pdf.REMOVED.git-id @@ -0,0 +1 @@ +2b9d13054e778360737a54e93f7274348078af9e \ No newline at end of file diff --git a/dlbook_cn.tex b/dlbook_cn.tex new file mode 100644 index 0000000..941cd7e --- /dev/null +++ b/dlbook_cn.tex @@ -0,0 +1,147 @@ +\documentclass[11pt,a4paper,oneside]{book} +\usepackage{natbib} + +% CJK related +\usepackage[slantfont,boldfont]{xeCJK} +\setCJKmainfont[AutoFakeBold=true]{Adobe Song Std} +\setCJKsansfont{Adobe Heiti Std} +\setCJKmonofont{Adobe Fangsong Std} + +% Needed for some foreign characters +\usepackage[T1]{fontenc} + +\usepackage{amsmath} +\usepackage{subfigure} +\usepackage{amsfonts} +\usepackage{amsthm} +\usepackage{multirow} +\usepackage{colortbl} +\usepackage{booktabs} +% This allows us to cite chapters by name, which was useful for making the +% acknowledgements page +\usepackage{nameref} +\usepackage{breakcites} + +\usepackage[tocindentauto]{tocstyle} +\usetocstyle{standard} + +\usepackage{bm} +\usepackage{float} +\newcommand{\boldindex}[1]{\textbf{\hyperpage{#1}}} +\usepackage{makeidx}\makeindex +% Make bibliography and index appear in table of contents +\usepackage[nottoc]{tocbibind} +\usepackage[font=small]{caption} + +% Used to change header sizes +\usepackage{fancyhdr} + +\usepackage[section]{placeins} +\usepackage[chapter]{algorithm} +\usepackage{algorithmic} +% Include chapter number in algorithm number +\renewcommand{\thealgorithm}{\arabic{chapter}.\arabic{algorithm}} + +\usepackage[pdffitwindow=false, +pdfview=FitH, +pdfstartview=FitH, +pagebackref=true, +breaklinks=true, +colorlinks=false, +bookmarks=false, +%hidelinks=true, +plainpages=false]{hyperref} + +\usepackage[nomain,acronym,xindy,toc,nopostdot]{glossaries} +\makeglossaries +\usepackage[xindy]{imakeidx} +\makeindex + +\usepackage{zref-abspage} +\setcounter{secnumdepth}{3} + + +% my page +\usepackage[vcentering,dvips]{geometry} +\geometry{papersize={7in,9in},bottom=3pc,top=5pc,left=5pc,right=5pc,bmargin=4.5pc,footskip=18pt,headsep=25pt} +\setlength\emergencystretch{1.5em} + +% my command +\newcommand{\firstgls}[1]{\textbf{\gls{#1}}(\glsdesc{#1})} +\newcommand{\firstacr}[1]{\textbf{\gls{#1}}~(\glssymbol{#1})} +\newcommand{\firstall}[1]{\textbf{\gls{#1}}~(\glsdesc{#1}, \glssymbol{#1})} +\newcommand{\ENNAME}[1]{\text{#1}} +\newcommand{\NUMTEXT}[1]{\text{#1}} + +% Draft +\usepackage{draftwatermark} +\SetWatermarkText{DRAFT} +\SetWatermarkLightness{0.9} +\usepackage{background} +\SetBgContents{仅供学习使用,不得用于商业目的。 +\url{https://github.com/exacity/deeplearningbook-chinese}} +\SetBgScale{1} +\SetBgAngle{0} +\SetBgOpacity{1} +\SetBgColor{red} +\SetBgPosition{current page.north} +\SetBgVshift{-0.5cm} + +\newif\ifOpenSource +\OpenSourcetrue + +% symbol and +\include{math_symbol} +\include{terminology} + + +\begin{document} + +% From en book -B +\setlength{\parskip}{0.25 \baselineskip} +% Sean said to make figures 26 picas wide +\newlength{\figwidth} +\setlength{\figwidth}{26pc} +% Spacing between notation sections +\newlength{\notationgap} +\setlength{\notationgap}{1pc} +% From en book -E + +\tableofcontents + +\newpage +\input{acknowledgments.tex} +\input{notation.tex} +\mainmatter + +\include{Chapter1/introduction} +%\include{Chapter2/linear_algebra} +%\include{Chapter3/probability_and_information_theory} +\include{Chapter4/numerical_computation} +%\include{Chapter5/machine_learning_basics} +%\include{Chapter6/deep_feedforward_networks} +\include{Chapter7/regularization} +%\include{Chapter8/optimization_for_training_deep_models} +%\include{Chapter9/convolutional_networks} +\include{Chapter10/sequence_modeling_rnn} +%\include{Chapter11/practical_methodology} +%\include{Chapter12/applications} +%\include{Chapter13/linear_factor_models} +\include{Chapter14/autoencoders} +%\include{Chapter15/representation_learning} +%\include{Chapter16/structured_probabilistic_modelling} +%\include{Chapter17/monte_carlo_methods} +%\include{Chapter18/confronting_the_partition_function} +%\include{Chapter19/approximate_inference} +%\include{Chapter20/deep_generative_models} + +\appendix + +\small{ +\bibliography{dlbook_cn} +\bibliographystyle{natbib} +\clearpage +} + +\printglossary[title=术语] +\end{document} diff --git a/figure.pdf b/figure.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c89d2e6f6159771cf51719af4009d654d528443d GIT binary patch literal 41600 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 with the docstrip utility (2.2h). +%% +%% The original source files were: +%% +%% genbst.mbs (with options: `ay,nat,seq-lab,nm-rev,dt-beg,yr-par,vol-bf, +%% volp-com,etal-it') +%% ---------------------------------------- +%% *** Personal bib style, PWD *** +%% +%% (Here are the specifications of the source file) +%% \ProvidesFile{genbst.mbs}[1994/09/16 1.5 (PWD)] +%% For use with BibTeX version 0.99a or later +%% and with LaTeX 2.09 or 2e +%%------------------------------------------------------------------- +%% NOTICE: +%% This file may be used for non-profit purposes. +%% It may not be distributed in exchange for money, +%% other than distribution costs. +%% +%% The author provides it `as is' and does not guarantee it in any way. +%% +%% Copyright (C) 1994 Patrick W. Daly +%% Max-Planck-Institut f\"ur Aeronomie +%% Postfach 20 +%% D-37189 Katlenburg-Lindau +%% Germany +%% +%% E-mail: +%% SPAN-- nsp::linmpi::daly (note nsp also known as ecd1) +%% Internet-- daly@linmpi.dnet.gwdg.de +%%----------------------------------------------------------- +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%%--------------------------------------------------------------------- + % This is an author-year citation style bibliography. As such, it is + % non-standard LaTeX, and requires a special package file to function properly. + % Such a package is natbib.sty by Patrick W. Daly + % The form of the \bibitem entries is + % \bibitem[Jones et al.(1990)]{key}... + % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... + % The essential feature is that the label (the part in brackets) consists + % of the author names, as they should appear in the citation, with the year + % in parentheses following. There must be no space before the opening + % parenthesis! + % With natbib v5.3, a full list of authors may also follow the year. + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \cite{key} ==>> Jones et al. (1990) + % \cite[]{key} ==>> (Jones et al., 1990) + % \cite[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) + % \cite[e.g.][]{key} ==>> (e.g. Jones et al., 1990) + % \cite[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) + % \citeauthor{key} Jones et al. + % \citefullauthor{key} Jones, Baker, and Smith + % \citeyear{key} 1990 +%%--------------------------------------------------------------------- + +ENTRY + { address + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + } + {} + { label extra.label sort.label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} + +STRINGS { s t } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {non.stop} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * non.stop + { "\/}" * } + { "}" * } + if$ + } + if$ +} + +FUNCTION {bolden} +{ duplicate$ empty$ + { pop$ "" } + { "{\bf " swap$ * "}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, jj}{, f.}" format.name$ 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " " * "et~al." emphasize * } + { " and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.names.ed} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f.~}{vv~}{ll}{, jj}" + format.name$ 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " " * "et~al." emphasize * } + { " and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { ", editors" * } + { ", editor" * } + if$ + } + if$ +} + +FUNCTION {format.in.editors} +{ editor empty$ + { "" } + { editor format.names.ed + editor num.names$ #1 > + { ", editors" * } + { ", editor" * } + if$ + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title "t" change.case$ + } + if$ +} + +FUNCTION {format.full.names} +{'s := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}" format.name$ 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " " * "et~al." emphasize * } + { " and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {author.editor.key.full} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {author.key.full} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {editor.key.full} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ +} + +FUNCTION {make.full.names} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.full + { type$ "proceedings" = + 'editor.key.full + 'author.key.full + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem[" write$ + label write$ + ")" make.full.names * "]{" * write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ "In " } + +FUNCTION {format.date} +{ year duplicate$ empty$ + { "empty year in " cite$ * "; set to ????" * warning$ + pop$ "????" } + 'skip$ + if$ + before.all 'output.state := + " (" swap$ * extra.label * ")" * +} + +FUNCTION {format.btitle} +{ title emphasize +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { "volume" volume tie.or.space.connect + series empty$ + 'skip$ + { " of " * series emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { "number" } + { "Number" } + if$ + number tie.or.space.connect + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { " in " * series * } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edition" * } + { edition "t" change.case$ " edition" * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "pages" pages n.dashify tie.or.space.connect } + { "page" pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + bolden + number empty$ + 'skip$ + { "(" number * ")" * * + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" } + { type "l" change.case$ } + if$ + chapter tie.or.space.connect + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { word.in booktitle emphasize * } + { word.in format.in.editors * ", " * booktitle emphasize * } + if$ + } + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ + word.in + "\cite{" * crossref * "}" * +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + word.in + } + { "Volume" volume tie.or.space.connect + " of " * + } + if$ + "\cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + "\cite{" * crossref * "}" * +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { journal emphasize "journal" output.check + format.vol.num.pages output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + new.block + format.number.series output + new.sentence + publisher "publisher" output.check + address output + } + { + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + new.block + format.title "title" output.check + new.block + howpublished output + address output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + format.chapter.pages "chapter and pages" output.check + new.block + format.number.series output + new.sentence + publisher "publisher" output.check + address output + } + { format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output + format.chapter.pages output + new.sentence + publisher "publisher" output.check + address output + format.edition output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output + format.pages output + address output + new.sentence + organization output + publisher output + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + new.block + format.btitle "title" output.check + organization address new.block.checkb + organization output + address output + format.edition output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.btitle "title" output.check + new.block + "Master's thesis" format.thesis.type output.nonnull + school "school" output.check + address output + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + new.block + format.title output + new.block + howpublished output + new.block + note output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.btitle "title" output.check + new.block + "Ph.D. thesis" format.thesis.type output.nonnull + school "school" output.check + address output + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors output + editor format.key output + format.date "year" output.check + new.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + address output + new.sentence + organization output + publisher output + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.title "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" output.check + address output + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + new.block + format.title "title" output.check + new.block + note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " " * "et~al." emphasize * } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " " * "et~al." emphasize * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.label} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + "(" + * + year duplicate$ empty$ + { pop$ "????" } + { purify$ #-1 #4 substring$ } + if$ + * + 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr + "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" + format.name$ 't := + nameptr numnames = t "others" = and + { "et al" * } + { numnames #2 > nameptr #2 = and + { "zzzzzz" * #1 'namesleft := } + { t sortify * } + if$ + } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ calc.label + label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +STRINGS { last.label next.extra } + +INTEGERS { last.extra.num } + +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ +} + +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + label extra.label * 'label := +} + +EXECUTE {initialize.extra.label.stuff} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {bib.sort.order} + +SORT + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{}" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} +%% End of customized bst file + diff --git a/notation.tex b/notation.tex new file mode 100644 index 0000000..943ced4 --- /dev/null +++ b/notation.tex @@ -0,0 +1,13 @@ +%TODO +TODO +与原书类似 +\begin{itemize} + \item $\Sa$ 数 + \item $\Va$ 向量 + \item $\MA$ 矩阵 + \item 需要时加tensor $\boldsymbol{\mathsf{A}}$ + \item $\RSa$ 随机数 + \item $\RVa$ 随机向量 + \item 需要时加随机矩阵 $\boldsymbol{\mathrm{A}}$ + \item $\SetA$ 集合 +\end{itemize} diff --git a/terminology.tex b/terminology.tex new file mode 100644 index 0000000..3327eef --- /dev/null +++ b/terminology.tex @@ -0,0 +1,5059 @@ +\newglossaryentry{DL} +{ + name=深度学习, + description={deep learning}, + sort={deep learning}, +} + +\newglossaryentry{knowledge_base} +{ + name=知识图谱, + description={knowledge base}, + sort={knowledge base}, +} + +\newglossaryentry{ML} +{ + name=机器学习, + description={machine learning}, + sort={machine learning}, +} + +\newglossaryentry{ML_model} +{ + name=机器学习模型, + description={machine learning model} +} + +\newglossaryentry{logistic_regression} +{ + name=逻辑回归, + description={logistic regression}, + sort={logistic regression}, +} + +\newglossaryentry{AI} +{ + name=人工智能, + description={artificial intelligence}, + sort={artificial intelligence}, + symbol={AI} +} + +\newglossaryentry{naive_bayes} +{ + name=朴素贝叶斯, + description={naive Bayes}, + sort={naive Bayes}, +} + +\newglossaryentry{representation} +{ + name=表示, + description={representation}, + sort={representation}, +} + +\newglossaryentry{representation_learning} +{ + name=表示学习, + description={representation learning}, + sort={representation learning}, +} + +\newglossaryentry{REPRESENTATION_LEARNING} +{ + name=表示学习, + description={REPRESENTATION LEARNING} +} + + +\newglossaryentry{AE} +{ + name=自动编码器, + description={autoencoder}, + sort={autoencoder}, +} + +\newglossaryentry{encoder} +{ + name=编码器, + description={encoder}, + sort={encoder}, +} + +\newglossaryentry{decoder} +{ + name=解码器, + description={decoder}, + sort={decoder}, +} + +\newglossaryentry{MLP} +{ + name=多层感知机, + description={multilayer perceptron}, + sort={multilayer perceptron}, + symbol={MLP} +} + +\newglossaryentry{cybernetics} +{ + name=控制论, + description={cybernetics}, + sort={cybernetics}, +} + +\newglossaryentry{connectionism} +{ + name=连接机制, + description={connectionism}, + sort={connectionism}, +} + +\newglossaryentry{ANN} +{ + name=人工神经网络, + description={artificial neural networks}, + sort={artificial neural networks}, + symbol={ANN} +} + +\newglossaryentry{NN} +{ + name=神经网络, + description={neural networks}, + sort={neural networks}, +} + +\newglossaryentry{SGD} +{ + name=随机梯度下降, + description={stochastic gradient descent}, + sort={stochastic gradient descent}, + symbol={SGD} +} + +\newglossaryentry{linear_model} +{ + name=线性模型, + description={linear model}, + sort={linear model}, +} + +\newglossaryentry{linear_regression} +{ + name=线性回归, + description={linear regression}, + sort={linear regression}, +} + + +\newglossaryentry{ReLU} +{ + name=修正线性单元, + description={rectified linear unit}, + sort={rectified linear unit}, + symbol={ReLU} +} + +\newglossaryentry{distributed_representation} +{ + name=分布式表示, + description={distributed representation}, + sort={distributed representation}, +} + +\newglossaryentry{hidden_unit} +{ + name=隐藏单元, + description={hidden unit}, + sort={hidden unit}, +} + +\newglossaryentry{LSTM} +{ + name=长短期记忆, + description={long short-term memory}, + sort={long short-term memory}, + symbol={LSTM} +} + +\newglossaryentry{DBN} +{ + name=深度信念网络, + description={deep belief network}, + sort={deep belief network}, + symbol={DBN} +} + +\newglossaryentry{RNN} +{ + name=循环神经网络, + description={recurrent neural network}, + sort={recurrent neural network}, + symbol={RNN} +} + +\newglossaryentry{RL} +{ + name=强化学习, + description={reinforcement learning}, + sort={reinforcement learning}, +} + +\newglossaryentry{inference} +{ + name=推断, + description={inference}, + sort={inference}, +} + +\newglossaryentry{overflow} +{ + name=上溢, + description={overflow}, + sort={overflow}, +} + +\newglossaryentry{underflow} +{ + name=下溢, + description={underflow}, + sort={underflow}, +} + +\newglossaryentry{softmax} +{ + name=softmax函数, + description={softmax function}, + sort={softmax function}, +} + +\newglossaryentry{softmax_unit} +{ + name=softmax单元, + description={softmax unit} +} + +\newglossaryentry{softmax_chap11} +{ + name=softmax, + description={softmax} +} + +\newglossaryentry{multinoulli} +{ + name=multinoulli分布, + description={multinoulli distribution}, + sort={multinoulli distribution}, +} + +\newglossaryentry{poor_conditioning} +{ + name=病态条件数, + description={Poor Conditioning}, + sort={Poor Conditioning}, +} + +\newglossaryentry{objective_function} +{ + name=目标函数, + description={objective function}, + sort={objective function}, +} + +\newglossaryentry{criterion} +{ + name=判据, + description={criterion}, + sort={criterion}, +} + +\newglossaryentry{cost_function} +{ + name=代价函数, + description={cost function}, + sort={cost function}, +} + +\newglossaryentry{loss_function} +{ + name=损失函数, + description={loss function}, + sort={loss function}, +} + +\newglossaryentry{error_function} +{ + name=误差函数, + description={error function}, + sort={error function}, +} + +\newglossaryentry{GD} +{ + name=梯度下降, + description={gradient descent}, + sort={gradient descent}, +} + +\newglossaryentry{derivative} +{ + name=导数, + description={derivative}, + sort={derivative}, +} + +\newglossaryentry{critical_points} +{ + name=临界点, + description={critical points}, + sort={critical points}, +} + +\newglossaryentry{stationary_point} +{ + name=驻点, + description={stationary point}, + sort={stationary point}, +} + +\newglossaryentry{local_minimum} +{ + name=局部极小点, + description={local minimum}, + sort={local minimum}, +} + +\newglossaryentry{local_minima} +{ + name=局部极小值, + description={local minima} +} + +\newglossaryentry{local_maximum} +{ + name=局部极大点, + description={local maximum}, + sort={local maximum}, +} + +\newglossaryentry{saddle_points} +{ + name=鞍点, + description={saddle points}, + sort={saddle points}, +} + +\newglossaryentry{global_minimum} +{ + name=全局最小点, + description={global minimum}, + sort={global minimum}, +} + +\newglossaryentry{partial_derivatives} +{ + name=偏导数, + description={partial derivatives}, + sort={partial derivatives}, +} + +\newglossaryentry{gradient} +{ + name=梯度, + description={gradient}, + sort={gradient}, +} + +\newglossaryentry{directional_derivative} +{ + name=方向导数, + description={directional derivative}, + sort={directional derivative}, +} + +\newglossaryentry{line_search} +{ + name=线搜索, + description={line search}, + sort={line search}, +} + +\newglossaryentry{example} +{ + name=样例, + description={example}, + sort={example}, +} + +\newglossaryentry{hill_climbing} +{ + name=爬山, + description={hill climbing}, + sort={hill climbing}, +} + +\newglossaryentry{jacobian} +{ + name=雅各比, + description={Jacobian}, + sort={Jacobian}, +} + +\newglossaryentry{hessian} +{ + name=海森, + description={Hessian}, + sort={Hessian}, +} + +\newglossaryentry{second_derivative} +{ + name=二阶导数, + description={second derivative}, + sort={second derivative}, +} + +\newglossaryentry{curvature} +{ + name=曲率, + description={curvature}, + sort={curvature}, +} + +\newglossaryentry{taylor} +{ + name=泰勒, + description={taylor}, + sort={taylor}, +} + +\newglossaryentry{second_derivative_test} +{ + name=二阶导数测试, + description={second derivative test}, + sort={second derivative test}, +} + +\newglossaryentry{newton_method} +{ + name=牛顿法, + description={Newton's method}, + sort={Newton's method}, +} + +\newglossaryentry{lipschitz} +{ + name=Lipschitz, + description={Lipschitz}, + sort={Lipschitz}, +} + +\newglossaryentry{lipschitz_continuous} +{ + name=Lipschitz连续, + description={Lipschitz continuous}, + sort={Lipschitz continuous}, +} + +\newglossaryentry{lipschitz_constant} +{ + name=Lipschitz常数, + description={Lipschitz constant}, + sort={Lipschitz constant}, +} + +\newglossaryentry{convex_optimization} +{ + name=凸优化, + description={Convex optimization}, + sort={Convex optimization}, +} + +\newglossaryentry{constrained_optimization} +{ + name=约束优化, + description={constrained optimization}, + sort={constrained optimization}, +} + +\newglossaryentry{feasible} +{ + name=可行, + description={feasible}, + sort={feasible}, +} + +\newglossaryentry{KKT} +{ + name=Karush–Kuhn–Tucker, + description={Karush–Kuhn–Tucker}, + sort={Karush–Kuhn–Tucker}, + symbol=KKT +} + +\newglossaryentry{generalized_lagrangian} +{ + name=广义Lagrangian, + description={generalized Lagrangian}, + sort={generalized Lagrangian}, +} + +\newglossaryentry{generalized_lagrange_function} +{ + name=广义Lagrange函数, + description={generalized Lagrange function}, + sort={generalized Lagrange function}, +} + +\newglossaryentry{equality_constraints} +{ + name=等式约束, + description={equality constraints}, + sort={equality constraints}, +} + +\newglossaryentry{inequality_constraints} +{ + name=不等式约束, + description={inequality constraints}, + sort={inequality constraints}, +} + +\newglossaryentry{regularization} +{ + name=正则化, + description={regularization}, + sort={regularization}, +} + +\newglossaryentry{regularizer} +{ + name=正则化项, + description={regularizer} +} + +\newglossaryentry{generalization} +{ + name=泛化, + description={generalization}, + sort={generalization}, +} + +\newglossaryentry{underfitting} +{ + name=欠拟合, + description={underfitting}, + sort={underfitting}, +} + +\newglossaryentry{overfitting} +{ + name=过拟合, + description={overfitting}, + sort={overfitting}, +} + +\newglossaryentry{bias_sta} +{ + name=偏差, + description={bias in statistics}, + sort={bias in statistics}, +} + +\newglossaryentry{bias_aff} +{ + name=偏置, + description={bias in affine function}, + sort={bias in affine function}, +} + +\newglossaryentry{variance} +{ + name=方差, + description={variance}, + sort={variance}, +} + +\newglossaryentry{ensemble} +{ + name=集成, + description={ensemble}, + sort={ensemble}, +} + +\newglossaryentry{estimator} +{ + name=估计量, + description={estimator}, + sort={estimator}, +} + +\newglossaryentry{weight_decay} +{ + name=权重衰减, + description={weight decay}, + sort={weight decay}, +} + +\newglossaryentry{ridge_regression} +{ + name=岭回归, + description={ridge regression}, + sort={ridge regression}, +} + +\newglossaryentry{tikhonov_regularization} +{ + name=Tikhonov正则, + description={Tikhonov regularization}, + sort={Tikhonov regularization}, +} + +\newglossaryentry{covariance} +{ + name=协方差, + description={covariance}, + sort={covariance}, +} + +\newglossaryentry{sparse} +{ + name=稀疏, + description={sparse}, + sort={sparse}, +} + +\newglossaryentry{feature_selection} +{ + name=特征选择, + description={feature selection}, + sort={feature selection}, +} + +\newglossaryentry{MAP} +{ + name=最大后验, + description={Maximum A Posteriori}, + sort={Maximum A Posteriori}, + symbol={MAP} +} + +\newglossaryentry{pooling} +{ + name=池化, + description={pooling}, + sort={pooling}, +} + +\newglossaryentry{dropout} +{ + name=dropout, + description={dropout}, + sort={dropout}, +} + +\newglossaryentry{monte_carlo} +{ + name=蒙特卡罗, + description={Monte Carlo}, + sort={Monte Carlo}, +} + +\newglossaryentry{MONTE_CARLO} +{ + name=蒙特卡罗, + description={Monte Carlo}, + sort={Monte Carlo}, +} + +\newglossaryentry{early_stopping} +{ + name=提前终止, + description={early stopping}, + sort={early stopping}, +} + +\newglossaryentry{CNN} +{ + name=卷积神经网络, + description={convolutional neural network}, + sort={convolutional neural network}, + symbol={CNN} +} + +\newglossaryentry{mcmc} +{ + name=马尔可夫链蒙特卡罗, + description={Markov Chain Monte Carlo}, + symbol={MCMC}, + sort={Markov Chain Monte Carlo}, +} + +\newglossaryentry{markov_chain} +{ + name=马尔可夫链, + description={Markov Chain}, + sort={Markov Chain}, +} + +\newglossaryentry{harris_chain} +{ + name=哈里斯链, + description={Harris Chain}, + sort={Harris Chain}, +} + +\newglossaryentry{minibatch} +{ + name=minibatch, + description={minibatch}, + sort={minibatch}, +} + +\newglossaryentry{importance_sampling} +{ + name=重要采样, + description={Importance Sampling}, + sort={Importance Sampling}, +} + +\newglossaryentry{undirected_model} +{ + name=无向模型, + description={undirected Model}, + sort={undirected Model}, +} + +\newglossaryentry{partition_function} +{ + name=分割函数, + description={Partition Function}, + sort={Partition Function}, +} + +\newglossaryentry{law_of_large_numbers} +{ + name=大数定理, + description={Law of large number}, + sort={Law of large number}, +} + +\newglossaryentry{central_limit_theorem} +{ + name=中心极限定理, + description={central limit theorem}, + sort={central limit theorem}, +} + +\newglossaryentry{energy_based_model} +{ + name=基于能量的模型, + description={Energy-based model}, + sort={Energy-based model}, +} + +\newglossaryentry{tempering} +{ + name=回火, + description={tempering}, + sort={tempering}, +} + +\newglossaryentry{biased_importance_sampling} +{ + name=有偏重要采样, + description={biased importance sampling}, + sort={biased importance sampling}, +} + +\newglossaryentry{VAE} +{ + name=变分自编码, + description={variational auto-encoder}, + sort={variational auto-encoder}, +} + +\newglossaryentry{CV} +{ + name=计算机视觉, + description={Computer Vision}, + sort={Computer Vision}, +} + +\newglossaryentry{SR} +{ + name=语音识别, + description={Speech Recognition}, + sort={Speech Recognition}, +} + +\newglossaryentry{NLP} +{ + name=自然语言处理, + description={Natural Language Processing}, + sort={Natural Language Processing}, + symbol={NLP} +} + +\newglossaryentry{RBM} +{ + name=受限玻耳兹曼机, + description={Restricted Boltzmann Machine}, + sort={Restricted Boltzmann Machine}, + symbol={RBM} +} + +\newglossaryentry{discriminative_RBM} +{ + name=辨别RBM, + description={discriminative RBM}, +} + +\newglossaryentry{Boltzmann} +{ + name=玻耳兹曼, + description={Boltzmann}, + sort={Boltzmann}, +} + +\newglossaryentry{BM} +{ + name=玻耳兹曼机, + description={Boltzmann Machine}, + sort={Boltzmann Machine}, +} + +\newglossaryentry{DBM} +{ + name=深度玻耳兹曼机, + description={Deep Boltzmann Machine}, + sort={Deep Boltzmann Machine}, + symbol={DBM} +} + +\newglossaryentry{directed_model} +{ + name=有向模型, + description={Directed Model}, + sort={Directed Model}, +} + +\newglossaryentry{ancestral_sampling} +{ + name=原始采样, + description={Ancestral Sampling}, + sort={Ancestral Sampling}, +} + +\newglossaryentry{stochastic_matrix} +{ + name=随机矩阵, + description={Stochastic Matrix}, + sort={Stochastic Matrix}, +} + +\newglossaryentry{stationary_distribution} +{ + name=静态分布, + description={Stationary Distribution}, + sort={Stationary Distribution}, +} + +\newglossaryentry{equilibrium_distribution} +{ + name=平衡分布, + description={Equilibrium Distribution}, + sort={Equilibrium Distribution}, +} + +\newglossaryentry{index} +{ + name=指标, + description={index of matrix}, + sort={index of matrix}, +} + +\newglossaryentry{burn_in} +{ + name=预烧, + description={Burning-in}, + sort={Burning-in}, +} + +\newglossaryentry{mixing_time} +{ + name=混合时间, + description={Mixing Time}, + sort={Mixing Time}, +} + +\newglossaryentry{mixing} +{ + name=混合, + description={Mixing}, + sort={Mixing}, +} + +\newglossaryentry{gibbs_sampling} +{ + name=吉布斯采样, + description={Gibbs Sampling}, + sort={Gibbs Sampling}, +} + +\newglossaryentry{block_gibbs_sampling} +{ + name=块吉布斯采样, + description={block Gibbs Sampling}, + sort={block Gibbs Sampling}, +} + +\newglossaryentry{gibbs_steps} +{ + name=吉布斯步数, + description={Gibbs steps} +} + +\newglossaryentry{bagging} +{ + name=Bagging, + description={bootstrap aggregating}, + sort={bagging}, +} + +\newglossaryentry{mask} +{ + name=掩码, + description={mask}, + sort={mask}, +} + +\newglossaryentry{batch_normalization} +{ + name=batch normalization, + description={batch normalization}, + sort={batch normalization}, +} + +\newglossaryentry{parameter_sharing} +{ + name=参数共享, + description={parameter sharing}, + sort={parameter sharing}, +} + +\newglossaryentry{KL} +{ + name=KL散度, + description={KL divergence}, + sort={KL}, +} + +\newglossaryentry{temperature} +{ + name=温度, + description={temperature}, + sort={temperature}, +} + +\newglossaryentry{critical_temperatures} +{ + name=临界温度, + description={critical temperatures}, + sort={critical temperatures}, +} + +\newglossaryentry{parallel_tempering} +{ + name=并行回火, + description={parallel tempering}, + sort={parallel tempering}, +} + +\newglossaryentry{ASR} +{ + name=自动语音识别, + description={Automatic Speech Recognition}, + sort={Automatic Speech Recognition}, + symbol={ASR} +} + +\newglossaryentry{GP_GPU} +{ + name=通用GPU, + description={general purpose GPU}, + sort={general purpose GPU}, +} + +\newglossaryentry{coalesced} +{ + name=级联, + description={coalesced}, + sort={coalesced}, +} + +\newglossaryentry{warp} +{ + name=warp, + description={warp}, + sort={warp}, +} + +\newglossaryentry{data_parallelism} +{ + name=数据并行, + description={data parallelism}, + sort={data parallelism}, +} + +\newglossaryentry{model_parallelism} +{ + name=模型并行, + description={model parallelism}, + sort={model parallelism}, +} + +\newglossaryentry{ASGD} +{ + name=异步随机梯度下降, + description={Asynchoronous Stochastic Gradient Descent}, + sort={Asynchoronous Stochastic Gradient Descent}, +} + +\newglossaryentry{parameter_server} +{ + name=参数服务器, + description={parameter server}, + sort={parameter server}, +} + +\newglossaryentry{model_compression} +{ + name=模型压缩, + description={model compression}, + sort={model compression}, +} + +\newglossaryentry{dynamic_structure} +{ + name=动态结构, + description={dynamic structure}, + sort={dynamic structure}, +} + +\newglossaryentry{conditional_computation} +{ + name=条件计算, + description={conditional computation}, + sort={conditional computation}, +} + +\newglossaryentry{sphering} +{ + name=sphering, + description={sphering}, + sort={sphering}, +} + +\newglossaryentry{GCN} +{ + name=全局对比度归一化, + description={Global contrast normalization}, + sort={Global contrast normalization}, + symbol={GCN} +} + +\newglossaryentry{LCN} +{ + name=局部对比度归一化, + description={local contrast normalization}, + symbol={LCN}, + sort={local contrast normalization}, +} + +\newglossaryentry{HMM} +{ + name=隐马尔可夫模型, + description={Hidden Markov Models}, + sort={Hidden Markov Models}, + symbol={HMMs} +} + +\newglossaryentry{GMM} +{ + name=高斯混合模型, + description={Gaussian Mixture Models}, + sort={Gaussian Mixture Models}, + symbol={GMMs} +} + +\newglossaryentry{transcribe} +{ + name=转录, + description={transcribe}, + sort={transcribe}, +} + +\newglossaryentry{PCA} +{ + name=主成分分析, + description={principal components analysis}, + sort={principal components analysis}, + symbol={PCA} +} + +\newglossaryentry{FA} +{ + name=因子分析, + description={factor analysis}, + sort={factor analysis}, +} + +\newglossaryentry{ICA} +{ + name=独立分量分析, + description={independent component analysis}, + sort={independent component analysis}, + symbol={ICA} +} + +\newglossaryentry{sparse_coding} +{ + name=稀疏编码, + description={sparse coding}, + sort={sparse coding}, +} + +\newglossaryentry{fixed_point_arithmetic} +{ + name=固定点运算, + description={fixed-point arithmetic}, + sort={fixed-point arithmetic}, +} + +\newglossaryentry{float_point_arithmetic} +{ + name=浮点数运算, + description={float-point arithmetic}, + sort={float-point arithmetic}, +} + +\newglossaryentry{GPU} +{ + name=图形处理器, + description={Graphics Processing Units}, + sort={Graphics Processing Units}, + symbol={GPU} +} + +\newglossaryentry{generative_model} +{ + name=生成模型, + description={generative model}, + sort={generative model}, +} + +\newglossaryentry{dataset_augmentation} +{ + name=数据集增强, + description={dataset augmentation}, + sort={dataset augmentation}, +} + +\newglossaryentry{whitening} +{ + name=whitening, + description={whitening}, + sort={whitening}, +} + +\newglossaryentry{DNN} +{ + name=深度神经网络, + description={DNN}, + sort={DNN}, +} + +\newglossaryentry{end_to_end} +{ + name=端到端的, + description={end-to-end}, + sort={end-to-end}, +} + +\newglossaryentry{STRUCTURED_PROBABILISTIC_MODELS} +{ + name=结构化概率模型, + description={STRUCTURED PROBABILISTIC MODELS}, + sort={STRUCTURED PROBABILISTIC MODELS}, +} + +\newglossaryentry{structured_probabilistic_models} +{ + name=结构化概率模型, + description={structured probabilistic models}, + sort={structured probabilistic models}, +} + +\newglossaryentry{graphical_models} +{ + name=图模型, + description={graphical models}, + sort={graphical models}, +} + +\newglossaryentry{directed_graphical_model} +{ + name=有向图模型, + description={directed graphical model}, + sort={directed graphical model}, +} + +\newglossaryentry{dependency} +{ + name=依赖性, + description={dependency}, + sort={dependency}, +} + +\newglossaryentry{bayesian_network} +{ + name=贝叶斯网络, + description={Bayesian network}, + sort={Bayesian network}, +} + +\newglossaryentry{model_averaging} +{ + name=模型平均, + description={model averaging}, + sort={model averaging}, +} + +\newglossaryentry{boosting} +{ + name=Boosting, + description={Boosting}, + sort={Boosting}, +} + +\newglossaryentry{weight_scaling_inference_rule} +{ + name=权重比例推理规则, + description={weight scaling inference rule}, + sort={weight scaling inference rule}, +} + +\newglossaryentry{statement} +{ + name=陈述, + description={statement}, + sort={statement}, +} + +\newglossaryentry{quantum_mechanics} +{ + name=量子力学, + description={quantum mechanics}, + sort={quantum mechanics}, +} + +\newglossaryentry{subatomic} +{ + name=亚原子, + description={subatomic}, + sort={subatomic}, +} + +\newglossaryentry{fidelity} +{ + name=逼真度, + description={fidelity}, + sort={fidelity}, +} + +\newglossaryentry{degree_of_belief} +{ + name=信任度, + description={degree of belief}, + sort={degree of belief}, +} + +\newglossaryentry{frequentist_probability} +{ + name=频率概率, + description={frequentist probability}, + sort={frequentist probability}, +} + +\newglossaryentry{bayesian_probability} +{ + name=贝叶斯概率, + description={Bayesian probability}, + sort={Bayesian probability}, +} + +\newglossaryentry{likelihood} +{ + name=似然, + description={likelihood}, + sort={likelihood}, +} + +\newglossaryentry{RV} +{ + name=随机变量, + description={random variable}, + sort={random variable}, +} + +\newglossaryentry{PD} +{ + name=概率分布, + description={probability distribution}, + sort={probability distribution}, +} + +\newglossaryentry{PMF} +{ + name=概率分布律函数, + description={probability mass function}, + sort={probability mass function}, + symbol={PMF} +} + +\newglossaryentry{joint_probability_distribution} +{ + name=联合概率分布, + description={joint probability distribution}, + sort={joint probability distribution}, +} + +\newglossaryentry{normalized} +{ + name=归一性, + description={normalized}, + sort={normalized}, +} + +\newglossaryentry{uniform_distribution} +{ + name=均匀分布, + description={uniform distribution}, + sort={uniform distribution}, +} + +\newglossaryentry{PDF} +{ + name=概率密度函数, + description={probability density function}, + sort={probability density function}, + symbol={PDF} +} + +\newglossaryentry{marginal_probability_distribution} +{ + name=边缘概率分布, + description={marginal probability distribution}, + sort={marginal probability distribution}, +} + +\newglossaryentry{sum_rule} +{ + name=求和法则, + description={sum rule}, + sort={sum rule}, +} + +\newglossaryentry{conditional_probability} +{ + name=条件概率, + description={conditional probability}, + sort={conditional probability}, +} + +\newglossaryentry{intervention_query} +{ + name=干预查询, + description={intervention query}, + sort={intervention query}, +} + +\newglossaryentry{causal_modeling} +{ + name=因果模型, + description={causal modeling}, + sort={causal modeling}, +} + +\newglossaryentry{chain_rule} +{ + name=链式法则, + description={chain rule}, + sort={chain rule}, +} + +\newglossaryentry{product_rule} +{ + name=乘法法则, + description={product rule}, + sort={product rule}, +} + +\newglossaryentry{independent} +{ + name=相互独立的, + description={independent}, + sort={independent}, +} + +\newglossaryentry{conditionally_independent} +{ + name=条件独立的, + description={conditionally independent}, + sort={conditionally independent}, +} + +\newglossaryentry{expectation} +{ + name=期望, + description={expectation}, + sort={expectation}, +} + +\newglossaryentry{expected_value} +{ + name=期望值, + description={expected value}, + sort={expected value}, +} + +\newglossaryentry{example:chap5} +{ + name=样本, + description={example}, + sort={example}, +} + +\newglossaryentry{feature} +{ + name=特征, + description={feature}, + sort={feature}, +} + +\newglossaryentry{accuracy} +{ + name=准确率, + description={accuracy}, + sort={accuracy}, +} + +\newglossaryentry{error_rate} +{ + name=错误率, + description={error rate}, + sort={error rate}, +} + +\newglossaryentry{training_set} +{ + name=训练集, + description={training set}, + sort={training set}, +} + +\newglossaryentry{test_set} +{ + name=测试集, + description={test set}, + sort={test set}, +} + +\newglossaryentry{performance_measures} +{ + name=性能衡量, + description={performance measures}, + sort={performance measures}, +} + +\newglossaryentry{experience} +{ + name=经验, + description={experience, E}, + sort={experience, E}, +} + +\newglossaryentry{unsupervised} +{ + name=无监督, + description={unsupervised}, + sort={unsupervised}, +} + +\newglossaryentry{supervised} +{ + name=监督, + description={supervised}, + sort={supervised}, +} + +\newglossaryentry{semi_supervised} +{ + name=半监督, + description={semi-supervised} +} + +\newglossaryentry{supervised_learning} +{ + name=监督学习, + description={supervised learning}, + sort={supervised learning}, +} + +\newglossaryentry{unsupervised_learning} +{ + name=无监督学习, + description={unsupervised learning}, + sort={unsupervised learning}, +} + +\newglossaryentry{dataset} +{ + name=数据集, + description={dataset}, + sort={dataset}, +} + +\newglossaryentry{data_points} +{ + name=数据点, + description={data points}, + sort={data points}, +} + +\newglossaryentry{label} +{ + name=标签, + description={label}, + sort={label}, +} + +\newglossaryentry{target} +{ + name=目标, + description={target}, + sort={target}, +} + +\newglossaryentry{reinforcement_learning} +{ + name=强化学习, + description={reinforcement learning}, + sort={reinforcement learning}, +} + +\newglossaryentry{design_matrix} +{ + name=设计矩阵, + description={design matrix}, + sort={design matrix}, +} + +\newglossaryentry{parameters} +{ + name=参数, + description={parameters}, + sort={parameters}, +} + +\newglossaryentry{weights} +{ + name=权重, + description={weights}, + sort={weights}, +} + +\newglossaryentry{mean_squared_error} +{ + name=均方误差, + description={mean squared error}, + sort={mean squared error}, + symbol={MSE} +} + +\newglossaryentry{normal_equations} +{ + name=标准方程, + description={normal equations}, + sort={normal equations}, +} + +\newglossaryentry{bias} +{ + name=偏置, + description={bias}, + sort={bias}, +} + +\newglossaryentry{training_error} +{ + name=训练误差, + description={training error}, + sort={training error}, +} + +\newglossaryentry{generalization_error} +{ + name=泛化误差, + description={generalization error}, + sort={generalization error}, +} + +\newglossaryentry{test_error} +{ + name=测试误差, + description={test error}, + sort={test error}, +} + +\newglossaryentry{hypothesis_space} +{ + name=假设空间, + description={hypothesis space}, + sort={hypothesis space}, +} + +\newglossaryentry{capacity} +{ + name=容量, + description={capacity}, + sort={capacity}, +} + +\newglossaryentry{representational_capacity} +{ + name=表示容量, + description={representational capacity}, + sort={representational capacity}, +} + +\newglossaryentry{effective_capacity} +{ + name=有效容量, + description={effective capacity}, + sort={effective capacity}, +} + +\newglossaryentry{nonparametric} +{ + name=非参数, + description={non-parametric}, + sort={non-parametric}, +} + +\newglossaryentry{nearest_neighbor_regression} +{ + name=最近邻回归, + description={nearest neighbor regression}, + sort={nearest neighbor regression}, +} + +\newglossaryentry{bayes_error} +{ + name=贝叶斯误差, + description={Bayes error}, + sort={Bayes error}, +} + +\newglossaryentry{no_free_lunch_theorem} +{ + name=没有免费午餐定理, + description={no free lunch theorem}, + sort={no free lunch theorem}, +} + +\newglossaryentry{setting} +{ + name=设定, + description={setting}, + sort={setting}, +} + +\newglossaryentry{validation_set} +{ + name=验证集, + description={validation set}, + sort={validation set}, +} + +\newglossaryentry{benchmarks} +{ + name=基准, + description={bechmarks}, + sort={bechmarks}, +} + +\newglossaryentry{point_estimator} +{ + name=点估计, + description={point estimator}, + sort={point estimator}, +} + +\newglossaryentry{estimator:chap5} +{ + name=估计, + description={estimator}, + sort={estimator}, +} + +\newglossaryentry{statistics} +{ + name=统计量, + description={statistics}, + sort={statistics}, +} + +\newglossaryentry{unbiased} +{ + name=无偏, + description={unbiased}, + sort={unbiased}, +} + +\newglossaryentry{asymptotically_unbiased} +{ + name=渐近无偏, + description={asymptotically unbiased}, + sort={asymptotically unbiased}, +} + +\newglossaryentry{sample_mean} +{ + name=样本均值, + description={sample mean}, + sort={sample mean}, +} + +\newglossaryentry{sample_variance} +{ + name=样本方差, + description={sample variance}, + sort={sample variance}, +} + +\newglossaryentry{unbiased_sample_variance} +{ + name=样本方差, + description={unbiased sample variance}, + sort={unbiased sample variance}, +} + +\newglossaryentry{standard_error} +{ + name=标准差, + description={standard error}, + sort={standard error}, +} + +\newglossaryentry{consistency} +{ + name=一致性, + description={consistency}, + sort={consistency}, +} + +\newglossaryentry{almost_sure} +{ + name=几乎必然, + description={almost sure}, + sort={almost sure}, +} + +\newglossaryentry{almost_sure_convergence} +{ + name=几乎必然收敛, + description={almost sure convergence}, + sort={almost sure convergence}, +} + +\newglossaryentry{statistical_efficiency} +{ + name=统计效率, + description={statistic efficiency}, + sort={statistic efficiency}, +} + +\newglossaryentry{parametric_case} +{ + name=有参情况, + description={parametric case}, + sort={parametric case}, +} + +\newglossaryentry{frequentist_statistics} +{ + name=频率统计, + description={frequentist statistics}, + sort={frequentist statistics}, +} + +\newglossaryentry{bayesian_statistics} +{ + name=贝叶斯统计, + description={Bayesian statistics}, + sort={Bayesian statistics}, +} + +\newglossaryentry{prior_probability_distribution} +{ + name=先验概率分布, + description={prior probability distribution}, + sort={prior probability distribution}, +} + +\newglossaryentry{maximum_a_posteriori} +{ + name=最大后验, + description={maximum a posteriori}, + sort={maximum a posteriori}, +} + +\newglossaryentry{maximum_likelihood_estimation} +{ + name=最大似然估计, + description={maximum likelihood estimation}, + sort={maximum likelihood estimation}, +} + +\newglossaryentry{kernel_trick} +{ + name=核技巧, + description={kernel trick}, + sort={kernel trick}, +} + +\newglossaryentry{kernel} +{ + name=核, + description={kernel function}, + sort={kernel function}, +} + +\newglossaryentry{gaussian_kernel} +{ + name=高斯核, + description={Gaussian kernel}, + sort={Gaussian kernel}, +} + +\newglossaryentry{kernel_machines} +{ + name=核机器, + description={kernel machines}, + sort={kernel machines}, +} +\newglossaryentry{kernel_methods} +{ + name=核方法, + description={kernel methods}, + sort={kernel methods}, +} + +\newglossaryentry{support_vectors} +{ + name=支持向量, + description={support vectors}, + sort={support vectors}, +} + +\newglossaryentry{SVM} +{ + name=支持向量机, + description={support vector machine}, + symbol={SVM} +} + +\newglossaryentry{phoneme} +{ + name=音位, + description={phoneme}, + sort={phoneme}, +} + +\newglossaryentry{acoustic} +{ + name=声学, + description={acoustic}, + sort={acoustic}, +} + +\newglossaryentry{phonetic} +{ + name=语音, + description={phonetic}, + sort={phonetic}, +} + +\newglossaryentry{mixture_of_experts} +{ + name=专家混合体, + description={mixture of experts}, + sort={mixture of experts}, +} + +\newglossaryentry{hard_mixture_of_experts} +{ + name=硬专家混合体, + description={hard mixture of experts}, + sort={hard mixture of experts}, +} + +\newglossaryentry{gater} +{ + name=选通器, + description={gater}, + sort={gater}, +} + +\newglossaryentry{expert_network} +{ + name=专家网络, + description={expert network}, + sort={expert network}, +} + +\newglossaryentry{attention_mechanism} +{ + name=注意机制, + description={attention mechanism}, + sort={attention mechanism}, +} + +\newglossaryentry{fast_dropout} +{ + name=快速dropout, + description={fast dropout}, + sort={fast dropout}, +} + +\newglossaryentry{dropout_boosting} +{ + name=dropout boosting, + description={dropout boosting}, + sort={dropout boosting}, +} + +\newglossaryentry{adversarial_example} +{ + name=对抗样本, + description={adversarial example}, + sort={adversarial example}, +} + +\newglossaryentry{virtual_adversarial_example} +{ + name=虚拟对抗样本, + description={virtual adversarial example}, + sort={virtual adversarial example}, +} + +\newglossaryentry{adversarial_training} +{ + name=对抗训练, + description={adversarial training}, + sort={adversarial training}, +} + +\newglossaryentry{virtual_adversarial_training} +{ + name=虚拟对抗训练, + description={virtual adversarial training} +} + +\newglossaryentry{tangent_distance} +{ + name=切面距离, + description={tangent distance}, + sort={tangent distance}, +} + +\newglossaryentry{tangent_prop} +{ + name=正切传播, + description={tangent prop}, + sort={tangent prop}, +} + +\newglossaryentry{tangent_propagation} +{ + name=正切传播, + description={tangent propagation} +} + +\newglossaryentry{double_backprop} +{ + name=双反向传播, + description={double backprop}, + sort={double backprop}, +} + +\newglossaryentry{EM} +{ + name=期望最大化, + description={expectation maximization}, + sort={expectation maximization}, + symbol={EM} +} + +\newglossaryentry{mean_field} +{ + name=均匀场, + description={mean-field}, + sort={mean-field}, +} + +\newglossaryentry{ELBO} +{ + name=证据下界, + description={evidence lower bound}, + sort={evidence lower bound}, + symbol={ELBO} +} + +\newglossaryentry{variational_free_energy} +{ + name=变分自由能, + description={variational free energy}, + sort={variational free energy}, +} + +\newglossaryentry{structured_variational_inference} +{ + name=结构化变分推断, + description={structured variational inference}, + sort={structured variational inference}, +} + +\newglossaryentry{binary_sparse_coding} +{ + name=二值稀疏编码, + description={binary sparse coding}, + sort={binary sparse coding}, +} + +\newglossaryentry{feedforward_network} +{ + name=前馈网络, + description={feedforward networks}, + sort={feedforward networks}, +} + +\newglossaryentry{transition} +{ + name=转移, + description={transition}, + sort={transition}, +} + +\newglossaryentry{reconstruction} +{ + name=重构, + description={reconstruction}, + sort={reconstruction}, +} + +\newglossaryentry{GSN} +{ + name=生成随机网络, + description={generative stochastic networks}, + sort={generative stochastic networks}, + symbol={GSN} +} + +\newglossaryentry{score_matching} +{ + name=分数匹配, + description={score matching}, + sort={score matching}, +} + +\newglossaryentry{factorial} +{ + name=factorial, + description={factorial}, + sort={factorial}, +} + +\newglossaryentry{meanfield} +{ + name=meanfield, + description={meanfield}, + sort={meanfield}, +} + +\newglossaryentry{MLE} +{ + name=最大似然估计, + description={maximum likelihood learning}, + sort={maximum likelihood learning}, +} + +\newglossaryentry{PPCA} +{ + name=概率PCA, + description={probabilistic PCA}, + sort={probabilistic PCA}, + symbol={PPCA} +} + +\newglossaryentry{SGA} +{ + name=随机梯度上升, + description={Stochastic Gradient Ascent}, + sort={Stochastic Gradient Ascent}, +} + +\newglossaryentry{clique} +{ + name=团, + description={clique}, + sort={clique}, +} + +\newglossaryentry{dirac_distribution} +{ + name=Dirac分布, + description={dirac distribution}, + sort={dirac distribution}, +} + +\newglossaryentry{fixed_point_equation} +{ + name=固定点方程, + description={fixed point equation}, + sort={fixed point equation}, +} + +\newglossaryentry{calculus_of_variations} +{ + name=变分法, + description={calculus of variations}, + sort={calculus of variations}, +} + +\newglossaryentry{wake_sleep} +{ + name=wake sleep, + description={wake sleep}, + sort={wake sleep}, +} + +\newglossaryentry{BN} +{ + name=信念网络, + description={belief network}, + sort={belief network}, +} + +\newglossaryentry{MRF} +{ + name=马尔可夫随机场, + description={Markov random fields}, + sort={Markov random fields}, + symbol={MRF} +} + +\newglossaryentry{markov_network} +{ + name=马尔可夫网络, + description={Markov network}, + sort={Markov network}, +} + +\newglossaryentry{log_linear_model} +{ + name=对数线性模型, + description={log-linear models}, + sort={log-linear models}, +} + +\newglossaryentry{product_of_expert} +{ + name=专家之积, + description={product of expert}, + sort={product of expert}, +} + +\newglossaryentry{free_energy} +{ + name=自由能, + description={free energy}, + sort={free energy}, +} + +\newglossaryentry{harmony} +{ + name=harmony, + description={harmony}, + sort={harmony}, +} + +\newglossaryentry{separation} +{ + name=separation, + description={separation}, + sort={separation}, +} + +\newglossaryentry{local_conditional_probability_distribution} +{ + name=局部条件概率分布, + description={local conditional probability distribution}, + sort={local conditional probability distribution}, +} + +\newglossaryentry{conditional_probability_distribution} +{ + name=条件概率分布, + description={conditional probability distribution} +} + +\newglossaryentry{boltzmann_distribution} +{ + name=玻耳兹曼分布, + description={Boltzmann distribution}, + sort={Boltzmann distribution}, +} + +\newglossaryentry{gibbs_distribution} +{ + name=吉布斯分布, + description={Gibbs distribution}, + sort={Gibbs distribution}, +} + +\newglossaryentry{energy_function} +{ + name=能量函数, + description={energy function}, + sort={energy function}, +} + +\newglossaryentry{immorality} +{ + name=不道德, + description={immorality}, + sort={immorality}, +} + +\newglossaryentry{moralized_graph} +{ + name=道德图, + description={moralized graph}, + sort={moralized graph}, +} + +\newglossaryentry{standard_deviation} +{ + name=标准差, + description={standard deviation}, + sort={standard deviation}, +} + +\newglossaryentry{correlation} +{ + name=相关系数, + description={correlation}, + sort={correlation}, +} + +\newglossaryentry{covariance_matrix} +{ + name=协方差矩阵, + description={covariance matrix}, + sort={covariance matrix}, +} + +\newglossaryentry{bernoulli_distribution} +{ + name=Bernoulli分布, + description={Bernoulli distribution}, + sort={Bernoulli distribution}, +} + +\newglossaryentry{multinoulli_distribution} +{ + name=multinoulli分布, + description={multinoulli distribution}, + sort={multinoulli distribution}, +} + +\newglossaryentry{categorical_distribution} +{ + name=分类分布, + description={categorical distribution}, + sort={categorical distribution}, +} + +\newglossaryentry{multinomial_distribution} +{ + name=多项分布, + description={multinomial distribution}, + sort={multinomial distribution}, +} + +\newglossaryentry{normal_distribution} +{ + name=正态分布, + description={normal distribution}, + sort={normal distribution}, +} + +\newglossaryentry{gaussian_distribution} +{ + name=高斯分布, + description={Gaussian distribution}, + sort={Gaussian distribution}, +} + +\newglossaryentry{precision} +{ + name=精度, + description={precision}, + sort={precision}, +} + +\newglossaryentry{multivariate_normal_distribution} +{ + name=多维正态分布, + description={multivariate normal distribution}, + sort={multivariate normal distribution}, +} + +\newglossaryentry{precision_matrix} +{ + name=精度矩阵, + description={precision matrix}, + sort={precision matrix}, +} + +\newglossaryentry{isotropic} +{ + name=各向同性, + description={isotropic}, + sort={isotropic}, +} + +\newglossaryentry{exponential_distribution} +{ + name=指数分布, + description={exponential distribution}, + sort={exponential distribution}, +} + +\newglossaryentry{indicator_function} +{ + name=指示函数, + description={indicator function}, + sort={indicator function}, +} + +\newglossaryentry{laplace_distribution} +{ + name=Laplace分布, + description={Laplace distribution}, + sort={Laplace distribution}, +} + +\newglossaryentry{dirac_delta_function} +{ + name=Dirac delta函数, + description={Dirac delta function}, + sort={Dirac delta function}, +} + +\newglossaryentry{generalized_function} +{ + name=广义函数, + description={generalized function}, + sort={generalized function}, +} + +\newglossaryentry{empirical_distribution} +{ + name=经验分布, + description={empirical distribution}, + sort={empirical distribution}, +} + +\newglossaryentry{empirical_frequency} +{ + name=经验频率, + description={empirical frequency}, + sort={empirical frequency}, +} + +\newglossaryentry{mixture_distribution} +{ + name=混合分布, + description={mixture distribution}, + sort={mixture distribution}, +} + +\newglossaryentry{latent_variable} +{ + name=隐变量, + description={latent variable}, + sort={latent variable}, +} + +\newglossaryentry{hidden_variable} +{ + name=隐变量, + description={hidden variable} +} + +\newglossaryentry{prior_probability} +{ + name=先验概率, + description={prior probability}, + sort={prior probability}, +} + +\newglossaryentry{posterior_probability} +{ + name=后验概率, + description={posterior probability}, + sort={posterior probability}, +} + +\newglossaryentry{universal_approximator} +{ + name=万能逼近器, + description={universal approximator}, + sort={universal approximator}, +} + +\newglossaryentry{logistic_sigmoid} +{ + name=logistic sigmoid, + description={logistic sigmoid}, + sort={logistic sigmoid}, +} + +\newglossaryentry{saturate} +{ + name=饱和, + description={saturate}, + sort={saturate}, +} + +\newglossaryentry{softplus_function} +{ + name=softplus函数, + description={softplus function}, + sort={softplus function}, +} + +\newglossaryentry{logit} +{ + name=分对数, + description={logit}, + sort={logit}, +} + +\newglossaryentry{positive_part_function} +{ + name=正部函数, + description={positive part function}, + sort={positive part function}, +} + +\newglossaryentry{negative part function} +{ + name=负部函数, + description={negative part function}, + sort={negative part function}, +} + +\newglossaryentry{bayes_rule} +{ + name=贝叶斯规则, + description={Bayes' rule}, + sort={Bayes' rule}, +} + +\newglossaryentry{measure_theory} +{ + name=测度论, + description={measure theory}, + sort={measure theory}, +} + +\newglossaryentry{measure_zero} +{ + name=零测度, + description={measure zero}, + sort={measure zero}, +} + +\newglossaryentry{almost_everywhere} +{ + name=几乎处处, + description={almost everywhere}, + sort={almost everywhere}, +} + +\newglossaryentry{jacobian_matrix} +{ + name=Jacobi矩阵, + description={Jacobian matrix}, + sort={Jacobian matrix}, +} + +\newglossaryentry{self_information} +{ + name=自信息, + description={self-information}, + sort={self-information}, +} + +\newglossaryentry{nats} +{ + name=奈特, + description={nats}, + sort={nats}, +} + +\newglossaryentry{bits} +{ + name=比特, + description={bits}, + sort={bits}, +} + +\newglossaryentry{shannons} +{ + name=香农, + description={shannons}, + sort={shannons}, +} + +\newglossaryentry{Shannon_entropy} +{ + name=香农熵, + description={Shannon entropy}, + sort={Shannon entropy}, +} + +\newglossaryentry{differential_entropy} +{ + name=微分熵, + description={differential entropy}, + sort={differential entropy}, +} + +\newglossaryentry{KL_divergence} +{ + name=KL散度, + description={Kullback-Leibler (KL) divergence}, + sort={Kullback-Leibler (KL) divergence}, +} + +\newglossaryentry{cross_entropy} +{ + name=交叉熵, + description={cross-entropy}, + sort={cross-entropy}, +} + +\newglossaryentry{structured_probabilistic_model} +{ + name=结构化概率模型, + description={structured probabilistic model}, + sort={structured probabilistic model}, +} + +\newglossaryentry{graphical_model} +{ + name=图模型, + description={graphical model}, + sort={graphical model}, +} + +\newglossaryentry{directed} +{ + name=有向, + description={directed}, + sort={directed}, +} + +\newglossaryentry{undirected} +{ + name=无向, + description={undirected}, + sort={undirected}, +} + +\newglossaryentry{undirected_graphical_model} +{ + name=无向图模型, + description={undirected graphical model} +} + +\newglossaryentry{proportional} +{ + name=成比例, + description={proportional}, + sort={proportional}, +} + +\newglossaryentry{description} +{ + name=描述, + description={description}, + sort={description}, +} + +\newglossaryentry{decision_tree} +{ + name=决策树, + description={decision tree}, + sort={decision tree}, +} + +\newglossaryentry{factor_graph} +{ + name=因子图, + description={factor graph}, + sort={factor graph}, +} + +\newglossaryentry{structure_learning} +{ + name=结构学习, + description={structure learning}, + sort={structure learning}, +} + +\newglossaryentry{loopy_belief_propagation} +{ + name=环状信念传播, + description={loopy belief propagation}, + sort={loopy belief propagation}, +} + +\newglossaryentry{harmonium} +{ + name=harmonium, + description={harmonium}, + sort={harmonium}, +} + +\newglossaryentry{convolutional_network} +{ + name=卷积网络, + description={convolutional network}, + sort={convolutional network}, +} + +\newglossaryentry{main_diagonal} +{ + name=主对角线, + description={main diagonal}, + sort={main diagonal}, +} + +\newglossaryentry{transpose} +{ + name=转置, + description={transpose}, + sort={transpose}, +} + +\newglossaryentry{broadcasting} +{ + name=广播, + description={broadcasting}, + sort={broadcasting}, +} + +\newglossaryentry{matrix_product} +{ + name=矩阵乘积, + description={matrix product}, + sort={matrix product}, +} + +\newglossaryentry{element_wise_product} +{ + name=元素对应乘积, + description={element-wise product}, + sort={element-wise product}, +} + +\newglossaryentry{hadamard_product} +{ + name=哈达玛乘积, + description={Hadamard product}, + sort={Hadamard product}, +} + +\newglossaryentry{clique_potential} +{ + name=团势能, + description={clique potential}, + sort={clique potential}, +} + +\newglossaryentry{factor} +{ + name=因子, + description={factor}, + sort={factor}, +} + +\newglossaryentry{unnormalized_probability_function} +{ + name=未归一化概率函数, + description={unnormalized probability function}, + sort={unnormalized probability function}, +} + +\newglossaryentry{recurrent_network} +{ + name=循环网络, + description={recurrent network}, + sort={recurrent network}, +} + +\newglossaryentry{computational_graph} +{ + name=计算图, + description={computational graph}, + sort={computational graph}, +} + +\newglossaryentry{unfolding} +{ + name=展开, + description={unfolding}, + sort={unfolding}, +} + +\newglossaryentry{time_step} +{ + name=时间步, + description={time step}, + sort={time step}, +} + +\newglossaryentry{n_gram} +{ + name=$n$-gram, + description={n-gram}, + sort={n-gram}, +} + +\newglossaryentry{curse_of_dimensionality} +{ + name=维数灾难, + description={curse of dimensionality}, + sort={curse of dimensionality}, +} + +\newglossaryentry{smoothness_prior} +{ + name=平滑先验, + description={smoothness prior}, + sort={smoothness prior}, +} + +\newglossaryentry{local_constancy_prior} +{ + name=局部不变性先验, + description={local constancy prior}, + sort={local constancy prior}, +} + +\newglossaryentry{local_kernel} +{ + name=局部核, + description={local kernel}, + sort={local kernel}, +} + +\newglossaryentry{manifold} +{ + name=流形, + description={manifold}, + sort={manifold}, +} + +\newglossaryentry{manifold_tangent_classifier} +{ + name=流形正切分类器, + description={manifold tangent classifier} +} + +\newglossaryentry{manifold_learning} +{ + name=流形学习, + description={manifold learning}, + sort={manifold learning}, +} + +\newglossaryentry{manifold_hypothesis} +{ + name=流形假设, + description={manifold hypothesis}, + sort={manifold hypothesis}, +} + +\newglossaryentry{loop} +{ + name=环, + description={loop}, + sort={loop}, +} + +\newglossaryentry{chord} +{ + name=弦, + description={chord}, + sort={chord}, +} + +\newglossaryentry{chordal_graph} +{ + name=弦图, + description={chordal graph}, + sort={chordal graph}, +} + +\newglossaryentry{triangulated_graph} +{ + name=三角形化图, + description={triangulated graph}, + sort={triangulated graph}, +} + +\newglossaryentry{risk} +{ + name=风险, + description={risk}, + sort={risk}, +} + +\newglossaryentry{empirical_risk} +{ + name=经验风险, + description={empirical risk}, + sort={empirical risk}, +} + +\newglossaryentry{empirical_risk_minimization} +{ + name=经验风险最小化, + description={empirical risk minimization}, + sort={empirical risk minimization}, +} + +\newglossaryentry{surrogate_loss_function} +{ + name=替代损失函数, + description={surrogate loss function}, + sort={surrogate loss function}, +} + +\newglossaryentry{batch} +{ + name=批量, + description={batch}, + sort={batch}, +} + +\newglossaryentry{deterministic} +{ + name=确定性, + description={deterministic}, + sort={deterministic}, +} + +\newglossaryentry{stochastic} +{ + name=随机, + description={stochastic}, + sort={stochastic}, +} + +\newglossaryentry{online} +{ + name=在线, + description={online}, + sort={online}, +} + +\newglossaryentry{minibatch_stochastic} +{ + name=小批量随机, + description={minibatch stochastic}, + sort={minibatch stochastic}, +} + +\newglossaryentry{stream} +{ + name=流, + description={stream}, + sort={stream}, +} + +\newglossaryentry{model_identifiability} +{ + name=模型可辨认性, + description={model identifiability}, + sort={model identifiability}, +} + +\newglossaryentry{weight_space_symmetry} +{ + name=权重空间对称性, + description={weight space symmetry}, + sort={weight space symmetry}, +} + +\newglossaryentry{saddle_free_newton_method} +{ + name=无鞍牛顿法, + description={saddle-free Newton method}, + sort={saddle-free Newton method}, +} + +\newglossaryentry{gradient_clipping} +{ + name=梯度截断, + description={gradient clipping}, + sort={gradient clipping}, +} + +\newglossaryentry{power_method} +{ + name=幂方法, + description={power method}, + sort={power method}, +} + +\newglossaryentry{linear_factor} +{ + name=线性因子模型, + description={linear factor model}, + sort={linear factor model}, +} + +\newglossaryentry{forward_propagation} +{ + name=前向传播, + description={forward propagation}, + sort={forward propagation}, +} + +\newglossaryentry{backward_propagation} +{ + name=反向传播, + description={backward propagation}, + sort={backward propagation}, +} + +\newglossaryentry{unfolded_graph} +{ + name=展开图, + description={unfolded graph}, + sort={unfolded graph}, +} + +\newglossaryentry{BPTT} +{ + name=通过时间反向传播, + description={back-propagation through time}, + sort={back-propagation through time}, + symbol={BPTT} +} + +\newglossaryentry{teacher_forcing} +{ + name=Teacher Forcing, + description={Teacher Forcing}, + sort={Teacher Forcing}, +} + +\newglossaryentry{stationary} +{ + name=平稳的, + description={stationary}, + sort={stationary}, +} + +\newglossaryentry{deep_feedforward_network} +{ + name=深度前馈网路, + description={deep feedforward network}, + sort={deep feedforward network}, +} + +\newglossaryentry{feedforward_neural_network} +{ + name=前馈神经网络, + description={feedforward neural network}, + sort={feedforward neural network}, +} + +\newglossaryentry{feedforward} +{ + name=前向的, + description={feedforward}, + sort={feedforward}, +} + +\newglossaryentry{feedback} +{ + name=反馈, + description={feedback}, + sort={feedback}, +} + +\newglossaryentry{network} +{ + name=网络, + description={network}, + sort={network}, +} + +\newglossaryentry{first_layer} +{ + name=第一层, + description={first layer}, + sort={first layer}, +} + +\newglossaryentry{second_layer} +{ + name=第二层, + description={second layer}, + sort={second layer}, +} + +\newglossaryentry{depth} +{ + name=深度, + description={depth}, + sort={depth}, +} + +\newglossaryentry{output_layer} +{ + name=输出层, + description={output layer}, + sort={output layer}, +} + +\newglossaryentry{hidden_layer} +{ + name=隐含层, + description={hidden layer}, + sort={hidden layer}, +} + +\newglossaryentry{width} +{ + name=宽度, + description={width}, + sort={width}, +} + +\newglossaryentry{unit} +{ + name=单元, + description={unit}, + sort={unit}, +} + +\newglossaryentry{activation_function} +{ + name=激活函数, + description={activation function}, + sort={activation function}, +} + +\newglossaryentry{back_propagation} +{ + name=反向传播, + description={back propagation}, + sort={back propagation}, +} + +\newglossaryentry{BP} +{ + name=反向传播, + description={backprop}, + sort={backprop}, + symbol={BP} +} + +\newglossaryentry{functional} +{ + name=泛函, + description={functional}, + sort={functional}, +} + +\newglossaryentry{mean_absolute_error} +{ + name=平均绝对误差, + description={mean absolute error}, + sort={mean absolute error}, +} + +\newglossaryentry{winner_take_all} +{ + name=胜者获得一切, + description={winner-take-all}, + sort={winner-take-all}, +} + +\newglossaryentry{heteroscedastic} +{ + name=异方差, + description={heteroscedastic}, + sort={heteroscedastic}, +} + +\newglossaryentry{mixture_density_network} +{ + name=混合密度网络, + description={mixture density network}, + sort={mixture density network}, +} + +\newglossaryentry{clip_gradients} +{ + name=梯度截断, + description={clip gradients}, + sort={clip gradients}, +} + +\newglossaryentry{absolute_value_rectification} +{ + name=绝对值修正, + description={absolute value rectification}, + sort={absolute value rectification}, +} + +\newglossaryentry{leaky_ReLU} %有没有更好的翻译 +{ + name=渗漏修正线性单元, + description={leaky ReLU}, + sort={leaky ReLU}, +} + +\newglossaryentry{PReLU} +{ + name=参数化修正线性单元, + description={parametric ReLU}, + sort={parametric ReLU}, + symbol={PReLU} +} + +\newglossaryentry{maxout_unit} +{ + name=maxout单元, + description={maxout unit}, + sort={maxout unit}, +} + +\newglossaryentry{catastrophic_forgetting} +{ + name=灾难遗忘, + description={catastrophic forgetting}, + sort={catastrophic forgetting}, +} + +\newglossaryentry{RBF} +{ + name=径向基函数, + description={radial basis function}, + sort={radial basis function}, + symbol={RBF} +} + +\newglossaryentry{softplus} +{ + name=softplus, + description={softplus}, + sort={softplus}, +} + +\newglossaryentry{hard_tanh} +{ + name=硬双曲正切函数, + description={hard tanh}, + sort={hard tanh}, +} + +\newglossaryentry{architecture} +{ + name=结构, + description={architecture}, + sort={architecture}, +} + +\newglossaryentry{universal_approximation_theorem} +{ + name=通用近似定理, + description={universal approximation theorem}, + sort={universal approximation theorem}, +} + +\newglossaryentry{operation} +{ + name=操作, + description={operation}, + sort={operation}, +} + +\newglossaryentry{symbol} +{ + name=符号, + description={symbol}, + sort={symbol}, +} + +\newglossaryentry{symbolic_representation} +{ + name=符号表达式, + description={symbolic representation}, + sort={symbolic representation}, +} + +\newglossaryentry{numeric_value} +{ + name=数值, + description={numeric value}, + sort={numeric value}, +} + +\newglossaryentry{dynamic_programming} +{ + name=动态规划, + description={dynamic programming}, + sort={dynamic programming}, +} + +\newglossaryentry{automatic_differentiation} +{ + name=自动微分, + description={automatic differentiation}, + sort={automatic differentiation}, +} + +\newglossaryentry{reverse_mode_accumulation} +{ + name=反向模式累加, + description={reverse mode accumulation}, + sort={reverse mode accumulation}, +} + +\newglossaryentry{forward_mode_accumulation} +{ + name=前向模式累加, + description={forward mode accumulation}, + sort={forward mode accumulation}, +} + +\newglossaryentry{Krylov_methods} +{ + name=Krylov方法, + description={Krylov methods}, + sort={Krylov methods}, +} + +\newglossaryentry{parallel_distributed_processing} +{ + name=并行分布处理, + description={Parallel Distributed Processing}, + sort={Parallel Distributed Processing}, +} + +\newglossaryentry{sparse_activation} +{ + name=稀疏激活, + description={sparse activation}, + sort={sparse activation}, +} + +\newglossaryentry{damping} +{ + name=衰减, + description={damping}, + sort={damping}, +} + +\newglossaryentry{learned} +{ + name=learned, + description={learned}, + sort={learned}, +} + +\newglossaryentry{message_passing} +{ + name=信息传输, + description={message passing}, + sort={message passing}, +} + +\newglossaryentry{functional_derivative} +{ + name=泛函导数, + description={functional derivative}, + sort={functional derivative}, +} + +\newglossaryentry{variational_derivative} +{ + name=变分微分, + description={variational derivative}, + sort={variational derivative}, +} + +\newglossaryentry{excess_error} +{ + name=额外误差, + description={excess error}, + sort={excess error}, +} + +\newglossaryentry{momentum} +{ + name=动量, + description={momentum}, + sort={momentum}, +} + +\newglossaryentry{chaos} +{ + name=混乱, + description={chaos}, + sort={chaos}, +} + +\newglossaryentry{normalized_initialization} +{ + name=标准初始化, + description={normalized initialization}, + sort={normalized initialization}, +} + +\newglossaryentry{sparse_initialization} +{ + name=稀疏初始化, + description={sparse initialization}, + sort={sparse initialization}, +} + +\newglossaryentry{conjugate_directions} +{ + name=共轭方向, + description={conjugate directions}, + sort={conjugate directions}, +} + +\newglossaryentry{conjugate} +{ + name=共轭, + description={conjugate}, + sort={conjugate}, +} + +\newglossaryentry{LINEAR_FACTOR} +{ + name=线性因子模型, + description={linear factor model}, + sort={linear factor model}, +} + +\newglossaryentry{conditional_independent} +{ + name=条件独立, + description={conditionally independent}, + sort={conditionally independent}, +} + +\newglossaryentry{ensemble_learning} +{ + name=集成学习, + description={ensemble learning}, + sort={ensemble learning}, +} + +\newglossaryentry{NICE} +{ + name=非线性独立分量估计, + description={nonlinear independent components estimation}, + sort={nonlinear independent components estimation}, + symbol={NICE} +} + +\newglossaryentry{ISA} +{ + name=独立子空间分析, + description={independent subspace analysis}, + sort={independent subspace analysis}, +} + +\newglossaryentry{SFA} +{ + name=慢特征分析, + description={slow feature analysis}, + sort={slow feature analysis}, + symbol={SFA} +} + +\newglossaryentry{slow_principle} +{ + name=慢原则, + description={slowness principle}, + sort={slowness principle}, +} + +\newglossaryentry{rectified_linear} +{ + name=整流线性, + description={rectified linear}, + sort={rectified linear}, +} + +\newglossaryentry{coordinate_descent} +{ + name=坐标下降, + description={coordinate descent}, + sort={coordinate descent}, +} + +\newglossaryentry{block_coordinate_descent} +{ + name=块坐标下降, + description={block coordinate descent}, + sort={block coordinate descent}, +} + +\newglossaryentry{pretraining} +{ + name=提前训练, + description={pretraining}, + sort={pretraining}, +} + +\newglossaryentry{unsupervised_pretraining} +{ + name=无监督提前训练, + description={unsupervised pretraining}, + sort={unsupervised pretraining}, +} + +\newglossaryentry{greedy_layer_wise_unsupervised_pretraining} +{ + name=贪心逐层无监督提前训练, + description={greedy layer-wise unsupervised pretraining}, + sort={greedy layer-wise unsupervised pretraining}, +} + +\newglossaryentry{layer_wise} +{ + name=逐层的, + description={layer-wise}, + sort={layer-wise}, +} + +\newglossaryentry{greedy_algorithm} +{ + name=贪心算法, + description={greedy algorithm}, + sort={greedy algorithm}, +} + +\newglossaryentry{greedy} +{ + name=贪心, + description={greedy}, + sort={greedy}, +} + +\newglossaryentry{fine_tuning} +{ + name=微调, + description={fine-tuning}, + sort={fine-tuning}, +} + +\newglossaryentry{greedy_supervised_pretraining} +{ + name=贪心监督提前训练, + description={greedy supervised pretraining}, + sort={greedy supervised pretraining}, +} + +\newglossaryentry{continuation_method} +{ + name=连续方法, + description={continuation method}, + sort={continuation method}, +} + +\newglossaryentry{curriculum_learning} +{ + name=课程学习, + description={curriculum learning}, + sort={curriculum learning}, +} + +\newglossaryentry{shaping} +{ + name=整形, + description={shaping}, + sort={shaping}, +} + +\newglossaryentry{stochastic_curriculum} +{ + name=随机课程, + description={stochastic curriculum}, + sort={stochastic curriculum}, +} + +\newglossaryentry{recall} +{ + name=召回率, + description={recall}, + sort={recall}, +} + +\newglossaryentry{coverage} +{ + name=覆盖率, + description={coverage}, + sort={coverage}, +} + +\newglossaryentry{hyperparameter_optimization} +{ + name=超参数优化, + description={hyperparameter optimization}, + sort={hyperparameter optimization}, +} + +\newglossaryentry{grid_search} +{ + name=格点搜索, + description={grid search}, + sort={grid search}, +} + +\newglossaryentry{finite_difference} +{ + name=有限差分, + description={finite difference}, + sort={finite difference}, +} + +\newglossaryentry{centered_difference} +{ + name=中心差分, + description={centered difference}, + sort={centered difference}, +} + +\newglossaryentry{e_step} +{ + name=E步, + description={expectation step}, + sort={expectation step}, + symbol={E step} +} + +\newglossaryentry{m_step} +{ + name=M步, + description={maximization step}, + sort={maximization step}, + symbol={M step} +} + +\newglossaryentry{euler_lagrange_eqn} +{ + name=欧拉拉格朗日方程, + description={Euler-Lagrange Equation}, + sort={Euler-Lagrange Equation}, +} + +\newglossaryentry{ESN} +{ + name=回声状态网络, + description={echo state networks}, + sort={echo state networks}, + symbol={ESN} +} + +\newglossaryentry{liquid_state_machines} +{ + name=流体状态机, + description={liquid state machines}, + sort={liquid state machines}, +} + +\newglossaryentry{reservoir_computing} +{ + name=储层计算, + description={reservoir computing}, + sort={reservoir computing}, +} + +\newglossaryentry{spectral_radius} +{ + name=谱半径, + description={spectral radius}, + sort={spectral radius}, +} + +\newglossaryentry{contractive} +{ + name=收缩, + description={contractive}, + sort={contractive}, +} + +\newglossaryentry{long_term_dependency} +{ + name=长期依赖, + description={long-term dependency}, + sort={long-term dependency}, +} + +\newglossaryentry{skip_connection} +{ + name=跳跃连接, + description={skip connection}, + sort={skip connection}, +} + +\newglossaryentry{leaky_unit} +{ + name=渗漏单元, + description={leaky unit}, + sort={leaky unit}, +} + +\newglossaryentry{gated_rnn} +{ + name=门限RNN, + description={gated RNN}, + sort={gated RNN}, +} + +\newglossaryentry{convolution} +{ + name=卷积, + description={convolution}, + sort={convolution}, +} + +\newglossaryentry{input} +{ + name=输入, + description={input}, + sort={input}, +} + +\newglossaryentry{input_distribution} +{ + name=输入分布, + description={input distribution} +} + +\newglossaryentry{output} +{ + name=输出, + description={output}, + sort={output}, +} + +\newglossaryentry{feature_map} +{ + name=特征映射, + description={feature map}, + sort={feature map}, +} + +\newglossaryentry{flip} +{ + name=翻转, + description={flip}, + sort={flip}, +} + +\newglossaryentry{cross_correlation} +{ + name=互相关函数, + description={cross-correlation}, + sort={cross-correlation}, +} + +\newglossaryentry{Toeplitz_matrix} +{ + name=Toeplitz矩阵, + description={Toeplitz matrix}, + sort={Toeplitz matrix}, +} + +\newglossaryentry{doubly_block_circulant_matrix} +{ + name=双重块循环矩阵, + description={doubly block circulant matrix}, + sort={doubly block circulant matrix}, +} + +\newglossaryentry{sparse_interactions} +{ + name=稀疏交互, + description={sparse interactions}, + sort={sparse interactions}, +} + +\newglossaryentry{equivariant_representations} +{ + name=等价表示, + description={equivariant representations}, + sort={equivariant representations}, +} + +\newglossaryentry{sparse_connectivity} +{ + name=稀疏连接, + description={sparse connectivity}, + sort={sparse connectivity}, +} + +\newglossaryentry{sparse_weights} +{ + name=稀疏权重, + description={sparse weights}, + sort={sparse weights}, +} + +\newglossaryentry{tied_weights} +{ + name=绑定的权值, + description={tied weights}, + sort={tied weights}, +} + +\newglossaryentry{equivariance} +{ + name=等价, + description={equivariance}, + sort={equivariance}, +} + +\newglossaryentry{detector_stage} +{ + name=探测级, + description={detector stage}, + sort={detector stage}, +} + +\newglossaryentry{pooling_funciton} +{ + name=池化函数, + description={pooling function}, + sort={pooling function}, +} + +\newglossaryentry{max_pooling} +{ + name=最大池化, + description={max pooling}, + sort={max pooling}, +} + +\newglossaryentry{invariant} +{ + name=不变, + description={invariant}, + sort={invariant}, +} + +\newglossaryentry{permutation_invariant} +{ + name=置换不变性, + description={permutation invariant}, + sort={permutation invariant}, +} + +\newglossaryentry{stride} +{ + name=步幅, + description={stride}, + sort={stride}, +} + +\newglossaryentry{valid} +{ + name=有效, + description={valid}, + sort={valid}, +} + +\newglossaryentry{same} +{ + name=相同, + description={same}, + sort={same}, +} + +\newglossaryentry{full} +{ + name=全, + description={full}, + sort={full}, +} + +\newglossaryentry{unshared_convolution} +{ + name=非共享卷积, + description={unshared convolution}, + sort={unshared convolution}, +} + +\newglossaryentry{tiled_convolution} +{ + name=尾卷积, + description={tiled convolution}, + sort={tiled convolution}, +} + +\newglossaryentry{separable} +{ + name=可分离的, + description={separable}, + sort={separable}, +} + +\newglossaryentry{primary_visual_cortex} +{ + name=主要视觉皮层, + description={primary visual cortex}, + sort={primary visual cortex}, +} + +\newglossaryentry{simple_cells} +{ + name=简单细胞, + description={simple cells}, + sort={simple cells}, +} + +\newglossaryentry{complex_cells} +{ + name=复杂细胞, + description={complex cells}, + sort={complex cells}, +} + +\newglossaryentry{fovea} +{ + name=中央凹, + description={fovea}, + sort={fovea}, +} + +\newglossaryentry{saccade} +{ + name=扫视, + description={saccade}, + sort={saccade}, +} + +\newglossaryentry{TDNNs} +{ + name=时延神经网络, + description={time delay neural networks}, + sort={time delay neural networks}, + symbol={TDNNs} +} + +\newglossaryentry{reverse_correlation} +{ + name=反向相关, + description={reverse correlation}, + sort={reverse correlation}, +} + +\newglossaryentry{Gabor_function} +{ + name=Gabor函数, + description={Gabor function}, + sort={Gabor function}, +} + +\newglossaryentry{quadrature_pair} +{ + name=正交对, + description={quadrature pair}, + sort={quadrature pair}, +} + +\newglossaryentry{gated_recurrent_unit} +{ + name=门限循环单元, + description={gated recurrent unit}, + sort={gated recurrent unit}, +} + +\newglossaryentry{forget_gate} +{ + name=遗忘门, + description={forget gate}, + sort={forget gate}, +} + +\newglossaryentry{clipping_gradient} +{ + name=截断梯度, + description={clipping the gradient}, + sort={clipping the gradient}, +} + +\newglossaryentry{memory_network} +{ + name=记忆网络, + description={memory network}, + sort={memory network}, +} + +\newglossaryentry{NTM} +{ + name=神经网络图灵机, + description={neural Turing machine}, + sort={neural Turing machine}, + symbol={NTM} +} + +\newglossaryentry{fine_tune} +{ + name=细调, + description={fine-tune}, + sort={fine-tune}, +} + +\newglossaryentry{explaining_away} +{ + name=explaining away, + description={explaining away}, + sort={explaining away}, +} + +\newglossaryentry{code} +{ + name=编码, + description={code}, + sort={code}, +} + +\newglossaryentry{recirculation} +{ + name=再循环, + description={recirculation}, + sort={recirculation}, +} + +\newglossaryentry{undercomplete} +{ + name=欠完备, + description={undercomplete}, + sort={undercomplete}, +} + +\newglossaryentry{overcomplete} +{ + name=过完备, + description={overcomplete}, + sort={overcomplete}, +} + +\newglossaryentry{denoising} +{ + name=去噪, + description={denoising}, + sort={denoising}, +} + +\newglossaryentry{DAE} +{ + name=去噪自动编码器, + description={denoising autoencoder}, + sort={denoising autoencoder}, + symbol={DAE} +} + +\newglossaryentry{CAE} +{ + name=收缩自动编码器, + description={contractive autoencoder}, + sort={contractive autoencoder}, + symbol={CAE} +} + +\newglossaryentry{reconstruction_error} +{ + name=重构误差, + description={reconstruction error}, + sort={reconstruction error}, +} + +\newglossaryentry{gradient_field} +{ + name=梯度场, + description={gradient field}, + sort={gradient field}, +} + +\newglossaryentry{denoising_score_matching} +{ + name=去噪得分匹配, + description={denoising score matching}, + sort={denoising score matching}, +} + +\newglossaryentry{score} +{ + name=分数, + description={score}, + sort={score}, +} + +\newglossaryentry{tangent_plane} +{ + name=切平面, + description={tangent plane}, + sort={tangent plane}, +} + +\newglossaryentry{nearest_neighbor_graph} +{ + name=最近邻图, + description={nearest neighbor graph}, + sort={nearest neighbor graph}, +} + +\newglossaryentry{embedding} +{ + name=嵌入, + description={embedding}, + sort={embedding}, +} + +\newglossaryentry{PSD} +{ + name=预测稀疏分解, + description={predictive sparse decomposition}, + sort={predictive sparse decomposition}, + symbol={PSD} +} + +\newglossaryentry{learned_approximate_inference} +{ + name=学习近似推断, + description={learned approximate inference}, + sort={learned approximate inference}, +} + +\newglossaryentry{information_retrieval} +{ + name=信息检索, + description={information retrieval}, + sort={information retrieval}, +} + +\newglossaryentry{semantic_hashing} +{ + name=语义哈希, + description={semantic hashing}, + sort={semantic hashing}, +} + +\newglossaryentry{dimensionality_reduction} +{ + name=降维, + description={dimensionality reduction}, + sort={dimensionality reduction}, +} + +\newglossaryentry{helmholtz_machine} +{ + name=Helmholtz机, + description={Helmholtz machine}, + sort={Helmholtz machine}, +} + +\newglossaryentry{contrastive_divergence} +{ + name=对比散度, + description={contrastive divergence}, + symbol={CD}, + sort={contrastive divergence}, +} + +\newglossaryentry{language_model} +{ + name=语言模型, + description={language model}, + sort={language model}, +} + +\newglossaryentry{token} +{ + name=标记, + description={token}, + sort={token}, +} + +\newglossaryentry{unigram} +{ + name=一元语法, + description={unigram}, + sort={unigram}, +} + +\newglossaryentry{bigram} +{ + name=二元语法, + description={bigram}, + sort={bigram}, +} + +\newglossaryentry{trigram} +{ + name=三元语法, + description={trigram}, + sort={trigram}, +} + +\newglossaryentry{smoothing} +{ + name=平滑, + description={smoothing}, + sort={smoothing}, +} + +\newglossaryentry{NLM} +{ + name=神经语言模型, + description={Neural Language Model}, + sort={Neural Language Model}, + symbol={NLM} +} + +\newglossaryentry{cascade} +{ + name=级联, + description={cascade}, + sort={cascade}, +} + +\newglossaryentry{policy_gradient} +{ + name=策略梯度, + description={policy gradient}, + sort={policy gradient}, +} + +\newglossaryentry{DGM} +{ + name=深度生成模型, + description={deep generative model}, + sort={deep generative model}, +} + +\newglossaryentry{model} +{ + name=模型, + description={model}, + sort={model}, +} + +\newglossaryentry{layer} +{ + name=层, + description={layer}, + sort={layer}, +} + +\newglossaryentry{greedy_unsupervised_pretraining} +{ + name=贪心无监督提前训练, + description={greedy unsupervised pretraining}, + sort={greedy unsupervised pretraining}, +} + +\newglossaryentry{semi_supervised_learning} +{ + name=半监督学习, + description={semi-supervised learning}, + sort={semi-supervised learning}, +} + +\newglossaryentry{supervised_model} +{ + name=监督模型, + description={supervised model}, + sort={supervised model}, +} + +\newglossaryentry{word_embeddings} +{ + name=词嵌入, + description={word embeddings}, + sort={word embeddings}, +} + +\newglossaryentry{one_hot} +{ + name=one-hot, + description={one-hot}, + sort={one-hot}, +} + +\newglossaryentry{supervised_pretraining} +{ + name=监督提前训练, + description={supervised pretraining}, + sort={supervised pretraining}, +} + +\newglossaryentry{transfer_learning} +{ + name=迁移学习, + description={transfer learning}, + sort={transfer learning}, +} + +\newglossaryentry{learner} +{ + name=学习器, + description={learner}, + sort={learner}, +} + +\newglossaryentry{multitask_learning} +{ + name=多任务学习, + description={multitask learning}, + sort={multitask learning}, +} + +\newglossaryentry{domain_adaption} +{ + name=领域自适应, + description={domain adaption} , + sort={domain adaption} , +} + +\newglossaryentry{denoising_autoencoder} +{ + name=去噪自动编码器, + description={denoising autoencoder}, + sort={denoising autoencoder}, +} + +\newglossaryentry{concept_drift} +{ + name=概念漂移, + description={concept drift}, + sort={concept drift}, +} + +\newglossaryentry{one_shot_learning} +{ + name=一次学习, + description={one-shot learning}, + sort={one-shot learning}, +} + +\newglossaryentry{zero_shot_learning} +{ + name=零次学习, + description={zero-shot learning}, + sort={zero-shot learning}, +} + +\newglossaryentry{zero_data_learning} +{ + name=零数据学习, + description={zero-data learning}, + sort={zero-data learning}, +} + +\newglossaryentry{multimodal_learning} +{ + name=多模态学习, + description={multimodal learning}, + sort={multimodal learning}, +} + +\newglossaryentry{generative_adversarial_networks} +{ + name=生成式对抗网络, + description={generative adversarial networks}, + sort={generative adversarial networks}, +} + +\newglossaryentry{feedforward_classifier} +{ + name=前馈分类器, + description={feedforward classifier}, + sort={feedforward classifier}, +} + +\newglossaryentry{sum_product_network} +{ + name=和-积网络, + description={sum-product network}, + sort={sum-product network}, + symbol={SPN} +} + +\newglossaryentry{deep_circuit} +{ + name=深度电路, + description={deep circuit}, + sort={deep circuit}, +} + +\newglossaryentry{shadow_circuit} +{ + name=浅度电路, + description={shadow circuit}, + sort={shadow circuit}, +} + +\newglossaryentry{linear_classifier} +{ + name=线性分类器, + description={linear classifier}, + sort={linear classifier}, +} + +\newglossaryentry{positive_phase} +{ + name=正相, + description={positive phase}, + sort={positive phase}, +} + +\newglossaryentry{negative_phase} +{ + name=负相, + description={negative phase}, + sort={negative phase}, +} + +\newglossaryentry{leibniz_rule} +{ + name=莱布尼兹法则, + description={Leibniz's rule}, + sort={Leibniz's rule}, +} + +\newglossaryentry{lebesgue_integrable} +{ + name=勒贝格可积, + description={Lebesgue-integrable}, + sort={Lebesgue-integrable}, +} + +\newglossaryentry{spurious_modes} +{ + name=伪造模式, + description={spurious modes}, + sort={spurious modes}, +} + +\newglossaryentry{SML} +{ + name=随机最大似然, + symbol={SML}, + description={stochastic maximum likelihood}, + sort={stochastic maximum likelihood}, +} + +\newglossaryentry{persistent_contrastive_divergence} +{ + name=持续性对比散度, + description={persistent contrastive divergence}, + sort={persistent contrastive divergence}, + symbol={PCD} +} + +\newglossaryentry{FPCD} +{ + name=快速持续性对比散度, + symbol={FPCD}, + description={fast persistent contrastive divergence}, + sort={fast persistent contrastive divergence}, +} + +\newglossaryentry{pseudolikelihood} +{ + name=伪似然, + description={pseudolikelihood}, + sort={pseudolikelihood}, +} + +\newglossaryentry{generalized_pseudolikelihood_estimator} +{ + name=广义伪似然估计, + description={generalized pseudolikelihood estimator}, + sort={generalized pseudolikelihood estimator}, +} + +\newglossaryentry{GSM} +{ + name=广义分数匹配, + description={generalized score matching}, + sort={generalized score matching}, + symbol={GSM} +} + +\newglossaryentry{ratio_matching} +{ + name=比率匹配, + description={ratio matching}, + sort={ratio matching}, +} + +\newglossaryentry{NCE} +{ + name=噪扰对比估计, + description={noise-contrastive estimation}, + sort={noise-contrastive estimation}, + symbol={NCE} +} + +\newglossaryentry{noise_distribution} +{ + name=噪扰分布, + description={noise distribution}, + sort={noise distribution}, +} + +\newglossaryentry{noise} +{ + name=噪扰, + description={noise}, + sort={noise}, +} + +\newglossaryentry{self_contrastive_estimation} +{ + name=自对比估计, + description={self-contrastive estimation}, + sort={self-contrastive estimation}, +} + +\newglossaryentry{iid_chap18} +{ + name=独立同分布, + description={independent identically distributed}, + sort={independent identically distributed}, + symbol={i.i.d.} +} + +\newglossaryentry{AIS} +{ + name=退火重要采样, + description={annealed importance sampling}, + sort={annealed importance sampling}, + symbol={AIS} +} + +\newglossaryentry{bridge_sampling} +{ + name=桥式采样, + description={bridge sampling}, + sort={bridge sampling}, +} + +\newglossaryentry{linked_importance_sampling} +{ + name=链式重要采样, + description={linked importance sampling}, + sort={linked importance sampling}, +} + +\newglossaryentry{ASIC} +{ + name=专用集成电路, + description={application-specific integrated circuit}, + sort={application-specific integrated circuit}, + symbol={ASIC} +} + +\newglossaryentry{FPGA} +{ + name=可编程门阵列, + description={field programmable gated array}, + sort={field programmable gated array}, + symbol={FPGA} +} + +\newglossaryentry{scalar} +{ + name=标量, + description={scalar}, + sort={scalar}, +} + +\newglossaryentry{vector} +{ + name=向量, + description={vector}, + sort={vector}, +} + +\newglossaryentry{matrix} +{ + name=矩阵, + description={matrices}, + sort={matrices}, +} + +\newglossaryentry{tensor} +{ + name=张量, + description={tensor}, + sort={tensor}, +} + +\newglossaryentry{dot_product} +{ + name=点击, + description={dot product}, + sort={dot product}, +} + +\newglossaryentry{square} +{ + name=方阵, + description={square}, + sort={square}, +} + +\newglossaryentry{singular} +{ + name=奇异的, + description={singular}, + sort={singular}, +} + +\newglossaryentry{norm} +{ + name=范数, + description={norm}, + sort={norm}, +} + +\newglossaryentry{triangle_inequality} +{ + name=三角不等式, + description={triangle inequality}, + sort={triangle inequality}, +} + +\newglossaryentry{euclidean_norm} +{ + name=欧几里得范数, + description={Euclidean norm}, + sort={Euclidean norm}, +} + +\newglossaryentry{max_norm} +{ + name=max 范数, + description={max norm}, + sort={max norm}, +} + +\newglossaryentry{frobenius_norm} +{ + name=Frobenius 范数, + description={Frobenius norm}, + sort={Frobenius norm}, +} + +\newglossaryentry{diagonal_matrix} +{ + name=对角矩阵, + description={diagonal matrix}, + sort={diagonal matrix}, +} + +\newglossaryentry{symmetric} +{ + name=对称, + description={symmetric}, + sort={symmetric}, +} + +\newglossaryentry{unit_vector} +{ + name=单位向量, + description={unit vector}, + sort={unit vector}, +} + +\newglossaryentry{orthogonal} +{ + name=正交, + description={orthogonal}, + sort={orthogonal}, +} + +\newglossaryentry{orthogonal_matrix} +{ + name=正交矩阵, + description={orthogonal matrix}, + sort={orthogonal matrix}, +} + +\newglossaryentry{orthonormal} +{ + name=标准正交, + description={orthonormal}, + sort={orthonormal}, +} + +\newglossaryentry{eigendecomposition} +{ + name=特征分解, + description={eigendecomposition}, + sort={eigendecomposition}, +} + +\newglossaryentry{eigenvector} +{ + name=特征向量, + description={eigenvector}, + sort={eigenvector}, +} + +\newglossaryentry{eigenvalue} +{ + name=特征值, + description={eigenvalue}, + sort={eigenvalue}, +} + +\newglossaryentry{decompose} +{ + name=分解, + description={decompose}, + sort={decompose}, +} + +\newglossaryentry{P_D} +{ + name=正定, + description={positive definite}, + sort={positive definite}, +} + +\newglossaryentry{ND} +{ + name=负定, + description={negative definite}, + sort={negative definite}, +} + +\newglossaryentry{NSD} +{ + name=半负定, + description={negative semidefinite}, + sort={negative semidefinite}, +} + +\newglossaryentry{P_SD} +{ + name=半正定, + description={positive semidefinite}, + sort={positive semidefinite}, +} + +\newglossaryentry{SVD} +{ + name=奇异值分解, + description={singular value decomposition}, + sort={singular value decomposition}, + symbol={SVD} +} + +\newglossaryentry{Svalue} +{ + name=奇异值, + description={singular value}, + sort={singular value}, +} + +\newglossaryentry{Svector} +{ + name=奇异向量, + description={singular vector}, + sort={singular vector}, +} + +\newglossaryentry{left_Svector} +{ + name=左奇异向量, + description={left singular vector}, + sort={left singular vector}, +} + +\newglossaryentry{right_Svector} +{ + name=右奇异向量, + description={right singular vector}, + sort={right singular vector}, +} + +\newglossaryentry{Moore} +{ + name=Moore-Penrose 伪逆, + description={Moore-Penrose pseudoinverse}, + sort={Moore-Penrose pseudoinverse}, +} + +\newglossaryentry{identity_matrix} +{ + name=单位矩阵, + description={identity matrix}, + sort={identity matrix}, +} + +\newglossaryentry{matrix_inverse} +{ + name=矩阵逆, + description={matrix inverse}, + sort={matrix inverse}, +} + +\newglossaryentry{origin} +{ + name=原点, + description={origin}, + sort={origin}, +} + +\newglossaryentry{linear_combination} +{ + name=线性组合, + description={linear combination}, + sort={linear combination}, +} + +\newglossaryentry{column_space} +{ + name=列空间, + description={column space}, + sort={column space}, +} + +\newglossaryentry{range} +{ + name=域, + description={range}, + sort={range}, +} + +\newglossaryentry{linear_depend} +{ + name=线性相关, + description={linear dependency}, + sort={linear dependency}, +} + + +\newglossaryentry{column} +{ + name=列, + description={column}, + sort={column}, +} + + +\newglossaryentry{row} +{ + name=行, + description={row}, + sort={row}, +} + +\newglossaryentry{span} +{ + name=生成空间, + description={span}, + sort={span}, +} + +\newglossaryentry{SLT} +{ + name=统计学习理论, + description={statistical learning theory}, + sort={statistical learning theory}, +} + +\newglossaryentry{DGP} +{ + name=数据生成过程, + description={data generating process}, + sort={data generating process}, +} + +\newglossaryentry{iid} +{ + name=独立同分布假设, + description={i.i.d. assumption}, + sort={i.i.d. assumption}, +} + +\newglossaryentry{id} +{ + name=同分布地, + description={identically distributed}, + sort={identically distributed}, +} + +\newglossaryentry{DGD} +{ + name=数据生成分布, + description={data generating distribution}, + sort={data generating distribution}, +} + +\newglossaryentry{OR} +{ + name=奥卡姆剃刀, + description={Occam's razor}, + sort={Occam's razor}, +} + +\newglossaryentry{VC} +{ + name=Vapnik-Chervonenkis维度, + description={Vapnik-Chervonenkis dimension}, + sort={Vapnik-Chervonenkis dimension}, + symbol={VC} +} + +\newglossaryentry{unsuper_learn_algo} +{ + name=无监督学习算法, + description={unsupervised learning algorithms}, + sort={unsupervised learning algorithms}, +} + +\newglossaryentry{super_learn_algo} +{ + name=有监督学习算法, + description={supervised learning algorithms}, + sort={supervised learning algorithms}, +} + +\newglossaryentry{word_embedding} +{ + name=词嵌入, + description={word embedding}, + sort={word embedding}, +} + +\newglossaryentry{shortlist} +{ + name=短列表, + description={shortlist}, + sort={shortlist}, +} + +\newglossaryentry{NMT} +{ + name=神经机器翻译, + description={Neural Machine Translation}, + sort={Neural Machine Translation}, + symbol={NMT} +} + +\newglossaryentry{recommender_system} +{ + name=推荐系统, + description={recommender system}, + sort={recommender system}, +} + +\newglossaryentry{proposal_distribution} +{ + name=提议分布, + description={proposal distribution}, + sort={proposal distribution}, +} + +\newglossaryentry{bag_of_words} +{ + name=词袋, + description={bag of words}, + sort={bag of words}, +} + +\newglossaryentry{collaborative_filtering} +{ + name=协同过滤, + description={collaborative filtering}, + sort={collaborative filtering}, +} + +\newglossaryentry{exploration} +{ + name=探索, + description={exploration}, + sort={exploration}, +} + +\newglossaryentry{exploitation} +{ + name=开发, + description={exploitation}, + sort={exploitation}, +} + +\newglossaryentry{bandit} +{ + name=bandit , + description={bandit}, + sort={bandit}, +} + +\newglossaryentry{contextual_bandit} +{ + name=contextual bandit , + description={contextual bandit}, + sort={contextual bandit}, +} + +\newglossaryentry{policy} +{ + name=策略, + description={policy}, + sort={policy}, +} + +\newglossaryentry{relation} +{ + name=关系, + description={relation}, + sort={relation}, +} + +\newglossaryentry{binary_relation} +{ + name=二元关系, + description={binary relation}, + sort={binary relation}, +} + +\newglossaryentry{attribute} +{ + name=属性, + description={attribute}, + sort={attribute}, +} + +\newglossaryentry{relational_database} +{ + name=关系型数据库, + description={relational database}, + sort={relational database}, +} + +\newglossaryentry{link_prediction} +{ + name=链接预测, + description={link prediction}, + sort={link prediction}, +} + +\newglossaryentry{word_sense_disambiguation} +{ + name=词义消歧, + description={word-sense disambiguation}, + sort={word-sense disambiguation}, +} + +\newglossaryentry{error_metric} +{ + name=误差度量, + description={error metric}, + sort={error metric}, +} + +\newglossaryentry{performance_metrics} +{ + name=性能度量, + description={performance metrics}, + sort={performance metrics}, +} + +\newglossaryentry{transcription_system} +{ + name=转录系统, + description={transcription system}, + sort={transcription system}, +} + +\newglossaryentry{BFGS} +{ + name=BFGS, + description={BFGS}, + sort={BFGS}, +} + +\newglossaryentry{LBFGS} +{ + name=L-BFGS, + description={L-BFGS}, + sort={L-BFGS}, +} + +\newglossaryentry{CG} +{ + name=共轭梯度, + description={conjugate gradient}, + sort={conjugate gradient}, + symbol={CG} +} + +\newglossaryentry{nonlinear_CG} +{ + name=非线性共轭梯度, + description={nonlinear conjugate gradients}, + sort={nonlinear conjugate gradients}, +}