[
  {
    "path": "Chapter1/README.md",
    "content": "#第一章笔记\n"
  },
  {
    "path": "Chapter1/annotations.txt",
    "content": "{'user': 'acct:swordyork@hypothes.is', 'text': '不通顺', 'origin_text': '到迅速解决，比如那些可以通过一系列形式的数学规则来描述的问题。  !!!人工智能的真正挑战被证明是解决对人来说很容易执行，但很难形式化描述的任务，也就是我们人类能自动的靠直观解决的问题，比如识别所说的话或图像中的脸。!!!  这本书讨论这些更直观的问题一种解决方案。这种解决方案是为了', 'time': '2017-01-09T03:35'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '走法?', 'origin_text': '设计一种成功的国际象棋策略是巨大的成就，但向计算机描述棋子及其  !!!允许的移动!!!  并不是挑战的困难所在。国际象棋完全可以由一个非常简短的、完全形', 'time': '2017-01-09T03:36'}\n{'user': 'acct:zplin@hypothes.is', 'text': '是不可能的', 'origin_text': '映射到对象标识的函数非常复杂。如果直接处理，学习或评估此映射似乎  !!!是不可逾越的!!!  。深度学习将所需的复杂映射分解为一系列嵌套的简单映射（每个由模型', 'time': '2017-01-09T17:33'}\n{'user': 'acct:zplin@hypothes.is', 'text': '第一层可以轻易地通过比较相邻像素的亮度来识别边缘', 'origin_text': '中的关系。这里的图像是每个隐藏单元表示的特征的可视化。给定像素，  !!!第一层可以比较相邻像素的亮度容易地识别边缘。!!!  给定第一隐藏层中边的描述，第二隐藏层可以容易地搜索可识别为角和扩', 'time': '2017-01-09T17:37'}\n{'user': 'acct:zplin@hypothes.is', 'text': '有了第一隐藏层描述的边缘', 'origin_text': '的可视化。给定像素，第一层可以比较相邻像素的亮度容易地识别边缘。  !!!给定第一隐藏层中边的描述!!!  ，第二隐藏层可以容易地搜索可识别为角和扩展轮廓的边集合。给定第二', 'time': '2017-01-09T17:40'}\n{'user': 'acct:zplin@hypothes.is', 'text': '是深度学习的一方面。另一个方面是', 'origin_text': '不同的数学函数，并为输入提供新的表示。学习数据正确表示的想法  !!!是解释深度学习的一个观点。另一个观点是!!!  深度允许计算机学习一个多步骤的计算机程序。表示的每一层可以被认', 'time': '2017-01-09T17:56'}\n{'user': 'acct:zplin@hypothes.is', 'text': '从这个角度上看，', 'origin_text': '顺序指令提供了极大的能力，因为后面的指令可以参考早期指令的结果。  !!!根据这个观点!!!  ，一层的激活函数没有必要对解释输入的变化因素进行编码。表示还存', 'time': '2017-01-09T18:04'}\n{'user': 'acct:zplin@hypothes.is', 'text': '在某层激活函数里，并非所有信息都蕴函着解释输入的变化因素', 'origin_text': '大的能力，因为后面的指令可以参考早期指令的结果。根据这个观点，  !!!一层的激活函数没有必要对解释输入的变化因素进行编码!!!  。表示还存储着协助程序执行的状态信息，使输入更加有意义。这里', 'time': '2017-01-09T18:10'}\n{'user': 'acct:zplin@hypothes.is', 'text': '表示层还存储着状态信息用于帮助程序理解输入\\n\\nmake sense of the input == explain the input', 'origin_text': '这个观点，一层的激活函数没有必要对解释输入的变化因素进行编码。  !!!表示还存储着协助程序执行的状态信息，使输入更加有意义!!!  。这里的状态信息类似于传统计算机程序中的计数器或指针。它与具', 'time': '2017-01-09T18:15'}\n{'user': 'acct:zplin@hypothes.is', 'text': '两个用不同语言编写的等价程序长度不同', 'origin_text': '为这是描述每个给定输入后，计算模型输出的流程图的最长路径。正如  !!!两个等价的计算机程序根据不同的语言将具有不同的长度!!!  ，相同的函数可以被绘制为具有不同深度的流程图，这取决于我们允许使', 'time': '2017-01-09T18:23'}\n{'user': 'acct:zplin@hypothes.is', 'text': '我们可以用来当作一个步骤的函数', 'origin_text': '不同的长度，相同的函数可以被绘制为具有不同深度的流程图，这取决于  !!!我们允许使用的单步函数!!!  。\\\\fig?说明了语言的选择怎样给相同的架构两个不同的衡量。', 'time': '2017-01-09T18:25'}\n{'user': 'acct:zplin@hypothes.is', 'text': '最有意义的', 'origin_text': '。由于并不总是清楚计算图的深度或概率模型图的深度哪一个是  !!!最相关!!!  的，并且由于不同的人选择不同的最小元素集来构建相应的图，导致架构', 'time': '2017-01-09T18:32'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '发明家', 'origin_text': 'lus)和赫淮斯托斯(Hephaestus)都可以被看作传说中的  !!!造物者!!!  ，而加拉蒂亚(Galatea)、塔洛斯(Talos)和潘多拉(P', 'time': '2017-01-10T05:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '人工', 'origin_text': 'a)、塔洛斯(Talos)和潘多拉(Pandora)都可以被视为  !!!人造!!!  生命{cite?}。当人类第一次构思可编程计算机时，就已经在', 'time': '2017-01-10T05:54'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '发明家', 'origin_text': '                    远在古希腊时期，  !!!创造者!!!  就梦想着创造能思考的机器。神话人物皮格马利翁(Pygmalio', 'time': '2017-01-10T05:55'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“都”', 'origin_text': '代达罗斯(Daedalus)和赫淮斯托斯(Hephaestus)  !!!都!!!  可以被看作传说中的造物者，而加拉蒂亚(Galatea)、塔洛斯(', 'time': '2017-01-10T05:55'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改为“则”', 'origin_text': 'Galatea)、塔洛斯(Talos)和潘多拉(Pandora)  !!!都!!!  可以被视为人造生命{cite?}。当人类第一次构思可编程计算', 'time': '2017-01-10T05:56'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '第一台计算机', 'origin_text': '构思可编程计算机时，就已经在思考计算机能否变得智能（尽管这距造出  !!!第一台!!!  还有一百多年）{cite?}。如今，人工智能是一个具有许多实际', 'time': '2017-01-10T08:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '众多', 'origin_text': '出第一台还有一百多年）{cite?}。如今，人工智能是一个具有  !!!许多!!!  实际应用和活跃研究课题的领域，并蓬勃发展着。我们指望通过智能软', 'time': '2017-01-10T08:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '期望', 'origin_text': '是一个具有许多实际应用和活跃研究课题的领域，并蓬勃发展着。我们  !!!指望!!!  通过智能软件自动化处理常规劳动、理解语音或图像、帮助医学诊断和支', 'time': '2017-01-10T08:25'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '自动地', 'origin_text': '际应用和活跃研究课题的领域，并蓬勃发展着。我们指望通过智能软件  !!!自动化!!!  处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究。', 'time': '2017-01-10T08:26'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '。', 'origin_text': '些对人类智力来说非常困难但对计算机来说相对简单的问题得到迅速解决  !!!，!!!  比如那些可以通过一系列形式的数学规则来描述的问题。人工智能的真', 'time': '2017-01-10T08:28'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '比如，', 'origin_text': '对人类智力来说非常困难但对计算机来说相对简单的问题得到迅速解决，  !!!比如!!!  那些可以通过一系列形式的数学规则来描述的问题。人工智能的真正挑', 'time': '2017-01-10T08:28'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '形式化', 'origin_text': '但对计算机来说相对简单的问题得到迅速解决，比如那些可以通过一系列  !!!形式!!!  的数学规则来描述的问题。人工智能的真正挑战被证明是解决对人来说', 'time': '2017-01-10T08:37'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '人工智能的真正挑战在于去解决那些对人来说很容易执行、但很难形式化来描述的任务，即这些问题我们人类能够很自然地靠直觉来求解，比如识别所说的话或图像中的脸。', 'origin_text': '得到迅速解决，比如那些可以通过一系列形式的数学规则来描述的问题。  !!!人工智能的真正挑战被证明是解决对人来说很容易执行，但很难形式化描述的任务，也就是我们人类能自动的靠直观解决的问题，比如识别所说的话或图像中的脸!!!  。这本书讨论这些更直观的问题一种解决方案。这种解决方案是为', 'time': '2017-01-10T08:43'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '比较直观问题的解决方案。\\n', 'origin_text': '直观解决的问题，比如识别所说的话或图像中的脸。这本书讨论这些  !!!更直观的问题!!!  一种解决方案。这种解决方案是为了让计算机从经验中学习，并通过层', 'time': '2017-01-10T08:48'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '该方案是让计算机从经验中学习', 'origin_text': '的话或图像中的脸。这本书讨论这些更直观的问题一种解决方案。  !!!这种解决方案是为了让计算机从经验中学习!!!  ，并通过层次化概念体系来理解世界，其中每个概念通过与较简单概念之', 'time': '2017-01-10T09:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '根据', 'origin_text': '的问题一种解决方案。这种解决方案是为了让计算机从经验中学习，并  !!!通过!!!  层次化概念体系来理解世界，其中每个概念通过与较简单概念之间的联系', 'time': '2017-01-10T09:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '而每个概念是通过与某些相对简单的概念之间的关系来定义', 'origin_text': '方案是为了让计算机从经验中学习，并通过层次化概念体系来理解世界，  !!!其中每个概念通过与较简单概念之间的联系来定义!!!  。让计算机通过经验获取知识，就不需要人类来形式化地列举计算机需', 'time': '2017-01-10T09:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '从', 'origin_text': '解世界，其中每个概念通过与较简单概念之间的联系来定义。让计算机  !!!通过!!!  经验获取知识，就不需要人类来形式化地列举计算机需要的所有知识。', 'time': '2017-01-10T09:07'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '从经验中', 'origin_text': '解世界，其中每个概念通过与较简单概念之间的联系来定义。让计算机  !!!通过经验!!!  获取知识，就不需要人类来形式化地列举计算机需要的所有知识。层次', 'time': '2017-01-10T09:07'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '这可以避免由人类来给计算机形式化地指定它需要的所有知识', 'origin_text': '念通过与较简单概念之间的联系来定义。让计算机通过经验获取知识，  !!!就不需要人类来形式化地列举计算机需要的所有知识!!!  。层次化的概念让计算机构建较简单的概念来学习复杂概念。如果绘', 'time': '2017-01-10T09:14'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '基于', 'origin_text': '如何建立在彼此之上的图，我们将得到一张”深”（层次很多）的图。  !!!出!!!  于这个原因，我们称这种方法为AI深度学习。许多AI的早期', 'time': '2017-01-10T12:41'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '贫瘠且形式化', 'origin_text': '们称这种方法为AI深度学习。许多AI的早期成功发生在相对  !!!干净且形式!!!  的环境中， 计算机不需要具备很多关于世界的知识。例如，IBM的', 'time': '2017-01-10T12:43'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '某种严格', 'origin_text': '}。当然国际象棋是一个非常简单的领域，仅含有64个位置并只能以  !!!严格!!!  限制的方式移动32个棋子。设计一种成功的国际象棋策略是巨大的成', 'time': '2017-01-10T12:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '“走法”比较好', 'origin_text': '一种成功的国际象棋策略是巨大的成就，但向计算机描述棋子及其允许的  !!!移动!!!  并不是挑战的困难所在。国际象棋完全可以由一个非常简短的、完全形', 'time': '2017-01-10T12:46'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '来描述', 'origin_text': '难所在。国际象棋完全可以由一个非常简短的、完全形式化的规则列表  !!!描述!!!  ，并可以轻松由程序员提前提供。讽刺的是，抽象和形式的任务对人', 'time': '2017-01-10T12:47'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '容易地', 'origin_text': '际象棋完全可以由一个非常简短的、完全形式化的规则列表描述，并可以  !!!轻松!!!  由程序员提前提供。讽刺的是，抽象和形式的任务对人类而言是最困', 'time': '2017-01-10T12:47'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '事先准备好', 'origin_text': '以由一个非常简短的、完全形式化的规则列表描述，并可以轻松由程序员  !!!提前提供!!!  。讽刺的是，抽象和形式的任务对人类而言是最困难的脑力任务之一', 'time': '2017-01-10T12:48'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '形式化', 'origin_text': '的规则列表描述，并可以轻松由程序员提前提供。讽刺的是，抽象和  !!!形式!!!  的任务对人类而言是最困难的脑力任务之一，对计算机而言却属于最容易', 'time': '2017-01-10T13:27'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但对', 'origin_text': '讽刺的是，抽象和形式的任务对人类而言是最困难的脑力任务之一，  !!!对!!!  计算机而言却属于最容易的。即使是最好的人类棋手，计算机也早已能', 'time': '2017-01-10T13:27'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '识别目标或语音任务中', 'origin_text': '是最好的人类棋手，计算机也早已能够将其打败，但直到最近计算机才在  !!!对象识别或语音任务中!!!  达到人类平均水平。一个人的日常生活需要关于世界的巨量知识。很', 'time': '2017-01-10T13:29'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '形式化', 'origin_text': '世界的巨量知识。很多这方面的知识是主观的、直观的，因此很难通过  !!!形式!!!  的方式表达清楚。为了表现出智能，计算机需要获取同样的知识。人', 'time': '2017-01-10T13:30'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '形式化', 'origin_text': '算机需要获取同样的知识。人工智能的一个关键挑战就是如何将这些非  !!!形式!!!  的知识传达给计算机。一些人工智能项目都力求将关于世界的知识用', 'time': '2017-01-10T13:30'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '计算机可以使用逻辑推理规则来自动地理解这些形式化语言中的申明', 'origin_text': '一些人工智能项目都力求将关于世界的知识用形式化的语言进行硬编码。  !!!计算机可以通过这些形式化语言自动地使用逻辑推理规则来理解声明!!!  。这就是所谓的人工智能的知识图谱方法。这些项目都没有导致重大', 'time': '2017-01-11T04:17'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '把英文 (hard-code) 附上', 'origin_text': '机。一些人工智能项目都力求将关于世界的知识用形式化的语言进行  !!!硬编码!!!  。计算机可以通过这些形式化语言自动地使用逻辑推理规则来理解声明', 'time': '2017-01-11T04:09'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '识图谱方法。这些项目都没有导致重大的成功。其中最著名的项目是  !!!的!!!  Cyc {cite?}。Cyc包括一个推断引擎和一个使用Cyc', 'time': '2017-01-11T04:24'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '众所周知', 'origin_text': '可以通过这些形式化语言自动地使用逻辑推理规则来理解声明。这就是  !!!所谓!!!  的人工智能的知识图谱方法。这些项目都没有导致重大的成功。其中', 'time': '2017-01-11T04:28'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '人们设法设计出足够复杂的形式规则去精确地描述世界', 'origin_text': '数据库。这些声明是由人类监督者输入的。这是一个笨拙的过程。  !!!人们设法设计出足够复杂的、能准确描述世界的形式规则!!!  。例如，Cyc不能理解一个关于名为Fred的人在早上剃须的故事', 'time': '2017-01-11T04:33'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '正拿', 'origin_text': '引擎检测到故事中的不一致性：它知道人没有电气零件，但由于Fred  !!!拿!!!  着一个电动剃须刀，它认为实体”FredWhileShaving”', 'time': '2017-01-11T04:35'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '“Fred在剃须”（“FredWhileShaving”）', 'origin_text': '知道人没有电气零件，但由于Fred拿着一个电动剃须刀，它认为实体  !!!”FredWhileShaving”!!!  含有电气部件。因此就会产生这样的疑问——Fred在刮胡子的时候', 'time': '2017-01-11T04:46'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': ' 因此它产生了这样的疑问', 'origin_text': '刀，它认为实体”FredWhileShaving”含有电气部件。  !!!因此就会产生这样的疑问!!!  ——Fred在刮胡子的时候是否仍然是一个人。依靠硬编码的知识', 'time': '2017-01-11T04:49'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': ' 比如，一个被称为逻辑回归的简单机器学习算法', 'origin_text': '使计算机能够解决涉及现实世界知识的问题，并能作出看似主观的决策。  !!!所谓逻辑回归的简单机器学习算法!!!  可以决定是否建议剖腹产{cite?}。所谓朴素贝叶斯的简单机器', 'time': '2017-01-11T05:04'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '而朴素贝叶斯---同样是一个简单机器学习算法---则可以', 'origin_text': '辑回归的简单机器学习算法可以决定是否建议剖腹产{cite?}。  !!!所谓朴素贝叶斯的简单机器学习算法可以!!!  区分垃圾电子邮件和合法电子邮件。这些简单的机器学习算法的', 'time': '2017-01-11T04:59'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '在整个计算机科学乃至日常生活中，对表示的依赖都是一个的普遍现象', 'origin_text': 'RI扫描的单一像素与分娩过程中的并发症只有微不足道的相关性。  !!!对表示的依赖是在整个计算机科学乃至日常生活中出现的普遍现象!!!  。在计算机科学中，如果数据集合经过精巧的结构化并建立索引，数据', 'time': '2017-01-11T05:13'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '成指数级地', 'origin_text': '，如果数据集合经过精巧的结构化并建立索引，数据操作的处理速度可以  !!!成倍的!!!  加快（如搜索）。人们可以很容易地在阿拉伯数字的表示下进行算术运', 'time': '2017-01-11T05:15'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '被精巧地结构化并被智能地索引', 'origin_text': '科学乃至日常生活中出现的普遍现象。在计算机科学中，如果数据集合  !!!经过精巧的结构化并建立索引!!!  ，数据操作的处理速度可以成倍的加快（如搜索）。人们可以很容易地', 'time': '2017-01-11T05:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '因此，毫不奇怪', 'origin_text': '拉伯数字的表示下进行算术运算，但在罗马数字的表示下运算会更耗时。  !!!毫不奇怪!!!  ，表示的选择会对机器学习算法的性能产生巨大的影响。\\\\fig?显', 'time': '2017-01-11T05:37'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '展示', 'origin_text': '怪，表示的选择会对机器学习算法的性能产生巨大的影响。\\\\fig?  !!!显示!!!  了一个简单的可视化例子。\\\\begin{figure}[!htb', 'time': '2017-01-11T05:37'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '、', 'origin_text': '有用特征是说话者声道大小的估计。这个特征为判断说话者是一个男性  !!!，!!!  女性还是儿童提供了有力线索。然而，对于许多任务来说，很难知道', 'time': '2017-01-11T06:13'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '看上去像什么', 'origin_text': '在作为特征。不幸的是，我们难以准确地从像素值的角度描述一个车轮  !!!看起来如何!!!  。车轮具有简单的几何形状，但它的图像可以因为环境而变得很复杂，', 'time': '2017-01-11T06:17'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '因场景', 'origin_text': '描述一个车轮看起来如何。车轮具有简单的几何形状，但它的图像可以  !!!因为环境!!!  而变得很复杂，如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车', 'time': '2017-01-11T06:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '可能因场景而', 'origin_text': '角度描述一个车轮看起来如何。车轮具有简单的几何形状，但它的图像  !!!可以因为环境而!!!  变得很复杂，如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的', 'time': '2017-01-11T06:20'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '的一个途径', 'origin_text': '的挡泥板或者遮挡的车轮一部分的前景物体等等。解决这个问题  !!!一个途径的!!!  是使用机器学习来发现表示本身，而不仅仅把表示映射到输出。这种方', 'time': '2017-01-11T06:22'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '挖掘', 'origin_text': '分的前景物体等等。解决这个问题一个途径的是使用机器学习来  !!!发现!!!  表示本身，而不仅仅把表示映射到输出。这种方法被称为表示学习。', 'time': '2017-01-11T06:22'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '这种方法我们称之为表示学习', 'origin_text': '途径的是使用机器学习来发现表示本身，而不仅仅把表示映射到输出。  !!!这种方法被称为表示学习!!!  。学习到的表示往往比手动设计的表示表现得更好。并且它们只需最', 'time': '2017-01-11T06:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '翻译为“自编码器” 比较贴切些', 'origin_text': '要花费整个社群研究人员几十年的时间。表示学习算法的典型例子是  !!!自动编码器!!!  。自动编码器组合了将输入转换到不同表示编码器函数和将新的表示转', 'time': '2017-01-11T06:28'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '自动编码器由一个编码器函数和一个解码器函数组成。编码器把输入数据转换为一种不同的表示，而解码器则把这个新的表示变换成原来的格式。', 'origin_text': '研究人员几十年的时间。表示学习算法的典型例子是自动编码器。  !!!自动编码器组合了将输入转换到不同表示编码器函数和将新的表示转回原来形式的解码器函数。!!!   自动编码器的训练目标是，输入经过编码器和解码器之后尽可能多的', 'time': '2017-01-11T10:52'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '输入数据', 'origin_text': '将新的表示转回原来形式的解码器函数。 自动编码器的训练目标是，  !!!输入!!!  经过编码器和解码器之后尽可能多的保留信息，同时希望新的表示有各种', 'time': '2017-01-11T11:07'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '训练自编码器我们期望当输入数据经过编码器和解码器之后尽可能多地保留信息', 'origin_text': '换到不同表示编码器函数和将新的表示转回原来形式的解码器函数。   !!!自动编码器的训练目标是，输入经过编码器和解码器之后尽可能多的保留信息!!!  ，同时希望新的表示有各种好的属性。不同种类的自动编码器的目标是实', 'time': '2017-01-11T11:40'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '设计用于学习特征', 'origin_text': '不同种类的自动编码器的目标是实现不同种类的属性。当设计特征或  !!!学习特征!!!  的算法时，我们的目标通常是分离出能解释观察数据的\\\\textbf{', 'time': '2017-01-11T11:42'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '在许多现实的人工智能应用中，', 'origin_text': '，变化的因素包括汽车的位置、它的颜色、太阳的角度和亮度。  !!!在现实世界，许多人工智能应用!!!  困难的一个重要原因是很多变化因素影响着我们能够观察到的每一个数据', 'time': '2017-01-11T11:55'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '困难主要源于', 'origin_text': '它的颜色、太阳的角度和亮度。在现实世界，许多人工智能应用  !!!困难的一个重要原因是!!!  很多变化因素影响着我们能够观察到的每一个数据。在夜间，一张图片', 'time': '2017-01-11T11:55'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': ' 比如，在一张红色汽车图片中，其单个像素在夜间可能会非常接近黑色。', 'origin_text': '难的一个重要原因是很多变化因素影响着我们能够观察到的每一个数据。  !!!在夜间，一张图片中红色汽车的单个像素可能会非常接近黑色。!!!  汽车轮廓的形状取决于视角。大多数应用需要我们\\\\emph{理清', 'time': '2017-01-11T11:59'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '辨识', 'origin_text': '素，诸如说话者的口音，只能对数据进行复杂的、接近人类水平的理解来  !!!确定!!!  。它几乎与获得原来问题的表示一样困难，乍一看，表示学习似乎并不', 'time': '2017-01-11T12:14'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改为“这”', 'origin_text': '说话者的口音，只能对数据进行复杂的、接近人类水平的理解来确定。  !!!它!!!  几乎与获得原来问题的表示一样困难，乍一看，表示学习似乎并不能帮助', 'time': '2017-01-11T12:14'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '因此，乍一看，', 'origin_text': '接近人类水平的理解来确定。它几乎与获得原来问题的表示一样困难，  !!!乍一看!!!  ，表示学习似乎并不能帮助我们。深度学习通过其它较简单的表示来', 'time': '2017-01-11T12:15'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它解决', 'origin_text': '并不能帮助我们。深度学习通过其它较简单的表示来表达复杂表示，  !!!解决!!!  了表示学习中的核心问题。\\\\begin{figure}[!ht', 'time': '2017-01-11T12:19'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '展示了深度学习系统如何通过组合较简单的概念---例如转角和轮廓，它们转而被边线定义--来表示人的图像概念', 'origin_text': '}深度学习让计算机通过较简单概念构建复杂的概念。\\\\fig?  !!!显示了深度学习系统通过组合较简单的概念，例如转角和轮廓，转而定义边缘来表示图像中一个人的概念!!!  。深度学习模型的典型例子是前馈深度网络或多层感知机。多层感知', 'time': '2017-01-11T12:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '复合而成', 'origin_text': '一个将一组输入值映射到输出的数学函数。该函数由许多较简单的函数  !!!组合构成!!!  。我们可以认为每个应用具有不同的数学函数，并为输入提供新的表示', 'time': '2017-01-11T12:38'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '输出值', 'origin_text': '馈深度网络或多层感知机。多层感知机仅仅是一个将一组输入值映射到  !!!输出!!!  的数学函数。该函数由许多较简单的函数组合构成。我们可以认为每', 'time': '2017-01-11T12:38'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '学习数据的正确表示的思想为深度学习提供了一种视角。\\n', 'origin_text': '们可以认为每个应用具有不同的数学函数，并为输入提供新的表示。  !!!学习数据正确表示的想法是解释深度学习的一个观点!!!  。另一个观点是深度允许计算机学习一个多步骤的计算机程序。表示', 'time': '2017-01-11T12:44'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '另一个视角是', 'origin_text': '新的表示。学习数据正确表示的想法是解释深度学习的一个观点。  !!!另一个观点是!!!  深度允许计算机学习一个多步骤的计算机程序。表示的每一层可以被认', 'time': '2017-01-11T12:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '能够让计算机去学习', 'origin_text': '习数据正确表示的想法是解释深度学习的一个观点。另一个观点是深度  !!!允许计算机学习!!!  一个多步骤的计算机程序。表示的每一层可以被认为是并行执行另一组', 'time': '2017-01-11T12:48'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '去组织', 'origin_text': '算机程序中的计数器或指针。它与具体的输入内容无关，但有助于模型  !!!组织!!!  其处理过程。目前主要有两种测量模型深度的方式。第一观点', 'time': '2017-01-11T13:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '度量', 'origin_text': '输入内容无关，但有助于模型组织其处理过程。目前主要有两种  !!!测量!!!  模型深度的方式。第一观点是基于评估架构所需执行的顺序指令的数目', 'time': '2017-01-11T13:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '第一个', 'origin_text': '模型组织其处理过程。目前主要有两种测量模型深度的方式。  !!!第一!!!  观点是基于评估架构所需执行的顺序指令的数目。我们可以认为这是描', 'time': '2017-01-11T13:07'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '；', 'origin_text': '长路径。正如两个等价的计算机程序根据不同的语言将具有不同的长度  !!!，!!!  相同的函数可以被绘制为具有不同深度的流程图，这取决于我们允许使用', 'time': '2017-01-11T13:17'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '其深度', 'origin_text': '言将具有不同的长度，相同的函数可以被绘制为具有不同深度的流程图，  !!!这!!!  取决于我们允许使用的单步函数。\\\\fig?说明了语言的选择怎样给', 'time': '2017-01-11T13:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它不是', 'origin_text': '\\\\end{figure}另一种是在深度概率模型中使用的方法，  !!!不是!!!  将计算图的深度视为模型深度，而是将描述概念如何彼此相关的图的深度', 'time': '2017-01-11T13:29'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '彼此如何', 'origin_text': '模型中使用的方法，不是将计算图的深度视为模型深度，而是将描述概念  !!!如何彼此!!!  相关的图的深度视为模型深度。在这种情况下，计算每个概念表示的计', 'time': '2017-01-11T13:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '后可以进一步', 'origin_text': '更深。这是因为系统对较简单概念的理解可以在给出更复杂概念的信息  !!!后进一步!!!  细化。例如，一个AI系统观察到其中一只眼睛在阴影中的脸部图像，', 'time': '2017-01-11T13:36'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '一个观察其中一只眼睛在阴影中的脸部图像的AI系统最初可能只看到一只眼睛。', 'origin_text': '较简单概念的理解可以在给出更复杂概念的信息后进一步细化。例如，  !!!一个AI系统观察到其中一只眼睛在阴影中的脸部图像，最初可能只看到一只眼睛。!!!  当检测到脸部的存在后，它可以推断第二只眼睛也可能是存在的。在', 'time': '2017-01-11T13:41'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但当', 'origin_text': '观察到其中一只眼睛在阴影中的脸部图像，最初可能只看到一只眼睛。  !!!当!!!  检测到脸部的存在后，它可以推断第二只眼睛也可能是存在的。在这种', 'time': '2017-01-11T13:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '系统', 'origin_text': '影中的脸部图像，最初可能只看到一只眼睛。当检测到脸部的存在后，  !!!它!!!  可以推断第二只眼睛也可能是存在的。在这种情况下，概念的图仅包括', 'time': '2017-01-11T13:46'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“个”', 'origin_text': '个概念给出的其它nnn次估计进行细化，计算的图将包括2n2n2n  !!!个!!!  层。由于并不总是清楚计算图的深度或概率模型图的深度哪一个', 'time': '2017-01-11T13:48'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '能够使', 'origin_text': '—深度学习是AI的途径之一。具体来说，它是机器学习的一种，一种  !!!允许!!!  计算机系统从经验和数据中得到提高的技术。我们坚信机器学习可以构', 'time': '2017-01-11T13:59'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '切实可行', 'origin_text': '坚信机器学习可以构建出在复杂实际环境下运行的AI系统，并且是唯一  !!!可行!!!  的方法。深度学习是一种特定类型的机器学习，具有强大的能力和灵活', 'time': '2017-01-11T14:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '通向AI', 'origin_text': '概念的组合，这点毋庸置疑。总之， 这本书的主题——深度学习是  !!!AI!!!  的途径之一。具体来说，它是机器学习的一种，一种允许计算机系统从', 'time': '2017-01-11T14:01'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '为两类受众对象而写的', 'origin_text': '}本书面向的读者这本书对各类读者都有一定用处的，但我们是  !!!基于两个主要目标受众!!!  而写的。其中一个目标受众是学习机器学习的大学生（本科或研究生）', 'time': '2017-01-13T02:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '一类受众对象', 'origin_text': '类读者都有一定用处的，但我们是基于两个主要目标受众而写的。其中  !!!一个目标受众!!!  是学习机器学习的大学生（本科或研究生），包括那些已经开始职业生涯', 'time': '2017-01-13T02:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '一类受众对象', 'origin_text': '究生），包括那些已经开始职业生涯的深度学习和人工智能研究者。另  !!!一个目标群体!!!  是没有机器学习或统计背景但要迅速在他们的产品或平台中使用深度学习', 'time': '2017-01-13T02:54'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但希望能快速地掌握这方面知识并在他们的产品或平台中使用深度学习的软件工程师。', 'origin_text': '度学习和人工智能研究者。另一个目标群体是没有机器学习或统计背景  !!!但要迅速在他们的产品或平台中使用深度学习的软件工程师!!!  。深度学习在许多软件领域都已被证明是有用的，包括计算机视觉、语', 'time': '2017-01-13T03:11'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '服务', 'origin_text': '后一章的必备内容。}\\\\end{figure}为了最好地  !!!适应!!!  各类读者，这本书被组织为三个部分。第一部分介绍基本的数学工具和', 'time': '2017-01-13T03:33'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '讨论某些具有展望性的想法，它们被广泛地认为是深度学习的未来研究重点。', 'origin_text': '第二部分介绍本质上已解决的技术、最成熟的深度学习算法。第三部分  !!!介绍被广泛认为是深度学习未来研究重点的但更具猜测性的想法!!!  。读者可以随意跳过不感兴趣或与自己背景不相关的部分。熟悉线', 'time': '2017-01-13T03:56'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '并对在一本书中看到关于一个新兴领域”历史”的提及而感到惊讶', 'origin_text': '我们期待这本书的许多读者都听说过深度学习这一激动人心的新技术，  !!!并为一本书提及关于一个新兴领域的”历史”而感到惊讶!!!  。事实上，深度学习的历史可以追溯到20世纪40年代。深度学习', 'time': '2017-01-13T04:15'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它反映', 'origin_text': '最近才成为众所周知的”深度学习”。这个领域已经更换了很多名称，  !!!反映!!!  了不同的研究人员和不同观点的影响。讲述整个综合性的深度学习历', 'time': '2017-01-13T04:16'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '全面地讲述深度学习的历史', 'origin_text': '域已经更换了很多名称，反映了不同的研究人员和不同观点的影响。  !!!讲述整个综合性的深度学习历史!!!  超出了本书的范围。然而，一些基本的背景对理解深度学习是有用的。', 'time': '2017-01-13T04:29'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '深度学习已经经历了三次发展浪潮', 'origin_text': '然而，一些基本的背景对理解深度学习是有用的。一般来说，目前为止  !!!已经有三次深度学习的发展浪潮!!!  ：在20世纪40年代到60年代深度学习被称为控制论，20世纪80', 'time': '2017-01-13T04:32'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '\\\\fig?给出了定量的展示。', 'origin_text': '度学习被誉为连接机制，并于2006年开始，以深度学习之名复兴。  !!!这在\\\\fig?中定量给出。!!!  \\\\begin{figure}[!htb]\\\\ifOpenSour', 'time': '2017-01-13T04:37'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '今天知道', 'origin_text': '相应的科学活动晚得多。}\\\\end{figure}我们  !!!现在认识!!!  的一些最早的学习算法，旨在模拟生物学习的计算模型，即大脑怎样学习', 'time': '2017-01-13T04:47'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '是旨在', 'origin_text': 'end{figure}我们现在认识的一些最早的学习算法，  !!!旨在!!!  模拟生物学习的计算模型，即大脑怎样学习或为什么能学习的模型。其', 'time': '2017-01-13T04:42'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '深度学习以人工神经网络之名而淡去', 'origin_text': '学习的计算模型，即大脑怎样学习或为什么能学习的模型。其结果是，  !!!已消逝的深度学习的名称之一——人工神经网络!!!  。此时深度学习模型对应的观点是他们设计的系统是受生物大脑（无论', 'time': '2017-01-13T04:51'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '彼时，深度学习模型被认为是受生物大脑（无论人类大脑或其他动物的大脑）所启发而设计出来的系统。', 'origin_text': '的模型。其结果是，已消逝的深度学习的名称之一——人工神经网络。  !!!此时深度学习模型对应的观点是他们设计的系统是受生物大脑（无论人类大脑或其他动物的大脑）所启发。!!!  尽管有些机器学习的神经网络有时被用来理解大脑功能{cite?}', 'time': '2017-01-13T04:57'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但它们', 'origin_text': '尽管有些机器学习的神经网络有时被用来理解大脑功能{cite?}，  !!!它们!!!  一般都没有被设计成生物功能的真实模型。深度学习的神经观点受两个', 'time': '2017-01-13T04:59'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '设计成生物功能的真实模型。深度学习的神经观点受两个主要思想启发  !!!的!!!  。一个想法是大脑这个例子证明智能行为的可能性，因此从概念上讲，', 'time': '2017-01-13T05:01'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '作为例子', 'origin_text': '模型。深度学习的神经观点受两个主要思想启发的。一个想法是大脑  !!!这个例子!!!  证明智能行为的可能性，因此从概念上讲，建立智能的直接途径是逆向大', 'time': '2017-01-13T05:03'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '是可能的', 'origin_text': '经观点受两个主要思想启发的。一个想法是大脑这个例子证明智能行为  !!!的可能性!!!  ，因此从概念上讲，建立智能的直接途径是逆向大脑背后的计算原理，并', 'time': '2017-01-13T05:03'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '因此，概念上，', 'origin_text': '个主要思想启发的。一个想法是大脑这个例子证明智能行为的可能性，  !!!因此从概念上讲!!!  ，建立智能的直接途径是逆向大脑背后的计算原理，并复制其功能。另', 'time': '2017-01-13T05:07'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '逆向工程化', 'origin_text': '个例子证明智能行为的可能性，因此从概念上讲，建立智能的直接途径是  !!!逆向!!!  大脑背后的计算原理，并复制其功能。另一种看法是，理解大脑和人类', 'time': '2017-01-13T13:33'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '原理', 'origin_text': '计算原理，并复制其功能。另一种看法是，理解大脑和人类智力背后的  !!!原则!!!  也非常有趣，因此机器学习模型除了解决工程应用的能力， 如果能阐明', 'time': '2017-01-13T13:35'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '能让人们对这些基本的科学问题有进一步的认识也将会很有用', 'origin_text': '的原则也非常有趣，因此机器学习模型除了解决工程应用的能力， 如果  !!!能阐明这些基本的科学问题也将会很有用!!!  。现代术语”深度学习”超越了目前机器学习模型的神经科学观', 'time': '2017-01-13T13:50'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '现代术语”深度学习”超越了目前机器学习模型的神经科学观点。学习  !!!的!!!  \\\\emph{多层次组合}这一更普遍的原则更加吸引人，这可以应用于', 'time': '2017-01-13T13:58'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '复合', 'origin_text': '超越了目前机器学习模型的神经科学观点。学习的\\\\emph{多层次  !!!组合!!!  }这一更普遍的原则更加吸引人，这可以应用于机器学习框架且不必是受', 'time': '2017-01-13T14:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '一更普遍的原则更加吸引人，这可以应用于机器学习框架且不必是受神经  !!!启发的!!!  。现代深度学习的最早前身是从神经科学的角度出发的简单线性模型', 'time': '2017-01-13T14:01'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改为“希望”', 'origin_text': 's ,\\\\Sx_n并将它们与一个输出yy\\\\Sy相关联。 这些模型  !!!将!!!  学习一组权重w1,…,wnw1,…,wn\\\\Sw_1, \\\\dots', 'time': '2017-01-14T05:59'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '这第一波神经网络研究浪潮', 'origin_text': '_1 \\\\Sw_1 + \\\\dots + \\\\Sx_n \\\\Sw_n。  !!!这第一次神经网络研究的浪潮!!!  被称为控制论，如\\\\fig?所示。McCulloch-Pitt', 'time': '2017-01-14T06:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '如\\\\fig?所示，这第一波神经网络研究浪潮被称为控制论。', 'origin_text': '_1 \\\\Sw_1 + \\\\dots + \\\\Sx_n \\\\Sw_n。  !!!这第一次神经网络研究的浪潮被称为控制论，如\\\\fig?所示。!!!  McCulloch-Pitts神经元{cite?}是脑功能的', 'time': '2017-01-14T06:04'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改为“正负”', 'origin_text': '性模型通过测试函数f(x,w)f(x,w)f(\\\\Vx,\\\\Vw)的  !!!是正还是负!!!  来识别两种不同类型的输入。当然，为了使模型对应于期望的类别定义', 'time': '2017-01-14T06:21'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '检验', 'origin_text': 'itts神经元{cite?}是脑功能的早期模型。该线性模型通过  !!!测试!!!  函数f(x,w)f(x,w)f(\\\\Vx,\\\\Vw)的是正还是负来识', 'time': '2017-01-14T06:25'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '类别', 'origin_text': ',w)f(x,w)f(\\\\Vx,\\\\Vw)的是正还是负来识别两种不同  !!!类型!!!  的输入。当然，为了使模型对应于期望的类别定义，需要正确地设置权', 'time': '2017-01-14T06:25'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '类别的期望定义', 'origin_text': ')的是正还是负来识别两种不同类型的输入。当然，为了使模型对应于  !!!期望的类别定义!!!  ，需要正确地设置权重。这些权重可以由操作人员设定。在20世纪', 'time': '2017-01-14T06:29'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '可以', 'origin_text': '测试函数f(x,w)f(x,w)f(\\\\Vx,\\\\Vw)的是正还是负  !!!来!!!  识别两种不同类型的输入。当然，为了使模型对应于期望的类别定义，', 'time': '2017-01-14T06:30'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“了”', 'origin_text': '设定。在20世纪50年代，感知机{cite?}成为第一个能根据  !!!了!!!  每个类别输入的样例来学习权重的模型。约在同一时期，\\\\textb', 'time': '2017-01-14T07:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“，”', 'origin_text': 'daptive linear element, ADALINE)  !!!，!!!  简单地返回函数f(x)f(x)f(\\\\Vx)本身的值来预测一个实数', 'time': '2017-01-14T07:33'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它还', 'origin_text': ')f(x)f(\\\\Vx)本身的值来预测一个实数{cite?}，并且  !!!还!!!  可以学习从数据预测这些数。这些简单的学习算法大大影响了机器学', 'time': '2017-01-14T07:47'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '被称为', 'origin_text': '响了机器学习的现代景象。用于调节ADALINE权重的训练算法是  !!!称为!!!  随机梯度下降的一种特例。稍加修改的随机梯度下降算法仍然是当今深', 'time': '2017-01-14T07:49'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '基于被感知机和ADALINE使用', 'origin_text': '稍加修改的随机梯度下降算法仍然是当今深度学习的主要训练算法。  !!!基于感知机和ADALINE中使用!!!  的函数f(x,w)f(x,w)f(\\\\Vx, \\\\Vw)的模型被称为', 'time': '2017-01-14T08:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '异或(XOR)', 'origin_text': 'h{训练}。线性模型有很多局限性。最著名的是，它们无法学习  !!!XOR!!!  函数，即f([0,1],w)=1,f([1,0],w)=1f([', 'time': '2017-01-14T08:07'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '“，”  改为 “和”', 'origin_text': '最著名的是，它们无法学习XOR函数，即f([0,1],w)=1  !!!,f!!!  ([1,0],w)=1f([0,1],w)=1,f([1,0],', 'time': '2017-01-14T08:08'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': ' “，”改为“和”', 'origin_text': '1, f([1,0], \\\\Vw)=1，但f([1,1],w)=0  !!!,!!!  f([0,0],w)=0f([1,1],w)=0,f([0,0]', 'time': '2017-01-14T08:08'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '观察到线性模型这个缺陷的批评者对受生物学启发的学习普遍地产生了抵触', 'origin_text': '[1,1], \\\\Vw)=0, f([0,0],\\\\Vw)= 0。  !!!在线性模型中观察到这些缺陷的批评者开始反对受生物学启发的学习!!!  {cite?}。这是神经网络热潮的第一次大幅下降。现在，神', 'time': '2017-01-14T08:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '这导致了神经网络热潮的第一次大消退', 'origin_text': '察到这些缺陷的批评者开始反对受生物学启发的学习{cite?}。  !!!这是神经网络热潮的第一次大幅下降!!!  。现在，神经科学被视为深度学习研究的一个重要灵感来源，但它已', 'time': '2017-01-14T08:20'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '主要指导', 'origin_text': '经科学被视为深度学习研究的一个重要灵感来源，但它已不再是该领域的  !!!主要导向!!!  。如今神经科学在深度学习研究中的作用被削弱，主要原因是我', 'time': '2017-01-14T08:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '指导去使用它', 'origin_text': '究中的作用被削弱，主要原因是我们根本没有足够的关于大脑信息来作为  !!!指导!!!  。要获得对大脑实际使用算法的深刻理解，我们需要有能力同时监测（', 'time': '2017-01-14T08:27'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '对被', 'origin_text': '弱，主要原因是我们根本没有足够的关于大脑信息来作为指导。要获得  !!!对!!!  大脑实际使用算法的深刻理解，我们需要有能力同时监测（至少是）数千', 'time': '2017-01-14T08:30'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '应该需要', 'origin_text': '于大脑信息来作为指导。要获得对大脑实际使用算法的深刻理解，我们  !!!需要!!!  有能力同时监测（至少是）数千相连神经元的活动。我们不能够做到这', 'time': '2017-01-14T08:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '同时去', 'origin_text': '来作为指导。要获得对大脑实际使用算法的深刻理解，我们需要有能力  !!!同时!!!  监测（至少是）数千相连神经元的活动。我们不能够做到这一点，甚至', 'time': '2017-01-14T08:32'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '所以我们甚至连大脑的最简单、最深入研究的部分都还远远没有理解', 'origin_text': '同时监测（至少是）数千相连神经元的活动。我们不能够做到这一点，  !!!甚至连大脑的最简单、最深入研究的部分我们都还远远没有理解!!!  {cite?}。神经科学已经给了我们依靠单一深度学习算法解决', 'time': '2017-01-14T08:35'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '区域去', 'origin_text': '重新连接，使视觉信号传送到听觉区域，它们可以学会用大脑的听觉处理  !!!区域!!!  ”看”{cite?}。这表明，多数哺乳动物大脑的可能使用单一的', 'time': '2017-01-14T08:41'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '提示', 'origin_text': '区域，它们可以学会用大脑的听觉处理区域”看”{cite?}。这  !!!表明!!!  ，多数哺乳动物大脑的可能使用单一的算法解决大部分大脑可以解决的不', 'time': '2017-01-14T08:46'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '大多数哺乳动物的大脑可能使用单一的算法就可以去解决其大脑解决的大部分不同任务', 'origin_text': '它们可以学会用大脑的听觉处理区域”看”{cite?}。这表明，  !!!多数哺乳动物大脑的可能使用单一的算法解决大部分大脑可以解决的不同任务!!!  。这个假设之前，机器学习研究更加分散，研究人员在不同的社群研究', 'time': '2017-01-14T08:58'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '是比较分散的', 'origin_text': '法解决大部分大脑可以解决的不同任务。这个假设之前，机器学习研究  !!!更加分散!!!  ，研究人员在不同的社群研究自然语言处理、计算机视觉、运动规划和语', 'time': '2017-01-14T09:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '究自然语言处理、计算机视觉、运动规划和语音识别。如今，这些应用  !!!的!!!  社群仍然是独立的，但是深度学习研究小组同时研究许多或甚至所有这些', 'time': '2017-01-14T09:03'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '对于深度学习研究团体来说', 'origin_text': '觉、运动规划和语音识别。如今，这些应用的社群仍然是独立的，但是  !!!深度学习研究小组!!!  同时研究许多或甚至所有这些应用领域是很常见的。我们能够从神经', 'time': '2017-01-14T09:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它后来', 'origin_text': '受哺乳动物视觉系统的结构启发，引入了一个处理图片的强大模型架构，  !!!后来!!!  成为了现代卷积网络的基础{cite?}，我们将会在\\\\sec?看到', 'time': '2017-01-14T09:10'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '(我们将会在第9.10节看到)', 'origin_text': '理图片的强大模型架构，后来成为了现代卷积网络的基础{cite?}  !!!，我们将会在\\\\sec?看到!!!  。目前大多数神经网络基于称为整流线性单元的神经单元模型。原始', 'time': '2017-01-14T09:13'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '是基于一个称为', 'origin_text': '础{cite?}，我们将会在\\\\sec?看到。目前大多数神经网络  !!!基于称为!!!  整流线性单元的神经单元模型。原始认知机{cite?}受我们关于', 'time': '2017-01-14T13:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '通过吸收来自不同观点的思想而形成，', 'origin_text': '关于大脑功能知识的启发， 引入了一个更复杂的版本。简化的现代版  !!!基于许多观点!!!  进化发展，{Nair-2010}和{Glorot+al-AI-2', 'time': '2017-01-14T13:42'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但它', 'origin_text': '009}援引更多面向工程的影响。虽然神经科学是灵感的重要来源，  !!!它!!!  不需要被视为刚性指导。我们知道，实际的神经元与现代整流线性单元', 'time': '2017-01-14T13:43'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '功能', 'origin_text': '性指导。我们知道，实际的神经元与现代整流线性单元计算着非常不同  !!!函数!!!  ，但更接近真实神经网络的系统并没有导致机器学习性能的提升。此外', 'time': '2017-01-14T13:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但我们对用于神经科学的生物学习还没有足够多的了解，也就不能为训练这些架构用的\\\\emph{学习算法}提供太多的指导。', 'origin_text': '外，虽然神经科学已经成功地启发了一些神经网络\\\\emph{架构}，  !!!但我们还没有足够地了解生物学习的神经科学，因此在训练这些架构时，不能提供给我们很多关于\\\\emph{学习算法}的指导。!!!  媒体报道经常强调深度学习与大脑的相似性。虽然深度学习研究人', 'time': '2017-01-15T05:19'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改为“的确，”', 'origin_text': '{学习算法}的指导。媒体报道经常强调深度学习与大脑的相似性。  !!!虽然!!!  深度学习研究人员更可能比其他机器学习领域（如核机器或贝叶斯统计工', 'time': '2017-01-15T05:20'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“更可能”', 'origin_text': '媒体报道经常强调深度学习与大脑的相似性。虽然深度学习研究人员  !!!更可能!!!  比其他机器学习领域（如核机器或贝叶斯统计工作的研究人员）引用大脑', 'time': '2017-01-15T05:20'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '研究者', 'origin_text': '指导。媒体报道经常强调深度学习与大脑的相似性。虽然深度学习  !!!研究人员!!!  更可能比其他机器学习领域（如核机器或贝叶斯统计工作的研究人员）引', 'time': '2017-01-15T05:21'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '（如核方法或贝叶斯统计）的研究者更可能地', 'origin_text': '习与大脑的相似性。虽然深度学习研究人员更可能比其他机器学习领域  !!!（如核机器或贝叶斯统计工作的研究人员）!!!  引用大脑作为影响，人们不应该认为深度学习在尝试模拟大脑。现代深', 'time': '2017-01-15T05:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但大家', 'origin_text': '学习领域（如核机器或贝叶斯统计工作的研究人员）引用大脑作为影响，  !!!人们!!!  不应该认为深度学习在尝试模拟大脑。现代深度学习从许多领域获取灵', 'time': '2017-01-15T05:25'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '然而', 'origin_text': '化。尽管一些深度学习的研究人员引用神经科学作为灵感的重要来源，  !!!但!!!  其他学者完全不关心神经科学。值得注意的是，了解大脑是如何', 'time': '2017-01-15T05:37'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '确实存在的', 'origin_text': '学。值得注意的是，了解大脑是如何在算法层面上工作的尝试是  !!!鲜活且发展良好的!!!  。这项尝试主要被称为”计算神经科学”，并且是独立于深度学习的领', 'time': '2017-01-15T05:42'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉', 'origin_text': '在两个领域之间反复研究是很常见的。深度学习领域主要关注如何构建  !!!智能的!!!  计算机系统，用来解决需要智能才能解决的任务，而计算神经科学领域主', 'time': '2017-01-15T05:48'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '如何真实工作的比较精确的模型', 'origin_text': '来解决需要智能才能解决的任务，而计算神经科学领域主要关注构建大脑  !!!如何工作!!!  的更精确的模型。在20世纪80年代，神经网络研究的第二次浪潮', 'time': '2017-01-15T05:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '思潮 或者 潮流', 'origin_text': 'parallel distributed processing)  !!!运动!!!  而出现的{cite?}。连接机制是在认知科学的背景下出现的。', 'time': '2017-01-15T06:56'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '“心智” 和 “意识” 哪个合适？', 'origin_text': 'te?}。连接机制是在认知科学的背景下出现的。认知科学是理解  !!!心智!!!  ，并结合多个不同层次分析的跨学科方法。在20世纪80年代初期，', 'time': '2017-01-15T06:15'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '认知科学是理解心智的跨学科途径，即它融合多个不同的分析层次。', 'origin_text': '而出现的{cite?}。连接机制是在认知科学的背景下出现的。  !!!认知科学是理解心智，并结合多个不同层次分析的跨学科方法!!!  。在20世纪80年代初期，大多数认知科学家研究符号推理的模型。', 'time': '2017-01-15T06:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '学科方法。在20世纪80年代初期，大多数认知科学家研究符号推理  !!!的!!!  模型。尽管这很流行，但符号模型很难解释大脑如何真正使用神经元实', 'time': '2017-01-15T06:24'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '当将大量简单计算单元网络连接在一起时可以实现智能行为', 'origin_text': '20世纪40年代的工作{cite?}。连接机制的中心思想是，  !!!当网络将大量简单计算单元连接在一起时可以实现智能行为!!!  。这种见解同样适用于与计算模型中隐藏单元作用类似的生物神经系统', 'time': '2017-01-15T06:39'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '潮流', 'origin_text': '元作用类似的生物神经系统中的神经元。上世纪80年代的连接机制  !!!运动!!!  过程中形成的几个关键概念在今天的深度学习中仍然是非常重要的。', 'time': '2017-01-15T06:56'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '期间', 'origin_text': '用类似的生物神经系统中的神经元。上世纪80年代的连接机制运动  !!!过程中!!!  形成的几个关键概念在今天的深度学习中仍然是非常重要的。其中一', 'time': '2017-01-15T06:57'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '在上', 'origin_text': '适用于与计算模型中隐藏单元作用类似的生物神经系统中的神经元。  !!!上!!!  世纪80年代的连接机制运动过程中形成的几个关键概念在今天的深度学', 'time': '2017-01-15T06:57'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '认为', 'origin_text': '常重要的。其中一个概念是分布式表示{cite?}。这一想法  !!!是!!!  系统每个的输入应该由许多特征表示的，并且每个特征应参与许多可能输', 'time': '2017-01-15T07:01'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '多个', 'origin_text': '这一想法是系统每个的输入应该由许多特征表示的，并且每个特征应参与  !!!许多!!!  可能输入的表示。例如，假设我们有一个能够识别红色、绿色、或蓝色', 'time': '2017-01-15T07:04'}\n{'user': 'acct:corenel@hypothes.is', 'text': '已经是/已经成为', 'origin_text': '距造出第一台计算机还有一百多年）{cite?}。如今，人工智能  !!!是!!!  一个具有众多实际应用和活跃研究课题的领域，并蓬勃发展着。我们期', 'time': '2017-01-15T07:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '并且正在蓬勃发展', 'origin_text': '}。如今，人工智能是一个具有众多实际应用和活跃研究课题的领域，  !!!并蓬勃发展着!!!  。我们期望通过智能软件自动地处理常规劳动、理解语音或图像、帮助', 'time': '2017-01-15T07:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '那些对人类智力来说非常困难、但对计算机来说相对简单的问题得到了迅速解决', 'origin_text': '音或图像、帮助医学诊断和支持基础科学研究。在人工智能的早期，  !!!那些对人类智力来说非常困难但对计算机来说相对简单的问题得到迅速解决!!!  。比如，那些可以通过一系列形式化的数学规则来描述的问题。人工智', 'time': '2017-01-15T07:11'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对于这些问题，我们人类往往可以凭直觉轻易地解决。', 'origin_text': '执行、但很难形式化描述的任务，比如识别人们所说的话或图像中的脸。  !!!这些问题我们人类能够很自然地通过直觉轻而易举地解决。!!!  针对这些比较直观的问题，本书讨论一种解决方案。该方案可以让', 'time': '2017-01-15T07:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '计算机早就能够打败人类最好的象棋选手', 'origin_text': '人类而言是最困难的脑力任务之一，但对计算机而言却属于最容易的。  !!!即使是最好的人类棋手，计算机也早已能够将其打败!!!  ，但直到最近计算机才在识别对象或语音任务中达到人类平均水平。一', 'time': '2017-01-15T07:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '，', 'origin_text': '我们有一个能够识别红色、绿色、或蓝色的汽车、卡车和鸟类的视觉系统  !!!。!!!  表示这些输入的其中一个方法是将九个可能的组合：红卡车，红汽车，红', 'time': '2017-01-15T07:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': 'MRI扫描的单一像素与分娩过程中的并发症之间的相关性微乎其微。', 'origin_text': '逻辑回归的输入，而不是医生正式的报告，它将无法作出有用的预测。  !!!MRI扫描的单一像素与分娩过程中的并发症只有微不足道的相关性!!!  。在整个计算机科学乃至日常生活中，对表示的依赖都是一个普遍现', 'time': '2017-01-15T07:22'}\n{'user': 'acct:corenel@hypothes.is', 'text': '那么诸如搜索之类的操作的处理速度就可以成指数级地加快', 'origin_text': '象。在计算机科学中，如果数据集合被精巧地结构化并被智能地索引，  !!!数据操作的处理速度就可以成指数级地加快（如搜索）!!!  。人们可以很容易地在阿拉伯数字的表示下进行算术运算，但在罗马数', 'time': '2017-01-15T07:25'}\n{'user': 'acct:corenel@hypothes.is', 'text': '许多人工智能的任务都可以通过先提取一个合适的特征集，然后将这些特征提供给简单的机器学习算法这样的方式来解决。', 'origin_text': 'e-Farley合作画出此图。）}\\\\end{figure}  !!!许多人工智能的任务都可以先提取一个合适的特征集，然后将这些特征提供给简单的机器学习算法来解决。!!!  例如，从声音鉴别说话者的一个有用特征是说话者声道大小的估计。', 'time': '2017-01-15T07:28'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对于通过声音鉴别说话者来说，一个有用的特征是对其声道大小的估计', 'origin_text': '的特征集，然后将这些特征提供给简单的机器学习算法来解决。例如，  !!!从声音鉴别说话者的一个有用特征是说话者声道大小的估计!!!  。这个特征为判断说话者是一个男性、女性还是儿童提供了有力线索。', 'time': '2017-01-15T07:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '我们很难知道', 'origin_text': '个男性、女性还是儿童提供了有力线索。然而，对于许多任务来说，  !!!很难知道!!!  应该提取哪些特征。例如，假设我们想编写一个程序来检测照片中的车', 'time': '2017-01-15T07:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': '是否有车轮', 'origin_text': '程序来检测照片中的车。我们知道，汽车有轮子，所以我们可能会想用  !!!车轮的存在!!!  作为特征。不幸的是，我们难以准确地从像素值的角度描述一个车轮看', 'time': '2017-01-15T07:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因场景而异', 'origin_text': '一个车轮看上去像什么。车轮具有简单的几何形状，但它的图像可能会  !!!因场景而变得很复杂!!!  ，如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者', 'time': '2017-01-15T07:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '虽然车轮', 'origin_text': '幸的是，我们难以准确地从像素值的角度描述一个车轮看上去像什么。  !!!车轮!!!  具有简单的几何形状，但它的图像可能会因场景而变得很复杂，如落在车', 'time': '2017-01-15T07:33'}\n{'user': 'acct:corenel@hypothes.is', 'text': '许多诸如说话口音这样的变化因素', 'origin_text': '当然，从原始数据中提取这样高层次的、抽象的特征是非常困难的。  !!!许多这样的变化因素，诸如说话者的口音!!!  ，只能对数据进行复杂的、接近人类水平的理解来辨识。这几乎与获得', 'time': '2017-01-15T07:38'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '潮流', 'origin_text': '书的核心，我们将在\\\\chap?中更加详细地描述。连接机制  !!!运动!!!  的另一个重要成就是反向传播算法的成功运用（训练具有内部表示的深度', 'time': '2017-01-15T07:40'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因此', 'origin_text': '最有意义的，并且由于不同的人选择不同的最小元素集来构建相应的图，  !!!导致!!!  架构的深度不存在单一的正确值，就像计算机程序的长度不存在单一的正', 'time': '2017-01-15T07:40'}\n{'user': 'acct:corenel@hypothes.is', 'text': '就像计算机程序的长度不存在单一的正确值一样。', 'origin_text': '同的最小元素集来构建相应的图，导致架构的深度不存在单一的正确值，  !!!就像计算机程序的长度不存在单一的正确值!!!  。也不存在模型多么深才能被修饰为”深”的共识。但相比传统机器', 'time': '2017-01-15T07:41'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '主导', 'origin_text': '个算法虽然曾黯然失色不再流行，但截至写书之时，仍是训练深度模型的  !!!主要!!!  方法。% ??在20世纪90年代，研究人员在使用神经网络进行', 'time': '2017-01-15T07:42'}\n{'user': 'acct:corenel@hypothes.is', 'text': '另外，也不存在模型多么深才能被修饰为”深”的共识', 'origin_text': '度不存在单一的正确值，就像计算机程序的长度不存在单一的正确值。  !!!也不存在模型多么深才能被修饰为”深”的共识!!!  。但相比传统机器学习 ，深度学习研究的模型涉及更多学到函数或学', 'time': '2017-01-15T07:42'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这本书对各类读者都具有一定用处', 'origin_text': '中学习的组件。}\\\\end{figure}本书面向的读者  !!!这本书对各类读者都有一定用处的!!!  ，但我们是基于两个主要目标受众而写的。其中一个目标受众是学习机', 'time': '2017-01-15T07:44'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '成功地使用反向传播去训练具有内部表示的深度神经网以及反向传播算法的普及', 'origin_text': 'hap?中更加详细地描述。连接机制运动的另一个重要成就是  !!!反向传播算法的成功运用（训练具有内部表示的深度神经网络）和普及!!!  {cite?}。这个算法虽然曾黯然失色不再流行，但截至写书之时', 'time': '2017-01-15T07:44'}\n{'user': 'acct:corenel@hypothes.is', 'text': '深度学习始终在越来越广泛的应用领域得到了成功的应用。', 'origin_text': '0年代以来，深度学习提供精确识别和预测的能力一直在提高。此外，  !!!深度学习持续成功地应用于越来越广泛的应用!!!  。最早的深度模型被用来识别裁剪得很合适且非常小的图像中的单个', 'time': '2017-01-15T07:51'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '衰退', 'origin_text': '要任务上实现了很好的效果。这两个因素导致了神经网络热潮的第二次  !!!下降!!!  ，一直持续到2007年。在此期间，神经网络持续在某些任务上获', 'time': '2017-01-15T07:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '并一直', 'origin_text': '上实现了很好的效果。这两个因素导致了神经网络热潮的第二次下降，  !!!一直!!!  持续到2007年。在此期间，神经网络持续在某些任务上获得令人', 'time': '2017-01-15T07:53'}\n{'user': 'acct:corenel@hypothes.is', 'text': '大量的', 'origin_text': '来，神经网络可以处理的图像尺寸逐渐增加。现代对象识别网络能处理  !!!丰富的!!!  高分辨率照片，并且不要求在被识别的对象附近进行裁剪{cite?}', 'time': '2017-01-15T07:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '通常能够识别至少', 'origin_text': '对象（或在某些情况下，单一种类的对象的存在与否），而这些现代网络  !!!通常识别至少!!!  1000个不同类别的对象。对象识别中最大的比赛是每年举行的Im', 'time': '2017-01-15T07:56'}\n{'user': 'acct:corenel@hypothes.is', 'text': '激动人心的', 'origin_text': 'Net大型视觉识别挑战（ILSVRC）。深度学习迅速崛起的一个  !!!戏剧性!!!  时刻是卷积网络第一次大幅赢得这一挑战，将最高水准的前5错误率从2', 'time': '2017-01-15T07:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '但测试样例内15.3\\\\%的正确类别不会出现在此列表的前5中', 'origin_text': '?}，这意味着该卷积网络针对每个图像的可能类别生成一个顺序列表，  !!!但15.3\\\\%的测试样例的正确类别不会出现在此列表中的前5!!!  。此后，深度卷积网络一直能在这些比赛中取胜，截至写书时，深度学', 'time': '2017-01-15T07:59'}\n{'user': 'acct:corenel@hypothes.is', 'text': '深度卷积网络在这些比赛中一直取胜', 'origin_text': '5.3\\\\%的测试样例的正确类别不会出现在此列表中的前5。此后，  !!!深度卷积网络一直能在这些比赛中取胜!!!  ，截至写书时，深度学习的进步将这个比赛中的前5错误率降到3.6\\\\', 'time': '2017-01-15T08:00'}\n{'user': 'acct:corenel@hypothes.is', 'text': '降到了', 'origin_text': '些比赛中取胜，截至写书时，深度学习的进步将这个比赛中的前5错误率  !!!降到!!!  3.6\\\\%， 如\\\\fig?所示。\\\\begin{figure}[', 'time': '2017-01-15T08:01'}\n{'user': 'acct:corenel@hypothes.is', 'text': '最早的网络', 'origin_text': '，并且不要求在被识别的对象附近进行裁剪{cite?}。类似地，  !!!最早网络!!!  只能识别两种对象（或在某些情况下，单一种类的对象的存在与否），而', 'time': '2017-01-15T08:02'}\n{'user': 'acct:corenel@hypothes.is', 'text': '发展', 'origin_text': '此后，深度卷积网络一直能在这些比赛中取胜，截至写书时，深度学习的  !!!进步!!!  将这个比赛中的前5错误率降到3.6\\\\%， 如\\\\fig?所示。\\\\', 'time': '2017-01-15T08:02'}\n{'user': 'acct:corenel@hypothes.is', 'text': '不需要', 'origin_text': '像尺寸逐渐增加。现代对象识别网络能处理丰富的高分辨率照片，并且  !!!不要求!!!  在被识别的对象附近进行裁剪{cite?}。类似地，最早网络只能', 'time': '2017-01-15T08:02'}\n{'user': 'acct:corenel@hypothes.is', 'text': '它们', 'origin_text': '络达到了在ImageNet大规模视觉识别挑战中竞争所必需的规模，  !!!他们!!!  每年都能赢得胜利，并且产生越来越低的错误率。数据来源于\\xa0{rus', 'time': '2017-01-15T08:03'}\n{'user': 'acct:corenel@hypothes.is', 'text': '得到提高', 'origin_text': '深度学习也对语音识别产生了巨大影响。语音识别在20世纪90年代  !!!提高!!!  后，直到约2000年都停滞不前。深度学习的引入{cite?}导', 'time': '2017-01-15T08:03'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使得', 'origin_text': '高后，直到约2000年都停滞不前。深度学习的引入{cite?}  !!!导致!!!  语音识别错误率陡然下降，有些错误率甚至降低了一半。 我们将在\\\\', 'time': '2017-01-15T08:04'}\n{'user': 'acct:corenel@hypothes.is', 'text': '取得了惊人的成功', 'origin_text': 'ec?更详细地探讨这个历史。深度网络在行人检测和图像分割中也  !!!有引人注目的成功!!!  {cite?}，在交通标志分类上取得了超越人类的表现{cite?', 'time': '2017-01-15T08:05'}\n{'user': 'acct:corenel@hypothes.is', 'text': '并且在', 'origin_text': '深度网络在行人检测和图像分割中也有引人注目的成功{cite?}，  !!!在!!!  交通标志分类上取得了超越人类的表现{cite?}。在深度网络', 'time': '2017-01-15T08:05'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去 的', 'origin_text': '分类上取得了超越人类的表现{cite?}。在深度网络的规模和  !!!的!!!  精度有所提高的同时，它们可以解决的任务也日益复杂。{Goodf', 'time': '2017-01-15T08:05'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这种', 'origin_text': '于建模序列和其他序列之间的关系，而不是仅仅固定输入之间的关系。  !!!这个!!!  序列到序列的学习似乎处于另一个应用演进的浪潮之巅：机器翻译{ci', 'time': '2017-01-15T08:07'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对序列与其他序列之间的关系进行建模', 'origin_text': 'te?}。循环神经网络，如之前提到的LSTM序列模型，现在用于  !!!建模序列和其他序列之间的关系!!!  ，而不是仅仅固定输入之间的关系。这个序列到序列的学习似乎处于另', 'time': '2017-01-15T08:08'}\n{'user': 'acct:corenel@hypothes.is', 'text': '最高成就 / 最大的成就', 'origin_text': '阶段，但原则上未来可以适用于几乎所有的任务。深度学习的另一个  !!!冠军成就!!!  是在强化学习领域的扩展。在强化学习的背景下，一个自主体必须通过', 'time': '2017-01-15T08:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '是其在在强化学习领域的扩展', 'origin_text': '原则上未来可以适用于几乎所有的任务。深度学习的另一个冠军成就  !!!是在强化学习领域的扩展!!!  。在强化学习的背景下，一个自主体必须通过试错来学习执行任务，而', 'time': '2017-01-15T08:10'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在强化学习中', 'origin_text': '有的任务。深度学习的另一个冠军成就是在强化学习领域的扩展。  !!!在强化学习的背景下!!!  ，一个自主体必须通过试错来学习执行任务，而无需人类操作者的任何指', 'time': '2017-01-15T08:10'}\n{'user': 'acct:corenel@hypothes.is', 'text': '自主的智能体', 'origin_text': '另一个冠军成就是在强化学习领域的扩展。在强化学习的背景下，一个  !!!自主体!!!  必须通过试错来学习执行任务，而无需人类操作者的任何指导。Dee', 'time': '2017-01-15T08:10'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '其做法野心勃勃但不切实际', 'origin_text': '代中期。基于神经网络等其他AI技术的企业开始在寻求投资的同时，  !!!做不切实际野心勃勃的主张!!!  。当AI研究不能实现这些不合理的期望时，投资者感到失望。同时', 'time': '2017-01-15T08:11'}\n{'user': 'acct:corenel@hypothes.is', 'text': '必须在没有人类操作者指导的情况下，通过试错来学习执行任务', 'origin_text': '冠军成就是在强化学习领域的扩展。在强化学习的背景下，一个自主体  !!!必须通过试错来学习执行任务，而无需人类操作者的任何指导!!!  。DeepMind表明，基于深度学习的强化学习系统能够学会玩A', 'time': '2017-01-15T08:12'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '比如，核', 'origin_text': '理的期望时，投资者感到失望。同时，机器学习的其他领域取得进步。  !!!核!!!  学习机{cite?}和图模型{cite?}都在很多重要任务上实现', 'time': '2017-01-15T08:12'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '方法', 'origin_text': '期望时，投资者感到失望。同时，机器学习的其他领域取得进步。核  !!!学习机!!!  {cite?}和图模型{cite?}都在很多重要任务上实现了很好', 'time': '2017-01-15T08:13'}\n{'user': 'acct:corenel@hypothes.is', 'text': '用于对象识别的现在卷积网络为神经科学家们提供了可以研究的视觉处理模型。', 'origin_text': '重要的研究项目或商业产品。深度学习也为其他科学做出了贡献。  !!!识别对象的现代卷积网络提供给神经科学家可以研究的视觉处理模型!!!  {cite?}。深度学习也为处理海量数据、在科学领域作出有效的', 'time': '2017-01-15T08:13'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '继续', 'origin_text': '络热潮的第二次下降，一直持续到2007年。在此期间，神经网络  !!!持续!!!  在某些任务上获得令人印象深刻的表现{cite?}。加拿大高级研', 'time': '2017-01-15T08:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '我们期待深度学习未来能够出现在越来越多的科学领域内', 'origin_text': 'e?}和自动解析用于构建人脑三维图的显微镜图像{cite?}。  !!!我们期待深度学习未来出现在越来越多的科学领域!!!  。总之，深度学习是机器学习的一种方法， 过去几十年的发展', 'time': '2017-01-19T08:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。', 'origin_text': '在越来越多的科学领域。总之，深度学习是机器学习的一种方法  !!!，!!!   过去几十年的发展中，它深深地吸收了我们关于人脑、统计学与应用数', 'time': '2017-01-15T08:17'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在过去几十年的发展中', 'origin_text': '来越多的科学领域。总之，深度学习是机器学习的一种方法，   !!!过去几十年的发展中!!!  ，它深深地吸收了我们关于人脑、统计学与应用数学的知识。近年来，', 'time': '2017-01-15T08:17'}\n{'user': 'acct:corenel@hypothes.is', 'text': '大量借鉴了', 'origin_text': '总之，深度学习是机器学习的一种方法， 过去几十年的发展中，它  !!!深深地吸收了!!!  我们关于人脑、统计学与应用数学的知识。近年来，深度学习的普及性', 'time': '2017-01-15T08:17'}\n{'user': 'acct:corenel@hypothes.is', 'text': '近年来，得益于更强大的计算机、更大的数据集和能够训练更深网络的技术，深度学习的普及性和实用性有了极大的发展。', 'origin_text': '的发展中，它深深地吸收了我们关于人脑、统计学与应用数学的知识。  !!!近年来，深度学习的普及性和实用性有了极大的发展，这在很大程度上得益于更强大的计算机、更大的数据集和能够训练更深网络的技术。!!!  未来几年充满了进一步提高深度学习并将它带到新领域的挑战和机遇。', 'time': '2017-01-15T08:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '领导', 'origin_text': ' Hinton，Yoshua Bengio和Yann LeCun  !!!引导!!!  的多伦多大学、蒙特利尔大学和纽约大学的机器学习研究小组。CIF', 'time': '2017-01-15T08:18'}\n{'user': 'acct:corenel@hypothes.is', 'text': '得', 'origin_text': '单独神经元或小集合的神经元不是特别有用。生物神经元没有连接  !!!的!!!  特别密集。如\\\\fig?所示，几十年来，我们的机器学习模型中每个', 'time': '2017-01-15T08:20'}\n{'user': 'acct:corenel@hypothes.is', 'text': '更大', 'origin_text': '这种增长是由更大内存、更快的计算机和更大的可用数据集驱动的。  !!!较大!!!  的网络能够在更复杂的任务中实现更高的精度。这种趋势看起来将持续', 'time': '2017-01-15T08:22'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '这个多学科的CIFAR NCAP研究计划还攘括了神经科学家、人类和计算机视觉专家', 'origin_text': 'n引导的多伦多大学、蒙特利尔大学和纽约大学的机器学习研究小组。  !!!CIFAR NCAP研究计划具有多学科的性质，其中还包括人类神经科学家和计算机视觉专家!!!  。在那个时间点，普遍认为深度网络是难以训练的。现在我们', 'time': '2017-01-15T08:25'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改', 'origin_text': '神经计算和自适应感知（NCAP）研究计划帮助维持神经网络研究。  !!!这个!!!  计划统一了分别由Geoffrey Hinton，Yoshua B', 'time': '2017-01-15T08:24'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '联合', 'origin_text': '和自适应感知（NCAP）研究计划帮助维持神经网络研究。这个计划  !!!统一!!!  了分别由Geoffrey Hinton，Yoshua Bengi', 'time': '2017-01-15T08:24'}\n{'user': 'acct:corenel@hypothes.is', 'text': '既然', 'origin_text': '利用大型标注数据集的能力。与日俱增的数据量人们可能想问，  !!!尽管!!!  人工神经网络的第一个实验在20世纪50年代就完成了，为什么深度学', 'time': '2017-01-15T08:26'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在复杂的任务达到人类水平', 'origin_text': '技巧。幸运的是，随着训练数据的增加，所需的技巧正在减少。目前  !!!在复杂的任务达到与人类表现!!!  的学习算法，与20世纪80年代努力解决的玩具问题(toy pro', 'time': '2017-01-15T08:27'}\n{'user': 'acct:corenel@hypothes.is', 'text': '得以成功训练', 'origin_text': '革，简化了极深架构的训练。最重要的新进展是现在我们有了这些算法  !!!成功训练!!!  所需的资源。\\\\fig?展示了基准数据集的大小如何随着时间的推移', 'time': '2017-01-15T08:28'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对长序列进行建模', 'origin_text': 'ochreiter91}和{Bengio1994ITNN}指出了  !!!建模长序列!!!  的一些根本数学难题，这将在\\\\sec?中描述。{Hochreit', 'time': '2017-01-15T08:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '人们普遍认为', 'origin_text': '其中还包括人类神经科学家和计算机视觉专家。在那个时间点，  !!!普遍认为!!!  深度网络是难以训练的。现在我们知道，20世纪80年代就存在的算', 'time': '2017-01-15T08:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': ' 在写这本书的时候，神经网络的第三次流行浪潮还在继续', 'origin_text': '经优于与之竞争的基于其他机器学习技术以及手工设计函数的AI系统。  !!!神经网络流行的第三次浪潮在写这本书的时候还在继续!!!  ，尽管深度学习的研究重点在这一段时间内发生了巨大变化。第三次浪', 'time': '2017-01-15T08:33'}\n{'user': 'acct:corenel@hypothes.is', 'text': '着眼于', 'origin_text': '深度学习的研究重点在这一段时间内发生了巨大变化。第三次浪潮开始  !!!把重点放在!!!  新的无监督学习技术和从小数据集进行泛化的能力，但目前更多的注意点', 'time': '2017-01-15T08:34'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '这可能仅仅由于其计算代价太高，', 'origin_text': '的算法能工作得非常好，但是直到在2006年前后都没有体现出来。  !!!这个问题可能是单纯的因为计算复杂性太高!!!  ，而以当时可用的硬件难以进行足够的实验。神经网络研究的第三次', 'time': '2017-01-15T08:35'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '预训练', 'origin_text': 'inton表明名为深度信念网络的神经网络可以使用一种称为贪心逐层  !!!训练!!!  的策略进行有效地训练{cite?}，我们将在\\\\sec?中更详细地', 'time': '2017-01-15T08:41'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '来', 'origin_text': '表明名为深度信念网络的神经网络可以使用一种称为贪心逐层训练的策略  !!!进行!!!  有效地训练{cite?}，我们将在\\\\sec?中更详细地描述。C', 'time': '2017-01-15T08:43'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '其他CIFAR附属研究小组', 'origin_text': '进行有效地训练{cite?}，我们将在\\\\sec?中更详细地描述。  !!!CIFAR附属的其他研究小组!!!  很快表明，同样的策略可以被用来训练许多其他类型的深度网络{cit', 'time': '2017-01-15T08:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '研究者', 'origin_text': '神经网络研究的这一次浪潮普及了”深度学习”这一术语的使用，强调  !!!研究人员!!!  现在可以训练以前不可能训练的更深的神经网络，并把注意力集中于深度', 'time': '2017-01-15T08:49'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '有能力', 'origin_text': '究的这一次浪潮普及了”深度学习”这一术语的使用，强调研究人员现在  !!!可以!!!  训练以前不可能训练的更深的神经网络，并把注意力集中于深度的理论意', 'time': '2017-01-15T08:50'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '比较深', 'origin_text': '度学习”这一术语的使用，强调研究人员现在可以训练以前不可能训练的  !!!更深!!!  的神经网络，并把注意力集中于深度的理论意义{cite?}。此时', 'time': '2017-01-15T08:52'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '重要性上', 'origin_text': '以训练以前不可能训练的更深的神经网络，并把注意力集中于深度的理论  !!!意义!!!  {cite?}。此时，深度神经网络已经优于与之竞争的基于其他机', 'time': '2017-01-15T08:54'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '集中注意力', 'origin_text': '使用，强调研究人员现在可以训练以前不可能训练的更深的神经网络，并  !!!把注意力集中!!!  于深度的理论意义{cite?}。此时，深度神经网络已经优于与之', 'time': '2017-01-15T08:54'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '功能', 'origin_text': '，深度神经网络已经优于与之竞争的基于其他机器学习技术以及手工设计  !!!函数!!!  的AI系统。神经网络流行的第三次浪潮在写这本书的时候还在继续，', 'time': '2017-01-15T08:55'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“流行”', 'origin_text': '竞争的基于其他机器学习技术以及手工设计函数的AI系统。神经网络  !!!流行!!!  的第三次浪潮在写这本书的时候还在继续，尽管深度学习的研究重点在这', 'time': '2017-01-15T08:58'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '发展浪潮', 'origin_text': '他机器学习技术以及手工设计函数的AI系统。神经网络流行的第三次  !!!浪潮!!!  在写这本书的时候还在继续，尽管深度学习的研究重点在这一段时间内发', 'time': '2017-01-15T08:59'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '能力上', 'origin_text': '第三次浪潮开始把重点放在新的无监督学习技术和从小数据集进行泛化的  !!!能力!!!  ，但目前更多的注意点是在更古老的监督学习算法和深度模型充分利用大', 'time': '2017-01-15T09:01'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '兴趣', 'origin_text': '点放在新的无监督学习技术和从小数据集进行泛化的能力，但目前更多的  !!!注意!!!  点是在更古老的监督学习算法和深度模型充分利用大型标注数据集的能力', 'time': '2017-01-15T09:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '比较传统', 'origin_text': '无监督学习技术和从小数据集进行泛化的能力，但目前更多的注意点是在  !!!更古老!!!  的监督学习算法和深度模型充分利用大型标注数据集的能力。与日俱', 'time': '2017-01-15T09:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '能力上', 'origin_text': '注意点是在更古老的监督学习算法和深度模型充分利用大型标注数据集的  !!!能力!!!  。与日俱增的数据量人们可能想问，尽管人工神经网络的第一个', 'time': '2017-01-15T09:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '仍是', 'origin_text': '新的无监督学习技术和从小数据集进行泛化的能力，但目前更多的注意点  !!!是!!!  在更古老的监督学习算法和深度模型充分利用大型标注数据集的能力。', 'time': '2017-01-15T09:37'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“”尽管', 'origin_text': '利用大型标注数据集的能力。与日俱增的数据量人们可能想问，  !!!尽管!!!  人工神经网络的第一个实验在20世纪50年代就完成了，为什么深度学', 'time': '2017-01-15T10:39'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但为什么', 'origin_text': '能想问，尽管人工神经网络的第一个实验在20世纪50年代就完成了，  !!!为什么!!!  深度学习直到最近才被认为是关键技术。自20世纪90年代以来，深', 'time': '2017-01-15T10:39'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但直到现在，相比如为一种技术，它通常更视为一种艺术', 'origin_text': '技术。自20世纪90年代以来，深度学习就已经成功用于商业应用，  !!!但通常被视为是一种艺术而不是一种技术!!!  ，且只有专家可以使用的艺术，这种观点持续到最近。确实，要从一个', 'time': '2017-01-15T10:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉', 'origin_text': '，但通常被视为是一种艺术而不是一种技术，且只有专家可以使用的艺术  !!!，这种观点持续到最近!!!  。确实，要从一个深度学习算法获得良好的性能需要一些技巧。幸运', 'time': '2017-01-15T10:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '努力去解决玩具问题', 'origin_text': '。目前在复杂的任务达到与人类表现的学习算法，与20世纪80年代  !!!努力解决的玩具问题!!!  (toy problem)的学习算法几乎是一样的，尽管这些算法训', 'time': '2017-01-15T10:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '我们使用这些算法训练', 'origin_text': '的玩具问题(toy problem)的学习算法几乎是一样的，尽管  !!!这些算法训练!!!  的模型经历了变革，简化了极深架构的训练。最重要的新进展是现在我', 'time': '2017-01-15T10:56'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '即简化', 'origin_text': 'em)的学习算法几乎是一样的，尽管这些算法训练的模型经历了变革，  !!!简化!!!  了极深架构的训练。最重要的新进展是现在我们有了这些算法成功训练', 'time': '2017-01-15T10:56'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '获得成功', 'origin_text': '革，简化了极深架构的训练。最重要的新进展是现在我们有了这些算法  !!!成功训练!!!  所需的资源。\\\\fig?展示了基准数据集的大小如何随着时间的推移', 'time': '2017-01-15T11:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '而显著', 'origin_text': '所需的资源。\\\\fig?展示了基准数据集的大小如何随着时间的推移  !!!显著!!!  增加。这种趋势是由社会日益数字化驱动的。由于我们的活动越来越', 'time': '2017-01-15T11:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '所以也就比较容易地集中并整理这些记录成适合于机器学习应用的数据集', 'origin_text': '们做什么也越来越多地被记录。我们的计算机越来越多地联网在一起，  !!!变得更容易集中管理这些记录!!!  ，并将它们整理成适于机器学习应用的数据集。因为统计估计的主要负', 'time': '2017-01-15T11:09'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“的”', 'origin_text': '计的主要负担（观察少量数据以在新数据上泛化）已经减轻，”大数据”  !!!的!!!  时代使机器学习更加容易。截至2016年，一个粗略的经验法则是，', 'time': '2017-01-15T11:15'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉“一般”', 'origin_text': '加容易。截至2016年，一个粗略的经验法则是，监督深度学习算法  !!!一般!!!  在每类给定约5000标注样本情况下可以实现可接受的性能，当至少有', 'time': '2017-01-15T11:19'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '5000个', 'origin_text': '016年，一个粗略的经验法则是，监督深度学习算法一般在每类给定约  !!!5000!!!  标注样本情况下可以实现可接受的性能，当至少有1000万标注样本的', 'time': '2017-01-15T11:20'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '一般将达到可以接受的性能', 'origin_text': '验法则是，监督深度学习算法一般在每类给定约5000标注样本情况下  !!!可以实现可接受的性能!!!  ，当至少有1000万标注样本的数据集用于训练时将达到或超过人类表', 'time': '2017-01-15T11:21'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '1000万个', 'origin_text': '在每类给定约5000标注样本情况下可以实现可接受的性能，当至少有  !!!1000万!!!  标注样本的数据集用于训练时将达到或超过人类表现。在更小的数据集', 'time': '2017-01-15T11:22'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它将', 'origin_text': '以实现可接受的性能，当至少有1000万标注样本的数据集用于训练时  !!!将!!!  达到或超过人类表现。在更小的数据集上成功是一个重要的研究领域，', 'time': '2017-01-15T11:23'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '获得成功', 'origin_text': '注样本的数据集用于训练时将达到或超过人类表现。在更小的数据集上  !!!成功!!!  是一个重要的研究领域，为此我们应特别侧重于如何通过无监督或半监督', 'time': '2017-01-15T11:24'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '自20世纪80年代以来，在享有相对小的成功之后，', 'origin_text': '样。}\\\\end{figure}与日俱增的模型规模  !!!相对20世纪80年代较少的成功!!!  ，现在神经网络非常成功的另一个重要原因是我们现在拥有的计算资源可', 'time': '2017-01-15T11:47'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '连接主义', 'origin_text': '功的另一个重要原因是我们现在拥有的计算资源可以运行更大的模型。  !!!连接机制!!!  的主要见解之一是，当动物的许多神经元一起工作时会变得聪明。单独', 'time': '2017-01-15T11:49'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '生物神经元不是特别稠密地连接在一起。', 'origin_text': '工作时会变得聪明。单独神经元或小集合的神经元不是特别有用。  !!!生物神经元没有连接的特别密集!!!  。如\\\\fig?所示，几十年来，我们的机器学习模型中每个神经元的', 'time': '2017-01-15T11:54'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '已经', 'origin_text': 'fig?所示，几十年来，我们的机器学习模型中每个神经元的连接数量  !!!甚至!!!  与哺乳动物的大脑在同一数量级。\\\\begin{figure}[!', 'time': '2017-01-15T11:57'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '级上', 'origin_text': '机器学习模型中每个神经元的连接数量甚至与哺乳动物的大脑在同一数量  !!!级!!!  。\\\\begin{figure}[!htb]\\\\ifOpenSou', 'time': '2017-01-15T11:57'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '小', 'origin_text': '\\\\fig?所示，就神经元的总数目而言，直到最近神经网络都是惊人的  !!!少!!!  。自从引入隐藏单元以来，人工神经网络的规模大约每2.4年扩大一', 'time': '2017-01-15T12:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '隐藏单元引入', 'origin_text': '所示，就神经元的总数目而言，直到最近神经网络都是惊人的少。自从  !!!引入隐藏单元!!!  以来，人工神经网络的规模大约每2.4年扩大一倍。这种增长是由更', 'time': '2017-01-15T12:02'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '能力', 'origin_text': '杂的任务中实现更高的精度。这种趋势看起来将持续数十年。除非有  !!!允许!!!  迅速扩展的新技术，否则至少直到21世纪50年代，人工神经网络将才', 'time': '2017-01-15T12:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '要', 'origin_text': '种趋势看起来将持续数十年。除非有允许迅速扩展的新技术，否则至少  !!!直!!!  到21世纪50年代，人工神经网络将才能具备与人脑相同数量级的神经', 'time': '2017-01-15T12:08'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '生物神经元比现在的人工神经元可能表示更复杂的功能', 'origin_text': '世纪50年代，人工神经网络将才能具备与人脑相同数量级的神经元。  !!!生物神经元表示的函数可能比目前的人工神经元更复杂!!!  ，因此生物神经网络可能比图中描绘的更大。\\\\begin{figu', 'time': '2017-01-15T12:13'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '甚至要更大', 'origin_text': '数可能比目前的人工神经元更复杂，因此生物神经网络可能比图中描绘的  !!!更大!!!  。\\\\begin{figure}[!htb]\\\\ifOpenSou', 'time': '2017-01-15T12:14'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '现在看来', 'origin_text': '\\\\end{enumerate}}\\\\end{figure}  !!!现在回想起来!!!  ，比一个水蛭的神经元还少的神经网络不能解决复杂的人工智能问题是不', 'time': '2017-01-15T12:17'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '其神经元比', 'origin_text': 'umerate}}\\\\end{figure}现在回想起来，  !!!比!!!  一个水蛭的神经元还少的神经网络不能解决复杂的人工智能问题是不足为', 'time': '2017-01-15T12:19'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '但它比相对原始的脊椎动物如青蛙的神经系统都要小', 'origin_text': '不足为奇的。即使现在从一个计算系统角度来看可能相当大的网络，   !!!实际上比相对原始的脊椎动物如青蛙的神经系统更小!!!  。由于更快的CPU、通用GPU的到来（在\\\\sec?中讨论）、', 'time': '2017-01-15T12:30'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '即使现在的网络，从计算系统角度来看它可能相当大的，', 'origin_text': '的神经元还少的神经网络不能解决复杂的人工智能问题是不足为奇的。  !!!即使现在从一个计算系统角度来看可能相当大的网络!!!  ， 实际上比相对原始的脊椎动物如青蛙的神经系统更小。由于更快', 'time': '2017-01-15T12:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '出现', 'origin_text': '脊椎动物如青蛙的神经系统更小。由于更快的CPU、通用GPU的  !!!到来!!!  （在\\\\sec?中讨论）、更快的网络连接和更好的分布式计算的软件基', 'time': '2017-01-15T12:33'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉”的“', 'origin_text': '?中讨论）、更快的网络连接和更好的分布式计算的软件基础设施，模型  !!!的!!!  规模随着时间的推移不断增加是深度学习历史中最重要的趋势之一。普', 'time': '2017-01-15T12:34'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '而且', 'origin_text': '世纪80年代以来，深度学习提供精确识别和预测的能力一直在提高。  !!!此外!!!  ，深度学习持续成功地应用于越来越广泛的应用。最早的深度模型被', 'time': '2017-01-15T12:39'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '被应用', 'origin_text': '习提供精确识别和预测的能力一直在提高。此外，深度学习持续成功地  !!!应用!!!  于越来越广泛的应用。最早的深度模型被用来识别裁剪得很合适且非', 'time': '2017-01-15T12:43'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '实际问题中', 'origin_text': '测的能力一直在提高。此外，深度学习持续成功地应用于越来越广泛的  !!!应用!!!  。最早的深度模型被用来识别裁剪得很合适且非常小的图像中的单个', 'time': '2017-01-15T12:44'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '裁剪紧凑且非常小的图像中的个体目标-', 'origin_text': '习持续成功地应用于越来越广泛的应用。最早的深度模型被用来识别  !!!裁剪得很合适且非常小的图像中的单个对象!!!  {cite?}。自那时以来，神经网络可以处理的图像尺寸逐渐增加', 'time': '2017-01-15T12:52'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '自此', 'origin_text': '用来识别裁剪得很合适且非常小的图像中的单个对象{cite?}。  !!!自那时以来!!!  ，神经网络可以处理的图像尺寸逐渐增加。现代对象识别网络能处理丰', 'time': '2017-01-15T12:55'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '目标', 'origin_text': 'e?}。自那时以来，神经网络可以处理的图像尺寸逐渐增加。现代  !!!对象!!!  识别网络能处理丰富的高分辨率照片，并且不要求在被识别的对象附近进', 'time': '2017-01-15T12:57'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '目标', 'origin_text': '现代对象识别网络能处理丰富的高分辨率照片，并且不要求在被识别的  !!!对象!!!  附近进行裁剪{cite?}。类似地，最早网络只能识别两种对象（', 'time': '2017-01-15T12:58'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '裁剪照片', 'origin_text': '象识别网络能处理丰富的高分辨率照片，并且不要求在被识别的对象附近  !!!进行裁剪!!!  {cite?}。类似地，最早网络只能识别两种对象（或在某些情况', 'time': '2017-01-15T13:00'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '目标', 'origin_text': '}。类似地，最早网络只能识别两种对象（或在某些情况下，单一种类  !!!的对象!!!  的存在与否），而这些现代网络通常识别至少1000个不同类别的对象', 'time': '2017-01-15T13:03'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '单类目标', 'origin_text': 'ite?}。类似地，最早网络只能识别两种对象（或在某些情况下，  !!!单一种类的对象!!!  的存在与否），而这些现代网络通常识别至少1000个不同类别的对象', 'time': '2017-01-15T13:04'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '目标', 'origin_text': '对象的存在与否），而这些现代网络通常识别至少1000个不同类别的  !!!对象!!!  。对象识别中最大的比赛是每年举行的ImageNet大型视觉识别', 'time': '2017-01-15T13:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '目标', 'origin_text': '在与否），而这些现代网络通常识别至少1000个不同类别的对象。  !!!对象!!!  识别中最大的比赛是每年举行的ImageNet大型视觉识别挑战（I', 'time': '2017-01-15T13:06'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '戏剧性一幕', 'origin_text': 'geNet大型视觉识别挑战（ILSVRC）。深度学习迅速崛起的  !!!一个戏剧性时刻!!!  是卷积网络第一次大幅赢得这一挑战，将最高水准的前5错误率从26.', 'time': '2017-01-15T13:11'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '排序表', 'origin_text': '{cite?}，这意味着该卷积网络针对每个图像的可能类别生成一个  !!!顺序列表!!!  ，但15.3\\\\%的测试样例的正确类别不会出现在此列表中的前5。', 'time': '2017-01-15T13:21'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '除了15.3%的测试样本，其它测试样本的正确类别都出现在此列表中的前5项里。', 'origin_text': '?}，这意味着该卷积网络针对每个图像的可能类别生成一个顺序列表，  !!!但15.3\\\\%的测试样例的正确类别不会出现在此列表中的前5!!!  。此后，深度卷积网络一直能在这些比赛中取胜，截至写书时，深度学', 'time': '2017-01-15T13:28'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '连续地赢得这些比赛。', 'origin_text': '样例的正确类别不会出现在此列表中的前5。此后，深度卷积网络一直  !!!能在这些比赛中取胜，!!!  截至写书时，深度学习的进步将这个比赛中的前5错误率降到3.6\\\\%', 'time': '2017-01-15T13:31'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '写该书', 'origin_text': '此列表中的前5。此后，深度卷积网络一直能在这些比赛中取胜，截至  !!!写书!!!  时，深度学习的进步将这个比赛中的前5错误率降到3.6\\\\%， 如\\\\', 'time': '2017-01-15T13:32'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '最新结果', 'origin_text': '此后，深度卷积网络一直能在这些比赛中取胜，截至写书时，深度学习的  !!!进步!!!  将这个比赛中的前5错误率降到3.6\\\\%， 如\\\\fig?所示。\\\\', 'time': '2017-01-15T13:34'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '神经网络可以从一幅图像中学习输出描述它的整个字符序列', 'origin_text': '{Goodfellow+et+al-ICLR2014a}表明，  !!!神经网络可以学习输出描述图像的整个字符序列!!!  ，而不是仅仅识别单个对象。此前，人们普遍认为，这种学习需要对序', 'time': '2017-01-15T13:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '目标', 'origin_text': '，神经网络可以学习输出描述图像的整个字符序列，而不是仅仅识别单个  !!!对象!!!  。此前，人们普遍认为，这种学习需要对序列中的单个元素进行标注{', 'time': '2017-01-15T13:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '被用于', 'origin_text': 'cite?}。循环神经网络，如之前提到的LSTM序列模型，现在  !!!用于!!!  建模序列和其他序列之间的关系，而不是仅仅固定输入之间的关系。这', 'time': '2017-01-16T02:51'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '冠军级', 'origin_text': '阶段，但原则上未来可以适用于几乎所有的任务。深度学习的另一个  !!!冠军!!!  成就是在强化学习领域的扩展。在强化学习的背景下，一个自主体必须', 'time': '2017-01-16T02:53'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '删掉”这个“', 'origin_text': '用于建模序列和其他序列之间的关系，而不是仅仅固定输入之间的关系。  !!!这个!!!  序列到序列的学习似乎处于另一个应用演进的浪潮之巅：机器翻译{ci', 'time': '2017-01-16T07:24'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '使得另外一个应用--机器翻译--正处于革命性变化转型', 'origin_text': '的关系，而不是仅仅固定输入之间的关系。这个序列到序列的学习似乎  !!!处于另一个应用演进的浪潮之巅!!!  ：机器翻译{cite?}。日益复杂的趋势已将其推向逻辑结', 'time': '2017-01-16T07:26'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '增加复杂性', 'origin_text': '乎处于另一个应用演进的浪潮之巅：机器翻译{cite?}。  !!!日益复杂!!!  的趋势已将其推向逻辑结论，即神经图灵机{cite?}的引入，它能', 'time': '2017-01-16T07:27'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '等。', 'origin_text': 'u、Apple、Adobe、Netflix、NVIDIA和NEC  !!!。!!!  深度学习的进步也严重依赖于软件基础架构的进展。软件库如Th', 'time': '2017-01-16T08:13'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '发展', 'origin_text': 'Adobe、Netflix、NVIDIA和NEC。深度学习的  !!!进步!!!  也严重依赖于软件基础架构的进展。软件库如Theano{cite', 'time': '2017-01-16T08:14'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '用于目标识别', 'origin_text': '重要的研究项目或商业产品。深度学习也为其他科学做出了贡献。  !!!识别对象!!!  的现代卷积网络提供给神经科学家可以研究的视觉处理模型{cite?', 'time': '2017-01-16T08:16'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '以及', 'origin_text': '可以研究的视觉处理模型{cite?}。深度学习也为处理海量数据  !!!、!!!  在科学领域作出有效的预测提供了非常有用的工具。它已成功地用于预', 'time': '2017-01-16T08:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '深刻地', 'origin_text': '总之，深度学习是机器学习的一种方法， 过去几十年的发展中，它  !!!深深地!!!  吸收了我们关于人脑、统计学与应用数学的知识。近年来，深度学习的', 'time': '2017-01-16T08:19'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '汲取', 'origin_text': '之，深度学习是机器学习的一种方法， 过去几十年的发展中，它深深地  !!!吸收!!!  了我们关于人脑、统计学与应用数学的知识。近年来，深度学习的普及', 'time': '2017-01-16T08:20'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '和', 'origin_text': '种方法， 过去几十年的发展中，它深深地吸收了我们关于人脑、统计学  !!!与!!!  应用数学的知识。近年来，深度学习的普及性和实用性有了极大的发展', 'time': '2017-01-16T08:22'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '深度学习在它的普及性和实用性方面都有了极大的发展', 'origin_text': '，它深深地吸收了我们关于人脑、统计学与应用数学的知识。近年来，  !!!深度学习的普及性和实用性有了极大的发展!!!  ，这在很大程度上得益于更强大的计算机、更大的数据集和能够训练更深', 'time': '2017-01-16T08:24'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '进一步提高深度学习并将它带到新的领域，未来几年充满了挑战和机遇', 'origin_text': '度上得益于更强大的计算机、更大的数据集和能够训练更深网络的技术。  !!!未来几年充满了进一步提高深度学习并将它带到新领域的挑战和机遇!!!  。                       ', 'time': '2017-01-16T08:30'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '它已成功地用于预测分子如何相互作用从而帮助制药公司设计新的药物{cite?}，搜索亚原子粒子{cite?}，以及自动解析用于构建人脑三维图的显微镜图像{cite?}等。 ', 'origin_text': '为处理海量数据、在科学领域作出有效的预测提供了非常有用的工具。  !!!它已成功地用于预测分子如何相互作用，这能帮助制药公司设计新的药物{cite?}、搜索的亚原子粒子{cite?}和自动解析用于构建人脑三维图的显微镜图像{cite?}。!!!  我们期待深度学习未来出现在越来越多的科学领域。总之，深', 'time': '2017-01-16T08:33'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '20世纪40年代到60年代深度学习的萌芽出现在控制论中，80年代到90年代的深度学习表现为联结主义，直到2006年，才真正以深度学习之名复兴。', 'origin_text': '习是有用的。一般来说，目前为止深度学习已经经历了三次发展浪潮：  !!!20世纪40年代到60年代深度学习的雏形出现在控制论中，20世纪80年代到90年代深度学习以联结主义为代表，并于2006年开始，以深度学习之名复兴。!!!  \\\\fig?给出了定量的展示。\\\\begin{figure}[', 'time': '2017-01-17T02:58'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '深度学习的神经观点受两个主要思想启发： 一是以大脑为例，证明了', 'origin_text': '能{cite?}，但它们一般都没有被设计成生物功能的真实模型。  !!!深度学习的神经观点受两个主要思想启发。一个想法是大脑作为例子证明!!!  智能行为是可能的，因此，概念上，建立智能的直接途径是逆向大脑背后', 'time': '2017-01-17T02:58'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '二是', 'origin_text': '念上，建立智能的直接途径是逆向大脑背后的计算原理，并复制其功能。  !!!另一种看法是!!!  ，理解大脑和人类智能背后的原理也非常有趣，因此机器学习模型除了解', 'time': '2017-01-17T03:04'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '这些简单的学习算法对机器学习的现状有极大的贡献。比如， 用于调节ADALINE权重的训练算法其实是随机梯度下降算法的一种特例，而稍做改进后的随机梯度下降算法仍然是当前深度学习的主要训练算法。', 'origin_text': '测一个实数{cite?}，并且它还可以学习从数据预测这些数。  !!!这些简单的学习算法大大影响了机器学习的现代景象。用于调节ADALINE权重的训练算法是被称为随机梯度下降的一种特例。稍加修改的随机梯度下降算法仍然是当今深度学习的主要训练算法。!!!  基于感知机和ADALINE中使用的函数f(x,w)f(x,w', 'time': '2017-01-17T03:14'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '修正线性单元(rectified linear unit，ReLu)\\n\\n个人觉得译为“整流”太电子化了，作为机器学习领域还是译为“修正”较妥，也比较符合该函数的特点。不过，更建议直接使用“ReLu”而不做翻译', 'origin_text': '（我们将会在\\\\sec?看到）。目前大多数神经网络是基于一个称为  !!!整流线性单元!!!  的神经单元模型。原始认知机{cite?}受我们关于大脑功能知识', 'time': '2017-01-17T09:35'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '生物神经元运算的函数与修正线性单元（ReLu）有着极大的差异', 'origin_text': '神经科学是灵感的重要来源，但它不需要被视为刚性指导。我们知道，  !!!实际的神经元与现代整流线性单元计算着非常不同函数!!!  ，但更接近真实神经网络的系统并没有导致机器学习性能的提升。此外', 'time': '2017-01-17T03:28'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '联结主义', 'origin_text': '流行，但符号模型很难解释大脑如何真正使用神经元实现推理功能。   !!!连接主义!!!  者开始研究实际能基于神经实现的认知模型{cite?}，其中很多复', 'time': '2017-01-17T03:31'}\n{'user': 'acct:NeutronT@hypothes.is', 'text': '其思想是：系统的每一个的输入都应该由多个特征表示，并且每一个特征都应该参与到多个输入的表示。', 'origin_text': '中仍然是非常重要的。其中一个概念是分布式表示{cite?}。  !!!这一想法认为系统每个的输入应该由许多特征表示的，并且每个特征应参与多个可能输入的表示。!!!  例如，假设我们有一个能够识别红色、绿色、或蓝色的汽车、卡车和鸟', 'time': '2017-01-17T03:41'}\n\n\n=============================   Replies   =============================\n\n\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '感觉还是翻译的不太好。', 'time': '2017-01-12T12:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '感觉还是翻译的不太好。', 'time': '2017-01-12T12:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '稍微改了一下。', 'time': '2017-01-12T12:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们期望当输入数据经过编码器和解码器之后尽可能多地保留信息，同时希望新的表示有各种好的属性， 这也是自动编码器的训练目标。\\n我这么翻了。', 'time': '2017-01-12T12:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我翻成 朴素且形式化 了', 'time': '2017-01-12T12:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这样翻如何？', 'time': '2017-01-12T12:40'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:40'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:40'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:40'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'fix', 'time': '2017-01-12T12:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '“自”有self的含义，比如self-adapting翻成自适应。为了将其与automatic(auto)区别，我们统一翻成了 “自动编码器” 。', 'time': '2017-01-12T11:18'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '一个AI系统观察其中一只眼睛在阴影中的脸部图像时，它最初可能只看到一只眼睛。', 'time': '2017-01-11T13:45'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '改得很好', 'time': '2017-01-11T12:55'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '商量之后觉得整流更好，首先是Relu确实是整流的意思，看它的图就是把小于0的滤掉，另外修正在中国也不好听。而且出于尊重原作的原因，我们不能以ReLU代替。多谢！', 'time': '2017-01-24T07:24'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '已改，但我觉得科学领域中好一点。', 'time': '2017-01-24T07:22'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这个改起来比较方便，但是有人建议整流有人建议修正。我也不清楚该怎么翻，我们还要讨论一下。多谢！', 'time': '2017-01-17T05:04'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '非常感谢您细心的校对，我综合考虑了大家的建议，稍后更新。还有某些翻译尚存在问题，考虑之后再进行更改。', 'time': '2017-01-16T13:33'}\n"
  },
  {
    "path": "Chapter1/introduction.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Shenjian Zhao\n\\chapter{引言}\n\\label{chap:introduction}\n远在古希腊时期，发明家就梦想着创造能自主思考的机器。\n神话人物皮格马利翁(Pygmalion)、代达罗斯(Daedalus)和赫淮斯托斯(Hephaestus)可以被看作传说中的发明家，而加拉蒂亚(Galatea)、塔洛斯(Talos)和潘多拉(Pandora)则可以被视为人造生命\\citep{ovid2004metamorphoses,sparkes1996red,1997works}。\n\n当人类第一次构思可编程计算机时，就已经在思考计算机能否变得智能（尽管这距造出第一台计算机还有一百多年）\\citep{Lovelace1842}。\n如今，\\firstall{AI}已经成为一个具有众多实际应用和活跃研究课题的领域，并且正在蓬勃发展。\n我们期望通过智能软件自动地处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究。\n\n在\\gls{AI}的早期，那些对人类智力来说非常困难、但对计算机来说相对简单的问题得到迅速解决，比如，那些可以通过一系列形式化的数学规则来描述的问题。\n\\gls{AI}的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务，如识别人们所说的话或图像中的脸。对于这些问题，我们人类往往可以凭借直觉轻易地解决。\n\n\n针对这些比较直观的问题，本书讨论一种解决方案。\n该方案可以让计算机从经验中学习，并根据层次化的概念体系来理解世界，而每个概念则通过与某些相对简单的概念之间的关系来定义。\n让计算机从经验获取知识，可以避免由人类来给计算机形式化地指定它需要的所有知识。\n层次化的概念让计算机构建较简单的概念来学习复杂概念。\n如果绘制出这些概念如何建立在彼此之上的图，我们将得到一张``深''（层次很多）的图。\n基于这个原因，我们称这种方法为~\\glssymbol{AI}\\firstgls{DL}。\n\n% -- 1 --\n\n\\glssymbol{AI}~许多早期的成功发生在相对朴素且形式化的环境中， 而且不要求计算机具备很多关于世界的知识。\n例如，IBM的深蓝（Deep Blue）国际象棋系统在1997年击败了世界冠军\\ENNAME{Garry Kasparov}\\citep{Hsu2002}。\n显然国际象棋是一个非常简单的领域，因为它仅含有64个位置并只能以严格限制的方式移动32个棋子。\n设计一种成功的国际象棋策略是巨大的成就，但向计算机描述棋子及其允许的走法并不是挑战的困难所在。\n国际象棋完全可以由一个非常简短的、完全形式化的规则列表来描述，并可以容易地由程序员事先准备好。\n\n讽刺的是，抽象和形式化的任务对人类而言是最困难的脑力任务之一，但对计算机而言却属于最容易的。\n计算机早就能够打败人类最好的象棋选手，但直到最近计算机才在识别对象或语音任务中达到人类平均水平。\n一个人的日常生活需要关于世界的巨量知识。\n很多这方面的知识是主观的、直观的，因此很难通过形式化的方式表达清楚。\n计算机需要获取同样的知识才能表现出智能。\n\\gls{AI}的一个关键挑战就是如何将这些非形式化的知识传达给计算机。\n\n一些\\gls{AI}项目力求将关于世界的知识用形式化的语言进行硬编码(hard-code)。\n计算机可以使用逻辑推理规则来自动地理解这些形式化语言中的声明。\n这就是众所周知的\\gls{AI}的\\firstgls{knowledge_base}方法。\n然而，这些项目最终都没有取得重大的成功。\n其中最著名的项目是Cyc \\citep{Lenat-1989-book}。\nCyc包括一个\\gls{inference}引擎和一个使用CycL语言描述的声明数据库。\n这些声明是由人类监督者输入的。\n这是一个笨拙的过程。\n人们设法设计出足够复杂的形式化规则来精确地描述世界。\n例如，Cyc不能理解一个关于名为~\\ENNAME{Fred}~的人在早上剃须的故事\\citep{MachineChangedWorld}。\n它的推理引擎检测到故事中的不一致性：它知道人体的构成不包含电气零件，但由于~\\ENNAME{Fred}~正拿着一个电动剃须刀，它认为实体\n``正在剃须的Fred''\\,(``FredWhileShaving'')含有电气部件。\n因此它产生了这样的疑问——\\ENNAME{Fred}~在刮胡子的时候是否仍然是一个人。\n\n依靠硬编码的知识体系面对的困难表明，\\glssymbol{AI}~系统需要具备自己获取知识的能力，即从原始数据中提取模式的能力。\n这种能力被称为\\firstgls{ML}。\n引入\\gls{ML}使计算机能够解决涉及现实世界知识的问题，并能作出看似主观的决策。\n比如，一个被称为\\firstgls{logistic_regression}的简单\\gls{ML}算法可以决定是否建议剖腹产\\citep{MorYosef90}。\n而同样是简单\\gls{ML}算法的\\firstgls{naive_bayes}则可以区分垃圾电子邮件和合法电子邮件。\n\n% -- 2 --\n\n这些简单的\\gls{ML}算法的性能在很大程度上依赖于给定数据的\\firstgls{representation}。\n例如，当\\gls{logistic_regression}被用于判断产妇是否适合剖腹产时，\\glssymbol{AI}~系统不会直接检查患者。\n相反，医生需要告诉系统几条相关的信息，诸如是否存在子宫疤痕。\n表示患者的每条信息被称为一个特征。\n\\gls{logistic_regression}学习病人的这些特征如何与各种结果相关联。\n然而，它丝毫不能影响该特征定义的方式。\n如果将病人的MRI扫描作为\\gls{logistic_regression}的输入，而不是医生正式的报告，它将无法作出有用的预测。\nMRI扫描的单一像素与分娩过程中并发症之间的相关性微乎其微。\n\n在整个计算机科学乃至日常生活中，对\\gls{representation}的依赖都是一个普遍现象。\n在计算机科学中，如果数据集合被精巧地结构化并被智能地索引，那么诸如搜索之类的操作的处理速度就可以成指数级地加快。\n人们可以很容易地在阿拉伯数字的\\gls{representation}下进行算术运算，但在罗马数字的\\gls{representation}下运算会比较耗时。\n因此，毫不奇怪，\\gls{representation}的选择会对\\gls{ML}算法的性能产生巨大的影响。\n\\figref{fig:chap1_polar}展示了一个简单的可视化例子。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/polar_color}}\n\\fi\n\\caption{不同表示的例子：假设我们想在散点图中画一条线来分隔两类数据。\n在左图，我们使用笛卡尔坐标表示数据，这个任务是不可能的。 \n右图中，我们用极坐标表示数据，可以用垂直线简单地解决这个任务。（与David Warde-Farley合作画出此图。）}\n\\label{fig:chap1_polar}\n\\end{figure}\n\n许多\\gls{AI}任务都可以通过以下方式解决：先提取一个合适的特征集，然后将这些特征提供给简单的\\gls{ML}算法。\n例如，对于通过声音鉴别说话者的任务来说，一个有用的特征是对其声道大小的估计。\n这个特征为判断说话者是男性、女性还是儿童提供了有力线索。\n\n然而，对于许多任务来说，我们很难知道应该提取哪些特征。\n例如，假设我们想编写一个程序来检测照片中的车。\n我们知道，汽车有轮子，所以我们可能会想用车轮的存在与否作为特征。\n不幸的是，我们难以准确地根据像素值来描述车轮看上去像什么。\n虽然车轮具有简单的几何形状，但它的图像可能会因场景而异，如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者遮挡的车轮一部分的前景物体等等。\n\n% -- 3 --\n\n解决这个问题的途径之一是使用\\gls{ML}来发掘\\gls{representation}本身，而不仅仅把\\gls{representation}映射到输出。\n这种方法我们称之为\\firstgls{representation_learning}。\n学习到的\\gls{representation}往往比手动设计的\\gls{representation}表现得更好。\n并且它们只需最少的人工干预，就能让\\glssymbol{AI}系统迅速适应新的任务。\n\\gls{representation_learning}算法只需几分钟就可以为简单的任务发现一个很好的特征集，对于复杂任务则需要几小时到几个月。\n手动为一个复杂的任务设计特征需要耗费大量的人工时间和精力；甚至需要花费整个社群研究人员几十年的时间。\n\n\\gls{representation_learning}算法的典型例子是\\firstgls{AE}。\n\\gls{AE}由一个\\firstgls{encoder}函数和一个\\firstgls{decoder}函数组合而成。\n\\gls{encoder}函数将输入数据转换为一种不同的\\gls{representation}，而\\gls{decoder}函数则将这个新的\\gls{representation}转换到原来的形式。\n我们期望当输入数据经过\\gls{encoder}和\\gls{decoder}之后尽可能多地保留信息，同时希望新的\\gls{representation}有各种好的特性，\n这也是\\gls{AE}的训练目标。\n为了实现不同的特性，我们可以设计不同形式的\\gls{AE}。\n\n当设计特征或设计用于学习特征的算法时，我们的目标通常是分离出能解释观察数据的\\firstgls{factors_of_variation}。\n在此背景下，``因素''这个词仅指代影响的不同来源；因素通常不是乘性组合。\n这些因素通常是不能被直接观察到的量。\n相反，它们可能是现实世界中观察不到的物体或者不可观测的力，但会影响可观测的量。\n为了对观察到的数据提供有用的简化解释或推断其原因，它们还可能以概念的形式存在于人类的思维中。\n它们可以被看作数据的概念或者抽象，帮助我们了解这些数据的丰富多样性。\n当分析语音记录时，\\gls{factors_of_variation}包括说话者的年龄、性别、他们的口音和他们正在说的词语。\n当分析汽车的图像时，\\gls{factors_of_variation}包括汽车的位置、它的颜色、太阳的角度和亮度。\n\n% -- 4 --\n\n在许多现实的\\gls{AI}应用中，困难主要源于多个\\gls{factors_of_variation}同时影响着我们能够观察到的每一个数据。\n比如，在一张包含红色汽车的图片中，其单个像素在夜间可能会非常接近黑色。\n汽车轮廓的形状取决于视角。\n大多数应用需要我们\\emph{理清}\\gls{factors_of_variation}并忽略我们不关心的因素。\n\n显然，从原始数据中提取如此高层次、抽象的特征是非常困难的。\n许多诸如说话口音这样的\\gls{factors_of_variation}，只能通过对数据进行复杂的、接近人类水平的理解来辨识。\n这几乎与获得原问题的\\gls{representation}一样困难，因此，乍一看，\\gls{representation_learning}似乎并不能帮助我们。\n\n\\firstgls{DL}通过其他较简单的\\gls{representation}来表达复杂\\gls{representation}，解决了\\gls{representation_learning}中的核心问题。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/deep_learning}}\n\\fi\n\\caption{深度学习模型的示意图。 计算机难以理解原始感观输入数据的含义，如表示为像素值集合的图像。\n将一组像素映射到对象标识的函数非常复杂。\n如果直接处理，学习或评估此映射似乎是不可能的。\n深度学习将所需的复杂映射分解为一系列嵌套的简单映射（每个由模型的不同层描述）来解决这一难题。\n输入展示在\\firstgls{visible_layer}，这样命名的原因是因为它包含我们能观察到的变量。\n然后是一系列从图像中提取越来越多抽象特征的\\firstgls{hidden_layer}。\n因为它们的值不在数据中给出，所以将这些层称为``隐藏''; 模型必须确定哪些概念有利于解释观察数据中的关系。\n这里的图像是每个\\gls{hidden_unit}表示的特征的可视化。\n给定像素，第一层可以轻易地通过比较相邻像素的亮度来识别边缘。\n有了第一\\gls{hidden_layer}描述的边缘，第二\\gls{hidden_layer}可以容易地搜索可识别为角和扩展轮廓的边集合。\n给定第二\\gls{hidden_layer}中关于角和轮廓的图像描述，第三\\gls{hidden_layer}可以找到轮廓和角的特定集合来检测特定对象的整个部分。\n最后，根据图像描述中包含的对象部分，可以识别图像中存在的对象。\n经~\\citet{ZeilerFergus14}许可转载此图。\n}\n\\label{fig:chap1_deep_learning}\n\\end{figure}\n\n\\gls{DL}让计算机通过较简单概念构建复杂的概念。\n\\figref{fig:chap1_deep_learning}展示了\\gls{DL}系统如何通过组合较简单的概念（例如转角和轮廓，它们转而由边线定义）来表示图像中人的概念。\n\\gls{DL}模型的典型例子是前馈深度网络或\\firstall{MLP}。\n\\gls{MLP}仅仅是一个将一组输入值映射到输出值的数学函数。\n该函数由许多较简单的函数复合而成。\n我们可以认为不同数学函数的每一次应用都为输入提供了新的\\gls{representation}。\n\n学习数据的正确\\gls{representation}的想法是解释\\gls{DL}的一个视角。\n另一个视角是深度促使计算机学习一个多步骤的计算机程序。\n每一层\\gls{representation}都可以被认为是并行执行另一组指令之后计算机的存储器状态。\n更深的网络可以按顺序执行更多的指令。\n顺序指令提供了极大的能力，因为后面的指令可以参考早期指令的结果。\n从这个角度上看，在某层激活函数里，并非所有信息都蕴涵着解释输入的\\gls{factors_of_variation}。\n\\gls{representation}还存储着状态信息，用于帮助程序理解输入。\n这里的状态信息类似于传统计算机程序中的计数器或指针。\n它与具体的输入内容无关，但有助于模型组织其处理过程。\n\n% -- 6 --\n\n目前主要有两种度量模型深度的方式。\n第一种方式是基于评估架构所需执行的顺序指令的数目。\n假设我们将模型表示为给定输入后，计算对应输出的流程图，则可以将这张流程图中的最长路径视为模型的深度。\n正如两个使用不同语言编写的等价程序将具有不同的长度；相同的函数可以被绘制为具有不同深度的流程图，其深度取决于我们可以用来作为一个步骤的函数。\n\\figref{fig:chap1_language}说明了语言的选择如何给相同的架构两个不同的衡量。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/language}}\n\\fi\n\\caption{将输入映射到输出的计算图表的示意图，其中每个节点执行一个操作。\n深度是从输入到输出的最长路径的长度，但这取决于可能的计算步骤的定义。\n这些图中所示的计算是\\gls{logistic_regression}模型的输出，$\\sigma(\\Vw^T \\Vx)$，其中$\\sigma$是~\\ENNAME{logistic sigmoid}~函数。\n如果我们使用加法、乘法和~\\ENNAME{logistic sigmoid}~作为我们计算机语言的元素，那么这个模型深度为三。\n如果我们将\\gls{logistic_regression}视为元素本身，那么这个模型深度为一。\n}\n\\label{fig:chap1_language}\n\\end{figure}\n\n另一种是在深度概率模型中使用的方法，它不是将计算图的深度视为模型深度，而是将描述概念彼此如何关联的图的深度视为模型深度。\n在这种情况下，计算每个概念\\gls{representation}的计算流程图的深度可能比概念本身的图更深。\n这是因为系统对较简单概念的理解在给出更复杂概念的信息后可以进一步精细化。\n例如，一个~\\glssymbol{AI}~系统观察其中一只眼睛在阴影中的脸部图像时，它最初可能只看到一只眼睛。\n但当检测到脸部的存在后，系统可以推断第二只眼睛也可能是存在的。\n在这种情况下，概念的图仅包括两层（关于眼睛的层和关于脸的层），但如果我们细化每个概念的估计将需要额外的$n$次计算，即计算的图将包含$2n$层。\n\n% -- 7 --\n\n由于并不总是清楚计算图的深度或概率模型图的深度哪一个是最有意义的，并且由于不同的人选择不同的最小元素集来构建相应的图，因此就像计算机程序的长度不存在单一的正确值一样，架构的深度也不存在单一的正确值。\n另外，也不存在模型多么深才能被修饰为``深''的共识。\n但相比传统\\gls{ML}，\\gls{DL}研究的模型涉及更多学到功能或学到概念的组合，这点毋庸置疑。\n\n总之， 这本书的主题——\\gls{DL}是通向\\gls{AI}的途径之一。\n具体来说，它是\\gls{ML}的一种，一种能够使计算机系统从经验和数据中得到提高的技术。\n我们坚信\\gls{ML}可以构建出在复杂实际环境下运行的~\\glssymbol{AI}~系统，并且是唯一切实可行的方法。\n\\gls{DL}是一种特定类型的\\gls{ML}，具有强大的能力和灵活性，它将大千世界\\gls{representation}为嵌套的层次概念体系\n（由较简单概念间的联系定义复杂概念、从一般抽象概括到高级抽象表示）。\n\\figref{fig:chap1_venn}说明了这些不同的~\\glssymbol{AI}~学科之间的关系。\\figref{fig:chap1_which_part_learned}展示了每个学科如何工作的高层次原理。\n\n\\begin{figure}[!hbt]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.65\\textwidth]{Chapter1/figures/venn}}\n\\fi\n\\caption{维恩图展示了深度学习是一种表示学习，也是一种机器学习，可以用于许多（但不是全部）\\glssymbol{AI}~方法。\n维恩图的每个部分包括一个~\\glssymbol{AI}~技术的示例。\n}\n\\label{fig:chap1_venn}\n\\end{figure}\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/which_part_learned}}\n\\fi\n\\caption{流程图展示了~\\glssymbol{AI}~系统的不同部分如何在不同的~\\glssymbol{AI}~学科中彼此相关。\n阴影框表示能从数据中学习的组件。}\n\\label{fig:chap1_which_part_learned}\n\\end{figure}\n\n\\section{本书面向的读者}\n\\label{sec:who_should_read_this_book}\n\n这本书对各类读者都有一定用处，但我们主要是为两类受众对象而写的。\n其中一类受众对象是学习\\gls{ML}的大学生（本科或研究生），包括那些已经开始职业生涯的\\gls{DL}和\\gls{AI}研究者。\n另一类受众对象是没有\\gls{ML}或统计背景但希望能快速地掌握这方面知识并在他们的产品或平台中使用\\gls{DL}的软件工程师。\n\\gls{DL}在许多软件领域都已被证明是有用的，包括计算机视觉、语音和音频处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、网络广告和金融。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.65\\textwidth]{Chapter1/figures/dependency}}\n\\fi\n\\caption{本书的高层组织。\n从一章到另一章的箭头表示前一章是理解后一章的必备内容。}\n\\label{fig:chap1_dependency}\n\\end{figure}\n\n% -- 8 --\n\n为了最好地服务各类读者，我们将本书组织为三个部分。\n第一部分介绍基本的数学工具和\\gls{ML}的概念。\n第二部分介绍最成熟的\\gls{DL}算法，这些技术基本上已经得到解决。\n第三部分讨论某些具有展望性的想法，它们被广泛地认为是\\gls{DL}未来的研究重点。\n\n读者可以随意跳过不感兴趣或与自己背景不相关的部分。\n熟悉线性代数、概率和基本\\gls{ML}概念的读者可以跳过第一部分，例如，当读者只是想实现一个能工作的系统则不需要阅读超出第二部分的内容。\n为了帮助读者选择章节，\\figref{fig:chap1_dependency}展示了这本书的高层组织结构的流程图。\n\n% -- 10 --\n\n我们假设所有读者都具备计算机科学背景。\n也假设读者熟悉编程，并且对计算的性能问题、复杂性理论、入门级微积分和一些图论术语有基本的了解。\n% \n\\section{深度学习的历史趋势}\n\\label{sec:historical_trends_in_deep_learning}\n通过历史背景了解\\gls{DL}是最简单的方式。\n这里我们仅指出\\gls{DL}的几个关键趋势，而不是提供其详细的历史：\n\\begin{itemize}\n \\item \\gls{DL}有着悠久而丰富的历史，但随着许多不同哲学观点的渐渐消逝，与之对应的名称也渐渐尘封。\n \\item 随着可用的训练数据量不断增加，\\gls{DL}变得更加有用。\n \\item 随着时间的推移，针对\\gls{DL}的计算机软硬件基础设施都有所改善，\\gls{DL}模型的规模也随之增长。\n \\item 随着时间的推移，\\gls{DL}已经解决日益复杂的应用，并且精度不断提高。\n\\end{itemize}\n\n\\subsection{神经网络的众多名称和命运变迁}\n\\label{sec:the_many_names_and_changing_fortunes_of_neural_networks}\n\n我们期待这本书的许多读者都听说过\\gls{DL}这一激动人心的新技术，并对一本书提及一个新兴领域的``历史''而感到惊讶。\n事实上，\\gls{DL}的历史可以追溯到20世纪40年代。\n\\gls{DL}\\emph{看似}是一个全新的领域，只不过因为在目前流行的前几年它是相对冷门的，同时也因为它被赋予了许多不同的名称（其中大部分已经不再使用），最近才成为众所周知的``\\gls{DL}''。\n这个领域已经更换了很多名称，它反映了不同的研究人员和不同观点的影响。\n\n全面地讲述\\gls{DL}的历史超出了本书的范围。\n然而，一些基本的背景对理解\\gls{DL}是有用的。\n一般来说，目前为止\\gls{DL}已经经历了三次发展浪潮：20世纪40年代到60年代\\gls{DL}的雏形出现在\\firstgls{cybernetics}中，20世纪80年代到90年代\\gls{DL}表现为\\firstgls{connectionism}，直到2006年，才真正以\\gls{DL}之名复兴。\n\\figref{fig:chap1_cybernetics_connectionism_ngrams_color}给出了定量的展示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/cybernetics_connectionism_ngrams_color}}\n\\fi\n\\caption{根据Google图书中短语``\\gls{cybernetics}''、``\\gls{connectionism}''或``\\gls{NN}''频率衡量的\\gls{ANN}研究的历史浪潮（图中展示了三次浪潮的前两次，第三次最近才出现）。\n第一次浪潮开始于20世纪40年代到20世纪60年代的\\gls{cybernetics}，随着生物学习理论的发展\\citep{McCulloch43,Hebb49}\n和第一个模型的实现（如感知机~\\citep{Rosenblatt-1958}） ，能实现单个神经元的训练。\n第二次浪潮开始于1980-1995年间的\\gls{connectionism}方法，可以使用反向传播\\citep{Rumelhart86b-small} 训练具有一两个\\gls{hidden_layer}的神经网络。\n当前第三次浪潮，也就是深度学习，大约始于2006年\\citep{Hinton06,Bengio-nips-2006-small,ranzato-07-small}，并且现在在2016年以书的形式出现。\n另外两次浪潮类似地出现在书中的时间比相应的科学活动晚得多。\n}\n\\label{fig:chap1_cybernetics_connectionism_ngrams_color}\n\\end{figure}\n\n% -- 12 --\n\n我们今天知道的一些最早的学习算法，是旨在模拟生物学习的计算模型，即大脑怎样学习或为什么能学习的模型。\n其结果是\\gls{DL}以\\firstall{ANN}之名而淡去。\n彼时，\\gls{DL}模型被认为是受生物大脑（无论人类大脑或其他动物的大脑）所启发而设计出来的系统。\n尽管有些\\gls{ML}的\\gls{NN}有时被用来理解大脑功能\\citep{hinton1991lesioning}，但它们一般都没有被设计成生物功能的真实模型。\n\\gls{DL}的神经观点受两个主要思想启发。\n一个想法是大脑作为例子证明智能行为是可能的，因此，概念上，建立智能的直接途径是逆向大脑背后的计算原理，并复制其功能。\n另一种看法是，理解大脑和人类智能背后的原理也非常有趣，因此\\gls{ML}模型除了解决工程应用的能力， 如果能让人类对这些基本的科学问题有进一步的认识也将会很有用。\n\n% -- 13 --\n  \n现代术语``\\gls{DL}''超越了目前\\gls{ML}模型的神经科学观点。\n它诉诸学习\\emph{多层次组合}这一更普遍的原理，这一原理也可以应用于那些并非受神经科学启发的\\gls{ML}框架。\n \n \n现代\\gls{DL}的最早前身是从神经科学的角度出发的简单线性模型。\n这些模型被设计为使用一组$\\Sn$个输入$\\Sx_1, \\dots ,\\Sx_n$并将它们与一个输出$\\Sy$相关联。 \n这些模型希望学习一组权重$\\Sw_1, \\dots, \\Sw_n $，并计算它们的输出$f(\\Vx, \\Vw) = \\Sx_1 \\Sw_1 + \\dots + \\Sx_n \\Sw_n$。\n如\\figref{fig:chap1_cybernetics_connectionism_ngrams_color}所示，这第一波\\gls{NN}研究浪潮被称为\\gls{cybernetics}。\n\n\\ENNAME{McCulloch-Pitts}~神经元\\citep{McCulloch43}是脑功能的早期模型。\n该线性模型通过检验函数$f(\\Vx,\\Vw)$的正负来识别两种不同类别的输入。\n显然，模型的权重需要正确设置后才能使模型的输出对应于期望的类别。\n这些权重可以由操作人员设定。\n在20世纪50年代，感知机\\citep{Rosenblatt-1956,Rosenblatt-1958}成为第一个能根据每个类别的输入\\gls{example}来学习权重的模型。\n约在同一时期，\\textbf{自适应线性单元}(adaptive linear element, ADALINE)简单地返回函数$f(\\Vx)$本身的值来预测一个实数\\citep{Widrow60}，并且它还可以学习从数据预测这些数。\n\n这些简单的学习算法大大影响了\\gls{ML}的现代景象。\n用于调节ADALINE权重的训练算法是被称为\\firstgls{SGD}的一种特例。\n稍加改进后的\\gls{SGD}算法仍然是当今\\gls{DL}的主要训练算法。\n\n基于感知机和ADALINE中使用的函数$f(\\Vx, \\Vw)$的模型被称为\\firstgls{linear_model}。\n尽管在许多情况下，这些模型以不同于原始模型的方式进行\\emph{训练}，但仍是目前最广泛使用的\\gls{ML}模型。\n\n\\gls{linear_model}有很多局限性。\n最著名的是，它们无法学习异或（XOR）函数，即$f([0,1], \\Vw) = 1$和$f([1,0], \\Vw)=1$，但$f([1,1], \\Vw)=0$和$f([0,0],\\Vw)= 0$。\n观察到\\gls{linear_model}这个缺陷的批评者对受生物学启发的学习普遍地产生了抵触\\citep{Minsky69}。\n这导致了\\gls{NN}热潮的第一次大衰退。\n\n现在，神经科学被视为\\gls{DL}研究的一个重要灵感来源，但它已不再是该领域的主要指导。\n\n% -- 14 --\n\n如今神经科学在\\gls{DL}研究中的作用被削弱，主要原因是我们根本没有足够的关于大脑的信息来作为指导去使用它。\n要获得对被大脑实际使用算法的深刻理解，我们需要有能力同时监测（至少是）数千相连神经元的活动。\n我们不能够做到这一点，所以我们甚至连大脑最简单、最深入研究的部分都还远远没有理解\\citep{olshausen:2005}。\n\n神经科学已经给了我们依靠单一\\gls{DL}算法解决许多不同任务的理由。\n神经学家们发现，如果将雪貂的大脑重新连接，使视觉信号传送到听觉区域，它们可以学会用大脑的听觉处理区域去``看''~\\citep{von2000visual}。\n这暗示着大多数哺乳动物的大脑能够使用单一的算法就可以解决其大脑可以解决的大部分不同任务。\n在这个假设之前，\\gls{ML}研究是比较分散的，研究人员在不同的社群研究自然语言处理、计算机视觉、运动规划和语音识别。\n如今，这些应用社群仍然是独立的，但是对于\\gls{DL}研究团体来说，同时研究许多或甚至所有这些应用领域是很常见的。\n\n我们能够从神经科学得到一些粗略的指南。\n仅通过计算单元之间的相互作用而变得智能的基本思想是受大脑启发的。\n新认知机\\citep{Fukushima80}受哺乳动物视觉系统的结构启发，引入了一个处理图片的强大模型架构，它后来成为了现代卷积网络的基础\\citep{LeCun98-small}（我们将会在\\secref{sec:the_neuroscientific_basis_for_convolutional_networks}看到）。\n目前大多数\\gls{NN}是基于一个称为\\firstgls{ReLU}的神经单元模型。\n原始认知机\\citep{Fukushima75}受我们关于大脑功能知识的启发， 引入了一个更复杂的版本。\n简化的现代版通过吸收来自不同观点的思想而形成，\\citet{Nair-2010}和~\\citet{Glorot+al-AI-2011-small}援引神经科学作为影响，\\citet{Jarrett-ICCV2009}援引更多面向工程的影响。\n虽然神经科学是灵感的重要来源，但它不需要被视为刚性指导。\n我们知道，真实的神经元计算着与现代\\gls{ReLU}非常不同的函数，但更接近真实神经网络的系统并没有导致\\gls{ML}性能的提升。\n此外，虽然神经科学已经成功地启发了一些\\gls{NN}\\emph{架构}，但我们对用于神经科学的生物学习还没有足够多的了解，因此也就不能为训练这些架构用的\\emph{学习算法}提供太多的借鉴。\n\n\n媒体报道经常强调\\gls{DL}与大脑的相似性。\n的确，\\gls{DL}研究者比其他\\gls{ML}领域（如核方法或贝叶斯统计）的研究者更可能地引用大脑作为影响，但是大家不应该认为\\gls{DL}在尝试模拟大脑。\n现代\\gls{DL}从许多领域获取灵感，特别是应用数学的基本内容如线性代数、概率论、信息论和数值优化。\n尽管一些\\gls{DL}的研究人员引用神经科学作为灵感的重要来源，然而其他学者完全不关心神经科学。\n\n% -- 15 --\n\n值得注意的是，了解大脑是如何在算法层面上工作的尝试确实存在且发展良好。\n这项尝试主要被称为``计算神经科学''，并且是独立于\\gls{DL}的领域。\n研究人员在两个领域之间来回研究是很常见的。\n\\gls{DL}领域主要关注如何构建计算机系统，从而成功解决需要智能才能解决的任务，而计算神经科学领域主要关注构建大脑如何真实工作的比较精确的模型。\n\n在20世纪80年代，神经网络研究的第二次浪潮在很大程度上是伴随一个被称为\\firstgls{connectionism}或\\textbf{并行分布处理}( parallel distributed processing)潮流而出现的\\citep{Rumelhart86,mcclelland1995appeal}。\n\\gls{connectionism}是在认知科学的背景下出现的。\n认知科学是理解思维的跨学科途径，即它融合多个不同的分析层次。\n在20世纪80年代初期，大多数认知科学家研究符号推理模型。\n尽管这很流行，但符号模型很难解释大脑如何真正使用神经元实现推理功能。 \n\\gls{connectionism}者开始研究真正基于神经系统实现的认知模型\\citep{Touretzky1985}，其中很多复苏的想法可以追溯到心理学家~\\ENNAME{Donald Hebb}~在20世纪40年代的工作\\citep{Hebb49}。\n\n\\gls{connectionism}的中心思想是，当网络将大量简单的计算单元连接在一起时可以实现智能行为。\n这种见解同样适用于生物神经系统中的神经元，因为它和计算模型中\\gls{hidden_unit}起着类似的作用。\n\n在上世纪80年代的\\gls{connectionism}期间形成的几个关键概念在今天的\\gls{DL}中仍然是非常重要的。\n\n其中一个概念是\\firstgls{distributed_representation}\\citep{Hinton-et-al-PDP1986}。\n其思想是：系统的每一个输入都应该由多个特征\\gls{representation}，并且每一个特征都应该参与到多个可能输入的\\gls{representation}。\n例如，假设我们有一个能够识别红色、绿色、或蓝色的汽车、卡车和鸟类的视觉系统，\n\\gls{representation}这些输入的其中一个方法是将九个可能的组合：红卡车，红汽车，红鸟，绿卡车等等使用单独的神经元或\\gls{hidden_unit}激活。\n这需要九个不同的神经元，并且每个神经必须独立地学习颜色和对象身份的概念。\n改善这种情况的方法之一是使用\\gls{distributed_representation}，即用三个神经元描述颜色，三个神经元描述对象身份。 \n这仅仅需要6个神经元而不是9个，并且描述红色的神经元能够从汽车、卡车和鸟类的图像中学习红色，而不仅仅是从一个特定类别的图像中学习。 \n\\gls{distributed_representation}的概念是本书的核心，我们将在\\chapref{chap:representation_learning}中更加详细地描述。\n\n% -- 16 --\n\n\\gls{connectionism}潮流的另一个重要成就是反向传播在训练具有内部\\gls{representation}的深度\\gls{NN}中的成功使用以及反向传播算法的普及\\citep{RHW,Lecun-these87}。\n这个算法虽然曾黯然失色不再流行，但截至写书之时，它仍是训练深度模型的主导方法。% ??\n\n在20世纪90年代，研究人员在使用\\gls{NN}进行序列建模的方面取得了重要进展。\n\\citet{Hochreiter91}和~\\citet{Bengio-trnn93-small}指出了对长序列进行建模的一些根本性数学难题，这将在\\secref{sec:the_challenge_of_long_term_dependencies}中描述。\n\\citet{Hochreiter+Schmidhuber-1997}引入\\firstall{LSTM}网络来解决这些难题。\n如今，\\glssymbol{LSTM}~在许多序列建模任务中广泛应用，包括Google的许多自然语言处理任务。\n\n\\gls{NN}研究的第二次浪潮一直持续到上世纪90年代中期。\n基于\\gls{NN}和其他\\glssymbol{AI}技术的创业公司开始寻求投资，其做法野心勃勃但不切实际。\n当\\glssymbol{AI}研究不能实现这些不合理的期望时，投资者感到失望。\n同时，\\gls{ML}的其他领域取得了进步。\n比如，核方法\\citep{Boser92,Cortes95,SchBurSmo99}和图模型\\citep{Jordan98}都在很多重要任务上实现了很好的效果。\n这两个因素导致了\\gls{NN}热潮的第二次衰退，并一直持续到2007年。\n\n在此期间，\\gls{NN}继续在某些任务上获得令人印象深刻的表现\\citep{LeCun98-small,Bengio-nnlm2001}。\n加拿大高级研究所（CIFAR）通过其神经计算和自适应感知（NCAP）研究计划帮助维持\\gls{NN}研究。\n该计划联合了分别由~\\ENNAME{Geoffrey Hinton}、\\ENNAME{Yoshua Bengio}和~\\ENNAME{Yann LeCun}~领导的多伦多大学、蒙特利尔大学和纽约大学的\\gls{ML}研究小组。\n这个多学科的CIFAR NCAP研究计划还囊括了神经科学家、人类和计算机视觉专家。\n\n% -- 17 --\n\n在那个时候，人们普遍认为深度网络是难以训练的。\n现在我们知道，20世纪80年代就存在的算法能工作得非常好，但是直到在2006年前后都没有体现出来。\n这可能仅仅由于其计算代价太高，而以当时可用的硬件难以进行足够的实验。\n\n神经网络研究的第三次浪潮始于2006年的突破。\n\\ENNAME{Geoffrey Hinton}~表明名为\\gls{DBN}的\\gls{NN}可以使用一种称为贪婪逐层预训练的策略来有效地训练\\citep{Hinton06}，我们将在\\secref{sec:greedy_layer_wise_unsupervised_pretraining}中更详细地描述。\n其他CIFAR附属研究小组很快表明，同样的策略可以被用来训练许多其他类型的深度网络\\citep{Bengio+Lecun-chapter2007-small,ranzato-07}，并能系统地帮助提高在测试样例上的泛化能力。\n\\gls{NN}研究的这一次浪潮普及了``\\gls{DL}''这一术语的使用，强调研究者现在有能力训练以前不可能训练的比较深的神经网络，并着力于深度的理论重要性上\\citep{Bengio+Lecun-chapter2007,Delalleau+Bengio-2011-small,Pascanu-et-al-ICLR2014,Montufar-et-al-NIPS2014}。\n此时，深度\\gls{NN}已经优于与之竞争的基于其他\\gls{ML}技术以及手工设计功能的~\\glssymbol{AI}~系统。\n在写这本书的时候，神经网络的第三次发展浪潮仍在继续，尽管深度学习的研究重点在这一段时间内发生了巨大变化。\n第三次浪潮已开始着眼于新的无监督学习技术和深度模型在小数据集的泛化能力，但目前更多的兴趣点仍是比较传统的监督学习算法和深度模型充分利用大型标注数据集的能力。\n\n\\subsection{与日俱增的数据量}\n\\label{sec:increasing_dataset_sizes}\n人们可能想问，既然人工\\gls{NN}的第一个实验在20世纪50年代就完成了，但为什么\\gls{DL}直到最近才被认为是关键技术。\n自20世纪90年代以来，\\gls{DL}就已经成功用于商业应用，但通常被视为是一种只有专家才可以使用的艺术而不是一种技术，这种观点一直持续到最近。\n确实，要从一个\\gls{DL}算法获得良好的性能需要一些技巧。\n幸运的是，随着训练数据的增加，所需的技巧正在减少。\n目前在复杂的任务达到人类水平的学习算法，与20世纪80年代努力解决玩具问题(toy problem)的学习算法几乎是一样的，尽管我们使用这些算法训练的模型经历了变革，即简化了极深架构的训练。\n最重要的新进展是现在我们有了这些算法得以成功训练所需的资源。\n\\figref{fig:chap1_dataset_size_color}展示了基准数据集的大小如何随着时间的推移而显著增加。\n这种趋势是由社会日益数字化驱动的。\n由于我们的活动越来越多发生在计算机上，我们做什么也越来越多地被记录。\n由于我们的计算机越来越多地联网在一起，这些记录变得更容易集中管理，并更容易将它们整理成适于\\gls{ML}应用的数据集。\n因为统计估计的主要负担（观察少量数据以在新数据上泛化）已经减轻，``大数据''时代使\\gls{ML}更加容易。\n截至2016年，一个粗略的经验法则是，监督\\gls{DL}算法在每类给定约5000个标注样本情况下一般将达到可以接受的性能，当至少有1000万个标注样本的数据集用于训练时，它将达到或超过人类表现。\n此外，在更小的数据集上获得成功是一个重要的研究领域，为此我们应特别侧重于如何通过无监督或半监督学习充分利用大量的未标注样本。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/dataset_size_color}}\n\\fi\n\\caption{与日俱增的数据量。\n20世纪初，统计学家使用数百或数千的手动制作的度量来研究数据集\\citep{garson:1900,student08ttest,IrisData1935,Fisher-1936}。\n20世纪50年代到80年代，受生物启发的机器学习开拓者通常使用小的合成数据集，如低分辨率的字母位图，设计为在低计算成本下表明神经网络能够学习特定功能\\citep{Widrow60,Rumelhart86c}。\n20世纪80年代和90年代，机器学习变得更加统计，并开始利用包含成千上万个样本的更大数据集，如手写扫描数字的MNIST数据集（如\\figref{fig:chap1_mnist}）所示\\citep{LeCun98-small}。\n在21世纪初的第一个十年，相同大小更复杂的数据集持续出现，如CIFAR-10数据集\\citep{KrizhevskyHinton2009} 。\n在这十年结束和下五年，明显更大的数据集（包含数万到数千万的样例）完全改变了深度学习的可能实现的事。\n这些数据集包括公共Street View House Numbers数据集 \\citep{Netzer-wkshp-2011}、各种版本的ImageNet数据集\\citep{imagenet_cvpr09,Deng2010,ILSVRCarxiv14}以及Sports-1M数据集\\citep{KarpathyCVPR14}。\n在图顶部，我们看到翻译句子的数据集通常远大于其他数据集，如根据Canadian Hansard制作的IBM数据集\\citep{brown1990statistical}和WMT 2014英法数据集\\citep{wmt14} 。\n}\n\\label{fig:chap1_dataset_size_color}\n\\end{figure}\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter1/figures/mnist}}\n\\fi\n\\caption{MNIST数据集的输入样例。\n``NIST''代表国家标准和技术研究所(National Institute of Standards and Technology)，是最初收集这些数据的机构。\n``M''代表``修改的(Modified)''，为更容易地与机器学习算法一起使用，数据已经过预处理。\nMNIST数据集包括手写数字的扫描和相关标签（描述每个图像中包含0-9中哪个数字）。\n这个简单的分类问题是深度学习研究中最简单和最广泛使用的测试之一。\n尽管现代技术很容易解决这个问题，它仍然很受欢迎。\nGeoffrey Hinton将其描述为``机器学习的\\emph{果蝇}''，这意味着机器学习研究人员可以在受控的实验室条件下研究他们的算法，就像生物学家经常研究果蝇一样。\n}\n\\label{fig:chap1_mnist}\n\\end{figure}\n\n% -- 20 --\n\n\\subsection{与日俱增的模型规模}\n\\label{sec:increasing_model_sizes}\n\n\n20世纪80年代，\\gls{NN}只能取得相对较小的成功，而现在\\gls{NN}非常成功的另一个重要原因是我们现在拥有的计算资源可以运行更大的模型。\n\\gls{connectionism}的主要见解之一是，当动物的许多神经元一起工作时会变得聪明。\n单独神经元或小集合的神经元不是特别有用。\n\n生物神经元不是特别稠密地连接在一起。\n如\\figref{fig:chap1_number_of_synapses_color}所示，几十年来，我们的\\gls{ML}模型中每个神经元的连接数量已经与哺乳动物的大脑在同一数量级上。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/number_of_synapses_color}}\n\\fi\n\\caption{与日俱增的每神经元连接数。 % ？ 可以翻成平均吗 ？\n最初，\\gls{ANN}中神经元之间的连接数受限于硬件能力。\n而现在，神经元之间的连接数大多是出于设计考虑。\n一些\\gls{ANN}中每个神经元的连接数与猫一样多，并且对于其他神经网络来说，每个神经元的连接与较小哺乳动物（如小鼠）一样多是非常普遍的。\n甚至人类大脑每个神经元的连接也没有过高的数量。\n生物神经网络规模来自\\citet{number_of_neurons}。\n}\n\\label{fig:chap1_number_of_synapses_color}\n{\\tiny\n\\begin{enumerate}\n  \\itemsep0em\n  \\item % 1\n    自适应线性单元~\\citep{Widrow60}\n  \\item % 2\n    神经认知机~\\citep{Fukushima80}\n  \\item % 3\n    GPU-加速 \\gls{convolutional_network}~\\citep{chellapilla:inria-00112631}\n  \\item % 4\n    \\gls{DBM}~\\citep{SalHinton09}\n  \\item % 5\n    \\gls{unsupervised}\\gls{convolutional_network}~\\citep{Jarrett-ICCV2009-small}\n  \\item % 6\n    GPU-加速 \\gls{MLP}~\\citep{Ciresan-2010}\n  \\item % 7\n    分布式\\gls{AE}~\\citep{QuocLe-ICML2012}\n  \\item % 8\n    Multi-GPU \\gls{convolutional_network}~\\citep{Krizhevsky-2012-small}\n  \\item % 9\n    COTS HPC  \\gls{unsupervised}\\gls{convolutional_network}~\\citep{icml2013_coates13}\n  \\item % 10\n    GoogLeNet~\\citep{Szegedy-et-al-arxiv2014}\n\\end{enumerate}\n} % end tiny\n\\end{figure}\n\n如\\figref{fig:chap1_number_of_neurons_color}所示，就神经元的总数目而言，直到最近\\gls{NN}都是惊人的小。\n自从\\gls{hidden_unit}引入以来，人工\\gls{NN}的规模大约每2.4年扩大一倍。\n这种增长是由更大内存、更快的计算机和更大的可用数据集驱动的。\n更大的网络能够在更复杂的任务中实现更高的精度。\n这种趋势看起来将持续数十年。\n除非有能力迅速扩展的新技术，否则至少要到21世纪50年代，人工\\gls{NN}将才能具备与人脑相同数量级的神经元。\n生物神经元表示的功能可能比目前的人工神经元所表示的更复杂，因此生物神经网络可能比图中描绘的甚至要更大。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/number_of_neurons_color}}\n\\fi\n\\caption{与日俱增的神经网络规模。\n自从引入\\gls{hidden_unit}，\\gls{ANN}的大小大约每2.4年翻一倍。\n生物神经网络规模来自~\\citet{number_of_neurons}。\n}\n\\label{fig:chap1_number_of_neurons_color}\n{\\tiny\n\\begin{enumerate}\n  \\itemsep-.1em\n  \\item % 1\n    感知机~\\citep{Rosenblatt-1958,Rosenblatt62}\n  \\item % 2\n    自适应线性单元~\\citep{Widrow60}\n  \\item % 3\n    神经认知机~\\citep{Fukushima80}\n  \\item % 4\n    早期后向传播网络~\\citep{Rumelhart86c}\n  \\item % 5\n    用于语音识别的\\gls{RNN}~\\citep{Robinson+Fallside91}\n  \\item % 6\n    用于语音识别的\\gls{MLP}~\\citep{Bengio91z}\n  \\item % 7\n    \\gls{meanfield}sigmoid\\gls{BN}~\\citep{Saul+96}\n  \\item % 8\n    LeNet-5~\\citep{LeCun98-small}\n  \\item % 9\n    \\gls{ESN}~\\citep{Jaeger+Haas-2004}\n  \\item % 10\n    \\gls{DBN}~\\citep{Hinton06}\n  \\item % 11\n    GPU-加速\\gls{convolutional_network}~\\citep{chellapilla:inria-00112631}\n  \\item % 12\n    \\gls{DBM}~\\citep{SalHinton09}\n  \\item % 13\n    GPU-加速\\gls{DBN}~\\citep{RainaICML09}\n  \\item % 14\n    \\gls{unsupervised}\\gls{convolutional_network}~\\citep{Jarrett-ICCV2009-small}\n  \\item % 15\n    GPU-加速\\gls{MLP}~\\citep{Ciresan-2010}\n  \\item % 16\n    OMP-1 网络~\\citep{Coates2011b}\n  \\item % 17\n    分布式\\gls{AE}~\\citep{QuocLe-ICML2012}\n  \\item % 18\n    Multi-GPU\\gls{convolutional_network}~\\citep{Krizhevsky-2012-small}\n  \\item % 19\n    COTS HPC \\gls{unsupervised}\\gls{convolutional_network}~\\citep{icml2013_coates13}\n  \\item % 20\n    GoogLeNet~\\citep{Szegedy-et-al-arxiv2014}\n\\end{enumerate}\n}\n\\end{figure}\n\n\n现在看来，其神经元比一个水蛭还少的\\gls{NN}不能解决复杂的\\gls{AI}问题是不足为奇的。\n即使现在的网络，从计算系统角度来看它可能相当大的，但实际上它比相对原始的脊椎动物如青蛙的神经系统还要小。\n\n由于更快的CPU、通用GPU的出现（在\\secref{sec:gpu_implementations}中讨论）、更快的网络连接和更好的分布式计算的软件基础设施，模型规模随着时间的推移不断增加是\\gls{DL}历史中最重要的趋势之一。\n人们普遍预计这种趋势将很好地持续到未来。\n\n% -- 21 --\n\n\\subsection{与日俱增的精度、复杂度和对现实世界的冲击}\n\\label{sec:increasing_accuracy_complexity_and_real_world_impact}\n\n20世纪80年代以来，\\gls{DL}提供精确识别和预测的能力一直在提高。\n而且，\\gls{DL}持续成功地被应用于越来越广泛的实际问题中。\n\n最早的深度模型被用来识别裁剪紧凑且非常小的图像中的单个对象\\citep{Rumelhart86}。\n此后，\\gls{NN}可以处理的图像尺寸逐渐增加。\n现代对象识别网络能处理丰富的高分辨率照片，并且不需要在被识别的对象附近进行裁剪\\citep{Krizhevsky-2012}。\n类似地，最早的网络只能识别两种对象（或在某些情况下，单类对象的存在与否），而这些现代网络通常能够识别至少\\NUMTEXT{1000}个不同类别的对象。\n对象识别中最大的比赛是每年举行的ImageNet大型视觉识别挑战（ILSVRC）。\n\\gls{DL}迅速崛起的激动人心的一幕是卷积网络第一次大幅赢得这一挑战，它将最高水准的前5错误率从~\\NUMTEXT{26.1\\%}~降到~\\NUMTEXT{15.3\\%}~\\citep{Krizhevsky-2012}，这意味着该卷积网络针对每个图像的可能类别生成一个顺序列表，除了15.3\\%的测试样本，其他测试样本的正确类标都出现在此列表中的前5项里。\n此后，深度卷积网络连续地赢得这些比赛，截至写本书时，\\gls{DL}的最新结果将这个比赛中的前5错误率降到了~\\NUMTEXT{3.6\\%}， 如\\figref{fig:chap1_imagenet_color}所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/imagenet_color}}\n\\fi\n\\caption{日益降低的错误率。\n由于深度网络达到了在ImageNet大规模视觉识别挑战中竞争所必需的规模，它们每年都能赢得胜利，并且产生越来越低的错误率。\n数据来源于 \\citet{russakovsky2014imagenet}和~\\citet{He-et-al-arxiv2015}。}\n\\label{fig:chap1_imagenet_color}\n\\end{figure}\n\n% -- 23 --\n\n\\gls{DL}也对语音识别产生了巨大影响。\n语音识别在20世纪90年代得到提高后，直到约2000年都停滞不前。\n\\gls{DL}的引入\\citep{dahl2010phonerec,Deng-2010,Seide2011,Hinton-et-al-2012}使得语音识别错误率陡然下降，有些错误率甚至降低了一半。\n我们将在\\secref{sec:speech_recognition}更详细地探讨这个历史。\n\n深度网络在行人检测和图像分割中也取得了引人注目的成功\\citep{sermanet-cvpr-13,Farabet-et-al-2013,couprie-iclr-13}，并且在交通标志分类上取得了超越人类的表现\\citep{Ciresan-et-al-2012}。\n\n在深度网络的规模和精度有所提高的同时，它们可以解决的任务也日益复杂。\n\\citet{Goodfellow+et+al-ICLR2014a}表明，\\gls{NN}可以学习输出描述图像的整个字符序列，而不是仅仅识别单个对象。\n此前，人们普遍认为，这种学习需要对序列中的单个元素进行标注\\citep{Gulcehre+Bengio-arxiv-2013}。\n\\gls{RNN}，如之前提到的~\\glssymbol{LSTM}~序列模型，现在用于对序列和其他序列之间的关系进行建模，而不是仅仅固定输入之间的关系。\n这种序列到序列的学习似乎引领着另一个应用的颠覆性发展，即机器翻译\\citep{Sutskever-et-al-NIPS2014,Bahdanau-et-al-ICLR2015-small}。\n\n% -- 24 --\n\n这种复杂性日益增加的趋势已将其推向逻辑结论，即神经图灵机\\citep{Graves-et-al-arxiv2014}的引入，它能学习读取存储单元和向存储单元写入任意内容。\n这样的\\gls{NN}可以从期望行为的\\gls{example}中学习简单的程序。\n例如，从杂乱和排好序的\\gls{example}中学习对一系列数进行排序。\n这种自我编程技术正处于起步阶段，但原则上未来可以适用于几乎所有的任务。\n\n\n\\gls{DL}的另一个最大的成就是其在\\firstgls{RL}领域的扩展。\n在\\gls{RL}中，一个自主的智能体必须在没有人类操作者指导的情况下，通过试错来学习执行任务。\nDeepMind表明，基于\\gls{DL}的\\gls{RL}系统能够学会玩Atari视频游戏，并在多种任务中可与人类匹敌\\citep{Mnih-et-al-2015}。\n\\gls{DL}也显著改善了机器人\\gls{RL}的性能\\citep{finn2015learning}。\n\n许多\\gls{DL}应用都是高利润的。现在\\gls{DL}被许多顶级的技术公司使用，包括Google、Microsoft、Facebook、IBM、Baidu、Apple、Adobe、Netflix、NVIDIA和NEC等。\n\n\\gls{DL}的进步也严重依赖于软件基础架构的进展。\n软件库如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}都能支持重要的研究项目或商业产品。\n\n\\gls{DL}也为其他科学做出了贡献。\n用于对象识别的现代卷积网络为神经科学家们提供了可以研究的视觉处理模型\\citep{dicarlo-tutorial-2013}。\n\\gls{DL}也为处理海量数据以及在科学领域作出有效的预测提供了非常有用的工具。\n它已成功地用于预测分子如何相互作用从而帮助制药公司设计新的药物\\citep{Dahl-et-al-arxiv2014}，搜索亚原子粒子\\citep{baldi2014searching}，以及自动解析用于构建人脑三维图的显微镜图像\\citep{knowlesdeep}等。\n我们期待\\gls{DL}未来能够出现在越来越多的科学领域中。\n\n% -- 25 --\n\n总之，\\gls{DL}是\\gls{ML}的一种方法。在过去几十年的发展中，它大量借鉴了我们关于人脑、统计学和应用数学的知识。\n近年来，得益于更强大的计算机、更大的数据集和能够训练更深网络的技术，\\gls{DL}的普及性和实用性都有了极大的发展。\n未来几年充满了进一步提高\\gls{DL}并将它带到新领域的挑战和机遇。\n\n% -- 26 --\n"
  },
  {
    "path": "Chapter10/README.md",
    "content": "#第十章笔记\n"
  },
  {
    "path": "Chapter10/annotations.txt",
    "content": "{'user': 'acct:zhaoyu611@hypothes.is', 'text': '这里指', 'origin_text': '的不同部分共享参数。参数共享使得模型能够扩展到不同形式的样本（  !!!如!!!  不同的长度）并进行泛化。如果我们在每个时间点都有一个单独的参数', 'time': '2017-02-20T07:21'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '。', 'origin_text': '有语言规则。相比之下，循环神经网络在几个时间步内共享相同的权重  !!!，不需要分别学习句子每个位置的所有语言规则。!!!  一个相关的想法是使用跨越1维时间序列的卷积。这种卷积方', 'time': '2017-02-20T07:31'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '在1维时间序列上使用卷积', 'origin_text': '需要分别学习句子每个位置的所有语言规则。一个相关的想法是  !!!使用跨越1维时间序列的卷积!!!  。这种卷积方法是时延神经网络的基础{cite?}。卷积操作允', 'time': '2017-02-20T07:33'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '在时间上', 'origin_text': '种卷积方法是时延神经网络的基础{cite?}。卷积操作允许网络  !!!跨越时间!!!  共享参数，但是浅层的。卷积的输出是一个序列，其中输出中的每一项', 'time': '2017-02-20T07:34'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '输入的函数', 'origin_text': '但是浅层的。卷积的输出是一个序列，其中输出中的每一项是相邻几项  !!!的函数!!!  。参数共享的概念体现在每个时间步中使用的相同卷积核。循环神经', 'time': '2017-02-20T07:36'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '前一项输出', 'origin_text': '相同卷积核。循环神经网络以不同的方式共享参数。输出的每一项是  !!!输出前一项!!!  的函数。输出的每一项对先前的输出应用相同的更新规则而产生。这', 'time': '2017-02-20T07:42'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '这种循环方式', 'origin_text': '项的函数。输出的每一项对先前的输出应用相同的更新规则而产生。  !!!这种循环!!!  导致参数通过很深的计算图共享。为简单起见，我们说的RNN是指', 'time': '2017-02-20T07:49'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '实际', 'origin_text': '到ττ\\\\tau）包含向量x(t)x(t)\\\\Vx^{(t)}。在  !!!实践!!!  中，循环网络通常在序列的minibatch上操作，并且minib', 'time': '2017-02-20T07:50'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '小批量(%不知道翻译是否准确)', 'origin_text': 't)x(t)\\\\Vx^{(t)}。在实践中，循环网络通常在序列的  !!!minibatch!!!  上操作，并且minibatch的每项具有不同序列长度ττ\\\\tau', 'time': '2017-02-20T07:51'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '有时仅表示序列中的位置', 'origin_text': '来简化记号。此外，时间步索引不必是字面上现实世界中流逝的时间，  !!!也可以是序列中的位置!!!  。RNN也可以应用于跨越两个维度的空间数据（如图像），并且当应', 'time': '2017-02-20T07:53'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '两个', 'origin_text': '现实世界中流逝的时间，也可以是序列中的位置。RNN也可以应用于  !!!跨越两个!!!  维度的空间数据（如图像），并且当应用于涉及时间的数据时，该网络可', 'time': '2017-02-20T07:54'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'RNNs\\n', 'origin_text': '步索引不必是字面上现实世界中流逝的时间，也可以是序列中的位置。  !!!RNN!!!  也可以应用于跨越两个维度的空间数据（如图像），并且当应用于涉及时', 'time': '2017-02-20T07:54'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '思想', 'origin_text': '提是将整个序列提供给网络之前能观察到整个序列。本章将计算图的  !!!想法!!!  扩展到包括周期。这些周期代表变量自身的值在未来某一时间步对自身', 'time': '2017-02-20T07:56'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '概要', 'origin_text': '计算结构的方式，如那些涉及将输入和参数映射到输出和损失的计算。  !!!综合!!!  的介绍请参考\\\\sec?。本节，我们对展开递归或循环计算得到的重', 'time': '2017-02-20T08:04'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '当', 'origin_text': 'u-1次应用这个定义可以展开这个图。例如，如果我们对式\\\\eq?  !!!关于!!!  τ=3τ=3\\\\tau = 3展开，可以得到：s(3)=f(s(', 'time': '2017-02-20T08:08'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '结构属性', 'origin_text': '\\\\end{align}如\\\\fig?所示，典型RNN会增加额外的  !!!架构!!!  ，如读取状态信息hh\\\\Vh进行预测的输出层。\\\\begin{fi', 'time': '2017-02-20T08:22'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '\\\\textbf{h}', 'origin_text': '}如\\\\fig?所示，典型RNN会增加额外的架构，如读取状态信息  !!!h!!!  h\\\\Vh进行预测的输出层。\\\\begin{figure}[!ht', 'time': '2017-02-20T08:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'summary的翻译需要进一步斟酌', 'origin_text': '\\\\Vh^{(t)}作为过去序列（直到ttt）与任务相关方面的有损  !!!摘要!!!  。此摘要一般而言一定是有损的，因为其映射任意长度的序列(x(t', 'time': '2017-02-20T08:25'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '时间$t$', 'origin_text': '模中使用的RNN，通常给定前一个词预测下一个词，可能没有必要存储  !!!t!!!  tt前输入序列中的所有信息；而仅仅存储足够预测句子其余部分的信息', 'time': '2017-02-20T08:31'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '步长', 'origin_text': '式包括以下几种：\\\\begin{enumerate}+\\xa0每个时间  !!!步!!!  都有输出，并且隐藏单元之间有循环连接的循环网络，如\\\\fig?所示', 'time': '2017-02-20T11:43'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '步长', 'origin_text': '身值的影响。这样的计算图允许我们定义循环神经网络。然后，我们  !!!描述!!!  许多构建、训练和使用循环神经网络的不同方式。本章将简要介绍循', 'time': '2017-02-20T11:43'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '离散变量的常规表示方式', 'origin_text': '损失函数。我们假定输出是离散的，如用于预测词或字符的RNN。  !!!一种代表离散变量的自然方式!!!  是把输出oo\\\\Vo作为每个离散变量可能值的非标准化对数概率。然', 'time': '2017-02-20T12:05'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '隐层到隐层', 'origin_text': '藏的循环连接）。例如，它不能模拟通用图灵机。因为这个网络缺少  !!!隐藏到隐藏!!!  的循环，它要求输出单元捕捉用于预测未来的关于过去的所有信息。因', 'time': '2017-02-20T12:39'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '。在展开图上使用反向传播称为通过时间的反向传播(Back Propagation Through Time)。', 'origin_text': 'c?中的推广反向传播算法应用于展开的计算图，而不需要特殊化的算法  !!!。!!!  由反向传播计算得到的梯度，并结合任何通用的基于梯度的技术就可以训', 'time': '2017-02-21T01:02'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '节点序列', 'origin_text': 'MU,\\\\MV,\\\\MW, \\\\Vb和cc\\\\Vc，以及以ttt为索引的  !!!顺序节点!!!  x(t),h(t),o(t)x(t),h(t),o(t)\\\\Vx^', 'time': '2017-02-21T01:04'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '损失函数', 'origin_text': '类似，原则上循环网络几乎可以使用任何损失。但必须根据任务来选择  !!!损失!!!  。如前馈网络，我们通常希望将RNN的输出解释为一个概率分布，并', 'time': '2017-02-21T07:39'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '作为', 'origin_text': '必须根据任务来选择损失。如前馈网络，我们通常希望将RNN的输出  !!!解释为!!!  一个概率分布，并且我们通常使用与分布相关联的交叉熵来定义损失。', 'time': '2017-02-21T07:40'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '获得', 'origin_text': 'n}将整个序列yy\\\\Vy的联合分布分解为一系列单步的概率预测是  !!!捕获!!!  关于整个序列完整联合分布的一种方法。当我们不把过去的yy\\\\Vy', 'time': '2017-02-21T07:48'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '应当加粗', 'origin_text': '构的图模型。该RNN完全图的解释基于排除并忽略模型中的隐藏单元  !!!~h(t)!!!  h(t)\\\\Vh^{(t)}。更有趣的是，将隐藏单元~h(', 'time': '2017-02-21T10:45'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'textbf{h}', 'origin_text': '解耦。遥远过去的变量y(i)y(i)y^{(i)}可以通过其对  !!!h!!!  h\\\\Vh的影响来影响变量y(t)y(t)y^{(t)}。该图的', 'time': '2017-02-21T11:21'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '过去', 'origin_text': '{(t)}节点可以用作过去和未来之间的中间量，从而将它们解耦。  !!!遥远过去!!!  的变量y(i)y(i)y^{(i)}可以通过其对hh\\\\Vh的影响', 'time': '2017-02-21T11:21'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '前提是', 'origin_text': '\\\\emph{优化}参数可能变得困难。在循环网络中使用的参数共  !!!享依赖于!!!  相同参数可用于不同时间步的假设。等效地，假设给定时刻ttt的变', 'time': '2017-02-22T00:49'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '同样的', 'origin_text': '循环网络中使用的参数共享依赖于相同参数可用于不同时间步的假设。  !!!等效地!!!  ，假设给定时刻ttt的变量后，时刻t+1t+1t +1变量的条件', 'time': '2017-02-22T00:50'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '继续生成或停止生成', 'origin_text': '模型中引入一个额外的Bernoulli输出，表示在每个时间步决定  !!!继续或停止!!!  。相比向词汇表增加一个额外符号，这种方法更普遍，因为它适用于任', 'time': '2017-02-22T01:50'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'x应该加粗', 'origin_text': '训练集中，我们将该符号作为序列的一个额外成员，即紧跟每个训练样本  !!!x(τ)!!!  x(τ)\\\\Vx^{(\\\\tau)}之后。另一种选择是在模型', 'time': '2017-02-22T01:54'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'RNNs', 'origin_text': 'fellow+et+al-ICLR2014a}。基于上下文的  !!!RNN!!!  序列建模上一节描述了没有输入xx\\\\Vx时，关于随机变量序列y', 'time': '2017-02-22T03:06'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '向量时', 'origin_text': '只使用单个向量xx\\\\Vx作为输入。当xx\\\\Vx是一个固定大小的  !!!向量!!!  ，我们可以简单地将其看作产生yy\\\\Vy序列RNN的额外输入。将', 'time': '2017-02-22T03:18'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '个人认为图中隐层的s(...)应改为h(...)', 'origin_text': 'res/conditional_rnn}}\\\\fi\\\\caption  !!!{将固定长度的向量$\\\\Vx$映射到序列$\\\\MY$上分布的RNN。这类RNN适用于很多任务如图注，其中单个图像作为模型的输入，然后产生描述图像的词序列。观察到的输出序列的每个元素$\\\\Vy^{(t)}$同时用作输入（对于当前时间步）和训练期间的目标（对于前一时间步）。}!!!  \\\\end{figure}\\\\begin{figure}[!htb]', 'time': '2017-02-22T03:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '是通过', 'origin_text': '每个隐藏单元向量h(t)h(t)\\\\Vh^{(t)}之间的相互作用  !!!通过!!!  新引入的权重矩阵RR\\\\MR参数化的，这是只包含yyy序列的模型所', 'time': '2017-02-22T03:27'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '加粗\\n', 'origin_text': '）。}\\\\end{figure}RNN可以接收向量序列  !!!x(t)!!!  x(t)\\\\Vx^{(t)}作为输入，而不是仅接收单个向量xx\\\\V', 'time': '2017-02-22T05:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '我们想依赖\\\\emph{整个输入序列}预测输出$y^{(t)}$', 'origin_text': '去的yy\\\\Vy值信息影响当前状态的模型。然而，在许多应用中，  !!!我们要输出的y(t)!!!  y(t)\\\\Vy^{(t)}的预测可能依赖于整个输入序列。例如，', 'time': '2017-02-24T13:31'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '常规RNN', 'origin_text': '定大小的窗口（这是前馈网络、卷积网络或具有固定大小的先行缓存器的  !!!RNN!!!  必须要做的）。\\\\begin{figure}[!htb]\\\\', 'time': '2017-02-24T13:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'RNNs\\n', 'origin_text': '这个想法可以自然扩展到2维输入，如图像，由\\\\emph{四个}  !!!RNN!!!  组成，每一个沿着四个方向中的一个计算：上、下、左、右。如果RN', 'time': '2017-02-24T13:31'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '但仍依赖长期的输入', 'origin_text': '出Oi,jOi,jO_{i,j}就能计算一个能捕捉到大多局部信息  !!!并且依赖于长期输入的表示!!!  。相比卷积网络，应用于图像的RNN通常更昂贵，但允许同一特征图', 'time': '2017-02-24T13:35'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '代价更大', 'origin_text': '且依赖于长期输入的表示。相比卷积网络，应用于图像的RNN通常更  !!!昂贵!!!  ，但允许同一特征图的特征之间存在长期横向的相互作用{cite?}', 'time': '2017-02-24T13:37'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '不足', 'origin_text': '制要求编码器与解码器的隐藏层具有相同的大小。此架构的一个明显  !!!限制!!!  是，编码器RNN输出的上下文CCC的维度太小而难以适当地概括一个', 'time': '2017-02-24T14:22'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '换行', 'origin_text': '，以及  从隐藏状态到输出。\\\\end{enumerate}  !!!根据\\\\fig?中的RNN架构!!!  ，这三个块都与单个权重矩阵相关联。换句话说，当网络被展开时，每', 'time': '2017-02-24T14:24'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': 'RNNs\\n', 'origin_text': '”混淆。}代表循环网络的另一个扩展，它被构造为深的树状结构而不是  !!!RNN!!!  的链状结构，因此是不同类型的计算图。递归网络的典型计算图如\\\\f', 'time': '2017-02-26T13:16'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '情况', 'origin_text': '中引入。根本问题是，经过许多阶段传播后的梯度倾向于消失（大部分  !!!时间!!!  ）或爆炸（很少，但对优化过程影响很大）。即使我们假设循环网络是', 'time': '2017-02-26T15:22'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '乘积$w^t$的消失还算激增是由$w$的幅值决定的', 'origin_text': '题是针对循环网络的。在标量情况下，想象多次乘一个权重www。  !!!根据w!!!  ww的幅值，该乘积wtwtw^t要么消失要么激增。然而，如果每', 'time': '2017-02-26T15:48'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '$v^*$', 'origin_text': '(vn)O(vn)\\\\CalO(v^n)。为了获得某些期望的方差  !!!$v^!!!  ，我们可以选择单个方差为，我们可以选择单个方差为，我们可以选择单', 'time': '2017-02-26T15:51'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '具有鲁棒性', 'origin_text': '爆炸的参数空间来避免这个问题。不幸的是，为了储存记忆并对小扰动  !!!的鲁棒!!!  ，RNN必须进入参数空间中的梯度消失区域{cite?}。具体来', 'time': '2017-02-26T15:54'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '通过SGD', 'origin_text': '们增加了需要捕获的依赖关系的跨度，基于梯度的优化变得越来越困难，  !!!SGD!!!  在长度仅为10或20的序列上成功训练传统RNN的概率迅速变为0。', 'time': '2017-02-26T15:59'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '在{Pascanu-et-al-ICML2013}中对{Doya93,Bengio1994ITNN,Siegelmann+Sontag-1995}的回顾', 'origin_text': 'N的概率迅速变为0。将循环网络作为动力系统更深入探讨的资料见  !!!{Doya93,Bengio1994ITNN,Siegelmann+Sontag-1995}及{Pascanu-et-al-ICML2013}的回顾!!!  。本章的其余部分将讨论目前已经提出的降低学习长期依赖（在某些情', 'time': '2017-02-26T16:02'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '这种想法可以分别称为回声状态网络或ESN{cite?}，以及流体状态机{cite?}。', 'origin_text': '其能很好地捕捉过去输入历史，并且\\\\emph{只学习输出权重}。  !!!回声状态网络或ESN{cite?}，以及流体状态机{cite?}分别独立地提出了这种想法!!!  。后者是类似的，只不过它使用脉冲神经元（二值输出）而不是ESN', 'time': '2017-02-26T23:53'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '所有矢量需要加粗\\n', 'origin_text': 't改变的简单情况。例如当网络是纯线性时，会发生这种情况。假设  !!!J!!!  J\\\\MJ特征值λλ\\\\lambda对应的特征向量为vv\\\\Vv。考', 'time': '2017-02-27T06:25'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '向后一步传播', 'origin_text': '或等价的，h(t+1)h(t+1)\\\\Vh^{(t+1)}的梯度如  !!!何向后传播!!!  。需要注意的是，WW\\\\MW和JJ\\\\MJ都不需要是对称的（尽管它', 'time': '2017-02-27T06:42'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '隐层到隐层', 'origin_text': 'ph{初始化}完全可训练的循环网络的权重（通过时间反向传播来训练  !!!隐藏到隐藏!!!  的循环权重），帮助学习长期依赖{cite?}。在这种设定下，结', 'time': '2017-02-27T07:40'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '消失或爆炸\\\\emph{与时间步数有关}', 'origin_text': '迟循环网络是可能的{cite?}。正如我们在\\\\sec?看到，  !!!梯度可能\\\\emph{关于时间步数数消失或成倍爆炸}!!!  。{cite?}引入了ddd延时的循环连接以减轻这个问题。现', 'time': '2017-02-27T07:54'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '因为', 'origin_text': '与τdτd\\\\frac{\\\\tau}{d}相关而不是ττ\\\\tau。  !!!既然!!!  同时存在延迟和单步连接，梯度仍可能成ttt指数爆炸。这允许学习', 'time': '2017-02-27T07:55'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '长短期记忆模型', 'origin_text': 'M引入自循环的巧妙构思，以产生梯度长时间持续流动的路径是初始  !!!长短期记忆!!!  的核心贡献{cite?}。其中一个关键扩展是使自循环的权重视上', 'time': '2017-03-01T02:56'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '在生成门控自循（由另一个隐藏单元控制）的权重时', 'origin_text': '扩展是使自循环的权重视上下文而定，而不是固定的{cite?}。  !!!门控此自循环（由另一个隐藏单元控制）的权重!!!  ，累积的时间尺度可以动态地改变。在这种情况下，即使是具有固定参', 'time': '2017-03-01T02:59'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '谨慎地', 'origin_text': 'mportance}发现使用较简单的方法可以达到类似的结果，例如  !!!细心!!!  初始化的Nesterov动量法。更详细的内容参考{Sutske', 'time': '2017-03-01T03:53'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '公布', 'origin_text': '学者提出{cite?}（相对于隐藏单元）截断反向传播梯度，但没有  !!!发布!!!  与这些变种之间的比较; 我们推测，所有这些方法表现类似。', 'time': '2017-03-01T05:34'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '尾部', 'origin_text': '正则化或约束参数，以引导”信息流”。特别是即使损失函数只对序列  !!!未部!!!  的输出作惩罚，我们也希望梯度向量∇h(t)L∇h(t)L\\\\nab', 'time': '2017-03-01T05:38'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '删除多余的逗号', 'origin_text': '\\\\nabla_{\\\\Vh^{(t)}} L在反向传播时能维持其幅度  !!!，!!!  。形式的，我们要使(∇h(t)L)∂h(t)∂h(t−1)(', 'time': '2017-03-01T05:38'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '形式上', 'origin_text': 'bla_{\\\\Vh^{(t)}} L在反向传播时能维持其幅度，。  !!!形式的!!!  ，我们要使(∇h(t)L)∂h(t)∂h(t−1)(∇h(t)', 'time': '2017-03-01T05:39'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '近似常数', 'origin_text': 't)L∇h(t)L\\\\nabla_{\\\\Vh^{(t)}} L考虑为  !!!近乎恒定的近似!!!  （为了计算正则化的目的，没有必要通过它们向后传播）。使用该正则', 'time': '2017-03-01T05:42'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '学习的成功性', 'origin_text': '持了爆炸梯度边缘的RNN动态。如果没有梯度截断，梯度爆炸将阻碍  !!!成功学习!!!  。这种方法的一个主要弱点是，在处理数据冗余的任务时如语言模型', 'time': '2017-03-01T05:45'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '存在着', 'origin_text': '识并且可以通过学习获取知识，这已促使大型深度架构的发展。然而，  !!!存在!!!  不同种类的知识。有些知识是隐含的、潜意识的并且难以用语言表达—', 'time': '2017-03-01T05:47'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:swordyork@hypothes.is', 'text': '网页没有显示加粗，PDF有。', 'time': '2017-03-04T03:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'pdf中都有加粗。多谢！', 'time': '2017-03-04T03:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这个我就先按照书中hidden-hidden来，因为这里不是层的概念，更应该指隐藏单元。所以直接译成隐藏。', 'time': '2017-03-04T03:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '先保持minibatch，之后再作考虑', 'time': '2017-03-04T03:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '先保持minibatch，之后再作考虑', 'time': '2017-03-04T03:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '中文中没有加s的习惯，所以我们这里不加s了。', 'time': '2017-03-04T02:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这里很关键，我看错了！', 'time': '2017-03-04T02:37'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们拿到最新版没有这句话。我记得以前有，我把它删了。', 'time': '2017-03-04T02:35'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'time step我们统一翻译成时间步。', 'time': '2017-03-04T02:30'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '摘要是可以的，跟文本摘要类似。非常感谢你的校对！', 'time': '2017-03-04T02:30'}"
  },
  {
    "path": "Chapter10/sequence_modeling_rnn.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Shenjian Zhao\n\\chapter{序列建模：循环和递归网络}\n\\label{chap:sequence_modeling_recurrent_and_recursive_nets}\n\\firstgls{RNN}或~\\glssymbol{RNN}~\\citep{RHW}是一类用于处理序列数据的\\gls{NN}。\n就像\\gls{convolutional_network}是专门用于处理网格化数据$\\TSX$（如一个图像）的\\gls{NN}，\\gls{RNN}是专门用于处理序列$\\Vx^{(1)}, \\dots, \\Vx^{(\\tau)}$的\\gls{NN}。\n正如\\gls{convolutional_network}可以很容易地扩展到具有很大宽度和高度的图像，以及处理大小可变的图像，\\gls{recurrent_network}可以扩展到更长的序列（比不基于序列的特化网络长得多）。\n大多数\\gls{recurrent_network}也能处理可变长度的序列。 \n\n从多层网络出发到\\gls{recurrent_network}，我们需要利用上世纪80年代\\gls{ML}和统计模型早期思想的优点：在模型的不同部分共享参数。\n\\gls{parameter_sharing}使得模型能够扩展到不同形式的样本（这里指不同长度的样本）并进行泛化。\n如果我们在每个时间点都有一个单独的参数，我们不但不能泛化到训练时没有见过序列长度，也不能在不同序列长度和不同时间位置上共享统计强度。\n当信息的特定部分会在序列内多个位置出现时，这样的共享尤为重要。\n例如，考虑这两句话：``I went to Nepal in 2009''和``In 2009, I went to Nepal.'' \n如果我们让一个\\gls{ML}模型读取这两个句子，并提取叙述者去\\ENNAME{Nepal}的年份，无论``2009年''是作为句子的第六个单词还是第二个单词出现，我们都希望模型能认出``2009年''为相关资料片段。\n假设我们要训练一个处理固定长度句子的\\gls{feedforward_network}。\n传统的全连接\\gls{feedforward_network}会给每个输入特征分配一个单独的参数，所以需要分别学习句子每个位置的所有语言规则。\n相比之下，\\gls{RNN}在几个\\gls{time_step}内共享相同的权重，不需要分别学习句子每个位置的所有语言规则。\n\n% -- 363 --\n\n一个相关的想法是在1维时间序列上使用卷积。\n这种卷积方法是\\gls{TDNNs}的基础\\citep{Lang+Hinton88,Waibel89b,lang1990time}。\n卷积操作允许网络跨时间共享参数，但这种共享是浅层的。\n卷积的输出是一个序列，其中输出中的每一项是相邻几项输入的函数。\n\\gls{parameter_sharing}的概念体现在每个\\gls{time_step}中使用的相同卷积核。\n\\gls{RNN}以不同的方式共享参数。\n输出的每一项是前一项的函数。\n输出的每一项通过对先前的输出应用相同的更新规则而产生。\n这种循环方式导致参数通过很深的\\gls{computational_graph}共享。\n\n为简单起见，我们说的~\\glssymbol{RNN}~是指在序列上的操作，并且该序列在时刻$t$（从1到$\\tau$）包含向量$\\Vx^{(t)}$。\n在实际情况中，\\gls{recurrent_network}通常在序列的\\gls{minibatch}上操作，并且\\gls{minibatch}的每项具有不同序列长度$\\tau$。\n我们省略了\\gls{minibatch}索引来简化记号。\n此外，\\gls{time_step}索引不必是字面上现实世界中流逝的时间。\n有时，它仅表示序列中的位置。\n\\glssymbol{RNN}~也可以应用于二维的空间数据（如图像）。\n甚至当应用于涉及时间的数据，该网络也可具有时间上朝向过去方向的连接，前提是整个序列在提供给网络之前就已经被完整地观察到。\n\n\n本章将\\gls{computational_graph}的思想扩展到包括循环。\n这些周期代表变量自身的值在未来某一\\gls{time_step}对自身值的影响。\n这样的\\gls{computational_graph}允许我们定义\\gls{RNN}。\n然后，我们描述许多构建、训练和使用\\gls{RNN}的不同方式。\n\n本章将简要介绍\\gls{RNN}，为获取更多详细信息，我们建议读者参考~\\cite{Graves-book2012}的著作。\n\n% -- 364 --\n\n\\section{\\glsentrytext{unfolding}\\glsentrytext{computational_graph}}\n\\label{sec:unfolding_computational_graphs}\n\\gls{computational_graph}是形式化一组计算结构的方式，如那些涉及将输入和参数映射到输出和损失的计算。\n综合的介绍请参考\\secref{sec:computational_graphs}。\n本节，我们对\\firstgls{unfolding}递归或循环计算得到的重复结构进行解释，这些重复结构通常对应于一个事件链。\n\\firstgls{unfolding}这个计算图将导致深度网络结构中的\\gls{parameter_sharing}。\n\n例如，考虑动态系统的经典形式：\n\\begin{align}\n\\label{eq:101s}\n\\Vs^{(t)} = f(\\Vs^{(t-1)}; \\Vtheta),\n\\end{align}\n其中$ \\Vs^{(t)}$称为系统的状态。\n\n$\\Vs$在时刻$t$的定义需要参考时刻$t-1$时同样的定义，因此\\eqnref{eq:101s}是循环的。\n\n对有限\\gls{time_step}~$\\tau$， $\\tau-1$次应用这个定义可以展开这个图。\n例如$\\tau = 3$，我们对\\eqnref{eq:101s}展开，可以得到：\n\\begin{align}\n \\Vs^{(3)} &= f(\\Vs^{(2)}; \\Vtheta) \\\\\n & = f(f(\\Vs^{(1)}; \\Vtheta) ; \\Vtheta).\n  \\label{eq:103s}\n\\end{align}\n\n以这种方式重复应用定义，\\gls{unfolding}等式，就能得到不涉及循环的表达。\n现在我们可以使用传统的有向无环\\gls{computational_graph}呈现这样的表达。\n\n\\eqnref{eq:101s}和\\eqnref{eq:103s}的\\gls{unfolding}\\gls{computational_graph}如\\figref{fig:chap10_unfolded_dynsys}所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/unfolded_dynsys}}\n\\fi\n\\caption{将\\eqnref{eq:101s}描述的经典动态系统表示为展开的计算图。\n每个节点表示在某个时刻$t$的状态，并且函数$f$将$t$处的状态映射到$t+1$处的状态。\n所有\\gls{time_step}都使用相同的参数（用于参数化$f$的相同$\\Vtheta$值）。\n}\n\\label{fig:chap10_unfolded_dynsys}\n\\end{figure}\n\n% -- 365 --\n\n作为另一个例子，让我们考虑由外部信号$\\Vx^{(t)}$驱动的动态系统，\n\\begin{align}\n \\label{eq:104s}\n \\Vs^{(t)} = f(\\Vs^{(t-1)}, \\Vx^{(t)} ; \\Vtheta),\n\\end{align}\n我们可以看到，当前状态包含了整个过去序列的信息。\n\n\\gls{RNN}可以通过许多不同的方式建立。\n就像几乎所有函数都可以被认为是\\gls{feedforward_network}，本质上任何涉及循环的函数都可以被认为是一个\\gls{RNN}。\n\n很多\\gls{RNN}使用\\eqnref{eq:105h}或类似的公式定义\\gls{hidden_unit}的值。\n为了表明状态是网络的\\gls{hidden_unit}，我们使用变量$\\Vh$代表状态重写\\eqnref{eq:104s}：\n\\begin{align}\n \\label{eq:105h}\n \\Vh^{(t)} = f(\\Vh^{(t-1)}, \\Vx^{(t)} ; \\Vtheta),\n\\end{align}\n如\\figref{fig:chap10_rnn_circuit_unfolded}所示，典型~\\glssymbol{RNN}~会增加额外的架构特性，如读取状态信息$\\Vh$进行预测的输出层。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/rnn_circuit_unfolded}}\n\\fi\n\\caption{没有输出的\\gls{recurrent_network}。\n此\\gls{recurrent_network}只处理来自输入$\\Vx$的信息，将其合并到经过时间向前传播的状态$\\Vh$。\n\\emph{(左)}回路原理图。 黑色方块表示单个\\gls{time_step}的延迟。\n\\emph{(右)}同一网络被视为展开的计算图，其中每个节点现在与一个特定的时间实例相关联。\n}\n\\label{fig:chap10_rnn_circuit_unfolded}\n\\end{figure}\n\n当训练\\gls{recurrent_network}根据过去预测未来时，网络通常要学会使用$\\Vh^{(t)}$作为过去序列（直到$t$）与任务相关方面的有损摘要。\n此摘要一般而言一定是有损的，因为其映射任意长度的序列$(\\Vx^{(t)},\\Vx^{(t-1)}, \\Vx^{(t-2)},\\dots,\\Vx^{(2)}, \\Vx^{(1)})$到一固定长度的向量$\\Vh^{(t)}$。\n根据不同的训练\\gls{criterion}，摘要可能选择性地精确保留过去序列的某些方面。\n例如，如果在统计语言建模中使用的~\\glssymbol{RNN}，通常给定前一个词预测下一个词，可能没有必要存储时刻$t$前输入序列中的所有信息；而仅仅存储足够预测句子其余部分的信息。\n最苛刻的情况是我们要求$\\Vh^{(t)}$足够丰富，并能大致恢复输入序列，如\\gls{AE}框架（\\chapref{chap:autoencoders}）。\n\n% -- 366 --\n\n\\eqnref{eq:105h}可以用两种不同的方式来绘制。\n一种绘制~\\glssymbol{RNN}~的方式是用循环图，对于可能存在于模型的物理实现中的每个组件，都在图中包含其对应的节点。这种方式的一个示例是生物神经网络。\n在这种视角下，网络定义了实时操作的回路，如\\figref{fig:chap10_rnn_circuit_unfolded}的左侧，其当前状态可以影响其未来的状态。\n在本章中，我们使用回路图中的黑色方块表示单个\\gls{time_step}延时所发生的交互，即从时刻$t$的状态到时刻$t+1$的状态的变化。\n另一种绘制~\\glssymbol{RNN}~的方式是用展开的\\gls{computational_graph}，其中每一个组件由许多不同的变量表示，每个\\gls{time_step}一个变量，用来表示组件在该时间点的状态。\n每个\\gls{time_step}的每个变量绘制为\\gls{computational_graph}的一个独立节点，如\\figref{fig:chap10_rnn_circuit_unfolded}的右侧。\n我们所说的\\gls{unfolding}是将左图中的回路映射为右图中包含重复组件的\\gls{computational_graph}的操作。\n这样，\\gls{unfolded_graph}的大小取决于序列长度。\n\n我们可以用一个函数$g^{(t)}$代表经$t$步展开后的循环：\n\\begin{align}\n\\label{eq:106}\n  \\Vh^{(t)} &=g^{(t)}(\\Vx^{(t)},\\Vx^{(t-1)}, \\Vx^{(t-2)},\\dots,\\Vx^{(2)}, \\Vx^{(1)}) \\\\\n  & =  f(\\Vh^{(t-1)}, \\Vx^{(t)} ; \\Vtheta) .\n\\end{align}\n函数$g^{(t)}$将全部的过去序列$(\\Vx^{(t)},\\Vx^{(t-1)}, \\Vx^{(t-2)},\\dots,\\Vx^{(2)}, \\Vx^{(1)})$作为输入来生成当前状态，但是展开的循环架构允许我们将$g^{(t)}$分解为函数$f$的重复应用。\n因此，展开过程引入两个主要优点：\n\\begin{enumerate}\n \\item 无论序列的长度，学成的模型始终具有相同的输入大小，因为它指定的是从一种状态到另一种状态的\\gls{transition}， 而不是在可变长度的历史状态上操作。\n \\item 我们可以在每个\\gls{time_step}使用相同参数的\\emph{相同}\\gls{transition}函数$f$。\n\\end{enumerate}\n这两个因素使得学习在所有\\gls{time_step}和所有序列长度上操作单一的模型$f$是可能的，而不需要在所有可能\\gls{time_step}学习独立的模型$g^{(t)}$。\n学习单一的共享模型允许泛化到没有见过的序列长度（没有出现在训练集中），并且估计模型所需的训练样本远远少于不带\\gls{parameter_sharing}的模型。\n\n% -- 367 --\n\n无论是循环图和\\gls{unfolded_graph}都有其用途。\n循环图简洁。\n\\gls{unfolded_graph}能够明确描述其中的计算流程。\n\\gls{unfolded_graph}还通过显式的信息流动路径帮助说明信息在时间上向前（计算输出和损失）和向后（计算\\gls{gradient}）的思想。\n\n\\section{\\glsentrytext{RNN}}\n\\label{sec:recurrent_neural_networks}\n基于\\secref{sec:unfolding_computational_graphs}中的图展开和\\gls{parameter_sharing}的思想，我们可以设计各种\\gls{RNN}。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/hidden_recurrence_rnn}}\n\\fi\n\\caption{计算\\gls{recurrent_network}(将$\\Vx$值的输入序列映射到输出值$\\Vo$的对应序列)训练损失的计算图。\n损失$L$衡量每个$\\Vo$与相应的训练目标$\\Vy$的距离。\n当使用softmax输出时，我们假设$\\Vo$是未归一化的对数概率。\n损失$L$内部计算$\\hat{\\Vy} = \\text{softmax}(\\Vo)$，并将其与目标$\\Vy$比较。\n\\glssymbol{RNN}输入到隐藏的连接由权重矩阵$\\MU$参数化，隐藏到隐藏的循环连接由权重矩阵$\\MW$参数化以及隐藏到输出的连接由权重矩阵$\\MV$参数化。\n\\eqnref{eq:108a}定义了该模型中的前向传播。\n\\emph{(左)}使用循环连接绘制的~\\glssymbol{RNN}~和它的损失。\n\\emph{(右)}同一网络被视为展开的计算图，其中每个节点现在与一个特定的时间实例相关联。\n}\n\\label{fig:chap10_hidden_recurrence_rnn}\n\\end{figure}\n\n\\gls{RNN}中一些重要的设计模式包括以下几种：\n\\begin{enumerate}\n \\item 每个\\gls{time_step}都有输出，并且\\gls{hidden_unit}之间有循环连接的\\gls{recurrent_network}，如\\figref{fig:chap10_hidden_recurrence_rnn}所示。\n \\item 每个\\gls{time_step}都产生一个输出，只有当前时刻的输出到下个时刻的\\gls{hidden_unit}之间有循环连接的\\gls{recurrent_network}，如\\figref{fig:chap10_output_recurrence_rnn}所示。\n \\item \\gls{hidden_unit}之间存在循环连接，但读取整个序列后产生单个输出的\\gls{recurrent_network}，如\\figref{fig:chap10_single_output_rnn}所示。\n\\end{enumerate}\n\\figref{fig:chap10_hidden_recurrence_rnn}是非常具有代表性的例子，我们将会在本章大部分涉及这个例子。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/output_recurrence_rnn}}\n\\fi\n\\caption{此类~\\glssymbol{RNN}~的唯一循环是从输出到隐藏层的反馈连接。\n在每个\\gls{time_step}~$t$，输入为$\\Vx_t$，\\gls{hidden_layer}激活为$\\Vh^{(t)}$，输出为$\\Vo^{(t)}$，目标为$\\Vy^{(t)}$，损失为$L^{(t)}$。\n\\emph{(左)}回路原理图。\n\\emph{(右)}展开的计算图。\n这样的~\\glssymbol{RNN}~没有\\figref{fig:chap10_hidden_recurrence_rnn}表示的RNN那样强大（只能表示更小的函数集合）。\n\\figref{fig:chap10_hidden_recurrence_rnn}中的~\\glssymbol{RNN}~可以选择将其想要的关于过去的任何信息放入隐藏表示$\\Vh$中并且将$\\Vh$传播到未来。\n该图中的~\\glssymbol{RNN}~被训练为将特定输出值放入$\\Vo$中，并且$\\Vo$是允许传播到未来的唯一信息。\n此处没有从$\\Vh$前向传播的直接连接。\n之前的$\\Vh$仅通过产生的预测间接地连接到当前。\n$\\Vo$通常缺乏过去的重要信息，除非它非常高维且内容丰富。\n这使得该图中的~\\glssymbol{RNN}~不那么强大，但是它更容易训练，因为每个\\gls{time_step}可以与其他\\gls{time_step}分离训练，允许训练期间更多的并行化，如\\secref{sec:teacher_forcing_and_networks_with_output_recurrence}所述。\n}\n\\label{fig:chap10_output_recurrence_rnn}\n\\end{figure}\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/single_output_rnn}}\n\\fi\n\\caption{关于时间展开的\\gls{RNN}，在序列结束时具有单个输出。\n这样的网络可以用于概括序列并产生用于进一步处理的固定大小的表示。\n在结束处可能存在目标（如此处所示），或者通过更下游模块的反向传播来获得输出$\\Vo^{(t)}$上的梯度。\n}\n\\label{fig:chap10_single_output_rnn}\n\\end{figure}\n\n任何图灵可计算的函数都可以通过这样一个有限维的\\gls{recurrent_network}计算，在这个意义上\\figref{fig:chap10_hidden_recurrence_rnn}和\\eqnref{eq:108a}的\\gls{RNN}是万能的。\n\\glssymbol{RNN}~经过若干\\gls{time_step}后读取输出，这与由图灵机所用的\\gls{time_step}是渐近线性的，与输入长度也是渐近线性的\\citep{Siegelmann+Sontag-1991,Siegelmann-1995,Siegelmann+Sontag-1995,Hyotyniemi-1996}。\n由图灵机计算的函数是离散的，所以这些结果都是函数的具体实现，而不是近似。\n\\glssymbol{RNN}~作为图灵机使用时，需要一个二进制序列作为输入，其输出必须离散化以提供二进制输出。\n利用单个有限大小的特定~\\glssymbol{RNN}~计算在此设置下的所有函数是可能的（~\\cite{Siegelmann+Sontag-1995}用了886个单元）。\n图灵机的``输入''是要计算函数的详细说明(specification)，所以模拟此图灵机的相同网络足以应付所有问题。\n用于证明的理论~\\glssymbol{RNN}~可以通过激活和权重（由无限精度的有理数表示）来模拟无限堆栈。\n\n% -- 368 --\n\n现在我们研究\\figref{fig:chap10_hidden_recurrence_rnn}中~\\glssymbol{RNN}~的\\gls{forward_propagation}公式。\n这个图没有指定\\gls{hidden_unit}的激活函数。\n我们假设使用双曲正切激活函数。\n此外，图中没有明确指定何种形式的输出和\\gls{loss_function}。\n我们假定输出是离散的，如用于预测词或字符的~\\glssymbol{RNN}。\n表示离散变量的常规方式是把输出$\\Vo$作为每个离散变量可能值的非标准化对数概率。\n然后，我们可以应用~\\gls{softmax}~后续处理后，获得标准化后概率的输出向量$\\hat \\Vy$。\n\\glssymbol{RNN}~从特定的初始状态$\\Vh^{(0)}$开始\\gls{forward_propagation}。\n从$t= 1$到$t = \\tau$的每个\\gls{time_step}，我们应用以下更新方程：\n\\begin{align}\n\\label{eq:108a}\n \\Va^{(t)} &= \\Vb + \\MW \\Vh^{(t-1)} + \\MU \\Vx^{(t)}, \\\\\n  \\Vh^{(t)} &= \\tanh(\\Va^{(t)} ), \\\\\n  \\Vo^{(t)} &= \\Vc + \\MV \\Vh^{(t)}, \\\\\n  \\hat \\Vy^{(t)} &= \\text{softmax}(\\Vo^{(t)}),\n\\end{align}\n其中的参数的\\gls{bias_aff}向量$\\Vb$和$\\Vc$连同权重矩阵$\\MU$、$\\MV$和$\\MW$，分别对应于输入到隐藏、隐藏到输出和隐藏到隐藏的连接。\n这个\\gls{recurrent_network}将一个输入序列映射到相同长度的输出序列。\n与$\\Vx$序列配对的$\\Vy$的总损失就是所有\\gls{time_step}的损失之和。\n例如，$L^{(t)}$为给定的$\\Vx^{(1)}, \\dots, \\Vx^{(t)}$后$\\Vy^{(t)}$的负对数似然，则\n\\begin{align} \\label{eq:1012L}\n & L\\big( \\{ \\Vx^{(1)}, \\dots, \\Vx^{(\\tau)} \\}, \\{ \\Vy^{(1)}, \\dots, \\Vy^{(\\tau)}  \\} \\big) \\\\\n & = \\sum_t L^{(t)} \\\\\n & = - \\sum_t \\log p_{\\text{model}} \\big(  y^{(t)} \\mid  \\{ \\Vx^{(1)}, \\dots, \\Vx^{(t)} \\} \\big) ,\n\\end{align}\n其中$p_{\\text{model}} \\big(  y^{(t)} \\mid  \\{ \\Vx^{(1)}, \\dots, \\Vx^{(t)} \\} \\big) $需要读取模型输出向量$\\hat \\Vy^{(t)}$中对应于$y^{(t)}$的项。\n关于各个参数计算这个\\gls{loss_function}的\\gls{gradient}是计算成本很高的操作。\n\\gls{gradient}计算涉及执行一次\\gls{forward_propagation}（如在\\figref{fig:chap10_hidden_recurrence_rnn}\\gls{unfolded_graph}中从左到右的传播），接着是由右到左的\\gls{backward_propagation}。\n运行时间是$\\CalO(\\tau)$，并且不能通过并行化来降低，因为\\gls{forward_propagation}图是固有循序的;每个\\gls{time_step}只能一前一后地计算。\n\\gls{forward_propagation}中的各个状态必须保存，直到它们\\gls{backward_propagation}中被再次使用，因此内存代价也是$\\CalO(\\tau)$。\n应用于\\gls{unfolded_graph}且代价为$\\CalO(\\tau)$的\\gls{backward_propagation}算法称为\\firstall{BPTT}，将在\\secref{sec:computing_the_gradient_in_a_recurrent_neural_network}进一步讨论。\n因此\\gls{hidden_unit}之间存在循环的网络非常强大但训练代价也很大。\n我们是否有其他选择呢？\n\n% -- 371 --\n\n\\subsection{\\glsentrytext{teacher_forcing}和输出\\glsentrytext{recurrent_network}}\n\\label{sec:teacher_forcing_and_networks_with_output_recurrence}\n仅在一个\\gls{time_step}的输出和下一个\\gls{time_step}的\\gls{hidden_unit}间存在循环连接的网络（示于\\figref{fig:chap10_output_recurrence_rnn}）确实没有那么强大（因为缺乏隐藏到隐藏的循环连接）。\n例如，它不能模拟通用图灵机。\n因为这个网络缺少隐藏到隐藏的循环，它要求输出单元捕捉用于预测未来的关于过去的所有信息。\n因为输出单元明确地训练成匹配训练集的目标，它们不太能捕获关于过去输入历史的必要信息，除非用户知道如何描述系统的全部状态，并将它作为训练目标的一部分。\n消除隐藏到隐藏循环的优点在于，任何基于比较时刻$t$的预测和时刻$t$的训练目标的\\gls{loss_function}中的所有\\gls{time_step}都解耦了。\n因此训练可以并行化，即在各时刻$t$分别计算\\gls{gradient}。\n没有必要先计算前一时刻的输出，因为训练集提供了前一时刻输出的理想值。\n\n由输出反馈到模型而产生循环连接的模型可用\\firstgls{teacher_forcing}进行训练。\n\\gls{teacher_forcing}是从最大似然\\gls{criterion}派生出来的一个训练过程，训练模型时，在时刻$t+1$接收真实值$y^{(t)}$作为输入。\n我们可以通过检查两个\\gls{time_step}的序列看清楚这一点。\n条件最大似然\\gls{criterion}是\n\\begin{align}\n &\\log p(\\Vy^{(1)},\\Vy^{(2)} \\mid \\Vx^{(1)}, \\Vx^{(2)} ) \\\\\n &= \\log  p(\\Vy^{(2)} \\mid \\Vy^{(1)}, \\Vx^{(1)}, \\Vx^{(2)} )  + \\log p(\\Vy^{(1)} \\mid \\Vx^{(1)}, \\Vx^{(2)}) .\n\\end{align}\n\n% -- 372 --\n\n在这个例子中，\\emph{同时}给定迄今为止的$\\Vx$序列和来自训练集的前一$\\Vy$值，我们可以看到在时刻$t=2$时，模型被训练为最大化$\\Vy^{(2)}$的条件概率。\n因此最大似然在训练时指定使用正确的目标值作为反馈，而不是将自己的输出反馈到模型。\n如\\figref{fig:chap10_teacher_forcing}所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/teacher_forcing}}\n\\fi\n\\caption{\\gls{teacher_forcing}的示意图。\n\\gls{teacher_forcing}是一种训练技术，适用于输出与下一\\gls{time_step}的隐藏状态存在连接的~\\glssymbol{RNN}。\n\\emph{(左)}训练时，我们将训练集中\\emph{正确}的输出$\\Vy^{(t)}$反馈到$\\Vh^{(t+1)}$。\n\\emph{(右)}当模型部署后，真正的输出通常是未知的。\n在这种情况下，我们用模型的输出$\\Vo^{(t)}$近似正确的输出$\\Vy^{(t)}$，并反馈回模型。\n}\n\\label{fig:chap10_teacher_forcing}\n\\end{figure}\n\n我们使用\\gls{teacher_forcing}的最初动机是为了在缺乏隐藏到隐藏连接的模型中避免\\gls{BPTT}。\n对于那些存在隐藏到隐藏连接的模型，只要模型一个\\gls{time_step}的输出与下一\\gls{time_step}计算的值存在连接，\\gls{teacher_forcing}仍然可以适用。\n只不过，只要\\gls{hidden_unit}成为较早\\gls{time_step}的函数，\\glssymbol{BPTT}~算法就是必要的。\n因此训练某些模型时可能要同时使用\\gls{teacher_forcing}和~\\glssymbol{BPTT}。\n\n% -- 373 --\n\n如果之后网络在\\textbf{开环}(open-loop)模式下使用，即网络输出（或输出分布的样本）反馈作为输入，那么完全使用\\gls{teacher_forcing}进行训练的缺点就会出现。\n在这种情况下，训练期间该网络看到的输入与测试时看到的会有很大的不同。\n减轻此问题的一种方法是同时使用\\gls{teacher_forcing}和自由运行的输入进行训练，例如在展开循环的输出到输入路径上预测若干个步骤之后的正确目标值。\n通过这种方式，网络可以学会考虑在训练时没有接触到的输入条件（如自由运行模式下，自身生成自身），以及将状态映射回使网络几步之后生成正确输出的状态。\n另外一种方式\\citep{SamyBengio-et-al-arxiv2015}是通过随机选择生成值或真实的数据值作为输入以减小训练时和测试时看到的输入之间的差别。\n这种方法利用了\\gls{curriculum_learning}策略，逐步使用更多生成值作为输入。\n\n\\subsection{计算\\glsentrytext{RNN}的\\glsentrytext{gradient}}\n\\label{sec:computing_the_gradient_in_a_recurrent_neural_network}\n计算\\gls{RNN}的\\gls{gradient}是容易的。\n我们可以简单地将\\secref{sec:general_back_propagation}中的推广\\gls{backward_propagation}算法应用于展开的\\gls{computational_graph}，而不需要特殊化的算法。\n由\\gls{backward_propagation}计算得到的\\gls{gradient}，并结合任何通用的基于\\gls{gradient}的技术就可以训练~\\glssymbol{RNN}。\n\n为了获得~\\glssymbol{BPTT}~算法行为的一些直观理解，我们举例说明如何通过~\\glssymbol{BPTT}~计算上述\\glssymbol{RNN}公式（\\eqnref{eq:108a}和\\eqnref{eq:1012L}）的\\gls{gradient}。\n\\gls{computational_graph}的节点包括参数$\\MU,\\MV,\\MW, \\Vb$和$\\Vc$，以及以$t$为索引的节点序列$\\Vx^{(t)}, \\Vh^{(t)},\\Vo^{(t)}$和$L^{(t)}$。\n对于每一个节点$\\TSN$，我们需要基于$\\TSN$后面的节点的\\gls{gradient}，递归地计算\\gls{gradient}~$\\nabla_{\\TSN} L$。\n我们从紧接着最终损失的节点开始递归：\n\\begin{align}\n \\frac{\\partial L}{\\partial L^{(t)}} = 1.\n\\end{align}\n在这个导数中，我们假设输出$\\Vo^{(t)}$作为~\\gls{softmax}~的参数，我们可以从~\\gls{softmax}可以获得关于输出概率的向量$\\hat{\\Vy}$。\n我们也假设损失是迄今为止给定了输入后的真实目标$y^{(t)}$的负对数似然。\n对于所有$i,t$，关于\\gls{time_step}~$t$输出的\\gls{gradient}~$\\nabla_{\\Vo^{(t)}} L$如下：\n\\begin{align}\n (\\nabla_{\\Vo^{(t)}} L)_i =  \\frac{\\partial L}{\\partial o_i^{(t)}} \n =  \\frac{\\partial L}{\\partial L^{(t)}}  \\frac{\\partial L^{(t)}}{\\partial o_i^{(t)}}  \n = \\hat y_i^{(t)} - \\mathbf{1}_{i,y^{(t)}}.\n\\end{align}\n我们从序列的末尾开始，反向进行计算。\n在最后的\\gls{time_step}~$\\tau$, $\\Vh^{(\\tau)}$只有$\\Vo^{(\\tau)}$作为后续节点，因此这个\\gls{gradient}很简单：\n\\begin{align}\n \\nabla_{\\Vh^{(\\tau)}} L = \\MV^\\top \\nabla_{\\Vo^{(\\tau)}} L.\n\\end{align}\n然后，我们可以从时刻$t=\\tau-1$到$t=1$反向迭代， 通过时间\\gls{backward_propagation}\\gls{gradient}，注意$\\Vh^{(t)}(t < \\tau)$同时具有$\\Vo^{(t)}$和$\\Vh^{(t+1)}$两个后续节点。\n因此，它的\\gls{gradient}由下式计算\n\\begin{align}\n  \\nabla_{\\Vh^{(t)}} L = \\Big( \\frac{\\partial \\Vh^{(t+1)}}{ \\partial \\Vh^{(t)}}  \\Big)^\\top(\\nabla_{\\Vh^{(t+1)}} L) \n  + \\Big( \\frac{\\partial \\Vo^{(t)}}{ \\partial \\Vh^{(t)}}  \\Big)^\\top (\\nabla_{\\Vo^{(t)}} L) \\\\\n  = \\MW^\\top (\\nabla_{\\Vh^{(t+1)}} L) \\text{diag} \\Big( 1 - (\\Vh^{(t+1)})^2 \\Big) \n    + \\MV^\\top ( \\nabla_{\\Vo^{(t)}} L ),\n\\end{align}\n其中$\\text{diag} \\Big( 1 - (\\Vh^{(t+1)})^2 \\Big) $ 表示包含元素$1 - (h_i^{(t+1)})^2$的对角矩阵。\n这是关于时刻$t+1$与\\gls{hidden_unit}~$i$关联的双曲正切的\\gls{jacobian}。\n\n% -- 374 --\n\n一旦获得了\\gls{computational_graph}内部节点的\\gls{gradient}，我们就可以得到关于参数节点的\\gls{gradient}。\n因为参数在许多\\gls{time_step}共享，我们必须在表示这些变量的微积分操作时谨慎对待。\n我们希望实现的等式使用\\secref{sec:general_back_propagation}中的{\\tt bprop}方法计算\\gls{computational_graph}中单一边对\\gls{gradient}的贡献。\n然而微积分中的$\\nabla_{\\MW} f$算子，计算$\\MW$对于$f$的贡献时将\\gls{computational_graph}中的\\emph{所有}边都考虑进去了。\n为了消除这种歧义，我们定义只在$t$时刻使用的虚拟变量$\\MW^{(t)}$作为$\\MW$的副本。\n然后，我们可以使用$\\nabla_{\\MW^{(t)}}$表示权重在\\gls{time_step}~$t$对\\gls{gradient}的贡献。\n\n使用这个表示，关于剩下参数的\\gls{gradient}可以由下式给出：\n\\begin{align}\n \\nabla_{\\Vc} L &=  \\sum_t \\Big( \\frac{\\partial \\Vo^{(t)}}{\\partial \\Vc} \\Big)^\\top \\nabla_{\\Vo^{(t)}} L \n = \\sum_t \\nabla_{\\Vo^{(t)}} L ,\\\\\n \\nabla_{\\Vb} L &= \\sum_t \\Big( \\frac{\\partial \\Vh^{(t)}}{\\partial \\Vb^{(t)}} \\Big)^\\top \\nabla_{\\Vh^{(t)}} L \n = \\sum_t \\text{diag} \\Big( 1 - \\big( \\Vh^{(t)} \\big)^2 \\Big)  \\nabla_{\\Vh^{(t)}} L  ,\\\\\n \\nabla_{\\MV} L &= \\sum_t \\sum_i \\Big( \\frac{\\partial L} {\\partial o_i^{(t)}}\\Big) \\nabla_{\\MV} o_i^{(t)} \n = \\sum_t (\\nabla_{\\Vo^{(t)}} L) \\Vh^{(t)^\\top},\\\\\n \\nabla_{\\MW} L &= \\sum_t \\sum_i \\Big( \\frac{\\partial L} {\\partial h_i^{(t)}}\\Big) \n \\nabla_{\\MW^{(t)}} h_i^{(t)} \\\\\n&= \\sum_t \\text{diag} \\Big( 1 - \\big( \\Vh^{(t)} \\big)^2 \\Big) ( \\nabla_{\\Vh^{(t)}} L) \\Vh^{(t-1)^\\top} ,\\\\\n \\nabla_{\\MU} L &= \\sum_t \\sum_i \\Big( \\frac{\\partial L} {\\partial h_i^{(t)}}\\Big) \n \\nabla_{\\MU^{(t)}} h_i^{(t)} \\\\\n&= \\sum_t \\text{diag} \\Big( 1 - \\big( \\Vh^{(t)} \\big)^2 \\Big) ( \\nabla_{\\Vh^{(t)}} L) \\Vx^{(t)^\\top} ,\n\\end{align}\n因为\\gls{computational_graph}中定义的损失的任何参数都不是训练数据$\\Vx^{(t)}$的父节点，所以我们不需要计算关于它的\\gls{gradient}。\n\n% -- 375 --\n\n\\subsection{作为\\glsentrytext{directed_graphical_model}的\\glsentrytext{recurrent_network}}\n\\label{sec:recurrent_networks_as_directed_graphical_models}\n目前为止，我们接触的\\gls{recurrent_network}例子中损失$L^{(t)}$是训练目标$\\Vy^{(t)}$和输出$\\Vo^{(t)}$之间的\\gls{cross_entropy}。\n与\\gls{feedforward_network}类似，原则上\\gls{recurrent_network}几乎可以使用任何损失。\n但必须根据任务来选择损失。\n如\\gls{feedforward_network}，我们通常希望将~\\glssymbol{RNN}~的输出解释为一个概率分布，并且我们通常使用与分布相关联的\\gls{cross_entropy}来定义损失。\n均方误差是与单位高斯分布的输出相关联的\\gls{cross_entropy}损失，例如\\gls{feedforward_network}中所使用的。\n\n当我们使用一个预测性对数似然的训练目标，如\\eqnref{eq:1012L}，我们将~\\glssymbol{RNN}~训练为能够根据之前的输入估计下一个序列元素$\\Vy^{(t)}$的条件分布。\n这可能意味着，我们最大化对数似然\n\\begin{align}\n \\log p(\\Vy^{(t)} \\mid \\Vx^{(1)},\\dots, \\Vx^{(t)}),\n\\end{align}\n或者，如果模型包括来自一个\\gls{time_step}的输出到下一个\\gls{time_step}的连接，\n\\begin{align}\n \\log p(\\Vy^{(t)} \\mid \\Vx^{(1)},\\dots, \\Vx^{(t)},\\Vy^{(1)},\\dots, \\Vy^{(t-1)} ).\n\\end{align}\n将整个序列$\\Vy$的联合分布分解为一系列单步的概率预测是捕获关于整个序列完整联合分布的一种方法。\n当我们不把过去的$\\Vy$值反馈给下一步作为预测的条件时，那么\\gls{directed_graphical_model}不包含任何从过去$\\Vy^{(i)}$到当前$\\Vy^{(t)}$的边。\n在这种情况下，给定x序列后，输出的y值之间条件独立。%在这种情况下，输出$\\Vy$与给定的$\\Vx$序列是条件独立的。% \n当我们反馈真实的$\\Vy$值（不是它们的预测值，而是真正观测到或生成的值）给网络时，那么\\gls{directed_graphical_model}包含所有从过去$\\Vy^{(i)}$到当前$\\Vy^{(t)}$的边。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/fully_connected_chain}}\n\\fi\n\\caption{序列$y^{(1)},y^{(2)},\\dots,y^{(t)},\\dots$的全连接\\gls{graphical_model}。\n给定先前的值，每个过去的观察值$y^{(i)}$可以影响一些$y^{(t)}$($t>i$)的条件分布。\n当序列中每个元素的输入和参数的数目越来越多，根据此图直接参数化\\gls{graphical_model}（如\\eqnref{eq:106}中）可能是非常低效的。\n\\glssymbol{RNN}~可以通过高效的参数化获得相同的全连接，如\\figref{fig:chap10_rnn_graphical_model_with_state}所示。\n}\n\\label{fig:chap10_fully_connected_chain}\n\\end{figure}\n\n% -- 376 --\n\n举一个简单的例子，让我们考虑对标量随机变量序列$ \\SetY = \\{\\RSy^{(1)},\\dots,\\RSy^{(\\tau)}\\}$建模的~\\glssymbol{RNN}，也没有额外的输入$\\RSx$。\n在\\gls{time_step}~$t$的输入仅仅是\\gls{time_step}~$t-1$的输出。\n该~\\glssymbol{RNN}~定义了关于$\\RSy$变量的\\gls{directed_graphical_model}。\n我们使用链式法则（用于条件概率的\\eqnref{eq:chap3_chain_rule}）参数化这些观察值的联合分布：\n\\begin{align}\n P(\\SetY) = P(\\RVy^{(1)},\\dots,\\RVy^{(\\tau)}) = \\prod_{t=1}^{\\tau}P(\\RVy^{(t)} \\mid \\RVy^{(t-1)},\\RVy^{(t-2)},\n \\dots,\\RVy^{(1)}),\n\\end{align}\n其中当$t=1$时竖杠右侧显然为空。\n因此，根据这样一个模型，一组值$\\{y^{(1)},\\dots,y^{(\\tau)} \\}$的负对数似然为\n\\begin{align}\n L = \\sum_{t} L^{(t)},\n\\end{align}\n其中\n\\begin{align}\n L^{(t)} = -\\log P(\\RSy^{(t)} = y^{(t)} \\mid y^{(t-1)},y^{(t-2)}, \\dots, y^{(1)}).\n\\end{align}\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/rnn_graphical_model_with_state}}\n\\fi\n\\caption{在~\\glssymbol{RNN}~\\gls{graphical_model}中引入状态变量，尽管它是输入的确定性函数，但它有助于我们根据\\eqnref{eq:105h}获得非常高效的参数化。\n序列中的每个阶段（对于$\\Vh^{(t)}$和$\\Vy^{(t)}$）使用相同的结构（每个节点具有相同数量的输入），并且可以与其他阶段共享相同的参数。\n}\n\\label{fig:chap10_rnn_graphical_model_with_state}\n\\end{figure}\n\n\\gls{graphical_model}中的边表示哪些变量直接依赖于其他变量。\n许多\\gls{graphical_model}的目标是省略不存在强相互作用的边以实现统计和计算的效率。\n例如，我们通常可以作\\ENNAME{Markov}假设，即\\gls{graphical_model}应该只包含从$\\{ \\RSy^{(t-k)}, \\dots, \\RSy^{(t-1)}\\}$到$\\RSy^{(t)}$的边，而不是包含整个过去历史的边。\n然而，在一些情况下，我们认为整个过去的输入会对序列的下一个元素有一定影响。\n当我们认为$\\RSy^{(t)}$的分布可能取决于遥远过去(在某种程度)的$\\RSy^{(i)}$的值，且无法通过$\\RSy^{(t-1)}$捕获$\\RSy^{(i)}$的影响时，\\glssymbol{RNN}~将会很有用。\n\n解释~\\glssymbol{RNN}~作为\\gls{graphical_model}的一种方法是将\\glssymbol{RNN}视为定义一个结构为完全图的\\gls{graphical_model}，且能够表示任何一对$\\RSy$值之间的直接联系。\n\\figref{fig:chap10_fully_connected_chain}是关于$\\RSy$值且具有完全图结构的\\gls{graphical_model}。\n该~\\glssymbol{RNN}~完全图的解释基于排除并忽略模型中的\\gls{hidden_unit}~$\\Vh^{(t)}$。\n\n% -- 377 --\n\n更有趣的是，将\\gls{hidden_unit}~$\\Vh^{(t)}$视为随机变量，从而产生~\\glssymbol{RNN}~的\\gls{graphical_model}结构\\footnote{给定这些变量的父变量，其条件分布是确定性的。\n尽管设计具有这样确定性的\\gls{hidden_unit}的\\gls{graphical_model}是很少见的，但这是完全合理的。}。\n在\\gls{graphical_model}中包括隐藏单元预示~\\glssymbol{RNN}~能对观测的联合分布提供非常有效的参数化。\n假设我们用表格表示法来表示离散值上任意的联合分布，即对每个值可能的赋值分配一个单独条目的数组，该条目表示发生该赋值的概率。\n如果$y$可以取$k$个不同的值，表格表示法将有$\\CalO(k^\\tau)$个参数。\n对比~\\glssymbol{RNN}，由于\\gls{parameter_sharing}，\\glssymbol{RNN}~的参数数目为$\\CalO(1)$且是序列长度的函数。 % ??\n我们可以调节~\\glssymbol{RNN}~的参数数量来控制模型容量，但不用被迫与序列长度成比例。\n\\eqnref{eq:105h}展示了所述~\\glssymbol{RNN}~通过循环应用相同的函数$f$以及在每个\\gls{time_step}的相同参数$\\Vtheta$，有效地参数化的变量之间的长期联系。\n\\figref{fig:chap10_rnn_graphical_model_with_state}说明了这个\\gls{graphical_model}的解释。\n在\\gls{graphical_model}中结合$\\Vh^{(t)}$节点可以用作过去和未来之间的中间量，从而将它们解耦。\n遥远过去的变量$y^{(i)}$可以通过其对$\\Vh$的影响来影响变量$y^{(t)}$。\n该图的结构表明可以在\\gls{time_step}使用相同的条件概率分布有效地参数化模型，并且当观察到全部变量时，可以高效地评估联合分配给所有变量的概率。\n\n% -- 378 --\n\n即便使用高效参数化的\\gls{graphical_model}，某些操作在计算上仍然具有挑战性。\n例如，难以预测序列中缺少的值。\n\n\\gls{recurrent_network}为减少的参数数目付出的代价是\\emph{优化}参数可能变得困难。\n\n在\\gls{recurrent_network}中使用的\\gls{parameter_sharing}的前提是相同参数可用于不同\\gls{time_step}的假设。\n也就是说，假设给定时刻$t$的变量后，时刻$t +1$变量的条件概率分布是\\firstgls{stationary}，这意味着之前的\\gls{time_step}与下个\\gls{time_step}之间的关系并不依赖于$t$。\n原则上，可以使用$t$作为每个\\gls{time_step}的额外输入，并让学习器在发现任何时间依赖性的同时，在不同\\gls{time_step}之间尽可能多地共享。\n相比在每个$t$使用不同的条件概率分布已经好很多了，但网络将必须在面对新$t$时进行外推。\n\n为了完整描述将~\\glssymbol{RNN}~作为\\gls{graphical_model}的观点，我们必须描述如何从模型采样。\n我们需要执行的主要操作是简单地从每一\\gls{time_step}的条件分布采样。\n然而，还有一个额外的复杂性。\n\\glssymbol{RNN}~必须有某种机制来确定序列的长度。\n这可以通过多种方式实现。\n\n在当输出是从词汇表获取的符号的情况下，我们可以添加一个对应于序列末端的特殊符号\\citep{schmidhuber2012self}。\n当产生该符号时，采样过程停止。\n在训练集中，我们将该符号作为序列的一个额外成员，即紧跟每个训练样本$\\Vx^{(\\tau)}$之后。\n\n% -- 379 --\n\n另一种选择是在模型中引入一个额外的~\\ENNAME{Bernoulli}~输出，表示在每个\\gls{time_step}决定继续生成或停止生成。\n相比向词汇表增加一个额外符号，这种方法更通用，因为它适用于任何~\\glssymbol{RNN}，而不仅仅是输出符号序列的~\\glssymbol{RNN}。\n例如，它可以应用于一个产生实数序列的~\\glssymbol{RNN}。\n新的输出单元通常使用~\\ENNAME{sigmoid}~单元，并以\\gls{cross_entropy}作为损失函数进行训练。\n在这种方法中，\\ENNAME{sigmoid}~被训练为最大化正确预测的对数似然，即在每个\\gls{time_step}序列决定结束或继续。\n\n确定序列长度$\\tau$的另一种方法是将一个额外的输出添加到模型并预测整数$\\tau$本身。\n模型可以采出$\\tau$的值，然后采$\\tau$步有价值的数据。\n这种方法需要在每个\\gls{time_step}的循环更新中增加一个额外输入，使得循环更新知道它是否是靠近所产生序列的末尾。\n这种额外的输入可以是$\\tau$的值，也可以是$\\tau - t$即剩下\\gls{time_step}的数量。\n如果没有这个额外的输入，\\glssymbol{RNN}~可能会产生突然结束序列，如一个句子在最终完整前结束。\n此方法基于分解\n\\begin{align}\n P(\\Vx^{(1)},\\dots, \\Vx^{(\\tau)}) = P(\\tau) P(\\Vx^{(1)},\\dots,\\Vx^{(\\tau)} \\mid \\tau) .\n\\end{align}\n直接预测$\\tau$的例子见\\cite{Goodfellow+et+al-ICLR2014a}。\n\n\\subsection{基于上下文的~\\glssymbol{RNN}~序列建模}\n\\label{sec:modeling_sequences_conditioned_on_context_with_rnns}\n上一节描述了没有输入$\\Vx$时，关于随机变量序列$y^{(t)}$的\\glssymbol{RNN}如何对应于\\gls{directed_graphical_model}。\n当然，如\\eqnref{eq:108a}所示的\\glssymbol{RNN}包含一个输入序列$\\Vx^{(1)},\\Vx^{(2)},\\dots,\\Vx^{(\\tau)}$。\n一般情况下，\\glssymbol{RNN}~允许将\\gls{graphical_model}的观点扩展到不仅代表$y$变量的联合分布也能表示给定$\\Vx$后$y$条件分布。\n如在\\secref{sec:learning_conditional_distributions_with_maximum_likelihood}的\\gls{feedforward_network}情形中所讨论的，任何代表变量$P(\\Vy;\\Vtheta)$的模型都能被解释为代表条件分布$P(\\Vy \\mid \\Vomega)$的模型，其中$\\Vomega=\\Vtheta$。\n我们能像之前一样使用$P(\\Vy \\mid \\Vomega)$代表分布$P(\\Vy \\mid \\Vx)$来扩展这样的模型，但要令$\\Vomega$是关于$\\Vx$的函数。\n在~\\glssymbol{RNN}~的情况，这可以通过不同的方式来实现。\n此处，我们回顾最常见和最明显的选择。\n\n% -- 380 --\n\n之前，我们已经讨论了将$t =1, \\dots, \\tau$的向量$\\Vx^{(t)}$序列作为输入的~\\glssymbol{RNN}。\n另一种选择是只使用单个向量$\\Vx$作为输入。\n当$\\Vx$是一个固定大小的向量时，我们可以简单地将其看作产生$\\Vy$序列~\\glssymbol{RNN}~的额外输入。\n将额外输入提供到~\\glssymbol{RNN}~的一些常见方法是：\n\\begin{enumerate}\n \\item 在每个时刻作为一个额外输入，或\n \\item 作为初始状态$\\Vh^{(0)}$，或\n \\item 结合两种方式。\n\\end{enumerate}\n\n第一个也是最常用的方法如\\figref{fig:chap10_conditional_rnn}所示。\n输入$\\Vx$和每个隐藏单元向量$\\Vh^{(t)}$之间的相互作用是通过新引入的权重矩阵$\\MR$参数化的，这是只包含$y$序列的模型所没有的。\n同样的乘积$\\Vx^\\top\\MR$在每个\\gls{time_step}作为\\gls{hidden_unit}的一个额外输入。\n我们可以认为$\\Vx$的选择（确定$\\Vx^\\top\\MR$值），是有效地用于每个\\gls{hidden_unit}的一个新\\gls{bias_aff}参数。\n权重与输入保持独立。\n我们可以认为这种模型采用了非条件模型的$\\Vtheta$，并将$\\Vomega$代入$\\Vtheta$，其中$\\Vomega$内的\\gls{bias_aff}参数现在是输入的函数。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/conditional_rnn}}\n\\fi\n\\caption{将固定长度的向量$\\Vx$映射到序列$\\MY$上分布的~\\glssymbol{RNN}。\n这类~\\glssymbol{RNN}~适用于很多任务如图注，其中单个图像作为模型的输入，然后产生描述图像的词序列。\n观察到的输出序列的每个元素$\\Vy^{(t)}$同时用作输入（对于当前\\gls{time_step}）和训练期间的目标（对于前一\\gls{time_step}）。\n}\n\\label{fig:chap10_conditional_rnn}\n\\end{figure}\n\n% -- 381 --\n\n\\glssymbol{RNN}~可以接收向量序列$\\Vx^{(t)}$作为输入，而不是仅接收单个向量$\\Vx$作为输入。\n\\eqnref{eq:108a}描述的~\\glssymbol{RNN}~对应条件分布$P(\\Vy^{(1)}, \\dots, \\Vy^{(\\tau)} \\mid \\Vx^{(1)}, \\dots, \\Vx^{(\\tau)})$，并在条件独立的假设下这个分布分解为\n\\begin{align}\n \\prod_t P(\\Vy^{(t)} \\mid \\Vx^{(1)}, \\dots, \\Vx^{(t)}).\n\\end{align}\n为去掉条件独立的假设，我们可以在时刻$t$的输出到时刻$t+1$的\\gls{hidden_unit}添加连接，如\\figref{fig:chap10_causal_rnn}所示。\n该模型就可以代表关于$\\Vy$序列的任意概率分布。\n这种给定一个序列表示另一个序列分布的模型的还是有一个限制，就是这两个序列的长度必须是相同的。\n我们将在\\secref{sec:encoder_decoder_sequence_to_sequence_architectures}描述如何消除这种限制。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/causal_rnn}}\n\\fi\n\\caption{将可变长度的$\\Vx$值序列映射到相同长度的$\\Vy$值序列上分布的条件\\gls{RNN}。\n对比\\figref{fig:chap10_hidden_recurrence_rnn}，此~\\glssymbol{RNN}~包含从前一个输出到当前状态的连接。\n这些连接允许此\\glssymbol{RNN}对给定$\\Vx$的序列后相同长度的$\\Vy$序列上的任意分布建模。\n\\figref{fig:chap10_hidden_recurrence_rnn}的~\\glssymbol{RNN}~仅能表示在给定$\\Vx$值的情况下，$\\Vy$值彼此条件独立的分布。\n}\n\\label{fig:chap10_causal_rnn}\n\\end{figure}\n\n\n% -- 382 --\n\n\\section{双向~\\glssymbol{RNN}}\n\\label{sec:bidirectional_rnns}\n目前为止我们考虑的所有\\gls{RNN}有一个``因果''结构，意味着在时刻$t$的状态只能从过去的序列$\\Vx^{(1)},\\dots,\\Vx^{(t-1)}$以及当前的输入$\\Vx^{(t)}$捕获信息。\n我们还讨论了某些在$\\Vy$可用时，允许过去的$\\Vy$值信息影响当前状态的模型。\n\n然而，在许多应用中，我们要输出的$\\Vy^{(t)}$的预测可能依赖于整个输入序列。\n例如，在语音识别中，由于协同发音，当前声音作为音素的正确解释可能取决于未来几个音素，甚至潜在的可能取决于未来的几个词，因为词与附近的词之间存在语言学上的依赖：如果当前的词有两种声学上合理的解释，我们可能要在更远的未来（和过去）寻找信息区分它们。\n这在手写识别和许多其他序列到序列学习的任务中也是如此，将会在下一节中描述。\n\n双向\\gls{RNN}（或双向~\\glssymbol{RNN}）为满足这种需要而被发明\\citep{Schuster+Paliwal-1997}。\n他们在需要双向信息的应用中非常成功\\citep{Graves-book2012}，如手写识别\\citep{Graves-et-al-NIPS2007,Graves+Schmidhuber-2009}，语音识别\\citep{Graves+Schmidhuber-2005,Graves-et-al-ICASSP2013}以及生物信息学\\citep{Baldi-et-al-1999}。\n\n顾名思义，双向~\\glssymbol{RNN}~结合时间上从序列起点开始移动的~\\glssymbol{RNN}~和另一个时间上从序列末尾开始移动的~\\glssymbol{RNN}。\n\\figref{fig:chap10_bidirectional_rnn}展示了典型的双向~\\glssymbol{RNN}，其中$\\Vh^{(t)}$代表通过时间向前移动的子~\\glssymbol{RNN}~的状态，$\\Vg^{(t)}$代表通过时间向后移动的子~\\glssymbol{RNN}~的状态。\n这允许输出单元$\\Vo^{(t)}$能够计算同时依赖于过去和未来且对时刻$t$周围的输入值最敏感的表示，而不必指定$t$周围固定大小的窗口（这是\\gls{feedforward_network}、\\gls{convolutional_network}或具有固定大小的先行缓存器的常规~\\glssymbol{RNN}~所必须要做的）。\n\n% -- 383 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/bidirectional_rnn}}\n\\fi\n\\caption{典型的双向\\gls{RNN}中的计算，意图学习将输入序列$\\Vx$映射到目标序列$\\Vy$（在每个步骤$t$具有损失$L^{(t)}$）。\n循环性$\\Vh$在时间上向前传播信息（向右），而循环性$\\Vg$在时间上向后传播信息（向左）。\n因此在每个点$t$，输出单元$\\Vo^{(t)}$可以受益于输入$\\Vh^{(t)}$中关于过去的相关概要以及输入$\\Vg^{(t)}$中关于未来的相关概要。\n}\n\\label{fig:chap10_bidirectional_rnn}\n\\end{figure}\n\n这个想法可以自然地扩展到2维输入，如图像，由\\emph{四个}~\\glssymbol{RNN}~组成，每一个沿着四个方向中的一个计算：上、下、左、右。\n如果~\\glssymbol{RNN}~能够学习到承载长期信息，那在2维网格每个点$(i, j)$的输出$O_{i,j}$就能计算一个主要捕捉局部信息但同时又依赖于长期输入的表示。\n相比\\gls{convolutional_network}，应用于图像的~\\glssymbol{RNN}~计算成本通常更高，但允许同一特征图的特征之间存在长期横向的相互作用\\citep{Visin-et-al-arxiv2015-renet,kalchbrenner2015grid}。\n实际上，对于这样的~\\glssymbol{RNN}，\\gls{forward_propagation}公式可以写成表示使用卷积的形式，计算自底向上到每一层的输入（在整合横向相互作用的特征图的循环传播之前）。\n\n% -- 384 --\n\n\\section{基于编码-解码的序列到序列架构}\n\\label{sec:encoder_decoder_sequence_to_sequence_architectures}\n我们已经在\\figref{fig:chap10_single_output_rnn}看到\\glssymbol{RNN}如何将输入序列映射成固定大小的向量，在\\figref{fig:chap10_conditional_rnn}中看到\\glssymbol{RNN}如何将固定大小的向量映射成一个序列，在\\figref{fig:chap10_hidden_recurrence_rnn}、\\figref{fig:chap10_output_recurrence_rnn}、\\figref{fig:chap10_causal_rnn}和\\figref{fig:chap10_bidirectional_rnn}中看到\\glssymbol{RNN}如何将一个输入序列映射到等长的输出序列。\n\n本节我们讨论如何训练\\glssymbol{RNN}，使其将输入序列映射到不一定等长的输出序列。\n这在许多场景中都有应用，如语音识别、机器翻译或问答，其中训练集的输入和输出序列的长度通常不相同（虽然它们的长度可能相关）。\n\n我们经常将\\glssymbol{RNN}的输入称为``上下文''。\n我们希望产生此上下文的表示，$C$。\n这个上下文$C$可能是一个概括输入序列$\\MX=(\\Vx^{(1)},\\dots,\\Vx^{(n_x)})$的向量或者向量序列。\n\n用于映射可变长度序列到另一可变长度序列最简单的\\glssymbol{RNN}架构最初由\\cite{cho-al-emnlp14}提出，之后不久由\\cite{Sutskever-et-al-NIPS2014}独立开发，并且第一个使用这种方法获得翻译的最好结果。\n前一系统是对另一个机器翻译系统产生的建议进行评分，而后者使用独立的\\gls{recurrent_network}生成翻译。\n这些作者分别将该架构称为编码-解码或序列到序列架构，如\\figref{fig:chap10_rnn_encdec}所示。\n这个想法非常简单：（1）\\firstgls{encoder}或\\,\\textbf{读取器}\\,(reader)或\\,\\textbf{输入}(input)~\\glssymbol{RNN}~处理输入序列。\n\\gls{encoder}输出上下文$C$（通常是最终隐藏状态的简单函数）。\n(2)\\firstgls{decoder}或\\,\\textbf{写入器}(writer)或\\,\\textbf{输出}(output)~\\glssymbol{RNN}~则以固定长度的向量（如\\figref{fig:chap10_conditional_rnn}）为条件产生输出序列$\\MY=(\\Vy^{(1)}, \\dots, \\Vy^{(n_y)})$。\n这种架构对比本章前几节提出的架构的创新之处在于长度$n_x$和$n_y$可以彼此不同，而之前的架构约束$n_x = n_y = \\tau$。\n在序列到序列的架构中，两个~\\glssymbol{RNN}~共同训练以最大化$\\log P( \\Vy^{(1)}, \\dots, \\Vy^{(n_y)} \\mid \\Vx^{(1)},\\dots,\\Vx^{(n_x)} )$(关于训练集中所有$\\Vx$和$\\Vy$对的平均)。\n\\gls{encoder}~\\glssymbol{RNN}~的最后一个状态$\\Vh_{n_x}$通常被当作输入的表示$C$并作为\\gls{decoder}~\\glssymbol{RNN}~的输入。\n\n% -- 385 --\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/rnn_encdec}}\n\\fi\n\\caption{在给定输入序列$(\\RVx^{(1)},\\RVx^{(2)},\\dots,\\RVx^{(n_x)})$的情况下学习生成输出序列$(\\RVy^{(1)},\\RVy^{(2)},\\dots,\\RVy^{(n_y)})$的\\gls{encoder}-\\gls{decoder}或序列到序列的~\\glssymbol{RNN}~架构的示例。 \n它由读取输入序列的\\gls{encoder}~\\glssymbol{RNN}~以及生成输出序列（或计算给定输出序列的概率）的\\gls{decoder}~\\glssymbol{RNN}~组成。\n\\gls{encoder}~\\glssymbol{RNN}~的最终隐藏状态用于计算一般为固定大小的上下文变量$C$，$C$表示输入序列的语义概要并且作为\\gls{decoder}~\\glssymbol{RNN}~的输入。\n}\n\\label{fig:chap10_rnn_encdec}\n\\end{figure}\n\n如果上下文$C$是一个向量，则\\gls{decoder}~\\glssymbol{RNN}~只是在\\secref{sec:modeling_sequences_conditioned_on_context_with_rnns}描述的向量到序列~\\glssymbol{RNN}。\n正如我们所见，向量到序列~\\glssymbol{RNN}~至少有两种接受输入的方法。\n输入可以被提供为~\\glssymbol{RNN}~的初始状态，或连接到每个\\gls{time_step}中的\\gls{hidden_unit}。\n这两种方式也可以结合。\n\n这里并不强制要求\\gls{encoder}与\\gls{decoder}的隐藏层具有相同的大小。\n\n此架构的一个明显不足是，\\gls{encoder}~\\glssymbol{RNN}~输出的上下文$C$的维度太小而难以适当地概括一个长序列。\n这种现象由\\cite{Bahdanau-et-al-ICLR2015-small}在机器翻译中观察到。\n他们提出让$C$成为可变长度的序列，而不是一个固定大小的向量。\n此外，他们还引入了将序列$C$的元素和输出序列的元素相关联的\\firstgls{attention_mechanism}。\n读者可在\\secref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}了解更多细节。\n\n% -- 386 --\n\n\\section{深度\\glsentrytext{recurrent_network}}\n\\label{sec:deep_recurrent_networks}\n大多数~\\glssymbol{RNN}~中的计算可以分解成三块参数及其相关的变换：\n\\begin{enumerate}\n \\item 从输入到隐藏状态，\n \\item 从前一隐藏状态到下一隐藏状态，以及\n \\item 从隐藏状态到输出。\n\\end{enumerate}\n根据\\figref{fig:chap10_hidden_recurrence_rnn}中的~\\glssymbol{RNN}~架构，这三个块都与单个权重矩阵相关联。\n换句话说，当网络被\\gls{unfolding}时，每个块对应一个浅的变换。\n能通过深度~\\glssymbol{MLP}~内单个层来表示的变换称为浅变换。\n通常，这是由学成的仿射变换和一个固定非线性表示组成的变换。\n\n在这些操作中引入深度会有利的吗？\n实验证据\\citep{Graves-et-al-ICASSP2013,Pascanu-et-al-ICLR2014}强烈暗示理应如此。\n实验证据与我们需要足够的深度以执行所需映射的想法一致。\n读者可以参考~\\cite{Schmidhuber92,ElHihi+Bengio-nips8}或~\\cite{Jaeger2007}了解更早的关于深度~\\glssymbol{RNN}~的研究。\n\n\\cite{Graves-et-al-ICASSP2013}第一个展示了将~\\glssymbol{RNN}~的状态分为多层的显著好处，如\\figref{fig:chap10_deep}~\\emph{(左)}。\n我们可以认为，在\\figref{fig:chap10_deep}(a)所示层次结构中较低的层起到了将原始输入转化为对更高层的隐藏状态更合适表示的作用。\n\\cite{Pascanu-et-al-ICLR2014}更进一步提出在上述三个块中各使用一个单独的~\\glssymbol{MLP}（可能是深度的），如\\figref{fig:chap10_deep}(b)所示。\n考虑表示容量，我们建议在这三个步中都分配足够的容量，但增加深度可能会因为优化困难而损害学习效果。\n在一般情况下，更容易优化较浅的架构，加入\\figref{fig:chap10_deep}(b)的额外深度导致从\\gls{time_step}~$t$的变量到\\gls{time_step}~$t+1$的最短路径变得更长。\n例如，如果具有单个隐藏层的~\\glssymbol{MLP}~被用于状态到状态的转换，那么与\\figref{fig:chap10_hidden_recurrence_rnn}相比，我们就会加倍任何两个不同\\gls{time_step}变量之间最短路径的长度。\n然而\\cite{Pascanu-et-al-ICLR2014}认为，在隐藏到隐藏的路径中引入\\gls{skip_connection}可以缓和这个问题，如\\figref{fig:chap10_deep}(c)所示。\n\n% -- 387 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/deep}}\n\\fi\n\\caption{\\gls{RNN}可以通过许多方式变得更深\\citep{Pascanu-et-al-ICLR2014}。\n(a)隐藏循环状态可以被分解为具有层次的组。\n(b)可以向输入到隐藏，隐藏到隐藏以及隐藏到输出的部分引入更深的计算(如~\\glssymbol{MLP})。\n这可以延长链接不同\\gls{time_step}的最短路径。\n(c)可以引入\\gls{skip_connection}来缓解路径延长的效应。\n}\n\\label{fig:chap10_deep}\n\\end{figure}\n\n\\section{递归神经网络}\n\\label{sec:recursive_neural_networks}\n递归神经网络\\footnote{我们建议不要将``递归神经网络''缩写为``\\glssymbol{RNN}''，以免与``\\gls{RNN}''混淆。}代表\\gls{recurrent_network}的另一个扩展，它被构造为深的树状结构而不是~\\glssymbol{RNN}~的链状结构，因此是不同类型的\\gls{computational_graph}。\n递归网络的典型\\gls{computational_graph}如\\figref{fig:chap10_recursive_net}所示。\n递归神经网络由~\\cite{Pollack90}引入，而~\\cite{tr-bottou-2011}描述了这类网络的潜在用途——学习推论。\n递归网络已成功地应用于输入是\\emph{数据结构}的\\gls{NN}~\\citep{Frasconi97,Frasconi-1998}，如自然语言处理\\citep{Socher+al-NIPS2011,Socher+al-EMNLP2011-small,Socher-et-al-EMNLP2013}和计算机视觉\\citep{Socher-2011}。\n\n% -- 388 --\n\n递归网络的一个明显优势是，对于具有相同长度$\\tau$的序列，深度（通过非线性操作的组合数量来衡量）可以急剧地从$\\tau$减小为$\\CalO(\\log \\tau)$，这可能有助于解决\\gls{long_term_dependency}。\n一个悬而未决的问题是如何以最佳的方式构造树。\n一种选择是使用不依赖于数据的树结构，如平衡二叉树。\n在某些应用领域，外部方法可以为选择适当的树结构提供借鉴。\n例如，处理自然语言的句子时，用于递归网络的树结构可以被固定为句子语法分析树的结构（可以由自然语言语法分析程序提供）\\citep{Socher+al-NIPS2011,Socher+al-EMNLP2011-small}。\n理想的情况下，人们希望学习器自行发现和推断适合于任意给定输入的树结构，如\\citep{tr-bottou-2011}所建议。\n\n% -- 389 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/recursive_net}}\n\\fi\n\\caption{递归网络将循环网络的链状计算图推广到树状计算图。\n可变大小的序列$\\Vx^{(1)},\\Vx^{(2)},\\dots,\\Vx^{(t)}$可以通过固定的参数集合（权重矩阵$\\MU,\\MV,\\MW$）映射到固定大小的表示（输出$\\Vo$）。\n该图展示了\\gls{supervised_learning}的情况，其中提供了一些与整个序列相关的目标$\\Vy$。\n}\n\\label{fig:chap10_recursive_net}\n\\end{figure}\n\n递归网络想法的变种存在很多可能。\n例如，\\cite{Frasconi97}和~\\cite{Frasconi-1998}将数据与树结构相关联，并将输入和目标与树的单独节点相关联。\n由每个节点执行的计算无须是传统的人工神经计算（所有输入的仿射变换后跟一个单调非线性）。\n例如，\\cite{Socher-et-al-EMNLP2013}提出用张量运算和双线性形式，在这之前人们已经发现当概念是由连续向量（嵌入）表示时，这种方式有利于建模概念之间的联系\\citep{Weston+Bengio+Usunier-2010,Bordes-et-al-AISTATS2012-small}。\n\n\\section{\\glsentrytext{long_term_dependency}的挑战}\n\\label{sec:the_challenge_of_long_term_dependencies}\n学习\\gls{recurrent_network}\\gls{long_term_dependency}的数学挑战在\\secref{sec:long_term_dependencies}中引入。\n根本问题是，经过许多阶段传播后的\\gls{gradient}倾向于消失（大部分情况）或爆炸（很少，但对优化过程影响很大）。\n即使我们假设\\gls{recurrent_network}是参数稳定的（可存储记忆，且\\gls{gradient}不爆炸），但\\gls{long_term_dependency}的困难来自比短期相互作用指数小的权重（涉及许多~\\gls{jacobian}~相乘）。\n许多资料提供了更深层次的讨论\\citep{Hochreiter91-small,Doya93,Bengio1994ITNN,Pascanu+al-ICML2013-small}。\n在这一节中，我们会更详细地描述该问题。\n其余几节介绍克服这个问题的方法。\n\n% -- 390 --\n\n\\gls{recurrent_network}涉及相同函数的多次组合，每个\\gls{time_step}一次。\n这些组合可以导致极端非线性行为，如\\figref{fig:chap10_composition_color}所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/composition_color}}\n\\fi\n\\caption{重复组合函数。\n当组合许多非线性函数（如这里所示的线性tanh层）时，结果是高度非线性的，通常大多数值与微小的导数相关联，也有一些具有大导数的值，以及在增加和减小之间的多次交替。% ??\n此处，我们绘制从100维隐藏状态降到单个维度的线性投影，绘制于$y$轴上。\n$x$轴是100维空间中沿着随机方向的初始状态的坐标。\n因此，我们可以将该图视为高维函数的线性截面。\n曲线显示每个\\gls{time_step}之后的函数，或者等价地，转换函数被组合一定次数之后。\n}\n\\label{fig:chap10_composition_color}\n\\end{figure}\n\n特别地，\\gls{RNN}所使用的函数组合有点像矩阵乘法。\n我们可以把如下的循环联系\n\\begin{align}\n \\Vh^{(t)} = \\MW^\\top \\Vh^{(t-1)}\n\\end{align}\n看做是一个非常简单的、缺少非线性激活函数和输入$\\Vx$的\\gls{RNN}。\n如\\secref{sec:long_term_dependencies}描述，这种循环关系本质上描述了幂法。\n它可以被简化为\n\\begin{align}\n \\Vh^{(t)} = (\\MW^t)^\\top \\Vh^{(0)},\n\\end{align}\n而当$\\MW$符合下列形式的特征分解\n\\begin{align}\n \\MW = \\MQ \\VLambda \\MQ^\\top,\n\\end{align}\n其中$\\MQ$正交，循环性可进一步简化为\n\\begin{align}\n \\Vh^{(t)} = \\MQ^\\top \\VLambda^t \\MQ \\Vh^{(0)}.\n\\end{align}\n特征值提升到$t$次后，导致幅值不到一的特征值衰减到零，而幅值大于一的就会激增。\n任何不与最大特征向量对齐的$\\Vh^{(0)}$的部分将最终被丢弃。\n\n\n这个问题是针对\\gls{recurrent_network}的。\n在标量情况下，想象多次乘一个权重$w$。\n该乘积$w^t$消失还是爆炸取决于$w$的幅值。\n然而，如果每个时刻使用不同权重$w^{(t)}$的非\\gls{recurrent_network}，情况就不同了。\n如果初始状态给定为$1$，那么时刻$t$的状态可以由$\\prod_t w^{(t)}$给出。\n假设$w^{(t)}$的值是随机生成的，各自独立，且有$0$均值$v$方差。\n乘积的方差就为$\\CalO(v^n)$。\n为了获得某个期望的方差$v^*$，我们可以选择让单个权重的方差为$v=\\sqrt[n]{v^*}$。\n因此，非常深的\\gls{feedforward_network}通过精心设计的比例可以避免\\gls{gradient}消失和爆炸问题，如~\\cite{Sussillo14}所主张的。\n\n% -- 391 --\n\n\\glssymbol{RNN}~\\gls{gradient}消失和爆炸问题是由不同研究人员独立发现\\citep{Hochreiter91-small,Bengio_icnn93,Bengio1994ITNN}。\n有人可能会希望通过简单地停留在\\gls{gradient}不消失或爆炸的参数空间来避免这个问题。\n不幸的是，为了储存记忆并对小扰动具有鲁棒性，\\glssymbol{RNN}~必须进入参数空间中的\\gls{gradient}消失区域\\citep{Bengio_icnn93,Bengio1994ITNN}。\n具体来说，每当模型能够表示\\gls{long_term_dependency}时，长期相互作用的\\gls{gradient}幅值就会变得指数级小（相比短期相互作用的\\gls{gradient}幅值）。\n这并不意味着这是不可能学习的，由于\\gls{long_term_dependency}关系的信号很容易被短期相关性产生的最小波动隐藏，因而学习\\gls{long_term_dependency}可能需要很长的时间。\n实践中，\\cite{Bengio1994ITNN}的实验表明，当我们增加了需要捕获的依赖关系的跨度，基于\\gls{gradient}的优化变得越来越困难，\\glssymbol{SGD}~在长度仅为10或20的序列上成功训练传统~\\glssymbol{RNN}~的概率迅速变为0。\n\n将\\gls{recurrent_network}作为动力系统更深入探讨的资料见~\\cite{Doya93,Bengio1994ITNN,Siegelmann+Sontag-1995}及~\n\\cite{Pascanu-et-al-ICML2013}的回顾。\n本章的其余部分将讨论目前已经提出的降低学习\\gls{long_term_dependency}（在某些情况下，允许一个~\\glssymbol{RNN}~学习横跨数百步的依赖）难度的不同方法，但学习\\gls{long_term_dependency}的问题仍是\\gls{DL}中的一个主要挑战。\n\n\n\\section{\\glsentrytext{ESN}}\n\\label{sec:echo_state_networks}\n从$\\Vh^{(t-1)}$到$\\Vh^{(t)}$的循环权重映射以及从$\\Vx^{(t)}$到$\\Vh^{(t)}$的输入权重映射是\\gls{recurrent_network}中最难学习的参数。\n研究者\\citep{Jaeger-NIPS2002,Maass-et-al-2002,Jaeger+Haas-2004,Jaeger-2007}提出避免这种困难的方法是设定循环\\gls{hidden_unit}，使其能很好地捕捉过去输入历史，并且\\emph{只学习输出权重}。\n\\firstgls{ESN}或~\\glssymbol{ESN}~\\citep{Jaeger+Haas-2004,Jaeger-2007}，以及\\firstgls{liquid_state_machines}\\citep{Maass-et-al-2002}分别独立地提出了这种想法。\n后者是类似的，只不过它使用脉冲神经元（二值输出）而不是~\\glssymbol{ESN}~中的连续\\gls{hidden_unit}。\n\\glssymbol{ESN}~和\\gls{liquid_state_machines}都被称为\\firstgls{reservoir_computing}\\citep{Lukosevicius+Jaeger-2009}，因为\\gls{hidden_unit}形成了可能捕获输入历史不同方面的临时特征池。\n\n% -- 392 --\n\n\\gls{reservoir_computing}\\gls{recurrent_network}类似于\\gls{kernel_machines}，这是思考它们的一种方式：它们将任意长度的序列（到时刻$t$的输入历史）映射为一个长度固定的向量（循环状态$\\Vh^{(t)}$），之后可以施加一个线性预测算子（通常是一个\\gls{linear_regression}）以解决感兴趣的问题。\n训练\\gls{criterion}就可以很容易地设计为输出权重的凸函数。\n例如，如果输出是从\\gls{hidden_unit}到输出目标的\\gls{linear_regression}，训练\\gls{criterion}就是\\gls{mean_squared_error}，由于是凸的就可以用简单的学习算法可靠地解决\\citep{Jaeger-NIPS2002}。\n\n因此，重要的问题是：我们如何设置输入和循环权重才能让一组丰富的历史可以在\\gls{RNN}的状态中表示？\n\\gls{reservoir_computing}研究给出的答案是将\\gls{recurrent_network}视为动态系统，并设定让动态系统接近稳定边缘的输入和循环权重。\n\n最初的想法是使状态到状态转换函数的~\\gls{jacobian}~矩阵的特征值接近1。\n如\\secref{sec:long_term_dependencies}解释，\\gls{recurrent_network}的一个重要特征就是~\\gls{jacobian}~矩阵的特征值谱$\\MJ^{(t)} = \\frac{\\partial s^{(t)}}{\\partial s^{(t-1)}}$。\n特别重要的是$\\MJ^{(t)}$的\\firstgls{spectral_radius}，定义为特征值的最大绝对值。\n\n为了解\\gls{spectral_radius}的影响，可以考虑\\gls{backward_propagation}中~\\gls{jacobian}~矩阵$\\MJ$不随$t$改变的简单情况。\n例如当网络是纯线性时，会发生这种情况。\n假设$\\MJ$特征值$\\lambda$对应的特征向量为$\\Vv$。\n考虑当我们通过时间向后传播\\gls{gradient}向量时会发生什么。\n如果刚开始的\\gls{gradient}向量为$\\Vg$，然后经过\\gls{backward_propagation}的一个步骤后，我们将得到$\\MJ \\Vg$，$n$步之后我们会得到$\\MJ^n \\Vg$。\n现在考虑如果我们向后传播扰动版本的$\\Vg$会发生什么。\n如果我们刚开始是$\\Vg + \\delta \\Vv$，一步之后，我们会得到$\\MJ(\\Vg + \\delta \\Vv)$。\n$n$步之后，我们将得到$\\MJ^n(\\Vg + \\delta \\Vv)$。\n由此我们可以看出，由$\\Vg$开始的\\gls{backward_propagation}和由$\\Vg+\\delta \\Vv$开始的\\gls{backward_propagation}，$n$步之后偏离$\\delta \\MJ^n \\Vv$。\n如果$\\Vv$选择为$\\MJ$特征值$\\lambda$对应的一个单位特征向量，那么在每一步乘~\\gls{jacobian}~矩阵只是简单地缩放。\n\\gls{backward_propagation}的两次执行分离的距离为$\\delta | \\lambda |^n$。\n当$\\Vv$对应于最大特征值$|\\lambda|$，初始扰动为$\\delta$时这个扰动达到可能的最宽分离。\n\n当$ | \\lambda | > 1$，偏差$\\delta | \\lambda |^n$就会指数增长。\n当$ | \\lambda | < 1$，偏差就会变得指数小。\n\n% -- 393 --\n\n当然，这个例子假定~\\gls{jacobian}~矩阵在每个\\gls{time_step}是相同的，即对应于没有非线性的\\gls{recurrent_network}。\n当非线性存在时，非线性的导数将在许多\\gls{time_step}后接近零，并有助于防止因过大的\\gls{spectral_radius}而导致的爆炸。\n事实上，关于\\gls{ESN}的最近工作提倡使用远大于1的\\gls{spectral_radius}~\\citep{yildiz2012re,jaeger2012long}。\n\n我们上面说的这些关于用重复矩阵相乘进行\\gls{backward_propagation}的\\gls{recurrent_network}的事实同样适用于没有非线性的正向传播的网络，其状态为$\\Vh^{(t+1)} = \\Vh^{(t)\\top} \\MW $。\n\n如果线性映射$\\MW^\\top$在$L^2$范数的测度下总是缩小$\\Vh$，那么我们说这个映射是\\firstgls{contractive}的。\n当\\gls{spectral_radius}小于一，则从$\\Vh^{(t)}$到$\\Vh^{(t+1)}$的映射是\\gls{contractive}的，因此小变化在每个\\gls{time_step}后变得更小。\n当我们使用有限精度（如32位整数）来存储状态向量时，必然会使得网络忘掉过去的信息。\n\n\\gls{jacobian}~矩阵告诉我们$\\Vh^{(t)}$一个微小的变化如何向前一步传播，或等价的，$\\Vh^{(t+1)}$的\\gls{gradient}如何向后一步传播。\n需要注意的是，$\\MW$和$\\MJ$都不需要是对称的（尽管它们是实方阵），因此它们可能有复的特征值和特征向量，其中虚数分量对应于潜在的振荡行为（如果迭代地应用同一~\\gls{jacobian}）。\n即使$\\Vh^{(t)}$或$\\Vh^{(t)}$中有趣的小变化在\\gls{backward_propagation}中是实值的，它们仍可以用这样的复数基表示。\n重要的是，当向量乘以矩阵时，这些复数基的系数幅值（复数的绝对值）会发生什么变化。\n幅值大于1的特征值对应于放大（如果反复应用则指数增长）或收缩（如果反复应用则指数减小）。\n\n非线性映射情况时，\\gls{jacobian}~会在每一步任意变化。\n因此，动态量变得更加复杂。\n然而，一个小的初始变化多步之后仍然会变成一个大的变化。\n纯线性和非线性情况的一个不同之处在于使用压缩非线性（如$\\tanh$）可以使循环动态量有界。\n注意，即使\\gls{forward_propagation}动态量有界，\\gls{backward_propagation}的动态量仍然可能无界，例如，当$\\tanh$序列都在它们状态中间的线性部分，并且由\\gls{spectral_radius}大于1的权重矩阵连接。\n然而，所有$\\tanh$单元同时位于它们的线性激活点是非常罕见的。\n\n% -- 394 --\n\n\\gls{ESN}的策略是简单地固定权重使其具有一定的\\gls{spectral_radius}如3，其中信息通过时间前向传播，但会由于饱和非线性单元（如$\\tanh$）的稳定作用而不会爆炸。\n\n最近，已经有研究表明，用于设置~\\glssymbol{ESN}~权重的技术可以用来\\emph{初始化}完全可训练的\\gls{recurrent_network}的权重（通过时间\\gls{backward_propagation}来训练隐藏到隐藏的循环权重），帮助学习\\gls{long_term_dependency}~\\citep{Sutskever-thesis2012,sutskeverimportance}。\n在这种设定下，结合\\secref{sec:parameter_initialization_strategies}中稀疏初始化的方案，设置$1.2$的初始\\gls{spectral_radius}表现不错。\n\n\\section{\\glsentrytext{leaky_unit}和其他多时间尺度的策略}\n\\label{sec:leaky_units_and_other_strategiesfor_multiple_time_scales}\n处理\\gls{long_term_dependency}的一种方法是设计工作在多个时间尺度的模型，使模型的某些部分在细粒度时间尺度上操作并能处理小细节，而其他部分在粗时间尺度上操作并能把遥远过去的信息更有效地传递过来。\n存在多种同时构建粗细时间尺度的策略。\n这些策略包括在时间轴增加\\gls{skip_connection}，``\\gls{leaky_unit}''使用不同时间常数整合信号，以及去除一些用于建模细粒度时间尺度的连接。\n\n\\subsection{时间维度的\\glsentrytext{skip_connection}}\n\\label{sec:adding_skip_connections_through_time}\n增加从遥远过去的变量到目前变量的直接连接是得到粗时间尺度的一种方法。\n使用这样\\gls{skip_connection}的想法可以追溯到\\cite{Lin-ieeetnn96}，紧接是向\\gls{feedforward_network}引入延迟的想法\\citep{Lang+Hinton88}。\n在普通的\\gls{recurrent_network}中，循环从时刻$t$的单元连接到时刻$t+1$单元。\n构造较长的延迟\\gls{recurrent_network}是可能的\\citep{Bengio91}。\n\n正如我们在\\secref{sec:long_term_dependencies}看到，\\gls{gradient}可能\\emph{关于时间步数}呈指数消失或爆炸。\n\\citep{Lin-ieeetnn96}引入了$d$延时的循环连接以减轻这个问题。\n现在导数指数减小的速度与$\\frac{\\tau}{d}$相关而不是$\\tau$。\n既然同时存在延迟和单步连接，\\gls{gradient}仍可能成$t$指数爆炸。\n这允许学习算法捕获更长的依赖性，但不是所有的\\gls{long_term_dependency}都能在这种方式下良好地表示。\n\n% -- 395 --\n\n\\subsection{\\glsentrytext{leaky_unit}和一系列不同时间尺度}\n\\label{sec:leaky_units_and_a_spectrum_of_different_time_scales}\n获得导数乘积接近1的另一方式是设置\\emph{线性}自连接单元，并且这些连接的权重接近1。\n\n我们对某些$v$值应用更新$\\mu^{(t)} \\gets \\alpha \\mu^{(t-1)} + (1-\\alpha) v^{(t)}$累积一个滑动平均值$\\mu^{(t)}$，其中$\\alpha$是一个从$ \\mu^{(t-1)}$到$ \\mu^{(t)}$线性自连接的例子。\n当$\\alpha$接近1时，滑动平均值能记住过去很长一段时间的信息，而当$\\alpha$接近0，关于过去的信息被迅速丢弃。\n线性自连接的\\gls{hidden_unit}可以模拟滑动平均的行为。\n这种\\gls{hidden_unit}称为\\firstgls{leaky_unit}。\n\n$d$~\\gls{time_step}的\\gls{skip_connection}可以确保单元总能被$d$个\\gls{time_step}前的那个值影响。\n使用权重接近1的线性自连接是确保该单元可以访问过去值的不同方式。\n线性自连接通过调节实值$\\alpha$（而不是调整整数值的跳跃长度）更平滑灵活地调整这种效果。\n\n这个想法由~\\cite{Mozer-nips92}和~\\cite{ElHihi+Bengio-nips8}提出。\n在\\gls{ESN}中，\\gls{leaky_unit}也被发现很有用\\citep{JaegerLPS07}。\n\n我们可以通过两种基本策略设置\\gls{leaky_unit}使用的时间常数。\n一种策略是手动将其固定为常数，例如在初始化时从某些分布采样它们的值。\n另一种策略是使时间常数成为自由变量，并学习出来。\n在不同时间尺度使用这样的\\gls{leaky_unit}似乎能帮助学习\\gls{long_term_dependency}~\\citep{Mozer-nips92,Pascanu+al-ICML2013-small}。\n\n\\subsection{删除连接}\n\\label{sec:removing_connections}\n处理\\gls{long_term_dependency}另一种方法是在多个时间尺度组织~\\glssymbol{RNN}~状态的想法\\citep{ElHihi+Bengio-nips8}，信息在较慢的时间尺度上更容易长距离流动。\n\n这个想法与之前讨论的时间维度上的\\gls{skip_connection}不同，因为它涉及主动\\emph{删除}长度为一的连接并用更长的连接替换它们。\n以这种方式修改的单元被迫在长时间尺度上运作。\n而通过时间\\gls{skip_connection}是\\emph{添加}边。\n收到这种新连接的单元，可能会学习在长时间尺度上运作，但也可能选择专注于自己其他的短期连接。\n\n% -- 396 --\n\n强制一组循环单元在不同时间尺度上运作有不同的方式。\n一种选择是使循环单元变成\\gls{leaky_unit}，但不同的单元组关联不同的固定时间尺度。\n这由~\\cite{Mozer-nips92}提出，并被成功应用于~\\cite{Pascanu+al-ICML2013-small}。\n另一种选择是使显式且离散的更新发生在不同的时间，不同的单元组有不同的频率。\n这是~\\cite{ElHihi+Bengio-nips8}和~\\cite{Koutnik-et-al-ICML2014}的方法。\n它在一些基准数据集上表现不错。\n\n\\section{\\glsentrytext{LSTM}和其他\\glsentrytext{gated_rnn}}\n\\label{sec:the_long_short_term_memory_and_other_gated_rnns}\n本文撰写之时，实际应用中最有效的序列模型称为\\firstgls{gated_rnn}。\n包括基于\\firstgls{LSTM}和基于\\firstgls{gated_recurrent_unit}的网络。\n\n像\\gls{leaky_unit}一样，\\gls{gated_rnn}~想法也是基于生成通过时间的路径，其中导数既不消失也不发生爆炸。\n\\gls{leaky_unit}通过手动选择常量的连接权重或参数化的连接权重来达到这一目的。\n\\gls{gated_rnn}~将其推广为在每个\\gls{time_step}都可能改变的连接权重。\n\n\\gls{leaky_unit}允许网络在较长持续时间内\\emph{积累}信息（诸如用于特定特征或类的线索）。\n然而，一旦该信息被使用，让\\gls{NN}\\emph{遗忘}旧的状态可能是有用的。\n例如，如果一个序列是由子序列组成，我们希望\\gls{leaky_unit}能在各子序列内积累线索，我们需要将状态设置为0以忘记旧状态的机制。\n我们希望\\gls{NN}学会决定何时清除状态，而不是手动决定。\n这就是\\gls{gated_rnn}~要做的事。\n\n\\subsection{\\glssymbol{LSTM}}\n\\label{sec:lstm}\n引入自循环的巧妙构思，以产生\\gls{gradient}长时间持续流动的路径是初始\\firstall{LSTM}模型的核心贡献\\citep{Hochreiter+Schmidhuber-1997}。\n其中一个关键扩展是使自循环的权重视上下文而定，而不是固定的\\citep{Gers-et-al-2000}。\n\\gls{gated}此自循环（由另一个\\gls{hidden_unit}控制）的权重，累积的时间尺度可以动态地改变。\n在这种情况下，即使是具有固定参数的~\\glssymbol{LSTM}，累积的时间尺度也可以因输入序列而改变，因为时间常数是模型本身的输出。\n\\glssymbol{LSTM}~已经在许多应用中取得重大成功，如无约束手写识别\\citep{Graves-et-al-2009}、语音识别\\citep{Graves-et-al-ICASSP2013,Graves+Jaitly-ICML2014}、手写生成\\citep{Graves-arxiv2013}、机器翻译\\citep{Sutskever-et-al-NIPS2014}、为图像生成标题\\citep{Kiros-et-al-arxiv2014,Vinyals-et-al-arxiv2014,Xu-et-al-ICML2015}和解析\\citep{Vinyals2014}。\n\n% -- 397 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/lstm}}\n\\fi\n\\caption{\\glssymbol{LSTM}~\\gls{recurrent_network}``细胞''的框图。\n细胞彼此循环连接，代替一般\\gls{recurrent_network}中普通的\\gls{hidden_unit}。\n这里使用常规的人工神经元计算输入特征。\n如果sigmoid输入门允许，它的值可以累加到状态。\n状态单元具有线性自循环，其权重由\\gls{forget_gate}控制。\n细胞的输出可以被输出门关闭。\n所有\\gls{gated}单元都具有sigmoid非线性，而输入单元可具有任意的压缩非线性。\n状态单元也可以用作\\gls{gated}单元的额外输入。\n黑色方块表示单个\\gls{time_step}的延迟。\n}\n\\label{fig:chap10_lstm}\n\\end{figure}\n\n\\glssymbol{LSTM}~块如\\figref{fig:chap10_lstm}所示。\n在浅\\gls{recurrent_network}的架构下，相应的\\gls{forward_propagation}公式如下。\n更深的架构也被成功应用\\citep{Graves-et-al-ICASSP2013,Pascanu-et-al-ICLR2014}。\n\\glssymbol{LSTM}~\\gls{recurrent_network}除了外部的~\\glssymbol{RNN}~循环外，还具有内部的``\\glssymbol{LSTM}~细胞''循环（自环），因此~\\glssymbol{LSTM}~不是简单地向输入和循环单元的仿射变换之后施加一个逐元素的非线性。\n与普通的\\gls{recurrent_network}类似，每个单元有相同的输入和输出，但也有更多的参数和控制信息流动的\\gls{gated}单元系统。\n最重要的组成部分是状态单元$s_i^{(t)}$，与前一节讨论的\\gls{leaky_unit}有类似的线性自环。\n然而，此处自环的权重（或相关联的时间常数）由\\firstgls{forget_gate}~$f_i^{(t)}$控制（时刻$t$和细胞$i$），由~\\ENNAME{sigmoid}~单元将权重设置为0和1之间的值：\n\\begin{align}\n 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),\n\\end{align}\n其中$\\Vx^{(t)}$是当前输入向量，$\\Vh^{t}$是当前隐藏层向量，$\\Vh^{t}$包含所有~\\glssymbol{LSTM}~细胞的输出。 \n$\\Vb^f, \\MU^f, \\MW^f$分别是\\gls{forget_gate}的\\gls{bias_aff}、输入权重和循环权重。\n因此~\\glssymbol{LSTM}~细胞内部状态以如下方式更新，其中有一个条件的自环权重$f_i^{(t)}$：\n\\begin{align}\n s_i^{(t)} = f_i^{(t)}  s_i^{(t-1)} +  g_i^{(t)}\n \\sigma \\Big( b_i + \\sum_j U_{i,j} x_j^{(t)} + \\sum_j W_{i,j} h_j^{(t-1)} \\Big),\n\\end{align}\n其中$\\Vb, \\MU, \\MW$分别是~\\glssymbol{LSTM}~细胞中的\\gls{bias_aff}、输入权重和循环权重。\n\\textbf{外部输入门}(external input gate)单元$g_i^{(t)}$以类似\\gls{forget_gate}（使用\\ENNAME{sigmoid}获得一个0和1之间的值）的方式更新，但有自身的参数：\n\\begin{align}\n 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).\n\\end{align}\n\\glssymbol{LSTM}~细胞的输出$h_i^{(t)}$也可以由\\textbf{输出门}(output gate)~$q_i^{(t)}$关闭（使用\\ENNAME{sigmoid}单元作为\\gls{gated}）：\n\\begin{align}\n h_i^{(t)} &= \\text{tanh}\\big( s_i^{(t)} \\big) q_i^{(t)}, \\\\\n 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),\n\\end{align}\n其中$\\Vb^o, \\MU^o, \\MW^o$分别是输出门的\\gls{bias_aff}、输入权重和循环权重。\n在某些变体中，可以选择使用细胞状态$s_i^{(t)}$作为额外的输入（及其权重），输入到第$i$个单元的三个门，如\\figref{fig:chap10_lstm}所示。\n这将需要三个额外的参数。\n\n% -- 399 --\n\n\\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}。\n\\glssymbol{LSTM}~的变体和替代也已经被研究和使用，这将在下文进行讨论。\n\n\\subsection{其他\\glsentrytext{gated_rnn}}\n\\label{sec:other_gated_rnns}\n\\glssymbol{LSTM}~架构中哪些部分是真正必须的？\n还可以设计哪些其他成功架构允许网络动态地控制不同单元的时间尺度和遗忘行为？\n\n最近关于\\gls{gated_rnn}~的工作给出了这些问题的某些答案，其单元也被称为\\gls{gated_recurrent_unit}或~\\glssymbol{gated_recurrent_unit}~\\citep{cho-al-arxiv14-ssst8,Chung-et-al-NIPSDL2014-small,chung-icml15-gated,Jozefowicz-et-al-ICML2015,Chrupala-et-al-arxiv2015}。\n与~\\glssymbol{LSTM}~的主要区别是，单个\\gls{gated}单元同时控制遗忘因子和更新状态单元的决定。\n更新公式如下：\n\\begin{align}\n h_i^{(t)} = u_i^{(t-1)} h_i^{(t-1)} + (1 - u_i^{(t-1)}) \\sigma \n \\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),\n\\end{align}\n其中$\\Vu$代表``更新''门，$\\Vr$表示``复位''门。\n它们的值就如通常所定义的：\n\\begin{align}\n 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),\n\\end{align}\n和\n\\begin{align}\n 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).\n\\end{align}\n复位和更新门能独立地``忽略''状态向量的一部分。\n更新门像条件渗漏累积器一样可以线性\\gls{gated}任意维度，从而选择将它复制（在~\\ENNAME{sigmoid}~的一个极端）或完全由新的``目标状态''值（朝向渗漏累积器的收敛方向）替换并完全忽略它（在另一个极端）。\n复位门控制当前状态中哪些部分用于计算下一个目标状态，在过去状态和未来状态之间引入了附加的非线性效应。\n\n% -- 400 --\n\n围绕这一主题可以设计更多的变种。\n例如复位门（或\\gls{forget_gate}）的输出可以在多个\\gls{hidden_unit}间共享。\n或者，全局门的乘积（覆盖一整组的单元，例如整一层）和一个局部门（每单元）可用于结合全局控制和局部控制。\n然而，一些调查发现这些~\\glssymbol{LSTM}~和GRU架构的变种，在广泛的任务中难以明显地同时击败这两个原始架构\\citep{Greff-et-al-arxiv2015,Jozefowicz-et-al-ICML2015}。\n\\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}~变得与已探索的最佳变种一样健壮。\n\n\\section{优化\\glsentrytext{long_term_dependency}}\n\\label{sec:optimization_for_long_term_dependencies}\n我们已经在\\secref{sec:long_term_dependencies}和\\secref{sec:the_challenge_of_long_term_dependencies}中描述过在许多\\gls{time_step}上优化~\\glssymbol{RNN}~时发生的\\gls{gradient}消失和爆炸的问题。\n\n由~\\cite{Martens+Sutskever-ICML2011}提出了一个有趣的想法是，二阶导数可能在一阶导数消失的同时消失。\n二阶优化算法可以大致被理解为将一阶导数除以二阶导数（在更高维数，由\\gls{gradient}乘以~\\gls{hessian}~的逆）。\n如果二阶导数与一阶导数以类似的速率收缩，那么一阶和二阶导数的比率可保持相对恒定。\n不幸的是，二阶方法有许多缺点，包括高的计算成本、需要一个大的\\gls{minibatch}、并且倾向于被吸引到鞍点。\n\\cite{Martens+Sutskever-ICML2011}发现采用二阶方法的不错结果。\n之后，\\cite{sutskeverimportance}发现使用较简单的方法可以达到类似的结果，例如经过谨慎初始化的~\\ENNAME{Nesterov}~动量法。\n更详细的内容参考~\\cite{Sutskever-thesis2012}。\n应用于~\\glssymbol{LSTM}~时，这两种方法在很大程度上会被单纯的~\\glssymbol{SGD}（甚至没有动量）取代。\n这是\\gls{ML}中一个延续的主题，设计一个易于优化模型通常比设计出更加强大的优化算法更容易。\n\n% -- 401 --\n\n\\subsection{\\glsentrytext{clipping_gradient}}\n\\label{sec:clipping_gradients}\n如\\secref{sec:cliffs_and_exploding_gradients}讨论，强非线性函数（如由许多\\gls{time_step}计算的\\gls{recurrent_network}）往往倾向于非常大或非常小幅度的\\gls{gradient}。\n如\\figref{fig:chap8_cliff}和\\figref{fig:chap10_cliff_clipping_color}所示，我们可以看到，\\gls{objective_function}（作为参数的函数）存在一个伴随``悬崖''的``地形''：宽且相当平坦区域被\\gls{objective_function}变化快的小区域隔开，形成了一种悬崖。\n\n这导致的困难是，当参数\\gls{gradient}非常大时，\\gls{gradient}下降的参数更新可以将参数抛出很远，进入\\gls{objective_function}较大的区域，到达当前解所作的努力变成了无用功。\n\\gls{gradient}告诉我们，围绕当前参数的无穷小区域内最速下降的方向。\n这个无穷小区域之外，\\gls{cost_function}可能开始拐头向上。\n更新必须被选择为足够小，以避免沿向上的曲面走太远。\n我们通常使用衰减速度足够慢的学习率，使连续的步骤具有大致相同的学习率。\n适合于一个相对线性的地形部分的步长经常在下一步进入地形中更加弯曲的部分时变得不适合，会导致上坡运动。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/cliff_clipping_color}}\n\\fi\n\\caption{\\gls{gradient_clipping}在有两个参数$\\Vw$和$\\Vb$的\\gls{recurrent_network}中的效果示例。\n\\gls{gradient_clipping}可以使\\gls{GD}在极陡峭的悬崖附近更合理地执行。\n这些陡峭的悬崖通常发生在\\gls{recurrent_network}中，位于\\gls{recurrent_network}近似线性的附近。\n悬崖在\\gls{time_step}的数量上呈指数地陡峭，因为对于每个\\gls{time_step}，权重矩阵都自乘一次。\n\\emph{(左)}没有\\gls{gradient_clipping}的\\gls{GD}越过这个小峡谷的底部，然后从悬崖面接收非常大的梯度。\n大梯度灾难性地将参数推到图的轴外。\n\\emph{(右)}使用\\gls{gradient_clipping}的\\gls{GD}对悬崖的反应更温和。\n当它上升到悬崖面时，步长受到限制，使得它不会被推出靠近解的陡峭区域。\n经~\\citet{Pascanu+al-ICML2013-small}许可改编此图。\n}\n\\label{fig:chap10_cliff_clipping_color}\n\\end{figure}\n\n% -- 402 --\n\n一个简单的解决方案已被从业者使用多年：\\firstgls{clipping_gradient}。\n此想法有不同实例\\citep{Mikolov-thesis-2012,Pascanu+al-ICML2013-small}。\n一种选择是在参数更新之前，\\emph{逐元素}地截断\\gls{minibatch}产生的参数\\gls{gradient}~\\citep{Mikolov-thesis-2012}。\n另一种是在参数更新之前\\emph{截断\\gls{gradient}~$\\Vg$的范数$\\norm{ \\Vg }$}~\\citep{Pascanu+al-ICML2013-small}：\n\\begin{align}\n \\text{if}~ \\norm{\\Vg} &> v \\\\\n \\Vg &\\gets \\frac{\\Vg v}{\\norm{g}},\n\\end{align}\n其中$v$是范数上界，$\\Vg$用来更新参数。\n因为所有参数（包括不同的参数组，如权重和\\gls{bias_aff}）的\\gls{gradient}被单个缩放因子联合重整化，所以后一方法具有的优点是保证了每个步骤仍然是在\\gls{gradient}方向上的，但实验表明两种形式类似。\n虽然参数更新与真实\\gls{gradient}具有相同的方向\\gls{gradient}，经过\\gls{gradient}范数截断，参数更新的向量范数现在变得有界。\n这种有界\\gls{gradient}能避免执行\\gls{gradient}爆炸时的有害一步。\n事实上，当\\gls{gradient}大小高于阈值时，即使是采取简单的\\emph{随机步骤}往往工作得几乎一样好。\n如果爆炸非常严重，\\gls{gradient}数值上为{\\tt Inf}或{\\tt Nan}（无穷大或不是一个数字），则可以采取大小为$v$的随机一步，通常会离开数值不稳定的状态。\n截断每\\gls{minibatch}\\gls{gradient}范数不会改变单个\\gls{minibatch}的\\gls{gradient}方向。\n然而，对许多\\gls{minibatch}使用范数截断\\gls{gradient}后的平均值不等同于截断真实\\gls{gradient}（使用所有的实例所形成的\\gls{gradient}）的范数。\n大导数范数的样本，和与之一起出现在同一\\gls{minibatch}的样本，其对最终方向的贡献将被截断。\n不像传统\\gls{minibatch}\\gls{gradient}下降，其中真实\\gls{gradient}的方向是等于所有\\gls{minibatch}\\gls{gradient}的平均。\n换句话说，传统的\\gls{SGD}使用\\gls{gradient}的无偏估计，而使用范数截断的\\gls{gradient}下降引入了经验上是有用的启发式\\gls{bias_aff}。\n而对于逐元素截断，更新的方向与真实\\gls{gradient}或\\gls{minibatch}的\\gls{gradient}不再对齐，但是它仍然是一个下降方向。\n还有学者提出\\citep{Graves-arxiv2013}（相对于隐藏单元）截断\\gls{backward_propagation}\\gls{gradient}，但没有公布与这些变种之间的比较; 我们推测，所有这些方法表现类似。\n\n% -- 403 --\n\n\\subsection{引导信息流的正则化}\n\\label{sec:regularizing_to_encourage_information_flow}\n\\gls{gradient_clipping}有助于处理爆炸的\\gls{gradient}，但它无助于消失的\\gls{gradient}。\n为了解决消失的\\gls{gradient}问题并更好地捕获\\gls{long_term_dependency}，我们讨论了如下想法：在展开循环架构的\\gls{computational_graph}中，沿着与弧边相关联的\\gls{gradient}乘积接近1的部分创建路径。\n在\\secref{sec:the_long_short_term_memory_and_other_gated_rnns}中已经讨论过，实现这一点的一种方法是使用~\\glssymbol{LSTM}~以及其他自循环和\\gls{gated}机制。\n另一个想法是\\gls{regularization}或约束参数，以引导``信息流''。\n特别是即使\\gls{loss_function}只对序列尾部的输出作惩罚，我们也希望\\gls{gradient}向量$\\nabla_{\\Vh^{(t)}} L$在\\gls{backward_propagation}时能维持其幅度。\n形式上，我们要使\n\\begin{align}\n (\\nabla_{\\Vh^{(t)}} L) \\frac{\\partial \\Vh^{(t)}}{\\partial \\Vh^{(t-1)}}\n\\end{align}\n与\n\\begin{align}\n\\nabla_{\\Vh^{(t)}} L \n\\end{align}\n一样大。\n在这个目标下，\\citet{Pascanu+al-ICML2013-small}提出以下正则项：\n\\begin{align}\n \\Omega = \\sum_t \\Bigg(  \\frac{\n \\norm{ (\\nabla_{\\Vh^{(t)}} L) \\frac{\\partial \\Vh^{(t)}}{\\partial \\Vh^{(t-1)}}}}\n {\\norm{\\nabla_{\\Vh^{(t)}} L}} -1 \\Bigg)^2.\n\\end{align}\n计算这一\\gls{gradient}的正则项可能会出现困难，但~\\cite{Pascanu+al-ICML2013-small}提出可以将后向传播向量$\\nabla_{\\Vh^{(t)}} L$考虑为恒值作为近似（为了计算正则化的目的，没有必要通过它们向后传播）。\n使用该正则项的实验表明，如果与标准的启发式截断（处理梯度爆炸）相结合，该正则项可以显著地增加~\\glssymbol{RNN}~可以学习的依赖的跨度。\n因为这种方法将~\\glssymbol{RNN}~的动态保持在爆炸\\gls{gradient}的边缘，\\gls{gradient_clipping}特别重要。\n如果没有\\gls{gradient_clipping}，\\gls{gradient}爆炸将阻碍学习的成功。\n\n这种方法的一个主要弱点是，在处理数据冗余的任务时如\\gls{language_model}，它并不像~\\glssymbol{LSTM}~一样有效。\n\n% -- 404 --\n\n\\section{外显记忆}\n\\label{sec:explicit_memory}\n智能需要知识并且可以通过学习获取知识，这已促使大型深度架构的发展。\n然而，知识是不同的并且种类繁多。\n有些知识是隐含的、潜意识的并且难以用语言表达——比如怎么行走或狗与猫的样子有什么不同。\n其他知识可以是明确的、可陈述的以及可以相对简单地使用词语表达——每天常识性的知识，如``猫是一种动物''，或者为实现自己当前目标所需知道的非常具体的事实，如``与销售团队会议在141室于下午3:00开始''。\n\n\n\\gls{NN}擅长存储隐性知识，但是他们很难记住事实。\n被存储在\\gls{NN}参数中之前，\\gls{SGD}需要多次提供相同的输入，即使如此，该输入也不会被特别精确地存储。\n\\citet{Graves-et-al-arxiv2014}推测这是因为\\gls{NN}缺乏\\textbf{工作存储}(working memory)系统，即类似人类为实现一些目标而明确保存和操作相关信息片段的系统。\n这种外显记忆组件将使我们的系统不仅能够快速``故意''地存储和检索具体的事实，也能利用他们循序推论。\n\\gls{NN}处理序列信息的需要，改变了每个步骤向网络注入输入的方式，长期以来推理能力被认为是重要的，而不是对输入做出自动的、直观的反应\\citep{hinton1990mapping} 。\n\n\n为了解决这一难题，\\citet{Weston2014}引入了\\firstgls{memory_network}，其中包括一组可以通过寻址机制来访问的记忆单元。\n\\gls{memory_network}原本需要监督信号指示他们如何使用自己的记忆单元。\n\\citet{Graves-et-al-arxiv2014}引入的\\firstgls{NTM}，不需要明确的监督指示采取哪些行动而能学习从记忆单元读写任意内容，并通过使用基于内容的软注意机制（~见\\citet{Bahdanau-et-al-ICLR2015-small}和\\secref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}），允许端到端的训练。\n这种软寻址机制已成为其他允许基于\\gls{gradient}优化的模拟算法机制的相关架构的标准\\citep{Sukhbaatar2015,Joulin+Mikolov-2015,Kumar-et-al-2015,Vinyals2015,Grefenstette-et-al-NIPS2015}。\n\n每个记忆单元可以被认为是~\\glssymbol{LSTM}~和GRU中记忆单元的扩展。\n不同的是，网络输出一个内部状态来选择从哪个单元读取或写入，正如数字计算机读取或写入到特定地址的内存访问。\n\n% -- 405 --\n\n产生确切整数地址的函数很难优化。\n为了缓解这一问题，\\glssymbol{NTM}~实际同时从多个记忆单元写入或读取。\n读取时，它们采取许多单元的加权平均值。\n写入时，他们对多个单元修改不同的数值。\n用于这些操作的系数被选择为集中在少数单元，如通过~\\ENNAME{softmax}~函数产生它们。\n使用这些具有非零导数的权重允许控制访问存储器的函数能使用梯度下降法优化。\n关于这些系数的\\gls{gradient}指示着其中每个参数是应该增加还是减少，但\\gls{gradient}通常只在接收大系数的存储器地址上具有大的值。\n\n这些记忆单元通常扩充为包含向量，而不是由~\\glssymbol{LSTM}~或GRU存储单元所存储的单个标量。\n增加记忆单元大小的原因有两个。\n原因之一是，我们已经增加了访问记忆单元的成本。\n我们为产生用于许多单元的系数付出计算成本，但我们预期这些系数聚集在周围小数目的单元。\n通过读取向量值，而不是一个标量，我们可以抵消部分成本。 \n使用向量值的记忆单元的另一个原因是，它们允许\\textbf{基于内容的寻址}(content-based addressing)，其中从一个单元读或写的权重是该单元的函数。\n如果我们能够产生一个模式来匹配某些但并非所有元素，向量值单元允许我们检索一个完整向量值的记忆。\n这类似于人们能够通过几个歌词回忆起一首歌曲的方式。\n我们可以认为基于内容的读取指令是说，``检索一首副歌歌词中带有'我们都住在黄色潜水艇'的歌''。\n当我们要检索的对象很大时，基于内容的寻址更为有用——如果歌曲的每一个字母被存储在单独的记忆单元中，我们将无法通过这种方式找到他们。\n通过比较，\\textbf{基于位置的寻址}(location-based addressing)不允许引用存储器的内容。\n我们可以认为基于位置的读取指令是说``检索347档的歌的歌词''。\n当存储单元哪怕很小时，基于位置的寻址常常也可以是完全合理的机制。\n\n如果一个存储单元的内容在大多数\\gls{time_step}上会被复制（不被忘记），则它包含的信息可以在时间上向前传播，\\gls{gradient}随时间向后传播，而不会消失或爆炸。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/memory_network}}\n\\fi\n\\caption{具有外显记忆网络的示意图，具备\\gls{NTM}的一些关键设计元素。\n在此图中，我们将模型的``\\gls{representation}''部分（``任务网络''，这里是底部的循环网络）与存储事实的模型（记忆单元的集合）的``存储器''部分区分开。\n任务网络学习``控制''存储器，决定从哪读取以及在哪写入（通过读取和写入机制，由指向读取和写入地址的粗箭头指示）。\n}\n\\label{fig:chap10_memory_network}\n\\end{figure}\n\n外显记忆的方法在\\figref{fig:chap10_memory_network}说明，其中我们可以看到一个``任务神经网络''搭配了一个存储器。\n虽然这一任务神经网络可以是前馈或循环的，但整个系统是一个\\gls{recurrent_network}。\n任务网络可以选择读取或写入特定的存储器地址。\n外显记忆似乎允许模型学习普通~\\glssymbol{RNN}~或~\\glssymbol{LSTM} \\glssymbol{RNN}~不能学习的任务。\n这种优点的一个原因可能是因为信息和\\gls{gradient}可以（分别在时间上向前和向后）在非常长的持续时间内传播。\n\n% -- 406 --\n\n作为存储器单元的加权平均值\\gls{backward_propagation}的替代，我们可以将存储器寻址系数解释为概率，并依据此概率随机从一个单元读取\\citep{Zaremba+Sutskever-arxiv2015}。\n优化离散决策的模型需要专门的优化算法，这将在\\secref{sec:back_propagating_through_discrete_stochastic_operations}中描述。\n目前为止，训练这些做离散决策的随机架构，仍比训练进行软判决的确定性算法更难。\n\n无论是软（允许\\gls{backward_propagation}）或随机硬性的，用于选择一个地址的机制与先前在机器翻译的背景下引入的\\gls{attention_mechanism}形式相同\\citep{Bahdanau-et-al-ICLR2015-small}，这在\\secref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}中也有讨论。\n甚至更早之前，\\gls{attention_mechanism}的想法就被引入了\\gls{NN}，在手写生成的情况下\\citep{Graves-arxiv2013}，有一个被约束为通过序列只向前移动的\\gls{attention_mechanism}。\n在机器翻译和\\gls{memory_network}的情况下，每个步骤中关注的焦点可以移动到一个完全不同的地方(相比之前的步骤)。\n\n\\gls{RNN}提供了将\\gls{DL}扩展到序列数据的一种方法。\n它们是我们的\\gls{DL}工具箱中最后一个主要的工具。\n现在我们的讨论将转移到如何选择和使用这些工具，以及如何在真实世界的任务中应用这些工具。\n"
  },
  {
    "path": "Chapter11/README.md",
    "content": "#第十一章笔记\n"
  },
  {
    "path": "Chapter11/practical_methodology.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Yujun Li \n\\chapter{实践方法论}\n\\label{chap:practical_methodology}\n要成功地使用深度学习技术，仅仅知道存在哪些算法和解释他们为何有效的原理是不够的。\n一个优秀的机器学习实践者还需要知道如何针对具体应用挑选一个合适的算法以及如何监控，并根据实验反馈改进机器学习系统。\n在\\gls{ML}系统的日常开发中，实践者需要决定是否收集更多的数据、增加或减少模型\\gls{capacity}、添加或删除\\gls{regularization}项、改进模型的优化、改进模型的近似推断或调试模型的软件实现。\n尝试这些操作都需要大量时间，因此确定正确做法，而不盲目猜测尤为重要的。\n\n\n本书的大部分内容都是关于不同的\\gls{ML}模型、训练算法和\\gls{objective_function}。\n这可能给人一种印象——成为\\gls{ML}专家的最重要因素是了解各种各样的\\gls{ML}技术，并熟悉各种不同的数学。\n在实践中，正确使用一个普通算法通常比草率地使用一个不清楚的算法效果更好。\n正确应用一个算法需要掌握一些相当简单的方法论。\n本章的许多建议都来自~\\cite{ng-lecture-advice}。\n\n\n我们建议参考以下几个实践设计流程：\n\\begin{itemize}\n\\item 确定目标——使用什么样的\\gls{error_metric}，并为此\\gls{error_metric}指定目标值。\n这些目标和\\gls{error_metric}取决于该应用旨在解决的问题。\n% -- 409 end\n\n\n\\item 尽快建立一个\\gls{end_to_end}工作流程，包括估计合适的\\gls{performance_metrics}。\n% 410 head\n\n\\item 搭建系统，并确定性能瓶颈。\n检查哪个部分的性能差于预期，以及是否是因为\\gls{overfitting}、\\gls{underfitting}，或者数据或软件缺陷造成的。\n\n\\item 根据具体观察反复地进行增量式的改动，如收集新数据、调整\\gls{hyperparameter}或改进算法。\n\\end{itemize}\n\n\n我们将使用街景地址号码\\gls{transcription_system}~\\citep{Goodfellow+et+al-ICLR2014a}作为一个运行示例。\n该应用的目标是将建筑物添加到谷歌地图。\n街景车拍摄建筑物，并记录与每张建筑照片相关的GPS坐标。\n\\gls{convolutional_network}识别每张照片上的地址号码，由谷歌地图数据库在正确的位置添加该地址。\n这个商业应用是一个很好的示例，它的开发流程遵循我们倡导的设计方法。\n\n% 410 mid\n我们现在描述这个过程中的每一个步骤。\n\n\n\n\\section{\\glsentrytext{performance_metrics}}\n\\label{sec:performance_metrics}\n确定目标，即使用什么\\gls{error_metric}，是必要的第一步，因为\\gls{error_metric}将指导接下来的所有工作。\n同时我们也应该了解大概能得到什么级别的目标性能。\n% 410 mid\n\n\n值得注意的是对于大多数应用而言，不可能实现绝对零误差。\n即使你有无限的训练数据，并且恢复了真正的\\gls{PD}，\\gls{bayes_error}仍定义了能达到的最小\\gls{error_rate}。\n这是因为输入特征可能无法包含输出变量的完整信息，或是因为系统可能本质上是随机的。\n当然我们还会受限于有限的训练数据。\n\n% 410 end\n训练数据的数量会因为各种原因受到限制。\n当目标是打造现实世界中最好的产品或服务时，我们通常需要收集更多的数据，但必须确定进一步减少误差的价值，并与收集更多数据的成本做权衡。\n数据收集会耗费时间、金钱，或带来人体痛苦（例如，收集人体医疗测试数据）。\n科研中，目标通常是在某个确定\\gls{benchmarks}下探讨哪个算法更好，一般会固定\\gls{training_set}，不允许收集更多的数据。\n% 411 head\n\n\n如何确定合理的性能期望？\n在学术界，通常我们可以根据先前公布的\\gls{benchmarks}结果来估计预期\\gls{error_rate}。\n在现实世界中，一个应用的\\gls{error_rate}有必要是安全的、具有成本效益的或吸引消费者的。\n一旦你确定了想要达到的\\gls{error_rate}，那么你的设计将由如何达到这个\\gls{error_rate}来指导。\n% 411 mid\n\n\n除了需要考虑\\gls{performance_metrics}之外，另一个需要考虑的是度量的选择。\n我们有几种不同的\\gls{performance_metrics}，可以用来度量一个含有\\gls{ML}组件的完整应用的有效性。\n这些\\gls{performance_metrics}通常不同于训练模型的\\gls{cost_function}。 \n如\\secref{sec:the_performance_measure_p}所述，我们通常会度量一个系统的\\gls{accuracy}，或等价地，\\gls{error_rate}。\n\n\n然而，许多应用需要更高级的度量。\n% 411 mid\n\n有时，一种错误可能会比另一种错误更严重。\n例如，垃圾邮件检测系统会有两种错误：将正常邮件错误地归为垃圾邮件，将垃圾邮件错误地归为正常邮件。\n阻止正常消息比允许可疑消息通过糟糕得多。\n我们希望度量某种形式的总\\gls{cost}，其中拦截正常邮件比允许垃圾邮件通过的\\gls{cost}更高，而不是度量垃圾邮件分类的\\gls{error_rate}。\n% 411 mid\n\n\n有时，我们需要训练检测某些罕见事件的二元分类器。\n例如，我们可能会为一种罕见疾病设计医疗测试。\n假设每一百万人中只有一人患病。\n我们只需要让分类器一直报告没有患者，就能轻易地在检测任务上实现$99.9999\\%$的正确率。\n显然，正确率很难描述这种系统的性能。\n解决这个问题的方法是度量\\firstgls{precision}和\\firstgls{recall}。\n\\gls{precision}是模型报告的检测是正确的比率，而\\gls{recall}则是真实事件被检测到的比率。\n检测器永远报告没有患者，会得到一个完美的\\gls{precision}，但\\gls{recall}为零。\n而报告每个人都是患者的检测器会得到一个完美的\\gls{recall}，但是\\gls{precision}会等于人群中患有该病的比例（在我们的例子是$0.0001\\%$，每一百万人只有一人患病）。\n当使用\\gls{precision}和\\gls{recall}时，我们通常会画\\firstgls{prcurve}，$y$轴表示\\gls{precision}，$x$轴表示\\gls{recall}。\n如果检测到的事件发生了，那么分类器会返回一个较高的得分。\n例如，我们将\\gls{feedforward_network}设计为检测一种疾病，估计一个医疗结果由特征$\\Vx$表示的人患病的概率为$\\hat{y} = P(y=1\\mid\\Vx)$。\n每当这个得分超过某个阈值时，我们报告检测结果。\n通过调整阈值，我们能权衡\\gls{precision}和\\gls{recall}。\n在很多情况下，我们希望用一个数而不是曲线来概括分类器的性能。\n要做到这一点，我们可以将\\gls{precision} $p$和\\gls{recall} $r$转换为\\firstgls{fscore}\n\\begin{equation}\n\tF = \\frac{2pr}{p+r}.\n\\end{equation}\n另一种方法是报告\\,\\gls{prcurve}下方的总面积。\n% -- 412 head\n\n\n在一些应用中，\\gls{ML}系统可能会拒绝做出判断。\n如果\\gls{ML}算法能够估计所作判断的置信度，这将会非常有用，特别是在错误判断会导致严重危害，而人工操作员能够偶尔接管的情况下。\n街景\\gls{transcription_system}可以作为这种情况的一个示例。\n这个任务是识别照片上的地址号码，将照片拍摄地点对应到地图上的地址。%??  翻译的很有问题\n如果地图是不精确的，那么地图的价值会严重下降。\n因此只在转录正确的情况下添加地址十分重要。\n如果\\gls{ML}系统认为它不太能像人一样正确地转录，那么最好办法当然是让人来转录照片。\n当然，只有当\\gls{ML}系统能够大量降低需要人工操作处理的图片时，它才是有用的。\n在这种情况下，一种自然的\\gls{performance_measures}是\\firstgls{coverage}。\n\\gls{coverage}是\\gls{ML}系统能够产生响应的样本所占的比率。\n我们权衡\\gls{coverage}和\\gls{precision}。\n一个系统可以通过拒绝处理任意样本的方式来达到$100\\%$的\\gls{precision}，但是\\gls{coverage}降到了$0\\%$。\n对于街景任务，该项目的目标是达到人类级别的转录\\gls{precision}，同时保持$95\\%$的\\gls{coverage}。\n在这项任务中，人类级别的性能是$98\\%$的\\gls{precision}。\n% 412 end\n\n还有许多其他的\\gls{performance_measures}。\n例如，我们可以度量点击率、收集用户满意度调查等等。\n许多专业的应用领域也有特定的标准。\n% 412 end\n\n最重要的是首先要确定改进哪个\\gls{performance_measures}，然后专心提高\\gls{performance_measures}。\n如果没有明确的目标，那么我们很难判断\\gls{ML}系统上的改动是否有所改进。\n\n% -- 412 end\n\n\\section{默认的\\glsentrytext{baseline}模型}\n\\label{sec:default_baseline_models}\n确定\\gls{performance_metrics}和目标后，任何实际应用的下一步是尽快建立一个合理的\\gls{end_to_end}系统。\n本节给出了一些关于在不同情况下使用哪种算法作为第一个\\gls{baseline}方法推荐。\n在本节中，我们提供了关于不同情况下使用哪种算法作为第一\\gls{baseline}方法的推荐。\n值得注意的是，\\gls{DL}研究进展迅速，所以本书出版后很快可能会有更好的默认算法。\n% 413 head \n\n根据问题的复杂性，项目开始时可能无需使用\\gls{DL}。\n如果只需正确地选择几个线性权重就可能解决问题，那么项目可以开始于一个简单的统计模型，如\\gls{logistic_regression}。\n\n\n如果问题属于``\\glssymbol{AI}-完全''类的，如\\gls{object_recognition}、\\gls{SR}、\\gls{machine_translation}等等，那么项目开始于一个合适的\\gls{DL}模型，效果会比较好。\n% 413 mid \n\n\n首先，根据数据的结构选择一类合适的模型。\n如果项目是以固定大小的向量作为输入的\\gls{supervised_learning}，那么可以使用全连接的\\gls{feedforward_network}。\n如果输入有已知的拓扑结构（例如，输入是图像），那么可以使用\\gls{convolutional_network}。\n在这些情况下，刚开始可以使用某些\\gls{piecewise}线性单元（\\glssymbol{ReLU}\\,或者其扩展，如\\,\\glssymbol{leaky_ReLU}、\\glssymbol{PReLU}\\,和\\,\\glssymbol{maxout}）。\n如果输入或输出是一个序列，可以使用\\gls{gated_recurrent_net}（\\glssymbol{LSTM}\\,或\\,\\glssymbol{gated_recurrent_unit}）。\n% 413 mid \n\n具有衰减\\gls{learning_rate}以及\\gls{momentum}的\\,\\glssymbol{SGD}\\,是优化算法一个合理的选择\n（流行的衰减方法有，衰减到固定最低\\gls{learning_rate}的线性衰减、指数衰减，或每次发生验证错误停滞时将\\gls{learning_rate}降低$2-10$倍，这些衰减方法在不同问题上好坏不一）。\n另一个非常合理的选择是Adam算法。\n\\gls{batch_normalization}对优化性能有着显著的影响，特别是对\\gls{convolutional_network}和具有~\\gls{sigmoid}~非线性函数的网络而言。\n虽然在最初的\\gls{baseline}中忽略\\gls{batch_normalization}是合理的，然而当优化似乎出现问题时，应该立刻使用\\gls{batch_normalization}。\n% 413 mid \n\n\n除非\\gls{training_set}包含数千万以及更多的样本，否则项目应该在一开始就包含一些温和的\\gls{regularization}。 \n\\gls{early_stopping}也被普遍采用。\n\\gls{dropout}~也是一个很容易实现，且兼容很多模型和训练算法的出色\\gls{regularizer}。\n\\gls{batch_normalization}有时也能降低\\gls{generalization_error}，此时可以省略~\\gls{dropout}~步骤，因为用于标准化变量的统计量估计本身就存在\\gls{noise}。 %?? 还是有问题\n% -- 413 --  end\n\n\n如果我们的任务和另一个被广泛研究的任务相似，那么通过复制先前研究中已知性能良好的模型和算法，可能会得到很好的效果。\n甚至可以从该任务中复制一个训练好的模型。\n例如，通常会使用在ImageNet上训练好的\\gls{convolutional_network}的特征来解决其他\\gls{CV}任务\\citep{girshickregion}。\n% 414 head\n\n\n一个常见问题是项目开始时是否使用\\gls{unsupervised_learning}，我们将在第三部分进一步探讨这个问题。\n 这个问题和特定领域有关。\n在某些领域，比如\\gls{NLP}，能够大大受益于\\gls{unsupervised_learning}技术，如学习\\gls{unsupervised}\\gls{word_embeddings}。\n在其他领域，如\\gls{CV}，除非是在\\gls{semi_supervised}的设定下（\\gls{labeled}样本数量很少）\\citep{Kingma-et-al-NIPS2014,Rasmus-et-al-arxiv2015}，目前\\gls{unsupervised_learning}并没有带来益处。\n如果应用所在环境中，\\gls{unsupervised_learning}被认为是很重要的，那么将其包含在第一个\\gls{end_to_end}\\gls{baseline}中。\n否则，只有在解决\\gls{unsupervised}问题时，才会第一次尝试时使用\\gls{unsupervised_learning}。\n在发现初始\\gls{baseline}\\gls{overfitting}的时候，我们可以尝试加入\\gls{unsupervised_learning}。\n% 414 mid\n\n\n\\section{决定是否收集更多数据}\n\\label{sec:determining_whether_to_gather_more_data}\n\n在建立第一个\\gls{end_to_end}系统后，就可以度量算法性能并决定如何改进算法。\n许多\\gls{ML}新手都忍不住尝试很多不同的算法来进行改进。\n然而，收集更多的数据往往比改进学习算法要有用得多。\n% 414 mid\n\n\n怎样判断是否要收集更多的数据？\n首先，确定\\gls{training_set}上的性能是否可接受。\n如果模型在\\gls{training_set}上的性能就很差，学习算法都不能在\\gls{training_set}上学习出良好的模型，那么就没必要收集更多的数据。\n反之，可以尝试增加更多的网络层或每层增加更多的\\gls{hidden_unit}，以增加模型的规模。\n此外，也可以尝试调整\\gls{learning_rate}等\\gls{hyperparameter}的措施来改进学习算法。\n如果更大的模型和仔细调试的优化算法效果不佳，那么问题可能源自训练数据的\\emph{质量}。\n数据可能含太多\\gls{noise}，或是可能不包含预测输出所需的正确输入。\n这意味着我们需要重新开始，收集更干净的数据或是收集特征更丰富的数据集。\n% -- 414 end\n\n\n如果\\gls{training_set}上的性能是可接受的，那么我们开始度量\\gls{test_set}上的性能。\n如果\\gls{test_set}上的性能也是可以接受的，那么就顺利完成了。\n如果\\gls{test_set}上的性能比\\gls{training_set}的要差得多，那么收集更多的数据是最有效的解决方案之一。\n这时主要的考虑是收集更多数据的代价和可行性，其他方法降低\\gls{test_error}的代价和可行性，和增加数据数量能否显著提升\\gls{test_set}性能。\n在拥有百万甚至上亿用户的大型网络公司，收集大型数据集是可行的，并且这样做的成本可能比其他方法要少很多，所以答案几乎总是收集更多的训练数据。\n例如，收集大型\\gls{labeled}数据集是解决\\gls{object_recognition}问题的主要因素之一。\n在其他情况下，如医疗应用，收集更多的数据可能代价很高或者不可行。\n一个可以替代的简单方法是降低模型大小或是改进\\gls{regularization}（调整\\gls{hyperparameter}，如\\gls{weight_decay}系数，或是加入\\gls{regularization}策略，如\\,\\gls{dropout}）。\n如果调整\\gls{regularization}\\gls{hyperparameter}后，\\gls{training_set}性能和\\gls{test_set}性能之间的差距还是不可接受，那么收集更多的数据是可取的。\n% 415 mid\n\n\n在决定是否收集更多的数据时，也需要确定收集多少数据。\n如\\figref{fig:chap5_training_size_grows}所示，绘制曲线显示\\gls{training_set}规模和\\gls{generalization_error}之间的关系是很有帮助的。\n根据走势延伸曲线，可以预测还需要多少训练数据来达到一定的性能。\n通常，加入总数目一小部分的样本不会对\\gls{generalization_error}产生显著的影响。\n因此，建议在对数尺度上考虑\\gls{training_set}的大小，例如在后续的实验中倍增样本数目。\n% 415 mid\n\n\n如果收集更多的数据是不可行的，那么改进\\gls{generalization_error}的唯一方法是改进学习算法本身。\n这属于研究领域，并非对应用实践者的建议。\n\n\\section{选择\\glsentrytext{hyperparameter}}\n\\label{sec:selecting_hyperparameters}\n大部分\\gls{DL}算法都有许多\\gls{hyperparameter}来控制不同方面的算法表现。\n有些\\gls{hyperparameter}会影响算法运行的时间和存储成本。\n有些\\gls{hyperparameter}会影响学习到的模型质量，以及在新输入上推断正确结果的能力。\n% -- 415 -end\n\n\n有两种选择\\gls{hyperparameter}的基本方法：手动选择和自动选择。\n手动选择\\gls{hyperparameter}需要了解\\gls{hyperparameter}做了些什么，以及\\gls{ML}模型如何才能取得良好的\\gls{generalization}。\n自动选择\\gls{hyperparameter}算法大大减少了解这些想法的需要，但它们往往需要更高的计算成本。\n% 416 head\n\n\n\\subsection{手动调整\\glsentrytext{hyperparameter}}\n\\label{sec:manual_hyperparameter_tuning}\n手动设置\\gls{hyperparameter}，我们必须了解\\gls{hyperparameter}、\\gls{training_error}、\\gls{generalization_error}和计算资源（内存和运行时间）之间的关系。\n这需要切实了解一个学习算法有效\\gls{capacity}的基础概念，如\\chapref{chap:machine_learning_basics}所描述的。\n% 416 mid\n\n\n手动搜索\\gls{hyperparameter}的目标通常是最小化受限于运行时间和内存预算的\\gls{generalization_error}。\n我们不去探讨如何确定各种\\gls{hyperparameter}对运行时间和内存的影响，因为这高度依赖于平台。\n\n\n手动搜索\\gls{hyperparameter}的主要目标是调整模型的有效\\gls{capacity}以匹配任务的复杂性。\n有效\\gls{capacity}受限于三个因素：模型的表示\\gls{capacity}、学习算法成功最小化训练模型\\gls{cost_function}的能力以及\\gls{cost_function}和训练过程\\gls{regularize}模型的程度。\n具有更多网络层，每层有更多\\gls{hidden_unit}的模型具有较高的表示能力——能够表示更复杂的函数。\n然而，如果训练算法不能找到某个合适的函数来最小化训练\\gls{cost}，或是\\gls{regularization}项（如\\gls{weight_decay}）排除了这些合适的函数，那么即使模型的表达能力较高，也不能学习出合适的函数。%??  还是太乱\n\n% 416 mid\n\n\n当\\gls{generalization_error}以某个\\gls{hyperparameter}为变量，作为函数绘制出来时，通常会表现为U形曲线，如\\figref{fig:chap5_generalization_vs_capacity}所示。\n在某个极端情况下，\\gls{hyperparameter}对应着低\\gls{capacity}，并且\\gls{generalization_error}由于\\gls{training_error}较大而很高。\n这便是\\gls{underfitting}的情况。\n另一种极端情况，\\gls{hyperparameter}对应着高\\gls{capacity}，并且\\gls{generalization_error}由于\\gls{training_error}和\\gls{test_error}之间的差距较大而很高。\n最优的模型\\gls{capacity}位于曲线中间的某个位置，能够达到最低可能的\\gls{generalization_error}，由某个中等的泛化差距(generalization gap)和某个中等的\\gls{training_error}相加构成。\n% -- 416 end\n\n\n\n对于某些\\gls{hyperparameter}，当\\gls{hyperparameter}数值太大时，会发生\\gls{overfitting}。\n例如中间层\\gls{hidden_unit}的数量，增加数量能提高模型的\\gls{capacity}，容易发生\\gls{overfitting}。%??  原文不符 \n对于某些\\gls{hyperparameter}，当\\gls{hyperparameter}数值太小时，也会发生\\gls{overfitting}。\n例如，最小的\\gls{weight_decay}系数允许为零，此时学习算法具有最大的有效\\gls{capacity}，反而容易\\gls{overfitting}。%??  原文不符   这一段好像偏差较大 \n% 417 head\n\n\n并非每个\\gls{hyperparameter}都能对应着完整的U形曲线。\n很多\\gls{hyperparameter}是离散的，如中间层单元数目或是~\\gls{maxout_unit}中线性元件的数目，这种情况只能沿曲线探索一些点。\n有些\\gls{hyperparameter}是二值的。\n通常这些\\gls{hyperparameter}用来指定是否使用学习算法中的一些可选部分，如预处理步骤减去均值并除以标准差来标准化输入特征。\n这些\\gls{hyperparameter}只能探索曲线上的两点。\n其他一些\\gls{hyperparameter}可能会有最小值或最大值，限制其探索曲线的某些部分。%??    \n例如，\\gls{weight_decay}系数最小是零。\n这意味着，如果\\gls{weight_decay}系数为零时模型\\gls{underfitting}，那么我们将无法通过修改\\gls{weight_decay}系数探索\\gls{overfitting}区域。\n换言之，有些\\gls{hyperparameter}只能减少模型\\gls{capacity}。\n% 417 mid\n\n\n\\gls{learning_rate}可能是最重要的\\gls{hyperparameter}。\n如果你只有时间调整一个\\gls{hyperparameter}，那就调整\\gls{learning_rate}。\n相比其他\\gls{hyperparameter}，它以一种更复杂的方式控制模型的有效\\gls{capacity}——当\\gls{learning_rate}适合优化问题时，模型的有效\\gls{capacity}最高，此时\\gls{learning_rate}是\\emph{正确}的，既不是特别大也不是特别小。\n\\gls{learning_rate}关于\\emph{\\gls{training_error}}具有U形曲线，如\\figref{fig:chap11_lr}所示。\n当\\gls{learning_rate}过大时，\\gls{GD}可能会不经意地增加而非减少\\gls{training_error}。\n在理想化的二次情况下，如果\\gls{learning_rate}是最佳值的两倍大时，会发生这种情况\\citep{LeCun+98backprop-small}。\n当\\gls{learning_rate}太小，训练不仅慢，还有可能永久停留在一个很高的\\gls{training_error}。\n关于这种效应，我们知之甚少（不会发生于一个凸\\gls{loss_function}中）。\n% 417 end\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter11/figures/lr_color}}\n\\fi\n\\caption{\\gls{training_error}和\\gls{learning_rate}之间的典型关系。\n注意当\\gls{learning_rate}大于最优值时误差会有显著的提升。\n此图针对固定的训练时间，越小的\\gls{learning_rate}有时候可以以一个正比于\\gls{learning_rate}减小量的因素来减慢训练过程。\n\\gls{generalization_error}也会得到类似的曲线，或者由于\\gls{learning_rate}过大或过小引起的正则化作用而变得复杂化。\n由于一个糟糕的优化从某种程度上说可以避免\\gls{overfitting}，即使是\\gls{training_error}相同的点也会拥有完全不同的\\gls{generalization_error}。}\n\\label{fig:chap11_lr}\n\\end{figure}\n\n% 417 end\n调整\\gls{learning_rate}外的其他参数时，需要同时监测\\gls{training_error}和\\gls{test_error}，以判断模型是否\\gls{overfitting}或\\gls{underfitting}，然后适当调整其\\gls{capacity}。\n\n\n如果\\gls{training_set}错误率大于目标\\gls{error_rate}，那么只能增加模型\\gls{capacity}以改进模型。\n如果没有使用\\gls{regularization}，并且确信优化算法正确运行，那么有必要添加更多的网络层或\\gls{hidden_unit}。\n然而，令人遗憾的是，这增加了模型的计算代价。\n% 418 head\n\n\n如果\\gls{test_set}错误率大于目标\\gls{error_rate}，那么可以采取两个方法。\n\\gls{test_error}是\\gls{training_error}和\\gls{test_error}之间差距与\\gls{training_error}的总和。\n寻找最佳的\\gls{test_error}需要权衡这些数值。\n当\\gls{training_error}较小（因此\\gls{capacity}较大），\\gls{test_error}主要取决于\\gls{training_error}和\\gls{test_error}之间的差距时，通常神经网络效果最好。\n此时目标是缩小这一差距，使\\gls{training_error}的增长速率不快于差距减小的速率。\n要减少这个差距，我们可以改变\\gls{regularization}\\gls{hyperparameter}，以减少有效的模型\\gls{capacity}，如添加~\\gls{dropout}~或\\gls{weight_decay}策略。\n通常，最佳性能来自\\gls{regularization}得很好的大规模模型，比如使用~\\gls{dropout}~的神经网络。\n% 418 mid\n\n\n大部分\\gls{hyperparameter}可以通过推理其是否增加或减少模型\\gls{capacity}来设置。\n部分示例如表\\ref{tab:hyperparameter_effect}所示。\n\n\n% 418 end\n手动调整\\gls{hyperparameter}时，不要忘记最终目标：提升\\gls{test_set}性能。\n加入\\gls{regularization}只是实现这个目标的一种方法。\n只要\\gls{training_error}低，随时都可以通过收集更多的训练数据来减少\\gls{generalization_error}。\n实践中能够确保学习有效的暴力方法就是不断提高模型\\gls{capacity}和\\gls{training_set}的大小，直到解决问题。\n这种做法增加了训练和推断的计算代价，所以只有在拥有足够资源时才是可行的。\n原则上，这种做法可能会因为优化难度提高而失败，但对于许多问题而言，优化似乎并没有成为一个显著的障碍，当然，前提是选择了合适的模型。\n% 419 end\n\n\n% -- 419\n\\begin{table}\n\\centering\n\\small\n\\begin{tabular}{p{2.5cm}|p{1.5cm}|p{4.0cm}|p{4.0cm}}\n\\gls{hyperparameter} & \\gls{capacity}何时增加 & 原因  & 注意事项 \\\\\n\\hline\n\\gls{hidden_unit}数量 &  增加          & 增加\\gls{hidden_unit}数量会增加模型的\\gls{representation}能力。 & 几乎模型每个操作所需的时间和内存代价都会随\\gls{hidden_unit}数量的增加而增加。\\\\\n\\hline\n\\gls{learning_rate} & 调至最优 & 不正确的学习速率，不管是太高还是太低都会由于优化失败而导致低有效\\gls{capacity}的模型。\n & \\\\\n\\hline\n卷积核宽度 & 增加 & 增加卷积核宽度会增加模型的参数数量。&\n较宽的卷积核导致较窄的输出尺寸，除非使用隐式零填充减少此影响，否则会降低模型\\gls{capacity}。 \n较宽的卷积核需要更多的内存存储参数，并会增加运行时间，但较窄的输出会降低内存代价。\n\\\\\n\\hline\n隐式零填充 & 增加 & 在卷积之前隐式添加零能保持较大尺寸的\\gls{representation}。&\n大多数操作的时间和内存代价会增加。\\\\\n\\hline\n\\gls{weight_decay}系数 & 降低 & 降低\\gls{weight_decay}系数使得模型参数可以自由地变大。\n & \\\\\n\\hline\n\\gls{dropout}\\,比率 & 降低 & 较少地丢弃单元可以更多地让单元彼此``协力''来适应\\gls{training_set}。\n & \\\\\n\\end{tabular}\n\\caption{各种\\gls{hyperparameter}对模型\\gls{capacity}的影响。}\n\\label{tab:hyperparameter_effect}\n\\index{Dropout}\n\\index{Weight decay}\n\\end{table}\n% -- 419\n\n\n\n\n\\subsection{自动\\glsentrytext{hyperparameter}优化算法}\n\\label{sec:automatic_hyperparameter_optimization_algorithms}\n理想的学习算法应该是只需要输入一个数据集，就可以输出学习的函数，而不需要手动调整\\gls{hyperparameter}。\n一些流行的学习算法，如\\gls{logistic_regression}和\\gls{SVM}，流行的部分原因是这类算法只有一到两个\\gls{hyperparameter}需要调整，它们也能表现出不错的性能。\n有些情况下，所需调整的\\gls{hyperparameter}数量较少时，神经网络可以表现出不错的性能；但\\gls{hyperparameter}数量有几十甚至更多时，效果会提升得更加明显。\n当使用者有一个很好的初始值，例如由在相同类型的应用和架构上具有经验的人确定初始值，或者使用者在相似问题上具有几个月甚至几年的神经网络\\gls{hyperparameter}调整经验，那么手动调整\\gls{hyperparameter}能有很好的效果。%??  由在相同类型的应用和架构上具有经验的人确定初始  这句话好像不对吧？ --没觉得有问题，你觉得是什么了\n然而，对于很多应用而言，这些起点都不可用。\n在这些情况下，自动算法可以找到合适的\\gls{hyperparameter}。\n% 420 head\n\n\n如果我们仔细想想使用者搜索学习算法合适\\gls{hyperparameter}的方式，我们会意识到这其实是一种优化：\n我们在试图寻找\\gls{hyperparameter}来优化\\gls{objective_function}，例如验证误差，有时还会有一些约束（如训练时间，内存或识别时间的预算）。\n因此，原则上有可能开发出封装学习算法的\\firstgls{hyperparameter_optimization}算法，并选择其\\gls{hyperparameter}，从而使用者不需要指定学习算法的\\gls{hyperparameter}。\n令人遗憾的是，\\gls{hyperparameter}优化算法往往有自己的\\gls{hyperparameter}，如学习算法的每个\\gls{hyperparameter}应该被探索的值的范围。\n然而，这些次级\\gls{hyperparameter}通常很容易选择，这是说，相同的次级\\gls{hyperparameter}能够很多不同的问题上具有良好的性能。\n% 420 mid\n\n\n\\subsection{\\glsentrytext{grid_search}}\n\\label{sec:grid_search}\n当有三个或更少的\\gls{hyperparameter}时，常见的\\gls{hyperparameter}搜索方法是\\firstgls{grid_search}。\n对于每个\\gls{hyperparameter}，使用者选择一个较小的有限值集去探索。\n然后，这些\\gls{hyperparameter}笛卡尔乘积得到一组组\\gls{hyperparameter}，\\gls{grid_search}使用每组\\gls{hyperparameter}训练模型。\n挑选\\gls{validation_set}误差最小的\\gls{hyperparameter}作为最好的\\gls{hyperparameter}。\n如\\figref{fig:chap11_grid_vs_random}所示\\gls{hyperparameter}值的网格。\n% -- 420 end\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{cc}\n\\includegraphics[width=0.35\\textwidth]{Chapter11/figures/grid} &\n\\includegraphics[width=0.35\\textwidth]{Chapter11/figures/random}\n\\end{tabular}\n\\fi\n\\caption{\\gls{grid_search}和\\gls{random_search}的比较。\n为了方便地说明，我们只展示两个\\gls{hyperparameter}的例子，但是我们关注的问题中\\gls{hyperparameter}个数通常会更多。\n\\emph{(左)}为了实现\\gls{grid_search}，我们为每个\\gls{hyperparameter}提供了一个值的集合。\n搜索算法对每一种在这些集合的交叉积中的\\gls{hyperparameter}组合进行训练。\n\\emph{(右)}为了实现\\gls{random_search}，我们给联合\\gls{hyperparameter}赋予了一个概率分布。\n通常\\gls{hyperparameter}之间是相互独立的。\n常见的这种分布的选择是均匀分布或者是对数均匀（从对数均匀分布中抽样，就是对从均匀分布中抽取的样本进行指数运算）的。\n然后这些搜索算法从联合的\\gls{hyperparameter}空间中采样，然后运行每一个样本。\n\\gls{grid_search}和\\gls{random_search}都运行了\\gls{validation_set}上的误差并返回了最优的解。\n这个图说明了通常只有一个\\gls{hyperparameter}对结果有着重要的影响。\n在这个例子中，只有水平轴上的\\gls{hyperparameter}对结果有重要的作用。\n\\gls{grid_search}将大量的计算浪费在了指数量级的对结果无影响的\\gls{hyperparameter}中，相比之下\\gls{random_search}几乎每次测试都测试了对结果有影响的每个\\gls{hyperparameter}的独一无二的值。\n此图经~\\citet{Bergstra+Bengio-LW2011}允许转载。}\n\\label{fig:chap11_grid_vs_random}\n\\end{figure}\n\n\n应该如何选择搜索集合的范围呢？\n在\\gls{hyperparameter}是数值（有序）的情况下，每个列表的最小和最大的元素可以基于先前相似实验的经验保守地挑选出来，以确保最优解非常可能在所选范围内。\n通常，\\gls{grid_search}大约会在\\firstgls{logarithmic_scale}下挑选合适的值，例如，一个\\gls{learning_rate}的取值集合是$\\{0.1,0.01,10^{-3},10^{-4},10^{-5}\\}$，或者\\gls{hidden_unit}数目的取值集合$\\{50,100,200,500,1000,2000\\}$。\n% 421 head\n\n\n通常重复进行\\gls{grid_search}时，效果会最好。\n例如，假设我们在集合$\\{-1,0,1\\}$上\\gls{grid_search}\\gls{hyperparameter} $\\alpha$。\n如果找到的最佳值是$1$，那么说明我们低估了最优值$\\alpha$所在的范围，应该改变搜索格点，例如在集合$\\{1,2,3\\}$中搜索。\n如果最佳值是$0$，那么我们不妨通过细化搜索范围以改进估计，在集合$\\{-0.1,0,0.1\\}$上进行\\gls{grid_search}。\n% -- 422 head\n\n\n\\gls{grid_search}带来的一个明显问题是，计算代价会随着\\gls{hyperparameter}数量呈指数级增长。\n如果有$m$个\\gls{hyperparameter}，每个最多取$n$个值，那么训练和估计所需的试验数将是$O(n^m)$。\n我们可以并行地进行实验，并且并行要求十分宽松（进行不同搜索的机器之间几乎没有必要进行通信）。\n令人遗憾的是，由于\\gls{grid_search}指数级增长的计算代价，即使是并行，我们也无法提供令人满意的搜索规模。\n\n\n\\subsection{\\glsentrytext{random_search}}\n\\label{sec:random_search}\n幸运的是，有一个替代\\gls{grid_search}的方法，并且编程简单，使用更方便，能更快地收敛到\\gls{hyperparameter}的良好取值：\\gls{random_search}~\\citep{Bergstra+Bengio-2012-small}。\n% 422\n\n\n\\gls{random_search}过程如下。\n首先，我们为每个\\gls{hyperparameter}定义一个边缘分布，例如，\\gls{bernoulli_distribution}或\\gls{categorical_distribution}（分别对应着二元\\gls{hyperparameter}或离散\\gls{hyperparameter}），或者\\gls{logarithmic_scale}上的均匀分布（对应着正实值\\gls{hyperparameter}）。\n例如，\n\\begin{align}\n\t\\texttt{log\\_learning\\_rate} &\\sim u(-1, -5), \\\\\n\t\\texttt{learning\\_rate} &= 10^{\\texttt{log\\_learning\\_rate}},\n\\end{align}\n其中，$u(a,b)$表示区间$(a,b)$上均匀采样的样本。\n类似地，$\\texttt{log\\_number\\_of\\_hidden\\_units}$可以从$u(\\log(50), \\log(2000))$上采样。\n% 422 mid\n\n\n与\\gls{grid_search}不同，我们\\emph{不需要离散化}\\gls{hyperparameter}的值。这允许我们在一个更大的集合上进行搜索，而不产生额外的计算代价。%?? bin 不知道如何翻译bin，你有什么好的翻译没 \n实际上，如\\figref{fig:chap11_grid_vs_random}所示，当有几个\\gls{hyperparameter}对\\gls{performance_metrics}没有显著影响时，\\gls{random_search}相比于\\gls{grid_search}指数级地高效。\n\\cite{Bergstra+Bengio-2012-small}进行了详细的研究并发现相比于\\gls{grid_search}， \\gls{random_search}能够更快地减小\\gls{validation_set}误差（就每个模型运行的试验数而言）。\n% 422 end\n\n与\\gls{grid_search}一样，我们通常会重复运行不同版本的\\gls{random_search}，以基于前一次运行的结果改进下一次搜索。\n% 422 end\n\n\n\\gls{random_search}能比\\gls{grid_search}更快地找到良好\\gls{hyperparameter}的原因是，没有浪费的实验，不像\\gls{grid_search}有时会对一个\\gls{hyperparameter}的两个不同值（给定其他\\gls{hyperparameter}值不变）给出相同结果。\n在\\gls{grid_search}中，其他\\gls{hyperparameter}将在这两次实验中拥有相同的值，而在\\gls{random_search}中，它们通常会具有不同的值。\n因此，如果这两个值的变化所对应的\\gls{validation_set}误差没有明显区别的话，\\gls{grid_search}会没有必要地重复两个等价的实验，而\\gls{random_search}仍然会对其他\\gls{hyperparameter}进行两次独立地探索。\n\n% 423 head\n\n\\subsection{基于模型的\\glsentrytext{hyperparameter}优化}\n\\label{sec:model_based_hyperparameter_optimization}\n\\gls{hyperparameter}搜索问题可以转化为一个优化问题。\n决策变量是\\gls{hyperparameter}。\n优化的\\gls{cost}是\\gls{hyperparameter}训练出来的模型在\\gls{validation_set}上的误差。\n在简化的设定下，可以计算\\gls{validation_set}上可导误差函数关于\\gls{hyperparameter}的梯度，然后我们遵循这个梯度更新\\citep{bengio:1999:snowbird,bengio-hyper-NC00,maclaurin2015gradient}。\n令人遗憾的是，在大多数实际设定中，这个梯度是不可用的。\n这可能是因为其高额的计算代价和存储成本，也可能是因为\\gls{validation_set}误差在\\gls{hyperparameter}上本质上不可导，例如\\gls{hyperparameter}是离散值的情况。\n% 423 mid\n\n\n为了弥补梯度的缺失，我们可以对\\gls{validation_set}误差建模，然后通过优化该模型来提出新的\\gls{hyperparameter}猜想。\n大部分基于模型的\\gls{hyperparameter}搜索算法，都是使用贝叶斯回归模型来估计每个\\gls{hyperparameter}的\\gls{validation_set}误差期望和该期望的不确定性。\n因此，优化涉及到探索（探索高度不确定的\\gls{hyperparameter}，可能带来显著的效果提升，也可能效果很差）和使用（使用已经确信效果不错的\\gls{hyperparameter}——通常是先前见过的非常熟悉的\\gls{hyperparameter}）之间的权衡。\n关于\\gls{hyperparameter}优化的最前沿方法还包括Spearmint~\\citep{Snoek+al-NIPS2012-small}，TPE~\\citep{Bergstra+al-NIPS2011}和SMAC~\\citep{hutter+hoos+leyton+brown:2011}。\n\n\n% 423 end\n目前，我们无法明确确定，贝叶斯\\gls{hyperparameter}优化是否是一个能够实现更好\\gls{DL}结果或是能够事半功倍的成熟工具。\n贝叶斯\\gls{hyperparameter}优化有时表现得像人类专家，能够在有些问题上取得很好的效果，但有时又会在某些问题上发生灾难性的失误。\n看看它是否适用于一个特定的问题是值得尝试的，但目前该方法还不够成熟或可靠。\n就像所说的那样，\\gls{hyperparameter}优化是一个重要的研究领域，通常主要受\\gls{DL}所需驱动，但是它不仅能贡献于整个\\gls{ML}领域，还能贡献于一般的工程学。\n% 424 head\n\n\n大部分\\gls{hyperparameter}优化算法比\\gls{random_search}更复杂，并且具有一个共同的缺点，在它们能够从实验中提取任何信息之前，它们需要运行完整的训练实验。\n相比于人类实践者手动搜索，考虑实验早期可以收集的信息量，这种方法是相当低效的，因为手动搜索通常可以很早判断出某组\\gls{hyperparameter}是否是完全病态的。\n\\cite{swersky2014freeze}提出了一个可以维护多个实验的早期版本算法。\n在不同的时间点，\\gls{hyperparameter}优化算法可以选择开启一个新实验，``冻结''正在运行但希望不大的实验，或是``解冻''并恢复早期被冻结的，但现在根据更多信息后又有希望的实验。\n\n\n% 424\n\\section{调试策略}\n\\label{sec:debugging_strategies}\n当一个\\gls{ML}系统效果不好时，通常很难判断效果不好的原因是算法本身，还是算法实现错误。\n由于各种原因，\\gls{ML}系统很难调试。\n\n\n% 424\n在大多数情况下，我们不能提前知道算法的行为。\n事实上，使用\\gls{ML}的整个出发点是，它会发现一些我们自己无法发现的有用行为。\n如果我们在一个\\emph{新}的分类任务上训练一个神经网络，它达到$5\\%$的\\gls{test_error}，我们没法直接知道这是期望的结果，还是次优的结果。\n\n\n另一个难点是，大部分\\gls{ML}模型有多个自适应的部分。\n如果一个部分失效了，其他部分仍然可以自适应，并获得大致可接受的性能。\n例如，假设我们正在训练多层神经网络，其中参数为权重$\\MW$和\\gls{bias_aff} $\\Vb$。\n进一步假设，我们单独手动实现了每个参数的\\gls{GD}规则。\n而我们在偏置更新时犯了一个错误：\n\\begin{equation}\n\t\\Vb \\leftarrow \\Vb - \\alpha,\n\\end{equation}\n其中$\\alpha$是\\gls{learning_rate}。\n这个错误更新没有使用梯度。\n它会导致偏置在整个学习中不断变为负值，对于一个学习算法来说这显然是错误的。 \n然而只是检查模型输出的话，该错误可能并不是显而易见的。\n根据输入的分布，权重可能可以自适应地补偿负的偏置。\n% -- 425 head\n\n\n大部分神经网络的调试策略都是解决这两个难题的一个或两个。\n我们可以设计一种足够简单的情况，能够提前得到正确结果，判断模型预测是否与之相符；我们也可以设计一个测试，独立检查神经网络实现的各个部分。\n\n\n一些重要的调试检测如下所列。\n\n\\emph{可视化计算中模型的行为}：%??  in action \n当训练模型检测图像中的对象时，查看一些模型检测到部分重叠的图像。\n在训练语音生成模型时，试听一些生成的语音样本。\n这似乎是显而易见的，但在实际中很容易只注意量化\\gls{performance_metrics}，如\\gls{accuracy}或对数似然。\n直接观察\\gls{ML}模型运行其任务，有助于确定其达到的量化性能数据是否看上去合理。\n错误评估模型性能可能是最具破坏性的错误之一，因为它们会使你在系统出问题时误以为系统运行良好。\n% 425 mid\n\n\n\\emph{可视化最严重的错误}：\n大多数模型能够输出运行任务时的某种置信度量。\n例如，基于\\,\\gls{softmax}\\,输出层的分类器给每个类分配一个概率。\n因此，分配给最有可能的类的概率给出了模型在其分类决定上的置信估计值。\n通常，相比于正确预测的概率最大似然训练会略有高估。\n但是由于实际上模型的较小概率指示结果对应着正确的标签的可能也较小，因此它们在一定意义上还是有些用的。\n通过查看\\gls{training_set}中很难正确建模的样本，通常可以发现该数据预处理或者标记方式的问题。\n例如，街景\\gls{transcription_system}原本有个问题是，地址号码检测系统会将图像裁剪得过于紧密，而省略掉了一些数字。\n然后转录网络会给这些图像的正确答案分配非常低的概率。\n将图像排序，确定置信度最高的错误，显示系统的裁剪有问题。\n修改检测系统裁剪更宽的图像，使整个系统获得了更好的性能，即便转录网络需要能够处理地址号码中位置和范围更大变化的情况。\n% 425 end\n\n\n\\emph{根据训练和\\gls{test_error}检测软件}：\n我们往往很难确定底层软件是否是正确实现。\n训练和\\gls{test_error}能够提供一些线索。\n如果\\gls{training_error}较低，但是\\gls{test_error}较高，那么很有可能训练过程是在正常运行，但模型由于算法原因\\gls{overfitting}了。\n另一种可能是，\\gls{test_error}没有被正确地度量，可能是由于训练后保存模型再重载去度量\\gls{test_set}时出现问题，或者是因为测试数据和训练数据预处理的方式不同。\n如果训练和\\gls{test_error}都很高，那么很难确定是软件错误，还是由于算法原因模型\\gls{underfitting}。\n这种情况需要进一步的测试，如下面所述。\n\n% -- 426 head\n\n\\emph{拟合极小的数据集}：\n当\\gls{training_set}上有很大的误差时，我们需要确定问题是真正的\\gls{underfitting}，还是软件错误。\n通常，即使是小模型也可以保证很好地拟合一个足够小的数据集。\n例如，只有一个样本的分类数据可以通过正确设置输出层的偏置来拟合。\n通常，如果不能训练一个分类器来正确标注一个单独的样本，或不能训练一个\\gls{AE}来成功地精准再现一个单独的样本，或不能训练一个生成模型来一致地生成一个单独的样本，那么很有可能是由于软件错误阻止\\gls{training_set}上的成功优化。\n此测试可以扩展到只有少量样本的小数据集上。\n\n% 426 mid\n\n\\emph{比较反向传播导数和数值导数}：\n如果读者正在使用一个需要实现梯度计算的软件框架，或者在添加一个新操作到求导库中，必须定义它的\\texttt{bprop}方法，那么常见的错误原因是没能正确地实现梯度表达。\n验证这些求导正确性的一种方法是比较实现的自动求导和通过\\firstgls{finite_difference}计算的导数。\n因为\n\\begin{equation}\n\tf'(x) = \\lim_{\\epsilon \\to 0} \\frac{f(x+\\epsilon) - f(x)}{\\epsilon},\n\\end{equation}\n我们可以使用小的、有限的$\\epsilon$近似导数：\n\\begin{equation}\n\tf'(x) \\approx \\frac{f(x+\\epsilon) - f(x)}{\\epsilon}.\n\\end{equation}\n我们可以使用\\firstgls{centered_difference}提高近似的\\gls{accuracy}：\n\\begin{equation}\n\tf'(x) \\approx \\frac{ f(x+\\frac{1}{2}\\epsilon) - f(x-\\frac{1}{2}\\epsilon) }{\\epsilon}.\n\\end{equation}\n扰动大小$\\epsilon$必须足够大，以确保该扰动不会由于数值计算的有限\\gls{precision}问题产生舍入误差。\n\n% 426 end\n\n通常，我们会测试向量值函数$g:\\SetR^m \\to \\SetR^n$的梯度或\\,\\gls{jacobian}\\,矩阵。\n令人遗憾的是，\\gls{finite_difference}只允许我们每次计算一个导数。\n我们可以使用\\gls{finite_difference} $mn$次评估$g$的所有偏导数，也可以将该测试应用于一个新函数（在函数$g$的输入输出都加上随机投影）。%??  后面这句好像不对？  g的输入输出都使用随机投影的\n例如，我们可以将导数实现的测试用于函数$f(x) = \\Vu^T g(\\Vv x)$，其中$\\Vu$和$\\Vv$是随机向量。%??  这句也不对\n正确计算$f'(x)$要求能够正确地通过$g$反向传播，但是使用\\gls{finite_difference}能够高效地计算，因为$f$只有一个输入和一个输出。\n通常，一个好的方法是在多个$\\Vu$值和$\\Vv$值上重复这个测试，可以减少测试忽略了垂直于随机投影的错误的几率。%??  很难\n\n% 427 head\n\n如果我们可以在复数上进行数值计算，那么使用复数作为函数的输入会有非常高效的数值方法估算梯度\\citep{Squire+Trapp-1998}。\n该方法基于如下观察\n\\begin{align}\n\tf(x + i\\epsilon) &= f(x) + i\\epsilon f'(x) + O(\\epsilon^2) ,\\\\\n\t\\text{real}( f(x+i\\epsilon) ) &= f(x) + O(\\epsilon^2), \\quad \\text{image}( \\frac{f(x+i\\epsilon)}{ \\epsilon } ) = f'(x) + O(\\epsilon^2),\n\\end{align}\n其中$i=\\sqrt{-1}$。\n和上面的实值情况不同，这里不存在消除影响，因为我们对$f$在不同点上计算差分。\n因此我们可以使用很小的$\\epsilon$，比如$\\epsilon = 10^{-150}$，其中误差$O(\\epsilon^2)$对所有实用目标都是微不足道的。\n\n% 427 mid\n\n\\emph{监控激活函数值和梯度的直方图}：\n可视化神经网络在大量训练迭代后（也许是一个\\gls{epoch}）收集到的激活函数值和梯度的统计量往往是有用的。\n\\gls{hidden_unit}的预激活值可以告诉我们该单元是否饱和，或者它们饱和的频率如何。\n例如，对于整流器，它们多久关一次？是否有单元一直关闭？\n对于双曲正切单元而言，预激活绝对值的平均值可以告诉我们该单元的饱和程度。\n在深度网络中，传播梯度的快速增长或快速消失，可能会阻碍优化过程。\n最后，比较参数梯度和参数的量级也是有帮助的。\n正如\\citep{Bottou-DLSS2015}所建议的，我们希望参数在一个\\gls{minibatch}更新中变化的幅度是参数量值$1\\%$这样的级别，而不是$50\\%$或者$0.001\\%$（这会导致参数移动得太慢）。\n也有可能是某些参数以良好的步长移动，而另一些停滞。\n如果数据是稀疏的（比如自然语言），有些参数可能很少更新，检测它们变化时应该记住这一点。\n\n% 428 head\n\n最后，许多\\gls{DL}算法为每一步产生的结果提供了某种保证。\n例如，在第三部分，我们将看到一些使用代数解决优化问题的近似推断算法。\n通常，这些可以通过测试它们的每个保证来调试。\n某些优化算法提供的保证包括，\\gls{objective_function}值在算法的迭代步中不会增加，某些变量的导数在算法的每一步中都是零，所有变量的梯度在收敛时会变为零。\n通常，由于舍入误差，这些条件不会在数字计算机上完全成立，因此调试测试应该包含一些容差参数。\n\n% 428 mid\n\n\\section{示例：多位数字识别}\n\\label{sec:example_multi_digit_number_recognition}\n为了\\gls{end_to_end}说明如何在实践中应用我们的设计方法论，我们从设计\\gls{DL}组件的视角出发，简单地介绍下街景\\gls{transcription_system}。\n显然，整个系统的许多其他组件，如街景车、数据库设施等等，也是极其重要的。\n\n% 428 mid\n\n从\\gls{ML}任务的视角出发，首先这个过程要采集数据。\n街景车收集原始数据，然后操作员手动提供标签。\n转录任务开始前有大量的数据处理工作，包括在转录前使用其他\\gls{ML}技术\\emph{探测}房屋号码。\n\n% 428 mid\n\n转录项目开始于选择\\gls{performance_metrics}和对这些度量的期望值。\n一个重要的总原则是度量的选择要符合项目的业务目标。\n因为地图只有是高\\gls{accuracy}时才有用，所以为这个项目设置高\\gls{accuracy}的要求非常重要。\n具体地，目标是达到人类水平，$98\\%$的\\gls{accuracy}。\n这种程度的\\gls{accuracy}并不是总能达到。\n为了达到这个级别的\\gls{accuracy}，街景\\gls{transcription_system}牺牲了\\gls{coverage}。\n因此在保持\\gls{accuracy} $98\\%$的情况下，\\gls{coverage}成了这个项目优化的主要\\gls{performance_metrics}。\n随着\\gls{convolutional_network}的改进，我们能够降低网络拒绝转录输入的置信度阈值，最终超出了\\gls{coverage} $95\\%$的目标。\n\n% -- 428 end\n\n在选择量化目标后，我们推荐方法的下一步是要快速建立一个合理的\\gls{baseline}系统。\n对于视觉任务而言，\\gls{baseline}系统是带有\\gls{ReLU}的\\gls{convolutional_network}。\n转录项目开始于一个这样的模型。\n当时，使用\\gls{convolutional_network}输出预测序列并不常见。\n开始时，我们使用一个尽可能简单的\\gls{baseline}模型，该模型输出层的第一个实现包含$n$个不同的~\\gls{softmax_unit}来预测$n$个字符的序列。\n我们使用与训练分类任务相同的方式来训练这些~\\gls{softmax_unit}，独立地训练每个~\\gls{softmax_unit}。\n\n% 429 head\n\n我们建议反复细化这些\\gls{baseline}，并测试每个变化是否都有改进。\n街景\\gls{transcription_system}的第一个变化受激励于\\gls{coverage}指标的理论理解和数据结构。\n具体地，当输出序列的概率低于某个值$t$即$p(\\Vy\\mid\\Vx) < t$时，网络拒绝为输入$\\Vx$分类。\n最初，$p(\\Vy\\mid\\Vx)$的定义是临时的，简单地将所有~\\gls{softmax}输出乘在一起。\n这促使我们发展能够真正计算出合理对数似然的特定输出层和\\gls{cost_function}。%??  后来是否该去掉？\n这种方法使得样本拒绝机制更有效。\n\n\n此时，\\gls{coverage}仍低于$90\\%$，但该方法没有明显的理论问题了。\n因此，我们的方法论建议综合\\gls{training_set}和\\gls{test_set}性能，以确定问题是否是\\gls{underfitting}或\\gls{overfitting}。\n在这种情况下，训练和\\gls{test_set}误差几乎是一样的。\n事实上，这个项目进行得如此顺利的主要原因是有数以千万计的\\gls{labeled}样本数据集可用。\n因为训练和\\gls{test_set}的误差是如此相似，这表明要么是这个问题\\gls{underfitting}，要么是训练数据的问题。\n我们推荐的调试策略之一是可视化模型最糟糕的错误。\n在这种情况下，这意味着可视化 不正确而模型给了最高置信度的\\gls{training_set}转录结果。\n结果显示，主要是输入图像裁剪得太紧，有些和地址相关的数字被裁剪操作除去了。\n例如，地址``1849''的图片可能裁切得太紧，只剩下``849''是可见的。\n如果我们花费几周时间改进确定裁剪区域的地址号码检测系统的\\gls{accuracy}，或许也可以解决这个问题。%??  \n与之不同，项目团队采取了更实际的办法，简单地系统性扩大裁剪区域的宽度，使其大于地址号码检测系统预测的区域宽度。%??    ’大于‘ 不对吧， 加个 使其\n这种单一改变将\\gls{transcription_system}的\\gls{coverage}提高了$10$个百分点。\n\n% -- 429 end\n\n最后，性能提升的最后几个百分点来自调整\\gls{hyperparameter}。\n这主要包括在保持一些计算代价限制的同时加大模型的规模。\n因为\\gls{training_error}和\\gls{test_error}保持几乎相等，所以明确表明性能不足是由\\gls{underfitting}造成的，数据集本身也存在一些问题。\n\n\n总体来说，转录项目是非常成功的，可以比人工速度更快、代价更低地转录数以亿计的地址。\n\n我们希望本章中介绍的设计原则能带来其他更多类似的成功。\n\n% -- 430 --\n"
  },
  {
    "path": "Chapter12/README.md",
    "content": "#第十二章笔记\n"
  },
  {
    "path": "Chapter12/annotations.txt",
    "content": "{'user': 'acct:corenel@hypothes.is', 'text': '在本章中', 'origin_text': '                              !!!本章!!!  ，我们将介绍如何使用深度学习解决计算机视觉、语音识别、自然语言处', 'time': '2017-01-19T11:11'}\n{'user': 'acct:corenel@hypothes.is', 'text': '来解决', 'origin_text': '              本章，我们将介绍如何使用深度学习  !!!解决!!!  计算机视觉、语音识别、自然语言处理以及其他商业领域中的应用。首', 'time': '2017-01-19T11:11'}\n{'user': 'acct:corenel@hypothes.is', 'text': '首先，我们将讨论在许多重要的AI应用中所需的大规模神经网络的实现。', 'origin_text': '解决计算机视觉、语音识别、自然语言处理以及其他商业领域中的应用。  !!!首先我们讨论在许多最重要的AI应用中所需的大规模神经网络的实现。!!!  接着，我们回顾深度学习已经成功应用的几个特定领域。尽管深度学', 'time': '2017-01-19T11:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '其次，我们将回顾深度学习已经成功应用的几个特定领域。', 'origin_text': '先我们讨论在许多最重要的AI应用中所需的大规模神经网络的实现。  !!!接着，我们回顾深度学习已经成功应用的几个特定领域。!!!  尽管深度学习的一个目标是设计能够处理各种任务的算法，然而截止目', 'time': '2017-01-19T11:15'}\n{'user': 'acct:corenel@hypothes.is', 'text': '深度学习的应用', 'origin_text': '尽管深度学习的一个目标是设计能够处理各种任务的算法，然而截止目前  !!!应用深度学习!!!  仍然需要一定程度的特殊化。例如，计算机视觉中的任务对每一个样本', 'time': '2017-01-19T11:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '其中一个关键的因素就是网络规模的巨大提升', 'origin_text': '纪80年代，如今神经网络的精度以及处理任务的复杂度都有一定提升，  !!!网络规模的巨大提升是一个关键的因素!!!  。正如我们在\\\\sec?中看到的一样，在过去的三四十年中，网络规', 'time': '2017-01-19T11:25'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在过去的三十年内', 'origin_text': '的巨大提升是一个关键的因素。正如我们在\\\\sec?中看到的一样，  !!!在过去的三四十年中!!!  ，网络规模是以指数级的速度递增的，尽管如今的人工神经网络的规模也', 'time': '2017-01-19T11:29'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。然而如今的人工神经网络的规模也仅仅和昆虫的神经系统差不多。', 'origin_text': '中看到的一样，在过去的三四十年中，网络规模是以指数级的速度递增的  !!!，尽管如今的人工神经网络的规模也仅仅和昆虫的神经系统差不多。!!!  大规模神经网络的必要性，所以深度学习需要高性能的硬件设施和软', 'time': '2017-01-19T11:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '由于规模的大小对于神经网络来说至关重要，因此深度学习需要高性能的硬件设施和软件实现。', 'origin_text': '，尽管如今的人工神经网络的规模也仅仅和昆虫的神经系统差不多。  !!!大规模神经网络的必要性，所以深度学习需要高性能的硬件设施和软件实现。!!!  快速的CPU实现传统的神经网络是用单台机器的CPU来训', 'time': '2017-01-19T11:34'}\n{'user': 'acct:corenel@hypothes.is', 'text': '得', 'origin_text': '11年，最好的CPU在训练神经网络时使用定点运算能够比浮点运算跑  !!!的!!!  更快。通过调整定点运算的实现方式，{Vanhoucke-et-', 'time': '2017-01-19T11:39'}\n{'user': 'acct:corenel@hypothes.is', 'text': '3倍于一个强浮点运算系统的速度', 'origin_text': '算的实现方式，{Vanhoucke-et-al-2011}获得了  !!!相对一个很强的浮点运算系统3倍的加速!!!  。因为各个新型CPU都有各自不同的特性，所以有时候采用浮点运算', 'time': '2017-01-19T13:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '一条重要的准则就是，通过特殊设计的数值运算，我们可以获得巨大的回报。', 'origin_text': '型CPU都有各自不同的特性，所以有时候采用浮点运算实现会更快。  !!!一条重要的准则就是通过特殊设计的数值运算可以获得巨大的回报。!!!  除了选择定点运算或者浮点运算以外，还包括其他的策略，如通过优化', 'time': '2017-01-19T11:50'}\n{'user': 'acct:corenel@hypothes.is', 'text': '其他的策略还包括了如', 'origin_text': '数值运算可以获得巨大的回报。除了选择定点运算或者浮点运算以外，  !!!还包括其他的策略，如!!!  通过优化数据结构避免高速缓存缺失、使用向量指令等。如果模型规模', 'time': '2017-01-19T11:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '图形处理器（GPU）最初是为图形应用而开发的专用硬件组件。', 'origin_text': '。GPU 实现许多现代神经网络的实现基于图形处理器。  !!!GPU是一种特殊设计的硬件，设计的原始目的是为了处理图形应用!!!  。视频游戏系统的消费市场刺激了图形处理硬件的发展。它为视频游', 'time': '2017-01-19T12:04'}\n{'user': 'acct:corenel@hypothes.is', 'text': '视频游戏的渲染', 'origin_text': '展。它为视频游戏所设计的特性也可以使神经网络的计算受益。  !!!视频游戏!!!  要求许多操作能够快速并行地实现。环境和角色模型通过一系列顶点的', 'time': '2017-01-19T12:06'}\n{'user': 'acct:corenel@hypothes.is', 'text': '显卡必须并行地对许多顶点执行矩阵乘法与除法', 'origin_text': '的3D坐标确定。为了将大量的3D坐标转化为2D显示器上的坐标，  !!!显卡必须快速实现矩阵乘法或者除法!!!  。之后，显卡必须并行地实现每个像素上的计算来确定每个像素点的颜', 'time': '2017-01-19T12:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '执行', 'origin_text': '以使神经网络的计算受益。视频游戏要求许多操作能够快速并行地  !!!实现!!!  。环境和角色模型通过一系列顶点的3D坐标确定。为了将大量的3', 'time': '2017-01-19T12:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '显卡必须并行地在每个像素上执行诸多计算，', 'origin_text': '为2D显示器上的坐标，显卡必须快速实现矩阵乘法或者除法。之后，  !!!显卡必须并行地实现每个像素上的计算!!!  来确定每个像素点的颜色。在这两种情况下，计算都是非常简单的，并', 'time': '2017-01-19T12:10'}\n{'user': 'acct:corenel@hypothes.is', 'text': '不需要通过{\\\\tt if}语句来判断确定每个顶点需要乘哪个矩阵\\n', 'origin_text': '算。例如，同一个刚体内的每个顶点都会乘上相同的矩阵；也就是说，  !!!不需要通过{\\\\tt if}判断确定顶点需要乘哪个矩阵!!!  。计算过程也是完全相互独立的，因此也能够并行操作。计算过程还', 'time': '2017-01-19T12:12'}\n{'user': 'acct:corenel@hypothes.is', 'text': '各个计算过程之间', 'origin_text': '就是说，不需要通过{\\\\tt if}判断确定顶点需要乘哪个矩阵。  !!!计算过程!!!  也是完全相互独立的，因此也能够并行操作。计算过程还涉及处理大量', 'time': '2017-01-19T12:13'}\n{'user': 'acct:corenel@hypothes.is', 'text': '能够实现并行操作', 'origin_text': '}判断确定顶点需要乘哪个矩阵。计算过程也是完全相互独立的，因此  !!!也能够并行操作!!!  。计算过程还涉及处理大量内存缓冲以及描述每一个对象的纹理（颜色', 'time': '2017-01-19T12:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '描述每一个需要被渲染的对象的纹理（颜色模式）的位图信息', 'origin_text': '独立的，因此也能够并行操作。计算过程还涉及处理大量内存缓冲以及  !!!描述每一个对象的纹理（颜色模式）如何渲染的位图信息!!!  。总的来说，这使显卡设计为拥有高度并行特性以及很高的内存带宽，', 'time': '2017-01-19T12:15'}\n{'user': 'acct:corenel@hypothes.is', 'text': '神经网络算法所需要的性能特性是相同的', 'origin_text': '度以及更弱的处理分支运算的能力。与上述的实时图形算法相比，  !!!神经网络算法需要的是相同的性能特性!!!  。神经网络算法通常涉及大量参数、激活值、梯度值的缓冲区，其中每', 'time': '2017-01-19T12:17'}\n{'user': 'acct:corenel@hypothes.is', 'text': 'GPU一个显著的优势是其极高的内存带宽', 'origin_text': '存(cache)，所以内存带宽通常会成为主要瓶颈。相比CPU，  !!!GPU极高的内存带宽成为了一个显著的优势!!!  。神经网络的训练算法通常并不涉及分支运算和复杂的控制指令，所以', 'time': '2017-01-19T12:28'}\n{'user': 'acct:corenel@hypothes.is', 'text': '通常并不涉及大量的分支运算与复杂的控制指令', 'origin_text': 'PU极高的内存带宽成为了一个显著的优势。神经网络的训练算法通常  !!!并不涉及分支运算和复杂的控制指令!!!  ，所以更适合在GPU硬件上训练。由于神经网络能够被分为多个单独', 'time': '2017-01-19T12:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': '只要将计算的输出值作为像素值写入缓冲区，GPU就可以用于科学计算', 'origin_text': '颜色的任务。原则上，GPU不要求这些像素值实际基于渲染任务。  !!!将计算的输出值作为像素值写入缓冲区，GPU可以用于科学计算!!!  。{Steinkrau2005}在GPU上实现了一个两层全连接', 'time': '2017-01-19T12:35'}\n{'user': 'acct:corenel@hypothes.is', 'text': '加速监督卷积网络的训练', 'origin_text': 'lla:inria-00112631}也论证了相同的技术可以用来  !!!加速训练监督卷积网络!!!  。使用显卡训练神经网络的热度在通用GPU发布以后开始爆炸性', 'time': '2017-01-19T12:37'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在通用GPU发布以后，使用显卡训练神经网络的热度开始爆炸性地增长', 'origin_text': '2631}也论证了相同的技术可以用来加速训练监督卷积网络。  !!!使用显卡训练神经网络的热度在通用GPU发布以后开始爆炸性增长!!!  。这种通用GPU可以执行任意的代码，而并非仅仅渲染子程序。N', 'time': '2017-01-19T12:38'}\n{'user': 'acct:corenel@hypothes.is', 'text': '模型', 'origin_text': '得我们可以用一种像C一样的语言实现任意代码。由于相对简便的编程  !!!语言!!!  ，强大的并行能力以及巨大的内存带宽，通用GPU为我们提供了训练神', 'time': '2017-01-19T12:39'}\n{'user': 'acct:corenel@hypothes.is', 'text': '所采用', 'origin_text': '理想平台。在它发布以后不久，这个平台就迅速被深度学习的研究者们  !!!接纳了!!!  {cite?}。如何在通用GPU上写高效的代码依然是一个难题', 'time': '2017-01-19T12:40'}\n{'user': 'acct:corenel@hypothes.is', 'text': '良好', 'origin_text': '如何在通用GPU上写高效的代码依然是一个难题。在GPU上获得  !!!很好!!!  表现所需的技术与CPU上的技术非常不同。比如说，基于CPU的良', 'time': '2017-01-19T12:45'}\n{'user': 'acct:corenel@hypothes.is', 'text': '访问', 'origin_text': '联读/写数据的方式。通常来说，如果在nnn个线程中，线程iii  !!!对应!!!  的是第i+ji+ji+j处的内存，其中jjj是222的某个幂的倍', 'time': '2017-01-19T13:20'}\n{'user': 'acct:corenel@hypothes.is', 'text': '，那么内存操作就易于级联。', 'origin_text': '是第i+ji+ji+j处的内存，其中jjj是222的某个幂的倍数  !!!。!!!  具体的设定在不同的GPU型号中有所区别。GPU另一个常见的设', 'time': '2017-01-19T13:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '难以执行分支操作', 'origin_text': '的设定是使一个组中的所有线程都同时执行同一指令。这意味着GPU  !!!上的分支操作是很困难的!!!  。线程被分为一个个称作warp的小组。在一个warp中的每一', 'time': '2017-01-19T13:22'}\n{'user': 'acct:corenel@hypothes.is', 'text': '组织好', 'origin_text': '非并行的方式。由于实现高效GPU代码的困难性，研究人员应该  !!!构建!!!  他们的工作流程，避免对每一个新的模型或算法都编写新的GPU代码。', 'time': '2017-01-19T13:24'}\n{'user': 'acct:corenel@hypothes.is', 'text': '机器学习库Pylearn2 {cite?}将其所有的机器学习算法都通过调用Theano {cite?}和cuda-convnet {cite?}所提供的高性能操作来指定。', 'origin_text': '件库解决这个问题，然后再从库中调用所需要的操作确定模型。例如，  !!!机器学习库Pylearn2 {cite?}通过调用Theano {cite?}和cuda-convnet {cite?}提供的高性能操作，囊括了许多机器学习算法!!!  。这种分解方法还可以简化对多种硬件的支持。例如，同一个The', 'time': '2017-01-19T13:29'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因此，', 'origin_text': '规模的分布式实现在许多情况下，单个机器的计算资源是有限的。  !!!因此!!!  我们希望把训练或者推断的任务分摊到多个机器上进行。分布式的', 'time': '2017-01-20T03:06'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{数据并行}', 'origin_text': '现的，因为每一个输入的样本都可以在单独的机器上运行。这也被称为  !!!数据并行!!!  。同样的，模型并行也是可行的，其中多个机器共同运行一个数据点', 'time': '2017-01-20T03:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '同样地', 'origin_text': '个输入的样本都可以在单独的机器上运行。这也被称为数据并行。  !!!同样的!!!  ，模型并行也是可行的，其中多个机器共同运行一个数据点，每一个机器', 'time': '2017-01-20T03:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{模型并行}', 'origin_text': '样本都可以在单独的机器上运行。这也被称为数据并行。同样的，  !!!模型并行!!!  也是可行的，其中多个机器共同运行一个数据点，每一个机器负责模型的', 'time': '2017-01-20T03:10'}\n{'user': 'acct:corenel@hypothes.is', 'text': '训练', 'origin_text': '器共同运行一个数据点，每一个机器负责模型的一个部分。对于推断和  !!!学习!!!  ，这都是可行的。训练中，数据并行在某种程度上说更难。对于', 'time': '2017-01-20T03:10'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在训练过程中，数据并行某种程度上来说更加困难', 'origin_text': '个机器负责模型的一个部分。对于推断和学习，这都是可行的。  !!!训练中，数据并行在某种程度上说更难!!!  。对于随机梯度下降的单步来说，我们可以增加minibatch的', 'time': '2017-01-20T03:39'}\n{'user': 'acct:corenel@hypothes.is', 'text': '通常我们得到的回报并不会线性增长', 'origin_text': '我们可以增加minibatch的大小，但是从优化性能的角度来说，  !!!通常我们得到反馈少于线性的反馈!!!  。使用多个机器并行地计算多个梯度下降步是一个更好的选择。不幸', 'time': '2017-01-20T03:42'}\n{'user': 'acct:corenel@hypothes.is', 'text': '步骤', 'origin_text': '我们得到反馈少于线性的反馈。使用多个机器并行地计算多个梯度下降  !!!步!!!  是一个更好的选择。不幸的是，梯度下降的标准定义完全是一个串行的', 'time': '2017-01-20T03:43'}\n{'user': 'acct:corenel@hypothes.is', 'text': '看', 'origin_text': '来说，我们可以增加minibatch的大小，但是从优化性能的角度  !!!来说!!!  ，通常我们得到反馈少于线性的反馈。使用多个机器并行地计算多个梯', 'time': '2017-01-20T03:52'}\n{'user': 'acct:corenel@hypothes.is', 'text': '并', 'origin_text': '理器的核共用存有参数的内存。每一个核在无锁情况下读取了这些参数  !!!，然后!!!  计算对应的梯度，然后在无锁状态下更新了这些参数。这种方法减少了', 'time': '2017-01-20T03:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去 了', 'origin_text': '中，几个处理器的核共用存有参数的内存。每一个核在无锁情况下读取  !!!了!!!  这些参数，然后计算对应的梯度，然后在无锁状态下更新了这些参数。', 'time': '2017-01-20T03:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去 了', 'origin_text': '锁情况下读取了这些参数，然后计算对应的梯度，然后在无锁状态下更新  !!!了!!!  这些参数。这种方法减少了每一个梯度下降所获得的平均提升，因为一', 'time': '2017-01-20T03:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '由于一些核把其他的核所更新的参数覆盖了，因此这种方法减少了每一步梯度下降所获得的平均提升。', 'origin_text': '这些参数，然后计算对应的梯度，然后在无锁状态下更新了这些参数。  !!!这种方法减少了每一个梯度下降所获得的平均提升，因为一些核把其他的核所更新的参数（写）覆盖了。!!!  但因为更新步数的速率增加，总体上还是加快了学习过程。{Dea', 'time': '2017-01-20T04:34'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{参数服务器}', 'origin_text': 'IPS2012}率先提出了多机器无锁的梯度下降方法，其中参数是由  !!!参数服务器!!!  管理而非存储在共用的内存中。分布式的异步梯度下降方法依然是训练', 'time': '2017-01-20T04:34'}\n{'user': 'acct:corenel@hypothes.is', 'text': '保留了', 'origin_text': '参数服务器管理而非存储在共用的内存中。分布式的异步梯度下降方法  !!!依然是!!!  训练深度神经网络的基本方法，被工业界很多机器学习组所使用{cit', 'time': '2017-01-20T04:35'}\n{'user': 'acct:corenel@hypothes.is', 'text': '基本策略', 'origin_text': '共用的内存中。分布式的异步梯度下降方法依然是训练深度神经网络的  !!!基本方法!!!  ，被工业界很多机器学习组所使用{cite?}。学术界的深度学习', 'time': '2017-01-20T04:35'}\n{'user': 'acct:corenel@hypothes.is', 'text': '并被', 'origin_text': '中。分布式的异步梯度下降方法依然是训练深度神经网络的基本方法，  !!!被!!!  工业界很多机器学习组所使用{cite?}。学术界的深度学习研究', 'time': '2017-01-20T04:35'}\n{'user': 'acct:corenel@hypothes.is', 'text': '仍专注于', 'origin_text': '学习研究者们通常无法负担那么大规模的分布式学习系统，但是一些研究  !!!关注于!!!  如何在校园环境中相对较廉价的硬件系统中构造分布式网络{cite?', 'time': '2017-01-20T04:37'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使用相对廉价的硬件系统', 'origin_text': '担那么大规模的分布式学习系统，但是一些研究关注于如何在校园环境中  !!!相对较廉价的硬件系统中!!!  构造分布式网络{cite?}。模型压缩在许多商业应', 'time': '2017-01-20T04:38'}\n{'user': 'acct:corenel@hypothes.is', 'text': '开发者们', 'origin_text': '在许多情况下，相比开发者，终端用户的可用资源往往更有限。例如，  !!!研究者们!!!  可以使用巨大的计算机集群训练一个语音识别的网络，然后发布到移动手', 'time': '2017-01-20T04:39'}\n{'user': 'acct:corenel@hypothes.is', 'text': '然后将其部署到手机上', 'origin_text': '例如，研究者们可以使用巨大的计算机集群训练一个语音识别的网络，  !!!然后发布到移动手机上!!!  。减少推断所需开销的一个关键策略是模型压缩{cite?}。', 'time': '2017-01-20T04:40'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{模型压缩}', 'origin_text': '网络，然后发布到移动手机上。减少推断所需开销的一个关键策略是  !!!模型压缩!!!  {cite?}。模型压缩的基本思想是用一个更小的模型取代替原始', 'time': '2017-01-20T04:40'}\n{'user': 'acct:corenel@hypothes.is', 'text': '从而使得用来存储于评估所需的内存与运行时间更少', 'origin_text': '}。模型压缩的基本思想是用一个更小的模型取代替原始耗时的模型，  !!!只需更少内存和运行时间来存储和评估!!!  。原始模型的规模很大，且主要为了防止过拟合时，模型压缩可以起', 'time': '2017-01-20T05:06'}\n{'user': 'acct:corenel@hypothes.is', 'text': '当原始模型由于为了防止过拟合而变得很大时', 'origin_text': '型取代替原始耗时的模型，只需更少内存和运行时间来存储和评估。  !!!原始模型的规模很大，且主要为了防止过拟合时!!!  ，模型压缩可以起到作用。在许多情况下，拥有最小泛化误差的模型往', 'time': '2017-01-20T05:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '的成本很高', 'origin_text': '型往往是多个独立训练而成的模型的集成。评估所有nnn个集成成员  !!!是昂贵的!!!  。有时候，当单个模型很大（例如，如果它使用Dropout正则化', 'time': '2017-01-20T10:01'}\n{'user': 'acct:corenel@hypothes.is', 'text': '能够学习到某个函数$f(x)$', 'origin_text': 'ropout正则化）时，其泛化能力也会很好。这些巨大的模型  !!!学习某个函数f(x)f(x)f(\\\\Vx)时!!!  ，但选用的参数数量超过了任务所需的参数数量。仅仅训练样本数是有', 'time': '2017-01-20T10:04'}\n{'user': 'acct:corenel@hypothes.is', 'text': '只是因为训练样本数是有限的，所以模型的规模才变得必要。', 'origin_text': 'x)f(\\\\Vx)时，但选用的参数数量超过了任务所需的参数数量。  !!!仅仅训练样本数是有限的，所以网络的规模是受限的。!!!  只要我们拟合了这个函数f(x)f(x)f(\\\\Vx)，我们就可以', 'time': '2017-01-20T10:29'}\n{'user': 'acct:corenel@hypothes.is', 'text': '我们就可以通过将$f$应用与随机采样点$x$，来生成有无穷多训练样本的训练集', 'origin_text': '是受限的。只要我们拟合了这个函数f(x)f(x)f(\\\\Vx)，  !!!我们就可以生成一个拥有了无穷多训练样本的训练集，只需将fff作用于任意生成的xx\\\\Vx。!!!  然后，我们使用这些样本训练一个新的更小的模型，在这些点上拟合f', 'time': '2017-01-20T10:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使其能够在', 'origin_text': '成的xx\\\\Vx。然后，我们使用这些样本训练一个新的更小的模型，  !!!在!!!  这些点上拟合f(x)f(x)f(\\\\Vx)。为了更加充分地利用了', 'time': '2017-01-20T10:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '最好从类似于之后将提供给模型的真实测试数据的分布中', 'origin_text': '(x)f(\\\\Vx)。为了更加充分地利用了这个新的小模型的容量，  !!!最好能够从一个类似于真实的测试数据（后面会用到）的分布中!!!  采样xx\\\\Vx。这个过程可以通过损坏训练样本或者从原始训练数据', 'time': '2017-01-20T10:37'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{动态结构}', 'origin_text': '一般来说，加速数据处理系统的一种策略是构造一个系统，这个系统用  !!!动态结构!!!  描述图中处理输入的所需计算过程。在给定一个输入的情况中，数据处', 'time': '2017-01-20T10:39'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{条件计算}', 'origin_text': '隐藏单元）哪一部分用于计算。这种神经网络中的动态结构有时被称为  !!!条件计算!!!  {cite?}。由于模型结构许多部分可能只跟输入的一小部分有关', 'time': '2017-01-20T10:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{级联}', 'origin_text': '集需要应用于特定的输入。在分类器中加速推断的可行策略是使用  !!!级联!!!  的分类器。当目标是检测罕见对象（或事件）的是否存在，可以应用级', 'time': '2017-01-20T10:56'}\n{'user': 'acct:corenel@hypothes.is', 'text': '当目标是检测罕见对象（或事件）是否存在时', 'origin_text': '的输入。在分类器中加速推断的可行策略是使用级联的分类器。  !!!当目标是检测罕见对象（或事件）的是否存在!!!  ，可以应用级联策略。要确定对象是否存在，我们必须使用具有高容量', 'time': '2017-01-20T10:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '高容量、运行成本高', 'origin_text': '否存在，可以应用级联策略。要确定对象是否存在，我们必须使用具有  !!!高容量、运行昂贵!!!  的复杂分类器。 然而，因为对象是罕见的，我们通常可以使用更少的', 'time': '2017-01-20T10:59'}\n{'user': 'acct:corenel@hypothes.is', 'text': '第一个', 'origin_text': '对象的输入。在这些情况下，我们可以训练一序列分类器。序列中的  !!!第一!!!  分类器具有低容量，训练为具有高召回率。换句话说，他们被训练为确', 'time': '2017-01-20T11:00'}\n{'user': 'acct:corenel@hypothes.is', 'text': '最后一个', 'origin_text': '换句话说，他们被训练为确保对象存在时，我们不会错误地拒绝输入。  !!!最终的!!!  分类器训练为具有高精度。在测试时，我们按照顺序运行分类器进行推', 'time': '2017-01-20T11:00'}\n{'user': 'acct:corenel@hypothes.is', 'text': '由于系统中的一些个体成员具有高容量，因此系统作为一个整体显然也具有高容量', 'origin_text': '。一种方法是使级联中靠后的成员单独具有高容量。在这种情况下，  !!!系统作为一个整体显然具有高容量，因为它的一些个体成员是高容量的!!!  。 还可以使用另一种级联，其中每个单独的模型具有低容量，但是由', 'time': '2017-01-20T11:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '实现了', 'origin_text': '合，整个系统具有高容量。{Viola01}使用级联的增强决策树  !!!实现!!!  适合在手持数字相机中使用的快速并且鲁棒的面部检测器。本质上，它', 'time': '2017-01-20T11:15'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。分类器检查许多的窗口，如果这些窗口内不包含面部则拒绝。', 'origin_text': '棒的面部检测器。本质上，它们的分类器使用滑动窗口方法来定位面部  !!!，许多窗口会被检查，如果它们不包含面部则被拒绝。!!!  级联的另一个版本使用早期模型来实现一种硬性的注意机制：级联的早', 'time': '2017-01-20T11:18'}\n{'user': 'acct:corenel@hypothes.is', 'text': '硬注意机制', 'origin_text': '它们不包含面部则被拒绝。级联的另一个版本使用早期模型来实现一种  !!!硬性的注意机制!!!  ：级联的早期成员定位对象，并且级联的后续成员在给定对象位置的情况', 'time': '2017-01-20T11:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '级联前部的成员', 'origin_text': '被拒绝。级联的另一个版本使用早期模型来实现一种硬性的注意机制：  !!!级联的早期成员!!!  定位对象，并且级联的后续成员在给定对象位置的情况下执行进一步处理', 'time': '2017-01-20T11:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '：', 'origin_text': '理。例如，Google使用两步级联从街景视图图像中转换地址编号  !!!，!!!  首先使用一个机器学习模型查找地址编号，然后使用另一个机器学习模型', 'time': '2017-01-20T11:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{选通器}', 'origin_text': '种方法没有实现加速推断计算的目标。类似的，我们可以使用称为  !!!选通器!!!  的神经网络来选择在给定当前输入的情况下将使用几个专家网络中的哪一', 'time': '2017-01-20T11:37'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{专家混合体}', 'origin_text': '用几个专家网络中的哪一个来计算输出。这个想法的第一个版本被称为  !!!专家混合体!!!  {cite?}，其中选通器为每个专家输出一个概率或权重（通过非线', 'time': '2017-01-20T11:38'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': '个样本的选通器选择单个专家，我们就会获得一个特殊的硬专家混合体,  !!! % 刚性~!!!  {cite?}，这可以加速推断和训练的时间。当选通器决策的数量', 'time': '2017-01-20T11:56'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': '的硬专家混合体, % 刚性~{cite?}，这可以加速推断和训练  !!!的时间!!!  。当选通器决策的数量很小的时候，这个策略效果会很好，因为它不是', 'time': '2017-01-20T11:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '一种隐藏单元的条件Dropout的形式', 'origin_text': 't-al-arXiv2015}使用强化学习技术（策略梯度）来学习  !!!一种形式的隐藏单元的条件Dropout!!!  ，减少了实际的计算成本，而不会对近似的质量产生负面影响。另', 'time': '2017-01-21T03:48'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因而不能完全得到动态结构所带来的计算益处', 'origin_text': '是有效的。较为先进的方法一般采用对许多可能的输入使用加权平均，  !!!因此不能收获动态结构所有可能的计算益处!!!  。先进的注意机制在\\\\sec?中描述。使用动态结构化系统的', 'time': '2017-01-21T04:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '将在', 'origin_text': '权平均，因此不能收获动态结构所有可能的计算益处。先进的注意机制  !!!在!!!  \\\\sec?中描述。使用动态结构化系统的主要障碍是由于系统针', 'time': '2017-01-21T04:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': 'CPU实现会十分缓慢', 'origin_text': '是，这些专用的子程序难以高效地实现。由于缺乏高速缓存的一致性，  !!!CPU实现将是缓慢的!!!  。GPU的实现也将是缓慢的，因为缺乏级联的内存操作以及warp', 'time': '2017-01-21T06:45'}\n{'user': 'acct:corenel@hypothes.is', 'text': '此外，由于缺乏级联的内存操作以及warp成员使用不同分支时需要串行化操作，GPU的实现也会很慢', 'origin_text': '高效地实现。由于缺乏高速缓存的一致性，CPU实现将是缓慢的。  !!!GPU的实现也将是缓慢的，因为缺乏级联的内存操作以及warp成员使用不同分支时需要串行化操作!!!  。在一些情况下，可以将样本分成组缓解这些问题，这些组都采用相同', 'time': '2017-01-21T06:45'}\n{'user': 'acct:corenel@hypothes.is', 'text': '可以通过将样本分成组，并且都采用相同的分支并且同时处理这些样本组的方式来缓解这些问题', 'origin_text': '作以及warp成员使用不同分支时需要串行化操作。在一些情况下，  !!!可以将样本分成组缓解这些问题，这些组都采用相同的分支并且同时处理这些样本组!!!  。在离线环境中，这是最小化处理固定量样本所需时间的一项可接受的', 'time': '2017-01-21T06:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '然而在实时系统中，样本必须连续处理，对工作负载进行分区可能会导致负载均衡问题', 'origin_text': '线环境中，这是最小化处理固定量样本所需时间的一项可接受的策略。  !!!在实时系统中，样本必须连续处理，对工作负载进行分区可能会导致负载均衡问题!!!  。例如，如果我们分配一台机器处理级联中的第一步，另一台机器处理', 'time': '2017-01-21T06:50'}\n{'user': 'acct:corenel@hypothes.is', 'text': '基于以电压或电流表示连续值的物理实现', 'origin_text': '专用集成电路的数字（基于数字的二进制表示），模拟{cite?}（  !!!基于作为电压或电流连续值的物理实现!!!  ）和混合实现（组合数字和模拟组件）。近年来更灵活的可编程门阵列', 'time': '2017-01-21T07:07'}\n{'user': 'acct:corenel@hypothes.is', 'text': '现场可编程门阵列', 'origin_text': '值的物理实现）和混合实现（组合数字和模拟组件）。近年来更灵活的  !!!可编程门阵列!!!  实现（其中电路的具体细节可以建立后写入芯片）也得到了长足发展。', 'time': '2017-01-21T07:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在制造完成后', 'origin_text': '组件）。近年来更灵活的可编程门阵列实现（其中电路的具体细节可以  !!!建立后!!!  写入芯片）也得到了长足发展。虽然CPU和GPU上的软件实现通', 'time': '2017-01-21T07:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这与20世纪90年代的情况（上一个神经网络时代）的不同之处在于，神经网络的硬件实现（从开始到芯片可用可能需要两年）跟不上快速进展和价格低廉的通用CPU的脚步', 'origin_text': '最近计算速度的改进来自于核心的并行化（无论CPU还是GPU）。  !!!这与20世纪90年代的情况（前面的神经网络时代）非常不同，其中神经网络的硬件实现（从开始到芯片的可用性可能需要两年）不能跟上快速进展和价格低廉的通用CPU的脚步!!!  。因此，在针对诸如手机等低功率设备开发新的硬件设计时，研究专用', 'time': '2017-01-21T12:04'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因此，在针对诸如手机等低功率设备开发新的硬件设计，并且想要用于深度学习的一般公众应用（例如，具有语音、计算机视觉或自然语言功能的设施）等时，研究专用硬件能够进一步推动其发展。', 'origin_text': '性可能需要两年）不能跟上快速进展和价格低廉的通用CPU的脚步。  !!!因此，在针对诸如手机等低功率设备开发新的硬件设计时，研究专用硬件是进一步推动其发展的方式，旨在用于深度学习的一般公众应用（例如，具有语音、计算机视觉或自然语言功能的设施）。!!!  最近对基于反向传播神经网络的低精度实现的工作{cite?}表', 'time': '2017-01-21T12:55'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对与数字的', 'origin_text': '的要求。显而易见的是，在训练期间需要比在推断时更高的精度，并且  !!!数字!!!  某些形式的动态定点表示可以用于减少每个数需要的存储空间。传统的', 'time': '2017-01-21T12:56'}\n{'user': 'acct:corenel@hypothes.is', 'text': '能够', 'origin_text': '训练期间需要比在推断时更高的精度，并且数字某些形式的动态定点表示  !!!可以用于!!!  减少每个数需要的存储空间。传统的定点数限制为固定范围（其对应于', 'time': '2017-01-21T12:56'}\n{'user': 'acct:corenel@hypothes.is', 'text': '被限制在了一个固定范围之内', 'origin_text': '式的动态定点表示可以用于减少每个数需要的存储空间。传统的定点数  !!!限制为固定范围!!!  （其对应于浮点表示中的给定指数）。动态定点表示在一组数字 （例', 'time': '2017-01-21T12:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '而动态定点表示', 'origin_text': '传统的定点数限制为固定范围（其对应于浮点表示中的给定指数）。  !!!动态定点表示!!!  在一组数字 （例如一个层中的所有权重） 之间共享该范围。使用定', 'time': '2017-01-21T12:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。', 'origin_text': '用较少的比特能够减少执行乘法所需的硬件表面积、功率需求和计算时间  !!!，!!!  并且乘法是使用或训练反向传播的现代深度网络中要求最高的操作。', 'time': '2017-01-21T12:58'}\n{'user': 'acct:corenel@hypothes.is', 'text': '而乘法已经', 'origin_text': '较少的比特能够减少执行乘法所需的硬件表面积、功率需求和计算时间，  !!!并且乘法!!!  是使用或训练反向传播的现代深度网络中要求最高的操作。计算', 'time': '2017-01-21T12:58'}\n{'user': 'acct:corenel@hypothes.is', 'text': '一直以来，', 'origin_text': '练反向传播的现代深度网络中要求最高的操作。计算机视觉  !!!一直以来!!!  计算机视觉就是深度学习应用中几个最活跃的研究方向之一。因为视觉', 'time': '2017-01-21T13:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '由于生成模型已经是深度学习研究的指导原则，因此还有大量图像合成工作使用了深度模型', 'origin_text': '多数计算机视觉中的深度学习往往用于对象识别或者某种形式的检测。  !!!因为生成模型已经是深度学习研究的指导原则，还有大量使用深度模型的图像合成工作!!!  。尽管图像合成通常不包括在计算机视觉内，但是能够进行图像合成的', 'time': '2017-01-22T01:46'}\n{'user': 'acct:corenel@hypothes.is', 'text': '即修复图像中的缺陷或从图像中移除对象这样的计算机视觉任务', 'origin_text': '包括在计算机视觉内，但是能够进行图像合成的模型通常用于图像恢复，  !!!修复图像中的缺陷或从图像中移除对象这样的计算机视觉任务!!!  。预处理许多应用领域需要复杂精细的预处理，因为原始', 'time': '2017-01-22T01:47'}\n{'user': 'acct:corenel@hypothes.is', 'text': '由于原始输入往往以深度学习架构难以表示的形式出现，许多应用领域需要复杂精细的预处理。', 'origin_text': '缺陷或从图像中移除对象这样的计算机视觉任务。预处理  !!!许多应用领域需要复杂精细的预处理，因为原始输入以许多深度学习架构难以表示的形式出现。!!!  计算机视觉通常只需要相对少的这种预处理。图像应该被标准化，从', 'time': '2017-01-22T01:52'}\n{'user': 'acct:corenel@hypothes.is', 'text': '池化区域', 'origin_text': '不总是必要的。一些卷积模型接受可变大小的输入并动态地调整它们的  !!!池区域!!!  大小以保持输出大小恒定{cite?}。其他卷积模型具有可变大小', 'time': '2017-01-22T01:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '一种只对训练集做预处理', 'origin_text': '进行去噪或标注的模型{cite?}。数据集增强可以被看作是  !!!预处理训练集!!!  的方式。数据集增强是减少大多数计算机视觉模型泛化误差的一种极好', 'time': '2017-01-22T01:59'}\n{'user': 'acct:corenel@hypothes.is', 'text': '测试时', 'origin_text': '数据集增强是减少大多数计算机视觉模型泛化误差的一种极好方法。在  !!!测试时间!!!  可用的一个相关想法是生成模型相同输入的许多不同版本（例如，在稍微', 'time': '2017-01-22T02:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '类似想法', 'origin_text': '多数计算机视觉模型泛化误差的一种极好方法。在测试时间可用的一个  !!!相关想法!!!  是生成模型相同输入的许多不同版本（例如，在稍微不同的位置处裁剪的', 'time': '2017-01-22T02:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '将同一输入的许多不同版本传给模型', 'origin_text': '视觉模型泛化误差的一种极好方法。在测试时间可用的一个相关想法是  !!!生成模型相同输入的许多不同版本!!!  （例如，在稍微不同的位置处裁剪的相同图像），并且在模型的不同实例', 'time': '2017-01-22T02:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '其目的', 'origin_text': '助于减少泛化误差。其他种类的预处理被应用于训练集和测试集，  !!!目的!!!  是将每个样本置于更规范的形式，以便减少模型需要考虑的变化量。减', 'time': '2017-01-22T02:24'}\n{'user': 'acct:corenel@hypothes.is', 'text': '减少数据中的变化量既能够减少泛化误差，也能够减小拟合训练集所需模型的大小。', 'origin_text': '的是将每个样本置于更规范的形式，以便减少模型需要考虑的变化量。  !!!减少数据中的变化量可以减少泛化误差并减小拟合训练集所需模型的大小。!!!  更简单的任务可以通过更小的模型来解决，而更简单的解决方案泛化能', 'time': '2017-01-22T02:43'}\n{'user': 'acct:corenel@hypothes.is', 'text': '为啥注释也出来了', 'origin_text': '预处理通常是不必要的，并且最好只是让模型学习哪些变异性应该保留。  !!!%应该变得不变。!!!  例如，用于分类ImageNet的AlexNet系统仅具有一个预', 'time': '2017-01-22T03:02'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在许多任务中，对比度是能够安全移除的最为明显的变化源之一。', 'origin_text': 'e?}。\\\\subsubsection{对比度归一化}  !!!可以为许多任务安全移除的最明显的变化源之一是图像中的对比度量。!!!  对比度仅指图像中亮像素和暗像素之间差异的大小。量化图像对比度', 'time': '2017-01-22T05:37'}\n{'user': 'acct:corenel@hypothes.is', 'text': '简单地说，对比度指的是图像中亮像素和暗像素之间差异的大小。', 'origin_text': '可以为许多任务安全移除的最明显的变化源之一是图像中的对比度量。  !!!对比度仅指图像中亮像素和暗像素之间差异的大小。!!!  量化图像对比度有许多方式。在深度学习中，对比度通常指的是图像', 'time': '2017-01-22T03:29'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因为没有', 'origin_text': '于某个常数sss来防止图像具有变化的对比度。这种方法非常复杂，  !!!没有!!!  缩放因子可以改变零对比度图像（所有像素都具有相等强度的图像）的对', 'time': '2017-01-22T05:53'}\n{'user': 'acct:corenel@hypothes.is', 'text': '引入一个', 'origin_text': '以真实标准差通常仅能放大传感器噪声或压缩伪像。这种现象启发我们  !!!引入!!!  小的正的正则化参数λλ\\\\lambda来平衡估计的标准差。或者，', 'time': '2017-01-22T07:48'}\n{'user': 'acct:corenel@hypothes.is', 'text': '感兴趣的', 'origin_text': 'X} )^2} }}.\\\\end{align}从大图像中剪切  !!!有趣!!!  对象所组成的数据集不可能包含任何具有几乎恒定强度的图像。在这些', 'time': '2017-01-22T07:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '小区域', 'origin_text': '得激进的正则化更有用。在处理从CIFAR-10数据中随机选择的  !!!补丁!!!  时，{Coates2011}使用ϵ=0,λ=10ϵ=0,λ=10', 'time': '2017-01-22T07:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '从而', 'origin_text': '不是L2L2L^2范数来定义GCN，因为标准差包括除以像素数量，  !!!因此!!!  基于标准差的GCN允许使用与图像大小无关的固定的sss。然而，', 'time': '2017-01-22T11:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '能够', 'origin_text': '来定义GCN，因为标准差包括除以像素数量，因此基于标准差的GCN  !!!允许!!!  使用与图像大小无关的固定的sss。然而，观察到L2L2L^2范', 'time': '2017-01-22T11:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '包括除以像素数量这一步', 'origin_text': '偏向于根据标准差而不是L2L2L^2范数来定义GCN，因为标准差  !!!包括除以像素数量!!!  ，因此基于标准差的GCN允许使用与图像大小无关的固定的sss。', 'time': '2017-01-22T11:16'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对此有所说明', 'origin_text': '们的直觉。我们可以把GCN理解成到球壳的一种映射。\\\\fig?  !!!给了一个说明!!!  。这可能是一个有用的属性，因为神经网络往往更好地响应空间方向，', 'time': '2017-01-22T11:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '主成分', 'origin_text': '不同于GCN。sphering并不会使数据位于球形壳上，而是将  !!!主要分量!!!  重新缩放以具有相等方差，使得PCA使用的多变量正态分布具有球形等', 'time': '2017-01-22T11:29'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{白化}', 'origin_text': '用的多变量正态分布具有球形等高线。 sphering通常被称为  !!!白化!!!  。全局对比度归一化常常不能突出我们想要突出的图像特征，例如', 'time': '2017-01-22T11:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{sphering}', 'origin_text': '。}\\\\end{figure}与直觉相反的是，存在被称为  !!!sphering!!!  的预处理操作，并且它不同于GCN。sphering并不会使数据', 'time': '2017-01-22T11:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{局部对比度归一化}', 'origin_text': '存在大的差异。然而，它不能确保暗区内的边缘突出。这催生了  !!!局部对比度归一化!!!   。局部对比度归一化确保对比度在每个小窗口上被归一化，而不是作', 'time': '2017-01-22T11:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使用的则是', 'origin_text': '窗口中所有像素的平均值和标准差~{cite?}。在其他情况下，  !!!这是使用!!!  以要修改的像素为中心的高斯权重的加权平均和加权标准差。在彩色图', 'time': '2017-01-22T13:18'}\n{'user': 'acct:corenel@hypothes.is', 'text': '归一化', 'origin_text': '处理不同的颜色通道，而其他策略组合来自不同通道的信息以使每个像素  !!!标准化!!!  {cite?}。局部对比度归一化通常可以通过使用可分离卷积', 'time': '2017-01-22T13:18'}\n{'user': 'acct:corenel@hypothes.is', 'text': '元素级', 'origin_text': 'sec?）来计算特征映射所需要的局部平均值和局部标准差，然后使用  !!!元素层面!!!  的减法和元素层面的除法实现不同的特征映射。局部对比度归一化', 'time': '2017-01-22T13:19'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': '特征映射所需要的局部平均值和局部标准差，然后使用元素层面的减法和  !!!元素层面的!!!  除法实现不同的特征映射。局部对比度归一化是可微分的操作，并', 'time': '2017-01-22T13:19'}\n{'user': 'acct:corenel@hypothes.is', 'text': '作为一种非线性函数应用于网络隐藏层', 'origin_text': '不同的特征映射。局部对比度归一化是可微分的操作，并且还可以  !!!应用于网络隐藏层的非线性作用!!!  ，以及应用于输入的预处理操作。与全局对比度归一化一样，我们', 'time': '2017-01-22T13:20'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{自动语音识别}', 'origin_text': ',y_{N})表示目标的输出序列（通常是一个词或者字符的序列）。  !!!自动语音识别!!!  任务指的是构造一个函数$f^_{\\\\text{ASR}}，使得它能', 'time': '2017-01-23T01:38'}\n{'user': 'acct:corenel@hypothes.is', 'text': '子音素状态', 'origin_text': '作由如下过程生成：首先，一个HMM生成了一个音素的序列以及离散的  !!!音素子状态!!!  （比如每一个音素的开始，中间，结尾），然后GMM把每一个离散的状', 'time': '2017-01-23T09:33'}\n{'user': 'acct:corenel@hypothes.is', 'text': '当时', 'origin_text': '到90年代初期，大量语音识别系统使用了神经网络{cite?}。  !!!在那段时间!!!  ，基于神经网络的ASR的表现和GMM-HMM系统的表现差不多。', 'time': '2017-01-23T09:37'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这个结果优于或者说是可以与基于HMM的结果相比   \\n', 'origin_text': 'footnote{39}）上达到了262626\\\\%的音素错误率，  !!!这个结果优于或者是可比于基于HMM的结果!!!  。从那时起，TIMIT成为了音素识别的一个基准数据集，在语音识', 'time': '2017-01-23T09:45'}\n{'user': 'acct:corenel@hypothes.is', 'text': '结果是', 'origin_text': '的系统中已经付出的巨大努力，工业界并没有迫切转向神经网络的需求。  !!!结果!!!  ，直到21世纪00年代末期，学术界和工业界的研究者们更多的是用神', 'time': '2017-01-23T09:46'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对于基本的电话识别工作流程的一个扩展工作是', 'origin_text': '可以参考{mohamed2012understanding}。  !!!关于基本电话通道识别的一个扩展工作包括了!!!  添加说话人自适应相关特征{cite?}的方法，可以进一步地降低错', 'time': '2017-01-23T11:35'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这可以', 'origin_text': '一个扩展工作包括了添加说话人自适应相关特征{cite?}的方法，  !!!可以!!!  进一步地降低错误率。紧接着的工作是将结构从音素识别（TIMIT', 'time': '2017-01-23T11:35'}\n{'user': 'acct:corenel@hypothes.is', 'text': '则是', 'origin_text': '特征{cite?}的方法，可以进一步地降低错误率。紧接着的工作  !!!是!!!  将结构从音素识别（TIMIT所主要关注的）转向了大规模词汇语音识', 'time': '2017-01-23T11:44'}\n{'user': 'acct:corenel@hypothes.is', 'text': '手机端', 'origin_text': '这些合作所带来的突破性进展，这些技术现在被广泛应用在产品中，比如  !!!移动手机端!!!  。随后，当他们使用了越来越大的带标签的数据集，加入了各种初', 'time': '2017-01-23T11:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。', 'origin_text': '音识别性能上的这些突破是史无前例的（大约303030\\\\%的提高）  !!!，!!!  在这之前的长达十年左右的时间基于GMM-HMM的系统的传统技术已', 'time': '2017-01-23T11:53'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在这之前的长达十年左右的时间内，尽管数据集的规模随时间增长，然而基于GMM-HMM的系统的传统技术已经停滞不前了', 'origin_text': '识别性能上的这些突破是史无前例的（大约303030\\\\%的提高），  !!!在这之前的长达十年左右的时间基于GMM-HMM的系统的传统技术已经停滞不前了，尽管数据集的规模是随时间增长的!!!  （见{Deng+Yu-2014}的图2.4）。这也导致了语音识', 'time': '2017-01-23T11:54'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去空格', 'origin_text': '至今。其中的一个创新点是卷积网络的应用~{cite?}。  !!!卷积网络 !!!  在时间和频率维度复用了权重，改进了之前的仅对时间使用重复权值的时', 'time': '2017-01-23T11:55'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在时域与频域上', 'origin_text': '其中的一个创新点是卷积网络的应用~{cite?}。卷积网络 在  !!!时间和频率维度!!!  复用了权重，改进了之前的仅对时间使用重复权值的时延神经网络。这', 'time': '2017-01-23T11:55'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在时域上', 'origin_text': 'te?}。卷积网络 在时间和频率维度复用了权重，改进了之前的仅  !!!对时间!!!  使用重复权值的时延神经网络。这种新的二维的卷积模型并不是将输入', 'time': '2017-01-23T11:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '能够使用', 'origin_text': '信息~{cite?}。自然语言处理自然语言处理让计算机  !!!使用!!!  人类语言，例如英语或法语。让简单的程序能够高效明确地解析，计算', 'time': '2017-01-23T12:12'}\n{'user': 'acct:corenel@hypothes.is', 'text': '为了让简单的程序能够高效明确地解析，计算机程序读取与发出的语言通常是经过特殊化的', 'origin_text': '语言处理自然语言处理让计算机使用人类语言，例如英语或法语。  !!!让简单的程序能够高效明确地解析，计算机程序通常读取和发出特殊化的语言!!!  。而自然的语言通常是模糊的，并且会违背形式的描述。自然语言处', 'time': '2017-01-23T12:30'}\n{'user': 'acct:corenel@hypothes.is', 'text': '可能不遵循', 'origin_text': '程序通常读取和发出特殊化的语言。而自然的语言通常是模糊的，并且  !!!会违背!!!  形式的描述。自然语言处理中的应用如机器翻译，学习者必须用一种人', 'time': '2017-01-23T12:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '自然语言处理包含了诸如机器翻译等的应用', 'origin_text': '殊化的语言。而自然的语言通常是模糊的，并且会违背形式的描述。  !!!自然语言处理中的应用如机器翻译!!!  ，学习者必须用一种人类语言读取句子并用另一种人类语言发出等同的句', 'time': '2017-01-23T12:32'}\n{'user': 'acct:corenel@hypothes.is', 'text': '学习者需要读取一种人类语言的句子，并另一种人类语言发出等同的句子', 'origin_text': '模糊的，并且会违背形式的描述。自然语言处理中的应用如机器翻译，  !!!学习者必须用一种人类语言读取句子并用另一种人类语言发出等同的句子!!!  。许多NLP应用程序基于语言模型，语言模型定义了关于自然语言中', 'time': '2017-01-23T12:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '、', 'origin_text': '许多NLP应用程序基于语言模型，语言模型定义了关于自然语言中的字  !!!，!!!  字符或字节序列的概率分布。与本章讨论的其他应用一样，非常', 'time': '2017-01-23T12:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '通常我们必须使用', 'origin_text': '程序，一些领域特定的策略也很重要。为了构建自然语言的有效模型，  !!!通常必须使用!!!  专门处理序列数据的技术。在很多情况下，我们将自然语言视为一系列', 'time': '2017-01-23T12:52'}\n{'user': 'acct:corenel@hypothes.is', 'text': '\\\\emph{语言模型}', 'origin_text': '意义上都高效，研究者已经开发了几种策略。nnn-gram  !!!语言模型!!!  定义了自然语言中标记序列的概率分布。根据模型的设计，标记可以是', 'time': '2017-01-24T03:12'}\n{'user': 'acct:corenel@hypothes.is', 'text': '因为最大似然估计可以通过简单地统计每个可能的$n$-gram在训练集中出现的次数来获得。', 'origin_text': '小nnn值的不同模型建模。训练nnn-gram模型是简单的，  !!!因为最大似然估计可以简单地统计每个可能的nnn-gram在训练集中出现的次数。 !!!                                  ', 'time': '2017-01-24T08:04'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去。（并入上一句）', 'origin_text': ', \\\\dots, x_{t-1}) }\\\\end{align}  !!!简单地查找两个存储的概率就能计算。!!!  为了在PnPnP_n中精确地再现推断，我们训练Pn−1Pn−1P', 'time': '2017-01-24T08:10'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这使得下式可以简单地通过查找两个存储的概率来计算', 'origin_text': '训练nnn-gram模型和n−1n−1n-1 gram模型。   !!!这使得它很容易计算概率!!!  ：P(xt∣xt−n+1,…,xt−1)=Pn(xt−n+1,', 'time': '2017-01-24T08:11'}\n{'user': 'acct:corenel@hypothes.is', 'text': '最后一个字符', 'origin_text': '现推断，我们训练Pn−1Pn−1P_{n-1}时必须省略每个序列  !!!最后的字符!!!  。举个例子，我们演示三元模型如何计算句子”{\\\\tt THE ', 'time': '2017-01-24T08:17'}\n{'user': 'acct:corenel@hypothes.is', 'text': '将演示', 'origin_text': '1P_{n-1}时必须省略每个序列最后的字符。举个例子，我们  !!!演示!!!  三元模型如何计算句子”{\\\\tt THE DOG RAN AWAY', 'time': '2017-01-24T08:28'}\n{'user': 'acct:corenel@hypothes.is', 'text': '边际概率', 'origin_text': '为句子的开头没有上下文。取而代之，在句子的开头我们必须使用词的  !!!边缘概率!!!  。因此我们计算P3(𝚃𝙷𝙴\\xa0𝙳𝙾𝙶\\xa0𝚁𝙰𝙽)', 'time': '2017-01-24T08:48'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使用了', 'origin_text': '类别的概念，然后属于同一类别的词共享词之间的统计强度。这个想法  !!!使用!!!  聚类算法，基于它们与其他词同时出现的频率，将该组词分成集群或类。', 'time': '2017-01-25T02:43'}\n{'user': 'acct:corenel@hypothes.is', 'text': '此处应分段', 'origin_text': '些问题，语言模型必须能够在一个词和其他语义相似的词之间共享知识。  !!!为了提高!!!  nnn-gram模型的统计效率，\\\\textbf{基于类的语言模型', 'time': '2017-01-25T02:44'}\n{'user': 'acct:corenel@hypothes.is', 'text': '神经语言模型能够识别两个相似的词，并且不丧失将每个词编码为彼此不同的能力。', 'origin_text': '序列建模~{cite?}。不同于基于类的nnn-gram模型，  !!!神经语言模型在识别两个相似的词的基础上，而不丧失将每个词编码为彼此不同的能力。!!!  神经语言模型共享一个词（及其上下文）和其他类似词（和上下文之间', 'time': '2017-01-25T05:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '句子长度的指数级别数量', 'origin_text': '个训练语句传递到指数数量的语义相关语句。维数灾难需要模型泛化到  !!!相对句子长度是指数多!!!  的句子。该模型通过将每个训练句子与指数数量的类似句子相关联克服', 'time': '2017-01-25T08:38'}\n{'user': 'acct:corenel@hypothes.is', 'text': '不仅仅', 'origin_text': '剧性变化。使用分布式表示来改进自然语言处理模型的基本思想  !!!不用!!!  局限于神经网络。它还可以用于图模型，其中分布式表示是多个潜变量', 'time': '2017-01-25T09:05'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使用', 'origin_text': '示来改进自然语言处理模型的基本思想不用局限于神经网络。它还可以  !!!用于!!!  图模型，其中分布式表示是多个潜变量的形式。高维输出在许多', 'time': '2017-01-25T09:05'}\n{'user': 'acct:corenel@hypothes.is', 'text': '计算成本是非常高的', 'origin_text': '单位。对于大词汇表，由于词汇量很大，在词的选择上表示输出分布的  !!!计算可能是昂贵的!!!  。在许多应用中，𝕍V\\\\SetV包含数十万词。表示这种分布的', 'time': '2017-01-25T09:55'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这造成了表示该矩阵的高存储成本，以及与之相乘的高计算成本。', 'origin_text': '|| \\\\SetV |，描述该仿射变换线性分量的权重矩阵非常大。  !!!这增加了表示该矩阵的高存储成本，以及乘以它的高计算成本。!!!  因为softmax要在所有|𝕍||V|| \\\\SetV |输出', 'time': '2017-01-25T11:00'}\n{'user': 'acct:corenel@hypothes.is', 'text': '都有', 'origin_text': '练期间（计算似然性及其梯度）和测试期间（计算所有或所选词的概率）  !!!同时!!!  出现。对于专门的损失函数，可以有效地计算梯度 {cite?}，', 'time': '2017-01-25T11:02'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': '?}，但是应用于传统softmax输出层的标准交叉熵损失时会出现  !!!了!!!  许多困难。假设hh\\\\Vh是用于预测输出概率ŷ\\xa0y^\\\\hat', 'time': '2017-01-25T11:02'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。在', 'origin_text': ' O(|𝕍|nh)O(|V|nh)O(|\\\\SetV| n_h)  !!!。!!!  nhnhn_h为数千和|𝕍||V|| \\\\SetV |数十万的', 'time': '2017-01-25T11:03'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': 'nn-gram模型提供。稍作修改，这种方法也可以在神经语言模型  !!!模型!!!  的softmax层中使用额外的输出值，而不是单独的sigmoid', 'time': '2017-01-25T11:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '引发', 'origin_text': '模型的潜在泛化优势仅限于最常用的词，这大概是最没用的。这个缺点  !!!激发!!!  了处理高维输出替代方法的探索，如下所述。\\\\subsubsec', 'time': '2017-01-25T11:15'}\n{'user': 'acct:corenel@hypothes.is', 'text': '无需进行', 'origin_text': '到log|𝕍|log\\u2061|V|\\\\log |\\\\SetV|一样低，而  !!!无需!!!  与|𝕍||V||\\\\SetV|成比例数量（并且也与隐藏单元数量n', 'time': '2017-01-25T11:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '等等。', 'origin_text': '构是先建立词的类别，然后是词类别的类别，然后是词类别的类别的类别  !!!等等!!!  这些嵌套类别构成一棵树，其叶子为词。在平衡树中，树的深度为lo', 'time': '2017-01-25T11:22'}\n{'user': 'acct:corenel@hypothes.is', 'text': '事倍功半', 'origin_text': '关联的位数量近似等于该词频率的对数。然而在实践中，节省计算通常  !!!不值得努力!!!  ，因为输出概率的计算仅是神经语言模型中总计算的一部分。例如，假', 'time': '2017-01-25T13:41'}\n{'user': 'acct:corenel@hypothes.is', 'text': '分支因子为$\\\\sqrt{|\\\\SetV|}$的树', 'origin_text': '得多，大约为10310310^3或更大。我们可以定义深度为2和  !!!分支因子为|𝕋|‾‾‾√|T|\\\\sqrt{|\\\\SetT|}的树!!!  ，而不用仔细优化分支因子为222的树。这样的树对应于简单定义一', 'time': '2017-01-25T13:43'}\n{'user': 'acct:corenel@hypothes.is', 'text': '计算所有$|\\\\SetV|$个词', 'origin_text': '概率）都带来了计算上的好处。当然即使使用分层softmax，  !!!计算所有|𝕋||T||\\\\SetT|个词!!!  的概率仍将是昂贵的。另一个重要的操作是在给定上下文中选择最可能', 'time': '2017-01-25T13:52'}\n{'user': 'acct:corenel@hypothes.is', 'text': '加速神经语言模型训练的一种方式是，避免明确计算所有未出现在下一位置的词对梯度的贡献。', 'origin_text': '为词类选择得不好。\\\\subsubsection{重要采样}  !!!加速神经语言模型训练的一种方式是避免明确计算所有词（未出现在下一位置）对梯度的贡献。!!!  每个不正确的词在此模型下应该具有低概率。枚举所有这些词的计算成', 'time': '2017-01-26T01:19'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': '有词（未出现在下一位置）对梯度的贡献。每个不正确的词在此模型下  !!!应该!!!  具有低概率。枚举所有这些词的计算成本可能会很高。相反，我们可', 'time': '2017-01-26T01:20'}\n{'user': 'acct:corenel@hypothes.is', 'text': 'pre-softmax', 'origin_text': 'al \\\\theta},\\\\end{align}其中aa\\\\Va是  !!!presoftmax!!!  激活（或得分）向量，每个词对应一个元素。第一项是\\\\textbf', 'time': '2017-01-26T01:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '项，', 'origin_text': '第一项是\\\\textbf{正相}(positive phase)  !!!项!!!  推动ayaya_y向上，而第二项是\\\\textbf{负相}(neg', 'time': '2017-01-26T01:22'}\n{'user': 'acct:corenel@hypothes.is', 'text': '；', 'origin_text': '{正相}(positive phase)项推动ayaya_y向上  !!!，!!!  而第二项是\\\\textbf{负相}(negative phase)', 'time': '2017-01-26T01:22'}\n{'user': 'acct:corenel@hypothes.is', 'text': '的成本可能是很高的', 'origin_text': 'i出现的次数。由于各种原因，训练产生这种稀疏向量的机器学习模型  !!!可能是昂贵的!!!  。在学习的早期，模型可能不会真的使输出真正稀疏。此外，将输出', 'time': '2017-01-26T01:36'}\n{'user': 'acct:corenel@hypothes.is', 'text': '负词是被随机选取的，如使用启发式采样更可能被误解的词。', 'origin_text': '正词”（在目标中非零的那些词）和相等数量的”负词”的重构损失。  !!!随机选择负词，如使用启发式采样更可能被误解的词。!!!  该启发式过采样引入的偏差则可以使用重要性权重校正。在所', 'time': '2017-01-26T03:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '当然，避免每次计算时使用所有参数的模型则是一个例外。', 'origin_text': '。相比之下，将神经网络的参数数目加倍通常也大致加倍计算时间。  !!!避免每次计算时使用所有参数的模型是例外。!!!  嵌入层每次只索引单个嵌入，所以我们可以增加词汇量，而不会增加每', 'time': '2017-01-26T03:58'}\n{'user': 'acct:corenel@hypothes.is', 'text': '集成学习领域', 'origin_text': '任何集成，如果集成成员产生独立的错误，这种技术可以减少测试误差。  !!!集成的领域!!!  提供了许多方法来组合集成成员的预测，包括统一加权和在验证集上选择', 'time': '2017-01-26T05:06'}\n{'user': 'acct:corenel@hypothes.is', 'text': '理想情况下', 'origin_text': '”apple red”的短语。提议机制提出建议翻译的许多变体，  !!!理想地!!!  应包括”red apple”。翻译系统的第二个组成部分（语言模', 'time': '2017-01-26T05:09'}\n{'user': 'acct:corenel@hypothes.is', 'text': '图像的标题生成', 'origin_text': '的系统。这个想法已经成功应用于很多领域，不仅仅是机器翻译，还包括  !!!为图像生成标题!!!  。}\\\\end{figure}\\\\begin{figure}[htp', 'time': '2017-01-26T08:14'}\n{'user': 'acct:corenel@hypothes.is', 'text': '学习具有相同含义的句子的表示是有用的', 'origin_text': '方式。 早期模型只能表示单个词或短语。从表示学习的观点来看，  !!!具有相同含义的句子具有类似表示是有用的!!!  ，无论它们是以源语言还是以目标语言书写。研究者首先使用卷积和R', 'time': '2017-01-26T08:24'}\n{'user': 'acct:corenel@hypothes.is', 'text': '删去', 'origin_text': '统的基于短语表中频率计数的方法相比，可以产生较低的对齐错误率。  !!!甚至!!!  有更早的工作{cite?}研究跨语言词向量。 这种方法的存在很', 'time': '2017-01-26T08:47'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在对', 'origin_text': '集上训练的更高效的跨语言对齐~{cite?} 。历史观点  !!!在!!!  反向传播的第一次探索中，{Rumelhart86b-small}', 'time': '2017-01-26T08:58'}\n{'user': 'acct:corenel@hypothes.is', 'text': '为标志', 'origin_text': '自然语言处理的历史是由流行表示（对模型输入不同方式的表示）的变化  !!!标志!!!  的  。在早期对符号和词建模的工作之后，神经网络在NLP上一些', 'time': '2017-01-26T09:33'}\n{'user': 'acct:corenel@hypothes.is', 'text': '对词建模', 'origin_text': '序列。{BenDucVin01-small} 将焦点重新引到  !!!建模词!!!  并引入神经语言模型，能产生可解释的词嵌入。这些神经模型已经从在', 'time': '2017-01-26T09:33'}\n{'user': 'acct:corenel@hypothes.is', 'text': '基础的', 'origin_text': '在本节中，我们介绍深度学习一些其他类型的应用，它们与上面讨论的  !!!标准!!!  对象识别、语音识别和自然语言处理任务不同。本书的第三部分将扩大', 'time': '2017-01-26T09:34'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。', 'origin_text': '目的仍然是为了销售产品）。两者都依赖于预测用户和项目之间的关联  !!!，!!!   如果展示了广告或向该用户推荐了该产品，推荐系统要么预测一些行为', 'time': '2017-01-26T09:48'}\n{'user': 'acct:corenel@hypothes.is', 'text': '推荐系统通过预测一些行为的概率（用户购买产品或该行为的一些代替）或预期增益（其可取决于产品的价值）来向用户展示广告或是推荐产品。', 'origin_text': '仍然是为了销售产品）。两者都依赖于预测用户和项目之间的关联，   !!!如果展示了广告或向该用户推荐了该产品，推荐系统要么预测一些行为的概率（用户购买产品或该行为的一些代替）或预期增益（其可取决于产品的价值）。!!!  目前，互联网的资金主要来自于各种形式的在线广告。经济的主要部', 'time': '2017-01-26T09:50'}\n{'user': 'acct:corenel@hypothes.is', 'text': '都使用了', 'origin_text': '的主要部分依靠网上购物。 包括Amazon和eBay在内的公司  !!!使用!!!  机器学习（包括深度学习）推荐他们的产品。有时，项目不是实际出售', 'time': '2017-01-26T09:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '这种关联问题可以视作监督学习问题来处理', 'origin_text': '话、推荐专家建议、匹配视频游戏的玩家或匹配约会的人。通常，  !!!这种关联问题像监督学习问题一样处理!!!  ：给出一些关于项目和关于用户的信息，预测感兴趣的行为（用户点击广', 'time': '2017-01-26T09:53'}\n{'user': 'acct:corenel@hypothes.is', 'text': '泛化', 'origin_text': '些预测输入的最小信息：用户ID和项目ID。在这种情况下，唯一的  !!!推广!!!  方式依赖于不同用户或不同项目的目标变量值之间的模式相似性。假设', 'time': '2017-01-26T10:45'}\n{'user': 'acct:corenel@hypothes.is', 'text': '二维或三维', 'origin_text': '{u,i}之间的平方误差。当用户嵌入和项目嵌入首次缩小到低维度（  !!!两个或三个!!!  ）时，它们就可以方便地可视化，或者可以将用户或项目彼此进行比较（', 'time': '2017-01-26T11:39'}\n{'user': 'acct:corenel@hypothes.is', 'text': '缺失条目', 'origin_text': 'd \\\\MB = \\\\MV’$。SVD的一个问题是它以任意方式处理  !!!丢失的条目!!!  ，如同它们对应于目标值0。相反，我们希望避免为缺失条目做出的预', 'time': '2017-01-26T11:42'}\n{'user': 'acct:corenel@hypothes.is', 'text': 'Netflix奖的预测比赛中（目的是仅基于大量匿名用户的之前评级预测电影的评级）', 'origin_text': '使用基于梯度的优化最小化。SVD和式 \\\\eq?中的双线性预测在  !!!Netflix奖（目的是仅基于大量匿名用户的之前评级预测电影的评级）的竞争中!!!  表现得非常好{cite?}。许多机器学习专家参加了2006年和', 'time': '2017-01-26T11:47'}\n{'user': 'acct:corenel@hypothes.is', 'text': 'Netflix比赛方法的获胜方法中', 'origin_text': '经网络之一是基于RBM的无向概率模型~{cite?}。RBM是  !!!赢得Netflix比赛方法!!!  的一个重要组成部分{cite?}。神经网络社群中也已经探索了对', 'time': '2017-01-26T11:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '专用的深度学习架构', 'origin_text': '目特征集到嵌入的映射可以通过深度学习架构学习{cite?}。  !!!专用深度学习架构!!!  ，如卷积网络已经应用于从丰富内容中提取特征，如提取用于音乐推荐的', 'time': '2017-01-26T11:51'}\n{'user': 'acct:corenel@hypothes.is', 'text': '然后只能获得该类别正确与否的反馈', 'origin_text': '一个类别ŷ\\xa0y^\\\\hat y（通常是基于模型最高概率的类别），  !!!无论这是否是正确的类别都只能获得反馈!!!  。显然，每个样本传达的信息少于监督的情况（其中真实标签yyy是', 'time': '2017-01-26T11:55'}\n{'user': 'acct:corenel@hypothes.is', 'text': '比有监督的情况（其中真实标签$y$是可直接访问的）少', 'origin_text': '无论这是否是正确的类别都只能获得反馈。显然，每个样本传达的信息  !!!少于监督的情况（其中真实标签yyy是可直接访问的）!!!  ，因此需要更多的样本。更糟糕的是，如果我们不够小心，即使收集越', 'time': '2017-01-26T11:56'}\n{'user': 'acct:corenel@hypothes.is', 'text': '选择', 'origin_text': '果我们不够小心，即使收集越来越多的数据，我们得到的系统可能会继续  !!!挑选!!!  错误的决定，因为正确的决定最初只有很低的概率：直到学习者选择正确', 'time': '2017-01-26T11:57'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。', 'origin_text': '的系统可能会继续挑选错误的决定，因为正确的决定最初只有很低的概率  !!!：!!!  直到学习者选择正确的决定之前都无法学习正确的决定。这类似于强化', 'time': '2017-01-26T11:58'}\n{'user': 'acct:corenel@hypothes.is', 'text': '在学习者选择正确的决定之前，该系统都无法学习正确的决定。', 'origin_text': '系统可能会继续挑选错误的决定，因为正确的决定最初只有很低的概率：  !!!直到学习者选择正确的决定之前都无法学习正确的决定。!!!  这类似于强化学习的情况，其中仅观察到所选动作的奖励。一般来说，', 'time': '2017-01-26T11:59'}\n{'user': 'acct:corenel@hypothes.is', 'text': '动作', 'origin_text': '例如，我们至少知道用户身份，并且我们要选择一个项目。从上下文到  !!!操作!!!  的映射也称为策略。学习者和数据分布（现在取决于学习者的行动）之', 'time': '2017-01-26T12:20'}\n{'user': 'acct:corenel@hypothes.is', 'text': '动作', 'origin_text': '时更容易。在一般的强化学习场景中，高奖励或低奖励可能是由最近的  !!!行动!!!  或很久以前的行动引起的。术语contextual bandit', 'time': '2017-01-26T12:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '动作', 'origin_text': '般的强化学习场景中，高奖励或低奖励可能是由最近的行动或很久以前的  !!!行动!!!  引起的。术语contextual bandit 指的是在一些输', 'time': '2017-01-26T12:21'}\n{'user': 'acct:corenel@hypothes.is', 'text': '由于使用了符号\\\\citep{Rumelhart86b-small}和词嵌入\\\\citep{Deerwester90,BenDucVin01-small}，深度学习方法在语言模型、机器翻译和自然语言处理方面非常成功。\\n', 'origin_text': 'tual bandit 的技术。知识表示、推理和回答  !!!深度学习方法在语言模型、机器翻译和自然语言处理方面非常成功，因为使用符号{cite?}和词嵌入{cite?}。!!!   这些嵌入表示关于单个词或概念的语义知识。研究前沿是为短语或', 'time': '2017-01-26T12:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': '则没有', 'origin_text': '一组有序的对象对。集合中的对具有这种关系，而那些不在集合中的对  !!!没有!!!  。例如，我们可以在实体集1,2,31,2,3{ 1, 2, 3', 'time': '2017-01-26T12:31'}\n{'user': 'acct:corenel@hypothes.is', 'text': '以最大化捕获他们联合分布为训练目标', 'origin_text': '体和关系的表示可以将知识库中的每个三元组作为训练样本来学习，并且  !!!最大化捕获他们联合分布的训练目标!!!  {cite?}。除了训练数据，我们还需定义训练的模型族。一', 'time': '2017-01-26T12:52'}\n{'user': 'acct:corenel@hypothes.is', 'text': '相当于', 'origin_text': '-2011} 用向量表示实体而矩阵表示关系，其思想是关系在实体上  !!!像!!!  运算符。或者，关系可以被认为是任何其他实体{cite?}，允许', 'time': '2017-01-26T13:05'}\n{'user': 'acct:corenel@hypothes.is', 'text': '包括了', 'origin_text': '提供了有代表性的样本。第二部分介绍了涉及深度学习的现代实践，  !!!包括!!!  所有非常成功的方法。一般而言，这些方法使用代价函数的梯度寻找模', 'time': '2017-01-26T13:11'}\n{'user': 'acct:corenel@hypothes.is', 'text': '。并且相比目前为止所描述的情况，其中的挑战更困难并且远远没有解决。', 'origin_text': '部分，开始进入研究领域，旨在使用较少的训练数据或执行更多样的任务  !!!，其中的挑战更困难并且远远没有解决（相比目前为止所描述的情况）。!!!                            ', 'time': '2017-01-26T13:12'}\n{'user': 'acct:corenel@hypothes.is', 'text': '本项调查提供了在本文写作之时的具有代表性的样本。', 'origin_text': '景。我们不可能一下子描述全面覆盖主题的所有略微相似的应用 。  !!!在本文写作之时，这项调查尽可能提供了有代表性的样本。!!!  第二部分介绍了涉及深度学习的现代实践，包括所有非常成功的方法', 'time': '2017-01-26T13:15'}\n{'user': 'acct:corenel@hypothes.is', 'text': '我们不可能全面描述与此主题相关的所有应用 。', 'origin_text': '（除了这里描述的应用以外），并且肯定会在此之后应用于更多的场景。  !!!我们不可能一下子描述全面覆盖主题的所有略微相似的应用 。!!!  在本文写作之时，这项调查尽可能提供了有代表性的样本。第二部', 'time': '2017-01-26T13:17'}\n{'user': 'acct:corenel@hypothes.is', 'text': '记忆网络最开始是被用来完成一个玩具问答任务', 'origin_text': '特定声明性事实的最佳方法是使用显式记忆机制，如\\\\sec?所述。  !!!记忆网络首先被提出解决一个玩具问答任务!!!  {cite?}。{Kumar-et-al-arxiv2015}', 'time': '2017-01-26T13:18'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:swordyork@hypothes.is', 'text': '已完成合并，你的建议都太好了！多谢！', 'time': '2017-03-03T10:52'}\n"
  },
  {
    "path": "Chapter12/applications.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Tianfan Fu: 12.1~12.3 Shenjian Zhao: 12.4~12.5\n\\chapter{应用}\n\\label{chap:applications}\n\n在本章中，我们将介绍如何使用\\gls{DL}来解决\\gls{CV}、\\gls{SR}、\\gls{NLP}以及其他商业领域中的应用。\n首先我们将讨论在许多最重要的~\\glssymbol{AI}~应用中所需的大规模\\gls{NN}的实现。\n接着，我们将回顾\\gls{DL}已经成功应用的几个特定领域。\n尽管\\gls{DL}的一个目标是设计能够处理各种任务的算法，然而截止目前\\gls{DL}的应用仍然需要一定程度的特化。\n例如，\\gls{CV}中的任务对每一个样本都需要处理大量的输入特征（像素）。\n\\gls{NLP}任务的每一个输入特征都需要对大量的可能值（词汇表中的词）建模。\n% 431\n\n\\section{大规模\\glsentrytext{DL}}\n\\label{sec:large_scale_deep_learning}\n% 431 \n\n\\gls{DL}的基本思想基于\\gls{connectionism}：尽管\\gls{ML}模型中单个生物性的神经元或者说是单个特征不是智能的，但是大量的神经元或者特征作用在一起往往能够表现出智能。\n我们必须着重强调神经元数量必须\\emph{很大}这个事实。\n相比20世纪80年代，如今\\gls{NN}的精度以及处理任务的复杂度都有一定提升，其中一个关键的因素就是网络规模的巨大提升\n。\n正如我们在\\secref{sec:increasing_model_sizes}中看到的一样，在过去的三十年内，网络规模是以指数级的速度递增的。\n然而如今的\\gls{ANN}的规模也仅仅和昆虫的神经系统差不多。\n\n由于规模的大小对于神经网络来说至关重要，因此深度学习需要高性能的硬件设施和软件实现。\n%大规模\\gls{NN}的必要性，所以\\gls{DL}需要高性能的硬件设施和软件实现。\n% 431\n\n\\subsection{快速的CPU实现}\n\\label{sec:fast_cpu_implementations}\n\n传统的\\gls{NN}是用单台机器的CPU来训练的。\n如今，这种做法通常被视为是不可取的。\n现在，我们通常使用~\\glssymbol{GPU}~或者许多台机器的CPU连接在一起进行计算。\n在使用这种昂贵配置之前，为论证CPU无法承担\\gls{NN}所需的巨大计算量，研究者们付出了巨大的努力。\n% 432 head\n\n\n描述如何实现高效的数值CPU代码已经超出了本书的讨论范围，但是我们在这里还是要强调通过设计一些特定的CPU上的操作可以大大提升效率。\n例如，在2011年，最好的CPU在训练\\gls{NN}时使用\\gls{fixed_point_arithmetic}能够比\\gls{float_point_arithmetic}跑得更快。\n通过调整\\gls{fixed_point_arithmetic}的实现方式，\\citet{Vanhoucke-et-al-2011}获得了3倍于一个强\\gls{float_point_arithmetic}系统的速度。\n% 相对一个很强的\\gls{float_point_arithmetic}系统3倍的加速\n因为各个新型CPU都有各自不同的特性，所以也有时候采用\\gls{float_point_arithmetic}实现会更快。\n% 一条重要的准则就是通过特殊设计的数值运算可以获得巨大的回报。\n一条重要的准则就是，通过特殊设计的数值运算，我们可以获得巨大的回报。\n除了选择\\gls{fixed_point_arithmetic}或者\\gls{float_point_arithmetic}以外，其他的策略还包括了如通过优化数据结构避免高速缓存缺失、使用向量指令等。\n%还包括其他的策略，如通过优化数据结构避免高速缓存缺失、使用向量指令等。\n\\gls{ML}的研究者们一般会忽略这些实现的细节，但是如果模型的性能限制了模型能达到的规模，那该模型的准确性就要受到影响。\n% 432\n\n\\subsection{GPU 实现}\n\\label{sec:gpu_implementations}\n\n许多现代\\gls{NN}的实现基于\\firstall{GPU}。\n\\glsacr{GPU}最初是为图形应用而开发的专用硬件组件。\n%是一种特殊设计的硬件，设计的原始目的是为了处理图形应用。\n视频游戏系统的消费市场刺激了图形处理硬件的发展。\n它为视频游戏所设计的特性也可以使\\gls{NN}的计算受益。\n% 432  \n\n视频游戏的渲染要求许多操作能够快速并行地执行。\n环境和角色模型通过一系列顶点的3D坐标确定。\n为了将大量的3D坐标转化为2D显示器上的坐标，显卡必须并行地对许多顶点执行矩阵乘法与除法。\n%显卡必须快速实现矩阵乘法或者除法。\n之后，显卡必须并行地在每个像素上执行诸多计算，来确定每个像素点的颜色。\n在这两种情况下，计算都是非常简单的，并且不涉及CPU通常遇到的复杂的分支运算。\n例如，同一个刚体内的每个顶点都会乘上相同的矩阵；也就是说，不需要通过{\\tt if}语句来判断确定每个顶点需要乘哪个矩阵。\n各个计算过程之间也是完全相互独立的，因此能够实现并行操作。\n计算过程还涉及处理大量内存缓冲以及描述每一个需要被渲染的对象的纹理（颜色模式）的位图信息。\n总的来说，这使显卡设计为拥有高度并行特性以及很高的内存带宽，同时也付出了一些代价，如相比传统的CPU更慢的时钟速度以及更弱的处理分支运算的能力。\n% p 433\n\n\n与上述的实时图形算法相比，\\gls{NN}算法所需要的性能特性是相同的。\n\\gls{NN}算法通常涉及大量参数、激活值、梯度值的缓冲区，其中每个值在每一次训练迭代中都要被完全更新。\n这些缓冲太大，会超出传统的桌面计算机的高速缓存(cache)，所以内存带宽通常会成为主要瓶颈。\n相比CPU，\\glssymbol{GPU}~一个显著的优势是其极高的内存带宽。\n\\gls{NN}的训练算法通常并不涉及大量的分支运算与复杂的控制指令，所以更适合在~\\glssymbol{GPU}~硬件上训练。\n由于\\gls{NN}能够被分为多个单独的``神经元''，并且独立于同一层内其他神经元进行处理，所以\\gls{NN}可以从~\\glssymbol{GPU}~的并行特性中受益匪浅。\n% 433\n\n\n\\glssymbol{GPU}~硬件最初专为图形任务而设计。\n随着时间的推移，\\glssymbol{GPU}~也变得更灵活，允许定制的子程序处理转化顶点坐标或者计算像素颜色的任务。\n原则上，\\glssymbol{GPU}~不要求这些像素值实际基于渲染任务。\n只要将计算的输出值作为像素值写入缓冲区，\\glssymbol{GPU}~就可以用于科学计算。\n\\citet{Steinkrau2005}在GPU上实现了一个两层全连接的\\gls{NN}，并获得了相对基于CPU的基准方法三倍的加速。\n不久以后，\\citet{chellapilla:inria-00112631}也论证了相同的技术可以用来加速\\gls{supervised}\\gls{convolutional_network}的训练。\n% 433\n\n\n在\\gls{GP_GPU}~发布以后，使用显卡训练\\gls{NN}的热度开始爆炸性地增长。\n这种\\gls{GP_GPU}~可以执行任意的代码，而并非仅仅渲染子程序。\nNVIDIA的CUDA编程语言使得我们可以用一种像C一样的语言实现任意代码。\n由于相对简便的编程模型，强大的并行能力以及巨大的内存带宽，\\gls{GP_GPU}~为我们提供了训练\\gls{NN}的理想平台。\n在它发布以后不久，这个平台就迅速被\\gls{DL}的研究者们所采纳~\\citep{RainaICML09-small,Ciresan-2010}。\n\n\n\n如何在\\gls{GP_GPU}~上写高效的代码依然是一个难题。\n在~\\glssymbol{GPU}~上获得良好表现所需的技术与CPU上的技术非常不同。\n比如说，基于CPU的良好代码通常被设计为尽可能从高速缓存中读取更多的信息。\n然而在~\\glssymbol{GPU}~中，大多数可写内存位置并不会被高速缓存，所以计算某个值两次往往会比计算一次然后从内存中读取更快。\n\\glssymbol{GPU}~代码是天生多线程的，不同线程之间必须仔细协调好。\n例如，如果能够把数据\\firstgls{coalesced}起来，那么涉及内存的操作一般会更快。\n当几个线程同时需要读/写一个值时，像这样的\\gls{coalesced}会作为一次内存操作出现。\n不同的~\\glssymbol{GPU}~可能采用不同的\\gls{coalesced}读/写数据的方式。\n通常来说，如果在$n$个线程中，线程$i$访问的是第$i+j$处的内存，其中$j$是$2$的某个幂的倍数，那么内存操作就易于\\gls{coalesced}。\n具体的设定在不同的~\\glssymbol{GPU}~型号中有所区别。\n\\glssymbol{GPU}~另一个常见的设定是使一个组中的所有线程都同时执行同一指令。\n这意味着~\\glssymbol{GPU}~难以执行分支操作。\n线程被分为一个个称作~\\textbf{warp}~的小组。\n在一个~\\gls{warp}~中的每一个线程在每一个循环中执行同一指令，所以当同一个~\\gls{warp}~中的不同线程需要执行不同的指令时，需要使用串行而非并行的方式。\n% 434 \n\n\n由于实现高效~\\glssymbol{GPU}~代码的困难性，研究人员应该组织好他们的工作流程，避免对每一个新的模型或算法都编写新的~\\glssymbol{GPU}~代码。\n通常来讲，人们会选择建立一个包含高效操作（如卷积和矩阵乘法）的软件库解决这个问题，然后再从库中调用所需要的操作确定模型。\n%例如，\\gls{ML}库Pylearn2 \\citep{pylearn2_arxiv_2013}通过调用Theano \\citep{bergstra+al:2010-scipy-short,Bastien-2012}和cuda-convnet \\citep{Krizhevsky2010tr}提供的高性能操作，囊括了许多\\gls{ML}算法。\n例如，\\gls{ML}库Pylearn2 \\citep{pylearn2_arxiv_2013}将其所有的\\gls{ML}算法都通过调用Theano~\\citep{bergstra+al:2010-scipy-short,Bastien-2012}和cuda-convnet~\\citep{Krizhevsky2010tr} 所提供的高性能操作来指定。\n这种分解方法还可以简化对多种硬件的支持。\n例如，同一个Theano程序可以在CPU或者~\\glssymbol{GPU}~上运行，而不需要改变调用Theano的方式。\n其他库如Tensorflow~\\citep{tensorflow}和Torch~\\citep{Torch-2011}也提供了类似的功能。\n% 434 end\n\n\n\\subsection{大规模的分布式实现}\n\\label{sec:large_scale_distributed_implementations}\n\n在许多情况下，单个机器的计算资源是有限的。\n因此，我们希望把训练或者推断的任务分摊到多个机器上进行。\n% 434 end\n\n分布式的推断是容易实现的，因为每一个输入的样本都可以在单独的机器上运行。\n这也被称为\\firstgls{data_parallelism}。\n\n同样地，\\firstgls{model_parallelism}也是可行的，其中多个机器共同运行一个数据点，每一个机器负责模型的一个部分。\n对于推断和训练，这都是可行的。\n% 435\n\n\n\n在训练过程中，\\gls{data_parallelism}某种程度上来说更加困难。\n对于\\gls{SGD}的单步来说，我们可以增加\\gls{minibatch}的大小，但是从优化性能的角度来说，我们得到的回报通常并不会线性增长。\n使用多个机器并行地计算多个\\gls{GD}步骤是一个更好的选择。\n不幸的是，\\gls{GD}的标准定义完全是一个串行的过程：\n第$t$步的梯度是第$t-1$步所得参数的函数。\n% 435\n\n\n这个问题可以使用\\firstgls{ASGD}\\citep{BenDucVin01-small,Recht-et-al-NIPS2011}解决。\n在这个方法中，几个处理器的核共用存有参数的内存。\n每一个核在无锁情况下读取这些参数并计算对应的梯度，然后在无锁状态下增量更新这些参数。\n%这种方法减少了每一个\\gls{GD}所获得的平均提升，因为一些核把其他的核所更新的参数（写）覆盖了。\n由于一些核把其他的核所更新的参数覆盖了，因此这种方法减少了每一步\\gls{GD}所获得的平均提升。\n但因为更新步数的速率增加，总体上还是加快了学习过程。\n\\citet{Dean-et-al-NIPS2012}率先尝试了无锁的\\gls{GD}方法的多机器实现，其中参数是由\\firstgls{parameter_server}管理而非存储在共用的内存中。\n分布式的异步\\gls{GD}方法目前依然是训练大型\\gls{DNN}的基本策略，并被工业界很多\\gls{ML}组所使用\\citep{chilimbi2014project,Wu-et-al-arXiv2015}。\n学术界的\\gls{DL}研究者们通常无法负担那么大规模的分布式学习系统，但是仍有一些研究关注于如何在校园环境中使用相对廉价的硬件系统构造分布式网络~\\citep{icml2013_coates13}。\n% 435\n\n\n\\subsection{\\glsentrytext{model_compression}}\n\\label{sec:model_compression}\n% 435 \n\n在许多商业应用的\\gls{ML}模型中，一个时间和内存开销较小的推断算法比一个时间和内存开销较小的训练算法要更为重要。\n对于那些不需要个性化设计的应用来说，我们只需要一次性的训练模型，然后它就可以被成千上万的用户使用。\n在许多情况下，相比开发者，终端用户的可用资源往往更有限。\n例如，开发者们可能会使用巨大的计算机集群训练一个\\gls{SR}的网络，然后将其部署到移动手机上。\n\n\n减少推断所需开销的一个关键策略是\\firstgls{model_compression}~\\citep{bucilua2006model}。\n\\gls{model_compression}的基本思想是用一个更小的模型取代原始耗时的模型，从而使得存储与评估模型所需的内存与运行时间更少。\n\n\n\n当原始模型的规模主要由防止\\gls{overfitting}的需求驱动时，\\gls{model_compression}就可以起到作用。\n在许多情况下，拥有最小\\gls{generalization}误差的模型往往是多个独立训练而成的模型的\\gls{ensemble}。\n评估所有$n$个\\gls{ensemble}成员的成本很高。\n有时候，当单个模型很大（例如，如果它使用~\\gls{dropout}~正则化）时，其\\gls{generalization}能力也会很好。\n% 436 \n\n这些巨大的模型能够学习到某个函数$f(\\Vx)$，但选用的参数数量超过了任务所需的参数数量。\n%仅仅训练样本数是有限的，所以网络的规模是受限的。\n只是因为训练样本数是有限的，所以模型的规模才变得必要。\n只要我们拟合了这个函数$f(\\Vx)$，我们就可以通过将$f$作用于随机采样点$x$来生成有无穷多训练样本的训练集。\n%我们就可以生成一个拥有了无穷多训练样本的训练集，只需将$f$作用于任意生成的$\\Vx$。\n然后，我们使用这些样本训练一个新的更小的模型，使其能够在这些点上拟合$f(\\Vx)$。\n为了更加充分地利用了这个新的小模型的\\gls{capacity}，最好从类似于真实测试数据（之后将提供给模型）的分布中采样$\\Vx$。\n这个过程可以通过损坏训练样本或者从原始训练数据训练的生成模型中采样完成。\n\n此外，我们还可以仅在原始训练数据上训练一个更小的模型，但只是为了复制模型的其他特征，比如在不正确的类上的后验分布\\citep{Hinton-dark-2014,hinton2015distilling}。\n% 436 \n\n\\subsection{\\glsentrytext{dynamic_structure}}\n\\label{sec:dynamic_structure}\n\n一般来说，加速数据处理系统的一种策略是构造一个系统，这个系统用\\firstgls{dynamic_structure}描述图中处理输入的所需计算过程。\n在给定一个输入的情况中，数据处理系统可以动态地决定运行神经网络系统的哪一部分。\n单个神经网络内部同样也存在\\gls{dynamic_structure}，给定输入信息，决定特征（\\gls{hidden_unit}）哪一部分用于计算。\n这种神经网络中的\\gls{dynamic_structure}有时被称为\\firstgls{conditional_computation}\\citep{Bengio-chapterSLSP-2013,bengio2013estimating}。\n由于模型结构许多部分可能只跟输入的一小部分有关，只计算那些需要的特征可以起到加速的目的。\n% 436 \n\n\\gls{dynamic_structure}计算是一种基础的计算机科学方法，广泛应用于软件工程项目。\n应用于神经网络的最简单的\\gls{dynamic_structure}基于决定神经网络（或者其他\\gls{ML}模型）中的哪些子集需要应用于特定的输入。\n% 437 \n\n在分类器中加速推断的可行策略是使用\\firstgls{cascade}的分类器。\n当目标是检测罕见对象（或事件）是否存在时，可以应用\\gls{cascade}策略。\n要确定对象是否存在，我们必须使用具有高\\gls{capacity}、运行成本高的复杂分类器。 \n然而，因为对象是罕见的，我们通常可以使用更少的计算拒绝不包含对象的输入。\n在这些情况下，我们可以训练一序列分类器。\n序列中的第一个分类器具有低\\gls{capacity}，训练为具有高\\gls{recall}。\n换句话说，他们被训练为确保对象存在时，我们不会错误地拒绝输入。\n最后一个分类器被训练为具有高精度。\n在测试时，我们按照顺序运行分类器进行推断，一旦\\gls{cascade}中的任何一个拒绝它，就选择抛弃。\n总的来说，这允许我们使用高\\gls{capacity}模型以较高的置信度验证对象的存在，而又不会强制我们为每个样本付出完全推断的成本。\n有两种不同的方式可以使得\\gls{cascade}实现高\\gls{capacity}。\n一种方法是使\\gls{cascade}中靠后的成员单独具有高\\gls{capacity}。\n在这种情况下，由于系统中的一些个体成员具有高\\gls{capacity}，因此系统作为一个整体显然也具有高\\gls{capacity}。\n还可以使用另一种\\gls{cascade}，其中每个单独的模型具有低\\gls{capacity}，但是由于许多小型模型的组合，整个系统具有高\\gls{capacity}。\n\\citet{Viola01}使用\\gls{cascade}的增强\\gls{decision_tree}实现了适合在手持数字相机中使用的快速并且鲁棒的面部检测器。\n本质上，它们的分类器使用滑动窗口方法来定位面部。\n分类器会检查许多的窗口，如果这些窗口内不包含面部则被拒绝。\n\\gls{cascade}的另一个版本使用靠前的模型来实现一种硬\\gls{attention_mechanism}：\\gls{cascade}的先遣成员定位对象，\\gls{cascade}的后续成员在给定对象位置的情况下执行进一步处理。\n例如，Google使用两步\\gls{cascade}从街景视图图像中转换地址编号：首先使用一个\\gls{ML}模型查找地址编号，然后使用另一个\\gls{ML}模型将其转录\\citep{Goodfellow+et+al-ICLR2014a}。\n% 437 \n\n\\gls{decision_tree}本身是\\gls{dynamic_structure}的一个例子，因为树中的每个节点决定应该使用哪个子树来评估输入。\n一个结合\\gls{DL}和\\gls{dynamic_structure}的简单方法是训练一个\\gls{decision_tree}，其中每个节点使用神经网络做出决策\\citep{guo1992classification}，虽然这种方法没有实现加速推断计算的目标。\n% 437 end\n\n\n\n类似的，我们可以使用称为\\firstgls{gater}的神经网络来选择在给定当前输入的情况下将使用几个\\firstgls{expert_network}中的哪一个来计算输出。\n这个想法的第一个版本被称为\\firstgls{mixture_of_experts}\\citep{Nowlan90,Jacobs-nc91}，其中\\gls{gater}为每个专家输出一个概率或权重（通过非线性的\\gls{softmax}获得），并且最终输出由各个专家输出的加权组合获得。\n在这种情况下，使用\\gls{gater}不会降低计算成本，但如果每个样本的\\gls{gater}选择单个专家，我们就会获得一个特殊的\\firstgls{hard_mixture_of_experts}\\,\\citep{collobert:2001:rr01-12,collobert:2002}，这可以加速推断和训练。\n当\\gls{gater}决策的数量很小时，这个策略效果会很好，因为它不是组合的。\n但是当我们想要选择不同的单元或参数子集时，不可能使用``软开关''，因为它需要枚举（和计算输出）所有的\\gls{gater}配置。\n为了解决这个问题，许多工作探索了几种方法来训练组合的\\gls{gater}。\n\\citet{bengio2013estimating}提出使用\\gls{gater}概率梯度的若干估计器，而~\\citet{Bacon-et-al-RLDM2015,BengioE-et-al-arXiv2015}使用\\gls{RL}技术（\\firstgls{policy_gradient}）来学习一种条件的~\\gls{dropout}~形式（作用于\\gls{hidden_unit}块），减少了实际的计算成本，而不会对近似的质量产生负面影响。\n% 438\n\n\n另一种\\gls{dynamic_structure}是开关，其中隐藏单元可以根据具体情况从不同单元接收输入。\n这种动态路由方法可以理解为\\firstgls{attention_mechanism} \\citep{Olshausen1993}。\n目前为止，硬性开关的使用在大规模应用中还没有被证明是有效的。\n较为先进的方法一般采用对许多可能的输入使用加权平均，因此不能完全得到\\gls{dynamic_structure}所带来的计算益处。\n先进的\\gls{attention_mechanism}将在\\secref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}中描述。\n% 438\n\n\n\n使用动态结构化系统的主要障碍是由于系统针对不同输入的不同代码分支导致的并行度降低。\n这意味着网络中只有很少的操作可以被描述为对样本\\gls{minibatch}的矩阵乘法或批量卷积。\n我们可以写更多的专用子程序，用不同的核对样本做卷积，或者通过不同的权重列来乘以设计矩阵的每一行。\n不幸的是，这些专用的子程序难以高效地实现。\n由于缺乏高速缓存的一致性，CPU实现会十分缓慢。\n此外，由于缺乏\\gls{coalesced}的内存操作以及~\\gls{warp}~成员使用不同分支时需要串行化操作，\\glssymbol{GPU}~的实现也会很慢。\n在一些情况下，我们可以通过将走同一个分支的样本分到同一组，从而可以同时处理这些样本组的方式来缓解这些问题。\n在离线环境中，这是最小化处理固定量样本所需时间的一项可接受的策略。\n然而在实时系统中，样本必须连续处理，对工作负载进行分区可能会导致负载均衡问题。\n例如，如果我们分配一台机器处理\\gls{cascade}中的第一步，另一台机器处理\\gls{cascade}中的最后一步，那么第一台机器将倾向于过载，最后一个机器倾向于欠载。\n如果每个机器被分配以实现神经\\gls{decision_tree}的不同节点，也会出现类似的问题。\n% 439\n\n\n\\subsection{深度网络的专用硬件实现}\n\\label{sec:specialized_hardware_implementations_of_deep_networks}\n%439\n\n自从早期的神经网络研究以来，硬件设计者已经致力于可以加速\\gls{NN}算法的训练和/或推断的专用硬件实现。\n读者可以查看早期和更近的专用硬件深度网络的评论\\citep{Lindsey+Lindblad-1994,Beiu-et-al-2003,Misra+Saha-2010}。\n%439\n\n\n不同形式的专用硬件\\citep{Graf+Jackel-1989,Mead+Ismail-2012,Kim-et-al-2009,Pham-et-al-2012,Chen-et-al-IEEE2014,Chen-et-al-ACM2014}的研究已经持续了好几十年，比如\\firstall{ASIC}的数字（基于数字的二进制表示），模拟\\citep{Graf+Jackel-1989,Mead+Ismail-2012}（基于以电压或电流表示连续值的物理实现）和混合实现（组合数字和模拟组件）。\n近年来更灵活的\\firstall{FPGA}实现（其中电路的具体细节可以在制造完成后写入芯片）也得到了长足发展。\n% 439 mid\n\n\n\n虽然CPU和~\\glssymbol{GPU}~上的软件实现通常使用32或64位的精度来表示浮点数，但是长期以来使用较低的精度在更短的时间内完成推断也是可行的\\citep{Holt-et-al-1991,Holi+Hwang-1993,Presley-et-al-1994,Simard+Graf-NIPS1994,Wawrzynek-et-al-IEEE1996,Savich-et-al-2007}。\n这已成为近年来更迫切的问题，因为\\gls{DL}在工业产品中越来越受欢迎，并且由于更快的硬件产生的巨大影响已经通过~\\glssymbol{GPU}~的使用得到了证明。\n激励当前对深度网络专用硬件研究的另一个因素是单个CPU或~\\glssymbol{GPU}~核心的进展速度已经减慢，并且最近计算速度的改进来自于核心的并行化（无论CPU还是~\\glssymbol{GPU}）。\n这与20世纪90年代的情况（上一个神经网络时代）不同，当时\\gls{NN}的硬件实现（从开始到芯片可用可能需要两年）跟不上快速进展和价格低廉的通用CPU的脚步。\n因此，在针对诸如手机等低功率设备开发新的硬件设计，并且想要用于\\gls{DL}的一般公众应用（例如，具有语音、\\gls{CV}或自然语言功能的设施）等时，研究专用硬件能够进一步推动其发展。\n% 440 head\n\n\n最近对基于\\gls{BP}\\gls{NN}的低精度实现的工作\\citep{Vanhoucke-et-al-2011,Courbariaux-et-al-ICLR2015workshop,Gupta-et-al-2015}表明，8和16位之间的精度足以满足使用或训练基于\\gls{BP}的\\gls{DNN}的要求。\n显而易见的是，在训练期间需要比在推断时更高的精度，并且数字某些形式的动态定点表示能够减少每个数需要的存储空间。\n传统的定点数被限制在了一个固定范围之内（其对应于浮点表示中的给定指数）。\n而动态定点表示在一组数字 （例如一个层中的所有权重） 之间共享该范围。\n使用定点代替浮点表示并且每个数使用较少的比特能够减少执行乘法所需的硬件表面积、功率需求和计算时间。\n而乘法是使用或训练\\gls{BP}的现代深度网络中要求最高的操作。\n\n\n\n% 440 new\n\\section{\\glsentrytext{CV}}\n\\label{sec:computer_vision}\n\n一直以来，\\gls{CV}就是\\gls{DL}应用中几个最活跃的研究方向之一。\n因为视觉是一个对人类以及许多动物毫不费力，但对计算机却充满挑战的任务\\citep{ballard1983parallel}。\n\\gls{DL}中许多流行的标准基准任务包括\\gls{object_recognition}以及光学字符识别。\n% 440  \n\n\n\\gls{CV}是一个非常广阔的发展领域，其中包括多种多样的处理图片的方式以及应用方向。\n\\gls{CV}的应用广泛：从复现人类视觉能力（比如识别人脸）到创造全新的视觉能力。\n举个后者的例子，近期一个新的\\gls{CV}应用是从视频中可视物体的振动中识别相应的声波\\citep{Davis2014VisualMic}。\n大多数\\gls{CV}领域的\\gls{DL}研究未曾关注过这样一个奇异的应用，它扩展了图像的范围，而不是仅仅关注于\\gls{AI}中较小的核心目标——复制人类的能力。\n无论是报告图像中存在哪个物体，还是给图像中每个对象添加包围它的边框，\n或从图像中转录符号序列，或给图像中的每个像素标记它所属对象的标识，\n大多数\\gls{CV}中的\\gls{DL}往往用于\\gls{object_recognition}或者某种形式的检测。\n由于\\gls{generative_model}已经是\\gls{DL}研究的指导原则，因此还有大量图像合成工作使用了深度模型。\n尽管图像合成（``\\emph{无中生有}''）通常不包括在\\gls{CV}内，但是能够进行图像合成的模型常常用于图像恢复，即修复图像中的缺陷或从图像中移除对象这样的\\gls{CV}任务。\n% 441 \n\n\\subsection{预处理}\n\\label{sec:preprocessing}\n% 441 \n\n由于原始输入往往以\\gls{DL}架构难以表示的形式出现，许多应用领域需要复杂精细的预处理。\n\\gls{CV}通常只需要相对少的这种预处理。\n图像应该被标准化，从而使得它们的像素都在相同并且合理的范围内，比如$[0,1]$或者$[-1,1]$。\n将$[0,1]$中的图像与$[0,255]$中的图像混合通常会导致失败。\n将图像格式化为具有相同的比例严格上说是唯一一种必要的预处理。\n许多\\gls{CV}架构需要标准尺寸的图像，因此必须裁剪或缩放图像以适应该尺寸。\n然而，严格地说即使是这种重新调整比例的操作并不总是必要的。\n一些卷积模型接受可变大小的输入并动态地调整它们的\\gls{pooling}区域大小以保持输出大小恒定\\citep{Waibel89b}。\n其他卷积模型具有可变大小的输出，其尺寸随输入自动缩放，例如对图像中的每个像素进行\\gls{denoise}或标注的模型\\citep{Hadsell-RSS-07}。\n% 441 \n\n\\gls{dataset_augmentation}可以被看作是一种只对训练集做预处理的方式。\n\\gls{dataset_augmentation}是减少大多数\\gls{CV}模型\\gls{generalization}误差的一种极好方法。\n在测试时可用的一个相关想法是将同一输入的许多不同版本传给模型（例如，在稍微不同的位置处裁剪的相同图像），并且在模型的不同实例上决定模型的输出。\n后一个想法可以被理解为集成方法，并且有助于减少\\gls{generalization}误差。\n% 441 \n\n其他种类的预处理需要同时应用于训练集和测试集，其目的是将每个样本置于更规范的形式，以便减少模型需要考虑的变化量。\n减少数据中的变化量既能够减少\\gls{generalization}误差，也能够减小拟合训练集所需模型的大小。\n更简单的任务可以通过更小的模型来解决，而更简单的解决方案\\gls{generalization}能力一般更好。\n这种类型的预处理通常被设计为去除输入数据中的某种可变性，这对于人工设计者来说是容易描述的，并且人工设计者能够保证不受到任务影响。\n当使用大型数据集和大型模型训练时，这种预处理通常是不必要的，并且最好就让模型去学习哪些变化性应该保留。\n例如，用于分类ImageNet的AlexNet系统仅具有一个预处理步骤：对每个像素减去训练样本的平均值\\citep{Krizhevsky-2012}。\n% 442 \n\n\\subsubsection{对比度归一化}\n\\label{sec:contrast_normalization}\n% 442 \n\n\n在许多任务中，对比度是能够安全移除的最为明显的变化源之一。\n简单地说，对比度指的是图像中亮像素和暗像素之间差异的大小。\n量化图像对比度有许多方式。\n在\\gls{DL}中，对比度通常指的是图像或图像区域中像素的\\gls{standard_deviation}。\n假设我们有一个张量表示的图像$\\TSX \\in\\SetR^{r\\times c\\times 3}$，其中$\\TEX_{i,j,1}$表示第$i$行第$j$列红色的强度，$\\TEX_{i,j,2}$对应的是绿色的强度，$\\TEX_{i,j,3}$对应的是蓝色的强度。\n然后整个图像的对比度可以表示如下：\n\\begin{align}\n\\label{eqn:121}\n\\sqrt{\\frac{1}{3rc}\\sum_{i=1}^{r} \\sum_{j=1}^{c}\\sum_{k=1}^{3} (\\TEX_{i,j,k} - \\bar{\\TSX} )^2},\n\\end{align}\n其中$\\bar{\\TSX}$是整个图片的平均强度，满足\n\\begin{align}\n\\label{eqn:122}\n \\bar{\\TSX} =  \\frac{1}{3rc}\\sum_{i=1}^{r} \\sum_{j=1}^{c}\\sum_{k=1}^{3}\\TEX_{i,j,k}.\n\\end{align}\n\n\n\\firstall{GCN}旨在通过从每个图像中减去其平均值，然后重新缩放其使得其像素上的\\gls{standard_deviation}等于某个常数$s$来防止图像具有变化的对比度。\n这种方法非常复杂，因为没有缩放因子可以改变零对比度图像（所有像素都具有相等强度的图像）的对比度。\n具有非常低但非零对比度的图像通常几乎没有信息内容。\n在这种情况下除以真实\\gls{standard_deviation}通常仅能放大传感器噪声或压缩伪像。\n这种现象启发我们引入一个小的正的\\gls{regularization}参数$\\lambda$来平衡估计的\\gls{standard_deviation}。\n或者，我们至少可以约束分母使其大于等于$\\epsilon$。\n给定一个输入图像$\\TSX$，\\gls{GCN}产生输出图像$\\TSX'$，定义为\n\\begin{align}\n\\label{eqn:123}\n\\TEX'_{i,j,k} = s\\frac{\\TEX_{i,j,k} - \\bar{\\TEX}}{\\max\\{ \\epsilon, \\sqrt{ \\lambda + {\\frac{1}{3rc}\\sum_{i=1}^{r}\\sum_{j=1}^{c}\\sum_{k=1}^{3}} (\\TEX_{i,j,k} - \\bar{\\TEX} )^2} \\}}.\n\\end{align}\n% 442 end\n\n\n从大图像中剪切感兴趣的对象所组成的数据集不太可能包含任何强度几乎恒定的图像。\n在这些情况下，通过设置$\\lambda = 0$来忽略小分母问题是安全的，并且在非常罕见的情况下为了避免除以$0$，通过将$\\epsilon$设置为一个非常小的值比如说$10^{-8}$。\n这也是~\\citet{Goodfellow+al-arxiv-2013}在CIFAR-10数据集上所使用的方法。\n随机剪裁的小图像更可能具有几乎恒定的强度，使得激进的\\gls{regularization}更有用。\n在处理从CIFAR-10数据中随机选择的小区域时，\\citet{Coates2011}使用$\\epsilon = 0, \\lambda = 10$。\n% 443\n\n尺度参数$s$通常可以设置为$1$（如~\\citet{Coates2011}所采用的），或选择使所有样本上每个像素的\\gls{standard_deviation}接近$1$（如\\citet{Goodfellow+al-arxiv-2013}所采用的）。\n% 443 mid\n\n\n\\eqnref{eqn:123}中的\\gls{standard_deviation}仅仅是对图片$L^2$范数的重新缩放（假设图像的平均值已经被移除）。\n我们更偏向于根据\\gls{standard_deviation}而不是$L^2$范数来定义~\\glssymbol{GCN}，因为\\gls{standard_deviation}包括除以像素数量这一步，从而基于\\gls{standard_deviation}的~\\glssymbol{GCN}~能够使用与图像大小无关的固定的$s$。\n然而，观察到$L^2$范数与\\gls{standard_deviation}成比例，能够帮助我们建立一种直观的感觉。\n我们可以把~\\glssymbol{GCN}~理解成到球壳的一种映射。\n\\figref{fig:gcn_sphere_color}对此有所说明。\n这可能是一个有用的属性，因为\\gls{NN}往往能更好地响应空间方向，而不是精确的位置。\n响应相同方向上的多个距离需要具有共线权重向量但具有不同偏置的\\gls{hidden_unit}。\n这样的情况对于学习算法来说可能是困难的。\n此外，许多浅层的图模型把多个分离的模式表示在一条线上会出现问题。\n\\glssymbol{GCN}~采用一个样本一个方向\\footnote{译者：所有样本相似的距离}而不是不同的方向和距离来避免这些问题。\n% 444 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter12/figures/gcn_sphere_color}}\n\\fi\n\t\\caption{\\glssymbol{GCN}~将样本投影到一个球上。\n\\emph{(左)}原始的输入数据可能拥有任意的范数。\n\\emph{(中)}$\\lambda=0$时候的~\\glssymbol{GCN}~可以完美地将所有的非零样本投影到球上。\n这里我们令$s=1$，$\\epsilon = 10^{-8}$。\n由于我们使用的~\\glssymbol{GCN}~是基于归一化\\gls{standard_deviation}而不是$L^2$范数，所得到的球并不是单位球。\n\\emph{(右)}$\\lambda>0$的\\gls{regularization}~\\glssymbol{GCN}~将样本投影到球上，但是并没有完全地丢弃其范数中变化。\n$s$和$\\epsilon$的取值与之前一样。}\n\\label{fig:gcn_sphere_color}\n\\end{figure}\n% 443 tail\n\n\n% 444 head\n与直觉相反的是，存在被称为~\\textbf{sphering}~的预处理操作，并且它不同于~\\glssymbol{GCN}。\n\\gls{sphering}~并不会使数据位于球形壳上，而是将主成分重新缩放以具有相等方差，使得~\\glssymbol{PCA}~使用的多变量正态分布具有球形等高线。 \n\\gls{sphering}~通常被称为\\firstgls{whitening}。\n% 444 head\n\n\n\\gls{GCN}常常不能突出我们想要突出的图像特征，例如边缘和角。\n如果我们有一个场景，包含了一个大的黑暗区域和一个大的明亮的区域（例如一个城市广场有一半的区域处于建筑物的阴影之中），\n则\\gls{GCN}将确保暗区域的亮度与亮区域的亮度之间存在大的差异。\n然而，它不能确保暗区内的边缘突出。\n% 444\n\n这催生了\\firstall{LCN} 。\n\\gls{LCN}确保对比度在每个小窗口上被归一化，而不是作为整体在图像上被归一化。\n关于\\gls{LCN}和\\gls{GCN}的比较可以参考\\figref{fig:122}。\n% 444\n% src0    gray0, gcn0?   lcn0  \n%    src1?  gcn1?  gray1?     lcn1  \n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n    \\centering\n    \\begin{tabular}{ccc}\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gray0.jpg} &\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gcn0.jpg} &\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/lcn0.jpg} \\\\\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gray1.jpg} &   % ?? may be problem\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gcn1.jpg} &\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/lcn1.jpg}\\\\\n        Input image & GCN & LCN\n    \\end{tabular}\n\\fi\n\t\\caption{\\gls{GCN}和\\gls{LCN}的比较。直观上说，\\gls{GCN}的效果很巧妙。它使得所有的图片的尺度都差不多，这减轻了学习算法处理多个尺度的负担。\\gls{LCN}更多地改变了图像，丢弃了所有相同强度的区域。这使得模型能够只关注于边缘。较好的纹理区域，如第二行的屋子，可能会由于归一化核的过高带宽而丢失一些细节。}\n\t\\label{fig:122}\n\\end{figure}\n\n\\gls{LCN}的各种定义都是可行的。\n在所有情况下，我们可以通过减去邻近像素的平均值并除以邻近像素的\\gls{standard_deviation}来修改每个像素。\n在一些情况下，计算的是以当前要修改的像素为中心的矩形窗口中所有像素的平均值和\\gls{standard_deviation}~\\citep{Pinto08}。\n在其他情况下，使用的则是以要修改的像素为中心的高斯权重的加权平均和加权\\gls{standard_deviation}。\n在彩色图像的情况下，一些策略单独处理不同的颜色通道，而其他策略组合来自不同通道的信息以使每个像素归一化\\citep{sermanet-icpr-12}。\n% 444\n\n\\gls{LCN}通常可以通过使用可分离卷积（参考\\secref{sec:efficient_convolution_algorithms}）来计算\\gls{feature_map}的局部平均值和局部\\gls{standard_deviation}，然后在不同的\\gls{feature_map}上使用逐元素的减法和除法来实现。\n% 444\n\n\\gls{LCN}是可微分的操作，并且还可以作为一种非线性作用应用于网络隐藏层，以及应用于输入的预处理操作。\n% 444\n\n与\\gls{GCN}一样，我们通常需要\\gls{regularization}\\gls{LCN}来避免出现除以零的情况。\n事实上，因为\\gls{LCN}通常作用于较小的窗口，所以\\gls{regularization}更加重要。\n较小的窗口更可能包含彼此几乎相同的值，因此更可能具有零\\gls{standard_deviation}。\n% 445\n\n\n\\subsection{\\glsentrytext{dataset_augmentation}}\n\\label{sec:dataset_augmentation_chap12}\n如\\secref{sec:dataset_augmentation_chap7}中讲到的一样，我们很容易通过增加训练集的额外副本来增加训练集的大小，进而改进分类器的\\gls{generalization}能力。\n这些额外副本可以通过对原始图像进行一些变化来生成，但是并不改变其类别。\n\\gls{object_recognition}这个分类任务特别适合于这种形式的\\gls{dataset_augmentation}，因为类别信息对于许多变换是不变的，而我们可以简单地对输入应用诸多几何变换。\n如前所述，分类器可以受益于随机平移或者旋转，以及某些情况下输入的翻转，以此增强数据集。\n在专门的\\gls{CV}应用中，存在很多更高级的用以\\gls{dataset_augmentation}的变换。\n这些方案包括图像中颜色的随机扰动~\\citep{Krizhevsky-2012}，以及对输入的非线性几何变形~\\citep{LeCun98-small}。\n% 445\n\n\n\n\n\\section{\\glsentrytext{SR}}\n\\label{sec:speech_recognition}\n% 446\n\n\\gls{SR}任务在于将一段包括了自然语言发音的声学信号映射到对应说话人意图表达的词序列上。\n令$\\MX=(\\Vx^{(1)},\\Vx^{(2)},\\ldots,\\Vx^{(T)})$表示语音的输入向量（传统做法以$20$ms为一帧分割信号）。\n许多\\gls{SR}的系统通过特殊的手工设计方法预处理输入信号，从而提取特征，但是某些\\gls{DL}系统\\citep{jaitly2011learning}直接从原始输入中学习特征。\n令$\\Vy=(y_{1},y_{2},\\ldots,y_{N})$表示目标的输出序列（通常是一个词或者字符的序列）。\n\\firstall{ASR}任务指的是构造一个函数$f^*_{\\text{ASR}}$，使得它能够在给定声学序列$\\MX$的情况下计算最有可能的语言序列$\\Vy$：\n\\begin{align}\n\\label{eqn:124}\nf^*_{\\text{ASR}}(\\MX) =  \\underset{\\Vy}{\\arg\\max}  P^*(\\RVy \\mid \\RMX = \\MX),\n\\end{align}\n其中$P^*$是给定输入值$\\MX$时对应目标$\\Vy$的真实条件分布。\n% 446\n\n从20世纪80年代直到约2009-2012年，最先进的\\gls{SR}系统是\\firstall{HMM}和\\firstall{GMM}的结合。\n\\glssymbol{GMM}~对声学特征和\\firstgls{phoneme}之间的关系建模\\citep{Bahl87}，\\glssymbol{HMM}~对\\gls{phoneme}序列建模。\n\\glssymbol{GMM}-\\glssymbol{HMM}~模型将语音信号视作由如下过程生成：首先，一个~\\glssymbol{HMM}~生成了一个\\gls{phoneme}的序列以及离散的子\\gls{phoneme}状态（比如每一个\\gls{phoneme}的开始，中间，结尾），然后~\\glssymbol{GMM}~把每一个离散的状态转化为一个简短的声音信号。\n尽管直到最近~\\glssymbol{GMM}-\\glssymbol{HMM}~一直在~\\glssymbol{ASR}~中占据主导地位，\\gls{SR}仍然是\\gls{NN}所成功应用的第一个领域。\n从20世纪80年代末期到90年代初期，大量\\gls{SR}系统使用了\\gls{NN}~\\citep{Bourlard-cspla89,Waibel89b,Robinson+Fallside91,Bengio91z,Bengio92c,Konig96}。\n当时，基于\\gls{NN}的~\\glssymbol{ASR}~的表现和~\\glssymbol{GMM}-\\glssymbol{HMM}~系统的表现差不多。\n比如说，\\citet{Robinson+Fallside91}在TIMIT数据集\\citep{garofolo1993darpa}（有$39$个区分的\\gls{phoneme}% ?? error\n）上达到了$26$\\%的\\gls{phoneme}错误率，这个结果优于或者说是可以与基于~\\glssymbol{HMM}~的结果相比。\n从那时起，TIMIT成为了\\gls{phoneme}识别的一个基准数据集，在\\gls{SR}中的作用就和MNIST在\\gls{object_recognition}中的作用差不多。\n然而，由于\\gls{SR}软件系统中复杂的工程因素以及在基于~\\glssymbol{GMM}-\\glssymbol{HMM}~的系统中已经付出的巨大努力，工业界并没有看到迫切转向\\gls{NN}的需求。\n结果，直到21世纪00年代末期，学术界和工业界的研究者们更多的是用\\gls{NN}为~\\glssymbol{GMM}-\\glssymbol{HMM}~系统学习一些额外的特征。\n% 447\n\n\n之后，随着\\emph{更大更深}的模型以及更大的数据集的出现，通过使用\\gls{NN}代替~\\glssymbol{GMM}~来实现将声学特征转化为\\gls{phoneme}（或者子\\gls{phoneme}状态）的过程可以大大地提高识别的精度。\n从2009年开始，\\gls{SR}的研究者们将一种\\gls{unsupervised_learning}的\\gls{DL}方法应用于\\gls{SR}。\n这种\\gls{DL}方法基于训练一个被称作是\\gls{RBM}的无向概率模型，从而对输入数据建模。\n \\gls{RBM}将会在第三部分中描述。\n 为了完成\\gls{SR}任务，\\gls{unsupervised}的\\gls{pretraining}被用来构造一个\\gls{deep_feedforward_network}，这个\\gls{NN}每一层都是通过训练\\gls{RBM}来初始化的。\n 这些网络的输入是从一个固定规格的输入窗（以当前帧为中心）的谱声学表示抽取，预测了当前帧所对应的~\\glssymbol{HMM}~状态的条件概率。\n 训练一个这样的\\gls{NN}能够可以显著提高在TIMIT数据集上的识别率~\\citep{mohamed2009deep,Mohamed+Dahl+Hinton-2012}，并将\\gls{phoneme}级别的错误率从大约$26$\\%降到了$20.7$\\%。\n关于这个模型成功原因的详细分析可以参考\\citet{mohamed2012understanding}。\n对于基本的电话识别工作流程的一个扩展工作是添加说话人自适应相关特征\\citep{mohamed2011deep}的方法，这可以进一步地降低错误率。\n紧接着的工作则将结构从\\gls{phoneme}识别（TIMIT所主要关注的）转向了大规模词汇语音识别\\citep{Dahl2012}，这不仅包含了识别\\gls{phoneme}，还包括了识别大规模词汇的序列。\n\\gls{SR}上的深度网络从最初的使用\\gls{RBM}进行\\gls{pretraining}发展到了使用诸如\\gls{ReLU}和~\\gls{dropout}~这样的技术~\\citep{Zeiler+al-ICASSP-2013,Dahl-et-al-ICASSP2013}。\n从那时开始，工业界的几个语音研究组开始寻求与学术圈的研究者之间的合作。\n\\citet{Hinton-et-al-2012}描述了这些合作所带来的突破性进展，这些技术现在被广泛应用在产品中，比如移动手机端。\n% 447\n\n随后，当研究组使用了越来越大的带标签的数据集，加入了各种初始化，训练方法以及调试\\gls{DNN}的结构之后，\n他们发现这种\\gls{unsupervised}的\\gls{pretraining}方式是没有必要的，或者说不能带来任何显著的改进。\n% 447\n\n用\\gls{SR}中词错误率来衡量，在\\gls{SR}性能上的这些突破是史无前例的（大约$30$\\%的提高）。\n在这之前的长达十年左右的时间内，尽管数据集的规模是随时间增长的（见~\\citet{Deng+Yu-2014}的图2.4），但基于~\\glssymbol{GMM}-\\glssymbol{HMM}~的系统的传统技术已经停滞不前了。\n这也导致了\\gls{SR}领域快速地转向\\gls{DL}的研究。\n在大约的两年时间内，工业界的大多数的\\gls{SR}产品都包含了\\gls{DNN}，这种成功也激发了~\\glssymbol{ASR}领~域对\\gls{DL}算法和结构的一波新的研究浪潮，并且影响至今。\n% 448\n\n其中的一个创新点是\\gls{convolutional_network}的应用~\\citep{Sainath-et-al-ICASSP2013}。\n\\gls{convolutional_network}在时域与频域上复用了权重，改进了之前的仅在时域上复用权重的\\gls{TDNNs}。\n这种新的二维的卷积模型并不是将输入的频谱当作一个长的向量，而是当成是一个图像，其中一个轴对应着时间，另一个轴对应的是谱分量的频率。\n% 448\n\n完全抛弃~\\glssymbol{HMM}~并转向研究\\gls{end_to_end}\\gls{DL}\\gls{SR}系统是至今仍然活跃的另一个重要推动。\n这个领域第一个主要的突破是~\\citet{Graves-et-al-ICASSP2013}，其中训练了一个深度的\\gls{LSTM}\\gls{RNN}（见\\secref{sec:the_long_short_term_memory_and_other_gated_rnns}），使用了帧到\\gls{phoneme}对其的~\\glssymbol{MAP}~推断，就像~\\citet{LeCun98-small}以及CTC框架~\\citep{Graves-et-al-2006,Graves-book2012}中一样。\n一个深度\\gls{RNN}~\\citep{Graves-et-al-ICASSP2013}每个\\gls{time_step}的各层都有状态变量，使得它的\\gls{unfolded_graph}具有两种不同深度：一种是普通的根据层的堆叠衡量的深度，另一种根据时间\\gls{unfolding}衡量的深度。\n这个工作把TIMIT数据集上\\gls{phoneme}的错误率记录降到了的新低$17.7$\\%。\n关于应用于其他领域的深度\\gls{RNN}的变种可以参考~\\citet{Pascanu-et-al-ICLR2014,Chung-et-al-NIPSDL2014-small}。\n% 448\n\n另一个\\gls{end_to_end}\\gls{DL}\\gls{SR}方向的最新进展是让系统学习如何将\\firstgls{phonetic}层级的信息与\\firstgls{acoustic}层级的信息``对齐''~\\citep{Chorowski-et-al-arxiv2014,llu_is2015b}。\n% 448\n\n\n% Translator: Shenjian Zhao\n\\section{\\glsentrytext{NLP}}\n\\label{sec: natural_language_processing}\n\n\\firstgls{NLP}让计算机能够使用人类语言，例如英语或法语。\n为了让简单的程序能够高效明确地解析，计算机程序通常读取和发出特殊化的语言。\n而自然的语言通常是模糊的，并且可能不遵循严格的形式描述。\n\\gls{NLP}中的应用如机器翻译，学习者需要读取一种人类语言的句子，并用另一种人类语言发出相同意思的句子。\n许多~\\glssymbol{NLP}~应用程序基于\\gls{language_model}，\\gls{language_model}定义了关于自然语言中的字、字符或字节序列的概率分布。\n\n% -- 448 --\n\n与本章讨论的其他应用一样，非常通用的\\gls{NN}技术可以成功地应用于\\gls{NLP}。\n然而，为了实现卓越的性能并扩展到大型应用程序，一些领域特定的策略也很重要。\n为了构建自然语言的有效模型，通常必须使用专门处理序列数据的技术。\n在很多情况下，我们将自然语言视为一系列词，而不是单个字符或字节序列。\n因为可能的词总数非常大，基于词的\\gls{language_model}必须在极高维度和稀疏的离散空间上操作。\n为使这种空间上的模型在计算和统计意义上都高效，研究者已经开发了几种策略。\n\n\\subsection{\\glsentrytext{n_gram}}\n\\label{sec:n_grams}\n\n\\firstgls{language_model}定义了自然语言中\\gls{token}序列的概率分布。\n根据模型的设计，\\gls{token}可以是词、字符、甚至是字节。\n\\gls{token}总是离散的实体。\n最早成功的\\gls{language_model}基于固定长度序列的\\gls{token}模型，称为~\\gls{n_gram}。\n一个~\\gls{n_gram}~是一个包含$n$个\\gls{token}的序列。\n\n\n基于~\\gls{n_gram}~的模型定义一个条件概率——给定前$n-1$个\\gls{token}后，第$n$个\\gls{token}出现的条件概率。\n该模型使用这些条件分布的乘积定义更长（长度大于$n$）序列的概率分布：\n\\begin{align}\nP(x_1, \\dots, x_\\tau) = P(x_1, \\dots, x_{n-1}) \\prod_{t=n}^\\tau P(x_t \\mid x_{t-n+1}, \\dots, x_{t-1} ).\n\\end{align}\n这个分解可以由概率的链式法则证明。\n初始序列 $P(x_1, \\dots, x_{n-1})$的概率分布可以通过带有较小$n$值的不同模型建模。\n\n训练~\\gls{n_gram}~模型是简单的，因为\\gls{maximum_likelihood_estimation}可以通过简单地统计每个可能的~\\gls{n_gram}~在训练集中出现的次数来获得。                                   \n几十年来，基于~\\gls{n_gram}~的模型都是统计\\gls{language_model}的核心模块~\\citep{Jelinek+Mercer80,Katz87,Chen+Goodman99}。\n\n对于小的$n$值，模型有特定的名称：$n=1$称为\\firstgls{unigram}，$n=2$称为\\firstgls{bigram}及$n=3$称为\\firstgls{trigram}。\n这些名称源于相应数字的拉丁前缀和希腊后缀``-gram''，gram的意思是所写之物。\n\n% -- 449 --\n\n通常我们同时训练~\\gls{n_gram}~模型和$n-1$ gram模型。 \n这使得下式可以简单地通过查找两个存储的概率来计算。\n\\begin{align}\n\\label{eq:ml-ngram}\nP(x_t \\mid x_{t-n+1}, \\dots, x_{t-1}) = \\frac{P_n(x_{t-n+1}, \\dots, x_t)} { P_{n-1}( x_{t-n+1}, \\dots, x_{t-1}) }\n\\end{align}\n为了在$P_n$中精确地再现\\gls{inference}，我们训练$P_{n-1}$时必须省略每个序列最后一个字符。\n\n举个例子，我们演示三元模型如何计算句子``{\\tt THE DOG RAN AWAY}.''的概率。\n句子的第一个词不能通过上述条件概率的公式计算，因为句子的开头没有上下文。\n取而代之，在句子的开头我们必须使用词的边缘概率。\n因此我们计算$P_3({\\tt THE\\ DOG\\ RAN})$。\n最后，可以使用条件分布$P({\\tt AWAY} \\mid {\\tt DOG\\ RAN})$（典型情况）来预测最后一个词。\n将这与\\eqnref{eq:ml-ngram}放在一起，我们得到：\n\\begin{align}\nP({\\tt THE\\ DOG\\ RAN\\ AWAY}) = P_3({\\tt THE\\ DOG\\ RAN}) P_3({\\tt DOG\\ RAN\\ AWAY}) / P_2({\\tt DOG\\ RAN}).\n\\end{align}\n\n\\gls{n_gram}~模型最大似然的基本限制是，在许多情况下从训练集计数估计得到的$P_n$很可能为零（即使元组$(x_{t-n+1},  \\dots, x_{t})$可能出现在测试集中）。\n这可能会导致两种不同的灾难性后果。\n当$P_{n-1}$为零时，该比率是未定义的，因此模型甚至不能产生有意义的输出。\n当$P_{n-1}$非零而$P_n$为零时，测试样本的对数似然为 $-\\infty$。\n为避免这种灾难性的后果，大多数~\\gls{n_gram}~模型采用某种形式的\\firstgls{smoothing}。\n\\gls{smoothing}技术将概率质量从观察到的元组转移到类似的未观察到的元组。\n见~\\citet{Chen+Goodman99}的综述和实验对比。\n其中一种基本技术基于向所有可能的下一个符号值添加非零概率质量。\n这个方法可以被看作带有一个计数参数符合均匀或~\\ENNAME{Dirichlet}~分布的先验的贝叶斯\\gls{inference}。\n另一个非常流行的想法是包含高阶和低阶~\\gls{n_gram}~模型的混合模型，其中高阶模型提供更多的\\gls{capacity}，而低阶模型尽可能地避免零计数。\n如果上下文$x_{t-n+k}, \\ldots, x_{t-1}$的频率太小而不能使用高阶模型，\\textbf{回退方法}(back-off methods)就查找低阶~\\gls{n_gram} 。\n更正式地说，它们通过上下文$x_{t-n+k}, \\ldots, x_{t-1}$估计$x_t$上的分布，并增加$k$直到找到足够可靠的估计。\n\n% -- \\450 --\n\n经典的~\\gls{n_gram}~模型特别容易引起\\gls{curse_of_dimensionality}。\n因为存在$|\\SetV|^n$可能的~\\gls{n_gram}，而且 $|\\SetV|$ 通常很大。\n即使有大量训练数据和适当的$n$，大多数~\\gls{n_gram}~也不会出现在训练集中。\n看待经典~\\gls{n_gram}~模型的一种观点是把它看作执行最近邻查询。\n换句话说，它可以被视为局部\\gls{nonparametric}预测器，类似于$k$-最近邻。\n这些极端局部预测器面临的统计问题已经在\\secref{sec:local_constancy_and_smoothness_regularization}中描述过。\n\\gls{language_model}的问题甚至比普通模型更严重，因为任何两个不同的词在\\gls{one_hot}向量空间中的距离彼此相同。\n因此，难以大量利用来自任何``邻居''的信息 —— 只有重复相同上下文的训练样本对局部泛化有用。\n为了克服这些问题，\\gls{language_model}必须能够在一个词和其他语义相似的词之间共享知识。\n\n为了提高~\\gls{n_gram}~模型的统计效率，\\textbf{基于类的语言模型}(class-based language model)~\\citep{Brown92,Ney+Kneser93,Niesler98}引入词类别的概念，然后属于同一类别的词共享词之间的统计强度。\n这个想法使用了聚类算法，基于它们与其他词同时出现的频率，将该组词分成集群或类。\n随后，模型可以在条件竖杠的右侧使用词类ID而不是单个词ID。\n使用混合或回退(fallback)策略将词模型和类模型组成复合模型也是可能的。\n尽管词类提供了在序列之间泛化的方式，但其中一些词被相同类的另一个替换，导致该\\gls{representation}丢失了很多信息。\n\n\\subsection{\\glsentrytext{NLM}}\n\\label{sec:neural_language_models}\n\n\\firstall{NLM}是一类用来克服\\gls{curse_of_dimensionality}的\\gls{language_model}，它使用词的\\gls{distributed_representation}对自然语言序列建模~\\citep{BenDucVin01-small}。\n不同于基于类的~\\gls{n_gram}~模型，\\gls{NLM}在能够识别两个相似的词，并且不丧失将每个词编码为彼此不同的能力。\n\\gls{NLM}共享一个词（及其上下文）和其他类似词（和上下文之间）的统计强度。\n模型为每个词学习的\\gls{distributed_representation}，允许模型处理具有类似共同特征的词来实现这种共享。\n例如，如果词{\\tt dog}和词{\\tt cat}映射到具有许多共同属性的表示，则包含词{\\tt cat}的句子可以影响模型对包含词{\\tt dog}的句子做出的预测，反之亦然。\n因为这样的属性很多，所以存在许多泛化的方式，可以将信息从每个训练语句传递到指数数量的语义相关语句。\n\\gls{curse_of_dimensionality}需要模型泛化到指数多的句子（指数相对句子长度而言）。\n该模型通过将每个训练句子与指数数量的类似句子相关联克服这个问题。\n\n% -- 451 --\n\n我们有时将这些词\\gls{representation}称为\\firstgls{word_embedding}。\n在这个解释下，我们将原始符号视为维度等于词表大小的空间中的点。\n词\\gls{representation}将这些点嵌入到较低维的特征空间中。\n在原始空间中，每个词由一个\\gls{one_hot}向量表示，因此每对词彼此之间的欧氏距离都是$\\sqrt{2}$。\n在嵌入空间中，经常出现在类似上下文（或共享由模型学习的一些``特征''的任何词对）中的词彼此接近。\n这通常导致具有相似含义的词变得邻近。\n\\figref{fig:chap12_word_embeddings_color}放大了学到的\\gls{word_embedding}空间的特定区域，我们可以看到语义上相似的词如何映射到彼此接近的表示。\n\n\\begin{figure}[htp]\n\\centering\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\includegraphics{Chapter12/figures/word_embeddings_color.pdf}\n\\fi\n\\caption{从\\gls{NMT}模型获得的\\gls{word_embedding}的二维可视化\\citep{Bahdanau-et-al-ICLR2015-small}。\n此图在语义相关词的特定区域放大，它们具有彼此接近的嵌入向量。\n国家在左图，数字在右图。\n注意，这些嵌入是为了可视化才表示为2维。\n在实际应用中，嵌入通常具有更高的维度并且可以同时捕获词之间多种相似性。\n}\n\\label{fig:chap12_word_embeddings_color}\n\\end{figure}\n\n其他领域的\\gls{NN}也可以定义嵌入。\n例如，\\gls{convolutional_network}的隐藏层提供``图像嵌入''。\n因为自然语言最初不在实值向量空间上，所以~\\glssymbol{NLP}~从业者通常对嵌入的这个想法更感兴趣。\n隐藏层在表示数据的方式上提供了更显著的质上的变化。\n\n% -- 452 --\n\n使用\\gls{distributed_representation}来改进\\gls{NLP}模型的基本思想不必局限于\\gls{NN}。\n它还可以用于\\gls{graphical_model}，其中\\gls{distributed_representation}是多个\\gls{latent_variable}的形式\\citep{Mnih+Hinton-2007}。\n\n\\subsection{高维输出}\n\\label{sec:high_dimensional_outputs}\n\n在许多自然语言应用中，我们通常希望我们的模型产生词（而不是字符）作为输出的基本单位。\n对于大词汇表，由于词汇量很大，以在所有可能的词上进行选择的形式表示输出分布的计算成本可能非常高。\n在许多应用中，$\\SetV$包含数十万词。\n表示这种分布的朴素方法是应用一个仿射变换，将隐藏表示转换到输出空间，然后应用~\\ENNAME{softmax}~函数。\n假设我们的词汇表$\\SetV$大小为$| \\SetV |$。\n因为其输出维数为$| \\SetV |$，描述该仿射变换线性分量的权重矩阵非常大。\n这造成了表示该矩阵的高存储成本，以及与之相乘的高计算成本。\n因为~\\ENNAME{softmax}~要在所有$| \\SetV |$输出之间归一化，所以在训练时以及测试时执行全矩阵乘法是必要的 ——我们不能仅计算与正确输出的权重向量的点积。\n因此，输出层的高计算成本在训练期间（计算似然性及其梯度）和测试期间（计算所有或所选词的概率）都有出现。\n对于专门的\\gls{loss_function}，可以有效地计算梯度 \\citep{Vincent2015}，但是应用于传统~\\ENNAME{softmax}~输出层的标准\\gls{cross_entropy}损失时会出现许多困难。\n\n假设$\\Vh$是用于预测输出概率$\\hat \\Vy$的顶部隐藏层。\n如果我们使用学到的权重$\\MW$和学到的\\gls{bias_aff} $\\Vb$参数化从$\\Vh$到$\\hat \\Vy$的变换，则仿射~\\ENNAME{softmax}~输出层执行以下计算：\n\\begin{align}\n\\label{eq:softmax-over-words}\n  a_i &= b_i + \\sum_j  W_{ij} h_j \\;\\;\\; \\forall i \\in \\{1,\\ldots,|\\SetV|\\}, \\\\\n  \\hat{y}_i &= \\frac{e^{a_i}}{\\sum_{i'=1}^{|\\SetV|} e^{a_{i'}}}.\n\\end{align}\n如果$\\Vh$包含$n_h$个元素，则上述操作复杂度是 $O(|\\SetV| n_h)$。\n在$n_h$为数千和$| \\SetV |$数十万的情况下，这个操作占据了\\gls{NLM}的计算开销的一大部分。\n\n% -- 453 --\n\n\\subsubsection{使用\\glsentrytext{shortlist}}\n第一个\\gls{NLM}~\\citep{BenDucVin01-small,Bengio-nnlm2003-small}通过将词汇量限制为10,000或20,000来减轻大词汇表上~\\ENNAME{softmax}~的高成本。\n\\citet{Schwenk+Gauvain2002}和 \\citet{Schwenk-2007}在这种方法的基础上建立新的方式，将词汇表$\\SetV$分为最常见词汇（由\\gls{NN}处理）的\\firstgls{shortlist}~$\\SetL$和较稀有词汇的尾列表$\\SetT = \\SetV \\backslash \\SetL$（由\\gls{n_gram}模型处理）。\n为了组合这两个预测，\\gls{NN}还必须预测在上下文$C$之后出现的词位于尾列表的概率。\n我们可以添加额外的~\\ENNAME{sigmoid}~输出单元估计 $P(i \\in \\SetT \\mid C)$实现这个预测。\n用上这个额外输出，我们就可以估计$\\SetV$中所有词的概率分布，如下：\n\\begin{align}\n P(y=i\\mid C)  =& 1_{i \\in \\SetL} P(y=i\\mid C, i \\in \\SetL) (1 - P(i \\in \\SetT\\mid C)) \\nonumber \\\\\n     & + 1_{i \\in \\SetT} P(y=i\\mid C, i \\in \\SetT) P(i \\in \\SetT\\mid C),\n\\end{align}\n其中$P(y=i\\mid C, i \\in \\SetL)$由\\gls{NLM}提供$P(y=i\\mid C, i \\in \\SetT)$由~\\gls{n_gram}~模型提供。\n稍作修改，这种方法也可以在\\gls{NLM}的~\\ENNAME{softmax}~层中使用额外的输出值，而不是单独的~\\ENNAME{sigmoid}~单元。\n\n\\gls{shortlist}方法的一个明显缺点是，\\gls{NLM}的潜在泛化优势仅限于最常用的词，而在这部分词上，\\gls{NLM}大概相对来说是用处最小的。\n这个缺点引发了处理高维输出替代方法的探索，如下所述。\n\n\\subsubsection{分层Softmax}\n减少大词汇表$\\SetV$上高维输出层计算负担的经典方法~\\citep{Goodman2001}是分层地分解概率。\n$|\\SetV|$因子可以降低到$\\log |\\SetV|$一样低，而无需执行与$|\\SetV|$成比例数量（并且也与隐藏单元数量$n_h$成比例）的计算。\n\\citet{BengioTR1215}和~\\citet{Morin+Bengio-2005-small} 将这种因子分解方法引入\\gls{NLM}中。\n\n% -- 454 --\n\n我们可以认为这种层次结构是先建立词的类别，然后是词类别的类别，然后是词类别的类别的类别等等。\n这些嵌套类别构成一棵树，其叶子为词。\n在平衡树中，树的深度为$\\log |\\SetV|$。\n选择一个词的概率是由路径（从树根到包含该词叶子的路径）上的每个节点通向该词分支概率的乘积给出。\n\\figref{fig:chap12_word_hierarchy}是一个简单的例子。\n\\citet{Mnih+Hinton-2009}也描述了使用多个路径来识别单个词的方法，以便更好地建模具有多个含义的词。\n此时计算词的概率则涉及在导向该词的所有路径上进行求和。\n\\begin{figure}[htp]\n\\centering\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\includegraphics{Chapter12/figures/word_hierarchy.pdf}\n\\fi\n% Magic incantation to allow math in caption\n\\captionsetup{singlelinecheck=off}\n% Part of the incantation is that we must define the [] argument\n\\caption[.]{词类别简单层次结构的示意图，其中8个词$w_0,\\dots,w_7$组织成三级层次结构。\n树的叶子表示实际特定的词。\n内部节点表示词的组别。\n任何节点都可以通过二值决策序列（$0$=左，$1$=右）索引，从根到达节点。\n超类$(0)$包含类$(0,0)$和$(0,1)$，其中分别包含词$\\{w_0,w_1\\}$和$\\{w_2,w_3\\}$的集合，类似地超类$(1)$包含类$(1,0)$和$(1,1)$，分别包含词$\\{w_4,w_5\\}$和$\\{w_6,w_7\\}$。\n如果树充分平衡，则最大深度（二值决策的数量）与词数$| \\SetV |$的对数同阶：从$| \\SetV |$个词中选一个词只需执行$\\CalO(\\log |\\SetV|)$次操作（从根开始的路径上的每个节点一次操作）。\n在该示例中，我们乘三次概率就能计算词$y$的概率，这三次概率与从根到节点$y$的路径上每个节点向左或向右的二值决策相关联。\n令$b_i(y)$为遍历树移向$y$时的第$i$个二值决策。\n对输出$\\RSy$进行采样的概率可以通过条件概率的链式法则分解为条件概率的乘积，其中每个节点由这些位的前缀索引。\n例如，节点$(1,0)$对应于前缀$(b_0(w_4)=1, b_1(w_4)=0)$，并且$w_4$的概率可以如下分解：\n\\begin{align}\n  P(\\RSy = w_4) &= P(\\RSb_0 = 1, \\RSb_1 = 0, \\RSb_2 = 0) \\\\\n    &= P(\\RSb_0 = 1) P(\\RSb_1 = 0 \\mid \\RSb_0 = 1) P(\\RSb_2 = 0 \\mid \\RSb_0 = 1, \\RSb_1 = 0). \n\\end{align}\n}\n\\label{fig:chap12_word_hierarchy}\n\\end{figure}\n\n为了预测树的每个节点所需的条件概率，我们通常在树的每个节点处使用\\gls{logistic_regression}模型，并且为所有这些模型提供与输入相同的上下文$C$。\n因为正确的输出编码在训练集中，我们可以使用\\gls{supervised_learning}训练\\gls{logistic_regression}模型。\n我们通常使用标准\\gls{cross_entropy}损失，对应于最大化正确判断序列的对数似然。\n\n因为可以高效地计算输出对数似然（低至$\\log |\\SetV|$而不是$ |\\SetV|$），所以也可以高效地计算梯度。\n这不仅包括关于输出参数的梯度，而且还包括关于隐藏层激活的梯度。\n\n优化树结构从而最小化期望的计算量是可能的，但通常不实际。\n给定词的相对频率，信息理论的工具可以指定如何选择最佳的二进制编码。\n为此，我们可以构造树，使得与词相关联的位数量近似等于该词频率的对数。\n然而在实践中，节省计算通常事倍功半，因为输出概率的计算仅是\\gls{NLM}中总计算的一部分。\n例如，假设有$l$个全连接的宽度为$n_h$的隐藏层。\n令$n_b$是识别一个词所需比特数的加权平均值，其加权由这些词的频率给出。\n在这个例子中，计算隐藏激活所需的操作数增长为$O(ln_h^2)$，而输出计算增长为$O(n_h n_b)$。\n只要$ n_b \\leq l n_h$，相比于收缩$n_b$，我们可以通过收缩$n_h$减少更多的计算量。\n事实上，$n_b$通常很小。\n因为词汇表的大小很少超过一百万而$\\log_ 2(10^6) \\approx 20$，所以可以将$n_b$减小到大约20，但$n_h$通常大得多，大约为$10^3$或更大。\n与其仔细优化分支因子为$2$的树，我们不如定义深度为2和分支因子为$\\sqrt{|\\SetT|}$的树。\n这样的树对应于简单定义一组互斥的词类。\n基于深度为$2$的树的简单方法可以获得层级策略大部分的计算益处。\n\n% -- 455 --\n\n一个仍然有点开放的问题是如何最好地定义这些词类，或者说如何定义一般的词层次结构。\n早期工作使用现有的层次结构\\citep{Morin+Bengio-2005-small} ，但理想情况下也可以与\\gls{NLM}联合学习层次结构。\n学习层次结构很困难。\n对数似然的精确优化似乎难以解决，因为词层次的选择是离散的，不适于基于梯度的优化。\n然而，我们可以使用离散优化来近似地最优化词类的分割。\n\n分层~\\ENNAME{softmax}~的一个重要优点是，它在训练期间和测试期间（如果在测试时我们想计算特定词的概率）都带来了计算上的好处。\n\n当然即使使用分层~\\ENNAME{softmax}，计算所有$|\\SetV|$个词概率的成本仍是很高的。\n另一个重要的操作是在给定上下文中选择最可能的词。\n不幸的是，树结构不能为这个问题提供高效精确的解决方案。\n\n分层~\\ENNAME{softmax}~的一个缺点是在实践中倾向于表现得比基于采样的方法差，基于采样的方法我们将在下文描述。\n这可能是因为词类选择得不好。\n\n\\subsubsection{\\glsentrytext{importance_sampling}}\n\\label{sec:importance_sampling_chap12}\n加速\\gls{NLM}训练的一种方式是，避免明确地计算所有未出现在下一位置的词对梯度的贡献。\n每个不正确的词在此模型下具有低概率。\n枚举所有这些词的计算成本可能会很高。\n相反，我们可以仅采样词的子集。\n使用\\eqnref{eq:softmax-over-words}中引入的符号，梯度可以写成如下形式：\n\\begin{align}\n \\frac{\\partial \\log P(y \\mid C)}{\\partial \\theta} &= \\frac{\\partial \\log {\\rm softmax}_y(\\Va)}{\\partial \\theta} \\\\ \n  &= \\frac{\\partial}{\\partial \\theta} \\log \\frac{e^{a_y}}{\\sum_i e^{a_i}} \\\\ \n &= \\frac{\\partial}{\\partial \\theta} (a_y - \\log \\sum_i e^{a_i}) \\\\ \n &= \\frac{\\partial a_y}{\\partial \\theta}  - \\sum_i P(y = i \\mid C) \\frac{\\partial a_i}{\\partial \\theta},\n\\end{align}\n其中$\\Va$是~\\ENNAME{presoftmax}~激活（或得分）向量，每个词对应一个元素。\n第一项是\\textbf{正相}(positive phase)项，推动$a_y$向上；而第二项是\\textbf{负相}(negative phase)项，对于所有$i$以权重$P(i \\mid C)$推动$a_i$向下。\n由于负相项是期望值，我们可以通过\\gls{monte_carlo}采样估计。\n然而，这将需要从模型本身采样。\n从模型中采样需要对词汇表中所有的$i$计算$P(i \\mid C)$，这正是我们试图避免的。\n\n我们可以从另一个分布中采样，而不是从模型中采样，这个分布称为\\firstgls{proposal_distribution}（记为$q$），并通过适当的权重校正从错误分布采样引入的\\gls{bias_sta} \\citep{Bengio+Senecal-2003-small,Bengio+Senecal-2008}。\n这是一种称为\\firstgls{importance_sampling}的更通用技术的应用，我们将在\\secref{sec:importance_sampling_chap12}中更详细地描述。\n不幸的是，即使精确\\gls{importance_sampling}也不一定有效，因为我们需要计算权重$p_i / q_i$，其中的$p_i = P(i \\mid C)$只能在计算所有得分$a_i$后才能计算。\n这个应用采取的解决方案称为\\gls{biased_importance_sampling}，其中重要性权重被归一化至加和为1。\n当对负词$n_i$进行采样时，相关联的梯度被加权为：\n\\begin{align}\n  w_i = \\frac{p_{n_i} / q_{n_i}}{\\sum_{j=1}^N p_{n_j} / q_{n_j}}.\n\\end{align}\n这些权重用于对来自$q$的$m$个负样本给出适当的重要性，以估计负相项对梯度的贡献：\n\\begin{align}\n  \\sum_{i=1}^{|\\SetV|} P(i \\mid C) \\frac{\\partial a_i}{\\partial \\theta}  \\approx \\frac{1}{m} \\sum_{i=1}^m w_i \\frac{\\partial a_{n_i}}{\\partial \\theta}.\n  \\end{align}\n  \\gls{unigram}或\\gls{bigram}分布可以很好地作为\\gls{proposal_distribution} $q$。\n从数据估计这种分布的参数是很容易的。\n在估计参数之后，也可以非常高效地从这样的分布采样。\n\n\\firstgls{importance_sampling}不仅可以加速具有较大~\\ENNAME{softmax}~输出的模型。\n更一般地，它可以加速具有大稀疏输出层的训练，其中输出是稀疏向量而不是$n$选$1$。\n其中一个例子是\\firstgls{bag_of_words}。\n\\gls{bag_of_words}具有稀疏向量$\\Vv$，其中$v_i$表示词汇表中的词$i$存不存在文档中。\n或者，$v_i$可以指示词$i$出现的次数。\n由于各种原因，训练产生这种稀疏向量的\\gls{ML}模型的成本可能很高。\n在学习的早期，模型可能不会真的使输出真正稀疏。\n此外，将输出的每个元素与目标的每个元素进行比较，可能是描述训练的\\gls{loss_function}最自然的方式。\n这意味着稀疏输出并不一定能带来计算上的好处，因为模型可能会选择使大多数输出非零，而所有这些非零值都需要与相应的训练目标进行比较（ 即使训练目标是零）。\n\\citet{Dauphin2011-small} 证明可以使用\\gls{importance_sampling}加速这种模型。\n高效算法最小化``正词''（在目标中非零的那些词）和相等数量的``负词''的重构损失。\n负词是被随机选取的，如使用启发式采样更可能被误判的词。\n该启发式过采样引入的偏差则可以使用重要性权重校正。\n\n% -- 458 --\n\n在所有这些情况下，输出层梯度估计的计算复杂度被减少为与负样本数量成比例，而不是与输出向量的大小成比例。\n\n\n\\subsubsection{噪声对比估计和排名损失}\n\n\n\\label{sec:combining_neural_language_models_with_n_grams}\n为减少训练大词汇表的\\gls{NLM}的计算成本，研究者也提出了其他基于采样的方法。\n早期的例子是 \\citet{Collobert+Weston-ICML2008}提出的排名损失，将\\gls{NLM}每个词的输出视为一个得分，并试图使正确词的得分$a_y$比其他词的得分$a_i$排名更高。提出的排名损失则是\n\\begin{align} \n L = \\sum_i \\max(0,1-a_y+a_i).\n\\end{align} \n如果观察到词的得分$a_y$远超过负词的得分$a_i$（相差大于1），则第$i$项梯度为零。\n这个\\gls{criterion}的一个问题是它不提供估计的条件概率，条件概率在很多应用中是有用的，包括语音识别和文本生成（包括诸如翻译的条件文本生成任务）。\n\n最近用于\\gls{NLM}的训练目标是噪声对比估计，将在\\secref{sec:noise_contrastive_estimation}中介绍。\n这种方法已成功应用于\\gls{NLM}~\\citep{Mnih+Teh-ICML2012,Mnih2013}。\n\n% -- 459 --\n\n\\subsection{结合\\glsentrytext{n_gram}和\\glsentrytext{NLM}}\n\\gls{n_gram}~模型相对\\gls{NN}的主要优点是~\\gls{n_gram}~模型具有更高的模型\\gls{capacity}（通过存储非常多的元组的频率），并且处理样本只需非常少的计算量（通过查找只匹配当前上下文的几个元组）。\n如果我们使用哈希表或树来访问计数，那么用于~\\gls{n_gram}~的计算量几乎与\\gls{capacity}无关。\n相比之下，将\\gls{NN}的参数数目加倍通常也大致加倍计算时间。\n当然，避免每次计算时使用所有参数的模型是一个例外。\n嵌入层每次只索引单个嵌入，所以我们可以增加词汇量，而不会增加每个样本的计算时间。\n一些其他模型，例如平铺\\gls{convolutional_network}，可以在减少\\gls{parameter_sharing}程度的同时添加参数以保持相同的计算量。然而，基于矩阵乘法的典型\\gls{NN}层需要与参数数量成比例的计算量。\n\n因此，增加\\gls{capacity}的一种简单方法是将两种方法结合，由\\gls{NLM}和~\\gls{n_gram}~\\gls{language_model}组成\\gls{ensemble}~\\citep{BenDucVin01-small,Bengio-nnlm2003-small}。\n\n对于任何\\gls{ensemble}，如果\\gls{ensemble}成员产生的错误相互独立，这种技术可以减少测试误差。\n\\gls{ensemble}学习领域提供了许多方法来组合\\gls{ensemble}成员的预测，包括平均权重的加权和针对验证集选择权重。\n\\citet{Mikolov-Interspeech-2011} 扩展了\\gls{ensemble}，不是仅包括两个模型，而是包括大量模型。\n我们也可以将\\gls{NN}与最大熵模型配对并联合训练\\citep{Mikolov-ASRU-2011}。\n该方法可以被视为训练具有一组额外输入的\\gls{NN}，额外输入直接连接到输出并且不连接到模型的任何其他部分。\n额外输入是输入上下文中特定~\\gls{n_gram}~是否存在的指示器，因此这些变量是非常高维且非常稀疏的。\n\n模型\\gls{capacity}的增加是巨大的 （架构的新部分包含高达$| sV |^n$个参数 ），但是处理输入所需的额外计算量是很小的（因为额外输入非常稀疏）。\n\n\\subsection{\\glsentrytext{NMT}}\n\\label{sec:neural_machine_translation}\n\n机器翻译以一种自然语言读取句子并产生等同含义的另一种语言的句子。\n机器翻译系统通常涉及许多组件。\n在高层次，通常有一个组件负责提出许多候选翻译。\n由于语言之间的差异，这些翻译中的许多翻译是不符合语法的。\n例如，许多语言在名词后放置形容词，因此直接翻译成英语时，它们会产生诸如``apple red''的短语。\n提议机制提出建议翻译的许多变体，理想情况下应包括``red apple''。\n翻译系统的第二个组件（\\gls{language_model}）评估提议的翻译，并可以评估``red apple''比``apple red''更好。\n\n% -- 460 --\n\n最早的机器翻译\\gls{NN}探索中已经纳入了\\gls{encoder}和\\gls{decoder}的想法(Allen 1987; Chrisman 1991; Forcada\nand Ñeco 1997)，而翻译中\\gls{NN}的第一个大规模有竞争力的用途是通过\\gls{NLM}升级翻译系统的\\gls{language_model}~\\citep{Schwenk-et-al-IWSLT2006,Schwenk-2010}。\n之前，大多数机器翻译系统在该组件使用~\\gls{n_gram}~模型。\n机器翻译中基于~\\gls{n_gram}~的模型不仅包括传统的回退~\\gls{n_gram}~模型~\\citep{Jelinek+Mercer80,Katz87,Chen+Goodman99}，而且包括\\textbf{最大熵语言模型}(maximum entropy language models)~\\citep{MaxEnt96}，其中给定上下文中常见的词，affine-softmax层预测下一个词。\n\n传统\\gls{language_model}仅仅报告自然语言句子的概率。\n因为机器翻译涉及给定输入句子产生输出句子，所以将自然\\gls{language_model}扩展为条件的是有意义的。\n如\\secref{sec:learning_conditional_distributions_with_maximum_likelihood}所述可以直接地扩展一个模型，该模型定义某些变量的边缘分布，以便在给定上下文$C$（$C$可以是单个变量或变量列表）的情况下定义该变量的条件分布。\n\\citet{Devlin-et-al-ACL2014}在一些统计机器翻译的基准中击败了最先进的技术，他给定源语言中的短语$\\RSs_1, \\RSs_2,\\ldots, \\RSs_k$后使用~\\glssymbol{MLP}~对目标语言的短语$\\RSt_1, \\RSt_2,\\ldots, \\RSt_k$进行评分。\n这个~\\glssymbol{MLP}~估计$P(\\RSt_1, \\RSt_2,\\ldots, \\RSt_k \\mid \\RSs_1, \\RSs_2,\\ldots, \\RSs_k)$。\n这个~\\glssymbol{MLP}~的估计替代了条件~\\gls{n_gram}~模型提供的估计。\n\n基于~\\glssymbol{MLP}~方法的缺点是需要将序列预处理为固定长度。\n为了使翻译更加灵活，我们希望模型允许可变的输入长度和输出长度。\n\\glssymbol{RNN}~具备这种能力。\n\\secref{sec:modeling_sequences_conditioned_on_context_with_rnns}描述了给定某些输入后，表示（输出）序列上的条件分布的~\\glssymbol{RNN}~的几种构造方法，并且\\secref{sec:encoder_decoder_sequence_to_sequence_architectures}描述了当输入是序列时如何实现这种条件分布。\n在所有情况下，一个模型首先读取输入序列并产生概括输入序列的数据结构。我们称这个概括为``上下文''~$C$。\n上下文$C$可以是向量列表，也可以是向量或张量。\n读取输入以产生$C$的模型可以是~\\glssymbol{RNN}~\\citep{Cho-et-al-EMNLP2014,Sutskever-et-al-NIPS2014,Jean-et-al-arxiv2014}或\\gls{convolutional_network}~\\citep{Kalchbrenner+Blunsom-EMNLP2013}。\n另一个模型（通常是RNN），则读取上下文$C$并且生成目标语言的句子。\n在\\figref{fig:chap12_encoder_decoder_architecture}中展示了这种用于机器翻译的\\gls{encoder}-\\gls{decoder}框架的总体思想。\n\n% -- 461 --\n\n\\begin{figure}[htp]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter12/figures/encoder_decoder_architecture.pdf}}\n\\fi\n\\caption{\\gls{encoder}-\\gls{decoder}架构在直观\\gls{representation}（例如词序列或图像）和语义\\gls{representation}之间来回映射。\n通过将一种模态数据的\\gls{encoder}的输出（例如从法语句子到捕获句子含义的隐藏\\gls{representation}的\\gls{encoder}映射）作为另一模态数据的\\gls{decoder}的输入（如\\gls{decoder}将捕获句子含义的隐藏\\gls{representation}映射到英语），我们可以训练将一种模态转换到另一种模态的系统。\n这个想法已经成功应用于很多领域，不仅仅是机器翻译，还包括为图像生成标题。\n}\n\\label{fig:chap12_encoder_decoder_architecture}\n\\end{figure}\n\n为生成以源句为条件的整句，模型必须具有表示整个源句的方式。 \n早期模型只能表示单个词或短语。\n从\\gls{representation_learning}的观点来看，具有相同含义的句子具有类似\\gls{representation}是有用的，无论它们是以源语言还是以目标语言书写。\n研究者首先使用卷积和~\\glssymbol{RNN}~的组合探索该策略~\\citep{Kalchbrenner+Blunsom-EMNLP2013}。\n后来的工作介绍了使用~\\glssymbol{RNN}~对所提议的翻译进行打分\\citep{Cho-et-al-EMNLP2014}或生成翻译句子\\citep{Sutskever-et-al-NIPS2014}。\n\\cite{Jean-et-al-arxiv2014}将这些模型扩展到更大的词汇表。\n\n% -- 462 --\n\n\\subsubsection{使用\\glsentrytext{attention_mechanism}并对齐数据片段}\n\\label{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}\n使用固定大小的表示概括非常长的句子（例如60个词）的所有语义细节是非常困难的。 \n这需要使用足够大的RNN，并且用足够长时间训练得很好才能实现，如 \\citet{Cho-et-al-EMNLP2014}和\\citet{Sutskever-et-al-NIPS2014}所表明的。\n然而，更高效的方法是先读取整个句子或段落（以获得正在表达的上下文和焦点），然后一次翻译一个词，每次聚焦于输入句子的不同部分来收集产生下一个输出词所需的语义细节。\n这正是~\\citet{Bahdanau-et-al-ICLR2015-small}第一次引入的想法。\n\\figref{fig:chap12_attention}中展示了\\gls{attention_mechanism}，其中每个\\gls{time_step}关注输入序列的特定部分。\n\n \\begin{figure}[htp]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter12/figures/attention.pdf}}\n\\fi\n\\caption{由~\\citet{Bahdanau-et-al-ICLR2015-small}引入的现代\\gls{attention_mechanism}，本质上是加权平均。\n\\gls{attention_mechanism}对具有权重$\\alpha^{(t)}$的特征向量$\\Vh^{(t)}$进行加权平均形成上下文向量$\\Vc$。\n在一些应用中，特征向量$\\Vh$是\\gls{NN}的\\gls{hidden_unit}，但它们也可以是模型的原始输入。\n权重$\\alpha^{(t)}$由模型本身产生。\n它们通常是区间$[0,1]$中的值，并且旨在仅仅集中在单个$\\Vh^{(t)}$周围，使得加权平均近似模拟精确地读取一个特定\\gls{time_step}的特征向量。\n权重$\\alpha^{(t)}$通常由模型另一部分发出的相关性得分应用softmax函数后产生。\n\\gls{attention_mechanism}在计算上需要比直接索引期望的$\\Vh^{(t)}$付出更高的代价，但直接索引不能使用\\gls{GD}训练。\n基于加权平均的\\gls{attention_mechanism}是平滑、可微的近似，可以使用现有优化算法训练。\n}\n\\label{fig:chap12_attention}\n\\end{figure}\n\n我们可以认为基于\\gls{attention_mechanism}的系统有三个组件：\n\\begin{itemize}\n \\item   读取器\\emph{读取}原始数据（例如源语句中的源词）并将其转换为\\gls{distributed_representation}，其中一个特征向量与一个词的位置相关联。\n \\item 用于存储读取器输出的特征向量的列表。这可以被理解为一个包含事实序列的\\emph{存储器}，之后可以从中检索，而检索不必以相同的顺序发生，也不必访问全部。\n \\item 最后一个程序\\emph{利用}存储器的内容顺序地执行任务，每个\\gls{time_step}聚焦于某个存储器元素的内容（或几个，具有不同权重）。\n\\end{itemize}\n第三组件可以生成翻译结果语句。\n\n% -- 463 --\n\n当用一种语言书写的句子中的词与另一种语言的翻译语句中的相应词对齐时，可以使对应的\\gls{word_embedding}相关联。\n早期的工作表明，我们可以学习将一种语言中的\\gls{word_embedding}与另一种语言中的\\gls{word_embedding}相关联的翻译矩阵\\citep{Kocisky-et-al-ACL2014}，与传统的基于短语表中频率计数的方法相比，可以产生较低的对齐错误率。\n更早的工作\\citep{Klementiev-et-al-COLING2012}也对跨语言词向量进行了研究。 \n这种方法存在很多的扩展。\n例如，允许在更大数据集上训练的更高效的跨语言对齐~\\citep{Gouws-et-al-arxiv2014} 。\n\n\\subsection{历史展望}\n\\label{sec:historical_perspective_chap12}\n\n在对\\gls{back_propagation}的第一次探索中，\\citet{Rumelhart86b-small}等人提出了\\gls{distributed_representation}符号的思想，其中符号对应于家族成员的标识，而\\gls{NN}捕获家族成员之间的关系，训练样本形成三元组如（Colin，Mother，Victoria）。\n\\gls{NN}的第一层学习每个族成员的表示。例如，Colin的特征可能代表Colin所在的族树，他所在树的分支，他来自哪一代等等。\n我们可以将\\gls{NN}认为是计算一组学到的规则，这些规则将属性关联在一起从而可以获得期望的预测结果。\n模型于是可以进行预测，例如推断谁是Colin的母亲。\n\n\\cite{Deerwester90}将符号嵌入的想法扩展到对词的嵌入。\n这些嵌入使用SVD学习。 \n后来，嵌入通过\\gls{NN}学习。\n\n\\gls{NLP}的历史是由流行表示（对模型输入不同方式的表示）的变化为标志的。\n在早期对符号和词建模的工作之后，\\gls{NN}在\\glssymbol{NLP}上一些最早的应用\\citep{Miikkulainen91,Schmidhuber96}将输入表示为字符序列。\n\n\\citet{BenDucVin01-small} 将焦点重新引到对词建模并引入\\gls{NLM}，能产生可解释的\\gls{word_embedding}。\n这些神经模型已经从一开始在一小组符号上定义的表示（20世纪80年代）扩展到现代应用中的数百万字（包括专有名词和拼写错误）。\n这种计算扩展的努力导致了\\secref{sec:high_dimensional_outputs}中描述的技术发明。\n\n% -- 464 --\n\n最初，使用词作为\\gls{language_model}的基本单元改进了语言建模的性能 \\citep{BenDucVin01-small}。\n而今，新技术不断推动基于字符 \\citep{Sutskever-et-al-ICML2011}）和基于词的模型一起向前发展，最近的工作 \\citep{gillick2015multilingual}甚至建模Unicode字符的单个字节。\n\n\\gls{NLM}背后的思想已经扩展到多个\\gls{NLP}应用，如解析\\citep{Henderson-NAACL2003,Henderson-ACL2004,Collobert-AISTATS2011}、词性标注、语义角色标注、分块等，有时使用共享\\gls{word_embedding}的单一多任务学习架构\\citep{Collobert+Weston-ICML2008,collobert2011natural}。\n\n随着t-SNE~\\gls{dimensionality_reduction}算法的发展\\citep{VanDerMaaten08-small}以及Joseph Turian在2009年引入的专用于可视化词嵌入的应用，用于分析\\gls{language_model}嵌入的二维可视化成为一种流行的工具。\n\n\\section{其他应用}\n\\label{sec:other_applications}\n\n在本节中，我们介绍\\gls{DL}一些其他类型的应用，它们与上面讨论的标准对象识别、语音识别和\\gls{NLP}任务不同。\n本书的第三部分将扩大这个范围，甚至进一步扩展到仍是目前主要研究领域的任务。\n\n\n\\subsection{\\glsentrytext{recommender_system}}\n\\label{sec:recommender_systems}\n信息技术部门中\\gls{ML}的主要应用之一是向潜在用户或客户推荐项目。\n这可以分为两种主要的应用：在线广告和项目建议（通常这些建议的目的仍然是为了销售产品）。\n两者都依赖于预测用户和项目之间的关联， 一旦向该用户展示了广告或推荐了该产品，\\gls{recommender_system}要么预测一些行为的概率（用户购买产品或该行为的一些代替）或预期增益（其可取决于产品的价值）。\n目前，互联网的资金主要来自于各种形式的在线广告。\n经济的主要部分依靠网上购物。 \n包括Amazon和eBay在内的公司都使用了\\gls{ML}（包括\\gls{DL}）推荐他们的产品。\n有时，项目不是实际出售的产品，而是如选择在社交网络新闻信息流上显示的帖子、推荐观看的电影、推荐笑话、推荐专家建议、匹配视频游戏的玩家或匹配约会的人。\n\n% -- 465 --\n通常，这种关联问题可以作为\\gls{supervised_learning}问题来处理：给出一些关于项目和关于用户的信息，预测感兴趣的行为（用户点击广告、输入评级、点击``喜欢''按钮、 购买产品，在产品上花钱、花时间访问产品页面等）。\n通常这最终会归结到回归问题（预测一些条件期望值）或概率分类问题（预测一些离散事件的条件概率）。\n\n早期\\gls{recommender_system}的工作依赖于这些预测输入的最小信息：用户ID和项目ID。\n在这种情况下，唯一的泛化方式依赖于不同用户或不同项目的目标变量值之间的模式相似性。\n假设用户1和用户2都喜欢项目A，B和C.\n由此，我们可以推断出用户1和用户2具有类似的口味。\n如果用户1喜欢项目D，那么这可以强烈提示用户2也喜欢D。\n基于此原理的算法称为\\firstgls{collaborative_filtering}。\n非参数方法（例如基于估计偏好模式之间相似性的最近邻方法）和参数方法都可能用来解决这个问题。\n参数方法通常依赖于为每个用户和每个项目学习\\gls{distributed_representation}（也称为嵌入）。\n目标变量的双线性预测（例如评级）是一种简单的参数方法，这种方法非常成功，通常被认为是最先进系统的组成部分。\n通过用户嵌入和项目嵌入之间的点积（可能需要使用仅依赖于用户ID或项目ID的常数来校正）获得预测。\n令$\\hat{\\MR}$是包含我们预测的矩阵，$\\MA$矩阵行中是用户嵌入，$\\MB$矩阵列中具有项目嵌入。\n令$\\Vb$和$\\Vc$是分别包含针对每个用户（表示用户平常坏脾气或积极的程度）以及每个项目（表示其大体受欢迎程度）的\\gls{bias_aff}向量。\n因此，双线性预测如下获得：\n\\begin{equation}\n\\label{eq:bilinear-prediction}\n \\hat{R}_{u,i} = b_u + c_i + \\sum_j A_{u,j} B_{j,i}.\n\\end{equation}\n通常，人们希望最小化预测评级$\\hat{R}_{u,i}$ 和实际评级${R}_{u,i}$ 之间的平方误差。\n当用户嵌入和项目嵌入首次缩小到低维度（两个或三个）时，它们就可以方便地可视化，或者可以将用户或项目彼此进行比较（就像\\gls{word_embedding}）。\n获得这些嵌入的一种方式是对实际目标（例如评级）的矩阵$\\MR$进行\\gls{SVD}。\n这对应于将$\\MR = \\MU \\MD \\MV'$（或归一化的变体）分解为两个因子的乘积，低秩矩阵 $\\MA=\\MU \\MD$ 和 $\\MB = \\MV'$。\n\\glssymbol{SVD}的一个问题是它以任意方式处理缺失条目，如同它们对应于目标值0。\n相反，我们希望避免为缺失条目做出的预测付出任何代价。\n幸运的是，观察到的评级的平方误差总和也可以使用基于梯度的优化最小化。\n\\glssymbol{SVD}~和\\eqnref{eq:bilinear-prediction}中的双线性预测在~\\ENNAME{Netflix}~奖竞赛中（目的是仅基于大量匿名用户的之前评级预测电影的评级）表现得非常好\\citep{bennett2007netflix}。\n许多\\gls{ML}专家参加了2006年和2009年之间的这场比赛。\n它提高了使用先进\\gls{ML}的\\gls{recommender_system}的研究水平，并改进了\\gls{recommender_system}。\n即使简单的双线性预测或~\\glssymbol{SVD}~本身并没有赢得比赛，但它是大多数竞争对手提出的整体模型中一个组成部分，包括胜者\\citep{BigChaos-Netflix2009,Koren09}。\n\n% -- 466 --\n\n除了这些具有\\gls{distributed_representation}的双线性模型之外，第一次用于\\gls{collaborative_filtering}的\\gls{NN}之一是基于~\\glssymbol{RBM}~的无向概率模型~\\citep{Salakhutdinov-2007-short}。\n\\glssymbol{RBM}~是~\\ENNAME{Netflix}~比赛获胜方法的一个重要组成部分\\citep{BigChaos-Netflix2009,Koren09}。\n\\gls{NN}社群中也已经探索了对评级矩阵进行因子分解的更高级变体\\citep{Salakhutdinov2008-small}。\n\n然而，\\gls{collaborative_filtering}系统有一个基本限制：当引入新项目或新用户时，缺乏评级历史意味着无法评估其与其他项目或用户的相似性，或者说无法评估新的用户和现有项目的联系。\n这被称为冷启动推荐问题。\n解决冷启动推荐问题的一般方式是引入单个用户和项目的额外信息。\n例如，该额外信息可以是用户简要信息或每个项目的特征。\n使用这种信息的系统被称为\\,\\textbf{基于内容的推荐系统}(content-based recommender system)。\n从丰富的用户特征或项目特征集到嵌入的映射可以通过\\gls{DL}架构学习\\citep{Huang-et-al-2013,Elkahky-et-al-2015}。\n\n专用的\\gls{DL}架构，如\\gls{convolutional_network}已经应用于从丰富内容中提取特征，如提取用于音乐推荐的音乐音轨\\citep{vandenOord-et-al-NIPS2013}。\n在该工作中，\\gls{convolutional_network}将声学特征作为输入并计算相关歌曲的嵌入。\n该歌曲嵌入和用户嵌入之间的点积则可以预测用户是否将收听该歌曲。\n\n% -- 467 --\n\n\\subsubsection{\\glsentrytext{exploration}与\\glsentrytext{exploitation}}\n当向用户推荐时，会产生超出普通\\gls{supervised_learning}范围的问题，并进入\\gls{RL}的领域。\n理论上，许多推荐问题最准确的描述是\\gls{contextual_bandit}\\citep{Langford+Zhang-NIPS2008,Lu-et-al-2010}。\n问题是，当我们使用\\gls{recommender_system}收集数据时，我们得到是一个有偏且不完整的用户偏好观：我们只能看到用户对推荐给他们项目的反应，而不是其他项目。\n此外，在某些情况下，我们可能无法获得未向其进行推荐的用户的任何信息（例如，在广告竞价中，可能是广告的建议价格低于最低价格阈值，或者没有赢得竞价，因此广告不会显示）。\n更重要的是，我们不知道推荐任何其他项目会产生什么结果。\n这就像训练一个分类器，为每个训练样本$\\Vx$挑选一个类别$\\hat y$（通常是基于模型最高概率的类别），然后只能获得该类别正确与否的反馈。\n显然，每个样本传达的信息少于监督的情况（其中真实标签$y$是可直接访问的），因此需要更多的样本。\n更糟糕的是，如果我们不够小心，即使收集越来越多的数据，我们得到的系统可能会继续选择错误的决定，因为正确的决定最初只有很低的概率：直到学习者选择正确的决定之前，该系统都无法学习正确的决定。\n这类似于\\gls{RL}的情况，其中仅观察到所选动作的奖励。\n一般来说，\\gls{RL}会涉及许多动作和许多奖励的序列。\n\\gls{bandit}~情景是\\gls{RL}的特殊情况，其中学习者仅采取单一动作并接收单个奖励。\n\\gls{bandit}~问题在学习者知道哪个奖励与哪个动作相关联的时候，是更容易的。\n在一般的\\gls{RL}场景中，高奖励或低奖励可能是由最近的动作或很久以前的动作引起的。\n术语\\firstgls{contextual_bandit}指的是在一些输入变量可以通知决定的上下文中采取动作的情况。\n例如，我们至少知道用户身份，并且我们要选择一个项目。\n从上下文到动作的映射也称为\\firstgls{policy}。\n学习者和数据分布（现在取决于学习者的动作）之间的反馈循环是\\gls{RL}和\\gls{bandit}研究的中心问题。\n\n% -- 468 --\n\n\\gls{RL}需要权衡\\firstgls{exploration}与\\firstgls{exploitation}。\n\\gls{exploitation}指的是从目前学到的最好\\gls{policy}采取动作，也就是我们所知的将获得高奖励的动作。\n\\firstgls{exploration}是指采取行动以获得更多的训练数据。\n如果我们知道给定上下文$\\Vx$，动作$a$给予我们1的奖励，但我们不知道这是否是最好的奖励。\n我们可能想利用我们目前的\\gls{policy}，并继续采取行动$a$相对肯定地获得1的奖励。\n然而，我们也可能想通过尝试动作$a'$来探索。\n我们不知道尝试动作$a'$会发生什么。\n我们希望得到2的奖励，但有获得0奖励的风险。\n无论如何，我们至少获得了一些知识。\n\n\\firstgls{exploration}可以以许多方式实现，从覆盖可能动作的整个空间的随机动作到基于模型的方法（基于预期回报和模型对该回报不确定性的量来计算动作的选择）。\n\n许多因素决定了我们喜欢\\gls{exploration}或\\gls{exploitation}的程度。\n最突出的因素之一是我们感兴趣的时间尺度。\n如果代理只有短暂的时间积累奖励，那么我们喜欢更多的\\gls{exploitation}。\n如果代理有很长时间积累奖励，那么我们开始更多的\\gls{exploration}，以便使用更多的知识更有效地规划未来的动作。\n\n\\gls{supervised_learning}在\\gls{exploration}或\\gls{exploitation}之间没有权衡，因为监督信号总是指定哪个输出对于每个输入是正确的。\n我们总是知道标签是最好的输出，没有必要尝试不同的输出来确定是否优于模型当前的输出 。\n\n除了权衡\\gls{exploration}和\\gls{exploitation}之外，\\gls{RL}背景下出现的另一个困难是难以评估和比较不同的\\gls{policy}。\n\\gls{RL}包括学习者和环境之间的相互作用。\n这个反馈回路意味着使用固定的测试集输入评估学习者的表现不是直接的。\n\\gls{policy}本身确定将看到哪些输入。\n\\citet{Dudik-2011} 提出了评估\\gls{contextual_bandit}的技术。\n\n% -- 469 --\n\n\\subsection{知识表示、推理和回答}\n\\label{sec:knowledge_representation_reasoning and_question_answering}\n因为使用符号嵌入\\citep{Rumelhart86b-small}和词嵌入\\citep{Deerwester90,BenDucVin01-small}，\\gls{DL}方法在\\gls{language_model}、机器翻译和\\gls{NLP}方面非常成功。\n这些嵌入表示关于单个词或概念的语义知识。\n研究前沿是为短语或词和事实之间的关系开发嵌入。\n搜索引擎已经使用\\gls{ML}来实现这一目的，但是要改进这些更高级的表示还有许多工作要做。\n\n\\subsubsection{知识、联系和回答}\n一个有趣的研究方向是确定如何训练\\gls{distributed_representation}才能捕获两个实体之间的\\firstgls{relation}。\n\n数学中，\\gls{binary_relation}是一组有序的对象对。\n集合中的对具有这种关系，而那些不在集合中的对则没有。\n例如，我们可以在实体集$\\{ 1, 2, 3 \\}$上定义关系``小于''来定义有序对的集合$\\SetS = \\{ (1, 2), (1, 3), (2, 3) \\}$。\n一旦这个关系被定义，我们可以像动词一样使用它。\n因为$(1, 2) \\in \\SetS$，我们说1小于2。\n因为$(2, 1) \\not \\in \\SetS$，我们不能说2小于1。\n当然，彼此相关的实体不必是数字。\n我们可以定义关系{\\tt is\\_a\\_type\\_of}包含如{\\tt（狗，哺乳动物）}的元组。\n\n在~\\glssymbol{AI}~的背景下，我们将\\gls{relation}看作句法上简单且高度结构化的语言。\n\\gls{relation}起到动词的作用，而\\gls{relation}的两个参数发挥着主体和客体的作用。\n这些句子是一个三元组\\gls{token}的形式：\n\\begin{align}\n({\\rm subject}, {\\rm verb}, {\\rm object})\n\\end{align}\n其值是\n\\begin{align}\n  ({\\rm entity}_i, {\\rm relation}_j, {\\rm entity}_k).\n\\end{align}\n\n我们还可以定义\\firstgls{attribute}，类似于\\gls{relation}的概念，但只需要一个参数：\n\\begin{align}\n  ( {\\rm entity}_i, {\\rm attribute}_j ).\n\\end{align}\n例如，我们可以定义{\\tt has\\_fur} 属性，并将其应用于像{\\tt 狗}这样的实体。\n\n许多应用中需要表示\\gls{relation}和推理。\n我们如何在\\gls{NN}中做到这一点？\n\n\\gls{ML}模型当然需要训练数据。\n我们可以推断非结构化自然语言组成的训练数据集中实体之间的\\gls{relation}，也可以使用明确定义\\gls{relation}的结构化数据库。 \n这些数据库的共同结构是\\gls{relational_database}，它存储这种相同类型的信息，虽然没有格式化为三元\\gls{token}的句子。\n当数据库旨在将日常生活中常识或关于应用领域的专业知识传达给\\gls{AI}系统时，我们将这种数据库称为\\gls{knowledge_base}。\n\\gls{knowledge_base}包括一般的像{\\tt Freebase}、{\\tt OpenCyc}、 {\\tt WordNet}、 {\\tt Wikibase}\\footnote{分别可以在如下网址获取: \\url{freebase.com}, \\url{cyc.com/opencyc},\n\\url{wordnet.princeton.edu}, \\url{wikiba.se}}~等等，和专业的知识库，如GeneOntology\\footnote{\\url{geneontology.org}}。\n实体和\\gls{relation}的\\gls{representation}可以将\\gls{knowledge_base}中的每个三元组作为训练样本来学习，并且以最大化捕获它们的联合分布为训练目标\\citep{Bordes-et-al-LSML2013}。\n\n除了训练数据，我们还需定义训练的模型族。\n一种常见的方法是将\\gls{NLM}扩展到模型实体和\\gls{relation}。\n\\gls{NLM}学习提供每个词\\gls{distributed_representation}的向量。\n他们还通过学习这些向量的函数来学习词之间的相互作用，例如哪些词可能出现在词序列之后。\n我们可以学习每个关系的嵌入向量将这种方法扩展到实体和\\gls{relation}。\n事实上，建模语言和通过\\gls{relation}编码建模知识的联系非常接近，研究人员可以\\emph{同时}使用\\gls{knowledge_base}\\emph{和}自然语言句子训练这样的实体表示\\citep{bordes-aaai-2011,Bordes-et-al-AISTATS2012-small,Wang-et-al-EMNLP2014}，或组合来自多个\\gls{relational_database}的数据~\\citep{Bordes-et-al-NIPS2013}。\n可能与这种模型相关联的特定参数化有许多种。\n早期关于学习实体间\\gls{relation}的工作~\\citep{Paccanaro2000}假定高度受限的参数形式（``线性关系嵌入''），通常对\\gls{relation}使用与实体形式不同的表示。\n例如，\\citet{Paccanaro2000}和~\\citet{bordes-aaai-2011} 用向量表示实体而矩阵表示\\gls{relation}，其思想是\\gls{relation}在实体上相当于运算符。\n或者，关系可以被认为是任何其他实体\\citep{Bordes-et-al-AISTATS2012-small}，允许我们关于关系作声明，但是更灵活的是将它们结合在一起并建模联合分布的机制。\n\n这种模型的实际短期应用是\\firstgls{link_prediction}：预测\\gls{knowledge_graph}中缺失的弧。\n这是基于旧事实推广新事实的一种形式。\n目前存在的大多数\\gls{knowledge_base}都是通过人力劳动构建的，这往往使\\gls{knowledge_base}缺失许多并且可能是大多数真正的关系。\n请查看~\\citet{Wang-et-al-AAAI2014}、\\citet{Lin-et-al-AAAI2015}和~\\citet{Garcia-Duran-et-al-arxiv2015}中这样应用的例子。\n\n我们很难评估\\gls{link_prediction}任务上模型的性能，因为我们的数据集只有正样本（已知是真实的事实）。\n如果模型提出了不在数据集中的事实，我们不确定模型是犯了错误还是发现了一个新的以前未知的事实。\n度量基于测试模型如何将已知真实事实的留存集合与不太可能为真的其他事实相比较，因此有些不精确。\n构造感兴趣的负样本（可能为假的事实）的常见方式是从真实事实开始，并创建该事实的损坏版本，例如用随机选择的不同实体替换\\gls{relation}中的一个实体 。\n通用的测试精度（10$\\%$度量）计算模型在该事实的所有损坏版本的前10$\\%$中选择``正确''事实的次数。\n\n\\gls{knowledge_base}和\\gls{distributed_representation}的另一个应用是\\firstgls{word_sense_disambiguation} \\citep{Navigli+Verlardi-2005,Bordes-et-al-AISTATS2012-small}，这个任务决定在某些语境中哪个词的意义是恰当。\n\n最后，知识的\\gls{relation}结合一个推理过程和对自然语言的理解可以让我们建立一个一般的问答系统。\n一般的问答系统必须能处理输入信息并记住重要的事实，并以之后能检索和推理的方式组织。\n这仍然是一个困难的开放性问题，只能在受限的``玩具''环境下解决。\n目前，记住和检索特定声明性事实的最佳方法是使用显式记忆机制，如\\secref{sec:explicit_memory}所述。\n\\gls{memory_network}最开始是被用来解决一个玩具问答任务\\citep{Weston2014}。\n\\citet{Kumar-et-al-arxiv2015} 提出了一种扩展，使用GRU~\\gls{recurrent_network}将输入读入存储器并且在给定存储器的内容后产生回答。\n\n\\gls{DL}已经应用于其他许多应用（除了这里描述的应用以外），并且肯定会在此之后应用于更多的场景。\n我们不可能全面描述与此主题相关的所有应用 。\n本项调查尽可能地提供了在本文写作之时的代表性样本\n\n第二部分介绍了涉及\\gls{DL}的现代实践，包括了所有非常成功的方法。\n一般而言，这些方法使用\\gls{cost_function}的梯度寻找模型（近似于某些所期望的函数）的参数。\n当具有足够的训练数据时，这种方法是非常强大的。\n我们现在转到第三部分，开始进入研究领域，旨在使用较少的训练数据或执行更多样的任务。\n而且相比目前为止所描述的情况，其中的挑战更困难并且远远没有解决。\n"
  },
  {
    "path": "Chapter13/README.md",
    "content": "#第十三章笔记\n"
  },
  {
    "path": "Chapter13/annotations.txt",
    "content": "{'user': 'acct:Cherish@hypothes.is', 'text': '均涉及', 'origin_text': '                  许多深度学习的研究前沿  !!!涉及到了!!!  构建输入的概率模型pmodel(x)pmodel(x)p_{\\\\t', 'time': '2017-02-18T03:18'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '在给定任一变量的前提下，该模型可以通过概率推断预测其环境中的其他任何变量', 'origin_text': 'l(x)p_{\\\\text{model}}(\\\\Vx)。原则上说，  !!!给定任何其他变量的情况下，这样的模型可以使用概率推断来预测其环境中的任何变量!!!  。许多这样的模型还具有潜变量 hh\\\\Vh，其中pmodel(x', 'time': '2017-02-18T07:41'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '描述了一种基于潜变量的最简单的概率模型', 'origin_text': '基于潜变量的分布式表示继承了表示学习的所有优点。在本章中，  !!!我们描述了一些带有潜变量的最简单的概率模型!!!  ：线性因子模型。这些模型有时被用来构建混合块模型~{cite?', 'time': '2017-02-18T07:41'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '同时，也介绍了', 'origin_text': '块模型~{cite?}或者更大的深度概率模型~{cite?}。  !!!他们还展示了!!!  构建生成模型所需的许多基本方法，更先进的深层模型也将在此基础上进', 'time': '2017-02-18T07:55'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '基本方法', 'origin_text': '的深度概率模型~{cite?}。他们还展示了构建生成模型所需的  !!!许多基本方法!!!  ，更先进的深层模型也将在此基础上进一步扩展。线性因子模型通', 'time': '2017-02-18T07:55'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '在此基础上，深层模型将得到进一步扩展', 'origin_text': '~{cite?}。他们还展示了构建生成模型所需的许多基本方法，  !!!更先进的深层模型也将在此基础上进一步扩展!!!  。线性因子模型通过使用随机线性解码器函数来定义，该函数通过', 'time': '2017-02-18T07:57'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '通过', 'origin_text': '法，更先进的深层模型也将在此基础上进一步扩展。线性因子模型  !!!通过使用!!!  随机线性解码器函数来定义，该函数通过对hh\\\\Vh的线性变换以及添', 'time': '2017-02-18T07:58'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '有趣的是，通过这些模型我们能够发现一些符合简单联合分布的解释性因子。', 'origin_text': '数通过对hh\\\\Vh的线性变换以及添加噪声来生成xx\\\\Vx。  !!!这些模型很有趣，因为它们使得我们能够发现一些拥有简单联合分布的解释性因子!!!  。 线性解码器的简单性使得它们成为了最早被广泛研究的对潜变量建', 'time': '2017-02-18T08:02'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '基于', 'origin_text': '解释性因子。 线性解码器的简单性使得它们成为了最早被广泛研究的  !!!对!!!  潜变量建模的模型。线性因子模型描述如下的数据生成过程。 ', 'time': '2017-02-18T08:13'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '利用线性因子模型描述数据生成过程', 'origin_text': '的简单性使得它们成为了最早被广泛研究的对潜变量建模的模型。  !!!线性因子模型描述如下的数据生成过程!!!  。 首先，我们从一个分布中抽取解释性因子hh\\\\Vhh∼p(h', 'time': '2017-02-18T08:16'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '因此易于从中采样', 'origin_text': '(hi)p(\\\\Vh) = \\\\prod_{i}^{}p(h_i)，  !!!所以很容易从中采样!!!  。接下来，在给定因子的情况下，我们对实值的可观察变量进行抽样', 'time': '2017-02-18T08:21'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '服从以方差为单位矩阵', 'origin_text': '的选择上有所不同。因子分析~{cite?}中，潜变量的先验  !!!是一个方差为单位矩阵!!!  的高斯分布h∼\\ue23a(h;0,I),h∼N(h;0,I),\\\\beg', 'time': '2017-02-18T08:26'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '在给定h的条件下观察值Xi', 'origin_text': 'athbf{0},\\\\MI),\\\\end{align}同时，假定  !!!观察值xixix_i在给定hh\\\\Vh的条件下!!!  是条件独立的。具体的说，噪声可以被假设为是从对角协方差矩阵的高', 'time': '2017-02-18T08:33'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '具体来说', 'origin_text': '假定观察值xixix_i在给定hh\\\\Vh的条件下是条件独立的。  !!!具体的说!!!  ，噪声可以被假设为是从对角协方差矩阵的高斯分布中抽出的，协方差矩', 'time': '2017-02-18T08:33'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '可以假设噪声', 'origin_text': 'xixix_i在给定hh\\\\Vh的条件下是条件独立的。具体的说，  !!!噪声可以被假设为!!!  是从对角协方差矩阵的高斯分布中抽出的，协方差矩阵为ψ=diag(', 'time': '2017-02-18T08:34'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '作轻微调整', 'origin_text': 'n}为了将PCA引入到概率框架中，我们可以对因子分析模型  !!!进行轻微修改!!!  ，使条件方差σ2iσi2\\\\sigma_i^2等于同一个值。在这', 'time': '2017-02-18T08:37'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '利用了一种观察现象', 'origin_text': '数WW\\\\MW和σ2σ2\\\\sigma^2。这个概率PCA模型  !!!利用了这样一种观察到的现象!!!  ：除了一些小且剩余的至多为σ2σ2\\\\sigma^2的重构误差 ，', 'time': '2017-02-18T08:38'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '维', 'origin_text': 'ow{} 0时， 概率PCA所定义的密度函数在WW\\\\MW的ddd  !!!维列!!!  生成空间周围非常尖锐。这导致模型会为没有在一个超空间附近聚集的', 'time': '2017-02-18T08:40'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '维', 'origin_text': '期望等于将x−bx−b\\\\Vx - \\\\Vb投影到WW\\\\MW的ddd  !!!列的!!!  生成空间，与PCA一样。当σ→0σ→0\\\\sigma\\\\xri', 'time': '2017-02-18T08:40'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '超空间', 'origin_text': 'W\\\\MW的ddd维列生成空间周围非常尖锐。这导致模型会为没有在  !!!一个超空间!!!  附近聚集的数据分配非常低的概率独立分量分析独立', 'time': '2017-02-18T08:41'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '潜在信号', 'origin_text': 'te?}。它是一种建模线性因子的方法，旨在将观察到的信号分离成  !!!许多潜在信号!!!  ，这些潜在信号通过伸缩并叠加可以恢复成观察数据。这些信号是完全', 'time': '2017-02-18T08:44'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '伸缩和叠加', 'origin_text': '子的方法，旨在将观察到的信号分离成许多潜在信号，这些潜在信号通过  !!!伸缩并叠加!!!  可以恢复成观察数据。这些信号是完全独立的，而不是仅仅彼此不相关', 'time': '2017-02-18T08:44'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '它的目的并非', 'origin_text': ')，我们可以尽可能恢复接近独立的潜在因子。这是一种常用的方法，  !!!它并不是!!!  用来捕捉高级别的抽象因果因子，而是恢复已经混合在一起的低级别信号', 'time': '2017-02-18T08:48'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '去掉“每个”', 'origin_text': '混合在一起的低级别信号。在该设置中，每个训练样本对应一个时刻，  !!!每个!!!  xixix_i是一个传感器对混合信号的观察值，并且每个hihih', 'time': '2017-02-18T08:50'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '传感器', 'origin_text': '号。在该设置中，每个训练样本对应一个时刻，每个xixix_i是  !!!一个传感器!!!  对混合信号的观察值，并且每个hihih_i是单个原始信号的一个估', 'time': '2017-02-18T08:50'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '去掉“并且每个”', 'origin_text': '对应一个时刻，每个xixix_i是一个传感器对混合信号的观察值，  !!!并且每个!!!  hihih_i是单个原始信号的一个估计。例如，我们可能有nnn', 'time': '2017-02-18T08:51'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '估计', 'origin_text': '传感器对混合信号的观察值，并且每个hihih_i是单个原始信号的  !!!一个估计!!!  。例如，我们可能有nnn个人同时说话。 如果我们具有放置在不', 'time': '2017-02-18T08:54'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '如果我们在不同位置放置n个不同的麦克风', 'origin_text': '个原始信号的一个估计。例如，我们可能有nnn个人同时说话。   !!!如果我们具有放置在不同位置的nnn个不同的麦克风!!!  ，则ICA可以检测每个麦克风的音量变化，并且分离信号，使得每个h', 'time': '2017-02-18T08:57'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '放置在受试者头部的多个电极传感器', 'origin_text': '通常用于脑电图的神经科学，一种用于记录源自大脑的电信号的技术。  !!!放置在对象的头部上的许多电极传感器!!!  用于测量来自身体的许多电信号。实验者通常仅对来自大脑的信号感兴', 'time': '2017-02-18T09:01'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '多种电信号', 'origin_text': '号的技术。放置在对象的头部上的许多电极传感器用于测量来自身体的  !!!许多电信号!!!  。实验者通常仅对来自大脑的信号感兴趣，但是来自受试者的心脏和眼', 'time': '2017-02-18T09:01'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '心脏', 'origin_text': '许多电信号。实验者通常仅对来自大脑的信号感兴趣，但是来自受试者  !!!的心脏!!!  和眼睛的信号强到足以混淆在受试者的头皮处进行的测量。信号到达电', 'time': '2017-02-18T09:02'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '其', 'origin_text': '自大脑的信号感兴趣，但是来自受试者的心脏和眼睛的信号强到足以混淆  !!!在受试者的!!!  头皮处进行的测量。信号到达电极，并且混合在一起，因此为了分离源', 'time': '2017-02-18T09:02'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '的测量结果', 'origin_text': '趣，但是来自受试者的心脏和眼睛的信号强到足以混淆在受试者的头皮处  !!!进行的测量!!!  。信号到达电极，并且混合在一起，因此为了分离源于心脏与源于大脑', 'time': '2017-02-18T09:03'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '正交矩阵', 'origin_text': '昂贵且数值不稳定的操作。ICA的一些变种通过将WW\\\\MW约束为  !!!正交!!!  来避免这个有问题的操作。ICA的所有变种要求p(h)p(h', 'time': '2017-02-18T09:06'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '该', 'origin_text': '不稳定的操作。ICA的一些变种通过将WW\\\\MW约束为正交来避免  !!!这个有问题的!!!  操作。ICA的所有变种要求p(h)p(h)p(\\\\Vh)是非', 'time': '2017-02-18T09:06'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '均要求', 'origin_text': 'W\\\\MW约束为正交来避免这个有问题的操作。ICA的所有变种  !!!要求!!!  p(h)p(h)p(\\\\Vh)是非高斯的。这是因为如果p(h)p', 'time': '2017-02-18T09:10'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '“定义”后加逗号', 'origin_text': '分析经常在学习稀疏特征时使用。按照我们对生成模型这个术语的  !!!定义!!!  ICA的许多变种不是生成模型。在本书中，生成模型可以直接表示p', 'time': '2017-02-18T09:13'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '没有', 'origin_text': '。ICA的许多变种仅知道如何在xx\\\\Vx和hh\\\\Vh之间变换，  !!!但没有!!!  任何表示p(h)p(h)p(\\\\Vh)的方式，因此也无法确定p(x', 'time': '2017-02-18T09:14'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '这就是', 'origin_text': '这是在没有显式表示p(h)p(h)p(\\\\Vh)的情况下完成的。  !!!这是!!!  为什么ICA更多用作分离信号的分析工具，而不是用于生成数据或估计', 'time': '2017-02-18T09:15'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '多被用作分离信号的分析', 'origin_text': '示p(h)p(h)p(\\\\Vh)的情况下完成的。这是为什么ICA  !!!更多用作分离信号的分析工具!!!  ，而不是用于生成数据或估计其密度。正如PCA可以推广到\\\\c', 'time': '2017-02-18T09:18'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '也可以', 'origin_text': '正如PCA可以推广到\\\\chap?中描述的非线性自编码器，ICA  !!!可以!!!  推广到非线性生成模型，其中我们使用非线性函数fff来生成观测数据', 'time': '2017-02-18T09:18'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '首先', 'origin_text': '（编码器）完美逆作用的解码器相关联，所以可以直接从模型生成样本（  !!!通过首先!!!  从p(h)p(h)p(\\\\Vh)采样，然后使用解码器）。IC', 'time': '2017-02-18T09:23'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '鼓励组内依赖关系、抑制组间依赖关系', 'origin_text': '(\\\\Vh)采样，然后使用解码器）。ICA的另一个推广是通过  !!!在组内鼓励统计依赖关系在组之间抑制依赖关系来!!!  学习特征组。当相关单元的组被选为不重叠时，这被称为独立子空间分', 'time': '2017-02-18T09:25'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '这种方法应用于自然图像时，可以', 'origin_text': '元组形成一定程度的重叠。这能够鼓励相邻的单元学习类似的特征。  !!!当应用于自然图像时，这种地质ICA方法!!!  学习Gabor滤波器，从而使得相邻特征具有相似的定向、位置或频率', 'time': '2017-02-18T09:28'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '不同', 'origin_text': '有相似的定向、位置或频率。在每个区域内出现类似Gabor函数的  !!!许多不同!!!  相位存在抵消作用，使得在小区域上的池化产生了平移不变性。慢', 'time': '2017-02-18T09:28'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '学习', 'origin_text': '变性。慢特征分析慢特征分析是使用来自时间信号的信息  !!!来学习!!!  不变特征的线性因子模型~{cite?}。慢特征分析的想法源', 'time': '2017-02-18T09:38'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '不发生改变', 'origin_text': '为白色，并再次恢复成黑色。通过比较，指示斑马是否在图像中的特征  !!!将根本不改变!!!  ，并且描述斑马位置的特征将缓慢地改变。因此，我们可能希望正则化', 'time': '2017-02-18T09:40'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '将模型正则化', 'origin_text': '不改变，并且描述斑马位置的特征将缓慢地改变。因此，我们可能希望  !!!正则化我们的模型!!!  ，从而能够学习到那些随时间变化较为缓慢的特征。慢原则早于慢', 'time': '2017-02-18T09:40'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '可以向', 'origin_text': '于可以使用梯度下降训练的任何可微分模型。 为了引入慢原则，我们  !!!可以通过向!!!  代价函数添加以下项λ∑tL(f(x(t+1)),f(x(t))', 'time': '2017-02-18T09:41'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '均方误差', 'origin_text': '^{(t+1)})之间的距离的损失函数。LLL的一个常见选择是  !!!平均平方误差!!!  。慢特征分析是慢原则中一个特别高效的应用。由于它被应用于', 'time': '2017-02-18T09:43'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '并不', 'origin_text': '闭式解训练，所以它是高效的。像ICA的一些变体一样，SFA本身  !!!不是!!!  生成模型，只是在输入空间和特征空间之间定义了一个线性映射，但是没', 'time': '2017-02-18T09:47'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '变种', 'origin_text': '提取器，并且可以通过闭式解训练，所以它是高效的。像ICA的一些  !!!变体!!!  一样，SFA本身不是生成模型，只是在输入空间和特征空间之间定义了', 'time': '2017-02-18T09:47'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '但并不', 'origin_text': '身不是生成模型，只是在输入空间和特征空间之间定义了一个线性映射，  !!!但是没有!!!  定义特征空间的先验，因此输入空间中不存在p(x)p(x)p(\\\\V', 'time': '2017-02-18T09:49'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '来说', 'origin_text': '经元学到的特征有许多共同特性~{cite?}。因此从生物学角度  !!!上说!!!  SFA是一个合理的有依据的模型。SFA的一个主要优点是，即', 'time': '2017-02-18T10:02'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '这些潜在因子', 'origin_text': '）。已知潜在因子如何改变的情况下，我们能够通过理论分析解出表达  !!!这些因子!!!  的最佳函数。在实践中，基于模拟数据的实验上，使用深度SFA似乎', 'time': '2017-02-18T10:03'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '学习', 'origin_text': '，使得难以确定模型将学习到什么特征。深度SFA也已经被用于  !!!学习用在!!!  对象识别和姿态估计的特征~{cite?}。到目前为止，慢原则尚', 'time': '2017-02-18T10:04'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '仍', 'origin_text': '尚未成为任何最先进的技术应用的基础。究竟是什么因素限制了其性能  !!!也!!!  有待研究。我们推测，或许慢度先验是太过强势，并且，最好添加这样', 'time': '2017-02-18T10:09'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '太过强势', 'origin_text': '究竟是什么因素限制了其性能也有待研究。我们推测，或许慢度先验  !!!是太过强势!!!  ，并且，最好添加这样一个先验使得当前时间步到下一个时间步的预测更', 'time': '2017-02-18T10:10'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '严格来说', 'origin_text': '子模型，已作为一种无监督特征学习和特征提取机制得到了广泛研究。  !!!严格地说!!!  ，术语”稀疏编码”是指在该模型中推断hh\\\\Vh值的过程，而”稀疏', 'time': '2017-02-18T10:13'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '其他大多数', 'origin_text': '的过程，但是通常这两个概念都可以用术语”稀疏编码”描述。像  !!!大多数其他!!!  线性因子模型一样，它使用了线性的解码器加上噪音的方式获得一个xx', 'time': '2017-02-18T10:14'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '包括', 'origin_text': '择一个峰值很尖锐且接近000的分布~{cite?}。常见的选择  !!!包括了!!!  可分解的Laplace，Cauchy或者可分解的Student-', 'time': '2017-02-18T10:14'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '在此', 'origin_text': '中，我们将ββ\\\\beta视为超参数。通常将其设置为111，因为  !!!其在此!!!  优化问题中λλ\\\\lambda的作用类似，没有必要使用两个超参数。', 'time': '2017-02-18T10:20'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '去掉“时”', 'origin_text': '差，而不是编码器中的泛化误差。当稀疏编码用作分类器的特征提取器  !!!时!!!  ，而不是使用参数化的函数来预测编码值时，基于优化的稀疏编码模型的', 'time': '2017-02-18T10:23'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '可得到', 'origin_text': '来预测编码值时，基于优化的稀疏编码模型的编码过程中较小的泛化误差  !!!可导致!!!  更好的泛化能力。{Coates2011b}证明了在对象识别任务', 'time': '2017-02-18T10:24'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '先通过', 'origin_text': '个缺点是它不直接通过非参数编码器进行反向传播，这使得我们很难采用  !!!先使用!!!  无监督方式预训练稀疏编码模型然后使用监督方式对其进行微调的方法。', 'time': '2017-02-18T10:26'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '后通过', 'origin_text': '行反向传播，这使得我们很难采用先使用无监督方式预训练稀疏编码模型  !!!然后使用!!!  监督方式对其进行微调的方法。允许近似导数的稀疏编码模型的修改版', 'time': '2017-02-18T10:26'}\n{'user': 'acct:Cherish@hypothes.is', 'text': '这种现象发生的原因', 'origin_text': '够很好地重构数据并为分类器提供有用的特征时，也会发生这种情况。  !!!这种现象原因!!!  是每个单独的特征可以很好地被学习到，但是隐含编码值的因子先验会导', 'time': '2017-02-18T10:27'}\n\n=============================   Replies   =============================\n\n"
  },
  {
    "path": "Chapter13/linear_factor_models.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Tianfan Fu\n\\chapter{\\glsentrytext{linear_factor}}\n\\label{chap:linear_factor_models}\n\n\n\n\n许多深度学习的研究前沿均涉及构建输入的概率模型$p_{\\text{model}}(\\Vx)$。\n原则上说，给定任何其他变量的情况下，这样的模型可以使用概率推断来预测其环境中的任何变量。\n许多这样的模型还具有\\gls{latent_variable} $\\Vh$，其中$p_{\\text{model}}(\\Vx) = \\SetE_{\\Vh}\\, p_{\\text{model}}(\\Vx\\mid\\Vh)$。\n这些\\gls{latent_variable}提供了表示数据的另一种方式。\n我们在\\gls{deep_feedforward_network}和\\gls{recurrent_network}中已经发现，基于\\gls{latent_variable}的分布式表示继承了\\gls{representation_learning}的所有优点。\n% 479\n\n\n在本章中，我们描述了一些基于\\gls{latent_variable}的最简单的概率模型：\\firstgls{linear_factor}。\n这些模型有时被用来作为混合模型的组成模块~\\citep{Hinton-nips95,ghahramani96em,Roweis+Saul+Hinton-2002}或者更大的深度概率模型~\\citep{tang2012deep}。\n同时，也介绍了构建\\gls{generative_model}所需的许多基本方法，在此基础上更先进的深度模型也将得到进一步扩展。\n% 479\n\n\n\\gls{linear_factor}通过随机线性\\gls{decoder}函数来定义，该函数通过对$\\Vh$的线性变换以及添加噪声来生成$\\Vx$。\n% 479\n\n\n有趣的是，通过这些模型我们能够发现一些符合简单联合分布的解释性因子。\n%这些模型很有趣，因为它们使得我们能够发现一些拥有简单联合分布的解释性因子。 \n线性\\gls{decoder}的简单性使得它们成为了最早被广泛研究的\\gls{latent_variable}模型。\n% 479\n\n\n\\gls{linear_factor}描述如下的数据生成过程。 \n首先，我们从一个分布中抽取解释性因子$\\Vh$\n\\begin{align}\n\\label{eqn:131}\n\\RVh \\sim p(\\Vh),\n\\end{align}\n其中$p(\\Vh)$是一个\\gls{factorial}分布，满足$p(\\Vh) = \\prod_{i}^{}p(h_i)$，所以易于从中采样。\n接下来，在给定因子的情况下，我们对实值的可观察变量进行采样\n\\begin{align}\n\\label{eqn:132}\n\\Vx = \\MW \\Vh + \\Vb + \\text{noise},\n\\end{align}\n其中噪声通常是对角化的（在维度上是独立的）且服从高斯分布。\n这在\\figref{fig:linear_factors}有具体说明。\n% 480\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter13/figures/linear_factors}}\n\\fi\n\\caption{描述\\gls{linear_factor}族的\\gls{directed_graphical_model}，其中我们假设观察到的数据向量$\\Vx$是通过独立的\\gls{latent}因子$\\Vh$的线性组合再加上一定噪声获得的。\n不同的模型，比如\\gls{PPCA}，\\gls{FA}或者是~\\glssymbol{ICA}，都是选择了不同形式的噪声以及先验$p(\\Vh)$。}\n\\label{fig:linear_factors}\n\\end{figure}\n\n\n\\section{\\glsentrytext{PPCA}和\\glsentrytext{FA}}\n\\label{sec:probabilistic_PCA_and_factor_analysis}\n% 480\n\n\\firstgls{PPCA}、\\gls{FA}和其他\\gls{linear_factor}是上述等式（\\eqnref{eqn:131}和\\eqnref{eqn:132}）的特殊情况，并且仅在对观测到$\\Vx$之前的噪声分布和\\gls{latent_variable} $\\Vh$先验的选择上有所不同。\n% 480\n\n在\\firstgls{FA}~\\citep{Bartholomew-1987,Basilevsky94}中，\\gls{latent_variable}的先验是一个方差为单位矩阵的\\gls{gaussian_distribution}\n\\begin{align}\n\\label{eqn:133}\n\\RVh \\sim \\CalN(\\Vh; \\mathbf{0},\\MI),\n\\end{align}\n同时，假定在给定$\\Vh$的条件下观察值$x_i$是\\firstgls{conditional_independent}的。\n具体来说，我们可以假设噪声是从对角协方差矩阵的高斯分布中抽出的，\\gls{covariance_matrix}为$\\Vpsi = \\text{diag}(\\Vsigma^2)$，其中$\\Vsigma^2 = [\\sigma_1^2,\\sigma_2^2,\\ldots,\\sigma_n^2]^{\\top}$表示一个向量，每个元素表示一个变量的方差。\n% 480\n\n\n因此，\\gls{latent_variable}的作用是\\emph{捕获}不同观测变量$x_i$之间的\\emph{依赖关系}。\n实际上，可以容易地看出$\\Vx$服从\\gls{multivariate_normal_distribution}，并满足\n\\begin{align}\n\\label{eqn:134}\n\\RVx \\sim \\CalN(\\Vx; \\Vb, \\MW\\MW^{\\top}+\\Vpsi).\n\\end{align}\n% 480 end\n\n\n\n% 481 head\n为了将~\\glssymbol{PCA}~引入到概率框架中，我们可以对\\gls{FA}模型作轻微修改，使条件方差$\\sigma_i^2$等于同一个值。\n在这种情况下，$\\Vx$的协方差简化为$\\MW\\MW^{\\top}+\\sigma^2\\MI$，这里的$\\sigma^2$是一个标量。\n由此可以得到条件分布，如下：\n\\begin{align}\n\\label{eqn:135}\n\\RVx \\sim \\CalN(\\Vx; \\Vb, \\MW\\MW^{\\top} + \\sigma^2\\MI ),\n\\end{align}\n或者等价地\n\\begin{align}\n\\label{eqn:136}\n\\RVx = \\MW\\RVh + \\Vb + \\sigma\\RVz,\n\\end{align}\n其中$\\RVz \\sim \\CalN(\\Vz;\\mathbf{0},\\MI)$是高斯噪声。\n之后~\\citet{Tipping99}提出了一种迭代的~\\glssymbol{EM}~算法来估计参数$\\MW$和$\\sigma^2$。\n% 481\n\n\n这个\\firstgls{PPCA}模型利用了这样一种观察现象：除了一些微小残余的\\firstgls{reconstruction_error}（至多为$\\sigma^2$），数据中的大多数变化可以由\\gls{latent_variable} $\\Vh$描述。\n通过\\citet{Tipping99}的研究我们可以发现，当$\\sigma \\xrightarrow{} 0$时，\\gls{PPCA}~退化为~\\glssymbol{PCA}。\n在这种情况下，给定$\\Vx$情况下$\\Vh$的条件期望等于将$\\Vx - \\Vb$投影到$\\MW$的$d$列所生成的空间上，与~\\glssymbol{PCA}~一样。\n% 481\n\n当$\\sigma\\xrightarrow{} 0$时， \\gls{PPCA}~所定义的密度函数在$d$维的$\\MW$的列生成空间周围非常尖锐。\n这导致模型会为没有在一个超平面附近聚集的数据分配非常低的概率。\n%如果某些数据实际上没有集中在超平面附近，这会导致模型为数据分配非常低的可能性。\n% 481\n%导致模型会为没有在一个超空间附近聚集的数据分配非常低的概率”\n\n\\section{\\glsentrytext{ICA}}\n\\label{sec:independent_component_analysis_ica}\n% 481\n\n\n\\firstall{ICA}是最古老的\\gls{representation_learning}算法之一~\\citep{Herault+Ans-1984,Jutten+Herault-91,Comon94,Hyvarinen-1999,Hyvarinen-2001,Hinton-ICA-2001,Teh-2003}。\n它是一种建模线性因子的方法，旨在将观察到的信号分离成许多潜在信号，这些潜在信号通过缩放和叠加可以恢复成观察数据。\n这些信号是完全独立的，而不是仅仅彼此不相关\\footnote{\\secref{sec:expectation_variance_and_covariance}讨论了不相关变量和独立变量之间的差异。}。\n% 481\n\n\n许多不同的具体方法被称为~\\glssymbol{ICA}。\n与我们本书中描述的其他\\gls{generative_model}最相似的~\\glssymbol{ICA}~变种~\\citep{Pham-et-al-1992}训练了完全参数化的\\gls{generative_model}。\n\\gls{latent}因子$\\Vh$的先验$p(\\Vh)$，必须由用户提前给出并固定。\n接着模型确定性地生成$\\Vx = \\MW \\Vh$。\n我们可以通过非线性变化（使用\\eqnref{eqn:3.47}）来确定$p(\\Vx)$。\n然后通过一般的方法比如最大化似然进行学习。\n% 482 head\n\n\n这种方法的动机是，通过选择一个独立的$p(\\Vh)$，我们可以尽可能恢复接近独立的潜在因子。\n这是一种常用的方法，它并不是用来捕捉高级别的抽象因果因子，而是恢复已经混合在一起的低级别信号。\n在该设置中，每个训练样本对应一个时刻，每个$x_i$是一个传感器对混合信号的观察值，并且每个$h_i$是单个原始信号的一个估计。\n例如，我们可能有$n$个人同时说话。 \n如果我们在不同位置放置$n$个不同的麦克风，则~\\glssymbol{ICA}~可以检测每个麦克风的音量变化，并且分离信号，使得每个$h_i$仅包含一个人清楚地说话。\n这通常用于脑电图的神经科学，这种技术可用于记录源自大脑的电信号。\n放置在受试者头部上的许多电极传感器用于测量来自身体的多种电信号。\n实验者通常仅对来自大脑的信号感兴趣，但是来自受试者心脏和眼睛的信号强到足以混淆在受试者头皮处的测量结果。\n信号到达电极，并且混合在一起，因此为了分离源于心脏与源于大脑的信号，并且将不同脑区域中的信号彼此分离，\\glssymbol{ICA}~是必要的。\n% 482 mid \n\n\n如前所述，\\glssymbol{ICA}~存在许多变种。\n一些版本在$\\Vx$的生成中添加一些噪声，而不是使用确定性的\\gls{decoder}。\n大多数方法不使用\\gls{maximum_likelihood}准则，而是旨在使$\\Vh = \\MW^{-1}\\Vx$的元素彼此独立。\n许多准则能够达成这个目标。\n\\eqnref{eqn:3.47}需要用到$\\MW$的行列式，这可能是代价很高且数值不稳定的操作。\n\\glssymbol{ICA}~的一些变种通过将$\\MW$约束为正交来避免这个有问题的操作。\n% 482 mid\n\n\n\\glssymbol{ICA}~的所有变种均要求$p(\\Vh)$是非高斯的。\n这是因为如果$p(\\Vh)$是具有高斯分量的独立先验，则$\\MW$是不可识别的。\n对于许多$\\MW$值，我们可以在$p(\\Vx)$上获得相同的分布。 \n这与其他\\gls{linear_factor}有很大的区别，例如\\gls{PPCA}~和\\gls{FA}通常要求$p(\\Vh)$是高斯的，以便使模型上的许多操作具有\\gls{closed_form_solution}。\n在用户明确指定分布的\\gls{maximum_likelihood}方法中，一个典型的选择是使用$p(h_i) = \\frac{d}{dh_i}\\sigma(h_i)$。\n这些非高斯分布的典型选择在$0$附近具有比高斯分布更高的峰值，因此我们也可以看到\\gls{ICA}经常用于学习稀疏特征。\n% 483 head\n\n\n\n\n按照我们对\\gls{generative_model}这个术语的定义，\\glssymbol{ICA}~的许多变种不是\\gls{generative_model}。\n在本书中，\\gls{generative_model}可以直接表示$p(\\Vx)$，也可以认为是从$p(\\Vx)$中抽取样本。\n\\glssymbol{ICA}~的许多变种仅知道如何在$\\Vx$和$\\Vh$之间变换，而没有任何表示$p(\\Vh)$的方式，因此也无法在$p(\\Vx)$上施加分布。\n例如，许多~\\glssymbol{ICA}~变量旨在增加$\\Vh = \\MW^{-1}\\Vx$的样本峰度，因为高峰度说明了$p(\\Vh)$是非高斯的，但这是在没有显式表示$p(\\Vh)$的情况下完成的。\n这就是为什么~\\glssymbol{ICA}~多被用作分离信号的分析工具，而不是用于生成数据或估计其密度。\n% 483 head\n\n\n正如~\\glssymbol{PCA}~可以推广到\\chapref{chap:autoencoders}中描述的非线性\\gls{AE}，\\glssymbol{ICA}~也可以推广到非线性\\gls{generative_model}，其中我们使用非线性函数$f$来生成观测数据。\n关于非线性~\\glssymbol{ICA}~最初的工作可以参考~\\citet{hyvarinen1999nonlinear}，它和\\gls{ensemble_learning}的成功结合可以参见~\\citet{roberts2001independent,lappalainen2000nonlinear}。\n\\glssymbol{ICA}~的另一个非线性扩展是\\firstall{NICE}方法~\\citep{Dinh-et-al-arxiv2014}，这个方法堆叠了一系列可逆变换（在\\gls{encoder}阶段），其特性是能高效地计算每个变换的~\\gls{jacobian}~行列式。\n这使得我们能够精确地计算似然，并且像~\\glssymbol{ICA}~一样，\\glssymbol{NICE}~尝试将数据变换到具有因子的边缘分布的空间。\n由于非线性\\gls{encoder}的使用，这种方法更可能成功。%\\footnote{译者注：相比于~\\glssymbol{ICA}}\n因为\\gls{encoder}和一个能进行完美逆变换的\\gls{decoder}相关联，所以可以直接从模型生成样本（首先从$p(\\Vh)$采样，然后使用\\gls{decoder}）。\n% 483\n\n\n\\glssymbol{ICA}~的另一个推广是通过鼓励组内统计依赖关系、抑制组间依赖关系来学习特征组\\citep{hyvarinen1999emergence,HyvarinenA2001}。\n当相关单元的组被选为不重叠时，这被称为\\firstgls{ISA}。\n我们还可以向每个\\gls{hidden_unit}分配空间坐标，并且空间上相邻的单元组形成一定程度的重叠。\n这能够鼓励相邻的单元学习类似的特征。\n当应用于自然图像时，这种\\firstgls{tICA}方法可以学习Gabor滤波器，从而使得相邻特征具有相似的方向、位置或频率。\n在每个区域内出现类似Gabor函数的许多不同相位存在抵消作用，使得在小区域上的\\gls{pooling}产生了平移不变性。\n% 483 end\n\n\n\\section{\\glsentrytext{SFA}}\n\\label{sec:slow_feature_analysis}\n% 484 head\n\n\n\\firstall{SFA}是使用来自时间信号的信息学习不变特征的\\gls{linear_factor}~\\citep{WisSej2002}。\n% 484\n\n\n\\gls{SFA}的想法源于所谓的\\firstgls{slow_principle}。\n其基本思想是，与场景中起描述作用的单个量度相比，场景的重要特性通常变化得非常缓慢。\n例如，在\\gls{CV}中，单个像素值可以非常快速地改变。\n如果斑马从左到右移动穿过图像并且它的条纹穿过对应的像素时，该像素将迅速从黑色变为白色，并再次恢复成黑色。\n通过比较，指示斑马是否在图像中的特征将不发生改变，并且描述斑马位置的特征将缓慢地改变。\n因此，我们可能希望将模型\\gls{regularize}，从而能够学习到那些随时间变化较为缓慢的特征。\n% 484\n\n\n\\gls{slow_principle}早于\\gls{SFA}，并已被应用于各种模型~\\citep{Hinton89b,Foldiak89,MobahiCollobertWestonICML2009,Bergstra+Bengio-2009}。\n一般来说，我们可以将\\gls{slow_principle}应用于可以使用\\gls{GD}训练的任何可微分模型。 \n为了引入\\gls{slow_principle}，我们可以向\\gls{cost_function}添加以下项\n\\begin{align}\n\\label{eqn:137}\n\\lambda \\sum_t L(f(\\Vx^{(t+1)}),f(\\Vx^{(t)})),\n\\end{align}\n其中$\\lambda$是确定慢度\\gls{regularization}强度的超参数项，$t$是样本时间序列的索引，$f$是需要\\gls{regularize}的\\gls{feature_extractor}，$L$是测量$f(\\Vx^{(t)})$和$f(\\Vx^{(t+1)})$之间的距离的\\gls{loss_function}。\n$L$的一个常见选择是\\gls{mean_squared_error}。\n% 484\n\n\n\\gls{SFA}是\\gls{slow_principle}中一个特别高效的应用。\n由于它被应用于线性\\gls{feature_extractor}，并且可以通过\\gls{closed_form_solution}训练，所以它是高效的。\n像~\\glssymbol{ICA}~的一些变种一样，\\glssymbol{SFA}~本身并不是\\gls{generative_model}，只是在输入空间和特征空间之间定义了一个线性映射，但是没有定义特征空间的先验，因此没有在输入空间上施加分布$p(\\Vx)$。\n% 484\n\n\n\n\\glssymbol{SFA}~算法~\\citep{WisSej2002}先将$f(\\Vx;\\theta)$定义为线性变换，然后求解如下优化问题\n\\begin{align}\n\t\\label{eqn:138}\n\t\\min_{\\Vtheta} \\SetE_t  (f(\\Vx^{(t+1)})_i - f(\\Vx^{(t)})_i  )^2\n\\end{align}\n并且满足下面的约束：\n\\begin{align}\n\t\\label{eqn:139}\n\t\\SetE_t  f(\\Vx^{(t)})_i = 0 \n\\end{align}\n以及\n\\begin{align}\n\t\\label{eqn:1310}\n\t\\SetE_t [ f(\\Vx^{(t)})_i^2 ] =1. \n\\end{align} % 485\n学习特征具有零均值的约束对于使问题具有唯一解是必要的; \n否则我们可以向所有特征值添加一个常数，\n并获得具有相等慢度目标值的不同解。\n特征具有单位方差的约束对于防止所有特征趋近于$0$的病态解是必要的。\n与~\\glssymbol{PCA}~类似，\\glssymbol{SFA}~特征是有序的，其中学习第一特征是最慢的。\n要学习多个特征，我们还必须添加约束\n\\begin{align}\n\\label{eqn:1311}\n\\forall i<j,\\ \\  \\SetE_t [f(\\Vx^{(t)})_i  f(\\Vx^{(t)})_j] = 0.\n\\end{align}\n这要求学习的特征必须彼此线性去相关。 \n没有这个约束，所有学习到的特征将简单地捕获一个最慢的信号。\n可以想象使用其他机制，如最小化\\gls{reconstruction_error}，也可以迫使特征多样化。\n但是由于~\\glssymbol{SFA}~特征的线性，这种去相关机制只能得到一种简单的解。 \n\\glssymbol{SFA}~问题可以通过线性代数软件获得\\gls{closed_form_solution}。\n% 485\n\n\n\n在运行~\\glssymbol{SFA}~之前，\\glssymbol{SFA}~通常通过对$\\Vx$使用非线性的基扩充来学习非线性特征。\n例如，通常用$\\Vx$的二次基扩充来代替原来的$\\Vx$，得到一个包含所有$x_ix_j$的向量。\n由此，我们可以通过反复地学习一个线性~\\glssymbol{SFA}~\\gls{feature_extractor}，对其输出应用非线性基扩展，然后在该扩展之上学习另一个线性~\\glssymbol{SFA}~\\gls{feature_extractor}的方式来组合线性~\\glssymbol{SFA}~模块从而学习深度非线性慢\\gls{feature_extractor}。\n\n% 485\n\n\n当在自然场景视频的小块空间部分上训练时，使用二次基扩展的~\\glssymbol{SFA}~所学习到的特征与V1皮层中那些复杂细胞的特征有许多共同特性~\\citep{Berkes-Wiskott-2005}。\n当在计算机渲染的3D环境内随机运动的视频上训练时，深度~\\glssymbol{SFA}~模型能够学习的特征与大鼠脑中用于导航的神经元学到的特征有许多共同特性~\\citep{franzius2007slowness}。\n因此从生物学角度上来说~\\glssymbol{SFA}~是一个合理的有依据的模型。\n% 485\n\n\n\n\\glssymbol{SFA}~的一个主要优点是，即使在深度非线性条件下，它依然能够在理论上预测~\\glssymbol{SFA}~能够学习哪些特征。\n为了做出这样的理论预测，必须知道关于配置空间的环境动力（例如，在3D渲染环境中随机运动的例子中，理论分析是从相机位置、速度的概率分布中入手的）。\n已知潜在因子如何改变的情况下，我们能够通过理论分析解出表达这些因子的最佳函数。\n在实践中，基于模拟数据的实验上，使用深度~\\glssymbol{SFA}~似乎能够恢复理论预测的函数。\n相比之下，在其他学习算法中，\\gls{cost_function}高度依赖于特定像素值，使得难以确定模型将学习到什么特征。\n% 486\n\n\n深度~\\glssymbol{SFA}~也已经被用于学习用在\\gls{object_recognition}和姿态估计的特征~\\citep{Franzius2008}。\n到目前为止，\\gls{slow_principle}尚未成为任何最先进应用的基础。\n究竟是什么因素限制了其性能仍有待研究。\n我们推测，或许慢度先验太过强势，并且，最好添加这样一个先验使得当前\\gls{time_step}到下一个\\gls{time_step}的预测更加容易，而不是加一个先验使得特征近似为一个常数。\n对象的位置是一个有用的特征，无论对象的速度是高还是低。 \n但\\gls{slow_principle}鼓励模型忽略具有高速度的对象的位置。\n% 486\n\n\n\\section{\\glsentrytext{sparse_coding}}\n\\label{sec:sparse_coding}\n% 486\n\n\n\\firstgls{sparse_coding}~\\citep{Olshausen+Field-1996}是一个\\gls{linear_factor}，已作为一种\\gls{unsupervised}特征学习和特征提取机制得到了广泛研究。\n严格来说，术语``\\gls{sparse_coding}''是指在该模型中推断$\\Vh$值的过程，而``稀疏建模''是指设计和学习模型的过程，但是通常这两个概念都可以用术语``\\gls{sparse_coding}''描述。\n% 486\n\n像大多数其他\\gls{linear_factor}一样，它使用了线性的\\gls{decoder}加上噪声的方式获得一个$\\Vx$的重构，就像\\eqnref{eqn:132}描述的一样。\n更具体地说，\\gls{sparse_coding}模型通常假设线性因子有一个各向同性精度为$\\beta$的高斯噪声：\n\\begin{align}\n\\label{eqn:1312}\np(\\Vx\\mid \\Vh) = \\CalN\n(\\Vx;\\MW\\Vh + \\Vb ,\\frac{1}{\\beta}\\MI).\n\\end{align}\n% 486\n\n\n分布$p(\\Vh)$通常选取为一个峰值很尖锐且接近$0$的分布~\\citep{Olshausen+Field-1996}。\n常见的选择包括可分解的Laplace、Cauchy或者可分解的Student-t分布。\n例如，以稀疏惩罚系数$\\lambda$为参数的Laplace先验可以表示为\n\\begin{align}\n\\label{eqn:1313}\np(h_i) = \\text{Laplace}(h_i;0,\\frac{2}{\\lambda}) = \\frac{\\lambda}{4} \\text{e}^{ -\\frac{1}{2}\\lambda \\vert h_i\\vert},\n\\end{align}\n相应的，Student-t先验分布可以表示为\n\\begin{align}\n\\label{eqn:1314}\np(h_i)\\propto \\frac{1}{(1+\\frac{h_i^2}{\\nu})^{\\frac{\\nu+1}{2}}}.\n\\end{align}\n% 487 head\n\n使用\\gls{maximum_likelihood}的方法来训练\\gls{sparse_coding}模型是不可行的。\n相反，为了在给定编码的情况下更好地重构数据，训练过程在编码数据和训练\\gls{decoder}之间交替进行。\n稍后在\\secref{sec:map_inference_and_sparse_coding}中，这种方法将被进一步证明为是解决\\gls{maximum_likelihood}问题的一种通用的近似方法。\n% 487\n\n对于诸如~\\glssymbol{PCA}~的模型，我们已经看到使用了预测$\\Vh$的参数化的\\gls{encoder}函数，并且该函数仅包括乘以权重矩阵。\n\\gls{sparse_coding}中的\\gls{encoder}不是参数化的\\gls{encoder}。\n相反，\\gls{encoder}是一个优化算法，在这个优化问题中，我们寻找单个最可能的编码值：\n\\begin{align}\n\\label{eqn:1315}\n\\Vh^* = f(\\Vx) = \\underset{\\Vh}{\\arg\\max}\\  p(\\Vh\\mid\\Vx).\n\\end{align} % 487\n结合\\eqnref{eqn:1313}和\\eqnref{eqn:1312}，我们得到如下的优化问题：\n\\begin{align}\n\\label{eqn:1316}\n& \\underset{\\Vh}{\\arg\\max}\\  p(\\Vh\\mid\\Vx) \\\\\n= ~& \\underset{\\Vh}{\\arg\\max}\\ \\log  p(\\Vh\\mid\\Vx)\\\\\n= ~& \\underset{\\Vh}{\\arg\\min}\\ \\lambda \\Vert \\Vh\\Vert_1 + \\beta  \\Vert \\Vx - \\MW \\Vh\\Vert_2^2,\n\\end{align}\n其中，我们扔掉了与$\\Vh$无关的项，并除以一个正的缩放因子来简化表达。\n% 487\n\n由于在$\\Vh$上施加$L^1$范数，这个过程将产生稀疏的$\\Vh^*$（详见\\secref{sec:l1_regularization}）。\n% 487\n\n\n为了训练模型而不仅仅是进行推断，我们交替迭代关于$\\Vh$和$\\MW$的最小化过程。\n在本文中，我们将$\\beta$视为超参数。\n我们通常将其设置为$1$，因为它在此优化问题的作用与$\\lambda$类似，没有必要使用两个超参数。 \n原则上，我们还可以将$\\beta$作为模型的参数，并学习它。\n我们在这里已经放弃了一些不依赖于$\\Vh$但依赖于$\\beta$的项。\n要学习$\\beta$，必须包含这些项，否则$\\beta$将退化为$0$。\n% 487\n\n\n不是所有的\\gls{sparse_coding}方法都显式地构建了一个$p(\\Vh)$和一个$p(\\Vx\\mid\\Vh)$。 \n通常我们只是对学习一个带有激活值的特征的字典感兴趣，当特征是由这个推断过程提取时，这个激活值通常为$0$。\n% 487 end\n\n如果我们从Laplace先验中采样$\\Vh$，$\\Vh$的元素实际上为$0$是一个零概率事件。\n\\gls{generative_model}本身并不稀疏，只有\\gls{feature_extractor}是稀疏的。\n\\citet{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}描述了不同模型族中的近似推断，如\\gls{ss}\\gls{sparse_coding}模型，其中先验的样本通常包含许多真正的$0$。\n% 488 head\n\n与非参数\\gls{encoder}结合的\\gls{sparse_coding}方法原则上可以比任何特定的参数化\\gls{encoder}更好地最小化重构误差和对数先验的组合。\n另一个优点是\\gls{encoder}没有\\gls{generalization_error}。\n参数化的\\gls{encoder}必须泛化地学习如何将$\\Vx$映射到$\\Vh$。\n对于与训练数据差异很大的异常$\\Vx$，所学习的参数化\\gls{encoder}可能无法找到对应精确重构或稀疏的编码$\\Vh$。\n对于\\gls{sparse_coding}模型的绝大多数形式，推断问题是凸的，优化过程总能找到最优编码（除非出现退化的情况，例如重复的权重向量）。\n显然，稀疏和重构成本仍然可以在不熟悉的点上升，但这归因于\\gls{decoder}权重中的\\gls{generalization_error}，而不是\\gls{encoder}中的\\gls{generalization_error}。\n当\\gls{sparse_coding}用作分类器的\\gls{feature_extractor}，而不是使用参数化的函数来预测编码值时，基于优化的\\gls{sparse_coding}模型的编码过程中较小的\\gls{generalization_error}可以得到更好的\\gls{generalization}能力。\n\\citet{Coates2011b}证明了在\\gls{object_recognition}任务中\\gls{sparse_coding}特征比基于参数化的\\gls{encoder}（线性-\\gls{sigmoid}~\\gls{AE}）的特征拥有更好的泛化能力。\n受他们的工作启发，\\citet{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}表明一种\\gls{sparse_coding}的变体在标签极少（每类20个或更少标签）的情况中比相同情况下的其他\\gls{feature_extractor}拥有更好的\\gls{generalization}能力。\n% 488 \n\n\n\n非参数\\gls{encoder}的主要缺点是在给定$\\Vx$的情况下需要大量的时间来计算$\\Vh$，因为非参数方法需要运行迭代算法。\n在\\chapref{chap:autoencoders}中讲到的参数化\\gls{AE}方法仅使用固定数量的层，通常只有一层。\n另一个缺点是它不直接通过非参数\\gls{encoder}进行\\gls{back_propagate}，这使得我们很难采用先使用\\gls{unsupervised}方式\\gls{pretraining}\\gls{sparse_coding}模型然后使用\\gls{supervised}方式对其进行\\gls{fine_tuning}的方法。\n允许近似导数的\\gls{sparse_coding}模型的修改版本确实存在但未被广泛使用~\\citep{Bradley+Bagnell-2009-small}。\n% 488  end\n\n像其他\\gls{linear_factor}一样，\\gls{sparse_coding}经常产生糟糕的样本，如\\figref{fig:s3c_samples}所示。\n即使当模型能够很好地重构数据并为分类器提供有用的特征时，也会发生这种情况。\n这种现象发生的原因是每个单独的特征可以很好地被学习到，但是隐藏编码值的\\gls{factorial}先验会导致模型包括每个生成样本中所有特征的随机子集。\n这促使人们开发更深的模型，可以在其中最深的编码层施加一个非\\gls{factorial}分布， 与此同时也在开发一些复杂的浅度模型。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n    \\centerline{\\includegraphics[width=\\figwidth]{Chapter13/figures/s3c_samples}}\n\\fi\n\\caption{\\gls{ss}\\gls{sparse_coding}模型上在MNIST数据集训练的样例和权重。\n\\emph{(左)}这个模型中的样本和训练样本相差很大。\n第一眼看来，我们可能认为模型拟合得很差。\n\\emph{(右)}这个模型的权重向量已经学习到了如何表示笔迹，有时候还能写完整的数字。\n因此这个模型也学习到了有用的特征。\n问题在于特征的\\gls{factorial}先验会导致特征子集合随机的组合。\n一些这样的子集能够合成可识别的MNIST集上的数字。\n这也促进了拥有更强大\\gls{latent}编码分布的\\gls{generative_model}的发展。\n此图经~\\citet{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}允许转载。}\n\\label{fig:s3c_samples}\n\\end{figure}\n\n%这促进了更深层模型的发展，可以在最深层上施加non-factorial分布，以及开发更复杂的浅层模型。\n% 489 head\n\n\n\\section{\\glssymbol{PCA}的\\glsentrytext{manifold}解释}\n\\label{sec:manifold_interpretation_of_pca}\n% 489 au\n\n\n\\gls{linear_factor}，包括~\\glssymbol{PCA}~和\\gls{FA}，可以理解为学习一个\\gls{manifold}~\\citep{hinton97modelling}。\n我们可以将\\gls{PPCA}~定义为高概率的薄饼状区域，即一个\\gls{gaussian_distribution}，沿着某些轴非常窄，就像薄饼沿着其垂直轴非常平坦，但沿着其他轴是细长的，正如薄饼在其水平轴方向是很宽的一样。\n\\figref{fig:PPCA_pancake}解释了这种现象。\n\\glssymbol{PCA}~可以理解为将该薄饼与更高维空间中的线性\\gls{manifold}对准。\n这种解释不仅适用于传统~\\glssymbol{PCA}，而且适用于学习矩阵$\\MW$和$\\MV$的任何线性\\gls{AE}，其目的是使重构的$\\Vx$尽可能接近于原始的$\\Vx$。\n% 489 end\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter13/figures/PPCA_pancake_color}}\n\\fi\n\\caption{平坦的高斯能够描述一个低维\\gls{manifold}附近的概率密度。\n此图表示了``\\gls{manifold}平面''上``馅饼''的上半部分，并且这个平面穿过了馅饼的中心。\n正交于\\gls{manifold}方向（指向平面外的箭头方向）的方差非常小，可以被视作是``噪声''，其他方向（平面内的箭头）的方差则很大，对应了``信号''以及降维数据的坐标系统。}\n\\label{fig:PPCA_pancake}\n\\end{figure}\n\n\n\\gls{encoder}表示为\n\\begin{align}\n\\label{eqn:1319}\n\\Vh  = f(\\Vx) = \\MW^{\\top} (\\Vx - \\Vmu).\n\\end{align}% 490 head\n\\gls{encoder}计算$h$的低维表示。\n从\\gls{AE}的角度来看，\\gls{decoder}负责计算重构：\n\\begin{align}\n\\label{eqn:1320}\n\\hat{\\Vx} = g(\\Vh) = \\Vb + \\MV \\Vh.\n\\end{align}\n% 490\n\n\n能够最小化\\gls{reconstruction_error}\n\\begin{align}\n\\label{eqn:1321}\n\\SetE[\\Vert\\Vx - \\hat{\\Vx}\\Vert^2]\n\\end{align}\n的线性\\gls{encoder}和\\gls{decoder}的选择对应着$\\MV = \\MW$，${\\Vmu} = \\Vb = \\SetE[\\Vx]$， $\\MW$的列 形成一组标准正交基，这组基生成的子空间与\\gls{covariance}矩阵$\\MC$\n\\begin{align}\n\\label{eqn:1322}\n\\MC = \\SetE[(\\Vx - {\\Vmu})(\\Vx - {\\Vmu})^{\\top}]\n\\end{align}\n的主特征向量所生成的子空间相同。\n在~\\glssymbol{PCA}~中，$\\MW$的列是按照对应特征值（其全部是实数和非负数）幅度大小排序所对应的特征向量。\n% 490 end\n\n我们还可以发现$\\MC$的特征值$\\lambda_i$对应了$\\Vx$在特征向量$\\Vv^{(i)}$方向上的方差。\n如果$\\Vx\\in \\SetR^D$，$\\Vh\\in\\SetR^d$并且满足$d<D$，则（给定上述的${\\Vmu},\\Vb,\\MV,\\MW$的情况下）最佳的\\gls{reconstruction_error}是\n\\begin{align}\n\\label{eqn:1323}\n\\min \\SetE[\\Vert \\Vx - \\hat{\\Vx} \\Vert^2] = \\sum_{i=d+1}^{D}\\lambda_i.\n\\end{align}\n因此，如果\\gls{covariance_matrix}的秩为$d$，则特征值$\\lambda_{d+1}$到$\\lambda_{D}$都为$0$，并且\\gls{reconstruction_error}为$0$。\n% 491 head \n\n此外，我们还可以证明上述解可以通过在给定正交矩阵$\\MW$的情况下最大化$\\Vh$元素的方差而不是最小化\\gls{reconstruction_error}来获得。\n% 491 \n\n\n某种程度上说，\\gls{linear_factor}是最简单的\\gls{generative_model}和学习数据表示的最简单模型。\n许多模型如\\gls{linear_classifier}和\\gls{linear_regression}模型可以扩展到\\gls{deep_feedforward_network}，而这些\\gls{linear_factor}可以扩展到\\gls{AE}网络和深度概率模型，它们可以执行相同任务但具有更强大和更灵活的模型族。\n% 491   \n"
  },
  {
    "path": "Chapter14/README.md",
    "content": "#第十四章笔记\n"
  },
  {
    "path": "Chapter14/annotations.txt",
    "content": "{'user': 'acct:huangpingchun@hypothes.is', 'text': '原文\\nA regularized autoencoder can be nonlinear and\\novercomplete but still learn something useful about the data distribution even if\\nthe model capacity is great enough to learn a trivial identity function\\n\\n调整后：即使容量足够大的模型去学习一个无意义的恒等函数，非线性和过完备的正则化自编码器仍然能从数据分布中学习到一些有趣的结构，\\n\\n1：‘模型容量大到足够学习一个简单的复制功能’，让人容易理解为 这个‘简单的复制功能’需要模型足够大才能学习。\\n2：为啥 a trivial identity function 不翻译为‘无意义的恒等函数’而翻译为‘简单的复制功能’，从机理上说并不是copying（尽管作者大量使用copying task这种术语），更多是学习映射（恒等函数），直译过来感觉让人理解起来不是太精确。 后面‘有用的信息’的表达个人感觉也不够‘达意’，我想真正的表述应该类似”we can discover interesting structure about the data （见UFLDL Autoencoders and Sparsity 一节）应该能点出数据中的某种隐藏的结构。', 'origin_text': '些特性包括稀疏表示、表示的小导数、以及对噪声或输入缺失的鲁棒性。  !!!即使模型容量大到足够学习一个简单的复制功能，非线性且过完备的正则自动编码器仍然能学到一些与数据分布相关的有用信息!!!  。除了这里所描述的方法（正则化自动编码器最自然的解释），几乎', 'time': '2017-01-12T10:47'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '一个由函数h=f(x)表示的编码器', 'origin_text': 'hh\\\\Vh，可以产生编码表示输入。该网络可以看作由两部分组成：  !!!一个编码器函数h=f(x)!!!  h=f(x) \\\\Vh = f(\\\\Vx)和一个生成重构的解码器r=', 'time': '2017-01-13T12:37'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '如果一个自动编码器只是设定g(f(x))=x为目标而进行简单地学习，那么这个自动编码器就没什么特别的用处。', 'origin_text': ')r=g(h)\\\\Vr=g(\\\\Vh)。\\\\fig?展示了这种架构。  !!!如果一个自动编码器学会简单地设置g(f(x))=xg(f(x))=xg(f(\\\\Vx)) =\\\\Vx，那么这个自动编码器就不会特别有用。!!!  相反，自动编码器应该被设计成不能学会完美地复制。这通常需要强', 'time': '2017-01-12T11:20'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '与训练数据相似的输入', 'origin_text': '这通常需要强加一些约束，使自动编码器只能近似地复制，并只能复制  !!!类似训练数据的输入!!!  。这些约束强制模型划定输入数据不同方面的主次顺序，因此它往往能', 'time': '2017-01-12T11:15'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '自动编码器的思想成为神经网络发展史的一部分（？）', 'origin_text': '{decoder}}(\\\\Vx \\\\mid \\\\Vh)。数十年间，  !!!自动编码器的想法一直是神经网络历史景象的一部分~{cite?}!!!  。传统自动编码器被用于降维或特征学习。近年来，自动编码器与隐', 'time': '2017-01-12T11:34'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '生成式', 'origin_text': '习。近年来，自动编码器与隐变量模型理论的联系将自动编码器带到了  !!!生成!!!  建模的前沿，我们将在\\\\chap?看到更多细节。自动编码器可以被', 'time': '2017-01-12T11:36'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '揭示', 'origin_text': '理论的联系将自动编码器带到了生成建模的前沿，我们将在\\\\chap?  !!!看到!!!  更多细节。自动编码器可以被看作是前馈网络的一种特殊情况，并且可', 'time': '2017-01-12T11:37'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '一个特例', 'origin_text': '将在\\\\chap?看到更多细节。自动编码器可以被看作是前馈网络的  !!!一种特殊情况!!!  ，并且可以使用完全相同的技术进行训练，通常使用minibatch', 'time': '2017-01-12T11:38'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '通常情况下即基于误差反向传播算法的minibatch梯度下降法', 'origin_text': '作是前馈网络的一种特殊情况，并且可以使用完全相同的技术进行训练，  !!!通常使用minibatch梯度下降法（基于反向传播计算的梯度）!!!  。不像一般的前馈网络，自动编码器也可以使用再循环训练{cite', 'time': '2017-01-12T11:41'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '比较网络对于原始输入的激活值和重构结果的激活值', 'origin_text': '网络，自动编码器也可以使用再循环训练{cite?}，这是一种基于  !!!比较原始输入和重构输入激活!!!  的学习算法。相比反向传播算法，再循环算法从生物学上看似更有道理', 'time': '2017-01-12T11:49'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '对输入进行复制', 'origin_text': '但我们通常不关心解码器的输出。相反，我们希望通过训练自动编码器  !!!对输入进行复制的任务!!!  使hh\\\\Vh获得有用的特性。从自动编码器获得有用特征的一种方', 'time': '2017-01-12T11:56'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '对于g(f(x))和x的差异予以惩罚（？）', 'origin_text': '\\\\Vx)),\\\\end{align}其中LLL是一个损失函数，  !!!衡量g(f(x))g(f(x))g(f(\\\\Vx))与xx\\\\Vx的不相似性!!!  ，如均方误差。当解码器是线性的且LLL是均方误差，欠完备的自', 'time': '2017-01-12T11:59'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '自动编码器被训练复制输入的同时会学习到训练数据的主元子空间', 'origin_text': '完备的自动编码器会学习出与PCA相同生成子空间。在这种情况下，  !!!自动编码器学到了训练数据的主元子空间（执行复制任务的副效用）!!!  。因此拥有非线性编码函数fff和非线性解码器函数ggg的自动', 'time': '2017-01-12T12:08'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '过大', 'origin_text': '出更强大的PCA非线性推广。不幸的是，如果编码器和解码器被赋予  !!!太大!!!  的容量，自动编码器会执行复制任务而捕捉不到任何有关数据分布的有用', 'time': '2017-01-12T12:10'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '实际情况', 'origin_text': '以学习将这些整数索引映射回特定训练样本的值。这种特定情形不会在  !!!实践!!!  中发生，但它清楚地说明，如果自动编码器的容量太大，那训练来执行复', 'time': '2017-01-12T12:19'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '我们可以设想有这样一个自动编码器，它只有一维编码，但是它具有一个强大到可以利用每个编码i去表示每一个训练样本x(i)的非线性编码器，以及可以将这些整数索引映射回特定的训练样本数据的解码器（？）', 'origin_text': '执行复制任务而捕捉不到任何有关数据分布的有用信息。从理论上说，  !!!我们可以想象只有一维编码的自动编码器，但具有一个非常强大的非线性编码器，能够将每个训练数据x(i)x(i)\\\\Vx^{(i)}表示为编码\\xa0i\\xa0i~i。解码器可以学习将这些整数索引映射回特定训练样本的值。!!!  这种特定情形不会在实践中发生，但它清楚地说明，如果自动编码器的容', 'time': '2017-01-12T12:30'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'These models naturally learn high-capacity, overcomplete encodings of the input\\nand do not require regularization for these encodings to be useful.Their encodings\\nare naturally useful because the models were trained to approximately maximize\\nthe probability of the training data rather than to copy the input to the output.\\n\\n调整后：\\n\\n“这些变种（或衍生）自编码器能够学习出高容量且过完备的模型，进而发现输入数据中有用的结构信息，并且也无需对数据做正则化。\\n相对于只学习简单恒等函数的自编码器而言，变种（衍生自编码器）产生的编码数据更有效，因为得到的模型是在训练数据集上学习的数据概率分布。”\\n\\n理由：\\n\\n    这段原文指代感觉比较不清晰，\\n    1：我觉得  capacity、overcomplete 是用来修饰模型的，在前文也是这样使用的，在这句突然用来修饰输入数据的编码 不是太合理。\\n    2：the models were trained to approximately maximize the probability of the training data 说说对这句的理解，感觉隐藏了很多信息。\\n      译文中“这些模型被训练为近似训练数据的最大概率......” 这句我的理解是 为求解问题构造的目标损失函数是一种概率函数，以最大化概率值为目标。\\n      而不是产生编码数据的方式是按照近似最大概率的原则产生，因为一旦学习结束，分布就已然得到（通过下文提到的概率分布代入求解），可以直接产生新编码样本点了。因为产生z_mean和z_log_sigma（见相关背景资料）这两个值都是统计量纲，不会有最大化概率这种动作。\\n\\n      相关背景：\\n\\n       VAE是个生成模型，三步：\\n        首先，建立编码网络，将输入映射为隐分布的参数\\n        然后从这些参数确定的分布中采样，这个样本相当于之前的隐层值\\n        最后，将采样得到的点映射回去重构原输入。\\n      由此可知变分编码器的工作原理：\\n        首先，编码器网络将输入样本x转换为隐空间的两个参数，记作z_mean和z_log_sigma。然后，我们随机从隐藏的正态分布中采样得到数据点z，\\n        这个隐藏分布我们假设就是产生输入数据的那个分布。z = z_mean + exp(z_log_sigma)*epsilon，epsilon是一个服从正态分布的张量。最后，\\n        使用解码器网络将隐空间映射到显空间，即将z转换回原来的输入数据空间。\\n        即：变分编码器不再学习一个恒等的函数，而是学习数据概率分布的一组参数。通过在这个概率分布中采样。\\n        隐空间参数由两个损失函数来训练，一个是重构损失函数，该函数要求解码出来的样本与输入的样本相似（与之前的自编码器相同），第二项损失函数\\n        是学习到的隐分布与先验分布的KL距离，作为一个正则。实际上把后面这项损失函数去掉也可以，它对学习符合要求的隐空间和防止过拟合有帮助。\\n\\n拓扑结构图：\\n\\n![](http://www.dengfanxin.cn/wp-content/uploads/2016/11/222.png)', 'origin_text': '，如变分自动编码器（\\\\sec?）和生成随机网络（\\\\sec?）。  !!!这些模型能自然地学习大容量、对输入过完备的有用编码，而不需要正则化。这些编码显然是有用的，因为这些模型被训练为近似训练数据的最大概率而不是将输入复制到输出。!!!  稀疏自动编码器稀疏自动编码器简单地在训练时结合编码层', 'time': '2017-01-13T11:07'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'we can think of the entire sparse autoencoder framework as approximating maximum likelihood training of a generative model that has latent variables. \\n\\n这句话是否可以帮助理解\\n\\nTheir encodings are naturally useful because the models were trained to approximately maximize the probability of the training data rather than to copy the input to the output.呢？\\n近似最大化概率（似然）是指的对隐变量训练，这个解析比较明确了。', 'origin_text': '验。我们仍可以认为这些正则项隐式地表达了对函数的偏好。  !!!我们可以认为整个稀疏自动编码器框架是对带有隐变量的生成模型的近似最大似然训练!!!  ，而不将稀疏惩罚视为复制任务的正则化。假如我们有一个带有可见变', 'time': '2017-01-16T03:52'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '不太通顺\\n\\nhis means\\nthat an autoencoder with a single hidden layer is able to represent the identity\\nfunction along the domain of the data arbitrarily well.\\n\\n这意味着具有单隐层的自编码器在数据域内能逼近任意恒等函数。', 'origin_text': '度近似任意函数（在很大范围里），这是非平凡深度的一个主要优点。  !!!这意味着单层隐藏层的自动编码器在数据范围能表示任意接近数据的恒等函数。!!!  但是，从输入到编码的映射是浅层的。这意味这我们不能任意添加约', 'time': '2017-01-16T10:23'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'non-trivial depth 我想直译较为生硬，不是太好理解\\n此句调整为 “这是有一定深度的网络其最主要的优点”', 'origin_text': '元足够多的前馈神经网络能以任意精度近似任意函数（在很大范围里），  !!!这是非平凡深度的一个主要优点!!!  。这意味着单层隐藏层的自动编码器在数据范围能表示任意接近数据的', 'time': '2017-01-17T08:49'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '缺少一个右括号', 'origin_text': '能学到有用信息的自动编码器。传统的自动编码器最小化以下目标  !!!L(x,g(f(x)),!!!  L(x,g(f(x)),\\\\begin{align}L(\\\\Vx,', 'time': '2017-01-17T01:57'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '缺少一个右括号', 'origin_text': 'irc  f学成一个恒等函数。相反，去噪自动编码器最小化   !!!L(x,g(f(x~)),!!!  L(x,g(f(x~)),\\\\begin{align}L(\\\\Vx', 'time': '2017-01-17T01:57'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '第一项损失函数缺少一个右括号', 'origin_text': '的策略是使用一个类似稀疏自动编码器中的惩罚项ΩΩ\\\\Omega，  !!!L(x,g(f(x))+Ω(h,x),L(x,g(f(x))+Ω(h,x),!!!  \\\\begin{align}L(\\\\Vx, g(f(\\\\Vx)) +', 'time': '2017-01-17T01:58'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '历史展望', 'origin_text': '成模型，并从该分布中进行采样。这将在\\\\sec?中讨论。  !!!历史观点!!!  采用MLP去噪的想法可以追溯到{Lecun-these87}', 'time': '2017-01-17T07:57'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': ' a deep autoencoderwith gradually smaller hidden layers\\n一个隐含层逐渐减小的深度自动编码器\\n(仍觉得逐渐减小翻译不太好，可否增加一些词语改为“一个隐含层中神经元个数逐渐减少的深度自动编码器”)', 'origin_text': 'ence2006}训练了一个堆叠RBM，然后利用它们的权重初始化  !!!一个深度自动编码器并逐渐变小隐藏层!!!  ，在30个单元的瓶颈处达到极值。生成的编码比30维的PCA产生', 'time': '2017-01-17T10:40'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': ' culminating in a bottleneck of 30 units\\n终结于30个单元的瓶颈（原文中感觉没有写到“极值”）', 'origin_text': 'M，然后利用它们的权重初始化一个深度自动编码器并逐渐变小隐藏层，  !!!在30个单元的瓶颈处达到极值!!!  。生成的编码比30维的PCA产生更少的重构误差，所学到的表示更', 'time': '2017-01-17T10:45'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'Many forms of dimensionality reduction place semantically related examples near each other\\n许多降维的形式会将语义上相关的样本彼此置于相近的位置。', 'origin_text': '和{Torralba+Fergus+Weiss-2008}观察，  !!!降维的许多形式是跟彼此邻近的样本语义相关的!!!  。映射到低维空间能帮助泛化提示了这个想法。从降维中比普通任', 'time': '2017-01-17T10:53'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'The hints provided by the mapping to the lower-dimensional space aid generalization.映射到低维空间所提供的线索有助于泛化。', 'origin_text': 's-2008}观察，降维的许多形式是跟彼此邻近的样本语义相关的。  !!!映射到低维空间能帮助泛化提示了这个想法!!!  。从降维中比普通任务受益更多的是信息检索，即在数据库中查询类', 'time': '2017-01-17T10:57'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'compute the learned features已经习得的特征（原译处可能会产生歧义）', 'origin_text': '码器 [Math Processing Error]ff用于计算  !!!学习好的特征!!!  。相比通过梯度下降推断[Math Processing Err', 'time': '2017-01-18T11:10'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '不应该将自编码器设计成输入到输出完全相等', 'origin_text': '(\\\\Vx)) =\\\\Vx，那么这个自编码器就不会特别有用。相反，  !!!自编码器应该被设计成不能学会完美地复制!!!  。这通常需要强加一些约束，使自编码器只能近似地复制，并只能复制', 'time': '2017-01-19T07:22'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '加一些约束，让它只能近似的复制', 'origin_text': '不会特别有用。相反，自编码器应该被设计成不能学会完美地复制。  !!!这通常需要强加一些约束，使自编码器只能近似地复制!!!  ，并只能复制类似训练数据的输入。这些约束强制模型划定输入数据不', 'time': '2017-01-19T07:23'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '限制', 'origin_text': '自编码器只能近似地复制，并只能复制类似训练数据的输入。这些约束  !!!强制!!!  模型划定输入数据不同方面的主次顺序，因此它往往能学习到数据的有用', 'time': '2017-01-19T07:26'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '将输入数据按照不同方面划定主次顺序', 'origin_text': '只能近似地复制，并只能复制类似训练数据的输入。这些约束强制模型  !!!划定输入数据不同方面的主次顺序!!!  ，因此它往往能学习到数据的有用特性。现代自编码器将编码器和解', 'time': '2017-01-19T07:27'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '概念推而广之', 'origin_text': '它往往能学习到数据的有用特性。现代自编码器将编码器和解码器的  !!!思想推广!!!  ，将其中的确定函数推广为随机映射pencoder(h∣x)pen', 'time': '2017-01-19T07:29'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '联结', 'origin_text': '编码器被用于降维或特征学习。近年来，自编码器与隐变量模型理论的  !!!联系!!!  将自编码器带到了生成建模的前沿，我们将在\\\\chap?看到更多细节', 'time': '2017-01-20T02:19'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '其', 'origin_text': '被用于降维或特征学习。近年来，自编码器与隐变量模型理论的联系将  !!!自编码器!!!  带到了生成建模的前沿，我们将在\\\\chap?看到更多细节。自编码', 'time': '2017-01-20T02:18'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '不同于', 'origin_text': '常使用minibatch梯度下降法（基于反向传播计算的梯度）。  !!!不像!!!  一般的前馈网络，自编码器也可以使用再循环训练{cite?}，这是', 'time': '2017-01-19T07:32'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '再循环算法更具生物学意义，不过较少引入到机器学习领域。', 'origin_text': '种基于比较原始输入和重构输入激活的学习算法。相比反向传播算法，  !!!再循环算法从生物学上看似更有道理，但很少用于机器学习。!!!  \\\\begin{figure}[!htb]\\\\ifOpenSou', 'time': '2017-01-19T07:34'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '类似的', 'origin_text': '码器是线性的且LLL是均方误差，欠完备的自编码器会学习出与PCA  !!!相同!!!  生成子空间。在这种情况下，自编码器学到了训练数据的主元子空间（', 'time': '2017-01-19T07:39'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '解码', 'origin_text': '执行复制任务的副效用）。因此拥有非线性编码函数fff和非线性  !!!解码器!!!  函数ggg的自编码器能够学习出更强大的PCA非线性推广。不幸的', 'time': '2017-01-19T07:40'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '我们已经知道', 'origin_text': '码维数小于输入维数的欠完备自编码器可以学习数据分布最显著的特征。  !!!我们已经看到!!!  ，如果这类自编码器被赋予过大的容量，它就不能学到任何有用的信息。', 'time': '2017-01-19T07:42'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '赋予的容量过大', 'origin_text': '可以学习数据分布最显著的特征。我们已经看到，如果这类自编码器被  !!!赋予过大的容量!!!  ，它就不能学到任何有用的信息。如果隐藏层编码的维数允许与输入', 'time': '2017-01-19T07:43'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '超完备', 'origin_text': '如果隐藏层编码的维数允许与输入相等，或隐藏层编码维数大于输入的  !!!过完备!!!  情况下，会发生类似的问题。在这些情况下，即使是线性编码器和线性', 'time': '2017-01-19T07:44'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '这样的能力', 'origin_text': '解码器容量，就可以成功训练任意架构的自编码器。正则自编码器提供  !!!这样做的可能!!!  。正则自编码器使用的损失函数可以鼓励模型学习其它特性（除了将输', 'time': '2017-01-19T07:50'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '不必', 'origin_text': '用的损失函数可以鼓励模型学习其它特性（除了将输入复制到输出），而  !!!不用!!!  限制使用浅层的编码器和解码器以及小的编码维数来限制模型的容量。', 'time': '2017-01-19T07:51'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '一般用来', 'origin_text': '=f(x)h=f(x)\\\\Vh = f(\\\\Vx)。稀疏自编码器  !!!通常用于!!!  学习特征，以便用于其他任务如分类。稀疏正则化的自编码器必须反映', 'time': '2017-01-19T07:56'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '以便用于像分类这样的任务', 'origin_text': 'x)\\\\Vh = f(\\\\Vx)。稀疏自编码器通常用于学习特征，  !!!以便用于其他任务如分类!!!  。稀疏正则化的自编码器必须反映训练数据集的独特统计特征，而不是', 'time': '2017-01-20T10:01'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '两句合并\\n“不像其它正则项如权重衰减——没有直观的贝叶斯解释。”', 'origin_text': '能地根据这些稀疏特征执行一些监督学习任务（根据监督学习的目标）。  !!!不像其它正则项如权重衰减，这个正则化没有直观的贝叶斯解释。!!!  如\\\\sec?描述，权重衰减和其他正则惩罚可以被解释为一个MAP', 'time': '2017-01-19T08:03'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '它', 'origin_text': '这个正则化没有直观的贝叶斯解释。如\\\\sec?描述，权重衰减和其  !!!他!!!  正则惩罚可以被解释为一个MAP近似贝叶斯推断，正则化的惩罚对应于', 'time': '2017-01-19T08:03'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '它虽不是一个先验', 'origin_text': '是因为正则项取决于数据，因此根据定义上（从文字的正式意义）来说，  !!!它不是一个先验!!!  。我们仍可以认为这些正则项隐式地表达了对函数的偏好。我', 'time': '2017-01-19T08:06'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '趋向', 'origin_text': '}的方式。该想法是使用整流线性单元产生编码层。基于将表示真正  !!!推向!!!  零（如绝对值惩罚）的先验，可以间接控制表示中零的平均数量。去', 'time': '2017-01-19T08:11'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '我们也可以通过改变重构误差项来得到一个能学到有用信息的自编码器', 'origin_text': '零的平均数量。去噪自编码器除了向代价函数增加一个惩罚项，  !!!我们也可以改变重构误差项得到一个能学到有用信息的自编码器!!!  。传统的自编码器最小化以下目标L(x,g(f(x))),L', 'time': '2017-01-19T08:12'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '差异', 'origin_text': '衡量g(f(x))g(f(x))g(f(\\\\Vx))与xx\\\\Vx的  !!!不相似性!!!  ，如它们不相似度的L2L2L^2范数。如果模型被赋予足够的容量', 'time': '2017-01-19T08:13'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '差异', 'origin_text': ')g(f(x))g(f(\\\\Vx))与xx\\\\Vx的不相似性，如它们  !!!不相似!!!  度的L2L2L^2范数。如果模型被赋予足够的容量，LLL仅仅鼓', 'time': '2017-01-19T08:13'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '过大', 'origin_text': '的不相似性，如它们不相似度的L2L2L^2范数。如果模型被赋予  !!!足够!!!  的容量，LLL仅仅鼓励g∘fg∘fg \\\\circ  f学成一个恒', 'time': '2017-01-19T08:14'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '使得', 'origin_text': '似度的L2L2L^2范数。如果模型被赋予足够的容量，LLL仅仅  !!!鼓励!!!  g∘fg∘fg \\\\circ  f学成一个恒等函数。相反，去噪', 'time': '2017-01-19T08:16'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '各自', 'origin_text': '同样适用于自编码器，因为它也属于前馈网络。此外，编码器和解码器  !!!自身!!!  都是一个前馈网络，因此这两个部分也能各自从深度中获得好处。通', 'time': '2017-01-19T08:24'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '深度结构', 'origin_text': '外，编码器和解码器自身都是一个前馈网络，因此这两个部分也能各自从  !!!深度!!!  中获得好处。通用近似定理, %万能逼近定理保证至少有一层隐含', 'time': '2017-01-19T08:25'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '深度自编码器至少要包含一层额外的隐藏层，在隐藏单元足够多的情况下能以任意精度近似任何从输入到编码的映射。', 'origin_text': '射是浅层的。这意味这我们不能任意添加约束，比如约束编码稀疏。  !!!编码器至少包含一层额外隐藏层的深度自编码器能够在给定足够多隐藏单元的情况，以任意精度近似任何从输入到编码的映射。!!!  深度可以指数地减少表示某些函数的计算成本。深度也能指数', 'time': '2017-01-19T08:52'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '如果x是实数，那么我们通常使用线性输出单元为高斯分布的均值设置相关参数', 'origin_text': 'text{decoder}}的形式而定。就传统的前馈网络来说，  !!!我们通常使用线性输出单元参数化高斯分布的均值（如果xx\\\\Vx是实的）!!!  。在这种情况下，负对数似然对应均方误差准则。类似地，二值xx', 'time': '2017-01-28T15:40'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '如果x满足Bernoulli分布，那么使用Sigmoid输出单元为相关参数赋值（意译了一下）', 'origin_text': '是实的）。在这种情况下，负对数似然对应均方误差准则。类似地，  !!!二值xx\\\\Vx对应参数由sigmoid单元确定的Bernoulli分布!!!  ，离散的xx\\\\Vx对应softmax分布等等。为了便于计算概率', 'time': '2017-01-28T14:38'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '，以此类推', 'origin_text': '的Bernoulli分布，离散的xx\\\\Vx对应softmax分布  !!!等等!!!  。为了便于计算概率分布，我们通常认为输出变量与给定hh\\\\Vh是', 'time': '2017-01-28T14:40'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'Typically, the output variables are treated as being conditionally independent given h\\n通常认为在给定h情况下的输出变量是条件独立的', 'origin_text': '的xx\\\\Vx对应softmax分布等等。为了便于计算概率分布，  !!!我们通常认为输出变量与给定hh\\\\Vh是条件独立的!!!  ，但一些技术（如混合密度输出）可以解决输出相关的建模。为', 'time': '2017-01-28T14:45'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'but some techniques such as mixture density outputs allow tractable modeling of outputs with correlations.但是一些模型，例如混合密度输出，可以解决输出变量之间具有相关性的问题。（意译，仍感觉不太准确）', 'origin_text': '计算概率分布，我们通常认为输出变量与给定hh\\\\Vh是条件独立的，  !!!但一些技术（如混合密度输出）可以解决输出相关的建模!!!  。为了更彻底地区别之前看到的前馈网络，我们也可以将\\\\te', 'time': '2017-01-28T14:50'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '与我们之前了解到的前馈网络相区别', 'origin_text': '术（如混合密度输出）可以解决输出相关的建模。为了更彻底地  !!!区别之前看到的前馈网络!!!  ，我们也可以将\\\\textbf{编码函数}(encoding fu', 'time': '2017-01-28T14:53'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'In general, the encoder and decoder distributions are not necessarily conditional distributions compatible with a unique joint distribution pmodel(x, h)\\n通常情况下，编码器和解码器的分布没必要是与唯一一个联合分布相兼容的条件分布。', 'origin_text': '(\\\\Vx\\\\mid\\\\Vh).\\\\end{align}一般情况下，  !!!编码器和解码器的分布没有必要与一个唯一的联合分布pmodel(x,h)pmodel(x,h)p_{\\\\text{model}}(\\\\Vx, \\\\Vh)的条件分布相容!!!  。{Alain-et-al-arxiv2015}指出将编码器和', 'time': '2017-01-28T15:05'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '在保证足够的容量和样本的情况下，将编码器和解码器作为去噪自编码器训练，能使它们渐近地相容（调整了一下语序）', 'origin_text': '件分布相容。{Alain-et-al-arxiv2015}指出  !!!将编码器和解码器作为去噪自编码器训练，能使它们渐近地相容（有足够的容量和样本）!!!  。去噪自编码器去噪自编码器是一类接受损坏数据作为输入，并', 'time': '2017-01-28T15:07'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'cushi', 'origin_text': '配{cite?}是最大似然的代替。它提供了概率分布的一致估计，  !!!鼓励!!!  模型在各个数据点xx\\\\Vx上获得与数据分布相同的得分。在这种情', 'time': '2017-01-28T15:57'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'Denoising training of a speciﬁc kind of autoencoder (sigmoidal hidden units,linear reconstruction units) using Gaussian noise and mean squared error as the reconstruction cost以高斯噪声和均方误差作为重构误差，对一种包含sigmoid隐含层，线性重构单元的特定自动编码器的去噪训练过程', 'origin_text': '法因子，即平均均方根重构误差。}\\\\end{figure}  !!!去噪地训练一类采用高斯噪声和均方误差作为重构误差的特定去噪自编码器（sigmoid隐藏单元， 线性重构单元）!!!  ，与训练一类特定的被称为RBM的无向概率模型是等价的{cite?', 'time': '2017-01-28T16:03'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '决定了在保持x处于流形上的同时，如何微弱地变动x', 'origin_text': '的局部方向的ddd维基向量给出。如\\\\fig?所示，这些局部方向  !!!说明了我们能如何微小地改变xx\\\\Vx而一直处于流形上!!!  。\\\\begin{figure}[!htb]\\\\ifOpenSo', 'time': '2017-01-29T02:21'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '这一点很关键', 'origin_text': '通过解码器近似地从$\\\\Vh$中恢复。$\\\\Vx$是从训练数据挑出的  !!!事实是关键的!!!  ，因为这意味着在自编码器不需要成功重构不属于数据生成分布下的输入', 'time': '2017-01-29T02:25'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '技巧（原文中一些techniques翻译成“技巧”，“手法”更通顺些）', 'origin_text': '自编码器容量的架构约束，也可以是加入到重构代价的一个正则项。这些  !!!技术!!!  一般倾向那些对输入较不敏感的解。\\\\end{enumerate}\\\\', 'time': '2017-01-29T02:30'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '驱使', 'origin_text': '同样忽略输入也是没用的。相反，两种推动力结合是有用的，因为它们  !!!迫使!!!  隐藏的表示能捕获有关数据分布结构的信息。重要的原则是，自编码器', 'time': '2017-01-29T02:34'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': ' by making the reconstruction function insensitive to perturbations of the input around the data points, we cause the autoencoder to recover the manifold structure我们可以通过构建对于数据点周围的输入扰动不敏感重构函数，使得自动编码器恢复流形结构', 'origin_text': '并且对流形正交方向的变化不敏感。\\\\fig?中一维的例子说明，  !!!为了使重构函数对数据点周围的扰动输入不敏感，我们可以让自编码器恢复流形的结构!!!  。\\\\begin{figure}[!htb]\\\\ifOpenSo', 'time': '2017-01-29T10:40'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': 'To understand why autoencoders are useful for manifold learning, it is instructive to compare them to other approaches为了理解自动编码器可用于流行学习的原因，可以将自动编码器和其他方法进行对比', 'origin_text': '形，重构函数必须具有大的导数。\\\\end{figure}  !!!对比其他方法是有用且受启发的，可以了解自编码器为什么对流形学习是有用的!!!  。学习表征流形最常见的是流形上（或附近）数据点的表示。对于特', 'time': '2017-01-29T10:46'}\n{'user': 'acct:Seaball0022@hypothes.is', 'text': '曲折（弯曲偏向于动词，此处需要名词）', 'origin_text': '于流形学习的根本困难：如果流形不是很光滑（它们有许多波峰、波谷和  !!!弯曲!!!  ），为覆盖其中的每一个变化，我们可能需要非常多的训练样本，导致没', 'time': '2017-01-29T11:40'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '指数级的降低', 'origin_text': '元的情况，以任意精度近似任何从输入到编码的映射。深度可以  !!!指数地减少!!!  表示某些函数的计算成本。深度也能指数地减少学习一些函数所需的训', 'time': '2017-02-06T04:01'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '深度特性也能帮助在训练一些函数时使所需要的数据量呈指数级降低。', 'origin_text': '编码的映射。深度可以指数地减少表示某些函数的计算成本。  !!!深度也能指数地减少学习一些函数所需的训练数据量!!!  。读者可以参考\\\\sec?巩固深度在前馈网络中的优势。实验中', 'time': '2017-02-06T04:07'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '本质上', 'origin_text': '我们也经常会遇到浅层自编码器。随机编码器和解码器自编码器  !!!仅仅!!!  是一个前馈网络，可以使用与传统前馈网络相同的损失函数和输出单元。', 'time': '2017-02-07T02:26'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '隐变量', 'origin_text': 'Vx\\\\mid \\\\Vh)$）。}\\\\end{figure}任何  !!!潜变量!!!  模型pmodel(h,x)pmodel(h,x)p_{\\\\text', 'time': '2017-02-07T02:30'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '去噪得分匹配算法', 'origin_text': 'xt{model}}(\\\\Vx; \\\\Vtheta)。当RBM使用  !!!去噪得分匹配!!!  ~{cite?}训练时，它的学习算法与训练对应的去噪自编码器是等', 'time': '2017-02-09T05:38'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '在RBM上应用得分匹配后', 'origin_text': '更详细地讨论去噪得分匹配。自编码器和RBM还存在其他联系。  !!!得分匹配应用于RBM后!!!  ，其代价函数将等价于重构误差结合类似CAE惩罚的正则项 {cit', 'time': '2017-02-09T05:40'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '无意义', 'origin_text': '机是允许使用容量非常大的编码器，同时防止在编码器和解码器学习一个  !!!毫无用处!!!  的恒等函数 。在引入现代DAE之前，{Inayoshi-an', 'time': '2017-02-09T05:57'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '探索了一些同样的方法和目标', 'origin_text': 'DAE之前，{Inayoshi-and-Kurita-2005}  !!!探讨了与一些相同的方法和相同的目标!!!  。他们在监督目标的情况下最小化重构误差 ，并在监督MLP的隐藏', 'time': '2017-02-09T06:18'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '他们的方法除了最小化重构误差这一监督目标项之外，还在隐藏层加入了噪音，目地是通过引入重构误差和注入噪音来改善泛化能力', 'origin_text': '-Kurita-2005}探讨了与一些相同的方法和相同的目标。  !!!他们在监督目标的情况下最小化重构误差 ，并在监督MLP的隐藏层注入噪声，通过引入重构误差和注入噪声提升泛化能力!!!  。然而，他们的方法基于线性编码器，因此无法学习到现代DAE能学', 'time': '2017-02-09T06:59'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'Like many other machine learning algorithms,autoencoders exploit the idea\\nthat data concentrates around a low-dimensional manifold or a small set of such\\nmanifolds,\\n如同其它的机器学习算法,自编码器也探索了集中在低维流形上的数据或者此类流形的小数据集上的想法', 'origin_text': '学习的强大函数族。使用自编码器学习流形如\\\\sec?描述，  !!!自编码器跟其他很多机器学习算法一样，也应用了将数据集中在一个低维流形或者一小组这样的流形的思想。!!!  其中一些机器学习算法仅能学习到在流形上表现良好但给定不在流形上', 'time': '2017-02-09T07:28'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '相比普通任务，信息检索从降维技术中获得的受益更多', 'origin_text': '的样本语义相关的。映射到低维空间能帮助泛化提示了这个想法。  !!!从降维中比普通任务受益更多的是信息检索!!!  ，即在数据库中查询类似条目的任务。此任务从降维获得类似其他任务', 'time': '2017-02-09T09:06'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '驱动力', 'origin_text': '降维是表示学习和深度学习的第一批应用之一。它是研究自编码器早期  !!!动机!!!  之一。例如， {Hinton-Science2006}训练了一', 'time': '2017-02-09T09:22'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'a stack of RBMs\\n\\n“栈式” RBM', 'origin_text': '一。例如， {Hinton-Science2006}训练了一个  !!!堆叠!!!  RBM，然后利用它们的权重初始化一个深度自编码器并逐渐变小隐藏层', 'time': '2017-02-09T09:23'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '此任务不仅和其他任务一样从降维技术中获取简单受益，更进一步地在某些低维空间中带来高效搜索性能。', 'origin_text': '普通任务受益更多的是信息检索，即在数据库中查询类似条目的任务。  !!!此任务从降维获得类似其他任务的一般益处，同时在某些种低维空间中的搜索变得极为高效!!!  。特别的，如果我们训练降维算法生成一个低维且\\\\emph{二值}', 'time': '2017-02-09T09:29'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '多个', 'origin_text': 'moid函数的幅度，直到饱和。学习哈希函数的思想已在其他  !!!数个!!!  方向进一步探讨，包括改变损失训练表示的想法，其中所需优化的损失与', 'time': '2017-02-09T09:42'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '相似', 'origin_text': '的数据库条目作为查询结果进行信息检索。我们也可以非常高效地搜索  !!!稍有不同!!!  条目，只需反转查询编码的各个位。这种通过降维和二值化的信息检索', 'time': '2017-02-09T09:46'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'DAE的机制是允许学习容量很高的编码器', 'origin_text': '与稀疏自编码器、稀疏编码、收缩自编码器等正则化的自编码器类似，  !!! DAE的动机是允许使用容量非常大的编码器!!!  ，同时防止在编码器和解码器学习一个毫无用处的恒等函数 。在引', 'time': '2017-02-09T09:50'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '生成的', 'origin_text': '概率分布。更一般的，我们可能希望使用自编码器作为生成模型，并从  !!!该!!!  分布中进行采样。这将在\\\\sec?中讨论。历史观点采', 'time': '2017-02-09T09:51'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:swordyork@hypothes.is', 'text': '多谢，这里我完全理解反了。', 'time': '2017-03-01T12:08'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这里exploit应该是利用的意思。', 'time': '2017-03-01T12:02'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'OK 了解', 'time': '2017-02-10T07:18'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这3处我得再仔细考虑一下，有点难讲清楚。', 'time': '2017-02-07T14:28'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '【其它】通“其他”（用于事物）。我们统一用其他。', 'time': '2017-02-07T14:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '原文使用encoder function，此处我把前面的编码函数改成编码器函数了。', 'time': '2017-02-07T13:53'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '此处是相同（完全一样），是一个东西。', 'time': '2017-02-07T13:46'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '你好！跟老师同学商量之后，latent一致翻译为潜（潜在的），hidden翻译成隐（隐藏的隐含的）。', 'time': '2017-02-07T10:58'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '确实全漏了，已经补全。多谢！', 'time': '2017-01-17T05:14'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '恩，可以帮助理解，将自动编码器视为生成模型，最大化似然就可以理解了。就像你之前提的，VAE学习数据分布，所以不会过拟合。我之后罗嗦一点讲清楚好了。', 'time': '2017-01-16T07:51'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '最大概率这个确实我不知道怎么体现进去，感觉没搞明白作者为啥做了这个表达在这个地方，本来我最初的想法是“因为模型是在训练数据集上通过求解出损失函数的一组参数（最大化理论概率分布），从而近似得到生成数据的概率分布”。看公式中只有最小化相对熵中需要最大化理论概率分布，而且也不是最大化概率。这块还得好好理解理解。', 'time': '2017-01-14T04:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '理由1很充分，我可能会改成\\n> 这些变种（或衍生）自编码器能够学习出高容量且过完备的模型，进而发现输入数据中有用的结构信息，并且也无需对模型进行正则化。\\n\\n第二句话还是感觉不太恰当，\\n> Their encodings are naturally useful because the models were trained to approximately maximize the probability of the training data rather than to copy the input to the output.\\n\\n译文肯定有问题，但改之后还是没有说明跟原文一样的原因（近似最大化概率），这里我得在好好理解理解。多谢！', 'time': '2017-01-13T14:47'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这里我把“a trivial identity function”意译为“简单的复制功能”，反倒直译是“平凡的恒等函数”。不过 “即使容量足够大的模型去学习一个无意义的恒等函数”这个翻译确实更合理。\\n因为数据分布是要从数据中学习出来的，我觉得翻成\\n“非线性和过完备的正则化自编码器仍然能从数据中学习到数据分布的一些有趣结构” 更好，多谢！', 'time': '2017-01-12T13:20'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'get!', 'time': '2017-01-12T13:12'}\n"
  },
  {
    "path": "Chapter14/autoencoders.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Shenjian Zhao\n\\chapter{\\glsentrytext{AE}}\n\\label{chap:autoencoders}\n\\firstgls{AE}是\\gls{NN}的一种，经过训练后能尝试将输入复制到输出。\n\\firstgls{AE}内部有一个\\gls{hidden_layer} $\\Vh$，可以产生\\firstgls{code}表示输入。\n该网络可以看作由两部分组成：一个由函数$ \\Vh = f(\\Vx)$表示的\\gls{encoder}和一个生成\\gls{reconstruction}的\\gls{decoder} $\\Vr=g(\\Vh)$。\n\\figref{fig:chap14_autoencoder}展示了这种架构。\n如果一个\\gls{AE}只是简单地学会将处处设置为$g(f(\\Vx)) =\\Vx$，那么这个\\gls{AE}就没什么特别的用处。\n相反，我们不应该将\\gls{AE}设计成输入到输出完全相等。\n这通常需要向\\gls{AE}强加一些约束，使它只能近似地复制，并只能复制与训练数据相似的输入。\n这些约束强制模型考虑输入数据的哪些部分需要被优先复制，因此它往往能学习到数据的有用特性。\n\n\n现代\\gls{AE}将\\gls{encoder}和\\gls{decoder}的概念推而广之，将其中的确定函数推广为随机映射$p_{\\text{encoder}} (\\Vh \\mid \\Vx)$和$p_{\\text{decoder}}(\\Vx \\mid \\Vh)$。\n\n\n数十年间，\\gls{AE}的想法一直是\\gls{NN}历史景象的一部分~\\citep{Lecun-these87,Bourlard88,hinton1994amd-small}。\n传统\\gls{AE}被用于\\gls{dimensionality_reduction}或特征学习。\n近年来，\\gls{AE}与\\gls{latent_variable}模型理论的联系将\\gls{AE}带到了生成式建模的前沿，我们将在\\chapref{chap:deep_generative_models}揭示更多细节。\n\\gls{AE}可以被看作是\\gls{feedforward_network}的一个特例，并且可以使用完全相同的技术进行训练，通常使用\\gls{minibatch}\\gls{GD}法（其中梯度基于\\gls{back_propagation}计算）。\n不同于一般的\\gls{feedforward_network}，\\gls{AE}也可以使用\\firstgls{recirculation}训练\\citep{Hinton+McClelland-NIPS1987}，这种学习算法基于比较原始输入的激活和\\gls{reconstruction}输入的激活。\n相比\\gls{back_propagation}算法，\\gls{recirculation}算法更具生物学意义，但很少用于\\gls{ML}应用。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/autoencoder}}\n\\fi\n\\caption{\\gls{AE}的一般结构，通过内部表示或\\gls{code} $\\Vh$将输入$\\Vx$映射到输出（称为\\gls{reconstruction}）$\\Vr$。\n\\gls{AE}具有两个组件：\\gls{encoder}~$f$（将$\\Vx$映射到$\\Vh$）和\\gls{decoder}~$g$（将$\\Vh$映射到$\\Vr$）。\n}\n\\label{fig:chap14_autoencoder}\n\\end{figure}\n\n% -- 493 --\n\n\\section{\\glsentrytext{undercomplete}\\glsentrytext{AE}}\n\\label{sec:undercomplete_autoencoders}\n将输入复制到输出听起来没什么用，但我们通常不关心\\gls{decoder}的输出。\n相反，我们希望通过训练\\gls{AE}对输入进行复制而使$\\Vh$获得有用的特性。\n\n\n从\\gls{AE}获得有用特征的一种方法是限制$\\Vh$的维度比$\\Vx$小，这种\\gls{code}维度小于输入维度的\\gls{AE}称为\\firstgls{undercomplete}\\gls{AE}。\n学习\\gls{undercomplete}的\\gls{representation}将强制\\gls{AE}捕捉训练数据中最显著的特征。\n\n\n学习过程可以简单地描述为最小化一个\\gls{loss_function} \n\\begin{align}\n    L(\\Vx, g(f(\\Vx))),\n\\end{align}\n其中$L$是一个\\gls{loss_function}，惩罚$g(f(\\Vx))$与$\\Vx$的差异，如\\gls{mean_squared_error}。\n\n\n当\\gls{decoder}是线性的且$L$是\\gls{mean_squared_error}，\\gls{undercomplete}的\\gls{AE}会学习出与~\\glssymbol{PCA}~相同的生成子空间。\n这种情况下，\\gls{AE}在训练来执行复制任务的同时学到了训练数据的主元子空间。\n\n\n因此，拥有非线性\\gls{encoder}函数$f$和非线性\\gls{decoder}函数$g$的\\gls{AE}能够学习出更强大的~\\glssymbol{PCA}~非线性推广。\n不幸的是，如果\\gls{encoder}和\\gls{decoder}被赋予过大的\\gls{capacity}，\\gls{AE}会执行复制任务而捕捉不到任何有关数据分布的有用信息。\n从理论上说，我们可以设想这样一个\\gls{AE}，它只有一维\\gls{code}，但它具有一个非常强大的非线性\\gls{encoder}，能够将每个训练数据$\\Vx^{(i)}$表示为\\gls{code}~$i$。\n而\\gls{decoder}可以学习将这些整数索引映射回特定训练样本的值。\n这种特定情形不会在实际情况中发生，但它清楚地说明，如果\\gls{AE}的\\gls{capacity}太大，那训练来执行复制任务的\\gls{AE}可能无法学习到数据集的任何有用信息。\n\n% -- 494 --\n\n\\section{正则\\glsentrytext{AE}}\n\\label{sec:regularized_autoencoders}\n\\gls{code}维数小于输入维数的\\gls{undercomplete}\\gls{AE}可以学习数据分布最显著的特征。\n我们已经知道，如果赋予这类\\gls{AE}过大的\\gls{capacity}，它就不能学到任何有用的信息。\n\n\n如果隐藏\\gls{code}的维数允许与输入相等，或隐藏\\gls{code}维数大于输入的\\firstgls{overcomplete}情况下，会发生类似的问题。\n在这些情况下，即使是线性\\gls{encoder}和线性\\gls{decoder}也可以学会将输入复制到输出，而学不到任何有关数据分布的有用信息。\n\n\n理想情况下，根据要建模的数据分布的复杂性，选择合适的\\gls{code}维数和\\gls{encoder}、\\gls{decoder}\\gls{capacity}，就可以成功训练任意架构的\\gls{AE}。\n正则\\gls{AE}提供这样的能力。\n正则\\gls{AE}使用的\\gls{loss_function}可以鼓励模型学习其他特性（除了将输入复制到输出），而不必限制使用浅层的\\gls{encoder}和\\gls{decoder}以及小的\\gls{code}维数来限制模型的\\gls{capacity}。\n这些特性包括\\gls{sparse}\\gls{representation}、\\gls{representation}的小导数、以及对噪声或输入缺失的鲁棒性。\n即使模型\\gls{capacity}大到足以学习一个无意义的恒等函数，非线性且\\gls{overcomplete}的正则\\gls{AE}仍然能够从数据中学到一些关于数据分布的有用信息。\n\n\n除了这里所描述的方法（\\gls{regularization}\\gls{AE}最自然的解释），几乎任何带有\\gls{latent_variable}并配有一个\\gls{inference}过程（计算给定输入的\\gls{latent}表示）的\\gls{generative_model}，都可以看作是\\gls{AE}的一种特殊形式。\n强调与\\gls{AE}联系的两个生成式建模方法是~\\gls{helmholtz_machine}~\\citep{Hinton95}的衍生模型，如\\gls{VAE}（\\secref{sec:variational_autoencoders}）和\\gls{GSN}（\\secref{sec:generative_stochastic_networks}）。\n这些变种（或衍生）\\gls{AE}能够学习出高\\gls{capacity}且\\gls{overcomplete}的模型，进而发现输入数据中有用的结构信息，并且也无需对模型进行\\gls{regularization}。\n这些\\gls{code}显然是有用的，因为这些模型被训练为近似训练数据的概率分布而不是将输入复制到输出。 % confusing\n\n% -- 495 --\n\n\\subsection{\\glsentrytext{sparse}\\glsentrytext{AE}}\n\\label{sec:sparse_autoencoders}\n\\gls{sparse}\\gls{AE}简单地在训练时结合\\gls{code}层的\\gls{sparse}惩罚$\\Omega(\\Vh)$和\\gls{reconstruction_error}：\n\\begin{align}\n    L(\\Vx, g(f(\\Vx))) + \\Omega(\\Vh),\n\\end{align}\n其中$g(\\Vh)$是\\gls{decoder}的输出，通常$\\Vh$是\\gls{encoder}的输出，即$\\Vh = f(\\Vx)$。\n\n\n\\gls{sparse}\\gls{AE}一般用来学习特征，以便用于像分类这样的任务。\n\\gls{sparse}\\gls{regularization}的\\gls{AE}必须反映训练数据集的独特统计特征，而不是简单地充当恒等函数。\n以这种方式训练，执行附带\\gls{sparse}惩罚的复制任务可以得到能学习有用特征的模型。\n\n\n我们可以简单地将惩罚项$\\Omega(\\Vh)$视为加到\\gls{feedforward_network}的正则项，这个\\gls{feedforward_network}的主要任务是将输入复制到输出（\\gls{unsupervised_learning}的目标），并尽可能地根据这些\\gls{sparse}特征执行一些\\gls{supervised_learning}任务（根据\\gls{supervised_learning}的目标）。\n不像其它正则项如\\gls{weight_decay}——没有直观的贝叶斯解释。\n如\\secref{sec:maximum_a_posteriori_map_estimation}描述，\\gls{weight_decay}和其他正则惩罚可以被解释为一个~\\glssymbol{MAP}~近似贝叶斯\\gls{inference}，\\gls{regularization}的惩罚对应于模型参数的先验概率分布。\n这种观点认为，\\gls{regularization}的最大似然对应最大化$p(\\Vtheta \\mid \\Vx)$， 相当于最大化$\\log p(\\Vx \\mid \\Vtheta) + \\log p(\\Vtheta)$。 $\\log p(\\Vx \\mid \\Vtheta)$即通常的数据似然项，参数的对数先验项$\\log p(\\Vtheta)$则包含了对$\\Vtheta$特定值的偏好。\n这种观点在\\secref{sec:bayesian_statistics}有所描述。\n正则\\gls{AE}不适用这样的解释是因为正则项取决于数据，因此根据定义上（从文字的正式意义）来说，它不是一个先验。\n虽然如此，我们仍可以认为这些正则项隐式地表达了对函数的偏好。\n\n% -- 496 --\n\n我们可以认为整个\\gls{sparse}\\gls{AE}框架是对带有\\gls{latent_variable}的\\gls{generative_model}的近似最大似然训练，而不将\\gls{sparse}惩罚视为复制任务的\\gls{regularization}。\n假如我们有一个带有可见变量$\\Vx$和\\gls{latent_variable} $\\Vh$的模型，且具有明确的联合分布$p_{\\text{model}}(\\Vx,\\Vh)=p_{\\text{model}}(\\Vh)p_{\\text{model}} (\\Vx \\mid \\Vh)$。\n我们将$p_{\\text{model}}(\\Vh)$视为模型关于\\gls{latent_variable}的先验分布，表示模型看到$\\Vx$的信念先验。\n这与我们之前使用``先验''的方式不同，之前指分布$p(\\Vtheta)$在我们看到数据前就对模型参数的先验进行编码。\n对数似然函数可分解为\n\\begin{align}\n\\log p_{\\text{model}}(\\Vx)=\\log \\sum_{\\Vh} p_{\\text{model}}(\\Vh, \\Vx) .\n\\end{align}\n我们可以认为\\gls{AE}使用一个高似然值$\\Vh$的点估计近似这个总和。\n这类似于\\gls{sparse_coding}\\gls{generative_model}（\\secref{sec:sparse_coding}），但$\\Vh$是参数\\gls{encoder}的输出，而不是从优化结果推断出的最可能的$\\Vh$。\n从这个角度看，我们根据这个选择的$\\Vh$，最大化如下\n\\begin{align}\n\\log p_{\\text{model}}(\\Vh, \\Vx)=\\log p_{\\text{model}}(\\Vh) + \\log p_{\\text{model}}(\\Vx \\mid \\Vh) .\n\\end{align}\n$\\log p_{\\text{model}}(\\Vh) $ 项能被\\gls{sparse}诱导。\n如\\ENNAME{Laplace}先验，\n\\begin{align}\np_{\\text{model}}(h_i) = \\frac{\\lambda}{2} e^{-\\lambda | h_i |},\n\\end{align}\n对应于绝对值\\gls{sparse}惩罚。\n将对数先验表示为绝对值惩罚，我们得到\n\\begin{align}\n\\Omega(\\Vh) &= \\lambda \\sum_{i} | h_i  |,\\\\ \n-\\log p_{\\text{model}}(\\Vh) &= \n\\sum_i (\\lambda | h_i | - \\log \\frac{\\lambda}{2}) = \\Omega(\\Vh) + \\text{const},\n\\end{align}\n这里的常数项只跟$\\lambda$有关。\n通常我们将$\\lambda$视为超参数，因此可以丢弃不影响参数学习的常数项。\n其他如~\\ENNAME{Student-t}~先验也能诱导\\gls{sparse}性。\n从\\gls{sparse}性导致$p_{\\text{model}}(\\Vh)$学习成近似最大似然的结果看，\\gls{sparse}惩罚完全不是一个正则项。\n这仅仅影响模型关于\\gls{latent_variable}的分布。\n这个观点提供了训练\\gls{AE}的另一个动机：这是近似训练\\gls{generative_model}的一种途径。\n这也给出了为什么\\gls{AE}学到的特征是有用的另一个解释：它们描述的\\gls{latent_variable}可以解释输入。\n\n% -- 497 --\n\n\\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)$时产生）之间的联系。\n这个想法是最小化$\\log Z$防止概率模型处处具有高概率，同理强制\\gls{sparse}可以防止\\gls{AE}处处具有低的\\gls{reconstruction_error} 。\n这种情况下，这种联系是对通用机制的直观理解而不是数学上的对应。\n在数学上更容易解释\\gls{sparse}惩罚对应于有向模型$p_{\\text{model}}(\\Vh)p_{\\text{model}}(\\Vx \\mid \\Vh) $中的$\\log p_{\\text{model}}(\\Vh)$。\n\n\n\\citet{Glorot+al-ICML-2011-small}提出了一种在\\gls{sparse}（和\\gls{denoising}）\\gls{AE}的$\\Vh$中实现\\emph{真正为零}的方式。\n该想法是使用\\gls{ReLU}产生\\gls{code}层。\n基于将\\gls{representation}真正推向零（如绝对值惩罚）的先验，可以间接控制\\gls{representation}中零的平均数量。\n\n\n\n\\subsection{\\glsentrytext{DAE}}\n\\label{sec:sub_denoising_autoencoders}\n除了向\\gls{cost_function}增加一个惩罚项，我们也可以通过改变\\gls{reconstruction_error}项来获得一个能学到有用信息的\\gls{AE}。\n\n\n传统的\\gls{AE}最小化以下目标\n\\begin{align}\n    L(\\Vx, g(f(\\Vx))),\n\\end{align}\n其中$L$是一个\\gls{loss_function}，惩罚$g(f(\\Vx))$与$\\Vx$的差异，如它们彼此差异的$L^2$范数。\n如果模型被赋予过大的\\gls{capacity}，$L$仅仅使得$g \\circ  f$学成一个恒等函数。\n\n\n相反，\\firstall{DAE}最小化 \n\\begin{align}\n    L(\\Vx, g(f(\\tilde \\Vx))),\n\\end{align}\n其中 $\\tilde \\Vx$是被某种噪声损坏的$\\Vx$的副本。\n因此\\gls{DAE}必须撤消这些损坏，而不是简单地复制输入。\n\n\\citet{Alain+Bengio-ICLR2013-small}和~\\citet{Bengio-et-al-NIPS2013-small}指出\\gls{denoising}训练过程强制$f$和$g$隐式地学习$p_{\\text{data}} (\\Vx)$的结构。\n因此\\gls{DAE}也是一个通过最小化\\gls{reconstruction_error}获取有用特性的例子。\n这也是将\\gls{overcomplete}、高\\gls{capacity}的模型用作\\gls{AE}的一个例子——只要小心防止这些模型仅仅学习一个恒等函数。\n\\gls{DAE}将在\\secref{sec:denoising_autoencoders}给出更多细节。\n\n% -- 498 --\n\n\\subsection{惩罚导数作为正则}\n\\label{sec:regularizing_by_penalizing_derivatives}\n另一正则化\\gls{AE}的策略是使用一个类似\\gls{sparse}\\gls{AE}中的惩罚项$\\Omega$，\n\\begin{align}\n    L(\\Vx, g(f(\\Vx))) + \\Omega(\\Vh, \\Vx),\n\\end{align}\n但$\\Omega$的形式不同：\n\\begin{align}\n\\Omega(\\Vh, \\Vx) = \\lambda \\sum_i \\| \\nabla_{\\Vx}h_i \\|^2.\n\\end{align}\n\n\n这迫使模型学习一个在$\\Vx$变化小时目标也没有太大变化的函数。\n因为这个惩罚只对训练数据适用，它迫使\\gls{AE}学习可以反映训练数据分布信息的特征。\n\n\n这样\\gls{regularization}的\\gls{AE}被称为\\firstall{CAE}。\n这种方法与\\gls{DAE}、\\gls{manifold_learning}和概率模型存在一定理论联系。\n\\gls{CAE}将在\\secref{sec:contractive_autoencoders}更详细地描述。\n\n\n\\section{表示能力、层的大小和深度}\n\\label{sec:representational_power_layer_size_and_depth}\n\\gls{AE}通常只有单层的\\gls{encoder}和\\gls{decoder}，但这不是必然的。\n实际上深度\\gls{encoder}和\\gls{decoder}能提供更多优势。\n\n\n回忆\\secref{sec:universal_approximation_properties_and_depth}，其中提到加深\\gls{feedforward_network}有很多优势。\n这些优势也同样适用于\\gls{AE}，因为它也属于\\gls{feedforward_network}。\n此外，\\gls{encoder}和\\gls{decoder}各自都是一个\\gls{feedforward_network}，因此这两个部分也能各自从深度结构中获得好处。\n\n\n\\gls{universal_approximation_theorem}保证至少有一层\\gls{hidden_layer}且\\gls{hidden_unit}足够多的\\gls{feedforward_neural_network}能以任意精度近似任意函数（在很大范围里），这是非平凡深度（至少有一层\\gls{hidden_layer}）的一个主要优点。\n这意味着具有单\\gls{hidden_layer}的\\gls{AE}在数据域内能表示任意近似数据的恒等函数。\n但是，从输入到\\gls{code}的映射是浅层的。\n这意味这我们不能任意添加约束，比如约束\\gls{code}\\gls{sparse}。\n深度\\gls{AE}（\\gls{encoder}至少包含一层额外\\gls{hidden_layer}）在给定足够多的\\gls{hidden_unit}的情况下，能以任意精度近似任何从输入到\\gls{code}的映射。\n\n% -- 499 --\n\n深度可以指数地降低表示某些函数的计算成本。\n深度也能指数地减少学习一些函数所需的训练数据量。\n读者可以参考\\secref{sec:universal_approximation_properties_and_depth}巩固深度在\\gls{feedforward_network}中的优势。\n\n\n实验中，深度\\gls{AE}能比相应的浅层或线性\\gls{AE}产生更好的压缩效率\\citep{Hinton-Science2006}。\n\n训练深度\\gls{AE}的普遍策略是训练一堆浅层的\\gls{AE}来贪心地预训练相应的深度架构。\n所以即使最终目标是训练深度\\gls{AE}，我们也经常会遇到浅层\\gls{AE}。\n\n\n\\section{随机\\glsentrytext{encoder}和\\glsentrytext{decoder}}\n\\label{sec:stochastic_encoders_and_decoders}\n\\gls{AE}本质上是一个\\gls{feedforward_network}，可以使用与传统\\gls{feedforward_network}相同的\\gls{loss_function}和输出单元。\n\n\n如\\secref{sec:other_output_types}中描述，设计\\gls{feedforward_network}的输出单元和\\gls{loss_function}普遍策略是定义一个输出分布$p(\\Vy \\mid \\Vx) $并最小化负对数似然$-\\log p(\\Vy \\mid \\Vx)$。\n在这种情况下，$\\Vy$是关于目标的向量（如类标）。\n\n\n在\\gls{AE}中，$\\Vx$既是输入也是目标。\n然而，我们仍然可以使用与之前相同的架构。\n给定一个隐藏\\gls{code} $\\Vh$，我们可以认为\\gls{decoder}提供了一个条件分布$p_{\\text{model}}(\\Vx \\mid \\Vh)$。\n接着我们根据最小化$-\\log p_{\\text{decoder}}(\\Vx \\mid \\Vh)$来训练\\gls{AE}。\n\\gls{loss_function}的具体形式视$p_{\\text{decoder}}$的形式而定。\n就传统的\\gls{feedforward_network}来说，如果$\\Vx$是实值的，那么我们通常使用线性输出单元参数化高斯分布的均值。\n在这种情况下，负对数似然对应\\gls{mean_squared_error}\\gls{criterion}。\n类似地，二值$\\Vx$对应于一个~\\gls{bernoulli_distribution}，其参数由~\\ENNAME{sigmoid}~输出单元确定的。\n而离散的$\\Vx$对应~\\ENNAME{softmax}~分布，以此类推。\n在给定$\\Vh$的情况下，为了便于计算概率分布，输出变量通常被视为是条件独立的，但一些技术（如混合密度输出）可以解决输出相关的建模。\n\n% -- 500 --\n\n为了更彻底地与我们之前了解到的\\gls{feedforward_network}相区别，我们也可以将\\textbf{编码函数}(encoding function)~$f(\\Vx)$的概念推广为\\textbf{编码分布}(encoding distribution)~$ p_{\\text{encoder}}(\\Vh \\mid \\Vx)$， 如\\figref{fig:chap14_stochastic-autoencoder}中所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/stochastic-autoencoder}}\n\\fi\n\\caption{随机\\gls{AE}的结构，其中\\gls{encoder}和\\gls{decoder}包括一些噪声注入，而不是简单的函数。\n这意味着可以将它们的输出视为来自分布的采样（对于\\gls{encoder}是$p_{\\text{encoder}}(\\Vh \\mid \\Vx)$，对于\\gls{decoder}是$p_{\\text{decoder}}(\\Vx\\mid \\Vh)$）。}\n\\label{fig:chap14_stochastic-autoencoder}\n\\end{figure}\n\n任何\\gls{latent_variable}模型$p_{\\text{model}}(\\Vh, \\Vx)$定义一个随机\\gls{encoder}\n\\begin{align}\np_{\\text{encoder}}(\\Vh \\mid \\Vx) = p_{\\text{model}}(\\Vh\\mid\\Vx)\n\\end{align}\n以及一个随机\\gls{decoder}\n\\begin{align}\np_{\\text{decoder}}(\\Vx \\mid \\Vh) = p_{\\text{model}}(\\Vx\\mid\\Vh).\n\\end{align}\n通常情况下，\\gls{encoder}和\\gls{decoder}的分布没有必要是与唯一一个联合分布$p_{\\text{model}}(\\Vx, \\Vh)$相容的条件分布。\n\\citet{Alain-et-al-arxiv2015}指出，在保证足够的\\gls{capacity}和样本的情况下，将\\gls{encoder}和\\gls{decoder}作为\\gls{DAE}训练，能使它们渐近地相容。\n\n\n\n\\section{\\glsentrytext{DAE}}\n\\label{sec:denoising_autoencoders}\n\\firstall{DAE}是一类接受损坏数据作为输入，并训练来预测原始未被损坏数据作为输出的\\gls{AE}。\n\n% -- 501 --\n\n\\glssymbol{DAE}~的训练过程如\\figref{fig:chap14_DAE}中所示。\n我们引入一个损坏过程$C(\\tilde{\\RVx} \\mid \\RVx)$，这个条件分布代表给定数据样本$\\RVx$产生损坏样本$\\tilde \\RVx$的概率。\n\\gls{AE}则根据以下过程，从训练数据对$(\\Vx, \\tilde \\Vx)$中学习\\textbf{重构分布}(reconstruction distribution)~$p_{\\text{reconstruct}} (\\RVx \\mid \\tilde \\RVx)$：\n\\begin{enumerate}\n\\item 从训练数据中采一个训练样本$\\Vx$。\n\\item 从$C(\\tilde{\\RVx} \\mid \\RVx=\\Vx)$采一个损坏样本$\\tilde \\Vx$。\n\\item 将$(\\Vx, \\tilde \\Vx)$作为训练样本来估计\\gls{AE}的\\gls{reconstruction}分布 \n$p_{\\text{reconstruct}} (\\Vx \\mid \\tilde \\Vx) = p_{\\text{decoder}}(\\Vx \\mid\\Vh)$，其中$\\Vh$是\\gls{encoder} $f(\\tilde \\Vx)$的输出，$p_{\\text{decoder}}$根据解码函数$g(\\Vh)$定义。\n\\end{enumerate}\n通常我们可以简单地对负对数似然$-\\log p_{\\text{decoder}} (\\Vx \\mid \\Vh)$进行基于梯度法（如\\gls{minibatch}\\gls{GD}）的近似最小化。\n只要\\gls{encoder}是确定性的，\\gls{DAE}就是一个\\gls{feedforward_network}，并且可以使用与其他\\gls{feedforward_network}完全相同的方式进行训练。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/DAE}}\n\\fi\n\\caption{\\gls{DAE}\\gls{cost_function}的计算图。\\gls{DAE}被训练为从损坏的版本$\\tilde \\Vx$~\\gls{reconstruction}干净数据点$\\Vx$。\n这可以通过最小化损失$L = - \\log p_{\\text{decoder}} (\\Vx \\mid \\Vh = f(\\tilde \\Vx))$实现，其中$\\tilde \\Vx$是样本$\\Vx$经过损坏过程$C (\\tilde \\Vx \\mid \\Vx)$后得到的损坏版本。\n通常， 分布$p_{\\text{decoder}}$是因子的分布（平均参数由前馈网络$g$给出）。\n}\n\\label{fig:chap14_DAE}\n\\end{figure}\n\n因此我们可以认为~\\glssymbol{DAE}~是在以下期望下进行\\gls{SGD}：\n\\begin{align}\n   - \\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})),\n\\end{align}\n其中$\\hat{p}_{\\text{data}}(\\Vx)$是训练数据的分布。\n\n% -- 502 --\n\n\\subsection{\\glsentrytext{score}估计}\n\\label{sec:estimating_the_score}\n\\gls{score_matching}~\\citep{Hyvarinen-2005}是最大似然的代替。\n它提供了概率分布的一致估计，促使模型在各个数据点$\\Vx$上获得与数据分布相同的\\firstgls{score}。\n在这种情况下，\\gls{score}是一个特定的梯度场：\n\\begin{align}\n \\nabla_{\\Vx} \\log p(\\Vx) .\n\\end{align}\n\n我们将在\\secref{sec:score_matching_and_ratio_matching}中更详细地讨论\\gls{score_matching}。\n对于现在讨论的\\gls{AE}，理解学习$\\log p_{\\text{data}}$的梯度场是学习$p_{\\text{data}}$结构的一种方式就足够了。\n\n\n\\glssymbol{DAE}~的训练\\gls{criterion}（条件高斯$p(\\Vx \\mid \\Vh)$）能让\\gls{AE}学到能估计数据分布得分的向量场$(g(f(\\Vx))-\\Vx)$ ，这是~\\glssymbol{DAE}~的一个重要特性。\n具体如\\figref{fig:chap14_denoising_task}所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/denoising_task}}\n\\fi\n\\caption{\\gls{DAE}被训练为将损坏的数据点$\\tilde \\Vx$映射回原始数据点$\\Vx$。\n我们将训练样本$\\Vx$表示为位于低维\\gls{manifold}（粗黑线）附近的红叉。\n我们用灰色圆圈表示等概率的损坏过程$C(\\tilde \\Vx \\mid \\Vx)$。\n灰色箭头演示了如何将一个训练样本转换为经过此损坏过程的样本。\n当训练\\gls{DAE}最小化平方误差$\\| g(f(\\tilde \\Vx)) - \\Vx \\|^2$的平均值时，\\gls{reconstruction} $g(f(\\tilde \\Vx))$估计$\\SetE_{\\RVx, \\tilde{\\RVx} \\sim p_{\\text{data}}(\\RVx) C(\\tilde{\\RVx} \\mid \\RVx)}[\\RVx \\mid \\tilde{\\Vx}]$。\n$g(f(\\tilde \\Vx))$对可能产生$\\tilde \\Vx$的原始点$\\Vx$的质心进行估计，所以向量$ g(f(\\tilde \\Vx)) - \\tilde \\Vx $近似指向\\gls{manifold}上最近的点。\n因此\\gls{AE}可以学习由绿色箭头表示的向量场$ g(f( \\Vx)) -  \\Vx $。\n该向量场将得分$\\nabla_{\\Vx} \\log p_{\\text{data}}(\\Vx)$估计为一个乘性因子，即\\gls{reconstruction_error}均方根的平均。\n}\n\\label{fig:chap14_denoising_task}\n\\end{figure}\n\n对一类采用高斯噪声和\\gls{mean_squared_error}作为\\gls{reconstruction_error}的特定\\gls{DAE}（具有sigmoid~\\gls{hidden_unit}和线性\\gls{reconstruction}单元）的\\gls{denoising}训练过程，与训练一类特定的被称为~\\glssymbol{RBM}~的无向概率模型是等价的\\citep{Vincent-NC-2011-small}。\n这类模型将在\\secref{sec:gaussian_bernoulli_rbms}给出更详细的介绍；对于现在的讨论，我们只需知道这个模型能显式的给出$p_{\\text{model}}(\\Vx; \\Vtheta)$。\n当~\\glssymbol{RBM}~使用\\firstgls{denoising_score_matching}算法~\\citep{Kingma+LeCun-2010-small}训练时，它的学习算法与训练对应的\\gls{DAE}是等价的。\n在一个确定的噪声水平下，\\gls{regularization}的\\gls{score_matching}不是一致估计量；相反它会恢复分布的一个模糊版本。\n然而，当噪声水平趋向于0且训练样本数趋向于无穷时，一致性就会恢复。\n我们将会在\\secref{sec:denoising_score_matching}更详细地讨论\\gls{denoising_score_matching}。\n\n\n\\gls{AE}和~\\glssymbol{RBM}~还存在其他联系。\n在~\\glssymbol{RBM}~上应用\\gls{score_matching}后，其\\gls{cost_function}将等价于\\gls{reconstruction_error}结合类似~\\glssymbol{CAE}~惩罚的正则项 \\citep{Swersky-ICML2011}。\n\\citet{Bengio+Delalleau-2009}指出\\gls{AE}的\\gls{gradient}是对~\\glssymbol{RBM}~\\gls{contrastive_divergence}训练的近似。\n\n\n对于连续的$\\Vx$，高斯损坏和\\gls{reconstruction}分布的\\gls{denoising}\\gls{criterion}得到的\\gls{score}估计适用于一般\\gls{encoder}和\\gls{decoder}的参数化\\citep{Alain+Bengio-ICLR2013-small}。\n这意味着一个使用平方误差\\gls{criterion}\n\\begin{align}\n \\| g(f(\\tilde \\Vx)) - \\Vx \\|^2\n\\end{align}\n和噪声方差为$\\sigma^2 $的损坏\n\\begin{align}\n C(\\tilde x = \\tilde \\Vx \\mid \\Vx) = N(\\tilde \\Vx; \\mu=\\Vx, \\Sigma = \\sigma^2 I)\n\\end{align}\n的通用\\gls{encoder}-\\gls{decoder}架构可以用来训练估计\\gls{score}。\n\\figref{fig:chap14_vector_field_color}展示其中的工作原理。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter14/figures/vector_field_color}}\n\\fi\n\\caption{由\\gls{DAE}围绕$1$维弯曲\\gls{manifold}学习的向量场，其中数据集中在$2$维空间中。\n每个箭头与\\gls{reconstruction}向量减去\\gls{AE}的输入向量后的向量成比例，并且根据隐式估计的概率分布指向较高的概率。\n向量场在估计的密度函数的最大值处（在数据\\gls{manifold}上）和密度函数的最小值处都为零。\n例如，螺旋臂形成局部最大值彼此连接的$1$维\\gls{manifold}。\n局部最小值出现在两个臂间隙的中间附近。\n当\\gls{reconstruction}误差的范数（由箭头的长度示出）很大时，在箭头的方向上移动可以显著增加概率，并且在低概率的地方大多也是如此。\n\\gls{AE}将这些低概率点映射到较高的概率\\gls{reconstruction}。\n在概率最大的情况下，\\gls{reconstruction}变得更准确，因此箭头会收缩。\n经~\\citet{Alain+Bengio-ICLR2013-small}许可转载此图。\n}\n\\label{fig:chap14_vector_field_color}\n\\end{figure}\n\n一般情况下，不能保证\\gls{reconstruction}函数$g(f(\\Vx))$减去输入$\\Vx$后对应于某个函数的\\gls{gradient}，更不用说\\gls{score} 。\n这是早期工作~\\citep{Vincent-NC-2011-small}专用于特定参数化的原因（其中$g(f(\\Vx)) - \\Vx$能通过另一个函数的导数获得）。\n\\citet{Kamyshanska+Memisevic-2015}通过标识一类特殊的浅层\\gls{AE}家族，使$g(f(\\Vx)) - \\Vx$对应于这个家族所有成员的一个\\gls{score}，以此推广~\\citet{Vincent-NC-2011-small}的结果。\n\n% -- 504 --\n\n目前为止我们所讨论的仅限于\\gls{DAE}如何学习表示一个概率分布。\n更一般的，我们可能希望使用\\gls{AE}作为\\gls{generative_model}，并从其分布中进行采样。\n这将在\\secref{sec:drawing_samples_from_autoencoders}中讨论。\n\n% -- 505 --\n\n\\subsection{历史展望}\n\\label{sec:historical_perspective_chap14}\n采用~\\glssymbol{MLP}~\\gls{denoising}的想法可以追溯到~\\cite{Lecun-these87}和~\\citet{Gallinari87}的工作。\n\\citet{Behnke-2001}也曾使用\\gls{recurrent_network}对图像去噪。\n在某种意义上，\\gls{DAE}仅仅是被训练\\gls{denoising}的~\\glssymbol{MLP}。\n然而，``\\gls{DAE}''的命名指的不仅仅是学习\\gls{denoising}，而且可以学到一个好的内部\\gls{representation}（作为学习\\gls{denoising}的副效用）。\n这个想法提出较晚\\citep{VincentPLarochelleH2008-small,Vincent-JMLR-2010-small}。\n学习到的\\gls{representation}可以被用来预训练更深的\\gls{unsupervised}网络或\\gls{supervised}网络。\n与\\gls{sparse}\\gls{AE}、\\gls{sparse_coding}、\\gls{CAE}等\\gls{regularization}的\\gls{AE}类似， \\glssymbol{DAE}~的动机是允许学习\\gls{capacity}很高的\\gls{encoder}，同时防止在\\gls{encoder}和\\gls{decoder}学习一个无用的恒等函数 。\n\n\n在引入现代~\\glssymbol{DAE}~之前，\\citet{Inayoshi-and-Kurita-2005}探索了其中一些相同的方法和目标。\n他们除了在\\gls{supervised}目标的情况下最小化\\gls{reconstruction_error}之外，还在监督~\\glssymbol{MLP}~的\\gls{hidden_layer}注入噪声，通过引入\\gls{reconstruction_error}和注入噪声提升泛化能力。\n然而，他们的方法基于线性\\gls{encoder}，因此无法学习到现代~\\glssymbol{DAE}~能学习的强大函数族。\n\n\n\n\\section{使用\\glsentrytext{AE}学习\\glsentrytext{manifold}}\n\\label{sec:learning_manifolds_with_autoencoders}\n\n如\\secref{sec:manifold_learning}描述，\\gls{AE}跟其他很多\\gls{ML}算法一样，也利用了数据集中在一个低维\\gls{manifold}或者一小组这样的\\gls{manifold}的思想。\n其中一些\\gls{ML}算法仅能学习到在\\gls{manifold}上表现良好但给定不在\\gls{manifold}上的输入会导致异常的函数。\n\\gls{AE}进一步借此想法，旨在学习\\gls{manifold}的结构。\n\n\n要了解\\gls{AE}如何做到这一点，我们必须介绍\\gls{manifold}的一些重要特性。\n\n\n\\gls{manifold}的一个重要特征是\\firstgls{tangent_plane}的集合。\n$d$维\\gls{manifold}上的一点$\\Vx$，\\gls{tangent_plane}由能张成\\gls{manifold}上允许变动的局部方向的$d$维基向量给出。\n如\\figref{fig:chap14_tangent_plane_color}所示，这些局部方向决定了我们能如何微小地变动$\\Vx$而保持于\\gls{manifold}上。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/tangent_plane_color}}\n\\fi\n\\caption{正切超平面概念的图示。\n我们在$784$维空间中创建了$1$维\\gls{manifold}。\n我们使用一张784像素的MNIST图像，并通过垂直平移来转换它。\n垂直平移的量定义沿着1维\\gls{manifold}的坐标，轨迹为通过图像空间的弯曲路径。\n该图显示了沿着该\\gls{manifold}的几个点。\n为了可视化，我们使用~\\glssymbol{PCA}~将\\gls{manifold}投影到$2$维空间中。\n$n$维\\gls{manifold}在每个点处都具有$n$维切平面。\n该切平面恰好在该点接触\\gls{manifold}，并且在该点处平行于\\gls{manifold}表面。\n它定义了为保持在\\gls{manifold}上可以移动的方向空间。\n该$1$维\\gls{manifold}具有单个切线。\n我们在图中示出了一个点处的示例切线，其中图像表示该切线方向在图像空间中是怎样的。\n灰色像素表示沿着切线移动时不改变的像素，白色像素表示变亮的像素，黑色像素表示变暗的像素。\n}\n\\label{fig:chap14_tangent_plane_color}\n\\end{figure}\n\n% -- 506 --\n\n所有\\gls{AE}的训练过程涉及两种推动力的折衷：\n\\begin{enumerate}\n \\item 学习训练样本$\\Vx$的\\gls{representation} $\\Vh$使得$\\Vx$能通过\\gls{decoder}近似地从$\\Vh$中恢复。\n$\\Vx$是从训练数据挑出的这一事实很关键，因为这意味着\\gls{AE}不需要成功\\gls{reconstruction}不属于数据生成分布下的输入。\n \\item 满足约束或正则惩罚。\n这可以是限制\\gls{AE}\\gls{capacity}的架构约束，也可以是加入到\\gls{reconstruction}代价的一个正则项。\n这些技术一般倾向那些对输入较不敏感的解。\n\\end{enumerate}\n\n% -- 507 --\n\n显然，单一的推动力是无用的——从它本身将输入复制到输出是无用的，同样忽略输入也是没用的。\n相反，两种推动力结合是有用的，因为它们驱使隐藏的表示能捕获有关数据分布结构的信息。\n重要的原则是，\\gls{AE}必须有能力表示\\emph{\\gls{reconstruction}训练实例所需的变化}。\n如果该数据生成分布集中靠近一个低维\\gls{manifold}，\\gls{AE}能隐式产生捕捉这个\\gls{manifold}局部坐标系的表示：仅在$\\Vx$周围关于\\gls{manifold}的相切变化需要对应于$\\Vh=f(\\Vx)$中的变化。\n因此，\\gls{encoder}学习从输入空间$\\Vx$到表示空间的映射，映射仅对沿着\\gls{manifold}方向的变化敏感，并且对\\gls{manifold}正交方向的变化不敏感。\n\n\n\\figref{fig:chap14_1d_autoencoder_color}中一维的例子说明，我们可以通过构建对数据点周围的输入扰动不敏感的\\gls{reconstruction}函数，使得\\gls{AE}恢复\\gls{manifold}结构。\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/1d_autoencoder_color}}\n\\fi\n\\caption{如果\\gls{AE}学习到对数据点附近的小扰动不变的\\gls{reconstruction}函数，它就能捕获数据的\\gls{manifold}结构。\n这里，\\gls{manifold}结构是0维\\gls{manifold}的集合。\n虚线对角线表示\\gls{reconstruction}的恒等函数目标。 \n最佳\\gls{reconstruction}函数会在存在数据点的任意处穿过恒等函数。\n图底部的水平箭头表示在输入空间中基于箭头的$r(\\Vx)-\\Vx$重建方向向量，总是指向最近的``\\gls{manifold}''（1维情况下的单个数据点 ）。\n在数据点周围，\\gls{DAE}明确地尝试将\\gls{reconstruction}函数$r(\\Vx)$的导数限制为很小。\n\\gls{CAE}的\\gls{encoder}执行相同操作。\n虽然在数据点周围，$r(\\Vx)$的导数被要求很小，但在数据点之间它可能会很大。\n数据点之间的空间对应于\\gls{manifold}之间的区域，为将损坏点映射回\\gls{manifold}，\\gls{reconstruction}函数必须具有大的导数。\n} \\label{fig:chap14_1d_autoencoder_color}\n\\end{figure}\n\n% -- 508 --\n\n为了理解\\gls{AE}可用于\\gls{manifold_learning}的原因，我们可以将\\gls{AE}和其他方法进行对比。\n学习表征\\gls{manifold}最常见的是\\gls{manifold}上（或附近）数据点的\\firstgls{representation}。\n对于特定的实例，这样的表示也被称为\\gls{embedding}。\n它通常由一个低维向量给出，具有比这个\\gls{manifold}的``外围''空间更少的维数。\n有些算法（下面讨论的\\gls{nonparametric}\\gls{manifold_learning}算法）直接学习每个训练样例的\\gls{embedding}，而其他算法学习更一般的映射（有时被称为\\gls{encoder}或表示函数），将周围空间（输入空间）的任意点映射到它的\\gls{embedding}。\n\n\n\\gls{manifold_learning}大多专注于试图捕捉到这些\\gls{manifold}的\\gls{unsupervised_learning}过程。\n最初始的学习非线性\\gls{manifold}的\\gls{ML}研究专注基于\\firstgls{nearest_neighbor_graph}的\\firstgls{nonparametric}方法。\n该图中每个训练样例对应一个节点，它的边连接近邻点对。\n如\\figref{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}相关联。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/faces_graph_manifold}}\n\\fi\n\\caption{非参数\\gls{manifold_learning}过程构建的最近邻图，其中节点表示训练样本，有向边指示最近邻关系。\n因此，各种过程可以获得与图的邻域相关联的切平面以及将每个训练样本与实值向量位置或\\firstgls{embedding}相关联的坐标系。\n我们可以通过插值将这种表示概括为新的样本。\n只要样本的数量大到足以覆盖\\gls{manifold}的弯曲和扭转，这些方法工作良好。 \n图片来自QMUL 多角度人脸数据集\\citep{Gong-et-al-2000}。\n}\n\\label{fig:chap14_faces_graph_manifold}\n\\end{figure}\n\n全局坐标系则可以通过优化或求解线性系统获得。\n\\figref{fig:chap14_tiling-a-manifold}展示了如何通过大量局部线性的类高斯样平铺（或``薄煎饼''，因为高斯块在\\gls{tangent_plane}方向是扁平的）得到一个\\gls{manifold}。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter14/figures/tiling-a-manifold}}\n\\fi\n\\caption{如果每个位置处的切平面（见\\figref{fig:chap14_tangent_plane_color}）是已知的，则它们可以平铺后形成全局坐标系或密度函数。\n每个局部块可以被认为是局部欧几里德坐标系或者是局部平面高斯或``薄饼''，在与薄饼正交的方向上具有非常小的方差而在定义坐标系的方向上具有非常大的方差。\n这些高斯的混合提供了估计的密度函数，如\\gls{manifold}中的~\\ENNAME{Parzen}~窗口算法\\citep{Vincent-Bengio-2003-short} 或其非局部的基于\\gls{NN}的变体\\citep{Bengio-Larochelle-NLMP-NIPS-2006-short}。\n}\n\\label{fig:chap14_tiling-a-manifold}\n\\end{figure}\n\n然而，\\citet{Bengio+Monperrus-2005}指出了这些局部\\gls{nonparametric}方法应用于\\gls{manifold_learning}的根本困难：如果\\gls{manifold}不是很光滑（它们有许多波峰、波谷和曲折），为覆盖其中的每一个变化，我们可能需要非常多的训练样本，导致没有能力泛化到没见过的变化。\n实际上，这些方法只能通过内插，概括相邻实例之间\\gls{manifold}的形状。\n不幸的是，\\glssymbol{AI}~问题中涉及的\\gls{manifold}可能具有非常复杂的结构，难以仅从局部插值捕获特征。\n考虑\\figref{fig:chap14_tangent_plane_color}转换所得的\\gls{manifold}样例。\n如果我们只观察输入向量内的一个坐标$x_i$，当平移图像，我们可以观察到当这个坐标遇到波峰或波谷时，图像的亮度也会经历一个波峰或波谷。\n换句话说，底层图像模板亮度的模式复杂性决定执行简单的图像变换所产生的\\gls{manifold}的复杂性。\n这是采用\\gls{distributed_representation}和\\gls{DL}捕获\\gls{manifold}结构的动机。\n\n% -- 509 --\n\n\\section{\\glsentrytext{CAE}}\n\\label{sec:contractive_autoencoders}\n\\gls{CAE}~\\citep{Rifai+al-2011-small,Salah+al-2011-small}在\\gls{code} $\\Vh = f(\\Vx)$的基础上添加了显式的正则项，鼓励$f$的导数尽可能小：\n\\begin{align}\n \\Omega(\\Vh) = \\lambda \\Bigg\\| \\frac{\\partial f(\\Vx)}{\\partial \\Vx} \\Bigg\\|_F^2 .\n\\end{align}\n惩罚项$\\Omega(\\Vh)$为平方~\\ENNAME{Frobenius}~范数（元素平方之和），作用于与\\gls{encoder}的函数相关\\gls{partial_derivatives}的~\\gls{jacobian}~矩阵。\n\n\n\\gls{DAE}和\\gls{CAE}之间存在一定联系：\\citet{Alain+Bengio-ICLR2013-small}指出在小高斯噪声的限制下，当\\gls{reconstruction}函数将$\\Vx$映射到$\\Vr = g(f(\\Vx))$时，\\gls{denoising}\\gls{reconstruction_error}与\\gls{contractive}惩罚项是等价的。\n换句话说，\\gls{DAE}能抵抗小且有限的输入扰动，而\\gls{CAE}使特征提取函数能抵抗极小的输入扰动。\n\n分类任务中，基于~\\gls{jacobian}~的\\gls{contractive}惩罚预训练特征函数$f(\\Vx)$，将收缩惩罚应用在$f(\\Vx)$而不是$g(f(\\Vx))$可以产生最好的分类精度。\n如\\secref{sec:estimating_the_score}所讨论，应用于$f(\\Vx)$的\\gls{contractive}惩罚与\\gls{score_matching}也有紧密的联系。\n\n\\firstgls{contractive}源于~\\glssymbol{CAE}~弯曲空间的方式。\n具体来说，由于~\\glssymbol{CAE}~训练为抵抗输入扰动，鼓励将输入点邻域映射到输出点处更小的邻域。\n我们能认为这是将输入的邻域\\gls{contractive}到更小的输出邻域。\n\n\n说得更清楚一点，\\glssymbol{CAE}~只在局部\\gls{contractive}——一个训练样本$\\Vx$的所有扰动都映射到$f(\\Vx)$的附近。\n全局来看，两个不同的点$\\Vx$和$\\Vx'$会分别被映射到远离原点的两个点$f(\\Vx)$和$f(\\Vx')$。\n$f$扩展到数据\\gls{manifold}的中间或远处是合理的（见\\figref{fig:chap14_1d_autoencoder_color}中小例子的情况）。\n当$\\Omega(\\Vh)$惩罚应用于~\\ENNAME{sigmoid}~单元时，\\gls{contractive}~\\gls{jacobian}~的简单方式是令~\\ENNAME{sigmoid}~趋向饱和的0或1。\n这鼓励~\\glssymbol{CAE}~使用~\\ENNAME{sigmoid}~的极值编码输入点，或许可以解释为二进制\\gls{code}。\n它也保证了~\\glssymbol{CAE}~可以穿过大部分~\\ENNAME{sigmoid}~\\gls{hidden_unit}能张成的超立方体，进而扩散其\\gls{code}值。\n\n我们可以认为点$\\Vx$处的~\\gls{jacobian}~矩阵$\\MJ$能将非线性\\gls{encoder}近似为线性算子。\n这允许我们更形式地使用``\\gls{contractive}''这个词。\n在线性理论中，当$\\MJ\\Vx$的范数对于所有单位$\\Vx$都小于等于1时，$\\MJ$被称为\\gls{contractive}的。\n换句话说，如果$\\MJ$收缩了单位球，他就是\\gls{contractive}的。\n我们可以认为~\\glssymbol{CAE}~为鼓励每个局部线性算子具有收缩性，而在每个训练数据点处将~\\ENNAME{Frobenius}~范数作为$f(\\Vx)$的局部线性近似的惩罚。\n\n\n如\\secref{sec:learning_manifolds_with_autoencoders}中描述，正则\\gls{AE}基于两种相反的推动力学习\\gls{manifold}。\n在~\\glssymbol{CAE}~的情况下，这两种推动力是\\gls{reconstruction_error}和\\gls{contractive}惩罚$\\Omega(\\Vh)$。\n单独的\\gls{reconstruction_error}鼓励~\\glssymbol{CAE}~学习一个恒等函数。\n单独的\\gls{contractive}惩罚将鼓励~\\glssymbol{CAE}~学习关于$\\Vx$是恒定的特征。\n这两种推动力的折衷产生导数$\\frac{\\partial f(\\Vx)}{\\partial \\Vx}$大多是微小的\\gls{AE}。\n只有少数\\gls{hidden_unit}，对应于一小部分输入数据的方向，可能有显著的导数。\n\n\n\\glssymbol{CAE}~的目标是学习数据的\\gls{manifold}结构。\n使$\\MJ\\Vx$很大的方向$\\Vx$，会快速改变$\\Vh$，因此很可能是近似\\gls{manifold}\\gls{tangent_plane}的方向。\n\\citet{Rifai+al-2011-small,Salah+al-2011-small}的实验显示训练~\\glssymbol{CAE}~会导致$\\MJ$中大部分奇异值（幅值）比1小，因此是收缩的。\n然而，有些奇异值仍然比1大，因为\\gls{reconstruction_error}的惩罚鼓励~\\glssymbol{CAE}~对最大局部变化的方向进行编码。\n对应于最大奇异值的方向被解释为\\gls{CAE}学到的切方向。\n理想情况下，这些切方向应对应于数据的真实变化。\n比如，一个应用于图像的~\\glssymbol{CAE}~应该能学到显示图像改变的切向量，如\\figref{fig:chap14_tangent_plane_color}图中物体渐渐改变状态。\n如\\figref{fig:chap14_cifar_cae}所示，实验获得的奇异向量的可视化似乎真的对应于输入图象有意义的变换。\n\n% -- 512 --\n\n\\begin{figure}[ht]\n\\centering\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n% ?? I do NOT which is correct ...\n\\begin{tabular}{p{.1\\figwidth}|p{.86\\figwidth}}\nInput point & Tangent vectors\\\\\n\\hline \n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_tangent_input.png} & \n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_local_pca.png}\\\\\n & Local PCA (no sharing across regions)\\\\\n \\hline\n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_tangent_input.png} & \n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_cae.png}\\\\\n & Contractive autoencoder\\\\\n\\end{tabular}\n\\fi\n\\caption{通过局部~\\glssymbol{PCA}~和\\gls{CAE}估计的\\gls{manifold}切向量的图示。\n\\gls{manifold}的位置由来自CIFAR-10数据集中狗的输入图像定义。\n切向量通过输入到代码映射的~\\gls{jacobian}~矩阵$\\frac{\\partial \\Vh}{\\partial \\Vx}$ 的前导奇异向量估计。\n虽然局部~\\glssymbol{PCA}~和~\\glssymbol{CAE}~都可以捕获局部切方向，但~\\glssymbol{CAE}~能够从有限训练数据形成更准确的估计，因为它利用了不同位置的参数共享（共享激活的\\gls{hidden_unit}子集）。\n\\glssymbol{CAE}切方向通常对应于物体的移动或改变部分（例如头或腿）。\n经~\\citet{Dauphin-et-al-NIPS2011-small}许可转载此图。\n}\n\\label{fig:chap14_cifar_cae}\n\\end{figure}\n\n\n\\gls{CAE}\\gls{regularization}\\gls{criterion}的一个实际问题是，尽管它在单一\\gls{hidden_layer}的\\gls{AE}情况下是容易计算的，但在更深的\\gls{AE}情况下会变的难以计算。\n根据~\\citet{Rifai+al-2011-small}的策略，分别训练一系列单层的\\gls{AE}，并且每个被训练为\\gls{reconstruction}前一个\\gls{AE}的\\gls{hidden_layer}。\n这些\\gls{AE}的组合就组成了一个深度\\gls{AE}。\n因为每个层分别训练成局部\\gls{contractive}，深度\\gls{AE}自然也是\\gls{contractive}的。\n这个结果与联合训练深度模型完整架构（带有关于\\gls{jacobian}的惩罚项）获得的结果是不同的，但它抓住了许多理想的定性特征。\n\n\n另一个实际问题是，如果我们不对\\gls{decoder}强加一些约束，\\gls{contractive}惩罚可能导致无用的结果。\n例如，\\gls{encoder}将输入乘一个小常数$\\epsilon$，\\gls{decoder}将\\gls{code}除以一个小常数$\\epsilon$。\n随着$\\epsilon$趋向于0，\\gls{encoder}会使\\gls{contractive}惩罚项$\\Omega(\\Vh)$趋向于0而学不到任何关于分布的信息。\n同时，\\gls{decoder}保持完美的\\gls{reconstruction}。\n\\citet{Rifai+al-2011-small}通过绑定$f$和$g$的权重来防止这种情况。\n$f$和$g$都是由线性仿射变换后进行逐元素非线性变换的标准\\gls{NN}层组成，因此将$g$的权重矩阵设成$f$权重矩阵的转置是很直观的。\n\n% -- 513 --\n\n\\section{\\glsentrytext{PSD}}\n\\label{sec:predictive_sparse_decomposition}\n\n\\firstall{PSD}是\\gls{sparse_coding}和参数化\\gls{AE}~\\citep{koray-psd-08}的混合模型。\n参数化\\gls{encoder}被训练为能预测迭代推断的输出。\n\\glssymbol{PSD}~被应用于图片和视频中对象识别的\\gls{unsupervised}特征学习\\citep{Koray-08-small,koray-nips-10-small,Jarrett-ICCV2009-small,farabet-suml-11}，在音频中也有所应用\\citep{henaff-ismir-11-small}。\n这个模型由一个\\gls{encoder} $f(\\Vx)$和一个\\gls{decoder} $g(\\Vh)$组成，并且都是参数化的。\n在训练过程中，$\\Vh$由优化算法控制。\n优化过程是最小化\n\\begin{align}\n \\| \\Vx - g(\\Vh) \\| ^2 + \\lambda | \\Vh |_1 + \\gamma \\| \\Vh - f(\\Vx) \\|^2.\n\\end{align}\n就像\\gls{sparse_coding}，训练算法交替地相对$\\Vh$和模型的参数最小化上述目标。\n相对$\\Vh$最小化较快，因为$f(\\Vx)$提供$\\Vh$的良好初始值以及\\gls{loss_function}将$\\Vh$约束在$f(\\Vx)$附近。\n简单的\\gls{GD}算法只需10步左右就能获得理想的$\\Vh$。\n\n\n\\glssymbol{PSD}~所使用的训练程序不是先训练\\gls{sparse_coding}模型，然后训练$f(\\Vx)$来预测\\gls{sparse_coding}的特征。\n\\glssymbol{PSD}~训练过程正则化\\gls{decoder}，使用$f(\\Vx)$可以推断出良好\\gls{code}的参数。\n\n\n\\gls{PSD}是\\firstgls{learned_approximate_inference}的一个例子。\n在\\secref{sec:learned_approximate_inference}中，这个话题将会进一步展开。\n\\chapref{chap:approximate_inference}中展示的工具能让我们了解到，\\glssymbol{PSD}~能够被解释为通过最大化模型的对数似然下界训练有向\\gls{sparse_coding}的概率模型。\n\n\n在~\\glssymbol{PSD}~的实际应用中，迭代优化仅在训练过程中使用。\n模型被部署后，参数\\gls{encoder} $f$用于计算已经习得的特征。\n相比通过\\gls{GD}推断$\\Vh$，计算$f$是很容易的。\n因为$f$是一个可微带参函数，\\glssymbol{PSD}~模型可堆叠，并用于初始化其他训练\\gls{criterion}的深度网络。\n\n% -- 514 --\n\n\\section{\\glsentrytext{AE}的应用}\n\\label{sec:applications_of_autoencoders}\n\n\\gls{AE}已成功应用于\\gls{dimensionality_reduction}和\\gls{information_retrieval}任务。\n\\gls{dimensionality_reduction}是\\gls{representation_learning}和\\gls{DL}的第一批应用之一。\n它是研究\\gls{AE}早期驱动力之一。\n例如， \\citet{Hinton-Science2006}训练了一个栈式~\\glssymbol{RBM}，然后利用它们的权重初始化一个\\gls{hidden_layer}逐渐减小的深度\\gls{AE}，终结于30个单元的瓶颈。\n生成的\\gls{code}比30维的~\\glssymbol{PCA}~产生更少的\\gls{reconstruction_error}，所学到的表示更容易定性解释，并能联系基础类别，这些类别表现为分离良好的集群。\n\n\n低维\\gls{representation}可以提高许多任务的性能，例如分类。\n小空间的模型消耗更少的内存和运行时间。\n据~\\citet{Salakhutdinov+Hinton2007-small}和~\\citet{Torralba+Fergus+Weiss-2008}观察，许多\\gls{dimensionality_reduction}的形式会将语义上相关的样本置于彼此邻近的位置。\n映射到低维空间所提供的线索有助于泛化。\n\n\n相比普通任务，\\firstgls{information_retrieval}从\\gls{dimensionality_reduction}中获益更多，此任务需要找到数据库中类似查询的条目。\n此任务不仅和其他任务一样从\\gls{dimensionality_reduction}中获得一般益处，还使某些低维空间中的搜索变得极为高效。\n特别的，如果我们训练\\gls{dimensionality_reduction}算法生成一个低维且\\emph{二值}的\\gls{code}，那么我们就可以将所有数据库条目在哈希表映射为二值编码向量。\n这个哈希表允许我们返回具有相同二值编码的数据库条目作为查询结果进行\\gls{information_retrieval}。\n我们也可以非常高效地搜索稍有不同条目，只需反转查询编码的各个位。\n这种通过\\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}。\n\n\n通常在最终层上使用~\\ENNAME{sigmoid}~编码函数产生\\gls{semantic_hashing}的二值\\gls{code}。\n\\ENNAME{sigmoid}~单元必须被训练为到达饱和，对所有输入值都接近0或接近1。\n能做到这一点的窍门就是训练时在~\\ENNAME{sigmoid}~非线性单元前简单地注入加性噪声。\n噪声的大小应该随时间增加。\n要对抗这种噪音并且保存尽可能多的信息，网络必须加大输入到~\\ENNAME{sigmoid}~函数的幅度，直到饱和。\n\n% -- 515 --\n\n学习哈希函数的思想已在其他多个方向进一步探讨，包括改变损失训练\\gls{representation}的想法，其中所需优化的损失与哈希表中查找附近样本的任务有更直接的联系\\citep{Norouzi+Fleet-ICML2011}。\n"
  },
  {
    "path": "Chapter15/README.md",
    "content": "#第十五章笔记\n"
  },
  {
    "path": "Chapter15/annotations.txt",
    "content": "{'user': 'acct:cnscottzheng@hypothes.is', 'text': '这里用“普适于” 好像不太准确。', 'origin_text': '很多信息处理任务，非常容易或者非常困难取决于信息是如何表示的。  !!!这是一个普适于日常生活，普适于计算机科学的基本原则，也普适于机器学习。!!!  例如，对于人而言，使用长除法计算210除以6非常直观。但如果', 'time': '2017-02-08T11:39'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '\"计算CCX除以VI时\"  不知道什么意思', 'origin_text': '但如果使用罗马数字表示，这个问题就没那么直观了。大部分现代人在  !!!计算CCX除以VI时!!!  ，都会将其转化成阿拉伯数字，从而使用位值系统的长除法。更具体地', 'time': '2017-02-08T11:36'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '拗口', 'origin_text': 'oftmax回归分类器。网络的其余部分学习出分类器输入的表示。  !!!监督准则下的训练自然会使得每个隐藏层（比较接近顶层的隐藏层）的表示趋向于具有使训练任务更容易的性质。!!!  例如，输入特征线性不可分的类别可能在最后一个隐藏层变成线性可分的', 'time': '2017-02-08T11:37'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '如何？', 'origin_text': '很多方法来利用无标记的数据。在本章中，我们主要探讨未标记的数据  !!!可以!!!  学习出更好的表示。贪心地逐层无监督预训练无监督学习在', 'time': '2017-02-08T11:42'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '历史上应该去掉吧', 'origin_text': '示。贪心地逐层无监督预训练无监督学习在深度神经网络的  !!!复兴历史上!!!  起到了关键作用，使研究者首次可以训练不含诸如卷积或者循环这类特殊', 'time': '2017-02-08T11:43'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '是？', 'origin_text': '程称为无监督预训练，或者更精确地，贪心逐层无监督预训练。此过程  !!!时!!!  一个任务（无监督学习，尝试抓住输入分布的形状）的表示如何有助于另', 'time': '2017-02-08T11:44'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '发现是不是多余？', 'origin_text': '可以追溯神经认知机{cite?}。深度学习的复兴始于2006年  !!!发现!!!  ，这种贪心学习的过程能够为多层联合训练过程找到一个好的初始值，甚', 'time': '2017-02-08T11:49'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '在发现此算法之前？', 'origin_text': '到一个好的初始值，甚至可以成功训练全连接的结构{cite?}。  !!!在此发现之前!!!  ，只有深度卷积网络或深度循环网络这类特殊结构的深度网络被认为是有', 'time': '2017-02-08T11:50'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '建议保留一个“整个”或“两阶段”词即可', 'origin_text': '常而言，”预训练”不仅单指预训练阶段，也指结合预训练和监督学习的  !!!整个两阶段!!!  学习过程。监督学习阶段可能会使用预训练阶段得到的顶层特征训练一', 'time': '2017-02-08T11:53'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '这是', 'origin_text': '\\\\sec?所探讨的，也可以进行贪心逐层\\\\emph{监督}预训练。  !!!这!!!  建立在训练浅层模型比深度模型更容易的前提下，而该前提似乎在一些情', 'time': '2017-02-08T11:54'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '不通顺', 'origin_text': '练的特征添加线性分类器，那么学习到的特征必须使底层类别线性可分。  !!!这些性质通常自然地发生!!!  ，但并非总是这样。这是另一个监督和无监督学习同时训练更可取的原', 'time': '2017-02-08T11:59'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '严格？', 'origin_text': '数目很少（每类几个到几十个）。这些效果也出现在被{cite?}  !!!仔细!!!  控制的实验中。还有一些其他的因素可能会涉及。例如，当要学习', 'time': '2017-02-08T12:00'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '不太通顺', 'origin_text': '曲线就越好。对于深度表示而言，迁移任务只需要较少的标记样本就能  !!!明显地渐近泛化性能!!!  。迁移学习的两种极端形式是一次学习和零次学习，有时也被称', 'time': '2017-02-09T09:52'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '多余的符号吧', 'origin_text': 'xx\\\\Vx，传统输出或目标yy\\\\Vy，以及描述任务的附加随机变量  !!!，!!!  TTT。该模型被训练来估计条件分布p(y∣x,T)p(y∣x,', 'time': '2017-02-09T09:54'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '建议改成“从20世纪90年代以来”', 'origin_text': '∣x)p(y∣x)p(\\\\Vy \\\\mid \\\\Vx)的一种良好表示。  !!!从至少20世纪90年代以来!!!  ，这个想法已经指导了大量的深度学习研究工作~{cite?}。关', 'time': '2017-02-16T02:45'}\n{'user': 'acct:cnscottzheng@hypothes.is', 'text': '多了空格', 'origin_text': '外，目标函数可能还有一些其他规律。例如，具有最大池化的卷积网络  !!!!!!  可以不考虑对象在图像中的位置（即使对象的空间变换不对应输入空间的', 'time': '2017-02-16T02:58'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:liber145@hypothes.is', 'text': '感觉不是指发现此算法，而是发现该贪心算法有利于初始化。', 'time': '2017-03-05T15:30'}\n{'user': 'acct:liber145@hypothes.is', 'text': '监督学习训练模型，一般会使得模型的各个隐藏层（特别是接近顶层的隐藏层）的表示能够更加容易地完成训练任务。\\n\\n这样你看如何。', 'time': '2017-03-05T15:22'}\n{'user': 'acct:liber145@hypothes.is', 'text': '嗯，现改为 大部分现代人在进行罗马数字计算CCX除以VI时', 'time': '2017-03-05T15:03'}"
  },
  {
    "path": "Chapter15/representation_learning.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Yujun Li \n\\chapter{\\glsentrytext{representation_learning}}\n\\label{chap:representation_learning}\n\n% 517 head\n\n在本章中，首先我们会讨论学习表示是什么意思，以及表示的概念如何有助于深度框架的设计。\n我们探讨学习算法如何在不同任务中共享统计信息，包括使用\\gls{unsupervised}任务中的信息来完成\\gls{supervised}任务。\n共享表示有助于处理多模式或多领域，或是将已学到的知识迁移到样本很少或没有、但任务表示依然存在的任务上。\n最后，我们回过头探讨\\gls{representation_learning}成功的原因，从\\gls{distributed_representation}~\\citep{Hinton-et-al-PDP1986}和深度表示的理论优势，最后会讲到\\gls{DGP}潜在假设的更一般概念，特别是观测数据的基本成因。\n\n\n很多信息处理任务可能非常容易，也可能非常困难，这取决于信息是如何表示的。\n这是一个广泛适用于日常生活、计算机科学及\\gls{ML}的基本原则。\n例如，对于人而言，可以直接使用长除法计算$210$除以$6$。\n但如果使用罗马数字表示，这个问题就没那么直接了。\n大部分现代人在使用罗马数字计算~\\ENNAME{CCX}~除以~\\ENNAME{VI}~时，都会将其转化成阿拉伯数字，从而使用位值系统的长除法。\n更具体地，我们可以使用合适或不合适的表示来量化不同操作的渐近运行时间。\n例如，插入一个数字到有序表中的正确位置，如果该数列表示为链表，那么所需时间是$O(n)$；如果该列表表示为红黑树，那么只需要$O(\\log n)$的时间。\n\n% -- 517 --\n\n在\\gls{ML}中，到底是什么因素决定了一种表示比另一种表示更好呢？\n一般而言，一个好的表示可以使后续的学习任务更容易。\n选择什么表示通常取决于后续的学习任务。\n\n% 518 head \n\n\n我们可以将\\gls{supervised_learning}训练的\\gls{feedforward_network}视为\\gls{representation_learning}的一种形式。\n具体地，网络的最后一层通常是\\gls{linear_classifier}，如~\\gls{softmax_chap15}~回归分类器。\n网络的其余部分学习出该分类器的表示。\n监督学习训练模型，一般会使得模型的各个\\gls{hidden_layer}（特别是接近顶层的\\gls{hidden_layer}）的表示能够更加容易地完成训练任务。\n例如，输入特征线性不可分的类别可能在最后一个\\gls{hidden_layer}变成线性\\gls{separable}。\n原则上，最后一层可以是另一种模型，如\\gls{nearest_neighbor}分类器~\\citep{SalakhutdinovR2007-small}。\n倒数第二层的特征应该根据最后一层的类型学习不同的性质。\n% 518 mid\n\n\n\\gls{feedforward_network}的\\gls{supervised}训练并没有给\\gls{learned}的中间特征明确强加任何条件。\n其他的\\gls{representation_learning}算法往往会以某种特定的方式明确设计表示。\n例如，我们想要学习一种使得密度估计更容易的表示。\n具有更多独立性的分布会更容易建模，因此，我们可以设计鼓励表示向量$\\Vh$中元素之间相互独立的\\gls{objective_function}。\n就像\\gls{supervised}网络，\\gls{unsupervised}深度学习算法有一个主要的训练目标，但也额外地学习出了表示。\n不论该表示是如何得到的，它都可以用于其他任务。\n或者，多个任务（有些是\\gls{supervised}的，有些是\\gls{unsupervised}的）可以通过共享的内部表示一起学习。\n\n\n% 518 mid \n\n大多数\\gls{representation_learning}算法都会在尽可能多地保留与输入相关的信息和追求良好的性质（如独立性）之间作出权衡。\n\n\n% 518 mid \n\\gls{representation_learning}特别有趣，因为它提供了进行\\gls{unsupervised_learning}和\\gls{semi_supervised_learning}的一种方法。\n我们通常会有巨量的\\gls{unlabeled}训练数据和相对较少的\\gls{labeled}训练数据。\n在非常有限的\\gls{labeled}数据集上\\gls{supervised_learning}通常会导致严重的\\gls{overfitting}。\n\\gls{semi_supervised_learning}通过进一步学习\\gls{unlabeled}数据，来解决\\gls{overfitting}的问题。\n具体地，我们可以从\\gls{unlabeled}数据上学习出很好的表示，然后用这些表示来解决\\gls{supervised_learning}问题。\n% 518 end\n\n\n人类和动物能够从非常少的\\gls{labeled}样本中学习。\n我们至今仍不知道这是如何做到的。\n有许多假说解释人类的卓越学习能力——例如，大脑可能使用了大量的分类器或者\\gls{bayesian_inference}技术的\\gls{ensemble}。\n一种流行的假说是，大脑能够利用\\gls{unsupervised_learning}和\\gls{semi_supervised_learning}。\n利用\\gls{unlabeled}数据有多种方式。\n在本章中，我们主要使用的假说是\\gls{unlabeled}数据可以学习出良好的表示。\n\n% -- 519 head\n\n\n\\section{\\glsentrytext{greedy_layer_wise_unsupervised_pretraining}}\n\\label{sec:greedy_layer_wise_unsupervised_pretraining}\n\\gls{unsupervised_learning}在\\gls{DNN}的复兴上起到了关键的、历史性的作用，它使研究者首次可以训练不含诸如\\gls{convolution}或者\\gls{recurrence}这类特殊结构的深度\\gls{supervised}网络。\n我们将这一过程称为\\firstgls{unsupervised_pretraining}，或者更精确地，\\firstgls{greedy_layer_wise_unsupervised_pretraining}。\n此过程是一个任务（\\gls{unsupervised_learning}，尝试获取输入分布的形状）的表示如何有助于另一个任务（具有相同输入域的\\gls{supervised_learning}）的典型示例。\n% 519 mid\n\n\n\\gls{greedy_layer_wise_unsupervised_pretraining}依赖于单层\\gls{representation_learning}算法，例如~\\glssymbol{RBM}、单层\\gls{AE}、\\gls{sparse_coding}模型或其他学习\\gls{latent}表示的模型。\n每一层使用\\gls{unsupervised_learning}\\gls{pretraining}，将前一层的输出作为输入，输出数据的新的表示。\n这个新的表示的分布（或者是和其他变量比如要预测类别的关系）有可能是更简单的。\n如\\algref{alg:pretraining}所示的正式表述。\n\n\\begin{algorithm}\n\\caption{ {\\em \\gls{greedy_layer_wise_unsupervised_pretraining}的协定}\\\\\n给定如下：无监督特征学习算法$\\CalL$，$\\CalL$使用训练集样本并返回\\gls{encoder}或特征函数$f$。\n原始输入数据是$\\MX$，每行一个样本，并且$f^{(1)}(\\MX)$是第一阶段\\gls{encoder}关于$\\MX$的输出。\n在执行\\gls{fine_tune}的情况下，我们使用学习者$\\CalT$，并使用初始函数$f$，输入样本$\\MX$（以及在监督\\gls{fine_tune}情况下关联的目标$\\MY$），并返回细调好函数。 阶段数为$m$。\n}\n\\label{alg:pretraining}\n\\begin{algorithmic}\n\\STATE $f \\leftarrow$ 恒等函数\n\\STATE $\\tilde{\\MX} = \\MX$\n\\FOR {$k=1, \\ldots, m$}\n  \\STATE $f^{(k)} = {\\CalL}(\\tilde{\\MX})$\n  \\STATE $f \\leftarrow f^{(k)} \\circ f$\n  \\STATE $\\tilde{\\MX} \\leftarrow f^{(k)}(\\tilde{\\MX})$\n\\ENDFOR\n\\IF {\\em fine-tuning}\n  \\STATE $f \\leftarrow {\\CalT}(f,\\MX,\\MY)$\n\\ENDIF\n\\STATE {\\bf Return} $f$\n\\end{algorithmic}\n\\end{algorithm}\n% 521 head\n\n\n基于\\gls{unsupervised}标准的贪心逐层训练过程，早已被用来规避\\gls{supervised}问题中\\gls{DNN}难以联合训练多层的问题。\n这种方法至少可以追溯神经认知机~\\citep{Fukushima75}。\n深度学习的复兴始于2006年，源于发现这种贪心学习过程能够为多层联合训练过程找到一个好的初始值，甚至可以成功训练全连接的结构~\\citep{Hinton06-small,Hinton-Science2006,HintonG2006,Bengio-nips-2006,ranzato-07-small}。\n在此发现之前，只有深度卷积网络或深度循环网络这类特殊结构的深度网络被认为是有可能训练的。\n现在我们知道训练具有全连接的深度结构时，不再需要使用\\gls{greedy_layer_wise_unsupervised_pretraining}，但\\gls{unsupervised}\\gls{pretraining}是第一个成功的方法。\n\n% 519 end\n\n\\gls{greedy_layer_wise_unsupervised_pretraining}被称为\\firstgls{greedy}的，是因为它是一个\\firstgls{greedy_algorithm}，\n这意味着它独立地优化解决方案的每一个部分，每一步解决一个部分，而不是联合优化所有部分。\n它被称为\\firstgls{layer_wise}，是因为这些独立的解决方案是网络层。\n具体地，\\gls{greedy_layer_wise_unsupervised_pretraining}每次处理一层网络，训练第$k$层时保持前面的网络层不变。\n特别地，低层网络（最先训练的）不会在引入高层网络后进行调整。\n它被称为\\firstgls{unsupervised}的，是因为每一层用\\gls{unsupervised}\\gls{representation_learning}算法训练。\n然而，它也被称为\\firstgls{pretraining}，是因为它只是在联合训练算法\\firstgls{fine_tune}所有层之前的第一步。\n在\\gls{supervised_learning}任务中，它可以被看作是\\gls{regularizer}（在一些实验中，\\gls{pretraining}不能降低训练误差，但能降低测试误差）和参数初始化的一种形式。\n\n% 520 head\n\n通常而言，``\\gls{pretraining}''不仅单指\\gls{pretraining}阶段，也指结合\\gls{pretraining}和\\gls{supervised_learning}的两阶段学习过程。\n\\gls{supervised_learning}阶段可能会使用\\gls{pretraining}阶段得到的顶层特征训练一个简单分类器，或者可能会对\\gls{pretraining}阶段得到的整个网络进行\\gls{supervised}\\gls{fine_tune}。\n不管采用什么类型的\\gls{supervised_learning}算法和模型，在大多数情况下，整个训练过程几乎是相同的。\n虽然\\gls{unsupervised_learning}算法的选择将明显影响到细节，但是大多数\\gls{unsupervised_pretraining}应用都遵循这一基本方法。\n% 520 mid\n\n\n\\gls{greedy_layer_wise_unsupervised_pretraining}也能用作其他\\gls{unsupervised_learning}算法的初始化，比如深度\\gls{AE}~\\citep{Hinton-Science2006}和具有很多\\gls{latent_variable}层的概率模型。\n这些\\gls{model}包括\\gls{DBN}~\\citep{Hinton06-small}和\\gls{DBM}~\\citep{SalHinton09}。\n这些\\gls{DGM}会在\\chapref{chap:deep_generative_models}中讨论。\n% 520 mid\n\n\n正如\\secref{sec:supervised_pretraining}所探讨的，我们也可以进行\\gls{greedy}逐层\\emph{\\gls{supervised}}\\gls{pretraining}。\n这是建立在训练浅层模型比\\gls{deep_model}更容易的前提下，而该前提似乎在一些情况下已被证实~\\citep{Erhan+al-2010-small}。\n\n% 520 end\n\n\\subsection{何时以及为何\\glsentrytext{unsupervised_pretraining}有效？}\n\\label{sec:when_and_why_does_unsupervised_pretraining_work}\n\n% 520 end\n\n在很多分类任务中，\\gls{greedy_layer_wise_unsupervised_pretraining}能够在\\gls{test_error}上获得重大提升。\n这一观察结果始于2006年对\\gls{DNN}的重新关注~\\citep{Hinton06-small,Bengio-nips-2006,ranzato-07-small}。\n然而，在很多其他问题上，\\gls{unsupervised}\\gls{pretraining}不能带来改善，甚至还会带来明显的负面影响。\n\\cite{Ma-et-al-2015}研究了\\gls{pretraining}对\\gls{ML_model}在化学活性预测上的影响。\n结果发现，平均而言\\gls{pretraining}是有轻微负面影响的，但在有些问题上会有显著帮助。\n由于\\gls{unsupervised_pretraining}有时有效，但经常也会带来负面效果，因此很有必要了解它何时有效以及有效的原因，以确定它是否适合用于特定的任务。\n\n% 521 mid\n\n\n首先，要注意的是这个讨论大部分都是针对\\gls{greedy_unsupervised_pretraining}而言。\n还有很多其他完全不同的方法使用\\gls{semi_supervised_learning}来训练\\gls{NN}，比如\\secref{sec:adversarial_training}介绍的\\gls{virtual_adversarial_training}。\n我们还可以在训练\\gls{supervised_model}的同时训练\\gls{AE}或\\gls{generative_model}。\n这种单阶段方法的例子包括\\gls{discriminative_RBM}~\\citep{Larochelle+Bengio-2008}和梯形网络~\\citep{Rasmus-et-al-arxiv2015}，其中整体目标是两项之和（一个使用\\gls{label}，另一个仅仅使用输入）。\n\n% 521 end\n\n\\gls{unsupervised_pretraining}结合了两种不同的想法。\n第一，它利用了\\gls{DNN}对初始参数的选择，可以对模型有着显著的\\gls{regularization}效果（在较小程度上，可以改进优化）的想法。\n第二，它利用了更一般的想法——学习\\gls{input_distribution}有助于学习从\\gls{input}到\\gls{output}的映射。\n\n% 522 head\n\n这两个想法都涉及到\\gls{ML}算法中多个未能完全理解的部分之间复杂的相互作用。\n\n% 522 mid\n第一个想法，即\\gls{DNN}初始参数的选择对其性能具有很强的\\gls{regularization}效果，很少有关于这个想法的理解。\n在\\gls{pretraining}变得流行时，在一个位置初始化模型被认为会使其接近某一个\\gls{local_minimum}，而不是另一个\\gls{local_minimum}。%?? 难以理解\n如今，\\gls{local_minima}不再被认为是\\gls{NN}优化中的严重问题。\n现在我们知道标准的\\gls{NN}训练过程通常不会到达任何形式的\\gls{critical_points}。\n仍然可能的是，\\gls{pretraining}会初始化模型到一个可能不会到达的位置——例如，某种区域，其中\\gls{cost_function}从一个样本点到另一个样本点变化很大，而\\gls{minibatch}只能提供\\gls{noise}严重的梯度估计，或是某种区域中的~\\gls{hessian}~矩阵条件数是病态的，\\gls{GD}必须使用非常小的步长。\n然而，我们很难准确判断\\gls{supervised_learning}期间\\gls{pretraining}参数的哪些部分应该保留。\n这是现代方法通常同时使用\\gls{unsupervised_learning}和\\gls{supervised_learning}，而不是依序使用两个学习阶段的原因之一。\n除了这些复杂的方法可以让\\gls{supervised_learning}阶段保持\\gls{unsupervised_learning}阶段提取的信息之外，还有一种简单的方法，固定\\gls{feature_extractor}的参数，仅仅将\\gls{supervised_learning}作为顶层学成特征的分类器。\n\n% 522 mid\n\n另一个想法有更好的理解，即学习算法可以使用\\gls{unsupervised}阶段学习的信息，在\\gls{supervised_learning}的阶段表现得更好。\n其基本想法是对于\\gls{unsupervised}任务有用的一些特征对于\\gls{supervised_learning}任务也可能是有用的。\n例如，如果我们训练汽车和摩托车图像的\\gls{generative_model}，它需要知道轮子的概念，以及一张图中应该有多少个轮子。\n如果我们幸运的话，\\gls{unsupervised}阶段学习的轮子表示会适合于\\gls{supervised_learning}。\n然而我们还未能从数学、理论层面上证明，因此并不总是能够预测哪种任务能以这种形式从\\gls{unsupervised_learning}中受益。\n这种方法的许多方面高度依赖于具体使用的模型。\n例如，如果我们希望在\\gls{pretraining}特征的顶层添加\\gls{linear_classifier}，那么（学习到的）特征必须使潜在的类别是线性\\gls{separable}。%??    学习到的， 译者加， 便于理解\n这些性质通常会在\\gls{unsupervised_learning}阶段自然发生，但也并非总是如此。\n这是另一个\\gls{supervised}和\\gls{unsupervised_learning}同时训练更可取的原因——输出层施加的约束很自然地从一开始就包括在内。\n\n% 523 head\n\n从\\gls{unsupervised_pretraining}作为学习一个表示的角度来看，我们可以期望\\gls{unsupervised_pretraining}在初始表示较差的情况下更有效。\n一个重要的例子是\\gls{word_embeddings}。\n使用~\\gls{one_hot}~向量表示的词并不具有很多信息，因为任意两个不同的~\\gls{one_hot}~向量之间的距离（平方$L^2$距离都是$2$ )都是相同的。\n\\gls{learned}的\\gls{word_embeddings}自然会用它们彼此之间的距离来编码词之间的相似性。\n因此，\\gls{unsupervised_pretraining}在处理单词时特别有用。\n然而在处理图像时是不太有用的，可能是因为图像已经在一个很丰富的向量空间中，其中的距离只能提供低质量的相似性度量。\n\n% 523 mid\n\n从\\gls{unsupervised_pretraining}作为\\gls{regularizer}的角度来看，我们可以期望\\gls{unsupervised_pretraining}在\\gls{labeled}样本数量非常小时很有帮助。\n因为\\gls{unsupervised_pretraining}添加的信息来源于\\gls{unlabeled}数据，所以当\\gls{unlabeled}样本的数量非常大时，我们也可以期望\\gls{unsupervised_pretraining}的效果最好。\n\\gls{unsupervised_pretraining}的大量\\gls{unlabeled}样本和少量\\gls{labeled}样本构成的\\gls{semi_supervised_learning}的优势特别明显。\n在2011年，\\gls{unsupervised_pretraining}赢得了两个国际\\gls{transfer_learning}比赛~\\citep{UTLC+LISA-2011-small,goodfellow+all-NIPS2011}。\n在该情景中，目标任务中\\gls{labeled}样本的数目很少（每类几个到几十个）。\n这些效果也出现在被~\\citet{paine2014analysis}严格控制的实验中。\n\n% 523 mid\n\n还可能涉及到一些其他的因素。\n例如，当我们要学习的函数非常复杂时，\\gls{unsupervised_pretraining}可能会非常有用。\n\\gls{unsupervised_learning}不同于\\gls{weight_decay}这样的\\gls{regularizer}，它不偏向于学习一个简单的函数，而是学习对\\gls{unsupervised_learning}任务有用的特征函数。\n如果真实的潜在函数是复杂的，并且由\\gls{input_distribution}的规律塑造，那么\\gls{unsupervised_learning}更适合作为\\gls{regularizer}。\n\n% 523 end\n\n除了这些注意事项外，我们现在分析一些\\gls{unsupervised_pretraining}改善性能的成功示例，并解释这种改进发生的已知原因。\n\\gls{unsupervised_pretraining}通常用来改进分类器，并且从减少\\gls{test_set}误差的观点来看是很有意思的。\n然而，\\gls{unsupervised_pretraining}还有助于分类以外的任务，并且可以用于改进优化，而不仅仅只是作为\\gls{regularizer}。\n例如，它可以提高\\gls{DAE}的训练和测试\\gls{reconstruction_error}~\\citep{Hinton-Science2006}。\n\n% 524 head\n\n\\cite{Erhan+al-2010-small}进行了许多实验来解释\\gls{unsupervised_pretraining}的几个成功原因。\n对\\gls{training_error}和\\gls{test_error}的改进都可以解释为，\\gls{unsupervised_pretraining}将参数引入到了其他方法可能探索不到的区域。\n\\gls{NN}训练是非确定性的，并且每次运行都会收敛到不同的函数。\n训练可以停止在梯度很小的点；也可以\\gls{early_stopping}结束训练，以防\\gls{overfitting}；\n还可以停止在梯度很大，但由于诸如随机性或~\\gls{hessian}~矩阵\\gls{poor_conditioning}等问题难以找到合适下降方向的点。\n经过\\gls{unsupervised_pretraining}的神经网络会一致地停止在一片相同的函数空间区域，但未经过\\gls{pretraining}的\\gls{NN}会一致地停在另一个区域。\n\\figref{fig:chap15_isomap}可视化了这种现象。\n经过\\gls{pretraining}的网络到达的区域是较小的，这表明\\gls{pretraining}减少了估计过程的方差，这进而又可以降低严重\\gls{overfitting}的风险。\n换言之，\\gls{unsupervised_pretraining}将\\gls{NN}参数初始化到它们不易逃逸的区域，并且遵循这种初始化的结果更加一致，和没有这种初始化相比，结果很差的可能性更低。\n\n% 524 mid\n\n\\cite{Erhan+al-2010-small}也回答了\\emph{何时}\\gls{pretraining}效果最好——预训练的网络越深，\\gls{test_error}的均值和方差下降得越多。\n值得注意的是，这些实验是在训练非常深层网络的现代方法发明和流行（\\gls{ReLU}，\\gls{dropout}~和\\gls{batch_normalization}）之前进行的，因此对于\\gls{unsupervised_pretraining}与当前方法的结合，我们所知甚少。\n\n% 524 mid\n\n\n一个重要的问题是\\gls{unsupervised_pretraining}是如何起到\\gls{regularizer}作用的。\n一个假设是，\\gls{pretraining}鼓励学习算法发现那些与生成观察数据的潜在原因相关的特征。\n这也是启发除\\gls{unsupervised_pretraining}之外许多其他算法的重要思想，将会在\\secref{sec:semi_supervised_disentangling_of_causal_factors}中进一步讨论。\n\n% 524 mid  \n\n\n与\\gls{unsupervised_learning}的其他形式相比，\\gls{unsupervised_pretraining}的缺点是其使用了两个单独的训练阶段。\n很多\\gls{regularization}技术都具有一个优点，允许用户通过调整单一\\gls{hyperparameter}的值来控制\\gls{regularization}的强度。\n\\gls{unsupervised_pretraining}没有一种明确的方法来调整\\gls{unsupervised}阶段\\gls{regularization}的强度。\n相反，\\gls{unsupervised_pretraining}有许多\\gls{hyperparameter}，但其效果只能之后度量，通常难以提前预测。\n当我们同时执行\\gls{unsupervised}和\\gls{supervised_learning}而不使用\\gls{pretraining}策略时，会有单个\\gls{hyperparameter}（通常是附加到\\gls{unsupervised}\\gls{cost}的系数）控制\\gls{unsupervised}\\gls{objective}\\gls{regularize}\\gls{supervised}模型的强度。\n减少该系数，总是能够可预测地获得较少\\gls{regularization}强度。\n在\\gls{unsupervised_pretraining}的情况下，没有一种灵活调整\\gls{regularization}强度的方式——要么\\gls{supervised}模型初始化为\\gls{pretraining}的参数，要么不是。\n\n% 525 end\n\n% 525 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/isomap_color}}\n\\fi\n\\caption{在\\emph{函数空间}（并非参数空间，避免从参数向量到函数的多对一映射）不同神经网络的学习轨迹的非线性映射的可视化。\n不同网络采用不同的随机初始化，并且有的使用了\\gls{unsupervised_pretraining}，有的没有。\n每个点对应着训练过程中一个特定时间的神经网络。\n经\\citet{Erhan+al-2010-small}许可改编此图。\n函数空间中的坐标是关于每组输入$\\Vx$和它的一个输出$\\Vy$的\\gls{infinite}维向量。\n\\cite{Erhan+al-2010-small}将很多特定$\\Vx$的$\\Vy$连接起来，线性投影到高维空间中。\n然后他们使用~\\gls{isomap}~\\citep{Tenenbaum2000-isomap}进行进一步的非线性投影并投到二维空间。\n颜色表示时间。\n所有的网络初始化在上图的中心点附近（对应的函数区域在不多数输入上具有近似\\gls{uniform_distribution}的类别$y$）。\n随着时间推移，学习将函数向外移动到预测得更好的点。\n当使用\\gls{pretraining}时，训练会一致地收敛到同一个区域；\n而不使用\\gls{pretraining}时，训练会收敛到另一个不重叠的区域。\n\\gls{isomap}~试图维持全局相对距离（体积因此也保持不变），因此使用\\gls{pretraining}的模型对应的较小区域意味着，基于\\gls{pretraining}的\\gls{estimator}具有较小的方差。\n}\n\\label{fig:chap15_isomap}\n\\end{figure}\n\n% 525 head\n\n% 525 end \n\n具有两个单独的训练阶段的另一个缺点是每个阶段都具有各自的\\gls{hyperparameter}。\n第二阶段的性能通常不能在第一阶段期间预测，因此在第一阶段提出\\gls{hyperparameter}和第二阶段根据反馈来更新之间存在较长的延迟。\n最通用的方法是在\\gls{supervised}阶段使用\\gls{validation_set}上的误差来挑选\\gls{pretraining}阶段的\\gls{hyperparameter}，如~\\cite{Larochelle-jmlr-2009}中讨论的。\n在实际中，有些\\gls{hyperparameter}，如\\gls{pretraining}迭代的次数，很方便在\\gls{pretraining}阶段设定，通过\\gls{unsupervised}目标上使用\\gls{early_stopping}策略完成。\n这个策略并不理想，但是在计算上比使用\\gls{supervised}目标代价小得多。\n\n% 526 head\n\n如今，大部分算法已经不使用\\gls{unsupervised_pretraining}了，除了在\\gls{NLP}领域中单词作为~\\gls{one_hot}~向量的自然表示不能传达相似性信息，并且有非常多的\\gls{unlabeled}数据集可用。\n在这种情况下，\\gls{pretraining}的优点是可以对一个巨大的\\gls{unlabeled}集合（例如用包含数十亿单词的语料库）进行\\gls{pretraining}，学习良好的表示（通常是单词，但也可以是句子），然后使用该表示或\\gls{fine_tune}它，使其适合于训练集样本大幅减少的\\gls{supervised}任务。\n这种方法由~\\cite{CollobertR2008-small}、\\cite{Turian+Ratinov+Bengio-2010-small}和~\\cite{collobert2011natural}开创，至今仍在使用。\n\n% 526 mid\n\n\n基于\\gls{supervised_learning}的\\gls{DL}技术，通过~\\gls{dropout}~或\\gls{batch_normalization}来\\gls{regularize}，能够在很多任务上达到人类级别的性能，但仅仅是在极大的\\gls{labeled}数据集上。\n在中等大小的数据集（例如~\\ENNAME{CIFAR}-10和~\\ENNAME{MNIST}，每个类大约有5,000个\\gls{labeled}样本）上，这些技术的效果比\\gls{unsupervised_pretraining}更好。\n在极小的数据集，例如\\gls{alternative_splicing_dataset}，贝叶斯方法要优于基于\\gls{unsupervised_pretraining}的方法~\\citep{Srivastava-master-small}。\n由于这些原因，\\gls{unsupervised_pretraining}已经不如以前流行。\n然而，\\gls{unsupervised_pretraining}仍然是\\gls{DL}研究历史上的一个重要里程碑，并将继续影响当代方法。\n\\gls{pretraining}的想法已经推广到\\firstgls{supervised_pretraining}，这将在\\secref{sec:supervised_pretraining}中讨论，在\\gls{transfer_learning}中这是非常常用的方法。\n\\gls{transfer_learning}中的\\gls{supervised_pretraining}流行~\\citep{Oquab-et-al-CVPR2014,yosinski-nips2014}于在~\\ENNAME{ImageNet}~数据集上使用\\gls{convolutional_network}\\gls{pretraining}。\n由于这个原因，实践者们公布了这些网络训练出的参数，就像自然语言任务公布\\gls{pretraining}的单词向量一样~\\citep{collobert2011natural,Mikolov-et-al-ICLR2013}。\n\n% 526 end\n\n\\section{\\glsentrytext{transfer_learning}和\\glsentrytext{domain_adaption}}\n\\label{sec:transfer_learning_and_domain_adaptation}\n\\gls{transfer_learning}和\\gls{domain_adaption}指的是利用一个情景（例如，分布$P_1$）中已经学到的内容去改善另一个情景（比如分布$P_2$）中的\\gls{generalization}情况。\n这点概括了上一节提出的想法，即在\\gls{unsupervised_learning}任务和\\gls{supervised_learning}任务之间转移表示。\n\n%527 head\n\n在\\firstgls{transfer_learning}中，\\gls{learner}必须执行两个或更多个不同的任务，但是我们假设能够解释$P_1$变化的许多因素和学习$P_2$需要抓住的变化相关。\n这通常能够在\\gls{supervised_learning}中解释，输入是相同的，但是输出不同的性质。\n例如，我们可能在第一种情景中学习了一组视觉类别，比如猫和狗，然后在第二种情景中学习一组不同的视觉类别，比如蚂蚁和黄蜂。\n如果第一种情景（从$P_1$采样）中具有非常多的数据，那么这有助于学习到能够使得从$P_2$抽取的非常少样本中快速\\gls{generalize}的表示。%??\n许多视觉类别\\emph{共享}一些低级概念，比如边缘、视觉形状、几何变化、光照变化的影响等等。\n一般而言，当存在对不同情景或任务有用特征时，并且这些特征对应多个情景出现的潜在因素，\\gls{transfer_learning}、\\gls{multitask_learning}（\\secref{sec:multitask_learning}）和\\gls{domain_adaption}可以使用\\gls{representation_learning}来实现。\n如\\figref{fig:chap7_multi_factor_output}所示，这是具有共享底层和任务相关上层的学习框架。\n\n% 527 mid\n\n然而，有时不同任务之间共享的不是输入的语义，而是输出的语义。\n例如，\\gls{SR}系统需要在输出层产生有效的句子，但是输入附近的较低层可能需要识别相同\\gls{phoneme}或子\\gls{phoneme}发音的非常不同的版本（这取决于说话人）。\n在这样的情况下，共享神经网络的上层（输出附近）和进行任务特定的预处理是有意义的，如\\figref{fig:chap15_multi_task_input}所示。\n\n% 527 mid\n\n% 528 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/multi_task_input}}\n\\fi\n\\caption{\\gls{multitask_learning}或者\\gls{transfer_learning}的架构示例。\n输出变量$\\RVy$在所有的任务上具有相同的语义；输入变量$\\RVx$在每个任务（或者，比如每个用户）上具有不同的意义（甚至可能具有不同的维度），图上三个任务为$\\RVx^{(1)}$，$\\RVx^{(2)}$，$\\RVx^{(3)}$。\n底层结构（决定了选择方向）是面向任务的，上层结构是共享的。\n底层结构学习将面向特定任务的输入转化为通用特征。\n}\n\\label{fig:chap15_multi_task_input}\n\\end{figure}\n\n% 528 head\n\n在\\firstgls{domain_adaption}的相关情况下，在每个情景之间任务（和最优的输入到输出的映射）都是相同的，但是\\gls{input_distribution}稍有不同。 \n例如，考虑情感分析的任务，如判断一条评论是表达积极的还是消极的情绪。 \n网上的评论有许多类别。\n在书、视频和音乐等媒体内容上训练的顾客评论情感预测器，被用于分析诸如电视机或智能电话的消费电子产品的评论时，\\gls{domain_adaption}情景可能会出现。%?? \n可以想象，存在一个潜在的函数可以判断任何语句是正面的、中性的还是负面的，但是词汇和风格可能会因领域而有差异，使得跨域的\\gls{generalize}训练变得更加困难。\n简单的\\gls{unsupervised_pretraining}（\\gls{DAE}）已经能够非常成功地用于\\gls{domain_adaption}的情感分析\\citep{Glorot+al-ICML-2011}。\n% 527 end \n\n% 528 head\n\n一个相关的问题是\\firstgls{concept_drift}，我们可以将其视为一种\\gls{transfer_learning}，因为数据分布随时间而逐渐变化。\n\\gls{concept_drift}和\\gls{transfer_learning}都可以被视为\\gls{multitask_learning}的特定形式。\n``\\gls{multitask_learning}''这个术语通常指\\gls{supervised_learning}任务，而更广义的\\gls{transfer_learning}的概念也适用于\\gls{unsupervised_learning}和\\gls{RL}。\n\n% 528 mid\n\n在所有这些情况下，我们的目标是利用第一个\\gls{setting}下的数据，提取那些在第二种\\gls{setting}中学习时或直接进行预测时可能有用的信息。\n\\gls{representation_learning}的核心思想是相同的表示可能在两种\\gls{setting}中都是有用的。\n两个\\gls{setting}使用相同的表示，使得表示可以受益于两个任务的训练数据。\n\n% 528 end\n\n如前所述，\\gls{transfer_learning}中\\gls{unsupervised}\\gls{DL}已经在一些\\gls{ML}比赛中取得了成功~\\citep{UTLC+LISA-2011-small,goodfellow+all-NIPS2011}。\n这些比赛中的某一个实验配置如下。\n首先每个参与者获得一个第一种\\gls{setting}（来自分布$P_1$）的数据集，其中含有一些类别的样本。\n参与者必须使用这个来学习一个良好的特征空间（将原始输入映射到某种表示），使得当我们将这个\\gls{learned}变换用于来自迁移\\gls{setting}（分布$P_2$）的输入时，\\gls{linear_classifier}可以在很少\\gls{labeled}样本上训练、并\\gls{generalize}得很好。\n这个比赛中最引人注目的结果之一是，学习表示的网络架构越深（在第一个\\gls{setting}$P_1$中的数据使用纯\\gls{unsupervised}方式学习），在第二个\\gls{setting}（迁移）$P_2$的新类别上学习到的曲线就越好。\n对于深度表示而言，迁移任务只需要少量\\gls{labeled}样本就能显著地提升\\gls{generalization}性能。\n\n% 529 head\n\n\\gls{transfer_learning}的两种极端形式是\\firstgls{one_shot_learning}和\\firstgls{zero_shot_learning}，有时也被称为\\firstgls{zero_data_learning}。\n只有一个\\gls{labeled}样本的迁移任务被称为\\gls{one_shot_learning}；没有\\gls{labeled}样本的迁移任务被称为\\gls{zero_shot_learning}。\n\n% 529 mid\n\n因为第一阶段学习出的表示就可以清楚地分离出潜在的类别，所以\\gls{one_shot_learning}~\\citep{Fei-Fei+al-2006}是可能的。\n在\\gls{transfer_learning}阶段，仅需要一个\\gls{labeled}样本来推断表示空间中聚集在相同点周围许多可能测试样本的\\gls{label}。\n这使得在\\gls{learned}的表示空间中，对应于不变性的变化因子已经与其他因子完全分离，在区分某些类别的对象时，我们可以学习到哪些因素具有决定意义。\n\n% 529 mid\n\n考虑一个\\gls{zero_shot_learning}\\gls{setting}的例子，\\gls{learner}已经读取了大量文本，然后要解决\\gls{object_recognition}的问题。\n如果文本足够好地描述了对象，那么即使没有看到某对象的图像，也能识别出该对象的类别。\n例如，已知猫有四条腿和尖尖的耳朵，那么\\gls{learner}可以在没有见过猫的情况下猜测该图像中是猫。\n\n% 529 end\n\n\n只有在训练时使用了额外信息，\\gls{zero_data_learning}~\\citep{Larochelle2008}和\\gls{zero_shot_learning}~\\citep{Palatucci2009,Socher-2013}才是有可能的。\n我们可以认为\\gls{zero_data_learning}场景包含三个随机变量：传统输入$\\Vx$，传统输出或目标$\\Vy$，以及描述任务的附加随机变量$T$。\n该模型被训练来估计条件分布$p(\\Vy \\mid \\Vx, T)$，其中$T$是我们希望执行的任务的描述。\n在我们的例子中，读取猫的文本信息然后识别猫，输出是二元变量$y$，$y=1$表示``是''，$y=0$表示``不是''。\n任务变量$T$表示要回答的问题，例如``这个图像中是否有猫？''\n如果训练集包含和$T$在相同空间的\\gls{unsupervised}对象样本，我们也许能够推断未知的$T$实例的含义。\n在我们的例子中，没有提前看到猫的图像而去识别猫，所以拥有一些\\gls{unlabeled}文本数据包含句子诸如``猫有四条腿''或``猫有尖耳朵''，对于学习非常有帮助。\n\n% 530  head\n\n\\gls{zero_shot_learning}要求$T$被表示为某种形式的\\gls{generalization}。\n例如，$T$不能仅是指示对象类别的\\gls{one_hot}编码。\n通过使用每个类别词的\\gls{word_embeddings}表示，\\cite{Socher-2013}提出了对象类别的\\gls{distributed_representation}。\n\n% 530 mid\n\n我们还可以在\\gls{machine_translation}中发现一种类似的现象~\\citep{Klementiev-et-al-COLING2012,Mikolov-et-al-arxiv2013,Gouws-et-al-arxiv2014}：我们已经知道一种语言中的单词，还可以学到单一语言语料库中词与词之间的关系；另一方面，我们已经翻译了一种语言中的单词与另一种语言中的单词相关的句子。\n即使我们可能没有将语言$X$中的单词$A$翻译成语言$Y$中的单词$B$的\\gls{labeled}样本，我们也可以\\gls{generalize}并猜出单词$A$的翻译，这是由于我们已经学习了语言$X$和$Y$单词的\\gls{distributed_representation}，并且通过两种语言句子的匹配对组成的训练样本，产生了关联于两个空间的链接（可能是双向的）。\n如果联合学习三种成分（两种表示形式和它们之间的关系），那么这种迁移将会非常成功。\n\n% 530 mid\n\n\\gls{zero_shot_learning}是\\gls{transfer_learning}的一种特殊形式。\n同样的原理可以解释如何能执行\\firstgls{multimodal_learning}，学习两种\\gls{modality}的表示，和一种\\gls{modality}中的观察结果$\\Vx$与另一种\\gls{modality}中的观察结果$\\Vy$组成的对$(\\Vx, \\Vy)$之间的关系（通常是一个联合分布）\\citep{Srivastava+Salakhutdinov-NIPS2012-small}。\n通过学习所有的三组参数（从$\\Vx$到它的表示、从$\\Vy$到它的表示，以及两个表示之间的关系），一个表示中的概念被锚定在另一个表示中，反之亦然，从而可以有效地推广到新的对组。 %?? allowing one \n这个过程如\\figref{fig:chap15_maps_between_representations}所示。\n\n% 530 end\n\n% 531\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/maps_between_representations}}\n\\fi\n\\caption{两个域$\\Vx$和$\\Vy$之间的\\gls{transfer_learning}能够进行\\gls{zero_shot_learning}。\n\\gls{labeled}或\\gls{unlabeled}样本$\\Vx$可以学习表示函数$f_{\\Vx}$。\n同样地，样本$\\Vy$也可以学习表示函数$f_{\\Vy}$。\n上图中$f_{\\Vx}$和$f_{\\Vy}$旁都有一个向上的箭头，不同的箭头表示不同的作用函数。\n并且箭头的类型表示使用了哪一种函数。\n$\\Vh_{\\Vx}$空间中的相似性度量表示$\\Vx$空间中任意点对之间的距离，这种度量方式比直接度量$\\Vx$空间的距离更好。\n同样地，$\\Vh_{\\Vy}$空间中的相似性度量表示$\\Vy$空间中任意点对之间的距离。\n这两种相似函数都使用带点的双向箭头表示。\n\\gls{labeled}样本（水平虚线）$(\\Vx, \\Vy)$能够学习表示$f_{\\Vx}(\\Vx)$和表示$f_{\\Vy}(\\Vy)$之间的单向或双向映射（实双向箭头），以及这些表示之间如何锚定。\n\\gls{zero_data_learning}可以通过以下方法实现。\n像$\\Vx_{\\text{test}}$可以和单词$\\Vy_{\\text{test}}$关联起来，即使该单词没有像，仅仅是因为单词表示$f_{\\Vy}(\\Vy_{\\text{test}})$和像表示$f_{\\Vx}(\\Vx_{\\text{test}})$可以通过表示空间的映射彼此关联。\n这种方法有效的原因是，尽管像和单词没有匹配成队，但是它们各自的特征向量$f_{\\Vx}(\\Vx_{\\text{test}})$和$f_{\\Vy}(\\Vy_{\\text{test}})$互相关联。\n上图受~\\ENNAME{Hrant Khachatrian}~的建议启发。\n}\n\\label{fig:chap15_maps_between_representations}\n\\end{figure}\n\n% 531\n\n\\section{\\glsentrytext{semi_supervised}解释因果关系}\n\\label{sec:semi_supervised_disentangling_of_causal_factors}\n\n% 532 head\n\n\\gls{representation_learning}的一个重要问题是``什么原因能够使一个表示比另一个表示更好？''\n一种假设是，理想表示中的特征对应到观测数据的\\gls{underlying_cause}，特征空间中不同的特征或方向对应着不同的原因，从而表示能够区分这些原因。\n这个假设促使我们去寻找表示$p(\\Vx)$的更好方法。\n如果$\\Vy$是$\\Vx$的重要成因之一，那么这种表示也可能是计算$p(\\Vy \\mid \\Vx)$的一种良好表示。\n从20世纪90年代以来，这个想法已经指导了大量的\\gls{DL}研究工作~\\citep{Becker92,hinton1999unsupervised}。\n关于\\gls{semi_supervised_learning}可以超过纯\\gls{supervised_learning}的其他论点，请读者参考\\cite{Chapelle-2006}的第1.2节。\n\n% 532 head\n\n在\\gls{representation_learning}的其他方法中，我们大多关注易于建模的表示——例如，数据稀疏或是各项之间相互独立的情况。\n能够清楚地分离出潜在因素的表示可能并不一定易于建模。\n然而，该假设促使\\gls{semi_supervised_learning}使用\\gls{unsupervised}\\gls{representation_learning}的一个更深层原因是，对于很多\\gls{AI}任务而言，有两个相随的特点：一旦我们能够获得观察结果基本成因的解释，那么将会很容易分离出个体属性。\n具体来说，如果表示向量$\\Vh$表示观察值$\\Vx$的很多潜在因素，并且输出向量$\\Vy$是最为重要的原因之一，那么从$\\Vh$预测$\\Vy$会很容易。\n\n% 532 mid \n\n首先，让我们看看$p(\\RVx)$的\\gls{unsupervised_learning}无助于学习$p(\\RVy\\mid\\RVx)$时，\\gls{semi_supervised_learning}为何失败。\n例如，考虑一种情况，$p(\\RVx)$是均匀分布的，我们希望学习$f(\\Vx) = \\SetE[\\RVy \\mid \\Vx]$。\n显然，仅仅观察\\gls{training_set}的值$\\Vx$不能给我们关于$p(\\RVy \\mid \\RVx)$的任何信息。\n\n% 532 mid \n\n接下来，让我们看看\\gls{semi_supervised_learning}成功的一个简单例子。\n考虑这样的情况，$\\RVx$来自一个混合分布，每个$\\RVy$值具有一个混合分量，如\\figref{fig:chap15_mixture_model}所示。\n如果混合分量很好地分出来了，那么建模$p(\\RVx)$可以精确地指出每个分量的位置，每个类一个\\gls{labeled}样本的\\gls{training_set}足以精确学习$p(\\RVy \\mid \\RVx)$。\n但是更一般地，什么能将$p(\\RVy \\mid \\RVx)$和$p(\\RVx)$关联在一起呢？\n\n% 532 mid-end\n\n% 533 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/mixture_model_color}}\n\\fi\n\\caption{混合模型。具有三个混合分量的$x$上混合密度示例。\n混合分量的内在本质是潜在\\gls{explanatory_factor}$y$。\n因为混合分量（例如，图像数据中的自然对象类别）在统计学上是显著的，所以仅仅使用\\gls{unlabeled}样本\\gls{unsupervised}建模$p(x)$也能揭示\\gls{explanatory_factor}$y$。\n}\n\\label{fig:chap15_mixture_model}\n\\end{figure}\n\n% 533 head\n\n\n如果$\\RVy$与$\\RVx$的成因之一非常相关，那么$p(\\RVx)$和$p(\\RVy \\mid \\RVx)$也会紧密关联，试图找到变化\\gls{underlying}因素的\\gls{unsupervised}\\gls{representation_learning}可能像\\gls{semi_supervised_learning}一样有用。\n\n% -- 532 end\n\n% 533 mid\n\n假设$\\RVy$是$\\RVx$的成因之一，让$\\RVh$代表所有这些成因。\n真实的生成过程可以被认为是根据这个\\gls{directed_graphical_model}结构化出来的，其中$\\RVh$是$\\RVx$的父节点：\n\\begin{equation}\n\tp(\\RVh, \\RVx) = p(\\RVx \\mid \\RVh) p(\\RVh).\n\\end{equation} % 533 mid\n因此，数据的边缘概率是\n\\begin{equation}\n\tp(\\Vx) = \\SetE_{\\RVh} p(\\Vx \\mid \\Vh).\n\\end{equation}\n从这个直观的观察中，我们得出结论，$\\RVx$最好可能的模型（从广义的观点）是会表示上述``真实''结构的，其中$\\Vh$作为\\gls{latent_variable}解释$\\Vx$中可观察的变化。\n上文讨论的``理想''的\\gls{representation_learning}应该能够反映出这些\\gls{latent}因子。\n如果$\\RVy$是其中之一（或是紧密关联于其中之一），那么将很容易从这种表示中预测$\\RVy$。\n我们会看到给定$\\RVx$下$\\RVy$的条件分布通过\\gls{bayes_rule}关联到上式中的分量：\n\\begin{equation}\n\tp(\\RVy \\mid \\RVx) = \\frac{ p(\\RVx \\mid \\RVy) p(\\RVy) }{p(\\RVx)}.\n\\end{equation}\n因此边缘概率$p(\\RVx)$和条件概率$p(\\RVy \\mid \\RVx)$密切相关，前者的结构信息应该有助于学习后者。\n因此，在这些假设情况下，\\gls{semi_supervised_learning}应该能提高性能。\n\n% 533 end\n\n关于这个事实的一个重要的研究问题是，大多数观察是由极其大量的\\gls{underlying_cause}形成的。\n假设$\\RVy = \\RSh_i$，但是\\gls{unsupervised}\\gls{learner}并不知道是哪一个$\\RSh_i$。\n对于一个\\gls{unsupervised}\\gls{learner}暴力求解就是学习一种表示，这种表示能够捕获\\emph{所有}合理的重要生成因子$\\RSh_j$，并将它们彼此区分开来，因此不管$\\RSh_i$是否关联于$\\RVy$，从$\\RVh$预测$\\RVy$都是容易的。\n\n% -- 534 head\n\n在实践中，暴力求解是不可行的，因为不可能捕获影响观察的所有或大多数变化因素。\n例如，在视觉场景中，表示是否应该对背景中的所有最小对象进行编码？\n根据一个有据可查的心理学现象，人们不会察觉到环境中和他们所在进行的任务并不立刻相关的变化，具体例子可以参考~\\cite{simons1998failure}。\n\\gls{semi_supervised_learning}的一个重要研究前沿是确定每种情况下要编码\\emph{什么}。\n目前，处理大量\\gls{underlying}原因的两个主要策略是，同时使用\\gls{unsupervised_learning}和\\gls{supervised_learning}信号，从而使得模型捕获最相关的变动因素，或是使用纯\\gls{unsupervised_learning}学习更大规模的表示。\n\n% 534 mid\n\n\\gls{unsupervised_learning}的另一个思路是选择一个更好的确定哪些\\gls{underlying}因素最为关键的定义。\n之前，\\gls{AE}和\\gls{generative_model}被训练来优化一个类似于\\gls{mean_squared_error}的固定标准。\n这些固定标准确定了哪些因素是重要的。\n例如，图像像素的\\gls{mean_squared_error}隐式地指定，一个\\gls{underlying}因素只有在其显著地改变大量像素的亮度时，才是重要影响因素。\n如果我们希望解决的问题涉及到小对象之间的相互作用，那么这将有可能遇到问题。\n如\\figref{fig:chap15_pingpong}所示，在机器人任务中，\\gls{AE}未能学习到编码小乒乓球。\n同样是这个机器人，它可以成功地与更大的对象进行交互（例如棒球，\\gls{mean_squared_error}在这种情况下很显著）。\n\n% 534 mid\n\n% 535 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{cc}\n输入 & 重构 \\\\\n\\includegraphics[width=0.4\\textwidth]{Chapter15/figures/ping_pong_input} &\n\\includegraphics[width=0.4\\textwidth]{Chapter15/figures/ping_pong_reconstruction}\n\\end{tabular}\n\\fi\n\\caption{机器人任务上，基于\\gls{mean_squared_error}训练的\\gls{AE}不能重构乒乓球。\n乒乓球的存在及其所有空间坐标，是生成图像且与机器人任务相关的重要潜在因素。\n不幸的是，\\gls{AE}具有有限的容量，基于\\gls{mean_squared_error}的训练没能将乒乓球作为显著物体识别出来编码。\n以上图像由Chelsea Finn提供。\n}\n\\label{fig:chap15_pingpong}\n\\end{figure}\n\n% 535 head\n\n% 534 end\n\n还有一些其他的显著性的定义。\n例如，如果一组像素具有高度可识别的模式，那么即使该模式不涉及到极端的亮度或暗度，该模式还是会被认为非常显著。\n实现这样一种定义显著的方法是使用最近提出的\\firstgls{generative_adversarial_networks}\\citep{Goodfellow-et-al-NIPS2014-small}。\n在这种方法中，\\gls{generative_model}被训练来愚弄\\gls{feedforward_classifier}。\n\\gls{feedforward_classifier}尝试将来自\\gls{generative_model}的所有样本识别为假的，并将来自\\gls{training_set}的所有样本识别为真的。\n在这个框架中，\\gls{feedforward_network}能够识别出的任何结构化模式都是非常显著的。\n\\gls{generative_adversarial_networks}会在\\secref{sec:generative_adversarial_networks}中更详细地介绍。\n为了叙述方便，知道它能\\emph{学习}出如何决定什么是显著的就可以了。\n\\cite{lotter2015unsupervised}表明，生成人类头部头像的模型在使用\\gls{mean_squared_error}训练时往往会忽视耳朵，但是\\gls{adversarial}式框架学习能够成功地生成耳朵。\n因为耳朵与周围的皮肤相比不是非常明亮或黑暗，所以根据\\gls{mean_squared_error}损失它们不是特别突出，但是它们高度可识别的形状和一致的位置意味着\\gls{feedforward_network}能够轻易地学习出如何检测它们，从而使得它们在\\gls{generative_adversarial_framework}下是高度突出的。\n\\figref{fig:chap15_manface}给了一些样例图片。\n\\gls{generative_adversarial_networks}只是确定应该表示哪些因素的一小步。\n我们期望未来的研究能够发现更好的方式来确定表示哪些因素，并且根据任务来开发表示不同因素的机制。\n\n% -- 535 mid\n\n\n% 536 head\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{ccc}\n真实图 & \\glssymbol{mean_squared_error} & 对抗学习 \\\\\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/PGN_face1_GT} &\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/PGN_face1_MSE} &\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/PGN_face1_AL}\n\\end{tabular}\n\\fi\n\\caption{\n预测生成网络是一个学习哪些特征显著的例子。\n在这个例子中，预测生成网络已被训练成在特定视角预测人头的3D模型。\n\\emph{(左)}真实情况。\n这是一张网络应该生成的正确图片。\n\\emph{(中)}由具有\\gls{mean_squared_error}的预测生成网络生成的图片。\n因为与相邻皮肤相比，耳朵不会引起亮度的极大差异，所以它们的显著性不足以让模型学习表示它们。\n\\emph{(右)}由具有\\gls{mean_squared_error}和对抗损失的模型生成的图片。\n使用这个\\gls{learned}的\\gls{cost_function}，由于耳朵遵循可预测的模式，因此耳朵是显著重要的。\n学习哪些原因对于模型而言是足够重要和相关的，是一个重要的活跃研究领域。\n以上图片由~\\cite{lotter2015unsupervised}提供。\n}\n\\label{fig:chap15_manface}\n\\end{figure}\n% 536 head\n\n\n% 535 head\n\n正如~\\cite{Janzing-et-al-ICML2012}指出，学习\\gls{underlying}因素的好处是，如果真实的生成过程中$\\RVx$是结果，$\\RVy$是原因，那么建模$p(\\RVx \\mid \\RVy)$对于$p(\\RVy)$的变化是鲁棒的。\n如果因果关系被逆转，这是不对的，因为根据\\gls{bayes_rule}，$p(\\RVx \\mid \\RVy)$将会对$p(\\RVy)$的变化十分敏感。\n很多时候，我们考虑分布的变化（由于不同领域、时间不稳定性或任务性质的变化）时，\\emph{因果机制是保持不变的}（``宇宙定律不变''），而\\gls{underlying}因素的边缘分布是会变化的。\n因此，通过学习试图恢复成因向量$\\RVh$和$p(\\RVx \\mid \\RVh)$的\\gls{generative_model}，我们可以期望最后的模型对所有种类的变化有更好的\\gls{generalization}和鲁棒性。\n\n% 536 mid\n\n\\section{\\glsentrytext{distributed_representation}}\n\\label{sec:distributed_representation}\n% 536 end\n\n\\gls{distributed_representation}的概念（由很多元素组合的表示，这些元素之间可以设置成可分离的）是\\gls{representation_learning}最重要的工具之一。\n\\gls{distributed_representation}非常强大，因为他们能用具有$k$个值的$n$个特征去描述$k^n$个不同的概念。\n正如我们在本书中看到的，具有多个\\gls{hidden_unit}的\\gls{NN}和具有多个\\gls{latent_variable}的概率模型都利用了\\gls{distributed_representation}的策略。\n我们现在再介绍一个观察结果。\n许多\\gls{DL}算法基于的假设是，\\gls{hidden_unit}能够学习表示出解释数据的\\gls{underlying}\\gls{causal_factor}，就像\\secref{sec:semi_supervised_disentangling_of_causal_factors}中讨论的一样。\n这种方法在\\gls{distributed_representation}上是自然的，因为表示空间中的每个方向都对应着一个不同的\\gls{underlying}配置变量的值。\n\n%  537 head\n\n$n$维二元向量是一个\\gls{distributed_representation}的示例，有$2^n$种配置，每一种都对应输入空间中的一个不同区域，如\\figref{fig:chap15_distributed}所示。\n这可以与\\emph{\\gls{symbolic_representation}}相比较，其中输入关联到单一符号或类别。\n如果字典中有$n$个符号，那么可以想象有$n$个特征监测器，每个特征探测器监测相关类别的存在。\n在这种情况下，只有表示空间中$n$个不同配置才有可能在输入空间中刻画$n$个不同的区域，如\\figref{fig:chap15_nondistributed}所示。\n这样的\\gls{symbolic_representation}也被称为~\\gls{one_hot}~表示，因为它可以表示成相互排斥的$n$维二元向量（其中只有一位是激活的）。\n\\gls{symbolic_representation}是更广泛的\\gls{nondistributed_representation}类中的一个具体示例，它可以包含很多条目，但是每个条目没有显著意义的单独控制作用。\n\n% 537 mid\n\n% 538 1 page\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/distributed}}\n\\fi\n\\caption{基于\\gls{distributed_representation}的学习算法如何将输入空间分割成多个区域的图示。\n这个例子具有二元变量$h_1$，$h_2$，$h_3$。\n每个特征通过为\\gls{learned}的线性变换设定输出阈值而定义。\n每个特征将$\\SetR^2$分成两个半平面。\n令$h_i^+$表示输入点$h_i=1$的集合；$h_i^-$表示输入点$h_i=0$的集合。\n在这个图示中，每条线代表着一个$h_i$的决策边界，对应的箭头指向边界的$h_i^+$区域。\n整个表示在这些半平面的每个相交区域都指定一个唯一值。\n例如，表示值为$[1,1,1]^\\top$对应着区域$h_1^+ \\cap h_2^+ \\cap h_3^+$。\n可以将以上表示和\\figref{fig:chap15_nondistributed}中的\\gls{nondistributed_representation}进行比较。\n在输入维度是$d$的一般情况下，\\gls{distributed_representation}通过半空间（而不是半平面）的交叉分割$\\SetR^d$。\n具有$n$个特征的\\gls{distributed_representation}给$O(n^d)$个不同区域分配唯一的编码，而具有$n$个样本的\\gls{nearest_neighbor}算法只能给$n$个不同区域分配唯一的编码。\n因此，\\gls{distributed_representation}能够比\\gls{nondistributed_representation}多分配指数级的区域。\n注意并非所有的$\\Vh$值都是可取的（这个例子中没有$\\Vh=\\mathbf{0}$），在\\gls{distributed_representation}上的\\gls{linear_classifier}不能向每个相邻区域分配不同的类别标识；\n甚至深度线性阈值网络的~\\glssymbol{VC}~维只有$O(w\\log w)$（其中$w$是权重数目）\\citep{sontag1998vc}。\n强表示层和弱分类器层的组合是一个强\\gls{regularizer}。\n试图学习``人''和``非人''概念的分类器不需要给表示为``戴眼镜的女人''和``没有戴眼镜的男人''的输入分配不同的类别。\n容量限制鼓励每个分类器关注少数几个$h_i$，鼓励$\\Vh$以线性可分的方式学习表示这些类别。\n}\n\\label{fig:chap15_distributed}\n\\end{figure}\n\n% 538 1 page\n\n% 539 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/non_distributed}}\n\\fi\n\\caption{\\gls{nearest_neighbor}算法如何将输入空间分成不同区域的图示。\n\\gls{nearest_neighbor}算法是一个基于\\gls{nondistributed_representation}的学习算法的示例。\n不同的\\gls{nondistributed}算法可以具有不同的几何形状，但是它们通常将输入空间分成区域，\\emph{每个区域具有不同的参数}。\n\\gls{nondistributed}方法的优点是，给定足够的参数，它能够拟合一个\\gls{training_set}，而不需要复杂的优化算法。\n因为它直接为每个区域\\emph{独立地}设置不同的参数。\n缺点是，\\gls{nondistributed_representation}的模型只能通过平滑先验来局部地\\gls{generalize}，因此学习波峰波谷多于样本的复杂函数时，该方法是不可行的。\n和\\gls{distributed_representation}的对比，可以参照\\figref{fig:chap15_distributed}。\n}\n\\label{fig:chap15_nondistributed}\n\\end{figure}\n\n% 539 head\n\n\n% 537 mid\n\n以下是基于\\gls{nondistributed_representation}的学习算法的示例：\n\\begin{itemize}\n\t\\item 聚类算法，包含$k$-means算法：每个输入点恰好分配到一个类别。\n\n\t\\item $k$-\\gls{nearest_neighbor}算法：给定一个输入，一个或几个模板或原型样本与之关联。\n\t在$k >  1$ 的情况下，每个输入都使用多个值来描述，但是它们不能彼此分开控制，因此这不能算真正的\\gls{distributed_representation}。\n\n\t\\item \\gls{decision_tree}：给定输入时，只有一个叶节点（和从根到该叶节点路径上的点）是被激活的。\n\n\t\\item \\gls{gauss_mixture}和\\gls{mixture_of_experts}：模板（聚类中心）或专家关联一个激活的\\emph{程度}。\n\t和$k$-\\gls{nearest_neighbor}算法一样，每个输入用多个值表示，但是这些值不能轻易地彼此分开控制。\n\n\t\\item 具有\\gls{gaussian_kernel} （或其他类似的\\gls{local_kernel}）的\\gls{kernel_machines}： 尽管每个``\\gls{support_vectors}''或模板样本的激活程度是连续值，但仍然会出现和\\gls{gauss_mixture}相同的问题。\n\n% 537 end\n\n\t\\item 基于~\\gls{n_gram}~的语言或翻译模型：根据后缀的树结构划分上下文集合（符号序列）。\n\t例如，一个叶节点可能对应于最后两个单词$w_1$和$w_2$。\n\t树上的每个叶节点分别估计单独的参数（有些共享也是可能的）。\n\\end{itemize}\n\n% -- 539 mid  \n\n\n\n对于部分\\gls{nondistributed}算法而言，有些输出并非是恒定的，而是在相邻区域之间内插。\n参数（或样本）的数量和它们能够定义区域的数量之间仍保持线性关系。\n\n% -- 539 mid  \n\n将\\gls{distributed_representation}和\\gls{symbolic_representation}区分开来的一个重要概念是，由不同概念之间的\\emph{共享属性而产生的\\gls{generalization}}。\n作为纯符号，``猫''和``狗''之间的距离和任意其他两种符号的距离一样。\n然而，如果将它们与有意义的\\gls{distributed_representation}相关联，那么关于猫的很多特点可以推广到狗，反之亦然。\n例如，我们的\\gls{distributed_representation}可能会包含诸如``具有皮毛''或``腿的数目''这类在``猫''和``狗''的嵌入上具有相同值的项。\n正如\\secref{sec:neural_language_models}所讨论的，作用于单词\\gls{distributed_representation}的神经语言模型比其他直接对单词~\\gls{one_hot}~表示进行操作的模型\\gls{generalize}得更好。\n\\gls{distributed_representation}具有丰富的\\emph{相似性空间}，语义上相近的概念（或输入）在距离上接近，这是纯粹的\\gls{symbolic_representation}所缺少的特点。\n\n% -- 540 head\n\n在学习算法中使用\\gls{distributed_representation}何时以及为什么具有统计优势？\n当一个明显复杂的结构可以用较少参数紧致地表示时，\\gls{distributed_representation}具有统计上的优点。\n一些传统的\\gls{nondistributed}学习算法仅仅在平滑假设的情况下能够\\gls{generalize}，也就是说如果$u\\approx v$，那么学习到的目标函数$f$通常具有$f(u) \\approx f(v)$的性质。\n有许多方法来形式化这样一个假设，但其结果是如果我们有一个样本$(x,y)$，并且我们知道$f(x) \\approx y$，那么我们可以选取一个\\gls{estimator}$\\hat{f}$近似地满足这些限制，并且当我们移动到附近的输入$x + \\epsilon$时，$\\hat{f}$尽可能少地发生改变。\n显然这个假设是非常有用的，但是它会遭受\\gls{curse_of_dimensionality}：\n学习出一个能够在很多不同区域上增加或减少很多次的目标函数\n\\footnote{一般来说，我们可能会想要学习一个函数，这个函数在指数级数量区域的表现都是不同的：在$d$-维空间中，为了区分每一维，至少有两个不同的值。\n我们想要函数$f$区分这$2^d$个不同的区域，需要$O(2^d)$量级的训练样本}，\n我们可能需要至少和可区分区域数量一样多的样本。\n我们可以将每一个区域视为一个类别或符号：通过让每个符号（或区域）具有单独的自由度，我们可以学习出从符号映射到值的任意\\gls{decoder}。\n然而，这不能推广到新区域的新符号上。\n\n% -- 540 mid\n\n如果我们幸运的话，除了平滑之外，目标函数可能还有一些其他规律。\n例如，具有\\gls{max_pooling}的\\gls{convolutional_network}可以在不考虑对象在图像中位置（即使对象的空间变换不对应输入空间的平滑变换）的情况下识别出对象。\n\n% -- 540 mid\n\n让我们检查\\gls{distributed_representation}学习算法的一个特殊情况，它通过对输入的线性函数进行阈值处理来提取二元特征。\n该表示中的每个二元特征将$\\SetR^d$分成一对半空间，如\\figref{fig:chap15_distributed}所示。\n$n$个相应半空间的指数级数量的交集确定了该\\gls{distributed_representation}\\gls{learner}能够区分多少区域。\n空间$\\SetR^d$中的$n$个超平面的排列组合能够生成多少区间？\n通过应用关于超平面交集的一般结果~\\citep{Zaslavsky-1975}，我们发现~\\citep{Pascanu+et+al-ICLR2014b}这个二元特征表示能够区分的空间数量是\n\\begin{equation}\n\t\\sum_{j=0}^d \\binom{n}{j} = O(n^d).\n\\end{equation}\n因此，我们会发现关于输入大小呈指数级增长，关于\\gls{hidden_unit}的数量呈多项式级增长。\n\n% -- 541 head\n\n这提供了\\gls{distributed_representation}\\gls{generalization}能力的一种几何解释：$O(nd)$个参数（空间$\\SetR^d$中的$n$个线性阈值特征）能够明确表示输入空间中$O(n^d)$个不同区域。\n如果我们没有对数据做任何假设，并且每个区域使用唯一的符号来表示，每个符号使用单独的参数去识别$\\SetR^d$中的对应区域，那么指定$O(n^d)$个区域需要$O(n^d)$个样本。\n更一般地，\\gls{distributed_representation}的优势还可以体现在我们对\\gls{distributed_representation}中的每个特征使用非线性的、可能连续的\\gls{feature_extractor}，而不是\\gls{linear_threshold_units}的情况。\n在这种情况下，如果具有$k$个参数的参数变换可以学习输入空间中的$r$个区域（$k\\ll r$），并且如果学习这样的表示有助于关注的任务，那么这种方式会比\\gls{nondistributed}\\gls{setting}（我们需要$O(r)$个样本来获得相同的特征，将输入空间相关联地划分成$r$个区域。）\\gls{generalize}得更好。\n使用较少的参数来表示模型意味着我们只需拟合较少的参数，因此只需要更少的训练样本去获得良好的\\gls{generalization}。\n\n% -- 541 mid\n\n另一个解释基于\\gls{distributed_representation}的模型\\gls{generalization}能力更好的说法是，尽管能够明确地编码这么多不同的区域，但它们的\\gls{capacity}仍然是很有限的。\n例如，\\gls{linear_threshold_units}\\gls{NN}的~\\glssymbol{VC}~维仅为$O(w\\log w)$， 其中$w$是权重的数目~\\citep{sontag1998vc}。\n这种限制出现的原因是，虽然我们可以为表示空间分配非常多的唯一码，但是我们不能完全使用所有的码空间，也不能使用\\gls{linear_classifier}学习出从表示空间$\\Vh$到输出$\\Vy$的任意函数映射。\n因此使用与\\gls{linear_classifier}相结合的\\gls{distributed_representation}传达了一种先验信念，待识别的类在$\\Vh$代表的\\gls{underlying}\\gls{causal_factor}的函数下是线性可分的。\n我们通常想要学习类别，例如所有绿色对象的图像集合，或是所有汽车图像集合，但不会是需要非线性~\\ENNAME{XOR}~逻辑的类别。\n例如，我们通常不会将数据划分成所有红色汽车和绿色卡车作为一个集合，所有绿色汽车和红色卡车作为另一个集合。\n\n% -- 542 head\n\n到目前为止讨论的想法都是抽象的，但是它们可以通过实验验证。\n\\cite{Zhou-et-al-ICLR2015}发现，在~\\ENNAME{ImageNet}~和~\\ENNAME{Places}~基准数据集上训练的深度\\gls{convolutional_network}中的\\gls{hidden_unit}\\gls{learned}的特征通常是可以解释的，对应人类自然分配的\\gls{label}。\n在实践中，\\gls{hidden_unit}并不能总是学习出具有简单语言学名称的事物，但有趣的是，这些事物会在那些最好的\\gls{CV}深度网络的顶层附近出现。\n这些特征的共同之处在于，我们可以设想\\emph{学习其中的每个特征不需要知道所有其他特征的所有配置}。\n\\cite{radford2015unsupervised}发现\\gls{generative_model}可以学习人脸图像的表示，在表示空间中的不同方向捕获不同的\\gls{underlying}\\gls{factors_of_variation}。\n\\figref{fig:chap15_generative_glasses}展示表示空间中的一个方向对应着该人是男性还是女性，而另一个方向对应着该人是否戴着眼镜。\n这些特征都是自动发现的，而非先验固定的。\n我们没有必要为\\gls{hidden_unit}分类器提供\\gls{label}：只要该任务需要这样的特征，\\gls{GD}就能在感兴趣的\\gls{objective_function}上自然地学习出语义上有趣的特征。\n我们可以学习出男性和女性之间的区别，或者是眼镜的存在与否，而不必通过涵盖所有这些值组合的样本来表征其他$n-1$个特征的所有配置。\n这种形式的统计可分离性质能够\\gls{generalize}到训练期间从未见过的新特征上。\n\n% 543 head\n\n% 542 end\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{ccccccc}\n\\includegraphics[width=0.1\\textwidth]{Chapter15/figures/man_with_glasses} &\n- &\n\\includegraphics[width=0.1\\textwidth]{Chapter15/figures/man_without_glasses} &\n+ &\n\\includegraphics[width=0.1\\textwidth]{Chapter15/figures/woman_without_glasses} &\n= &\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/woman_with_glasses}\n\\end{tabular}\n\\fi\n\\caption{\\gls{generative_model}学到了\\gls{distributed_representation}，能够从戴眼镜的概念中区分性别的概念。\n如果我们从一个戴眼镜的男人的概念表示向量开始，然后减去一个没戴眼镜的男人的概念表示向量，最后加上一个没戴眼镜的女人的概念表示向量，那么我们会得到一个戴眼镜的女人的概念表示向量。\n\\gls{generative_model}将所有这些表示向量正确地解码为可被识别为正确类别的图像。\n图片转载许可自~\\cite{radford2015unsupervised}。\n}\n\\label{fig:chap15_generative_glasses}\n\\end{figure}\n\n% 542 end\n\n\\section{得益于深度的指数增益}\n\\label{sec:exponential_gains_from_depth}\n我们已经在\\secref{sec:universal_approximation_properties_and_depth}中看到，\\gls{MLP}是\\gls{universal_approximator}，相比于浅层网络，一些函数能够用指数级小的\\gls{deep_network}表示。\n缩小模型规模能够提高统计效率。\n在本节中，我们描述如何将类似结果更一般地应用于其他具有分布式隐藏表示的模型。\n\n% 543 mid\n\n在\\secref{sec:distributed_representation}中，我们看到了一个\\gls{generative_model}的示例，能够学习人脸图像的\\gls{underlying}\\gls{explanatory_factor}，包括性别以及是否佩戴眼镜。\n完成这个任务的\\gls{generative_model}是基于一个\\gls{DNN}的。\n浅层网络例如线性网络不能学习出这些抽象\\gls{explanatory_factor}和图像像素之间的复杂关系。\n在这个任务和其他~\\glssymbol{AI}~任务中，这些因子几乎彼此独立地被抽取，但仍然对应到有意义输入的因素，很有可能是高度抽象的，并且和输入呈高度非线性的关系。\n我们认为这需要\\emph{深度}\\gls{distributed_representation}，需要许多非线性组合来获得较高级的特征（被视为输入的函数）或因子（被视为生成原因）。\n\n% 543 mid\n\n在许多不同\\gls{setting}中已经证明，\n非线性和重用特征层次结构的组合来组织计算，可以使\\gls{distributed_representation}获得指数级加速之外，还可以获得统计效率的指数级提升。\n许多种类的只有一个\\gls{hidden_layer}的网络（例如，具有饱和非线性，布尔门，和/积，或~\\glssymbol{RBF}~单元的网络）都可以被视为\\gls{universal_approximator}。\n在给定足够多\\gls{hidden_unit}的情况下，这个模型族是一个\\gls{universal_approximator}，可以在任意非零允错级别近似一大类函数（包括所有连续函数）。\n然而，\\gls{hidden_unit}所需的数量可能会非常大。\n关于深层架构表达能力的理论结果表明，有些函数族可以高效地通过深度$k$层的网络架构表示，但是深度不够（深度为2或$k-1$）时会需要指数级（相对于输入大小而言）的\\gls{hidden_unit}。\n\n% -- 543 end\n\n% 544 head\n\n在\\secref{sec:universal_approximation_properties_and_depth}中，我们看到确定性\\gls{feedforward_network}是函数的\\gls{universal_approximator}。\n许多具有单个\\gls{hidden_layer}（\\gls{latent_variable}）的\\gls{structured_probabilistic_models}（包括\\gls{RBM}，\\gls{DBN}）是概率分布的\\gls{universal_approximator}~\\citep{LeRoux-Bengio-2008,LeRoux+Bengio-2010,Montufar-2011,Montufar-arxiv2013,Krause-et-al-ICML2013}。\n\n% 544 mid\n\n在\\secref{sec:universal_approximation_properties_and_depth}中，我们看到足够深的\\gls{feedforward_network}会比深度不够的网络具有指数级优势。\n这样的结果也能从诸如概率模型的其他模型中获得。\n\\firstall{sum_product_network}%，\\glssymbol{sum_product_network}\n~\\citep{Poon+Domingos-2011}是这样的一种概率模型。\n这些模型使用多项式回路来计算一组\\gls{RV}的\\gls{PD}。\n\\cite{Delalleau+Bengio-2011-small}表明存在一种\\gls{PD}，对~\\glssymbol{sum_product_network}~的最小深度有要求，以避免模型规模呈指数级增长。\n后来，\\cite{Martens+Medabalimi-arxiv2014}表明，任意两个有限深度的~\\glssymbol{sum_product_network}~之间都会存在显著差异，并且一些使~\\glssymbol{sum_product_network}~易于处理的约束可能会限制其表示能力。\n\n% 544 mid\n\n另一个有趣的进展是，一系列和\\gls{convolutional_net}相关的\\gls{deep_circuit}族表达能力的理论结果，即使让\\gls{shadow_circuit}只去近似\\gls{deep_circuit}计算的函数，也能突出反映\\gls{deep_circuit}的指数级优势~\\citep{Cohen-et-al-arXiv2015}。\n相比之下，以前的理论工作只研究了\\gls{shadow_circuit}必须精确复制特定函数的情况。\n\n% 544 mid\n\n\\section{提供发现潜在原因的线索}\n\\label{sec:providing_clues_to_discover_underlying_causes}\n\n% 544 end\n\n我们回到最初的问题之一来结束本章：什么原因能够使一个表示比另一个表示更好？\n首先在\\secref{sec:semi_supervised_disentangling_of_causal_factors}中介绍的一个答案是，一个理想的表示能够区分生成数据变化的\\gls{underlying}\\gls{causal_factor}，特别是那些与我们的应用相关的因素。\n\\gls{representation_learning}的大多数策略都会引入一些有助于学习\\gls{underlying}\\gls{factors_of_variation}的线索。\n这些线索可以帮助\\gls{learner}将这些观察到的因素与其他因素分开。\n\\gls{supervised_learning}提供了非常强的线索：每个观察向量$\\Vx$的\\gls{label}$\\Vy$，它通常直接指定了至少一个\\gls{factors_of_variation}。\n更一般地，为了利用丰富的\\gls{unlabeled}数据，\\gls{representation_learning}会使用关于\\gls{underlying}因素的其他不太直接的提示。\n这些提示包含一些我们（学习算法的设计者）为了引导\\gls{learner}而强加的隐式先验信息。\n诸如\\gls{no_free_lunch_theorem}的这些结果表明，\\gls{regularization}策略对于获得良好\\gls{generalization}是很有必要的。\n当不可能找到一个普遍良好的\\gls{regularization}策略时，\\gls{DL}的一个目标是找到一套相当通用的\\gls{regularization}策略，使其能够适用于各种各样的~\\glssymbol{AI}~任务（类似于人和动物能够解决的任务）。\n\n% 545 head\n\n在此，我们提供了一些通用\\gls{regularization}策略的列表。\n该列表显然是不详尽的，但是给出了一些学习算法是如何发现对应\\gls{underlying}因素的特征的具体示例。\n该列表在~\\cite{Bengio-Courville-Vincent-TPAMI-2012}的第3.1节中提出，这里进行了部分拓展。\n\\begin{itemize}\n\t\\item \\emph{平滑}：假设对于单位$\\Vd$和小量$\\epsilon$有$f(\\Vx + \\epsilon \\Vd) \\approx f(\\Vx)$。\n\t这个假设允许\\gls{learner}从训练样本\\gls{generalize}到输入空间中附近的点。\n\t许多\\gls{ML}算法都利用了这个想法，但它不能克服\\gls{curse_of_dimensionality}难题。\n\n\n\t\\item \\emph{线性}：很多学习算法假定一些变量之间的关系是线性的。\n\t这使得算法能够预测远离观测数据的点，但有时可能会导致一些极端的预测。\n\t大多数简单的学习算法不会做平滑假设，而会做线性假设。\n\t这些假设实际上是不同的，具有很大权重的线性函数在高维空间中可能不是非常平滑的。\n\t参看~\\cite{Goodfellow-2015-adversarial}了解关于线性假设局限性的进一步讨论。\n\n% 545 mid\n\n\t\\item \\emph{多个\\gls{explanatory_factor}}：许多\\gls{representation_learning}算法受以下假设的启发，数据是由多个\\gls{underlying}\\gls{explanatory_factor}生成的，并且给定每一个因子的状态，大多数任务都能轻易解决。\n\t\\secref{sec:semi_supervised_disentangling_of_causal_factors}描述了这种观点如何通过\\gls{representation_learning}来启发\\gls{semi_supervised_learning}的。\n\t学习$p(\\Vx)$的结构要求学习出一些对建模$p(\\Vy\\mid\\Vx)$同样有用的特征，因为它们都涉及到相同的\\gls{underlying}\\gls{explanatory_factor}。\n\t\\secref{sec:distributed_representation}介绍了这种观点如何启发\\gls{distributed_representation}的使用，表示空间中\\gls{separate}方向对应着\\gls{separate}\\gls{factors_of_variation}。\n\n\n\t\\item \\emph{\\gls{causal_factor}}：该模型认为\\gls{learned}表示所描述的\\gls{factors_of_variation}是观察数据$\\Vx$的成因，而并非反过来。\n\t正如\\secref{sec:semi_supervised_disentangling_of_causal_factors}中讨论的，这对于\\gls{semi_supervised_learning}是有利的，当\\gls{underlying_cause}上的分布发生改变，或者我们应用模型到一个新的任务上时，\\gls{learned}的模型都会更加鲁棒。\n\n% -- 546 head\n\n\t\\item \\emph{深度，或者\\gls{explanatory_factor}的层次组织}：高级抽象概念能够通过将简单概念层次化来定义。\n\t从另一个角度来看，深度架构表达了我们认为任务应该由多个程序步骤完成的观念，其中每一个步骤回溯到先前步骤处理之后的输出。\n\n\n\t\\item \\emph{任务间共享因素}：\n\t当多个对应到不同变量$\\RSy_i$的任务共享相同的输入$\\RVx$时，或者当每个任务关联到全局输入$\\RVx$的子集或者函数$f^{(i)}(\\RVx)$时，我们会假设每个变量$\\RSy_i$关联到来自相关因素$\\RVh$公共池的不同子集。\n\t因为这些子集有重叠，所以通过共享的中间表示$ P(\\RVh \\mid \\RVx)$来学习所有的$P(\\RSy_i \\mid \\RVx)$能够使任务间共享统计强度。\n\n% -- 546 mid\n\n\t\\item \\emph{\\gls{manifold}}：概率质量集中，并且集中区域是局部连通的，且占据很小的体积。\n\t在连续情况下，这些区域可以用比数据所在原始空间低很多维的低维\\gls{manifold}来近似。\n\t很多\\gls{ML}算法只在这些\\gls{manifold}上有效\\citep{Goodfellow-2015-adversarial}。\n\t一些\\gls{ML}算法，特别是\\gls{AE}，会试图显式地学习\\gls{manifold}的结构。\n\n\n\t\\item \\emph{自然聚类}：很多\\gls{ML}算法假设输入空间中每个连通\\gls{manifold}可以被分配一个单独的类。\n\t数据分布在许多个不连通的\\gls{manifold}上，但相同\\gls{manifold}上数据的类别是相同的。\n\t这个假设激励了各种学习算法，包括\\gls{tangent_propagation}、\\gls{double_backprop}、\\gls{manifold_tangent_classifier}和\\gls{adversarial_training}。\n\n\n\t\\item \\emph{时间和空间相干性}：\\gls{SFA}和相关的算法假设，最重要的\\gls{explanatory_factor}随时间变化很缓慢，或者至少假设预测真实的\\gls{underlying}\\gls{explanatory_factor}比预测诸如像素值这类原始观察会更容易些。\n\t读者可以参考\\secref{sec:slow_feature_analysis}，进一步了解这个方法。\n\n\n\t\\item \\emph{稀疏性}：假设大部分特征和大部分输入不相关，如在表示猫的图像时，没有必要使用象鼻的特征。\n\t因此，我们可以强加一个先验，任何可以解释为``存在''或``不存在''的特征在大多数时间都是不存在的。\n\n% -- 547 head --\n\n\t\\item \\emph{简化因子\\gls{dependency}}：在良好的高级表示中，因子会通过简单的\\gls{dependency}相互关联。\n\t最简单的可能是边缘独立，即$P(\\RVh) = \\prod_i P(\\RVh_i)$。\n\t但是线性\\gls{dependency}或浅层\\gls{AE}所能表示的\\gls{dependency}关系也是合理的假设。\n\t这可以从许多物理定律中看出来，并且假设在\\gls{learned}表示的顶层插入线性预测器或\\gls{factorized}先验。\n\\end{itemize}\n\n\n\\gls{representation_learning}的概念将许多\\gls{DL}形式联系在了一起。\n\\gls{feedforward_network}和\\gls{recurrent_network}，\\gls{AE}和深度概率模型都在学习和使用表示。\n学习最佳表示仍然是一个令人兴奋的研究方向。\n\n% -- 547 --\n"
  },
  {
    "path": "Chapter16/README.md",
    "content": "#第十六章笔记\n"
  },
  {
    "path": "Chapter16/annotations.txt",
    "content": "{'user': 'acct:swordyork@hypothes.is', 'text': '与原文意思不同', 'origin_text': '                            !!!深度学习为研究者们提供了许多指导性的建模和设计算法的思路。!!!  其中一种形式是结构化概率模型。我们曾经在\\\\sec?中简要讨论', 'time': '2017-03-04T07:32'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '模型的思想', 'origin_text': '供了许多指导性的建模和设计算法的思路。其中一种形式是结构化概率  !!!模型!!!  。我们曾经在\\\\sec?中简要讨论过结构化概率模型。那个简单的', 'time': '2017-03-04T07:33'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '使用结构化概率模型作为语言', 'origin_text': '讨论过结构化概率模型。那个简单的介绍已经足够使我们充分了解如何  !!!使用结构化概率模型!!!  来描述第二部分中的某些算法。现在在第三部分，结构化概率模型是许', 'time': '2017-03-04T07:36'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '现在在第三部分，我们可以看到', 'origin_text': '使我们充分了解如何使用结构化概率模型来描述第二部分中的某些算法。  !!!现在在第三部分!!!  ，结构化概率模型是许多深度学习重要研究方向的关键组成部分。作为', 'time': '2017-03-04T07:38'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '将更详细的描述结构化概率模型', 'origin_text': '要研究方向的关键组成部分。作为讨论这些研究方向的预备知识，本章  !!!更加详细地描述了结构化概率模型!!!  。本章中我们努力做到内容的自洽性。在阅读本章之前读者不需要回', 'time': '2017-03-04T07:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '本章内容是自洽的，所以', 'origin_text': '论这些研究方向的预备知识，本章更加详细地描述了结构化概率模型。  !!!本章中我们努力做到内容的自洽性。!!!  在阅读本章之前读者不需要回顾之前的介绍。结构化概率模型使', 'time': '2017-03-04T07:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '此前简要', 'origin_text': '化概率模型。我们曾经在\\\\sec?中简要讨论过结构化概率模型。  !!!那个简单!!!  的介绍已经足够使我们充分了解如何使用结构化概率模型来描述第二部分', 'time': '2017-03-04T07:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '“图”', 'origin_text': '率分布。在这里我们使用了图论（一系列结点通过一系列边来连接）中  !!!图!!!  的概念，由于模型的结构是由图来定义的，所以这些模型也通常被叫做图', 'time': '2017-03-04T07:42'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '由于模型结构是由图定义的        \\n', 'origin_text': '在这里我们使用了图论（一系列结点通过一系列边来连接）中图的概念，  !!!由于模型的结构是由图来定义的!!!  ，所以这些模型也通常被叫做图模型。图模型的研究领域是巨大的', 'time': '2017-03-04T07:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '称为', 'origin_text': '）中图的概念，由于模型的结构是由图来定义的，所以这些模型也通常被  !!!叫做!!!  图模型。图模型的研究领域是巨大的，曾提出过大量的模型，训练', 'time': '2017-03-04T07:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '群体', 'origin_text': '由图来定义的，所以这些模型也通常被叫做图模型。图模型的研究  !!!领域!!!  是巨大的，曾提出过大量的模型，训练算法和推断算法。在本章中，我', 'time': '2017-03-04T07:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '、', 'origin_text': '被叫做图模型。图模型的研究领域是巨大的，曾提出过大量的模型  !!!，!!!  训练算法和推断算法。在本章中，我们介绍了图模型中几个核心方法的', 'time': '2017-03-04T07:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '并', 'origin_text': '所以这些模型也通常被叫做图模型。图模型的研究领域是巨大的，  !!!曾!!!  提出过大量的模型，训练算法和推断算法。在本章中，我们介绍了图模', 'time': '2017-03-04T07:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '将介绍', 'origin_text': '巨大的，曾提出过大量的模型，训练算法和推断算法。在本章中，我们  !!!介绍了!!!  图模型中几个核心方法的基本背景，并且强调了在深度学习领域中图模型', 'time': '2017-03-04T07:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '重点描述已被证明对深度学习社群最有用的观点。', 'origin_text': '算法。在本章中，我们介绍了图模型中几个核心方法的基本背景，并且  !!!强调了在深度学习领域中图模型已经被公认为是有效的!!!  。如果你已经对图模型已经了解很多，那么你可以跳过本章的绝大部分', 'time': '2017-03-04T07:49'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '如果你已经熟知图模型', 'origin_text': '本背景，并且强调了在深度学习领域中图模型已经被公认为是有效的。  !!!如果你已经对图模型已经了解很多!!!  ，那么你可以跳过本章的绝大部分。然而，我们相信即使是资深的图模', 'time': '2017-03-04T07:50'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '使用图模型的独特方式。', 'origin_text': '后一节中获益匪浅，详见\\\\sec?，其中我们强调了在深度学习算法中  !!!一些图模型特有的算法!!!  。相比于其他图模型研究领域的是，深度学习的研究者们通常会使用完', 'time': '2017-03-04T07:52'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '、', 'origin_text': '模型研究领域的是，深度学习的研究者们通常会使用完全不同的模型结构  !!!，!!!  学习算法和推断过程。在本章中，我们指明了这种区别并且解释了其中', 'time': '2017-03-04T07:53'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '将指明', 'origin_text': '常会使用完全不同的模型结构，学习算法和推断过程。在本章中，我们  !!!指明了!!!  这种区别并且解释了其中的原因。在本章中，我们首先介绍了建立', 'time': '2017-03-04T07:53'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 了', 'origin_text': '结构，学习算法和推断过程。在本章中，我们指明了这种区别并且解释  !!!了!!!  其中的原因。在本章中，我们首先介绍了建立大尺度概率模型中面', 'time': '2017-03-04T07:53'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 且', 'origin_text': '的模型结构，学习算法和推断过程。在本章中，我们指明了这种区别并  !!!且!!!  解释了其中的原因。在本章中，我们首先介绍了建立大尺度概率模', 'time': '2017-03-04T07:54'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '过程。在本章中，我们指明了这种区别并且解释了其中的原因。  !!!在本章中，!!!  我们首先介绍了建立大尺度概率模型中面临的挑战。之后，我们介绍了', 'time': '2017-03-04T07:54'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 了', 'origin_text': '指明了这种区别并且解释了其中的原因。在本章中，我们首先介绍  !!!了!!!  建立大尺度概率模型中面临的挑战。之后，我们介绍了如何使用一个图', 'time': '2017-03-04T07:54'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '构建大规模', 'origin_text': '明了这种区别并且解释了其中的原因。在本章中，我们首先介绍了  !!!建立大尺度!!!  概率模型中面临的挑战。之后，我们介绍了如何使用一个图来描述概率', 'time': '2017-03-04T07:55'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时', 'origin_text': '释了其中的原因。在本章中，我们首先介绍了建立大尺度概率模型  !!!中!!!  面临的挑战。之后，我们介绍了如何使用一个图来描述概率分布的结构', 'time': '2017-03-04T07:55'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 了', 'origin_text': '，我们首先介绍了建立大尺度概率模型中面临的挑战。之后，我们介绍  !!!了!!!  如何使用一个图来描述概率分布的结构。尽管这个方法能够帮助我们解', 'time': '2017-03-04T07:55'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '仍', 'origin_text': '分布的结构。尽管这个方法能够帮助我们解决许多挑战和问题，它本身  !!!也!!!  有很多缺陷。图模型中的一个主要难点就是判断哪些变量之间存在直接', 'time': '2017-03-04T07:56'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们通过学习依赖性，', 'origin_text': '，也就是对于给定的问题哪一种图结构是最适合的。在\\\\sec?中，  !!!通过了解依赖性，我们!!!  简要概括了解决这个难点的两种基本方法。最后，在\\\\sec?中，我', 'time': '2017-03-04T07:57'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 基本', 'origin_text': '在\\\\sec?中，通过了解依赖性，我们简要概括了解决这个难点的两种  !!!基本!!!  方法。最后，在\\\\sec?中，我们讨论并强调了图模型在深度学习中', 'time': '2017-03-04T07:58'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '最后，作为本章的收尾，我们在\\\\sec?中讨论深度学习研究者使用图模型特定方式的独特之处。', 'origin_text': '?中，通过了解依赖性，我们简要概括了解决这个难点的两种基本方法。  !!!最后，在\\\\sec?中，我们讨论并强调了图模型在深度学习中的一些独特之处和一些特有的方法，作为本章的收尾。!!!  非结构化建模的挑战深度学习的目标是使得机器学习能够解决许', 'time': '2017-03-04T08:01'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '亟需', 'origin_text': '的挑战深度学习的目标是使得机器学习能够解决许多人工智能中  !!!需要!!!  解决的挑战。这也意味着能够理解具有丰富结构的高维数据。举个例', 'time': '2017-03-04T08:02'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '有点不对', 'origin_text': '学习的目标是使得机器学习能够解决许多人工智能中需要解决的挑战。  !!!这也意味着能够理解具有丰富结构的高维数据。!!!  举个例子，我们希望AI的算法能够理解自然图片\\\\footnote', 'time': '2017-03-04T08:04'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '不同于合成的图片，或者一个网页的截图等等。\\n', 'origin_text': 'tnote{自然图片指的是能够在正常的环境下被照相机拍摄的图片，  !!!以区别于合成的图片，或者一个网页的截图。!!!  }，包含语音的声音信号和拥有许多词和标点的文档。分类问题可', 'time': '2017-03-04T08:05'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '表示', 'origin_text': '被照相机拍摄的图片，以区别于合成的图片，或者一个网页的截图。}，  !!!包含!!!  语音的声音信号和拥有许多词和标点的文档。分类问题可以把这样', 'time': '2017-03-04T08:05'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '包含', 'origin_text': '以区别于合成的图片，或者一个网页的截图。}，包含语音的声音信号和  !!!拥有!!!  许多词和标点的文档。分类问题可以把这样一个来自高维分布的数', 'time': '2017-03-04T08:06'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '使用', 'origin_text': '档。分类问题可以把这样一个来自高维分布的数据作为输入，然后  !!!用!!!  一个类别的标签来概括它——这个标签可以是照片中是什么物品，一段语', 'time': '2017-03-04T08:06'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这个分类过程', 'origin_text': '，一段语音中说的是哪个单词，也可以是一段文档描述的是哪个话题。  !!!分类的这个过程!!!  丢弃了输入数据中的大部分信息，然后给出了一个单个值的输出（或者是', 'time': '2017-03-04T08:08'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '关于单个', 'origin_text': '丢弃了输入数据中的大部分信息，然后给出了一个单个值的输出（或者是  !!!一个!!!  输出值的概率分布）。这个分类器通常可以忽略输入数据的很多部分。', 'time': '2017-03-04T08:08'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '产生', 'origin_text': '的是哪个话题。分类的这个过程丢弃了输入数据中的大部分信息，然后  !!!给出了一个!!!  单个值的输出（或者是一个输出值的概率分布）。这个分类器通常可以', 'time': '2017-03-04T08:09'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '例如', 'origin_text': '出值的概率分布）。这个分类器通常可以忽略输入数据的很多部分。  !!!举个例子!!!  ，当我们识别一个照片中是哪一个物品的时候，我们通常可以忽略图片的', 'time': '2017-03-04T08:10'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '张', 'origin_text': '个分类器通常可以忽略输入数据的很多部分。举个例子，当我们识别一  !!!个!!!  照片中是哪一个物品的时候，我们通常可以忽略图片的背景。我们', 'time': '2017-03-04T08:10'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '的一个物体时', 'origin_text': '器通常可以忽略输入数据的很多部分。举个例子，当我们识别一个照片  !!!中是哪一个物品的时候!!!  ，我们通常可以忽略图片的背景。我们也可以使用概率模型来完成', 'time': '2017-03-04T08:10'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '好像可以去掉 来', 'origin_text': '的时候，我们通常可以忽略图片的背景。我们也可以使用概率模型  !!!来!!!  完成许多其他的任务。这些任务通常比分类更加昂贵。其中的一些任', 'time': '2017-03-04T08:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '换掉', 'origin_text': '也可以使用概率模型来完成许多其他的任务。这些任务通常比分类更加  !!!昂贵!!!  。其中的一些任务需要产生多个输出。大部分任务需要对输入数据整', 'time': '2017-03-04T08:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '输出值', 'origin_text': '任务。这些任务通常比分类更加昂贵。其中的一些任务需要产生多个  !!!输出!!!  。大部分任务需要对输入数据整个结构的完整理解，所以并不能舍弃数', 'time': '2017-03-04T08:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉了', 'origin_text': '据整个结构的完整理解，所以并不能舍弃数据的一部分。这些任务包括  !!!了!!!  以下几个：  \\\\textbf{估计密度函数}：给定一个输入', 'time': '2017-03-04T08:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 了', 'origin_text': 'tbf{估计密度函数}：给定一个输入xx\\\\Vx，机器学习系统返回  !!!了!!!  一个对数据生成分布的真实密度函数p(x)p(x)p(\\\\Vx)的估', 'time': '2017-03-04T08:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 了', 'origin_text': '察有误的输入数据x~x~\\\\tilde{\\\\Vx}，机器学习系统返回  !!!了!!!  一个对原始的真实xx\\\\Vx的估计。举个例子，有时候机器学习系统', 'time': '2017-03-04T08:14'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '灰尘', 'origin_text': 'Vx的估计。举个例子，有时候机器学习系统需要从一张老相片中去除  !!!污渍!!!  或者抓痕。这个系统会产生多个输出（对应着估计的干净样本xx\\\\V', 'time': '2017-03-04T08:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '一个受损区域也会显示最终估计也是受损的。 \\n与原文意思有区别，我也不清楚。', 'origin_text': 'Vx的每一个元素），并且需要我们有一个对输入的整体理解（因为即使  !!!一个严重损害的区域也需要在最后的输出中恢复!!!  ）。\\t% 551 ok+\\\\textbf{缺失值的填补}：', 'time': '2017-03-04T08:18'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '其应用包括', 'origin_text': '样}： 模型从分布p(x)p(x)p(\\\\Vx)中抽取新的样本。  !!!应用包含了!!!  语音合成，即产生一个听起来很像人说话的声音。这个模型也需要多个', 'time': '2017-03-04T08:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '从这', 'origin_text': 'cite?}中的$32\\\\times\\xa032$像素的样例图片。（下）  !!!这!!!  个数据集上训练的结构化概率模型中抽出的样本。每一个样本都出现在与', 'time': '2017-03-04T08:21'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '极具', 'origin_text': '百万随机变量的分布建模，无论从计算上还是从统计意义上说，都是一个  !!!具有!!!  挑战性的任务。假设我们只想对二值的随机变量建模。这是一个最简', 'time': '2017-03-04T08:23'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们仍然', 'origin_text': '假设我们只想对二值的随机变量建模。这是一个最简单的例子，但是  !!!仍然!!!  无能为力。对一个小的32×3232×3232\\\\times 32', 'time': '2017-03-04T08:23'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '只有', 'origin_text': '随机变量建模。这是一个最简单的例子，但是仍然无能为力。对一个  !!!小的!!!  32×3232×3232\\\\times 32像素的彩色（RGB）图', 'time': '2017-03-04T08:24'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '每一个可能值', 'origin_text': ')P(\\\\Vx)的方法需要存储一个可以查询的表格。这个表格记录了  !!!每一种可能的值!!!  的概率，需要记录knknk^n个参数。基于下述几个原因，这', 'time': '2017-03-04T08:25'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '则需要', 'origin_text': '要存储一个可以查询的表格。这个表格记录了每一种可能的值的概率，  !!!需要记录!!!  knknk^n个参数。基于下述几个原因，这种方式是不可行的', 'time': '2017-03-04T08:26'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'emph不对', 'origin_text': '基于下述几个原因，这种方式是不可行的：        !!!\\\\emph{内存}： 存储参数的开销!!!  。除了极小的nnn和kkk的值，用表格的形式来表示这样一个分布', 'time': '2017-03-04T08:26'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '平滑', 'origin_text': '额外的假设来联系表格中的不同元素（正如\\\\sec?中所举的回退或者  !!!平滑过的!!!  nnn-gram模型）。        \\\\emph{运行', 'time': '2017-03-04T08:28'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'emph不对', 'origin_text': 'n-gram模型）。        \\\\emph{运行时间  !!!}：推断的开销。!!!  假设我们需要完成一个推断的任务，其中我们需要使用联合分布P(x', 'time': '2017-03-04T08:28'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这样一个', 'origin_text': '    \\\\emph{运行时间}：推断的开销。假设我们需要完成  !!!一个!!!  推断的任务，其中我们需要使用联合分布P(x)P(x)P(\\\\RVx', 'time': '2017-03-04T08:29'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'emph 不对', 'origin_text': '销是一个级别的。        \\\\emph{运行时间}：  !!! 采样的开销!!!  。类似的，假设我们想要从这样的模型中采样。最简单的方法就是从', 'time': '2017-03-04T08:29'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '它也', 'origin_text': '素。最差情况下，这个操作需要读取整个表格，所以和其他操作一样，  !!!它!!!  需要指数级别的时间。  基于表格操作的方法的主要问题', 'time': '2017-03-04T08:30'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '地', 'origin_text': '际问题中我们遇到的概率分布远比这个简单。通常，许多变量只是间接  !!!的!!!  相互作用。例如，我们想要对接力跑步比赛中一个队伍完成比赛的', 'time': '2017-03-04T08:31'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 的', 'origin_text': '始跑。如果Alice跑得更快，那么Bob也会完成得更快。所有  !!!的!!!  其他关系都可以被类似地推出。最后，Carol的完成时间依赖于她', 'time': '2017-03-04T08:33'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '下，', 'origin_text': '此她的完成时间也更有可能要晚。然而，在给定Bob完成时间的情况  !!!下!!!  Carol的完成时间只是间接地依赖于Alice的完成时间。如果', 'time': '2017-03-04T08:34'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'emph', 'origin_text': '晚。然而，在给定Bob完成时间的情况下Carol的完成时间只是  !!!间接!!!  地依赖于Alice的完成时间。如果我们已经知道了Bob的完成时', 'time': '2017-03-04T08:35'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们可以', 'origin_text': 'ce的完成时间对估计Carol的完成时间并无任何帮助。这意味着  !!!可以!!!  通过仅仅两个相互作用来建模这个接力赛。这两个相互作用分别是Al', 'time': '2017-03-04T08:35'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '仅仅通过', 'origin_text': '的完成时间对估计Carol的完成时间并无任何帮助。这意味着可以  !!!通过仅仅!!!  两个相互作用来建模这个接力赛。这两个相互作用分别是Alice的', 'time': '2017-03-04T08:36'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这些更小的模型大大减小了在模型存储、模型推断以及从模型中采样时的计算开销。\\n', 'origin_text': '少了模型的参数个数以致于模型只需要更少的数据来进行有效的估计。  !!!这些更轻便的模型在模型存储，模型推断以及从模型中采样的时候有着更小的计算开销。!!!  使用图来描述模型结构结构化概率模型使用图（在图论中', 'time': '2017-03-04T08:38'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 来', 'origin_text': '，模型推断以及从模型中采样的时候有着更小的计算开销。使用图  !!!来!!!  描述模型结构结构化概率模型使用图（在图论中”结点”是通过', 'time': '2017-03-04T08:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '会', 'origin_text': '这些直接相互作用隐含着其他的间接相互作用，但是只有直接的相互作用  !!!是!!!  被显式地建模的。使用图来描述概率分布中相互作用的方法不止一', 'time': '2017-03-04T08:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 的', 'origin_text': '用隐含着其他的间接相互作用，但是只有直接的相互作用是被显式地建模  !!!的!!!  。使用图来描述概率分布中相互作用的方法不止一种。在下文中', 'time': '2017-03-04T08:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 ，', 'origin_text': '行和有用的方法。图模型可以被大致分为两类：基于有向无环图的模型  !!!，!!!  和基于无向模型的模型。有向模型有向图模型是一种结构', 'time': '2017-03-04T08:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '图', 'origin_text': '法。图模型可以被大致分为两类：基于有向无环图的模型，和基于无向  !!!模型!!!  的模型。有向模型有向图模型是一种结构化概率模型，也', 'time': '2017-03-04T08:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'judgmental没有翻', 'origin_text': '构化概率模型，也被叫做信念网络或者贝叶斯网络\\\\footnote{  !!!当我们希望强调从网络中计算出的值的推断本质!!!  ，尤其是强调这些值代表的是置信程度大小而不是事件的频率时，Jud', 'time': '2017-03-04T08:47'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '如图？所示', 'origin_text': '赖于t0t0\\\\RSt_0。我们用一个有向图模型来建模这种关系，  !!!就如在\\\\fig?中看到的一样!!!  。\\\\begin{figure}[!htb]\\\\ifOpenS', 'time': '2017-03-04T08:50'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉一个', 'origin_text': '/relay_race_graph}}\\t\\\\fi\\\\caption{  !!!一个!!!  描述接力赛例子的有向图模型。Alice的完成时间$\\\\RSt_0$', 'time': '2017-03-04T08:50'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '只能', 'origin_text': '\\\\RSt_0$影响了Bob的完成时间$\\\\RSt_1$，因为Bob  !!!会!!!  在Alice完成比赛后才开始。类似的，Carol也只会在Bob完', 'time': '2017-03-04T08:50'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '公式符号可能不对', 'origin_text': 'x_i\\\\mid P_{a\\\\CalG}(\\\\RSx_i))来定义的，  !!!其中!!!  PaG(xi)PaG(xi)P_{a\\\\CalG}(\\\\RSx_i)', 'time': '2017-03-04T08:51'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '100个t0的可能取值', 'origin_text': '么我们需要存储999,999999,999999,999个值（  !!!t0t0\\\\RSt_0的取值100!!!   ××\\\\times t1t1\\\\RSt_1的取值100 ××\\\\ti', 'time': '2017-03-04T08:53'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '略微', 'origin_text': 't1\\\\RSt_1的表格，而是一个包含了k−1k−1k-1个参数的  !!!略!!!  复杂的公式。有向图模型并不能对我们如何定义条件分布做出任何限制', 'time': '2017-03-04T09:01'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '作', 'origin_text': '1个参数的略复杂的公式。有向图模型并不能对我们如何定义条件分布  !!!做!!!  出任何限制。它只能定义哪些变量之间存在着依赖性关系。无向', 'time': '2017-03-04T09:02'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '少了syntax\\n', 'origin_text': '的表格，而是一个包含了k−1k−1k-1个参数的略复杂的公式。  !!!有向图模型!!!  并不能对我们如何定义条件分布做出任何限制。它只能定义哪些变量之', 'time': '2017-03-04T09:02'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 性， 或者按照原文。', 'origin_text': '如何定义条件分布做出任何限制。它只能定义哪些变量之间存在着依赖  !!!性!!!  关系。无向模型有向图模型为我们提供了一种描述结构化', 'time': '2017-03-04T09:03'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '被称为', 'origin_text': '种描述结构化概率模型的语言。而另一种常见的语言则是无向模型，也  !!!叫做!!!  马尔可夫随机场或者是马尔可夫网络 {cite?}。就像它们的名', 'time': '2017-03-04T09:04'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '当存在很明显的理由画出每一个指向特定方向的箭头时，有向模型显然最适用。', 'origin_text': '像它们的名字所说的那样，无向模型中所有的边都是没有方向的。  !!!有向模型显然适用于当存在一个很明显的理由来描述每一个箭头的时候!!!  。有向模型中，经常存在我们理解的具有因果关系以及因果关系有明确', 'time': '2017-03-04T09:06'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 下', 'origin_text': '型中，经常存在我们理解的具有因果关系以及因果关系有明确方向的情况  !!!下!!!  。接力赛的例子就是一个这样的情况。之前运动员的表现影响了后面', 'time': '2017-03-04T09:08'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '会影响', 'origin_text': '情况下。接力赛的例子就是一个这样的情况。之前运动员的表现影响  !!!了!!!  后面运动员的完成时间，而后面运动员却不会影响前面运动员的完成时间', 'time': '2017-03-04T09:08'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时', 'origin_text': '关系。当相互的作用并没有本质性的指向，或者是明确的双向相互作用  !!!的时候!!!  ，使用无向模型更加合适。作为一个这种情况的例子，假设我们希', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时', 'origin_text': '关系。当相互的作用并没有本质性的指向，或者是明确的双向相互作用  !!!的时候!!!  ，使用无向模型更加合适。作为一个这种情况的例子，假设我们希', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉是', 'origin_text': '室友和同事并不认识，所以他们不太可能直接相互传染一些疾病，比如说  !!!是!!!  感冒。这个事件太过稀有，所以我们不对此事件建模。然而，很有可', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '罕见', 'origin_text': '以他们不太可能直接相互传染一些疾病，比如说是感冒。这个事件太过  !!!稀有!!!  ，所以我们不对此事件建模。然而，很有可能他们之一将感冒传染给你', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉是', 'origin_text': '室友和同事并不认识，所以他们不太可能直接相互传染一些疾病，比如说  !!!是!!!  感冒。这个事件太过稀有，所以我们不对此事件建模。然而，很有可', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '其中', 'origin_text': '冒。这个事件太过稀有，所以我们不对此事件建模。然而，很有可能  !!!他们!!!  之一将感冒传染给你，然后通过你来传染给了另一个人。我们通过对你', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时', 'origin_text': '关系。当相互的作用并没有本质性的指向，或者是明确的双向相互作用  !!!的时候!!!  ，使用无向模型更加合适。作为一个这种情况的例子，假设我们希', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时', 'origin_text': '关系。当相互的作用并没有本质性的指向，或者是明确的双向相互作用  !!!的时候!!!  ，使用无向模型更加合适。作为一个这种情况的例子，假设我们希', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉是', 'origin_text': '室友和同事并不认识，所以他们不太可能直接相互传染一些疾病，比如说  !!!是!!!  感冒。这个事件太过稀有，所以我们不对此事件建模。然而，很有可', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '罕见', 'origin_text': '以他们不太可能直接相互传染一些疾病，比如说是感冒。这个事件太过  !!!稀有!!!  ，所以我们不对此事件建模。然而，很有可能他们之一将感冒传染给你', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '再', 'origin_text': '对此事件建模。然而，很有可能他们之一将感冒传染给你，然后通过你  !!!来!!!  传染给了另一个人。我们通过对你的同事传染给你以及你传染给你的室', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '健康状况', 'origin_text': '中的边是没有方向的，并不与一个条件分布相关联。我们把对应你  !!!的健康!!!  的随机变量记作hyhy\\\\RSh_y，对应你的室友健康状况的随机变', 'time': '2017-03-04T11:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '表示', 'origin_text': 'h_r，你的同事健康的变量记作hchc\\\\RSh_c。\\\\fig?  !!!表示来!!!  这种关系。\\\\begin{figure}[!htb]\\\\ifO', 'time': '2017-03-04T11:14'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉的？还有逗号问题。', 'origin_text': '}\\t\\\\fi\\\\caption{表示你室友健康的$\\\\RSh_r$，你  !!!的!!!  健康的$\\\\RSh_y$，你同事健康的$\\\\RSh_c$之间如何相互', 'time': '2017-03-04T11:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '对于', 'origin_text': '向模型是一个定义在无向模型 GG\\\\CalG上的结构化概率模型。  !!!对!!!  图中的每一个团\\\\footnote{图的一个团是图中结点的一个子集', 'time': '2017-03-04T11:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '它们一起', 'origin_text': '可能的联合状态所对应的密切程度。这些因子都被限制为是非负的。  !!!合在一起他们!!!  定义了未归一化概率函数：p~(x)=∏C∈Gϕ(C).p~(x', 'time': '2017-03-04T11:16'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '的', 'origin_text': '程度。这些因子都被限制为是非负的。合在一起他们定义了未归一化  !!!概!!!  率函数：p~(x)=∏C∈Gϕ(C).p~(x)=∏C∈Gϕ(', 'time': '2017-03-04T11:17'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉 的', 'origin_text': ' \\\\phi(\\\\CalC).\\\\end{align}只要所有  !!!的!!!  团中的结点数都不大，那么我们就能够高效地处理这些未归一化概率函数', 'time': '2017-03-04T11:17'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '密切度越高的状态', 'origin_text': '我们就能够高效地处理这些未归一化概率函数。它包含了这样的思想，  !!!越高密切度的状态!!!  有越大的概率。然而，不像贝叶斯网络，几乎不存在团定义的结构，所', 'time': '2017-03-04T11:18'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '，函数', 'origin_text': '}\\\\fi\\t\\\\caption{这个图说明通过选择适当的$\\\\phi$  !!!函数!!!  \\t\\t$p(\\\\RSa,\\\\RSb,\\\\RSc,\\\\RSd,\\\\RSe,\\\\R', 'time': '2017-03-04T11:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '、', 'origin_text': '}(\\\\RSe,\\\\RSf)$。}\\\\end{figure}在你  !!!，!!!  你的室友和同事之间感冒传染的例子中包含了两个团。一个团包含了h', 'time': '2017-03-04T11:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '罕见', 'origin_text': '度。两个人中只有一个人是生病的密切程度是最低的，因为这是一个很  !!!少见!!!  的状态。两个人都生病的状态（通过一个人来传染给了另一个人）有一', 'time': '2017-03-04T11:20'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这是', 'origin_text': '接写ZZZ是一个常用的方式。归一化常数ZZZ被称作是配分函数，  !!!一个!!!  从统计物理学中借鉴的术语。由于ZZZ通常是由对所有可能的x', 'time': '2017-03-04T11:22'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '，我们', 'origin_text': '样的近似方法是\\\\chap?的主要内容。在设计无向模型时  !!!我们!!!  必须牢记在心的一个要点是设定一些使得ZZZ不存在的因子也是有可能', 'time': '2017-03-04T11:23'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': 'ZZZ不存在的因子也是有可能的。当模型中的一些变量是连续的，且  !!!在!!!  p~p~\\\\tilde{p}在其定义域上的积分发散的时候这种情况就', 'time': '2017-03-04T11:24'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时，', 'origin_text': '量是连续的，且在p~p~\\\\tilde{p}在其定义域上的积分发散  !!!的时候!!!  这种情况就会发生。例如， 当我们需要对一个单独的标量变量x∈R', 'time': '2017-03-04T11:25'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '单个', 'origin_text': '一个单独的标量变量x∈Rx∈R\\\\RSx\\\\in\\\\SetR建模，并且  !!!这个包含一个点的!!!  团势能定义为ϕ(x)=x2ϕ(x)=x2\\\\phi(x) = x^', 'time': '2017-03-04T11:25'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '例如，或比如', 'origin_text': 'phi函数某些参数的选择可以决定相应的概率分布是否能够被定义。  !!!比如说!!!  ，对ϕϕ\\\\phi函数ϕ(x;β)=exp(−βx2)ϕ(x;β)', 'time': '2017-03-04T11:26'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '^2)来说，参数ββ\\\\beta决定了归一化常数ZZZ是否存在。  !!!一个!!!  正的ββ\\\\beta使得ϕϕ\\\\phi函数是一个关于xx\\\\RSx的高', 'time': '2017-03-04T11:27'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': 'eta使得ϕϕ\\\\phi函数是一个关于xx\\\\RSx的高斯分布，但是  !!!一个!!!  非正的参数ββ\\\\beta则使得ϕϕ\\\\phi不可能被归一化。', 'time': '2017-03-04T11:27'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': ' = \\\\exp(b_i\\\\RSx_i)。在这种情况下概率分布是怎  !!!么!!!  样的呢？答案是我们无法确定，因为我们并没有指定xx\\\\RVx的定', 'time': '2017-03-04T11:29'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '基？', 'origin_text': 'ext{sigmoid}(b_i)。如果xx\\\\RVx的定义域是  !!!基本单位!!!  向量 ([1,0,…,0],[0,1,…,0],…,[0,0,…', 'time': '2017-03-04T11:30'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '，一个较大的', 'origin_text': '{softmax}(\\\\Vb)，因此对于j≠ij≠ij\\\\neq i  !!!一个较大的!!!  bibib_i的值会降低所有的p(xj=1)p(xj=1)p(\\\\', 'time': '2017-03-04T11:31'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': 'j≠ij≠ij\\\\neq i一个较大的bibib_i的值会降低所有  !!!的!!!  p(xj=1)p(xj=1)p(\\\\RSx_j = 1)的概率。', 'time': '2017-03-04T11:31'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '集合', 'origin_text': '。通常情况下，通过仔细选择变量的定义域，能够使得一个相对简单的  !!!ϕϕ\\\\phi函数!!!  可以获得一个相对复杂的表达。我们会在\\\\sec?中讨论这个想法的', 'time': '2017-03-04T11:32'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '从', 'origin_text': 'j = 1)的概率。通常情况下，通过仔细选择变量的定义域，能够  !!!使得!!!  一个相对简单的ϕϕ\\\\phi函数可以获得一个相对复杂的表达。我们', 'time': '2017-03-04T11:32'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '，', 'origin_text': 'gn}E(x)E(x)E(\\\\RVx)被称作是能量函数。对所有  !!!的zz\\\\RSz exp!!!  (z)exp\\u2061(z)\\\\exp(\\\\RSz)都是正的，这保证了没有一', 'time': '2017-03-04T11:33'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '完全', 'origin_text': '个能量函数会使得某一个状态xx\\\\RVx的概率为000。我们可以  !!!很!!!  自由地选择那些能够简化学习过程的能量函数。如果我们直接学习各个', 'time': '2017-03-04T11:34'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '称为', 'origin_text': '兹曼分布的一个实例。正是基于这个原因，我们把许多基于能量的模型  !!!叫做!!!  玻尔兹曼机~{cite?}。关于什么时候叫基于能量的模型，什么', 'time': '2017-03-04T11:37'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '称之为', 'origin_text': '许多基于能量的模型叫做玻尔兹曼机~{cite?}。关于什么时候  !!!叫!!!  基于能量的模型，什么时候叫玻尔兹曼机不存在一个公认的判别标准。', 'time': '2017-03-04T11:37'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '称之为', 'origin_text': '兹曼机~{cite?}。关于什么时候叫基于能量的模型，什么时候  !!!叫!!!  玻尔兹曼机不存在一个公认的判别标准。一开始玻尔兹曼机这个术语是', 'time': '2017-03-04T11:37'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '可以参考', 'origin_text': '同团的一个因子。关于如何从无向模型结构中获得能量函数形式的示例  !!!参见!!!  \\\\fig?。人们可以将能量函数中带有多个项的基于能量的模型视作', 'time': '2017-03-04T11:39'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们令$\\\\phi$等于对应负能量的指数，可以', 'origin_text': '_{\\\\RSe,\\\\RSf}(\\\\RSe,\\\\RSf)$。值得注意的是，  !!!我们可以通过令$\\\\phi$等于对应负能量的指数来!!!  获得图\\\\?中的$\\\\phi$函数，比如，$\\\\phi_{\\\\RSa,\\\\', 'time': '2017-03-04T11:41'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '任何？', 'origin_text': '由统计物理学家做出的，其中EEE是指实际的、物理概念的能量，没有  !!!任意!!!  的符号。诸如”能量”和”配分函数”这类术语仍然与这些技术相关联', 'time': '2017-03-04T11:43'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '原文有出入', 'origin_text': '类术语仍然与这些技术相关联，尽管它们的数学适用性比在物理中更宽，  !!!尽管最早是从物理学中发现的!!!  。一些机器学习研究者（例如，{Smolensky86}将负能量', 'time': '2017-03-04T11:44'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '对于基于能量，且具有潜变量的模型？', 'origin_text': ')。对于具有潜变量。对于具有潜变量。对于具有潜变量 \\\\Vh$的  !!!基于能量的模型!!!  ， 这些算法有时会将该量的负数称为自由能：\\\\begin{ali', 'time': '2017-03-04T11:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '者所有路径都包含可观测的变量，那么它们是分离的。我们认为仅涉及  !!!到!!!  未观察到的变量的路径是”活跃”的，将包括可观察变量的路径称为”非', 'time': '2017-03-04T11:48'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '而', 'origin_text': '们是分离的。我们认为仅涉及到未观察到的变量的路径是”活跃”的，  !!!将!!!  包括可观察变量的路径称为”非活跃”的。当我们画图时，我们可', 'time': '2017-03-04T11:49'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '图时无向模型中的活跃和非活跃路径的样子。\\\\fig?描述了一个从  !!!一个!!!  无向模型中读取分离信息的例子。\\\\begin{figure}', 'time': '2017-03-04T11:49'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': 'RSb$之间不是分离的。\\xa0(b)图中$\\\\RSs$用阴影填充，表示  !!!了!!!  它是可观察的。因为$\\\\RSa$和$\\\\RSb$之间的唯一路径通过$', 'time': '2017-03-04T11:50'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '如果图结构显示给定变量集SS时 ，变量集AA与变量集BB无关， 那么我们说给定变量集SS时，变量集AAd-分离于变量集BB。', 'origin_text': '性”的意思。有向图中d-分离的定义与无向模型中分离的定义相同：  !!!我们认为如果图结构显示给定另外的变量集SS\\\\SetS时 AA\\\\SetA与变量集BB\\\\SetB无关，那么给定变量集SS\\\\SetS时，变量集AA\\\\SetAd-分离于变量集BB\\\\SetB。!!!  与无向模型一样，我们可以通过查看图中存在的活跃路径来检查图中隐含', 'time': '2017-03-04T11:53'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '查看，参考', 'origin_text': '定路径是否活跃有点复杂。关于在有向模型中识别活跃路径的方法可以  !!!参见!!!  \\\\fig?。 \\\\fig?是从一个图中读取一些属性的例子。', 'time': '2017-03-04T11:54'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '尤其重要', 'origin_text': '\\\\fig?。 \\\\fig?是从一个图中读取一些属性的例子。  !!!重要!!!  的是要记住分离和d-分离只能告诉我们\\\\emph{图中隐含}的条件', 'time': '2017-03-04T11:54'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '定环境下的独立指的是取决于网络中一些变量值的独立性。例如，考虑  !!!一个!!!  三个二进制变量的模型：aa\\\\RSa，bb\\\\RSb 和cc\\\\RSc', 'time': '2017-03-04T11:55'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '时', 'origin_text': '\\\\RSb和cc\\\\RSc不是独立的。一般来说，当独立性不存在  !!!的时候!!!  ，图不会显示独立性。 然而，图可能无法显示存在的独立性。', 'time': '2017-03-04T11:57'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '编码', 'origin_text': '说，当独立性不存在的时候，图不会显示独立性。 然而，图可能无法  !!!显示存在的!!!  独立性。\\\\begin{figure}[!htb]\\t\\\\if', 'time': '2017-03-04T11:58'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '存在的长度为$2$的所有种类的活跃路径。\\n', 'origin_text': 'fi\\\\caption{两个随机变量$\\\\RSa$，$\\\\RSb$之间  !!!存在的所有种类的长度为$2$的活跃路径。!!!  （a）箭头方向从$\\\\RSa$指向$\\\\RSb$的任何路径，反过来也', 'time': '2017-03-04T12:01'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '\\\\emph', 'origin_text': '经看到过这种类型的路径。（b）变量$\\\\RSa$和$\\\\RSb$通过  !!!共用原因\\xa0!!!  $\\\\RSs$相连。举个例子，假设$\\\\RSs$是一个表示是否存在飓', 'time': '2017-03-04T12:02'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '在$\\\\RSa$处观察到很高\\n', 'origin_text': '\\\\RSa$和$\\\\RSb$表示两个相邻气象监控区域的风速。如果我们  !!!观察到在$\\\\RSa$处有很高!!!  的风速，我们可以期望在$b$处也观察到高速的风。如果观察到$\\\\R', 'time': '2017-03-04T12:02'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '，', 'origin_text': '，我们可以期望在$b$处也观察到高速的风。如果观察到$\\\\RSs$  !!!那么!!!  这条路径就被阻塞了。如果我们已经知道存在飓风，那么无论$\\\\RSa', 'time': '2017-03-04T12:03'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '最好前面的都加，', 'origin_text': 'aa\\\\RSa和bb\\\\RSb不是d-分离的。  给定dd\\\\RSd  !!!的情况下!!!  aa\\\\RSa和bb\\\\RSb不是d-分离的。}\\\\end{f', 'time': '2017-03-04T12:07'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '合', 'origin_text': '是，一些模型很适合使用有向图\\\\emph{描述}，而另一些模型很适  !!!用于!!!  使用无向模型描述。有向模型和无向模型都有其优点和缺点。这', 'time': '2017-03-04T12:08'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '有时也可以', 'origin_text': '影响我们决定使用哪种建模方式。 即使在使用单个概率分布时，我们  !!!有时可以!!!  在不同的建模方式之间切换。有时，如果我们观察到变量的某个子集，', 'time': '2017-03-04T12:10'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '公式化，形式？', 'origin_text': '地从模型中抽取样本（在\\\\sec?中描述）的直接方法。而无向模型  !!!公式!!!  通常对于推导近似推断过程（我们将在\\\\chap?中看到，\\\\eqn?', 'time': '2017-03-04T12:11'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '其中', 'origin_text': '向模型公式通常对于推导近似推断过程（我们将在\\\\chap?中看到，  !!!\\\\e!!!  qn?强调了无向模型的作用）是很有用的。每个概率分布可以由', 'time': '2017-03-04T12:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们可以', 'origin_text': '每个概率分布可以由有向模型或由无向模型表示。在最坏的情况下，  !!!可以!!!  使用”完全图”来表示任何分布。在有向模型的情况下，完全图是任何', 'time': '2017-03-04T12:12'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '任意', 'origin_text': '可以使用”完全图”来表示任何分布。在有向模型的情况下，完全图是  !!!任何!!!  有向无环图，其中我们对随机变量排序，并且每个变量在排序中位于其之', 'time': '2017-03-04T12:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '隐含', 'origin_text': '一些变量不直接相互作用的信息。 完全图并不是很有用，因为它并不  !!!包含!!!  任何独立性。当我们用图表示概率分布时，我们想要选择一个包含', 'time': '2017-03-04T12:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '参考，查看？', 'origin_text': '道德图。关于一个通过道德化将有向图模型转化为无向模型的例子可以  !!!参见!!!  \\\\fig?。\\\\begin{figure}[!htb]\\\\i', 'time': '2017-03-04T12:18'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '在不丢失独立性的情况下是无法', 'origin_text': '到的无向模型包含了完全相同的独立关系和条件独立关系。（中）这个图  !!!是不丢失独立性的情况下无法!!!  转化为无向模型的最简单的有向模型。这个图包含了单个完整的不道德结', 'time': '2017-03-04T12:20'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '，', 'origin_text': '和$\\\\RSb$都是$\\\\RSc$的父节点，当$\\\\RSc$被观察到时  !!!它们!!!  之间通过活跃路径相连。为了捕捉这个依赖性，无向模型必须包含一个含', 'time': '2017-03-04T12:21'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '一般来说', 'origin_text': '这个团无法编码$\\\\RSa\\xa0\\\\perp\\xa0\\\\RSb$这个信息。（右）  !!!通常讲!!!  ，道德化的过程会给图添加许多边，因此丢失了一些隐含的独立性。举个', 'time': '2017-03-04T12:22'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '弦，我们必须在将它们转换为有向模型之前添加弦。添加这些弦会丢弃  !!!了!!!  在UU\\\\CalU中编码的一些独立信息。通过将弦添加到UU\\\\Ca', 'time': '2017-03-04T12:24'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '因为现在我们', 'origin_text': '通过将弦添加到UU\\\\CalU形成的图被称为弦图或者三角形化图，  !!!现在!!!  可以用更小的、三角的环来描述所有的环。要从弦图构建有向图DD\\\\', 'time': '2017-03-04T12:26'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '中的边', 'origin_text': '建有向循环，否则将无法定义有效的有向概率模型。为DD\\\\CalD  !!!中边!!!  分配方向的一种方法是对随机变量排序，然后将每个边从排序较早的节点', 'time': '2017-03-04T12:27'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '排序稍后', 'origin_text': '方向的一种方法是对随机变量排序，然后将每个边从排序较早的节点指向  !!!稍后排序!!!  的节点。一个简单的实例参见\\\\fig?。\\\\begin{f', 'time': '2017-03-04T12:27'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '见', 'origin_text': '然后将每个边从排序较早的节点指向稍后排序的节点。一个简单的实例  !!!参见!!!  \\\\fig?。\\\\begin{figure}[!htb]\\\\i', 'time': '2017-03-04T12:27'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '排序稍后', 'origin_text': '的一种方法是赋予节点一定的顺序，然后将每个边从排序较早的节点指向  !!!稍后排序!!!  的节点。在这个例子中，我们根据变量名的字母进行排序。}\\\\end{', 'time': '2017-03-04T12:29'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '语法', 'origin_text': '因子图是从无向模型中抽样的另一种方法，它可以解决标准无向模型  !!!句法!!!  中图表达的模糊性。在无向模型中，每个ϕϕ\\\\phi函数的范围必须', 'time': '2017-03-04T12:29'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'emph', 'origin_text': '性。在无向模型中，每个ϕϕ\\\\phi函数的范围必须是图中某个团的  !!!子集!!!  。我们无法确定每一个团是否含有一个作用域包含整个团的因子——比', 'time': '2017-03-04T12:30'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '图形化？', 'origin_text': '种模糊性。具体来说，因子图是一个包含无向二分图的无向模型的  !!!图形!!!  表示。一些节点被绘制为圆形。 这些节点对应于随机变量，就像在', 'time': '2017-03-04T12:34'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '交换语序', 'origin_text': '包含无向二分图的无向模型的图形表示。一些节点被绘制为圆形。   !!!这些节点对应于随机变量，就像在标准无向模型中一样!!!  。其余节点绘制为方块。这些节点对应于未归一化概率函数的因子 ', 'time': '2017-03-04T12:34'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '存在连接', 'origin_text': '当且仅当变量包含在未归一化概率函数的因子中时，变量和因子在图中  !!!连接!!!  。没有因子可以连接到图中的另一个因子，也不能将变量连接到变量。', 'time': '2017-03-04T12:35'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '可以通过一个简单高效的过程从模型所表示的联合分布中产生样本，这个过程被称为原始采样。', 'origin_text': '图模型同样简化了从模型中采样的过程。有向图模型的一个优点是，  !!!可以通过一个简单高效的被称作是原始采样的过程从由模型表示的联合分布中抽取样本!!!  。其基本思想是将图中的变量xixi\\\\RSx_i使用拓扑排序', 'time': '2017-03-05T02:09'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '原始采样', 'origin_text': '的被称作是原始采样的过程从由模型表示的联合分布中抽取样本。  !!!其!!!  基本思想是将图中的变量xixi\\\\RSx_i使用拓扑排序，使得对于', 'time': '2017-03-05T02:09'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '只要不难从每个条件分布xi∼P(xi∣PaG(xi))xi∼P(xi∣PaG(xi))\\\\RSx_i\\\\sim P(\\\\RSx_i\\\\mid Pa_{\\\\CalG}(\\\\RSx_i))中采样，那么从整个模型中采样也是容易的。\\n', 'origin_text': 'Sx_n\\\\mid Pa_{\\\\CalG}(\\\\RSx_n))中采样。  !!!只要从每个条件分布xi∼P(xi∣PaG(xi))xi∼P(xi∣PaG(xi))\\\\RSx_i\\\\sim P(\\\\RSx_i\\\\mid Pa_{\\\\CalG}(\\\\RSx_i))中采样都是很容易的，那么很容易从整个模型中抽样。!!!  拓扑排序操作保证我们可以按照\\\\eqn?中条件分布的顺序依次采样', 'time': '2017-03-05T02:11'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们可能会在变量父节点可用之前尝试对其采样。\\n', 'origin_text': '可以按照\\\\eqn?中条件分布的顺序依次采样。如果没有拓扑排序，  !!!我们可能会尝试在其父节点可用之前对该变量进行抽样。!!!  对于一些图，可能有多个拓扑排序。 原始采样可以使用这些拓', 'time': '2017-03-05T02:13'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '非常简便', 'origin_text': '原始采样通常非常快（假设从每个条件分布中采样都是很容易的）并且  !!!方便!!!  。原始采样的一个缺点是其仅适用于有向图模型。 另一个缺点', 'time': '2017-03-05T02:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '有些图可能存在', 'origin_text': '扑排序，我们可能会尝试在其父节点可用之前对该变量进行抽样。  !!!对于一些图，可能有!!!  多个拓扑排序。 原始采样可以使用这些拓扑排序中的任何一个。', 'time': '2017-03-05T02:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '原文出入', 'origin_text': '）并且方便。原始采样的一个缺点是其仅适用于有向图模型。   !!!另一个缺点是它并不是每次采样都是条件采样操作!!!  。当我们希望从有向图模型中变量的子集中抽样时，给定一些其他变量', 'time': '2017-03-05T02:15'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '采', 'origin_text': '每次采样都是条件采样操作。当我们希望从有向图模型中变量的子集中  !!!抽!!!  样时，给定一些其他变量，我们经常要求所有给定的条件变量在图中比要', 'time': '2017-03-05T02:16'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '顺序图', 'origin_text': '子集中抽样时，给定一些其他变量，我们经常要求所有给定的条件变量在  !!!图!!!  中比要抽样的变量的顺序要早。在这种情况下，我们可以从模型分布指', 'time': '2017-03-05T02:18'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '采', 'origin_text': '样时，给定一些其他变量，我们经常要求所有给定的条件变量在图中比要  !!!抽!!!  样的变量的顺序要早。在这种情况下，我们可以从模型分布指定的局部', 'time': '2017-03-05T02:18'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '分布中', 'origin_text': '的顺序要早。在这种情况下，我们可以从模型分布指定的局部条件概率  !!!分布!!!  进行抽样。 否则，我们需要采样的条件分布是给定观测变量的后验分', 'time': '2017-03-05T02:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '采', 'origin_text': '早。在这种情况下，我们可以从模型分布指定的局部条件概率分布进行  !!!抽!!!  样。 否则，我们需要采样的条件分布是给定观测变量的后验分布。', 'time': '2017-03-05T02:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '很高', 'origin_text': '在模型中通常没有明确指定和参数化。 推断这些后验分布的代价可能  !!!是昂贵的!!!  。 在这种情况下的模型中，原始采样不再有效。不幸的是，原', 'time': '2017-03-05T02:19'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '要', 'origin_text': '向模型来实现从无向模型中抽样，但是这通常需要解决棘手的推断问题（  !!!以!!!  确定新有向图的根节点上的边缘分布），或者需要引入许多边从而会使得', 'time': '2017-03-05T02:20'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '采', 'origin_text': '者需要引入许多边从而会使得到的有向模型变得难以处理。从无向模型  !!!抽!!!  样，而不首先将其转换为有向模型的做法似乎需要解决循环依赖的问题。', 'time': '2017-03-05T02:21'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '采样', 'origin_text': '需要解决循环依赖的问题。 每个变量与每个其他变量相互作用，因此  !!!对于抽样!!!  过程没有明确的起点。不幸的是，从无向模型中抽取样本是一个昂贵的', 'time': '2017-03-05T02:22'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这个没问题', 'origin_text': '互作用，因此对于抽样过程没有明确的起点。不幸的是，从无向模型中  !!!抽取!!!  样本是一个昂贵的多次迭代的过程。理论上最简单的方法是Gibbs', 'time': '2017-03-05T02:23'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '我们很难', 'origin_text': '重新取样。在多次重复之后，该过程渐近地收敛到正确的目标分布。  !!!很难!!!  确定样本何时达到所期望分布的足够精确的近似。无向模型的抽样技术', 'time': '2017-03-05T02:25'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '采', 'origin_text': '。很难确定样本何时达到所期望分布的足够精确的近似。无向模型的  !!!抽!!!  样技术是一个高级的研究方向，\\\\chap?将对此进行更详细的讨论。', 'time': '2017-03-05T02:26'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '选择不对某些变量的相互作用进行建模是允许所有这些操作使用较少的运行时间和内存的主要机制。\\n', 'origin_text': '有向模型中采样还可以被加速，但是对于无向模型情况则较为复杂。  !!!允许所有这些操作使用较少的运行时间和内存的主要机制是选择不对某些变量的相互作用进行建模。!!!  图模型通过省略某些边来传达信息。在没有边的情况下，模型假设不', 'time': '2017-03-05T02:27'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '太长', 'origin_text': '在没有边的情况下，模型假设不对变量间直接的相互作用建模。  !!!使用结构化概率模型的一个更加不容易量化的益处是它们允许我们明确地将给定的现有的知识与知识的学习或者推断分开!!!  。这使我们的模型更容易开发和调试。 我们可以设计、分析和评估', 'time': '2017-03-05T02:28'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '认为数据中存在的重要关系的', 'origin_text': '范围的图的学习算法和推断算法。同时，我们可以设计能够捕捉到我们  !!!认为重要的关系的!!!  模型。然后，我们可以组合这些不同的算法和结构，并获得不同可能性', 'time': '2017-03-05T02:30'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '然而，为', 'origin_text': '们可以组合这些不同的算法和结构，并获得不同可能性的笛卡尔乘积。  !!!为!!!  每种可能的情况设计端到端的算法是困难的。学习依赖性关系', 'time': '2017-03-05T02:30'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '会更加困难', 'origin_text': '并获得不同可能性的笛卡尔乘积。为每种可能的情况设计端到端的算法  !!!是困难的!!!  。学习依赖性关系良好的生成模型需要准确地捕获所观察', 'time': '2017-03-05T02:31'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '去掉', 'origin_text': '。在深度学习中，最常用于建模这些依赖性关系的方法是引入几个潜在  !!!的!!!  或”隐藏”变量hh\\\\RVh。然后，该模型可以捕获任何对之间的依', 'time': '2017-03-05T02:32'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '原文出入', 'origin_text': '这些依赖性关系的方法是引入几个潜在的或”隐藏”变量hh\\\\RVh。  !!!然后，该模型可以捕获任何对之间的依赖性关系（变量vivi\\\\RSv_i和vjvj\\\\RSv_j间接依赖，vivi\\\\RSv_i和hh\\\\RVh之间直接依赖，vv\\\\RVv和hjhj\\\\RSh_j直接依赖)。!!!  一个好的不包含任何潜变量的 关于vv\\\\RVv的模型需要在贝', 'time': '2017-03-05T02:33'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '如果一个良好的关于v的模型不包含任何潜变量，那么它在贝叶斯网络中的每个节点需要具有大量父节点或在马尔可夫网络中具有非常大的团。', 'origin_text': '间直接依赖，vv\\\\RVv和hjhj\\\\RSh_j直接依赖)。  !!!一个好的不包含任何潜变量的 关于vv\\\\RVv的模型需要在贝叶斯网络中的每个节点具有大量父节点或在马尔可夫网络中具有非常大的团。!!!  仅仅表示这些高阶的相互作用是昂贵的，首先从计算角度上，存储在存', 'time': '2017-03-05T02:36'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '仅仅是表示这些高阶相互作用的代价就很高，', 'origin_text': '络中的每个节点具有大量父节点或在马尔可夫网络中具有非常大的团。  !!!仅仅表示这些高阶的相互作用是昂贵的!!!  ，首先从计算角度上，存储在存储器中的参数数量是团中成员数量的指数', 'time': '2017-03-05T02:38'}\n\n=============================   Replies   =============================\n\n"
  },
  {
    "path": "Chapter16/structured_probabilistic_modelling.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Tianfan Fu\n\\chapter{\\glsentrytext{DL}中的\\glsentrytext{structured_probabilistic_models}}\n\\label{chap:structured_probabilistic_models_for_deep_learning}\n% 549\n\n\n%\\gls{DL}为研究者们提供了许多指导性的建模和设计算法的思路。%??\n\\gls{DL}为研究者们提供了许多建模方式，用以设计以及描述算法。\n其中一种形式是\\firstgls{structured_probabilistic_models}的思想。\n我们曾经在\\secref{sec:structured_probabilistic_models_chap3}中简要讨论过\\gls{structured_probabilistic_models}。\n此前简要的介绍已经足够使我们充分了解如何使用\\gls{structured_probabilistic_models}作为描述第二部分中某些算法的语言。\n现在在第三部分，我们可以看到\\gls{structured_probabilistic_models}是许多\\gls{DL}重要研究方向的关键组成部分。\n作为讨论这些研究方向的预备知识，本章将更加详细地描述\\gls{structured_probabilistic_models}。\n本章内容是自洽的，所以在阅读本章之前读者不需要回顾之前的介绍。\n% 549\n\n\n\\gls{structured_probabilistic_models}使用图来描述概率分布中随机变量之间的直接相互作用，从而描述一个概率分布。\n在这里我们使用了图论（一系列结点通过一系列边来连接）中``图''的概念，由于模型结构是由图定义的，所以这些模型也通常被称为\\firstgls{graphical_models}。\n% 549\n\n\n\\gls{graphical_models}的研究社群是巨大的，并提出过大量的模型、训练算法和推断算法。\n在本章中，我们将介绍\\gls{graphical_models}中几个核心方法的基本背景，并且重点描述已被证明对\\gls{DL}社群最有用的观点。\n如果你已经熟知\\gls{graphical_models}，那么你可以跳过本章的绝大部分。\n然而，我们相信即使是资深的\\gls{graphical_models}方向的研究者也会从本章的最后一节中获益匪浅，详见\\secref{sec:the_deep_learning_approach_to_structured_probabilistic_models}，其中我们强调了在\\gls{DL}算法中使用图模型的独特方式。\n相比于其他\\gls{graphical_models}研究领域的是，\\gls{DL}的研究者们通常会使用完全不同的模型结构、学习算法和推断过程。\n在本章中，我们将指明这种区别并解释其中的原因。\n% 550 head\n\n\n我们首先介绍了构建大规模概率模型时面临的挑战。\n之后，我们介绍如何使用一个图来描述概率分布的结构。\n尽管这个方法能够帮助我们解决许多挑战和问题，它本身仍有很多缺陷。\n\\gls{graphical_models}中的一个主要难点就是判断哪些变量之间存在直接的相互作用关系，也就是对于给定的问题哪一种图结构是最适合的。\n在\\secref{sec:learning_about_dependencies}中，我们通过了解\\firstgls{dependency}，简要概括了解决这个难点的两种方法。\n%最后，在\\secref{sec:the_deep_learning_approach_to_structured_probabilistic_models}中，我们讨论并强调了\\gls{graphical_models}在\\gls{DL}中的一些独特之处和一些特有的方法，作为本章的收尾。\n最后，作为本章的收尾，我们在\\secref{sec:the_deep_learning_approach_to_structured_probabilistic_models}中讨论\\gls{DL}研究者使用\\gls{graphical_models}特定方式的独特之处。\n% 550  ok\n\n\n\n\\section{非结构化建模的挑战}\n\\label{sec:the_challenge_of_unstructured_modelling}\n% 16.1   p 550 \n\n\n\\gls{DL}的目标是使得\\gls{ML}能够解决许多\\gls{AI}中亟需解决的挑战。\n这也意味着它们能够理解具有丰富结构的高维数据。\n举个例子，我们希望\\glssymbol{AI}的算法能够理解自然图片\\footnote{自然图片指的是能够在正常的环境下被照相机拍摄的图片，不同于合成的图片，或者一个网页的截图等等。}，表示语音的声音信号和包含许多词和标点的文档。\n% 550  ok\n\n\n分类问题可以把这样一个来自高维分布的数据作为输入，然后使用一个类别的标签来概括它——这个标签可以是照片中是什么物品，一段语音中说的是哪个单词，也可以是一段文档描述的是哪个话题。\n这个分类过程丢弃了输入数据中的大部分信息，然后产生单个值的输出（或者是关于单个输出值的概率分布）。\n这个分类器通常可以忽略输入数据的很多部分。\n例如，当我们识别一张照片中的一个物体时，我们通常可以忽略图片的背景。\n% 550  ok\n\n\n我们也可以使用概率模型完成许多其他的任务。\n这些任务通常相比于分类成本更高。\n其中的一些任务需要产生多个输出。\n大部分任务需要对输入数据整个结构的完整理解，所以并不能舍弃数据的一部分。\n这些任务包括以下几个：\n\\begin{itemize}\n\\item \\textbf{估计密度函数}：给定一个输入$\\Vx$，\\gls{ML}系统返回一个对数据生成分布的真实密度函数$p(\\Vx)$的估计。\n这只需要一个输出，但它需要完全理解整个输入。\n即使向量中只有一个元素不太正常，系统也会给它赋予很低的概率。\n% 551  ok\n\t\n\t\n\\item\n\\textbf{\\gls{denoising}}：给定一个受损的或者观察有误的输入数据$\\tilde{\\Vx}$，\\gls{ML}系统返回一个对原始的真实$\\Vx$的估计。\n举个例子，有时候\\gls{ML}系统需要从一张老相片中去除灰尘或者抓痕。\n这个系统会产生多个输出值（对应着估计的干净样本$\\Vx$的每一个元素），并且需要我们有一个对输入的整体理解（因为即使只有一个损坏的区域，仍然会显示最终估计被损坏）。%??\n\t% 551 ok\n\t\n\\item\n\\textbf{缺失值的填补}：给定$\\Vx$的某些元素作为观察值，模型被要求返回一个$\\Vx$\n一些或者全部未观察值的估计或者概率分布。\n这个模型返回的也是多个输出。\n由于这个模型需要恢复$\\Vx$的每一个元素，所以它必须理解整个输入。\n% 551 ok\n\t\n\t\n\\item \\textbf{采样}： 模型从分布$p(\\Vx)$中抽取新的样本。\n其应用包括语音合成，即产生一个听起来很像人说话的声音。\n这个模型也需要多个输出以及对输入整体的良好建模。\n即使样本只有一个从错误分布中产生的元素，那么采样的过程也是错误的。 \n% 551\n\\end{itemize}\n\n\\figref{fig:chap16_fig-ssrbm}中描述了一个使用较小的自然图片的采样任务。\n% 551 ok \n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics[width=0.9\\textwidth]{Chapter16/figures/fig-ssrbm_nearest_train}}\\ \\\\\n     \\centerline{\\includegraphics[width=0.9\\textwidth]{Chapter16/figures/fig-ssrbm_samples}}\n\\fi\n\t\\caption{自然图片的概率建模。\n\\emph{(上)}~CIFAR-10数据集\\citep{KrizhevskyHinton2009}中的$32\\times 32$像素的样例图片。\n\\emph{(下)}从这个数据集上训练的\\gls{structured_probabilistic_models}中抽出的样本。\n每一个样本都出现在与其欧氏距离最近的训练样本的格点中。\n这种比较使得我们发现这个模型确实能够生成新的图片，而不是记住训练样本。\n为了方便展示，两个集合的图片都经过了微调。\n图片经~\\citet{Courville+al-2011-small}许可转载。}\n\t\\label{fig:chap16_fig-ssrbm}\n\\end{figure}\n\n对上千甚至是上百万随机变量的分布建模，无论从计算上还是从统计意义上说，都是一个极具挑战性的任务。\n假设我们只想对二值的随机变量建模。\n这是一个最简单的例子，但是我们仍然无能为力。\n对一个只有$32\\times 32$像素的彩色（RGB）图片来说，存在$2^{3072}$种可能的二值图片。\n这个数量已经超过了$10^{800}$，比宇宙中的原子总数还要多。\n% 551 \n\n通常意义上讲，如果我们希望对一个包含$n$个离散变量并且每个变量都能取$k$个值的$\\Vx$的分布建模，那么最简单的表示$P(\\Vx)$的方法需要存储一个可以查询的表格。\n这个表格记录了每一种可能值的概率，则需要$k^n$个参数。\n% 551 \n\n基于下述几个原因，这种方式是不可行的：\n\\begin{itemize}\n\\item \\emph{内存： 存储参数的开销。}\n除了极小的$n$和$k$的值，用表格的形式来表示这样一个分布需要太多的存储空间。\n% 551 \n\t\n\\item  \\emph{统计的高效性}： \n当模型中的参数个数增加时，使用统计估计器估计这些参数所需要的训练数据数量也需要相应地增加。\n因为基于查表的模型拥有天文数字级别的参数，为了准确地拟合，相应的训练集的大小也是相同级别的。\n任何这样的模型都会导致严重的\\gls{overfitting}，除非我们添加一些额外的假设来联系表格中的不同元素（正如\\secref{sec:n_grams}中所举的\\gls{backoff}或者平滑~\\gls{n_gram}~模型）。\n% 552  end\n\t\n\\item \\emph{运行时间：推断的开销。}\n假设我们需要完成这样一个推断的任务，其中我们需要使用联合分布$P(\\RVx)$来计算某些其他的分布，比如说边缘分布$P(\\RSx_1)$或者是条件分布$P(\\RSx_2\\mid \\RSx_1)$。\n计算这样的分布需要对整个表格的某些项进行求和操作，因此这样的操作的运行时间和上述高昂的内存开销是一个级别的。\n% 553 head\n\t\n\t\n\\item \\emph{运行时间： 采样的开销。}\n类似的，假设我们想要从这样的模型中采样。\n最简单的方法就是从均匀分布中采样，$u\\sim \\text{U}(0,1)$，然后把表格中的元素累加起来，直到和大于$u$，然后返回最后一个加上的元素。\n最差情况下，这个操作需要读取整个表格，所以和其他操作一样，它也需要指数级别的时间。\n\\end{itemize}\n% 553 \n\n\n\n基于表格操作的方法的主要问题是我们显式地对每一种可能的变量子集所产生的每一种可能类型的相互作用建模。\n在实际问题中我们遇到的概率分布远比这个简单。\n通常，许多变量只是间接地相互作用。\n% 553\n\n\n例如，我们想要对接力跑步比赛中一个队伍完成比赛的时间进行建模。\n假设这个队伍有三名成员：Alice， Bob和Carol。\n在比赛开始时，Alice拿着接力棒，开始跑第一段距离。\n在跑完她的路程以后，她把棒递给了Bob。\n然后Bob开始跑，再把棒给Carol，Carol跑最后一棒。\n我们可以用连续变量来建模他们每个人完成的时间。\n因为Alice第一个跑，所以她的完成时间并不依赖于其他的人。\nBob的完成时间依赖于Alice的完成时间，因为Bob只能在Alice跑完以后才能开始跑。\n如果Alice跑得更快，那么Bob也会完成得更快。\n所有其他关系都可以被类似地推出。\n最后，Carol的完成时间依赖于她的两个队友。\n如果Alice跑得很慢，那么Bob也会完成得更慢。\n结果，Carol将会更晚开始跑步，因此她的完成时间也更有可能要晚。\n然而，在给定Bob完成时间的情况下，Carol的完成时间只是\\emph{间接地}依赖于Alice的完成时间。\n如果我们已经知道了Bob的完成时间，知道Alice的完成时间对估计Carol的完成时间并无任何帮助。\n这意味着我们可以通过仅仅两个相互作用来建模这个接力赛。\n这两个相互作用分别是Alice的完成时间对Bob的完成时间的影响和Bob的完成时间对Carol的完成时间的影响。\n在这个模型中，我们可以忽略第三种间接的相互作用，即Alice的完成时间对Carol的完成时间的影响。\n% 553\n\n\n\\gls{structured_probabilistic_models}为随机变量之间的直接作用提供了一个正式的建模框架。\n这种方式大大减少了模型的参数个数以致于模型只需要更少的数据来进行有效的估计。\n%这些更轻便的模型在模型存储，模型推断以及从模型中采样时有着更小的计算开销。\n这些更小的模型大大减小了在模型存储、模型推断以及从模型中采样时的计算开销。\n% 554 head  \n\n\n\\section{使用图描述模型结构}\n\\label{sec:using_graphs_to_describe_model_structure}\n% 554\n\n\n\\gls{structured_probabilistic_models}使用图（在图论中``结点''是通过``边''来连接的）来表示随机变量之间的相互作用。\n每一个结点代表一个随机变量。\n每一条边代表一个直接相互作用。\n这些直接相互作用隐含着其他的间接相互作用，但是只有直接的相互作用会被显式地建模。\n% 554\n\n\n使用图来描述概率分布中相互作用的方法不止一种。\n在下文中我们会介绍几种最为流行和有用的方法。\n\\gls{graphical_models}可以被大致分为两类：基于有向无环图的模型和基于无向图的模型。\n% 554\n\n\n\\subsection{\\glsentrytext{directed_model}}\n\\label{sec:directed_models}\n% 554\n\n\n\\firstgls{directed_graphical_model}是一种\\gls{structured_probabilistic_models}，也被称为\\firstgls{BN}或者\\firstgls{bayesian_network}\\footnote{当我们希望``强调''从网络中计算出的值的``推断''本质，即强调这些值代表的是置信程度大小而不是事件的频率时，Judea Pearl建议使用``\\gls{bayesian_network}''这个术语。}%??\n \\citep{pearl85bayesian}。\n% 554\n\n\n之所以命名为\\gls{directed_graphical_model}是因为所有的边都是有方向的，即从一个结点指向另一个结点。\n这个方向可以通过画一个箭头来表示。\n箭头所指的方向表示了这个随机变量的概率分布是由其他变量的概率分布所定义的。\n画一个从结点$\\RSa$到结点$\\RSb$的箭头表示了我们用一个条件分布来定义$\\RSb$，而$\\RSa$是作为这个条件分布符号右边的一个变量。\n换句话说，$\\RSb$的概率分布依赖于$\\RSa$的取值。\n% 554\n\n\n我们继续\\secref{sec:the_challenge_of_unstructured_modelling}所讲的接力赛的例子，我们假设Alice的完成时间为$\\RSt_0$，Bob的完成时间为$\\RSt_1$，Carol的完成时间为$\\RSt_2$。\n就像我们之前看到的一样，$\\RSt_1$的估计是依赖于$\\RSt_0$的，$\\RSt_2$的估计是直接依赖于$\\RSt_1$的，但是仅仅间接地依赖于$\\RSt_0$。\n我们用一个\\gls{directed_graphical_model}来建模这种关系，如\\figref{fig:relay_race_graph}所示。\n% 554 end\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter16/figures/relay_race_graph}}\t\n\\fi\n\\caption{描述接力赛例子的\\gls{directed_graphical_model}。\nAlice的完成时间$\\RSt_0$影响了Bob的完成时间$\\RSt_1$，因为Bob只能在Alice完成比赛后才开始。\n类似的，Carol也只会在Bob完成之后才开始，\n所以Bob的完成时间$\\RSt_1$直接影响了Carol的完成时间$\\RSt_2$。}\n\\label{fig:relay_race_graph}\n\\end{figure}\n\n\n% 555 head \n正式地说，变量$\\RVx$的有向概率模型是通过有向无环图$\\CalG$ （每个结点都是模型中的随机变量）\n和一系列\\firstgls{local_conditional_probability_distribution} $p(\\RSx_i\\mid Pa_{\\CalG}(\\RSx_i))$来定义的，其中$Pa_{\\CalG}(\\RSx_i)$表示结点$\\RSx_i$的所有父结点。\n$\\RVx$的概率分布可以表示为\n\\begin{align}\n\\label{eqn:161}\np(\\RVx) = \\prod_{i} p(\\RSx_i\\mid Pa_{\\CalG}(\\RSx_i)).\n\\end{align}\n% 555 \n\n\n在之前所述的接力赛的例子中，参考\\figref{fig:relay_race_graph}，这意味着概率分布可以被表示为\n\\begin{align}\n\\label{eqn:162}\np(\\RSt_0,\\RSt_1,\\RSt_2) = p(\\RSt_0)p(\\RSt_1\\mid \\RSt_0)p(\\RSt_2\\mid \\RSt_1).\n\\end{align}\n% 555 \n\n\n这是我们看到的第一个\\gls{structured_probabilistic_models}的实际例子。\n我们能够检查这样建模的计算开销，为了验证相比于非结构化建模，结构化建模为什么有那么多的优势。\n% 555 \n\n\n假设我们采用从第$0$分钟到第$10$分钟每$6$秒一块的方式离散化地表示时间。\n这使得$\\RSt_0$，$\\RSt_1$和$\\RSt_2$都是一个有$100$个取值可能的离散变量。\n如果我们尝试着用一个表来表示$p(\\RSt_0, \\RSt_1, \\RSt_2)$，那么我们需要存储$999,999$个值\n（100个$\\RSt_0$的可能取值 $\\times$ 100个$\\RSt_1$的可能取值 $\\times$ 100个$\\RSt_2$的可能取值 减去1，由于存在所有的概率之和为$1$的限制，所以其中有$1$个值的存储是多余的）。\n反之，如果我们用一个表来记录每一种条件概率分布，那么表中记录$\\RSt_0$的分布需要存储$99$个值，给定$\\RSt_0$情况下$\\RSt_1$的分布需要存储9900个值，给定$\\RSt_1$情况下$\\RSt_2$的分布也需要存储$9900$个值。\n加起来总共需要存储$19, 899$个值。\n这意味着使用\\gls{directed_graphical_model}将参数的个数减少了超过$50$倍！\n% 555 \n\n\n通常意义上说，对每个变量都能取$k$个值的$n$个变量建模，基于建表的方法需要的复杂度是$O(k^n)$，就像我们之前观察到的一样。\n现在假设我们用一个\\gls{directed_graphical_model}来对这些变量建模。\n如果$m$代表\\gls{graphical_models}的单个条件概率分布中最大的变量数目（在条件符号的左右皆可），那么对这个\\gls{directed_model}建表的复杂度大致为$O(k^m)$。\n只要我们在设计模型时使其满足$m\\ll n$，那么复杂度就会被大大地减小。\n% 555 \n\n\n换一句话说，只要图中的每个变量都只有少量的父结点，那么这个分布就可以用较少的参数来表示。\n图结构上的一些限制条件，比如说要求这个图为一棵树，也可以保证一些操作（例如求一小部分变量的边缘或者条件分布）更加地高效。\n% 556 head   16.2 to here \n\n\n\n决定哪些信息需要被包含在图中而哪些不需要是很重要的。\n如果变量之间可以被假设为是\\gls{conditional_independent}的，那么这个图可以包含这种简化假设。\n当然也存在其他类型的简化\\gls{graphical_models}的假设。\n例如，我们可以假设无论Alice的表现如何，Bob总是跑得一样快\n（实际上，Alice的表现很大概率会影响Bob的表现，这取决于Bob的性格，\n如果在之前的比赛中Alice跑得特别快，这有可能鼓励Bob更加努力并取得更好的成绩，当然这也有可能使得Bob过分自信或者变得懒惰）。\n那么Alice对Bob的唯一影响就是在计算Bob的完成时间时需要加上Alice的时间。\n这个假设使得我们所需要的参数量从$O(k^2)$降到了$O(k)$。\n然而，值得注意的是在这个假设下$\\RSt_0$和$\\RSt_1$仍然是直接相关的，因为$\\RSt_1$表示的是Bob完成时的时间，并不是他跑的总时间。\n这也意味着图中会有一个从$\\RSt_0$指向$\\RSt_1$的箭头。\n``Bob的个人跑步时间相对于其他因素是独立的''这个假设无法在$\\RSt_0$，$\\RSt_1$，$\\RSt_2$的图中被表示出来。\n反之，我们只能将这个关系表示在条件分布的定义中。\n这个条件分布不再是一个大小为$k\\times k-1$的分别对应着$\\RSt_0$，  $\\RSt_1$的表格，而是一个包含了$k-1$个参数的略微复杂的公式。\n\\gls{directed_graphical_model}的语法并不能对我们如何定义条件分布作出任何限制。\n它只定义了哪些变量可以作为其中的参数。\n% 556  16.2 to \n\n\n\n\\subsection{\\glsentrytext{undirected_model}}\n\\label{sec:undirected_models}\n% 556\n\n\n\\gls{directed_graphical_model}为我们提供了一种描述\\gls{structured_probabilistic_models}的语言。\n而另一种常见的语言则是\\firstgls{undirected_model}，也被称为\\firstall{MRF}或者是\\firstgls{markov_network} \\citep{kindermann-book-1980}。\n就像它们的名字所说的那样，\\gls{undirected_model}中所有的边都是没有方向的。\n% 556 end\n\n\n%\\gls{directed_model}显然适用于当存在一个很明显的理由来描述每一个箭头时。\n当存在很明显的理由画出每一个指向特定方向的箭头时，\\gls{directed_model}显然最适用。\n\\gls{directed_model}中，经常存在我们理解的具有因果关系以及因果关系有明确方向的情况。\n接力赛的例子就是一个这样的情况。\n之前运动员的表现会影响后面运动员的完成时间，而后面运动员却不会影响前面运动员的完成时间。\n% 557 head \n\n\n然而并不是所有情况的相互作用都有一个明确的方向关系。\n当相互的作用并没有本质性的指向，或者是明确的双向相互作用时，使用\\gls{undirected_model}更加合适。\n% 557 \n\n\n作为一个这种情况的例子，假设我们希望对三个二值随机变量建模：你是否生病，你的同事是否生病以及你的室友是否生病。\n就像在接力赛的例子中所作的简化假设一样，我们可以在这里做一些关于相互作用的简化假设。\n假设你的室友和同事并不认识，所以他们不太可能直接相互传染一些疾病，比如说感冒。\n这个事件太过罕见，所以我们不对此事件建模。\n然而，很有可能其中之一将感冒传染给你，然后通过你再传染给了另一个人。\n我们通过对你的同事传染给你以及你传染给你的室友建模来对这种间接的从你的同事到你的室友的感冒传染建模。\n% 557 \n\n\n在这种情况下，你传染给你的室友和你的室友传染给你都是非常容易的，所以模型不存在一个明确的单向箭头。\n这启发我们使用\\gls{undirected_model}。\n其中随机变量对应着图中的相互作用的结点。\n与\\gls{directed_model}相同的是，如果在\\gls{undirected_model}中的两个结点通过一条边相连接，那么对应这些结点的随机变量相互之间是直接作用的。\n不同于\\gls{directed_model}，在\\gls{undirected_model}中的边是没有方向的，并不与一个条件分布相关联。\n% 557 \n\n\n我们把对应你健康状况的随机变量记作$\\RSh_y$，对应你的室友健康状况的随机变量记作$\\RSh_r$，你的同事健康的变量记作$\\RSh_c$。\n\\figref{fig:cold_undirected_graph}表示这种关系。\n% 557 end\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/cold_undirected_graph}}\t\n\\fi\n\\caption{表示你室友健康状况的$\\RSh_r$、你健康状况的$\\RSh_y$和你同事健康状况的$\\RSh_c$之间如何相互影响的一个无向图。\n你和你的室友可能会相互传染感冒，你和你的同事之间也是如此，\n但是假设你室友和同事之间相互不认识，他们只能通过你来间接传染。}\n\t\\label{fig:cold_undirected_graph}\n\\end{figure}\n\n正式地说，一个\\gls{undirected_model}是一个定义在\\gls{undirected_model} $\\CalG$上的\\gls{structured_probabilistic_models}。\n对于图中的每一个\\gls{clique}\\footnote{图的一个\\gls{clique}是图中结点的一个子集，并且其中的点是全连接的}$~\\CalC$，\n一个\\firstgls{factor} $\\phi(\\CalC)$(也称为\\firstgls{clique_potential})，衡量了\\gls{clique}中变量每一种可能的联合状态所对应的密切程度。\n这些\\gls{factor}都被限制为是非负的。\n它们一起定义了\\firstgls{unnormalized_probability_function}：\n\\begin{align}\n\\label{eqn:163}\n\\tilde{p}(\\RVx) = \\prod_{\\CalC\\in\\CalG} \\phi(\\CalC).\n\\end{align}\n% 558 head\n\n\n只要所有\\gls{clique}中的结点数都不大，那么我们就能够高效地处理这些\\gls{unnormalized_probability_function}。\n它包含了这样的思想，密切度越高的状态有越大的概率。\n然而，不像\\gls{bayesian_network}，几乎不存在\\gls{clique}定义的结构，所以不能保证把它们乘在一起能够得到一个有效的概率分布。\n\\figref{fig:example_undirected}展示了一个从\\gls{undirected_model}中读取分解信息的例子。\n% 558\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/example_undirected}}\n\\fi\n\t\\caption{这个图说明通过选择适当的$\\phi$，函数\n\t\t$p(\\RSa,\\RSb,\\RSc,\\RSd,\\RSe,\\RSf)$可以写作\n\t\t$\\frac{1}{Z}\\phi_{\\RSa,\\RSb}(\\RSa,\\RSb)\\phi_{\\RSb,\\RSc}(\\RSb,\\RSc)\\phi_{\\RSa,\\RSd}(\\RSa,\\RSd)\\phi_{\\RSb,\\RSe}(\\RSb,\\RSe)\\phi_{\\RSe,\\RSf}(\\RSe,\\RSf)$。}\n\t\\label{fig:example_undirected}\n\\end{figure}\n\n\n\n在你、你的室友和同事之间感冒传染的例子中包含了两个\\gls{clique}。\n一个\\gls{clique}包含了$\\RSh_y$和$\\RSh_c$。\n这个\\gls{clique}的\\gls{factor}可以通过一个表来定义，可能取到下面的值：\n% \\begin{table*}[!hbp]\n\t% \\centering\n\\begin{table}\n\t\\centering\n\\begin{tabular}{c|cc}\n\t\t& $\\RSh_y = 0$ & $\\RSh_y = 1$ \\\\ \\hline\n\t\t$\\RSh_c = 0$ & 2 & 1 \\\\\n\t\t$\\RSh_c = 1$  & 1 & 10 \\\\\n\\end{tabular}\n\\end{table}\n% \\end{table*}\n% 558\n\n\n状态为$1$代表了健康的状态，相对的状态为$0$则表示不好的健康状态（即感染了感冒）。\n你们两个通常都是健康的，所以对应的状态拥有最高的密切程度。\n两个人中只有一个人是生病的密切程度是最低的，因为这是一个很罕见的状态。\n两个人都生病的状态（通过一个人来传染给了另一个人）有一个稍高的密切程度，尽管仍然不及两个人都健康的密切程度。\n% 559 head  \n\n\n为了完整地定义这个模型，我们需要对包含$\\RSh_y$和$\\RSh_r$的\\gls{clique}定义类似的\\gls{factor}。\n% 559 head\n\n\n\\subsection{\\glsentrytext{partition_function}}\n\\label{sec:the_partition_function}\n%  16.2.3   p 559\n\n\n\n尽管这个\\gls{unnormalized_probability_function}处处不为零，我们仍然无法保证它的概率之和或者积分为$1$。\n为了得到一个有效的概率分布，我们需要使用对应的归一化的概率分布\n\\footnote{一个通过归一化\\gls{clique_potential}乘积定义的分布也被称作是\\firstgls{gibbs_distribution}}：\n\\begin{align}\np(\\RVx) = \\frac{1}{Z}\\tilde{p}(\\RVx),\n\\end{align}\n其中，$Z$是使得所有的概率之和或者积分为$1$的常数，并且满足：\n\\begin{align}\nZ = \\int \\tilde{p}(\\RVx)d\\RVx.\n\\end{align}\n当函数$\\phi$固定时，我们可以把$Z$当成是一个常数。\n值得注意的是如果函数$\\phi$带有参数时，那么$Z$是这些参数的一个函数。\n在相关文献中为了节省空间忽略控制$Z$的变量而直接写$Z$是一个常用的方式。\n归一化常数$Z$被称作是\\gls{partition_function}，这是一个从统计物理学中借鉴的术语。\n% 559 \n\n\n由于$Z$通常是由对所有可能的$\\RVx$状态的联合分布空间求和或者求积分得到的，它通常是很难计算的。\n为了获得一个\\gls{undirected_model}的归一化概率分布，模型的结构和函数$\\phi$的定义通常需要设计为有助于高效地计算$Z$。\n在\\gls{DL}中，$Z$通常是难以处理的。\n由于$Z$难以精确地计算出，我们只能使用一些近似的方法。\n这样的近似方法是\\chapref{chap:confronting_the_partition_function}的主要内容。\n% 559 \n\n\n% 559 end\n%在设计\\gls{undirected_model}时我们必须牢记在心的一个要点是设置一些\\gls{factor}使得$Z$不存在这样的方法也是有可能的。\n在设计\\gls{undirected_model}时，我们必须牢记在心的一个要点是设定一些使得$Z$不存在的\\gls{factor}也是有可能的。\n当模型中的一些变量是连续的，且$\\tilde{p}$在其定义域上的积分发散时这种情况就会发生。\n例如， 当我们需要对一个单独的标量变量$\\RSx\\in\\SetR$建模，并且单个\\gls{clique_potential}定义为$\\phi(x) = x^2$时。\n在这种情况下，\n\\begin{align}\nZ = \\int x^2 dx.\n\\end{align}\n由于这个积分是发散的，所以不存在一个对应着这个势能函数$\\phi(x)$的概率分布。\n有时候$\\phi$函数某些参数的选择可以决定相应的概率分布是否能够被定义。\n例如，对$\\phi$函数$\\phi(x;\\beta) = \\text{exp}(-\\beta x^2)$来说，参数$\\beta$决定了归一化常数$Z$是否存在。\n正的$\\beta$使得$\\phi$函数是一个关于$\\RSx$的高斯分布，但是非正的参数$\\beta$则使得$\\phi$不可能被归一化。\n\n\n% P560   \n有向建模和无向建模之间一个重要的区别就是\\gls{directed_model}是通过从起始点的概率分布直接定义的，\n反之\\gls{undirected_model}的定义显得更加宽松，通过$\\phi$函数转化为概率分布而定义。\n这改变了我们处理这些建模问题的直觉。\n当我们处理\\gls{undirected_model}时需要牢记一点，每一个变量的定义域对于一系列给定的$\\phi$函数所对应的概率分布有着重要的影响。\n举个例子，我们考虑一个$n$维向量的随机变量$\\RVx$以及一个由偏置向量$\\Vb$参数化的\\gls{undirected_model}。\n假设$\\RVx$的每一个元素对应着一个\\gls{clique}，并且满足$\\phi^{(i)}(\\RSx_i) = \\exp(b_i\\RSx_i)$。\n在这种情况下概率分布是怎样的呢？\n答案是我们无法确定，因为我们并没有指定$\\RVx$的定义域。\n如果$\\RVx$满足$\\RVx \\in \\SetR^n$，那么有关归一化常数$Z$的积分是发散的，这导致了对应的概率分布是不存在的。\n如果$\\RVx\\in\\{0,1\\}^n$，那么$p(\\RVx)$可以被分解成$n$个独立的分布，并且满足$p(\\RSx_i=1) = \\text{sigmoid}(b_i)$。\n如果$\\RVx$的定义域是\\gls{ebv} $(\\{[1,0,\\ldots,0],[0,1,\\ldots,0],\\ldots,[0,0,\\ldots,1]\\})$的集合，\n那么$p(\\RSx) = \\text{softmax}(\\Vb)$，因此对于$j\\neq i$，一个较大的$b_i$的值会降低所有$p(\\RSx_j = 1)$的概率。\n通常情况下，通过仔细选择变量的定义域，能够从一个相对简单的$\\phi$函数的集合可以获得一个相对复杂的表达。\n我们会在\\secref{sec:convolutional_boltzmann_machines}中讨论这个想法的实际应用。\n% P560   \n\n\n\\subsection{\\glsentrytext{energy_based_model}}\n\\label{sec:energy_based_models}\n% 560\n\n\n\\gls{undirected_model}中许多有趣的理论结果都依赖于$\\forall \\Vx,\\ \\tilde{p}(\\Vx)>0$这个假设。\n使这个条件满足的一种简单方式是使用\\firstall{energy_based_model}，其中\n\\begin{align}\n\\label{eqn:167}\n\\tilde{p}(\\RVx) = \\exp(-E(\\RVx)),\n\\end{align}\n$E(\\RVx)$被称作是\\firstgls{energy_function}。\n对所有的$\\RSz$， $\\exp(\\RSz)$都是正的，这保证了没有一个\\gls{energy_function}会使得某一个状态$\\RVx$的概率为$0$。\n我们可以完全自由地选择那些能够简化学习过程的\\gls{energy_function}。\n如果我们直接学习各个\\gls{clique_potential}，我们需要利用\\gls{constrained_optimization}方法来任意地指定一些特定的最小概率值。\n学习\\gls{energy_function}的过程中，我们可以采用无约束的优化方法\\footnote{对于某些模型，我们可以仍然使用\\gls{constrained_optimization}方法来确保$Z$存在。}。\n\\gls{energy_based_model}中的概率可以无限趋近于$0$但是永远达不到$0$。\n% p 561  head\n\n\n服从\\eqnref{eqn:167}形式的任意分布都是\\firstgls{boltzmann_distribution}的一个实例。\n正是基于这个原因，我们把许多\\gls{energy_based_model}称为\\firstgls{BM}~\\citep{Fahlman83,Ackley85,Hinton84,Hinton86a}。\n关于什么时候称之为\\gls{energy_based_model}，什么时候称之为\\gls{BM}不存在一个公认的判别标准。\n一开始\\gls{BM}这个术语是用来描述一个只有二值变量的模型，但是如今许多模型，比如\\gls{mcrbm2}，也涉及到了实值变量。\n虽然\\gls{BM}最初的定义既可以包含\\gls{latent_variable}也可以不包含\\gls{latent_variable}，但是时至今日\\gls{BM}这个术语通常用于指拥有\\gls{latent_variable}的模型，而没有\\gls{latent_variable}的\\gls{BM}则经常被称为\\gls{MRF}或\\gls{log_linear_model}。\n% 561\n\n\n\n\\gls{undirected_model}中的\\gls{clique}对应于\\gls{unnormalized_probability_function}中的\\gls{factor}。 \n通过$\\exp(a+b) = \\exp(a) \\exp(b)$，我们发现\\gls{undirected_model}中的不同\\gls{clique}对应于\\gls{energy_function}的不同项。\n换句话说，\\gls{energy_based_model}只是一种特殊的\\gls{markov_network}：求幂使\\gls{energy_function}中的每个项对应于不同\\gls{clique}的一个\\gls{factor}。\n关于如何从\\gls{undirected_model}结构中获得\\gls{energy_function}形式的示例可以参考\\figref{fig:example_undirected_2}。\n人们可以将\\gls{energy_function}中带有多个项的\\gls{energy_based_model}视作是\\firstgls{product_of_expert}~\\citep{Hinton99}。\n\\gls{energy_function}中的每一项对应的是概率分布中的一个\\gls{factor}。\n\\gls{energy_function}中的每一项都可以看作决定一个特定的软约束是否能够满足的``专家''。\n%每个专家只执行仅涉及一个随机变量低维投影的约束，但是当其结合概率的乘法时，专家们合理构造了复杂的高维约束。\n每个专家只执行一个约束，而这个约束仅仅涉及随机变量的一个低维投影，但是当其结合概率的乘法时，专家们一同构造了复杂的高维约束。\n% 561\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/example_undirected}}\n\\fi\n\\caption{这个图说明通过为每个\\gls{clique}选择适当的\\gls{energy_function} $E(\\RSa,\\RSb,\\RSc,\\RSd,\\RSe,\\RSf)$可以写作$E_{\\RSa,\\RSb}(\\RSa,\\RSb) + E_{\\RSb,\\RSc}(\\RSb,\\RSc) + E_{\\RSa,\\RSd}(\\RSa,\\RSd)+  E_{\\RSb,\\RSe}(\\RSb,\\RSe) + E_{\\RSe,\\RSf}(\\RSe,\\RSf)$。\n值得注意的是，我们令$\\phi$等于对应负能量的指数，可以\n%我们可以通过令$\\phi$等于对应负能量的指数来\n获得图\\ref{fig:example_undirected}中的$\\phi$函数，比如，$\\phi_{\\RSa,\\RSb}(\\RSa,\\RSb) = \\exp(-E(\\RSa,\\RSb))$。}\n\t\\label{fig:example_undirected_2}\n\\end{figure}\n%  562 head\n\n\n\\gls{energy_based_model}定义的一部分无法用\\gls{ML}观点来解释：即\\eqnref{eqn:167}中的``-''符号。\n这个``-''符号可以被包含在$E$的定义之中。\n对于很多$E$函数的选择来说，学习算法可以自由地决定能量的符号。\n这个负号的存在主要是为了保持\\gls{ML}文献和物理学文献之间的兼容性。\n概率建模的许多研究最初都是由统计物理学家做出的，其中$E$是指实际的、物理概念的能量，没有任何符号。\n诸如``能量''和``\\gls{partition_function}''这类术语仍然与这些技术相关联，尽管它们的数学适用性比在物理中更宽。\n一些\\gls{ML}研究者（例如，\\citet{Smolensky86}将负能量称为~\\textbf{harmony}）发出了不同的声音，但这些都不是标准惯例。\n% 562  head\n\n\n许多对概率模型进行操作的算法不需要计算$p_{\\text{model}}(\\Vx)$，而只需要计算$\\log \\tilde{p}_{\\text{model}}(\\Vx)$。\n对于具有\\gls{latent_variable} $\\Vh$的\\gls{energy_based_model}， 这些算法有时会将该量的负数称为\\firstgls{free_energy}：\n\\begin{align}\n\\label{eqn:168}\n\\CalF (\\Vx) = -\\log \\sum_{\\Vh} \\exp(-E(\\Vx,\\Vh)).\n\\end{align}\n在本书中，我们更倾向于更为通用的基于$\\log \\tilde{p}_{\\text{model}}(\\Vx)$的定义。\n% 562\n\n\n\\subsection{\\glsentrytext{separation}和\\glsentrytext{dseparation}}\n\\label{sec:separation_and_d_separation}\n\n\\gls{graphical_models}中的边告诉我们哪些变量直接相互作用。\n我们经常需要知道哪些变量\\emph{间接}相互作用。 \n某些间接相互作用可以通过观察其他变量来启用或禁用。\n更正式地，我们想知道在给定其他变量子集的值时，哪些变量子集彼此\\gls{conditional_independent}。\n% 562 end \n\n\n在\\gls{undirected_model}中，识别图中的\\gls{conditional_independent}性是非常简单的。 \n在这种情况下，图中隐含的\\gls{conditional_independent}性称为\\firstgls{separation}。\n如果图结构显示给定变量集$\\SetS$的情况下变量集$\\SetA$与变量集$\\SetB$无关，\n那么我们声称给定变量集$\\SetS$时，变量集$\\SetA$与另一组变量集$\\SetB$是\\gls{separation}的。\n%如果两个变量$\\RSa$和$\\RSb$通过涉及未观察变量的路径连接，那么这些变量不是\\gls{separation}的。\n如果连接两个变量$\\RSa$和$\\RSb$的连接路径仅涉及未观察变量，那么这些变量不是\\gls{separation}的。\n如果它们之间没有路径，或者所有路径都包含可观测的变量，那么它们是\\gls{separation}的。\n我们认为仅涉及未观察到的变量的路径是``活跃''的，而包括可观察变量的路径称为``非活跃''的。\n% 563  head\n\n\n当我们画图时，我们可以通过加阴影来表示观察到的变量。\n\\figref{fig:undirected_paths_active}用于描述当以这种方式绘图时\\gls{undirected_model}中的活跃和非活跃路径的样子。\n\\figref{fig:example_sep}描述了一个从\\gls{undirected_model}中读取\\gls{separation}信息的例子。\n% 563\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{tabular}{cc}\n\\includegraphics{Chapter16/figures/undirected_paths_active.pdf} &%\n\\includegraphics{Chapter16/figures/undirected_paths_inactive.pdf} \\\\\n(a) & (b)\n\\end{tabular}\n\\fi\n\\caption{\\emph{(a)}随机变量$\\RSa$和随机变量$\\RSb$之间穿过$\\RSs$的路径是活跃的，因为$\\RSs$是观察不到的。\n这意味着$\\RSa$，$\\RSb$之间不是\\gls{separation}的。\n\\emph{(b)}图中$\\RSs$用阴影填充，表示它是可观察的。\n因为$\\RSa$和$\\RSb$之间的唯一路径通过$\\RSs$，并且这条路径是不活跃的，\n我们可以得出结论，在给定$\\RSs$的条件下$\\RSa$和$\\RSb$是\\gls{separation}的。}\n\\label{fig:undirected_paths_active}\n\\end{figure}\n% 563 mid\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/example_sep}}\n\\fi\n\\caption{从一个无向图中读取\\gls{separation}性质的一个例子。\n这里$\\RSb$用阴影填充，表示它是可观察的。\n由于$\\RSb$挡住了从$\\RSa$到$\\RSc$的唯一路径，我们说在给定$\\RSb$的情况下$\\RSa$和$\\RSc$是相互\\gls{separation}的。\n观察值$\\RSb$同样挡住了从$\\RSa$到$\\RSd$的一条路径，但是它们之间有另一条活跃路径。\n因此给定$\\RSb$的情况下$\\RSa$和$\\RSd$不是\\gls{separation}的。}\n\t\\label{fig:example_sep}\n\\end{figure}\n% 563 end\n\n\n\n类似的概念适用于\\gls{directed_model}，只是在\\gls{directed_model}中，这些概念被称为\\firstgls{dseparation}。\n``d''代表``\\gls{dependency}''的意思。\n有向图中\\,\\gls{dseparation}的定义与\\gls{undirected_model}中\\gls{separation}的定义相同：\n如果图结构显示给定变量集$\\SetS$时 ，变量集$\\SetA$与变量集$\\SetB$无关， 那么我们认为给定变量集$\\SetS$时，变量集$\\SetA$~\\gls{dseparation}于变量集$\\SetB$。\n% 563\n\n\n与\\gls{undirected_model}一样，我们可以通过查看图中存在的活跃路径来检查图中隐含的独立性。\n如前所述，如果两个变量之间存在活跃路径，则两个变量是依赖的，如果没有活跃路径，则为\\gls{dseparation}。\n在有向网络中，确定路径是否活跃有点复杂。\n关于在\\gls{directed_model}中识别活跃路径的方法可以参考\\figref{fig:168}。 \n\\figref{fig:169}是从一个图中读取一些属性的例子。\n% 564  head \n\n\n\n\n\n尤其重要的是要记住\\gls{separation}和\\gls{dseparation}只能告诉我们\\emph{图中隐含}的\\gls{conditional_independent}性。\n图并不需要表示所有存在的独立性。 \n进一步的，使用完全图（具有所有可能的边的图）来表示任何分布总是合法的。\n事实上，一些分布包含不可能用现有图形符号表示的独立性。\n\\firstgls{context_specific_independence}指的是取决于网络中一些变量值的独立性。\n例如，考虑三个二值变量的模型：$\\RSa$，$\\RSb $和$\\RSc$。\n假设当$\\RSa$是0时，$\\RSb$和$\\RSc$是独立的， 但是当$\\RSa$是1时，$\\RSb$确定地等于$\\RSc$。\n当$\\RSa = 1$时\\gls{graphical_models}需要连接$\\RSb$和$\\RSc$的边。\n但是图不能说明当$\\RSa = 0$时$\\RSb$和$\\RSc$不是独立的。\n% 564\n\n一般来说，当独立性不存在时，图不会显示独立性。 \n然而，图可能无法编码独立性。\n% 564\n\n\n\n% 565  1 page\n\\begin{figure}[!htb]\n\t\\ifOpenSource\n\t\\centerline{\\includegraphics{figure.pdf}}\n\t\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/directed_paths.pdf}}\n\t\\fi\n\\caption{两个随机变量$\\RSa$，$\\RSb$之间存在的长度为$2$的所有种类的活跃路径。\n%存在的所有种类的长度为$2$的活跃路径。\n\\emph{(a)}箭头方向从$\\RSa$指向$\\RSb$的任何路径，反过来也一样。\n如果$\\RSs$可以被观察到，这种路径就是阻塞的。\n在接力赛的例子中，我们已经看到过这种类型的路径。\n\\emph{(b)}变量$\\RSa$和$\\RSb$通过\\emph{\\gls{common_cause}} $\\RSs$相连。\n举个例子，假设$\\RSs$是一个表示是否存在飓风的变量，$\\RSa$和$\\RSb$表示两个相邻气象监控区域的风速。\n如果我们在$\\RSa$处观察到很高的风速，我们可以期望在$b$处也观察到高速的风。\n如果观察到$\\RSs$，那么这条路径就被阻塞了。\n如果我们已经知道存在飓风，那么无论$\\RSa$处观察到什么，我们都能期望$\\RSb$处有较高的风速。\n在$\\RSa$处观察到一个低于预期的风速（对飓风而言）并不会改变我们对$\\RSb$处风速的期望（已知有飓风的情况下）。\n然而，如果$\\RSs$不被观测到，那么$\\RSa$和$\\RSb$是依赖的，即路径是活跃的。\n\\emph{(c)}变量$\\RSa$和$\\RSb$都是$\\RSs$的父节点。\n这称为\\firstgls{vstructure}或者\\firstgls{collider}。\n根据\\firstgls{explaining_away_effect}，\\gls{vstructure}导致$\\RSa$和$\\RSb$是相关的。\n在这种情况下，当$\\RSs$被观测到时路径是活跃的。\n举个例子，假设$\\RSs$是一个表示你的同事不在工作的变量。\n变量$\\RSa$表示她生病了，而变量$\\RSb$表示她在休假。\n如果你观察到了她不在工作，你可以假设她很有可能是生病了或者是在度假，但是这两件事同时发生是不太可能的。\n如果你发现她在休假，那么这个事实足够\\emph{解释}她的缺席了。\n你可以推断她很可能没有生病。\n\\emph{(d)}即使$\\RSs$的任意后代都被观察到，\\gls{explaining_away_effect}也会起作用。\n举个例子，假设$\\RSc$是一个表示你是否收到你同事的报告的一个变量。\n如果你注意到你还没有收到这个报告，这会增加你估计的她今天不在工作的概率，这反过来又会增加她今天生病或者度假的概率。\n阻塞\\,\\gls{vstructure}中路径的唯一方法就是共享子节点的后代一个都观察不到。}\n\\label{fig:168}\n\\end{figure}\n% 565  1 page\n\n\n% 566 head\n\\begin{figure}[!htb]\n\t\\centering\n\t\\ifOpenSource\n\t\\includegraphics{figure.pdf}\n\t\\else\n\t\\includegraphics{Chapter16/figures/example_dsep}\n\t\\fi\n\t\\captionsetup{singlelinecheck=off}\n\\caption[d-separation example]{从这张图中，我们可以发现一些\\,\\gls{dseparation}的性质。这包括了：\n\\begin{itemize}\n\\item 给定空集的情况下，$\\RSa$和$\\RSb$是\\,\\gls{dseparation}的。\n\\item 给定$\\RSc$的情况下，$\\RSa$和$\\RSe$是\\,\\gls{dseparation}的。\n\\item 给定$\\RSc$的情况下，$\\RSd$和$\\RSe$是\\,\\gls{dseparation}的。\n\\end{itemize}\n我们还可以发现当我们观察到一些变量时，一些变量不再是\\,\\gls{dseparation}的：\n\\begin{itemize}\n\\item 给定$\\RSc$的情况下，$\\RSa$和$\\RSb$不是\\,\\gls{dseparation}的。\n\\item 给定$\\RSd$的情况下，$\\RSa$和$\\RSb$不是\\,\\gls{dseparation}的。\n\\end{itemize}\n}\n\t\\label{fig:169}\n\\end{figure}\n% 566 head\n\n\\subsection{在\\glsentrytext{directed_model}和\\glsentrytext{undirected_model}中转换}\n\\label{sec:converting_between_undirected_and_directed_graphs}\n\n我们经常将特定的\\gls{ML}模型称为\\gls{undirected_model}或\\gls{directed_model}。\n例如，我们通常将\\gls{RBM}称为\\gls{undirected_model}， 而\\gls{sparse_coding}则被称为\\gls{directed_model}。\n这种措辞的选择可能有点误导，因为没有概率模型本质上是有向或无向的。\n但是，一些模型很适合使用有向图\\emph{描述}，而另一些模型很适合使用\\gls{undirected_model}描述。\n% 564 end\n\n\\gls{directed_model}和\\gls{undirected_model}都有其优点和缺点。\n这两种方法都不是明显优越和普遍优选的。\n相反，我们根据具体的每个任务来决定使用哪一种模型。 \n这个选择部分取决于我们希望描述的概率分布。\n根据哪种方法可以最大程度地捕捉到概率分布中的独立性，或者哪种方法使用最少的边来描述分布，我们可以决定使用有向建模还是无向建模。\n还有其他因素可以影响我们决定使用哪种建模方式。 \n即使在使用单个概率分布时，我们有时也可以在不同的建模方式之间切换。\n有时，如果我们观察到变量的某个子集，或者如果我们希望执行不同的计算任务，换一种建模方式可能更合适。\n例如，\\gls{directed_model}通常提供了一种高效地从模型中抽取样本（在\\secref{sec:sampling_from_graphical_models}中描述）的直接方法。\n而\\gls{undirected_model}形式通常对于推导\\gls{approximate_inference}过程（我们将在\\chapref{chap:approximate_inference}中看到，\\eqnref{eqn:1956}强调了\\gls{undirected_model}的作用）是很有用的。\n% 566\n\n\n每个概率分布可以由\\gls{directed_model}或由\\gls{undirected_model}表示。\n在最坏的情况下，我们可以使用``\\gls{complete_graph}''来表示任何分布。\n在\\gls{directed_model}的情况下，\\gls{complete_graph}是任意有向无环图，其中我们对随机变量排序，并且每个变量在排序中位于其之前的所有其他变量作为其图中的祖先。\n对于\\gls{undirected_model}，\\gls{complete_graph}只是包含所有变量的单个\\gls{clique}。 \n\\figref{fig:complete}给出了一个实例。\n% 566\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/complete}}\t\n\\fi\n\\caption{\\gls{complete_graph}的例子，\\gls{complete_graph}能够描述任何的概率分布。\n这里我们展示了一个带有四个随机变量的例子。\n\\emph{(左)}完全无向图。\n在无向图中，\\gls{complete_graph}是唯一的。\n\\emph{(右)}一个完全有向图。\n在有向图中，并不存在唯一的\\gls{complete_graph}。\n我们选择一种变量的排序，然后对每一个变量，从它本身开始，向每一个指向顺序在其后面的变量画一条弧。\n因此存在着关于变量数阶乘数量级的不同种\\gls{complete_graph}。\n在这个例子中，我们从左到右从上到下地排序变量。}\n\t\\label{fig:complete}\n\\end{figure}\n\n\n当然，\\gls{graphical_models}的优势在于图能够包含一些变量不直接相互作用的信息。 \n\\gls{complete_graph}并不是很有用，因为它并不隐含任何独立性。\n% 566\n\n\n当我们用图表示概率分布时，我们想要选择一个包含尽可能多独立性的图，但是并不会假设任何实际上不存在的独立性。\n% 566 end\n\n\n从这个角度来看，一些分布可以使用\\gls{directed_model}更高效地表示，而其他分布可以使用\\gls{undirected_model}更高效地表示。\n换句话说，\\gls{directed_model}可以编码一些\\gls{undirected_model}所不能编码的独立性，反之亦然。\n% 567 head\n\n\n\\gls{directed_model}能够使用一种\\gls{undirected_model}无法完美表示的特定类型的子结构。\n这个子结构被称为\\firstgls{immorality}。\n这种结构出现在当两个随机变量$\\RSa$和$\\RSb$都是第三个随机变量$\\RSc$的父结点，并且不存在任一方向上直接连接$\\RSa$和$\\RSb$的边时。\n（``\\gls{immorality}''的名字可能看起来很奇怪; 它在\\gls{graphical_models}文献中使用源于一个关于未婚父母的笑话。）\n为了将\\gls{directed_model}图$\\CalD$转换为\\gls{undirected_model}，我们需要创建一个新图$\\CalU$。\n对于每对变量$\\RSx$和$\\RSy$，如果存在连接$\\CalD$中的$\\RSx$和$\\RSy$的有向边（在任一方向上），或者如果$\\RSx$和$\\RSy$都是图$\\CalD$中另一个变量$\\RSz$的父节点，则在$\\CalU$中添加连接$\\RSx$和$\\RSy$的无向边。 \n得到的图$\\CalU$被称为是\\firstgls{moralized_graph}。\n关于一个通过\\gls{moralization}将\\gls{directed_graphical_model}转化为\\gls{undirected_model}的例子可以参考\\figref{fig:dm_to_um}。\n% 567\n\n\n% 568 1 page\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/dm_to_um}}\t\n\\fi\n\\caption{通过构造\\gls{moralized_graph}将有向模型（上一行）转化为无向模型（下一行）的例子。\n\\emph{(左)}只需要把有向边替换成无向边就可以把这个简单的链转化为一个\\gls{moralized_graph}。\n得到的无向模型包含了完全相同的独立关系和\\gls{conditional_independent}关系。\n\\emph{(中)}这个图是在不丢失独立性的情况下是无法\n%不丢失独立性的情况下无法\n转化为无向模型的最简单的有向模型。\n这个图包含了单个完整的\\gls{immorality}结构。\n因为$\\RSa$和$\\RSb$都是$\\RSc$的父节点，当$\\RSc$被观察到时，它们之间通过活跃路径相连。\n为了捕捉这个\\gls{dependency}，无向模型必须包含一个含有所有三个变量的\\gls{clique}。\n这个\\gls{clique}无法编码$\\RSa \\perp \\RSb$这个信息。\n\\emph{(右)}一般来说，\\gls{moralization}的过程会给图添加许多边，因此丢失了一些隐含的独立性。\n举个例子，这个\\gls{sparse_coding}图需要在每一对\\gls{hidden_unit}之间添加\\gls{moralization}的边，因此也引入了二次数量级的新的直接\\gls{dependency}。}\n\t\\label{fig:dm_to_um}\n\\end{figure}\n% 568 1 page\n\n\n\n同样的，\\gls{undirected_model}可以包括\\gls{directed_model}不能完美表示的子结构。\n具体来说，如果$\\CalU$包含长度大于$3$的\\firstgls{loop}，则有向图$\\CalD$不能捕获\\gls{undirected_model} $\\CalU$所包含的所有\\gls{conditional_independent}性，除非该\\gls{loop}还包含\\firstgls{chord}。\n\\gls{loop}指的是由无向边连接的变量序列，并且满足序列中的最后一个变量连接回序列中的第一个变量。\n\\gls{chord}是定义\\gls{loop}序列中任意两个非连续变量之间的连接。\n如果$\\CalU$具有长度为$4$或更大的环，并且这些环没有\\gls{chord}，我们必须在将它们转换为\\gls{directed_model}之前添加\\gls{chord}。\n添加这些\\gls{chord}会丢弃在$\\CalU$中编码的一些独立信息。\n通过将\\gls{chord}添加到$\\CalU$形成的图被称为\\firstgls{chordal_graph}或者\\firstgls{triangulated_graph}，\n因为我们现在可以用更小的、三角的环来描述所有的环。\n要从\\gls{chordal_graph}构建有向图$\\CalD$，我们还需要为边指定方向。\n当这样做时，我们不能在$\\CalD$中创建有向循环，否则将无法定义有效的有向概率模型。\n为$\\CalD$中的边分配方向的一种方法是对随机变量排序，然后将每个边从排序较早的节点指向排序稍后的节点。\n一个简单的实例可以参考\\figref{fig:um_to_dm}。\n% 569 mid\n\n\n\n% 569 head\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/um_to_dm}}\t\n\\fi\n\\caption{将一个无向模型转化为一个有向模型。\n\\emph{(左)}这个无向模型无法转化为有向模型，因为它有一个长度为$4$且不带有\\gls{chord}的\\gls{loop}。\n具体说来，这个无向模型包含了两种不同的独立性，并且不存在一个有向模型可以同时描述这两种性质：$\\RSa\\perp \\RSc \\mid \\{\\RSb,\\RSd\\}$和$\\RSb \\perp \\RSd \\mid \\{\\RSa,\\RSc\\}$。\n\\emph{(中)}为了将无向图转化为有向图，我们必须通过保证所有长度大于$3$的\\gls{loop}都有\\gls{chord}来\\gls{triangulate}图。\n为了实现这个目标，我们可以加一条连接$\\RSa$和$\\RSc$或者连接$\\RSb$和$\\RSd$的边。\n在这个例子中，我们选择添加一条连接$\\RSa$和$\\RSc$的边。\n\\emph{(右)}为了完成转化的过程，我们必须给每条边分配一个方向。\n执行这个任务时，我们必须保证不产生任何有向环。\n避免出现有向环的一种方法是赋予节点一定的顺序，然后将每个边从排序较早的节点指向排序稍后的节点。\n在这个例子中，我们根据变量名的字母进行排序。}\n\t\\label{fig:um_to_dm}\n\\end{figure}\n% 569 head\n\n\n\n\\subsection{\\glsentrytext{factor_graph}}\n\\label{sec:factor_graphs}\n% 569      16.2.7\n\n\n\n\\firstgls{factor_graph}是从\\gls{undirected_model}中抽样的另一种方法，它可以解决标准\\gls{undirected_model}语法中图表达的模糊性。\n在\\gls{undirected_model}中，每个$\\phi$函数的范围必须是图中某个\\gls{clique}的\\emph{子集}。\n我们无法确定每一个\\gls{clique}是否含有一个作用域包含整个\\gls{clique}的\\gls{factor}——比如说一个包含三个结点的\\gls{clique}可能对应的是一个有三个结点的\\gls{factor}，也可能对应的是三个\\gls{factor}并且每个\\gls{factor}包含了一对结点，这通常会导致模糊性。\n通过显式地表示每一个$\\phi$函数的作用域，\\gls{factor_graph}解决了这种模糊性。\n%然而，$\\phi$没有必要包含每个\\gls{clique}的全部。\n%\\gls{factor_graph}明确表示每个$\\phi$函数的范围。\n具体来说，\\gls{factor_graph}是一个包含无向二分图的\\gls{undirected_model}的图形化表示。\n一些节点被绘制为圆形。 \n就像在标准\\gls{undirected_model}中一样，这些节点对应于随机变量。\n其余节点绘制为方块。\n这些节点对应于\\gls{unnormalized_probability_function}的\\gls{factor} $\\phi$。\n变量和\\gls{factor}可以通过无向边连接。\n当且仅当变量包含在\\gls{unnormalized_probability_function}的\\gls{factor}中时，变量和\\gls{factor}在图中存在连接。\n没有\\gls{factor}可以连接到图中的另一个\\gls{factor}，也不能将变量连接到变量。\n\\figref{fig:factor_graph}给出了一个例子来说明\\gls{factor_graph}如何解决无向网络中的模糊性。\n% 570  \n\n\n% 570 head\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/factor_graph}}\t\n\\fi\n\\caption{\\gls{factor_graph}如何解决无向网络中的模糊性的一个例子。\n\\emph{(左)}一个包含三个变量（$\\RSa$、$\\RSb$和$\\RSc$）的\\gls{clique}组成的无向网络。\n\\emph{(中)}对应这个无向模型的\\gls{factor_graph}。\n这个\\gls{factor_graph}有一个包含三个变量的因子。\n\\emph{(右)}对应这个无向模型的另一种有效的\\gls{factor_graph}。\n这个\\gls{factor_graph}包含了三个因子，每个因子只对应两个变量。\n即使它们表示的是同一个无向模型，这个\\gls{factor_graph}上进行的表示、推断和学习相比于中图描述的\\gls{factor_graph}都要渐近地廉价。}\n\t\\label{fig:factor_graph}\n\\end{figure}\n% 570 head\n\n\n\\section{从\\glsentrytext{graphical_models}中采样}\n\\label{sec:sampling_from_graphical_models}\n\n% 570  \n\\gls{graphical_models}同样简化了从模型中采样的过程。\n\n\n\\gls{directed_graphical_model}的一个优点是，可以通过一个简单高效的过程从模型所表示的联合分布中产生样本，这个过程被称为\\firstgls{ancestral_sampling}。\n%可以通过一个简单高效的被称作是\\firstgls{ancestral_sampling}的过程从由模型表示的联合分布中抽取样本。\n% 570  \n\n\n\\gls{ancestral_sampling}的基本思想是将图中的变量$\\RSx_i$使用拓扑排序，使得对于所有$i$和$j$，\n如果$\\RSx_i$是$\\RSx_j$的一个父亲结点，则$j$大于$i$。\n然后可以按此顺序对变量进行采样。\n换句话说，我们可以首先采$\\RSx_1\\sim P(\\RSx_1)$，然后采$\\RSx_2\\sim P(\\RSx_2\\mid Pa_{\\CalG}(\\RSx_2))$，以此类推，直到最后我们从$ P(\\RSx_n\\mid Pa_{\\CalG}(\\RSx_n))$中采样。\n只要不难从每个条件分布$\\RSx_i\\sim P(\\RSx_i\\mid Pa_{\\CalG}(\\RSx_i))$中采样，那么从整个模型中采样也是容易的。\n%那么很容易从整个模型中抽样。\n拓扑排序操作保证我们可以按照\\eqnref{eqn:161}中条件分布的顺序依次采样。\n如果没有拓扑排序，我们可能会在其父节点可用之前试图对该变量进行抽样。\n% 571  \n\n\n有些图可能存在多个拓扑排序。 \n\\gls{ancestral_sampling}可以使用这些拓扑排序中的任何一个。\n% 571\n\n\\gls{ancestral_sampling}通常非常快（假设从每个条件分布中采样都是很容易的）并且非常简便。\n% 571  \n\n\n\\gls{ancestral_sampling}的一个缺点是其仅适用于\\gls{directed_graphical_model}。 \n另一个缺点是它并不是每次采样都是条件采样操作。%??\n当我们希望从\\gls{directed_graphical_model}中变量的子集中采样时，给定一些其他变量，我们经常要求所有给定的条件变量在顺序图中比要采样的变量的顺序要早。\n在这种情况下，我们可以从模型分布指定的局部条件概率分布中采样。 \n否则，我们需要采样的条件分布是给定观测变量的后验分布。\n这些后验分布在模型中通常没有明确指定和参数化。 \n推断这些后验分布的代价可能是很高的。 \n在这种情况下的模型中，\\gls{ancestral_sampling}不再有效。\n% 571   \n\n\n\n不幸的是，\\gls{ancestral_sampling}仅适用于\\gls{directed_model}。 \n我们可以通过将\\gls{undirected_model}转换为\\gls{directed_model}来实现从\\gls{undirected_model}中抽样，但是这通常需要解决棘手的推断问题（要确定新有向图的根节点上的边缘分布），或者需要引入许多边从而会使得到的\\gls{directed_model}变得难以处理。\n从\\gls{undirected_model}采样，而不首先将其转换为\\gls{directed_model}的做法似乎需要解决循环依赖的问题。 \n每个变量与每个其他变量相互作用，因此对于采样过程没有明确的起点。\n不幸的是，从\\gls{undirected_model}中抽取样本是一个成本很高的多次迭代的过程。\n理论上最简单的方法是\\firstgls{gibbs_sampling}。\n假设我们在一个$n$维向量的随机变量$\\RVx$上有一个\\gls{graphical_models}。 \n我们迭代地访问每个变量$x_i$，在给定其他变量的条件下从$p(\\RSx_i \\mid \\RSx_{-i})$中抽样。\n由于\\gls{graphical_models}的\\gls{separation}性质，抽取$x_i$时我们可以等价地仅对$\\RSx_i$的邻居条件化。\n不幸的是，在我们遍历\\gls{graphical_models}一次并采样所有$n$个变量之后，我们仍然无法得到一个来自$p(\\RVx)$的客观样本。\n相反，我们必须重复该过程并使用它们邻居的更新值对所有$n$个变量重新取样。\n在多次重复之后，该过程渐近地收敛到正确的目标分布。\n我们很难确定样本何时达到所期望分布的足够精确的近似。\n\\gls{undirected_model}的采样技术是一个高级的研究方向，\\chapref{chap:monte_carlo_methods}将对此进行更详细的讨论。\n% 572 head\n\n\n\n\n\\section{结构化建模的优势}\n\\label{sec:advantages_of_structured_modelling}\n% 572\n\n\n使用\\gls{structured_probabilistic_models}的主要优点是它们能够显著降低表示概率分布、学习和推断的成本。\n\\gls{directed_model}中采样还可以被加速，但是对于\\gls{undirected_model}情况则较为复杂。\n选择不对某些变量的相互作用进行建模是允许所有这些操作使用较少的运行时间和内存的主要机制。\n%允许所有这些操作使用较少的运行时间和内存的主要机制是选择不对某些变量的相互作用进行建模。\n\\gls{graphical_models}通过省略某些边来传达信息。\n在没有边的情况下，模型假设不对变量间直接的相互作用建模。\n% 572\n\n\n%使用\\gls{structured_probabilistic_models}的一个更加不容易量化的益处是它们允许我们明确地将给定的现有的知识与知识的学习或者推断分开。\n\\gls{structured_probabilistic_models}允许我们明确地将给定的现有知识与知识的学习或者推断分开，这是一个不容易量化的益处。\n这使我们的模型更容易开发和调试。 \n我们可以设计、分析和评估适用于更广范围的图的学习算法和推断算法。\n同时，我们可以设计能够捕捉到我们认为数据中存在的重要关系的\n%认为重要的关系的\n模型。\n然后，我们可以组合这些不同的算法和结构，并获得不同可能性的笛卡尔乘积。\n然而，为每种可能的情况设计\\gls{end_to_end}算法会更加困难。\n% 572\n\n\n\n\\section{学习\\glsentrytext{dependency}关系}\n\\label{sec:learning_about_dependencies}\n% 572\n\n良好的生成模型需要准确地捕获所观察到的或``可见''变量$\\RVv$上的分布。\n通常$\\RVv$的不同元素彼此高度依赖。\n在\\gls{DL}中，最常用于建模这些\\gls{dependency}关系的方法是引入几个\\gls{latent}或``隐藏''变量$\\RVh$。\n然后，该模型可以捕获任何对（变量$\\RSv_i$和$\\RSv_j$间接\\gls{dependency}可以通过$\\RSv_i$和$\\RVh$之间直接\\gls{dependency}和$\\RVh$和$\\RSv_j$直接\\gls{dependency}捕获)之间的\\gls{dependency}关系。%??\n% 572  end \n\n\n如果一个良好的关于$\\RVv$的模型不包含任何\\gls{latent_variable}，那么它在\\gls{bayesian_network}中的每个节点需要具有大量父节点或在\\gls{markov_network}中具有非常大的\\gls{clique}。\n仅仅表示这些高阶相互作用的成本就很高了，首先从计算角度上考虑，存储在存储器中的参数数量是\\gls{clique}中成员数量的指数级别，接着在统计学意义上，因为这些指数数量的参数需要大量的数据来准确估计。\n% 573  head  \n\n\n当模型旨在描述直接连接的可见变量之间的\\gls{dependency}关系时，通常不可能连接所有变量，因此设计\\gls{graphical_models}时需要连接那些紧密相关的变量，并忽略其他变量之间的作用。\n\\gls{ML}中有一个称为\\firstgls{structure_learning}的领域专门讨论这个问题。\n\\citet{koller-book2009}是一个不错的\\gls{structure_learning}参考资料。\n大多数\\gls{structure_learning}技术基于一种贪婪搜索的形式。\n它们提出了一种结构，对具有该结构的模型进行训练，然后给出分数。 \n该分数奖励训练集上的高精度并对模型的复杂度进行惩罚。\n然后提出添加或移除少量边的候选结构作为搜索的下一步。\n搜索向一个预计会增加分数的新结构发展。 %??\n% 573\n\n\n使用\\gls{latent_variable}而不是自适应结构避免了离散搜索和多轮训练的需要。 \n可见变量和\\gls{latent_variable}之间的固定结构可以使用可见单元和\\gls{hidden_unit}之间的直接作用，从而建模可见单元之间的间接作用。\n%从而使得可见单元之间间接作用。\n使用简单的参数学习技术，我们可以学习到一个具有固定结构的模型，这个模型在边缘分布$p(\\Vv)$上拥有正确的结构。\n% 573 \n\n\n\\gls{latent_variable}除了发挥本来的作用，即能够高效地描述$p(\\RVv)$以外，还具有另外的优势。%??\n新变量$\\RVh$还提供了$\\RVv$的替代表示。\n例如，如\\secref{sec:mixtures_of_distributions}所示，\\gls{GMM}学习了一个\\gls{latent_variable}，这个\\gls{latent_variable}对应于输入样本是从哪一个混合体中抽出。\n这意味着\\gls{GMM}中的\\gls{latent_variable}可以用于做分类。\n我们可以看到\\chapref{chap:autoencoders}中简单的概率模型如\\gls{sparse_coding}，是如何学习可以用作分类器输入特征或者作为\\gls{manifold}上坐标的\\gls{latent_variable}的。\n其他模型也可以使用相同的方式，但是更深的模型和具有多种相互作用方式的模型可以获得更丰富的输入描述。\n许多方法通过学习\\gls{latent_variable}来完成特征学习。\n通常，给定$\\RVv$和$\\RVh$，实验观察显示$\\SetE[\\RVh\\mid\\RVv]$或${\\arg\\max}_{\\Vh}\\ p(\\Vh,\\Vv)$都是$\\Vv$的良好特征映射。\n% 573\n\n\\section{推断和\\glsentrytext{approximate_inference}}\n\\label{sec:inference_and_approximate_inference}\n% 573 end\n\n\n%我们可以使用概率模型的主要方法之一是提出关于变量如何相互关联的问题。 \n解决变量之间如何相互关联的问题是我们使用概率模型的一个主要方式。 \n给定一组医学测试，我们可以询问患者可能患有什么疾病。\n在一个\\gls{latent_variable}模型中，我们可能需要提取能够描述可观察变量$\\RVv$的特征$\\SetE[\\RVh \\mid \\RVv]$。\n有时我们需要解决这些问题来执行其他任务。 \n我们经常使用最大似然的准则来训练我们的模型。\n由于\n\\begin{align}\n\\label{eqn:169}\n\\log p(\\Vv) = \\SetE_{\\RVh \\sim p(\\RVh\\mid \\Vv)} [\\log p(\\Vh,\\Vv) -  \\log p(\\Vh\\mid\\Vv)],\n\\end{align}\n学习过程中，%为了执行学习规则，\n我们经常需要计算$p(\\RVh\\mid\\Vv)$。\n所有这些都是\\firstgls{inference}问题的例子，其中我们必须预测给定其他变量的情况下一些变量的值，或者在给定其他变量值的情况下预测一些变量的概率分布。\n% 574\n\n%不幸的是，对于大多数有趣的深度模型来说，这些推断问题都是难以处理的，即使我们使用结构化\\gls{graphical_models}来简化它们。\n不幸的是，对于大多数有趣的深度模型来说，即使我们使用结构化\\gls{graphical_models}来简化这些推断问题，它们仍然是难以处理的。\n图结构允许我们用合理数量的参数来表示复杂的高维分布，但是用于\\gls{DL}的图并不满足这样的条件，从而难以实现高效地推断。\n% 574\n\n\n我们可以直接看出，计算一般\\gls{graphical_models}的边缘概率是\\#P-hard的。\n复杂性类别\\#P是复杂性类别NP的泛化。\nNP中的问题只需确定其中一个问题是否有解决方案，并找到一个解决方案（如果存在）就可以解决。\n\\#P中的问题需要计算解决方案的数量。\n为了构建最坏情况的\\gls{graphical_models}，我们可以设想一下我们在3-SAT问题中定义二值变量的\\gls{graphical_models}。\n我们可以对这些变量施加均匀分布。\n然后我们可以为每个子句添加一个二值\\gls{latent_variable}，来表示每个子句是否成立。\n然后，我们可以添加另一个\\gls{latent_variable}，来表示所有子句是否成立。\n这可以通过构造一个\\gls{latent_variable}的缩减树来完成，树中的每个结点表示其他两个变量是否成立，从而不需要构造一个大的\\gls{clique}。\n该树的叶是每个子句的变量。\n树的根表示整个问题是否成立。\n由于子句的均匀分布，缩减树根结点的边缘分布表示子句有多少比例是成立的。\n虽然这是一个设计的最坏情况的例子，NP-hard图确实会频繁地出现在现实世界的场景中。\n% 574\n\n\n这促使我们使用\\gls{approximate_inference}。\n在\\gls{DL}中，这通常涉及\\gls{variational_inference}，其中通过寻求尽可能接近真实分布的近似分布$q(\\RVh\\mid\\RVv)$来逼近真实分布$p(\\RVh\\mid\\Vv)$。\n这个技术将在\\chapref{chap:approximate_inference}中深入讨论。\n% 574 end\n\n\n\n\\section{结构化概率模型的\\glsentrytext{DL}方法}\n\\label{sec:the_deep_learning_approach_to_structured_probabilistic_models}\n% 575 head    16.7  \n\n%\\gls{DL}实践者通常使用与从事\\gls{structured_probabilistic_models}研究的其它\\gls{ML}研究者相同的基本计算工具。\n\\gls{DL}从业者通常与其他从事\\gls{structured_probabilistic_models}研究的\\gls{ML}研究者使用相同的基本计算工具。\n然而，在\\gls{DL}中，我们通常对如何组合这些工具作出不同的设计决定，导致总体算法、模型与更传统的\\gls{graphical_models}具有非常不同的风格。\n% 575 head\n\n\n\\gls{DL}并不总是涉及特别深的\\gls{graphical_models}。\n在\\gls{graphical_models}中，我们可以根据\\gls{graphical_models}的图而不是\\gls{computational_graph}来定义模型的深度。\n如果从\\gls{latent_variable} $h_i$到可观察变量的最短路径是$j$步，我们可以认为\\gls{latent_variable} $h_j$处于深度$j$。\n我们通常将模型的深度描述为任何这样的$h_j$的最大深度。 \n这种深度不同于由\\gls{computational_graph}定义的深度。\n用于\\gls{DL}的许多\\gls{generative_model}没有\\gls{latent_variable}或只有一层\\gls{latent_variable}，但使用深度\\gls{computational_graph}来定义模型中的条件分布。\n% 575\n\n\n\\gls{DL}基本上总是利用\\gls{distributed_representation}的思想。\n即使是用于\\gls{DL}目的的浅层模型（例如\\gls{pretraining}浅层模型，稍后将形成深层模型），也几乎总是具有单个大的\\gls{latent_variable}层。\n\\gls{DL}模型通常具有比可观察变量更多的\\gls{latent_variable}。\n变量之间复杂的非线性相互作用通过多个\\gls{latent_variable}的间接连接来实现。\n% 575  ok\n\n\n相比之下，传统的\\gls{graphical_models}通常包含至少是偶尔观察到的变量，即使一些训练样本中的许多变量随机地丢失。\n传统模型大多使用高阶项和\\gls{structure_learning}来捕获变量之间复杂的非线性相互作用。\n如果有\\gls{latent_variable}，它们的数量通常很少。\n% 575\n\n\n\n\\gls{latent_variable}的设计方式在\\gls{DL}中也有所不同。\n\\gls{DL}从业者通常不希望\\gls{latent_variable}提前包含了任何特定的含义——训练算法可以自由地开发对特定数据集建模所需要的概念。\n在事后解释\\gls{latent_variable}通常是很困难的，但是可视化技术可以得到它们表示的一些粗略表征。\n当\\gls{latent_variable}在传统\\gls{graphical_models}中使用时，它们通常被赋予一些特定含义——比如文档的主题、学生的智力、导致患者症状的疾病等。\n这些模型通常由研究者解释，并且通常具有更多的理论保证，但是不能扩展到复杂的问题，并且不能像深度模型一样在许多不同背景中重复使用。\n% 576  head\n\n\n另一个明显的区别是\\gls{DL}方法中经常使用的连接类型。\n深度图模型通常具有大的与其他单元组全连接的单元组，使得两个组之间的相互作用可以由单个矩阵描述。\n传统的\\gls{graphical_models}具有非常少的连接，并且每个变量的连接选择可以单独设计。\n模型结构的设计与推断算法的选择紧密相关。\n\\gls{graphical_models}的传统方法通常旨在保持精确推断的可解性。\n当这个约束太强时，我们可以采用一种流行的被称为\\firstgls{loopy_belief_propagation}的\\gls{approximate_inference}算法。\n这两种方法通常在稀疏连接图上都有很好的效果。\n相比之下，在\\gls{DL}中使用的模型倾向于将每个可见单元$\\RSv_i$连接到非常多的\\gls{hidden_unit} $\\RSh_j$上，从而使得$\\RVh$可以获得一个$\\RSv_i$的\\gls{distributed_representation}（也可能是其他几个可观察变量）。\n\\gls{distributed_representation}具有许多优点，但是从\\gls{graphical_models}和计算复杂性的观点来看，\n\\gls{distributed_representation}有一个缺点就是很难产生对于精确推断和\\gls{loopy_belief_propagation}等传统技术来说足够稀疏的图。\n结果，大规模\\gls{graphical_models}和深度图模型最大的区别之一就是\\gls{DL}中几乎从来不会使用\\gls{loopy_belief_propagation}。\n相反的，许多\\gls{DL}模型可以设计来加速~\\gls{gibbs_sampling}或者\\gls{variational_inference}。\n此外，\\gls{DL}模型包含了大量的\\gls{latent_variable}，使得高效的数值计算代码显得格外重要。\n除了选择高级推断算法之外，这提供了另外的动机，用于将结点分组成层，相邻两层之间用一个矩阵来描述相互作用。\n这要求实现算法的单个步骤可以实现高效的矩阵乘积运算，或者专门适用于稀疏连接的操作，例如块对角矩阵乘积或\\gls{convolution}。\n% 576\n\n\n\n最后，\\gls{graphical_models}的\\gls{DL}方法的一个主要特征在于对未知量的较高容忍度。\n与简化模型直到它的每一个量都可以被精确计算不同的是，我们仅仅直接使用数据运行或者是训练，以增强模型的能力。%让模型保持了较高的自由度\n我们一般使用边缘分布不能计算的模型，但可以从中简单地采近似样本。%但是可以简单从中采样的模型。\n我们经常训练具有难以处理的目标函数的模型，我们甚至不能在合理的时间内近似，但是如果我们能够高效地获得这样一个函数的梯度估计，我们仍然能够近似训练模型。\n深度学习方法通常是找出我们绝对需要的最小量信息，然后找出如何尽快得到该信息的合理近似。\n% 577 head\n\n\n\n\\subsection{实例：\\glsentrytext{RBM}}\n\\label{sec:example_the_restricted_boltzmann_machine}\n\\firstall{RBM}\\citep{Smolensky86}或者\\firstgls{harmonium}是\\gls{graphical_models}如何用于深度学习的典型例子。 \n\\glssymbol{RBM}~本身不是一个深层模型。 \n相反，它有一层\\gls{latent_variable}，可用于学习输入的表示。 \n在\\chapref{chap:deep_generative_models}中，我们将看到~\\glssymbol{RBM}~如何被用来构建许多的深层模型。\n在这里，我们举例展示了~\\glssymbol{RBM}~在许多深度图模型中使用的实践：\n它的单元被分成很大的组，这种组称作层，层之间的连接由矩阵描述，连通性相对密集。\n该模型被设计为能够进行高效的~\\gls{gibbs_sampling}，并且模型设计的重点在于以很高的自由度来学习\\gls{latent_variable}，而\\gls{latent_variable}的含义并不是设计者指定的。\n之后在\\secref{sec:restricted_boltzmann_machines}，我们将更详细地再次讨论~\\glssymbol{RBM}。\n% 577\n\n\n标准的~\\glssymbol{RBM}~是具有二值的可见和隐藏单元的\\gls{energy_based_model}。 其\\gls{energy_function}为\n\\begin{align}\n\\label{eqn:1610}\nE(\\Vv,\\Vh) = -\\Vb^{\\top}\\Vv - \\Vc^{\\top}\\Vh - \\Vv^{\\top}\\MW\\Vh,\n\\end{align}\n其中$\\Vb,\\Vc$和$\\MW$都是无约束、实值的可学习参数。\n我们可以看到，模型被分成两组单元：$\\Vv$和$\\Vh$，\n它们之间的相互作用由矩阵$\\MW$来描述。\n该模型在\\figref{fig:rbm}中以图的形式描绘。\n%可以看到。\n该图能够使我们更清楚地发现，该模型的一个重要方面是在任何两个可见单元之间或任何两个\\gls{hidden_unit}之间没有直接的相互作用（因此称为``受限''，一般的\\gls{BM}可以具有任意连接）。\n% 577\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/rbm}}\t\n\\fi\n\t\\caption{一个画成\\gls{markov_network}形式的\\glssymbol{RBM}。}\n\t\\label{fig:rbm}\n\\end{figure}\n\n\n\n对~\\glssymbol{RBM}~结构的限制产生了良好的属性\n\\begin{align}\n\\label{eqn:1611}\np(\\RVh\\mid\\RVv) = \\prod_i p(\\RSh_i\\mid \\RVv)\n\\end{align}\n以及\n\\begin{align}\n\\label{eqn:1612}\np(\\RVv\\mid\\RVh) = \\prod_i p(\\RSv_i\\mid \\RVh).\n\\end{align}\n% 578 head\n独立的条件分布很容易计算。\n对于二元的\\gls{RBM}，我们可以得到：\n\\begin{align}\n\\label{eqn:1613}\np(\\RSh_i = 1\\mid\\RVv) &= \\sigma\\big(\\RVv^{\\top}\\MW_{:,i} + b_i\\big),\\\\\np(\\RSh_i = 0\\mid\\RVv) &= 1 - \\sigma\\big(\\RVv^{\\top}\\MW_{:,i} + b_i\\big).\n\\end{align}\n结合这些属性可以得到高效的\\firstgls{block_gibbs_sampling}，它在同时采样所有$\\Vh$和同时采样所有$\\Vv$之间交替。\n\\glssymbol{RBM}~模型通过~\\gls{gibbs_sampling}产生的样本展示在\\figref{fig:rbm_sample}中。\n% 578 \n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics[width=0.9\\textwidth]{Chapter16/figures/rbm_samples}}\t\n\\fi\n\\caption{训练好的~\\glssymbol{RBM}~的样本及其权重。\n\\emph{(左)}用MNIST训练模型，然后用~\\gls{gibbs_sampling}进行采样。\n每一列是一个单独的~\\gls{gibbs_sampling}过程。\n每一行表示另一个$1000$步后~\\gls{gibbs_sampling}的输出。\n连续的样本之间彼此高度相关。\n\\emph{(右)}对应的权重向量。\n将本图结果与图\\ref{fig:s3c_samples}中描述的\\gls{linear_factor}的样本和权重相比。\n由于~\\glssymbol{RBM}~的先验$p(\\Vh)$没有限制为\\gls{factorial}，这里的样本表现得好很多。\n采样时~\\glssymbol{RBM}~能够学习到哪些特征需要一起出现。\n另一方面说，\\glssymbol{RBM}~后验$p(\\Vh \\mid \\Vv)$是\\gls{factorial}的，而\\gls{sparse_coding}的后验并不是，所以在特征提取上\\gls{sparse_coding}模型表现得更好。\n其他的模型可以使用非\\gls{factorial}的$p(\\Vh)$和非\\gls{factorial}的$p(\\Vh \\mid \\Vh)$。\n图片经~\\citet{lisa_tutorial_rbm}允许转载。}\n\\label{fig:rbm_sample}\n\\end{figure}\n\n\n由于\\gls{energy_function}本身只是参数的线性函数，很容易获取\\gls{energy_function}的导数。 例如，\n\\begin{align}\n\\label{eqn:1615}\n\\frac{\\partial}{\\partial W_{i,j}} E(\\RVv,\\RVh) = - \\RSv_i \\RSh_j.\n\\end{align}\n\n\n% 579 head\n这两个属性，高效的~\\gls{gibbs_sampling}和导数计算，使训练过程变得非常方便。\n在\\chapref{chap:confronting_the_partition_function}中，我们将看到，可以通过计算应用于这种来自模型样本的导数来训练\\gls{undirected_model}。\n% 579\n\n训练模型可以得到数据$\\Vv$的表示$\\Vh$。\n我们经常使用$\\SetE_{\\RVh\\sim p(\\RVh\\mid\\Vv)}[\\Vh]$ 作为一组描述$\\Vv$的特征。\n% 579\n\n\n\n总的来说，\\glssymbol{RBM}~展示了典型的\\gls{graphical_models}\\gls{DL}方法：\n%结合由矩阵参数化的层之间的高效相互作用通过多层\\gls{latent_variable}完成\\gls{representation_learning}。\n使用多层\\gls{latent_variable}，并由矩阵参数化层之间的高效相互作用来完成\\gls{representation_learning}。\n% 579\n\n\n\\gls{graphical_models}为描述概率模型提供了一种优雅、灵活、清晰的语言。 \n在未来的章节中，我们将使用这种语言，以其他视角来描述各种各样的深度概率模型。\n% 579\n\n\n\n\n"
  },
  {
    "path": "Chapter17/README.md",
    "content": "#第十七章笔记\n"
  },
  {
    "path": "Chapter17/annotations.txt",
    "content": "{'user': 'acct:caszhang@hypothes.is', 'text': '总是', 'origin_text': '：Las Vegas算法和蒙特卡罗算法。Las Vegas算法  !!!通常!!!  精确地返回一个正确答案 （或者发布一个失败报告）。这类方法通常', 'time': '2017-03-11T07:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '报告求解失败', 'origin_text': '算法。Las Vegas算法通常精确地返回一个正确答案 （或者  !!!发布一个失败报告!!!  ）。这类方法通常需要占用随机量的计算资源（通常指的是内存和运行', 'time': '2017-03-11T07:48'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '或', 'origin_text': '来说，我们很难得到精确的答案。这类问题很难用精确的确定性的算法  !!!如!!!  Las Vegas算法解决。% 和 -> 如取而代之的是确定性', 'time': '2017-03-11T07:52'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '还有些时候', 'origin_text': '，就像我们使用minibatch对整个训练代价进行子采样一样。  !!!在其他情况下!!!  ，我们需要近似一个难以处理的和或积分，例如估计一个无向模型中配分', 'time': '2017-03-11T07:54'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '下面几个性质表明了这种近似的合理性', 'origin_text': '=1}^{n}f(\\\\Vx^{(i)}).\\\\end{align}  !!!这种近似可以被证明拥有如下几个性质!!!  。首先很容易观察到s^s^\\\\hat{s}这个估计是无偏的，由于', 'time': '2017-03-11T07:56'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '我们更倾向于用方差的无偏估计，它由偏差的平方和除以$n-1$而非$n$得到', 'origin_text': '))f(\\\\Vx^{(i)})的经验均值和方差\\\\footnote{  !!!计算无偏估计的方差时，更倾向于用计算偏差平方和除以n−1n−1n-1而非nnn。!!!  }，然后将估计的方差除以样本数nnn来得到Var[s^n]Va', 'time': '2017-03-11T08:01'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '估计量', 'origin_text': 'n]Var[s^n]\\\\text{Var}[\\\\hat{s}_n]的  !!!估计!!!  。中心极限定理告诉我们s^ns^n\\\\hat{s}_n的分布收敛', 'time': '2017-03-11T08:02'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '累积分布函数', 'origin_text': 'Vx)]}{n}为方差的正态分布。这使得我们可以利用正态分布的  !!!累积密度函数!!!  来估计s^ns^n\\\\hat{s}_n的置信区间。以上的所有', 'time': '2017-03-11T08:04'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '找出一列收敛于目标分布的估计量', 'origin_text': '备选方案是用重要采样，在\\\\sec?会讲到。一种更加通用的方式是  !!!使用一个趋近于目标分布估计的序列!!!  。这就是马尔可夫链蒙特卡罗方法（见\\\\sec?）。重要采样', 'time': '2017-03-11T08:11'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不存在唯一', 'origin_text': '一步。p(x)f(x)p(x)f(x)p(\\\\Vx)f(\\\\Vx)  !!!存在不唯一!!!  的分解因为它通常可以被写成p(x)f(x)=q(x)p(x)f', 'time': '2017-03-11T08:14'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '总（可以不译出）', 'origin_text': ')p(x)f(x)p(\\\\Vx)f(\\\\Vx)存在不唯一的分解因为它  !!!通常!!!  可以被写成p(x)f(x)=q(x)p(x)f(x)q(x),', 'time': '2017-03-11T08:15'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '如果考虑达到某给定精度所需要的样本数', 'origin_text': '既然是求期望，那么很自然地ppp和fff是一种分解选择。然而，  !!!从衡量一定采样数所达到精度的角度说!!!  ，原始定义的问题通常不是最优的选择。幸运的是，最优的选择$q^', 'time': '2017-03-11T08:17'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '删去', 'origin_text': '，原始定义的问题通常不是最优的选择。幸运的是，最优的选择$q^  !!!通常!!!  可以简单推出。这种最优的采样函数通常可以简单推出。这种最优的采样', 'time': '2017-03-11T08:19'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '由等式\\\\eqref{}可得', 'origin_text': '出。这种最优的采样函数q^$对应的是所谓的最优重要采样。  !!!从\\\\eqn?所示的关系中可以发现!!!  ，任意蒙特卡罗估计\\\\begin{align}\\\\hat{s}p', 'time': '2017-03-11T08:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '估计量\\n\\n（本章许多estimator都被翻译成了估计，这是不准确的）', 'origin_text': '优重要采样。从\\\\eqn?所示的关系中可以发现，任意蒙特卡罗  !!!估计!!!  \\\\begin{align}\\\\hat{s}p = \\\\frac{', 'time': '2017-03-11T08:23'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '估计量', 'origin_text': '{(i)})\\\\end{align}可以被转化为一个重要采样的  !!!估计!!!  \\\\begin{align}\\\\hat{s}q = \\\\frac{1', 'time': '2017-03-11T08:23'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '估计量', 'origin_text': 'x^{(i)})}.\\\\end{align}我们可以容易地发现  !!!估计值!!!  的期望与qqq分布无关：\\\\begin{align}\\\\SetE', 'time': '2017-03-11T08:24'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '可能对(can be)', 'origin_text': '_p] = s.\\\\end{align}然而，重要采样的方差却  !!!对!!!  不同qqq的选取非常敏感。这个方差可以表示为Var[s^q]', 'time': '2017-03-11T08:24'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '原问题', 'origin_text': '个样本就足够了}。当然，这仅仅是因为计算q^$的时候已经解决了  !!!所有的问题!!!  。所以这种只需要采一个样本的方法往往是实践中无法实现的。', 'time': '2017-03-11T08:26'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '能得到正确期望的', 'origin_text': '中无法实现的。对于重要采样来说任意qqq分布都是可行的（从  !!!得到一个期望上正确的值的!!!  角度来说），$q^指的是最优的指的是最优的指的是最优的q分布（从', 'time': '2017-03-11T08:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '减小', 'origin_text': '方差的角度上考虑）。从q^中采样往往是不可行的，但是其他仍然能  !!!降低!!!  方差的中采样往往是不可行的，但是其他仍然能降低方差的中采样往往是', 'time': '2017-03-11T08:28'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这一估计量', 'origin_text': 'i)x(i)\\\\Vx^{(i)}是从分布qq{q}中采集的样本。  !!!这种估计!!!  是有偏的因为E[s^BIS]≠sE[s^BIS]≠s\\\\SetE[', 'time': '2017-03-11T08:32'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '只有$n\\\\to\\\\infty$，17.14式的分母趋于$1$时才渐近成立等号\\n\\n（注意渐近的近是远近的近）', 'origin_text': 'etE[\\\\hat{s}_{\\\\text{BIS}}]\\\\neq s，  !!!除非当nnn渐进性地趋近于∞∞\\\\infty时，方程~\\\\eq?的分母会收敛到1!!!  11。所以这种估计也被叫做渐进性无偏的。尽管一个好的qq', 'time': '2017-03-11T14:13'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '渐近无偏', 'origin_text': 'y时，方程~\\\\eq?的分母会收敛到111。所以这种估计也被叫做  !!!渐进性无偏!!!  的。尽管一个好的qqq分布的选择可以显著地提高蒙特卡罗估计', 'time': '2017-03-11T08:40'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这一估计量', 'origin_text': '于∞∞\\\\infty时，方程~\\\\eq?的分母会收敛到111。所以  !!!这种估计!!!  也被叫做渐进性无偏的。尽管一个好的qqq分布的选择可以显著', 'time': '2017-03-11T08:40'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '一个好的$q$分布的选择可以显著地提高蒙特卡罗估计的效率，而一个糟糕的$q$分布选择却会使效率大幅下降\\n（语句不通）', 'origin_text': '的分母会收敛到111。所以这种估计也被叫做渐进性无偏的。  !!!尽管一个好的qqq分布的选择可以显著地提高蒙特卡罗估计的效率，反之一个糟糕的qqq分布选择则会使效率更糟糕!!!  。我们回过头来看看方程~\\\\eq?会发现，如果存在一个qqq使得', 'time': '2017-03-11T08:45'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '估计量', 'origin_text': 'rac{p(\\\\Vx)f(\\\\Vx)}{q(\\\\Vx)}很大，那么这个  !!!估计!!!  的方差也会很大。当q(x)q(x)q(\\\\Vx)很小，而f(x)', 'time': '2017-03-11T08:45'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '而不足以', 'origin_text': 'f(x)f(x)f(\\\\Vx)和p(x)p(x)p(\\\\Vx)都较大  !!!并且无法!!!  抵消qqq时，这种情况会非常明显。qqq分布经常会取一些简单常', 'time': '2017-03-11T08:46'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '与？', 'origin_text': '样。当xx\\\\Vx是高维数据的时候，qqq分布的简单性使得它很难  !!!于!!!  ppp或者p|f|p|f|p\\\\vert f\\\\vert相匹配。当', 'time': '2017-03-11T08:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '加数很小或者为零', 'origin_text': '^{(i)})\\\\vert 的时候，重要采样采到了很多无用的样本（  !!!权值之和很小或趋于零!!!  ）。另一方面，当q(x(i))≪p(x(i))|f(x(i))', 'time': '2017-03-11T08:50'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这种', 'origin_text': '被采到，其对应的权值却会非常大。正因为后一个事件是很少发生的，  !!!这些!!!  样本很难被采到，通常使得对sss的估计出现了典型的估计不足，很难', 'time': '2017-03-11T08:54'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这样一来，我们会常常欠估计$s$，而能将之抵消的严重过估计却很少发生【注：这两个分句分别对应着前面两种情况，gross应作“严重的”解】', 'origin_text': '却会非常大。正因为后一个事件是很少发生的，这些样本很难被采到，  !!!通常使得对sss的估计出现了典型的估计不足，很难被整体的估计过量抵消!!!  。这样的不均匀情况在高维数据屡见不鲜，因为在高维度分布中联合分', 'time': '2017-03-12T00:46'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '有可能', 'origin_text': '不均匀情况在高维数据屡见不鲜，因为在高维度分布中联合分布的动态域  !!!通常!!!  非常大。尽管存在上述的风险，但是重要采样及其变种在机器学', 'time': '2017-03-11T08:59'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '包含大量', 'origin_text': '重要的角色，包括深度学习算法。比方说，重要采样被应用于加速训练  !!!具有大规模!!!  词汇的神经网络语言模型的过程中（见\\\\sec?）或者其他有着大量输', 'time': '2017-03-11T09:00'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '对数似然', 'origin_text': '程中（详见\\\\sec?）以及在深度有向图模型比如变分自编码器中估计  !!!似然函数的对数!!!  （详见\\\\sec?）。采用随机梯度下降训练模型参数的时候重要采样', 'time': '2017-03-11T09:10'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '尤其是分类器这样的模型，其中代价函数主要由少量错误分类的样本产生', 'origin_text': '下降训练模型参数的时候重要采样可以用来改进对代价函数梯度的估计，  !!!尤其是针对于分类器模型的训练中一小部分错误分类样本产生的代价函数!!!  。在这种情况下更加频繁地采集这些困难的样本可以降低梯度估计的方', 'time': '2017-03-11T09:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '“一种”后加上“易处理的方法来”【漏译tractable method】', 'origin_text': '尔可夫链蒙特卡罗方法在许多实例中，我们希望采用蒙特卡罗方法，  !!!然而往往又不存在一种!!!  直接从目标分布pmodel(x)pmodel(x)p_{\\\\tex', 'time': '2017-03-11T10:59'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这种情况通常发生在$p_{\\\\text{model}}(\\\\RV x)$表示为无向图模型时', 'origin_text': '小的）重要采样分布q(x)q(x)q(\\\\Vx)。在深度学习中，  !!!分布pmodel(x)pmodel(x)p_{\\\\text{model}}(\\\\RVx)往往表达成一个无向模型!!!  。在这种情况下，为了从分布pmodel(x)pmodel(x)', 'time': '2017-03-11T09:24'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '方法（前后统一）', 'origin_text': '马尔可夫链来进行蒙特卡罗估计的这一类算法被称为马尔可夫链蒙特卡罗  !!!算法!!!  。马尔可夫链蒙特卡罗算法在机器学习中的应用在{koller-b', 'time': '2017-03-11T09:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '方法', 'origin_text': '计的这一类算法被称为马尔可夫链蒙特卡罗算法。马尔可夫链蒙特卡罗  !!!算法!!!  在机器学习中的应用在{koller-book2009}中花了大量', 'time': '2017-03-11T09:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '方法', 'origin_text': '{koller-book2009}中花了大量篇幅描述。MCMC  !!!算法!!!  最标准，最一般的要求是只适用模型分布处处不为000的情况。因此', 'time': '2017-03-11T09:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'EBM表述', 'origin_text': 'ropto \\\\exp(-E(\\\\Vx))中采样，见\\\\sec?。在  !!!EBM!!!  中每一个状态所对应的概率都不为零。事实上MCMC方法可以被广泛', 'time': '2017-03-11T09:29'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '事实上，MCMC方法的适用范围比这要广，许多包含零概率状态的分布也可以用', 'origin_text': '样，见\\\\sec?。在EBM中每一个状态所对应的概率都不为零。  !!!事实上MCMC方法可以被广泛地应用在了许多包含概率为000的状态的概率分布中!!!  。然而，在这种情况下，关于MCMC方法性能的理论保证只能依据具', 'time': '2017-03-11T09:51'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '最标准、最一般的理论保证只适用于那些各状态概率均不为零的模型【注：theoretical guarantee的意思类似于correctness proof】', 'origin_text': 'oller-book2009}中花了大量篇幅描述。MCMC算法  !!!最标准，最一般的要求是只适用模型分布处处不为000的情况!!!  。因此，最方便的目标分布的表达是从基于能量的模型即p(x)∝e', 'time': '2017-03-11T09:53'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '逐一加以证明', 'origin_text': '情况下，关于MCMC方法性能的理论保证只能依据具体不同类型的分布  !!!具体分析证明!!!  。在深度学习中，应用于所有基于能量的模型的通用理论保证是很常见', 'time': '2017-03-11T09:54'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '我们通常依赖于那些对所有基于能量的模型都能自然成立的、最一般的理论保证', 'origin_text': '理论保证只能依据具体不同类型的分布具体分析证明。在深度学习中，  !!!应用于所有基于能量的模型的通用理论保证是很常见的!!!  。为了解释从基于能量的模型中采样的困难性，我们考虑一个包含', 'time': '2017-03-11T09:55'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '记其给出的分布为$p(a,b)$', 'origin_text': '量的模型中采样的困难性，我们考虑一个包含两个变量的EBM的例子，  !!!记作p(a,b)!!!  p(a,b)p(\\\\RSa,\\\\RSb)。为了采aa\\\\RSa，我们', 'time': '2017-03-11T10:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '难处理的(intractable)', 'origin_text': 'p(b∣a)p(\\\\RSb\\\\mid \\\\RSa)中采样。这似乎成了  !!!难以解释的!!!  先有鸡还是先有蛋的问题。有向模型避免了这一问题因为它的图是有向', 'time': '2017-03-11T10:32'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '建议：“原始采样”似乎没有体现出ancestral一词的含义，建议译为祖先采样', 'origin_text': '问题。有向模型避免了这一问题因为它的图是有向无环的。为了完成  !!!原始采样!!!  ，我们根据拓扑顺序采样每一个变量，给定每个变量的所有父结点的条件', 'time': '2017-03-11T10:37'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '我们按拓扑序，在父结点给定的条件下依次采样各个变量（可以保证，这时父结点已经被采样过了）。', 'origin_text': '向模型避免了这一问题因为它的图是有向无环的。为了完成原始采样，  !!!我们根据拓扑顺序采样每一个变量，给定每个变量的所有父结点的条件下，这个变量是确定能够被采样的!!!  （详见\\\\sec?）。原始采样定义了一种高效的，单路径的方法来采', 'time': '2017-03-11T12:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '单遍(single-pass)', 'origin_text': '确定能够被采样的（详见\\\\sec?）。原始采样定义了一种高效的，  !!!单路径!!!  的方法来采集一个样本。在一个EBM中，我们通过使用马尔可夫', 'time': '2017-03-11T10:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '可以', 'origin_text': '种高效的，单路径的方法来采集一个样本。在一个EBM中，我们  !!!通过!!!  使用马尔可夫链来采样，从而避免了先有鸡还是先有蛋的问题。马尔可', 'time': '2017-03-11T10:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '介绍这些方法最方便的表述是从基于能量的模型即p(x)∝exp(−E(x))中采样', 'origin_text': '标准，最一般的要求是只适用模型分布处处不为000的情况。因此，  !!!最方便的目标分布的表达是从基于能量的模型即p(x)∝exp(−E(x))p(x)∝exp\\u2061(−E(x))p(\\\\Vx)\\\\propto \\\\exp(-E(\\\\Vx))中采样!!!  ，见\\\\sec?。在EBM中每一个状态所对应的概率都不为零。事', 'time': '2017-03-11T10:55'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '从某个可取任意值的状态$\\\\Vx$出发', 'origin_text': '采样，从而避免了先有鸡还是先有蛋的问题。马尔可夫链的核心思想是  !!!以一个任意状态的点xx\\\\Vx作为起始点!!!  。随着时间的推移，我们随机地反复地更新状态xx\\\\Vx。最终x', 'time': '2017-03-11T12:18'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '值', 'origin_text': '(x′∣x)T(x′∣x)T(\\\\Vx’\\\\mid \\\\Vx)反复地用  !!!状态!!!  x′x′\\\\Vx’来更新状态xx\\\\Vx。为了给出MCMC方法', 'time': '2017-03-11T12:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '改换参数表示这一问题', 'origin_text': '态xx\\\\Vx。为了给出MCMC方法为何有效的一些理论解释，  !!!重定义这个问题!!!  是很有用的。首先我们关注一些简单的情况，其中随机变量xx\\\\RV', 'time': '2017-03-11T12:22'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '此时我们可以把状态简单', 'origin_text': '先我们关注一些简单的情况，其中随机变量xx\\\\RVx有可数个状态。  !!!我们将这种状态!!!  记作正整数xxx。不同的整数xxx的大小对应着原始问题中xx\\\\', 'time': '2017-03-11T12:23'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '各条马尔可夫链的状态都是从某个分布q(t)(x)中采到的', 'origin_text': '接下来我们考虑如果并行地运行无穷多个马尔可夫链会发生什么。  !!!不同马尔可夫链的所有状态都会被某一个分布q(t)(x)q(t)(x)q^{(t)}(x)采到!!!  ，在这里ttt表示消耗的时间数。开始时，对每个马尔可夫链，我们', 'time': '2017-03-11T12:26'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '利用我们的整数值参数', 'origin_text': '}(x) T(x’\\\\mid x).\\\\end{align}  !!!根据状态为整数的设定!!!  ，我们可以将转移算子TTT表示成一个矩阵AA\\\\MA。矩阵AA\\\\', 'time': '2017-03-11T12:29'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '改写', 'origin_text': 'Vx = j).\\\\end{align}使用这一定义，我们可以  !!!重新写成!!!  \\\\eqn?。与之前使用qqq和TTT来理解单个状态的更新相对的', 'time': '2017-03-11T12:30'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不同的？', 'origin_text': '在可以使用vv\\\\Vv和AA\\\\MA来描述当我们更新时（并行运行的）  !!!不同个!!!  马尔可夫链上整个分布是如何变化的：v(t)=Av(t−1).v', 'time': '2017-03-11T12:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '求$\\\\MA$的幂', 'origin_text': '重复地乘上矩阵AA\\\\MA。换一句话说，我们可以认为这一过程就是  !!!关于AA\\\\MA的指数变化!!!  ：v(t)=Atv(0).v(t)=Atv(0).\\\\begin', 'time': '2017-03-11T12:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '如果对于', 'origin_text': '它的每一列都代表了一个概率分布。这样的矩阵被称作是随机矩阵。  !!!对于!!!  任意状态xxx到任意其他状态x′x′x’存在一个ttt使得转移概', 'time': '2017-03-11T12:32'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '是实数$1$', 'origin_text': 'robenius定理~{cite?}可以保证这个矩阵的最大特征值  !!!是实数且大小为1!!!  11。我们可以看到所有的特征值随着时间呈现指数变化：v(t)', 'time': '2017-03-11T12:32'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '稳定点', 'origin_text': '条件也适用于收敛之后的每一步。这就是特征向量方程。作为收敛的  !!!静止点!!!  ，vv\\\\Vv一定是特征值为111所对应的特征向量。这个条件保证', 'time': '2017-03-11T12:34'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '再重复转移采样过程', 'origin_text': '值为111所对应的特征向量。这个条件保证收敛到了平稳分布以后，  !!!之后的采样过程!!!  不会改变不同马尔可夫链的状态分布（尽管转移算子自然而然地会改变每', 'time': '2017-03-11T12:35'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '很快会(shortly)', 'origin_text': '最终的平稳分布 qqq将会等于我们所希望采样的分布ppp。我们  !!!会简要地!!!  介绍如何选择TTT，详见\\\\sec?。可数状态马尔可夫链的大', 'time': '2017-03-11T12:36'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不动点', 'origin_text': '些宽松的条件下，一个带有转移算子TTT的马尔可夫链都会收敛到一个  !!!固定点!!!  ，这个固定点可以写成如下形式：q′(x′)=Ex∼qT(x′∣', 'time': '2017-03-11T12:37'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不动点', 'origin_text': '下，一个带有转移算子TTT的马尔可夫链都会收敛到一个固定点，这个  !!!固定点!!!  可以写成如下形式：q′(x′)=Ex∼qT(x′∣x),q′(', 'time': '2017-03-11T12:37'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '包括了XXX的操作/需要XXX', 'origin_text': '应的是积分。无论状态是连续还是离散，所有的马尔可夫链方法都  !!!包括了!!!  重复，随机地更新直到最终所有的状态开始从平衡分布中采样。运行马', 'time': '2017-03-11T12:38'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '高度相关', 'origin_text': '多数量的样本序列。这些样本服从同一分布，但是两个连续的样本之间  !!!存在强烈的相关性!!!  。所以一个有限的序列无法完全表达平衡分布。一种解决这个问题的', 'time': '2017-03-11T12:40'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '马尔可夫链的计算开销很大', 'origin_text': '的统计量的估计不会被MCMC方法的样本之间的相关性所干扰。所以  !!!马尔可夫链在计算上是非常昂贵的!!!  ，主要源于达到平衡分布前需要预烧的时间以及在达到平衡分布之后从一', 'time': '2017-03-11T12:41'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '足够无关', 'origin_text': '分布前需要预烧的时间以及在达到平衡分布之后从一个样本转移到另一个  !!!完全无关!!!  的样本所需要的时间。如果我们想要得到完全独立的样本，那么我们需', 'time': '2017-03-11T12:42'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '减少时延(latency)', 'origin_text': '要同时并行的运行多个马尔可夫链。这种方法使用了额外的并行计算来  !!!消除潜在因素的干扰!!!  。使用一条马尔可夫链来生成所有样本的策略和（使用多条马尔可夫链', 'time': '2017-03-11T12:43'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不能真的', 'origin_text': '的第二大特征值决定了马尔可夫链的混合时间。然而，在实践中，我们  !!!通常不能!!!  将马尔可夫链表示成为矩阵的形式。我们的概率模型所能够达到的状态', 'time': '2017-03-11T12:45'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '包括以上在内的诸多', 'origin_text': '达vv\\\\Vv、AA\\\\MA或者AA\\\\MA的特征值是不现实的。由于  !!!这些!!!  阻碍，我们通常无法知道马尔可夫链是否已经混合成功。作为替代，我', 'time': '2017-03-11T12:46'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '判断', 'origin_text': '尔可夫链直到我们粗略估计这段时间是足够的，然后使用启发式的方法来  !!!决定!!!  马尔可夫链是否混合成功。这些启发性的算法包括了手动检查样本或者', 'time': '2017-03-11T12:46'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '如何确定分布$q(\\\\Vx)$是有效的', 'origin_text': '个分布q(x)q(x)q(\\\\Vx)中采样。然而我们还没有提到过  !!!如何确定一个有效的q(x)q(x)q(\\\\Vx)分布!!!  。本书中描述了两种基本的方法。第一种方法是从已经学习到的分布', 'time': '2017-03-11T12:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '记模型结构的无向图表示为G，然后从p_model中该点关于G中其邻接点的条件分布中抽样', 'origin_text': '\\\\mid \\\\RVx)采样是通过选择一个变量xixi\\\\RSx_i，  !!!然后从pmodelpmodelp_{\\\\text{model}}中该点关于在无向图GG\\\\CalG（定义了基于能量的模型结构）中邻接点的条件分布中抽样!!!  。给定他们所有的邻居结点只要一些变量是条件独立的，那么这些变量', 'time': '2017-03-11T12:53'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '如果某些变量在给定相邻变量时是条件独立的，那么它们可以被同时采样', 'origin_text': '\\\\CalG（定义了基于能量的模型结构）中邻接点的条件分布中抽样。  !!!给定他们所有的邻居结点只要一些变量是条件独立的，那么这些变量可以被同时采样!!!  。正如在\\\\sec?中看到的RBM的例子一样，RBM所有的隐藏单', 'time': '2017-03-11T15:00'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '给定全部可见单元', 'origin_text': '到的RBM的例子一样，RBM所有的隐藏单元可以被同时采样，因为在  !!!给定可见单元!!!  的条件下他们相互条件独立。同样的，所有的可见单元也可以被同时采', 'time': '2017-03-11T12:55'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '它们', 'origin_text': '，RBM所有的隐藏单元可以被同时采样，因为在给定可见单元的条件下  !!!他们!!!  相互条件独立。同样的，所有的可见单元也可以被同时采样因为在给定', 'time': '2017-03-11T12:56'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '领域中', 'origin_text': '方法。比如说，Metropolis-Hastings算法在其他  !!!情景下!!!  被广泛使用。在深度学习的无向模型中，除了Gibbs采样很少使用', 'time': '2017-03-11T12:57'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '在于马尔可夫链的混合通常不理想\\n【句子有歧义，不是混合MCMC methods】', 'origin_text': '不同的峰值之间的混合挑战使用MCMC方法的主要难点  !!!在于他们经常混合得很糟糕!!!  。理想情况下，从设计好的马尔可夫链中采出的连续样本之间是完全独', 'time': '2017-03-11T16:43'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '马尔可夫链会按概率大小访问许多不同区域', 'origin_text': '可夫链中采出的连续样本之间是完全独立的，而且在xx\\\\Vx空间中，  !!!马尔可夫链以正比于不同区域对应概率的概率访问这些区域!!!  。然而，MCMC方法采出的样本可能会具有很强的相关性，尤其是在', 'time': '2017-03-11T13:01'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '可删去，前面已经翻译出“等价于”了', 'origin_text': '的操作，或者说等价于相对于链的状态（随机变量被采样）依据概率进行  !!!等效的!!!  噪声爬坡。（在马尔可夫链的状态空间中）从x(t−1)x(t−1', 'time': '2017-03-11T13:04'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '被采样的随机变量', 'origin_text': '地执行类似于带噪声的梯度下降的操作，或者说等价于相对于链的状态（  !!!随机变量被采样!!!  ）依据概率进行等效的噪声爬坡。（在马尔可夫链的状态空间中）从x', 'time': '2017-03-11T13:04'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '构型\\n【注：作者在涉及energy的地方回归物理学用了configuration一词，可译为“能量构型”；其实和state指的是一回事】', 'origin_text': 'x(t−1))E(\\\\Vx^{(t-1)})，倾向于向较低能量的  !!!区域!!!  移动。当从可能性较小的状态（比来自p(x)p(x)p(\\\\Vx)', 'time': '2017-03-11T13:59'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '连通的', 'origin_text': '变量是图像中的像素，则低能量的区域可以是同一对象所对应图像的一个  !!!相连的!!!  流形），我们称之为峰值，链将倾向于围绕着这个峰值游走（以某一种形', 'time': '2017-03-11T13:11'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '模(最频值，mode)，见《模式分类》P78/472', 'origin_text': '量）开始时，链趋向于逐渐减少状态的能量，并且仅仅偶尔移动到另一个  !!!峰值!!!  。一旦该链已经找到低能量的区域（例如，如果变量是图像中的像素，', 'time': '2017-03-11T13:17'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '模，下同', 'origin_text': '能量的区域可以是同一对象所对应图像的一个相连的流形），我们称之为  !!!峰值!!!  ，链将倾向于围绕着这个峰值游走（以某一种形式的随机游走）。它时', 'time': '2017-03-11T13:18'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '当目标分布包含很多被低概率区域分割的高概率模', 'origin_text': '（随着能量障碍的高度）指数下降的，如在\\\\fig?中展示的一样。  !!!当目标分布有很多峰值并且以很高的概率被低概率区域所分割!!!  ，尤其当Gibbs采样的每一步都只是更新变量的一小部分而这一小部', 'time': '2017-03-11T13:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'the problem arises，没有“严重的”', 'origin_text': '新变量的一小部分而这一小部分变量又严重依赖其他的变量时，这会导致  !!!严重的问题!!!  。\\\\begin{figure}[!htb]\\\\ifOpen', 'time': '2017-03-11T13:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '运行的马尔可夫链', 'origin_text': 'i\\\\caption{对于三种分布使用Gibbs采样所产生的路径，  !!!所有的分布马尔可夫链!!!  初始值都设为峰值。（左）一个带有两个独立变量的多维正态分布。由于', 'time': '2017-03-11T13:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '进入', 'origin_text': '高斯分布。Gibbs采样混合得很慢，因为每次更新仅仅一个变量很难  !!!跨越!!!  不同的峰值。}\\\\end{figure}\\\\begin{figure', 'time': '2017-03-11T13:22'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '二值', 'origin_text': '变量aa\\\\RSa， bb\\\\RSb的基于能量的模型，这两个变量都是  !!!二元!!!  的，取值+1+1+1或者−1−1-1。如果对某个较大的正数ww', 'time': '2017-03-11T13:23'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'b的条件分布', 'origin_text': '当a=1a=1\\\\RSa=1时用Gibbs采样更新bb\\\\RSb。  !!!给定bb\\\\RSb时的条件分布!!!  满足p(b=1∣a=1)=σ(w)p(b=1∣a=1)=σ(w)', 'time': '2017-03-11T13:26'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'b也取到1', 'origin_text': '(w)。如果www的值很大，sigmoid函数趋近于饱和，那么  !!!bbb取到1!!!  11的概率趋近于111。相同的道理，如果a=−1a=−1\\\\RS', 'time': '2017-03-11T13:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '两个变量取这两种符号的可能性相等', 'origin_text': 'a,b)p_{\\\\text{model}}(\\\\RSa,\\\\RSb)，  !!!两个变量取一样的符号的概率几乎相等!!!  。根据pmodel(a∣b)pmodel(a∣b)p_{\\\\te', 'time': '2017-03-11T13:28'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不仅', 'origin_text': '符号。在实际问题中，这种挑战更加地艰巨因为在实际问题中我们  !!!不能仅仅!!!  关注在两个峰值之间的转移而是需要关注在多个峰值之间地转移。如果', 'time': '2017-03-11T13:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '更', 'origin_text': '战更加地艰巨因为在实际问题中我们不能仅仅关注在两个峰值之间的转移  !!!而是需要!!!  关注在多个峰值之间地转移。如果由于峰值之间混合困难导致几个这样', 'time': '2017-03-11T13:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '的', 'origin_text': '中我们不能仅仅关注在两个峰值之间的转移而是需要关注在多个峰值之间  !!!地!!!  转移。如果由于峰值之间混合困难导致几个这样的转移是很艰难的，那', 'time': '2017-03-11T13:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '的', 'origin_text': 's采样很难会改变这些变量的符号。在实际问题中，这种挑战更加  !!!地!!!  艰巨因为在实际问题中我们不能仅仅关注在两个峰值之间的转移而是需要', 'time': '2017-03-11T13:31'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '开销很高【注：指的是计算开销】', 'origin_text': '样的转移是很艰难的，那么得到一些可靠的覆盖大部分峰值的样本集合的  !!!代价是很昂贵的!!!  ，同时马尔可夫链收敛到它的平稳分布的过程也会非常缓慢。通过', 'time': '2017-03-11T13:32'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '某几个这样的转移难以完成', 'origin_text': '而是需要关注在多个峰值之间地转移。如果由于峰值之间混合困难导致  !!!几个这样的转移是很艰难的!!!  ，那么得到一些可靠的覆盖大部分峰值的样本集合的代价是很昂贵的，同', 'time': '2017-03-11T13:33'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '【是】可以', 'origin_text': '高度依赖变量的组以及分块同时更新块（组）中的变量，这个问题有时候  !!!可以!!!  被解决的。然而不幸的是，当依赖关系很复杂的时候，从这些组中采样', 'time': '2017-03-11T13:41'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '要有', 'origin_text': 'x的足够信息从而能够较完整地重构它，这意味hh\\\\Vh和xx\\\\Vx  !!!有着!!!  非常高的互信息。这两个目标是相互矛盾的。我们经常学习到能够将', 'time': '2017-03-11T13:42'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '但是想让吉布斯链从分布的一个模转移到另一个（比如通过改变数字）仍然是很困难的', 'origin_text': '样作用于一个深度图模型，相似度更多地是基于语义而非原始视觉特征。  !!!但是对于吉布斯链来说从分布的一个峰值转移到另一个仍然是很困难的，比如说改变数字!!!  。（右）从生成式对抗网络中抽出的连续原始样本。因为原始采样生成的', 'time': '2017-03-11T13:46'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这些问题就使MCMC方法变得不那么有用了', 'origin_text': 'gure}当感兴趣的分布对于每个类具有单独的流形结构时，  !!!所有这些问题可以使MCMC方法不那么有用!!!  ：分布集中在许多峰值周围，并且这些模式由大量高能量区域分割。我', 'time': '2017-03-11T13:48'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '构造一个概率分布替代目标分布', 'origin_text': '区域包围时，很难在分布的不同峰值之间混合。一些加速混合的方法是  !!!基于构造一个不同的概率分布!!!  ，这个概率分布的峰值没有那么高，峰值周围的低谷也没有那么低。基', 'time': '2017-03-11T13:50'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '此前，我们一直以概率分布定义基于能量的模型', 'origin_text': '谷也没有那么低。基于能量的模型为这个想法提供一种简单的做法。  !!!截止目前，我们已经描述了一个基于能量的模型的概率分布的定义!!!  ：p(x)∝exp(−E(x)).p(x)∝exp\\u2061(−E(x', 'time': '2017-03-11T13:51'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '反映出基于能量的模型的统计物理学起源', 'origin_text': 'end{align}ββ\\\\beta参数可以被理解为温度的倒数，  !!!在统计物理中反映了基于能量的模型的本质!!!  。当温度趋近于0时，ββ\\\\beta趋近于无穷大，此时的基于能量', 'time': '2017-03-11T13:53'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '但我们也可以利用其他的温度', 'origin_text': '通常情况下，在β=1β=1\\\\beta = 1时训练一个模型。  !!!然而，我们利用了其他温度!!!  ，尤其是β<1β<1\\\\beta < 1的情况。回火作为一种通用', 'time': '2017-03-11T13:54'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '构型', 'origin_text': ')p(\\\\Vx)的典型样本拥有更高的能量）开始时，链趋向于逐渐减少  !!!状态!!!  的能量，并且仅仅偶尔移动到另一个峰值。一旦该链已经找到低能量的', 'time': '2017-03-11T13:58'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '会暂时', 'origin_text': '峰值之间快速混合。基于回火转移~{cite?}的马尔可夫链  !!!初始!!!  从高温度的分布中采样使其在不同峰值之间混合，然后从单位温度的分布', 'time': '2017-03-11T13:59'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '继续在单位温度的分布中采样', 'origin_text': '的马尔可夫链初始从高温度的分布中采样使其在不同峰值之间混合，然后  !!!从单位温度的分布中重新开始!!!  。这些技巧被应用在一些模型比如RBM中~{cite?}。另一', 'time': '2017-03-11T14:00'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '或许可以说(It can be argued that...)，这是因为利用了', 'origin_text': 'xx\\\\Vx的原始数据分布，通常表现为更加均匀、更趋近于单峰值。  !!!值得指出的是，这些方法往往利用!!!  所有可用的表达空间并尽量减小重构误差。因为当训练集上的不同样本', 'time': '2017-03-11T14:07'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '实验中是不同的类别', 'origin_text': '，顶端hh\\\\Vh空间的边缘分布越趋向于均匀和发散，而且不同峰值（  !!!比如说实验中的类别!!!  ）所对应区域之间的间距也会越模糊。在高层次的空间训练RBM使得', 'time': '2017-03-11T14:08'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '小', 'origin_text': '散，而且不同峰值（比如说实验中的类别）所对应区域之间的间距也会越  !!!模糊!!!  。在高层次的空间训练RBM使得Gibbs采样混合得更快。然而', 'time': '2017-03-11T14:08'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '在模间混合得更快（漏译between modes）', 'origin_text': '间的间距也会越模糊。在高层次的空间训练RBM使得Gibbs采样  !!!混合得更快!!!  。然而，如何利用这种观察到的现象来辅助训练深度生成模型或者从中', 'time': '2017-03-11T14:08'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '方法', 'origin_text': '模型或者从中采样仍然有待探索。尽管存在混合的难点，蒙特卡罗  !!!技巧!!!  仍然是一个有用的也是最好的可用工具。事实上，在遇到难以处理的无', 'time': '2017-03-11T14:09'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '也常常是最好的', 'origin_text': '有待探索。尽管存在混合的难点，蒙特卡罗技巧仍然是一个有用的  !!!也是最好的!!!  可用工具。事实上，在遇到难以处理的无向模型中的配分函数时，蒙特', 'time': '2017-03-11T14:09'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '最重要的', 'origin_text': '实上，在遇到难以处理的无向模型中的配分函数时，蒙特卡罗方法仍然是  !!!最基础的!!!  工具，这将在下一章详细阐述。             ', 'time': '2017-03-11T14:10'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '地', 'origin_text': '                   随机算法可以粗略  !!!的!!!  分为两类：Las Vegas算法和蒙特卡罗算法。Las Veg', 'time': '2017-03-11T14:13'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '或', 'origin_text': '败报告）。这类方法通常需要占用随机量的计算资源（通常指的是内存  !!!和!!!  运行时间）。与此相对的，蒙特卡罗方法返回一个伴随着随机量错误的', 'time': '2017-03-11T15:02'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '或', 'origin_text': '回一个伴随着随机量错误的答案。花费更多的计算资源（通常包括内存  !!!和!!!  运行时间）可以减少这种随机量的错误。在任意固定的计算资源下， ', 'time': '2017-03-11T15:02'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '不定大小误差', 'origin_text': '指的是内存和运行时间）。与此相对的，蒙特卡罗方法返回一个伴随着  !!!随机量错误!!!  的答案。花费更多的计算资源（通常包括内存和运行时间）可以减少这', 'time': '2017-03-11T15:04'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '大小不定的误差', 'origin_text': '答案。花费更多的计算资源（通常包括内存和运行时间）可以减少这种  !!!随机量的错误!!!  。在任意固定的计算资源下， 蒙特卡罗算法可以得到一个近似解。', 'time': '2017-03-11T15:04'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '另一种相对少见的情况是[EQUATION]', 'origin_text': ' 的时候，重要采样采到了很多无用的样本（权值之和很小或趋于零）。  !!!另一方面，当q(x(i))≪p(x(i))|f(x(i))|q(x(i))≪p(x(i))|f(x(i))|q(\\\\Vx^{(i)})\\\\ll p(\\\\Vx^{(i)}) \\\\vert f(\\\\Vx^{(i)})\\\\vert 的时候， 样本会很少被采到!!!  ，其对应的权值却会非常大。正因为后一个事件是很少发生的，这些样', 'time': '2017-03-11T16:33'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '相应的比值会非常大 【注：指p(x)f(x)/q(x)】', 'origin_text': 'f(\\\\Vx^{(i)})\\\\vert 的时候， 样本会很少被采到，  !!!其对应的权值却会非常大!!!  。正因为后一个事件是很少发生的，这些样本很难被采到，通常使得对', 'time': '2017-03-11T16:33'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '减小', 'origin_text': '本产生的代价函数。在这种情况下更加频繁地采集这些困难的样本可以  !!!降低!!!  梯度估计的方差{cite?}。马尔可夫链蒙特卡罗方法在', 'time': '2017-03-12T00:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '从业者', 'origin_text': '夫链）每条马尔可夫链只产生一个样本的策略是两种极端。深度学习的  !!!研究者!!!  们通常选取的马尔可夫链的数目和minibatch中的样本数相近，', 'time': '2017-03-12T00:48'}\n\n=============================   Replies   =============================\n\n"
  },
  {
    "path": "Chapter17/monte_carlo_methods.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Tianfan Fu\n\\chapter{\\glsentrytext{monte_carlo}方法}\n\\label{chap:monte_carlo_methods}\n% 581\n\n随机算法可以粗略地分为两类：\\ENNAME{Las Vegas}\\,算法和\\gls{monte_carlo}算法。\n\\ENNAME{Las Vegas}\\,算法总是精确地返回一个正确答案 （或者返回算法失败了）。   \n这类方法通常需要占用随机量的计算资源（一般指内存或运行时间）。    \n与此相对的，\\gls{monte_carlo}方法返回的答案具有随机大小的错误。 \n花费更多的计算资源（通常包括内存和运行时间）可以减少这种错误。\n在任意固定的计算资源下， \\gls{monte_carlo}算法可以得到一个近似解。\n\n对于\\gls{ML}中的许多问题来说，我们很难得到精确的答案。\n这类问题很难用精确的确定性算法如\\,\\ENNAME{Las Vegas}\\,算法解决。\n取而代之的是确定性的近似算法或\\gls{monte_carlo}近似方法。\n这两种方法在\\gls{ML}中都非常普遍。\n本章主要关注\\gls{monte_carlo}方法。\n% 581\n\n\\section{采样和\\glsentrytext{monte_carlo}方法}\n\\label{sec:sampling_and_monte_carlo_methods}\n\n\\gls{ML}中的许多重要工具都基于从某种分布中采样以及用这些样本对目标量做一个\\gls{monte_carlo}估计。\n\n\\subsection{为什么需要采样？}\n\\label{sec:why_sampling}\n\n有许多原因使我们希望从某个分布中采样。  \n当我们需要以较小的代价近似许多项的和或某个积分时，采样是一种很灵活的选择。  \n有时候，我们使用它加速一些很费时却易于处理的求和估计，就像我们使用\\gls{minibatch}对整个训练代价进行\\gls{subsample}一样。 \n在其他情况下，我们需要近似一个难以处理的求和或积分，例如估计一个\\gls{undirected_model}中\\gls{partition_function}对数的梯度时。 \n在许多其他情况下，抽样实际上是我们的目标，例如我们想训练一个可以从训练分布采样的模型。  \n% 582 \n\n\\subsection{\\glsentrytext{monte_carlo}采样的基础}\n\\label{sec:basics_of_monte_carlo_sampling}\n\n当无法精确计算和或积分（例如，和具有指数数量个项，且无法被精确简化）时，通常可以使用\\gls{monte_carlo}采样来近似它。\n这种想法把和或者积分视作某分布下的期望，然后\\emph{通过估计对应的平均值来近似这个期望}。\n令\n\\begin{align}\ns = \\sum_{\\Vx} p(\\Vx)f(\\Vx) = E_p[f(\\RVx)]\n\\end{align}\n或者\n\\begin{align}\n\\label{eqn:integra}\ns = \\int p(\\Vx)f(\\Vx)d\\Vx = E_p[f(\\RVx)]\n\\end{align}\n为我们所需要估计的和或者积分，写成期望的形式，$p$是一个关于随机变量$\\RVx$的概率分布（求和时）或者\\gls{PDF}（求积分时）。\n% 582 \n\n我们可以通过从$p$中抽取$n$个样本$\\Vx^{(1)},\\ldots,\\Vx^{(n)}$来近似$s$并得到一个经验平均值   \n\\begin{align}\t\n\\hat{s}_n = \\frac{1}{n}\\sum_{i=1}^{n}f(\\Vx^{(i)}).\n\\end{align}\n下面几个性质表明了这种近似的合理性。\n首先很容易观察到$\\hat{s}$这个估计是\\gls{unbiased}的，由于\n\\begin{align}\n\\SetE[\\hat{s}_n] = \\frac{1}{n}\\sum_{i=1}^{n}\\SetE[f(\\Vx^{(i)})] = \\frac{1}{n}\\sum_{i=1}^{n}s = s.\n\\end{align}\n% 582\n此外，根据\\firstgls{law_of_large_numbers}，如果样本$\\Vx^{(i)}$是\\gls{iid_chap18}的，那么其平均值几乎必然收敛到期望值，即\n\\begin{align}\n\\lim_{n\\xrightarrow{}\\infty} \\hat{s}_n = s,\n\\end{align}\n只需要满足各个单项的方差$\\text{Var}[f(\\Vx^{(i)})]$有界。 \n详细地说，我们考虑当$n$增大时$\\hat{s}_n$的方差。\n只要满足$\\text{Var}[f(\\RVx^{(i)})]<\\infty$，方差$\\text{Var}[\\hat{s}_n]$就会减小并收敛到$0$：\n\\begin{align}\n\\text{Var}[\\hat{s}_n] & = \\frac{1}{n^2}\\sum_{i=1}^{n}\\text{Var}[f(\\RVx)]\\\\\n&  = \\frac{\\text{Var}[f(\\RVx)]}{n}.\n\\end{align}\n这个简单有用的结果启迪我们如何估计\\gls{monte_carlo}均值中的不确定性，或者等价地说是\\gls{monte_carlo}估计的期望误差。 \n我们计算了$f(\\Vx^{(i)})$的经验均值和方差\\footnote{通常我们会倾向于计算方差的\\gls{unbiased}估计，它由偏差的平方和除以$n-1$而非$n$得到。}， \n然后将估计的方差除以样本数$n$来得到$\\text{Var}[\\hat{s}_n]$的估计。\n\\firstgls{central_limit_theorem}告诉我们$\\hat{s}_n$的分布收敛到以$s$为均值以$\\frac{\\text{Var}[f(\\RVx)]}{n}$为方差的\\gls{normal_distribution}。\n这使得我们可以利用\\gls{normal_distribution}的\\gls{cumulative_function}来估计$\\hat{s}_n$的置信区间。\n% 583\n\n\n以上的所有结论都依赖于我们可以从基准分布$p(\\RVx)$中轻易地采样，但是这个假设并不是一直成立的。\n当我们无法从$p$中采样时，一个备选方案是用\\secref{sec:importance_sampling_chap17}讲到的\\gls{importance_sampling}。 \n一种更加通用的方式是构建一个收敛到目标分布的估计序列。 \n这就是\\gls{mcmc}方法（见\\secref{sec:markov_chain_monte_carlo_methods}）。\n% 583\n\n\\section{\\glsentrytext{importance_sampling}}\n\\label{sec:importance_sampling_chap17}\n\n如方程~\\eqref{eqn:integra}所示，在\\gls{monte_carlo}方法中，对积分（或者和）分解，确定积分中哪一部分作为概率分布$p(\\Vx)$以及哪一部分作为被积的函数$f(\\Vx)$（我们感兴趣的是估计$f(\\Vx)$在概率分布$p(\\Vx)$下的期望）是很关键的一步。  \n$p(\\Vx)f(\\Vx)$不存在唯一的分解，因为它总是可以被写成   \n\\begin{align}\n\\label{eqn:decomposition}\np(\\Vx)f(\\Vx) = q(\\Vx) \\frac{p(\\Vx)f(\\Vx)}{q(\\Vx)},\n\\end{align}\n在这里，我们从$q$分布中采样，然后估计$\\frac{pf}{q}$在此分布下的均值。\n许多情况中，我们希望在给定$p$和$f$的情况下计算某个期望，这个问题既然是求期望，那么很自然地$p$和$f$是一种分解选择。 \n然而，如果考虑达到某给定精度所需要的样本数量，这个问题最初的分解选择不是最优的选择。\n幸运的是，最优的选择$q^*$可以被简单地推导出来。   \n这种最优的采样函数$q^*$对应所谓的最优\\gls{importance_sampling}。 \n% 584\n\n\n从\\eqnref{eqn:decomposition}所示的关系中可以发现，任意\\gls{monte_carlo}估计   \n\\begin{align}\n\\hat{s}_p = \\frac{1}{n}\\sum_{i=1,\\Vx^{(i)}\\sim p}^{n}f(\\Vx^{(i)})\n\\end{align}\n可以被转化为一个\\gls{importance_sampling}的估计\n\\begin{align}\n\\hat{s}_q = \\frac{1}{n}\\sum_{i=1,\\Vx^{(i)}\\sim q}^{n}\\frac{p(\\Vx^{(i)})f(\\Vx^{(i)})}{q(\\Vx^{(i)})}.\n\\end{align}\n我们可以容易地发现估计的期望与$q$分布无关：   \n\\begin{align}\n\\SetE_q [\\hat{s}_q] = \\SetE_p [\\hat{s}_p] = s.      \n\\end{align}\n然而，\\gls{importance_sampling}的方差可能对$q$的选择非常敏感。 \n这个方差可以表示为\n\\begin{align}\n\\label{eqn:variance_of_is}\n\\Var [\\hat{s}_q] = \\Var \\left[\\frac{p(\\RVx)f(\\RVx)}{q(\\RVx)}\\right]/n.\n\\end{align}\n方差想要取到最小值，$q$需要满足\n\\begin{align}\nq^*(\\Vx) = \\frac{p(\\Vx)\\vert f(\\Vx)\\vert}{Z},\n\\end{align}\n% 584\n在这里$Z$表示归一化常数，选择适当的$Z$使得$q^*(\\Vx)$之和或者积分为$1$。\n一个更好的\\gls{importance_sampling}分布会把更多的权重放在被积函数较大的地方。 \n事实上，当$f(\\Vx)$的正负符号不变时，$\\Var[\\hat{s}_{q^*}]=0$， 这意味着当使用最优的$q$分布时，\\emph{只需要一个样本就足够了}。\n当然，这仅仅是因为计算$q^*$时已经解决了原问题。   \n所以在实践中这种只需要采样一个样本的方法往往是无法实现的。 \n% 584\n\n\n对于\\gls{importance_sampling}来说任意$q$分布都是可行的（从得到一个期望上正确的值的角度来说），$q^*$指的是最优的$q$分布（从得到最小方差的角度上考虑）。\n从$q^*$中采样往往是不可行的，但是其他仍然能降低方差的$q$的选择还是可行的。 \n% 584  end\n\n\n另一种方法是采用\\firstgls{biased_importance_sampling}，这种方法有一个优势，即不需要归一化的$p$或$q$分布。\n在处理离散变量时，\\gls{biased_importance_sampling}估计可以表示为\n\\begin{align}\n\\label{eqn:bis}\n\\hat{s}_{\\text{BIS}} & = \\frac{\\sum_{i=1}^{n} \\frac{p(\\Vx^{(i)})}{q(\\Vx^{(i)})} f(\\Vx^{(i)})}{\\sum_{i=1}^{n}\\frac{p(\\Vx^{(i)})}{q(\\Vx^{(i)})}} \\\\\n& = \\frac{\\sum_{i=1}^{n} \\frac{p(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})} f(\\Vx^{(i)})}{\\sum_{i=1}^{n}\\frac{p(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})}} \\\\\n& = \\frac{\\sum_{i=1}^{n} \\frac{\\tilde{p}(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})} f(\\Vx^{(i)})}{\\sum_{i=1}^{n}\\frac{\\tilde{p}(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})}},\n\\end{align}\n其中$\\tilde{p}$和$\\tilde{q}$分别是分布${p}$和${q}$的未经归一化的形式，$\\Vx^{(i)}$是从分布${q}$中抽取的样本。\n这种估计是有偏的，因为$\\SetE[\\hat{s}_{\\text{BIS}}]\\neq s$，只有当$n \\to \\infty$且方程~\\eqnref{eqn:bis}的分母收敛到$1$时，等式才渐近地成立。\n所以这一估计也被称为渐近\\gls{unbiased}的。   \n% 585\n\n\n一个好的$q$分布的选择可以显著地提高\\gls{monte_carlo}估计的效率，而一个糟糕的$q$分布选择则会使效率更糟糕。\n我们回过头来看看方程~\\eqnref{eqn:variance_of_is}会发现，如果存在一个$q$使得$\\frac{p(\\Vx)f(\\Vx)}{q(\\Vx)}$很大，那么这个估计的方差也会很大。\n当$q(\\Vx)$很小，而$f(\\Vx)$和$p(\\Vx)$都较大并且无法抵消$q$时，这种情况会非常明显。\n$q$分布经常会取一些简单常用的分布使得我们能够从$q$分布中容易地采样。\n当$\\Vx$是高维数据时，$q$分布的简单性使得它很难与$p$或者$p\\vert f\\vert$相匹配。   \n当$q(\\Vx^{(i)})\\gg p(\\Vx^{(i)}) \\vert f(\\Vx^{(i)})\\vert $时，\\gls{importance_sampling}采到了很多无用的样本（很小的数或零相加）。\n另一种相对少见的情况是$q(\\Vx^{(i)})\\ll p(\\Vx^{(i)}) \\vert f(\\Vx^{(i)})\\vert $，相应的比值会非常大。\n正因为后一个事件是很少发生的，这种样本很难被采到，通常使得对$s$的估计出现了典型的\\gls{underestimation}，很难被整体的\\gls{overestimation}抵消。\n这样的不均匀情况在高维数据屡见不鲜，因为在高维度分布中联合分布的动态域可能非常大。\n% 585 end\n\n\n% 585 end\n尽管存在上述的风险，但是\\gls{importance_sampling}及其变种在\\gls{ML}的应用中仍然扮演着重要的角色，包括\\gls{DL}算法。\n例如，\\gls{importance_sampling}被应用于加速训练具有大规模词表的神经网络\\gls{language_model}的过程中（见\\secref{sec:importance_sampling_chap12}）或者其他有着大量输出结点的\\gls{NN}中。   \n此外，还可以看到\\gls{importance_sampling}应用于估计\\gls{partition_function}（一个概率分布的归一化常数），详见\\secref{sec:estimating_the_partition_function}，以及在深度有向图模型比如\\gls{VAE}中估计对数似然（详见\\secref{sec:variational_autoencoders}）。\n采用\\gls{SGD}训练模型参数时\\gls{importance_sampling}可以用来改进对\\gls{cost_function}梯度的估计，尤其是分类器这样的模型，其中\\gls{cost_function}的大部分\\gls{cost}来自于少量错误分类的样本。    \n在这种情况下，更加频繁地抽取这些困难的样本可以减小梯度估计的方差~\\citep{Hinton06}。 \n% 586 \n\n\n\\section{\\glsentrytext{mcmc}方法}\n\\label{sec:markov_chain_monte_carlo_methods}\n\n在许多实例中，我们希望采用\\gls{monte_carlo}方法，然而往往又不存在一种简单的方法可以直接从目标分布$p_{\\text{model}}(\\RVx)$中精确采样或者一个好的（方差较小的）\\gls{importance_sampling}分布$q(\\Vx)$。 \n在深度学习中，当分布$p_{\\text{model}}(\\RVx)$表示成无向模型时，这种情况往往会发生。\n在这种情况下，为了从分布$p_{\\text{model}}(\\RVx)$中近似采样，我们引入了一种称为\\firstgls{markov_chain}的数学工具。\n利用\\gls{markov_chain}来进行\\gls{monte_carlo}估计的这一类算法被称为\\firstall{mcmc}方法。\n\\citet{koller-book2009}花了大量篇幅来描述\\gls{mcmc}算法在\\gls{ML}中的应用。\n\\glssymbol{mcmc}~技术最标准、最一般的理论保证只适用于那些各状态概率均不为零的模型。\n因此，这些技术最方便的使用方法是用于从\\firstgls{energy_based_model}即$p(\\Vx)\\propto \\exp(-E(\\Vx))$中采样，见\\secref{sec:energy_based_models}。\n在~\\glssymbol{energy_based_model}~的公式表述中，每一个状态所对应的概率都不为零。\n事实上，\\glssymbol{mcmc}~方法可以被广泛地应用在包含$0$概率状态的许多概率分布中。\n然而，在这种情况下，关于~\\glssymbol{mcmc}~方法性能的理论保证只能依据具体不同类型的分布具体分析证明。\n在\\gls{DL}中，我们通常依赖于那些一般的理论保证，其在所有\\gls{energy_based_model}都能自然成立。\n\n% 586 end\n\n\n为了解释从\\gls{energy_based_model}中采样困难的原因，我们考虑一个包含两个变量的~\\glssymbol{energy_based_model}~的例子，记$p(\\RSa,\\RSb)$为其分布。  \n为了采$\\RSa$，我们必须先从$p(\\RSa\\mid \\RSb)$中采样；为了采$\\RSb$，我们又必须从$p(\\RSb\\mid \\RSa)$中采样。   \n这似乎成了棘手的先有鸡还是先有蛋的问题。\n\\gls{directed_model}避免了这一问题因为它的图是有向无环的。\n为了完成\\firstgls{ancestral_sampling}，在给定每个变量的所有父结点的条件下，我们根据拓扑顺序采样每一个变量，这个变量是确定能够被采样的（详见\\secref{sec:sampling_from_graphical_models}）。   \n\\gls{ancestral_sampling}定义了一种高效的、单遍的方法来抽取一个样本。   \n% 587 begin\n\n\n在~\\glssymbol{energy_based_model}~中，我们通过使用\\gls{markov_chain}来采样，从而避免了先有鸡还是先有蛋的问题。  \n\\gls{markov_chain}的核心思想是从某个可取任意值的状态$\\Vx$出发。\n随着时间的推移，我们随机地反复更新状态$\\Vx$。  \n最终$\\Vx$成为了一个从$p(\\Vx)$中抽出的（非常接近）比较一般的样本。  %?? 建议 比较公正 换成 标准\n在正式的定义中，\\gls{markov_chain}由一个随机状态$x$和一个转移分布$T(\\Vx'\\mid \\Vx)$定义而成，$T(\\Vx'\\mid \\Vx)$是一个概率分布，说明了给定状态$\\Vx$的情况下随机地转移到$\\Vx'$的概率。\n运行一个\\gls{markov_chain}意味着根据转移分布$T(\\RVx' \\mid \\Vx)$采出的值$\\Vx'$来更新状态$\\Vx$。  \n% 587  mid\n\n\n为了给出~\\glssymbol{mcmc}~方法为何有效的一些理论解释，重参数化这个问题是很有用的。 \n首先我们关注一些简单的情况，其中随机变量$\\RVx$有可数个状态。\n我们将这种状态简单地记作正整数$x$。\n不同的整数$x$的大小对应着原始问题中$\\Vx$的不同状态。\n% 587   mid\n\n\n接下来我们考虑如果并行地运行无穷多个\\gls{markov_chain}的情况。  \n不同\\gls{markov_chain}的所有状态都采样自某一个分布$q^{(t)}(x)$，在这里$t$表示消耗的时间数。\n开始时，对每个\\gls{markov_chain}，我们采用一个分布$q^{{0}}$来任意地初始化$x$。  \n之后，$q^{(t)}$与所有之前运行的\\gls{markov_chain}有关。\n我们的目标是$q^{(t)}(x)$收敛到$p(x)$。 \n% 587 mid \n\n\n因为我们已经用正整数$x$重参数化了这个问题，我们可以用一个向量$\\Vv$来描述这个概率分布$q$，  \n\\begin{align}\nq(\\RSx = i) = v_i.\n\\end{align}\n% 587\n\n\n然后我们考虑更新单一的\\gls{markov_chain}，从状态$x$到新状态$x'$。\n单一状态转移到$x'$的概率可以表示为\n\\begin{align}\n\\label{eqn:transition1}\nq^{(t+1)}(x') = \\sum_{x} q^{(t)}(x) T(x'\\mid x).\n\\end{align}\n% 587 end\n\n\n根据状态为整数的参数化设定，我们可以将转移算子$T$表示成一个矩阵$\\MA$。\n矩阵$\\MA$的定义如下：\n\\begin{align}\n\\MA_{i,j} = T(\\RVx' = i\\mid \\RVx = j).\n\\end{align}\n使用这一定义，我们可以改写\\eqnref{eqn:transition1}。\n不同于之前使用$q$和$T$来理解单个状态的更新，我们现在可以使用$\\Vv$和$\\MA$来描述当我们更新时（并行运行的）不同\\gls{markov_chain}上整个分布是如何变化的： \n\\begin{align}\n\\Vv^{(t)} = \\MA \\Vv^{(t-1)}.\n\\end{align}\n% 588   head\n重复地使用\\gls{markov_chain}更新相当于重复地与矩阵$\\MA$相乘。  \n换言之，我们可以认为这一过程就是关于$\\MA$的幂乘：  \n\\begin{align}\n\\Vv^{(t)} = \\MA^{t} \\Vv^{(0)}.\n\\end{align}\n% 588\n\n\n矩阵$\\MA$有一种特殊的结构，因为它的每一列都代表一个概率分布。\n这样的矩阵被称为\\firstgls{stochastic_matrix}。\n如果对于任意状态$x$到任意其他状态$x'$存在一个$t$使得转移概率不为$0$，那么Perron-Frobenius定理~\\citep{perron1907theorie,frobenius1908matrizen}可以保证这个矩阵的最大特征值是实数且大小为$1$。\n我们可以看到所有的特征值随着时间呈现指数变化： \n\\begin{align}\n\\Vv^{(t)} = (\\MV \\text{diag}(\\Vlambda)\\MV^{-1})^{t} \\Vv^{(0)} = \\MV \\text{diag}(\\Vlambda)^t \\MV^{-1} \\Vv^{(0)}.\n\\end{align}\n这个过程导致了所有不等于$1$的特征值都衰减到$0$。  \n在一些额外的较为宽松的假设下，我们可以保证矩阵$\\MA$只有一个对应特征值为$1$的特征向量。  \n所以这个过程收敛到\\firstgls{stationary_distribution}，有时也被称为\\firstgls{equilibrium_distribution}。 \n收敛时，我们得到 \n\\begin{align}\n\\label{eqn:1723}\n\\Vv ' = \\MA \\Vv = \\Vv,\n\\end{align}\n这个条件也适用于收敛之后的每一步。\n这就是特征向量方程。\n作为收敛的稳定点，$\\Vv$一定是特征值为$1$所对应的特征向量。 \n这个条件保证收敛到了\\gls{stationary_distribution}以后，再重复转移采样过程不会改变所有不同\\gls{markov_chain}上状态的\\emph{分布}（尽管转移算子自然而然地会改变每个单独的状态）。  \n% 588\n\n\n如果我们正确地选择了转移算子$T$，那么最终的\\gls{stationary_distribution}$q$将会等于我们所希望采样的分布$p$。  \n我们会将\\secref{sec:gibbs_sampling}介绍如何选择$T$。 \n% 588\n\n\n可数状态\\gls{markov_chain}的大多数性质可以被推广到连续状态的\\gls{markov_chain}中。 \n在这种情况下，一些研究者把这种\\gls{markov_chain}称为\\firstgls{harris_chain}，但是我们将这两种情况都称为\\gls{markov_chain}。\n通常在一些宽松的条件下，一个带有转移算子$T$的\\gls{markov_chain}都会收敛到一个不动点，这个不动点可以写成如下形式：\n\\begin{align}\nq' (\\RVx') = \\SetE_{\\RVx\\sim q}T(\\RVx'\\mid \\RVx),\n\\end{align}\n这个方程的离散版本就相当于重新改写方程~\\eqnref{eqn:1723}。\n当$\\RVx$是离散值时，这个期望对应着求和，而当$\\RVx$是连续值时，这个期望对应的是积分。 \n% 589 head\n\n\n无论状态是连续的还是离散的，所有的\\gls{markov_chain}方法都包括了重复、随机地更新直到最后状态开始从\\gls{equilibrium_distribution}中采样。 \n运行\\gls{markov_chain}直到它达到\\gls{equilibrium_distribution}的过程通常被称为\\gls{markov_chain}的\\firstgls{burn_in}过程。\n在\\gls{markov_chain}达到\\gls{equilibrium_distribution}之后，我们可以从\\gls{equilibrium_distribution}中抽取一个无限多数量的样本序列。 \n这些样本服从同一分布，但是两个连续的样本之间会高度相关。 \n所以一个有限的序列无法完全表达\\gls{equilibrium_distribution}。\n一种解决这个问题的方法是每隔$n$个样本返回一个样本，从而使得我们对于\\gls{equilibrium_distribution}的统计量的估计不会被\\,\\glssymbol{mcmc}\\,方法的样本之间的相关性所干扰。\n所以\\gls{markov_chain}的计算代价很高，主要源于达到\\gls{equilibrium_distribution}前需要\\gls{burn_in}的时间以及在达到\\gls{equilibrium_distribution}之后从一个样本转移到另一个足够无关的样本所需要的时间。\n如果我们想要得到完全独立的样本，那么我们可以同时并行地运行多个\\gls{markov_chain}。  \n这种方法使用了额外的并行计算来减少时延。 \n使用一条\\gls{markov_chain}来生成所有样本的策略和（使用多条\\gls{markov_chain}）每条\\gls{markov_chain}只产生一个样本的策略是两种极端。\n深度学习的从业者们通常选取的\\gls{markov_chain}的数目和\\gls{minibatch}中的样本数相近，然后从这些固定的\\gls{markov_chain}集合中抽取所需要的样本。 \n\\gls{markov_chain}的数目通常选为$100$。\n% 589\n\n另一个难点是我们无法预先知道\\gls{markov_chain}需要运行多少步才能到达\\gls{equilibrium_distribution}。 \n这段时间通常被称为\\firstgls{mixing_time}。\n检测一个\\gls{markov_chain}是否达到平衡是很困难的。\n我们并没有足够完善的理论来解决这个问题。\n理论只能保证\\gls{markov_chain}会最终收敛，但是无法保证其他。\n如果我们从矩阵$\\MA$作用在概率向量$\\Vv$上的角度来分析\\gls{markov_chain}，那么我们可以发现当$\\MA^t$除了单个$1$以外的特征值都趋于$0$时，\\gls{markov_chain}混合成功（收敛到了\\gls{equilibrium_distribution}）。\n这也意味着矩阵$\\MA$的第二大特征值决定了\\gls{markov_chain}的\\gls{mixing_time}。\n然而，在实践中，我们通常不能真的将\\gls{markov_chain}表示成矩阵的形式。 \n我们的概率模型所能够达到的状态是变量数的指数级别，所以表达$\\Vv$，$\\MA$或者$\\MA$的特征值是不现实的。 \n由于以上在内的诸多阻碍，我们通常无法知道\\gls{markov_chain}是否已经混合成功。\n作为替代，我们只能运行一定量时间\\gls{markov_chain}直到我们粗略估计这段时间是足够的，然后使用启发式的方法来判断\\gls{markov_chain}是否混合成功。\n这些启发性的算法包括了手动检查样本或者衡量前后样本之间的相关性。\n% 590 head\n\n\n\n\\section{\\glsentrytext{gibbs_sampling}}\n\\label{sec:gibbs_sampling}\n\n目前为止我们已经了解了如何通过反复更新$\\Vx \\xleftarrow{} \\Vx'\\sim T(\\Vx'\\mid\\Vx)$从一个分布$q(\\Vx)$中采样。 \n然而我们还没有介绍过如何确定$q(\\Vx)$是否是一个有效的分布。\n本书中将会描述两种基本的方法。  \n第一种方法是从已经学习到的分布$p_{\\text{model}}$中推导出$T$，下文描述了如何从\\gls{energy_based_model}中采样。\n第二种方法是直接用参数描述$T$，然后学习这些参数，其\\gls{stationary_distribution}隐式地定义了我们所感兴趣的模型$p_{\\text{model}}$。\n我们将在\\secref{sec:generative_stochastic_networks}和\\secref{sec:other_generation_schemes}中讨论第二种方法的例子。  \n% 590  mid\n\n\n在\\gls{DL}中，我们通常使用\\gls{markov_chain}从定义为\\gls{energy_based_model}的分布$p_{\\text{model}}(\\Vx)$中采样。\n在这种情况下，我们希望\\gls{markov_chain}的$q(\\Vx)$分布就是$p_{\\text{model}}(\\Vx)$。\n为了得到所期望的$q(\\Vx)$分布，我们必须选取合适的$T(\\Vx'\\mid \\Vx)$。\n% 590\n\n\n\\firstgls{gibbs_sampling}是一种概念简单而又有效的方法。\n它构造一个从$p_{\\text{model}}(\\Vx)$中采样的\\gls{markov_chain}，其中在\\gls{energy_based_model}中从$T(\\RVx'\\mid \\RVx)$采样是通过选择一个变量$\\RSx_i$，然后从$p_{\\text{model}}$中该点关于在无向图$\\CalG$（定义了\\gls{energy_based_model}结构）中邻接点的条件分布中采样。\n只要一些变量在给定相邻变量时是条件独立的，那么这些变量就可以被同时采样。\n正如在\\secref{sec:example_the_restricted_boltzmann_machine}中看到的~\\glssymbol{RBM}~示例一样，\\glssymbol{RBM}~中所有的\\gls{hidden_unit}可以被同时采样，因为在给定所有可见单元的条件下它们相互条件独立。\n同样地，所有的可见单元也可以被同时采样，因为在给定所有\\gls{hidden_unit}的情况下它们相互条件独立。 \n以这种方式同时更新许多变量的\\,\\gls{gibbs_sampling}通常被称为\\firstgls{block_gibbs_sampling}。   \n% 590 mid\n\n设计从$p_{\\text{model}}$中采样的\\gls{markov_chain}还存在其他备选方法。  \n比如说，Metropolis-Hastings算法在其他领域中广泛使用。\n不过在\\gls{DL}的\\gls{undirected_model}中，我们主要使用\\,\\gls{gibbs_sampling}，很少使用其他方法。 \n改进采样技巧也是一个潜在的研究热点。\n% 590 end\n\n\n\\section{不同的\\glsentrytext{mode}之间的\\glsentrytext{mixing}挑战}\n\\label{sec:the_challenge_of_mixing_between_separated_modes}\n% 591  head \n\n使用\\,\\glssymbol{mcmc}\\,方法的主要难点在于\\gls{markov_chain}的\\firstgls{mixing}通常不理想。\n在理想情况下，从设计好的\\gls{markov_chain}中采出的连续样本之间是完全独立的，而且在$\\Vx$空间中，\\gls{markov_chain}会按概率大小访问许多不同区域。\n\n然而，\\,\\glssymbol{mcmc}\\,方法采出的样本可能会具有很强的相关性，尤其是在高维的情况下。\n我们把这种现象称为慢\\gls{mixing}甚至\\gls{mixing}失败。\n具有缓慢\\gls{mixing}的\\,\\glssymbol{mcmc}\\,方法可以被视为对\\gls{energy_function}无意地执行类似于带噪声的\\gls{GD}的操作，或者说等价于相对于链的状态（被采样的随机变量）依据概率进行噪声爬坡。\n（在\\gls{markov_chain}的状态空间中）从$\\Vx^{(t-1)}$到$\\Vx^{(t)}$该链倾向于选取很小的步长，其中能量$E(\\Vx^{(t)})$通常低于或者近似等于能量$E(\\Vx^{(t-1)})$，\n倾向于向较低能量的区域移动。\n当从可能性较小的状态（比来自$p(\\Vx)$的典型样本拥有更高的能量）开始时，链趋向于逐渐减少状态的能量，并且仅仅偶尔移动到另一个\\gls{mode}。 \n一旦该链已经找到低能量的区域（例如，如果变量是图像中的像素，则低能量的区域可以是同一对象所对应图像的一个连通的\\gls{manifold}），我们称之为\\gls{mode}，链将倾向于围绕着这个\\gls{mode}游走（按某一种形式随机游走）。\n它时不时会走出该\\gls{mode}，但是结果通常会返回该\\gls{mode}或者（如果找到一条离开的路线）移向另一个\\gls{mode}。\n问题是对于很多有趣的分布来说成功的离开路线很少，所以\\gls{markov_chain}将在一个\\gls{mode}附近抽取远超过需求的样本。\n% 591 \n\n\n当我们考虑~\\gls{gibbs_sampling}算法（见\\secref{sec:gibbs_sampling}）时，这种现象格外明显。\n在这种情况下，我们考虑在一定步数内从一个\\gls{mode}移动到一个临近\\gls{mode}的概率。\n决定这个概率的是两个\\gls{mode}之间的``能量障碍''的形状。\n隔着一个巨大``能量障碍'' （低概率的区域）的两个\\gls{mode}之间的转移概率是（随着能量障碍的高度）指数下降的，如\\figref{fig:chap17_good_bad_really_bad_mixing_color}所示。\n当目标分布有多个高概率\\gls{mode}并且被低概率区域所分割，尤其当\\,\\gls{gibbs_sampling}的每一步都只是更新变量的一小部分而这一小部分变量又严重依赖其他的变量时，就会产生问题。 \n% 591\n\n\n% 592 head \n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter17/figures/good_bad_really_bad_mixing_color}}\n\\fi\n\\caption{对于三种分布使用~\\gls{gibbs_sampling}所产生的路径，所有的分布\\gls{markov_chain}初始值都设为\\gls{mode}。\n\\emph{(左)}一个带有两个独立变量的\\gls{multivariate_normal_distribution}。\n由于变量之间是相互独立的，\\gls{gibbs_sampling}\\gls{mixing}得很好。\n\\emph{(中)}变量之间存在高度相关性的一个\\gls{multivariate_normal_distribution}。\n变量之间的相关性使得\\gls{markov_chain}很难\\gls{mixing}。\n因为每一个变量的更新需要相对其他变量求条件分布，相关性减慢了\\gls{markov_chain}远离初始点的速度。\n\\emph{(右)}\\,\\gls{mode}之间间距很大且不在轴上对齐的混合高斯分布。\n\\gls{gibbs_sampling}\\gls{mixing}得很慢，因为每次更新仅仅一个变量很难跨越不同的\\gls{mode}。}\n\\label{fig:chap17_good_bad_really_bad_mixing_color}\n\\end{figure}\n\n\n%  592\n举一个简单的例子，考虑两个变量$\\RSa$，$\\RSb$的\\gls{energy_based_model}，这两个变量都是二值的，取值$+1$或者$-1$。   %??  \n如果对某个较大的正数$w$，$E(\\RSa,\\RSb) = - w \\RSa \\RSb$，那么这个模型传达了一个强烈的信息，$\\RSa$和$\\RSb$有相同的符号。\n当$\\RSa=1$时用~\\gls{gibbs_sampling}更新$\\RSb$。\n给定$\\RSb$时的条件分布满足$p(\\RSb=1\\mid \\RSa=1) = \\sigma(w)$。\n如果$w$的值很大，\\gls{sigmoid}~函数趋近于饱和，那么$b$也取到$1$的概率趋近于$1$。\n同理，如果$\\RSa=-1$，那么$\\RSb$取到$-1$的概率也趋于$1$。 \n根据模型$p_{\\text{model}}(\\RSa,\\RSb)$，两个变量取一样的符号的概率几乎相等。\n根据$p_{\\text{model}}(\\RSa\\mid \\RSb)$，两个变量应该有相同的符号。\n这也意味着~\\gls{gibbs_sampling}很难会改变这些变量的符号。\n% 592\n\n在更实际的问题中，这种挑战更加艰巨因为在实际问题中我们不能仅仅关注在两个\\gls{mode}之间的转移，更要关注在多个\\gls{mode}之间的转移。 \n如果由于\\gls{mode}之间\\gls{mixing}困难，而导致某几个这样的转移难以完成，那么得到一些可靠的覆盖大部分\\gls{mode}的样本集合的计算代价是很高的，同时\\gls{markov_chain}收敛到它的\\gls{stationary_distribution}的过程也会非常缓慢。\n% 592\n\n通过寻找一些高度依赖变量的组以及分块同时更新块（组）中的变量，这个问题有时候是可以被解决的。\n然而不幸的是，当依赖关系很复杂时，从这些组中采样的过程从计算角度上说是难以处理的。\n归根结底，\\gls{markov_chain}最初就是被提出来解决这个问题，即从大量变量中采样的问题。\n% 592\n\n\n% 593 head\n在定义了一个联合分布$p_{\\text{model}}(\\Vx,\\Vh)$的\\gls{latent_variable}模型中，我们经常通过交替地从$p_{\\text{model}}(\\Vx\\mid \\Vh)$和$p_{\\text{model}}(\\Vh\\mid \\Vx)$中采样来达到抽$\\Vx$的目的。  \n从快速\\gls{mixing}的角度上说，我们更希望$p_{\\text{model}}(\\Vh\\mid \\Vx)$有很大的熵。\n然而，从学习一个$\\Vh$的有用表示的角度上考虑，我们还是希望$\\Vh$能够包含$\\Vx$的足够信息从而能够较完整地重构它，这意味$\\Vh$和$\\Vx$要有非常高的互信息。\n这两个目标是相互矛盾的。\n我们经常学习到能够将$\\Vx$精确地编码为$\\Vh$的\\gls{generative_model}，但是无法很好\\gls{mixing}。\n这种情况在\\gls{BM}中经常出现，一个\\gls{BM}学到的分布越尖锐，该分布的\\gls{markov_chain}采样越难\\gls{mixing}得好。\n这个问题在\\figref{fig:chap17_fig-dbm-bad-mixing}中有所描述。\n% 593\n\n\n% 593 end\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n    \\centering\n    \\begin{tabular}{cc}\n    \\includegraphics[width=0.45\\figwidth]{Chapter17/figures/fig-dbm-bad-mixing}\n    \\includegraphics[width=0.45\\figwidth]{Chapter17/figures/fig-adversarial}    \n    \\end{tabular}\n\\fi\n\\caption{深度概率模型中一个\\gls{mixing}缓慢问题的例证。\n每张图都是按照从左到右从上到下的顺序的。\n\\emph{(左)}~\\gls{gibbs_sampling}从MNIST数据集训练成的\\gls{DBM}中采出的连续样本。\n这些连续的样本之间非常相似。\n由于\\,\\gls{gibbs_sampling}作用于一个深度图模型，相似度更多地是基于语义而非原始视觉特征。\n但是对于吉布斯链来说从分布的一个\\gls{mode}转移到另一个仍然是很困难的，比如说改变数字。\n\\emph{(右)}从\\gls{generative_adversarial_networks}中抽出的连续原始样本。\n因为\\gls{ancestral_sampling}生成的样本之间互相独立，所以不存在\\gls{mixing}问题。}\n\\label{fig:chap17_fig-dbm-bad-mixing}\n\\end{figure}\n% 593 end\n\n\n% 593 mid\n当感兴趣的分布对于每个类具有单独的\\gls{manifold}结构时，所有这些问题都使\\,\\glssymbol{mcmc}\\,方法变得不那么有用：分布集中在许多\\gls{mode}周围，并且这些\\gls{mode}由大量高能量区域分割。\n我们在许多分类问题中遇到的是这种类型的分布，由于\\gls{mode}之间\\gls{mixing}缓慢，它将使得MCMC方法非常缓慢地收敛。\n% 593\n\n\n\n\\subsection{不同\\gls{mode}之间通过\\glsentrytext{tempering}来\\glsentrytext{mixing}}\n\\label{sec:tempering_to_mix_between_modes}\n% 594\n\n当一个分布有一些陡峭的峰并且被低概率区域包围时，很难在分布的不同\\gls{mode}之间\\gls{mixing}。   %?? 峰值\n一些加速\\gls{mixing}的方法是基于构造一个概率分布替代目标分布，这个概率分布的\\gls{mode}没有那么高，\\gls{mode}周围的低谷也没有那么低。\n\\gls{energy_based_model}为这个想法提供一种简单的做法。\n目前为止，我们一直将\\gls{energy_based_model}描述为定义一个概率分布：   \n\\begin{align}\n\\label{eqn:1725}\np(\\Vx) \\propto \\exp(-E(\\Vx)).\n\\end{align}\n\\gls{energy_based_model}可以通过添加一个额外的控制\\gls{mode}尖锐程度的参数$\\beta$来加强：\n\\begin{align}\n\\label{eqn:1726}\np_{\\beta}(\\Vx) \\propto \\exp(-\\beta E(\\Vx)).\n\\end{align}\n$\\beta$参数可以被理解为\\firstgls{temperature}的倒数，反映了\\gls{energy_based_model}的统计物理学起源。\n当\\gls{temperature}趋近于0时，$\\beta$趋近于无穷大，此时的\\gls{energy_based_model}是确定性的。\n当\\gls{temperature}趋近于无穷大时，$\\beta$趋近于零，\\gls{energy_based_model}（对离散的$\\Vx$）成了均匀分布。\n% 594\n\n通常情况下，在$\\beta = 1$时训练一个模型。\n但我们也可以利用其他\\gls{temperature}，尤其是$\\beta < 1$的情况。\n\\firstgls{tempering}作为一种通用的策略，它通过从$\\beta<1$模型中采样来实现在$p_1$的不同\\gls{mode}之间快速\\gls{mixing}。\n% 594\n\n基于\\firstgls{tempering_transition}~\\citep{Neal94b}的\\gls{markov_chain}临时从高\\gls{temperature}的分布中采样使其在不同\\gls{mode}之间\\gls{mixing}，然后继续从单位\\gls{temperature}的分布中采样。\n这些技巧被应用在一些模型比如\\,\\glssymbol{RBM}中~\\citep{Salakhutdinov-2010}。\n另一种方法是利用\\firstgls{parallel_tempering}~\\citep{Iba-2001}。\n其中\\gls{markov_chain}并行地模拟许多不同\\gls{temperature}的不同状态。\n最高\\gls{temperature}的状态\\gls{mixing}较慢，相比之下最低\\gls{temperature}的状态，即\\gls{temperature}为$1$时，采出了精确的样本。\n转移算子包括了两个\\gls{temperature}之间的随机跳转，所以一个高\\gls{temperature}状态分布槽中的样本有足够大的概率跳转到低\\gls{temperature}分布的槽中。\n这个方法也被应用到了\\,\\glssymbol{RBM}中~\\citep{desjardins2010tempered,Cho10IJCNN}。\n尽管\\gls{tempering}这种方法前景可期，现今它仍然无法让我们在采样复杂的\\gls{energy_based_model}中更进一步。\n一个可能的原因是在\\firstgls{critical_temperatures}时\\gls{temperature}转移算子必须设置得非常慢（因为\\gls{temperature}需要逐渐下降）来确保\\gls{tempering}的有效性。\n% 594\n\n\n% 595\n\\subsection{深度也许会有助于\\glsentrytext{mixing}}\n\\label{sec:depth_may_help_mixing}\n\n当我们从\\gls{latent_variable}模型$p(\\Vh,\\Vx)$中采样时，我们可以发现如果$p(\\Vh\\mid \\Vx)$将$\\Vx$编码得非常好，那么从$p(\\Vx \\mid \\Vh)$中采样时，并不会太大地改变$\\Vx$，那么\\gls{mixing}结果会很糟糕。\n解决这个问题的一种方法是使得$\\Vh$成为一种将$\\Vx$编码为$\\Vh$的深度表示，从而使得\\gls{markov_chain}在$\\Vh$空间中更容易\\gls{mixing}。\n在许多\\gls{representation_learning}算法如\\gls{AE}和\\,\\glssymbol{RBM}\\,中，$\\Vh$的边缘分布相比于$\\Vx$上的原始数据分布，通常表现为更加均匀、更趋近于\\gls{unimodal}。\n或许可以说，这是因为利用了所有可用的表示空间并尽量减小\\gls{reconstruction_error}。\n因为当训练集上的不同样本之间在$\\Vh$空间能够被非常容易地区分时，我们也会很容易地最小化\\gls{reconstruction_error}。\n\\citet{Bengio-et-al-ICML2013-small}观察到这样的现象，堆叠越深的\\gls{regularize}\\gls{AE}或者\\,\\glssymbol{RBM}，顶端$\\Vh$空间的边缘分布越趋向于均匀和发散，而且不同\\gls{mode}（比如说实验中的类别）所对应区域之间的间距也会越小。\n在高层空间中训练\\,\\glssymbol{RBM}\\,会使得~\\gls{gibbs_sampling}在\\gls{mode}间\\gls{mixing}得更快。\n然而，如何利用这种观察到的现象来辅助训练深度\\gls{generative_model}或者从中采样仍然有待探索。\n% 595\n\n尽管存在\\gls{mixing}的难点，\\gls{monte_carlo}技术仍然是一个有用的工具，通常也是最好的可用工具。  \n事实上，在遇到难以处理的\\gls{undirected_model}中的\\gls{partition_function}时，\\gls{monte_carlo}方法仍然是最主要的工具，这将在下一章详细阐述。\n% 595\n"
  },
  {
    "path": "Chapter18/README.md",
    "content": "#第十八章笔记\n"
  },
  {
    "path": "Chapter18/confronting_the_partition_function.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Yujun Li \n\\chapter{直面\\glsentrytext{partition_function}}\n\\label{chap:confronting_the_partition_function}\n% 597\n在\\secref{sec:undirected_models}中，我们看到许多概率模型（通常是\\gls{undirected_graphical_model}）由一个未归一化的\\gls{PD} $\\tilde{p}(\\RVx, \\theta)$定义。\n我们必须通过除以\\gls{partition_function} $Z(\\Vtheta)$来归一化$\\tilde{p}$，以获得一个有效的\\gls{PD}：\n\\begin{equation}\n\tp(\\RVx; \\Vtheta) = \\frac{1}{Z(\\Vtheta)} \\tilde{p}(\\RVx; \\Vtheta).\n\\end{equation}\n\\gls{partition_function}是未归一化概率所有状态的积分（对于连续变量）或求和（对于离散变量）：\n\\begin{equation}\n\t\\int \\tilde{p}(\\Vx) d \\Vx\n\\end{equation}\n或者\n\\begin{equation}\n\t\\sum_{\\Vx} \\tilde{p} (\\Vx).\n\\end{equation}\n\n\n对于很多有趣的模型而言，以上积分或求和难以计算。\n\n\n正如我们将在\\chapref{chap:deep_generative_models}看到的，有些\\gls{DL}模型被设计成具有一个易于处理的归一化常数，或被设计成能够在不涉及计算$p(\\RVx)$的情况下使用。\n然而，其他一些模型会直接面对难以计算的\\gls{partition_function}的挑战。\n在本章中，我们会介绍用于训练和评估那些具有难以处理的\\gls{partition_function}的模型的技术。\n% -- 597 end\n\n\n\\section{对数似然梯度}\n\\label{sec:the_log_likelihood_gradient}\n通过\\gls{maximum_likelihood}学习\\gls{undirected_model}特别困难的原因在于\\gls{partition_function}依赖于参数。\n对数似然相对于参数的梯度具有一项对应于\\gls{partition_function}的梯度：\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\log p(\\RVx; \\Vtheta) = \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx; \\Vtheta) -\n\\nabla_{\\Vtheta} \\log Z(\\Vtheta).\n\\end{equation}\n% 598 head\n\n这是机器学习中非常著名的\\firstgls{positive_phase}和\\firstgls{negative_phase}的分解。\n\n\n对于大多数感兴趣的\\gls{undirected_model}而言，\\gls{negative_phase}是困难的。\n没有\\gls{latent_variable}或\\gls{latent_variable}之间很少相互作用的模型通常会有一个易于计算的\\gls{positive_phase}。\n\\glssymbol{RBM}\\,的\\gls{hidden_unit}在给定可见单元的情况下彼此条件独立，是一个典型的具有简单\\gls{positive_phase}和困难\\gls{negative_phase}的模型。\n\\gls{positive_phase}计算困难，\\gls{latent_variable}之间具有复杂相互作用的情况将主要在\\chapref{chap:approximate_inference}中讨论。本章主要探讨\\gls{negative_phase}计算中的难点。\n\n\n让我们进一步分析$\\log Z$的梯度：\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\log Z\n\\end{equation}\n\\begin{equation}\n\t= \\frac{ \\nabla_{\\Vtheta} Z }{Z}\n\\end{equation}\n\\begin{equation}\n\t= \\frac{ \\nabla_{\\Vtheta} \\sum_{\\RVx} \\tilde{p}(\\RVx) }{Z}\n\\end{equation}\n\\begin{equation}\n\t= \\frac{ \\sum_{\\RVx} \\nabla_{\\Vtheta} \\tilde{p}(\\RVx) }{Z}.\n\\end{equation}\n\n\n对于保证所有的$\\RVx$都有$p(\\RVx) > 0$的模型，我们可以用$\\exp(\\log \\tilde{p}(\\RVx))$代替$\\tilde{p}(\\RVx)$：\n\\begin{equation}\n\t\\frac{ \\sum_{\\RVx} \\nabla_{\\Vtheta} \\exp (\\log \\tilde{p} (\\RVx)) }{ Z }\n\\end{equation}\n\\begin{equation}\n\t= \\frac{  \\sum_{\\RVx}  \\exp (\\log \\tilde{p} (\\RVx)) \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx)  }{Z}\n\\end{equation}\n\\begin{equation}\n\t=\\frac{  \\sum_{\\RVx} \\tilde{p} (\\RVx)  \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx)  }{ Z}\n\\end{equation}\n\\begin{equation}\n\t=\\sum_{\\RVx} p(\\RVx) \\nabla_{\\Vtheta} \\log \\tilde{p} ( \\RVx )\n \\end{equation}\n\\begin{equation}\n\t=\\SetE_{\\RVx \\sim p(\\RVx)} \\nabla_{\\Vtheta} \\log \\tilde{p} (\\RVx).\n\\end{equation}\n% -- 598 end\n\n\n上述推导对离散的$\\Vx$进行求和，对连续的$\\Vx$进行积分也可以得到类似结果。\n在连续版本的推导中，使用在积分符号内取微分的\\gls{leibniz_rule}可以得到等式\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\int \\tilde{p} (\\RVx) d \\Vx  = \\int \\nabla_{\\Vtheta} \n\\tilde{p} (\\RVx) d \\Vx.\n\\end{equation}\n该等式只适用于$\\tilde{p}$和$\\nabla_{\\Vtheta} \\tilde{p} (\\RVx)$上的一些特定规范条件。\n在测度论术语中，这些条件是：\n(1) 对每一个$\\Vtheta$而言，未归一化分布$\\tilde{p}$必须是$\\Vx$的\\gls{lebesgue_integrable}函数。\n(2) 对于所有的$\\Vtheta$和几乎所有$\\Vx$，梯度$\\nabla_{\\Vtheta} \\tilde{p}(\\RVx)$必须存在。\n(3) 对于所有的$\\Vtheta$和几乎所有的$\\Vx$，必须存在一个可积函数$R(\\Vx)$使得$\\max_i | \\frac{\\partial}{\\partial \\theta_i } \\tilde{p} (\\RVx) | \\leq R(\\Vx)$。\n幸运的是，大多数感兴趣的\\gls{ML}模型都具有这些性质。\n% 599 mid\n\n等式\n\\begin{equation}\n\\label{eq:18.15}\n\t\\nabla_{\\Vtheta} \\log Z = \\SetE_{\\RVx \\sim p(\\RVx)} \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx)\n\\end{equation}\n是使用各种\\gls{monte_carlo}方法近似最大化（具有难计算\\gls{partition_function}模型的）似然的基础。\n% 599 mid\n\n\\gls{monte_carlo}方法为学习\\gls{undirected_model}提供了直观的框架，我们能够在其中考虑\\gls{positive_phase}和\\gls{negative_phase}。\n在\\gls{positive_phase}中，我们增大从数据中采样得到的$\\log \\tilde{p}(\\RVx)$。\n在\\gls{negative_phase}中，我们通过降低从模型分布中采样的$\\log \\tilde{p}(\\RVx)$来降低\\gls{partition_function}。\n% 599 mid\n\n在\\gls{DL}文献中，经常会看到用\\gls{energy_function}（\\eqnref{eqn:167}）来参数化$\\log \\tilde{p}$。\n在这种情况下，\\gls{positive_phase}可以解释为压低训练样本的能量，\\gls{negative_phase}可以解释为提高模型抽出的样本的能量，如\\figref{fig:chap18_pos_and_neg_phase}所示。\n% 599 mid\n\n\\section{随机\\glsentrytext{maximum_likelihood}和\\glsentrytext{contrastive_divergence}}\n\\label{sec:stochastic_maximum_likelihood_and_contrastive_divergence}\n% 599 end\n实现\\eqnref{eq:18.15}的一个朴素方法是，每次需要计算梯度时，\\gls{burn_in}随机初始化的一组\\gls{markov_chain}。\n当使用\\gls{SGD}进行学习时，这意味着\\gls{markov_chain}必须在每次梯度步骤中\\gls{burn_in}。\n这种方法引导下的训练过程如\\algref{alg:naive_cd}所示。\n内循环中\\gls{burn_in}\\gls{markov_chain}的计算代价过高，导致这个过程在实际中是不可行的，\n但是这个过程是其他更加实际的近似算法的基础。\n%不过该过程启发了其他计算代价较低的近似算法。\n\n% -- 599 --\n\\begin{algorithm}[ht]\n\\caption{一种朴素的\\,\\glssymbol{mcmc}\\,算法，使用梯度上升最大化具有难以计算\\gls{partition_function}的对数似然。}\n\\label{alg:naive_cd}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数。\n\\STATE 设\\gls{gibbs_steps} $k$ 大到足以允许\\gls{burn_in}。在小图像集上训练一个~\\glssymbol{RBM}~大致设为100。\n\\WHILE{不收敛}\n\\STATE 从训练集中采包含 $m$ 个样本$\\{ \\RVx^{(1)}, \\dots, \\RVx^{(m)}\\}$的\\gls{minibatch}。\n\\STATE $\\RVg \\leftarrow \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx^{(i)}; \\Vtheta)$.\n\\STATE 初始化$m$ 个样本 $\\{ \\tilde{\\RVx}^{(1)}, \\dots, \\tilde{\\RVx}^{(m)} \\}$ 为随机值（例如，从均匀或正态分布中采，或大致与模型边缘分布匹配的分布）。\n\\FOR{$i=1$ to $k$}\n    \\FOR{$j=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(j)} \\leftarrow \\text{gibbs\\_update}(\\tilde{\\RVx}^{(j)}).$\n    \\ENDFOR\n\\ENDFOR\n\\STATE $\\RVg \\leftarrow \\RVg - \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}( \\tilde{\\RVx}^{(i)} ; \\Vtheta ).$\n\\STATE $\\Vtheta \\leftarrow \\Vtheta + \\epsilon \\RVg.$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n我们可以将最大化似然的\\,\\glssymbol{mcmc}\\,方法视为在两种力之间平衡，一种力拉高数据出现时的模型分布，一种拉低模型采样出现时的模型分布。%??   从而最大化似然     还是  将最大似然提前？\n\\figref{fig:chap18_pos_and_neg_phase}展示了这个过程。\n这两种力分别对应最大化$\\log \\tilde{p}$和最小化$\\log Z$。\n对于\\gls{negative_phase}会有一些近似方法。\n这些近似都可以被理解为使\\gls{negative_phase}更容易计算，但是也可能将其推向错误的位置。%??  push down  翻成 拉低/压低  ？推向 不对吧？  push 翻成 推 可以啊\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter18/figures/pos_and_neg_phase_color}}\n\\fi\n\\caption{\\algref{alg:naive_cd}角度的``\\gls{positive_phase}''和``\\gls{negative_phase}''。\n\\emph{(左)}在\\gls{positive_phase}中，我们从数据分布中采样，然后推高它们未归一化的概率。这意味着概率越高的数据点未归一化的概率被推高得越多。\n\\emph{(右)}在\\gls{negative_phase}中，我们从模型分布中采样，然后压低它们未归一化的概率。\n这与\\gls{positive_phase}的倾向相反，给未归一化的概率处处添加了一个大常数。\n当数据分布和模型分布相等时，\\gls{positive_phase}推高数据点和\\gls{negative_phase}压低数据点的机会相等。\n此时，不再有任何的梯度（期望上说），训练也必须停止。}\n\\label{fig:chap18_pos_and_neg_phase}\n\\end{figure}\n\n\n% -- 600 end\n因为\\gls{negative_phase}涉及到从模型分布中抽样，所以我们可以认为它在找模型信任度很高的点。\n因为\\gls{negative_phase}减少了这些点的概率，它们一般被认为代表了模型不正确的信念。\n在文献中，它们经常被称为``幻觉''或``幻想粒子''。\n事实上，\\gls{negative_phase}已经被作为人类和其他动物做梦的一种可能解释~\\citep{CrickMitchison83}。\n这个想法是说，大脑维持着世界的概率模型，并且在醒着经历真实事件时会遵循$\\log \\tilde{p}$的梯度，在睡觉时会遵循$\\log \\tilde{p}$的负梯度最小化$\\log Z$，其经历的样本采样自当前的模型。\n这个视角解释了具有\\gls{positive_phase}和\\gls{negative_phase}的大多数算法，但是它还没有被神经科学实验证明是正确的。\n在\\gls{ML}模型中，通常有必要同时使用\\gls{positive_phase}和\\gls{negative_phase}，而不是按不同时间阶段分为清醒和REM睡眠时期。\n正如我们将在\\secref{sec:learned_approximate_inference}中看到的，一些其他\\gls{ML}算法出于其他原因从模型分布中采样，这些算法也能提供睡觉做梦的解释。\n% 601 mid\n\n这样理解学习\\gls{positive_phase}和\\gls{negative_phase}的作用之后，我们设计了一个比\\algref{alg:naive_cd}计算代价更低的替代算法。\n简单的\\,\\glssymbol{mcmc}\\,算法的计算成本主要来自每一步的随机初始化\\gls{burn_in}\\gls{markov_chain}。\n一个自然的解决方法是初始化\\gls{markov_chain}为一个非常接近模型分布的分布，从而大大减少\\gls{burn_in}步骤。\n\n% -- 601 --\n\\begin{algorithm}[ht]\n\\caption{\\gls{contrastive_divergence}算法，使用梯度上升作为优化过程。}\n\\label{alg:cd}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数。\n\\STATE 设\\gls{gibbs_steps} $k$ 大到足以让从 $p_\\text{data}$初始化并从 $p(\\RVx; \\Vtheta)$采样的\\gls{markov_chain}\\gls{mixing} 。在小图像集上训练一个~\\glssymbol{RBM}~大致设为1-20。\n\\WHILE{不收敛}\n\\STATE 从训练集中采包含 $m$ 个样本 $\\{ \\RVx^{(1)}, \\dots, \\RVx^{(m)}\\}$ 的\\gls{minibatch}。\n\\STATE $\\RVg \\leftarrow \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx^{(i)}; \\Vtheta).$\n    \\FOR{$i=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(i)} \\leftarrow \\RVx^{(i)}.$\n    \\ENDFOR\n\\FOR{$i=1$ to $k$}\n    \\FOR{$j=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(j)} \\leftarrow \\text{gibbs\\_update}(\\tilde{\\RVx}^{(j)}).$\n    \\ENDFOR\n\\ENDFOR\n\\STATE $\\RVg \\leftarrow \\RVg - \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}( \\tilde{\\RVx}^{(i)} ; \\Vtheta ) .$\n\\STATE $\\Vtheta \\leftarrow \\Vtheta + \\epsilon \\RVg.$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n% 601 end\n\\textbf{\\gls{contrastive_divergence}}（\\glssymbol{contrastive_divergence}，或者是具有$k$个Gibbs步骤的~\\glssymbol{contrastive_divergence}-$k$）算法在每个步骤中初始化\\gls{markov_chain}为采样自数据分布中的样本~\\citep{Hinton-PoE-2000,Hinton-RBMguide-small}，如\\algref{alg:cd}所示。\n从数据分布中获取样本是计算代价最小的，因为它们已经在数据集中了。\n初始时，数据分布并不接近模型分布，因此\\gls{negative_phase}不是非常准确。\n幸运的是，\\gls{positive_phase}仍然可以准确地增加数据的模型概率。\n进行\\gls{positive_phase}阶段一段时间之后，模型分布会更接近于数据分布，并且\\gls{negative_phase}开始变得准确。\n% 602 mid\n\n当然，\\glssymbol{contrastive_divergence}\\,仍然是真实\\gls{negative_phase}的一个近似。\n\\glssymbol{contrastive_divergence}\\,未能定性地实现真实\\gls{negative_phase}的主要原因是，它不能抑制远离真实训练样本的高概率区域。\n这些区域在模型上具有高概率，但是在数据生成区域上具有低概率，被称为\\firstgls{spurious_modes}。\n\\figref{fig:chap18_spurious_mode}解释了这种现象发生的原因。\n基本上，除非$k$非常大，模型分布中远离数据分布的\\gls{mode}不会被使用训练数据初始化的\\gls{markov_chain}访问到。\n% -- 602 end\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter18/figures/spurious_mode_color}}\n\\fi\n\\caption{一个\\gls{spurious_modes}。\n说明\\gls{contrastive_divergence}（\\algref{alg:cd}）的\\gls{negative_phase}为何无法抑制\\gls{spurious_modes}的例子。\n一个\\gls{spurious_modes}指的是一个在模型分布中出现数据分布中却不存在的模式。\n由于\\gls{contrastive_divergence}从数据点中初始化它的\\gls{markov_chain}然后仅仅运行了几步\\gls{markov_chain}，不太可能到达模型中离数据点较远的模式。\n这意味着从模型中采样时，我们有时候会得到一些与数据并不相似的样本。\n这也意味着由于在这些模式上浪费了一些概率质量，模型很难把较高的概率质量集中于正确的模式上。\n出于可视化的目的，这个图使用了某种程度上说更加简单的距离的概念——在$\\SetR$的数轴上\\gls{spurious_modes}与正确的模式有很大的距离。\n这对应着基于局部移动$\\SetR$上的单个变量$x$的\\gls{markov_chain}。\n对于大部分深度概率模型来说，\\gls{markov_chain}是基于\\,\\gls{gibbs_sampling}的，并且对于单个变量产生非局部的移动但是无法同时移动所有的变量。\n对于这些问题来说，考虑编辑距离比欧式距离通常更好。\n然而，高维空间的编辑距离很难在二维空间作图展示。}\n\\label{fig:chap18_spurious_mode}\n\\end{figure}\n\n\n\\cite{Perpinan+Hinton-2005-small}实验上证明\\,\\glssymbol{contrastive_divergence}\\,\\gls{estimator}偏向于~\\glssymbol{RBM}~和完全可见的\\gls{BM}，因为它会收敛到与\\gls{MLE}不同的点。\n他们认为，由于偏差较小，\\glssymbol{contrastive_divergence}\\,可以作为一种计算代价低的方式来初始化模型，之后可以通过计算代价高的\\,\\glssymbol{mcmc}\\,方法进行\\gls{fine_tune}。\n\\cite{Bengio+Delalleau-2009}表明，\\glssymbol{contrastive_divergence}\\,可以被理解为去掉了正确\\,\\glssymbol{mcmc}\\,梯度更新中的最小项，这解释了偏差的由来。\n\n\n在训练诸如\\,\\glssymbol{RBM}\\,的浅层网络时\\,\\glssymbol{contrastive_divergence}\\,是很有用的。\n反过来，这些可以堆叠起来初始化更深的模型，如\\,\\glssymbol{DBN}\\,或\\,\\glssymbol{DBM}。\n但是\\,\\glssymbol{contrastive_divergence}\\,并不直接有助于训练更深的模型。\n这是因为在给定可见单元样本的情况下，很难获得\\gls{hidden_unit}的样本。\n由于\\gls{hidden_unit}不包括在数据中，所以使用训练点初始化无法解决这个问题。\n即使我们使用数据初始化可见单元，我们仍然需要\\gls{burn_in}在给定这些可见单元的\\gls{hidden_unit}条件分布上采样的\\gls{markov_chain}。\n\n% -- 603 end\n\n\\glssymbol{contrastive_divergence}\\,算法可以被理解为惩罚某类模型，这类模型的\\gls{markov_chain}会快速改变来自数据的输入。 %??   这句话总是读不通\n这意味着使用\\,\\glssymbol{contrastive_divergence}\\,训练从某种程度上说类似于训练\\gls{AE}。\n即使\\,\\glssymbol{contrastive_divergence}\\,估计比一些其他训练方法具有更大偏差，但是它有助于\\gls{pretraining}之后会堆叠起来的浅层模型。\n这是因为堆栈中最早的模型会受激励复制更多的信息到其\\gls{latent_variable}，使其可用于随后的模型。\n这应该更多地被认为是\\,\\glssymbol{contrastive_divergence}\\,训练中经常可利用的副产品，而不是主要的设计优势。\n\n\n\\cite{sutskever2010convergence-small}表明，\\glssymbol{contrastive_divergence}\\,的更新方向不是任何函数的梯度。\n这使得\\,\\glssymbol{contrastive_divergence}\\,可能存在永久循环的情况，但在实践中这并不是一个严重的问题。\n\n\n另一个解决\\,\\glssymbol{contrastive_divergence}\\,中许多问题的不同策略是，在每个梯度步骤中初始化\\gls{markov_chain}为先前梯度步骤的状态值。\n这个方法首先被应用数学和统计学社群发现，命名为\\textbf{\\gls{SML}}（\\glssymbol{SML}）\\citep{Younes98onthe}，后来又在\\gls{DL}社群中以名称\\textbf{\\gls{persistent_contrastive_divergence}}（\\glssymbol{persistent_contrastive_divergence}，或者每个更新中具有$k$个Gibbs步骤的\\,\\glssymbol{persistent_contrastive_divergence}-k）独立地被重新发现~\\citep{Tieleman08-small}。\n具体可以参考\\algref{alg:sml}。\n这种方法的基本思想是，只要随机梯度算法得到的步长很小，那么前一步骤的模型将类似于当前步骤的模型。\n因此，来自先前模型分布的样本将非常接近来自当前模型分布的客观样本，用这些样本初始化的\\gls{markov_chain}将不需要花费很多时间来完成\\gls{mixing}。\n\n\n因为每个\\gls{markov_chain}在整个学习过程中不断更新，而不是在每个梯度步骤中重新开始，\\gls{markov_chain}可以自由探索很远，以找到模型的所有\\gls{mode}。 \n因此，\\glssymbol{SML}\\,比\\,\\glssymbol{contrastive_divergence}\\,更不容易形成具有\\gls{spurious_modes}的模型。\n此外，因为可以存储所有采样变量的状态，无论是可见的还是\\gls{latent}的，\\glssymbol{SML}\\,为\\gls{hidden_unit}和可见单元都提供了初始值。\n\\glssymbol{contrastive_divergence}\\,只能为可见单元提供初始化，因此\\gls{deep_model}需要进行\\gls{burn_in}步骤。\n\\glssymbol{SML}\\,能够高效地训练\\gls{deep_model}。\n\\cite{Marlin10Inductive-small}将\\,\\glssymbol{SML}\\,与本章中提出的许多其他标准方法进行比较。\n他们发现，\\glssymbol{SML}\\,在\\,\\glssymbol{RBM}\\,上得到了最佳的测试集对数似然，并且如果\\,\\glssymbol{RBM}\\,的\\gls{hidden_unit}被用作\\,\\glssymbol{SVM}\\,分类器的特征，那么\\,\\glssymbol{SML}\\,会得到最好的分类精度。\n% -- 604 end\n\n\\begin{algorithm}[ht]\n\\caption{\\gls{SML}/\\gls{persistent_contrastive_divergence}算法，使用梯度上升作为优化过程。}\n\\label{alg:sml}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数。\n\\STATE 设\\gls{gibbs_steps} $k$ 大到足以让从 $p(\\RVx; \\Vtheta + \\epsilon \\RVg)$ 采样的\\gls{markov_chain}\\gls{burn_in}（从采自$p(\\RVx; \\Vtheta)$的样本开始）。\n在小图像集上训练一个\\glssymbol{RBM}大致设为1，对于更复杂的模型如\\gls{DBM}可能要设为5到50。\n\\STATE  初始化$m$ 个样本 $\\{ \\tilde{\\RVx}^{(1)}, \\dots, \\tilde{\\RVx}^{(m)} \\}$ 为随机值（例如，从均匀或正态分布中采，或大致与模型边缘分布匹配的分布）。\n\\WHILE{不收敛}\n\\STATE 从训练集中采包含 $m$ 个样本 $\\{ \\RVx^{(1)}, \\dots, \\RVx^{(m)}\\}$ 的\\gls{minibatch}。\n\\STATE $\\RVg \\leftarrow \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx^{(i)}; \\Vtheta).$\n\\FOR{$i=1$ to $k$}\n    \\FOR{$j=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(j)} \\leftarrow \\text{gibbs\\_update}(\\tilde{\\RVx}^{(j)}).$\n    \\ENDFOR\n\\ENDFOR\n\\STATE $\\RVg \\leftarrow \\RVg - \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}( \\tilde{\\RVx}^{(i)} ; \\Vtheta ).$\n\\STATE $\\Vtheta \\leftarrow \\Vtheta + \\epsilon \\RVg.$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n% 605 mid\n在$k$太小或$\\epsilon$太大时，随机梯度算法移动模型的速率比\\gls{markov_chain}在迭代步中\\gls{mixing}更快，此时\\,\\glssymbol{SML}\\,容易变得不准确。\n不幸的是，这些值的容许范围高度依赖于具体问题。\n现在还没有方法能够正式地测试\\gls{markov_chain}是否能够在迭代步骤之间成功\\gls{mixing}。\n主观地，如果对于Gibbs步骤数目而言\\gls{learning_rate}太大的话，那么\n梯度步骤中\\gls{negative_phase}采样的方差会比不同\\gls{markov_chain}中\\gls{negative_phase}采样的方差更大。\n例如，一个MNIST模型在一个步骤中只采样得到了$7$。\n然后学习过程将会极大降低$7$对应的\\gls{mode}，在下一个步骤中，模型可能会只采样得到$9$。\n\n% 605 end\n从使用\\,\\glssymbol{SML}\\,训练的模型中评估采样必须非常小心。\n在模型训练完之后，有必要从一个随机起点初始化的新\\gls{markov_chain}抽取样本。\n用于训练的连续负相链中的样本受到了模型最近几个版本的影响，会使模型看起来具有比其实际更大的\\gls{capacity}。\n\n% -- 605 --\n\n\n\\cite{BerglundR13}进行了实验来检验由\\,\\glssymbol{contrastive_divergence}\\,和\\,\\glssymbol{SML}\\,进行梯度估计带来的偏差和方差。\n结果证明\\,\\glssymbol{contrastive_divergence}\\,比基于精确采样的\\gls{estimator}具有更低的方差。\n而\\,\\glssymbol{SML}\\,有更高的方差。\n\\glssymbol{contrastive_divergence}\\,方差低的原因是，其在\\gls{positive_phase}和\\gls{negative_phase}中使用了相同的训练点。\n如果从不同的训练点来初始化\\gls{negative_phase}，那么方差会比基于精确采样的\\gls{estimator}的方差更大。\n\n\n所有基于\\,\\glssymbol{mcmc}\\,从模型中抽取样本的方法在原则上几乎可以与\\,\\glssymbol{mcmc}\\,的任何变体一起使用。\n这意味着诸如\\,\\glssymbol{SML}\\,这样的技术可以使用\\chapref{chap:monte_carlo_methods}中描述的任何增强\\,\\glssymbol{mcmc}\\,的技术（例如\\gls{parallel_tempering}）来加以改进~\\citep{desjardins2010tempered,Cho10IJCNN-small}。\n% 606 mid\n\n一种在学习期间加速\\gls{mixing}的方法是，不改变\\gls{monte_carlo}采样技术，而是改变模型的参数化和\\gls{cost_function}。\n\\firstgls{FPCD}，或者\\,\\glssymbol{FPCD}~\\citep{TielemanT2009-small}使用如下表达式去替换传统模型的参数$\\Vtheta$\n\n\\begin{equation}\n\t\\Vtheta = \\Vtheta^{\\text{(slow)}} + \\Vtheta^{\\text{(fast)}}.\n\\end{equation}\n现在的参数是以前的两倍多，将其逐个相加以定义原始模型的参数。\n快速复制参数可以使用更大的\\gls{learning_rate}来训练，从而使其快速响应学习的\\gls{negative_phase}，并促使\\gls{markov_chain}探索新的区域。\n这能够使\\gls{markov_chain}快速\\gls{mixing}，尽管这种效应只会发生在学习期间快速权重可以自由改变的时候。\n通常，在短时间地将快速权重设为大值并保持足够长时间，使\\gls{markov_chain}改变\\gls{mode}之后，我们会对快速权重使用显著的\\gls{weight_decay}，促使它们收敛到较小的值。\n\n\n本节介绍的基于\\,\\glssymbol{mcmc}\\,的方法的一个关键优点是它们提供了$\\log Z$梯度的估计，因此我们可以从本质上将问题分解为$\\log \\tilde{p}$和$\\log Z$两块。\n然后我们可以使用任何其他的方法来处理$\\log \\tilde{p}(\\RVx)$，只需将我们的\\gls{negative_phase}梯度加到其他方法的梯度中。\n特别地，这意味着\\gls{positive_phase}可以使用那些仅提供$\\tilde{p}$下限的方法。\n然而，本章介绍处理$\\log Z$的大多数其他方法都和基于边界的\\gls{positive_phase}方法是不兼容的。\n\n% -- 606 end\n\n\\section{\\glsentrytext{pseudolikelihood}}\n\\label{sec:pseudolikelihood}\n\\gls{monte_carlo}近似\\gls{partition_function}及其梯度需要直接处理\\gls{partition_function}。\n有些其他方法通过训练不需要计算\\gls{partition_function}的模型来绕开这个问题。\n这些方法大多数都基于以下观察：无向概率模型中很容易计算概率的比率。\n这是因为\\gls{partition_function}同时出现在比率的分子和分母中，互相抵消：\n\\begin{equation}\n\t\\frac{p(\\RVx)}{ p(\\RVy) } = \\frac{ \\frac{1}{Z} \\tilde{p}(\\RVx) }{ \\frac{1}{Z} \\tilde{p}(\\RVy) } =\n\\frac{ \\tilde{p}(\\RVx) }{ \\tilde{p}(\\RVy) }.\n\\end{equation}\n\n\n\\gls{pseudolikelihood}正是基于\\gls{conditional_probability}可以采用这种基于比率的形式，因此可以在没有\\gls{partition_function}的情况下进行计算。\n假设我们将$\\RVx$分为$\\RVa$，$\\RVb$和$\\RVc$，其中$\\RVa$包含我们想要的条件分布的变量，$\\RVb$包含我们想要条件化的变量，$\\RVc$包含除此之外的变量：\n\\begin{equation}\n\tp(\\RVa \\mid \\RVb) = \\frac{ p(\\RVa, \\RVb) }{ p(\\RVb) } = \\frac{p(\\RVa, \\RVb)}{ \\sum_{\\RVa, \\RVc} p(\\RVa, \\RVb, \\RVc) } = \\frac{ \\tilde{p}(\\RVa, \\RVb) }{ \\sum_{\\RVa, \\RVc} \\tilde{p}(\\RVa, \\RVb, \\RVc) }.\n\\end{equation}\n以上计算需要边缘化$\\RVa$，假设$\\RVa$和$\\RVc$包含的变量并不多，那么这将是非常高效的操作。\n在极端情况下，$\\RVa$可以是单个变量，$\\RVc$可以为空，那么该计算仅需要估计与单个\\gls{RV}值一样多的$\\tilde{p}$。\n\n\n不幸的是，为了计算对数似然，我们需要边缘化很多变量。\n如果总共有$n$个变量，那么我们必须边缘化$n-1$个变量。\n根据概率的\\gls{chain_rule}，我们有\n\\begin{equation}\n\t\\log p(\\RVx) = \\log p(x_1) + \\log p(x_2 \\mid x_1) + \\dots + \\log p(x_n \\mid \\RVx_{1:n−1}).\n\\end{equation}\n在这种情况下，我们已经使$\\RVa$尽可能小，但是$\\RVc$可以大到$\\RVx_{2:n}$。\n如果我们简单地将$\\RVc$移到$\\RVb$中以减少计算代价，那么会发生什么呢？\n这便产生了\\firstgls{pseudolikelihood}~\\citep{Besag75pseudolikelihood}\\gls{objective_function}，给定所有其他特征$\\Vx_{-i}$，预测特征$x_i$的值：\n\\begin{equation}\n\t\\sum_{i=1}^n \\log p(x_i \\mid \\Vx_{-i}).\n\\end{equation}\n\n\n如果每个\\gls{RV}有$k$个不同的值，那么计算$\\tilde{p}$需要$k\\times n$次估计，而计算\\gls{partition_function}需要$k^n$次估计。\n\n% -- 607 --\n\n这看起来似乎是一个没有道理的策略，但可以证明最大化\\gls{pseudolikelihood}的估计是渐近一致的~\\citep{Mase1995}。\n当然，在数据集不趋近于大采样极限的情况下，\\gls{pseudolikelihood}可能表现出与\\gls{MLE}不同的结果。\n% 608 head\n\n我们可以使用\\firstgls{generalized_pseudolikelihood_estimator}来权衡计算复杂度和最大似然表现的偏差~\\citep{Huang02}。\n\\gls{generalized_pseudolikelihood_estimator}使用$m$个不同的集合$\\SetS^{(i)}$，$i=1, \\dots, m$作为变量的指标出现在条件棒的左侧。\n在$m = 1$和$\\SetS^{(1)}= 1, \\dots, n$的极端情况下，\\gls{generalized_pseudolikelihood_estimator}会变为对数似然。\n在$m = n$和$\\SetS^{(i)} = \\{i\\}$的极端情况下，\\gls{generalized_pseudolikelihood}会恢复为\\gls{pseudolikelihood}。%??   recover the pseudolikeli\n\\gls{generalized_pseudolikelihood_estimator}\\gls{objective_function}如下所示\n\\begin{equation}\n\t\\sum_{i=1}^m \\log p(\\RVx_{\\SetS^{(i)}} \\mid \\RVx_{- \\SetS^{(i)} }).\n\\end{equation}\n\n\n基于\\gls{pseudolikelihood}的方法的性能在很大程度上取决于模型是如何使用的。\n对于完全联合分布$p(\\RVx)$模型的任务（例如密度估计和采样），\\gls{pseudolikelihood}通常效果不好。\n对于在训练期间只需要使用条件分布的任务而言，它的效果比最大似然更好，例如填充少量的缺失值。\n如果数据具有规则结构，使得$\\SetS$索引集可以被设计为表现最重要的相关性质，同时略去相关性可忽略的变量，那么\\gls{generalized_pseudolikelihood}策略将会非常有效。\n例如，在自然图像中，空间中相隔很远的像素也具有弱相关性，因此\\gls{generalized_pseudolikelihood}可以应用于每个$\\SetS$集是小的局部空间窗口的情况。\n% 608 mid\n\n\\gls{pseudolikelihood}估计的一个弱点是它不能与仅在$\\tilde{p}(\\RVx)$上提供下界的其他近似一起使用，例如\\chapref{chap:approximate_inference}中介绍的\\gls{variational_inference}。这是因为$\\tilde{p}$出现在了分母中。\n分母的下界仅提供了整个表达式的上界，然而最大化上界没有什么意义。\n这使得我们难以将\\gls{pseudolikelihood}方法应用于诸如\\gls{DBM}的\\gls{deep_model}，因为变分方法是近似边缘化互相作用的多层\\gls{hidden_variable}的主要方法之一。\n尽管如此，\\gls{pseudolikelihood}仍然可以用在\\gls{DL}中，它可以用于单层模型，或使用不基于下界的近似推断方法的\\gls{deep_model}中。\n\n% -- 608 end\n\n\\gls{pseudolikelihood}比\\,\\glssymbol{SML}\\,在每个梯度步骤中的计算代价要大得多，这是由于其对所有条件进行显式计算。\n但是，如果每个样本只计算一个随机选择的条件，那么\\gls{generalized_pseudolikelihood}和类似标准仍然可以很好地运行，从而使计算代价降低到和\\,\\glssymbol{SML}\\,差不多的程度~\\citep{Goodfellow-et-al-NIPS2013}。\n\n\n虽然\\gls{pseudolikelihood}估计没有显式地最小化$\\log Z$，但是我们仍然认为它具有类似\\gls{negative_phase}的效果。\n每个条件分布的分母会使得学习算法降低所有仅具有一个变量不同于训练样本的状态的概率。\n\n\n读者可以参考~\\cite{Marlin11-small}了解\\gls{pseudolikelihood}渐近效率的理论分析，。\n\n% 609 mid\n\\section{\\glsentrytext{score_matching}和\\glsentrytext{ratio_matching}}\n\\label{sec:score_matching_and_ratio_matching}\n\\gls{score_matching}~\\citep{Hyvarinen-2005-small}提供了另一种训练模型而不需要估计$Z$或其导数的一致性方法。\n对数密度关于参数的导数$\\nabla_{\\Vx} \\log p(\\Vx)$，被称为其\\firstgls{score}，\\emph{\\gls{score_matching}}这个名称正是来自这样的术语。\n\\gls{score_matching}采用的策略是，最小化模型对数密度和数据对数密度关于输入的导数之间的平方差期望：\n\\begin{align}\n\tL(\\Vx, \\Vtheta) & = \\frac{1}{2} \\norm{  \\nabla_{\\Vx} \\log p_{\\text{model}}(\\Vx; \\Vtheta) - \\nabla_{\\Vx} \\log p_{\\text{data}} (\\Vx)  }_2^2, \\\\\n%\\end{equation}\n%\\begin{equation}\n\tJ(\\Vtheta) & = \\frac{1}{2} \\SetE_{p_{\\text{data}}(\\Vx)}  L(\\Vx, \\Vtheta), \\\\\n%\\end{equation}\n%\\begin{equation}\n\t\\Vtheta^* & = \\min_{\\Vtheta} J(\\Vtheta) .\n\\end{align}\n\n\n该\\gls{objective_function}避免了微分\\gls{partition_function} $Z$带来的难题，因为$Z$不是$x$的函数，所以$\\nabla_{\\RVx} Z = 0$。\n最初，\\gls{score_matching}似乎有一个新的困难：计算数据分布的\\gls{score}需要知道生成训练数据的真实分布$p_{\\text{data}}$。\n幸运的是，最小化$L(\\Vx, \\Vtheta)$的期望等价于最小化下式的期望\n\\begin{equation}\n\t\\tilde{L} (\\Vx, \\Vtheta) = \\sum_{j=1}^n \\left( \\frac{\\partial^2}{ \\partial x_j^2 } \n\t\\log p_{\\text{model}} (\\Vx; \\Vtheta) + \\frac{1}{2} \\left( \\frac{\\partial}{ \\partial x_j }\n\t\\log p_{\\text{model}} (\\Vx; \\Vtheta)\n  \\right)^2\n\\right),\n\\end{equation}\n其中$n$是$\\Vx$的维度。\n\n% -- 609 end\n\n因为\\gls{score_matching}需要关于$\\RVx$的导数，所以它不适用于具有离散数据的模型，但是模型中的\\gls{latent_variable}可以是离散的。\n\n\n类似于\\gls{pseudolikelihood}，\\gls{score_matching}只有在我们能够直接估计$\\log \\tilde{p}(\\RVx)$及其导数的时候才有效。\n它与对$\\log \\tilde{p}(\\RVx)$仅提供下界的方法不兼容，因为\\gls{score_matching}需要$\\log \\tilde{p}(\\RVx)$的导数和二阶导数，而下限不能传达关于导数的任何信息。\n这意味着\\gls{score_matching}不能应用于\\gls{hidden_unit}之间具有复杂相互作用的模型估计，例如\\gls{sparse_coding}模型或\\gls{DBM}。\n虽然\\gls{score_matching}可以用于\\gls{pretraining}较大模型的第一个\\gls{hidden_layer}，但是它没有被用于预训练较大模型的较深层网络。\n这可能是因为这些模型的\\gls{hidden_layer}通常包含一些离散变量。\n\n\n虽然\\gls{score_matching}没有明确显示具有\\gls{negative_phase}信息，但是它可以被视为使用特定类型\\gls{markov_chain}的\\gls{contrastive_divergence}的变种~\\citep{Hyvarinen-2007b}。\n在这种情况下，\\gls{markov_chain}并没有采用\\,\\gls{gibbs_sampling}，而是采用一种由梯度引导局部更新的不同方法。\n当局部更新的大小接近于零时，\\gls{score_matching}等价于具有这种\\gls{markov_chain}的\\gls{contrastive_divergence}。\n% 610 mid\n\n\\cite{Lyu09}将\\gls{score_matching}推广到离散的情况（但是推导有误，后由~\\cite{Marlin10Inductive-small}修正）。\n\\cite{Marlin10Inductive-small}发现，\\textbf{\\gls{GSM}}（\\textbf{generalized score matching}， GSM）在许多样本观测概率为$0$的高维离散空间中不起作用。\n\n\n一种更成功地将\\gls{score_matching}的基本想法扩展到离散数据的方法是\\firstgls{ratio_matching}~\\citep{Hyvarinen-2007}。\n\\gls{ratio_matching}特别适用于二值数据。\n\\gls{ratio_matching}最小化以下\\gls{objective_function}在样本上的均值：\n\\begin{equation}\n\tL^{(\\text{RM})} (\\Vx, \\Vtheta) = \\sum_{j=1}^n \\left( \n\t\\frac{1}{ 1 + \\frac{ p_{\\text{model}}(\\Vx; \\Vtheta) }{ p_{\\text{model}}(f(\\Vx), j; \\Vtheta) } } \n\\right)^2.\n\\end{equation}\n其中$f(\\Vx, j)$返回$j$处位值取反的$\\RVx$。\n\\gls{ratio_matching}使用了与\\gls{pseudolikelihood}估计相同的策略来绕开\\gls{partition_function}：\\gls{partition_function}会在两个概率的比率中抵消掉。\n\\cite{Marlin10Inductive-small}发现，\n训练模型给测试集图像\\gls{denoising}时，\\gls{ratio_matching}的效果要优于\\,\\glssymbol{SML}、\\gls{pseudolikelihood}和\\,\\glssymbol{GSM}。\n\n\n% -- 610 end\n\n类似于\\gls{pseudolikelihood}估计，\\gls{ratio_matching}对每个数据点都需要$n$个$\\tilde{p}$的估计，因此每次更新的计算代价大约比~\\glssymbol{SML}~的计算代价高出$n$倍。\n\n\n与\\gls{pseudolikelihood}估计一样，我们可以认为\\gls{ratio_matching}减小了所有只有一个变量不同于训练样本的状态的概率。\n由于\\gls{ratio_matching}特别适用于二值数据，这意味着在与数据的\\gls{hamming_distance}为$1$内的所有状态上，\\gls{ratio_matching}都是有效的。\n\n\n\\gls{ratio_matching}还可以作为处理高维稀疏数据（例如词计数向量）的基础。\n这类稀疏数据对基于\\,\\glssymbol{mcmc}\\,的方法提出了挑战，因为以密集格式表示数据是非常消耗计算资源的，而只有在模型学会表示数据分布的稀疏性之后，\\glssymbol{mcmc}\\,采样才会产生稀疏值。\n\\cite{Dauphin+Bengio-NIPS2013}设计了\\gls{ratio_matching}的\\gls{unbiased}随机近似来解决这个问题。\n该近似只估计随机选择的目标子集，不需要模型生成完整的样本。\n\n\n读者可以参考~\\cite{Marlin11-small}了解\\gls{ratio_matching}渐近效率的理论分析，。\n% 611 mid\n\n\\section{\\glsentrytext{denoising_score_matching}}\n\\label{sec:denoising_score_matching}\n某些情况下，我们希望拟合以下分布来\\gls{regularize}\\gls{score_matching}\n\\begin{equation}\n\tp_{\\text{smoothed}}(\\Vx) = \\int p_{\\text{data}} (\\Vy) q( \\Vx \\mid \\Vy) d \\Vy\n\\end{equation}\n而不是拟合真实分布$p_{\\text{data}}$。\n分布$q(\\Vx \\mid \\Vy)$是一个损坏过程，通常在形成$\\Vx$的过程中会向$\\Vy$中添加少量\\gls{noise}。\n\n\n\\gls{denoising_score_matching}非常有用，因为在实践中，通常我们不能获取真实的$p_{\\text{data}}$，而只能得到其样本确定的\\gls{empirical_distribution}。\n给定足够\\gls{capacity}，任何一致估计都会使$p_{\\text{model}}$成为一组以训练点为中心的\\,\\gls{dirac_distribution}。\n考虑在\\secref{sec:consistency}介绍的渐近一致性上的\\gls{loss}，通过$q$来平滑有助于缓解这个问题。\n\\cite{Kingma+LeCun-2010}介绍了平滑分布$q$为正态分布\\gls{noise}的\\gls{regularize}\\gls{score_matching}。\n\n\n回顾\\secref{sec:estimating_the_score}，有一些\\gls{AE}训练算法等价于\\gls{score_matching}或\\gls{denoising_score_matching}。\n因此，这些\\gls{AE}训练算法也是解决\\gls{partition_function}问题的一种方式。\n\n% -- 611 --\n\n\\section{\\glsentrytext{NCE}}\n\\label{sec:noise_contrastive_estimation}\n具有难求解的\\gls{partition_function}的大多数模型估计都没有估计\\gls{partition_function}。\n\\glssymbol{SML}\\,和\\,\\glssymbol{contrastive_divergence}\\,只估计对数\\gls{partition_function}的梯度，而不是估计\\gls{partition_function}本身。\n\\gls{score_matching}和\\gls{pseudolikelihood}避免了和\\gls{partition_function}相关的计算。 \n\n\n\\textbf{\\gls{NCE}}\\,（\\textbf{noise-contrastive estimation}，\\glssymbol{NCE}）\\citep{Gutmann+Hyvarinen-2010}采取了一种不同的策略。\n 在这种方法中，模型估计的\\gls{PD}被明确表示为\n\\begin{equation}\n\t\\log p_{\\text{model}} (\\RVx) = \\log \\tilde{p}_{\\text{model}} (\\RVx; \\Vtheta) + c,\n\\end{equation}\n其中$c$是$-\\log Z(\\Vtheta)$的近似。\n\\gls{NCE}过程将$c$视为另一参数，使用相同的算法同时估计$\\Vtheta$和$c$，而不是仅仅估计$\\Vtheta$，。\n因此，所得到的$\\log p_{\\text{model}}(\\RVx)$可能并不完全对应有效的\\gls{PD}，但随着$c$估计的改进，它将变得越来越接近有效值\\footnote{\\glssymbol{NCE}~也适用于具有易于处理的，不需要引入额外参数$c$的\\gls{partition_function}的问题。它已经是最令人感兴趣的，估计具有复杂\\gls{partition_function}模型的方法。}。\n\n\n这种方法不可能使用最大似然作为估计的标准。\n最大似然标准可以设置$c$为任意大的值，而不是设置$c$以创建一个有效的\\gls{PD}。\n\n\n\\glssymbol{NCE}~将估计$p(\\RVx)$的\\gls{unsupervised_learning}问题转化为学习一个概率二元分类器，其中一个类别对应模型生成的数据。\n该\\gls{supervised_learning}问题中的\\gls{MLE}定义了原始问题的渐近一致估计。\n\n\n具体地说，我们引入第二个分布，\\firstgls{noise_distribution} $p_{\\text{noise}}(\\RVx)$。\n\\gls{noise_distribution}应该易于估计和从中采样。\n我们现在可以构造一个联合$\\RVx$和新二值变量$y$的模型。\n在新的联合模型中，我们指定\n\\begin{equation}\n\tp_{\\text{joint}} (y = 1) = \\frac{1}{2},\n\\end{equation}\n\\begin{equation}\n\tp_{\\text{joint}} (\\RVx \\mid y = 1) = p_{\\text{model}} (\\RVx),\n\\end{equation}\n和\n\\begin{equation}\n\tp_{\\text{joint}} (\\RVx \\mid y = 0) = p_{\\text{noise}}(\\RVx).\n\\end{equation}\n换言之，$y$是一个决定我们从模型还是从\\gls{noise_distribution}中生成$\\RVx$的开关变量。\n\n% -- 612 --\n\n我们可以在训练数据上构造一个类似的联合模型。\n在这种情况下，开关变量决定是从\\,\\textbf{数据}\\,还是从\\gls{noise}分布中抽取$\\RVx$。\n正式地，$p_{\\text{train}}(y = 1) = \\frac{1}{2}$，$p_{\\text{train}}( \\RVx \\mid y = 1) = p_{\\text{data}}( \\RVx)$，和\n$p_{\\text{train}}(\\RVx \\mid y = 0) = p_{\\text{noise}}(\\RVx)$。\n\n\n现在我们可以应用标准的最大似然学习拟合$p_{\\text{joint}}$到$p_{\\text{train}}$的\\,\\textbf{监督}\\,学习问题：\n\\begin{equation}\n\t\\Vtheta, c = \\underset{ \\Vtheta, c}{\\arg\\max} \\SetE_{\\RVx, \\RSy \\sim p_{\\text{train}}} \\log \n\tp_{\\text{joint}} (y \\mid \\RVx).\n\\end{equation}\n\n\n分布$p_{\\text{joint}}$本质上是将\\gls{logistic_regression}模型应用于模型和\\gls{noise_distribution}之间的对数概率之差：\n\\begin{equation}\n\tp_{\\text{joint}} (y = 1 \\mid \\RVx) = \\frac{ p_{\\text{model}}(\\RVx) }{ p_{\\text{model}}(\\RVx) + p_{\\text{noise}}(\\RVx) }\n\\end{equation}\n\\begin{equation}\n = \\frac{1}{1 + \\frac{ p_{\\text{noise}}(\\RVx) }{ p_{\\text{model}}(\\RVx) }}\n\\end{equation}\n\\begin{equation}\n= \\frac{1}{1 + \\exp \\left( \\log \\frac{ p_{\\text{noise}}(\\RVx) }{ p_{\\text{model}}(\\RVx) } \\right)}\n\\end{equation}\n\\begin{equation}\n\t= \\sigma \\left( - \\log \\frac{ p_{\\text{noise}} (\\RVx) }{ p_{\\text{model}} (\\RVx) } \\right)\n\\end{equation}\n\\begin{equation}\n\t= \\sigma ( \\log p_{\\text{model}} (\\RVx) - \\log p_{\\text{noise}} (\\RVx)  ) .\n\\end{equation}\n\n\n因此，只要$\\log \\tilde{p}_{\\text{model}}$易于\\gls{back_propagation}，\n并且如上所述，$p_{\\text{noise}}$应易于估计（以便评估$p_{\\text{joint}}$）和采样（以生成训练数据），那么\\,\\glssymbol{NCE}\\,就易于使用。\n\n\n\\glssymbol{NCE}\\,能够非常成功地应用于\\gls{RV}较少的问题，但即使\\gls{RV}有很多可以取的值时，它也很有效。\n例如，它已经成功地应用于给定单词上下文建模单词的条件分布~\\citep{Mnih2013}。\n虽然单词可以采样自一个很大的词汇表，但是只能采样一个单词。\n\n% -- 613 --\n\n当\\,\\glssymbol{NCE}\\,应用于具有许多\\gls{RV}的问题时，其效率会变得较低。\n当\\gls{logistic_regression}分类器发现某个变量的取值不大可能时，它会拒绝这个\\gls{noise}样本。\n这意味着在$p_{\\text{model}}$学习了基本的边缘统计之后，学习进程会大大减慢。\n想象一个使用非结构化高斯\\gls{noise}作为$p_{\\text{noise}}$来学习面部图像的模型。\n如果$p_{\\text{model}}$学会了眼睛，就算没有学习任何其他面部特征，比如嘴， 它也会拒绝几乎所有的非结构化\\gls{noise}样本。\n% 614 head\n\n\\gls{noise_distribution}~$p_{\\text{noise}}$必须是易于估计和采样的约束可能是过于严格的限制。\n当$p_{\\text{noise}}$比较简单时，大多数采样可能与数据有着明显不同，而不会迫使$p_{\\text{model}}$进行显著改进。\n\n\n类似于\\gls{score_matching}和\\gls{pseudolikelihood}，如果$\\tilde{p}$只有下界，那么\\,\\glssymbol{NCE}\\,不会有效。\n这样的下界能够用于构建$p_{\\text{joint}}( y = 1 \\mid \\RVx)$的下界，但是它只能用于构建$p_{\\text{joint}}(y = 0 \\mid \\RVx)$（出现在一半的\\,\\glssymbol{NCE}\\,对象中）的上界。\n同样地，$p_{\\text{noise}}$的下界也没有用，因为它只提供了$p_{\\text{joint}}( y = 1 \\mid \\RVx)$的上界。\n\n\n在每个梯度步骤之前，模型分布被复制来定义新的\\gls{noise_distribution}时，\\glssymbol{NCE}\\,定义了一个被称为\\firstgls{self_contrastive_estimation}的过程，其梯度期望等价于最大似然的梯度期望~\\citep{Goodfellow-ICLR2015}。\n特殊情况的\\,\\glssymbol{NCE}（\\gls{noise}采样由模型生成）表明最大似然可以被解释为使模型不断学习以将现实与自身发展的信念区分的过程，而\\gls{NCE}通过让模型区分现实和固定的基准（\\gls{noise}模型），我们降低了计算成本。%??  以  是不是多余的？\n\n\n在训练样本和生成样本（使用模型能量函数定义分类器）之间进行分类以得到模型的梯度的方法，已经在更早的时候以各种形式提出来~\\citep{Welling2003b,Bengio-2009-book}。\n\n\n\\gls{NCE}是基于良好\\gls{generative_model}应该能够区分数据和\\gls{noise}的想法。\n一个密切相关的想法是，良好的\\gls{generative_model}能够生成分类器无法将其与数据区分的样本。\n这个想法诞生了\\gls{generative_adversarial_networks}（\\secref{sec:generative_adversarial_networks}）。\n\n\n\\section{估计\\glsentrytext{partition_function}}\n\\label{sec:estimating_the_partition_function}\n尽管本章中的大部分内容都在避免计算与\\gls{undirected_graphical_model}相关的难以计算的\\gls{partition_function} $Z(\\Vtheta)$，但在本节中我们将会讨论几种直接估计\\gls{partition_function}的方法。\n\n% -- 614 --\n\n估计\\gls{partition_function}可能会很重要，当我们希望计算数据的归一化似然时，我们会需要它。\n在\\emph{评估}模型，监控训练性能，和比较模型时，这通常是很重要的。\n\n\n例如，假设我们有两个模型：\\gls{PD}为$p_A(\\RVx; \\Vtheta_A)= \\frac{1}{Z_A} \\tilde{p}_A(\\RVx; \\Vtheta_A)$的模型$\\CalM_A$和\\gls{PD}为$p_B(\\RVx; \\Vtheta_B)= \\frac{1}{Z_B} \\tilde{p}_B(\\RVx; \\Vtheta_B)$的模型$\\CalM_B$。\n比较模型的常用方法是评估和比较两个模型分配给\\gls{iid_chap18}测试数据集的似然。\n假设测试集含$m$个样本$\\{ \\Vx^{(1)}, \\dots, \\Vx^{(m)} \\}$。\n如果 $\\prod_i p_A ( \\RSx^{(i)}; \\Vtheta_A) > \\prod_i p_B( \\RSx^{(i)}; \\Vtheta_B)$，或等价地，如果\n\\begin{equation}\n\\label{eq:18.38}\n\t\\sum_i \\log p_A (\\RSx^{(i)}; \\Vtheta_A) - \\sum_i \\log p_B(\\RSx^{(i)}; \\Vtheta_B) > 0,\n\\end{equation}\n那么我们说$\\CalM_A$是一个比$\\CalM_B$更好的模型（或者，至少可以说，它在测试集上是一个更好的模型），这是指它有一个更好的测试对数似然。\n不幸的是，测试这个条件是否成立需要知道\\gls{partition_function}。\n\\eqnref{eq:18.38}看起来需要估计模型分配给每个点的对数概率，因而需要估计\\gls{partition_function}。\n我们可以通过将\\eqnref{eq:18.38}重新转化为另一种形式来简化情况，在该形式中我们只需要知道两个模型的\\gls{partition_function}的\\textbf{比率}：\n\\begin{equation}\n\\label{eq:18.39}\n\t\\sum_i \\log p_A(\\RVx^{(i)}; \\Vtheta_A) - \\sum_i \\log p_B(\\RVx^{(i)}; \\Vtheta_B) =\n\t\\sum_i \\left(  \\log \\frac{ \\tilde{p}_A(\\RVx^{(i)}; \\Vtheta_A) }{ \\tilde{p}_B(\\RVx^{(i)}; \\Vtheta_B) } \\right)  - m\\log \\frac{Z(\\Vtheta_A)}{ Z(\\Vtheta_B) }.\n\\end{equation}\n因此，我们可以在不知道任一模型的\\gls{partition_function}，而只知道它们比率的情况下，判断模型$\\CalM_A$是否比模型$\\CalM_B$更优。\n正如我们将很快看到的，在两个模型相似的情况下，我们可以使用\\gls{importance_sampling}来估计比率。\n\n\n然而，如果我们想要计算测试数据在$\\CalM_A$或$\\CalM_B$上的真实概率，我们需要计算\\gls{partition_function}的真实值。\n如果我们知道两个\\gls{partition_function}的比率，$r = \\frac{Z(\\Vtheta_B)}{ Z(\\Vtheta_A) }$，并且我们知道两者中一个的实际值，比如说$Z(\\Vtheta_A)$，那么我们可以计算另一个的值：\n\\begin{equation}\n\tZ(\\Vtheta_B) = r Z(\\Vtheta_A) = \\frac{ Z(\\Vtheta_B) }{ Z(\\Vtheta_A) } Z(\\Vtheta_A).\n\\end{equation}\n\n\n一种估计\\gls{partition_function}的简单方法是使用\\gls{monte_carlo}方法，例如简单\\gls{importance_sampling}。\n以下用连续变量积分来表示该方法，也可以替换积分为求和，很容易将其应用到离散变量的情况。\n我们使用\\gls{proposal_distribution} $p_0(\\RVx) = \\frac{1}{Z_0} \\tilde{p}_0( \\RVx)$，其在\\gls{partition_function} $Z_0$和未归一化分布$\\tilde{p}_0(\\RVx)$上易于采样和估计。\n\n% -- 615 --\n\n\\begin{align}\n\tZ_1 &= \\int \\tilde{p}_1 (\\RVx) d \\RVx \\\\\n\t&= \\int  \\frac{ p_0(\\RVx) }{ p_0(\\RVx) }   \\tilde{p}_1 (\\RVx) d \\RVx \\\\\n\t&= Z_0 \\int  p_0(\\RVx)   \\frac{ \\tilde{p}_1 (\\RVx) }{ \\tilde{p}_0 (\\RVx) } d \\RVx \\\\\n\t\\hat{Z}_1 &= \\frac{Z_0}{K} \\sum_{k=1}^K \\frac{ \\tilde{p}_1(\\RVx^{(k)})  }{ \\tilde{p}_0(\\RVx^{(k)}) }  \\quad\\quad \\text{s.t.}: \\RVx^{(k)} \\sim p_0 \\label{eq:18.44}\n\\end{align}\n\n在最后一行，我们使用\\gls{monte_carlo}估计，使用从$p_0(\\RVx)$中抽取的采样计算积分$\\hat{Z}_1$，然后用未归一化的$\\tilde{p}_1$和\\gls{proposal_distribution} $p_0$的比率对每个采样加权。\n\n\n这种方法使得我们可以估计\\gls{partition_function}之间的比率：\n\\begin{equation}\n\t\\frac{1}{K} \\sum_{k=1}^K \\frac{ \\tilde{p}_1 (\\RVx^{(k)}) }{ \\tilde{p}_0 (\\RVx^{(k)}) }\n\t\\quad\\quad \\text{s.t.}: \\RVx^{(k)} \\sim p_0.\n\\end{equation}\n然后该值可以直接比较\\eqnref{eq:18.39}中的两个模型。\n\n\n如果分布$p_0$接近$p_1$，那么\\eqnref{eq:18.44}能够有效地估计\\gls{partition_function}~\\citep{Minka_2005}。\n不幸的是，大多数时候$p_1$都很复杂（通常是\\gls{multimodal}的），并且定义在高维空间中。\n很难找到一个易求解的$p_0$，既能易于评估，又能充分接近$p_1$以保持高质量的近似。\n如果$p_0$和$p_1$不接近，那么$p_0$的大多数采样将在$p_1$中具有较低的概率，从而在\\eqnref{eq:18.44}的求和中产生（相对的）可忽略的贡献。\n\n\n如果求和中只有少数几个具有显著权重的样本，那么将会由于高方差而导致估计的效果很差。\n这可以通过估计$\\hat{Z}_1$的方差来定量地理解：\n\\begin{equation}\n\t\\hat{\\text{Var}} \\left( \\hat{Z}_1 \\right)  = \\frac{Z_0 }{K^2} \\sum_{k=1}^K\n\\left(  \\frac{ \\tilde{p}_1(\\RVx^{(k)}) }{  \\tilde{p}_0(\\RVx^{(k)}) } - \\hat{Z}_1  \\right)^2.\n\\end{equation}\n当重要性权重$\\frac{ \\tilde{p}_1(\\RVx^{(k)}) }{ \\tilde{p}_0(\\RVx^{(k)}) } $存在显著偏差时，上式的值是最大的。\n\n% -- 616 --\n\n我们现在关注两个解决高维空间复杂分布上估计\\gls{partition_function}的方法：\n\\gls{AIS}和\\gls{bridge_sampling}。\n两者都始于上面介绍的简单\\gls{importance_sampling}方法，并且都试图通过引入\\emph{缩小}$p_0$和$p_1$之间\\emph{差距}的中间分布，来解决$p_0$远离$p_1$的问题。\n\n\n\\subsection{\\glsentrytext{AIS}}\n\\label{sec:annealed_importance_sampling}\n在$D_{KL}(p_0 \\| p_1)$很大的情况下（即$p_0$和$p_1$之间几乎没有重叠），一种称为\\textbf{\\gls{AIS}}（\\textbf{annealed importance sampling}，AIS）的方法试图通过引入中间分布来缩小这种差距~\\citep{Jarzynski1997,Neal-2001}。\n考虑分布序列$p_{\\eta_0},\\dots,p_{\\eta_n}$，其中$0=\\eta_0 < \\eta_1 < \\dots < \\eta_{n-1} < \\eta_n = 1$，分布序列中的第一个和最后一个分别是$p_0$和$p_1$。\n\n\n这种方法使我们能够估计定义在高维空间多峰分布（例如训练~\\glssymbol{RBM}~时定义的分布）上的\\gls{partition_function}。\n我们从一个已知\\gls{partition_function}的简单模型（例如，权重为零的\\,\\glssymbol{RBM}）开始，估计两个模型\\gls{partition_function}之间的比率。\n该比率的估计基于许多个相似分布的比率估计，例如在零和学习到的权重之间插值一组权重不同的\\,\\glssymbol{RBM}。\n\n\n现在我们可以将比率$\\frac{Z_1}{Z_0}$写作\n\\begin{align}\n\\frac{Z_1}{Z_0} &= \\frac{Z_1}{Z_0} \\frac{Z_{\\eta_1}}{Z_{\\eta_1}} \\dots \\frac{Z_{\\eta_{n-1}}}{Z_{\\eta_{n-1}}} \\\\\n&= \\frac{Z_{\\eta_1}}{Z_{0}}  \\frac{Z_{\\eta_2}}{Z_{\\eta_1}}  \\dots \\frac{Z_{\\eta_{n-1}}}{Z_{\\eta_{n-2}}} \\frac{Z_{1}}{Z_{\\eta_{n-1}}} \\\\\n&= \\prod_{j=0}^{n-1} \\frac{ Z_{\\eta_{j+1}} }{Z_{\\eta_j}}. \\label{eq:18.49}\n\\end{align}\n如果对于所有的$0 \\leq j \\leq n-1$，分布$p_{\\eta_j}$和$p_{\\eta_{j+1}}$足够接近，那么我们能够使用简单的\\gls{importance_sampling}来估计每个因子$\\frac{Z_{\\eta_{j+1}}}{ Z_{\\eta_j}}$，然后使用这些得到$\\frac{Z_1}{Z_0}$的估计。\n\n% -- 617 --\n\n这些中间分布是从哪里来的呢？\n正如最先的\\gls{proposal_distribution} $p_0$是一种设计选择，分布序列$p_{\\eta_1} \\dots p_{\\eta_{n-1}}$也是如此。\n也就是说，它们可以被特别设计为特定的问题领域。\n中间分布的一个通用和流行选择是使用目标分布$p_1$的加权几何平均，起始分布（其\\gls{partition_function}是已知的）为$p_0$：\n\\begin{equation}\n\tp_{\\eta_j} \\propto p_1^{\\eta_j} p_0^{1-\\eta_j}.\n\\end{equation}\n\n\n为了从这些中间分布中采样，我们定义了一组\\gls{markov_chain}转移函数$T_{\\eta_j}(\\Vx' \\mid \\Vx)$，定义了给定$\\Vx$转移到$\\Vx'$的\\gls{conditional_probability_distribution}。\n转移算子$T_{\\eta_j}(\\Vx' \\mid \\Vx)$定义如下，保持$p_{\\eta_j}(\\Vx)$不变：\n\\begin{equation}\n\tp_{\\eta_j}(\\Vx) = \\int p_{\\eta_j} (\\Vx') T_{\\eta_j} (\\Vx \\mid \\Vx') d\\Vx'.\n\\end{equation}\n这些转移可以被构造为任何\\gls{mcmc}方法（例如，Metropolis-Hastings，Gibbs），包括涉及多次遍历所有\\gls{RV}或其他迭代的方法。\n\n\n然后，\\glssymbol{AIS}\\,采样方法从$p_0$开始生成样本，并使用转移算子从中间分布顺序地生成采样，直到我们得到目标分布$p_1$的采样：\n\\begin{itemize}\n\t\\item 对于 $k=1 \\dots K$ \n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_1}^{(k)} \\sim p_0(\\RVx) $\n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_2}^{(k)} \\sim T_{\\eta_1}(\\RVx_{\\eta_2}^{(k)} \\mid \\Vx_{\\eta_1}^{(k)} ) $\n\t\t\\newline\n\t\t\\quad\\quad -- $\\dots$\n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_{n-1}}^{(k)} \\sim T_{\\eta_{n-2}}(\\RVx_{\\eta_{n-1}}^{(k)} \\mid \\Vx_{\\eta_{n-2}}^{(k)} ) $\n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_n}^{(k)} \\sim T_{\\eta_{n-1}}(\\RVx_{\\eta_n}^{(k)} \\mid \\Vx_{\\eta_{n-1}}^{(k)} ) $\n\t\\item 结束\n\\end{itemize}\n\n\n对于采样$k$，通过连接\\eqnref{eq:18.49}给出的中间分布之间的重要性权重，我们可以导出目标重要性权重：\n\\begin{equation}\n\\label{eq:18.52}\n\tw^{(k)} = \\frac{ \\tilde{p}_{\\eta_1} ( \\Vx_{\\eta_1}^{(k)} )  }{  \\tilde{p}_{0} ( \\Vx_{\\eta_1}^{(k)} )  }\n\\frac{ \\tilde{p}_{\\eta_2} ( \\Vx_{\\eta_2}^{(k)} )  }{  \\tilde{p}_{\\eta_1} ( \\Vx_{\\eta_2}^{(k)} )  }\n\\dots\n\\frac{ \\tilde{p}_{1} ( \\Vx_{1}^{(k)} )  }{  \\tilde{p}_{\\eta_{n-1}} ( \\Vx_{\\eta_n}^{(k)} )  } .\n\\end{equation}\n为了避免诸如\\gls{overflow}的数值问题，最佳方法可能是通过加法或减法计算$\\log w^{(k)}$，而不是通过概率乘法和除法计算$w^{(k)}$。\n\n% -- 618 --\n\n利用由此定义的采样过程和\\eqnref{eq:18.52}中给出的重要性权重，\\gls{partition_function}的比率估计如下所示：\n\\begin{equation}\n\t\\frac{Z_1}{Z_0} \\approx \\frac{1}{K} \\sum_{k=1}^K w^{(k)}\n\\end{equation}\n\n\n为了验证该过程定义的\\gls{importance_sampling}方案是否有效，我们可以展示\\citep{Neal-2001}~\\glssymbol{AIS}~过程对应着扩展状态空间上的简单\\gls{importance_sampling}，其中数据点采样自乘积空间$[\\Vx_{\\eta_1},\\dots,\\Vx_{\\eta_{n-1}},\\Vx_1]$。\n为此，我们将扩展空间上的分布定义为\n\\begin{align}\n&\\tilde{p} (\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1) \\\\\n= &\\tilde{p}_1 (\\Vx_1) \\tilde{T}_{\\eta_{n-1}} (\\Vx_{\\eta_{n-1}} \\mid \\Vx_1)\n \t\\tilde{T}_{\\eta_{n-2}}  (\\Vx_{\\eta_{n-2}} \\mid \\Vx_{\\eta_{n-1}}) \\dots\n \t\\tilde{T}_{\\eta_1} (\\Vx_{\\eta_1} \\mid \\Vx_{\\eta_2}) \\label{eq:18.55} ,\n\\end{align}\n其中$\\tilde{T}_a$是由$T_a$定义的转移算子的逆（应用\\gls{bayes_rule}）：\n\\begin{equation}\n\t\\tilde{T}_a (\\Vx' \\mid \\Vx) = \\frac{p_a(\\Vx')}{ p_a(\\Vx) } T_a(\\Vx \\mid \\Vx') = \n\\frac{  \\tilde{p}_a(\\Vx')}{ \\tilde{p}_a(\\Vx) } T_a(\\Vx \\mid \\Vx') .\n\\end{equation}\n将以上代入到\\eqnref{eq:18.55}给出的扩展状态空间上的联合分布中，我们得到：\n\\begin{align}\n\t&\\tilde{p} (\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1) \\\\\n\t= &\\tilde{p}_1 (\\Vx_1) \\frac{ \\tilde{p}_{\\eta_{n-1}} (\\Vx_{\\eta_{n-1}})  }{ \\tilde{p}_{\\eta_{n-1}}(\\Vx_1)} T_{\\eta_{n-1}} (\\Vx_1 \\mid \\Vx_{\\eta_{n-1}})\n\\prod_{i=1}^{n-2} \\frac{ \\tilde{p}_{\\eta_i}(\\Vx_{\\eta_i}) }{ \\tilde{p}_{\\eta_i}(\\Vx_{\\eta_{i+1}})} T_{\\eta_i} (\\Vx_{\\eta_{i+1}} \\mid \\Vx_{\\eta_i}) \\\\\n\t= &\\frac{ \\tilde{p}_1(\\Vx_1) }{ \\tilde{p}_{\\eta_{n-1}}(\\Vx_1) } T_{\\eta_{n-1}} (\\Vx_1 \\mid \\Vx_{\\eta_{n-1}})\n\\tilde{p}_{\\eta_1} (\\Vx_{\\eta_1}) \\prod_{i=1}^{n-2} \\frac{ \\tilde{p}_{\\eta_{i+1}}(\\Vx_{\\eta_{i+1}}) }{ \\tilde{p}_{\\eta_i}(\\Vx_{\\eta_{i+1}}) } T_{\\eta_i} (\\Vx_{\\eta_{i+1}} \\mid \\Vx_{\\eta_i}) . \\label{eq:18.59}\n\\end{align}\n通过上面给定的采样方案，现在我们可以从扩展样本上的联合\\gls{proposal_distribution} $q$上生成采样，联合分布如下\n\\begin{equation}\n\tq(\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1)  = p_0(\\Vx_{\\eta_1}) T_{\\eta_1}( \\Vx_{\\eta_2} \\mid \\Vx_{\\eta_1} ) \\dots T_{\\eta_{n-1}} (\\Vx_1 \\mid \\Vx_{\\eta_{n-1}}) .\n\\end{equation}\n\\eqnref{eq:18.59}给出了扩展空间上的联合分布。\n将$q(\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1)$作为扩展状态空间上的\\gls{proposal_distribution}（我们会从中抽样），重要性权重如下\n\\begin{equation}\n\tw^{(k)} = \\frac{ \\tilde{p}(\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1) }{ q( \\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1 ) } =\n\\frac{ \\tilde{p}_1(\\Vx_1^{(k)}) }{ \\tilde{p}_{\\eta_{n-1}}(\\Vx_{\\eta_{n-1}}^{(k)}) } \\dots\n\\frac{ \\tilde{p}_{\\eta_{2}}(\\Vx_{\\eta_{2}}^{(k)}) }{ \\tilde{p}_{\\eta_1}(\\Vx_{\\eta_{1}}^{(k)}) } \n\\frac{ \\tilde{p}_{\\eta_{1}}(\\Vx_{\\eta_{1}}^{(k)}) }{ \\tilde{p}_{0}(\\Vx_{0}^{(k)}) } .\n\\end{equation}\n这些权重和\\,\\glssymbol{AIS}\\,上的权重相同。\n因此，我们可以将\\,\\glssymbol{AIS}\\,解释为应用于扩展状态上的简单\\gls{importance_sampling}，其有效性直接来源于\\gls{importance_sampling}的有效性。\n\n% -- 619 --\n\n\\gls{AIS}首先由~\\cite{Jarzynski1997}发现，然后由~\\cite{Neal-2001}再次独立发现。\n目前它是估计无向概率模型的\\gls{partition_function}的最常用方法。\n其原因可能与一篇有影响力的论文~\\citep{Salakhutdinov+Murray-2008}有关，该论文并没有讨论该方法相对于其他方法的优点，而是介绍了将其应用于估计\\gls{RBM}和\\gls{DBN}的\\gls{partition_function}。\n\n\n关于\\,\\glssymbol{AIS}\\,估计性质（例如，方差和效率）的讨论，请参看~\\cite{Neal-2001}。\n\n\n\\subsection{\\glsentrytext{bridge_sampling}}\n\\label{sec:bridge_sampling}\n类似于\\,\\glssymbol{AIS}，\\gls{bridge_sampling}~\\citep{Bennet76}是另一种处理\\gls{importance_sampling}缺点的方法。\n并非将一系列中间分布连接在一起，\\gls{bridge_sampling}依赖于单个分布$p_*$（被称为桥），在已知\\gls{partition_function}的分布$p_0$和分布$p_1$（我们试图估计其\\gls{partition_function} $Z_1$）之间插值。\n\n\n\\gls{bridge_sampling}估计比率$Z_1 / Z_0$：$\\tilde{p}_0$和$\\tilde{p}_*$之间重要性权重期望与$\\tilde{p}_1$和$\\tilde{p}_*$之间重要性权重的比率，\n\\begin{equation}\n\t\\frac{Z_1}{ Z_0} \\approx \\sum_{k=1}^K \\frac{ \\tilde{p}_*(\\Vx_0^{(k)}) }{ \\tilde{p}_0(\\Vx_0^{(k)}) } \\bigg/ \\sum_{k=1}^K \\frac{ \\tilde{p}_*(\\Vx_1^{(k)}) }{ \\tilde{p}_1(\\Vx_1^{(k)}) } .\n\\end{equation}\n如果仔细选择\\gls{bridge_sampling} $p_*$，使其与$p_0$和$p_1$都有很大重合的话，那么\\gls{bridge_sampling}能够允许两个分布（或更正式地，$D_{\\text{KL}}(p_0 \\| p_1)$）之间有较大差距（相对标准\\gls{importance_sampling}而言）。\n\n% -- 620 --\n\n可以表明，最优的\\gls{bridge_sampling}是$p_*^{(opt)} (\\RVx) \\propto \\frac{ \\tilde{p}_0(\\Vx) \\tilde{p}_1(\\Vx) }{ r\\tilde{p}_0(\\Vx) + \\tilde{p}_1(\\Vx) }$，其中$r = Z_1 / Z_0$。\n这似乎是一个不可行的解决方案，因为它似乎需要我们估计数值$Z_1 / Z_0$。\n然而，可以从粗糙的$r$开始估计，然后使用得到的\\gls{bridge_sampling}逐步迭代以改进估计~\\citep{Neal05estimatingratios}。\n也就是说，我们会迭代地重新估计比率，并使用每次迭代更新$r$的值。\n\n\n\\paragraph{\\gls{linked_importance_sampling}}\n\\glssymbol{AIS}\\,和\\gls{bridge_sampling}各有优点。\n如果$D_{\\text{KL}}(p_0 \\| p_1)$不太大（由于$p_0$和$p_1$足够接近）的话，那么\\gls{bridge_sampling}能比\\,\\glssymbol{AIS}\\,更高效地估计\\gls{partition_function}比率。\n然而，如果对于单个分布$p_*$而言，两个分布相距太远难以桥接差距，那么\\,\\glssymbol{AIS}\\,至少可以使用许多潜在中间分布来跨越$p_0$和$p_1$之间的差距。\n\\cite{Neal05estimatingratios}展示\\gls{linked_importance_sampling}方法如何利用\\gls{bridge_sampling}的优点，桥接\\,\\glssymbol{AIS}\\,中使用的中间分布，并且显著改进了整个\\gls{partition_function}的估计。\n\n\n\\paragraph{在训练期间估计\\gls{partition_function}}\n虽然\\,\\glssymbol{AIS}\\,已经被认为是用于估计许多无向模型\\gls{partition_function}的标准方法，但是它在计算上代价很高，以致其在训练期间仍然不很实用。\n研究者探索了一些在训练过程中估计\\gls{partition_function}的替代方法。\n\n\n使用\\gls{bridge_sampling}、短链\\,\\glssymbol{AIS}\\,和\\gls{parallel_tempering}的组合，\\cite{Desjardins+al-NIPS2011}设计了一种在训练过程中追踪\\,\\glssymbol{RBM}\\,\\gls{partition_function}的方法。\n该策略的基础是，在\\gls{parallel_tempering}方法操作的每个温度下，\\glssymbol{RBM}\\,\\gls{partition_function}的独立估计会一直保持。\n作者将相邻链（来自\\gls{parallel_tempering}）的\\gls{partition_function}比率的\\gls{bridge_sampling}估计和跨越时间的\\,\\glssymbol{AIS}\\,估计组合起来，提出一个在每次迭代学习时估计\\gls{partition_function}的（且方差较小的）方法。\n\n\n本章中描述的工具提供了许多不同的方法，以解决难处理的\\gls{partition_function}问题，但是在训练和使用\\gls{generative_model}时，可能会存在一些其他问题。\n其中最重要的是我们接下来会遇到的难以推断的问题。\n\n% -- 621 --\n"
  },
  {
    "path": "Chapter19/README.md",
    "content": "#第十九章笔记\n"
  },
  {
    "path": "Chapter19/annotations.txt",
    "content": "{'user': 'acct:caszhang@hypothes.is', 'text': '推断困难通常是指', 'origin_text': '通常我们有一系列可见变量vv\\\\Vv和一系列潜变量 hh\\\\Vh。  !!!难以推断的原因在于!!!  难以计算p(h∣v)p(h∣v)p(\\\\Vh\\\\mid\\\\Vv)或其期', 'time': '2017-03-12T00:54'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '最大似然参数学习', 'origin_text': 'v)p(\\\\Vh\\\\mid\\\\Vv)或其期望。而这样的操作在一些诸如  !!!最大似然估计!!!  的任务中往往是必需的。许多仅含一层的简单图模型会定义成易', 'time': '2017-03-12T00:56'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '一个隐藏层', 'origin_text': '操作在一些诸如最大似然估计的任务中往往是必需的。许多仅含  !!!一层!!!  的简单图模型会定义成易于计算p(h∣v)p(h∣v)p(\\\\Vh\\\\', 'time': '2017-03-12T00:56'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '删去', 'origin_text': '如稀疏编码，也存在着这样的问题。在本章中，我们将会介绍几个  !!!基本的!!!  技巧，用来解决这些难以处理的推断问题。稍后，在\\\\chap?中，', 'time': '2017-03-12T00:58'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '因有了这些训练技巧才变得易于处理的概率模型', 'origin_text': '决这些难以处理的推断问题。稍后，在\\\\chap?中，我们还将描述  !!!如何将这些技巧应用到训练其他方法难以奏效的概率模型!!!  中，如深度信念网络、深度玻尔兹曼机。在深度学习中难以处理的', 'time': '2017-03-13T03:26'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '某个可见变量的多个祖先之间', 'origin_text': '。这些相互作用可能是无向模型的直接相互作用，也可能是有向模型中  !!!同一个可见变量的共同祖先之间!!!  的”相消解释”作用。 %?? explaining away 翻', 'time': '2017-03-12T01:05'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '产生这些相互作用可能是因为潜变量间直接相连，也可能是因为观察某V-结构的子节点时，它们通过更长的激活路径相连', 'origin_text': '习中难以处理的推断问题通常是由于结构化图模型中潜变量的相互作用。  !!!这些相互作用产生于一个潜变量与另一个潜变量或者当V-结构的子节点可观察时与更长的激活路径相连!!!  。\\\\emph{(左)}一个隐藏单元存在连接的半受限波尔兹曼机~{', 'time': '2017-03-14T03:15'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '把推断视作优化问题', 'origin_text': '分布）依然能够进行简单的推断。}\\\\end{figure}  !!!推断是一个优化问题!!!  许多难以利用观察值进行精确推断的问题往往可以描述为一个优', 'time': '2017-03-13T06:42'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '精确推断问题可以描述为一个优化问题，有许多方法正是由此解决了推断的困难', 'origin_text': '断。}\\\\end{figure}推断是一个优化问题  !!!许多难以利用观察值进行精确推断的问题往往可以描述为一个优化问题!!!  。通过近似这样一个潜在的优化问题，我们往往可以推导出近似推断算', 'time': '2017-03-13T06:45'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '对数概率', 'origin_text': 'v\\\\Vv和潜变量 hh\\\\Vh的概率模型。我们希望计算观察数据的  !!!概率对数!!!  logp(v;θ)log\\u2061p(v;θ)\\\\log p(\\\\Vv;\\\\V', 'time': '2017-03-13T06:46'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '会难以', 'origin_text': 'theta)。有时候如果边缘化消去hh\\\\Vh的操作很费时，我们  !!!通常很难!!!  计算logp(v;θ)log\\u2061p(v;θ)\\\\log p(\\\\Vv;', 'time': '2017-03-13T06:47'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '存在包含大量潜变量的团（有歧义）', 'origin_text': ')}一个隐藏单元存在连接的半受限波尔兹曼机~{cite?}。由于  !!!存在大量潜变量的团!!!  ，潜变量的直接连接使得后验分布难以处理。\\\\emph{(中)}一个', 'time': '2017-03-13T06:49'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '一个深度玻尔兹曼机，变量分为若干层，且不存在层内连接', 'origin_text': '的团，潜变量的直接连接使得后验分布难以处理。\\\\emph{(中)}  !!!一个深度玻尔兹曼机，被分层从而使得不存在层内连接!!!  ，由于层之间的连接其后验分布仍然难以处理。\\\\emph{(右)}当', 'time': '2017-03-13T06:51'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '被', 'origin_text': '之间的连接其后验分布仍然难以处理。\\\\emph{(右)}当可见变量  !!!可!!!  观察时这个有向模型的潜变量之间存在相互作用，因为每两个潜变量都是', 'time': '2017-03-13T06:51'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '如果我们选择条件概率分布来引入图结构描述的之外的独立性就可能出现这种情况。【这句话是接着上一句话说的】', 'origin_text': '种结构，一些概率模型依然能够获得易于处理的关于潜变量的后验分布。  !!!如果我们选择条件概率分布来引入相对于图结构描述的额外的独立性这种情况也是可能出现的。!!!  举个例子，概率PCA的图结构如右图所示，然而由于其条件分布的特殊', 'time': '2017-03-13T06:54'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '且', 'origin_text': 'Vv,{\\\\Vtheta},q)之间的距离是由\\\\,KL散度来衡量的  !!!。因为!!!  \\\\,KL散度总是非负的，我们可以发现LL\\\\CalL总是小于等于所', 'time': '2017-03-13T06:55'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '对数概率', 'origin_text': 'KL散度总是非负的，我们可以发现LL\\\\CalL总是小于等于所求的  !!!概率对数!!!  。当且仅当分布qqq完全相等于p(h∣v)p(h∣v)p(\\\\V', 'time': '2017-03-13T06:56'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '方便', 'origin_text': '简单。通过简单的代数运算我们可以把LL\\\\CalL重写成一个更加  !!!简单!!!  的形式：L(v,θ,q)=logp(v;θ)−DKL(q(h', 'time': '2017-03-13T06:56'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '使用并不彻底的优化方法来使得优化的过程更加高效（却更粗略），不求彻底地最大化L，而只要显著地提升L。', 'origin_text': '推导出不同形式的近似推断。我们可以通过限定分布qqq的形式或者  !!!使用并不彻底的优化方法来使得优化的过程更加高效（却更粗略），但是优化的结果是不完美的，因为只能显著地提升LL\\\\CalL而无法彻底地最大化LL\\\\CalL。!!!  无论我们选择什么样的分布qqq，LL\\\\CalL始终是一个下', 'time': '2017-03-13T07:05'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'E（期望）', 'origin_text': '算法。EM算法由交替迭代直到收敛的两步运算组成：    !!!E!!!  步: 令θ(0)θ(0){\\\\Vtheta^{(0)}}表示在这一', 'time': '2017-03-13T07:08'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'M（最大化）', 'origin_text': ')p(\\\\Vh\\\\mid\\\\Vv;\\\\Vtheta^{(0)})。    !!!M!!!  步：使用选择的优化算法完全地或者部分地最大化关于θθ\\\\Vthet', 'time': '2017-03-13T07:08'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '关于$\\\\theta$最大化', 'origin_text': 'a^{(0)})。  M步：使用选择的优化算法完全地或者部分地  !!!最大化关于θθ\\\\Vtheta的!!!  ∑iL(v(i),θ,q).∑iL(v(i),θ,q).\\\\be', 'time': '2017-03-13T07:09'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '尽管', 'origin_text': '，不同于其他方法，在给定当前qqq的情况下直接求出最优解。  !!!即使!!!  E步采用的是精确推断，我们仍然可以将\\\\,EM\\\\,算法视作是某种程', 'time': '2017-03-13T07:12'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '带给我们几个见解', 'origin_text': '入下一个循环时，E步把这种差距又降到了000。EM\\\\,算法  !!!还包含一些不同的解释!!!  。首先，学习过程的一个基本思路就是，我们通过更新模型参数来提高', 'time': '2017-03-13T07:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '它包含了学习过程的基本框架', 'origin_text': '又降到了000。EM\\\\,算法还包含一些不同的解释。首先，  !!!学习过程的一个基本思路就是!!!  ，我们通过更新模型参数来提高整个数据集的似然，其中缺失变量的值是', 'time': '2017-03-13T07:16'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '这点并不是EM算法独有的', 'origin_text': '提高整个数据集的似然，其中缺失变量的值是通过后验分布来估计的。  !!!这种特定的性质并不仅仅适用于\\\\,EM\\\\,算法!!!  。例如，使用梯度下降来最大化似然函数的对数的方法也利用了相同的', 'time': '2017-03-13T07:17'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '也有这种特点', 'origin_text': ',EM\\\\,算法。例如，使用梯度下降来最大化似然函数的对数的方法  !!!也利用了相同的性质!!!  。计算对数似然函数的梯度需要对隐藏单元的后验分布求期望。 E', 'time': '2017-03-13T07:17'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '带来的另一个见解', 'origin_text': '数似然函数的梯度需要对隐藏单元的后验分布求期望。 EM\\\\,算法  !!!另一个关键的性质!!!  是当我们移动到另一个θθ\\\\Vtheta时候，我们仍然可以使用旧的', 'time': '2017-03-13T07:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '很难求解最优的大M步更新', 'origin_text': '时候得到了广泛的应用。在深度学习中，大多数模型太过于复杂以致于  !!!在最优大\\\\,M步更新中很难得到一个简单的解!!!  。所以\\\\,EM\\\\,算法的第二个特质，更多为其所独有，较少被使用', 'time': '2017-03-13T07:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '很难求解最优的大M步更新', 'origin_text': '时候得到了广泛的应用。在深度学习中，大多数模型太过于复杂以致于  !!!在最优大\\\\,M步更新中很难得到一个简单的解!!!  。所以\\\\,EM\\\\,算法的第二个特质，更多为其所独有，较少被使用', 'time': '2017-03-13T07:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '带来的这第二个见解', 'origin_text': '最优大\\\\,M步更新中很难得到一个简单的解。所以\\\\,EM\\\\,算法  !!!的第二个特质!!!  ，更多为其所独有，较少被使用。最大后验推断和稀疏编码', 'time': '2017-03-13T07:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '做单遍(single-pass)传递（论文原文：The algorithm learns a separate “recognition” model that is used to quickly initialize, in a single bottom-up pass, the values of\\nthe latent variables in all hidden layers. We show\\nthat using such a recognition model, followed\\nby a combined top-down and bottom-up pass,\\nit is possible to efficiently learn a good generative\\nmodel of high-dimensional highly-structured\\nsensory input.）', 'origin_text': 'inov+Larochelle-2010}证明了在学成推断网络中  !!!的单一路径!!!  相比于在深度玻尔兹曼机中的迭代均值场不动点方程能够得到更快的推断', 'time': '2017-03-13T07:33'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '很多不同', 'origin_text': 'ec?中详细介绍这种模型。我们可以使用近似推断来训练和使用  !!!大量!!!  的模型。其中许多模型将在下一章中描述。       ', 'time': '2017-03-13T07:43'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '未知变量的最可能值', 'origin_text': 'h∣v)p(\\\\Vh\\\\mid\\\\Vv)。另一种可选的推断形式是计算  !!!一个最有可能的潜变量值!!!  来代替在所有可能值的完整分布上的推断。在潜变量模型中，这意味着', 'time': '2017-03-13T07:48'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '我们通常不视MAP推断为', 'origin_text': 'nd{align}这被称作最大后验推断，简称MAP推断。  !!!MAP\\\\,推断并不是!!!  一种近似推断，它只是精确地计算了最有可能的一个h∗h∗\\\\Vh^*', 'time': '2017-03-13T07:49'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '如果我们希望设计一个最大化L(v,h,q)的学习过程，那么把MAP推断视作一个给出q值的过程则很有帮助', 'origin_text': '断，它只是精确地计算了最有可能的一个h∗h∗\\\\Vh^*。然而，  !!!如果我们希望能够最大化L(v,h,q)L(v,h,q)\\\\CalL(\\\\Vv,\\\\Vh,q)，那么我们可以把\\\\,MAP\\\\,推断看成是输出一个qqq值的学习过程!!!  。%是很有帮助的。在这种情况下，我们可以将\\\\,MAP\\\\,推断看', 'time': '2017-03-13T07:52'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '是无意义的（vacuously true“空真”）', 'origin_text': 'lL是是是\\\\log p(\\\\Vv)的下界。在MAP推断中，这个保证  !!!是无效的!!!  ，因为这个界会无限地松，由于Dirac分布的熵的微分趋近于负无穷', 'time': '2017-03-13T07:59'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '证明', 'origin_text': 'Vh\\\\mid\\\\Vv).\\\\end{align}因此我们能够  !!!解释!!!  一种类似于\\\\,EM\\\\,算法的学习算法，其中我们轮流迭代两步，一步', 'time': '2017-03-13T08:15'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '它主要用于稀疏编码模型', 'origin_text': '推断作为特征提取器以及一种学习机制被广泛地应用在了深度学习中。  !!!在稀疏编码模型中，它起到了关键作用!!!  。我们回过头来看\\\\sec?中的稀疏编码，稀疏编码是一种在隐', 'time': '2017-03-13T08:15'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '加入**诱导**稀疏性(sparsity-inducing)的先验', 'origin_text': '我们回过头来看\\\\sec?中的稀疏编码，稀疏编码是一种在隐藏单元上  !!!加上了鼓励稀疏的先验知识!!!  的线性因子模型。一个常用的选择是可分解的Laplace先验，表', 'time': '2017-03-13T08:18'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '是高斯模型', 'origin_text': '\\\\mid\\\\Vv)中所有的隐藏单元都包含在了一个巨大的团中。如果  !!!模型是高斯!!!  ，那么这些相互作用关系可以通过协方差矩阵来高效地建模。然而稀疏', 'time': '2017-03-13T08:20'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '并不服从高斯分布', 'origin_text': '通过协方差矩阵来高效地建模。然而稀疏型先验使得这些相互作用关系  !!!并不是高斯!!!  。分布p(x∣h)p(x∣h)p(\\\\Vx\\\\mid\\\\Vh)的', 'time': '2017-03-13T08:26'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '难处理性', 'origin_text': '。分布p(x∣h)p(x∣h)p(\\\\Vx\\\\mid\\\\Vh)的  !!!复杂性!!!  导致了似然函数的对数及其梯度也很难得到。因此我们不能使用精确的', 'time': '2017-03-13T08:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '对数似然', 'origin_text': 'p(x∣h)p(x∣h)p(\\\\Vx\\\\mid\\\\Vh)的复杂性导致了  !!!似然函数的对数!!!  及其梯度也很难得到。因此我们不能使用精确的最大似然估计来进行学', 'time': '2017-03-13T08:27'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '拼成矩阵$\\\\MH$', 'origin_text': '\\\\,来学习模型参数。如果我们将训练集中所有的向量hh\\\\Vh  !!!拼在一起并且记为HH\\\\MH!!!  ，并将所有的向量vv\\\\Vv拼起来组成矩阵VV\\\\MV，那么稀疏编码', 'time': '2017-03-13T08:28'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '交替地关于H和W做最小化', 'origin_text': '用包含了权重衰减或者对HH\\\\MH列范数的限制。我们可以通过  !!!交替迭代最小化JJJ分别关于HH\\\\MH和WW\\\\MW的方式!!!  来最小化JJJ。两个子问题都是凸的。事实上，关于WW\\\\MW的', 'time': '2017-03-13T08:33'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '通常不是', 'origin_text': '就是一个线性回归问题。然而关于这两个变量同时最小化JJJ的问题  !!!并不是!!!  凸的。关于HH\\\\MH的最小化问题需要某些特别设计的算法，例', 'time': '2017-03-13T08:33'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成隐变量，并保持统一，后面既有“隐藏变量”又有“潜变量”，不同意。', 'origin_text': '形式，例如受限玻尔兹曼机和概率PCA。不幸的是，大多数具有多层  !!!隐藏变量!!!  的图模型的后验分布都很难处理。对于这些模型而言，精确推断算法需', 'time': '2017-03-14T12:47'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改成隐变量', 'origin_text': '曼机。在深度学习中难以处理的推断问题通常源于结构化图模型中  !!!潜变量!!!  之间的相互作用。可以参考\\\\fig?的几个例子。这些相互作用可', 'time': '2017-03-14T12:47'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“隐变量”', 'origin_text': '为了构造这样一个优化问题，假设我们有一个包含可见变量vv\\\\Vv和  !!!潜变量 !!!  hh\\\\Vh的概率模型。我们希望计算观察数据的概率对数logp(', 'time': '2017-03-14T12:48'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“隐变量”', 'origin_text': '介绍的第一个最大化下界\\ue238L\\\\CalL的算法是期望最大化算法。在  !!!潜变量!!!  模型中，这是一个非常常见的训练算法。在这里我们描述 {emvi', 'time': '2017-03-14T12:52'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '其实不太明白原文的“make large learning steps”是啥意思，所以总觉得这个中文翻译太过于直译。', 'origin_text': '我们也讲到了\\\\,EM\\\\,算法在给定了分布qqq的条件下能够进行  !!!大学习步骤!!!  ，而基于\\\\,MAP\\\\,推断的学习算法则是学习一个p(h∣v)p(', 'time': '2017-03-14T13:18'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议去掉“完整的”', 'origin_text': ')p(h∣v)p(\\\\Vh \\\\mid \\\\Vv)的点估计而非推断整个  !!!完整的!!!  分布。在这里我们介绍一些变分学习中更加通用的算法。变分学', 'time': '2017-03-14T13:18'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“在一个关于q的有约束的分布族上”', 'origin_text': '绍一些变分学习中更加通用的算法。变分学习的核心思想就是我们  !!!通过选择给定有约束的分布族中一个分布q!!!  qq来最大化\\ue238L\\\\CalL。选择这个分布族时应该考虑到计算𝔼', 'time': '2017-03-14T13:24'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '鼓励', 'origin_text': 'text{model}})。如\\\\fig?所示，这意味着最大似然  !!!促进!!!  模型在每一个数据达到更高概率的地方达到更高的概率，而基于优化的推', 'time': '2017-03-14T13:27'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“高”', 'origin_text': ')。如\\\\fig?所示，这意味着最大似然促进模型在每一个数据达到  !!!更高!!!  概率的地方达到更高的概率，而基于优化的推断则促进了qqq在每一个', 'time': '2017-03-14T13:29'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“高”', 'origin_text': '所示，这意味着最大似然促进模型在每一个数据达到更高概率的地方达到  !!!更高!!!  的概率，而基于优化的推断则促进了qqq在每一个真实后验分布概率较', 'time': '2017-03-14T13:29'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议模型就用“model”，因为上面的公式里使用的model，否则读起来很难理解，后面的data同理。', 'origin_text': 'xt{model}})。如\\\\fig?所示，这意味着最大似然促进  !!!模型!!!  在每一个数据达到更高概率的地方达到更高的概率，而基于优化的推断则', 'time': '2017-03-14T13:30'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“data”', 'origin_text': 'el}})。如\\\\fig?所示，这意味着最大似然促进模型在每一个  !!!数据!!!  达到更高概率的地方达到更高的概率，而基于优化的推断则促进了qqq', 'time': '2017-03-14T13:30'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '鼓励', 'origin_text': '在每一个数据达到更高概率的地方达到更高的概率，而基于优化的推断则  !!!促进!!!  了qqq在每一个真实后验分布概率较低的地方概率较小。这两种基于', 'time': '2017-03-14T13:32'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“低”', 'origin_text': '高的概率，而基于优化的推断则促进了qqq在每一个真实后验分布概率  !!!较低!!!  的地方概率较小。这两种基于\\\\,KL散度的方法都有各自的优点与缺', 'time': '2017-03-14T13:32'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“小”', 'origin_text': '于优化的推断则促进了qqq在每一个真实后验分布概率较低的地方概率  !!!较小!!!  。这两种基于\\\\,KL散度的方法都有各自的优点与缺点。选择哪一', 'time': '2017-03-14T13:32'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '数学推导过程非常详细', 'origin_text': '统、通用的均值场方法，而原文作者采用了一种特殊设计的算法）中。  !!!推导过程在数学上非常详细!!!  ，为希望完全了解我们描述过的变分推断和学习高级概念描述的读者所准', 'time': '2017-03-14T14:38'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改为“变分推断和变分学习的”，否则一个单独的“学习”容易在此处有歧义，“variational inference and learning”下文多处也都建议翻译成“变分推断和变分学习”', 'origin_text': '算法）中。推导过程在数学上非常详细，为希望完全了解我们描述过的  !!!变分推断和学习!!!  高级概念描述的读者所准备。而对于并不计划推导或者实现变分学习算', 'time': '2017-03-14T15:00'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议去掉这几个字，否则怎么翻译，这句话读起来都费劲', 'origin_text': '种特殊设计的算法）中。推导过程在数学上非常详细，为希望完全了解  !!!我们描述过的!!!  变分推断和学习高级概念描述的读者所准备。而对于并不计划推导或者', 'time': '2017-03-14T14:38'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '这并不会遗漏新的高级概念。', 'origin_text': '导或者实现变分学习算法的读者来说，可以放心跳过，直接阅读下一节，  !!!这并不会导致新的高级概念的遗漏!!!  。建议那些从事二值稀疏编码研究的读者可以重新看一下\\\\sec?中', 'time': '2017-03-14T14:41'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': 'variable elimination一般翻译成“变量消去”算法，可参考周志华的西瓜书。消元法一般有特定的含义，多指代数里的高斯消元法，不建议此处翻译成“消元算法”。', 'origin_text': '单元的后验分布对应的是关于隐藏单元的完全图，所以相对于暴力算法，  !!!消元算法!!!  并不能有助于提高计算所需要的期望的效率。\\\\begin{fi', 'time': '2017-03-14T14:48'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改为“期望的效率”，去掉“所需要的”，否则容易把此处的期望误理解成“希望的”，而不是原文想表达的统计上的期望。', 'origin_text': '藏单元的完全图，所以相对于暴力算法，消元算法并不能有助于提高计算  !!!所需要的期望的效率!!!  。\\\\begin{figure}[!htb]\\\\ifOpenS', 'time': '2017-03-14T14:50'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '感觉去掉“分布”更好理解', 'origin_text': '分布。为了解决这个问题，我们需要使用一个拉格朗日乘子来添加一个  !!!分布!!!  p(x)p(x)p(x)积分值为111的约束。同样地，当方差增', 'time': '2017-03-14T15:05'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '原文的那句话没太理解，但是这个翻译明显感觉也不对，可以求助高人。', 'origin_text': '的分布时总是使用正态分布的一个原因。因为正态分布拥有最大的熵，  !!!我们通过这个假定来保证了最小可能量的结构!!!  。当寻找熵的拉格朗日泛函的临界点并且给定一个固定的方差时，', 'time': '2017-03-14T15:09'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '此处and直接变成“，”就行', 'origin_text': 'a和x=μ−σx=μ−σx = \\\\mu - \\\\sigma两个点上  !!!和!!!  越少的概率密度到其他点上时，它们的熵值会减少，而方差却不变。然', 'time': '2017-03-14T15:12'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '合并没合并好吧', 'origin_text': '减小了p(h∣v)p(h∣v)p(\\\\Vh\\\\mid\\\\Vv)。  !!!这种行为使得我们做的近似假设变得合理。 %这种行为使我们的近似假设成为自我实现!!!  。如果我们用单峰值近似后验来训练模型，我们将获得一个真实后验的', 'time': '2017-03-14T15:17'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '去掉“由于”', 'origin_text': '我们使用精确推断训练模型获得的模型更接近单峰值。因此，估计  !!!由于!!!  变分近似对模型的破坏程度是很困难的。存在几种估计logp(v)', 'time': '2017-03-14T15:18'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改为“泛函”', 'origin_text': '。学成近似推断我们已经看到了推断可以被视作一个增加  !!!函数!!!  \\ue238L\\\\CalL值的优化过程。显式地通过迭代方法（比如不动点方程', 'time': '2017-03-14T15:21'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改成“用一个神经网络来近似f(v;theta)”', 'origin_text': 'f。一旦我们将多步的迭代优化过程看作是一个函数，我们可以用一个  !!!近似函数为f̂\\xa0(v;θ)f^(v;θ)\\\\hat{f}(\\\\Vv;{\\\\Vtheta})的神经网络来近似它!!!  。醒眠算法%?? wake_sleep 翻译成  醒眠  ', 'time': '2017-03-14T15:23'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '没合并好', 'origin_text': '(\\\\Vv;{\\\\Vtheta})的神经网络来近似它。醒眠算法  !!!%?? wake_sleep 翻译成  醒眠  你斟酌下!!!  训练一个可以用vv\\\\Vv来推断hh\\\\Vh的模型的一个主要难', 'time': '2017-03-14T15:23'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '没合并好', 'origin_text': '(\\\\Vv;{\\\\Vtheta})的神经网络来近似它。醒眠算法  !!!%?? wake_sleep 翻译成  醒眠  你斟酌下!!!  训练一个可以用vv\\\\Vv来推断hh\\\\Vh的模型的一个主要难', 'time': '2017-03-14T15:27'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改为“睡眠‘', 'origin_text': '具有在类似数据的样本上学习的机会。在\\\\sec?中，我们看到  !!!睡眠做梦!!!  在人类和动物中作用的一个可能解释是，做梦可以提供蒙特卡罗训练算法', 'time': '2017-03-14T15:27'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '没合并好', 'origin_text': '(\\\\Vv;{\\\\Vtheta})的神经网络来近似它。醒眠算法  !!!%?? wake_sleep 翻译成  醒眠  你斟酌下!!!  训练一个可以用vv\\\\Vv来推断hh\\\\Vh的模型的一个主要难', 'time': '2017-03-14T15:27'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议翻译成”无向图模型“', 'origin_text': '动物中作用的一个可能解释是，做梦可以提供蒙特卡罗训练算法用于近似  !!!无向模型!!!  中对数配分函数负梯度的负相样本。生物做梦的另一个可能解释是它提', 'time': '2017-03-14T15:28'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '这个翻译不知道是否OK，但是建议后面加个”的“', 'origin_text': '的一个可能解释是，做梦可以提供蒙特卡罗训练算法用于近似无向模型中  !!!对数配分函数!!!  负梯度的负相样本。生物做梦的另一个可能解释是它提供来自p(h,', 'time': '2017-03-14T15:28'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '建议改为”这可以用于训练出一个在给定V的情况下预测h的推断网络“', 'origin_text': '是它提供来自p(h,v)p(h,v)p(\\\\Vh,\\\\Vv)的样本，  !!!这可以用于训练推断网络在给定vv\\\\Vv的情况下预测h!!!  h\\\\Vh。在某些意义上，这种解释比配分函数的解释更令人满意。', 'time': '2017-03-14T15:29'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '不太明白原文，但是感觉这里翻译的不好，建议请教专家', 'origin_text': '种解释比配分函数的解释更令人满意。如果蒙特卡罗算法仅使用梯度的  !!!正相运行!!!  几个步骤，然后仅对梯度的负相运行几个步骤，那么结果通常不会很好。', 'time': '2017-03-14T15:31'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '添加一个”既“\\n', 'origin_text': '如果生物做梦的作用是训练网络来预测qqq，那么这解释了动物如何  !!!能够!!!  保持清醒几个小时（它们清醒的时间越长，\\ue238L\\\\CalL和logp', 'time': '2017-03-14T15:33'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改为”又能够“', 'origin_text': ' p(\\\\Vv)之间的差距越大， 但是\\ue238L\\\\CalL仍然是下限）  !!!并且!!!  睡眠几个小时（生成模型本身在睡眠期间不被修改）， 而不损害它们的', 'time': '2017-03-14T15:33'}\n\n=============================   Replies   =============================\n\n"
  },
  {
    "path": "Chapter19/approximate_inference.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Tianfan Fu \n\\chapter{\\glsentrytext{approximate_inference}}\n\\label{chap:approximate_inference}\n% 623\n\n\n许多概率模型很难训练的原因是很难进行推断。\n在\\gls{DL}中，通常我们有一系列可见变量$\\Vv$和一系列\\gls{latent_variable} $\\Vh$。\n推断困难通常是指难以计算$p(\\Vh\\mid\\Vv)$或其期望。\n而这样的操作在一些诸如最大似然学习的任务中往往是必需的。\n\n% 623\n\n许多仅含一个\\gls{hidden_layer}的简单\\gls{graphical_models}会定义成易于计算$p(\\Vh\\mid\\Vv)$或其期望的形式，例如\\gls{RBM}和\\gls{PPCA}。\n不幸的是，大多数具有多层\\gls{hidden_variable}的\\gls{graphical_models}的后验分布都很难处理。\n对于这些模型而言，精确推断算法需要指数量级的运行时间。\n即使一些只有单层的模型，如\\gls{sparse_coding}，也存在着这样的问题。\n% 623\n\n\n在本章中，我们将会介绍几个用来解决这些难以处理的推断问题的技巧。\n稍后，在\\chapref{chap:deep_generative_models}中，我们还将描述如何将这些技巧应用到训练其他方法难以奏效的概率模型中，如\\gls{DBN}、\\gls{DBM}。\n% 623\n\n\n在\\gls{DL}中难以处理的推断问题通常源于结构化图模型中\\gls{latent_variable}之间的相互作用。\n读者可以参考\\figref{fig:intractable_graphs}的几个例子。\n这些相互作用可能是\\gls{undirected_model}的直接相互作用，也可能是\\gls{directed_model}中同一个可见变量的共同祖先之间的``\\gls{explaining_away}''作用。\n% 623 end\n\n\n\n% 624 head\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter19/figures/intractable_graphs}}\n\\fi\n\\caption{\\gls{DL}中难以处理的推断问题通常是由于结构化图模型中\\gls{latent_variable}的相互作用。\n这些相互作用产生于一个\\gls{latent_variable}与另一个\\gls{latent_variable}或者当\\gls{vstructure}的子节点可观察时与更长的激活路径相连。\n\\emph{(左)}一个\\gls{hidden_unit}存在连接的\\firstgls{srbm}~\\citep{Osindero+Hinton-2008}。\n由于存在大量\\gls{latent_variable}的\\gls{clique}，\\gls{latent_variable}的直接连接使得后验分布难以处理。\n\\emph{(中)}一个\\gls{DBM}，被分层从而使得不存在层内连接，由于层之间的连接其后验分布仍然难以处理。\n\\emph{(右)}当可见变量可观察时这个有向模型的\\gls{latent_variable}之间存在相互作用，因为每两个\\gls{latent_variable}都是\\gls{coparent}。\n即使拥有上图中的某一种结构，一些概率模型依然能够获得易于处理的关于\\gls{latent_variable}的后验分布。\n如果我们选择条件概率分布来引入相对于图结构描述的额外的独立性这种情况也是可能出现的。\n举个例子，\\gls{PPCA}的图结构如右图所示，然而由于其条件分布的特殊性质（带有相互正交基向量的线性高斯条件分布）依然能够进行简单的推断。}\n\\label{fig:intractable_graphs}\n\\end{figure}\n% 624 head\n\n\n\n\\section{把推断视作优化问题}\n\\label{sec:inference_as_optimization}\n% 624\n\n% 许多难以利用观察值进行精确推断的问题往往可以描述为一个优化问题。\n精确推断问题可以描述为一个优化问题，有许多方法正是由此解决了推断的困难。\n通过近似这样一个潜在的优化问题，我们往往可以推导出\\gls{approximate_inference}算法。\n% 624\n\n\n为了构造这样一个优化问题，假设我们有一个包含可见变量$\\Vv$和\\gls{latent_variable} $\\Vh$的概率模型。\n我们希望计算观察数据的对数概率$\\log p(\\Vv;\\Vtheta)$。\n有时候如果边缘化消去$\\Vh$的操作很费时，我们会难以计算$\\log p(\\Vv;\\Vtheta)$。\n作为替代，我们可以计算一个$\\log p(\\Vv;\\Vtheta)$的下界$\\CalL(\\Vv,{\\Vtheta},q)$。\n这个下界被称为\\firstall{ELBO}。\n这个下界的另一个常用名称是负\\firstgls{variational_free_energy}。\n具体地，这个\\gls{ELBO}是这样定义的：\n% 625 head \n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q) = \\log p(\\Vv;{\\Vtheta}) - D_{\\text{KL}}(q(\\Vh\\mid\\Vv) \\Vert p(\\Vh\\mid\\Vv;{\\Vtheta})),\n\\end{align}\n其中$q$是关于$\\Vh$的一个任意概率分布。\n% 625\n\n\n因为$\\log p(\\Vv)$和$\\CalL(\\Vv,{\\Vtheta},q)$之间的距离是由~\\gls{KL}来衡量的，且~\\gls{KL}总是非负的，我们可以发现$\\CalL$总是小于等于所求的对数概率。\n当且仅当分布$q$完全相等于$p(\\Vh\\mid\\Vv)$时取到等号。\n% 625\n\n\n令人吃惊的是，对于某些分布$q$，计算$\\CalL$可以变得相当简单。\n通过简单的代数运算我们可以把$\\CalL$重写成一个更加简单的形式：\n\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q) = & \\log p(\\Vv;{\\Vtheta})- D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv;{\\Vtheta})) \\\\\n= & \\log p(\\Vv;{\\Vtheta}) - \\SetE_{\\RVh\\sim q}\\log \\frac{q(\\Vh\\mid\\Vv)}{p(\\Vh\\mid\\Vv)} \\\\\n= & \\log p(\\Vv;{\\Vtheta}) -  \\SetE_{\\RVh\\sim q} \\log \\frac{q(\\Vh\\mid\\Vv) }{ \\frac{p(\\Vh,\\Vv;{\\Vtheta})}{p(\\Vv; {\\Vtheta})} } \\\\\n= & \\log p(\\Vv; {\\Vtheta}) -  \\SetE_{\\RVh\\sim q} [\\log q(\\Vh\\mid\\Vv) - \\log {p(\\Vh,\\Vv; {\\Vtheta})} + \\log {p(\\Vv; {\\Vtheta})} ]\\\\\n= & - \\SetE_{\\RVh\\sim q}[\\log q(\\Vh\\mid\\Vv) - \\log {p(\\Vh,\\Vv;{\\Vtheta})}].\n\\end{align}\n% 625\n这也给出了\\gls{ELBO}的标准定义：\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q) = \\SetE_{\\RVh\\sim q}[\\log p(\\Vh , \\Vv)] + H(q).\n\\end{align}\n\n\n对于一个选择的合适分布$q$来说，$\\CalL$是容易计算的。\n对任意分布$q$的选择来说，$\\CalL$提供了似然函数的一个下界。\n越好地近似$p(\\Vh\\mid\\Vv)$的分布$q(\\Vh\\mid\\Vv)$，得到的下界就越紧，换言之，就是与$\\log p(\\Vv)$更加接近。\n当$q(\\Vh\\mid\\Vv) = p(\\Vh\\mid\\Vv)$时，这个近似是完美的，也意味着$\\CalL(\\Vv,{\\Vtheta},q) = \\log {p(\\Vv;{\\Vtheta})} $。\n% 625\n\n\n因此我们可以将推断问题看作是找一个分布$q$使得$\\CalL$最大的过程。\n精确推断能够在包含分布$p(\\Vh\\mid\\Vv)$的函数族中搜索一个函数，完美地最大化$\\CalL$。\n在本章中，我们将会讲到如何通过近似优化寻找分布$q$的方法来推导出不同形式的\\gls{approximate_inference}。\n我们可以通过限定分布$q$的形式或者使用并不彻底的优化方法来使得优化的过程更加高效（却更粗略），但是优化的结果是不完美的，\n不求彻底地最大化$\\CalL$，而只要显著地提升$\\CalL$。\n%因为只能显著地提升$\\CalL$而无法彻底地最大化$\\CalL$。\n% 625  end\n\n\n无论我们选择什么样的分布$q$，$\\CalL$始终是一个下界。\n我们可以通过选择一个更简单或更复杂的计算过程来得到对应的更松或更紧的下界。\n通过一个不彻底的优化过程或者将分布$q$做很强的限定（并且使用一个彻底的优化过程）我们可以获得一个很差的分布$q$，但是降低了计算开销。\n% 626 head\n\n\n\\section{\\glsentrytext{EM}}\n\\label{sec:expectation_maximization}\n% 626\n\n我们介绍的第一个最大化下界$\\CalL$的算法是\\firstall{EM}算法。\n在\\gls{latent_variable}模型中，这是一个非常常见的训练算法。\n在这里我们描述 \\citet{emview} 所提出的~\\glssymbol{EM}~算法。\n与大多数我们在本章中介绍的其他算法不同的是，\\glssymbol{EM}~并不是一个\\gls{approximate_inference}算法，而是一种能够学到近似后验的算法。\n% 626\n\n\n\\glssymbol{EM}算法由交替迭代，直到收敛的两步运算组成：\n\\begin{itemize}\n\\item \\firstgls{e_step}: 令${\\Vtheta^{(0)}}$表示在这一步开始时的参数值。\n对任何我们想要训练的（对所有的或者\\gls{minibatch}数据均成立）索引为$i$的训练样本$\\Vv^{(i)}$，令$q(\\Vh^{(i)}\\mid \\Vv) = p(\\Vh^{(i)}\\mid\\Vv^{(i)};\\Vtheta^{(0)})$。\n通过这个定义，我们认为$q$在\\emph{当前}参数$\\Vtheta^{(0)}$下定义。\n如果我们改变$\\Vtheta$，那么$p(\\Vh\\mid\\Vv;\\Vtheta)$将会相应地变化，但是$q(\\Vh\\mid\\Vv)$还是不变并且等于$p(\\Vh\\mid\\Vv;\\Vtheta^{(0)})$。\n\\item \\firstgls{m_step}：使用选择的优化算法完全地或者部分地关于$\\Vtheta$最大化\n\\begin{align}\n\\sum_i \\CalL(\\Vv^{(i)},\\Vtheta,q).\n\\end{align}\n\\end{itemize}\n% 626  \n\n\n这可以被看作通过\\gls{coordinate_ascent}算法来最大化$\\CalL$。\n在第一步中，我们更新分布$q$来最大化$\\CalL$，而在另一步中，我们更新$\\Vtheta$来最大化$\\CalL$。\n% 626\n\n\n基于\\gls{latent_variable}模型的\\gls{SGA}可以被看作是一个~\\glssymbol{EM}~算法的特例，其中~\\gls{m_step}包括了单次梯度操作。\n\\glssymbol{EM}~算法的其他变种可以实现多次梯度操作。\n对一些模型族来说，\\gls{m_step}甚至可以直接推出解析解，不同于其他方法，在给定当前$q$的情况下直接求出最优解。\n% 626 end\n\n\n尽管\\gls{e_step}采用的是精确推断，我们仍然可以将~\\glssymbol{EM}~算法视作是某种程度上的\\gls{approximate_inference}。\n具体地说，\\gls{m_step}假设一个分布$q$可以被所有的$\\Vtheta$值分享。\n当~\\gls{m_step}越来越远离~\\gls{e_step}中的$\\Vtheta^{(0)}$时，这将会导致$\\CalL$和真实的$\\log p(\\Vv)$之间出现差距。\n幸运的是，在进入下一个循环时，\\gls{e_step}把这种差距又降到了$0$。\n% 627 head\n\n\n\n\\glssymbol{EM}~算法还包含一些不同的见解。\n首先，它包含了学习过程的一个基本框架，就是我们通过更新模型参数来提高整个数据集的似然，其中缺失变量的值是通过后验分布来估计的。\n这种特定的性质并非~\\glssymbol{EM}~算法独有的。\n例如，使用\\gls{GD}来最大化对数似然函数的方法也有相同的性质。\n计算对数似然函数的梯度需要对\\gls{hidden_unit}的后验分布求期望。 \n\\glssymbol{EM}~算法另一个关键的性质是当我们移动到另一个$\\Vtheta$时候，我们仍然可以使用旧的分布$q$。\n在传统\\gls{ML}中，这种特有的性质在推导大~\\gls{m_step}更新时候得到了广泛的应用。\n在\\gls{DL}中，大多数模型太过于复杂以致于在最优大~\\gls{m_step}更新中很难得到一个简单的解。\n所以~\\glssymbol{EM}~算法的第二个特质，更多为其所独有，较少被使用。\n% 627\n\n\n\\section{\\glsentrytext{MAP}推断和\\glsentrytext{sparse_coding}}\n\\label{sec:map_inference_and_sparse_coding}\n% 627\n\n\n我们通常使用\\firstgls{inference}这个术语来指代给定一些其他变量的情况下计算某些变量概率分布的过程。\n当训练带有\\gls{latent_variable}的概率模型时，我们通常关注于计算$p(\\Vh\\mid\\Vv)$。\n另一种可选的推断形式是计算一个缺失变量的最可能值来代替在所有可能值的完整分布上的推断。\n在\\gls{latent_variable}模型中，这意味着计算\n\\begin{align}\n\\Vh^* = \\underset{\\Vh}{\\arg\\max} \\ \\  p(\\Vh\\mid\\Vv).\n\\end{align}\n这被称作\\firstgls{MAP}推断，简称~\\glssymbol{MAP}~推断。\n% 627  \n\n\n\n\\glssymbol{MAP}~推断并不被视作是一种\\gls{approximate_inference}，它只是精确地计算了最有可能的一个$\\Vh^*$。\n然而，如果我们希望设计一个最大化$\\CalL(\\Vv,\\Vh,q)$的学习过程，那么把~\\glssymbol{MAP}~推断视作是输出一个$q$值的学习过程是很有帮助的。\n在这种情况下，我们可以将~\\glssymbol{MAP}~推断视作是\\gls{approximate_inference}，因为它并不能提供一个最优的$q$。\n% 627 end\n\n\n\n我们回过头来看看\\secref{sec:inference_as_optimization}中所描述的精确推断，它指的是关于一个在无限制的概率分布族中的分布$q$使用精确的优化算法来最大化\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q)\n = \\SetE_{\\RVh\\sim q}[\\log p(\\Vh , \\Vv)] + H(q).\n\\end{align}\n我们通过限定分布$q$属于某个分布族，能够使得~\\glssymbol{MAP}~推断成为一种形式的\\gls{approximate_inference}。\n具体地说，我们令分布$q$满足一个\\,\\gls{dirac_distribution}：\n\\begin{align}\nq(\\Vh\\mid\\Vv) = \\delta(\\Vh - {\\Vmu}).\n\\end{align}\n这也意味着现在我们可以通过$\\Vmu$来完全控制分布$q$。\n将$\\CalL$中不随$\\Vmu$变化的项丢弃，我们只需解决一个优化问题：\n\\begin{align}\n\\Vmu^*  =  \\underset{\\Vmu}{\\arg\\max}\\ \\log p(\\Vh = \\Vmu,\\Vv),\n\\end{align}\n这等价于~\\glssymbol{MAP}~推断问题\n\\begin{align}\n\\Vh^* = \\underset{\\Vh}{\\arg\\max}\\  p(\\Vh\\mid\\Vv).\n\\end{align}\n% 628\n\n\n\n\n因此我们能够证明一种类似于~\\glssymbol{EM}~算法的学习算法，其中我们轮流迭代两步，一步是用~\\glssymbol{MAP}~推断估计出$\\Vh^*$，另一步是更新$\\Vtheta$来增大$\\log p(\\Vh^*,\\Vv)$。\n从~\\glssymbol{EM}~算法角度看，这也是对$\\CalL$的一种形式的\\gls{coordinate_ascent}，交替迭代时通过推断来优化关于$q$的$\\CalL$以及通过参数更新来优化关于$\\Vtheta$的$\\CalL$。\n作为一个整体，这个算法的正确性可以得到保证，因为$\\CalL$是$\\log p(\\Vv)$的下界。\n在~\\glssymbol{MAP}~推断中，这个保证是无效的，因为~\\gls{dirac_distribution}的微分熵趋近于负无穷，使得这个界会无限地松。\n然而，人为加入一些$\\Vmu$的噪声会使得这个界又有了意义。\n% 628\n\n\n\\glssymbol{MAP}~推断作为\\gls{feature_extractor}以及一种学习机制被广泛地应用在了\\gls{DL}中。\n它主要用于\\gls{sparse_coding}模型中。\n% 628\n\n\n我们回过头来看\\secref{sec:sparse_coding}中的\\gls{sparse_coding}，\\gls{sparse_coding}是一种在\\gls{hidden_unit}上加上了诱导稀疏性的先验知识的\\gls{linear_factor}。\n一个常用的选择是可分解的Laplace先验，表示为\n\\begin{align}\n\tp(h_i) = \\frac{\\lambda}{2}  \\exp(-\\lambda \\vert h_i \\vert).\n\\end{align}\n可见的节点是由一个线性变化加上噪声生成的：\n\\begin{align}\np(\\Vv\\mid\\Vh) = \\CalN(\\Vv;{\\MW}\\Vh + \\Vb,\\beta^{-1}{\\MI}).\n\\end{align}\n% 628 end\n\n\n分布$p(\\Vh\\mid\\Vv)$难以计算，甚至难以表达。\n每一对$h_i$， $h_j$变量都是$\\Vv$的母节点。\n这也意味着当$\\Vv$可被观察时，\\gls{graphical_models}包含了一条连接$h_i$和$h_j$的活跃路径。\n因此$p(\\Vh \\mid\\Vv)$中所有的\\gls{hidden_unit}都包含在了一个巨大的\\gls{clique}中。\n如果是高斯模型，那么这些相互作用关系可以通过协方差矩阵来高效地建模。\n然而稀疏型先验使得这些相互作用关系并不服从高斯分布。\n% 629 head\n\n\n分布$p(\\Vx\\mid\\Vh)$的难处理性导致了对数似然及其梯度也很难得到。\n因此我们不能使用精确的\\gls{MLE}来进行学习。\n取而代之的是，我们通过~\\glssymbol{MAP}~推断以及最大化由以$\\Vh$为中心的\\,\\gls{dirac_distribution}所定义而成的~\\glssymbol{ELBO}~来学习模型参数。\n% 629\n\n\n如果我们将训练集中所有的向量$\\Vh$拼成矩阵$\\MH$，并将所有的向量$\\Vv$拼起来组成矩阵$\\MV$，那么\\gls{sparse_coding}问题意味着最小化\n\\begin{align}\n\tJ(\\MH,\\MW) = \\sum_{i,j}^{}\\vert H_{i,j}\\vert + \\sum_{i,j}^{}\\Big(\\MV - \\MH \\MW^{\\top}\\Big)^2_{i,j}.\n\\end{align}\n为了避免如极端小的$\\MH$和极端大的$\\MW$这样的病态的解，大多数\\gls{sparse_coding}的应用包含了\\gls{weight_decay}或者对$\\MH$列范数的限制。\n% 629\n\n\n我们可以通过交替迭代，分别关于$\\MH$和$\\MW$最小化$J$的方式来最小化$J$。\n且两个子问题都是凸的。\n事实上，关于$\\MW$的最小化问题就是一个\\gls{linear_regression}问题。\n然而关于这两个变量同时最小化$J$的问题通常并不是凸的。\n% 629\n\n\n关于$\\MH$的最小化问题需要某些特别设计的算法，例如特征符号搜索方法~\\citep{HonglakLee-2007}。\n% 629\n\n\n\\section{变分推断和变分学习}\n\\label{sec:variational_inference_and_learning}\n% 629\n\n\n我们已经说明过了为什么\\gls{ELBO} $\\CalL(\\Vv,\\Vtheta,q)$是$\\log  p(\\Vv;\\Vtheta)$的一个下界、如何将推断看作是关于分布$q$最大化$\\CalL$ 的过程以及如何将学习看作是关于参数$\\Vtheta$最大化$\\CalL$的过程。\n我们也讲到了~\\glssymbol{EM}~算法在给定了分布$q$的条件下能够进行\\gls{large_learning_step}，而基于~\\glssymbol{MAP}~推断的学习算法则是学习一个$p(\\Vh \\mid \\Vv)$的点估计而非推断整个完整的分布。\n在这里我们介绍一些变分学习中更加通用的算法。\n% 629\n\n%  在一个关于q的有约束的分布族上\n变分学习的核心思想就是在一个关于$q$的有约束的分布族上最大化$\\CalL$。\n选择这个分布族时应该考虑到计算$\\SetE_q \\log p(\\Vh,\\Vv)$的难易度。\n一个典型的方法就是添加分布$q$如何分解的假设。\n% 630 head\n\n\n一种常用的变分学习的方法是加入一些限制使得$q$是一个\\gls{factorial}分布：\n\\begin{align}\n\tq(\\Vh\\mid\\Vv) = \\prod_{i}^{}q(h_i \\mid \\Vv).\n\\end{align}\n这被称为\\firstgls{mean_field}方法。\n更一般地说，我们可以通过选择分布$q$的形式来选择任何\\gls{graphical_models}的结构，通过选择变量之间相互作用的多少来灵活地决定近似程度的大小。\n这种完全通用的\\gls{graphical_models}方法被称为\\firstgls{structured_variational_inference} \\citep{Saul96}。\n% 630 \n\n\n变分方法的优点是我们不需要为分布$q$设定一个特定的参数化形式。\n我们设定它如何分解，之后通过解决优化问题来找出在这些分解限制下最优的概率分布。\n对离散型\\gls{latent_variable}来说，这意味着我们使用传统的优化技巧来优化描述分布$q$的有限个变量。\n对连续型\\gls{latent_variable}来说，这意味着我们使用一个被称为\\gls{calculus_of_variations}的数学分支工具来解决函数空间上的优化问题。\n然后决定哪一个函数来表示分布$q$。\n\\gls{calculus_of_variations}是``变分学习''或者``变分推断''这些名字的来因，尽管当\\gls{latent_variable}是离散时\\gls{calculus_of_variations}并没有用武之地。\n当遇到连续型\\gls{latent_variable}时，\\gls{calculus_of_variations}不需要过多地人工选择模型，是一种很有用的工具。\n我们只需要设定分布$q$如何分解，而不需要去猜测一个特定的能够精确近似原后验分布的分布$q$。\n% 630 \n\n\n因为$\\CalL(\\Vv,\\Vtheta,q)$被定义成$\\log p(\\Vv;\\Vtheta) - D_{\\text{KL}} (q(\\Vh\\mid\\Vv) \\Vert  p(\\Vh\\mid\\Vv;\\Vtheta) )$，我们可以认为关于$q$最大化$\\CalL$的问题等价于（关于$q$）最小化$D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv))$。\n在这种情况下，我们要用$q$来拟合$p$。\n然而，与以前方法不同，我们使用~\\gls{KL}的相反方向来拟合一个近似。\n当我们使用\\gls{MLE}来用模型拟合数据时，我们最小化$D_{\\text{KL}}(p_{\\text{data}} \\Vert p_{\\text{model}})$。\n如\\figref{fig:chap3_kl_direction_color}所示，这意味着\\gls{maximum_likelihood}鼓励模型在每一个数据达到高概率的地方达到高概率，而基于优化的推断则鼓励了$q$在每一个真实后验分布概率低的地方概率较小。\n这两种基于~\\gls{KL}的方法都有各自的优点与缺点。\n选择哪一种方法取决于在具体每一个应用中哪一种性质更受偏好。\n在基于优化的推断问题中，从计算角度考虑，我们选择使用$D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv))$。\n具体地说，计算$D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv))$涉及到了计算分布$q$下的期望。\n所以通过将分布$q$设计得较为简单，我们可以简化求所需要的期望的计算过程。\n\\gls{KL}的相反方向需要计算真实后验分布下的期望。\n因为真实后验分布的形式是由模型的选择决定的，所以我们不能设计出一种能够精确计算$D_{\\text{KL}}(p(\\Vh\\mid\\Vv) \\Vert q(\\Vh\\mid\\Vv))$的开销较小的方法。\n% 631 head\n\n\n\n\n\\subsection{离散型\\gls{latent_variable}}\n\\label{sec:discrete_latent_variables}\n% 631  19.4.1\n\n关于离散型\\gls{latent_variable}的变分推断相对来说比较直接。\n我们定义一个分布$q$，通常分布$q$的每个因子都由一些离散状态的可查询表格定义。\n在最简单的情况中，$\\Vh$是二值的并且我们做了\\gls{mean_field}假定，分布$q$可以根据每一个$h_i$分解。\n在这种情况下，我们可以用一个向量$\\hat{\\Vh}$来参数化分布$q$，$\\hat{\\Vh}$的每一个元素都代表一个概率，即$q(h_i = 1\\mid \\Vv) = \\hat{h}_i$。\n% 631\n\n\n在确定了如何表示分布$q$以后，我们只需要优化它的参数。\n在离散型\\gls{latent_variable}模型中，这是一个标准的优化问题。\n基本上分布$q$的选择可以通过任何优化算法解决，比如\\gls{GD}算法。\n% 631\n\n\n因为它在许多学习算法的内循环中出现，所以这个优化问题必须可以很快求解。\n为了追求速度，我们通常使用特殊设计的优化算法。\n这些算法通常能够在极少的循环内解决一些小而简单的问题。\n一个常见的选择是使用\\gls{fixed_point_equation}，换句话说，就是解关于$\\hat{h}_i$的方程\n\\begin{equation}\n\\frac{\\partial}{\\partial \\hat{h}_i}\\CalL = 0.\n\\end{equation}\n我们反复地更新$\\hat{\\Vh}$不同的元素直到满足收敛准则。\n% 631\n\n\n为了具体化这些描述，我们接下来会讲如何将变分推断应用到\\firstgls{binary_sparse_coding}模型（这里我们所描述的模型是 \\citet{henniges2010binary} 提出的，但是我们采用了传统、通用的\\gls{mean_field}方法，而原文作者采用了一种特殊设计的算法）中。\n数学推导过程非常详细，为希望完全了解我们描述过的变分推断和变分学习高级概念描述的读者所准备。\n而对于并不计划推导或者实现变分学习算法的读者来说，可以放心跳过，直接阅读下一节，这并不会遗漏新的高级概念。\n建议那些从事\\gls{binary_sparse_coding}研究的读者可以重新看一下\\secref{sec:useful_properties_of_common_functions}中描述的一些经常在概率模型中出现的有用的函数性质。\n我们在推导过程中随意地使用了这些性质，并没有特别强调它们。\n% 632  head\n\n\n在\\gls{binary_sparse_coding}模型中，输入$\\Vv\\in\\SetR^n$，是由模型通过添加高斯噪声到$m$个或有或无的不同成分的和而生成的。\n每一个成分可以是开或者关的，对应着\\gls{hidden_unit}~$\\Vh \\in\\{0,1\\}^m$:\n\\begin{align}\np(h_i = 1) &= \\sigma(b_i), \\\\\np(\\Vv\\mid\\Vh) &= \\CalN(\\Vv;\\MW \\Vh,{\\Vbeta}^{-1}),\n\\end{align}\n其中$\\Vb$是一个可以学习的\\gls{bias_aff}集合，$\\MW$是一个可以学习的权值矩阵，${\\Vbeta}$是一个可以学习的对角精度矩阵。\n% 632\n\n\n使用\\gls{maximum_likelihood}来训练这样一个模型需要对参数进行求导。\n我们考虑对其中一个\\gls{bias_aff}进行求导的过程：\n\\begin{align}\n\t\t& \\frac{\\partial}{\\partial b_i} \\log p(\\Vv) \\\\\n\t\t= &  \\frac{\\frac{\\partial}{\\partial b_i} p(\\Vv)}{p(\\Vv)}\\\\\n\t\t= & \\frac{\\frac{\\partial}{\\partial b_i} \\sum_{\\Vh}^{} p(\\Vh,\\Vv)}{p(\\Vv)}\\\\\n\t\t= &  \\frac{\\frac{\\partial}{\\partial b_i} \\sum_{\\Vh}^{} p(\\Vh) p(\\Vv\\mid \\Vh)  }{p(\\Vv)}\\\\\n\t\t= &  \\frac{ \\sum_{\\Vh}^{}  p(\\Vv\\mid \\Vh) \\frac{\\partial}{\\partial b_i} p(\\Vh) }{p(\\Vv)}\\\\\n\t\t= &  \\sum_{\\Vh}^{}  p(\\Vh\\mid \\Vv) \\frac{  \\frac{\\partial}{\\partial b_i} p(\\Vh) }{p(\\Vh)}\\\\\n\t\t= & \\SetE_{\\RVh\\sim p(\\Vh\\mid\\Vv)} \\frac{\\partial}{\\partial b_i}\\log p(\\Vh).\n\\end{align}\n% 632 end\n\n\n这需要计算$p(\\Vh\\mid\\Vv)$下的期望。\n不幸的是，$p(\\Vh\\mid\\Vv)$是一个很复杂的分布。\n关于$p(\\Vh,\\Vv)$和$p(\\Vh\\mid\\Vv)$的图结构可以参考\\figref{fig:bsc}。\n\\gls{hidden_unit}的后验分布对应的是关于\\gls{hidden_unit}的完全图，所以相对于暴力算法，\\gls{variable_elimination}算法并不能有助于提高计算期望的效率。\n% 633 head\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter19/figures/bsc}}\n\\fi\n\\caption{包含四个\\gls{hidden_unit}的\\gls{binary_sparse_coding}的图结构。\n\\emph{(左)}~$p(\\Vh,\\Vv)$的图结构。\n要注意边是有向的，每两个\\gls{hidden_unit}都是每个可见单元的\\gls{coparent}。\n\\emph{(右)}~$p(\\Vh,\\Vv)$的图结构。\n为了解释\\gls{coparent}之间的活跃路径，后验分布所有\\gls{hidden_unit}之间都有边。}\n\t\\label{fig:bsc}\n\\end{figure}\n\n\n\n取而代之的是，我们可以应用变分推断和变分学习来解决这个难点。\n% 633\n\n\n我们可以做一个\\gls{mean_field}近似：\n\\begin{equation}\n\tq(\\Vh\\mid\\Vv) = \\prod_{i}^{}q(h_i\\mid\\Vv).\n\\end{equation}\n% 633\n\n\n\\gls{binary_sparse_coding}中的\\gls{latent_variable}是二值的，所以为了表示可分解的$q$我们假设对$m$个~\\gls{bernoulli_distribution} $q(h_i\\mid\\Vv)$建模。\n表示~\\gls{bernoulli_distribution}的一种很自然的方法是使用一个概率向量$\\hat{\\Vh}$，满足$q(h_i\\mid\\Vv) = \\hat{h}_i$。\n为了避免计算中的误差，比如说计算$\\log \\hat{h}_i$时，我们对$\\hat{h}_i$添加一个约束，即$\\hat{h}_i$不等于$0$或者$1$。\n% 633 \n\n\n我们将会看到变分推断方程理论上永远不会赋予$\\hat{h}_i\\ $ $0$或者$1$。\n然而在软件实现过程中，机器的舍入误差会导致$0$或者$1$的值。\n在\\gls{binary_sparse_coding}的软件实现中，我们希望使用一个没有限制的变分参数向量$\\Vz$以及\n通过关系$\\hat{\\Vh} = \\sigma(\\Vz)$来获得$\\Vh$。\n因此通过使用等式$\\log \\sigma(z_i) = -\\zeta(-z_i)$来建立\\,\\ENNAME{sigmoid}\\,函数和\\,\\ENNAME{softplus}\\,函数的关系，我们可以放心地在计算机上计算$\\log \\hat{h}_i$。\n% 633\n\n\n在开始\\gls{binary_sparse_coding}模型中变分学习的推导时，我们首先说明了\\gls{mean_field}近似的使用可以使得学习过程更加简单。\n% 633 end  \n\n\n\\gls{ELBO}可以表示为\n\\begin{align}\n& \\CalL(\\Vv,\\Vtheta,q)\\\\\n = & \\SetE_{\\RVh\\sim q}[\\log p(\\Vh,\\Vv)] + H(q)\\\\\n = & \\SetE_{\\RVh\\sim q}[\\log p(\\Vh) + \\log p(\\Vv\\mid\\Vh) - \\log q(\\Vh\\mid\\Vv)]\\\\\n= & \\SetE_{\\RVh\\sim q}\\Big[\\sum_{i=1}^{m}\\log p(h_i) + \\sum_{i=1}^{n} \\log p(v_i\\mid\\Vh) - \\sum_{i=1}^{m}\\log q(h_i\\mid\\Vv)\\Big]\\\\\n= &  \\sum_{i=1}^{m}\\Big[\\hat{h}_i(\\log \\sigma(b_i) - \\log \\hat{h}_i) + (1 - \\hat{h}_i)(\\log \\sigma(-b_i) - \\log (1-\\hat{h}_i))\\Big] \\\\\n& +  \\SetE_{\\RVh\\sim q} \\Bigg[ \\sum_{i=1}^{n}\\log \\sqrt{\\frac{\\beta_i}{2\\pi}}\\exp(-\\frac{\\beta_i}{2}(v_i - \\MW_{i,:}\\Vh)^2)\\Bigg] \\\\\n= &  \\sum_{i=1}^{m}\\Big[\\hat{h}_i(\\log \\sigma(b_i) - \\log \\hat{h}_i) + (1 - \\hat{h}_i)(\\log \\sigma(-b_i) - \\log (1-\\hat{h}_i))\\Big] \\\\\n& + \\frac{1}{2} \\sum_{i=1}^{n} \\Bigg[ \\log {\\frac{\\beta_i}{2\\pi}} - \\beta_i \\Bigg(v_i^2 - 2 v_i \\MW_{i,:}\\hat{\\Vh} + \\sum_{j}\\Big[W^2_{i,j}\\hat{h}_j + \\sum_{k \\neq j}W_{i,j}W_{i,k}\\hat{h}_j\\hat{h}_k \\Big] \\Bigg) \\Bigg]. \n\\label{eqn:1936}\n\\end{align}\n% 634 head \n尽管这些方程从美学观点来看有些不尽如人意。\n他们展示了$\\CalL$可以被表示为少量简单的代数运算。\n因此\\gls{ELBO}$\\,\\CalL$是易于处理的。\n我们可以把$\\CalL$看作是难以处理的对数似然函数的一个替代。\n% 634  head \n\n\n原则上说，我们可以使用关于$\\Vv$和$\\Vh$的\\gls{GA}。\n这会成为一个推断和学习算法的完美组合。%\\footnote{译者注：推断算法和学习算法的组合}\n但是，由于两个原因，我们往往不这么做。\n第一点，对每一个$\\Vv$我们需要存储$\\hat{\\Vh}$。\n我们通常更加偏向于那些不需要为每一个样本都准备内存的算法。\n如果我们需要为每一个样本都存储一个动态更新的向量，使得算法很难处理几十亿的样本。\n第二个原因就是为了能够识别$\\Vv$的内容，我们希望能够有能力快速提取特征$\\hat{\\Vh}$。\n在实际应用场景中，我们需要在有限时间内计算出$\\hat{\\Vh}$。\n% 634\n\n\n由于以上两个原因，我们通常不会采用\\gls{GD}来计算\\gls{mean_field}参数$\\hat{\\Vh}$。\n取而代之的是，我们使用\\gls{fixed_point_equation}来快速估计。\n% 634\n\n\n\\gls{fixed_point_equation}的核心思想是我们寻找一个关于$\\Vh$的\\gls{local_maximum}，满足$\\nabla_{\\Vh}\\CalL(\\Vv,\\Vtheta,\\hat{\\Vh}) = 0$。\n我们无法同时高效地计算所有$\\hat{\\Vh}$的元素。\n然而，我们可以解决单个变量的问题：\n\\begin{equation}\n\\label{eqn:1937}\n\\frac{\\partial}{\\partial \\hat{h}_i} \\CalL(\\Vv,\\Vtheta,\\hat{\\Vh}) = 0 .\n\\end{equation}\n% 634 end  \n\n\n我们可以迭代地将这个解应用到$i = 1,\\ldots,m$，然后重复这个循环直到我们满足了收敛准则。\n常见的收敛准则包含了当整个循环所改进的$\\CalL$不超过预设的\\gls{tolerance}量时停止，或者是循环中改变的$\\hat{\\Vh}$不超过某个值时停止。\n% 635  head\n\n在很多不同的模型中，迭代的\\gls{mean_field}\\gls{fixed_point_equation}是一种能够提供快速变分推断的通用算法。\n为了使它更加具体，我们详细地讲一下如何推导出\\gls{binary_sparse_coding}模型的更新过程。\n% 635\n\n\n首先，我们给出了对$\\hat{h}_i$的导数表达式。\n为了得到这个表达式，我们将\\eqnref{eqn:1936}代入到\\eqnref{eqn:1937}的左边：\n\\begin{align}\n& \\frac{\\partial}{\\partial \\hat{h}_i} \\CalL (\\Vv,\\Vtheta,\\hat{\\Vh})    \\\\\n= & \\frac{\\partial}{\\partial \\hat{h}_i} \\Bigg[\\sum_{j=1}^{m}\\Big[\\hat{h}_j (\\log \\sigma(b_j) - \\log \\hat{h}_j) + (1 - \\hat{h}_j)(\\log \\sigma(-b_j) - \\log (1-\\hat{h}_j))\\Big] \\\\\n& + \\frac{1}{2} \\sum_{j=1}^{n} \\Bigg[ \\log {\\frac{\\beta_j}{2\\pi}} - \\beta_j \\Bigg(v_j^2 - 2 v_j \\MW_{j,:}\\hat{\\Vh} + \\sum_{k}\\Bigg[W^2_{j,k}\\hat{h}_k + \\sum_{l \\neq k}W_{j,k}W_{j,l}\\hat{h}_k\\hat{h}_l \\Bigg] \\Bigg) \\Bigg]\\Bigg] \\\\\n= & \\log \\sigma(b_i) - \\log \\hat{h}_i - 1 + \\log (1 - \\hat{h}_i ) + 1 - \\log \\sigma (- b_i ) \\\\\n & + \\sum_{j=1}^{n} \\Bigg[\\beta_j \\Bigg(v_j W_{j,i} - \\frac{1}{2} W_{j,i}^2 - \\sum_{k \\neq i} \\MW_{j,k}\\MW_{j,i} \\hat{h}_k\\Bigg) \\Bigg]\\\\\n = & b_i - \\log \\hat{h}_i + \\log (1 - \\hat{h}_i ) + \\Vv^{\\top} {\\Vbeta} \\MW_{:,i} - \\frac{1}{2} \\MW_{:,i}^{\\top} {\\Vbeta}\\MW_{:,i} -\\sum_{j\\neq i}\\MW^{\\top}_{:,j}{\\Vbeta}\\MW_{:,i}\\hat{h}_j.\n \\label{eqn:1943}\n\\end{align}\n% 635  \n\n为了应用固定点更新的推断规则，我们通过令\\eqnref{eqn:1943}等于$0$来解$\\hat{h}_i$：\n\\begin{align}\n\\label{eqn:1944}\n\\hat{h}_i = \\sigma\\Bigg(b_i + \\Vv^{\\top} {\\Vbeta} \\MW_{:,i} - \\frac{1}{2} \\MW_{:,i}^{\\top} {\\Vbeta} \\MW_{:,i} - \\sum_{j \\neq i }  \\MW_{:,j}^{\\top} {\\Vbeta}  \\MW_{:,i} \\hat{h}_j \\Bigg).\n\\end{align}\n% 635 end\n\n此时，我们可以发现\\gls{graphical_models}中的推断和\\gls{RNN}之间存在着紧密的联系。\n具体地说，\\gls{mean_field}\\gls{fixed_point_equation}定义了一个\\gls{RNN}。\n这个神经网络的任务就是完成推断。\n我们已经从模型描述的角度介绍了如何推导这个网络，但是直接训练这个推断网络也是可行的。\n有关这种思路的一些想法在\\chapref{chap:deep_generative_models}中有所描述。\n% 636  head \n\n\n在\\gls{binary_sparse_coding}模型中，我们可以发现\\eqnref{eqn:1944}中描述的\\gls{recurrent_network}连接包含了根据相邻\\gls{hidden_unit}变化值来反复更新当前\\gls{hidden_unit}的操作。   %?? 连接  换成 （和图模型推断的相关联系）     \n输入层通常给\\gls{hidden_unit}发送一个固定的信息$\\Vv^{\\top}\\beta\\MW$，然而\\gls{hidden_unit}不断地更新互相传送的信息。\n具体地说，当$\\hat{h}_i$和$\\hat{h}_j$两个单元的权重向量平行时，它们会互相抑制。\n这也是一种形式的竞争——两个解释输入的\\gls{hidden_unit}之间，只有一个解释得更好的才被允许继续保持活跃。\n在\\gls{binary_sparse_coding}的后验分布中，\\gls{mean_field}近似试图捕获到更多的\\gls{explaining_away}相互作用，从而产生了这种竞争。   %?? 捕获  换成  反应，\n事实上，\\gls{explaining_away}效应会产生一个\\gls{multimodal}的后验分布，以致于如果我们从后验分布中采样，一些样本在一个单元是活跃的，其他的样本在另一个单元活跃，只有很少的样本能够两者都处于活跃状态。\n不幸的是，\\gls{explaining_away}作用无法通过\\gls{mean_field}中\\gls{factorial}分布$q$来建模，因此建模时\\gls{mean_field}近似只能选择一个\\gls{mode}。\n这个现象的一个例子可以参考\\figref{fig:chap3_kl_direction_color}。\n% 636\n\n\n\n\n我们将\\eqnref{eqn:1944}重写成等价的形式来揭示一些深层的含义：\n\\begin{align}\n\\hat{h}_i = \\sigma\\Bigg(b_i + \\Big(\\Vv - \\sum_{j\\neq i} \\MW_{:,j}\\hat{h}_j\\Big)^{\\top} {\\Vbeta}\\MW_{:,i} - \\frac{1}{2} \\MW_{:,i}^{\\top} {\\Vbeta} \\MW_{:,i}\\Bigg). \n\\end{align}\n在这种新的形式中，我们可以将$\\Vv - \\sum_{j\\neq i} \\MW_{:,j}\\hat{h}_j$看作是输入，而不是$\\Vv$。\n因此，我们可以把第$i$个单元视作给定其他单元编码时给$\\Vv$中的剩余误差编码。\n由此我们可以将\\gls{sparse_coding}视作是一个迭代的\\gls{AE}，将输入反复地编码解码，试图在每一轮迭代后都能修复重构中的误差。\n% 636\n\n\n在这个例子中，我们已经推导出了每一次更新单个结点的更新规则。\n如果能够同时更新更多的结点，那会更令人满意。\n某些\\gls{graphical_models}，比如\\gls{DBM}，我们可以同时解出$\\hat{\\Vh}$中的许多元素。\n不幸的是，\\gls{binary_sparse_coding}并不适用这种块更新。\n取而代之的是，我们使用一种被称为\\firstgls{damping}的启发式技巧来实现块更新。\n在\\gls{damping}方法中，对$\\hat{\\Vh}$中的每一个元素我们都可以解出最优值，然后对于所有的值都在这个方向上移动一小步。\n这个方法不能保证每一步都能增加$\\CalL$，但是对于许多模型都很有效。\n关于在\\gls{message_passing}算法中如何选择同步程度以及使用\\gls{damping}策略可以参考 \\citet{koller-book2009} 。\n % 637 head \n\n\n\n\n\\subsection{\\glsentrytext{calculus_of_variations}}\n\\label{sec:calculus_of_variations}\n% p 637 head   19.4.2 \n\n在继续介绍变分学习之前，我们有必要简单地介绍一种变分学习中重要的数学工具：\\firstgls{calculus_of_variations}。\n% p 637\n\n\n许多\\gls{ML}的技巧是基于寻找一个输入向量$\\Vtheta\\in\\SetR^n$来最小化函数$J(\\Vtheta)$，使得它取到最小值。\n这个步骤可以利用多元微积分以及线性代数的知识找到满足$\\nabla_{\\Vtheta} J(\\Vtheta) = 0$的\\gls{critical_points}来完成。\n在某些情况下，我们希望能够解一个函数$f(\\Vx)$，比如当我们希望找到一些随机变量的\\gls{PDF}时。\n正是\\gls{calculus_of_variations}能够让我们完成这个目标。\n% p 637\n\n\n\n函数$f$的函数被称为\\firstgls{functional} $J[f]$。\n正如我们许多情况下对一个函数求关于以向量的元素为变量的\\gls{partial_derivatives}一样，我们可以使用\\firstgls{functional_derivative}，\n即在任意特定的$\\Vx$值，对一个\\gls{functional} $J[f]$求关于函数$f(\\Vx)$的导数，这也被称为\\firstgls{variational_derivative}。\n\\gls{functional} $J$的关于函数$f$在点$\\Vx$处的\\gls{functional_derivative}被记作$\\frac{\\delta}{\\delta f(x)}J$。\n% p 637\n\n\n\n完整正式的\\gls{functional_derivative}的推导不在本书的范围之内。\n对于我们的目标而言，了解可微分函数$f(\\Vx)$以及带有连续导数的可微分函数$g(y,\\Vx)$就足够了：\n\\begin{align}\n\t\\frac{\\delta}{\\delta f(\\Vx)} \\int g(f(\\Vx),\\Vx)d\\Vx = \\frac{\\partial}{\\partial y}g(f(\\Vx),\\Vx).\n\\end{align}\n为了使上述等式更加直观，我们可以把$f(\\Vx)$看作是一个有着无穷不可数多元素的向量，由一个实数向量$\\Vx$表示。\n在这里（看作是一个不完全的介绍），这种关系式中描述的\\gls{functional_derivative}和向量$\\Vtheta\\in\\SetR^n$的导数相同：\n\\begin{align}\n\t\\frac{\\partial}{\\partial \\theta_i}\\sum_{j}^{}g(\\theta_j,j) = \\frac{\\partial}{\\partial \\theta_i}g(\\theta_i,i).\n\\end{align}\n在其他\\gls{ML}文献中的许多结果则使用了更为通用的\\firstgls{euler_lagrange_eqn}，\n它能够使得$g$不仅依赖于$f$的值，还依赖于$f$的导数。\n但是在本书中我们不需要这个通用版本。\n% p 637  end\n\n\n为了关于一个向量优化某个函数，我们求出了这个函数关于这个向量的梯度，然后找这个梯度中每一个元素都为$0$的点。\n类似地，我们可以通过寻找一个函数使得\\gls{functional_derivative}的每个点都等于$0$从而来优化一个\\gls{functional}。\n% p 638 head\n\n\n下面介绍一个该过程如何运行的例子，我们考虑寻找一个定义在$x\\in\\SetR$上的有最大\\gls{differential_entropy}的\\gls{PDF}。\n我们回过头来看一下一个概率分布$p(x)$的熵，定义如下：\n\\begin{align}\n\tH[p] = - \\SetE_x \\log p(x).\n\\end{align}\n对于连续的值，这个期望可以被看作一个积分：\n\\begin{align}\n\tH[p] = - \\int p(x) \\log p(x) dx.\n\\end{align}\n% p 638\n\n\n我们不能简单地仅仅关于函数$p(x)$最大化$H[p]$，因为那样的话结果可能不是一个概率分布。\n为了解决这个问题，我们需要使用一个\\gls{lagrange_multi}来添加一个分布$p(x)$积分值为$1$的约束。\n同样地，当方差增大时，熵也会无限制地增加。\n因此，寻找哪一个分布有最大熵这个问题是没有意义的。\n但是，在给定固定的方差$\\sigma^2$时，我们可以寻找一个最大熵的分布。\n最后，这个问题还是\\gls{underdetermined}，因为在不改变熵的条件下一个分布可以被随意地改变。\n为了获得一个唯一的解，我们再加一个约束：分布的均值必须为$\\mu$。\n那么这个问题的拉格朗日\\gls{functional}如下：\n\\begin{align}\n\\label{eqn:1950}\n&\t\t\\CalL[p] =  \\lambda_1 \\Big(\\int p(x)dx - 1\\Big)  + \\lambda_2 (\\SetE[x] - \\mu) +  \\lambda_3 (\\SetE[(x-\\mu)^2] - \\sigma^2)  + H[p]\\\\\n& =  \\int \\Big(\\lambda_1 p(x) + \\lambda_2 p(x)x + \\lambda_3 p(x)(x-\\mu)^2 - p(x)\\log p(x) \\Big)dx - \\lambda_1 - \\mu \\lambda_2 - \\sigma^2\\lambda_3.\n\\end{align}\n% p 638   \n\n\n为了关于$p$最小化\\gls{lagrange_multi}，我们令\\gls{functional_derivative}等于$0$：\n\\begin{align}\n\\label{eqn:1952}\n\t\\forall x,\\ \\  \\frac{\\delta}{\\delta p(x)} \\CalL = \\lambda_1 + \\lambda_2 x + \\lambda_3(x-\\mu)^2 - 1 - \\log p(x) = 0 .\n\\end{align}\n% p 638  end \n\n\n这个条件告诉我们$p(x)$的\\gls{functional}形式。\n通过代数运算重组上述方程，我们可以得到\n\\begin{align}\n\\label{eqn:1953}\n\tp(x) = \\exp\\big(\\lambda_1 + \\lambda_2 x + \\lambda_3 (x-\\mu)^2  - 1\\big).\n\\end{align}\n% p 638 end \n\n\n我们并没有直接假设$p(x)$取这种形式，而是通过最小化\\gls{functional}从理论上得到了这个$p(x)$的表达式。\n为了解决这个最小化问题，我们需要选择$\\lambda$的值来确保所有的约束都能够满足。\n我们有很大的自由去选择$\\lambda$。\n因为只要满足约束，拉格朗日关于$\\lambda$这个变量的梯度就为$0$。\n为了满足所有的约束，我们可以令$\\lambda_1 = 1 - \\log \\sigma\\sqrt{2\\pi}$,$\\lambda_2 = 0$, $\\lambda_3 = - \\frac{1}{2\\sigma^2}$，从而得到\n\\begin{align}\n\\label{eqn:1954}\n\tp(x) = \\CalN(x;\\mu,\\sigma^2).\n\\end{align}\n这也是当我们不知道真实的分布时总是使用\\gls{normal_distribution}的一个原因。\n因为\\gls{normal_distribution}拥有最大的熵，我们通过这个假定来保证了最小可能量的结构。\n% 639 head\n\n\n\n当寻找熵的拉格朗日\\gls{functional}的\\gls{critical_points}并且给定一个固定的方差时，我们只能找到一个对应最大熵的\\gls{critical_points}。\n那最小化熵的\\gls{PDF}是什么样的呢？\n为什么我们无法发现对应着\\gls{minimum}的第二个\\gls{critical_points}呢？\n原因是没有一个特定的函数能够达到最小的熵值。\n当函数把越多的概率密度加到$x = \\mu + \\sigma$和$x = \\mu - \\sigma$两个点上，越少的概率密度到其他点上时，它们的熵值会减少，而方差却不变。\n然而任何把所有的权重都放在这两点的函数的积分都不为$1$，不是一个有效的概率分布。\n所以不存在一个最小熵的\\gls{PDF}，就像不存在一个最小的正实数一样。\n然而，我们发现存在一个收敛的概率分布的序列，收敛到权重都在两个点上。\n这种情况能够退化为混合\\gls{dirac_distribution}。\n因为\\,\\gls{dirac_distribution}并不是一个单独的\\gls{PDF}，所以\\,\\gls{dirac_distribution}或者混合\\,\\gls{dirac_distribution}并不能对应函数空间的一个点。\n所以对我们来说，当寻找一个\\gls{functional_derivative}为$0$的函数空间的点时，这些分布是不可见的。\n这就是这种方法的局限之处。\n诸如\\,\\gls{dirac_distribution}这样的分布可以通过其他方法被找到，比如可以先猜测一个解，然后证明它是满足条件的。\n% 639 \n\n\n\n\\subsection{连续型\\gls{latent_variable}}\n\\label{sec:continuous_latent_variables}\n% 639 end            19.4.3 \n\n\n当我们的\\gls{graphical_models}包含连续型\\gls{latent_variable}时，我们仍然可以通过最大化$\\CalL$进行变分推断和变分学习。\n然而，我们需要使用\\gls{calculus_of_variations}来实现关于$q(\\Vh\\mid\\Vv)$最大化$\\CalL$。\n% 639 end  \n\n\n% 640 head  \n在大多数情况下，研究者并不需要解决任何\\gls{calculus_of_variations}的问题。\n取而代之的是，\\gls{mean_field}固定点迭代更新有一个通用的方程。\n如果我们做了\\gls{mean_field}近似：\n\\begin{align}\n\\label{eqn:1955}\n\tq(\\Vh\\mid\\Vv) = \\prod_i q(h_i \\mid\\Vv),\n\\end{align}\n% 640 mid\n并且对任何的$j\\neq i$固定$q(h_j\\mid\\Vv)$，那么只需要满足分布$p$中任何联合分布变量的概率值不为$0$，我们就可以通过归一化下面这个未归一的分布\n\\begin{align}\n\t\\label{eqn:1956}\n\t\\tilde{q}(h_i \\mid\\Vv) = \\exp \\big(\\SetE_{\\RVh_{-i}\\sim q(\\RVh_{-i}\\mid\\Vv)}\t\\log \\tilde{p}(\\Vv,\\Vh)\\big)\n\\end{align}\n% 640 mid\n来得到最优的$q(h_i\\mid\\Vv)$。\n在这个方程中计算期望就能得到正确的$q(h_i\\mid\\Vv)$的表达式。\n我们只有在希望提出一种新形式的变分学习算法时才需要使用\\gls{calculus_of_variations}来直接推导$q$的函数形式。\n\\eqnref{eqn:1956}给出了适用于任何概率模型的\\gls{mean_field}近似。\n% 640  \n\n\n\n\n% 640  \n\\eqnref{eqn:1956}是一个\\gls{fixed_point_equation}，对每一个$i$它都被迭代地反复使用直到收敛。\n然而，它还包含着更多的信息。\n它还包含了最优解取到的\\gls{functional}形式，无论我们是否能够通过\\gls{fixed_point_equation}来解出它。\n这意味着我们可以利用方程中的\\gls{functional}形式，把其中一些值当成参数，然后通过任何我们想用的优化算法来解决这个问题。\n\n\n% 640  \n我们拿一个简单的概率模型作为例子，其中\\gls{latent_variable}满足$\\Vh\\in\\SetR^2$，可见变量只有一个$v$。\n假设$p(\\Vh) = \\CalN(\\Vh;0,\\MI)$以及$p(v\\mid\\Vh) = \\CalN(v;\\Vw^{\\top}\\Vh;1)$，我们可以积掉$\\Vh$来简化这个模型，结果是关于$v$的\\gls{gaussian_distribution}。\n这个模型本身并不有趣。\n只是为了说明\\gls{calculus_of_variations}如何应用在概率建模之中，我们才构造了这个模型。\n\n\n\n% 640  end\n忽略归一化常数时，真实的后验分布如下：\n\\begin{align}\n\t\\label{eqn:1957}\n   & p(\\Vh\\mid\\Vv)\\\\\n \\propto & p(\\Vh, \\Vv)\\\\\n = & p(h_1) p(h_2) p(\\Vv\\mid\\Vh)\\\\\n \\propto & \\exp \\big(-\\frac{1}{2} [h_1^2 + h_2^2 + (v-h_1w_1 - h_2w_2)^2]\\big)\\\\\n = & \\exp \\big( - \\frac{1}{2} [h_1^2 + h_2^2 + v^2 + h_1^2w_1^2 + h_2^2w_2^2 - 2vh_1w_1 - 2vh_2w_2 + 2h_1w_1h_2w_2] \\big).\n\\end{align}\n在上式中，我们发现由于带有$h_1,h_2$乘积项的存在，真实的后验并不能关于$h_1,h_2$分解。\n% 641 head \n\n\n\n应用\\eqnref{eqn:1956}，我们可以得到\n\\begin{align}\n\\label{eqn:1962}\n& \\tilde{q}(h_1\\mid\\Vv)\\\\ \n= & \\exp\\big(\\SetE_{\\RSh_2\\sim q(\\RSh_2\\mid\\Vv)} \\log \\tilde{p}(\\Vv,\\Vh)\\big) \\\\\n= & \\exp\\Big( -\\frac{1}{2} \\SetE_{\\RSh_2\\sim q(\\RSh_2\\mid\\Vv)} [h_1^2 + h_2^2 + v^2 + h_1^2w_1^2 + h_2^2w_2^2 \\\\\n& -2vh_1w_1 - 2vh_2w_2 + 2h_1w_1h_2w_2]\\Big).\n\\end{align}\n% 641 \n从这里，我们可以发现其中我们只需要从$q(h_2\\mid \\Vv)$中获得两个有效值：\n$\\SetE_{\\RSh_2\\sim q(\\RSh\\mid\\Vv)}[h_2]$和$\\SetE_{\\RSh_2\\sim q(\\RSh\\mid\\Vv)}[h_2^2]$。\n把这两项记作$\\langle h_2 \\rangle$和$\\langle h_2^2 \\rangle$，我们可以得到：\n\\begin{align}\n\\label{eqn:1966}\n\\tilde{q}(h_1\\mid\\Vv) = & \\exp(-\\frac{1}{2} [h_1^2 + \\langle h_2^2 \\rangle  + v^2 + h_1^2w_1^2 + \\langle h_2^2 \\rangle w_2^2 \n\\\\ &\t-2vh_1w_1 - 2v\\langle h_2 \\rangle w_2 + 2h_1w_1\\langle h_2 \\rangle w_2]).\t\n\\end{align}\n% 641 \n\n\n从这里，我们可以发现$\\tilde{q}$的\\gls{functional}形式满足\\gls{gaussian_distribution}。\n因此，我们可以得到$q(\\Vh\\mid\\Vv) = \\CalN(\\Vh;\\Vmu,\\Vbeta^{-1})$，其中$\\Vmu$和对角的$\\Vbeta$是变分参数，我们可以使用任何方法来优化它。\n%有必要再强调一下，我们并没有假设$q$是一个\\gls{gaussian_distribution}，这个高斯的形式是使用\\gls{calculus_of_variations}来最大化关于$\\CalL$的分布$q$\\footnote{此处似乎有笔误。}推导出的。    %?? 什么笔误啊。。。  最大化L关于q 还是 最大化q关于L\n有必要再强调一下，我们并没有假设$q$是一个\\gls{gaussian_distribution}，这个高斯的形式是使用\\gls{calculus_of_variations}来关于分布$q$最大化$\\CalL$而推导出来的。\n在不同的模型上应用相同的方法可能会得到不同\\gls{functional}形式的分布$q$。\n% 641\n\n当然，上述模型只是为了说明情况的一个简单例子。\n\\gls{DL}中关于变分学习中连续型变量的实际应用可以参考~\\citet{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}。\n% 641\n\n\n\n\\subsection{学习和推断之间的相互作用}\n\\label{sec:interactions_between_learning_and_inference}\n% 641 end  19.4.4  \n\n\n在学习算法中使用\\gls{approximate_inference}会影响学习的过程，反过来学习的过程也会影响推断算法的准确性。\n% 641 end\n\n\n具体来说，训练算法倾向于朝使得\\gls{approximate_inference}算法中的近似假设变得更加真实的方向来适应模型。\n当训练参数时，变分学习增加\n\\begin{align}\n\\label{eqn:1968}\n\t\\SetE_{\\RVh \\sim q}\\log p(\\Vv,\\Vh).\n\\end{align}\n% 642 \n对于一个特定的$\\Vv$，对于$q(\\Vh \\mid \\Vv)$中概率很大的$\\Vh$它增加了$p(\\Vh\\mid\\Vv)$；对于$q(\\Vh \\mid \\Vv)$中概率很小的$\\Vh$它减小了$p(\\Vh\\mid\\Vv)$。\n% 642\n\n这种行为使得我们做的近似假设变得合理。 %这种行为使我们的近似假设成为自我实现。\n如果我们用\\gls{unimodal}近似后验来训练模型，那么所得具有真实后验的模型会比我们使用精确推断训练模型获得的模型更接近\\gls{unimodal}。  %?? <bad>\n% 642\n\n\t\n因此，估计变分近似对模型的破坏程度是很困难的。\n存在几种估计$\\log p(\\Vv)$的方式。\n通常我们在训练模型之后估计$\\log p(\\Vv;\\Vtheta)$，然后发现它和$\\CalL(\\Vv,\\Vtheta,q)$的差距是很小的。\n从这里我们可以得出结论，对于特定的从学习过程中获得的$\\Vtheta$来说，变分近似是很准确的。\n然而我们无法直接得到变分近似普遍很准确或者变分近似几乎不会对学习过程产生任何负面影响这样的结论。\n为了准确衡量变分近似带来的危害，我们需要知道$\\Vtheta^* = \\max_{\\Vtheta} \\log p(\\Vv;\\Vtheta)$。\n$\\CalL(\\Vv,\\Vtheta,q)\\approx \\log p(\\Vv;\\Vtheta)$和$\\log p(\\Vv;\\Vtheta)\\ll \\log p(\\Vv;\\Vtheta^*)$同时成立是有可能的。\n如果存在$\\max_q \\CalL(\\Vv,\\Vtheta^*,q)\\ll \\log p(\\Vv;\\Vtheta^*)$，即在$\\Vtheta^*$点处后验分布太过复杂使得$q$分布族无法准确描述，那么学习过程永远无法到达$\\Vtheta^*$。\n这样的一类问题是很难发现的，因为只有在我们有一个能够找到$\\Vtheta^*$的较好的学习算法时，才能确定地进行上述的比较。\n% 642\n\n\n\n\\section{\\glsentrytext{learned}\\glsentrytext{approximate_inference}}\n\\label{sec:learned_approximate_inference}\n% 642  end    19.5\n\n我们已经看到了推断可以被视作一个增加函数$\\CalL$值的优化过程。\n显式地通过迭代方法（比如\\gls{fixed_point_equation}或者基于梯度的优化算法）来进行优化的过程通常是代价很高且耗时巨大的。\n通过学习一个近似推断，许多推断算法避免了这种代价。\n具体地说，我们可以将优化过程视作将一个输入$\\Vv$投影到一个近似分布$q^* = \\arg\\max_q\\  \\CalL(\\Vv,q)$的一个$f$的函数。\n一旦我们将多步的迭代优化过程看作是一个函数，我们可以用一个近似函数为$\\hat{f}(\\Vv;{\\Vtheta})$的\\gls{NN}来近似它。\n\n\n\\subsection{\\glsentrytext{wake_sleep}算法}  \n%?? wake_sleep 翻译成  醒眠  你斟酌下\n\\label{sec:wake_sleep}\n% 643 head 19.5.1\n\n训练一个可以用$\\Vv$来推断$\\Vh$的模型的一个主要难点在于我们没有一个\\gls{supervised}训练集来训练模型。\n给定一个$\\Vv$，我们无法获知一个合适的$\\Vh$。\n从$\\Vv$到$\\Vh$的映射依赖于模型族的选择，并且在学习过程中随着${\\Vtheta}$的改变而变化。\n\\firstgls{wake_sleep}算法~\\citep{Hinton95,Frey96}通过从模型分布中抽取$\\Vv$和$\\Vh$的样本来解决这个问题。\n例如，在\\gls{directed_model}中，这可以通过执行从$\\Vh$开始并在$\\Vv$结束的\\gls{ancestral_sampling}来高效地完成。\n然后这个推断网络可以被训练来执行反向的映射：预测哪一个$\\Vh$产生了当前的$\\Vv$。\n%<bad>这种方法的主要缺点是我们将只能够训练推断网络在模型下具有高概率的$\\Vv$值。\n这种方法的主要缺点是我们将只能在那些在当前模型上有较高概率的$\\Vv$值上训练推断网络。\n在学习早期，模型分布与数据分布偏差较大，因此推断网络将不具有在类似数据的样本上学习的机会。\n% 643 mid\n\n\n在\\secref{sec:stochastic_maximum_likelihood_and_contrastive_divergence}中，我们看到睡眠做梦在人类和动物中作用的一个可能解释是，做梦可以提供\\gls{monte_carlo}训练算法用于近似\\gls{undirected_model}中对数\\gls{partition_function}负梯度的\\gls{negative_phase}样本。\n生物做梦的另一个可能解释是它提供来自$p(\\Vh,\\Vv)$的样本，这可以用于训练推断网络在给定$\\Vv$的情况下预测$\\Vh$。\n在某些意义上，这种解释比\\gls{partition_function}的解释更令人满意。\n如果\\gls{monte_carlo}算法仅使用梯度的\\gls{positive_phase}运行几个步骤，然后仅对梯度的\\gls{negative_phase}运行几个步骤，那么结果通常不会很好。\n人类和动物通常连续清醒几个小时，然后连续睡着几个小时。\n这个时间表如何支持\\gls{undirected_model}的\\gls{monte_carlo}训练尚不清楚。\n然而，基于最大化$\\CalL$的学习算法可以通过长时间调整改进$q$和长期调整${\\Vtheta}$来实现。\n如果生物做梦的作用是训练网络来预测$q$，那么这解释了动物如何能够保持清醒几个小时\n（它们清醒的时间越长，$\\CalL$和$\\log p(\\Vv)$之间的差距越大， 但是$\\CalL$仍然是下限）\n并且睡眠几个小时（\\gls{generative_model}本身在睡眠期间不被修改）， 而不损害它们的内部模型。\n当然，这些想法纯粹是猜测性的，没有任何确定的证据表明做梦实现了这些目标之一。\n做梦也可以通过从动物的过渡模型（用来训练动物策略）采样合成经验来服务于\\gls{RL}而不是概率建模。\n也许睡眠可以服务于一些\\gls{ML}社区尚未发现的其他目的。\n% 644 head\n\n\n\n\\subsection{\\glsentrytext{learned}推断的其他形式}\n\\label{sec:other_forms_of_learned_inference}\n% 644    19.5.2 \n\n这种\\gls{learned}\\gls{approximate_inference}策略已经被应用到了其他模型中。\n\\citet{Salakhutdinov+Larochelle-2010}证明了在\\gls{learned}推断网络中的单遍传递相比于在\\gls{DBM}中的迭代\\gls{mean_field}\\gls{fixed_point_equation}能够得到更快的推断。\n其训练过程是基于运行推断网络的，然后运行一步\\gls{mean_field}来改进其估计，并训练推断网络来输出这个更精细的估计以代替其原始估计。\n% 644\n\n\n我们已经在\\secref{sec:predictive_sparse_decomposition}中看到，预测性的稀疏分解模型训练一个浅层\\gls{encoder}网络，从而预测输入的\\gls{sparse_coding}。\n这可以被看作是\\gls{AE}和\\gls{sparse_coding}之间的混合。\n为模型设计概率语义是可能的，其中\\gls{encoder}可以被视为执行\\gls{learned}近似~\\glssymbol{MAP}~推断。\n由于其浅层的\\gls{encoder}，PSD不能实现我们在\\gls{mean_field}推断中看到的单元之间的那种竞争。\n然而，该问题可以通过训练深度\\gls{encoder}实现\\gls{learned}\\gls{approximate_inference}来补救，如ISTA技术~\\citep{Gregor+LeCun-ICML2010}。\n% 644\n\n\n近来\\gls{learned}\\gls{approximate_inference}已经成为了\\gls{VAE}形式的\\gls{generative_model}中的主要方法之一 \\citep{Kingma-arxiv2013,Rezende-et-al-ICML2014}。\n在这种优美的方法中，不需要为推断网络构造显式的目标。\n反之，推断网络仅仅被用来定义$\\CalL$，然后调整推断网络的参数来增大$\\CalL$。\n我们将在\\secref{sec:variational_autoencoders}中详细介绍这种模型。\n% 644\n\n我们可以使用\\gls{approximate_inference}来训练和使用很多不同的模型。\n其中许多模型将在下一章中描述。\n% 644\n"
  },
  {
    "path": "Chapter2/README.md",
    "content": "#第二章笔记\n"
  },
  {
    "path": "Chapter2/annotations.txt",
    "content": "{'user': 'acct:badpoem@hypothes.is', 'text': 'deep learning algorithms. 此处考虑语义对比应该加回算法二字。改为深度学习算法。', 'origin_text': '线性代数对于理解和从事机器学习算法相关工作是很有必要的，尤其对于  !!!深度学习!!!  而言。因此，在我们开始介绍深度学习之前，我们集中探讨一些必备的', 'time': '2017-01-25T08:10'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'If you have previous experience with these concepts\\n如果你已经了解这些概念', 'origin_text': '知识。如果你已经很熟悉线性代数，那么你可以轻松地跳过本章。  !!!如果你先前接触过本章的内容!!!  ，但是需要一份索引表来回顾一些重要公式，那么我们推荐\\\\emph{', 'time': '2017-01-25T08:13'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'types\\n类', 'origin_text': '数知识。标量、向量、矩阵和张量学习线性代数，会涉及以下几  !!!个!!!  数学概念：  标量：一个标量就是一个单独的数，不同于线性代', 'time': '2017-01-25T08:14'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'which are usually arrays of multiple numbers\\n通常是多个数字的序列', 'origin_text': '  标量：一个标量就是一个单独的数，不同于线性代数中大多数概念  !!!会涉及到多个数!!!  。  我们用斜体表示标量。标量通常赋予小写的变量名称。  当', 'time': '2017-01-25T08:16'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '被赋予', 'origin_text': '数中大多数概念会涉及到多个数。  我们用斜体表示标量。标量通常  !!!赋予!!!  小写的变量名称。  当我们介绍标量时，会明确它们是哪种类型的数', 'time': '2017-01-25T08:16'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'then the vector lies in the set formed by taking the Cartesian product of R n times\\n那么该向量属于实数集R的n次笛卡尔乘积构成的集合中', 'origin_text': '如果每个元素都属于ℝR\\\\SetR，并且该向量有nn\\\\Sn个元素，  !!!那么该向量属于实数集ℝR\\\\SetR笛卡尔乘积nn\\\\Sn次!!!  ，表示为ℝnRn\\\\SetR^n。  当我们需要明确表示向量中的', 'time': '2017-01-25T08:20'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'Sometimes we need to index a set of elements of a vector\\n有时我们需要指明向量中的元素构成的集合', 'origin_text': '向量看作空间中的点，每个元素是不同的坐标轴上的坐标。      !!!有时我们需要指定向量中某个集合的元素!!!  。  在这种情况下，我们定义一个包含这些索引的集合，然后将该集', 'time': '2017-01-25T08:22'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '指明集合的补集', 'origin_text': '1,3,6}，然后写作xSxS\\\\Vx_S。我  们用符号−−-  !!!表示集合的补集中的索引!!!  。  比如x−1x−1\\\\Vx_{-1}表示xx\\\\Vx中除x1x', 'time': '2017-01-25T08:23'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '以不加粗的斜体形式使用其名称', 'origin_text': 'R^{m\\\\times n}。  我们在表示矩阵中的元素时，通常  !!!使用其名称以不加粗的斜体形式!!!  ，索引用逗号间隔。  比如，A1,1A1,1\\\\SA_{1,1}', 'time': '2017-01-25T08:24'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'We can identify allof the numbers with vertical coordinateiby writing a “:” for the horizontalcoordinate\\n我们可以通过使用\":\"表示水平坐标，以表示垂直坐标i中的所有元素', 'origin_text': 'm,nAm,n\\\\SA_{m,n}表示AA\\\\MA右下的元素。    !!!我们表示垂直坐标ii\\\\Si中的所有元素时，用”:”表示水平坐标。!!!    比如，Ai,:Ai,:\\\\MA_{i,:}表示AA\\\\MA中垂', 'time': '2017-01-25T08:26'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'but donot convert anything to lower case\\n但不必将矩阵的变量名称小写化', 'origin_text': '引，而不是单个元素。  在这种情况下，我们在表达式后面接下标，  !!!但不需要写作小写字母!!!  。  比如，f(A)i,jf(A)i,jf(\\\\MA)_{i,j', 'time': '2017-01-25T08:28'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'an array of numbers 一列数字', 'origin_text': '张量：在某些情况下，我们会讨论不只两维坐标的数组。  一般地，  !!!一组数组中的元素!!!  分布在若干维坐标的规则网格中，我们将其称之为张量。  我们使用', 'time': '2017-01-25T08:29'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '我们通过将向量元素作为行矩阵写在文本行中，然后使用转置操作将其变为标准列向量，来定义一个向量', 'origin_text': '列的矩阵。对应地，向量的转置可以看作是只有一行的矩阵。有时，  !!!我们将向量表示成行矩阵的转置，写在行中，然后使用转置将其变为标准的列向量!!!  ，比如x=[x1,x2,x3]⊤x=[x1,x2,x3]⊤\\\\Vx', 'time': '2017-01-25T08:36'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'deﬁne a matrix withbcopied intoeach row\\n定义一个将向量b复制到每一行生成的矩阵', 'origin_text': '矩阵AA\\\\MA的每一行相加。这个速记方法使我们无需在加法操作前  !!!定义复制向量bb\\\\Vb到矩阵的每一行!!!  。这种隐式地复制向量bb\\\\Vb到很多位置的方式，被称为广播。', 'time': '2017-01-25T08:37'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '虽然词汇为速记，但是写作简写似乎更流畅', 'origin_text': '}。换言之，向量bb\\\\Vb和矩阵AA\\\\MA的每一行相加。这个  !!!速记!!!  方法使我们无需在加法操作前定义复制向量bb\\\\Vb到矩阵的每一行。', 'time': '2017-01-25T08:39'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'We can write the matrix product just by placing two or more matricestogether\\n我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法', 'origin_text': '矩阵CC\\\\MC的形状是m×pm×p\\\\Sm\\\\times \\\\Sp。  !!!矩阵乘积可以作用于两个或多个并在一起的矩阵!!!  ，例如C=AB.C=AB.\\\\begin{equation} ', 'time': '2017-01-25T08:40'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'b属于R^m', 'origin_text': '\\\\MA\\\\in \\\\SetR^{m\\\\times n}是一个已知矩阵，  !!!b!!!  b\\\\Vb是一个已知向量，xx\\\\Vx是一个我们要求解的未知向量。', 'time': '2017-01-25T08:42'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'x属于R^n', 'origin_text': '{m\\\\times n}是一个已知矩阵，bb\\\\Vb是一个已知向量，  !!!x!!!  x\\\\Vx是一个我们要求解的未知向量。向量xx\\\\Vx的每一个元素', 'time': '2017-01-25T08:42'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '方程', 'origin_text': '_m.\\\\end{gather}矩阵向量乘积符号为这种形式的  !!!等式!!!  提供了更紧凑的表示。单位矩阵和逆矩阵线性代数提供了被', 'time': '2017-01-25T08:42'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '为具有大多数值的矩阵A求解式2.11\\n这里表达的应该是A可能有很多不同的数值，对于其中存在矩阵逆的A，可以通过矩阵逆来求解2.11', 'origin_text': '逆矩阵线性代数提供了被称为矩阵逆的强大工具，使我们能够解析地  !!!求解具有多值矩阵AA\\\\MA的\\\\eqn?!!!  。为了描述矩阵逆，我们首先需要定义单位矩阵的概念。任意向量', 'time': '2017-01-25T08:46'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '在大多数软件应用程序中实际使用', 'origin_text': '矩阵A−1A−1\\\\MA^{-1}主要是作为理论工具使用的，并不会  !!!在实际中使用于大多数软件应用程序中!!!  。这是因为逆矩阵A−1A−1\\\\MA^{-1}在数字计算机上只能', 'time': '2017-01-25T08:47'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '但是，对于方程组而言，\\nHowever出现在此处而不是后面。\\nthe system of equations 方程组', 'origin_text': '在，那么\\\\eqn?肯定对于每一个向量bb\\\\Vb恰好存在一个解。  !!!对系统方程而言!!!  ，对于某些bb\\\\Vb的值，有可能不存在解，或者存在无限多个解。', 'time': '2017-01-25T08:53'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '此处没有However。\\n以及此处应该有一个短句：对于特定的向量b（for a particular b）', 'origin_text': '言，对于某些bb\\\\Vb的值，有可能不存在解，或者存在无限多个解。  !!!然而，!!!  存在多于一个解但是少于无限多个解的情况是不可能发生的；因为如果x', 'time': '2017-01-25T08:54'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '如前所言，应为 方程组', 'origin_text': '多个解的情况是不可能发生的；因为如果xx\\\\Vx和yy\\\\Vy都是某  !!!系统方程!!!  的解，则z=αx+(1−α)yz=αx+(1−α)y\\\\begi', 'time': '2017-01-25T08:55'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '为了分析\\nTo analyse', 'origin_text': 'n}（其中αα\\\\alpha取任意实数）也是该系统方程的解。  !!!分析!!!  方程有多少个解，我们可以将AA\\\\MA的列向量看作是从原点（元素都', 'time': '2017-01-25T08:55'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '标量系数', 'origin_text': '性组合。形式上，某个集合中向量的线性组合，是指每个向量乘以对应  !!!系数!!!  之后的和，即：∑iciv(i).∑iciv(i).\\\\begin', 'time': '2017-01-25T09:00'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '矩阵逆', 'origin_text': '方阵或者是一个奇异的方阵，该方程仍然可能有解。但是我们不能使用  !!!逆矩阵!!!  去求解。目前为止，我们已经讨论了逆矩阵左乘。我们也可以定义逆', 'time': '2017-01-25T09:17'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'L2范数', 'origin_text': '              当p=2p=2p=2时，  !!!L2!!!  L2L^2被称为欧几里得范数。它表示从原点出发到向量xx\\\\Vx', 'time': '2017-01-25T09:53'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'discriminate between elements that are exactlyzero and elements that are small but nonzero\\n区分恰好是零的元素和非零小值的元素', 'origin_text': '受欢迎，因为它在原点附近增长得十分缓慢。在某些机器学习应用中，  !!!区分元素值恰好是零还是非零小值!!!  是很重要的。在这些情况下，我们更倾向于使用在各个位置斜率相同，', 'time': '2017-01-25T09:58'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'turn to 转向', 'origin_text': '，区分元素值恰好是零还是非零小值是很重要的。在这些情况下，我们  !!!更倾向于!!!  使用在各个位置斜率相同，同时保持简单的数学形式的函数：L1L1L', 'time': '2017-01-25T10:02'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '向量', 'origin_text': '术语在数学意义上是不对的。向量的非零元素的数目不是范数，因为对  !!!标量!!!  放缩αα\\\\alpha倍不会改变该向量非零的数目。因此，L1L1', 'time': '2017-01-25T10:05'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '非零元素', 'origin_text': '素的数目不是范数，因为对标量放缩αα\\\\alpha倍不会改变该向量  !!!非零!!!  的数目。因此，L1L1L^1范数经常作为表示非零元素数目的替代', 'time': '2017-01-25T10:06'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'magnitude在这里写成大小就好了。翻译成幅度有些别扭。', 'origin_text': 'nfty范数，也被称为max 范数。这个范数表示向量中具有最大  !!!幅度!!!  的元素的绝对值：‖x‖∞=maxi|xi|.‖x‖∞=maxi', 'time': '2017-01-25T10:11'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '方阵', 'origin_text': 'iag}(\\\\Vv)\\\\Vx=\\\\Vv \\\\odot \\\\Vx。计算对角  !!!矩阵!!!  的逆矩阵也很高效。对角矩阵的逆矩阵存在，当且仅当对角元素都是非', 'time': '2017-01-25T10:16'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '在很多情况下', 'origin_text': 'iag}([1/v_1,\\\\dots,1/v_n]^\\\\top)。  !!!在很多情况!!!  ，我们可以根据任意矩阵导出一些通用的机器学习算法；但通过将一些矩', 'time': '2017-01-25T10:17'}\n{'user': 'acct:binfengjia@hypothes.is', 'text': '此处应该是第i个特征向量vi', 'origin_text': '察$\\\\MA$拉伸单位圆的方式，我们可以看到它能够将$\\\\Vv^{(  !!!2)!!!  }$方向的空间拉伸到$\\\\lambda_i$。\\t}\\\\end{fig', 'time': '2017-01-25T15:01'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '产生', 'origin_text': '性而更好地理解，这些属性是通用的，而不是由我们选择表示它们的方式  !!!引起!!!  的。例如，整数可以分解为质数。我们可以用十进制或二进制', 'time': '2017-01-26T01:37'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '距离度量矩阵', 'origin_text': '函数生成元素时，对称矩阵经常会出现。例如，如果AA\\\\MA是一个  !!!表示距离的矩阵!!!  ，Ai,jAi,j\\\\MA_{i,j}表示点iii到点jjj的距离', 'time': '2017-01-26T01:37'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '一组向量的线性组合', 'origin_text': 'equation}一般而言，这种操作被称为线性组合。形式上，  !!!某个集合中向量的线性组合!!!  ，是指每个向量乘以对应系数之后的和，即：∑iciv(i).∑i', 'time': '2017-01-26T01:37'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '质因数', 'origin_text': '不是由我们选择表示它们的方式引起的。例如，整数可以分解为  !!!质数!!!  。我们可以用十进制或二进制等不同方式表示整数121212，但质', 'time': '2017-01-26T01:46'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '但是12=2*3*3总是成立的', 'origin_text': '质数。我们可以用十进制或二进制等不同方式表示整数121212，  !!!但质因数分解永远是对的12=2×3×3!!!  12=2×3×312=2\\\\times 3\\\\times 3。从这', 'time': '2017-01-26T01:48'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'a left eigenvector 做特征向量', 'origin_text': 'bda被称为这个特征向量对应的特征值。（类似地，我们也可以定义  !!!左奇异向量!!!   v⊤A=λv⊤v⊤A=λv⊤\\\\Vv^\\\\top\\\\MA=\\\\lamb', 'time': '2017-01-26T01:52'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'right eigenvectors\\n右特征向量', 'origin_text': 'op\\\\MA=\\\\lambda \\\\Vv^\\\\top，但是通常我们更关注  !!!右奇异向量!!!  ）。如果vv\\\\Vv是AA\\\\MA的特征向量，那么任何放缩后的向', 'time': '2017-01-26T01:52'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '连接成', 'origin_text': '_1, \\\\dots , \\\\lambda_n }。我们将特征向量  !!!连接!!!  一个矩阵，使得每一列是一个特征向量：V=[v(1),…,v(n)', 'time': '2017-01-26T02:04'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '特征分解存在，但是会涉及到复数', 'origin_text': '每一个矩阵都可以分解成特征值和特征向量。在某些情况下，特征分解  !!!会!!!  涉及到复数，而非实数。幸运的是，在本书中我们通常只需要探讨一类', 'time': '2017-01-26T02:07'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '分解', 'origin_text': '征分解会涉及到复数，而非实数。幸运的是，在本书中我们通常只需要  !!!探讨!!!  一类有简单分解的矩阵。具体地，每个实对称矩阵都可以分解成实特征', 'time': '2017-01-26T02:08'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '那么在由这些特征向量得到的生成子空间中', 'origin_text': '特征分解可能并不唯一。如果两个或多个特征向量拥有相同的特征值，  !!!那么这组特征向量生成子空间中!!!  ，任意一组正交向量都是该特征值对应的特征向量。因此，我们可以使', 'time': '2017-01-26T02:18'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '“不应该是作为Q的特征向量，而是直接构成Q啊”。\\n我们可以等价地从这些特征向量中构成Q作为替代', 'origin_text': '成子空间中，任意一组正交向量都是该特征值对应的特征向量。因此，  !!!我们可以使用任意一组正交向量作为QQ\\\\MQ的特征向量!!!  。按照惯例，我们通常按降序排列ΛΛ\\\\VLambda的条目。在', 'time': '2017-01-26T02:20'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '元素', 'origin_text': '的特征向量。按照惯例，我们通常按降序排列ΛΛ\\\\VLambda的  !!!条目!!!  。在该约定下，特征分解唯一当且仅当所有的特征值都是唯一的。', 'time': '2017-01-26T02:20'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '与特征分解同类型的信息', 'origin_text': '，将矩阵分解为奇异向量和奇异值。通过奇异值分解，我们会得到一些  !!!类似特征分解的信息!!!  。然而，奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值', 'time': '2017-01-26T02:34'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '定义', 'origin_text': '.\\\\end{equation}计算伪逆的实际算法没有基于这个  !!!式子!!!  ，而是使用下面的公式：A+=VD+U⊤.A+=VD+U⊤.\\\\b', 'time': '2017-01-26T02:58'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '特别', 'origin_text': '的列数多于行数时，使用伪逆求解线性方程是众多可能解法中的一种。  !!!具体!!!  地，x=A+yx=A+y\\\\Vx=\\\\MA^+\\\\Vy是方程所有可行解', 'time': '2017-01-26T03:00'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '因为已经说没有解了，所以后面不应该说x是解。写作“通过伪逆得到的x使得Ax和y的欧几里得距离||Ax-y||2最小”', 'origin_text': '当矩阵AA\\\\MA的行数多于列数时，可能没有解。在这种情况下，  !!!通过伪逆得到的xx\\\\Vx是使得AxAx\\\\MA\\\\Vx和yy\\\\Vy的欧几里得距离‖Ax−y‖2‖Ax−y‖2\\\\norm{\\\\MA\\\\Vx-\\\\Vy}_2最小的解!!!  。迹运算迹运算返回的是矩阵对角元素的和：Tr(A)=∑', 'time': '2017-01-26T03:05'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '有用', 'origin_text': '{i,i}.\\\\end{equation}迹运算因为很多原因而  !!!受到关注!!!  。若不使用求和符号，有些矩阵运算很难描述，而通过矩阵乘法和迹运', 'time': '2017-01-26T03:13'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'a square matrix composed of many factors\\n多个矩阵乘积得到的方阵的迹', 'origin_text': '=\\\\Tr(\\\\MA^\\\\top).\\\\end{equation}  !!!多个矩阵乘积的迹!!!  ，和将这些矩阵中最后一个挪到最前面之后乘积的迹是相同的。当然，', 'time': '2017-01-26T03:26'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '因为这里只有一个矩阵，所以没有相乘。改为“参与矩阵乘法”', 'origin_text': '。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵  !!!相乘!!!  后空间扩大或者缩小了多少。如果行列式是000,那么空间至少沿着', 'time': '2017-01-26T03:32'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '参与矩阵乘法', 'origin_text': '完全收缩了，使其失去了所有的体积。如果行列式是111,那么矩阵  !!!相乘!!!  没有改变空间体积。实例：主成分分析主成分分析是一个简单的', 'time': '2017-01-26T03:32'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '这里有一个问题，不是翻译上的而是叙述上的。按照之前正交矩阵的定义，列向量之间不仅需要是正交的，而且应该是标准正交的。那这样的话这里即使l=n 也并非正交矩阵啊', 'origin_text': '了使编码问题简单一些，PCA限制DD\\\\MD的列向量为彼此正交的（  !!!注意，除非l=nl=nl=n，否则严格上DD\\\\MD不是一个正交矩阵!!!  ）。目前为止所描述的问题，可能会有多个解。因为如果我们按比', 'time': '2017-01-26T03:46'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'turn into 变为', 'origin_text': '们限制DD\\\\MD中所有列向量都有单位范数。为了将这个基本想法  !!!放进!!!  我们能够实现的算法，首先我们需要明确如何根据每一个输入xx\\\\Vx', 'time': '2017-01-26T03:48'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '向量微积分', 'origin_text': 'c^\\\\top\\\\Vc\\\\end{equation}我们可以通过  !!!线性代数微积分!!!  来求解这个最优化问题（如果你不清楚怎么做，请参考\\\\sec?）∇', 'time': '2017-01-26T03:54'}\n{'user': 'acct:badpoem@hypothes.is', 'text': ' such that 使得', 'origin_text': 'etR^{m\\\\times n}是将描述点的向量堆叠在一起的矩阵，  !!!例如!!!  Xi,:=x(i)⊤Xi,:=x(i)⊤\\\\MX_{i,:}=\\\\V', 'time': '2017-01-26T04:03'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '概率论', 'origin_text': '的基础数学学科之一。另一门在机器学习中无处不在的重要数学学科是  !!!概率学!!!  ，我们将在下章探讨。               ', 'time': '2017-01-26T04:10'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '此处应该是i，而不是2', 'origin_text': '察$\\\\MA$拉伸单位圆的方式，我们可以看到它能够将$\\\\Vv^{(  !!!2!!!  )}$方向的空间拉伸到$\\\\lambda_i$。\\t}\\\\end{fi', 'time': '2017-01-26T04:15'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '应该是拉伸了lamda_i倍', 'origin_text': '位圆的方式，我们可以看到它能够将$\\\\Vv^{(2)}$方向的空间  !!!拉伸到$\\\\lambda_i$!!!  。\\t}\\\\end{figure}\\\\begin{figure}[!h', 'time': '2017-01-26T04:15'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '此处集中写一个不归属于翻译问题的错误。是式子（如定义、定理）等的索引。在v4.0-alpha中，有一些索引出了问题，比如图2,2被建立了索引，这是不应该的，再比如式子2.80的上一行提到了式2.55，但是这个索引是不对的，应该是2.52。并且现在的索引和原书中也不完全一致。因为这个问题比较大，而且涉及比较多，所以于此统一指出，而不在后面细究每一个索引是否有问题。', 'origin_text': '                              !!!线性代数!!!  作为数学的一个分支，广泛用于科学和工程中。然而，因为线性代数主', 'time': '2017-01-26T06:07'}\n{'user': 'acct:showgood163@hypothes.is', 'text': '在原本中，标量是小写字母，矢量是小写加粗字母，矩阵是大写斜体字母，张量是大写正体字母。在译文中，格式不太合适。', 'origin_text': '本章跳过了很多重要但是对于理解深度学习非必需的线性代数知识。  !!!标量、向量、矩阵和张量!!!  学习线性代数，会涉及以下几个数学概念：  标量：一个标', 'time': '2017-02-07T02:58'}\n{'user': 'acct:angrymidiao@hypothes.is', 'text': '“', 'origin_text': '确它们是哪种类型的数。  比如，在定义实数标量时，我们可能会说  !!!”!!!  让s∈ℝs∈R\\\\Ss \\\\in \\\\SetR表示一条线的斜率”；在定', 'time': '2017-02-09T13:08'}\n{'user': 'acct:angrymidiao@hypothes.is', 'text': '“', 'origin_text': ' \\\\SetR表示一条线的斜率”；在定义自然数标量时，我们可能会说  !!!”!!!  让n∈ℕn∈N\\\\Sn\\\\in\\\\SetN表示元素的数目”。', 'time': '2017-02-09T13:08'}\n{'user': 'acct:angrymidiao@hypothes.is', 'text': 'i行j列', 'origin_text': 'MA)_{i,j}表示函数fff作用在AA\\\\MA上输出的矩阵的第  !!!(i,j)(i,j)(i,j)!!!  个元素。    张量：在某些情况下，我们会讨论不只', 'time': '2017-02-09T13:18'}\n{'user': 'acct:angrymidiao@hypothes.is', 'text': '合理', 'origin_text': 'A和BB\\\\MB的矩阵乘积是第三个矩阵CC\\\\MC。为了使乘法定义  !!!良好!!!  ，矩阵AA\\\\MA的列数必须和矩阵BB\\\\MB的行数相等。如果矩阵', 'time': '2017-02-09T13:24'}\n{'user': 'acct:angrymidiao@hypothes.is', 'text': '在放缩后的末尾', 'origin_text': '及到xx\\\\Vx中每个元素的放缩，如果DD\\\\MD是瘦长型矩阵，那么  !!!放缩后末尾!!!  添加一些零；如果DD\\\\MD是胖宽型矩阵，那么放缩后去掉最后一些元', 'time': '2017-02-09T14:34'}\n{'user': 'acct:angrymidiao@hypothes.is', 'text': '在放缩后', 'origin_text': '矩阵，那么放缩后末尾添加一些零；如果DD\\\\MD是胖宽型矩阵，那么  !!!放缩后!!!  去掉最后一些元素。对称矩阵是转置和自己相等的矩阵：A=', 'time': '2017-02-09T14:34'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '一个二', 'origin_text': 'Sx_6外所有元素构成的向量。        矩阵：矩阵是  !!!二!!!  维数组，其中的每一个元素被两个索引而非一个所确定。  我们通常', 'time': '2017-02-11T17:58'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '令', 'origin_text': '它们是哪种类型的数。  比如，在定义实数标量时，我们可能会说”  !!!让!!!  s∈Rs∈R\\\\Ss \\\\in \\\\SetR表示一条线的斜率”；在定义', 'time': '2017-02-11T20:09'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '令', 'origin_text': '\\\\SetR表示一条线的斜率”；在定义自然数标量时，我们可能会说”  !!!让!!!  n∈Nn∈N\\\\Sn\\\\in\\\\SetN表示元素的数目”。', 'time': '2017-02-11T20:10'}\n{'user': 'acct:zhzhang@hypothes.is', 'text': '“-”', 'origin_text': 'S={1,3,6}，然后写作xSxS\\\\Vx_S。我  们用符号  !!!−!!!  −-表示集合的补集中的索引。  比如x−1x−1\\\\Vx_{-1', 'time': '2017-02-11T20:12'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:badpoem@hypothes.is', 'text': '好的。那这样翻译为多值矩阵就没问题了。', 'time': '2017-03-01T01:44'}\n{'user': 'acct:liber145@hypothes.is', 'text': '额，我觉得原文是想说 求解式2.11式，矩阵A是固定的，它比较难解的原因在于A有多个数（如果是一元一次方程的话，那就不需要矩阵逆这样的操作了），而矩阵逆可以轻松解决这个问题。 如果注重A是非固定的，可以有其他可能取值，感觉没有表达这个意思。。', 'time': '2017-02-28T17:11'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的，改成你那样的。', 'time': '2017-02-28T16:54'}\n{'user': 'acct:liber145@hypothes.is', 'text': '刚看到邮件，才发现你已经回复了！', 'time': '2017-02-28T16:51'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '嗯呐 我觉得交换顺序了就没问题了 有了单位范数和彼此正交的限制，这里的“否则”二字才能成立', 'time': '2017-02-28T06:56'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '是因为当时我在理解的时候花了一些时间，所以我修改的目的在于强调这个“生成子空间”是由提到的拥有相同特征值的向量得到的。这样子', 'time': '2017-02-28T06:50'}\n{'user': 'acct:badpoem@hypothes.is', 'text': 'allows us to analytically solve equation 2.11 for many values of A 原文是这样的。所以我的理解还是在于A有多种可能的取值。', 'time': '2017-02-28T06:46'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '我觉得我对张量的理解好像有一点问题TAT。就按照你提出这个吧', 'time': '2017-02-28T06:42'}\n{'user': 'acct:badpoem@hypothes.is', 'text': '我觉得这样表达就没问题了。因为后面有使用集合来指代这里的a set of elements 所以我按照那个样子断句的。', 'time': '2017-02-28T06:35'}\n{'user': 'acct:liber145@hypothes.is', 'text': '嗯，顺序上有些问题。紧接着下面一段提到了D中向量是单位向量。这两个限制条件是独立的。\\n\\n现打算将这两段换个先后顺序，你看如何。', 'time': '2017-02-28T04:53'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞！多谢细致地帮忙校对，真是太感谢了！', 'time': '2017-02-28T04:34'}\n{'user': 'acct:liber145@hypothes.is', 'text': '噢！对的。多谢指正啊！', 'time': '2017-02-28T04:05'}\n{'user': 'acct:liber145@hypothes.is', 'text': '感觉直接说 一个向量集的生成子空间 挺顺的。暂时打算翻译为 “那么在这组特征向量的生成子空间中 ”，或者你有什么其他看法。', 'time': '2017-02-28T04:03'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞语序！', 'time': '2017-02-28T03:21'}\n{'user': 'acct:liber145@hypothes.is', 'text': '嗯，我觉得这里只是说明 A 作为矩阵，含有很多个数。', 'time': '2017-02-28T03:18'}\n{'user': 'acct:liber145@hypothes.is', 'text': '这个翻译得比之前好多啦！', 'time': '2017-02-28T03:02'}\n{'user': 'acct:liber145@hypothes.is', 'text': '嗯，单独翻译感觉这样挺好的。那块前面有个 array 我给翻译成 数组 了，所以这里也想用数组。\\n\\n现打算翻译成“一个数组的元素”，你看这样如何。', 'time': '2017-02-28T03:00'}\n{'user': 'acct:liber145@hypothes.is', 'text': '额，这里断句不太一样，我偏向于 a set of elements | of | a vector，你的好像是 a set | of | elements of a vector. \\n\\n现打算翻译为“有时我们需要指定向量中的一些元素”，你看如何。', 'time': '2017-02-28T02:34'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的，谢啦！', 'time': '2017-02-08T01:58'}\n{'user': 'acct:liber145@hypothes.is', 'text': '嗯，字体格式也是需要注意的。可以具体说下哪些地方需要修改的么，我一时半会儿没找到。', 'time': '2017-02-08T01:50'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-02-08T01:40'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞！', 'time': '2017-02-08T01:39'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'OK，谢谢啦！新版英文中缩了一个式子，tex版本中已修正过来。', 'time': '2017-02-08T01:38'}"
  },
  {
    "path": "Chapter2/linear_algebra.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Yujun Li \n\\chapter{线性代数}\n\\label{chap:linear_algebra}\n\n线性代数作为数学的一个分支，广泛应用于科学和工程中。\n然而，因为线性代数主要是面向连续数学，而非离散数学，所以很多计算机科学家很少接触它。\n掌握好线性代数对于理解和从事机器学习算法相关工作是很有必要的，尤其对于深度学习算法而言。\n因此，在开始介绍深度学习之前，我们集中探讨一些必备的线性代数知识。\n\n\n如果你已经很熟悉线性代数，那么可以轻松地跳过本章。\n如果你已经了解这些概念，但是需要一份索引表来回顾一些重要公式，那么我们推荐\\emph{The Matrix Cookbook} \\citep{matrix-cookbook}。\n如果你没有接触过线性代数，那么本章将告诉你本书所需的线性代数知识，不过我们仍然非常建议你参考其他专门讲解线性代数的文献，例如~\\cite{shilov1977linear}。\n最后，本章略去了很多重要但是对于理解深度学习非必需的线性代数知识。\n\n\n\n\n\\section{标量、向量、矩阵和张量}\n\\label{sec:scalars_vectors_matrices_and_tensors}\n\n学习线性代数，会涉及以下几类数学概念：\n\\begin{itemize}\n    \\item \\firstgls{scalar}：一个标量就是一个单独的数，它不同于线性代数中研究的其他大部分对象（通常是多个数的数组）。\n    我们用斜体表示标量。标量通常被赋予小写的变量名称。\n    当我们介绍标量时，会明确它们是哪种类型的数。\n    比如，在定义实数标量时，我们可能会说``令$\\Ss \\in \\SetR$表示一条线的斜率''；在定义自然数标量时，我们可能会说``令$\\Sn\\in\\SetN$表示元素的数目''。\n\n% -- 29 --\n\n    \\item \\firstgls{vector}：一个向量是一列数。\n    这些数是有序排列的。\n    通过次序中的\\gls{index}，我们可以确定每个单独的数。\n    通常我们赋予向量粗体的小写变量名称，比如$\\Vx$。\n    向量中的元素可以通过带脚标的斜体表示。\n    向量$\\Vx$的第一个元素是$\\Sx_1$，第二个元素是$\\Sx_2$，等等。\n    我们也会注明存储在向量中的元素是什么类型的。\n    如果每个元素都属于$\\SetR$，并且该向量有$\\Sn$个元素，那么该向量属于实数集$\\SetR$的$\\Sn$次笛卡尔乘积构成的集合，记为$\\SetR^n$。\n    当需要明确表示向量中的元素时，我们会将元素排列成一个方括号包围的纵列：\n    \\begin{equation}\n        \\Vx=\\begin{bmatrix} \\Sx_1   \\\\  \n                            \\Sx_2   \\\\ \n                            \\vdots  \\\\ \n                            \\Sx_n \n                \\end{bmatrix}.\n    \\end{equation}\n    我们可以把向量看作空间中的点，每个元素是不同坐标轴上的坐标。\n    \n    有时我们需要\\gls{index}向量中的一些元素。\n    在这种情况下，我们定义一个包含这些元素\\gls{index}的集合，然后将该集合写在脚标处。\n    比如，指定$\\Sx_1$，$\\Sx_3$和$\\Sx_6$，我们定义集合$S=\\{1,3,6\\}$，然后写作$\\Vx_S$。我\n    们用符号－表示集合的补集中的\\gls{index}。\n    比如$\\Vx_{-1}$表示$\\Vx$中除$\\Sx_1$外的所有元素，$\\Vx_{-S}$表示$\\Vx$中除$\\Sx_1$，$\\Sx_3$，$\\Sx_6$外所有元素构成的向量。\n\n    \\item \\firstgls{matrix}：矩阵是一个二维数组，其中的每一个元素被两个\\gls{index}（而非一个）所确定。\n    我们通常会赋予矩阵粗体的大写变量名称，比如$\\MA$。\n    如果一个实数矩阵高度为$m$，宽度为$n$，那么我们说$\\MA\\in \\SetR^{m\\times n}$。\n    我们在表示矩阵中的元素时，通常以不加粗的斜体形式使用其名称，\\gls{index}用逗号间隔。\n    比如，$\\SA_{1,1}$表示$\\MA$左上的元素，$\\SA_{m,n}$表示$\\MA$右下的元素。\n    我们通过用``:''表示水平坐标，以表示垂直坐标$\\Si$中的所有元素。\n    比如，$\\MA_{i,:}$表示$\\MA$中垂直坐标$i$上的一横排元素。\n    这也被称为$\\MA$的第$i$~\\firstgls{row}。\n    同样地，$\\MA_{:,i}$表示$\\MA$的第$i$~\\firstgls{column}。\n    当我们需要明确表示矩阵中的元素时，我们将它们写在用方括号括起来的数组中：\n    \\begin{equation}\n        \\begin{bmatrix}\n            A_{1,1} & A_{1,2} \\\\\n            A_{2,1} & A_{2,2} \\\\\n        \\end{bmatrix}.\n    \\end{equation}\n    有时我们需要\\gls{index}矩阵值表达式，而这些表达式不是单个字母。\n    在这种情况下，我们在表达式后面接下标，但不必将矩阵的变量名称小写化。\n    比如，$f(\\MA)_{i,j}$表示函数$f$作用在$\\MA$上输出的矩阵的第$i$行第$j$列元素。\n\n% -- 30 --\n\n    \\item \\firstgls{tensor}：在某些情况下，我们会讨论坐标超过两维的数组。\n    一般地，一个数组中的元素分布在若干维坐标的规则网格中，我们称之为张量。\n    我们使用字体$\\TSA$来表示张量``A''。\n    张量$\\TSA$中坐标为$(i,j,k)$的元素记作$\\TEA_{i,j,k}$。\n\\end{itemize}\n\n\n\\firstgls{transpose}是矩阵的重要操作之一。\n矩阵的转置是以对角线为轴的镜像，这条从左上角到右下角的对角线被称为\\firstgls{main_diagonal}。\n\\figref{fig:chap2_transpose}显示了这个操作。\n我们将矩阵$\\MA$的转置表示为$\\MA^\\top$，定义如下\n\\begin{equation}\n(\\MA^\\top)_{i,j}= \\SA_{j,i}.\n\\end{equation}\n\n向量可以看作只有一列的矩阵。\n对应地，向量的转置可以看作是只有一行的矩阵。\n有时，我们通过将向量元素作为行矩阵写在文本行中，然后使用转置操作将其变为标准的列向量，来定义一个向量，比如$\\Vx=[\\Sx_1, \\Sx_2, \\Sx_3]^\\top$.\n\n\n标量可以看作是只有一个元素的矩阵。\n因此，标量的转置等于它本身，$\\Sa=\\Sa^\\top$。\n\n\\begin{figure}[!hbt]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter2/figures/transpose}}\n\\fi\n\\caption{矩阵的转置可以看成以主对角线为轴的一个镜像。}\n\\label{fig:chap2_transpose}\n\\end{figure}\n\n% -- 31 --\n\n只要矩阵的形状一样，我们可以把两个矩阵相加。\n两个矩阵相加是指对应位置的元素相加，比如$\\MC=\\MA+\\MB$，其中$\\SC_{i,j}= \\SA_{i,j}+\\SB_{i,j}$。\n\n\n标量和矩阵相乘，或是和矩阵相加时，我们只需将其与矩阵的每个元素相乘或相加，比如$\\MD = \\Sa \\cdot \\MB + \\Sc$，其中$\\SD_{i,j} = \\Sa\\cdot  \\SB_{i,j} + \\Sc$。\n\n\n在深度学习中，我们也使用一些不那么常规的符号。\n我们允许矩阵和向量相加，产生另一个矩阵：$\\MC=\\MA + \\Vb$，其中$\\SC_{i,j}= \\SA_{i,j} + \\Sb_{j}$。\n换言之，向量$\\Vb$和矩阵$\\MA$的每一行相加。\n这个简写方法使我们无需在加法操作前定义一个将向量$\\Vb$复制到每一行而生成的矩阵。\n这种隐式地复制向量$\\Vb$到很多位置的方式，被称为\\firstgls{broadcasting}。\n\n\n\n\n\\section{矩阵和向量相乘}\n\\label{sec:multiplying_matrices_and_vectors}\n\n矩阵乘法是矩阵运算中最重要的操作之一。\n两个矩阵$\\MA$和$\\MB$的\\firstgls{matrix_product}是第三个矩阵$\\MC$。\n为了使乘法定义良好，矩阵$\\MA$的列数必须和矩阵$\\MB$的行数相等。\n如果矩阵$\\MA$的形状是$\\Sm \\times \\Sn$，矩阵$\\MB$的形状是$\\Sn\\times \\Sp$，那么矩阵$\\MC$的形状是$\\Sm\\times \\Sp$。\n我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法，例如\n\\begin{equation}\n    \\MC=\\MA\\MB.\n\\end{equation}\n\n\n具体地，该乘法操作定义为\n\\begin{equation}\n    \\SC_{i,j}=\\sum_k \\SA_{i,k} \\SB_{k,j}.\n\\end{equation}\n\n\n需要注意的是，两个矩阵的标准乘积\\emph{不是}指两个矩阵中对应元素的乘积。\n不过，那样的矩阵操作确实是存在的，被称为\\firstgls{element_wise_product}或者\\firstgls{hadamard_product}，记为$\\MA\\odot\\MB$。\n\n\n两个相同维数的向量$\\Vx$和$\\Vy$的\\firstgls{dot_product}可看作是矩阵乘积$\\Vx^\\top\\Vy$。\n我们可以把矩阵乘积$\\MC=\\MA\\MB$中计算$\\SC_{i,j}$的步骤看作是$\\MA$的第$\\Si$行和$\\MB$的第$\\Sj$列之间的\\gls{dot_product}。\n\n\n矩阵乘积运算有许多有用的性质，从而使矩阵的数学分析更加方便。\n比如，矩阵乘积服从分配律：\n\\begin{equation}\n    \\MA(\\MB+\\MC)=\\MA\\MB +\\MA\\MC.\n\\end{equation}\n矩阵乘积也服从结合律：\n\\begin{equation}\n\\MA(\\MB\\MC)=(\\MA\\MB)\\MC.\n\\end{equation}\n\n\n% -- 32 --\n\n\n不同于标量乘积，矩阵乘积\\emph{并不}满足交换律（$\\MA\\MB=\\MB\\MA$的情况并非总是满足）。\n然而，两个向量的\\firstgls{dot_product}满足交换律：\n\\begin{equation}\n\\Vx^\\top\\Vy=\\Vy^\\top\\Vx.\n\\label{eq:2.8}\n\\end{equation}\n\n\n矩阵乘积的转置有着简单的形式：\n\\begin{equation}\n(\\MA\\MB)^\\top=\\MB^\\top\\MA^\\top.\n\\end{equation}\n利用两个向量点积的结果是标量，标量转置是自身的事实，我们可以证明\\eqnref{eq:2.8}：\n\\begin{equation}\n    \\Vx^\\top \\Vy = \\left(\\Vx^\\top \\Vy \\right)^\\top = \\Vy^\\top \\Vx.\n\\end{equation}\n\n\n由于本书的重点不是线性代数，我们并不试图展示矩阵乘积的所有重要性质，但读者应该知道矩阵乘积还有很多有用的性质。\n\n\n现在我们已经知道了足够多的线性代数符号，可以表达下列线性方程组：\n\\begin{equation}\n\\MA\\Vx=\\Vb\n\\label{eq:2.11}\n\\end{equation}\n其中$\\MA\\in \\SetR^{m\\times n}$是一个已知矩阵，$\\Vb\\in\\SetR^m$是一个已知向量，$\\Vx\\in\\SetR^n$是一个我们要求解的未知向量。\n向量$\\Vx$的每一个元素$\\Sx_i$都是未知的。\n矩阵$\\MA$的每一行和$\\Vb$中对应的元素构成一个约束。\n我们可以把\\eqnref{eq:2.11}重写为\n\\begin{gather}\n\\MA_{1,:}\\Vx=b_1\\\\\n\\MA_{2,:}\\Vx=b_2 \\\\\n\\cdots \\\\\n\\MA_{m,:}\\Vx=b_m\n\\end{gather}\n或者，更明确地，写作\n\\begin{gather}\n    \\MA_{1,1}x_1+\\MA_{1,2}x_2+\\cdots \\MA_{1,n}x_n = b_1\\\\\n    \\MA_{2,1}x_1+\\MA_{2,2}x_2+\\cdots \\MA_{2,n}x_n = b_2\\\\\n    \\cdots\\\\\n    \\MA_{m,1}x_1+\\MA_{m,2}x_2+\\cdots \\MA_{m,n}x_n = b_m.\n\\end{gather}\n\n\n矩阵向量乘积符号为这种形式的方程提供了更紧凑的表示。\n\n\n\n% -- 33 --\n\n\n\\section{单位矩阵和逆矩阵}\n\\label{sec:identity_and_inverse_atrices}\n\n\n线性代数提供了被称为\\firstgls{matrix_inverse}的强大工具。\n对于大多数矩阵$\\MA$，我们都能通过\\gls{matrix_inverse}解析地求解\\eqnref{eq:2.11}。\n\n\n为了描述矩阵逆，我们首先需要定义\\firstgls{identity_matrix}的概念。\n任意向量和单位矩阵相乘，都不会改变。\n我们将保持$\\Sn$维向量不变的单位矩阵记作$\\MI_{\\Sn}$。\n形式上，$\\MI_{\\Sn}\\in \\SetR^{\\Sn\\times \\Sn}$，\n\\begin{equation}\n    \\forall \\Vx \\in \\SetR^{\\Sn}, \\MI_{\\Sn} \\Vx = \\Vx.\n\\end{equation}\n单位矩阵的结构很简单：所有沿主对角线的元素都是$1$，而所有其他位置的元素都是$0$。\n如\\figref{fig:chap2_empty2}所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{equation*}\n\\begin{bmatrix} \n1 & 0 & 0 \\\\\n0 & 1 & 0 \\\\\n0 & 0 & 1 \\\\\n\\end{bmatrix}\n\\end{equation*}\n\\fi\n\\caption{单位矩阵的一个样例：这是$\\MI_3$。}\n\\label{fig:chap2_empty2}\n\\end{figure}\n\n\n矩阵$\\MA$的\\firstgls{matrix_inverse}记作$\\MA^{-1}$，其定义的矩阵满足如下条件\n\\begin{equation} \\MA^{-1}\\MA = \\MI_{\\Sn}. \\end{equation}\n\n现在我们可以通过以下步骤求解\\eqnref{eq:2.11}：\n\\begin{gather}\n\\MA\\Vx=\\Vb \\\\\n\\MA^{-1}\\MA\\Vx = \\MA^{-1}\\Vb \\\\\n\\MI_{\\Sn} \\Vx=\\MA^{-1}\\Vb \\\\\n\\Vx=\\MA^{-1}\\Vb. \n\\end{gather}\n\n\n当然，这取决于我们能否找到一个逆矩阵$\\MA^{-1}$。\n在接下来的章节中，我们会讨论逆矩阵$\\MA^{-1}$存在的条件。\n\n\n当逆矩阵$\\MA^{-1}$存在时，有几种不同的算法都能找到它的闭解形式。\n理论上，相同的逆矩阵可用于多次求解不同向量$\\Vb$的方程。\n然而，逆矩阵$\\MA^{-1}$主要是作为理论工具使用的，并不会在大多数软件应用程序中实际使用。\n这是因为逆矩阵$\\MA^{-1}$在数字计算机上只能表现出有限的精度，有效使用向量$\\Vb$的算法通常可以得到更精确的$\\Vx$。\n\n\n\n% -- 34 --\n\n\n\\section{线性相关和生成子空间}\n\\label{sec:linear_dependence_and_span}\n\n如果逆矩阵$\\MA^{-1}$存在，那么\\eqnref{eq:2.11}肯定对于每一个向量$\\Vb$恰好存在一个解。\n但是，对于某些向量$\\Vb$，方程组也有可能不存在解，或者存在无限多个解。\n存在多于一个解但是少于无限多个解的情况是不可能发生的；因为如果$\\Vx$和$\\Vy$都是某方程组的解，则\n\\begin{equation}\n\\Vz=\\alpha \\Vx + (1-\\alpha) \\Vy\n\\end{equation}\n（其中$\\alpha$取任意实数）也是该方程组的解。\n\n\n为了分析方程有多少个解，我们可以将$\\MA$的列向量看作从\\firstgls{origin}（元素都是零的向量）出发的不同方向，确定有多少种方法可以到达向量$\\Vb$。\n在这个观点下，向量$\\Vx$中的每个元素表示我们应该沿着这些方向走多远，即$\\Sx_{\\Si}$表示我们需要沿着第$\\Si$个向量的方向走多远：\n\\begin{equation}\n\\MA \\Vx = \\sum_i x_i \\MA_{:,i}.\n\\end{equation}\n一般而言，这种操作被称为\\firstgls{linear_combination}。\n形式上，一组向量的线性组合，是指每个向量乘以对应标量系数之后的和，即：\n\\begin{equation}\n    \\sum_i \\Sc_i \\Vv^{(i)}.\n\\end{equation}\n一组向量的\\firstgls{span}是原始向量线性组合后所能抵达的点的集合。\n\n\n确定$\\MA\\Vx=\\Vb$是否有解相当于确定向量$\\Vb$是否在$\\MA$列向量的\\gls{span}中。\n这个特殊的\\gls{span}被称为$\\MA$的\\firstgls{column_space}或者$\\MA$的\\firstgls{range}。\n\n\n为了使方程$\\MA \\Vx=\\Vb$对于任意向量$\\Vb \\in \\SetR^m$都存在解，我们要求$\\MA$的列空间构成整个$\\SetR^{\\Sm}$。\n如果$\\SetR^m$中的某个点不在$\\MA$的列空间中，那么该点对应的$\\Vb$会使得该方程没有解。\n矩阵$\\MA$的列空间是整个$\\SetR^m$的要求，意味着$\\MA$至少有$m$列，即$n\\geq m$。\n否则，$\\MA$列空间的维数会小于$m$。\n例如，假设$\\MA$是一个$3\\times 2$的矩阵。\n目标$\\Vb$是$3$维的，但是$\\Vx$只有$2$维。\n所以无论如何修改$\\Vx$的值，也只能描绘出$\\SetR^3$空间中的二维平面。\n当且仅当向量$\\Vb$在该二维平面中时，该方程有解。\n\n\n\n% -- 35 --\n\n\n不等式$n\\geq m$仅是方程对每一点都有解的必要条件。\n这不是一个充分条件，因为有些列向量可能是冗余的。\n假设有一个$\\SetR^{2\\times 2}$中的矩阵，它的两个列向量是相同的。\n那么它的列空间和它的一个列向量作为矩阵的列空间是一样的。\n换言之，虽然该矩阵有$2$列，但是它的列空间仍然只是一条线，不能涵盖整个$\\SetR^2$空间。\n\n\n正式地说，这种冗余被称为\\firstgls{linear_dependence}。\n如果一组向量中的任意一个向量都不能表示成其他向量的线性组合，那么这组向量称为\\firstgls{linearly_independent}。\n如果某个向量是一组向量中某些向量的线性组合，那么我们将这个向量加入这组向量后不会增加这组向量的\\gls{span}。\n这意味着，如果一个矩阵的\\gls{column_space}涵盖整个$\\SetR^m$，那么该矩阵必须包含至少一组$m$个线性无关的向量。\n这是\\eqnref{eq:2.11}对于每一个向量$\\Vb$的取值都有解的充分必要条件。\n值得注意的是，这个条件是说该向量集恰好有$m$个线性无关的列向量，而不是至少$m$个。\n不存在一个$m$维向量的集合具有多于$m$个彼此线性不相关的列向量，但是一个有多于$m$个列向量的矩阵有可能拥有不止一个大小为$m$的线性无关向量集。\n\n\n要想使矩阵可逆，我们还需要保证\\eqnref{eq:2.11}对于每一个$\\Vb$值至多有一个解。\n为此，我们需要确保该矩阵至多有$m$个列向量。\n否则，该方程会有不止一个解。\n\n\n综上所述，这意味着该矩阵必须是一个\\firstgls{square}，即$m=n$，并且所有列向量都是线性无关的。一个列向量线性相关的方阵被称为\\firstgls{singular}。\n\n\n如果矩阵$\\MA$不是一个方阵或者是一个奇异的方阵，该方程仍然可能有解。\n但是我们不能使用矩阵逆去求解。\n\n\n目前为止，我们已经讨论了逆矩阵左乘。我们也可以定义逆矩阵右乘：\n\\begin{equation}\n\\MA\\MA^{-1}=\\MI.\n\\end{equation}\n对于方阵而言，它的左逆和右逆是相等的。\n\n\n\n\n\\section{范数}\n\\label{sec:norms}\n\n有时我们需要衡量一个向量的大小。\n在机器学习中，我们经常使用被称为\\firstgls{norm}的函数衡量向量大小。\n形式上，$L^p$范数定义如下\n\\begin{equation}\n    \\norm{\\Vx}_p = \\left( \\sum_i |x_i|^p \\right)^{\\frac{1}{p}}\n\\label{eq:2.30}\n\\end{equation}\n其中$p\\in \\SetR$，$p\\geq 1$。\n\n\n\n% -- 36 --\n\n\n范数（包括$L^p$范数）是将向量映射到非负值的函数。\n直观上来说，向量$\\Vx$的范数衡量从原点到点$\\Vx$的距离。\n更严格地说，范数是满足下列性质的任意函数：\n\\begin{itemize}\n\\item $f(\\Vx) = 0 \\Rightarrow \\Vx = \\mathbf{0}$ \n\\item $f(\\Vx + \\Vy) \\leq f(\\Vx) + f(\\Vy)$ （\\firstgls{triangle_inequality}）\n\\item $\\forall \\alpha \\in \\SetR$, $f(\\alpha \\Vx) = |\\alpha| f(\\Vx)$\n\\end{itemize}\n\n\n当$p=2$时，$L^2$范数被称为\\firstgls{euclidean_norm}。\n它表示从原点出发到向量$\\Vx$确定的点的欧几里得距离。\n$L^2$范数在机器学习中出现地十分频繁，经常简化表示为$\\norm{x}$，略去了下标$2$。\n平方$L^2$范数也经常用来衡量向量的大小，可以简单地通过\\gls{dot_product} $\\Vx^\\top\\Vx$计算。\n\n\n平方$L^2$范数在数学和计算上都比$L^2$范数本身更方便。\n例如，平方$L^2$范数对$\\Vx$中每个元素的导数只取决于对应的元素，而$L^2$范数对每个元素的导数却和整个向量相关。\n但是在很多情况下，平方$L^2$范数也可能不受欢迎，因为它在原点附近增长得十分缓慢。\n在某些机器学习应用中，区分恰好是零的元素和非零但值很小的元素是很重要的。\n在这些情况下，我们转而使用在各个位置斜率相同，同时保持简单的数学形式的函数：$L^1$范数。\n$L^1$范数可以简化如下：\n\\begin{equation}\n    \\norm{\\Vx}_1 = \\sum_i  |x_i|.\n\\end{equation}\n当机器学习问题中零和非零元素之间的差异非常重要时，通常会使用$L^1$范数。\n每当$\\Vx$中某个元素从$0$增加$\\epsilon$，对应的$L^1$范数也会增加$\\epsilon$。\n\n\n有时候我们会统计向量中非零元素的个数来衡量向量的大小。\n有些作者将这种函数称为``$L^0$范数''，但是这个术语在数学意义上是不对的。\n向量的非零元素的数目不是范数，因为对向量缩放$\\alpha$倍不会改变该向量非零元素的数目。\n$L^1$范数经常作为表示非零元素数目的替代函数。\n\n\n\n% -- 37 --\n\n\n另外一个经常在机器学习中出现的范数是$L^\\infty$范数，也被称为\\,\\firstgls{max_norm}。\n这个范数表示向量中具有最大幅值的元素的绝对值：\n\\begin{equation}\n    \\norm{\\Vx}_\\infty = \\max_i |x_i|.\n\\end{equation}\n\n\n有时候我们可能也希望衡量矩阵的大小。\n在深度学习中，最常见的做法是使用\\firstgls{frobenius_norm}，\n\\begin{equation}\n    \\norm{\\MA}_F = \\sqrt{\\sum_{i,j} A_{i,j}^2}, \n%%lyj 原文是\\norm{A}_F ...\n\\end{equation}\n其类似于向量的$L^2$范数。\n\n\n两个向量的\\firstgls{dot_product}可以用范数来表示。\n具体地，\n\\begin{equation}\n    \\Vx^\\top\\Vy = \\norm{\\Vx}_2\\norm{\\Vy}_2 \\cos \\theta\n\\end{equation}\n其中$\\theta$表示$\\Vx$和$\\Vy$之间的夹角。\n\n\n\n\n\\section{特殊类型的矩阵和向量}\n\\label{sec:special_kinds_of_matrices_and_vectors}\n\n有些特殊类型的矩阵和向量是特别有用的。\n\n\n\\firstgls{diagonal_matrix}只在主对角线上含有非零元素，其他位置都是零。\n形式上，矩阵$\\MD$是对角矩阵，当且仅当对于所有的$i\\neq j$，$\\SD_{i,j}=0$。\n我们已经看到过一个对角矩阵：单位矩阵，对角元素全部是$1$。\n我们用$\\text{diag}(\\Vv)$表示一个对角元素由向量$\\Vv$中元素给定的对角方阵。\n对角矩阵受到关注的部分原因是对角矩阵的乘法计算很高效。\n计算乘法$\\text{diag}(\\Vv)\\Vx$，我们只需要将$\\Vx$中的每个元素$x_i$放大$v_i$倍。\n换言之，$\\text{diag}(\\Vv)\\Vx=\\Vv \\odot \\Vx$。\n计算对角方阵的逆矩阵也很高效。\n对角方阵的逆矩阵存在，当且仅当对角元素都是非零值，在这种情况下，$\\text{diag}(\\Vv)^{-1}=\\text{diag}([1/v_1,\\dots,1/v_n]^\\top)$。\n在很多情况下，我们可以根据任意矩阵导出一些通用的机器学习算法；但通过将一些矩阵限制为对角矩阵，我们可以得到计算代价较低的（并且简明扼要的）算法。\n\n\n不是所有的对角矩阵都是方阵。\n长方形的矩阵也有可能是对角矩阵。\n非方阵的对角矩阵没有逆矩阵，但我们仍然可以高效地计算它们的乘法。\n对于一个长方形对角矩阵$\\MD$而言，乘法$\\MD\\Vx$会涉及到$\\Vx$中每个元素的缩放，如果$\\MD$是瘦长型矩阵，那么在缩放后的末尾添加一些零；如果$\\MD$是胖宽型矩阵，那么在缩放后去掉最后一些元素。\n\n\n% -- 38 --\n\n\\firstgls{symmetric}矩阵是转置和自己相等的矩阵：\n\\begin{equation}\n    \\MA=\\MA^\\top.\n\\end{equation}\n当某些不依赖参数顺序的双参数函数生成元素时，对称矩阵经常会出现。\n例如，如果$\\MA$是一个距离度量矩阵，$\\MA_{i,j}$表示点$i$到点$j$的距离，那么$\\MA_{i,j}=\\MA_{j,i}$，因为距离函数是对称的。\n\n\n\\firstgls{unit_vector}是具有\\firstgls{unit_norm}的向量：\n\\begin{equation}\n\\norm{\\Vx}_2=1.\n\\end{equation}\n\n\n如果$\\Vx^\\top \\Vy = 0$，那么向量$\\Vx$和向量$\\Vy$互相\\firstgls{orthogonal}。\n如果两个向量都有非零范数，那么这两个向量之间的夹角是$90$度。\n在$\\SetR^n$中，至多有$n$个范数非零向量互相正交。\n如果这些向量不仅互相正交，并且范数都为$1$，那么我们称它们是\\firstgls{orthonormal}。\n\n\n\\firstgls{orthogonal_matrix}是指行向量和列向量是分别标准正交的方阵：\n\\begin{equation}\n    \\MA^\\top\\MA=\\MA\\MA^\\top=\\MI.\n\\end{equation}\n这意味着 \n\\begin{equation}\n    \\MA^{-1}=\\MA^\\top,\n\\end{equation}\n所以正交矩阵受到关注是因为求逆计算代价小。\n我们需要注意正交矩阵的定义。\n违反直觉的是，正交矩阵的行向量不仅是正交的，还是标准正交的。\n对于行向量或列向量互相正交但不是标准正交的矩阵，没有对应的专有术语。\n\n\n\n\n\\section{\\glsentrytext{eigendecomposition}}\n\\label{sec:eigendecomposition}\n\n许多数学对象可以通过将它们分解成多个组成部分或者找到它们的一些属性而更好地理解，这些属性是通用的，而不是由我们选择表示它们的方式产生的。\n\n% -- 39 --\n\n例如，整数可以分解为质因数。\n我们可以用十进制或二进制等不同方式表示整数$12$，但是$12=2\\times 2\\times 3$永远是对的。\n从这个表示中我们可以获得一些有用的信息，比如$12$不能被$5$整除，或者$12$的倍数可以被$3$整除。\n\n\n正如我们可以通过分解质因数来发现整数的一些内在性质，我们也可以通过分解矩阵来发现矩阵表示成数组元素时不明显的函数性质。\n\n\n\\firstgls{eigendecomposition}是使用最广的矩阵分解之一，即我们将矩阵分解成一组特征向量和特征值。\n\n\n方阵$\\MA$的\\firstgls{eigenvector}是指与$\\MA$相乘后相当于对该向量进行缩放的非零向量$\\Vv$：\n\\begin{equation}\n    \\MA\\Vv=\\lambda \\Vv.\n\\end{equation}\n标量$\\lambda$被称为这个特征向量对应的\\firstgls{eigenvalue}。\n（类似地，我们也可以定义\\firstgls{left_Evector} $\\Vv^\\top\\MA=\\lambda \\Vv^\\top$，但是通常我们更关注\\firstgls{right_Evector}）。\n\n\n如果$\\Vv$是$\\MA$的特征向量，那么任何缩放后的向量$s\\Vv$~($s\\in \\SetR$，$s\\neq 0$)也是$\\MA$的特征向量。\n此外，$s\\Vv$和$\\Vv$有相同的特征值。\n基于这个原因，通常我们只考虑单位特征向量。\n\n\n假设矩阵$\\MA$有$n$个线性无关的特征向量$\\{\\Vv^{(1)}, \\dots, \\Vv^{(n)}\\}$，对应着特征值$\\{\\lambda_1, \\dots , \\lambda_n \\}$。\n我们将特征向量连接成一个矩阵，使得每一列是一个特征向量：$\\MV=[\\Vv^{(1)}, \\dots, \\Vv^{(n)}]$.\n类似地，我们也可以将特征值连接成一个向量$\\Vlambda = [\\lambda_1, \\dots , \\lambda_n]^\\top$。\n因此$\\MA$的\\firstgls{eigendecomposition}可以记作\n\\begin{equation}\n    \\MA = \\MV \\text{diag}(\\Vlambda) \\MV^{-1}.\n\\end{equation}\n\n\n我们已经看到了\\emph{构建}具有特定特征值和特征向量的矩阵，能够使我们在目标方向上延伸空间。\n我们还常常希望将矩阵\\firstgls{decompose}成特征值和特征向量。\n这样可以帮助我们分析矩阵的特定性质，就像质因数分解有助于我们理解整数。\n\n\n不是每一个矩阵都可以分解成特征值和特征向量。\n在某些情况下，特征分解存在，但是会涉及复数而非实数。\n幸运的是，在本书中，我们通常只需要分解一类有简单分解的矩阵。\n具体来讲，每个实对称矩阵都可以分解成实特征向量和实特征值：\n\\begin{equation}\n    \\MA = \\MQ \\VLambda \\MQ^\\top.\n\\end{equation}\n其中$\\MQ$是$\\MA$的特征向量组成的正交矩阵，$\\VLambda$是对角矩阵。\n特征值$\\Lambda_{i,i}$对应的特征向量是矩阵$\\MQ$的第$i$列，记作$\\MQ_{:,i}$。\n因为$\\MQ$是正交矩阵，我们可以将$\\MA$看作沿方向$\\Vv^{(i)}$延展$\\lambda_i$倍的空间。\n如\\figref{fig:chap2_eigen_ellipse}所示的例子。\n\n% -- 40 --\n\n虽然任意一个实对称矩阵$\\MA$都有特征分解，但是特征分解可能并不唯一。\n如果两个或多个特征向量拥有相同的特征值，那么在由这些特征向量产生的生成子空间中，任意一组正交向量都是该特征值对应的特征向量。\n因此，我们可以等价地从这些特征向量中构成$\\MQ$作为替代。\n按照惯例，我们通常按降序排列$\\VLambda$的元素。\n在该约定下，特征分解唯一当且仅当所有的特征值都是唯一的。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter2/figures/eigen_ellipse_color}}\n\\fi\n\\caption{特征向量和特征值的作用效果。\n特征向量和特征值的作用效果的一个实例。\n在这里，矩阵$\\MA$有两个\\gls{orthonormal}的特征向量，对应特征值为$\\lambda_1$的$\\Vv^{(1)}$以及对应特征值为$\\lambda_2$的$\\Vv^{(2)}$。\n\\emph{(左)}我们画出了所有的单位向量$\\Vu\\in\\SetR^2$的集合，构成一个单位圆。\n\\emph{(右)}我们画出了所有的$\\MA\\Vu$点的集合。\n通过观察$\\MA$拉伸单位圆的方式，我们可以看到它将$\\Vv^{(i)}$方向的空间拉伸了$\\lambda_i$倍。\t}\n\\label{fig:chap2_eigen_ellipse}\n\\end{figure}\n\n% -- 41 --\n\n\n矩阵的特征分解给了我们很多关于矩阵的有用信息。\n矩阵是奇异的当且仅当含有零特征值。\n实对称矩阵的特征分解也可以用于优化二次方程$f(\\Vx) = \\Vx^\\top \\MA \\Vx$，其中限制$\\norm{\\Vx}_2 = 1$。\n当$\\Vx$等于$\\MA$的某个特征向量时，$f$将返回对应的特征值。\n在限制条件下，函数$f$的最大值是最大特征值，最小值是最小特征值。\n\n\n所有特征值都是正数的矩阵被称为\\firstgls{P_D}；所有特征值都是非负数的矩阵被称为\\firstgls{P_SD}。\n同样地，所有特征值都是负数的矩阵被称为\\firstgls{ND}；所有特征值都是非正数的矩阵被称为\\firstgls{NSD}。\n\\gls{P_SD}矩阵受到关注是因为它们保证$\\forall \\Vx, \\Vx^\\top \\MA \\Vx \\geq 0$。\n此外，\\gls{P_D}矩阵还保证$\\Vx^\\top \\MA \\Vx =0 \\Rightarrow \\Vx = \\mathbf{0}$。\n\n\n\n\n\n\\section{\\glsentrytext{SVD}}\n\\label{sec:singular_value_decomposition}\n\n在\\secref{sec:eigendecomposition}，我们探讨了如何将矩阵分解成特征向量和特征值。\n还有另一种分解矩阵的方法，被称为\\firstall{SVD}，将矩阵分解为\\firstgls{Svector}和\\firstgls{Svalue}。\n通过\\gls{SVD}，我们会得到一些与\\gls{eigendecomposition}相同类型的信息。\n然而，\\gls{SVD}有更广泛的应用。\n每个实数矩阵都有一个\\gls{SVD}，但不一定都有\\gls{eigendecomposition}。\n例如，非方阵的矩阵没有\\gls{eigendecomposition}，这时我们只能使用\\gls{SVD}。\n\n\n回想一下， 我们使用\\gls{eigendecomposition}去分析矩阵$\\MA$时， 得到特征向量构成的矩阵$\\MV$和特征值构成的向量$\\Vlambda$，我们可以重新将$\\MA$写作\n\\begin{equation}\n    \\MA=\\MV\\text{diag}(\\Vlambda)\\MV^{-1}.\n\\end{equation}\n\n\\gls{SVD}是类似的，只不过这回我们将矩阵$\\MA$分解成三个矩阵的乘积：\n\\begin{equation}\n    \\MA=\\MU\\MD\\MV^\\top.\n\\end{equation}\n\n\n假设$\\MA$是一个$m\\times n$的矩阵，那么$\\MU$是一个$m\\times m$的矩阵，$\\MD$是一个$m\\times n$的矩阵，$\\MV$是一个$n\\times n$矩阵。\n\n\n% -- 42 --\n\n这些矩阵中的每一个经定义后都拥有特殊的结构。\n矩阵$\\MU$和$\\MV$都定义为正交矩阵，而矩阵$\\MD$定义为对角矩阵。\n注意，矩阵$\\MD$不一定是方阵。\n\n\n对角矩阵$\\MD$对角线上的元素被称为矩阵$\\MA$的\\firstgls{Svalue}。\n矩阵$\\MU$的列向量被称为\\firstgls{left_Svector}，矩阵$\\MV$的列向量被称\\firstgls{right_Svector}。\n\n\n事实上，我们可以用与$\\MA$相关的特征分解去解释$\\MA$的\\gls{SVD}。\n$\\MA$的\\firstgls{left_Svector}是$\\MA\\MA^\\top$的特征向量。\n$\\MA$的\\firstgls{right_Svector}是$\\MA^\\top\\MA$的特征向量。\n$\\MA$的非零奇异值是$\\MA^\\top\\MA$特征值的平方根，同时也是$\\MA\\MA^\\top$特征值的平方根。\n\n\n\\glssymbol{SVD}\\,最有用的一个性质可能是拓展矩阵求逆到非方矩阵上。我们将在下一节中探讨。\n\n\n\n\n\\section{\\glsentrytext{Moore}}\n\\label{sec:the_moore_penrose_pseudoinverse}\n\n\n对于非方矩阵而言，其逆矩阵没有定义。\n假设在下面的问题中，我们希望通过矩阵$\\MA$的左逆$\\MB$来求解线性方程，\n\\begin{equation}\n    \\MA\\Vx=\\Vy\n\\end{equation}\n等式两边左乘左逆$\\MB$后，我们得到\n\\begin{equation}\n    \\Vx=\\MB\\Vy.\n\\end{equation}\n取决于问题的形式，我们可能无法设计一个唯一的映射将$\\MA$映射到$\\MB$。\n\n\n如果矩阵$\\MA$的行数大于列数，那么上述方程可能没有解。\n如果矩阵$\\MA$的行数小于列数，那么上述矩阵可能有多个解。\n\n\n\\firstgls{Moore}使我们在这类问题上取得了一定的进展。\n矩阵$\\MA$的伪逆定义为：\n\\begin{equation}\n    \\MA^+ = \\lim_{\\alpha \\searrow 0} (\\MA^\\top\\MA + \\alpha \\MI)^{-1} \\MA^\\top.\n\\end{equation}\n计算伪逆的实际算法没有基于这个定义，而是使用下面的公式：\n\\begin{equation}\n    \\MA^+ = \\MV\\MD^+\\MU^\\top.\n\\end{equation}\n其中，矩阵$\\MU$，$\\MD$和$\\MV$是矩阵$\\MA$\\gls{SVD}后得到的矩阵。\n对角矩阵$\\MD$的伪逆$\\MD^+$是其非零元素取倒数之后再转置得到的。\n\n% -- 43 --\n\n当矩阵$\\MA$的列数多于行数时，使用伪逆求解线性方程是众多可能解法中的一种。\n特别地，$\\Vx=\\MA^+\\Vy$是方程所有可行解中欧几里得范数$\\norm{\\Vx}_2$最小的一个。\n\n\n当矩阵$\\MA$的行数多于列数时，可能没有解。\n在这种情况下，通过伪逆得到的$\\Vx$使得$\\MA\\Vx$和$\\Vy$的欧几里得距离$\\norm{\\MA\\Vx-\\Vy}_2$最小。\n\n\n\n\n\n\\section{迹运算}\n\\label{sec:the_trace_operator}\n\n迹运算返回的是矩阵对角元素的和：\n\\begin{equation}\n    \\Tr(\\MA)= \\sum_i \\MA_{i,i}.\n\\end{equation}\n迹运算因为很多原因而有用。\n若不使用求和符号，有些矩阵运算很难描述，而通过矩阵乘法和迹运算符号可以清楚地表示。\n例如，迹运算提供了另一种描述矩阵\\gls{frobenius_norm}的方式：\n\\begin{equation}\n    \\norm{A}_F = \\sqrt{\\text{Tr}(\\MA \\MA^\\top)}.\n    \\label{eq:2.49}\n\\end{equation}\n\n\n用迹运算表示表达式，我们可以使用很多有用的等式巧妙地处理表达式。\n例如，迹运算在转置运算下是不变的：\n\\begin{equation}\n    \\Tr(\\MA)=\\Tr(\\MA^\\top).\n\\end{equation}\n\n\n多个矩阵相乘得到的方阵的迹，和将这些矩阵中的最后一个挪到最前面之后相乘的迹是相同的。\n当然，我们需要考虑挪动之后矩阵乘积依然定义良好：\n\\begin{equation}\n\\Tr(\\MA\\MB\\MC)=\\Tr(\\MC\\MA\\MB)= \\Tr(\\MB\\MC\\MA).\n\\end{equation}\n或者更一般地，\n\\begin{equation} \n\\Tr(\\prod_{i=1}^n \\MF^{(i)})= \\Tr(\\MF^{(n)} \\prod_{i=1}^{n-1} \\MF^{(i)}).\n\\label{eq:2.52}\n\\end{equation}\n即使循环置换后矩阵乘积得到的矩阵形状变了，迹运算的结果依然不变。\n例如，假设矩阵$\\MA\\in \\SetR^{m\\times n}$，矩阵$\\MB\\in \\SetR^{n\\times m}$，我们可以得到\n\\begin{equation} \n    \\Tr(\\MA\\MB)= \\Tr(\\MB\\MA)\n\\end{equation}\n尽管$\\MA\\MB \\in \\SetR^{m\\times m}$和$\\MB\\MA \\in \\SetR^{n\\times n}$。\n\n\n% -- 44 --\n\n另一个有用的事实是标量在迹运算后仍然是它自己：$a=\\Tr(a)$。\n\n\n\n\n\\section{行列式}\n\\label{sec:the_determinant}\n\n行列式，记作$\\text{det}(\\MA)$，是一个将方阵$\\MA$映射到实数的函数。\n行列式等于矩阵特征值的乘积。\n行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。\n如果行列式是$0$，那么空间至少沿着某一维完全收缩了，使其失去了所有的体积。\n如果行列式是$1$，那么这个转换保持空间体积不变。\n\n\n\n\n\\section{实例：\\glsentrytext{PCA}}\n\\label{sec:example_principal_components_analysis_chap2}\n\n\\firstall{PCA}是一个简单的机器学习算法，可以通过基础的线性代数知识推导。\n\n\n假设在$\\SetR^n$空间中我们有$m$个点$\\{\\Vx^{(1)}, \\dots ,\\Vx^{(m)}\\}$，我们希望对这些点进行有损压缩。\n有损压缩表示我们使用更少的内存，但损失一些精度去存储这些点。\n我们希望损失的精度尽可能少。\n\n\n一种编码这些点的方式是用低维表示。\n对于每个点$\\Vx^{(i)} \\in \\SetR^n$，会有一个对应的编码向量$\\Vc^{(i)}\\in \\SetR^l$。\n如果$l$比$n$小，那么我们便使用了更少的内存来存储原来的数据。\n我们希望找到一个编码函数，根据输入返回编码，$f(\\Vx)=\\Vc$；我们也希望找到一个解码函数，给定编码重构输入，$\\Vx\\approx g(f(\\Vx))$。\n\n\n\\glssymbol{PCA}~由我们选择的解码函数而定。\n具体地，为了简化解码器，我们使用矩阵乘法将编码映射回$\\SetR^n$，即$g(\\Vc)=\\MD\\Vc$，其中$\\MD\\in \\SetR^{n\\times l}$是定义解码的矩阵。\n\n% -- 45 --\n\n目前为止所描述的问题，可能会有多个解。\n因为如果我们按比例地缩小所有点对应的编码向量$c_i$，那么我们只需按比例放大$\\MD_{:,i}$，即可保持结果不变。\n为了使问题有唯一解，我们限制$\\MD$中所有列向量都有\\gls{unit_norm}。\n\n\n计算这个解码器的最优编码可能是一个困难的问题。\n为了使编码问题简单一些，\\glssymbol{PCA}\\,限制$\\MD$的列向量彼此正交（注意，除非$l=n$，否则严格意义上$\\MD$不是一个正交矩阵）。\n\n\n为了将这个基本想法变为我们能够实现的算法，首先我们需要明确如何根据每一个输入$\\Vx$得到一个最优编码$\\Vc^*$。\n一种方法是最小化原始输入向量$\\Vx$和重构向量$g(\\Vc^*)$之间的距离。\n我们使用范数来衡量它们之间的距离。\n在\\,\\glssymbol{PCA}\\,算法中，我们使用$L^2$范数：\n\\begin{equation}\n \\Vc^* = \\underset{\\Vc}{\\arg\\min} \\norm{\\Vx-g(\\Vc)}_2.\n\\end{equation}\n\n\n我们可以用平方$L^2$范数替代$L^2$范数，因为两者在相同的值$\\Vc$上取得最小值。\n这是因为$L^2$范数是非负的，并且平方运算在非负值上是单调递增的。\n\\begin{equation}\n\\Vc^* = \\argmin_{\\Vc} \\norm{\\Vx - g(\\Vc)}_2^2.\n\\end{equation}\n该最小化函数可以简化成\n\\begin{equation}\n(\\Vx-g(\\Vc))^\\top(\\Vx-g(\\Vc))\n\\end{equation}\n（\\eqnref{eq:2.30}中$L^2$范数的定义）\n\\begin{equation}\n    = \\Vx^\\top\\Vx - \\Vx^\\top g(\\Vc) - g(\\Vc)^\\top\\Vx + g(\\Vc)^\\top g(\\Vc)\n\\end{equation}\n(分配律)\n\\begin{equation}\n    = \\Vx^\\top \\Vx - 2\\Vx^\\top g(\\Vc) + g(\\Vc)^\\top g(\\Vc)\n\\end{equation}\n(因为标量$g(\\Vc)^\\top\\Vx$的转置等于自己)\n\n\n因为第一项$\\Vx^\\top\\Vx$不依赖于$\\Vc$，所以我们可以忽略它，得到如下的优化目标：\n\\begin{equation}\n\\Vc^* = \\underset{\\Vc}{\\arg\\min} - 2\\Vx^\\top g(\\Vc) + g(\\Vc)^\\top g(\\Vc).\n\\end{equation}\n\n% -- 46 --\n\n更进一步，我们代入$g(\\Vc)$的定义：\n\\begin{equation}\n    \\Vc^* = \\underset{\\Vc}{\\arg\\min} - 2\\Vx^\\top\\MD\\Vc + \\Vc^\\top\\MD^\\top\\MD\\Vc\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vc}{\\arg\\min} -2\\Vx^\\top\\MD\\Vc + \\Vc^\\top\\MI_l\\Vc\n\\end{equation}\n(矩阵$\\MD$的正交性和单位范数约束)\n\\begin{equation}\n    = \\underset{\\Vc}{\\arg\\min} -2\\Vx^\\top\\MD\\Vc + \\Vc^\\top\\Vc\n\\end{equation}\n\n\n我们可以通过向量微积分来求解这个最优化问题（如果你不清楚怎么做，请参考\\secref{sec:gradient_based_optimization}）\n\\begin{gather}\n    \\nabla_{\\Vc} (-2\\Vx^\\top \\MD \\Vc + \\Vc^\\top\\Vc) = 0\\\\\n    -2\\MD^\\top\\Vx + 2\\Vc = 0\\\\\n    \\Vc = \\MD^\\top \\Vx.\n\\end{gather}\n\n\n这使得算法很高效：最优编码$\\Vx$只需要一个矩阵-向量乘法操作。\n为了编码向量，我们使用编码函数：\n\\begin{equation}\n    f(\\Vx)=\\MD^\\top\\Vx.\n\\end{equation}\n进一步使用矩阵乘法，我们也可以定义\\,\\glssymbol{PCA}\\,重构操作：\n\\begin{equation}\n    r(\\Vx)=g(f(\\Vx)) = \\MD\\MD^\\top \\Vx.\n\\label{eq:2.67}\n\\end{equation}\n\n\n接下来，我们需要挑选编码矩阵$\\MD$。\n要做到这一点，我们回顾最小化输入和重构之间$L^2$距离的这个想法。\n因为用相同的矩阵$\\MD$对所有点进行解码，我们不能再孤立地看待每个点。\n反之，我们必须最小化所有维数和所有点上的误差矩阵的\\,\\gls{frobenius_norm}：\n\\begin{equation}\n    \\MD^* =  \\underset{\\MD}{\\arg\\min} \\sqrt{\\sum_{i,j}\\left( \\Vx_j^{(i)} - r(\\Vx^{(i)})_j\\right)^2} \\text{ subject to } \\MD^\\top\\MD = \\MI_l.\n\\label{eq:2.68}\n\\end{equation}\n\n为了推导用于寻求$\\MD^*$的算法，我们首先考虑$l=1$的情况。\n在这种情况下，$\\MD$是一个单一向量$\\Vd$。\n将\\eqnref{eq:2.67}代入\\eqnref{eq:2.68}，简化$\\MD$为$\\Vd$，问题简化为\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\sum_i \\norm{\\Vx^{(i)} - \\Vd\\Vd^\\top \\Vx^{(i)}}_2^2\n    \\text{ subject to } \\norm{\\Vd}_2 = 1.\n\\end{equation}\n\n% -- 47 --\n\n上述公式是直接代入得到的，但不是文体表述最舒服的方式。\n在上述公式中，我们将标量$\\Vd^\\top\\Vx^{(i)}$放在向量$\\Vd$的右边。\n将该标量放在左边的写法更为传统。\n于是我们通常写作\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\sum_i \\norm{\\Vx^{(i)} - \\Vd^\\top \\Vx^{(i)}\\Vd}_2^2\n        \\text{ subject to } \\norm{\\Vd}_2 = 1,\n\\end{equation}\n或者，考虑到标量的转置和自身相等，我们也可以写作\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\sum_i \\norm{\\Vx^{(i)} - \\Vx^{(i)\\top}\\Vd\\Vd}_2^2\n        \\text{ subject to } \\norm{\\Vd}_2 = 1.\n\\end{equation}\n读者应该对这些重排写法慢慢熟悉起来。\n\n\n此时，使用单一矩阵来重述问题，比将问题写成求和形式更有帮助。\n这有助于我们使用更紧凑的符号。\n将表示各点的向量堆叠成一个矩阵，记为$\\MX\\in\\SetR^{m\\times n}$，其中$\\MX_{i,:}=\\Vx^{(i)^\\top}$。\n原问题可以重新表述为：\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\norm{\\MX - \\MX\\Vd\\Vd^\\top}_F^2\n        \\text{ subject to } \\Vd^\\top \\Vd = 1.\n\\end{equation}\n暂时不考虑约束，我们可以将\\,\\gls{frobenius_norm}简化成下面的形式：\n\\begin{equation}\n     \\underset{\\Vd}{\\arg\\min} \\norm{\\MX - \\MX \\Vd\\Vd^\\top}_F^2\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, \\Tr \\left( \\left( \\MX - \\MX \\Vd\\Vd^\\top  \\right)^\\top \\left( \\MX - \\MX \\Vd\\Vd^\\top  \\right) \\right)\n\\end{equation}\n（\\eqnref{eq:2.49}）\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, \\Tr \\left( \\MX^\\top\\MX - \\MX^\\top\\MX \\Vd\\Vd^\\top - \\Vd\\Vd^\\top \\MX^\\top\\MX + \\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top  \\right)\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, \\Tr( \\MX^\\top\\MX)  - \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)  - \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX) + \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top)\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)  - \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX) + \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top)\n\\end{equation}\n（因为与$\\Vd$无关的项不影响$\\arg\\min$）\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top) + \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top)\n\\end{equation}\n（因为循环改变迹运算中相乘矩阵的顺序不影响结果，如\\eqnref{eq:2.52}所示）\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top) + \\Tr(\\MX^\\top\\MX\\Vd\\Vd^\\top\\Vd\\Vd^\\top )\n\\end{equation}\n（再次使用上述性质）\n\n% -- 48 --\n\n此时，我们再来考虑约束条件:\n\\begin{equation}\n    \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top) + \\Tr(\\MX^\\top\\MX\\Vd\\Vd^\\top\\Vd\\Vd^\\top )\n    \\text{ subject to } \\Vd^\\top \\Vd = 1\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd \\Vd^\\top) + \\Tr(\\MX^\\top\\MX\\Vd\\Vd^\\top )\n    \\text{ subject to } \\Vd^\\top \\Vd = 1\n\\end{equation}\n (因为约束条件)\n \\begin{equation}\n     = \\underset{\\Vd}{\\arg\\min} \\, - \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)\n     \\text{ subject to } \\Vd^\\top \\Vd = 1\n \\end{equation}\n \\begin{equation}\n     = \\underset{\\Vd}{\\arg\\max} \\, \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)\n     \\text{ subject to } \\Vd^\\top \\Vd = 1\n \\end{equation}\n \\begin{equation}\n     = \\underset{\\Vd}{\\arg\\max} \\, \\Tr(\\Vd^\\top\\MX^\\top\\MX \\Vd)\n     \\text{ subject to } \\Vd^\\top \\Vd = 1 .\n \\end{equation}\n\n\n这个优化问题可以通过特征分解来求解。\n具体来讲，最优的$\\Vd$是$\\MX^\\top\\MX$最大特征值对应的特征向量。\n\n\n以上推导特定于$l=1$的情况， 仅得到了第一个主成分。\n更一般地，当我们希望得到主成分的基时，矩阵$\\MD$由前$l$个最大的特征值对应的特征向量组成。\n这个结论可以通过归纳法证明，我们建议将此证明作为练习。\n\n\n线性代数是理解深度学习所必须掌握的基础数学学科之一。\n另一门在机器学习中无处不在的重要数学学科是概率论，我们将在下一章探讨。\n\n\n\n% -- 49 --\n"
  },
  {
    "path": "Chapter20/README.md",
    "content": "#第二十章笔记\n"
  },
  {
    "path": "Chapter20/deep_generative_models.tex",
    "content": "\\chapter{深度\\glsentrytext{generative_model}}\n\\label{chap:deep_generative_models}\n在本章中，我们介绍几种具体的\\gls{generative_model}，这些模型可以使用\\chapref{chap:structured_probabilistic_models_for_deep_learning}至\\chapref{chap:approximate_inference}中出现的技术构建和训练。\n所有这些模型在某种程度上都代表了多个变量的概率分布。\n有些模型允许显式地计算概率分布函数。\n其他模型则不允许直接评估概率分布函数，但支持隐式获取分布知识的操作，如从分布中采样。\n这些模型中的一部分使用\\chapref{chap:structured_probabilistic_models_for_deep_learning}中的\\gls{graphical_model}语言，从图和\\gls{factor}的角度描述为\\gls{structured_probabilistic_models}。\n其他的不能简单地从因子角度描述，但仍然代表概率分布。\n\n\n\\section{\\glsentrytext{BM}}\n\\label{sec:boltzmann_machines}\n\\gls{BM}最初作为一种广义的``\\gls{connectionism}''引入，用来学习二值向量上的任意概率分布~\\citep{Fahlman83,Ackley85,Hinton-Boltzmann,Hinton86a}。\n\\gls{BM}的变体（包含其他类型的变量）早已超过了原始\\gls{BM}的流行程度。\n在本节中，我们简要介绍二值\\gls{BM}并讨论训练模型和进行\\gls{inference}时出现的问题。\n\n我们在$d$维二值随机向量$\\Vx \\in \\{0, 1\\}^d$上定义\\gls{BM}。\n\\gls{BM}是一种\\gls{energy_based_model}（\\secref{sec:energy_based_models}），意味着我们可以使用\\gls{energy_function}定义\\gls{joint_probability_distribution}：\n\\begin{align}\\label{eq:201px}\n P(\\Vx) = \\frac{\\exp(-E(\\Vx))}{Z},\n\\end{align}\n其中$E(\\Vx)$是\\gls{energy_function}，$Z$是确保$\\sum_{\\Vx} P(\\Vx)=1$的\\gls{partition_function}。\n\\gls{BM}的\\gls{energy_function}如下\n给出：\n\\begin{align}\\label{eq:202E}\n E(\\Vx) = -\\Vx^\\top \\MU \\Vx - \\Vb^\\top \\Vx,\n\\end{align}\n其中$\\MU$是模型参数的``权重''矩阵，$\\Vb$是\\gls{bias_aff}向量。\n\n% -- 645 --\n\n在一般设定下，给定一组训练样本，每个样本都是$n$维的。\n\\eqnref{eq:201px}描述了观察到的变量的\\gls{joint_probability_distribution}。\n虽然这种情况显然可行，但它限制了观察到的变量和权重矩阵描述的变量之间相互作用的类型。\n具体来说，这意味着一个单元的概率由其他单元值的\\gls{linear_model}（\\gls{logistic_regression}）给出。\n\n当不是所有变量都能被观察到时，\\gls{BM}变得更强大。\n在这种情况下，\\gls{latent_variable}类似于\\gls{MLP}中的\\gls{hidden_unit}，并模拟可见单元之间的高阶交互。\n正如添加\\gls{hidden_unit}将\\gls{logistic_regression}转换为~\\glssymbol{MLP}，导致~\\glssymbol{MLP}~成为函数的\\gls{universal_approximator}，具有\\gls{hidden_unit}的\\gls{BM}不再局限于建模变量之间的线性关系。\n相反，\\gls{BM}变成了离散变量上\\gls{PMF}的\\gls{universal_approximator} \\citep{LeRoux-Bengio-2008}。\n\n\n正式地，我们将单元$\\Vx$分解为两个子集：可见单元$\\Vv$和\\gls{latent}（或隐藏）单元$\\Vh$。\n\\gls{energy_function}变为\n\\begin{align}\n E(\\Vv, \\Vh) = -\\Vv^\\top \\MR \\Vv - \\Vv^\\top \\MW \\Vh - \\Vh^\\top \\MS \\Vh - \\Vb^\\top \\Vv - \\Vc^\\top \\Vh.\n\\end{align}\n\\paragraph{\\gls{BM}的学习}\\gls{BM}的学习算法通常基于最大似然。\n所有\\gls{BM}都具有难以处理的\\gls{partition_function}，因此最大似然梯度必须使用\\chapref{chap:confronting_the_partition_function}中的技术来近似。\n\n% -- 646 --\n\n\\gls{BM}有一个有趣的性质，当基于最大似然的学习规则训练时，连接两个单元的特定权重的更新仅取决于这两个单元在不同分布下收集的统计信息：$P_{\\text{model}}(\\Vv)$和$\\hat{P}_{\\text{data}}(\\Vv) P_{\\text{model}}(\\Vh  \\mid  \\Vv)$。\n网络的其余部分参与\\gls{shaping}这些统计信息，但权重可以在完全不知道网络其余部分或这些统计信息如何产生的情况下更新。\n这意味着学习规则是``局部''的，这使得\\gls{BM}的学习似乎在某种程度上是生物学合理的。\n我们可以设想每个神经元都是\\gls{BM}中随机变量的情况，那么连接两个随机变量的轴突和树突只能通过观察与它们物理上实际接触细胞的激发模式来学习。\n特别地，\\gls{positive_phase}期间，经常同时激活的两个单元之间的连接会被加强。\n这是~\\ENNAME{Hebbian}~学习规则\\citep{Hebb49}的一个例子 ，经常总结为好记的短语——``fire together, wire together''。\n\\ENNAME{Hebbian}~学习规则是生物系统学习中最古老的假设性解释之一，直至今天仍然有重大意义 \\citep{DelGuidice-et-al-2009}。\n\n\n不仅仅使用局部统计信息的其他学习算法似乎需要假设更多的学习机制。\n例如，对于大脑在\\gls{MLP}中实现的\\gls{back_propagation}，似乎需要维持一个辅助通信的网络，并借此向后传输梯度信息。\n已经有学者\\citep{Hinton-DL2007,Bengio-arxiv2015} 提出生物学上可行（和近似）的\\gls{back_propagation}实现方案，但仍然有待验证，\\citet{Bengio-arxiv2015} 还将梯度的\\gls{back_propagation}关联到类似于\\gls{BM}（但具有连续\\gls{latent_variable}）的能量模型中的\\gls{inference}。\n\n从生物学的角度看，\\gls{BM}学习中的\\gls{negative_phase}阶段有点难以解释。\n正如\\secref{sec:stochastic_maximum_likelihood_and_contrastive_divergence}所主张的，人类在睡眠时做梦可能是一种形式的\\gls{negative_phase}采样。\n尽管这个想法更多的只是猜测。\n\n\\section{\\glsentrytext{RBM}}\n\\label{sec:restricted_boltzmann_machines}\n\\gls{RBM}以\\firstgls{harmonium}之名\\citep{Smolensky86}面世之后，成为了深度概率模型中最常见的组件之一。\n我们之前在\\secref{sec:example_the_restricted_boltzmann_machine}简要介绍了~\\glssymbol{RBM}。\n在这里我们回顾以前的内容并探讨更多的细节。\n\\glssymbol{RBM}~是包含一层可观察变量和单层\\gls{latent_variable}的无向概率\\gls{graphical_model}。\n\\glssymbol{RBM}~可以堆叠起来（一个在另一个的顶部）形成更深的模型。\n\\figref{fig:chap20_dbn}展示了一些例子。\n特别地， \\figref{fig:chap20_dbn}a显示~\\glssymbol{RBM}~本身的图结构。\n它是一个二分图，观察层或\\gls{latent_layer}中的任何单元之间不允许存在连接。\n\n% -- 647 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{tabular}{cc}\n\\includegraphics{Chapter20/figures/squished_rbm.pdf} &\n\\includegraphics{Chapter20/figures/dbn.pdf}\\\\\n(a)&(b)\n\\end{tabular}\n\\begin{tabular}{c}\n \\includegraphics{Chapter20/figures/dbm_simple.pdf}\\\\\n(c)\n\\end{tabular}\n\\fi\n\\caption{可以用\\gls{RBM}构建的模型示例。\n(a)\\gls{RBM}本身是基于二分图的无向\\gls{graphical_model}，在图的一部分具有可见单元，另一部分具有\\gls{hidden_unit}。可见单元之间没有连接，\\gls{hidden_unit}之间也没有任何连接。通常每个可见单元连接到每个\\gls{hidden_unit}，但也可以构造稀疏连接的~\\glssymbol{RBM}，如卷积~\\glssymbol{RBM}。\n(b)\\gls{DBN}是涉及有向和无向连接的混合\\gls{graphical_model}。\n与~\\glssymbol{RBM}~一样，它也没有层内连接。\n然而，\\glssymbol{DBN}~具有多个\\gls{hidden_layer}，因此\\gls{hidden_unit}之间的连接在分开的层中。\n\\gls{DBN}所需的所有局部条件概率分布都直接复制~\\glssymbol{RBM}~的局部条件概率分布。\n或者，我们也可以用完全无向图表示\\gls{DBN}，但是它需要层内连接来捕获父节点间的依赖关系。\n(c)\\gls{DBM}是具有几层\\gls{latent_variable}的无向\\gls{graphical_model}。\n与~\\glssymbol{RBM}~和~\\glssymbol{DBN}~一样，\\glssymbol{DBM}~也缺少层内连接。\n\\glssymbol{DBM}~与~\\glssymbol{RBM}~的联系不如~\\glssymbol{DBN}~紧密。\n当从~\\glssymbol{RBM}~堆栈初始化~\\glssymbol{DBM}~时，有必要对~\\glssymbol{RBM}~的参数稍作修改。\n某些种类的~\\glssymbol{DBM}~可以直接训练，而不用先训练一组~\\glssymbol{RBM}。\n}\n\\label{fig:chap20_dbn}\n\\end{figure}\n\n% -- 648 --\n\n我们从二值版本的\\gls{RBM}开始，但如我们之后所见，这还可以扩展为其他类型的可见和\\gls{hidden_unit}。\n\n更正式地说，令观察层由一组$n_v$个二值随机变量组成，我们统称为向量$\\RVv$。\n我们将$n_h$个二值随机变量的\\gls{latent}或\\gls{hidden_layer}记为$\\Vh$。\n\n就像普通的\\gls{BM}，\\gls{RBM}也是\\gls{energy_based_model}，其\\gls{joint_probability_distribution}由\\gls{energy_function}指定：\n\\begin{align}\n P(\\RVv = \\Vv, \\RVh = \\Vh) = \\frac{1}{Z} \\exp(-E(\\Vv, \\Vh)).\n\\end{align}\nRBM的\\gls{energy_function}由下给出\n\\begin{align} \\label{eq:205e}\n E(\\Vv, \\Vh) = -\\Vb^\\top \\Vv - \\Vc^\\top \\Vh - \\Vv^\\top \\MW \\Vh,\n\\end{align}\n其中$Z$是被称为\\gls{partition_function}的归一化常数：\n\\begin{align}\n Z = \\sum_{\\Vv} \\sum_{\\Vh} \\exp \\{-E(\\Vv, \\Vh) \\}\n\\end{align}\n从\\gls{partition_function} $Z$的定义显而易见，计算$Z$的朴素方法（对所有状态进行穷举求和）计算上可能是难以处理的，除非有巧妙设计的算法可以利用概率分布中的规则来更快地计算$Z$。\n在\\gls{RBM}的情况下， \\citet{long10rbm}正式证明\\gls{partition_function} $Z$是难解的。\n难解的\\gls{partition_function} $Z$意味着归一化\\gls{joint_probability_distribution} $P(\\Vv)$也难以评估。\n\n\n\\subsection{条件分布}\n\\label{sec:conditional_distributions_chap20}\n虽然$P(\\Vv)$难解，但~\\glssymbol{RBM}~的二分图结构具有非常特殊的性质，其条件分布$P(\\RVh \\mid \\RVv)$和$P(\\RVv\\mid\\RVh)$是\\gls{factorial}的，并且计算和采样是相对简单的。\n\n% -- 649 --\n\n从联合分布中导出条件分布是直观的：\n\\begin{align}\n P(\\Vh \\mid \\Vv) &= \\frac{P(\\Vh, \\Vv)}{P(\\Vv)} \\\\\n &= \\frac{1}{P(\\Vv)} \\frac{1}{Z} \\exp \\big\\{ \\Vb^\\top \\Vv + \\Vc^\\top \\Vh + \\Vv^\\top\\MW \\Vh \\big\\} \\\\\n &=  \\frac{1}{Z^\\prime} \\exp \\big\\{ \\Vc^\\top \\Vh + \\Vv^\\top\\MW \\Vh \\big\\} \\\\\n &=  \\frac{1}{Z^\\prime} \\exp \\Big\\{ \\sum_{j=1}^{n_h}\\Vc_j^\\top \\Vh_j \n + \\sum_{n_h}^{j=1} \\Vv^\\top\\MW_{:,j} \\Vh_j \\Big\\} \\\\\n &=  \\frac{1}{Z^\\prime} \\prod_{j=1}^{n_h} \\exp \\big\\{ \\Vc_j^\\top \\Vh_j + \\Vv^\\top\\MW_{:,j} \\Vh_j \\big\\} .\n\\end{align}\n由于我们相对可见单元$\\RVv$计算条件概率，相对于分布$P(\\RVh  \\mid  \\RVv)$我们可以将它们视为常数。\n条件分布$ P(\\RVh  \\mid  \\RVv) $ \\gls{factorial}相乘的本质，我们可以将向量$\\Vh$上的联合概率写成单独元素$h_j$上（未归一化）分布的乘积。\n现在原问题变成了对单个二值$h_j$上的分布进行归一化的简单问题。\n\\begin{align}\n P(h_j=1  \\mid  \\Vv) &= \\frac{\\tilde{P}(h_j=1 \\mid \\Vv)}{\\tilde{P}(h_j=0 \\mid \\Vv) + \\tilde{P}(h_j=1 \\mid \\Vv)} \\\\\n &= \\frac{\\exp \\{ c_j + \\Vv^\\top \\MW_{:,j} \\} }{\\exp\\{ 0 \\} + \\exp \\{ c_j + \\Vv^\\top \\MW_{:,j}\\}} \\\\\n &= \\sigma (c_j + \\Vv^\\top \\MW_{:,j}).\n\\end{align}\n现在我们可以将关于\\gls{hidden_layer}的完全条件分布表达为\\gls{factorial}形式：\n\\begin{align}\n P(\\Vh  \\mid  \\Vv) = \\prod_{j=1}^{n_h} \\sigma \\big( (2\\Vh-1) \\odot (\\Vc + \\MW^\\top \\Vv) \\big)_j .\n\\end{align}\n\n类似的推导将显示我们感兴趣的另一条件分布，$P(\\Vv  \\mid  \\Vh)$也是\\gls{factorial}形式的分布：\n\\begin{align}\n  P(\\Vv  \\mid  \\Vh) = \\prod_{i=1}^{n_v} \\sigma \\big( (2\\Vv-1) \\odot (\\Vb + \\MW \\Vh) \\big)_i .\n\\end{align}\n\n\n\\subsection{训练\\glsentrytext{RBM}}\n\\label{sec:training_restricted_boltzmann_machines}\n\n%<BAD>因为~\\glssymbol{RBM}~允许以高效~\\glssymbol{mcmc}~采样（\\gls{block_gibbs_sampling}的形式）对$\\tilde{P}(\\Vv)$进行高效评估和求导，所以可以简单地使用\\chapref{chap:confronting_the_partition_function}中描述的任意训练具有难解\\gls{partition_function}模型的技术。\n因为~\\glssymbol{RBM}~允许高效计算$\\tilde{P}(\\Vv)$的估计和微分，并且还允许高效地（以\\gls{block_gibbs_sampling}的形式）进行\\glssymbol{mcmc}~采样，所以我们很容易使用\\chapref{chap:confronting_the_partition_function}中训练具有难以计算\\gls{partition_function}的模型的技术来训练~\\glssymbol{RBM}。\n这包括~\\glssymbol{contrastive_divergence}、\\,\\glssymbol{SML}（\\glssymbol{persistent_contrastive_divergence}）、\\gls{ratio_matching}等。\n与深度学习中使用的其他\\gls{undirected_model}相比，\\glssymbol{RBM}~可以相对直接地训练，因为我们可以以闭解形式计算$P(\\RVh  \\mid  \\Vv)$。\n其他一些深度模型，如\\gls{DBM}，同时具备难处理的\\gls{partition_function}和难以推断的难题。\n\n% -- 650 --\n\n\\section{\\glsentrytext{DBN}}\n\\label{sec:deep_belief_networks}\n\n\\firstall{DBN}是第一批成功应用深度架构训练的非卷积模型之一\\citep{Hinton06,hinton2007learning}。\n2006年\\gls{DBN}的引入开始了当前深度学习的复兴。\n在引入\\gls{DBN}之前，深度模型被认为太难以优化。\n具有凸\\gls{objective_function}的\\gls{kernel_machines}引领了研究前沿。\n\\gls{DBN}在MNIST数据集上表现超过内核化支持向量机，以此证明深度架构是能够成功的\\citep{Hinton06}。\n尽管现在与其他无监督或生成学习算法相比，\\gls{DBN}大多已经失去了青睐并很少使用，但它们在深度学习历史中的重要作用仍应该得到承认。\n\n\\gls{DBN}是具有若干\\gls{latent_variable}层的\\gls{generative_model}。\n\\gls{latent_variable}通常是二值的，而可见单元可以是二值或实数。\n尽管构造连接比较稀疏的~\\glssymbol{DBN}~是可能的，但在一般的模型中，每层的每个单元连接到每个相邻层中的每个单元（没有层内连接）。\n顶部两层之间的连接是无向的。\n而所有其他层之间的连接是有向的，箭头指向最接近数据的层。\n见\\figref{fig:chap20_dbn}b的例子。\n\n\n具有$l$个\\gls{hidden_layer}的~\\glssymbol{DBN}~包含$l$个权重矩阵：$\\MW^{(1)},\\ldots, \\MW^{(l)}$。\n同时也包含$l+1$个\\gls{bias_aff}向量：\n$\\Vb^{(0)},\\ldots,\\Vb^{(l)}$，其中$\\Vb^{(0)}$是可见层的\\gls{bias_aff}。\n\\glssymbol{DBN}~表示的概率分布由下式给出：\n\\begin{align}\n P(\\Vh^{(l)}, \\Vh^{(l-1)}) \\propto& \\exp \\big( \\Vb^{(l)^\\top} \\Vh^{(l)} +  \\Vb^{(l-1)^\\top} \\Vh^{(l-1)}\n + \\Vh^{(l-1)^\\top} \\MW^{(l)} \\Vh^{(l)} \\big), \\\\\n P(h_i^{(k)} = 1  \\mid  \\Vh^{(k+1)}) &= \\sigma \\big( b_i^{(k)} + \\MW_{:,i}^{(k+1)^\\top} \\Vh^{(k+1)} \n                                                          \\big)~ \\forall i,  \\forall k \\in 1, \\ldots, l-2, \\\\\nP(v_i = 1  \\mid  \\Vh^{(1)}) &=  \\sigma \\big( b_i^{(0)} + \\MW_{:,i}^{(1)^\\top} \\Vh^{(1)} \n                                                          \\big)~ \\forall i.\n\\end{align}\n在实值可见单元的情况下，替换\n\\begin{align}\n \\RVv \\sim \\CalN \\big( \\Vv; \\Vb^{(0)} + \\MW^{(1)^\\top} \\Vh^{(1)}, \\Vbeta^{-1} \\big)\n\\end{align}\n为便于处理，$\\Vbeta$为对角形式。\n至少在理论上，推广到其他指数族的可见单元是直观的。\n只有一个\\gls{hidden_layer}的~\\glssymbol{DBN}~只是一个~\\glssymbol{RBM}。\n\n% -- 651 --\n\n为了从~\\glssymbol{DBN}~中生成样本，我们先在顶部的两个\\gls{hidden_layer}上运行几个~\\gls{gibbs_sampling}步骤。\n这个阶段主要从~\\glssymbol{RBM}（由顶部两个\\gls{hidden_layer}定义）中采一个样本。\n然后，我们可以对模型的其余部分使用单次\\gls{ancestral_sampling}，以从可见单元绘制样本。\n\n\\gls{DBN}引发许多与\\gls{directed_model}和\\gls{undirected_model}同时相关的问题。\n\n% What ?\n由于每个有向层内的\\gls{explaining_away}效应，并且由于无向连接的两个\\gls{hidden_layer}之间的相互作用，\\gls{DBN}中的\\gls{inference}是难解的。\n评估或最大化对数似然的标准\\gls{ELBO}也是难以处理的，因为\\gls{ELBO}基于大小等于网络宽度的\\gls{clique}的期望。\n\n评估或最大化对数似然，不仅需要面对边缘化\\gls{latent_variable}时难以处理的\\gls{inference}问题，而且还需要处理顶部两层\\gls{undirected_model}内难处理的\\gls{partition_function}问题。\n\n为训练\\gls{DBN}，我们可以先使用\\gls{contrastive_divergence}或\\gls{SML}方法训练~\\glssymbol{RBM}~以最大化$ \\SetE_{\\RVv \\sim p_{\\text{data}}} \\log p(\\Vv)$。\n\\,\\glssymbol{RBM}~的参数定义了~\\glssymbol{DBN}~第一层的参数。\n然后，第二个~\\glssymbol{RBM}~训练为近似最大化\n\\begin{align}\n \\SetE_{\\RVv \\sim p_{\\text{data}}}  \\SetE_{\\RVh^{(1)} \\sim p^{(1)}(\\Vh^{(1)}  \\mid  \\Vv)}  \\log p^{(2)}(\\Vh^{(1)}) ,\n\\end{align}\n其中$p^{(1)}$是第一个~\\glssymbol{RBM}~表示的概率分布，$p^{(2)}$是第二个~\\glssymbol{RBM}~表示的概率分布。\n换句话说，第二个~\\glssymbol{RBM}~被训练为模拟由第一个~\\glssymbol{RBM}~的\\gls{hidden_unit}采样定义的分布，而第一个~\\glssymbol{RBM}~由数据驱动。\n这个过程能无限重复，从而向~\\glssymbol{DBN}~添加任意多层，其中每个新的~\\glssymbol{RBM}~对前一个~\\glssymbol{RBM}~的样本建模。\n每个~\\glssymbol{RBM}~定义~\\glssymbol{DBN}~的另一层。\n这个过程可以被视为提高数据在~\\glssymbol{DBN}~下似然概率的变分下界\\citep{Hinton06}。\n\n\n在大多数应用中，对~\\glssymbol{DBN}~进行贪心逐层训练后，不需要再花功夫对其进行联合训练。\n然而，使用\\gls{wake_sleep}算法对其进行生成\\gls{fine_tuning}是可能的。\n\n% -- 652 --\n\n训练好的~\\glssymbol{DBN}~可以直接用作\\gls{generative_model}，但是~\\glssymbol{DBN}~的大多数兴趣来自于它们改进分类模型的能力。\n我们可以从~\\glssymbol{DBN}~获取权重，并使用它们定义~\\glssymbol{MLP}：\n\\begin{align}\n \\Vh^{(1)} &= \\sigma \\big( b^{(1)} + \\Vv^\\top \\MW^{(1)} \\big), \\\\\n \\Vh^{(l)} &= \\sigma \\big( b_i^{(l)} + \\Vh^{(l-1)^\\top}\\MW^{(l)} \\big) ~\\forall l \\in 2, \\ldots, m.\n\\end{align}\n利用~\\glssymbol{DBN}~的生成训练后获得的权重和\\gls{bias_aff}初始化该~\\glssymbol{MLP}~之后，我们可以训练该~\\glssymbol{MLP}~来执行分类任务。\n这种~\\glssymbol{MLP}~的额外训练是判别性\\gls{fine_tuning}的示例。\n\n\n与\\chapref{chap:approximate_inference}中从基本原理导出的许多\\gls{inference}方程相比，这种特定选择的~\\glssymbol{MLP}~有些随意。\n这个~\\glssymbol{MLP}~是一个启发式选择，似乎在实践中效果不错，并在文献中一贯使用。\n许多近似\\gls{inference}技术是由它们在一些约束下，并在对数似然上找到最大\\emph{紧}变分下界的能力所驱动的。\n我们可以使用~\\glssymbol{DBN}~中~\\glssymbol{MLP}~定义的\\gls{hidden_unit}的期望，构造对数似然的变分下界，但这对于\\gls{hidden_unit}上的\\emph{任何}概率分布都是如此，并没有理由相信该~\\glssymbol{MLP}~提供了一个特别的紧界。\n特别地，\\glssymbol{MLP}~忽略了~\\glssymbol{DBN}~\\gls{graphical_model}中许多重要的相互作用。\n\\glssymbol{MLP}~将信息从可见单元向上传播到最深的\\gls{hidden_unit}，但不向下或侧向传播任何信息。\n\\glssymbol{DBN}~\\gls{graphical_model}解释了同一层内所有\\gls{hidden_unit}之间的相互作用以及层之间的自顶向下的相互作用。\n\n\n虽然~\\glssymbol{DBN}~的对数似然是难处理的，但它可以使用~\\glssymbol{AIS}~近似\\citep{Salakhutdinov+Murray-2008}。\n通过近似，可以评估其作为\\gls{generative_model}的质量。\n\n\n术语``\\gls{DBN}''通常不正确地用于指代任意种类的\\gls{DNN}，甚至没有\\gls{latent_variable}意义的网络。\n这个术语应特指最深层中具有无向连接，而在所有其他连续层之间存在向下有向连接的模型。\n\n这个术语也可能导致一些混乱，因为术语``信念网络''有时指纯粹的\\gls{directed_model}，而\\gls{DBN}包含一个无向层。\n\\gls{DBN}也与动态贝叶斯网络（dynamic Bayesian networks） \\citep{Dean+Kanazawa-1989}共享首字母缩写~\\glssymbol{DBN}，动态贝叶斯网络表示\\gls{markov_chain}的\\gls{bayesian_network}。\n\n% -- 653 --\n\n\\section{\\glsentrytext{DBM}}\n\\label{sec:deep_boltzmann_machines}\n\n\\firstall{DBM} \\citep{SalHinton09}是另一种深度\\gls{generative_model}。\n与\\glsacr{DBN}不同的是，它是一个完全无向的模型。\n与~\\glssymbol{RBM}~不同的是，\\glssymbol{DBM}~有几层\\gls{latent_variable}（\\glssymbol{RBM}~只有一层）。\n但是像~\\glssymbol{RBM}~一样，每一层内的每个变量是相互独立的，并条件于相邻层中的变量。\n见\\figref{fig:chap20_dbm_simple}中的图结构。\n\\gls{DBM}已经被应用于各种任务，包括文档建模\\citep{srivastava2013modeling}。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/dbm_simple}}\n\\fi\n\\caption{具有一个可见层（底部）和两个\\gls{hidden_layer}的\\gls{DBM}的\\gls{graphical_model}。\n仅在相邻层的单元之间存在连接。\n没有层内连接。}\n\\label{fig:chap20_dbm_simple}\n\\end{figure}\n\n与~\\glssymbol{RBM}~和~\\glssymbol{DBN}~一样，\\glssymbol{DBM}~通常仅包含二值单元 （正如我们为简化模型的演示而假设的），但很容易就能扩展到实值可见单元。\n\n\\glssymbol{DBM}~是\\gls{energy_based_model}，这意味着模型变量的\\gls{joint_probability_distribution}由\\gls{energy_function} $E$参数化。\n在一个\\gls{DBM}包含一个可见层$\\Vv$和三个\\gls{hidden_layer} $\\Vh^{(1)},\\Vh^{(2)}$和$\\Vh^{(3)}$的情况下，联合概率由下式给出：\n\\begin{align}\n P(\\Vv, \\Vh^{(1)},  \\Vh^{(2)},  \\Vh^{(3)}) = \\frac{1}{Z(\\Vtheta)} \n \\exp \\big( -E(\\Vv, \\Vh^{(1)},  \\Vh^{(2)},  \\Vh^{(3)}; \\Vtheta) \\big).\n\\end{align}\n为简化表示，下式省略了\\gls{bias_aff}参数。\n\\glssymbol{DBM}~\\gls{energy_function}定义如下：\n\\begin{align}\n    E(\\Vv, \\Vh^{(1)}, \\Vh^{(2)}, \\Vh^{(3)}; \\Vtheta)  = -\\Vv^\\top \\MW^{(1)}\\Vh^{(1)} \n - \\Vh^{(1)^\\top}\\MW^{(2)}\\Vh^{(2)}- \\Vh^{(2)^\\top}\\MW^{(3)}\\Vh^{(3)}.\n\\end{align}\n\n与~\\glssymbol{RBM}~的\\gls{energy_function}（\\eqnref{eq:205e}）相比，\\glssymbol{DBM}~\\gls{energy_function}以权重矩阵（$\\MW^{(2)}$和$\\MW^{(3)}$）的形式表示\\gls{hidden_unit}（\\gls{latent_variable}）之间的连接。\n正如我们将看到的，这些连接对模型行为以及我们如何在模型中进行\\gls{inference}都有重要的影响。\n\n% -- 654 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/dbm_bipartite}}\n\\fi\n\\caption{\\gls{DBM}，重新排列后显示为二分图结构。}\n\\label{fig:chap20_dbm_bipartite}\n\\end{figure}\n\n与全连接的\\gls{BM}（每个单元连接到其他每个单元）相比，\\glssymbol{DBM}~提供了类似于~\\glssymbol{RBM}~的一些优点。\n\n具体来说， 如\\figref{fig:chap20_dbm_bipartite}所示，\\glssymbol{DBM}~的层可以组织成一个二分图，其中奇数层在一侧，偶数层在另一侧。\n容易发现，当我们条件于偶数层中的变量时，奇数层中的变量变得条件独立。   \n当然，当我们条件于奇数层中的变量时，偶数层中的变量也会变得条件独立。\n\n\\glssymbol{DBM}~的二分图结构意味着我们可以应用之前用于~\\glssymbol{RBM}~条件分布的相同式子来确定~\\glssymbol{DBM}~中的条件分布。\n在给定相邻层值的情况下，层内的单元彼此条件独立，因此二值变量的分布可以由~\\ENNAME{Bernoulli}~参数（描述每个单元的激活概率）完全描述。\n在具有两个\\gls{hidden_layer}的示例中，激活概率由下式给出：\n\\begin{align}\n P(v_i=1  \\mid  \\Vh^{(1)}) &= \\sigma \\big( \\MW_{i,:}^{(1)}\\Vh^{(1)} \\big), \\\\\n P(h_i^{(1)}=1  \\mid  \\Vv, \\Vh^{(2)}) &= \\sigma \\big( \\Vv^\\top  \\MW_{:,i}^{(1)}\n + \\MW_{i,:}^{(2)}\\Vh^{(2)} \\big) ,\n\\end{align}\n和\n\\begin{align}\nP(h_k^{(2)} =1  \\mid  \\Vh^{(1)}) = \\sigma \\big(\\Vh^{(1)\\top} \\MW_{:,k}^{(2)} \\big).\n\\end{align}\n\n% -- 655 --\n\n二分图结构使~\\gls{gibbs_sampling}能在\\gls{DBM}中高效采样。\n\\gls{gibbs_sampling}的方法是一次只更新一个变量。\n\\glssymbol{RBM}~允许所有可见单元以一个块的方式更新，而所有\\gls{hidden_unit}在另一个块上更新。\n我们可以简单地假设具有$l$层的~\\glssymbol{DBM}~需要$l+1$次更新，每次迭代更新由某层单元组成的块。\n然而，我们可以仅在两次迭代中更新所有单元。\n\\gls{gibbs_sampling}可以将更新分成两个块，一块包括所有偶数层（包括可见层），另一个包括所有奇数层。\n由于~\\glssymbol{DBM}~二分连接模式，给定偶数层，关于奇数层的分布是\\gls{factorial}的，因此可以作为块同时且独立地采样。\n类似地，给定奇数层，可以同时且独立地将偶数层作为块进行采样。\n高效采样对使用\\gls{SML}算法的训练尤其重要。\n\n\n\\subsection{有趣的性质}\n\\gls{DBM}具有许多有趣的性质。\n\n\\glssymbol{DBM}~在~\\glssymbol{DBN}~之后开发。\n与~\\glssymbol{DBN}~相比，\\glssymbol{DBM}~的后验分布$P(\\Vh  \\mid  \\Vv)$更简单。\n有点违反直觉的是，这种后验分布的简单性允许更加丰富的后验近似。\n在~\\glssymbol{DBN}~的情况下，我们使用启发式的近似\\gls{inference}过程进行分类，其中我们可以通过~\\glssymbol{MLP}（使用~\\ENNAME{sigmoid}~激活函数并且权重与原始~\\glssymbol{DBN}~相同）中的向上传播猜测\\gls{hidden_unit}合理的\\gls{meanfield}期望值。\n\\emph{任何}分布$Q(\\Vh)$可用于获得对数似然的变分下界。\n因此这种启发式的过程让我们能够获得这样的下界。\n但是，该界没有以任何方式显式优化，所以该界可能是远远不紧的。\n特别地，$Q$的启发式估计忽略了相同层内\\gls{hidden_unit}之间的相互作用以及更深层中\\gls{hidden_unit}对更接近输入的\\gls{hidden_unit}自顶向下的反馈影响。\n因为~\\glssymbol{DBN}~中基于启发式~\\glssymbol{MLP}~的\\gls{inference}过程不能考虑这些相互作用，所以得到的$Q$想必远不是最优的。\n\\glssymbol{DBM}~中，在给定其他层的情况下，层内的所有\\gls{hidden_unit}都是条件独立的。\n这种层内相互作用的缺失使得通过\\gls{fixed_point_equation}优化变分下界并找到真正最佳的\\gls{meanfield}期望（在一些数值容差内）变得可能的。\n\n% -- 656 --\n\n使用适当的\\gls{meanfield}允许~\\glssymbol{DBM}~的近似\\gls{inference}过程捕获自顶向下反馈相互作用的影响。\n这从神经科学的角度来看是有趣的，因为根据已知，人脑使用许多自上而下的反馈连接。\n由于这个性质，\\glssymbol{DBM}~已被用作真实神经科学现象的计算模型 \\citep{series2010hallucinations,reichert2011neuronal}。\n\n\n\\glssymbol{DBM}~一个不理想的特性是从中采样是相对困难的。 \n在一次高效的\\gls{ancestral_sampling}过程中，\\glssymbol{DBN}~只需要在其顶部的一对层中使用~\\glssymbol{mcmc}~采样，而其他层仅在采样过程末尾参与。\n要从~\\glssymbol{DBM}~生成样本，必须在所有层中使用~\\glssymbol{mcmc}，并且模型的每一层都参与每个\\gls{markov_chain}转移。\n\n\n\\subsection{\\glssymbol{DBM}\\glsentrytext{meanfield}\\gls{inference}}\n\\label{sec:dbm_mean_field_inference}\n给定相邻层，一个~\\glssymbol{DBM}~层上的条件分布是\\gls{factorial}的。\n在有两个\\gls{hidden_layer}的~\\glssymbol{DBM}~的示例中，这些分布是$P(\\Vv  \\mid  \\Vh^{(1)}), P(\\Vh^{(1)}  \\mid  \\Vv, \\Vh^{(2)})$和$P(\\Vh^{(2)}  \\mid  \\Vh^{(1)})$。\n因为层之间的相互作用，\\emph{所有}\\gls{hidden_layer}上的分布通常不是\\gls{factorial}的。\n在有两个\\gls{hidden_layer}的示例中，由于$\\Vh^{(1)}$和$\\Vh^{(2)}$之间的交互权重$\\MW^{(2)}$使得这些变量相互依赖， $ P(\\Vh^{(1)}  \\mid  \\Vv, \\Vh^{(2)})$不是\\gls{factorial}的。\n\n\n与~\\glssymbol{DBN}~的情况一样，我们还是要找出近似~\\glssymbol{DBM}~后验分布的方法。\n然而，与~\\glssymbol{DBN}~不同，\\glssymbol{DBM}~在其\\gls{hidden_unit}上的后验分布（复杂的） 很容易用变分近似来近似（如\\secref{sec:variational_inference_and_learning}所讨论），具体是一个\\gls{meanfield}近似。\n\\gls{meanfield}近似是变分\\gls{inference}的简单形式，其中我们将近似分布限制为完全\\gls{factorial}的分布。\n在~\\glssymbol{DBM}~的情况下，\\gls{meanfield}方程捕获层之间的双向相互作用。\n在本节中，我们推导出由~\\cite{SalHinton09}最初引入的迭代近似\\gls{inference}过程。\n\n% -- 657 --\n\n在\\gls{inference}的变分近似中，我们通过一些相当简单的分布族近似特定目标分布——在这里指给定可见单元时\\gls{hidden_unit}的后验分布。\n在\\gls{meanfield}近似的情况下，近似族是\\gls{hidden_unit}条件独立的分布集合。\n\n\n我们现在为具有两个\\gls{hidden_layer}的示例推导\\gls{meanfield}方法。\n令$Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)$为$P(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)$的近似。\n\\gls{meanfield}假设意味着\n\\begin{align}\n Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv) = \\prod_j Q(h_j^{(1)} \\mid  \\Vv) \\prod_k Q(\\Vh_k^{(2)}  \\mid  \\Vv).\n\\end{align}\n\n\\gls{meanfield}近似试图找到这个分布族中最适合真实后验$P(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)$的成员。\n重要的是，每次我们使用$\\Vv$的新值时，必须再次运行\\gls{inference}过程以找到不同的分布$Q$。\n\n\n我们可以设想很多方法来衡量$Q(\\Vh  \\mid  \\Vv)$与$P(\\Vh  \\mid  \\Vv)$的拟合程度。\n\\gls{meanfield}方法是最小化\n\\begin{align}\n \\text{KL}(Q \\mid  \\mid P) = \\sum_{\\Vh} Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv) \n \\log \\Big( \\frac{Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)}{P(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)} \\Big).\n\\end{align}\n\n一般来说，除了要保证独立性假设，我们不必提供参数形式的近似分布。\n变分近似过程通常能够恢复近似分布的函数形式。\n然而，在二值\\gls{hidden_unit}（我们在这里推导的情况）的\\gls{meanfield}假设的情况下，不会由于预先固定模型的参数而损失一般性。\n\n我们将$Q$作为~\\gls{bernoulli_distribution}的乘积进行参数化，即我们将$\\Vh^{(1)}$每个元素的概率与一个参数相关联。\n具体来说，对于每个$j$，$\\hat h_j^{(1)} = Q(h_j^{(1)}=1 \\mid  \\Vv)$，其中$\\hat h_j^{(1)} \\in [0,1]$。\n另外，对于每个$k$，$\\hat h_k^{(2)} = Q(h_k^{(2)}=1 \\mid  \\Vv)$，其中$\\hat h_k^{(2)} \\in [0,1]$。\n因此，我们有以下近似后验：\n\\begin{align}\n Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv) &=  \\prod_j Q(h_j^{(1)} \\mid  \\Vv) \\prod_k Q(h_k^{(2)}  \\mid  \\Vv) \\\\\n &= \\prod_j (\\hat h_j^{(1)})^{h_j^{(1)}}(1-\\hat h_j^{(1)})^{(1-h_j^{(1)})} \\times\n \\prod_k (\\hat h_k^{(2)})^{h_k^{(2)}}(1-\\hat h_k^{(2)})^{(1-h_k^{(2)})} .\n\\end{align}\n当然，对于具有更多层的~\\glssymbol{DBM}，近似后验的参数化可以通过明显的方式扩展，即利用图的二分结构，遵循~\\gls{gibbs_sampling}相同的调度，同时更新所有偶数层，然后同时更新所有奇数层。\n\n% -- 658 --\n\n现在我们已经指定了近似分布$Q$的函数族，但仍然需要指定用于选择该函数族中最适合$P$的成员的过程。\n最直接的方法是使用\\eqnref{eqn:1956}指定的\\gls{meanfield}方程。\n这些方程是通过求解变分下界导数为零的位置而导出。\n他们以抽象的方式描述如何优化任意模型的变分下界（只需对$Q$求期望）。\n\n应用这些一般的方程，我们得到以下更新规则（再次忽略\\gls{bias_aff}项）：\n\\begin{align} \\label{eq:2033h1}\n \\hat h_j^{(1)} &= \\sigma  \\Big(  \\sum_i v_i \\MW_{i,j}^{(1)}\n + \\sum_{k^{\\prime}} \\MW_{j,k^{\\prime}}^{(2)} \\hat h_{k^{\\prime}}^{(2)}  \\Big), ~\\forall j ,\\\\\n \\label{eq:2034h2}\n \\hat h_{k}^{(2)} &=  \\sigma  \\Big(  \\sum_{j^{\\prime}} \\MW_{j^{\\prime},k}^{(2)}\n \\hat h_{j^{\\prime}}^{(1)}  \\Big), ~\\forall k.\n\\end{align}\n在该方程组的不动点处，我们具有变分下界$\\CalL(Q)$的局部最大值。\n因此，这些不动点更新方程定义了迭代算法，其中我们交替更新$h_{j}^{(1)} $ （使用\\eqnref{eq:2033h1}）和$h_{k}^{(2)} $ （使用\\eqnref{eq:2034h2}）。\n对于诸如MNIST的小问题，少至10次迭代就足以找到用于学习的近似\\gls{positive_phase}梯度，而50次通常足以获得要用于高精度分类的单个特定样本的高质量表示。\n将近似变分\\gls{inference}扩展到更深的~\\glssymbol{DBM}~是直观的。\n\n\n\\subsection{\\glssymbol{DBM}~的参数学习}\n\\label{sec:dbm_parameter_learning}\n\n\\glssymbol{DBM}~中的学习必须面对难解\\gls{partition_function}的挑战（使用\\chapref{chap:confronting_the_partition_function}中的技术），以及难解后验分布的挑战（使用\\chapref{chap:approximate_inference}中的技术）。\n\n如\\secref{sec:dbm_mean_field_inference}中所描述的，变分\\gls{inference}允许构建近似难处理的$P(\\Vh  \\mid  \\Vv)$的分布$Q(\\Vh \\mid \\Vv)$。\n然后通过最大化$\\CalL(\\Vv, Q, \\Vtheta)$（难处理的对数似然的变分下界$\\log P(\\Vv; \\Vtheta)$）学习。\n\n% -- 659 --\n\n对于具有两个\\gls{hidden_layer}的\\gls{DBM}，$\\CalL$由下式给出\n\\begin{align}\n \\CalL(Q, \\Vtheta) = \\sum_i \\sum_{j^{\\prime}} v_i W_{i,j^{\\prime}}^{(1)} \n \\hat h_{j^{\\prime}}^{(1)} +  \\sum_{j^{\\prime}} \\sum_{k^{\\prime}} \\hat h_{j^{\\prime}}^{(1)}\n W_{j^{\\prime}, k^{\\prime}}^{(2)} \\hat h_{k^{\\prime}}^{(2)} - \\log Z(\\Vtheta) + \\CalH(Q).\n\\end{align}\n该表达式仍然包含对数\\gls{partition_function} $ \\log Z(\\Vtheta) $。\n由于\\gls{DBM}包含\\gls{RBM}作为组件，用于计算\\gls{RBM}的\\gls{partition_function}和采样的困难同样适用于\\gls{DBM}。\n这意味着评估\\gls{BM}的\\gls{PMF}需要近似方法，如\\gls{AIS}。\n同样，训练模型需要近似对数\\gls{partition_function}的梯度。\n见\\chapref{chap:confronting_the_partition_function}对这些方法的一般性描述。\n\\glssymbol{DBM}~通常使用\\gls{SML}训练。\n\\chapref{chap:confronting_the_partition_function}中描述的许多其他技术都不适用。\n诸如\\gls{pseudolikelihood}的技术需要评估非归一化概率的能力，而不是仅仅获得它们的变分下界。\n对于\\gls{DBM}，\\gls{contrastive_divergence}是缓慢的，因为它们不能在给定可见单元时对\\gls{hidden_unit}进行高效采样——反而，每当需要新的\\gls{negative_phase}样本时，\\gls{contrastive_divergence}将需要\\gls{burn_in}一条\\gls{markov_chain}。\n% 660 mid\n\n非变分版本的\\gls{SML}算法已经在\\secref{sec:stochastic_maximum_likelihood_and_contrastive_divergence}讨论过。\n\\algref{alg:sml_dbm}给出了应用于~\\glssymbol{DBM}~的变分\\gls{SML}算法。\n回想一下，我们描述的是~\\glssymbol{DBM}~的简化变体（缺少\\gls{bias_aff}参数）; 很容易推广到包含\\gls{bias_aff}参数的情况。\n\n\\begin{algorithm}%[!ht]\n\\caption{用于训练具有两个\\gls{hidden_layer}的\\glssymbol{DBM}的变分\\gls{SML}算法} \n\\label{alg:sml_dbm}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数\n\\STATE 设定\\gls{gibbs_steps} $k$，大到足以让$p(\\Vv,\\Vh^{(1)},\\Vh^{(2)}; \\Vtheta + \\epsilon \\Delta_{\\Vtheta})$的\\gls{markov_chain}能\\gls{burn_in} （从来自 $p(\\Vv,\\Vh^{(1)},\\Vh^{(2)}; \\Vtheta)$ 的样本开始）。 \n\\STATE 初始化三个矩阵，$\\tilde{\\MV}$, $\\tilde{\\MH}^{(1)}$ 和 $\\tilde{\\MH}^{(2)}$ 每个都将 $m$行设为随机值（例如，来自~\\gls{bernoulli_distribution}，边缘分布大致与模型匹配）。  \n\\WHILE{没有收敛（学习循环）} \n\\STATE 从训练数据采包含$m$个样本的\\gls{minibatch}，并将它们排列为设计矩阵$\\MV$的行。\n\\STATE 初始化矩阵 $\\hat{\\MH}^{(1)}$ 和 $\\hat{\\MH}^{(2)}$，使其大致符合模型的边缘分布。 % ??\n\\WHILE{没有收敛（\\gls{meanfield}\\gls{inference}循环）}\n        \\STATE $\\hat{\\MH}^{(1)} \\leftarrow \\sigmoid \\left(\n          \\MV \\MW^{(1)} + \\hat{\\MH}^{(2)} \\MW^{(2) \\top} \\right)$.\n        \\STATE $\\hat{\\MH}^{(2)} \\leftarrow \\sigmoid \\left(\n          \\hat{\\MH}^{(1)} \\MW^{(2)} \\right)$.\n\\ENDWHILE\n\\STATE $\\Delta_{\\MW^{(1)}} \\leftarrow \\frac{1}{m} \\MV^\\top \\hat{\\MH}^{(1)}$\n\\STATE $\\Delta_{\\MW^{(2)}} \\leftarrow \\frac{1}{m} \\hat{\\MH}^{(1)\\ \\top} \\hat{\\MH}^{(2)}$\n\n\\FOR{$l=1$ to $k$ （\\gls{gibbs_sampling}）}\n\\STATE Gibbs block 1:\n   \\STATE $\\forall i, j, \\tilde{V}_{i,j} \\text{ 采自 } P(\\tilde{V}_{i,j} = 1) =\n    \\sigmoid \\left( \n     \\MW_{j,:}^{(1)} \n     \\left( \\tilde{\\MH}_{i,:}^{(1)} \\right)^\\top\n     \\right)$.\n   \\STATE $\\forall i, j, \\tilde{H}^{(2)}_{i,j} \\text{ 采自 } P(\\tilde{H}^{(2)}_{i,j} = 1) = \n   \\sigmoid \\left(\\tilde{\\MH}_{i,:}^{(1)} \\MW_{:,j}^{(2)} \n    \\right)$.\n\\STATE Gibbs block 2:\n   \\STATE $\\forall i, j, \\tilde{H}^{(1)}_{i,j} \\text{ 采自 } P(\\tilde{H}^{(1)}_{i,j} = 1) = \\sigmoid \\left( \\tilde{\\MV}_{i,:}\n     \\MW_{:,j}^{(1)} + \\tilde{\\MH}_{i,:}^{(2)} \\MW_{j,:}^{(2) \\top} \\\n   \\right)$.\n\\ENDFOR\n\\STATE $\\Delta_{\\MW^{(1)}} \\leftarrow \\Delta_{\\MW^{(1)}} - \\frac{1}{m} \\MV^\\top \\tilde{\\MH}^{(1)}$\n\\STATE $\\Delta_{\\MW^{(2)}} \\leftarrow \\Delta_{\\MW^{(2)}} - \\frac{1}{m} \\tilde{\\MH}^{(1) \\top} \\tilde{\\MH}^{(2)}$\n\\STATE $\\MW^{(1)} \\leftarrow \\MW^{(1)} + \\epsilon \\Delta_{\\MW^{(1)}}$\n（这是大概的描述，实践中使用的算法更高效，如具有衰减\\gls{learning_rate}的动量）\n\\STATE $\\MW^{(2)} \\leftarrow \\MW^{(2)} + \\epsilon \\Delta_{\\MW^{(2)}}$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\\subsection{\\glsentrytext{layer_wise_pretraining}}\n\\label{sec:layer_wise_pretraining}\n\n不幸的是，随机初始化后使用\\gls{SML}训练（如上所述）的~\\glssymbol{DBM}~通常导致失败。\n在一些情况下，模型不能学习如何充分地表示分布。\n在其他情况下，\\glssymbol{DBM}~可以很好地表示分布，但是没有比仅使用~\\glssymbol{RBM}~获得更高的似然。\n除第一层之外，所有层都具有非常小权重的~\\glssymbol{DBM}~与~\\glssymbol{RBM}~表示大致相同的分布。\n\n如\\secref{sec:jointly_training_deep_boltzmann_machines} 所述，目前已经开发了允许联合训练的各种技术。\n然而，克服~\\glssymbol{DBM}~的联合训练问题最初和最流行的方法是\\gls{greedy_layer_wise_pretraining}。\n在该方法中，\\glssymbol{DBM}~的每一层被单独视为~\\glssymbol{RBM}，进行训练。\n第一层被训练为对输入数据进行建模。\n每个后续~\\glssymbol{RBM}~被训练为对来自前一~\\glssymbol{RBM}~后验分布的样本进行建模。\n在以这种方式训练了所有~\\glssymbol{RBM}~之后，它们可以被组合成~\\glssymbol{DBM}。\n然后可以用~\\glssymbol{persistent_contrastive_divergence}~训练~\\glssymbol{DBM}。\n通常，\\glssymbol{persistent_contrastive_divergence}~训练将仅使模型的参数、由数据上的对数似然衡量的性能、或区分输入的能力发生微小的变化。\n见\\figref{fig:chap20_standard_dbm_color}展示的训练过程。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/standard_dbm_color}}\n\\fi\n\\caption{用于分类MNIST数据集的\\gls{DBM}训练过程~\\citep{SalHinton09,Srivastava14}。\n(a)使用\\glssymbol{contrastive_divergence}近似最大化$\\log P(\\Vv)$来训练\\glssymbol{RBM}。\n(b)训练第二个\\glssymbol{RBM}，使用\\glssymbol{contrastive_divergence}-$k$近似最大化$\\log P(\\Vh^{(1)}, \\RSy)$来建模$\\Vh^{(1)}$和目标类$\\RSy$，其中$\\Vh^{(1)}$采自第一个\\glssymbol{RBM}条件于数据的后验。 在学习期间将$k$从$1$增加到$20$。\n(c)将两个\\glssymbol{RBM}组合为\\glssymbol{DBM}。\n使用$k = 5$的\\gls{SML}训练，近似最大化$\\log P(\\RVv, \\RSy)$。\n(d)将$\\RSy$从模型中删除。\n定义新的一组特征$\\Vh^{(1)}$和$\\Vh^{(2)}$，可在缺少$\\RSy$的模型中运行\\gls{meanfield}\\gls{inference}后获得。% ??\n使用这些特征作为\\glssymbol{MLP}的输入，其结构与\\gls{meanfield}的额外轮相同，并且具有用于估计$\\RSy$的额外输出层。\n初始化\\glssymbol{MLP}的权重与\\glssymbol{DBM}的权重相同。\n使用\\gls{SGD}和\\gls{dropout}训练\\glssymbol{MLP}近似最大化$\\log P(\\RSy \\mid \\RVv)$。\n图来自~\\citet{Goodfellow-et-al-NIPS2013}。\n}\n\\label{fig:chap20_standard_dbm_color}\n\\end{figure}\n\n% -- 662 head\n\n这种\\gls{greedy_layer_wise_training}过程不仅仅是\\gls{coordinate_ascent}。\n因为我们在每个步骤优化参数的一个子集，它与\\gls{coordinate_ascent}具有一些传递相似性。\n这两种方法是不同的，因为\\gls{greedy_layer_wise_training}过程中，我们在每个步骤都使用了不同的\\gls{objective_function}。\n\n\n\\glssymbol{DBM}~的\\gls{greedy_layer_wise_pretraining}与~\\glssymbol{DBN}~的\\gls{greedy_layer_wise_pretraining}不同。\n每个单独的~\\glssymbol{RBM}~的参数可以直接复制到相应的~\\glssymbol{DBN}。\n在~\\glssymbol{DBM}~的情况下，\\glssymbol{RBM}~的参数在包含到~\\glssymbol{DBM}~中之前必须修改。\n\\glssymbol{RBM}~栈的中间层仅使用自底向上的输入进行训练，但在栈组合形成~\\glssymbol{DBM}~后，该层将同时具有自底向上和自顶向下的输入。\n为了解释这种效应，\\citet{SalHinton09}提倡在将其插入~\\glssymbol{DBM}~之前，将所有~\\glssymbol{RBM}（顶部和底部~\\glssymbol{RBM}~除外）的权重除2。\n另外，必须使用每个可见单元的两个``副本''来训练底部~\\glssymbol{RBM}，并且两个副本之间的权重约束为相等。\n这意味着在向上传播时，权重能有效地加倍。\n类似地，顶部~\\glssymbol{RBM}~应当使用最顶层的两个副本来训练。\n\n为了使用\\gls{DBM}获得最好结果，我们需要修改标准的~\\glssymbol{SML}~算法，即在联合~\\glssymbol{persistent_contrastive_divergence}~训练步骤的\\gls{negative_phase}期间使用少量的\\gls{meanfield} \\citep{SalHinton09}。\n具体来说，应当相对于其中所有单元彼此独立的\\gls{meanfield}分布来计算能量梯度的期望。\n这个\\gls{meanfield}分布的参数应该通过运行一次\\gls{meanfield}\\gls{fixed_point_equation}获得。\n\\citet{Goodfellow-et-al-NIPS2013}比较了在\\gls{negative_phase}中使用和不使用部分\\gls{meanfield}的中心化~\\glssymbol{DBM}~的性能。\n\n\n\\subsection{联合训练\\glsentrytext{DBM}}\n\\label{sec:jointly_training_deep_boltzmann_machines}\n\n经典~\\glssymbol{DBM}~需要\\gls{greedy_unsupervised_pretraining}，并且为了更好的分类，需要在它们提取的隐藏特征之上，使用独立的基于~\\glssymbol{MLP}~的分类器。\n这种方法有一些不理想的性质。\n因为我们不能在训练第一个~\\glssymbol{RBM}~时评估完整~\\glssymbol{DBM}~的属性，所以在训练期间难以跟踪性能。\n因此，直到相当晚的训练过程，我们都很难知道我们的超参数表现如何。\n\\glssymbol{DBM}~的软件实现需要很多不同的模块，如用于单个~\\glssymbol{RBM}~的~\\glssymbol{contrastive_divergence}~训练、完整~\\glssymbol{DBM}~的~\\glssymbol{persistent_contrastive_divergence}~训练以及基于\\gls{back_propagation}的~\\glssymbol{MLP}~训练。\n最后，\\gls{BM}顶部的~\\glssymbol{MLP}~失去了\\gls{BM}概率模型的许多优点，例如当某些输入值丢失时仍能够进行\\gls{inference}的优点。\n\n% -- 662 --\n\n主要有两种方法可以处理\\gls{DBM}的联合训练问题。\n第一个是\\textbf{中心化\\gls{DBM}}(centered deep Boltzmann machine) \\citep{Montavon2012}，通过\\gls{reparametrization}模型使其在开始学习过程时\\gls{cost_function}的~\\gls{hessian}~具有更好的条件数。\n这个模型不用经过\\gls{greedy_layer_wise_pretraining}阶段就能训练。\n这个模型在测试集上获得出色的对数似然，并能产生高质量的样本。\n不幸的是，作为分类器，它仍然不能与适当\\gls{regularize}的~\\glssymbol{MLP}~竞争。\n联合训练\\gls{DBM}的第二种方式是使用\\firstall{MPDBM} \\citep{Goodfellow-et-al-NIPS2013}。\n该模型的训练\\gls{criterion}允许\\gls{back_propagation}算法，以避免使用~\\glssymbol{mcmc}~估计梯度的问题。\n不幸的是，新的\\gls{criterion}不会导致良好的似然性或样本，但是相比~\\glssymbol{mcmc}~方法，它确实会导致更好的分类性能和良好的\\gls{inference}缺失输入的能力。\n\n如果我们回到\\gls{BM}的一般观点，即包括一组权重矩阵$\\MU$和\\gls{bias_aff} $\\Vb$的单元$\\Vx$，\\gls{BM}中心化技巧是最容易描述的。\n回顾\\eqnref{eq:202E}，\\gls{energy_function}由下式给出\n\\begin{align}\n E(\\Vx) = -\\Vx^\\top \\MU \\Vx - \\Vb^\\top \\Vx.\n\\end{align}\n在权重矩阵$\\MU$中使用不同的稀疏模式，我们可以实现不同架构的\\gls{BM}，如~\\glssymbol{RBM}~或具有不同层数的~\\glssymbol{DBM}。\n将$\\Vx$分割成可见和\\gls{hidden_unit}并将$\\MU$中不相互作用的单元的归零可以实现这些架构。\n中心化\\gls{BM}引入了一个向量$\\Vmu$，并从所有状态中减去：\n\\begin{align}\n    E^{\\prime}(\\Vx; \\MU, \\Vb) = -(\\Vx - \\Vmu)^\\top \\MU (\\Vx - \\Vmu) - (\\Vx - \\Vmu)^\\top \\Vb.\n\\end{align}\n通常$\\Vmu$在开始训练时固定为一个超参数。\n当模型初始化时，通常选择为$\\Vx - \\Vmu \\approx 0$。\n这种\\gls{reparametrization}不改变模型可表示的概率分布的集合，但它确实改变了应用于似然的\\gls{SGD}的动态。\n具体来说，在许多情况下，这种\\gls{reparametrization}导致更好条件数的~\\gls{hessian}~矩阵。\n\\citet{melchior2013center}通过实验证实了~\\gls{hessian}~矩阵条件数的改善，并观察到中心化技巧等价于另一个\\gls{BM}学习技术——\\textbf{增强梯度}(enhanced gradient) \\citep{ICML2011Cho_98-small}。\n即使在困难的情况下，例如训练多层的\\gls{DBM}，\\gls{hessian}~矩阵条件数的改善也能使学习成功。\n\n% -- 664 --\n\n联合训练\\gls{DBM}的另一种方法是\\glsacr{MPDBM}，它将\\gls{meanfield}方程视为定义一系列用于近似求解每个可能\\gls{inference}问题的\\gls{recurrent_network}~\\citep{Goodfellow-et-al-NIPS2013}。\n模型被训练为使每个\\gls{recurrent_network}获得对相应\\gls{inference}问题的准确答案，而不是训练模型来最大化似然。\n训练过程如\\figref{fig:chap20_multi_prediction_training}所示。\n它包括随机采一个训练样本、随机采样\\gls{inference}网络的输入子集，然后训练\\gls{inference}网络来预测剩余单元的值。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/multi_prediction_training}}\n\\fi\n\\caption{\\gls{DBM}多预测训练过程的示意图。\n每一行指示相同训练步骤内\\gls{minibatch}中的不同样本。\n每列表示\\gls{meanfield}\\gls{inference}过程中的\\gls{time_step}。\n对于每个样本，我们对数据变量的子集进行采样，作为\\gls{inference}过程的输入。\n这些变量以黑色阴影表示条件。\n然后我们运行\\gls{meanfield}\\gls{inference}过程，箭头指示过程中的哪些变量会影响其他变量。\n在实际应用中，我们将\\gls{meanfield}展开为几个步骤。\n在此示意图中，我们只展开为两个步骤。\n虚线箭头表示获得更多步骤需要如何展开该过程。\n未用作\\gls{inference}过程输入的数据变量成为目标，以灰色阴影表示。\n我们可以将每个样本的\\gls{inference}过程视为\\gls{recurrent_network}。\n为了使其在给定输入后能产生正确的目标，我们使用\\gls{GD}和\\gls{back_propagation}训练这些\\gls{recurrent_network}。\n这可以训练~\\glssymbol{MPDBM}~\\gls{meanfield}过程产生准确的估计。\n图改编自~\\citet{Goodfellow-et-al-NIPS2013}。\n}\n\\label{fig:chap20_multi_prediction_training}\n\\end{figure}\n\n这种用于近似\\gls{inference}，通过\\gls{computational_graph}进行\\gls{back_propagation}的一般原理已经应用于其他模型~\\citep{Stoyanov2011,brakel13a}。\n在这些模型和~\\glssymbol{MPDBM}~中，最终\\gls{loss}不是似然的下界。\n相反，最终\\gls{loss}通常基于近似\\gls{inference}网络对缺失值施加的近似条件分布。\n这意味着这些模型的训练有些启发式。\n如果我们检查由~\\glssymbol{MPDBM}~学习出来的\\gls{BM}表示$p(\\Vv)$，在~\\gls{gibbs_sampling}产生较差样本的意义下，它倾向于有些缺陷。\n\n通过\\gls{inference}图的\\gls{back_propagation}有两个主要优点。\n首先，它以模型真正使用的方式训练模型 —— 使用近似\\gls{inference}。\n这意味着在~\\glssymbol{MPDBM}~中，进行如填充缺失的输入或执行分类（尽管存在缺失的输入）的近似\\gls{inference}比在原始~\\glssymbol{DBM}~中更准确。\n原始~\\glssymbol{DBM}~不会自己做出准确的分类器; 使用原始~\\glssymbol{DBM}~的最佳分类结果是基于~\\glssymbol{DBM}~提取的特征训练独立的分类器，而不是通过使用~\\glssymbol{DBM}~中的\\gls{inference}来计算关于类标签的分布。\n\\glssymbol{MPDBM}~中的\\gls{meanfield}\\gls{inference}作为分类器，不需要进行特殊修改就获得良好的表现。\n通过近似\\gls{inference}\\gls{back_propagation}的另一个优点是\\gls{back_propagation}计算\\gls{loss}的精确梯度。\n对于优化而言，比~\\glssymbol{SML}~训练中具有偏差和方差的近似梯度更好。\n这可能解释了为什么~\\glssymbol{MPDBM}~可以联合训练，而~\\glssymbol{DBM}~需要\\gls{greedy_layer_wise_pretraining}。\n近似\\gls{inference}图\\gls{back_propagation}的缺点是它不提供一种优化对数似然的方法，而提供\\gls{generalized_pseudolikelihood}的启发式近似。\n\n\\glssymbol{MPDBM}~启发了对NADE框架的扩展NADE-$k$~\\citep{Raiko-et-al-2014} ，我们将在\\secref{sec:nade}中描述。\n% 665 end\n\n\\glssymbol{MPDBM}~与~\\gls{dropout}~有一定联系。\n\\gls{dropout}~在许多不同的\\gls{computational_graph}之间共享相同的参数，每个图之间的差异是包括还是排除每个单元。\n\\glssymbol{MPDBM}~还在许多\\gls{computational_graph}之间共享参数。\n在~\\glssymbol{MPDBM}~的情况下，图之间的差异是每个输入单元是否被观察到。\n当没有观察到单元时，\\glssymbol{MPDBM}~不会像~\\gls{dropout}~那样将其完全删除。\n相反，\\glssymbol{MPDBM}~将其视为要\\gls{inference}的\\gls{latent_variable}。\n我们可以想象将~\\gls{dropout}~应用到~\\glssymbol{MPDBM}，即额外去除一些单元而不是将它们变为\\gls{latent_variable}。\n\n% 667 head\n\\section{实值数据上的\\glsentrytext{BM}}\n\\label{sec:boltzmann_machines_for_real_valued_data}\n虽然\\gls{BM}最初是为二值数据而开发的，但是许多应用，例如图像和音频建模似乎需要表示实值上概率分布的能力。\n在一些情况下，我们可以将区间$[0,1]$中的实值数据视为表示二值变量的期望。\n例如， \\citet{Hinton-PoE-2000}将训练集中灰度图像的像素值视为定义$[0,1]$间的概率值。\n每个像素定义二值变量为$1$的概率，并且二值像素的采样\n都彼此独立。\n这是评估灰度图像数据集上二值模型的常见过程。\n然而，这种方法理论上并不特别令人满意，并且以这种方式独立采样的二值图像具有噪声表象。\n在本节中，我们介绍概率密度定义在实值数据上的\\gls{BM}。\n\n\n\\subsection{\\gls{GBRBM}}\n\\label{sec:gaussian_bernoulli_rbms}\n\\gls{RBM}可以用于许多指数族的条件分布 \\citep{Welling05}。\n其中，最常见的是具有二值\\gls{hidden_unit}和实值可见单元的~\\glssymbol{RBM}，其中可见单元上的条件分布是\\gls{gaussian_distribution}（均值为\\gls{hidden_unit}的函数）。\n\n有很多方法可以参数化~\\gls{GBRBM}。\n首先，我们可以选择协方差矩阵或精度矩阵来参数化\\gls{gaussian_distribution}。\n这里，我们介绍选择精度矩阵的情况。\n我们可以通过简单的修改获得协方差的形式。\n我们希望条件分布为\n\\begin{align}\n p(\\Vv  \\mid  \\Vh) = \\CalN(\\Vv; \\MW\\Vh, \\Vbeta^{-1}).\n\\end{align}\n通过扩展未归一化的对数条件分布可以找到需要添加到\\gls{energy_function}中的项：\n\\begin{align} \\label{eq:2039log}\n \\log \\CalN(\\Vv; \\MW\\Vh, \\Vbeta^{-1}) = -\\frac{1}{2}(\\Vv - \\MW\\Vh)^\\top \\Vbeta (\\Vv - \\MW\\Vh) + \n f(\\Vbeta) .\n\\end{align}\n\n% -- 667 --\n\n此处$f$封装所有的参数，但不包括模型中的随机变量。\n因为$f$的唯一作用是归一化分布，并且我们选择的任何可作为\\gls{partition_function}的\\gls{energy_function}都能起到这个作用，所以我们可以忽略$f$。\n\n如果我们在\\gls{energy_function}中包含\\eqnref{eq:2039log}中涉及$\\Vv$的所有项（其符号被翻转），并且不添加任何其他涉及$\\Vv$的项，那么我们的\\gls{energy_function}就能表示想要的条件分布$p(\\Vv  \\mid  \\Vh)$。\n\n其他条件分布比较自由，如$p(\\Vh  \\mid  \\Vv)$。\n注意\\eqnref{eq:2039log}包含一项\n\\begin{align}\n \\frac{1}{2}\\Vh^\\top\\MW^\\top \\Vbeta \\MW \\Vh .\n\\end{align}\n因为该项包含$h_i h_j$项，它不能被全部包括在内。\n这些对应于\\gls{hidden_unit}之间的边。\n如果我们包括这些项，我们将得到一个\\gls{linear_factor}，而不是\\gls{RBM}。\n当设计我们的\\gls{BM}时，我们简单地省略这些$h_i h_j$交叉项。\n省略这些项不改变条件分布$p(\\Vv  \\mid  \\Vh)$，因此\\eqnref{eq:2039log}仍满足。\n然而，我们仍然可以选择是否包括仅涉及单个$h_i$的项。\n如果我们假设精度矩阵是对角的，就能发现对于每个\\gls{hidden_unit} $h_i$，我们有一项\n\\begin{align}\n \\frac{1}{2} h_i \\sum_j \\beta_j W_{j,i}^2.\n\\end{align}\n在上面，我们使用了$h_i^2 = h_i$的事实（因为$h_i \\in \\{ 0, 1\\}$）。\n如果我们在\\gls{energy_function}中包含此项（符号被翻转），则当该单元的权重较大且以高精度连接到可见单元时，\\gls{bias_aff} $h_i$将自然被关闭。\n是否包括该\\gls{bias_aff}项不影响模型可以表示的分布族（假设我们包括\\gls{hidden_unit}的\\gls{bias_aff}参数），但是它确实会影响模型的学习动态。\n包括该项可以帮助\\gls{hidden_unit}（即使权重在幅度上快速增加时）保持合理激活。\n\n因此，在~\\gls{GBRBM}~上定义\\gls{energy_function}的一种方式：\n\\begin{align}\n E(\\Vv, \\Vh) = \\frac{1}{2} \\Vv^\\top (\\Vbeta \\odot \\Vv) -  (\\Vv \\odot \\Vbeta)^\\top\\MW \\Vh - \\Vb^\\top \\Vh,\n\\end{align}\n但我们还可以添加额外的项或者通过方差而不是精度参数化能量。\n\n% -- 668 --\n\n在这个推导中，我们没有在可见单元上添加\\gls{bias_aff}项，但添加这样的\\gls{bias_aff}是容易的。\n\\gls{GBRBM}~参数化一个最终变化的来源是如何处理精度矩阵的选择。\n它可以被固定为常数（可能基于数据的边缘精度估计）或学习出来。\n它也可以是标量乘以单位矩阵，或者是一个对角矩阵。\n在此情况下，由于一些操作需要对矩阵\\gls{invert}，我们通常不允许非对角的精度矩阵，因为高斯分布的一些操作需要对矩阵\\gls{invert}，一个对角矩阵可以非常容易地被\\gls{invert}。\n在接下来的章节中，我们将看到其他形式的\\gls{BM}，它们允许对协方差结构建模，并使用各种技术避免对精度矩阵\\gls{invert}。\n\n\n\\subsection{条件协方差的\\glsentrytext{undirected_model}}\n\\label{sec:undirected_models_of_conditional_covariance}\n\n虽然\\gls{gaussian_rbm}~已成为实值数据的标准能量模型， \\citet{Ranzato2010a}认为\\gls{gaussian_rbm}~感应\\gls{bias_aff}不能很好地适合某些类型的实值数据中存在的统计变化，特别是自然图像。\n问题在于自然图像中的许多信息内容嵌入于像素之间的协方差而不是原始像素值中。\n换句话说，图像中的大多数有用信息在于像素之间的关系，而不是其绝对值。\n由于\\gls{gaussian_rbm}~仅对给定\\gls{hidden_unit}的输入条件均值建模，所以它不能捕获条件协方差信息。\n为了回应这些评论，已经有学者提出了替代模型，设法更好地考虑实值数据的协方差。\n这些模型包括\\firstall{mcrbm}\\footnote{术语``mcRBM''根据字母M-C-R-B-M发音；``mc''不是``McDonald's''中的``Mc''的发音。}、\\firstall{mpot}模型和\\firstall{ssrbm}。\n\n\n\\paragraph{\\gls{mcrbm}} \\glssymbol{mcrbm}~使用\\gls{hidden_unit}独立地编码所有可观察单元的条件均值和协方差。\n\\glssymbol{mcrbm}~的\\gls{hidden_layer}分为两组单元：均值单元和协方差单元。\n建模条件均值的那组单元是简单的\\gls{gaussian_rbm}。\n另一半是\\firstall{crbm} \\citep{Ranzato2010a}，对条件协方差的结构进行建模（如下所述）。\n\n% -- 669 --\n\n具体来说，在二值均值的单元$\\Vh^{(m)}$和二值协方差单元$\\Vh^{(c)}$的情况下，\\glssymbol{mcrbm}~模型被定义为\n两个\\gls{energy_function}的组合：\n\\begin{align}\n E_{\\text{mc}}(\\Vx, \\Vh^{(m)}, \\Vh^{(c)}) = E_{\\text{m}}(\\Vx, \\Vh^{(m)}) + E_{\\text{c}}(\\Vx, \\Vh^{(c)}),\n\\end{align}\n其中$E_{\\text{m}}$为标准的~\\gls{GBRBM}~\\gls{energy_function}\\footnote{这个版本的~\\gls{GBRBM}~\\gls{energy_function}假定图像数据的每个像素具有零均值。考虑非零像素均值时，可以简单地将像素偏移添加到模型中。}，\n\\begin{align} \\label{eq:2044e}\nE_{\\text{m}}(\\Vx, \\Vh^{(m)}) = \\frac{1}{2}\\Vx^\\top \\Vx - \\sum_j \\Vx^\\top \\MW_{:,j} h_j^{(m)} - \\sum_j \n b_j^{(m)} h_j^{(m)},\n\\end{align}\n$E_{\\text{c}}$是~\\glssymbol{crbm}~建模条件协方差信息的\\gls{energy_function}：\n\\begin{align}\n E_{\\text{c}}(\\Vx, \\Vh^{(c)}) = \\frac{1}{2} \\sum_j h_j^{(c)} \\big( \\Vx^\\top \\Vr^{(j)}\\big)^2 - \\sum_j \n b_j^{(c)} h_j^{(c)}.\n\\end{align}\n参数$\\Vr^{(j)}$与$h_j^{(c)}$关联的协方差权重向量对应，$\\Vb^{(c)}$是一个协方差\\gls{bias_aff}向量。\n组合后的\\gls{energy_function}定义联合分布，\n\\begin{align}\n p_{\\text{mc}}(\\Vx, \\Vh^{(m)}, \\Vh^{(c)}) = \\frac{1}{Z} \\exp \\Big\\{ -E_{\\text{mc}}(\\Vx, \\Vh^{(m)}, \n \\Vh^{(c)}) \\Big\\},\n\\end{align}\n以及给定$\\Vh^{(m)}$和$\\Vh^{(c)}$后，关于观察数据相应的条件分布（为一个多元\\gls{gaussian_distribution}）：\n\\begin{align}\n p_{\\text{mc}}(\\Vx \\mid \\Vh^{(m)}, \\Vh^{(c)})  = \\CalN \\Bigg( \\Vx \\,; \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{mc}} \\Bigg(\n\\sum_j \\MW_{:,j}h_j^{(m)} \\Bigg), \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{mc}}\n \\Bigg).\n\\end{align}\n注意协方差矩阵$\\MC_{\\Vx \\mid \\Vh}^{\\,\\text{mc}} = \\Big( \\sum_j h_j^{(c)} \\Vr^{(j)} \\Vr^{(j)T} + \\MI\n\\Big)^{-1}$是非对角的，且$\\MW$是与建模条件均值的\\gls{gaussian_rbm}~相关联的权重矩阵。\n由于非对角的条件协方差结构，难以通过\\gls{contrastive_divergence}或\\gls{persistent_contrastive_divergence}来训练~\\glssymbol{mcrbm}。\n\\glssymbol{contrastive_divergence}~和~\\glssymbol{persistent_contrastive_divergence}~需要从$\\Vx,\\Vh^{(m)},\\Vh^{(c)}$的联合分布中采样，这在标准\\glssymbol{RBM}~中可以通过~\\gls{gibbs_sampling}在条件分布上采样实现。\n但是，在~\\glssymbol{mcrbm}~中，从$ p_{\\text{mc}}(\\Vx  \\mid \\Vh^{(m)}, \\Vh^{(c)}) $中抽样需要在学习的每个迭代计算$(\\MC^{\\,\\text{mc}})^{-1}$。\n这对于更大的观察数据可能是不切实际的计算负担。\n\\citet{Ranzato2010b-short}通过使用~\\glssymbol{mcrbm}~自由能上的哈密尔顿（混合）\\gls{monte_carlo}~\\citep{Neal93b}直接从边缘$p(\\Vx)$采样，避免了直接从条件$  p_{\\text{mc}}(\\Vx  \\mid \\Vh^{(m)}, \\Vh^{(c)}) $抽样。\n\n % -- 670 --\n \n\\paragraph{\\gls{mpot}}\n\\glsacr{mpot}模型~\\citep{ranzato+mnih+hinton:2010-short}以类似~\\glssymbol{mcrbm}~扩展~\\glssymbol{crbm}~的方式扩展PoT模型~\\citep{Welling2003a-small}。\n通过添加类似\\gls{gaussian_rbm}~中\\gls{hidden_unit}的非零高斯均值来实现。\n与~\\glssymbol{mcrbm}~一样，观察值上的PoT条件分布是多元高斯（具有非对角的协方差）分布; 然而，不同于~\\glssymbol{mcrbm}~，隐藏变量的互补条件分布是由条件独立的~\\gls{gamma_distribution}给出。\n\\gls{gamma_distribution} $\\CalG(k, \\theta)$是关于正实数且均值为$k\\theta$的概率分布。\n我们只需简单地了解~\\gls{gamma_distribution}就足以理解~\\glssymbol{mpot}~模型的基本思想。\n\n\\glssymbol{mpot}~的\\gls{energy_function}为：\n\\begin{align}\n &E_{\\text{mPoT}}(\\Vx, \\Vh^{(m)}, \\Vh^{(c)}) \\\\\n &= E_{\\text{m}}(\\Vx, \\Vh^{(m)}) + \\sum_j \\Big( h_j^{(c)} \\big( 1+\\frac{1}{2}(\\Vr^{(j)T}\\Vx)^2  \\big)\n +(1-\\gamma_j)\\log h_j^{(c)} \\Big),\n\\end{align}\n其中$\\Vr^{(j)}$是与单元$h_j^{(c)}$相关联的协方差权重向量，$E_m(\\Vx, \\Vh^{(m)})$如\\eqnref{eq:2044e}所定义。\n\n正如~\\glssymbol{mcrbm}~一样，\\glssymbol{mpot}~模型\\gls{energy_function}指定一个多元\\gls{gaussian_distribution}，其中关于$\\Vx$的条件分布具有非对角的协方差。\n\\glssymbol{mpot}~模型中的学习（也像~\\glssymbol{mcrbm} ） 由于无法从非对角高斯条件分布$p_{\\text{mPoT}}(\\Vx  \\mid  \\Vh^{(m)}, \\Vh^{(c)}) $采样而变得复杂。\n因此~\\citet{ranzato+mnih+hinton:2010-short} 也倡导通过哈密尔顿（混合）\\gls{monte_carlo}~\\citep{Neal93b}直接采样$p(\\Vx)$。\n\n\n\\paragraph{\\gls{ssrbm}} \\firstall{ssrbm}\\citep{Courville+al-2011}提供对实值数据的协方差结构建模的另一种方法。\n与~\\glssymbol{mcrbm}~相比，\\glssymbol{ssrbm}~具有既不需要矩阵求逆也不需要哈密尔顿\\gls{monte_carlo}方法的优点。\n%作为自然图像的模型，\\glssymbol{ssrbm}感兴趣的是。\n就像~\\glssymbol{mcrbm}~和~\\glssymbol{mpot}~模型，\\glssymbol{ssrbm}~的二值\\gls{hidden_unit}通过使用辅助实值变量来编码跨像素的条件协方差。\n\n% -- 671 --\n\n\\gls{ssrbm}~有两类\\gls{hidden_unit}：二值\\,\\textbf{尖峰}(spike)单元$\\RVh$和实值\\,\\textbf{平板}(slab)单元$\\RVs$。\n条件于\\gls{hidden_unit}的可见单元均值由$(\\Vh \\odot \\Vs)\\MW^\\top$给出。\n换句话说，每一列$\\MW_{:,i}$定义当$h_i=1$时可出现在输入中的分量。\n相应的尖峰变量$\\RSh_i$确定该分量是否存在。\n如果存在的话，相应的平板变量$\\RSs_i$确定该分量的强度。\n当尖峰变量激活时，相应的平板变量将沿着$\\MW_{:,i}$定义的轴的输入增加方差。\n这允许我们对输入的协方差建模。\n幸运的是，使用~\\gls{gibbs_sampling}的\\gls{contrastive_divergence}和\\gls{persistent_contrastive_divergence}仍然适用。\n此处无需对任何矩阵求逆。\n\n形式上，\\glssymbol{ssrbm}~模型通过其\\gls{energy_function}定义：\n\\begin{align}\n E_{\\text{ss}}(\\Vx, \\Vs, \\Vh) &= - \\sum_i \\Vx^\\top \\MW_{:,i} s_i h_i + \\frac{1}{2} \\Vx^\\top\n \\Bigg( \\VLambda + \\sum_i \\VPhi_i h_i \\Bigg) \\Vx \\\\\n &+ \\frac{1}{2} \\sum_i \\alpha_i s_i^2 - \\sum_i \\alpha_i \\mu_i s_i h_i - \\sum_i b_i h_i \n + \\sum_i \\alpha_i \\mu_i^2 h_i,\n \\end{align}\n其中$b_i$是尖峰$h_i$的\\gls{bias_aff}，$\\VLambda$是观测值$\\Vx$上的对角精度矩阵。\n参数$\\alpha_i > 0$是实值平板变量$\\Vs_i$的标量精度参数。\n参数$\\VPhi_i$是定义$\\Vx$上的$\\Vh$调制二次惩罚的非负对角矩阵。\n每个$\\mu_i$是平板变量$s_i$的均值参数。\n\n\n利用\\gls{energy_function}定义的联合分布，能相对容易地导出~\\glssymbol{ssrbm}~条件分布。\n例如，通过边缘化平板变量$\\Vs$，给定二值尖峰变量$\\Vh$，关于观察量的条件分布由下式给出\n\\begin{align}\n p_{\\text{ss}} (\\Vx  \\mid  \\Vh) &= \\frac{1}{P(\\Vh)} \\frac{1}{Z} \\int \\exp\\{ -E(\\Vx, \\Vs, \\Vh) \\} d\\Vs \\\\\n &= \\CalN \\Bigg( \\Vx\\,; \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} \\sum_i \\MW_{:,i}\\mu_i h_i, \n  \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} \\Bigg)\n\\end{align}\n其中$ \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} = (\\VLambda + \\sum_i \\VPhi_i h_i \n-\\sum_i \\alpha_i^{-1} h_i \\MW_{:,i}\\MW_{:,i}^\\top)^{-1}$。\n最后的等式只有在协方差矩阵$\\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} $正定时成立。\n\n由尖峰变量选通意味着$\\RVh \\odot \\RVs$上的真实边缘分布是稀疏的。\n这不同于\\gls{sparse_coding}，其中来自模型的样本在编码中``几乎从不''（在测度理论意义上）包含零，并且需要\\glssymbol{MAP}\\gls{inference}来强加稀疏性。\n\n% -- 672 --\n\n相比~\\glssymbol{mcrbm}~和~\\glssymbol{mpot}~模型，\\glssymbol{ssrbm}~以明显不同的方式参数化观察量的条件协方差。\n\\glssymbol{mcrbm}~和~\\glssymbol{mpot}~都通过 $\\big( \\sum_j h_j^{(c)} \\Vr^{(j)} \\Vr^{(j)\\top} + \\MI \\big)^{-1}$建模观察量的协方差结构，使用 $\\Vh_j > 0$的\\gls{hidden_unit}的激活来对方向$\\Vr^{(j)}$的条件协方差施加约束。\n相反，\\glssymbol{ssrbm}~使用隐藏尖峰激活$h_i = 1$来指定观察结果的条件协方差，以沿着由相应权重向量指定的方向捏合精度矩阵。\n\\glssymbol{ssrbm}~条件协方差与一个不同模型给出的类似：概率主成分分析的乘积（PoPPCA）\\citep{Williams2002}。\n在\\gls{overcomplete}的设定下，\\glssymbol{ssrbm}~参数化的稀疏激活仅允许在稀疏激活$h_i$的所选方向上有显著方差（高于由$\\VLambda^{-1}$给出的近似方差）。\n在~\\glssymbol{mcrbm}~或~\\glssymbol{mpot}~模型中，\\gls{overcomplete}的表示意味着，捕获观察空间中特定方向上的变化需要在该方向上的正交投影下去除潜在的所有约束。\n这表明这些模型不太适合于\\gls{overcomplete}设定。\n\n\\gls{ssrbm}~的主要缺点是参数的一些设置会对应于非正定的协方差矩阵。\n这种协方差矩阵会在离均值更远的值上放置更大的未归一化概率，导致所有可能结果上的积分发散。\n通常这个问题可以通过简单的启发式技巧来避免。\n理论上还没有任何令人满意的解决方法。\n使用约束优化来显式地避免概率未定义的区域（不过分保守是很难做到的），并且这还会阻止模型到达参数空间的高性能区域。\n\n定性地，\\glssymbol{ssrbm}~的卷积变体能产生自然图像的优秀样本。\n\\figref{fig:chap16_fig-ssrbm}中展示了一些样例。\n\n\\glssymbol{ssrbm}~允许几个扩展，\n包括平板变量的高阶交互和平均池化\\citep{courville-al-ieee14} 使得模型能够在标注数据稀缺时为分类器学习到出色的特征。\n向\\gls{energy_function}添加一项能防止\\gls{partition_function}在\\gls{sparse_coding}模型下变得不确定，如尖峰和平板\\gls{sparse_coding}~\\citep{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013}，也称为S3C。\n\n% -- 673 --\n\n\\section{\\glsentrytext{convolutional_bm}}\n\\label{sec:convolutional_boltzmann_machines}\n\n如\\chapref{chap:convolutional_networks}所示，超高维度输入（如图像）会对机器学习模型的计算、 内存和统计要求造成很大的压力。\n通过使用小核的离散卷积来替换矩阵乘法是解决具有空间平移不变性或时间结构的输入问题的标准方式。\n\\citet{Desjardins-2008} 表明这种方法应用于~\\glssymbol{RBM}~时效果很好。\n\n深度卷积网络通常需要池化操作，使得每个连续层的空间大小减小。\n前馈\\gls{convolutional_network}通常使用池化函数，例如池化元素的最大值。\n目前尚不清楚如何将其推广到\\gls{energy_based_model}的设定中。\n我们可以在$n$个二值检测器单元$\\RVd$上引入二值池化单元$\\RSp$，强制$p = \\max_i d_i$，并且当违反约束时将\\gls{energy_function}设置为$\\infty$。\n因为它需要评估$2^n$个不同的能量设置来计算归一化常数，这种方式不能很好地扩展。\n对于小的$3\\times3$池化区域，每个池化单元需要评估$2^9 = 512$个\\gls{energy_function}！\n\n\n~\\citet{HonglakL2009} 针对这个问题，开发了一个称为\\,\\textbf{概率最大池化}(probabilistic max pooling)的解决方案（不要与``随机池化''混淆，``随机池化''是用于隐含地构建卷积前馈网络集成的技术）。\n概率最大池化背后的策略是约束检测器单元，使得一次最多只有一个可以处于活动状态。\n这意味着仅存在$n + 1$个总状态（$n$个检测器单元中某一个状态为开和一个对应于所有检测器单元关闭的附加状态）。\n当且仅当检测器单元中的一个开启时，池化单元打开。\n所有单元的状态关闭时，能量被分配为零。\n我们可以认为这是在用包含$n + 1$个状态的单个变量来描述模型，或者等价地具有$n + 1$个变量的模型，除了$n+1$个联合分配的变量之外的能量赋为$\\infty$。\n\n虽然高效的概率最大池化确实能强迫检测器单元互斥，这在某些情景下可能是有用的\\gls{regularize}约束而在其他情景下是对模型容量有害的限制。\n它也不支持重叠池化区域。\n从前馈\\gls{convolutional_network}获得最佳性能通常需要重叠的池化区域，因此这种约束可能大大降低了\\gls{convolutional_bm}的性能。\n\n\\citet{HonglakL2009} 证明概率最大池化可以用于构建卷积\\gls{DBM}\\footnote{该论文将模型描述为``\\gls{DBN}''，但因为它可以被描述为纯无向模型（具有易处理逐层\\gls{meanfield}不动点更新），所以它最适合\\gls{DBM}的定义。}。\n该模型能够执行诸如填补输入缺失部分的操作。\n虽然这种模型在理论上有吸引力，让它在实践中工作是具有挑战性的，作为分类器通常不如通过\\gls{supervised}训练的传统\\gls{convolutional_network}。\n\n% -- 674 --\n\n许多卷积模型对于许多不同空间大小的输入同样有效。\n对于\\gls{BM}， 由于各种原因很难改变输入尺寸。\n\\gls{partition_function}随着输入大小的改变而改变。\n此外，许多\\gls{convolutional_network}按与输入大小成比例地缩放池化区域来实现尺寸不变性，但缩放\\gls{BM}池化区域是不优雅的。\n传统的卷积神经网络可以使用固定数量的池化单元并且动态地增加它们池化区域的大小，以此获得可变大小输入的固定尺寸的表示。\n对于\\gls{BM}，大型池化区域的计算成本比朴素方法高很多。\n \\citet{HonglakL2009} 的方法使得每个检测器单元在相同的池化区域中互斥，解决了计算问题，但仍然不允许大小可变的池化区域。\n例如，假设我们在学习边缘检测器时，检测器单元上具有$2 \\times 2$的概率最大池化。\n这强制约束在每个$2 \\times 2$的区域中只能出现这些边中的一条。\n如果我们随后在每个方向上将输入图像的大小增加50\\%， 则期望边缘的数量会相应地增加。\n相反，如果我们在每个方向上将池化区域的大小增加50\\%到$3 \\times 3 $，则互斥性约束现在指定这些边中的每一个在$3 \\times3$区域中仅可以出现一次。\n当我们以这种方式增长模型的输入图像时， 模型会生成密度较小的边。\n当然，这些问题只有在模型必须使用可变数量的池化，以便产出固定大小的输出向量时才会出现。\n只要模型的输出是可以与输入图像成比例缩放的特征图，使用概率最大池化的模型仍然可以接受可变大小的输入图像。\n\n图像边界处的像素也带来一些困难， 由于\\gls{BM}中的连接是对称的事实而加剧。\n如果我们不隐式地补零输入， 则将会导致比可见单元更少的\\gls{hidden_unit}，并且图像边界处的可见单元将不能被良好地建模，因为它们位于较少\\gls{hidden_unit}的接受场中。\n然而，如果我们隐式地补零输入，则边界处的\\gls{hidden_unit}将由较少的输入像素驱动，并且可能在需要时无法激活。\n\n% -- 675 --\n\n\\section{用于结构化或序列输出的\\glsentrytext{BM}}\n\\label{sec:boltzmann_machines_for_structured_or_sequential_outputs}\n\n在结构化输出场景中，我们希望训练可以从一些输入$\\Vx$映射到一些输出$\\Vy$的模型，$\\Vy$的不同条目彼此相关，并且必须遵守一些约束。\n例如，在语音合成任务中，$\\Vy$是波形，并且整个波形听起来必须像连贯的发音。\n\n表示$\\Vy$中的条目之间关系的自然方式是使用概率分布$p(\\RVy  \\mid  \\Vx)$。\n扩展到建模条件分布的\\gls{BM}可以支持这种概率模型。\n\n使用\\gls{BM}条件建模的相同工具不仅可以用于结构化输出任务，还可以用于序列建模。 \n在后一种情况下，模型必须估计变量序列上的概率分布$p(\\RVx^{(1)}, \\dots, \\RVx^{(\\tau)})$，而不仅仅是将输入$\\Vx$映射到输出$\\Vy$。\n为完成这个任务，条件\\gls{BM}可以表示$p(\\RVx^{(\\tau)}  \\mid  \\RVx^{(1)}, \\dots, \\RVx^{(\\tau-1)})$形式的\\gls{factor}。\n\n视频游戏和电影工业中一个重要序列建模任务是建模用于渲染3-D人物骨架关节角度的序列。 \n这些序列通常通过记录角色移动的运动捕获系统收集。\n人物运动的概率模型允许生成新的（之前没见过的）但真实的动画。\n为了解决这个序列建模任务，\\citet{Taylor+2007} 针对小的$m$引入了条件~\\glssymbol{RBM}~建模$p(\\Vx^{(t)}  \\mid  \\Vx^{(t-1)}, \\dots, \\Vx^{(t-m)})$。\n该模型是$p(\\Vx^{(t)})$上的~\\glssymbol{RBM}，其\\gls{bias_aff}参数是$\\Vx$前面$m$个值的线性函数。\n当我们条件于$\\Vx^{(t-1)}$的不同值和更早的变量时， 我们会得到一个关于$\\RVx$的新~\\glssymbol{RBM}。\n\\glssymbol{RBM}~关于$\\RVx$的权重不会改变，但是条件于不同的过去值， 我们可以改变~\\glssymbol{RBM}~中的不同\\gls{hidden_unit}处于活动状态的概率。\n通过激活和去激活\\gls{hidden_unit}的不同子集，我们可以对$\\RVx$上诱导的概率分布进行大的改变。\n条件~\\glssymbol{RBM}~的其他变体 \\citep{Mnih-2011} 和使用条件~\\glssymbol{RBM}~进行序列建模的其他变体是可能的 \\citep{TaylorHintonICML2009,SutskeverHintonTaylor2009-small,Boulanger-et-al-ICML2012}。\n\n另一个序列建模任务是对构成歌曲音符序列的分布进行建模。\n\\citet{Boulanger-et-al-ICML2012} 引入了\\textbf{RNN-RBM}序列模型并应用于这个任务。\nRNN-RBM由~\\glssymbol{RNN}（产生用于每个\\gls{time_step}的~\\glssymbol{RBM}~参数）组成，是帧序列$\\Vx^{(t)}$的\\gls{generative_model}。\n与之前只有~\\glssymbol{RBM}~的\\gls{bias_aff}参数会在一个\\gls{time_step}到下一个发生变化的方法不同，RNN-RBM使用~\\glssymbol{RNN}~来产生~\\glssymbol{RBM}~的所有参数（包括权重）。\n为了训练模型，我们需要能够通过~\\glssymbol{RNN}~\\gls{back_propagation}\\gls{loss_function}的梯度。\n\\gls{loss_function}不直接应用于~\\glssymbol{RNN}~输出。\n相反，它应用于~\\glssymbol{RBM}。\n这意味着我们必须使用\\gls{contrastive_divergence}或相关算法关于~\\glssymbol{RBM}~参数进行近似的微分。\n然后才可以使用通常的\\gls{BPTT}算法通过~\\glssymbol{RNN}~\\gls{back_propagation}该近似梯度。\n\n% -- 676 --\n\n\\section{其他\\glsentrytext{BM}}\n\\label{sec:other_boltzmann_machines}\n\\gls{BM}的许多其他变种是可能的。\n\n\\gls{BM}可以用不同的训练\\gls{criterion}扩展。\n我们专注于训练为大致最大化生成标准$\\log p(\\Vv)$的\\gls{BM}。\n相反，旨在最大化$\\log p(y \\mid \\Vv)$来训练判别的~\\glssymbol{RBM}~也是有可能的\\citep{Larochelle+Bengio-2008-small}。\n当使用生成性和判别性标准的线性组合时，该方法通常表现最好。\n不幸的是，至少使用现有的方法来看，\\glssymbol{RBM}~似乎并不如~\\glssymbol{MLP}~那样的监督学习器强大。\n\n在实践中使用的大多数\\gls{BM}在其\\gls{energy_function}中仅具有二阶相互作用，意味着它们的\\gls{energy_function}是许多项的和，并且每个单独项仅包括两个随机变量之间的乘积。\n这种项的一个例子是$v_iW_{i,j}h_j$。\n我们还可以训练高阶\\gls{BM}~\\citep{sejnowski1987higher} ，其中\\gls{energy_function}项涉及许多变量的乘积。\n\\gls{hidden_unit}和两个不同图像之间的三向交互可以建模从一个视频帧到下一个帧的空间变换 \\citep{Memisevic+Hinton-2007,Memisevic+Hinton-2010}。\n通过\\gls{one_hot}类别变量的乘法可以根据存在哪个类来改变可见单元和\\gls{hidden_unit}之间的关系\\citep{Nair2009}。\n使用高阶交互的一个最近的示例是具有两组\\gls{hidden_unit}的\\gls{BM}，一组同时与可见单元$\\Vv$和类别标签$y$交互，另一组仅与输入值$\\Vv$交互\\citep{luo2011learning}。 % ?\n这可以被解释为鼓励一些\\gls{hidden_unit}学习使用与类相关的特征来建模输入，而且还学习额外的\\gls{hidden_unit}（不需要根据样本类别，学习逼真$\\Vv$样本所需的繁琐细节）。\n高阶交互的另一个用途是选通一些特征。\n\\citet{Sohn-et-al-ICML2013} 介绍了一个带有三阶交互的\\gls{BM}，以及与每个可见单元相关的二进制掩码变量。\n当这些掩码变量设置为零时，它们消除可见单元对\\gls{hidden_unit}的影响。\n这允许将与分类问题不相关的可见单元从估计类别的\\gls{inference}路径中移除。\n\n更一般地说，\\gls{BM}框架是一个丰富的模型空间，允许比迄今为止已经探索的更多的模型结构。\n开发新形式的\\gls{BM}相比于开发新的神经网络层需要更多细心和创造力，因为它通常很难找到一个能保持\\gls{BM}所需的所有不同条件分布的可解性的\\gls{energy_function}。\n尽管这需要努力，该领域仍对创新开放。\n\n% -- 677 --\n\n\\section{通过随机操作的\\glsentrytext{back_propagation}}\n\\label{sec:back_propagation_through_random_operations}\n\n\n传统的神经网络对一些输入变量$\\Vx$施加确定性变换。\n当开发\\gls{generative_model}时，我们经常希望扩展\\gls{NN}以实现$\\Vx$的随机变换。\n这样做的一个直接方法是使用额外输入$\\Vz$（从一些简单的概率分布采样得到，如均匀或\\gls{gaussian_distribution}）来增强神经网络。\n神经网络在内部仍可以继续执行确定性计算，但是函数$f(\\Vx,\\Vz)$对于不能访问$\\Vz$的观察者来说将是随机的。\n假设$f$是连续可微的，我们可以像往常一样使用\\gls{back_propagation}计算训练所需的梯度。\n\n作为示例，让我们考虑从均值$\\mu$和方差$\\sigma^2$的\\gls{gaussian_distribution}中采样$\\RSy$的操作：\n\\begin{align}\n \\RSy \\sim \\CalN(\\mu, \\sigma^2).\n\\end{align}\n因为$\\RSy$的单个样本不是由函数产生的，而是由一个采样过程产生，它的输出会随我们的每次查询变化，所以取$\\RSy$相对于其分布的参数$\\mu$和$\\sigma^2$的导数似乎是违反直觉的。\n然而，我们可以将采样过程重写，对基本随机变量$\\RSz \\sim \\CalN(z;0,1)$进行转换以从期望的分布获得样本：\n\\begin{align}\n y = \\mu + \\sigma z.\n\\end{align}\n\n现在我们将其视为具有额外输入$\\RSz$的确定性操作，可以通过采样操作来\\gls{back_propagation}。\n至关重要的是，额外输入是一个随机变量，其分布不是任何我们想对其计算导数的变量的函数。\n如果我们可以用相同的$\\RSz$值再次重复采样操作，结果会告诉我们$\\mu$或$\\sigma$的微小变化将会如何改变输出。\n\n% -- 678 --\n\n能够通过该采样操作\\gls{back_propagation}允许我们将其并入更大的图中。\n我们可以在采样分布的输出之上构建图元素。\n例如，我们可以计算一些\\gls{loss_function}$J(y)$的导数。\n我们还可以构建这样的图元素，其输出是采样操作的输入或参数。\n例如，我们可以通过$\\mu = f(\\Vx; \\Vtheta)$和$\\sigma = g(\\Vx; \\Vtheta)$构建更大的图。\n在这个增强图中，我们可以通过这些函数的\\gls{back_propagation}导出$\\nabla_{\\Vtheta} J(y)$。\n\n在该高斯采样示例中使用的原理能更广泛地应用。\n我们可以将任何形为$p(\\RSy;\\Vtheta)$或$p(\\RSy \\mid \\Vx;\\Vtheta)$的概率分布表示为$p(\\RSy \\mid \\Vomega)$，其中$\\Vomega$是同时包含参数$\\Vtheta$和输入$\\Vx$的变量(如果适用的话)。\n给定从分布$p(\\RSy \\mid \\Vomega)$采样的值$\\RSy$（其中$\\Vomega$可以是其他变量的函数），我们可以将\n\\begin{align}\n \\RVy \\sim p(\\RVy  \\mid  \\Vomega)\n\\end{align}\n重写为\n\\begin{align}\n \\Vy = f(\\Vz; \\Vomega),\n\\end{align}\n其中$\\Vz$是随机性的来源。\n只要$f$是几乎处处连续可微的，我们就可以使用传统工具（例如应用于$f$的\\gls{back_propagation}算法）计算$\\RSy$相对于$\\Vomega$的导数。\n至关重要的是，$\\Vomega$不能是$\\Vz$的函数，且$\\Vz$不能是$\\Vomega$的函数。\n这种技术通常被称为\\firstgls{reparametrization_trick}、\\textbf{随机\\gls{back_propagation}}(stochastic back-propagation)或\\textbf{扰动分析}(perturbation analysis)。\n\n\n要求$f$是连续可微的，当然需要$\\Vy$是连续的。\n如果我们希望通过产生离散值样本的采样过程进行\\gls{back_propagation}，则可以使用\\gls{RL}算法（如~\\ENNAME{REINFORCE}~算法\\citep{Williams-1992}的变体）来估计$\\Vomega$上的梯度，这将在\\secref{sec:back_propagating_through_discrete_stochastic_operations}中讨论。\n\n在神经网络应用中，我们通常选择从一些简单的分布中采样$\\Vz$，如单位均匀分布或单位\\gls{gaussian_distribution}，并通过网络的确定性部分重塑其输入来实现更复杂的分布。\n\n通过随机操作扩展梯度或优化的想法可追溯到二十世纪中叶~\\citep{Price-1958,Bonnet-1964}，并且首先在\\gls{RL}~\\citep{Williams-1992}的情景下用于机器学习。\n最近，它已被应用于变分近似~\\citep{Opper+Archambeau-2009} 和随机生成神经网络~\\citep{bengio2013estimating,Kingma-arxiv2013,Kingma+Welling-arxiv2014,Kingma+Welling-ICLR2014,Rezende-et-al-ICML2014,Goodfellow-et-al-NIPS2014-small}。\n许多网络，如\\gls{DAE}或使用~\\gls{dropout}~的\\gls{regularize}网络，也被自然地设计为将噪声作为输入，而不需要任何特殊的\\gls{reparametrization}就能使噪声独立于模型。\n\n% -- 679 --\n\n\\subsection{通过离散随机操作的\\glsentrytext{back_propagation}}\n\\label{sec:back_propagating_through_discrete_stochastic_operations}\n\n当模型发射离散变量$\\Vy$时，\\gls{reparametrization_trick}不再适用。\n假设模型采用输入$\\Vx$和参数$\\Vtheta$，两者都封装在向量$\\Vomega$中，并且将它们与随机噪声$\\Vz$组合以产生$\\Vy$：\n\\begin{align}\n \\Vy = f(\\Vz;\\Vomega).\n\\end{align}\n因为$\\Vy$是离散的，$f$必须是一个阶跃函数。\n阶跃函数的导数在任何点都是没用的。\n在每个阶跃边界， 导数是未定义 的，但这是一个小问题。\n大问题是导数在阶跃边界之间的区域几乎处处为零。\n因此，任何\\gls{cost_function} $J(\\Vy)$的导数无法给出如何更新模型参数$\\Vtheta$的任何信息。\n\n\\ENNAME{REINFORCE}~算法（REward Increment $=$ nonnegative Factor $\\times$ Offset Reinforcement $\\times$ Characteristic Eligibility）提供了定义一系列简单而强大解决方案的框架\\citep{Williams-1992}。\n其核心思想是，即使$J(f(\\Vz;\\Vomega))$是具有无用导数的阶跃函数，期望代价$\\SetE_{\\RVz \\sim p(\\RVz)} J(f(\\Vz;\\Vomega))$通常是服从\\gls{GD}的光滑函数。\n虽然当 $\\Vy$是高维（或者是许多离散随机决策组合的结果）时，该期望通常是难解的，但我们可以使用\\gls{monte_carlo}平均进行无偏估计。\n梯度的随机估计可以与~\\glssymbol{SGD}~或其他基于随机梯度的优化技术一起使用。\n\n通过简单地微分期望成本，我们可以推导出~\\ENNAME{REINFORCE}~最简单的版本：\n\\begin{align}\n \\SetE_{\\Vz}[J(\\Vy)] &= \\sum_{\\Vy} J(\\Vy) p(\\Vy), \\\\\n \\frac{\\partial \\SetE[J(\\Vy)]}{\\partial \\Vomega} &= \\sum_{\\Vy} J(\\Vy)\n \\frac{\\partial p(\\Vy)}{\\partial \\Vomega} \\label{eq:sum_exp} \\\\\n &=  \\sum_{\\Vy} J(\\Vy) p(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \n \\label{eq:sum_log} \\\\\n & \\approx \\frac{1}{m} \\sum_{\\Vy^{(i)} \\sim p(\\Vy), i=1}^m \n J(\\Vy^{(i)}) \\frac{\\partial\\log p(\\Vy^{(i)})}{\\partial \\Vomega}. \\label{eq:sum_prob}\n\\end{align}\n\\eqnref{eq:sum_exp}依赖于$J$不直接引用$\\Vomega$的假设。\n放松这个假设来扩展该方法是简单的。\n\\eqnref{eq:sum_log}利用对数的导数规则，\n$\\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} = \\frac{1}{p(\\Vy)}\n\\frac{\\partial p(\\Vy)}{\\partial \\Vomega}$。\n\\eqnref{eq:sum_prob}给出了该梯度的无偏\\gls{monte_carlo}估计。\n\n% -- 680 --\n\n在本节中我们写的$p(\\Vy)$，可以等价地写成$p(\\Vy  \\mid  \\Vx)$。\n这是因为$p(\\Vy)$由$\\Vomega$参数化，并且如果$\\Vx$存在，$\\Vomega$包含$\\Vtheta$和$\\Vx$两者。\n\n简单~\\ENNAME{REINFORCE}~估计的一个问题是其具有非常高的方差，需要采$\\Vy$的许多样本才能获得对梯度的良好估计，或者等价地，如果仅绘制一个样本，\\glssymbol{SGD}~将收敛得非常缓慢并将需要较小的\\gls{learning_rate}。\n通过使用\\firstgls{variance_reduction}方法~\\citep{Wilson-1984,LEcuyer-1994}，可以地减少该估计的方差。\n想法是修改估计量，使其预期值保持不变，但方差减小。\n在~\\ENNAME{REINFORCE}~的情况下提出的\\gls{variance_reduction}方法，涉及计算用于偏移$J(\\Vy)$的\\,\\textbf{基线}(baseline)。\n注意，不依赖于$\\Vy$的任何偏移$b(\\Vw)$都不会改变估计梯度的期望，因为\n\\begin{align}\n E_{p(\\Vy)} \\Bigg[ \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega}  \\Bigg] &=\n \\sum_{\\Vy} p(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \\\\\n &= \\sum_{\\Vy} \\frac{\\partial p(\\Vy)}{\\partial \\Vomega} \\\\\n &= \\frac{\\partial}{\\partial \\Vomega} \\sum_{\\Vy} p(\\Vy) = \n \\frac{\\partial}{\\partial \\Vomega} 1 = 0,\n\\end{align}\n这意味着\n\\begin{align}\n E_{p(\\Vy)} \\Bigg[ (J(\\Vy) - b(\\Vomega))\\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega}  \\Bigg] &= \n E_{p(\\Vy)} \\Bigg[ J(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \\Bigg]\n - b(\\Vomega) E_{p(\\Vy)} \\Bigg[ \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega}  \\Bigg] \\\\\n &= E_{p(\\Vy)} \\Bigg[ J(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \\Bigg] .\n\\end{align}\n此外，我们可以通过计算$(J(\\Vy) - b(\\Vomega))\\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} $\n关于$p(\\Vy)$的方差，并关于$b(\\Vomega)$最小化获得最优$b(\\Vomega)$。\n我们发现这个最佳基线$b^*(\\Vomega)_i$对于向量$\\Vomega$的每个元素$\\omega_i$是不同的：\n\\begin{align} \\label{eq:est_b}\n b^*(\\Vomega)_i = \\frac{E_{p(\\Vy)} \\Big[ J(\\Vy)\n \\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}  \\Big]}\n{E_{p(\\Vy)} \\Big[\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}\\Big] }.\n\\end{align}\n相对于$\\omega_i$的梯度估计则变为\n\\begin{align}\n (J(\\Vy) - b(\\Vomega)_i)\\frac{\\partial\\log p(\\Vy)}{\\partial \\omega_i},\n\\end{align}\n其中$ b(\\Vomega)_i$ 估计上述$ b^*(\\Vomega)_i$。\n获得估计$b$通常需要将额外输出添加到神经网络，并训练新输出对$\\Vomega$的每个元素估计$E_{p(\\Vy)} \n[J(\\Vy)\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}]$和\n$E_{p(\\Vy)}[\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}]$。\n这些额外的输出可以用\\gls{mean_squared_error}目标训练，对于给定的$\\Vomega$，从$p(\\Vy)$采样$\\Vy$时，分别用$J(\\Vy)\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}$和 $\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}$作目标。\n然后可以将这些估计代入\\eqnref{eq:est_b}就能恢复估计$b$。\n\\citet{Mnih+Gregor-ICML2014} 倾向于使用通过目标$J(\\Vy)$训练的单个共享输出（跨越$\\Vomega$的所有元素$i$），并使用$b(\\Vomega) \\approx E_{p(\\Vy)} [J(\\Vy)]$作为基线。\n\n% -- 681 --\n\n在\\gls{RL}背景下引入的\\gls{variance_reduction}方法\\citep{Sutton-et-al-2000,Weaver+Tao-UAI2001}， \\citet{Dayan-1990}推广了二值奖励的前期工作。\n可以参考 \\citet{bengio2013estimating}、\\citet{Mnih+Gregor-ICML2014}、\\citet{Ba+Mnih-arxiv2014}、\\citet{Mnih2014}或 \\citet{Xu-et-al-ICML2015} 中在深度学习的背景下使用减少方差的~\\ENNAME{REINFORCE}~算法的现代例子。\n除了使用与输入相关的基线$b(\\Vomega)$，\\citet{Mnih+Gregor-ICML2014}发现可以在训练期间调整$(J(\\Vy) - b(\\Vomega))$的尺度（即除以训练期间的移动平均估计的标准差 ），即作为一种适应性\\gls{learning_rate}，可以抵消训练过程中该量大小发生的重要变化的影响。\n\\citet{Mnih+Gregor-ICML2014} 称之为启发式\\textbf{方差归一化}(variance normalization)。\n\n基于~\\ENNAME{REINFORCE}~的估计器可以被理解为将$\\Vy$的选择与$J(\\Vy)$的对应值相关联来估计梯度。\n如果在当前参数化下不太可能出现$\\Vy$的良好值，则可能需要很长时间来偶然获得它，并且获得所需信号的配置应当被加强。\n\n\\section{有向生成网络}\n\\label{sec:directed_generative_nets}\n\n如\\chapref{chap:structured_probabilistic_models_for_deep_learning}所讨论的，\\gls{directed_graphical_model}构成了一类突出的\\gls{graphical_model}。\n虽然\\gls{directed_graphical_model}在更大的机器学习社群中非常流行，但在较小的深度学习社群中，大约直到2013年它们都掩盖在\\gls{undirected_model}（如~\\glssymbol{RBM}）的光彩之下。\n\n在本节中，我们回顾一些传统上与深度学习社群相关的标准\\gls{directed_graphical_model}。\n\n我们已经描述过部分有向的模型——\\gls{DBN}。\n我们还描述过可以被认为是浅度有向\\gls{generative_model}的\\gls{sparse_coding}模型。\n尽管在样本生成和密度估计方面表现不佳，在深度学习的背景下它们通常被用作特征学习器。\n我们接下来描述多种深度完全有向的模型。\n\n% -- 682 --\n\n\\subsection{\\glsentrytext{sigmoid_bn}}\n\\label{ sec:sigmoid _belief_networks}\n\n\\gls{sigmoid_bn} \\citep{Neal-1990}是一种具有特定条件概率分布的\\gls{directed_graphical_model}的简单形式。\n一般来说，我们可以将~\\gls{sigmoid_bn}视为具有二值向量的状态$\\Vs$，其中状态的每个元素都受其祖先影响：\n\\begin{align}\n p(s_i) = \\sigma \\Bigg( \\sum_{j<i} W_{j,i} s_j + b_i \\Bigg).\n\\end{align}\n\n\\gls{sigmoid_bn}最常见的结构是被分为许多层的结构，其中\\gls{ancestral_sampling}通过一系列多个\\gls{hidden_layer}进行，然后最终生成可见层。\n这种结构与\\gls{DBN}非常相似，但它们在采样过程开始时的单元彼此独立，而不是从\\gls{RBM}采样。\n这种结构由于各种原因而令人感兴趣。\n一个原因是该结构是可见单元上概率分布的通用近似，即在足够深的情况下，可以任意良好地近似二值变量的任何概率分布（即使各个层的宽度受限于可见层的维度 ）\\citep{Sutskever+Hinton-2008}。\n\n\n虽然生成可见单元的样本在~\\gls{sigmoid_bn}中是非常高效的，但是其他大多数操作不是很高效。\n给定可见单元，对\\gls{hidden_unit}的\\gls{inference}是难解的。\n因为变分下界涉及对包含整个层的团求期望，\\gls{meanfield}\\gls{inference}也是难以处理的。\n这个问题一直困难到足以限制有向离散网络的普及。\n\n\n在~\\gls{sigmoid_bn}中执行\\gls{inference}的一种方法是构造专用于~\\gls{sigmoid_bn}的不同下界 \\citep{Saul+96}。\n这种方法只适用于非常小的网络。\n另一种方法是使用\\gls{learned}\\gls{inference}机制，如\\secref{sec:learned_approximate_inference}中描述的。\n\\gls{helmholtz_machine} \\citep{Dayan-et-al-1995,dayan1996varieties} 结合了一个~\\gls{sigmoid_bn}与一个预测\\gls{hidden_unit}上\\gls{meanfield}分布参数的\\gls{inference}网络。\n\\gls{sigmoid_bn}的现代方法\\citep{Gregor-et-al-ICML2014,Mnih+Gregor-ICML2014} 仍然使用这种\\gls{inference}网络的方法。\n因为\\gls{latent_variable}的离散本质，这些技术仍然是困难的。\n人们不能简单地通过\\gls{inference}网络的输出\\gls{back_propagation}，而必须使用相对不可靠的机制即通过离散采样过程进行\\gls{back_propagation}（如\\secref{sec:back_propagating_through_discrete_stochastic_operations}所述）。\n最近基于\\gls{importance_sampling}、重加权的\\gls{wake_sleep}\\citep{Bornschein+Bengio-ICLR2015-small} 或双向~\\gls{helmholtz_machine}~\\citep{Bornschein-et-al-arxiv2015-small} 的方法使得我们可以快速训练~\\gls{sigmoid_bn}，并在基准任务上达到最好的表现。\n\n\\gls{sigmoid_bn}的一种特殊情况是没有\\gls{latent_variable}的情况。\n在这种情况下学习是高效的，因为没有必要将\\gls{latent_variable}边缘化到似然之外。\n一系列称为\\gls{auto_regressive_network}的模型将这个完全可见的\\gls{BN}\\gls{generalize}到其他类型的变量（除二值变量）和其他结构（除对数线性关系）的条件分布。\n\\gls{auto_regressive_network}将在\\secref{sec:auto_regressive_networks}中描述。\n\n\n\\subsection{可微\\glsentrytext{generator_network}}\n\\label{sec:differentiable_generator_networks}\n\n许多\\gls{generative_model}基于使用可微\\firstgls{generator_network}的想法。\n这种模型使用可微函数$g(\\Vz;\\Vtheta^{(g)})$将\\gls{latent_variable} $\\RVz$的样本变换为样本$\\RVx$或样本$\\RVx$上的分布，可微函数通常可以由神经网络表示。\n这类模型包括将\\gls{generator_network}与\\gls{inference}网络配对的\\gls{VAE}、将\\gls{generator_network}与判别器网络配对的\\gls{GAN}，以及孤立地训练\\gls{generator_network}的技术。\n\n\n\\gls{generator_network}本质上仅是用于生成样本的参数化计算过程，其中的体系结构提供了从中采样的可能分布族以及选择这些族内分布的参数。\n\n作为示例，从具有均值$\\Vmu$和协方差$\\VSigma$的正态分布绘制样本的标准过程是将来自零均值和单位协方差的正态分布的样本$\\Vz$馈送到非常简单的\\gls{generator_network}中。 这个\\gls{generator_network}只包含一个仿射层：\n\\begin{align}\n \\Vx = g(\\Vz) = \\Vmu + \\ML \\Vz ,\n\\end{align}\n其中$\\ML$由$\\VSigma$的~\\ENNAME{Cholesky}~分解给出。\n\n\n伪随机数发生器也可以使用简单分布的非线性变换。\n例如，\\textbf{逆变换采样}(inverse transform sampling)\\citep{devroye2013non}从$U(0,1)$中采一个标量$z$，并且对标量$x$应用非线性变换。 % ??\n在这种情况下，$g(z)$由累积分布函数$F(x) = \\int_{-\\infty}^{x} p(v) dv$的反函数给出。\n如果我们能够指定$p(x)$，在$x$上积分，并取所得函数的反函数，我们不用通过机器学习就能从$p(x)$进行采样。\n\n为了从更复杂的分布（难以直接指定、难以积分或难以求所得积分的反函数）中生成样本，我们使用\\gls{feedforward_network}来表示非线性函数$g$的参数族，并使用训练数据来\\gls{inference}参数以选择所期望的函数。\n\n我们可以认为$g$提供了变量的非线性变化，将$\\RVz$上的分布变换成$\\RVx$上想要的分布。\n\n回顾\\eqnref{eqn:3.47}，对于可求反函数的、可微的、连续的$g$，\n\\begin{align}\n p_z(\\Vz) = p_x(g(\\Vz)) \\Big | \\det (\\frac{\\partial g}{\\partial \\Vz}) \\Big |.\n\\end{align}\n这隐含地对$\\RVx$施加概率分布：\n\\begin{align}\n p_x(\\Vx) = \\frac{p_z(g^{-1}(\\Vx))}{ | \\det (\\frac{\\partial g}{\\partial \\Vz}) |}.\n\\end{align}\n当然，取决于$g$的选择，这个公式可能难以评估，因此我们经常需要使用间接学习$g$的方法，而不是直接尝试最大化$\\log p(\\Vx)$。\n\n在某些情况下，我们使用$g$来定义$\\Vx$上的条件分布，而不是使用$g$直接提供$\\Vx$的样本。\n例如，我们可以使用一个\\gls{generator_network}，其最后一层由~\\ENNAME{sigmoid}~输出组成，可以提供~\\gls{bernoulli_distribution}的平均参数：\n\\begin{align}\n p(\\RVx_i = 1  \\mid  \\Vz) = g(\\Vz)_i .\n\\end{align}\n在这种情况下， 我们使用$g$来定义$p(\\Vx  \\mid  \\RVz)$时， 我们通过边缘化$\\Vz$来对$\\Vx$施加分布：\n\\begin{align}\n p(\\Vx) = \\SetE_{\\Vz} p(\\Vx  \\mid  \\Vz).\n\\end{align}\n\n两种方法都定义了一个分布$p_g(\\Vx)$， 并允许我们使用\\secref{sec:back_propagation_through_random_operations}中的\\gls{reparametrization_trick}来训练$p_g$的各种评估\\gls{criterion}。\n\n% -- 685 --\n\n表示\\gls{generator_network}的两种不同方法（发出条件分布的参数相对直接发射样品 ）具有互补的优缺点。\n当\\gls{generator_network}在$\\Vx$上定义条件分布时，它不但能生成连续数据，也能生成离散数据。\n当\\gls{generator_network}直接提供采样时，它只能产生连续的数据（我们可以在前向传播中引入离散化，但这样做意味着模型不再能够使用\\gls{back_propagation}进行训练）。\n直接采样的优点是，我们不再被迫使用条件分布（可以容易地写出来并由人类设计者进行代数操作的形式）。\n\n基于可微\\gls{generator_network}的方法是由分类可微前馈网络中\\gls{GD}的成功应用而推动的。\n在\\gls{supervised_learning}的背景中，基于梯度训练学习的深度前馈网络在给定足够的\\gls{hidden_unit}和足够的训练数据的情况下，在实践中似乎能保证成功。\n这个同样的方案能成功转移到\\gls{generative_modeling}上吗？\n\n\\gls{generative_modeling}似乎比分类或回归更困难，因为学习过程需要优化难以处理的\\gls{criterion}。\n在可微\\gls{generator_network}的情况中，\\gls{criterion}是难以处理的，因为数据不指定\\gls{generator_network}的输入$\\Vz$和输出$\\Vx$。\n在\\gls{supervised_learning}的情况下，输入$\\Vx$和输出$\\Vy$同时给出，并且优化过程只需学习如何产生指定的映射。\n在生成建模的情况下，学习过程需要确定如何以有用的方式排布$\\Vz$空间，以及额外的如何从$\\Vz$映射到$\\Vx$。\n\n\\citet{dosovitskiy2015learning}研究了一个简化问题，其中$\\Vz$和$\\Vx$之间的对应关系已经给出。\n具体来说，训练数据是计算机渲染的椅子图。\n\\gls{latent_variable} $\\Vz$是渲染引擎的参数，描述了椅子模型的选择、椅子的位置以及影响图像渲染的其他配置细节。\n使用这种合成的生成数据，\\gls{convolutional_network}能够学习将图像内容的描述$\\Vz$映射到渲染图像的近似$\\Vx$。\n这表明当现代可微\\gls{generator_network}具有足够的模型容量时，足以成为良好的\\gls{generative_model}，并且现代优化算法具有拟合它们的能力。\n困难在于当每个$\\Vx$的$\\Vz$的值不是固定的且在每次训练前是未知时，如何训练\\gls{generator_network}。\n\n\n在接下来的章节中，我们讨论仅给出$\\Vx$的训练样本，训练可微\\gls{generator_network}的几种方法。\n\n% -- 686 --\n\n\\subsection{\\glsentrytext{VAE}}\n\\label{sec:variational_autoencoders}\n\\firstall{VAE}\\citep{Kingma-arxiv2013,Rezende-et-al-ICML2014}是一个使用学好的近似\\gls{inference}的\\gls{directed_model}， 可以纯粹地使用基于梯度的方法进行训练。\n\n\n为了从模型生成样本，\\glssymbol{VAE}~首先从编码分布$p_{\\text{model}}(\\Vz)$中采样$\\Vz$。\n然后使样本通过可微\\gls{generator_network} $g(\\Vz)$。\n最后，从分布$p_{\\text{model}}(\\Vx;g(\\Vz)) = p_{\\text{model}}(\\Vx  \\mid  \\Vz)$ 中采样$\\Vx$。\n然而在训练期间，近似\\gls{inference}网络（或\\gls{encoder}）$q(\\Vz  \\mid  \\Vx)$用于获得$\\Vz$，而$p_{\\text{model}}(\\Vx  \\mid  \\Vz)$则被视为\\gls{decoder}网络。\n\n\n\\gls{VAE}背后的关键思想是，它们可以通过最大化与数据点$\\Vx$相关联的变分下界$\\CalL(q)$来训练：\n\\begin{align}\n\\CalL(q) &= \\SetE_{\\Vz \\sim q(\\Vz  \\mid  \\Vx)} \\log p_{\\text{model}} (\\Vz, \\Vx)\n+ \\CalH(q(\\RVz  \\mid  \\Vx)) \\label{eq:var_lower}  \\\\\n&= \\SetE_{\\Vz \\sim q(\\Vz  \\mid  \\Vx)} \\log p_{\\text{model}} (\\Vx  \\mid  \\Vz)\n- D_{\\text{KL}}(q(\\RVz  \\mid  \\Vx) ~||~ p_{\\text{model}}(\\RVz)) \\label{eq:var_kl} \\\\\n& \\leq \\log p_{\\text{model}}(\\Vx).\n\\end{align}\n在\\eqnref{eq:var_lower}中，我们将第一项视为\\gls{latent_variable}的近似后验下可见和隐藏变量的联合对数似然性（正如~\\glssymbol{EM}~一样，不同的是我们使用近似而不是精确后验）。\n第二项则可视为近似后验的熵。\n当$q$被选择为\\gls{gaussian_distribution}，其中噪声被添加到预测平均值时，最大化该熵项促使该噪声标准偏差的增加。\n更一般地，这个熵项鼓励变分后验将高概率质量置于可能已经产生$\\Vx$的许多$\\Vz$值上，而不是坍缩到单个估计最可能值的点。\n在\\eqnref{eq:var_kl}中，我们将第一项视为在其他\\gls{AE}中出现的重构对数似然。\n第二项试图使近似后验分布$q(\\RVz  \\mid  \\Vx)$和模型先验$p_{\\text{model}}(\\Vz)$彼此接近。\n\n\n变分\\gls{inference}和学习的传统方法是通过优化算法\\gls{inference} $q$，通常是迭代不动点方程（\\secref{sec:variational_inference_and_learning}）。\n这些方法是缓慢的，并且通常需要以闭解形式计算$\\SetE_{\\RVz \\sim q} \\log p_{\\text{model}} (\\Vz, \\Vx)$。 % mistake ???\n\\gls{VAE}背后的主要思想是训练产生$q$参数的参数编码器（有时也称为\\gls{inference}网络或识别模型）。\n只要$\\Vz$是连续变量，我们就可以通过从$q(\\Vz  \\mid  \\Vx) = q(\\Vz; f(\\Vx; \\Vtheta))$中采样$\\Vz$的样本\\gls{back_propagation}，以获得相对于$\\Vtheta$的梯度。\n学习则仅包括相对于\\gls{encoder}和\\gls{decoder}的参数最大化$\\CalL$。\n$\\CalL$中的所有期望都可以通过\\gls{monte_carlo}采样来近似。\n\n% -- 687 --\n\n\\gls{VAE}方法是优雅的， 理论上令人愉快的，并且易于实现。\n它也获得了出色的结果，是\\gls{generative_modeling}中的最先进方法之一。\n它的主要缺点是从在图像上训练的\\gls{VAE}中采样的样本往往有些模糊。\n这种现象的原因尚不清楚。\n一种可能性是模糊性是最大似然的固有效应，因为我们需要最小化$D_{\\text{KL}}(p_{\\text{data}} ||p_{\\text{model}} )$。\n如\\figref{fig:chap3_kl_direction_color}所示，这意味着模型将为训练集中出现的点分配高的概率，但也可能为其他点分配高的概率。\n还有其他原因可以导致模糊图像。\n模型选择将概率质量置于模糊图像而不是空间的其他部分的部分原因是实际使用的\\gls{VAE}通常在$p_{\\text{model}}(\\Vx; g(\\Vz))$使用\\gls{gaussian_distribution}。\n最大化这种分布似然性的下界与训练具有\\gls{mean_squared_error}的传统\\gls{AE}类似，这意味着它倾向于忽略由少量像素表示的特征或其中亮度变化微小的像素。\n如~\\citet{Theis2015d}和~\\citet{Huszar-arXiv2015}指出的，该问题不是~\\glssymbol{VAE}~特有的，而是与优化对数似然或$D_{\\text{KL}}(p_{\\text{data}} ||p_{\\text{model}} )$的\\gls{generative_model}共享的。\n现代~\\glssymbol{VAE}~模型另一个麻烦的问题是，它们倾向于仅使用$\\Vz$维度中的小子集，就像\\gls{encoder}不能够将具有足够局部方向的输入空间变换到边缘分布与分解前匹配的空间。\n\n\n\\glssymbol{VAE}~框架可以直接扩展到大范围的模型架构。\n相比\\gls{BM}，这是关键的优势，因为\\gls{BM}需要非常仔细地设计模型来保持易解性。\n\\glssymbol{VAE}~可以与广泛的可微算子族一起良好工作。\n一个特别复杂的~\\glssymbol{VAE}~是\\textbf{深度循环注意写者}(DRAW)模型\\citep{Gregor2015}。\nDRAW使用一个循环编码器和循环解码器并结合\\gls{attention_mechanism}。\nDRAW模型的生成过程包括顺序访问不同的小图像块并绘制这些点处的像素值。\n我们还可以通过在~\\glssymbol{VAE}~框架内使用循环编码器和解码器来定义变分~\\glssymbol{RNN}~\\citep{Chung-et-al-NIPS2015}来扩展~\\glssymbol{VAE}~以生成序列。\n从传统~\\glssymbol{RNN}~生成样本仅在输出空间涉及非确定性操作。\n而变分~\\glssymbol{RNN}~还具有由~\\glssymbol{VAE}~\\gls{latent_variable}捕获的潜在更抽象层的随机变化性。\n\n% -- 688 --\n\n\\glssymbol{VAE}~框架已不仅仅扩展到传统的变分下界，还有\\,\\textbf{重要加权\\gls{AE}}(importance-weighted autoencoder)\\citep{burda2015importance}的目标：\n\\begin{align}\n \\CalL_k(\\Vx, q) = \\SetE_{\\RVz^{(1)},\\dots,\\RVz^{(k)} \\sim q(\\Vz  \\mid  \\Vx)}\n \\Bigg[ \\log \\frac{1}{k} \\sum_{i=1}^k \n \\frac{p_{\\text{model}}(\\Vx, \\Vz^{(i)})}{q(\\Vz^{(i)}  \\mid  \\Vx)} \\Bigg].\n\\end{align}\n这个新的目标在$k=1$时等同于传统的下界$\\CalL$。\n然而，它也可以被解释为基于提议分布$q(\\Vz  \\mid  \\Vx)$中$\\Vz$的\\gls{importance_sampling}而形成的真实$\\log p_{\\text{model}}(\\Vx)$估计。\n重要加权\\gls{AE}目标也是$\\log p_{\\text{model}}(\\Vx)$的下界，并且随着$k$增加而变得更紧。\n\n\n\\gls{VAE}与~\\glssymbol{MPDBM}~和其他涉及通过近似\\gls{inference}图的\\gls{back_propagation}方法有一些有趣的联系 \\citep{Goodfellow-et-al-NIPS2013,Stoyanov2011,brakel13a}。\n这些以前的方法需要诸如\\gls{meanfield}不动点方程的\\gls{inference}过程来提供\\gls{computational_graph}。\n\\gls{VAE}被定义为任意\\gls{computational_graph}，这使得它能适用于更广泛的概率模型族，因为它不需要将模型的选择限制到具有易处理的\\gls{meanfield}不动点方程的那些模型。\n\\gls{VAE}还具有增加模型对数似然边界的优点，而~\\glssymbol{MPDBM}~和相关模型的\\gls{criterion}更具启发性，并且除了使近似\\gls{inference}的结果准确外很少有概率的解释。\n\\gls{VAE}的一个缺点是它仅针对一个问题学习\\gls{inference}网络，即给定$\\Vx$ \\gls{inference} $\\Vz$。\n较老的方法能够在给定任何其他变量子集的情况下对任何变量子集执行近似\\gls{inference}，因为\\gls{meanfield}不动点方程指定如何在所有这些不同问题的\\gls{computational_graph}之间共享参数。\n\n\n\\gls{VAE}的一个非常好的特性是，同时训练参数编码器与\\gls{generator_network}的组合迫使模型学习一个编码器可以捕获的可预测的坐标系。\n这使得它成为一个优秀的\\gls{manifold_learning}算法。\n\\figref{fig:chap20_kingma-vae-2d-faces-manifold}展示了由\\gls{VAE}学到的低维流形的例子。\n图中所示的情况之一，算法发现了存在于面部图像中两个独立的变化因素：旋转角和情绪表达。\n\n% -- 689 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\n\\includegraphics[width=0.44\\figwidth]{Chapter20/figures/kingma-vae-2d-faces-manifold.pdf}\n\\includegraphics[width=0.55\\figwidth]{Chapter20/figures/kingma-vae-2d-mnist-manifold.pdf}\n}\n\\fi\n\\caption{由\\gls{VAE}学习的高维\\gls{manifold}在2维坐标系中的示例\\citep{Kingma+Welling-ICLR2014}。\n我们可以在纸上直接绘制两个可视化的维度，因此可以使用2维\\gls{latent}编码训练模型来了解模型的工作原理（即使我们认为数据\\gls{manifold}的固有维度要高得多）。\n图中所示的图像不是来自训练集的样本，而是仅仅通过改变2维``编码''$\\Vz$，由模型$p(\\Vx \\mid \\Vz)$实际生成的图像$\\Vx$（每个图像对应于``编码''$\\Vz$位于2维均匀网格的不同选择）。\n\\emph{(左)}~\\ENNAME{Frey}~人脸\\gls{manifold}的2维映射。 其中一个维度（水平）已发现大致对应于面部的旋转，而另一个（垂直）对应于情绪表达。\n\\emph{(右)}~MNIST~\\gls{manifold}的2维映射。\n}\n\\label{fig:chap20_kingma-vae-2d-faces-manifold}\n\\end{figure}\n\n\\subsection{\\glsentrytext{GAN}}\n\\label{sec:generative_adversarial_networks}\n\n\\firstall{GAN}\\citep{Goodfellow-et-al-NIPS2014-small}是基于可微\\gls{generator_network}的另一种\\gls{generative_modeling}方法。\n\n\n\\gls{GAN}基于博弈论场景，其中\\gls{generator_network}必须与对手竞争。\n\\gls{generator_network}直接产生样本$\\Vx = g(\\Vz; \\Vtheta^{(g)})$。\n其对手，\\firstgls{discriminator_network}，试图区分从训练数据抽取的样本和从生成器抽取的样本。\n判别器发出由$d(\\Vx; \\Vtheta^{(d)})$给出的概率值，指示$\\Vx$是真实训练样本而不是从模型抽取的伪造样本的概率。\n\n% -- 690 --\n\n\n形式化表示\\gls{GAN}中学习的最简单方式是零和游戏，其中函数$v(\\Vtheta^{(g)}, \\Vtheta^{(d)})$确定判别器的收益。\n生成器接收$-v(\\Vtheta^{(g)}, \\Vtheta^{(d)})$作为它自己的收益。\n在学习期间，每个玩家尝试最大化自己的收益，因此收敛在\n\\begin{align}\n g^* = \\underset{g}{\\argmin} \\, \\underset{d}{\\max}~ v(g, d).\n\\end{align}\n$v$的默认选择是\n\\begin{align}\n v(\\Vtheta^{(g)}, \\Vtheta^{(d)}) = \\SetE_{\\RVx \\sim p_{\\text{data}}} \n \\log d(\\Vx) + \\SetE_{\\Vx \\sim p_{\\text{model}}} \\log (1 - d(\\Vx)).\n\\end{align}\n这驱使判别器试图学习将样品正确地分类为真的或伪造的。\n同时，生成器试图欺骗分类器以让其相信样本是真实的。\n在收敛时，生成器的样本与实际数据不可区分，并且判别器处处都输出$\\frac{1}{2}$。\n然后就可以丢弃判别器。\n\n\n设计~\\glssymbol{GAN}~的主要动机是学习过程既不需要近似\\gls{inference}也不需要\\gls{partition_function}梯度的近似。\n当$\\max_d v(g,d)$在$\\Vtheta^{(g)}$中是凸的（例如，在\\gls{PDF}的空间中直接执行优化的情况）时，该过程保证收敛并且是渐近一致的。\n\n\n不幸的是，在实践中由神经网络表示的$g$和$d$以及$\\max_d v(g, d)$不凸时，\\glssymbol{GAN}~中的学习可能是困难的。\n\\citet{Goodfellow-ICLR2015}认为不收敛可能会引起~\\glssymbol{GAN}~的\\gls{underfitting}问题。\n一般来说，同时对两个玩家的成本梯度下降不能保证达到平衡。\n例如，考虑价值函数$v(a,b) = ab$，其中一个玩家控制$a$并产生成本$ab$，而另一玩家控制$b$并接收成本$-ab$。\n如果我们将每个玩家建模为无穷小的梯度步骤，每个玩家以另一个玩家为代价降低自己的成本，则$a$和$b$进入稳定的圆形轨迹，而不是到达原点处的平衡点。\n注意，极小极大化游戏的平衡不是$v$的局部最小值。\n相反，它们是同时最小化的两个玩家成本的点。\n这意味着它们是$v$的鞍点，相对于第一个玩家的参数是局部最小值，而相对于第二个玩家的参数是局部最大值。\n两个玩家可以永远轮流增加然后减少$v$，而不是正好停在玩家没有能力降低其成本的鞍点。\n目前不知道这种不收敛的问题会在多大程度上影响~\\glssymbol{GAN}。\n \n\\citet{Goodfellow-ICLR2015}确定了另一种替代的形式化收益公式，其中博弈不再是零和，每当判别器最优时， 具有与最大似然学习相同的预期梯度。\n因为最大似然训练收敛，这种~\\glssymbol{GAN}~博弈的重述在给定足够的样本时也应该收敛。\n不幸的是，这种替代的形式化似乎并没有提高实践中的收敛，可能是由于判别器的次优性或围绕期望梯度的高方差。\n\n% -- 691 --\n\n在真实实验中，\\glssymbol{GAN}~博弈的最佳表现形式既不是零和也不等价于最大似然，而是\\citet{Goodfellow-et-al-NIPS2014-small}引入的带有启发式动机的不同形式化。\n在这种最佳性能的形式中，生成器旨在增加判别器发生错误的对数概率，而不是旨在降低判别器进行正确预测的对数概率。\n这种重述仅仅是观察的结果，即使在判别器确信地拒绝所有生成器样本的情况下，它也能导致生成器代价函数的导数相对于判别器的对数保持很大。\n\n稳定~\\glssymbol{GAN}~学习仍然是一个开放的问题。\n幸运的是，当仔细选择模型架构和超参数时，\\glssymbol{GAN}~学习效果很好。\n\\citet{radford2015unsupervised}设计了一个深度卷积~\\glssymbol{GAN}（DCGAN），在图像合成的任务上表现非常好，并表明其\\gls{latent}的表示空间能捕获到变化的重要因素，如\\figref{fig:chap15_generative_glasses}所示。\n\\figref{fig:chap20_lsun_small}展示了DCGAN生成器生成的图像示例。\n \n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n$\\vcenter{\\hbox{\n\\includegraphics[width=0.45\\figwidth]{Chapter20/figures/lsun_bedrooms_small.png}\n}}\n\\vcenter{\\hbox{\n\\includegraphics[width=0.45\\figwidth]{Chapter20/figures/lsun_small.png}\n}}$\n\\fi\n\\caption{在LSUN数据集上训练后，由~\\glssymbol{GAN}~生成的图像。\n\\emph{(左)}由DCGAN模型生成的卧室图像，经\\citet{radford2015unsupervised}许可转载。\n\\emph{(右)}由LAPGAN模型生成的教堂图像，经 \\citet{denton2015deep}许可转载。\n}\n\\label{fig:chap20_lsun_small}\n\\end{figure}\n\n\\glssymbol{GAN}~学习问题也可以通过将生成过程分成许多级别的细节来简化。\n我们可以训练有条件的~\\glssymbol{GAN}~\\citep{mirza2014conditional}，并学习从分布$p(\\Vx \\mid \\Vy)$中采样，而不是简单地从边缘分布$p(\\Vx)$中采样。\n\\citet{denton2015deep} 表明一系列的条件~\\glssymbol{GAN}~可以被训练为首先生成非常低分辨率的图像，然后增量地向图像添加细节。\n由于使用拉普拉斯金字塔来生成包含不同细节水平的图像，这种技术被称为~\\ENNAME{LAPGAN}~模型。\n\\ENNAME{LAPGAN}~生成器不仅能够欺骗判别器网络，而且能够欺骗人类观察者，实验主体将高达40％的网络输出识别为真实数据。\n请看\\figref{fig:chap20_lsun_small}中~\\ENNAME{LAPGAN}~生成器生成的图像示例。\n\n\n\\glssymbol{GAN}~训练过程中一个不寻常的能力是它可以拟合向训练点分配零概率的概率分布。\n\\gls{generator_network}学习跟踪其点在某种程度上类似于训练点的流形，而不是最大化特定点的对数概率。\n有点矛盾的是，这意味着模型可以将负无穷大的对数似然分配给测试集，同时仍然表示人类观察者判断为能捕获生成任务本质的流形。\n这不是明显的优点或缺点，并且只要向\\gls{generator_network}最后一层所有生成的值添加高斯噪声，就可以保证\\gls{generator_network}向所有点分配非零概率。\n以这种方式添加高斯噪声的\\gls{generator_network}，从中采样的分布，和使用\\gls{generator_network}参数化条件\\gls{gaussian_distribution}的均值所获得的分布是相同的。\n\n% -- 692 --\n\n\\gls{dropout}~似乎在判别器网络中很重要。\n特别地，在计算\\gls{generator_network}的梯度时，单元应当被随机地丢弃。\n使用权重除以二的确定性版本的判别器的梯度似乎不是那么有效。\n同样，从不使用~\\gls{dropout}~似乎会产生不良的结果。\n\n\n虽然~\\glssymbol{GAN}~框架被设计为用于可微\\gls{generator_network}，但是类似的原理可以用于训练其他类型的模型。\n例如，\\textbf{自监督提升}( self-supervised boosting)可以用于训练~\\glssymbol{RBM}~生成器以欺骗\\gls{logistic_regression}判别器~\\citep{welling2002self}。\n\n% -- 693 --\n\n\\subsection{\\glsentrytext{generative_moment_matching_network}}\n\\label{sec:generative_moment_matching_networks}\n\n\\firstgls{generative_moment_matching_network}\\citep{Li-et-al-2015,dziugaite2015training}是另一种基于可微\\gls{generator_network}的\\gls{generative_model}。\n与~\\glssymbol{VAE}~和~\\glssymbol{GAN}~不同，它们不需要将\\gls{generator_network}与任何其他网络配对，如不需要与用于~\\glssymbol{VAE}~的\\gls{inference}网络配对，也不需要与~\\glssymbol{GAN}~的判别器网络。\n\n\n\\gls{generative_moment_matching_network}使用称为\\firstgls{moment_matching}的技术训练。\n\\gls{moment_matching}背后的基本思想是以如下的方式训练生成器——令模型生成的样本的许多统计量尽可能与训练集中的样本相似。\n在此情景下，\\firstgls{moment}是对随机变量不同幂的期望。\n例如，第一\\gls{moment}是均值，第二\\gls{moment}是平方值的均值，以此类推。\n多维情况下，随机向量的每个元素可以被升高到不同的幂， 因此使得\\gls{moment}可以是任意数量的形式 %？\n\\begin{align}\n \\SetE_{\\Vx} \\prod_i x_i^{n_i},\n\\end{align}\n其中 $\\Vn = [n_1, n_2, \\dots, n_d]^\\top$是一个非负整数的向量。\n\n\n在第一次检查时，这种方法似乎在计算上是不可行的。\n例如，如果我们想匹配形式为$x_ix_j$的所有\\gls{moment}，那么我们需要最小化在$\\Vx$的维度上是二次的多个值之间的差。\n此外，甚至匹配所有第一和第二\\gls{moment}将仅足以拟合多变量\\gls{gaussian_distribution}，其仅捕获值之间的线性关系。\n我们使用神经网络的野心是捕获复杂的非线性关系，这将需要更多的\\gls{moment}。\n\\glssymbol{GAN}~通过使用动态更新的判别器避免了穷举所有\\gls{moment}的问题，该判别器自动将其注意力集中在\\gls{generator_network}最不匹配的统计量上。\n\n\n相反，我们可以通过最小化一个被称为\\firstall{MMD}\\citep{scholkopf2002learning,gretton2012kernel}的\\gls{cost_function}来训练\\gls{generative_moment_matching_network}。\n该\\gls{cost_function}通过向核函数定义的特征空间隐式映射，在无限维空间中测量第一\\gls{moment}的误差，使得对无限维向量的计算变得可行。\n当且仅当所比较的两个分布相等时，\\glssymbol{MMD}~代价为零。\n\n从可视化方面看，来自\\gls{generative_moment_matching_network}的样本有点令人失望。\n幸运的是，它们可以通过将\\gls{generator_network}与\\gls{AE}组合来改进。\n首先，训练\\gls{AE}以重构训练集。\n接下来， \\gls{AE}的编码器用于将整个训练集转换到编码空间。\n然后训练\\gls{generator_network}以生成编码样本， 这些编码样本可以经解码器映射到视觉上令人满意的样本。\n\n与~\\glssymbol{GAN}~不同，\\gls{cost_function}仅关于一批同时来自训练集和\\gls{generator_network}的实例定义。\n我们不可能将训练更新作为一个训练样本或仅来自\\gls{generator_network}的一个样本的函数。\n这是因为必须将\\gls{moment}计算为许多样本的经验平均值。\n当批量大小太小时，\\glssymbol{MMD}~可能低估采样分布的真实变化量。\n有限的批量大小都不足以大到完全消除这个问题， 但是更大的批量大小减少了低估的量。\n当批量大小太大时，训练过程就会慢得不可行，因为计算单个小梯度步长必须一下子处理许多样本。\n\n与~\\glssymbol{GAN}~一样，即使\\gls{generator_network}为训练点分配零概率，仍可以使用~\\glssymbol{MMD}~训练\\gls{generator_network}。\n\n% -- 694 --\n\n\\subsection{卷积生成网络}\n\\label{sec:convolutional_generative_networks}\n当生成图像时，将卷积结构的引入\\gls{generator_network}通常是有用的（见~\\citet{Goodfellow-et-al-NIPS2014-small}或~\\citet{dosovitskiy2015learning}的例子）。\n为此，我们使用卷积算子的``转置''，如\\secref{sec:variants_of_the_basic_convolution_function}所述。\n这种方法通常能产生更逼真的图像，并且比不使用\\gls{parameter_sharing}的全连接层使用更少的参数。\n\n\n用于识别任务的\\gls{convolutional_network}具有从图像到网络顶部的某些概括层（通常是类标签）的信息流。\n当该图像通过网络向上流动时， 随着图像的表示变得对于有害变换保持不变，信息也被丢弃。\n在\\gls{generator_network}中，情况恰恰相反。\n要生成图像的表示通过网络传播时必须添加丰富的详细信息， 最后产生图像的最终表示，这个最终表示当然是带有所有细节的精细图像本身（具有对象位置、姿势、纹理以及明暗）。\n在卷积识别网络中丢弃信息的主要机制是池化层。\n而\\gls{generator_network}似乎需要添加信息。\n由于大多数池化函数不可逆，我们不能将池化层求逆后放入\\gls{generator_network}。\n更简单的操作是仅仅增加表示的空间大小。\n似乎可接受的方法是使用~\\citet{dosovitskiy2015learning}引入的``去池化''。\n该层对应于某些简化条件下\\gls{max_pooling}的逆操作。\n首先，\\gls{max_pooling}操作的步幅被约束为等于池化区域的宽度。\n其次，每个池化区域内的最大输入被假定为左上角的输入。\n最后，假设每个池化区域内所有非最大的输入为零。\n这些是非常强和不现实的假设，但它们允许我们对\\gls{max_pooling}算子求逆。\n逆去池化的操作分配一个零张量，然后将每个值从输入的空间坐标$i$复制到输出的空间坐标$i \\times k$。\n整数值$k$定义池化区域的大小。\n即使驱动去池化算子定义的假设是不现实的， 后续层也能够学习补偿其不寻常的输出， 所以由整体模型生成的样本在视觉上令人满意。\n\n% -- 695 --\n\n\\subsection{\\glsentrytext{auto_regressive_network}}\n\\label{sec:auto_regressive_networks}\n\\gls{auto_regressive_network}是没有\\gls{latent}随机变量的有向概率模型。\n这些模型中的条件概率分布由神经网络表示（有时是极简单的神经网络，例如\\gls{logistic_regression}）。\n这些模型的图结构是完全图。\n它们可以通过概率的链式法则分解观察变量上的联合概率，从而获得形如$P(x_d \\mid x_{d-1},\\dots, x_1)$条件概率的乘积。\n这样的模型被称为\\,\\textbf{完全可见的贝叶斯网络}（fully-visible Bayes networks, FVBN），并成功地以许多形式使用，首先是对每个条件分布\\gls{logistic_regression}~\\citep{Frey98} ，然后是带有\\gls{hidden_unit}的神经网络~\\citep{Bengio+Bengio-NIPS2000,Larochelle+Murray-2011-small}。\n在某些形式的\\gls{auto_regressive_network}中， 例如在\\secref{sec:nade}中描述的~\\glssymbol{NADE}~\\citep{Larochelle+Murray-2011-small}，我们可以引入\\gls{parameter_sharing}的一种形式，它能带来统计优点（较少的唯一参数）和计算优势 （较少计算量）。\n这是深度学习中反复出现的主题——\\emph{特征重用}的另一个实例。\n\n\n\\subsection{\\glsentrytext{linear_auto_regressive_network}}\n\\label{sec:linear_auto_regressive_networks}\n\n\\gls{auto_regressive_network}的最简单形式是没有\\gls{hidden_unit}、没有参数或特征共享的形式。\n每个$P(x_i \\mid x_{i-1},\\dots, x_1)$被参数化为\\gls{linear_model}（对于实值数据的\\gls{linear_regression}，对于二值数据的\\gls{logistic_regression}，对于离散数据的\\ENNAME{softmax}回归）。\n这个模型由~\\citet{Frey98} 引入，当有$d$个变量要建模时，该模型有$\\CalO(d^2)$个参数。\n如\\figref{fig:chap20_fvbn}所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/fvbn}}\n\\fi\n\\caption{完全可见的\\gls{BN}从前$i-1$个变量预测第$i$个变量。\n\\emph{(上)}~FVBN的\\gls{directed_graphical_model}。\n\\emph{(下)}对数FVBN相应的\\gls{computational_graph}，其中每个预测由线性预测器作出。\n}\n\\label{fig:chap20_fvbn}\n\\end{figure}\n\n如果变量是连续的，\\gls{linear_auto_regressive_network}只是表示多元\\gls{gaussian_distribution}的另一种方式， 只能捕获观察变量之间线性的成对相互作用。\n \n\\gls{linear_auto_regressive_network}本质上是线性分类方法在\\gls{generative_modeling}上的推广。\n因此，它们具有与线性分类器相同的优缺点。\n像线性分类器一样，它们可以用凸\\gls{loss_function}训练，并且有时允许闭解形式（如在高斯情况下）。\n像线性分类器一样，模型本身不提供增加其容量的方法，因此必须使用其他技术（如输入的基扩展或核技巧）来提高容量。\n\n% -- 696 --\n\n\\subsection{\\glsentrytext{neural_auto_regressive_network}}\n\\label{sec:neural_auto_regressive_networks}\n\n\\gls{neural_auto_regressive_network} \\citep{Bengio+Bengio-trnn2000,Bengio+Bengio-NIPS2000}具有与逻辑\\gls{auto_regressive_network}相同的从左到右的\\gls{graphical_model}（\\figref{fig:chap20_fvbn}），但在该\\gls{graphical_model}结构内采用不同的条件分布参数。\n新的参数化更强大，它可以根据需要随意增加容量，并允许近似任意联合分布。\n新的参数化还可以引入深度学习中常见的参数共享和特征共享原理来改进\\gls{generalize}能力。\n设计这些模型的动机是避免传统表格\\gls{graphical_model}引起的\\gls{curse_of_dimensionality}，并与\\figref{fig:chap20_fvbn}共享相同的结构。\n在表格离散概率模型中，每个条件分布由概率表表示，其中所涉及的变量的每个可能配置都具有一个条目和一个参数。\n通过使用神经网络，可以获得两个优点：\n\\begin{enumerate}\n \\item 通过具有$(i-1) \\times k$个输入和$k$个输出的神经网络（如果变量是离散的并有$k$个值，使用\\gls{one_hot}编码）参数化每个$P(x_i  \\mid  x_{i-1}, \\dots, x_1)$，让我们不需要指数量级参数（和样本）的情况下就能估计条件概率， 然而仍然能够捕获随机变量之间的高阶依赖性。\n\n \\item 不需要对预测每个$x_i$使用不同的神经网络，如\\figref{fig:chap20_neural_autoregressive}所示的从左到右连接，允许将所有神经网络合并成一个。\n 等价地，它意味着为预测$x_i$所计算的\\gls{hidden_layer}特征可以重新用于预测$x_{i+k}~(k > 0)$。\n 因此\\gls{hidden_unit}被\\emph{组织}成第$i$组中的所有单元仅依赖于输入值 $x_1, \\dots, x_i$的特定的组。\n 用于计算这些\\gls{hidden_unit}的参数被联合优化以改进对序列中所有变量的预测。\n 这是\\emph{重用原理}的一个实例，这是从循环和\\gls{convolutional_network}架构到多任务和\\gls{transfer_learning}的场景中反复出现的深度学习原理。\n\n\\end{enumerate}\n\n% -- 697 --\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/neural_autoregressive}}\n\\fi\n\\caption{\\gls{neural_auto_regressive_network}从前$i-1$个变量预测第$i$个变量$x_i$，但经参数化后，作为$x_1,\\dots,x_i$函数的特征（表示为$h_i$的\\gls{hidden_unit}的组）可以在预测所有后续变量$x_{i+1},x_{i+2},\\dots,x_{d}$时重用。\n}\n\\label{fig:chap20_neural_autoregressive}\n\\end{figure}\n\n\n如在\\secref{sec:linear_units_for_gaussian_output_distributions}中讨论的，使神经网络的输出预测$x_i$条件分布的\\emph{参数}，每个$P(x_i  \\mid  x_{i-1}, \\dots, x_1)$就可以表示一个条件分布。\n虽然原始\\gls{neural_auto_regressive_network}最初是在纯粹离散多变量数据（带有~\\ENNAME{sigmoid}~输出的~\\ENNAME{Bernoulli}~变量或~\\ENNAME{softmax}~输出的~\\ENNAME{Multinoulli}~变量）的背景下评估，但我们可以自然地将这样的模型扩展到连续变量或同时涉及离散和连续变量的联合分布。\n\n% -- 698 --\n\n\\subsection{\\glssymbol{NADE}}\n\\label{sec:nade}\n\n\\firstall{NADE}是最近非常成功的\\gls{neural_auto_regressive_network}的一种形式 \\citep{Larochelle+Murray-2011-small}。\n与~\\citet{Bengio+Bengio-NIPS2000}的原始\\gls{neural_auto_regressive_network}中的连接相同，但~\\glssymbol{NADE}~引入了附加的\\gls{parameter_sharing}方案，如\\figref{fig:chap20_NADE}所示。\n不同组$j$的\\gls{hidden_unit}的参数是共享的。\n\n从第$i$个输入$x_i$到第$j$组\\gls{hidden_unit}的第$k$个元素$h_k^{(j)} ~(j \\geq i)$的权重$W_{j,k,i}^{'}$是组内共享的：\n\\begin{align}\n W_{j,k,i}^{'} = W_{k,i}.\n\\end{align}\n其余$j<i$的权重为零。\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/NADE}}\n\\fi\n\\caption{\\gls{NADE}（\\glssymbol{NADE}）的示意图。\n\\gls{hidden_unit}被组织在组$\\Vh^{(j)}$中，使得只有输入$x_1,\\dots,x_i$参与计算$\\Vh^{(i)}$和预测$P(x_j \\mid x_{j-1},\\dots,x_1)$（对于$j> i$）。\n\\glssymbol{NADE}~使用特定的权重共享模式区别于早期的\\gls{neural_auto_regressive_network}：$W_{j,k,i}^{'} = W_{k,i}$被共享于所有从$x_i$到任何$j \\geq i$组中第$k$个单元的权重（在图中使用相同的线型表示复制权重的每个实例）。 \n注意向量$(W_{1,i}, W_{2,i},\\dots,W_{n,i})$记为$\\MW_{:,i}$。\n}\n\\label{fig:chap20_NADE}\n\\end{figure}\n\n% -- 699 --\n\n\\citet{Larochelle+Murray-2011-small} 选择了这种共享方案，使得~\\glssymbol{NADE}~模型中的正向传播与在\\gls{meanfield}\\gls{inference}中执行的计算大致相似，以填充~\\glssymbol{RBM}~中缺失的输入。\n这个\\gls{meanfield}\\gls{inference}对应于运行具有共享权重的循环网络，并且该\\gls{inference}的第一步与~\\glssymbol{NADE}~中的相同。\n使用~\\glssymbol{NADE}~的唯一区别是，连接\\gls{hidden_unit}到输出的输出权重独立于连接输入单元和\\gls{hidden_unit}的权重进行参数化。\n在~\\glssymbol{RBM}~中，隐藏到输出的权重是输入到隐藏权重的转置。\n\\glssymbol{NADE}~架构可以扩展为不仅仅模拟\\gls{meanfield}循环\\gls{inference}的一个\\gls{time_step}，而是$k$步。\n这种方法称为~\\glssymbol{NADE}-$k$~\\citep{Raiko-et-al-2014}。\n\n\n如前所述，\\gls{auto_regressive_network}可以被扩展成处理连续数据。\n用于参数化连续密度的特别强大和通用的方法是混合权重为$\\alpha_i$（组$i$的系数或先验概率），每组条件均值为$\\mu_i$和每组条件方差为$\\sigma_i^2$的高斯混合体。\n一个称为~\\ENNAME{RNADE}~的模型\\citep{Benigno-et-al-NIPS2013-small} 使用这种参数化将~\\glssymbol{NADE}~扩展到实值。\n与其他混合密度网络一样，该分布的参数是网络的输出，由~\\ENNAME{softmax}~单元产生混合的权量概率以及参数化的方差，因此可使它们为正的。\n由于条件均值$\\mu_i$和条件方差$\\sigma_i^2$之间的相互作用，\\gls{SGD}在数值上可能会表现不好。\n为了减少这种困难， \\citet{Benigno-et-al-NIPS2013-small}在后向传播阶段使用伪梯度代替平均值上的梯度。\n\n另一个非常有趣的神经自回归架构的扩展摆脱了为观察到的变量选择任意顺序的需要\\citep{Uria+al-ICML2014}。\n在\\gls{auto_regressive_network}中，该想法是训练网络以能够通过随机采样顺序来处理任何顺序，并将信息提供给指定哪些输入被观察的\\gls{hidden_unit}（在条件条的右侧），以及哪些是被预测并因此被认为是缺失的（在条件条的左侧）。\n这是不错的性质，因为它允许人们非常高效地使用训练好的\\gls{auto_regressive_network}来\\emph{执行任何\\gls{inference}问题}（即从给定任何变量的子集，从任何子集上的概率分布预测或采样）。\n最后，由于变量的许多顺序是可能的（对于$n$个变量是$n!$），并且变量的每个顺序$o$产生不同的$p(\\RVx \\mid o)$，我们可以组成许多$o$值模型的集成：\n\\begin{align}\n p_{\\text{ensemble}}(\\RVx) = \\frac{1}{k} \\sum_{i=1}^k p(\\RVx  \\mid  o^{(i)}).\n\\end{align}\n这个集成模型通常能更好地\\gls{generalize}，并且为测试集分配比单个排序定义的单个模型更高的概率。\n\n% -- 700 --\n\n在同一篇文章中，作者提出了深度版本的架构，但不幸的是，这立即使计算成本像原始\\gls{neural_auto_regressive_network}一样高\\citep{Bengio+Bengio-NIPS2000}。\n第一层和输出层仍然可以在$\\CalO(nh)$的乘法-加法操作中计算，如在常规~\\glssymbol{NADE}~中，其中$h$是\\gls{hidden_unit}的数量（\\figref{fig:chap20_NADE}和\\figref{fig:chap20_neural_autoregressive}中的组$h_i$的大小），而它在~\\citet{Bengio+Bengio-NIPS2000}中是$\\CalO(n^2h)$。\n然而，对于其他\\gls{hidden_layer}的计算量是$\\CalO(n^2 h^2)$（假设在每个层存在$n$组$h$个\\gls{hidden_unit}，且在$l$层的每个``先前''组参与预测$l+1$层处的``下一个''组）。\n如在~\\citet{Uria+al-ICML2014}中， 使$l+1$层上的第$i$个组仅取决于第$i$个组，$l$层处的计算量将减少到$\\CalO(nh^2)$，但仍然比常规~\\glssymbol{NADE}~差$h$倍。\n\n\n\\section{从\\gls{AE}采样}\n\\label{sec:drawing_samples_from_autoencoders}\n\n在\\chapref{chap:autoencoders}中，我们看到许多种学习数据分布的\\gls{AE}。\n\\gls{score_matching}、 \\gls{DAE}和\\gls{CAE}之间有着密切的联系。\n这些联系表明某些类型的\\gls{AE}以某些方式学习数据分布。\n我们还没有讨论如何从这样的模型中采样。\n\n某些类型的\\gls{AE}，例如\\gls{VAE}，明确地表示概率分布并且允许直接的\\gls{ancestral_sampling}。\n而大多数其他类型的\\gls{AE}则需要~\\glssymbol{mcmc}~采样。\n\n\\gls{CAE}被设计为恢复数据流形切面的估计。\n这意味着使用注入噪声的重复编码和解码将引起沿着流形表面的随机游走\\citep{Rifai-icml2012-small,Mesnil-et-al-LW2012}。\n这种流形扩散技术是\\gls{markov_chain}的一种。\n\n更一般的\\gls{markov_chain}还可以从任何\\gls{DAE}中采样。\n\n% -- 701 --\n\n\\subsection{与任意\\gls{DAE}相关的\\gls{markov_chain}}\n\\label{sec:markov_chain_associated_with_any_denoising_autoencoder}\n\n上述讨论留下了一个开放问题——注入什么噪声和从哪获得\\gls{markov_chain}（可以根据\\gls{AE}估计的分布生成样本）。\n\\citet{Bengio-et-al-NIPS2013-small}展示了如何构建这种用于\\textbf{广义\\gls{DAE}}(generalized denoising autoencoder)的\\gls{markov_chain}。\n广义\\gls{DAE}由去噪分布指定，给定损坏输入后，对干净输入的估计进行采样。\n\n根据估计分布生成的\\gls{markov_chain}的每个步骤由以下子步骤组成，如\\figref{fig:chap20_dae_markov_chain}所示：\n\\begin{enumerate}\n \\item 从先前状态$\\Vx$开始，注入损坏噪声，从$C(\\tilde{\\Vx}  \\mid  \\Vx)$中采样$\\tilde{\\Vx}$。\n \\item 将$\\tilde{\\Vx}$编码为$\\Vh = f(\\tilde{\\Vx})$。\n \\item 解码$\\Vh$以获得$p(\\RVx  \\mid  \\Vomega = g(\\Vh)) = p(\\RVx  \\mid  \\tilde{\\Vx})$的参数$\\Vomega = g(\\Vh)$。\n \\item 从$p(\\RVx  \\mid  \\Vomega = g(\\Vh)) = p(\\RVx  \\mid  \\tilde{\\Vx})$采样下一状态$\\Vx$。\n\\end{enumerate}\n\\citet{Bengio-et-al-ICML-2014} 表明，如果\\gls{AE} $p(\\RVx  \\mid  \\tilde{\\Vx})$形成对应真实条件分布的一致估计量，则上述\\gls{markov_chain}的平稳分布形成数据生成分布$\\RVx$的一致估计量（虽然是隐式的）。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/dae_markov_chain}}\n\\fi\n\\caption{\\gls{markov_chain}的每个步骤与训练好的\\gls{DAE}相关联，根据由去噪对数似然\\gls{criterion}隐式训练的概率模型生成样本。\n每个步骤包括：(a)通过损坏过程$C$向状态$\\Vx$注入噪声产生$\\tilde{\\Vx}$，(b)用函数$f$对其编码，产生$\\Vh = f(\\tilde{\\Vx})$，(c)用函数$g$解码结果， 产生用于\\gls{reconstruction}分布的参数$\\Vomega$，(d)给定$\\Vomega$，从\\gls{reconstruction}分布$p(\\RVx \\mid \\Vomega = g(f(\\tilde{\\Vx})))$采样新状态。\n在典型的平方\\gls{reconstruction_error}情况下，$g(\\Vh) = \\hat{\\Vx}$，并估计$\\SetE [ \\Vx \\mid \\tilde{\\Vx}]$，损坏包括添加高斯噪声，并且从$p(\\RVx | \\Vomega)$的采样包括第二次向\\gls{reconstruction} $\\hat{\\Vx}$添加高斯噪声。\n后者的噪声水平应对应于\\gls{reconstruction}的\\gls{mean_squared_error}，而注入的噪声是控制混合速度以及估计器平滑经验分布程度的超参数\\citep{Vincent-NC-2011-small}。\n在这所示的例子中，只有$C$和$p$条件是随机步骤（$f$和$g$是确定性计算），我们也可以在\\gls{AE}内部注入噪声，如\\gls{GSN}~\\citep{Bengio-et-al-ICML-2014}。\n}\n\\label{fig:chap20_dae_markov_chain}\n\\end{figure}\n\n% -- 702 --\n\n\\subsection{夹合与条件采样}\n\\label{sec:clamping_and_conditional_sampling}\n\n与\\gls{BM}类似，\\gls{DAE}及其推广（例如下面描述的~\\glssymbol{GSN}）可用于从条件分布$p(\\RVx_f  \\mid  \\RVx_o)$中采样，只需夹合\\emph{观察}单元$\\RVx_f$并在给定$\\RVx_f$和采好的\\gls{latent_variable}（如果有的话）下仅重采样\\emph{自由}单元$\\RVx_o$。\n例如，\\glssymbol{MPDBM}~可以被解释为\\gls{DAE}的一种形式，并且能够采样丢失的输入。\n\\glssymbol{GSN}~随后将~\\glssymbol{MPDBM}~中的一些想法推广以执行相同的操作~\\citep{Bengio-et-al-ICML-2014}。\n\\citet{Alain-et-al-arxiv2015} 从~\\citet{Bengio-et-al-ICML-2014}的命题1中发现了一个缺失条件，即转移算子（由从链的一个状态到下一个状态的随机映射定义）应该满足\\firstgls{detailed_balance}的属性， 表明无论转移算子正向或反向运行，\\gls{markov_chain}都将保持平衡。\n\n在\\figref{fig:chap20_inpainting1500-half_croppedhalf__with_nearest}中展示了夹合一半像素（图像的右部分）并在另一半上运行\\gls{markov_chain}的实验。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter20/figures/inpainting1500-half_croppedhalf__with_nearest}}\n\\fi\n\\caption{在每步仅重采样左半部分，夹合图像的右半部分并运行\\gls{markov_chain}的示意图。\n这些样本来自\\gls{reconstruction}~MNIST数字的~\\glssymbol{GSN}（每个\\gls{time_step}使用回退过程）。\n}\n\\label{fig:chap20_inpainting1500-half_croppedhalf__with_nearest}\n\\end{figure}\n\n\\subsection{回退训练过程}\n\\label{sec:walk_back_training_procedure}\n回退训练过程由~\\citet{Bengio-et-al-NIPS2013-small} 等人提出，作为一种加速\\gls{DAE}生成训练收敛的方法。\n不像执行一步编码-解码重建，该过程由交替的多个随机编码-解码步骤组成（如在生成\\gls{markov_chain}中），以训练样本初始化（正如在\\secref{sec:stochastic_maximum_likelihood_and_contrastive_divergence}中描述的\\gls{contrastive_divergence}算法），并惩罚最后的概率重建（或沿途的所有重建）。\n\n训练$k$个步骤与训练一个步骤是等价的（在实现相同稳态分布的意义上），但是实际上可以更有效地去除来自数据的伪模式。\n\n% -- 703 --\n\n\\section{\\glsentrytext{GSN}}\n\\label{sec:generative_stochastic_networks}\n\\firstall{GSN} \\citep{Bengio-et-al-ICML-2014} 是\\gls{DAE}的推广，除可见变量（通常表示为$\\RVx$）之外，在生成\\gls{markov_chain}中还包括\\gls{latent_variable} $\\RVh$。\n\n\\glssymbol{GSN}~由两个条件概率分布参数化， 指定\\gls{markov_chain}的一步：\n\\begin{enumerate}\n \\item $p(\\RVx^{(k)}  \\mid \\RVh^{(k)} )$指示在给定当前\\gls{latent}状态下如何产生下一个可见变量。\n 这种``重建分布''也可以在\\gls{DAE}、 \\glssymbol{RBM}、\\glssymbol{DBN}~和~\\glssymbol{DBM}~中找到。\n \\item $p(\\RVh^{(k)}  \\mid \\RVh^{(k-1)}, \\RVx^{(k-1)})$指示在给定先前的\\gls{latent}状态和可见变量下如何更新\\gls{latent}状态变量。\n\\end{enumerate}\n\n\\gls{DAE}和~\\glssymbol{GSN}~不同于经典的概率模型（有向或无向），它们自己参数化生成过程而不是通过可见和\\gls{latent_variable}的联合分布的数学形式。\n相反，后者\\emph{如果存在则隐式}地定义为生成\\gls{markov_chain}的稳态分布。\n存在稳态分布的条件是温和的，并且需要与标准~\\glssymbol{mcmc}~方法相同的条件（见\\secref{sec:markov_chain_monte_carlo_methods}）。\n这些条件是保证链混合的必要条件，但它们可能被某些过渡分布的选择（例如，如果它们是确定性的）所违反。\n\n% -- 704 --\n\n我们可以想象~\\glssymbol{GSN}~不同的训练\\gls{criterion}。\n由~\\citet{Bengio-et-al-ICML-2014} 提出和评估的只对可见单元上对数概率的重建，如应用于\\gls{DAE}。\n通过将$\\RVx^{(0)} = \\Vx$ 夹合到观察到的样本并且在一些后续\\gls{time_step}处使生成$\\Vx$的概率最大化，即最大化$\\log p(\\RVx^{(k)} = \\Vx  \\mid  \\RVh^{(k)})$， 其中给定$\\RVx^{(0)} = \\Vx$后，$\\RVh^{(k)}$从链中采样。\n为了估计相对于模型其他部分的$\\log p(\\RVx^{(k)} = \\Vx  \\mid  \\RVh^{(k)})$的梯度，\\citet{Bengio-et-al-ICML-2014}使用了在\\secref{sec:back_propagation_through_random_operations}中介绍的\\gls{reparametrization_trick}。\n\n回退训练过程（在\\secref{sec:walk_back_training_procedure}中描述）可以用来改善训练~\\glssymbol{GSN}~的收敛性~\\citep{Bengio-et-al-ICML-2014} 。\n\n\n\\subsection{判别性\\,\\glssymbol{GSN}}\n\\label{sec:discriminant_gsns}\n\\glssymbol{GSN}的原始公式\\citep{Bengio-et-al-ICML-2014} 用于\\gls{unsupervised_learning}和对观察数据$\\RVx$的$p(\\RVx)$的隐式建模，但是我们可以修改框架来优化$p(\\RVy  \\mid  \\Vx)$。\n\n\n例如， \\citet{Zhou+Troyanskaya-ICML2014} 以如下方式推广~\\glssymbol{GSN}，只\\gls{back_propagation}输出变量上的重建对数概率，并保持输入变量固定。\n他们将这种方式成功应用于建模序列（蛋白质二级结构），并在\\gls{markov_chain}的转换算子中引入（一维）卷积结构。\n重要的是要记住，对于\\gls{markov_chain}的每一步，我们需要为每个层生成新序列，并且该序列用于在下一\\gls{time_step}计算其他层的值（例如下面一个和上面一个）的输入。\n\n因此，\\gls{markov_chain}确实不只是输出变量（与更高层的\\gls{hidden_layer}相关联），并且输入序列仅用于条件化该链，其中\\gls{back_propagation}使得它能够学习输入序列如何条件化由\\gls{markov_chain}隐含表示的输出分布。\n因此这是在结构化输出中使用~\\glssymbol{GSN}~的一个例子。\n\n\\citet{Zohrer+Pernkopf-NIPS2014-small} 引入了一个混合模型，通过简单地添加（使用不同的权重）监督和非监督成本即$\\RVy$和$\\RVx$的重建对数概率， 组合了监督目标（如上面的工作）和无监督目标（如原始的~\\glssymbol{GSN}）。\n\\citet{Larochelle+Bengio-2008-small}以前在~\\glssymbol{RBM}~中就提出了这样的混合标准。\n他们展示了在这种方案下分类性能的提升。\n\n% -- 705 --\n\n\\section{其他生成方案}\n\\label{sec:other_generation_schemes}\n目前为止我们已经描述的方法，使用~\\glssymbol{mcmc}~采样、\\gls{ancestral_sampling}或两者的一些混合来生成样本。\n虽然这些是\\gls{generative_modeling}中最流行的方法，但它们绝不是唯一的方法。\n\n\n\\citet{Sohl-Dickstein-et-al-ICML2015} 开发了一种基于非平衡热力学学习\\gls{generative_model}的\\,\\textbf{扩散反演}(diffusion inversion)训练方案。\n该方法基于我们希望从中采样的概率分布具有结构的想法。\n这种结构会被递增地使概率分布具有更多熵的扩散过程逐渐破坏。\n为了形成\\gls{generative_model}，我们可以反过来运行该过程，通过训练模型逐渐将结构恢复到非结构化分布。\n通过迭代地应用使分布更接近目标分布的过程，我们可以逐渐接近该目标分布。\n在涉及许多迭代以产生样本的意义上，这种方法类似于~\\glssymbol{mcmc}~方法。\n然而，模型被定义为由链的最后一步产生的概率分布。\n在这个意义上，没有由迭代过程诱导的近似。\n\\citet{Sohl-Dickstein-et-al-ICML2015} 介绍的方法也非常接近于\\gls{DAE}的生成解释（\\secref{sec:markov_chain_associated_with_any_denoising_autoencoder}）。\n与\\gls{DAE}一样， 扩散反演训练一个尝试概率地撤消添加的噪声效果的转移算子。\n不同之处在于，扩散反演只需要消除扩散过程的一个步骤，而不是一直返回到一个干净的数据点。\n这解决了\\gls{DAE}的普通重建对数似然目标中存在的以下两难问题：小噪声的情况下学习者只能看到数据点附近的配置， 而在大噪声的情况下，\\gls{DAE}被要求做几乎不可能的工作（因为去噪分布是高度复杂和\\gls{multimodal}的）。\n利用扩散反演目标，学习者可以更精确地学习数据点周围的密度形状，以及去除可能在远离数据点处出现的假性模式。\n\n样本生成的另一种方法是\\firstall{ABC}框架\\citep{rubin1984bayesianly}。\n在这种方法中，样本被拒绝或修改以使样本选定函数的\\gls{moment}匹配期望分布的那些\\gls{moment}。\n虽然这个想法与\\gls{moment_matching}一样使用样本的\\gls{moment}，但它不同于\\gls{moment_matching}，因为它修改样本本身，而不是训练模型来自动发出具有正确\\gls{moment}的样本。\n\\citet{BachmanP15} 展示了如何在深度学习的背景下使用~\\glssymbol{ABC}~中的想法，即使用~\\glssymbol{ABC}~来\\gls{shaping}~\\glssymbol{GSN}~的~\\glssymbol{mcmc}~轨迹。\n\n我们期待更多其他等待发现的\\gls{generative_modeling}方法。\n\n% -- 706 --\n\n\\section{评估\\glsentrytext{generative_model}}\n\\label{sec:evaluating_generative_models}\n\n研究\\gls{generative_model}的研究者通常需要将一个\\gls{generative_model}与另一个\\gls{generative_model}比较，通常是为了证明新发明的\\gls{generative_model}比之前存在的模型更能捕获一些分布。\n\n这可能是一个困难且微妙的任务。\n通常，我们不能实际评估模型下数据的对数概率，但仅可以评估一个近似。\n在这些情况下，重要的是思考和沟通清楚正在测量什么。\n例如，假设我们可以评估模型A对数似然的随机估计和模型B对数似然的确定性下界。\n如果模型A得分高于模型B，哪个更好？\n如果我们关心确定哪个模型具有分布更好的内部表示，我们实际上不能说哪个更好，除非我们有一些方法来确定模型B的边界有多松。\n然而，如果我们关心在实践中该模型能用得多好，例如执行异常检测，则基于特定于感兴趣的实际任务的准则，可以公平地说模型是更好的，例如基于排名测试样例和排名标准，如\\gls{precision}和\\gls{recall}。\n\n评估\\gls{generative_model}的另一个微妙之处是，评估指标往往是自身困难的研究问题。 \n可能很难确定模型是否被公平比较。\n例如，假设我们使用~\\glssymbol{AIS}~来估计$\\log Z$以便为我们刚刚发明的新模型计算$\\log \\tilde{p}(\\Vx) - \\log Z$。\n\\glssymbol{AIS}~计算经济的实现可能无法找到模型分布的几种模式并低估$Z$，这将导致我们高估$\\log p(\\Vx)$。\n因此可能难以判断高似然估计是否是良好模型或不好的~\\glssymbol{AIS}~实现导致的结果。\n \n机器学习的其他领域通常允许在数据预处理中有一些变化。\n例如，当比较\\gls{object_recognition}算法的准确性时，通常可接受的是对每种算法略微不同地预处理输入图像（基于每种算法具有何种输入要求）。\n而因为预处理的变化，会导致\\gls{generative_modeling}的不同，甚至非常小和微妙的变化也是完全不可接受的。\n对输入数据的任何更改都会改变要捕获的分布，并从根本上改变任务。\n例如，将输入乘以$0.1$将人为地将概率增加$10$倍。\n\n% -- 707 --\n\n预处理的问题通常在基于MNIST数据集上的\\gls{generative_model}产生，MNIST数据集是非常受欢迎的\\gls{generative_modeling}基准之一。\nMNIST由灰度图像组成。\n一些模型将MNIST图像视为实向量空间中的点，而其他模型将其视为二值。\n还有一些将灰度值视为二值样本的概率。\n我们必须将实值模型仅与其他实值模型比较，二值模型仅与其他二值模型进行比较。\n否则，测量的似然性不在相同的空间。\n对于二值模型，对数似然可以最多为零，而对于实值模型，它可以是任意高的，因为它是关于密度的测度。\n在二值模型中，比较使用完全相同的二值化模型是重要的。\n例如，我们可以将$0.5$设为阈值后，将灰度像素二值化为0或1，或者通过由灰度像素强度给出样本为1的概率来采一个随机样本。\n如果我们使用随机二值化，我们可能将整个数据集二值化一次，或者我们可能为每个训练步骤采不同的随机样例，然后采多个样本进行评估。\n这三个方案中的每一个都会产生极不相同的似然数，并且当比较不同的模型时，两个模型使用相同的二值化方案来训练和评估是重要的。\n事实上，应用单个随机二值化步骤的研究者共享包含随机二值化结果的文件，使得基于二值化步骤的不同输出的结果没有差别。\n\n因为从数据分布生成真实样本是\\gls{generative_model}的目标之一，所以实践者通常通过视觉检查样本来评估\\gls{generative_model}。\n在最好的情况下，这不是由研究人员本身，而是由不知道样品来源的实验受试者完成 \\citep{denton2015deep}。\n不幸的是，非常差的概率模型可能会产生非常好的样本。\n验证模型是否仅复制一些训练示例的常见做法如\\figref{fig:chap16_fig-ssrbm}所示。\n该想法是根据在$\\Vx$空间中的欧几里得距离，为一些生成的样本显示它们在训练集中的最近邻。\n此测试旨在检测模型\\gls{overfitting}训练集并仅再现训练实例的情况。\n甚至可能同时\\gls{underfitting}和\\gls{overfitting}，但仍然能产生单独看起来好的样本。\n想象一下，\\gls{generative_model}用狗和猫的图像训练时，但只是简单地学习来重现狗的训练图像。\n这样的模型明显\\gls{overfitting}，因为它不能产生不在训练集中的图像，但是它也\\gls{underfitting}，因为它不给猫的训练图像分配概率。\n然而，人类观察者将判断狗的每个个体图像都是高质量的。\n在这个简单的例子中，对于能够检查许多样本的人类观察者来说，确定猫的不存在是容易的。\n在更实际的设定中，在具有数万个模式的数据上训练后的\\gls{generative_model}可以忽略少数模式，并且人类观察者不能容易地检查或记住足够的图像以检测丢失的变化。\n\n% -- 708 --\n\n由于样本的视觉质量不是可靠的标准，所以当计算可行时，我们通常还评估模型分配给测试数据的对数似然。\n不幸的是，在某些情况下，似然性似乎不可能测量我们真正关心的模型的任何属性。\n例如，MNIST的实值模型可以将任意低的方差分配给从不改变的背景像素，获得任意高的似然。\n即使这不是一个非常有用的事情，检测这些常量特征的模型和算法可以获得无限的奖励。\n实现接近负无穷代价的可能性存在于任何实值的最大似然问题中，但是对于MNIST的\\gls{generative_model}问题尤为严重， 因为许多输出值是不需要预测的。\n这强烈地表明需要开发评估\\gls{generative_model}的其他方法。\n\n\n\\citet{Theis2015d} 回顾了评估\\gls{generative_model}所涉及的许多问题，包括上述的许多想法。\n他们强调了\\gls{generative_model}有许多不同的用途，并且指标的选择必须与模型的预期用途相匹配。\n例如，一些\\gls{generative_model}更好地为大多数真实的点分配高概率，而其他\\gls{generative_model}擅长于不将高概率分配给不真实的点。\n这些差异可能源于\\gls{generative_model}是设计为最小化$D_{\\text{KL}}(p_{\\text{data}} || p_{\\text{model}})$还是$D_{\\text{KL}}(p_{\\text{model}} || p_{\\text{data}})$，如\\figref{fig:chap3_kl_direction_color}所示。\n不幸的是，即使我们将每个指标的使用限制在最适合的任务上，目前使用的所有指标仍存在严重的缺陷。\n因此，\\gls{generative_modeling}中最重要的研究课题之一不仅仅是如何提升\\gls{generative_model}，事实上还包括了设计新的技术来衡量我们的进步。\n\n% -- 709 --\n\n\\section{结论}\n\\label{sec:conclusion}\n\n为了让模型理解表示在给定训练数据中的大千世界，训练具有\\gls{hidden_unit}的\\gls{generative_model}是一种有力方法。\n通过学习模型$p_{\\text{model}}(\\Vx)$和表示$p_{\\text{model}}(\\Vh  \\mid  \\Vx)$，\\gls{generative_model}可以解答$\\Vx$输入变量之间关系的许多\\gls{inference}问题， 并且可以在层次的不同层对$\\Vh$求期望来提供表示$\\Vx$的许多不同方式。\n\\gls{generative_model}承诺为~\\glssymbol{AI}~系统提供它们需要理解的、所有不同直观概念的框架，让它们有能力在面对不确定性的情况下推理这些概念。\n我们希望我们的读者能够找到增强这些方法的新途径，并继续探究学习和智能背后原理的旅程。\n"
  },
  {
    "path": "Chapter3/README.md",
    "content": "#第三章笔记\n"
  },
  {
    "path": "Chapter3/annotations.txt",
    "content": "{'user': 'acct:kkpoker@hypothes.is', 'text': '据此', 'origin_text': '方式来使用概率论。首先，概率法则告诉我们AI系统应该如何推理，  !!!所以!!!  我们设计一些算法来计算或者近似由概率论导出的表达式。其次，我们', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '逼近？拟合？\\n看了一下似乎应该是估算', 'origin_text': '法则告诉我们AI系统应该如何推理，所以我们设计一些算法来计算或者  !!!近似!!!  由概率论导出的表达式。其次，我们可以用概率和统计从理论上分析我', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '进行推理', 'origin_text': '。概率论使我们能够作出不确定的陈述以及在不确定性存在的情况下  !!!推理!!!  ，而信息论使我们能够量化概率分布中的不确定性总量。如果你已经', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '在设计时并不需要', 'origin_text': '指令。硬件错误确实会发生，但它们足够罕见，以至于大部分软件应用  !!!并不需要被设计为!!!  考虑这些因素的影响。鉴于很多计算机科学家和软件工程师在一个相对', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '是很令人吃惊的', 'origin_text': '师在一个相对干净和确定的环境中工作，机器学习对于概率论的大量使用  !!!不得不令人吃惊!!!  。这是因为机器学习必须始终处理不确定量，有时也可能需要处理随', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '可以用于表示和推理', 'origin_text': '，毕竟这方面的努力还是很脆弱，容易失败。尽管我们明确需要一种  !!!表示和推理!!!  不确定性的方法，但是概率论能够提供所有我们想要的人工智能领域的工', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '我们可以', 'origin_text': '具并不是那么显然。概率论最初的发展是为了分析事件发生的频率。  !!!可以!!!  很容易地看出概率论，对于像在扑克牌游戏中抽出一手特定的牌这种事件', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '尽管我们的确需要一种用以对不确定性进行表示和推理的方法，但是概率论并不能明显地提供我们在人工智能领域需要的工具。', 'origin_text': '很难应用、维持和沟通，毕竟这方面的努力还是很脆弱，容易失败。  !!!尽管我们明确需要一种表示和推理不确定性的方法，但是概率论能够提供所有我们想要的人工智能领域的工具并不是那么显然!!!  。概率论最初的发展是为了分析事件发生的频率。可以很容易地看出', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '概率论主要有两种用途', 'origin_text': '方法，也提供了用于导出新的不确定性陈述的公理。在人工智能领域，  !!!我们主要以两种方式来使用概率论!!!  。首先，概率法则告诉我们AI系统应该如何推理，所以我们设计一些', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '条', 'origin_text': '是完全确定的实体。程序员通常可以安全地假定CPU将完美地执行每  !!!个!!!  机器指令。硬件错误确实会发生，但它们足够罕见，以至于大部分软件', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '但它们罕见到', 'origin_text': '安全地假定CPU将完美地执行每个机器指令。硬件错误确实会发生，  !!!但它们足够罕见，以至于!!!  大部分软件应用并不需要被设计为考虑这些因素的影响。鉴于很多计算', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '“We can also create theoretical scenarios that we postulate to have random dynamics, such as…”\\ndynamics 应该是指动态而不再是上文中的动力学', 'origin_text': '，都将亚原子(subatomic)粒子的动力学描述为概率性的。  !!!我们还可以假定有随机动力学，并为此建立理论方案!!!  ，例如一个假想的纸牌游戏，我们假设纸牌真正混洗成随机顺序。', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '在一个假想的纸牌游戏中', 'origin_text': '概率性的。我们还可以假定有随机动力学，并为此建立理论方案，例如  !!!一个假想的纸牌游戏!!!  ，我们假设纸牌真正混洗成随机顺序。      不完全观测', 'time': '2017-02-18T12:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '意译成 可以足够逼真地容纳复杂的规则 ？', 'origin_text': '杂而确定的原则更为实用，即使真实的规则是确定的并且我们的模型系统  !!!对适应复杂规则具有很好的逼真度(fidelity)!!!  。例如，简单的原则”多数鸟儿都会飞”可以很容易应用并且使用广泛', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': 'develope 这里可译成描述？', 'origin_text': 'idelity)。例如，简单的原则”多数鸟儿都会飞”可以很容易  !!!应用!!!  并且使用广泛，而正式的规则，”除了那些非常小的还没学会飞翔的幼鸟', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '如果要列出一些关于不确定性的常识推理中我们希望其具有的性质', 'origin_text': '被称为频率概率；而后者，涉及到确定性水平，被称为贝叶斯概率。  !!!如果我们要列出一些，我们期望关于不确定性的常识推理具有的性质!!!  ，那么满足这些属性的唯一一点就是将贝叶斯概率和频率概率视为等同的', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '去掉', 'origin_text': '状计算她是否患病的概率。有关为什么一些小的常识假设能够导出相同  !!!的!!!  公理的细节必须深入了解这两种概率，参见{Ramsey1926}。', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '，可以在给定某些命题是真或假的假设下', 'origin_text': '被看作是用于处理不确定性的逻辑扩展。逻辑提供了一套形式化的规则  !!!在给定某些命题是真或假的假设下!!!  ，判断另外一些命题是真的还是假的。概率论提供了一套形式化的规则', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '用于在', 'origin_text': '，判断另外一些命题是真的还是假的。概率论提供了一套形式化的规则  !!!在!!!  给定一些命题的似然(likelihood)后，计算其他命题为真的', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '印刷体？', 'origin_text': '随机变量随机变量是可以随机地取不同值的变量。我们通常用  !!!打印机体!!!  的小写字母来表示随机变量本身，而用脚本字体中的小写字母来表示随机', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': 'script letter 手写体', 'origin_text': '值的变量。我们通常用打印机体的小写字母来表示随机变量本身，而用  !!!脚本字体!!!  中的小写字母来表示随机变量能够取到的值。例如，x1x1x_1和', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '是', 'origin_text': '计算当采用某个动作后会发生什么相混淆。假定某个人说德语，那么他  !!!可能是!!!  德国人的条件概率是非常高的，但是如果是随机选择的一个人会说德语，', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '不会因此而改变', 'origin_text': '条件概率是非常高的，但是如果是随机选择的一个人会说德语，他的国籍  !!!是不变的!!!  。计算一个行动的后果被称为干预查询。干预查询属于因果模型的范', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '变量大小的影响', 'origin_text': '如相关系数将每个变量的贡献归一化，为了只衡量变量的相关性，而不受  !!!变量大小的分别影响!!!  。协方差和相关性是有联系的，但实际上不同的概念。它们是有联', 'time': '2017-02-18T12:59'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '其中k是一个有限值', 'origin_text': '分类分布是指在具有kkk个不同状态的单个离散型随机变量上的分布，  !!!kkk是有限的!!!  。\\\\footnote{“multinoulli”这个术语是最近', 'time': '2017-02-18T13:00'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '任意', 'origin_text': 'oulli分布足够用来描述在它们领域内的任意分布。它们能够描述  !!!这些!!!  分布，不是因为它们特别强大，而是因为它们的领域很简单；它们可以', 'time': '2017-02-18T13:22'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': 'enumerate 枚举？', 'origin_text': '而是因为它们的领域很简单；它们可以对那些，能够将所有的状态进行  !!!标号!!!  的离散型随机变量，进行建模。当处理的是连续型随机变量时，会有不', 'time': '2017-02-18T13:24'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '有严格的限制', 'origin_text': '数无限多的状态，所以任何通过少量参数描述的概率分布都必须在分布上  !!!采用严格的极限!!!  。高斯分布对于实数上的分布最常用的就是正态分布，也称为高', 'time': '2017-02-18T13:28'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': 'uncountably many states 留下无限多就可以了？', 'origin_text': '号的离散型随机变量，进行建模。当处理的是连续型随机变量时，会有  !!!不可数无限多!!!  的状态，所以任何通过少量参数描述的概率分布都必须在分布上采用严格', 'time': '2017-02-18T13:29'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': 'to control the precision or inverse variance\\n原文的precision是斜体，所以这里or可以理解为后者是前者的解释？\\n分布的精确度(用方差的倒数来表示)', 'origin_text': 'β∈(0,∞)\\\\beta \\\\in (0, \\\\infty)，来控制  !!!分布的精度或者方差的倒数!!!  ：N(x;μ,β−1)=β2π−−−√exp(−12β(x−μ', 'time': '2017-02-18T13:49'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '含噪声的正态分布', 'origin_text': '服从正态分布。这意味着在实际中，很多复杂系统都可以被成功建模成  !!!正态分布的噪声!!!  ，即使系统可以被分解成具有更多结构化行为的各个部分。第二，在', 'time': '2017-02-18T14:00'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '一些更结构化的部分', 'origin_text': '多复杂系统都可以被成功建模成正态分布的噪声，即使系统可以被分解成  !!!具有更多结构化行为的各个部分!!!  。第二，在具有相同方差的所有可能的概率分布中，正态分布在实数', 'time': '2017-02-18T14:01'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': ' We can think of the Dirac delta function as being the limit point of a series of functions that put less and less mass on all points other than zero.', 'origin_text': '学对象，被称为广义函数，广义函数是依据积分性质定义的数学对象。  !!!我们可以把Dirac delta函数想成一系列函数的极限点，这一系列函数把除μμ\\\\mu以外的所有点的概率密度越变越小。!!!  通过把p(x)p(x)p(x)定义成δδ\\\\delta函数', 'time': '2017-02-19T02:51'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': 'Dirac delta函数只在定义连续型随机变量的经验分布时是必要的/只在定义连续型随机变量的经验分布时，Dirac delta函数才是必要的', 'origin_text': '}^{(m)}中的每一个，这些点是给定的数据集或者采样的集合。  !!!Dirac delta函数只对定义连续型随机变量的经验分布是必要的!!!  。对于离散型随机变量，情况更加简单：经验分布可以被定义成一个M', 'time': '2017-02-19T02:58'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '观测', 'origin_text': 'lpha_i = P(\\\\RSc = i)。“先验”一词表明了在  !!!观测到!!!  xx\\\\RSx\\\\emph{之前}传递给模型关于cc\\\\RSc的信念。', 'time': '2017-02-20T00:30'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': \"express the model's beliefs about c\\n\\n我也没想到翻译成什么…不过总感觉信念有点奇怪\", 'origin_text': '。“先验”一词表明了在观测到xx\\\\RSx\\\\emph{之前}传递  !!!给模型关于cc\\\\RSc的信念!!!  。作为对比，P(c∣\\\\bmx)P(c∣\\\\bmx)P(\\\\RSc ', 'time': '2017-02-20T02:50'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '贝叶斯公式', 'origin_text': ')ζ(−x)\\\\zeta(-x)进行操作，就像公式\\\\?中那样。  !!!贝叶斯规则!!!  我们经常会需要在已知P(y∣x)P(y∣x)P(\\\\RSy \\\\', 'time': '2017-02-20T01:00'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '变换\\n\\n\\ntransform包含平移和旋转，如脚注的Banach-Tarski定理', 'origin_text': '(fractal-shaped)的集合或者是通过有理数相关集合的  !!!平移!!!  来定义的集合。\\\\footnote{Banach-Tarski定', 'time': '2017-02-20T02:49'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '测度论更多的是用来描述那些适用于RnRn上的大多数点，却不适用于一些边界情况的定理', 'origin_text': '以测度论的这个方面不会成为一个相关考虑。对于我们的目的，  !!!测度论更多的是用来描述那些适用于RnRn\\\\SetR^n上的大多数点的定理的，而不是只适用于一些小的情况!!!  。测度论提供了一种严格的方式来描述那些非常微小的点集。这种集', 'time': '2017-02-20T02:49'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '除了一个测度为零的集合', 'origin_text': '几乎处处”。某个性质如果是几乎处处都成立的，那么它在整个空间中  !!!除了测度为零的集合!!!  以外都是成立的。因为这些例外只在空间中占有极其微小的量，它们在', 'time': '2017-02-20T02:57'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '相互之间有确定性函数关系', 'origin_text': '几乎处处”成立。连续型随机变量的另一技术细节，涉及到处理那种  !!!相互之间是彼此的确定性函数!!!  的连续型变量。假设我们有两个随机变量 xx\\\\RVx和yy\\\\RV', 'time': '2017-02-20T03:38'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '它给出了对依据概率分布 PP生成的符号进行编码所需的比特数的平均意义上的下界(当对数底数不是2时，单位将有所不同)。', 'origin_text': '，一个分布的香农熵是指遵循这个分布的事件所产生的期望信息总量。  !!!它给出了对，依据概率分布 PPP生成的符号，进行编码所需的比特数的平均意义上的下界(如果对数的底是2的话，否则单位有所不同)。!!!  那些接近确定性的分布(输出几乎可以确定)具有较低的熵；那些接近', 'time': '2017-02-20T07:55'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '去', 'origin_text': '一种被设计成能够使得概率分布 QQQ 产生的消息的长度最小的编码  !!!时，!!!  发送包含由概率分布 PPP产生的符号的消息时，所需要的额外信息量', 'time': '2017-02-20T08:02'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '交叉熵', 'origin_text': 'og Q(x).\\\\end{equation}针对QQQ最小化  !!!互信息!!!  等价于最小化KL散度，因为QQQ并不参与被省略的那一项。当计', 'time': '2017-02-20T08:14'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '因式分解更常见？', 'origin_text': 'RSc\\\\mid\\\\RSb).\\\\end{equation}这种  !!!因子分解!!!  可以极大地减少用来描述一个分布的参数的数量。每个因子使用的参数', 'time': '2017-02-20T08:24'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '由两两相连的点构成的集合', 'origin_text': '模型那样，这些函数通常不是任何类型的概率分布。GG\\\\CalG中  !!!任何全部相连的节点构成的集合!!!  被称为团。无向模型中的每个团C(i)C(i)\\\\CalC^{(i', 'time': '2017-02-20T08:28'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '我们仅仅将结构化概率模型视作一门语言', 'origin_text': '都可以用两种方式进行描述。在本书第\\\\?部分和第\\\\?部分中，   !!!我们使用结构化概率模型仅仅是作为一门语言!!!  ，来描述不同的机器学习算法选择表示的直接的概率关系。一直到研究', 'time': '2017-02-20T08:35'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '直到研究课题的讨论之前，不会需要对结构化概率模型的深入理解', 'origin_text': '为一门语言，来描述不同的机器学习算法选择表示的直接的概率关系。  !!!一直到研究课题的讨论之前，不会需要用到结构化概率模型的深入理解!!!  。在第\\\\?部分的研究课题中，我们会更为详尽地探讨结构化概率模型', 'time': '2017-02-20T08:41'}\n{'user': 'acct:knightwupz@hypothes.is', 'text': '翻译成父节点，和图论用语一致？', 'origin_text': 'ixi\\\\RSx_i条件概率的影响因子被称为xixi\\\\RSx_i的  !!!双亲!!!  ，记为PaG(xi)PaG(xi)Pa_\\\\CalG(\\\\RSx_i', 'time': '2017-02-28T15:11'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:swordyork@hypothes.is', 'text': '为了跟20章还有前面哪一章统一，我改成动态了。', 'time': '2017-03-06T05:23'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '嗯嗯，有道理。这样更符合数据结构的习惯。', 'time': '2017-03-04T02:54'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '感觉因式分解特指多项式的分解。。。[wiki](https://zh.wikipedia.org/wiki/%E5%9B%A0%E5%BC%8F%E5%88%86%E8%A7%A3)\\n原文是\\n> factorization\\n\\n英文的话没有那么特指，[wiki](https://en.wikipedia.org/wiki/Factorization)，还可以只矩阵的分解之类的，但是中文感觉找不到太好的对应词，我改成分解好了。', 'time': '2017-02-21T08:01'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里还是听你的翻译成变换吧，但事实上构造不可测集确实只用到了平移操作...对集合没有旋转一说...', 'time': '2017-02-21T06:17'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '确实中文的很多教材都直接称为贝叶斯公式，但原文是\\n> Bayes’ Rule\\n\\n我还是保留贝叶斯规则吧...', 'time': '2017-02-21T06:13'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是\\n> before it has observed x\\n\\n所以我翻译成”观测到“', 'time': '2017-02-21T06:09'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '感觉这种翻法很普遍啊。。。像belief network翻译成信念网络；belief propagation翻译成信念传播', 'time': '2017-02-21T06:08'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里是0，当时下意识写了`$\\\\mu$`', 'time': '2017-02-21T05:57'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是这样的\\n> many complicated systems can be modeled successfully as normally distributed noise\\n', 'time': '2017-02-21T05:43'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里不能只说”无限多“，因为在实分析里可数无限多和不可数无限多区别很大。像数列那种，就是可以把所有的状态枚举出来，属于可数无限多；但是像[0,1]内实数的个数这种，不能枚举，属于不可数无限多，一般称为连续统。', 'time': '2017-02-21T05:09'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里并不是任意分布，而是\\n> any distribution over their domain\\n\\n如果还是说”它们领域内的任意分布“和前面有点重复，所以我选择用”这些“来代替。', 'time': '2017-02-21T05:03'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '打印机体确实不对，原文是\\n> plain typeface\\n\\n直译为\"无格式字体\"，参考[wiki](https://zh.wikipedia.org/wiki/%E5%8D%B0%E5%88%B7%E4%BD%93)可以看到翻译成印刷体不是很合适...我也找不到一个恰当的翻译，实在不知道怎么描述这种字体...在LaTeX中，我是用`\\\\mathrm{x}`打出的这种字体，可以理解成罗马体。\\n\\n暂时先翻译成“无格式字体“吧', 'time': '2017-02-20T15:37'}\n{'user': 'acct:kkpoker@hypothes.is', 'text': '其实是感觉中文需要个主语，仅此而已(', 'time': '2017-02-20T15:12'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是\\n> It is easy to see how probability theory can be used to study events like drawing a certain hand of cards in a poker game.\\n\\n所以我还是没加“我们”', 'time': '2017-02-20T15:10'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里我重新翻了一下，改成\"我们还可以创建一些我们假设具有随机动力学的理论情境，例如一个假想的纸牌游戏，在这个游戏中我们假设纸牌真正混洗成了随机顺序。\"感觉动态一词很少见，还是保留动力学怎么样？', 'time': '2017-02-20T15:04'}"
  },
  {
    "path": "Chapter3/probability_and_information_theory.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Kai Li\n\\chapter{概率与信息论}\n\\label{chap:probability_and_information_theory}\n\n本章我们讨论概率论和信息论。\n\n概率论是用于表示不确定性\\gls{statement}的数学框架。\n%(statement要不要换一下说法)\n它不仅提供了量化不确定性的方法，也提供了用于导出新的不确定性\\firstgls{statement}的公理。\n在\\gls{AI}领域，概率论主要有两种用途。\n首先，概率法则告诉我们~\\glssymbol{AI}~系统如何推理，据此我们设计一些算法来计算或者估算由概率论导出的表达式。\n其次，我们可以用概率和统计从理论上分析我们提出的~\\glssymbol{AI}~系统的行为。\n\n概率论是众多科学学科和工程学科的基本工具。\n我们提供这一章，是为了确保那些背景偏软件工程而较少接触概率论的读者也可以理解本书的内容。\n\n概率论使我们能够提出不确定的\\gls{statement}以及在不确定性存在的情况下进行推理，而信息论使我们能够量化\\gls{PD}中的不确定性总量。\n\n如果你已经对概率论和信息论很熟悉了，那么除了\\secref{sec:structured_probabilistic_models_chap3}以外的整章内容，你都可以跳过。\n而在\\secref{sec:structured_probabilistic_models_chap3}中，我们会介绍用来描述机器学习中\\gls{structured_probabilistic_models}的图。\n即使你对这些主题没有任何的先验知识，本章对于完成深度学习的研究项目来说也已经足够，尽管如此我们还是建议你能够参考一些额外的资料，例如~\\cite{Jaynes03}。\n\n% -- 51 --\n\n\\section{为什么要使用概率？}\n\\label{sec:why_probability}\n\n计算机科学的许多分支处理的实体大部分都是完全确定且必然的。\n程序员通常可以安全地假定CPU将完美地执行每条机器指令。\n虽然硬件错误确实会发生，但它们足够罕见，以致于大部分软件应用在设计时并不需要考虑这些因素的影响。\n鉴于许多计算机科学家和软件工程师在一个相对干净和确定的环境中工作，机器学习对于概率论的大量使用是很令人吃惊的。\n\n这是因为机器学习通常必须处理不确定量，有时也可能需要处理随机(非确定性的)量。\n%(这里uncertain和stochastic有什么区别？)\n不确定性和随机性可能来自多个方面。\n至少从20世纪80年代开始，研究人员就对使用概率论来量化不确定性提出了令人信服的论据。\n这里给出的许多论据都是根据~\\cite{Pearl88}的工作总结或启发得到的。\n\n几乎所有的活动都需要一些在不确定性存在的情况下进行推理的能力。\n事实上，除了那些被定义为真的数学\\gls{statement}，我们很难认定某个命题是千真万确的或者确保某件事一定会发生。\n\n不确定性有三种可能的来源：\n\n\\begin{enumerate}\n\\item 被建模系统内在的随机性。\n例如，大多数\\gls{quantum_mechanics}的解释，都将\\gls{subatomic}粒子的动力学描述为概率的。\n我们还可以创建一些我们假设具有随机动态的理论情境，例如一个假想的纸牌游戏，在这个游戏中我们假设纸牌被真正混洗成了随机顺序。\n\n\\item 不完全观测。\n即使是确定的系统，当我们不能观测到所有驱动系统行为的变量时，该系统也会呈现随机性。\n例如，在Monty Hall问题中，一个游戏节目的参与者被要求在三个门之间选择，并且会赢得放置在选中门后的奖品。\n其中两扇门通向山羊，第三扇门通向一辆汽车。\n选手的每个选择所导致的结果是确定的，但是站在选手的角度，结果是不确定的。\n\n\\item 不完全建模。\n当我们使用一些必须舍弃某些观测信息的模型时，舍弃的信息会导致模型的预测出现不确定性。\n例如，假设我们制作了一个机器人，它可以准确地观察周围每一个对象的位置。\n在对这些对象将来的位置进行预测时，如果机器人采用的是离散化的空间，那么离散化的方法将使得机器人无法确定对象们的精确位置：因为每个对象都可能处于它被观测到的离散单元的任何一个角落。\n\\end{enumerate}\n\n% -- 52 --  \n\n在很多情况下，使用一些简单而不确定的规则要比复杂而确定的规则更为实用，即使真正的规则是确定的并且我们建模的系统可以足够精确地容纳复杂的规则。\n例如，``多数鸟儿都会飞''这个简单的规则描述起来很简单很并且使用广泛，而正式的规则——``除了那些还没学会飞翔的幼鸟，因为生病或是受伤而失去了飞翔能力的鸟，包括食火鸟(cassowary)、鸵鸟(ostrich)、几维(kiwi，一种新西兰产的无翼鸟)等不会飞的鸟类……以外，鸟儿会飞''，很难应用、维护和沟通，即使经过这么多的努力，这个规则还是很脆弱而且容易失效。\n\n尽管我们的确需要一种用以对不确定性进行表示和推理的方法，但是概率论并不能明显地提供我们在\\gls{AI}领域需要的所有工具。\n概率论最初的发展是为了分析事件发生的频率。\n我们可以很容易地看出概率论，对于像在扑克牌游戏中抽出一手特定的牌这种事件的研究中，是如何使用的。\n这类事件往往是可以重复的。\n当我们说一个结果发生的概率为$p$，这意味着如果我们反复实验(例如，抽取一手牌)无限次，有$p$的比例可能会导致这样的结果。\n这种推理似乎并不立即适用于那些不可重复的命题。\n如果一个医生诊断了病人，并说该病人患流感的几率为40\\%，这意味着非常不同的事情——我们既不能让病人有无穷多的副本，也没有任何理由去相信病人的不同副本在具有不同的潜在条件下表现出相同的症状。\n在医生诊断病人的例子中，我们用概率来表示一种\\firstgls{degree_of_belief}，其中1表示非常肯定病人患有流感，而0表示非常肯定病人没有流感。\n前面那种概率，直接与事件发生的频率相联系，被称为\\firstgls{frequentist_probability}；而后者，涉及到确定性水平，被称为\\firstgls{bayesian_probability}。\n\n关于不确定性的常识推理，如果我们已经列出了若干条我们期望它具有的性质，那么满足这些性质的唯一一种方法就是将\\gls{bayesian_probability}和\\gls{frequentist_probability}视为等同的。\n例如，如果我们要在扑克牌游戏中根据玩家手上的牌计算她能够获胜的概率，我们使用和医生情境完全相同的公式，就是我们依据病人的某些症状计算她是否患病的概率。\n为什么一小组常识性假设蕴含了必须是相同的公理控制两种概率？更多的细节参见~\\cite{Ramsey1926}。\n\n% -- 53 --\n\n概率可以被看作是用于处理不确定性的逻辑扩展。\n逻辑提供了一套形式化的规则，可以在给定某些命题是真或假的假设下，判断另外一些命题是真的还是假的。\n概率论提供了一套形式化的规则，可以在给定一些命题的\\gls{likelihood}后，计算其他命题为真的\\gls{likelihood}。\n\n\\section{\\glsentrytext{RV}}\n\\label{sec:random_variables}\n\n\\firstgls{RV}是可以随机地取不同值的变量。\n我们通常用无格式字体(plain typeface)中的小写字母来表示\\gls{RV}本身，而用手写体中的小写字母来表示\\gls{RV}能够取到的值。\n例如，$x_1$和$x_2$都是\\gls{RV}~$\\RSx$可能的取值。\n对于向量值变量，我们会将\\gls{RV}写成$\\RVx$，它的一个可能取值为$\\Vx$。\n就其本身而言，一个\\gls{RV}只是对可能的状态的描述；它必须伴随着一个\\gls{PD}来指定每个状态的可能性。\n\n\\gls{RV}可以是离散的或者连续的。\n离散\\gls{RV}拥有有限或者可数无限多的状态。\n注意这些状态不一定非要是整数；它们也可能只是一些被命名的状态而没有数值。\n连续\\gls{RV}伴随着实数值。\n\n\\section{\\glsentrytext{PD}}\n\\label{sec:probability_distributions}\n\n\\firstgls{PD}用来描述\\gls{RV}或一簇\\gls{RV}在每一个可能取到的状态的可能性大小。\n我们描述\\gls{PD}的方式取决于\\gls{RV}是离散的还是连续的。\n\n\\subsection{离散型变量和\\glsentrytext{PMF}}\n\\label{sec:discrete_variables_and_probability_mass_functions}\n\n离散型变量的\\gls{PD}可以用\\firstall{PMF}\\footnote{译者注：国内有些教材也将它翻译成概率分布律。}来描述。\n我们通常用大写字母$P$来表示\\gls{PMF}。\n通常每一个\\gls{RV}都会有一个不同的\\gls{PMF}，并且读者必须根据\\gls{RV}来推断所使用的~\\glssymbol{PMF}，而不是根据函数的名称来推断；例如，$P(\\RSx)$ 通常和$P(\\RSy)$不一样。\n\n% -- 54 --\n\n\\gls{PMF}将\\gls{RV}能够取得的每个状态映射到\\gls{RV}取得该状态的概率。\n$\\RSx = x$的概率用$P(x)$来表示，概率为1表示$\\RSx = x$是确定的，概率为0表示$\\RSx=x$是不可能发生的。\n有时为了使得\\glssymbol{PMF}的使用不相互混淆，我们会明确写出\\gls{RV}的名称：$P(\\RSx = x)$。\n有时我们会先定义一个\\gls{RV}，然后用$\\sim$符号来说明它遵循的分布：$\\RSx\\sim P(\\RSx)$。\n\n\\gls{PMF}可以同时作用于多个\\gls{RV}。\n这种多个变量的\\gls{PD}被称为\\firstgls{joint_probability_distribution}。\n$P(\\RSx = x, \\RSy = y)$表示$\\RSx = x$和$\\RSy = y$同时发生的概率。我们也可以简写为$P(x, y)$。\n\n如果一个函数$P$是\\gls{RV} $\\RSx$的~\\glssymbol{PMF}，必须满足下面这几个条件：\n\\begin{itemize}\n\\item $P$的定义域必须是$\\RSx$所有可能状态的集合。\n\n\\item $\\forall x \\in \\RSx, 0\\le P(x)\\le 1.$不可能发生的事件概率为0，并且不存在比这概率更低的状态。\n类似的，能够确保一定发生的事件概率为1，而且不存在比这概率更高的状态。\n\n\\item $\\sum_{x \\in \\RSx} P(x) = 1.$我们把这条性质称之为\\firstgls{normalized}。\n如果没有这条性质，当我们计算很多事件其中之一发生的概率时可能会得到大于1的概率。\n\\end{itemize}\n\n例如，考虑一个离散型\\gls{RV} $\\RSx$有$k$个不同的状态。\n我们可以假设$\\RSx$是\\firstgls{uniform_distribution}的（也就是将它的每个状态视为等可能的），通过将它的\\glssymbol{PMF}设为\n\\begin{equation}\nP(\\RSx = x_i) = \\frac{1}{k}\n\\end{equation}\n对于所有的$i$都成立。\n我们可以看出这满足上述成为\\gls{PMF}的条件。\n因为$k$是一个正整数，所以$\\frac{1}{k}$是正的。我们也可以看出\n\\begin{equation}\n\\sum_i P(\\RSx = x_i) = \\sum_i \\frac{1}{k} = \\frac{k}{k} = 1,\n\\end{equation}\n因此分布也满足归一化条件。\n\n% -- 55 --\n\n\\subsection{连续型变量和\\glsentrytext{PDF}}\n\\label{sec:continuous_variables_and_probability_density_functions}\n\n当我们研究的对象是连续型\\gls{RV}时，我们用\\firstall{PDF}而不是\\gls{PMF}来描述它的\\gls{PD}。\n如果一个函数$p$是\\gls{PDF}，必须满足下面这几个条件：\n\\begin{itemize}\n\\item $p$的定义域必须是$\\RSx$所有可能状态的集合。\n\n\\item $\\forall x \\in \\RSx, p(x)\\ge 0.$注意，我们并不要求$p(x)\\le 1$。\n\n\\item $\\int p(x) dx = 1.$\n\\end{itemize}\n\n\\gls{PDF} $p(x)$并没有直接对特定的状态给出概率，相对的，它给出了落在面积为$\\delta x$ 的无限小的区域内的概率为$p(x)\\delta x$。\n\n我们可以对\\gls{PDF}求积分来获得点集的真实概率质量。\n特别地，$x$落在集合$\\SetS$中的概率可以通过$p(x)$对这个集合求积分来得到。\n在单变量的例子中，$x$落在区间$[a, b]$的概率是$\\int_{[a,b]} p(x)dx$。\n\n为了给出一个连续型\\gls{RV}的~\\glssymbol{PDF}~的例子，我们可以考虑实数区间上的\\gls{uniform_distribution}。\n我们可以使用函数$u(x; a, b)$，其中$a$和$b$是区间的端点且满足$b>a$。\n符号``$;$''表示``以什么为参数''；我们把$x$作为函数的自变量，$a$和$b$作为定义函数的参数。\n为了确保区间外没有概率，我们对所有的$x\\not\\in[a,b]$，令$u(x; a, b)=0$。\n在$[a,b]$内，有$u(x; a, b)= \\frac{1}{b-a}$。\n我们可以看出任何一点都非负。\n另外，它的积分为1。我们通常用$\\RSx \\sim U(a, b)$表示$x$在$[a, b]$上是\\gls{uniform_distribution}的。\n\n\\section{边缘概率}\n\\label{sec:marginal_probability}\n\n有时候，我们知道了一组变量的\\gls{joint_probability_distribution}，但想要了解其中一个子集的\\gls{PD}。\n这种定义在子集上的\\gls{PD}被称为\\firstgls{marginal_probability_distribution}。\n\n例如，假设有离散型\\gls{RV} $\\RSx$和$\\RSy$，并且我们知道$P(\\RSx, \\RSy)$。\n我们可以依据下面的\\firstgls{sum_rule}来计算$P(\\RSx)$：\n\\begin{equation}\n\\forall x \\in \\RSx, P(\\RSx = x) = \\sum_y P(\\RSx = x, \\RSy = y).\n\\end{equation}\n\n% -- 56 --\n\n``边缘概率''的名称来源于手算边缘概率的计算过程。\n当$P(\\RSx, \\RSy)$的每个值被写在由每行表示不同的$x$值，每列表示不同的$y$值形成的网格中时，对网格中的每行求和是很自然的事情，然后将求和的结果$P(x)$写在每行右边的纸的边缘处。\n\n对于连续型变量，我们需要用积分替代求和：\n\\begin{equation}\np(x) = \\int p(x, y)dy.\n\\end{equation}\n\n\\section{\\glsentrytext{conditional_probability}}\n\\label{sec:conditional_probability}\n\n在很多情况下，我们感兴趣的是某个事件，在给定其他事件发生时出现的概率。\n这种概率叫做\\gls{conditional_probability}。\n我们将给定$\\RSx = x$，$\\RSy = y$发生的\\gls{conditional_probability}记为$P(\\RSy = y\\mid \\RSx =x)$。\n这个\\gls{conditional_probability}可以通过下面的公式计算：\n\\begin{equation}\nP(\\RSy = y\\mid \\RSx = x) = \\frac{P(\\RSy = y, \\RSx = x)}{P(\\RSx = x)} .\n\\label{eq:3.5}\n\\end{equation}\n\\gls{conditional_probability}只在$P(\\RSx = x)>0$时有定义。\n我们不能计算给定在永远不会发生的事件上的\\gls{conditional_probability}。\n\n这里需要注意的是，不要把\\gls{conditional_probability}和计算当采用某个动作后会发生什么相混淆。\n假定某个人说德语，那么他是德国人的\\gls{conditional_probability}是非常高的，但是如果随机选择的一个人会说德语，他的国籍不会因此而改变。\n计算一个行动的后果被称为\\firstgls{intervention_query}。\n\\gls{intervention_query}属于\\firstgls{causal_modeling}的范畴，我们不会在本书中讨论。\n\n\\section{\\glsentrytext{conditional_probability}的\\glsentrytext{chain_rule}}\n\\label{sec:the_chain_rule_of_conditional_probabilities}\n\n任何多维\\gls{RV}的\\gls{joint_probability_distribution}，都可以分解成只有一个变量的\\gls{conditional_probability}相乘的形式：\n\\begin{equation}\nP(\\RSx^{(1)}, \\ldots, \\RSx^{(n)}) = P(\\RSx^{(1)}) \\Pi_{i=2}^n P(\\RSx^{(i)} \\mid \\RSx^{(1)}, \\ldots, \\RSx^{(i-1)}) .\n\\label{eq:chap3_chain_rule}\n\\end{equation}\n\n% -- 57 --\n\n这个规则被称为概率的\\firstgls{chain_rule}或者\\firstgls{product_rule}。\n它可以直接从\\eqnref{eq:3.5}\\gls{conditional_probability}的定义中得到。\n例如，使用两次定义可以得到\n\\begin{eqnarray*}\nP(\\RSa, \\RSb, \\RSc) &=& P(\\RSa \\mid \\RSb, \\RSc) P(\\RSb, \\RSc)\\\\\nP(\\RSb, \\RSc) &=& P(\\RSb \\mid \\RSc) P(\\RSc)\\\\\nP(\\RSa, \\RSb, \\RSc) &=& P(\\RSa \\mid \\RSb, \\RSc) P(\\RSb \\mid \\RSc) P(\\RSc).\n\\end{eqnarray*}\n\n\\section{独立性和条件独立性}\n\\label{sec:independence_and_conditional_independence}\n\n两个\\gls{RV} $\\RSx$和$\\RSy$，如果它们的\\gls{PD}可以表示成两个因子的乘积形式，并且一个因子只包含$\\RSx$另一个因子只包含$\\RSy$，我们就称这两个\\gls{RV}是\\firstgls{independent}：\n\\begin{equation}\n\\forall x \\in \\RSx, y \\in \\RSy, p(\\RSx = x, \\RSy = y) = p(\\RSx = x)p(\\RSy = y).\n\\end{equation}\n\n如果关于$\\RSx$和$\\RSy$的\\gls{conditional_probability}分布对于$z$的每一个值都可以写成乘积的形式，那么这两个\\gls{RV} $\\RSx$和$\\RSy$在给定\\gls{RV}~$z$时是\\firstgls{conditionally_independent}：\n\\begin{equation}\n\\forall x \\in \\RSx, y \\in \\RSy, z \\in \\RSz, p( \\RSx=x, \\RSy=y \\mid \\RSz=z) =\np(\\RSx = x \\mid \\RSz = z) p(\\RSy = y \\mid \\RSz = z).\n\\end{equation}\n\n我们可以采用一种简化形式来表示独立性和条件独立性：$\\RSx \\bot \\RSy$表示$\\RSx$和$\\RSy$相互独立，$\\RSx \\bot \\RSy \\mid \\RSz$表示$\\RSx$和$\\RSy$在给定$\\RSz$时条件独立。\n\n\\section{\\glsentrytext{expectation}、\\glsentrytext{variance}和\\glsentrytext{covariance}}\n\\label{sec:expectation_variance_and_covariance}\n\n函数$f(x)$关于某分布$P(\\RSx)$的\\firstgls{expectation}或者\\firstgls{expected_value}是指，当$x$由$P$产生，$f$作用于$x$时，$f(x)$的平均值。\n对于离散型\\gls{RV}，这可以通过求和得到：\n\\begin{equation}\n\\SetE_{\\RSx \\sim P}[f(x)] = \\sum_x P(x)f(x),\n\\end{equation}\n对于连续型\\gls{RV}可以通过求积分得到：\n\\begin{equation}\n\\SetE_{\\RSx \\sim p}[f(x)] = \\int p(x)f(x)dx.\n\\end{equation}\n当\\gls{PD}在上下文中指明时，我们可以只写出\\gls{expectation}作用的\\gls{RV}的名称来进行简化，例如$\\SetE_{\\RSx}[f(x)]$。\n如果\\gls{expectation}作用的\\gls{RV}也很明确，我们可以完全不写脚标，就像$\\SetE[f(x)]$。\n默认地，我们假设$\\SetE[\\cdot]$表示对方括号内的所有\\gls{RV}的值求平均。\n类似的，当没有歧义时，我们还可以省略方括号。\n\n% -- 58 --\n\n\\gls{expectation}是线性的，例如，\n\\begin{equation}\n\\SetE_{\\RSx}[\\alpha f(x) + \\beta g(x)] = \\alpha \\SetE_{\\RSx}[f(x)] + \\beta \\SetE_{\\RSx}[g(x)],\n\\end{equation}\n其中$\\alpha$和$\\beta$不依赖于$x$。\n\n\\firstgls{variance}衡量的是当我们对$x$依据它的\\gls{PD}进行采样时，\\gls{RV} $\\RSx$的函数值会呈现多大的差异：\n\\begin{equation}\n\\Var(f(x)) = \\SetE \\left [(f(x) - \\SetE[f(x)])^2 \\right].\n\\end{equation}\n当\\gls{variance}很小时，$f(x)$的值形成的簇比较接近它们的\\gls{expected_value}。\\gls{variance}的平方根被称为\\firstgls{standard_deviation}。\n\n\\firstgls{covariance}在某种意义上给出了两个变量线性相关性的强度以及这些变量的尺度：\n\\begin{equation}\n\\Cov(f(x), g(y)) = \\SetE[ ( f(x)-\\SetE[f(x)] )( g(y)-\\SetE[g(y)] ) ].\n\\end{equation}\n\\gls{covariance}的绝对值如果很大则意味着变量值变化很大并且它们同时距离各自的均值很远。\n如果\\gls{covariance}是正的，那么两个变量都倾向于同时取得相对较大的值。\n如果\\gls{covariance}是负的，那么其中一个变量倾向于取得相对较大的值的同时，另一个变量倾向于取得相对较小的值，反之亦然。\n其他的衡量指标如\\firstgls{correlation}将每个变量的贡献归一化，为了只衡量变量的相关性而不受各个变量尺度大小的影响。\n\n\\gls{covariance}和相关性是有联系的，但实际上是不同的概念。\n它们是有联系的，因为两个变量如果相互独立那么它们的\\gls{covariance}为零，如果两个变量的\\gls{covariance}不为零那么它们一定是相关的。\n然而，独立性又是和\\gls{covariance}完全不同的性质。\n两个变量如果\\gls{covariance}为零，它们之间一定没有线性关系。\n独立性比零\\gls{covariance}的要求更强，因为独立性还排除了非线性的关系。\n两个变量相互依赖但具有零\\gls{covariance}是可能的。\n例如，假设我们首先从区间$[-1, 1]$上的\\gls{uniform_distribution}中采样出一个实数$x$。\n然后我们对一个\\gls{RV} $s$进行采样。\n$s$以$\\frac{1}{2}$的概率值为1，否则为-1。\n我们可以通过令$y=sx$来生成一个\\gls{RV} $y$。\n显然，$x$和$y$不是相互独立的，因为$x$完全决定了$y$的尺度。\n然而，$\\Cov(x,y)=0$。\n\n% -- 59 --\n\n随机向量$\\Vx \\in \\SetR^n$的\\firstgls{covariance_matrix}是一个$n\\times n$的矩阵，并且满足\n\\begin{equation}\n\\Cov(\\RVx)_{i,j} = \\Cov(\\RSx_i, \\RSx_j).\n\\end{equation}\n\\gls{covariance_matrix}的对角元是方差：\n\\begin{equation}\n\\Cov(\\RSx_i, \\RSx_i) = \\Var(\\RSx_i).\n\\end{equation}\n\n\\section{常用\\glsentrytext{PD}}\n\\label{sec:common_probability_distributions}\n\n许多简单的\\gls{PD}在机器学习的众多领域中都是有用的。\n\n\\subsection{\\glsentrytext{bernoulli_distribution}}\n\\label{sec:bernoulli_distribution}\n\n\\firstgls{bernoulli_distribution}是单个二值\\gls{RV}的分布。\n它由单个参数$\\phi \\in [0, 1]$控制，$\\phi$给出了\\gls{RV}等于1的概率。\n它具有如下的一些性质：\n\\begin{gather}\nP(\\RSx =1) = \\phi\\\\\nP(\\RSx =0) = 1-\\phi\\\\\nP(\\RSx = x) = \\phi^x (1-\\phi)^{1-x}\\\\\n\\SetE_{\\RSx}[\\RSx] = \\phi\\\\\n\\Var_{\\RSx}(\\RSx) = \\phi(1-\\phi)\n\\end{gather}\n\n\\subsection{\\glsentrytext{multinoulli_distribution}}\n\\label{sec:multinoulli_distribution}\n\n\\firstgls{multinoulli_distribution}或者\\firstgls{categorical_distribution}是指在具有$k$个不同状态的单个离散型\\gls{RV}上的分布，其中$k$是一个有限值。\\footnote{``multinoulli''这个术语是最近被Gustavo Lacerdo发明、被\\cite{MurphyBook2012}推广的。\n\\gls{multinoulli_distribution}是\\firstgls{multinomial_distribution}的一个特例。\n\\gls{multinomial_distribution}是$\\{0,\\ldots, n\\}^k$中的向量的分布，用于表示当对~\\gls{multinoulli_distribution}采样$n$次时$k$个类中的每一个被访问的次数。\n很多文章使用``\\gls{multinomial_distribution}''而实际上说的是~\\gls{multinoulli_distribution}，但是他们并没有说是对$n=1$的情况，这点需要注意。}\n\\gls{multinoulli_distribution}由向量$\\Vp \\in [0, 1]^{k-1}$参数化，其中每一个分量$p_i$表示第$i$个状态的概率。\n最后的第$k$个状态的概率可以通过$1-\\Vone^\\top \\Vp$给出。\n注意我们必须限制$\\Vone^\\top \\Vp \\le 1$。\n\\gls{multinoulli_distribution}经常用来表示对象分类的分布，所以我们很少假设状态1具有数值1之类的。\n因此，我们通常不需要去计算~\\gls{multinoulli_distribution}的\\gls{RV}的\\gls{expectation}和\\gls{variance}。\n\n% -- 60 --\n\n\\gls{bernoulli_distribution}和~\\gls{multinoulli_distribution}足够用来描述在它们领域内的任意分布。\n它们能够描述这些分布，不是因为它们特别强大，而是因为它们的领域很简单；\n它们可以对那些，能够将所有的状态进行枚举的离散型\\gls{RV}进行建模。\n当处理的是连续型\\gls{RV}时，会有不可数无限多的状态，所以任何通过少量参数描述的\\gls{PD}都必须在分布上加以严格的限制。\n\n\\subsection{\\glsentrytext{gaussian_distribution}}\n\\label{sec:gaussian_distribution}\n\n\n实数上最常用的分布就是\\firstgls{normal_distribution}，也称为\\firstgls{gaussian_distribution}：\n\\begin{equation}\n\\CalN(x; \\mu, \\sigma^2) = \\sqrt{\\frac{1}{2\\pi \\sigma^2}} \\exp \\left ( -\\frac{1}{2\\sigma^2} (x-\\mu)^2 \\right ).\n\\end{equation}\n\n\\figref{fig:chap3_normal_color}画出了\\gls{normal_distribution}的\\gls{PDF}。\n% fig 3.1\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/normal_color}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{\\gls{normal_distribution}。\n\\gls{normal_distribution} $\\CalN(x; \\mu, \\sigma^2)$呈现经典的``钟形曲线''的形状，其中中心峰的$x$坐标由$\\mu$给出，峰的宽度受$\\sigma$控制。\n在这个示例中，我们展示的是\\firstgls{standard_normal_distribution}，其中$\\mu=0, \\sigma = 1$。}\n\\label{fig:chap3_normal_color}\n\\end{figure}\n\n\\gls{normal_distribution}由两个参数控制，$\\mu \\in \\SetR$和$\\sigma \\in (0, \\infty)$。\n参数$\\mu$给出了中心峰值的坐标，这也是分布的均值：$\\SetE[\\RSx] = \\mu$。\n分布的\\gls{standard_error}用$\\sigma$表示，\\gls{variance}用$\\sigma^2$表示。\n\n当我们要对\\gls{PDF}求值时，我们需要对$\\sigma$平方并且取倒数。\n当我们需要经常对不同参数下的\\gls{PDF}求值时，一种更高效的参数化分布的方式是使用参数$\\beta \\in (0, \\infty)$，来控制分布的\\firstgls{precision}(或方差的倒数)：\n\\begin{equation}\n\\CalN(x; \\mu, \\beta^{-1}) = \\sqrt{\\frac{\\beta}{2\\pi}} \\exp \\left(  -\\frac{1}{2}\\beta (x-\\mu)^2 \\right).\n\\label{eq:3.22}\n\\end{equation}\n\n采用\\gls{normal_distribution}在很多应用中都是一个明智的选择。\n当我们由于缺乏关于某个实数上分布的先验知识而不知道该选择怎样的形式时，\\gls{normal_distribution}是默认的比较好的选择，其中有两个原因。\n\n% -- 61 --\n\n第一，我们想要建模的很多分布的真实情况是比较接近\\gls{normal_distribution}的。\n\\firstgls{central_limit_theorem}说明很多独立\\gls{RV}的和近似服从\\gls{normal_distribution}。\n这意味着在实际中，很多复杂系统都可以被成功地建模成\\gls{normal_distribution}的噪声，即使系统可以被分解成一些更结构化的部分。\n\n第二，在具有相同方差的所有可能的\\gls{PD}中，\\gls{normal_distribution}在实数上具有最大的不确定性。\n因此，我们可以认为\\gls{normal_distribution}是对模型加入的先验知识量最少的分布。\n充分利用和证明这个想法需要更多的数学工具，我们推迟到\\secref{sec:calculus_of_variations}进行讲解。\n\n\\gls{normal_distribution}可以推广到$\\SetR^n$空间，这种情况下被称为\\firstgls{multivariate_normal_distribution}。\n它的参数是一个正定对称矩阵$\\VSigma$：\n\\begin{equation}\n\\label{eq:3.23}\n\\CalN(\\Vx; \\Vmu, \\VSigma) = \\sqrt{ \\frac{1}{ (2\\pi)^n \\det(\\VSigma)}}  \\exp \\left ( -\\frac{1}{2} (\\Vx-\\Vmu)^\\top \\VSigma^{-1} (\\Vx- \\Vmu) \\right).\n\\end{equation}\n\n参数$\\Vmu$仍然表示分布的均值，只不过现在是向量值。\n参数$\\VSigma$给出了分布的\\gls{covariance_matrix}。\n和单变量的情况类似，当我们希望对很多不同参数下的\\gls{PDF}多次求值时，\\gls{covariance_matrix}并不是一个很高效的参数化分布的方式，因为对\\gls{PDF}求值时需要对$\\VSigma$求逆。\n我们可以使用一个\\firstgls{precision_matrix} $\\Vbeta$ 进行替代：\n\\begin{equation}\n\\CalN(\\Vx; \\Vmu, \\Vbeta^{-1}) = \\sqrt{ \\frac{\\det(\\Vbeta)}{ (2\\pi)^n}}  \\exp \\left ( -\\frac{1}{2} (\\Vx-\\Vmu)^\\top \\Vbeta (\\Vx- \\Vmu) \\right).\n\\end{equation}\n\n% -- 62 --\n\n我们常常把\\gls{covariance_matrix}固定成一个对角阵。\n一个更简单的版本是\\firstgls{isotropic}\\gls{gaussian_distribution}，它的\\gls{covariance_matrix}是一个标量乘以单位阵。\n\n\\subsection{\\glsentrytext{exponential_distribution}和\\glsentrytext{laplace_distribution}}\n\\label{sec:exponential_and_laplace_distributions}\n\n在深度学习中，我们经常会需要一个在$x=0$点处取得边界点(sharp point)的分布。\n为了实现这一目的，我们可以使用\\firstgls{exponential_distribution}：\n\\begin{equation}\np(x; \\lambda) = \\lambda \\Vone_{x\\ge 0} \\exp(-\\lambda x).\n\\end{equation}\n指数分布使用\\gls{indicator_function}(indicator function)$\\Vone_{x\\ge 0}$来使得当$x$取负值时的概率为零。\n\n一个联系紧密的\\gls{PD}是\\firstgls{laplace_distribution}，它允许我们在任意一点$\\mu$处设置概率质量的峰值\n\\begin{equation}\n\\label{eq:chap3_laplace}\n\\text{Laplace}(x; \\mu, \\gamma) = \\frac{1}{2\\gamma} \\exp \\left( -\\frac{|x-\\mu|}{\\gamma}  \\right).\n\\end{equation}\n\n\\subsection{\\glsentrytext{dirac_distribution}和\\glsentrytext{empirical_distribution}}\n\\label{sec:the_dirac_distribution_and_empirical_distribution}\n\n在一些情况下，我们希望概率分布中的所有质量都集中在一个点上。\n这可以通过\\firstgls{dirac_delta_function} $\\delta(x)$定义\\gls{PDF}来实现：\n\\begin{equation}\np(x) = \\delta(x-\\mu).\n\\end{equation}\n\\gls{dirac_delta_function}被定义成在除了0以外的所有点的值都为0，但是积分为1。\n\\gls{dirac_delta_function}不像普通函数一样对$x$的每一个值都有一个实数值的输出，它是一种不同类型的数学对象，被称为\\firstgls{generalized_function}，\\gls{generalized_function}是依据积分性质定义的数学对象。\n我们可以把~\\gls{dirac_delta_function}想成一系列函数的极限点，这一系列函数把除0以外的所有点的概率密度越变越小。\n\n% -- 63 --\n\n通过把$p(x)$定义成$\\delta$函数左移$-\\mu$个单位，我们得到了一个在$x=\\mu$ 处具有无限窄也无限高的峰值的概率质量。\n\n\\gls{dirac_distribution}经常作为\\firstgls{empirical_distribution}的一个组成部分出现：\n\\begin{equation}\n\\hat{p}(\\Vx) = \\frac{1}{m} \\sum_{i=1}^m \\delta(\\Vx - \\Vx^{(i)})\n\\end{equation}\n\\gls{empirical_distribution}将概率密度$\\frac{1}{m}$赋给$m$个点$\\Vx^{(1)}, \\ldots, \\Vx^{(m)}$中的每一个，这些点是给定的数据集或者采样的集合。\n只有在定义连续型\\gls{RV}的经验分布时，\\gls{dirac_delta_function}才是必要的。\n对于离散型\\gls{RV}，情况更加简单：\\gls{empirical_distribution}可以被定义成一个~\\gls{multinoulli_distribution}，对于每一个可能的输入，其概率可以简单地设为在训练集上那个输入值的\\firstgls{empirical_frequency}。\n\n当我们在训练集上训练模型时，我们可以认为从这个训练集上得到的\\gls{empirical_distribution}指明了我们采样来源的分布。\n关于\\gls{empirical_distribution}另外一种重要的观点是，它是训练数据的似然最大的那个概率密度函数(见\\secref{sec:maximum_likelihood_estimation})。\n\n\\subsection{分布的混合}\n\\label{sec:mixtures_of_distributions}\n\n通过组合一些简单的\\gls{PD}来定义新的\\gls{PD}也是很常见的。\n一种通用的组合方法是构造\\firstgls{mixture_distribution}。\n混合分布由一些组件(component)分布构成。\n每次实验，样本是由哪个组件分布产生的取决于从一个~\\gls{multinoulli_distribution}中采样的结果：\n\\begin{equation}\nP(\\RSx) = \\sum_i P(\\RSc = i) P(\\RSx \\mid \\RSc = i),\n\\end{equation}\n这里$P(\\RSc)$是对各组件的一个~\\gls{multinoulli_distribution}。\n\n我们已经看过一个混合分布的例子了：实值变量的\\gls{empirical_distribution}对于每一个训练实例来说，就是以~\\gls{dirac_distribution}为组件的混合分布。\n\n% -- 64 --\n\n混合模型是组合简单\\gls{PD}来生成更丰富的分布的一种简单策略。\n在\\chapref{chap:structured_probabilistic_models_for_deep_learning}中，我们更加详细地探讨从简单\\gls{PD}构建复杂模型的技术。\n\n混合模型使我们能够一瞥以后会用到的一个非常重要的概念——\\firstgls{latent_variable}。\n\\gls{latent_variable}是我们不能直接观测到的\\gls{RV}。\n混合模型的组件标识变量$\\RSc$就是其中一个例子。\n\\gls{latent_variable}在联合分布中可能和$\\RSx$有关，在这种情况下，$P(\\RSx, \\RSc) = P(\\RSx \\mid \\RSc)P(\\RSc)$。\n\\gls{latent_variable}的分布$P(\\RSc)$以及关联\\gls{latent_variable}和观测变量的条件分布$P(\\RSx \\mid\\RSc)$，共同决定了分布$P(\\RSx)$的形状，尽管描述$P(\\RSx)$时可能并不需要\\gls{latent_variable}。\n\\gls{latent_variable}将在\\secref{sec:learning_about_dependencies}中深入讨论。\n\n一个非常强大且常见的混合模型是\\firstgls{GMM}，它的组件$p(\\RVx \\mid \\RSc= i)$是\\gls{gaussian_distribution}。\n每个组件都有各自的参数，均值$\\Vmu^{(i)}$和\\gls{covariance_matrix} $\\VSigma^{(i)}$。\n有一些混合可以有更多的限制。\n例如，\\gls{covariance_matrix}可以通过$\\VSigma^{(i)} = \\VSigma, \\forall i$的形式在组件之间共享参数。\n和单个\\gls{gaussian_distribution}一样，\\gls{GMM}有时会限制每个组件的\\gls{covariance_matrix}为对角的或者各向同性的(标量乘以单位矩阵）。\n\n除了均值和\\gls{covariance}以外，\\gls{GMM}的参数指明了给每个组件$i$的\\firstgls{prior_probability} $\\alpha_i = P(\\RSc = i)$。\n``先验''一词表明了在观测到$\\RVx$~\\emph{之前}传递给模型关于$\\RSc$的信念。\n作为对比，$P(\\RSc \\mid \\Vx)$是\\firstgls{posterior_probability}，因为它是在观测到$\\RSx$\\emph{之后}进行计算的。\n\\gls{GMM}是概率密度的\\firstgls{universal_approximator}，在这种意义下，任何平滑的概率密度都可以用具有足够多组件的\\gls{GMM}以任意精度来逼近。\n\n\\figref{fig:chap3_mog_color}演示了某个\\gls{GMM}生成的样本。\n% fig 3.2\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/mog_color}}\n\\fi\n\\caption{来自\\gls{GMM}的样本。\n在这个示例中，有三个组件。\n从左到右，第一个组件具有\\gls{isotropic}的协方差矩阵，这意味着它在每个方向上具有相同的方差。 第二个组件具有对角的协方差矩阵，这意味着它可以沿着每个轴的对齐方向单独控制方差。\n该示例中，沿着$x_2$轴的方差要比沿着$x_1$轴的方差大。 第三个组件具有满秩的协方差矩阵，使它能够沿着任意基的方向单独地控制方差。}\n\\label{fig:chap3_mog_color}\n\\end{figure}\n\n\n\\section{常用函数的有用性质}\n\\label{sec:useful_properties_of_common_functions}\n\n某些函数在处理\\gls{PD}时经常会出现，尤其是深度学习的模型中用到的\\gls{PD}。\n\n% -- 65 --\n\n其中一个函数是~\\textbf{\\gls{logistic_sigmoid}}~函数：\n\\begin{equation}\n\\sigma(x) = \\frac{1}{1+\\exp(-x)}.\n\\end{equation}\n\\gls{logistic_sigmoid}~函数通常用来产生~\\gls{bernoulli_distribution}中的参数$\\phi$，因为它的范围是$(0,1)$，处在$\\phi$的有效取值范围内。\n\\figref{fig:chap3_sigmoid_color}给出了sigmoid函数的图示。\nsigmoid函数在变量取绝对值非常大的正值或负值时会出现\\firstgls{saturate}现象，意味着函数会变得很平，并且对输入的微小改变会变得不敏感。\n% fig 3.3\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/sigmoid_color}}\n\\fi\n\\caption{\\gls{logistic_sigmoid}函数。}\n\\label{fig:chap3_sigmoid_color}\n\\end{figure}\n\n另外一个经常遇到的函数是\\firstgls{softplus_function}\\citep{Dugas01}：\n\\begin{equation}\n\\zeta(x) = \\log(1+\\exp(x)).\n\\end{equation}\n\\gls{softplus_function}可以用来产生\\gls{normal_distribution}的$\\beta$和$\\sigma$参数，因为它的范围是$(0,\\infty)$。\n当处理包含sigmoid函数的表达式时它也经常出现。\n\\gls{softplus_function}名来源于它是另外一个函数的平滑（或``软化''）形式，这个函数是\n\\begin{equation}\nx^+ = \\max(0, x).\n\\end{equation}\n\\figref{fig:chap3_softplus_color}给出了~\\gls{softplus_function}的图示。\n% fig 3.4\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/softplus_color}}\n\\fi\n\\caption{\\gls{softplus_function}。}\n\\label{fig:chap3_softplus_color}\n\\end{figure}\n\n\n% -- 66 --\n\n下面一些性质非常有用，你可能要记下来：\n\\begin{gather}\n\\sigma(x) = \\frac{\\exp(x)}{\\exp(x)+\\exp(0)}\\\\\n\\frac{d}{dx} \\sigma(x) = \\sigma(x)(1 - \\sigma(x))\\\\\n1-\\sigma(x) = \\sigma(-x)\\\\\n\\log \\sigma(x) = -\\zeta(-x)\\\\\n\\frac{d}{dx} \\zeta(x) = \\sigma(x)\\\\\n\\forall x \\in (0, 1), \\sigma^{-1}(x) = \\log \\left (  \\frac{x}{1-x} \\right)\\\\\n\\forall x>0, \\zeta^{-1}(x) = \\log(\\exp(x) - 1)\\\\\n\\zeta(x) = \\int_{-\\infty}^x \\sigma(y) dy\\\\\n\\zeta(x) - \\zeta(-x) = x\n\\label{eq:3.41}\n\\end{gather}\n函数$\\sigma^{-1}(x)$在统计学中被称为\\firstgls{logit}，但这个函数在机器学习中很少用到。\n\n% -- 67 --\n\n\\eqnref{eq:3.41}为函数名``softplus''提供了其他的正当理由。\n\\gls{softplus_function}被设计成\\firstgls{positive_part_function}的平滑版本，这个\\gls{positive_part_function}是指$x^+ = \\max \\{ 0, x\\}$。\n与\\gls{positive_part_function}相对的是\\firstgls{negative part function} $x^- = \\max\\{ 0, -x\\}$。\n为了获得类似\\gls{negative part function}的一个平滑函数，我们可以使用$\\zeta(-x)$。\n就像$x$可以用它的正部和负部通过等式$x^+ - x^- = x$恢复一样，我们也可以用同样的方式对$\\zeta(x)$和$\\zeta(-x)$进行操作，就像\\eqnref{eq:3.41}中那样。\n\n\\section{\\glsentrytext{bayes_rule}}\n\\label{sec:bayes_rule}\n\n我们经常会需要在已知$P(\\RSy \\mid \\RSx)$时计算$P(\\RSx \\mid \\RSy)$。\n幸运的是，如果还知道$P(\\RSx)$，我们可以用\\firstgls{bayes_rule}来实现这一目的：\n\\begin{equation}\nP(\\RSx \\mid \\RSy) = \\frac{P(\\RSx) P(\\RSy \\mid \\RSx)}{P(\\RSy)}.\n\\end{equation}\n注意到$P(\\RSy)$出现在上面的公式中，它通常使用$P(\\RSy) = \\sum_x P(\\RSy \\mid x) P(x)$来计算，所以我们并不需要事先知道$P(\\RSy)$的信息。\n\n\\gls{bayes_rule}可以从\\gls{conditional_probability}的定义直接推导得出，但我们最好记住这个公式的名字，因为很多文献通过名字来引用这个公式。\n这个公式是以牧师Thomas Bayes的名字来命名的，他是第一个发现这个公式特例的人。\n这里介绍的一般形式由Pierre-Simon Laplace独立发现。\n\n\\section{连续型变量的技术细节}\n\\label{sec:technical_details_of_continuous_variables}\n\n连续型\\gls{RV}和\\gls{PDF}的深入理解需要用到数学分支\\firstgls{measure_theory}的相关内容来扩展概率论。\n\\gls{measure_theory}超出了本书的范畴，但我们可以简要勾勒一些\\gls{measure_theory}用来解决的问题。\n\n在\\secref{sec:continuous_variables_and_probability_density_functions}中，我们已经看到连续型向量值\\gls{RV} $\\RVx$落在某个集合$\\SetS$ 中的概率是通过$p(\\Vx)$对集合$\\SetS$积分得到的。\n对于集合$\\SetS$的一些选择可能会引起悖论。\n例如，构造两个集合$\\SetS_1$和$\\SetS_2$使得$p(\\Vx\\in \\SetS_1) + p(\\Vx\\in \\SetS_2)>1$并且$\\SetS_1 \\cap \\SetS_2 = \\emptyset$是可能的。\n这些集合通常是大量使用了实数的无限精度来构造的，例如通过构造分形形状(fractal-shaped)的集合或者是通过有理数相关集合的变换定义的集合。\\footnote{Banach-Tarski定理给出了这类集合的一个有趣的例子。\n译者注：我们这里把``the set of rational numbers''翻译成``有理数相关集合''，理解为``一些有理数组成的集合''，如果直接用后面的翻译读起来会比较拗口。}\n\\gls{measure_theory}的一个重要贡献就是提供了一些集合的特征使得我们在计算概率时不会遇到悖论。\n在本书中，我们只对相对简单的集合进行积分，所以\\gls{measure_theory}的这个方面不会成为一个相关考虑。\n\n% -- 68 --\n\n对于我们的目的，\\gls{measure_theory}更多的是用来描述那些适用于$\\SetR^n$上的大多数点，却不适用于一些边界情况的定理。\n\\gls{measure_theory}提供了一种严格的方式来描述那些非常微小的点集。\n这种集合被称为``\\firstgls{measure_zero}''的。\n我们不会在本书中给出这个概念的正式定义。\n然而，直观地理解这个概念是有用的，我们可以认为零测度集在我们的度量空间中不占有任何的体积。\n例如，在$\\SetR^2$空间中，一条直线的测度为零，而填充的多边形具有正的测度。\n类似的，一个单独的点的测度为零。\n可数多个零测度集的并仍然是零测度的(所以所有有理数构成的集合测度为零)。\n\n另外一个有用的\\gls{measure_theory}中的术语是``\\firstgls{almost_everywhere}''。\n某个性质如果是几乎处处都成立的，那么它在整个空间中除了一个测度为零的集合以外都是成立的。\n因为这些例外只在空间中占有极其微小的量，它们在多数应用中都可以被放心地忽略。\n概率论中的一些重要结果对于离散值成立但对于连续值只能是``几乎处处''成立。\n\n连续型\\gls{RV}的另一技术细节，涉及到处理那种相互之间有确定性函数关系的连续型变量。\n假设我们有两个\\gls{RV} $\\RVx$和$\\RVy$满足$\\Vy = g(\\Vx)$，其中$g$是可逆的、连续可微的函数。\n可能有人会想$p_y(\\Vy) = p_x(g^{-1}(\\Vy))$。\n但实际上这并不对。\n\n举一个简单的例子，假设我们有两个标量值\\gls{RV} $\\RSx$和$\\RSy$，并且满足$\\RSy= \\frac{\\RSx}{2}$以及$\\RSx \\sim U(0, 1)$。\n如果我们使用$p_y(y) = p_x(2y)$，那么$p_y$ 除了区间$[0, \\frac{1}{2}]$以外都为0，并且在这个区间上的值为1。\n这意味着\n\\begin{equation}\n\\int p_y(y)dy = \\frac{1}{2},\n\\end{equation}\n而这违背了概率密度的定义(积分为1)。\n这个常见错误之所以错是因为它没有考虑到引入函数$g$后造成的空间变形。\n回忆一下，$\\Vx$落在无穷小的体积为$\\delta \\Vx$的区域内的概率为$p(\\Vx)\\delta\\Vx$。\n因为$g$可能会扩展或者压缩空间，在$\\Vx$空间内的包围着$\\Vx$ 的无穷小体积在$\\Vy$空间中可能有不同的体积。\n\n% -- 69 --\n\n为了看出如何改正这个问题，我们回到标量值的情况。\n我们需要保持下面这个性质：\n\\begin{equation}\n|p_y(g(x))dy| = |p_x(x)dx|.\n\\end{equation}\n求解上式，我们得到\n\\begin{equation}\np_y(y) = p_x(g^{-1}(y)) \\left \\vert \\frac{\\partial x}{\\partial y} \\right \\vert\n\\end{equation}\n或者等价地，\n\\begin{equation}\np_x(x) = p_y(g(x)) \\left | \\frac{\\partial g(x)}{\\partial x} \\right |.\n\\end{equation}\n在高维空间中，微分运算扩展为\\firstgls{jacobian_matrix}的行列式——矩阵的每个元素为$J_{i, j} = \\frac{\\partial x_i}{\\partial y_j}$。\n因此，对于实值向量$\\Vx$和$\\Vy$，\n\\begin{equation}\n\\label{eqn:3.47}\np_x(\\Vx) = p_y(g(\\Vx)) \\left | \\det \\left ( \\frac{\\partial g(\\Vx)}{\\partial \\Vx} \\right) \\right |.\n\\end{equation}\n\n\\section{信息论}\n\\label{sec:information_theory}\n\n信息论是应用数学的一个分支，主要研究的是对一个信号包含信息的多少进行量化。\n它最初被发明是用来研究在一个含有噪声的信道上用离散的字母表来发送消息，例如通过无线电传输来通信。\n在这种情况下，信息论告诉我们如何对消息设计最优编码以及计算消息的期望长度，这些消息是使用多种不同编码机制、从特定的\\gls{PD}上采样得到的。\n在机器学习中，我们也可以把信息论应用于连续型变量，此时某些消息长度的解释不再适用。\n信息论是电子工程和计算机科学中许多领域的基础。\n在本书中，我们主要使用信息论的一些关键思想来描述\\gls{PD}或者量化\\gls{PD}之间的相似性。\n有关信息论的更多细节，参见~\\cite{cover-book2006}或者~\\cite{MacKay03}。\n\n信息论的基本想法是一个不太可能的事件居然发生了，要比一个非常可能的事件发生，能提供更多的信息。\n消息说：``今天早上太阳升起''信息量是如此之少以至于没有必要发送，但一条消息说：``今天早上有日食''信息量就很丰富。\n\n% -- 70 --\n\n我们想要通过这种基本想法来量化信息。\n特别地，\n\\begin{itemize}\n\\item 非常可能发生的事件信息量要比较少，并且极端情况下，确保能够发生的事件应该没有信息量。\n\n\\item 较不可能发生的事件具有更高的信息量。\n\n\\item 独立事件应具有增量的信息。\n例如，投掷的硬币两次正面朝上传递的信息量，应该是投掷一次硬币正面朝上的信息量的两倍。\n\\end{itemize}\n\n为了满足上述三个性质，我们定义一个事件$\\RSx = x$的\\firstgls{self_information}为\n\\begin{equation}\nI(x) = -\\log P(x).\n\\end{equation}\n在本书中，我们总是用$\\log$来表示自然对数，其底数为$e$。\n因此我们定义的$I(x)$单位是\\firstgls{nats}。\n一奈特是以$\\frac{1}{e}$的概率观测到一个事件时获得的信息量。\n其他的材料中使用底数为2的对数，单位是\\firstgls{bits}或者\\firstgls{shannons}；通过比特度量的信息只是通过奈特度量信息的常数倍。\n\n当$\\RSx$是连续的，我们使用类似的关于信息的定义，但有些来源于离散形式的性质就丢失了。\n例如，一个具有单位密度的事件信息量仍然为0，但是不能保证它一定发生。\n\n\\gls{self_information}只处理单个的输出。\n我们可以用\\firstgls{Shannon_entropy}来对整个\\gls{PD}中的不确定性总量进行量化：\n\\begin{equation}\nH(\\RSx) = \\SetE_{\\RSx \\sim P}[I(x)] = -\\SetE_{\\RSx \\sim P}[\\log P(x)],\n\\end{equation}\n也记作$H(P)$。\n换言之，一个分布的\\gls{Shannon_entropy}是指遵循这个分布的事件所产生的期望信息总量。\n它给出了对依据\\gls{PD} $P$生成的符号进行编码所需的比特数在平均意义上的下界(当对数底数不是2时，单位将有所不同)。\n那些接近确定性的分布(输出几乎可以确定)具有较低的熵；那些接近\\gls{uniform_distribution}的\\gls{PD}具有较高的熵。\n\\figref{fig:chap3_entropy_demo_color}给出了一个说明。\n当$\\RSx$是连续的，\\gls{Shannon_entropy}被称为\\firstgls{differential_entropy}。\n% fig 3.5\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/entropy_demo_color}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{二值随机变量的\\gls{Shannon_entropy}。%此处不翻译为``二元随机变量''，是因为元表示自变量\n该图说明了更接近确定性的分布是如何具有较低的\\gls{Shannon_entropy}，而更接近\\gls{uniform_distribution}的分布是如何具有较高的\\gls{Shannon_entropy}。\n水平轴是$p$，表示二值随机变量等于1的概率。\n熵由$(p-1)\\log(1-p) - p\\log p$给出。\n当$p$接近0时，分布几乎是确定的，因为随机变量几乎总是0。\n当$p$接近1时，分布也几乎是确定的，因为随机变量几乎总是1。\n当$p = 0.5$时，熵是最大的，因为分布在两个结果（0和1）上是均匀的。}\n\\label{fig:chap3_entropy_demo_color}\n\\end{figure}\n\n\n% -- 71 --\n\n如果我们对于同一个\\gls{RV} $\\RSx$有两个单独的\\gls{PD} $P(\\RSx)$和$Q(\\RSx)$，我们可以使用\\firstgls{KL_divergence}来衡量这两个分布的差异：\n\\begin{equation}\nD_{\\text{KL}}(P||Q) = \\SetE_{\\RSx \\sim P} \\left [  \\log \\frac{P(x)}{Q(x)} \\right ] = \\SetE_{\\RSx \\sim P} [\\log P(x) - \\log Q(x)].\n\\end{equation}\n\n在离散型变量的情况下，\\gls{KL_divergence}衡量的是，当我们使用一种被设计成能够使得\\gls{PD} $Q$ 产生的消息的长度最小的编码，发送包含由\\gls{PD} $P$产生的符号的消息时，所需要的额外信息量(如果我们使用底数为2的对数时，信息量用比特衡量，但在机器学习中，我们通常用奈特和自然对数。)\n\n\\gls{KL_divergence}有很多有用的性质，最重要的是它是非负的。\n\\gls{KL_divergence}为0当且仅当$P$和$Q$在离散型变量的情况下是相同的分布，或者在连续型变量的情况下是``几乎处处''相同的。\n因为~\\gls{KL_divergence}是非负的并且衡量的是两个分布之间的差异，它经常被用作分布之间的某种距离。\n然而，它并不是真的距离因为它不是对称的：对于某些$P$和$Q$，$D_\\text{KL}(P||Q) \\ne D_\\text{KL}(Q||P)$。\n这种非对称性意味着选择$D_\\text{KL}(P||Q)$还是$D_\\text{KL}(Q||P)$影响很大。\n更多细节可以看\\figref{fig:chap3_kl_direction_color}。\n% fig 3.6\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/kl_direction_color}}\n\\fi\n\\caption{\\gls{KL_divergence}是不对称的。\n假设我们有一个分布$p(x)$，并且希望用另一个分布$q(x)$来近似它。\n我们可以选择最小化$D_\\text{KL}(p||q)$或最小化$D_\\text{KL}(q||p)$。\n为了说明每种选择的效果，我们令$p$是两个\\gls{gaussian_distribution}的混合，令$q$为单个\\gls{gaussian_distribution}。\n选择使用~\\gls{KL_divergence}的哪个方向是取决于问题的。\n一些应用需要这个近似分布$q$在真实分布$p$放置高概率的所有地方都放置高概率，而其他应用需要这个近似分布$q$在真实分布$p$放置低概率的所有地方都很少放置高概率。 \n\\gls{KL_divergence}方向的选择反映了对于每种应用，优先考虑哪一种选择。\n\\emph{(左)}最小化$D_\\text{KL}(p||q)$的效果。\n在这种情况下，我们选择一个$q$使得它在$p$具有高概率的地方具有高概率。\n当$p$具有多个峰时，$q$选择将这些峰模糊到一起，以便将高概率质量放到所有峰上。 \n\\emph{(右)}最小化$D_\\text{KL}(q||p)$的效果。\n在这种情况下，我们选择一个$q$使得它在$p$具有低概率的地方具有低概率。\n当$p$具有多个峰并且这些峰间隔很宽时，如该图所示，最小化~\\gls{KL_divergence}会选择单个峰，以避免将概率质量放置在$p$的多个峰之间的低概率区域中。\n这里，我们说明当$q$被选择成强调左边峰时的结果。\n我们也可以通过选择右边峰来得到~\\gls{KL_divergence}相同的值。\n如果这些峰没有被足够强的低概率区域分离，那么~\\gls{KL_divergence}的这个方向仍然可能选择模糊这些峰。}\n\\label{fig:chap3_kl_direction_color}\n\\end{figure}\n\n\n% -- 72 --\n\n一个和~\\gls{KL_divergence}密切联系的量是\\firstgls{cross_entropy} $H(P, Q) = H(P) + D_\\text{KL}(P||Q)$，它和~\\gls{KL_divergence}很像但是缺少左边一项：\n\\begin{equation}\nH(P, Q) = -\\SetE_{\\RSx\\sim P} \\log Q(x).\n\\end{equation}\n针对$Q$最小化\\gls{cross_entropy}等价于最小化~\\gls{KL_divergence}，因为$Q$并不参与被省略的那一项。\n\n当我们计算这些量时，经常会遇到$0\\log 0$这个表达式。\n按照惯例，在信息论中，我们将这个表达式处理为$\\lim_{x \\to 0} x\\log x = 0$。\n\n% -- 73 --\n\n\\section{\\glsentrytext{structured_probabilistic_models}}\n\\label{sec:structured_probabilistic_models_chap3}\n\n机器学习的算法经常会涉及到在非常多的\\gls{RV}上的\\gls{PD}。\n通常，这些\\gls{PD}涉及到的直接相互作用都是介于非常少的变量之间的。\n使用单个函数来描述整个\\gls{joint_probability_distribution}是非常低效的(无论是计算上还是统计上)。\n\n我们可以把\\gls{PD}分解成许多因子的乘积形式，而不是使用单一的函数来表示\\gls{PD}。\n例如，假设我们有三个\\gls{RV} $\\RSa, \\RSb$和$\\RSc$，并且$\\RSa$影响$\\RSb$的取值，$\\RSb$影响$\\RSc$的取值，但是$\\RSa$和$\\RSc$在给定$\\RSb$时是条件独立的。\n我们可以把全部三个变量的\\gls{PD}重新表示为两个变量的\\gls{PD}的连乘形式：\n\\begin{equation}\np(\\RSa, \\RSb, \\RSc) = p(\\RSa)p(\\RSb\\mid \\RSa)p(\\RSc\\mid\\RSb).\n\\end{equation}\n\n这种\\gls{factorization}可以极大地减少用来描述一个分布的参数数量。\n每个因子使用的参数数目是它的变量数目的指数倍。\n这意味着，如果我们能够找到一种使每个因子分布具有更少变量的分解方法，我们就能极大地降低表示联合分布的成本。\n\n我们可以用图来描述这种\\gls{factorization}。\n这里我们使用的是图论中的``图''的概念：由一些可以通过边互相连接的顶点的集合构成。\n当我们用图来表示这种\\gls{PD}的\\gls{factorization}，我们把它称为\\firstgls{structured_probabilistic_model}或者\\firstgls{graphical_model}。\n\n有两种主要的\\gls{structured_probabilistic_models}：有向的和无向的。\n两种图模型都使用图$\\CalG$，其中图的每个节点对应着一个\\gls{RV}，连接两个\\gls{RV}的边意味着\\gls{PD}可以表示成这两个\\gls{RV}之间的直接作用。\n\n\\firstgls{directed}模型使用带有有向边的图，它们用\\gls{conditional_probability}分布来表示\\gls{factorization}，就像上面的例子。\n特别地，有向模型对于分布中的每一个\\gls{RV} $\\RSx_i$都包含着一个影响因子，这个组成$\\RSx_i$\\gls{conditional_probability}的影响因子被称为$\\RSx_i$的父节点，记为$Pa_\\CalG(\\RSx_i)$：\n\\begin{equation}\np(\\RVx) = \\prod_i p(\\RSx_i \\mid Pa_\\CalG(\\RSx_i)).\n\\end{equation}\n\\figref{fig:chap3_directed}给出了一个有向图的例子以及它表示的\\gls{PD}的\\gls{factorization}。\n% fig 3.7\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/directed}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{关于随机变量$\\RSa, \\RSb, \\RSc, \\RSd$和$\\RSe$的有向图模型。\n这幅图对应的概率分布可以分解为\n\\begin{equation}\np(\\RSa, \\RSb, \\RSc, \\RSd, \\RSe) = p(\\RSa) p(\\RSb \\mid \\RSa) p(\\RSc \\mid \\RSa, \\RSb) p(\\RSd \\mid \\RSb) p(\\RSe \\mid \\RSc).\n\\end{equation}\n该图模型使我们能够快速看出此分布的一些性质。\n例如，$\\RSa$和$\\RSc$直接相互影响，但$\\RSa$和$\\RSe$只有通过$\\RSc$间接相互影响。}\n\\label{fig:chap3_directed}\n\\end{figure}\n\n\n% -- 74 --\n\n\\firstgls{undirected}模型使用带有无向边的图，它们将\\gls{factorization}表示成一组函数；不像有向模型那样，这些函数通常不是任何类型的\\gls{PD}。\n$\\CalG$中任何满足两两之间有边连接的顶点的集合被称为团。\n无向模型中的每个团$\\CalC^{(i)}$都伴随着一个因子$\\phi^{(i)}(\\CalC^{(i)})$。\n 这些因子仅仅是函数，并不是\\gls{PD}。\n 每个因子的输出都必须是非负的，但是并没有像\\gls{PD}中那样要求因子的和或者积分为1。\n\n\\gls{RV}的联合概率与所有这些因子的乘积\\firstgls{proportional}——意味着因子的值越大则可能性越大。\n当然，不能保证这种乘积的求和为1。\n所以我们需要除以一个归一化常数$Z$来得到归一化的\\gls{PD}，归一化常数$Z$被定义为$\\phi$函数乘积的所有状态的求和或积分。\n\\gls{PD}为：\n\\begin{equation}\np(\\RVx) = \\frac{1}{Z} \\prod_i \\phi^{(i)} \\left (\\CalC^{(i)} \\right).\n\\end{equation}\n\\figref{fig:chap3_undirected}给出了一个无向图的例子以及它表示的\\gls{PD}的\\gls{factorization}。\n% fig 3.8\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/undirected}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{关于随机变量$\\RSa, \\RSb, \\RSc, \\RSd$和$\\RSe$的无向图模型。\n这幅图对应的概率分布可以分解为\n\\begin{equation}\np(\\RSa, \\RSb, \\RSc, \\RSd, \\RSe) = \\frac{1}{Z} \\phi^{(1)} (\\RSa, \\RSb, \\RSc) \\phi^{(2)}(\\RSb, \\RSd) \\phi^{(3)} (\\RSc, \\RSe).\n\\end{equation}\n该图模型使我们能够快速看出此分布的一些性质。\n例如，$\\RSa$和$\\RSc$直接相互影响，但$\\RSa$和$\\RSe$只有通过$\\RSc$间接相互影响。}\n\\label{fig:chap3_undirected}\n\\end{figure}\n\n\n% -- 75 --\n\n请记住，这些图模型表示的\\gls{factorization}仅仅是描述\\gls{PD}的一种语言。\n它们不是互相排斥的\\gls{PD}族。\n有向或者无向不是\\gls{PD}的特性；它是\\gls{PD}的一种特殊\\firstgls{description}所具有的特性，而任何\\gls{PD}都可以用这两种方式进行描述。\n\n在本书第\\ref{part:applied_math_and_machine_learning_basics}部分和第\\ref{part:deep_networks_modern_practices}部分中， 我们仅仅将\\gls{structured_probabilistic_models}视作一门语言，来描述不同的机器学习算法选择表示的直接的概率关系。\n在讨论研究课题之前，读者不需要更深入地理解\\gls{structured_probabilistic_models}。\n在第\\ref{part:deep_learning_research}部分的研究课题中，我们将更为详尽地探讨\\gls{structured_probabilistic_models}。\n\n本章复习了概率论中与深度学习最为相关的一些基本概念。\n我们还剩下一些基本的数学工具需要讨论：数值方法。\n\n% -- 76 --\n"
  },
  {
    "path": "Chapter4/README.md",
    "content": "#第四章笔记\n"
  },
  {
    "path": "Chapter4/annotations.txt",
    "content": "{'user': 'acct:EmisXXY@hypothes.is', 'text': '一组两两正交的特征向量', 'origin_text': '为Hessian矩阵是实对称的，我们可以将其分解成一组实特征值和  !!!特征向量的正交!!!  。在特定方向dd\\\\Vd上的二阶导数可以写成d⊤Hdd⊤Hd\\\\V', 'time': '2017-01-26T09:31'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '直接“计算机”如何？感觉加个数字很别扭。', 'origin_text': '括优化（找到最小化或最大化函数值的参数）和线性方程组的求解。对  !!!数字计算机!!!  来说实数无法在有限内存下精确表示，因此仅仅计算涉及实数的函数也是', 'time': '2017-02-02T08:26'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改成“这里通常是指迭代法，而不是直接给出解析解的直接法。”如何？', 'origin_text': '           机器学习算法通常需要大量的数值计算。  !!!这通常是指通过迭代地更新解来解决数学问题的算法，而不是解析地提供正确解的符号表达。!!!  常见的操作包括优化（找到最小化或最大化函数值的参数）和线性方程', 'time': '2017-02-02T08:33'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改为“因此即使是计算实数域上的函数也是困难的。”如何？', 'origin_text': '性方程组的求解。对数字计算机来说实数无法在有限内存下精确表示，  !!!因此仅仅计算涉及实数的函数也是困难的!!!  。上溢和下溢在数字计算机上实现连续数学的根本困难是，我们', 'time': '2017-02-02T08:37'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '还是很烦“数字”两个字。', 'origin_text': '表示，因此仅仅计算涉及实数的函数也是困难的。上溢和下溢在  !!!数字计算机!!!  上实现连续数学的根本困难是，我们需要通过有限数量的位模式来表示无', 'time': '2017-02-02T08:37'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改为“连续数学在计算机上的根本困难是”如何？', 'origin_text': '确表示，因此仅仅计算涉及实数的函数也是困难的。上溢和下溢  !!!在数字计算机上实现连续数学的根本困难是!!!  ，我们需要通过有限数量的位模式来表示无限多的实数。这意味着我们', 'time': '2017-02-02T08:40'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': 'bit patterns是CS的一个专有名词，常见的译法就是“位模式”吗？感觉有些拗口。', 'origin_text': '在数字计算机上实现连续数学的根本困难是，我们需要通过有限数量的  !!!位模式!!!  来表示无限多的实数。这意味着我们在计算机中表示实数时，几乎总会', 'time': '2017-02-02T08:42'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '原文并没有因果关系，建议改成“舍入误差会导致一些问题，特别是许多操作复合时，即使是理论上可行的算法，如果在设计时，没有考虑最小化累积舍入误差，在实践时也可能导致算法失效。”', 'origin_text': '时，几乎总会引入一些近似误差。在许多情况下，这仅仅是舍入误差。  !!!如果在理论上可行的算法没有被设计为最小化舍入误差的累积，可能就会在实践中失效，因此舍入误差会导致一些问题（特别是许多操作复合时）。!!!  一种特别的毁灭性舍入误差是下溢。当接近零的数被四舍五入为零', 'time': '2017-02-02T09:09'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改为“下溢是一种极端的舍入误差。”如何？', 'origin_text': '中失效，因此舍入误差会导致一些问题（特别是许多操作复合时）。  !!!一种特别的毁灭性舍入误差是下溢!!!  。当接近零的数被四舍五入为零时发生下溢。许多函数在其参数为零', 'time': '2017-02-02T09:12'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '上溢是另外一种极端的舍入误差', 'origin_text': '−∞-\\\\infty，进一步的算术运算会使其变成非数字）。  !!!另一个极具破坏力的数值错误形式是上溢!!!  。当大量级的数被近似为∞∞\\\\infty或−∞−∞-\\\\infty', 'time': '2017-02-02T09:17'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '改为“表示”或者“表征”更好吧？', 'origin_text': '学习中许多常见的数值不稳定的表达式。病态条件数条件数  !!!表明!!!  函数相对于输入的微小变化而变化的快慢程度。输入被轻微扰动而迅速', 'time': '2017-02-02T09:28'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '去掉这个“是”', 'origin_text': '快慢程度。输入被轻微扰动而迅速改变的函数对于科学计算来说是可能  !!!是!!!  有问题的，因为输入中的舍入误差可能导致输出的巨大变化。考虑函', 'time': '2017-02-02T09:29'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '此处有误，不严谨。参见https://pan.baidu.com/s/1dFl7vC9', 'origin_text': '可能是有问题的，因为输入中的舍入误差可能导致输出的巨大变化。  !!!考虑函数f(x)=A−1xf(x)=A−1xf(\\\\Vx) = \\\\MA^{-1} \\\\Vx。当A∈ℝn×nA∈Rn×n\\\\MA \\\\in \\\\SetR^{n \\\\times n} 具有特征值分解时，其条件数!!!  为maxi,j\\xa0∣∣∣∣λiλj∣∣∣∣.maxi,j\\xa0|λi', 'time': '2017-02-12T09:50'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '或者还有处于非常平坦区域之中的鞍点', 'origin_text': '度学习的背景下，我们优化的函数可能含有许多不是最优的局部极小点，  !!!或许多被非常平坦的区域包围的鞍点!!!  。尤其是当输入是多维的时候，所有这些都将使优化变得困难。因此', 'time': '2017-02-12T10:03'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '但并不需要在所有情况下都是最小的。', 'origin_text': '有这些都将使优化变得困难。因此，我们通常寻找fff非常小的值，  !!!但在任何形式意义下并不一定是最小!!!  。见\\\\fig?的例子。\\\\begin{figure}[!htb', 'time': '2017-02-12T10:08'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '多元函数', 'origin_text': '能接受这样的解。}\\\\end{figure}我们经常最小化  !!!具有多维输入的函数!!!  ：f:ℝn→ℝf:Rn→Rf: \\\\SetR^n \\\\rightar', 'time': '2017-02-12T10:13'}\n{'user': 'acct:hengqujushi@hypothes.is', 'text': '多元函数', 'origin_text': '使”最小化”的概念有意义，输出必须是一维的(标量)。针对  !!!具有多维输入的函数!!!  ，我们需要用到偏导数的概念。偏导数 ∂∂xif(x)∂∂xif', 'time': '2017-02-12T10:13'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:swordyork@hypothes.is', 'text': '多谢，应该是特征向量的正交基。漏了个基。', 'time': '2017-03-02T08:55'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '为与原书一致，可能原作者为了更通俗。', 'time': '2017-03-02T08:52'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '他后面说当存在特征值分解时，而且本书定义的是特征值之比，不是奇异值之比。所以我们仍延续书中写法。', 'time': '2017-03-02T08:48'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '确实有问题，多谢！', 'time': '2017-03-02T08:36'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '这个我保持原样，我觉得涉及实数和实数域有区别。比如int(x)或1/int(x)就是涉及实数但不是实数域。', 'time': '2017-03-02T08:33'}\n{'user': 'acct:swordyork@hypothes.is', 'text': 'ok，今天能合并好，多谢！', 'time': '2017-02-07T10:45'}\n{'user': 'acct:swordyork@hypothes.is', 'text': '你好，此处得加数字，因为作者此处要突出数字计算机的缺陷——实数无法在有限内存下精确表示。\\n与模拟计算机相对https://en.wikipedia.org/wiki/Analog_computer', 'time': '2017-02-07T10:42'}"
  },
  {
    "path": "Chapter4/numerical_computation.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Shenjian Zhao\n\\chapter{数值计算}\n\\label{chap:numerical_computation}\n\n\\gls{ML}算法通常需要大量的数值计算。\n这通常是指通过迭代过程更新解的估计值来解决数学问题的算法，而不是通过解析过程推导出公式来提供正确解的方法。\n常见的操作包括优化（找到最小化或最大化函数值的参数）和线性方程组的求解。\n对数字计算机来说实数无法在有限内存下精确表示，因此仅仅是计算涉及实数的函数也是困难的。\n\n\\section{\\glsentrytext{overflow}和\\glsentrytext{underflow}}\n\\label{sec:overflow_and_underflow}\n连续数学在数字计算机上的根本困难是，我们需要通过有限数量的位模式来表示无限多的实数。\n这意味着我们在计算机中表示实数时，几乎总会引入一些近似误差。\n在许多情况下，这仅仅是舍入误差。\n舍入误差会导致一些问题，特别是当许多操作复合时，即使是理论上可行的算法，如果在设计时没有考虑最小化舍入误差的累积，在实践时也可能会导致算法失效。\n\n一种极具毁灭性的舍入误差是\\firstgls{underflow}。\n当接近零的数被四舍五入为零时发生\\gls{underflow}。\n许多函数在其参数为零而不是一个很小的正数时才会表现出质的不同。\n例如，我们通常要避免被零除（一些软件环境将在这种情况下抛出异常，有些会返回一个非数字(not-a-number, NaN)的占位符）或避免取零的对数（这通常被视为$-\\infty$，进一步的算术运算会使其变成非数字）。\n\n% -- 77 --\n\n另一个极具破坏力的数值错误形式是\\firstgls{overflow}。\n当大量级的数被近似为$\\infty$或$-\\infty$时发生\\gls{overflow}。\n进一步的运算通常会导致这些无限值变为非数字。\n\n必须对\\gls{overflow}和\\gls{underflow}进行数值稳定的一个例子是\\firstgls{softmax}。\n\\gls{softmax}经常用于预测与~\\gls{multinoulli}相关联的概率，定义为\n\\begin{align}\n \\text{softmax}(\\Vx)_i = \\frac{\\exp(\\Sx_i)}{\\sum_{j=1}^n \\exp(\\Sx_j)} .\n\\end{align}\n考虑一下当所有$\\Sx_i$都等于某个常数$\\Sc$时会发生什么。\n从理论分析上说，我们可以发现所有的输出都应该为$\\frac{1}{n}$。\n从数值计算上说，当$\\Sc$量级很大时，这可能不会发生。\n如果$\\Sc$是很小的负数，$\\exp(c)$就会\\gls{underflow}。\n这意味着~\\gls{softmax}的分母会变成0，所以最后的结果是未定义的。\n当$\\Sc$是非常大的正数时，$\\exp(c)$的\\gls{overflow}再次导致整个表达式未定义。\n这两个困难能通过计算$\\text{softmax}(\\Vz)$同时解决，其中$\\Vz = \\Vx - \\max_i \\Sx_i$。\n简单的代数计算表明，$\\text{softmax}$解析上的函数值不会因为从输入向量减去或加上标量而改变。\n减去$\\max_i x_i$导致$\\exp$的最大参数为$0$，这排除了\\gls{overflow}的可能性。\n同样地，分母中至少有一个值为1的项，这就排除了因分母\\gls{underflow}而导致被零除的可能性。\n\n还有一个小问题。\n分子中的\\gls{underflow}仍可以导致整体表达式被计算为零。\n这意味着，如果我们在计算$\\log ~\\text{softmax}(\\Vx)$时，先计算$\\text{softmax}$再把结果传给$\\log$函数，会错误地得到$-\\infty$。\n相反，我们必须实现一个单独的函数，并以数值稳定的方式计算$\\log \\text{softmax}$。\n我们可以使用相同的技巧来稳定$\\log \\text{softmax}$函数。\n\n在大多数情况下，我们没有明确地对本书描述的各种算法所涉及的数值考虑进行详细说明。\n底层库的开发者在实现\\gls{DL}算法时应该牢记数值问题。\n本书的大多数读者可以简单地依赖保证数值稳定的底层库。\n在某些情况下，我们有可能在实现一个新的算法时自动保持数值稳定。\nTheano~\\citep{bergstra+al:2010-scipy,Bastien-2012}就是这样软件包的一个例子，它能自动检测并稳定\\gls{DL}中许多常见的数值不稳定的表达式。\n\n% -- 78 --\n\n\\section{\\glsentrytext{poor_conditioning}}\n\\label{sec:poor_conditioning}\n\n条件数表征函数相对于输入的微小变化而变化的快慢程度。\n输入被轻微扰动而迅速改变的函数对于科学计算来说可能是有问题的，因为输入中的舍入误差可能导致输出的巨大变化。\n\n考虑函数$f(\\Vx) = \\MA^{-1} \\Vx$。\n当$\\MA \\in \\SetR^{n \\times n}$ 具有特征值分解时，其条件数为\n\\begin{align}\n \\underset{i,j}{\\max}~ \\Bigg| \\frac{\\lambda_i}{ \\lambda_j} \\Bigg|.\n\\end{align}\n这是最大和最小特征值的模之比\\footnote{译者注：与通常的条件数定义有所不同。}。\n当该数很大时，矩阵求逆对输入的误差特别敏感。\n\n这种敏感性是矩阵本身的固有特性，而不是矩阵求逆期间舍入误差的结果。\n即使我们乘以完全正确的矩阵逆，\\gls{poor_conditioning}的矩阵也会放大预先存在的误差。\n在实践中，该错误将与求逆过程本身的数值误差进一步复合。\n\n\n\n\\section{基于梯度的优化方法}\n\\label{sec:gradient_based_optimization}\n\n大多数\\gls{DL}算法都涉及某种形式的优化。\n优化指的是改变$\\Vx$以最小化或最大化某个函数$f(\\Vx)$的任务。\n我们通常以最小化$f(\\Vx)$指代大多数最优化问题。\n最大化可经由最小化算法最小化$-f(\\Vx)$来实现。\n\n我们把要最小化或最大化的函数称为\\firstgls{objective_function}或\\firstgls{criterion}。\n当我们对其进行最小化时，我们也把它称为\\firstgls{cost_function}、\\firstgls{loss_function}或\\firstgls{error_function}。\n虽然有些机器学习著作赋予这些名称特殊的意义，但在这本书中我们交替使用这些术语。\n\n我们通常使用一个上标$*$表示最小化或最大化函数的$\\Vx$值。\n如我们记$\\Vx^*=\\argmin f(\\Vx)$。\n\n我们假设读者已经熟悉微积分，这里简要回顾微积分概念如何与优化联系。\n\n% -- 79 --\n\n假设我们有一个函数$\\Sy = f(\\Sx)$， 其中$\\Sx$和$\\Sy$是实数。\n这个函数的\\firstgls{derivative}记为$f^\\prime(x)$或$\\frac{dy}{dx}$。\n导数$f^\\prime(\\Sx)$代表$f(\\Sx)$在点$x$处的斜率。\n换句话说，它表明如何缩放输入的小变化才能在输出获得相应的变化：\n$f(\\Sx+\\epsilon) \\approx f(\\Sx) + \\epsilon f^\\prime(\\Sx) $。\n\n因此\\gls{derivative}对于最小化一个函数很有用，因为它告诉我们如何更改$x$来略微地改善$y$。\n例如，我们知道对于足够小的$\\epsilon$来说，$f(\\Sx-\\epsilon \\text{sign}(f^\\prime(\\Sx)) )$是比$f(\\Sx)$小的。\n因此我们可以将$\\Sx$往\\gls{derivative}的反方向移动一小步来减小$f(\\Sx)$。\n这种技术被称为\\firstgls{GD}\\citep{cauchy1847}。\n\\figref{fig:chap4_gradient_descent_color}展示了一个例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/gradient_descent_color}}\n\\fi\n\\caption{\\gls{GD}。 \n\\gls{GD}算法如何使用函数导数的示意图，即沿着函数的下坡方向（导数反方向）直到最小。}\n\\label{fig:chap4_gradient_descent_color}\n\\end{figure}\n\n% -- 80 --\n\n当$f^\\prime(\\Sx)=0$，\\gls{derivative}无法提供往哪个方向移动的信息。\n$ f^\\prime(\\Sx)=0 $的点称为\\firstgls{critical_points}或\\firstgls{stationary_point}。\n一个\\firstgls{local_minimum}意味着这个点的$f(\\Sx)$小于所有邻近点，因此不可能通过移动无穷小的步长来减小$f(\\Sx)$。\n一个\\firstgls{local_maximum}意味着这个点的$f(\\Sx)$大于所有邻近点，因此不可能通过移动无穷小的步长来增大$f(\\Sx)$。\n有些\\gls{critical_points}既不是最小点也不是最大点。这些点被称为\\firstgls{saddle_points}。\n见\\figref{fig:chap4_critical_color}给出的各种临界点的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/critical_color}}\n\\fi\n\\caption{\\gls{critical_points}的类型。 \n一维情况下，三种\\gls{critical_points}的示例。\n\\gls{critical_points}是斜率为零的点。\n这样的点可以是\\firstgls{local_minimum}，其值低于相邻点; \\firstgls{local_maximum}，其值高于相邻点; 或\\gls{saddle_points}，同时存在更高和更低的相邻点。\n}\n\\label{fig:chap4_critical_color}\n\\end{figure}\n\n使$f(x)$取得绝对的最小值（相对所有其他值）的点是\\firstgls{global_minimum}。\n函数可能只有一个\\gls{global_minimum}或存在多个\\gls{global_minimum}，\n还可能存在不是全局最优的\\gls{local_minimum}。\n在\\gls{DL}的背景下，我们要优化的函数可能含有许多不是最优的\\gls{local_minimum}，或者还有很多处于非常平坦的区域内的\\gls{saddle_points}。\n尤其是当输入是多维的时候，所有这些都将使优化变得困难。\n因此，我们通常寻找使$f$非常小的点，但这在任何形式意义下并不一定是最小。\n见\\figref{fig:chap4_approx_opt_color}的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/approx_opt_color}}\n\\fi\n\\caption{近似最小化。 \n当存在多个\\gls{local_minimum}或平坦区域时，优化算法可能无法找到\\gls{global_minimum}。\n在深度学习的背景下，即使找到的解不是真正最小的，但只要它们对应于\\gls{cost_function}显著低的值，我们通常就能接受这样的解。\n}\n\\label{fig:chap4_approx_opt_color}\n\\end{figure}\n\n我们经常最小化具有多维输入的函数：$f: \\SetR^n \\rightarrow \\SetR $。 \n为了使``最小化''的概念有意义，输出必须是一维的(标量)。\n\n% -- 81 --\n\n针对具有多维输入的函数，我们需要用到\\firstgls{partial_derivatives}的概念。\n\\gls{partial_derivatives} $\\frac{\\partial}{\\partial \\Sx_i}f(\\Vx)$衡量点$\\Vx$处只有$x_i$增加时$f(\\Vx)$如何变化。\n\\firstgls{gradient}是相对一个向量求导的\\gls{derivative}:$f$的\\gls{gradient}是包含所有\\gls{partial_derivatives}的向量，记为$\\nabla_{\\Vx} f(\\Vx)$。\n\\gls{gradient}的第$i$个元素是$f$关于$x_i$的\\gls{partial_derivatives}。\n在多维情况下，\\gls{critical_points}是\\gls{gradient}中所有元素都为零的点。\n\n在$\\Vu$（单位向量）方向的\\firstgls{directional_derivative}是函数$f$在$\\Vu$方向的斜率。\n换句话说，\\gls{directional_derivative}是函数$f(\\Vx + \\alpha \\Vu)$关于$\\alpha$的\\gls{derivative}（在$\\alpha = 0$时取得）。\n使用\\gls{chain_rule}，我们可以看到当$\\alpha=0$时，$\\frac{\\partial}{\\partial \\alpha} f(\\Vx + \\alpha \\Vu) = \\Vu^\\Tsp \\nabla_{\\Vx} f(\\Vx)$。\n\n为了最小化$f$，我们希望找到使$f$下降得最快的方向。\n计算\\gls{directional_derivative}：\n\\begin{align}\n \\underset{\\Vu, \\Vu^\\Tsp\\Vu = 1}{\\min} \\Vu^\\Tsp & \\nabla_{\\Vx} f(\\Vx) \\\\\n = \\underset{\\Vu, \\Vu^\\Tsp\\Vu = 1}{\\min} \\| \\Vu \\|_2 \\| &\\nabla_{\\Vx}f(\\Vx) \\|_2 \\cos \\theta\n\\end{align}\n其中$\\theta$是$\\Vu$与\\gls{gradient}的夹角。\n将$ \\| \\Vu \\|_2 = 1$代入，并忽略与$\\Vu$无关的项，就能简化得到$ \\underset{\\Vu}{\\min} \\cos \\theta $。 \n这在$\\Vu$与\\gls{gradient}方向相反时取得最小。\n换句话说，\\gls{gradient}向量指向上坡，负\\gls{gradient}向量指向下坡。\n我们在负\\gls{gradient}方向上移动可以减小$f$。\n这被称为\\textbf{最速下降法}(method of steepest descent)或\\firstgls{GD}。\n\n最速下降建议新的点为\n\\begin{align}\n  \\Vx' = \\Vx - \\epsilon \\nabla_{\\Vx} f(\\Vx)\n\\end{align}\n其中$\\epsilon$为\\firstgls{learning_rate}，是一个确定步长大小的正标量。\n我们可以通过几种不同的方式选择$\\epsilon$。\n普遍的方式是选择一个小常数。\n有时我们通过计算，选择使\\gls{directional_derivative}消失的步长。\n还有一种方法是根据几个$\\epsilon$计算$f(\\Vx - \\epsilon \\nabla_{\\Vx} f(\\Vx))$， 并选择其中能产生最小\\gls{objective_function}值的$\\epsilon$。\n这种策略被称为\\gls{line_search}。\n\n最速下降在\\gls{gradient}的每一个元素为零时收敛（或在实践中，很接近零时）。\n在某些情况下，我们也许能够避免运行该迭代算法，并通过解方程$\\nabla_{\\Vx} f(\\Vx)= 0$直接跳到\\gls{critical_points}。\n\n% -- 82 --\n\n虽然\\gls{GD}被限制在连续空间中的优化问题，但不断向更好的情况移动一小步（即近似最佳的小移动）的一般概念可以推广到离散空间。\n递增带有离散参数的\\gls{objective_function}被称为\\firstgls{hill_climbing}算法\\citep{Russel+Norvig-book2003}。\n\n\\subsection{\\glsentrytext{gradient}之上：\\glsentrytext{jacobian}和\\glsentrytext{hessian}矩阵}\n\\label{sec:beyond_the_gradient_jacobian_and_hessian_matrices}\n有时我们需要计算输入和输出都为向量的函数的所有\\gls{partial_derivatives}。\n包含所有这样的偏导数的矩阵被称为\\textbf{Jacobian}矩阵。\n具体来说，如果我们有一个函数：$\\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$。\n\n有时，我们也对\\gls{derivative}的\\gls{derivative}感兴趣，即\\firstgls{second_derivative}。\n例如，有一个函数$f: \\SetR^m \\rightarrow \\SetR$，$f$的一阶\\gls{derivative}(关于$\\Sx_j$)关于$x_i$的\\gls{derivative}记为$\\frac{\\partial^2}{\\partial \\Sx_i \\partial \\Sx_j} f$。\n在一维情况下，我们可以将$\\frac{\\partial^2}{\\partial \\Sx^2} f$为$f''(\\Sx)$。\n\\gls{second_derivative}告诉我们，一阶\\gls{derivative}将如何随着输入的变化而改变。\n它表示只基于\\gls{gradient}信息的\\gls{GD}步骤是否会产生如我们预期的那样大的改善，因此它是重要的。\n我们可以认为，\\gls{second_derivative}是对\\gls{curvature}的衡量。\n假设我们有一个二次函数（虽然很多实践中的函数都不是二次的，但至少在局部可以很好地用二次近似）。\n如果这样的函数具有零\\gls{second_derivative}，那就没有\\gls{curvature}。\n也就是一条完全平坦的线，仅用\\gls{gradient}就可以预测它的值。\n我们使用沿负\\gls{gradient}方向大小为$\\epsilon$的下降步，当该\\gls{gradient}是$1$时，\\gls{cost_function}将下降$\\epsilon$。\n如果\\gls{second_derivative}是负的，函数曲线向下凹陷(向上凸出)，因此\\gls{cost_function}将下降的比$\\epsilon$多。\n如果\\gls{second_derivative}是正的，函数曲线是向上凹陷(向下凸出)，\n因此\\gls{cost_function}将下降的比$\\epsilon$少。\n从\\figref{fig:chap4_curvature_color}可以看出不同形式的\\gls{curvature}如何影响基于\\gls{gradient}的预测值与真实的\\gls{cost_function}值的关系。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/curvature_color}}\n\\fi\n\\caption{\\gls{second_derivative}确定函数的\\gls{curvature}。\n这里我们展示具有各种\\gls{curvature}的二次函数。\n虚线表示我们仅根据梯度信息进行\\gls{GD}后预期的\\gls{cost_function}值。\n对于负\\gls{curvature}，\\gls{cost_function}实际上比梯度预测下降得更快。\n没有\\gls{curvature}时，梯度正确预测下降值。\n对于正\\gls{curvature}，函数比预期下降得更慢，并且最终会开始增加，因此太大的步骤实际上可能会无意地增加函数值。\n}\n\\label{fig:chap4_curvature_color}\n\\end{figure}\n\n当我们的函数具有多维输入时，\\gls{second_derivative}也有很多。\n我们可以将这些导数合并成一个矩阵，称为\\textbf{Hessian}矩阵。\n\\gls{hessian}~矩阵$\\MH(f)(\\Vx)$定义为\n\\begin{align}\n \\MH(f)(\\Vx)_{i,j} = \\frac{\\partial^2}{\\partial \\Sx_i \\partial  \\Sx_j} f(\\Vx).\n\\end{align}\n\\gls{hessian}~等价于\\gls{gradient}的~\\gls{jacobian}~矩阵。\n\n% -- 83 --\n\n微分算子在任何二阶偏导连续的点处可交换，也就是它们的顺序可以互换：\n\\begin{align}\n \\frac{\\partial^2}{\\partial \\Sx_i \\partial \\Sx_j} f(\\Vx) = \\frac{\\partial^2}{\\partial \\Sx_j\\partial \\Sx_i} f(\\Vx) .\n\\end{align}\n这意味着$H_{i,j} = H_{j,i}$， 因此~\\gls{hessian}~矩阵在这些点上是对称的。\n在\\gls{DL}背景下，我们遇到的大多数函数的~\\gls{hessian}~几乎处处都是对称的。\n因为~\\gls{hessian}~矩阵是实对称的，我们可以将其分解成一组实特征值和一组特征向量的正交基。\n在特定方向$\\Vd$上的\\gls{second_derivative}可以写成$\\Vd^\\Tsp \\MH \\Vd$。\n当$\\Vd$是$\\MH$的一个特征向量时，这个方向的\\gls{second_derivative}就是对应的特征值。\n对于其他的方向$\\Vd$，方向\\gls{second_derivative}是所有特征值的加权平均，权重在0和1之间，且与$\\Vd$夹角越小的特征向量的权重越大。\n最大特征值确定最大\\gls{second_derivative}，最小特征值确定最小\\gls{second_derivative}。\n\n% -- 84 --\n\n我们可以通过（方向）\\gls{second_derivative}预期一个\\gls{GD}步骤能表现得多好。\n我们在当前点$\\Vx^{(0)}$处作函数$f(\\Vx)$的近似二阶\\gls{taylor}级数：\n\\begin{align}\n f(\\Vx) \\approx f(\\Vx^{(0)}) + (\\Vx - \\Vx^{(0)})^\\Tsp \\Vg + \n \\frac{1}{2}  (\\Vx - \\Vx^{(0)})^\\Tsp \\MH  (\\Vx - \\Vx^{(0)}),\n\\end{align}\n其中$\\Vg$是梯度，$\\MH$是$ \\Vx^{(0)}$点的~\\gls{hessian}。\n如果我们使用\\gls{learning_rate} $\\epsilon$，那么新的点$\\Vx$将会是$\\Vx^{(0)}-\\epsilon \\Vg$。\n代入上述的近似，可得\n\\begin{align}\n\\label{eq:4.9}\n f(\\Vx^{(0)} - \\epsilon \\Vg ) \\approx f(\\Vx^{(0)})  - \\epsilon \\Vg^\\Tsp \\Vg + \\frac{1}{2} \\epsilon^2 \\Vg^\\Tsp \\MH  \\Vg.\n\\end{align}\n其中有3项：函数的原始值、函数斜率导致的预期改善、函数\\gls{curvature}导致的校正。\n当最后一项太大时，\\gls{GD}实际上是可能向上移动的。\n当$\\Vg^\\Tsp \\MH  \\Vg$为零或负时，近似的\\gls{taylor}级数表明增加$\\epsilon$将永远使$f$下降。\n在实践中，\\gls{taylor}级数不会在$\\epsilon$大的时候也保持准确，因此在这种情况下我们必须采取更启发式的选择。\n当$\\Vg^\\Tsp \\MH  \\Vg$为正时，通过计算可得，使近似\\gls{taylor}级数下降最多的最优步长为\n\\begin{align}\n \\epsilon^* = \\frac{ \\Vg^\\Tsp \\Vg}{ \\Vg^\\Tsp \\MH  \\Vg} .\n\\end{align}\n最坏的情况下，$\\Vg$与$\\MH$最大特征值$\\lambda_{\\max}$对应的特征向量对齐，则最优步长是$\\frac{1}{\\lambda_{\\max}}$。\n我们要最小化的函数能用二次函数很好地近似的情况下，\\gls{hessian}~的特征值决定了\\gls{learning_rate}的量级。\n\n\\gls{second_derivative}还可以被用于确定一个\\gls{critical_points}是否是\\gls{local_maximum}、\\gls{local_minimum}或\\gls{saddle_points}。\n回想一下，在\\gls{critical_points}处$f'(x) = 0$。\n而$f''(x) > 0$意味着$f'(x)$会随着我们移向右边而增加，移向左边而减小，也就是 $f'(x - \\epsilon) < 0$ 和 $f'(x+\\epsilon)>0$对足够小的$\\epsilon$成立。 换句话说，当我们移向右边，斜率开始指向右边的上坡，当我们移向左边，斜率开始指向左边的上坡。\n因此我们得出结论，当$f'(x) = 0$且$f''(x) > 0$时，$\\Vx$是一个\\gls{local_minimum}。\n同样，当$f'(x) = 0$且$f''(x) < 0$时，$\\Vx$是一个\\gls{local_maximum}。\n这就是所谓的\\firstgls{second_derivative_test}。\n不幸的是，当$f''(x) = 0$时测试是不确定的。\n在这种情况下，$\\Vx$可以是一个\\gls{saddle_points}或平坦区域的一部分。\n\n% -- 85 --\n\n在多维情况下，我们需要检测函数的所有\\gls{second_derivative}。\n利用~\\gls{hessian}~的特征值分解，我们可以将\\gls{second_derivative_test}扩展到多维情况。\n在\\gls{critical_points}处（$\\nabla_{\\Vx} f(\\Vx) = 0$），我们通过检测~\\gls{hessian}~的特征值来判断该\\gls{critical_points}是一个\\gls{local_maximum}、\\gls{local_minimum}还是\\gls{saddle_points}。\n当~\\gls{hessian}~是正定的（所有特征值都是正的），则该\\gls{critical_points}是\\gls{local_minimum}。\n因为方向\\gls{second_derivative}在任意方向都是正的，参考单变量的\\gls{second_derivative_test}就能得出此结论。\n同样的，当~\\gls{hessian}~是负定的（所有特征值都是负的），这个点就是\\gls{local_maximum}。\n在多维情况下，实际上我们可以找到确定该点是否为\\gls{saddle_points}的积极迹象（某些情况下）。\n如果~\\gls{hessian}~的特征值中至少一个是正的且至少一个是负的，那么$\\Vx$是$f$某个横截面的\\gls{local_maximum}，却是另一个横截面的\\gls{local_minimum}。\n见\\figref{fig:chap4_saddle_3d_color}中的例子。\n最后，多维\\gls{second_derivative_test}可能像单变量版本那样是不确定的。\n当所有非零特征值是同号的且至少有一个特征值是$0$时，这个检测就是不确定的。\n这是因为单变量的\\gls{second_derivative_test}在零特征值对应的横截面上是不确定的。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/saddle_3d_color}}\n\\fi\n\\caption{既有正\\gls{curvature}又有负\\gls{curvature}的\\gls{saddle_points}。\n示例中的函数是$f(\\Vx) = x_1^2 - x_2^2$。\n函数沿$x_1$轴向上弯曲。\n$x_1$轴是~\\gls{hessian}~的一个特征向量，并且具有正特征值。\n函数沿$x_2$轴向下弯曲。\n该方向对应于~\\gls{hessian}~负特征值的特征向量。\n名称``\\gls{saddle_points}''源自该处函数的鞍状形状。\n这是具有\\gls{saddle_points}函数的典型示例。\n维度多于一个时，\\gls{saddle_points}不一定要具有0特征值：仅需要同时具有正特征值和负特征值。\n我们可以想象这样一个鞍点（具有正负特征值）在一个横截面内是\\gls{local_maximum}，而在另一个横截面内是\\gls{local_minimum}。\n}\n\\label{fig:chap4_saddle_3d_color}\n\\end{figure}\n\n多维情况下，单个点处每个方向上的\\gls{second_derivative}是不同。\n\\gls{hessian}~的条件数衡量这些\\gls{second_derivative}的变化范围。\n当~\\gls{hessian}~的条件数很差时，\\gls{GD}法也会表现得很差。\n这是因为一个方向上的\\gls{derivative}增加得很快，而在另一个方向上增加得很慢。\n\\gls{GD}不知道导数的这种变化，所以它不知道应该优先探索导数长期为负的方向。\n\\gls{poor_conditioning}也导致很难选择合适的步长。\n步长必须足够小，以免冲过最小而向具有较强正\\gls{curvature}的方向上升。\n这通常意味着步长太小，以致于在其他较小\\gls{curvature}的方向上进展不明显。\n见\\figref{fig:chap4_poor_conditioning_color}的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/poor_conditioning_color}}\n\\fi\n\\caption{\\gls{GD}无法利用包含在~\\gls{hessian}~矩阵中的\\gls{curvature}信息。\n这里我们使用\\gls{GD}来最小化~\\gls{hessian}~矩阵条件数为5的二次函数$f(\\Vx)$。\n这意味着最大\\gls{curvature}方向具有比最小\\gls{curvature}方向多五倍的\\gls{curvature}。\n在这种情况下，最大\\gls{curvature}在$[1,1]^\\top$方向上，最小\\gls{curvature}在$[1,-1]^\\top$方向上。\n红线表示\\gls{GD}的路径。\n这个非常细长的二次函数类似一个长峡谷。\n\\gls{GD}把时间浪费于在峡谷壁反复下降，因为它们是最陡峭的特征。\n由于步长有点大，有超过函数底部的趋势，因此需要在下一次迭代时在对面的峡谷壁下降。\n与指向该方向的特征向量对应的~\\gls{hessian}~的大的正特征值表示该方向上的导数快速增加，因此基于~\\gls{hessian}~的优化算法可以预测，在此情况下最陡峭方向实际上不是有前途的搜索方向。\n}\n\\label{fig:chap4_poor_conditioning_color}\n\\end{figure}\n\n% -- 86 --\n\n我们可以使用~\\gls{hessian}~矩阵的信息来指导搜索，以解决这个问题。\n其中最简单的方法是\\firstgls{newton_method}。\n\\gls{newton_method}基于一个二阶\\gls{taylor}展开来近似$\\Vx^{(0)}$附近的$f(\\Vx)$：\n\\begin{align}\n f(\\Vx) \\approx f(\\Vx^{(0)}) + (\\Vx - \\Vx^{(0)})^\\Tsp \\nabla_{\\Vx} f(\\Vx^{(0)}) + \n \\frac{1}{2}  (\\Vx - \\Vx^{(0)})^\\Tsp \\MH(f)(\\Vx^{(0)})  (\\Vx - \\Vx^{(0)}).\n\\end{align}\n接着通过计算，我们可以得到这个函数的\\gls{critical_points}：\n\\begin{align} \\label{eq:newtonstep}\n \\Vx^* =  \\Vx^{(0)} -  \\MH(f)(\\Vx^{(0)})^{-1}  \\nabla_{\\Vx} f(\\Vx^{(0)}) .\n\\end{align}\n当$f$是一个正定二次函数时，\\gls{newton_method}只要应用一次\\eqnref{eq:newtonstep}就能直接跳到函数的最小点。\n如果$f$不是一个真正二次但能在局部近似为正定二次，\\gls{newton_method}则需要多次迭代应用\\eqnref{eq:newtonstep}。\n迭代地更新近似函数和跳到近似函数的最小点可以比\\gls{GD}更快地到达临界点。\n这在接近\\gls{local_minimum}时是一个特别有用的性质，但是在\\gls{saddle_points}附近是有害的。\n如\\eqnref{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})。\n\n仅使用\\gls{gradient}信息的优化算法被称为\\,\\textbf{一阶优化算法}(first-order optimization algorithms)，如\\gls{GD}。\n使用~\\gls{hessian}~矩阵的优化算法被称为\\,\\textbf{二阶最优化算法}(second-order optimization algorithms)\\citep{NumOptBook}，如\\gls{newton_method}。\n\n在本书大多数上下文中使用的优化算法适用于各种各样的函数，但几乎都没有保证。\n因为在\\gls{DL}中使用的函数族是相当复杂的，所以\\gls{DL}算法往往缺乏保证。\n在许多其他领域，优化的主要方法是为有限的函数族设计优化算法。\n\n在\\gls{DL}的背景下，限制函数满足\\firstgls{lipschitz_continuous}或其导数\\gls{lipschitz}连续可以获得一些保证。\n\\gls{lipschitz}~连续函数的变化速度以\\firstgls{lipschitz_constant} $\\CalL$为界：\n\\begin{align}\n \\forall \\Vx,~\\forall \\Vy, ~| f(\\Vx) - f(\\Vy)|  \\leq \\CalL \\| \\Vx - \\Vy \\|_2 .\n\\end{align}\n这个属性允许我们量化我们的假设——\\gls{GD}等算法导致的输入的微小变化将使输出只产生微小变化，因此是很有用的。\n\\gls{lipschitz}~连续性也是相当弱的约束，并且\\gls{DL}中很多优化问题经过相对较小的修改后就能变得~\\gls{lipschitz_continuous}。\n\n% -- 88 --\n\n最成功的特定优化领域或许是\\firstgls{convex_optimization}。\n\\gls{convex_optimization}通过更强的限制提供更多的保证。\n\\gls{convex_optimization}算法只对凸函数适用，即~\\gls{hessian}~处处半正定的函数。\n因为这些函数没有\\gls{saddle_points}而且其所有\\gls{local_minimum}必然是\\gls{global_minimum}，所以表现很好。\n然而，\\gls{DL}中的大多数问题都难以表示成\\gls{convex_optimization}的形式。\n\\gls{convex_optimization}仅用作一些\\gls{DL}算法的子程序。\n\\gls{convex_optimization}中的分析思路对证明\\gls{DL}算法的收敛性非常有用，然而一般来说，\\gls{DL}背景下\\gls{convex_optimization}的重要性大大减少。 \n有关\\gls{convex_optimization}的详细信息，详见~\\cite{Boyd04}或~\\cite{rockafellar1997convex}。\n\n\n\\section{\\glsentrytext{constrained_optimization}}\n\\label{sec:constrained_optimization}\n有时候，在$\\Vx$的所有可能值下最大化或最小化一个函数$f(x)$不是我们所希望的。\n相反，我们可能希望在$\\Vx$的某些集合$\\SetS$中找$f(\\Vx)$的最大值或最小值。\n这被称为\\firstgls{constrained_optimization}。\n在\\gls{constrained_optimization}术语中，集合$\\SetS$内的点$\\Vx$被称为\\firstgls{feasible}点。\n\n我们常常希望找到在某种意义上小的解。\n针对这种情况下的常见方法是强加一个范数约束，如$\\| \\Vx \\| \\leq 1$。\n\n\\gls{constrained_optimization}的一个简单方法是将约束考虑在内后简单地对\\gls{GD}进行修改。\n如果我们使用一个小的恒定步长$\\epsilon$，我们可以先取\\gls{GD}的单步结果，然后将结果投影回$\\SetS$。\n如果我们使用\\gls{line_search}，我们只能在步长为$\\epsilon$范围内搜索\\gls{feasible}的新$\\Vx$点，或者我们可以将线上的每个点投影到约束区域。\n如果可能的话，在\\gls{GD}或\\gls{line_search}前将\\gls{gradient}投影到\\gls{feasible}域的切空间会更高效\\citep{rosen1960}。\n\n一个更复杂的方法是设计一个不同的、无约束的优化问题，其解可以转化成原始\\gls{constrained_optimization}问题的解。\n例如，我们要在$\\Vx \\in \\SetR^2$中最小化$f(\\Vx)$，其中$\\Vx$约束为具有单位$L^2$范数。\n我们可以关于$\\theta$最小化$g(\\theta) = f([\\cos \\theta, \\sin \\theta]^\\Tsp)$，最后返回$[\\cos \\theta, \\sin \\theta]$作为原问题的解。\n这种方法需要创造性；优化问题之间的转换必须专门根据我们遇到的每一种情况进行设计。\n\n% -- 89 -- \n\n\\firstacr{KKT}方法\\footnote{\\glssymbol{KKT}~方法是\\textbf{Lagrange乘子法}（只允许等式约束）的推广。}是针对\\gls{constrained_optimization}非常通用的解决方案。\n为介绍\\glssymbol{KKT}方法，我们引入一个称为\\firstgls{generalized_lagrangian}或\\firstgls{generalized_lagrange_function}的新函数。\n\n为了定义\\ENNAME{Lagrangian}，我们先要通过等式和不等式的形式描述$\\SetS$。 \n我们希望通过$m$个函数$g^{(i)}$和$n$个函数$h^{(j)}$描述$\\SetS$，那么$\\SetS$可以表示为$\\SetS = \\{ \\Vx \\mid \\forall i, g^{(i)}(\\Vx) = 0 ~\\text{and}~ \\forall j, h^{(j)}(\\Vx) \\leq 0  \\}$。\n其中涉及$g^{(i)}$的等式称为\\firstgls{equality_constraints}，涉及$h^{(j)}$的不等式称为\\firstgls{inequality_constraints}。\n\n我们为每个约束引入新的变量$\\lambda_i$和$\\alpha_j$，这些新变量被称为~\\glssymbol{KKT}~乘子。\\gls{generalized_lagrangian}~可以如下定义：\n\\begin{align}\n L(\\Vx, \\Vlambda, \\Valpha) = f(\\Vx) + \\sum_i \\lambda_i g^{(i)}(\\Vx)  + \\sum_j \\alpha_j h^{(j)}(\\Vx).\n\\end{align}\n\n现在，我们可以通过优化无约束的\\gls{generalized_lagrangian}~解决约束最小化问题。\n只要存在至少一个\\gls{feasible}点且$f(\\Vx)$不允许取$\\infty$，那么\n\\begin{align}\n \\underset{\\Vx}{\\min}~  \\underset{\\Vlambda}{\\max}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha) \n\\end{align}\n与如下函数有相同的最优\\gls{objective_function}值和最优点集$\\Vx$\n\\begin{align}\n \\underset{\\Vx \\in \\SetS}{\\min}~ f(\\Vx).\n\\end{align}\n这是因为当约束满足时，\n\\begin{align}\n  \\underset{\\Vlambda}{\\max}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha)  = f(\\Vx) ,\n\\end{align}\n而违反任意约束时，\n\\begin{align}\n  \\underset{\\Vlambda}{\\max}  \n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha)  = \\infty .\n\\end{align}\n这些性质保证不可行点不会是最佳的，并且\\gls{feasible}点范围内的最优点不变。\n\n% -- 90 --\n\n要解决约束最大化问题，我们可以构造$-f(\\Vx)$的\\gls{generalized_lagrange_function}，从而导致以下优化问题：\n\\begin{align}\n \\underset{\\Vx}{\\min}~ \\underset{\\Vlambda}{\\max}  ~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max} \n  -f(\\Vx) + \\sum_i \\lambda_i g^{(i)}(\\Vx)  + \\sum_j \\alpha_j h^{(j)}(\\Vx).\n\\end{align}\n我们也可将其转换为在外层最大化的问题：\n\\begin{align}\n \\underset{\\Vx}{\\max}~ \\underset{\\Vlambda}{\\min}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\min} \n  f(\\Vx) + \\sum_i \\lambda_i g^{(i)}(\\Vx) - \\sum_j \\alpha_j h^{(j)}(\\Vx).\n\\end{align}\n\\gls{equality_constraints}对应项的符号并不重要；因为优化可以自由选择每个$\\lambda_i$的符号，我们可以随意将其定义为加法或减法。\n\n\\gls{inequality_constraints}特别有趣。\n如果$h^{(i)}(\\Vx^*)= 0$，我们就说这个约束$h^{(i)}(\\Vx)$是\\textbf{活跃}(active)的。\n如果约束不是活跃的，则有该约束的问题的解与去掉该约束的问题的解至少存在一个相同的局部解。\n一个不活跃约束有可能排除其他解。\n例如，整个区域（代价相等的宽平区域）都是全局最优点的凸问题可能因约束消去其中的某个子区域，或在非凸问题的情况下，收敛时不活跃的约束可能排除了较好的局部\\gls{stationary_point}。\n然而，无论不活跃的约束是否被包括在内，收敛时找到的点仍然是一个\\gls{stationary_point}。\n因为一个不活跃的约束$h^{(i)}$必有负值，那么$\n \\underset{\\Vx}{\\min}~  \\underset{\\Vlambda}{\\max}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha) \n$中的$\\alpha_i = 0$。\n因此，我们可以观察到在该解中$\\Valpha \\odot \\Vh(\\Vx) = 0$。\n换句话说，对于所有的$i$， $\\alpha_i \\geq 0$或$ h^{(j)}(\\Vx) \\leq 0$在收敛时必有一个是活跃的。\n为了获得关于这个想法的一些直观解释，我们可以说这个解是由不等式强加的边界，我们必须通过对应的~\\glssymbol{KKT}~乘子影响$\\Vx$的解，或者不等式对解没有影响，我们则归零~\\glssymbol{KKT}~乘子。\n\n我们可以使用一组简单的性质来描述\\gls{constrained_optimization}问题的最优点。\n这些性质称为\\firstacr{KKT}条件\\citep{Karush39,kuhn1951}。\n这些是确定一个点是最优点的必要条件，但不一定是充分条件。\n这些条件是：\n\\begin{itemize}\n \\item \\gls{generalized_lagrangian}~的\\gls{gradient}为零。\n \\item 所有关于$\\Vx$和~\\glssymbol{KKT}~乘子的约束都满足。\n \\item \\gls{inequality_constraints}显示的``互补松弛性''：$\\Valpha \\odot \\Vh(\\Vx) = 0$。\n\\end{itemize}\n有关~\\glssymbol{KKT}~方法的详细信息，请参阅~\\cite{NumOptBook}。\n\n% -- 91 --\n\n\\section{实例：线性最小二乘}\n\\label{sec:example_linear_least_squares}\n假设我们希望找到最小化下式的$\\Vx$值\n\\begin{align}\n f(\\Vx) = \\frac{1}{2}\\| \\MA \\Vx - \\Vb \\|_2^2 .\n\\end{align}\n存在专门的线性代数算法能够高效地解决这个问题；但是，我们也可以探索如何使用基于\\gls{gradient}的优化来解决这个问题，这可以作为这些技术是如何工作的一个简单例子。\n\n首先，我们计算\\gls{gradient}：\n\\begin{align}\n \\nabla_{\\Vx} f(\\Vx) = \\MA^\\Tsp (\\MA \\Vx - \\Vb) = \\MA^\\Tsp \\MA \\Vx - \\MA^\\Tsp \\Vb .\n\\end{align}\n\n然后，我们可以采用小的步长，并按照这个\\gls{gradient}下降。见\\algref{alg:gdlsq}中的详细信息。\n\n\\begin{algorithm}[ht]\n\\caption{从任意点$\\Vx$开始，使用\\gls{GD}关于$\\Vx$最小化\n$ f(\\Vx) = \\frac{1}{2} || \\MA \\Vx - \\Vb ||_2^2$的算法。\n}\n\\label{alg:gdlsq}\n\\begin{algorithmic}\n\\STATE 将步长 ($\\epsilon$) 和\\gls{tolerance} ($\\delta$)设为小的正数。\n\\WHILE{ $ || \\MA^\\top \\MA \\Vx - \\MA^\\top \\Vb ||_2 > \\delta $}\n\\STATE $\\Vx \\leftarrow \\Vx - \\epsilon \\left( \\MA^\\top \\MA \\Vx - \\MA^\\top \\Vb \\right)$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n我们也可以使用\\gls{newton_method}解决这个问题。\n因为在这个情况下，真实函数是二次的，\\gls{newton_method}所用的二次近似是精确的，该算法会在一步后收敛到\\gls{global_minimum}。\n\n现在假设我们希望最小化同样的函数，但受 $\\Vx^\\Tsp \\Vx \\leq 1$ 的约束。 \n要做到这一点，我们引入~\\ENNAME{Lagrangian}\n\\begin{align}\n L(\\Vx, \\lambda) = f(\\Vx) + \\lambda (\\Vx^\\Tsp \\Vx - 1).\n\\end{align}\n现在，我们解决以下问题\n\\begin{align}\n  \\underset{\\Vx}{\\min}~\n \\underset{\\lambda, \\lambda \\geq 0}{\\max}~ L(\\Vx, \\lambda) .\n\\end{align}\n\n% -- 92 --\n\n我们可以用~\\ENNAME{Moore-Penrose}~伪逆：$\\Vx = \\MA^+ \\Vb$找到无约束最小二乘问题的最小范数解。\n如果这一点是\\gls{feasible}，那么这也是约束问题的解。\n否则，我们必须找到约束是活跃的解。\n关于$\\Vx$对~\\ENNAME{Lagrangian}~微分，我们得到方程\n\\begin{align}\n \\MA^\\Tsp \\MA \\Vx - \\MA^\\Tsp \\Vb + 2 \\lambda \\Vx = 0.\n\\end{align}\n这就告诉我们，该解的形式将会是\n\\begin{align}\n\\Vx =  (\\MA^\\Tsp \\MA + 2 \\lambda \\MI )^{-1} \\MA^\\Tsp \\Vb.\n\\end{align}\n$\\lambda$的选择必须使结果服从约束。\n我们可以关于$\\lambda$进行\\gls{gradient}上升找到这个值。\n为了做到这一点，观察\n\\begin{align}\n \\frac{\\partial}{\\partial \\lambda} L(\\Vx, \\lambda)  = \\Vx^\\Tsp \\Vx - 1.\n\\end{align}\n当$\\Vx$的范数超过1时，该导数是正的，所以为了跟随\\gls{derivative}上坡并相对$\\lambda$增加~\\ENNAME{Lagrangian}，我们需要增加$\\lambda$。\n因为$\\Vx^\\Tsp \\Vx$的惩罚系数增加了，求解关于$\\Vx$的线性方程现在将得到具有较小范数的解。\n求解线性方程和调整$\\lambda$的过程将一直持续到$\\Vx$具有正确的范数并且关于$\\lambda$的\\gls{derivative}是$0$。\n\n本章总结了开发\\gls{ML}算法所需的数学基础。\n现在，我们已经准备好建立和分析一些成熟的学习系统。\n\n% -- 93 --\n\n"
  },
  {
    "path": "Chapter5/README.md",
    "content": "#第五章笔记\n"
  },
  {
    "path": "Chapter5/annotations.txt",
    "content": "{'user': 'acct:wheaio@hypothes.is', 'text': '观点？', 'origin_text': '面的部分，前往\\\\sec?。\\\\sec?涵盖了一些传统机器学习技术  !!!的观点!!!  ，这些技术对深度学习的发展有着深远影响。首先，我们将介绍学习', 'time': '2017-01-12T07:45'}\n{'user': 'acct:wheaio@hypothes.is', 'text': '提高。。。？', 'origin_text': '很难解决的问题。从科学和哲学的角度来看，机器学习受到关注是因为  !!!发展我们对机器学习的认识需要发展我们对智能背后原理的理解!!!  。如果考虑”任务”比较正式的定义，那么学习的过程并不是任务。', 'time': '2017-01-12T07:53'}\n{'user': 'acct:wheaio@hypothes.is', 'text': '原谅我语文学得不好，实在无法理解这句话', 'origin_text': '为发展我们对机器学习的认识需要发展我们对智能背后原理的理解。  !!!如果考虑”任务”比较正式的定义，那么学习的过程并不是任务。!!!  学习是我们所谓的获取完成任务的能力。例如，我们的目标是会行走', 'time': '2017-01-12T07:55'}\n{'user': 'acct:wheaio@hypothes.is', 'text': '使机器人能够行走？', 'origin_text': '任务。学习是我们所谓的获取完成任务的能力。例如，我们的目标是  !!!会行走的机器人!!!  ，那么行走便是任务。我们可以编程让机器人学会如何行走，或者可以', 'time': '2017-01-12T07:56'}\n{'user': 'acct:wheaio@hypothes.is', 'text': '其他类型？', 'origin_text': 'x)p(x)p(\\\\Vx)是难以计算的。  当然，还有很多  !!!其他或其他类型!!!  的任务。这里我们列举的任务类型只是用来介绍机器学习可以做哪些任', 'time': '2017-01-12T08:28'}\n{'user': 'acct:zplin@hypothes.is', 'text': '更通俗地讲，我们也可以说先验信念直接影响函数本身，而仅仅通过它们对函数的影响来改变参数。\\n\\ndiscuss有talk about的意思 (Merriam-Webster)', 'origin_text': '函数。此前，我们已经看到过由模型参数上的概率分布形成的先验。  !!!更非正式地，我们也可以探讨先验信念如何直接影响\\\\emph{函数}本身，间接影响参数，作为参数与函数之间关系的结果!!!  。 此外，我们也可以非正式地探讨隐式表示的先验。某些算法有偏', 'time': '2017-01-16T23:41'}\n{'user': 'acct:zplin@hypothes.is', 'text': '我们还能通俗地说，先验信念还间接地体现在选择一些偏好某类函数的算法，尽量这些偏好并没有通过我们对不同函数置信程度的概率分布表现出来（也许根本没法表现）。', 'origin_text': '数}本身，间接影响参数，作为参数与函数之间关系的结果。 此外，  !!!我们也可以非正式地探讨隐式表示的先验。某些算法有偏地选择某类函数，即使这类有偏可能不能表示成（或者可能表示成）我们对不同函数偏好程度的概率分布。!!!  其中最广泛使用的隐式”先验”是平滑先验，或局部不变性先验', 'time': '2017-01-16T23:57'}\n{'user': 'acct:zplin@hypothes.is', 'text': '函数$f^$对于大多数设置x和小变动ϵ，都满足条件 \\\\begin{equation} f^(\\\\Vx) \\\\approx f^*(\\\\Vx + \\\\epsilon) \\\\end{equation} 。', 'origin_text': '局部不变的先验。所有这些不同的方法都旨在鼓励学习过程能够学习出  !!!函数$f^$满足条件\\\\begin{equation}    f^(\\\\Vx) \\\\approx f^*(\\\\Vx + \\\\epsilon)\\\\end{equation}对于大多数设置xx\\\\Vx和小变动ϵϵ\\\\epsilon都成立。!!!  换言之，如果我们在输入xx\\\\Vx处效果良好（例如，xx\\\\Vx是', 'time': '2017-01-17T05:20'}\n{'user': 'acct:zplin@hypothes.is', 'text': '如果我们知道对应x输入的答案（比如x是个有标签的训练样本），那么该答案对于x的领域应该也适用。', 'origin_text': 'ght>\\\\Vx和小变动onon\\\\epsilon都成立。换言之，  !!!如果我们在输入xx\\\\Vx处效果良好（例如，xx\\\\Vx是一个有标签的训练样本），那么在xx\\\\Vx的邻域上效果也良好!!!  。如果在有些邻域中我们有几个好答案，那么我们可以组合它们（通过', 'time': '2017-01-18T05:51'}\n{'user': 'acct:zplin@hypothes.is', 'text': 'k近邻系列', 'origin_text': '个尽可能和大多数输入一致的答案。局部不变方法的一个极端例子是  !!!kkk-最近邻型!!!  的学习算法。预测在所有点xx\\\\Vx都有相同的kkk个训练集中最', 'time': '2017-01-18T05:55'}\n{'user': 'acct:zplin@hypothes.is', 'text': '当一个区域里的所有点x在训练集中的k个最近邻是一样的，那么对这些点的预测也是一样的。', 'origin_text': '。局部不变方法的一个极端例子是kkk-最近邻型的学习算法。  !!!预测在所有点xx\\\\Vx都有相同的kkk个训练集中最近邻点的区域上是不变的。!!!  当k=1k=1k=1时，不同区域的数目不可能比训练样本还多。', 'time': '2017-01-18T06:02'}\n{'user': 'acct:zplin@hypothes.is', 'text': '抄袭:-)', 'origin_text': '，不同区域的数目不可能比训练样本还多。虽然kkk-最近邻算法  !!!拷贝!!!  了附近训练样本的输出，大部分核机器也是在和附近训练样本相关的训练', 'time': '2017-01-18T06:06'}\n{'user': 'acct:zplin@hypothes.is', 'text': '用于度量', 'origin_text': 'Vv距离拉大时而减小。局部核可以看作是执行模版匹配的相似函数，  !!!度量!!!  测试样本 xx\\\\Vx和每个训练样本 x(i)x(i)\\\\Vx^{(', 'time': '2017-01-18T06:10'}\n{'user': 'acct:zplin@hypothes.is', 'text': '近年来深度学习的很多推动力', 'origin_text': '和每个训练样本 x(i)x(i)\\\\Vx^{(i)}有多么相似。  !!!大部分深度学习的现代动机!!!  源自研究局部模版匹配的局限性，以及深度学习如何克服这些局限性{c', 'time': '2017-01-18T06:14'}\n{'user': 'acct:zplin@hypothes.is', 'text': '至少拥有n个叶节点的树才能', 'origin_text': '单独的参数（或者有些决策树的拓展有多个参数）。如果目标函数需要  !!!至少nnn个叶节点的树去!!!  精确表示，那么至少需要nnn个训练样本去拟合。需要几倍于nnn', 'time': '2017-01-18T06:19'}\n{'user': 'acct:zplin@hypothes.is', 'text': '正确地', 'origin_text': '验，如果新点和某个训练样本位于相同的棋盘方块中，那么我们能够保证  !!!正确!!!  预测新点的颜色。但如果新点位于棋盘中不包含训练样本的方块中，无', 'time': '2017-01-18T06:26'}\n{'user': 'acct:zplin@hypothes.is', 'text': '所在的方块没有训练样本', 'origin_text': '同的棋盘方块中，那么我们能够保证正确预测新点的颜色。但如果新点  !!!位于棋盘中不包含训练样本的方块中!!!  ，无法保证预测能够正确。单单是这个先验，一个样本只能告诉我们它', 'time': '2017-01-18T06:27'}\n{'user': 'acct:zplin@hypothes.is', 'text': '缺少主语。\\n\\n考虑译成：”学习机不一定能举一反三“', 'origin_text': '确预测新点的颜色。但如果新点位于棋盘中不包含训练样本的方块中，  !!!无法保证预测能够正确!!!  。单单是这个先验，一个样本只能告诉我们它所在的方块的颜色。获', 'time': '2017-01-18T06:34'}\n{'user': 'acct:zplin@hypothes.is', 'text': '如果仅依靠', 'origin_text': '果新点位于棋盘中不包含训练样本的方块中，无法保证预测能够正确。  !!!单单是!!!  这个先验，一个样本只能告诉我们它所在的方块的颜色。获得整个棋盘', 'time': '2017-01-18T06:35'}\n{'user': 'acct:zplin@hypothes.is', 'text': '这样做一般没问题', 'origin_text': '的效果都非常好。当要学习的函数足够平滑，并且只在少数几维变动，  !!!这一般是对的!!!  。在高维空间中，即使是非常平滑的函数，也会在不同维度上有不同的', 'time': '2017-01-18T06:44'}\n{'user': 'acct:zplin@hypothes.is', 'text': '想', 'origin_text': '，那么就非常难用一组训练样本去刻画函数。如果函数是复杂的（我们  !!!希望!!!  区分多于训练样本数目的大量区间），有希望很好地泛化么？回答这', 'time': '2017-01-18T06:46'}\n{'user': 'acct:zplin@hypothes.is', 'text': '很好地', 'origin_text': '些问题——是否可以有效地表示复杂的函数，以及所估计的函数是否可以  !!!良好!!!  地泛化到新的输入——答案是有。关键观点是，只要我们在区间相关性', 'time': '2017-01-18T06:47'}\n{'user': 'acct:zplin@hypothes.is', 'text': '只要我们通过额外假设生成数据的分布来建立区域间的依赖关系', 'origin_text': '计的函数是否可以良好地泛化到新的输入——答案是有。关键观点是，  !!!只要我们在区间相关性上引入额外的数据生成分布上的假设!!!  ，那么O(k)O(k)O(k)个样本是足以描述多如O(2k)O(', 'time': '2017-01-18T06:59'}\n{'user': 'acct:zplin@hypothes.is', 'text': '去掉“是”', 'origin_text': '入额外的数据生成分布上的假设，那么O(k)O(k)O(k)个样本  !!!是!!!  足以描述多如O(2k)O(2k)O(2^k)的大量区间。这样，', 'time': '2017-01-18T07:02'}\n{'user': 'acct:zplin@hypothes.is', 'text': '通过这种方式，我们确实', 'origin_text': '样本是足以描述多如O(2k)O(2k)O(2^k)的大量区间。  !!!这样，我们真的!!!  能做到非局部的泛化{cite?}。许多不同的深度学习算法提出隐', 'time': '2017-01-18T07:03'}\n{'user': 'acct:zplin@hypothes.is', 'text': '为了利用这些优势，许多不同的深度学习算法都提出了一些适用于多种AI任务的或隐或显的假设', 'origin_text': '的大量区间。这样，我们真的能做到非局部的泛化{cite?}。  !!!许多不同的深度学习算法提出隐式或显式的适用于大范围人工智能问题的合理假设， 使其可以利用这些优势。!!!  一些其他的机器学习方法往往会提出更强的，针对特定问题的假设。', 'time': '2017-01-18T07:15'}\n{'user': 'acct:zplin@hypothes.is', 'text': 'checkerboard特指西洋跳棋盘，不是棋盘的统称。后面也说到we could easily solve the checkerboard task by providingthe assumption that the target function is periodic。之所以说是periodic就是因为西洋跳棋盘是黑白相间的', 'origin_text': '显然，只是假设函数的平滑性不能做到这点。例如，想象目标函数是  !!!一种棋盘!!!  。棋盘包含许多变化，但只有一个简单的结构。想象一下，如果训练', 'time': '2017-01-19T05:39'}\n{'user': 'acct:zplin@hypothes.is', 'text': '假设数据由因素或特征组合产生，这些因素或特征可能来自一个层次结构的多个层级', 'origin_text': '性，因此我们希望学习算法具有更通用的假设。深度学习的核心思想是  !!!假设数据由\\\\emph{因素或特征组合}，潜在地由层次结构中多个层级产生!!!  。许多其他类似的通用假设进一步提高了深度学习算法。这些很温和', 'time': '2017-01-19T06:05'}\n{'user': 'acct:zplin@hypothes.is', 'text': '允许了样本数目和可区分区间数目之间的指数增益', 'origin_text': '多其他类似的通用假设进一步提高了深度学习算法。这些很温和的假设  !!!在样本数目和可区分区间数目之间具有指数增益!!!  。这类指数增益将在\\\\sec?，\\\\sec?和\\\\sec?中被更详尽', 'time': '2017-01-19T06:22'}\n{'user': 'acct:zplin@hypothes.is', 'text': '深度的、分布式的', 'origin_text': '指数增益将在\\\\sec?，\\\\sec?和\\\\sec?中被更详尽地介绍。  !!!深度分布式!!!  表示带来的指数增益有效解决了维数灾难带来的挑战。流形学习', 'time': '2017-01-19T06:24'}\n{'user': 'acct:zplin@hypothes.is', 'text': '激发深度学习的挑战', 'origin_text': '原因解决相关问题的一类方法，而不是一长串各个不同的算法。  !!!深度学习的动机与挑战!!!  本章描述的简单机器学习算法在很多不同的重要问题上都效果良好。', 'time': '2017-01-25T14:37'}\n{'user': 'acct:zplin@hypothes.is', 'text': '有意义的', 'origin_text': '碍，该假设认为RnRn\\\\SetR^n中大部分区域都是无效的输入，  !!!感兴趣的!!!  输入只分布在包含少量点的子集构成的一组流形中，而学习函数中感兴趣', 'time': '2017-01-25T14:48'}\n{'user': 'acct:zplin@hypothes.is', 'text': '的输出中，有意义的变动都沿着流形的方向或仅当我们切换流形时', 'origin_text': '兴趣的输入只分布在包含少量点的子集构成的一组流形中，而学习函数中  !!!感兴趣输出的变动只位于流形中的方向，或者感兴趣的变动只发生在我们从一个流形移动到另一个流形的时候!!!  。流形学习是在连续数值数据和无监督学习的设定下被引入的，尽管这', 'time': '2017-01-25T14:55'}\n{'user': 'acct:zplin@hypothes.is', 'text': '最初是用于连续数值和无监督学习的环境', 'origin_text': '趣的变动只发生在我们从一个流形移动到另一个流形的时候。流形学习  !!!是在连续数值数据和无监督学习的设定下被引入的!!!  ，尽管这个概率集中的想法也能够泛化到离散数据和监督学习的设定下：', 'time': '2017-01-25T15:00'}\n{'user': 'acct:zplin@hypothes.is', 'text': '这些高度相似的样本可以通过变换来遍历该流形得到', 'origin_text': '遇到的样本和其他样本相互连接，每个样本被其他高度相似的样本包围，  !!!可以通过变换来遍历该流形!!!  。支持流形假设的第二个论点是，我们至少能够非正式地想象这些邻域', 'time': '2017-01-25T15:14'}\n{'user': 'acct:zplin@hypothes.is', 'text': '确保', 'origin_text': '集中的概率分布不足以说明数据位于一个相当小的流形中。我们还必须  !!!确定!!!  ，我们遇到的样本和其他样本相互连接，每个样本被其他高度相似的样本', 'time': '2017-01-25T15:15'}\n{'user': 'acct:zplin@hypothes.is', 'text': '原则上，我们应该使用参数\\\\theta的完整贝叶斯后验分布进行预测，但单点估计常常也是需要的', 'origin_text': '，而不仅是估计μmμm\\\\mu_m。最大后验（MAP）估计  !!!虽然使用完整的贝叶斯后验分布进行参数θθ\\\\Vtheta预测是非常合理的，但仍常常希望能够进行单点估计。!!!  希望点估计的一个常见原因是，对于非常有趣的模型而言，大部分涉及到', 'time': '2017-01-27T06:09'}\n{'user': 'acct:zplin@hypothes.is', 'text': '大多数有意义的', 'origin_text': '但仍常常希望能够进行单点估计。希望点估计的一个常见原因是，对于  !!!非常有趣!!!  的模型而言，大部分涉及到贝叶斯后验的操作是非常棘手的，点估计提供', 'time': '2017-01-27T06:10'}\n{'user': 'acct:zplin@hypothes.is', 'text': '我们仍然可以让先验影响点估计的选择而利用贝叶斯方法的优点，而不是简单地回归到最大似然估计', 'origin_text': '及到贝叶斯后验的操作是非常棘手的，点估计提供了一个可解的近似。  !!!并非简单地回归到最大似然学习，我们仍然可以通过先验影响点估计的选择而获取贝叶斯方法的优点。!!!  一种能够做到这一点的合理方式是选择最大后验点估计。MAP估计', 'time': '2017-01-27T06:15'}\n{'user': 'acct:zplin@hypothes.is', 'text': '的优势是能够利用来自先验而非训练数据的信息', 'origin_text': '贝叶斯推断对应着权重衰减。正如全贝叶斯推断，MAP贝叶斯推断  !!!具有训练数据没有的，先验带来的信息利用优势!!!  。该附加信息有助于减少最大后验点估计的方差（相比于ML估计）。', 'time': '2017-01-27T06:23'}\n{'user': 'acct:zplin@hypothes.is', 'text': '估计', 'origin_text': '增加了偏差。许多正规化估计方法，例如权重衰减正则化的最大似然  !!!学习!!!  学习，可以被解释为贝叶斯推断的MAP近似。这个解释产生于正则化', 'time': '2017-01-27T06:24'}\n{'user': 'acct:zplin@hypothes.is', 'text': '机器学习中反复出现的一个问题是好的泛化需要大的训练集，', 'origin_text': '降。随机梯度下降是\\\\sec?介绍的梯度下降算法的一个扩展。  !!!机器学习中的一个循环问题是大的数据集是好的泛化所必要的!!!  ，但大的训练集的计算代价也更大。机器学习算法中的损失函数', 'time': '2017-01-27T06:34'}\n{'user': 'acct:zplin@hypothes.is', 'text': '一小批样本？', 'origin_text': '样本近似估计。具体而言，在算法的每一步，我们从训练集中均匀抽出  !!!一minibatch样本!!!   B=x(1),…,x(m′)B=x(1),…,x(m′)\\\\Se', 'time': '2017-01-27T06:37'}\n{'user': 'acct:zplin@hypothes.is', 'text': '用于本书第二部分中的训练时效果不错。', 'origin_text': '用到非凸优化问题被视为鲁莽的或无原则的。现在，我们知道梯度下降  !!!用于训练第二部分中工作效果!!!  很好。优化算法可能不能保证在合理的时间内达到一个局部最小值，但', 'time': '2017-01-27T06:45'}\n{'user': 'acct:zplin@hypothes.is', 'text': '不一定能', 'origin_text': '现在，我们知道梯度下降用于训练第二部分中工作效果很好。优化算法  !!!可能不能!!!  保证在合理的时间内达到一个局部最小值，但它通常能足够快地找到损失', 'time': '2017-01-27T06:45'}\n{'user': 'acct:zplin@hypothes.is', 'text': '及时地找到损失函数一个很小的值，', 'origin_text': '优化算法可能不能保证在合理的时间内达到一个局部最小值，但它通常能  !!!足够快地找到损失函数的一个可以用的非常低的值。!!!  随机梯度下降在深度学习之外有很多重要的应用。它是在大规', 'time': '2017-01-27T06:52'}\n{'user': 'acct:zplin@hypothes.is', 'text': '所有', 'origin_text': '，当mmm趋向于无限大时，该模型最终会在随机梯度下降抽样训练集上  !!!的每个!!!  样本前收敛到可能的最优测试误差。继续增加mmm不会延长达到模', 'time': '2017-01-27T06:55'}\n{'user': 'acct:zplin@hypothes.is', 'text': '用词统一', 'origin_text': '负时，支持向量机预测属于负类。支持向量机的一个重要创新是  !!!核技巧。核策略!!!  观察到许多机器学习算法都可以写成样本间点积的形式。例如，支持向', 'time': '2017-01-30T04:31'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '原文中challenge没有翻译出来。pattern直接翻译成模式就好\\n\\n试译：我们会探讨拟合训练数据的挑战和寻找能够泛化到新数据的模式有哪些不同', 'origin_text': '绍学习算法的定义，并介绍一个简单的示例：线性回归算法。接下来，  !!!我们会探讨拟合训练数据和寻找能够泛化到新数据的参数有哪些不同!!!  。大部分机器学习算法都有\\\\emph{超参数}（必须在学习算法外', 'time': '2017-01-31T09:41'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '不太关注为这些函数提供置信区间', 'origin_text': '本质上属于应用统计学，更多关注于如何用计算机统计地估计复杂函数，  !!!不太关注这些函数的置信区间!!!  ；因此我们会探讨两种统计学的主要方法：频率估计和贝叶斯推断。大', 'time': '2017-01-31T09:51'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '字面意思是，\\n这些挑战促进了解决这些问题的深度学习算法的发展。\\n', 'origin_text': '后在\\\\sec?，我们会介绍一些限制传统机器学习泛化能力的因素。  !!!这些挑战促进了深度学习的发展，以解决这些问题。!!!  学习算法机器学习算法是一种可以从数据中学习的算法。', 'time': '2017-01-31T10:17'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '像素值', 'origin_text': 'ixix_i是一个特征。例如，一张图片的特征通常是指这张图片的  !!!像素!!!  。机器学习可以解决很多类型的任务。一些非常常见的机器学', 'time': '2017-01-31T11:11'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '变得更有挑战性', 'origin_text': '失分类}：  当输入向量的每个度量不被保证的时候，分类问题将会  !!!更有挑战!!!  。  为了解决分类任务，学习算法只需要定义\\\\emph{一个}从', 'time': '2017-01-31T11:21'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '对给定输入', 'origin_text': '      \\\\textbf{回归}：这类任务中，计算机程序会  !!!给定输入!!!  预测数值。  为了解决这个问题，学习算法会输出函数f:Rn→R', 'time': '2017-01-31T11:35'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '结构化输出任务涉及到输出是向量或者其他包含多个值的数据结构，构成输出的这些不同元素间具有重要关系。', 'origin_text': 'ite?}。        \\\\textbf{结构化输出}：  !!!结构化输出任务涉及到输出是不同元素之间重要关系的向量（或者是含多个值的其他数据结构）的任务!!!  。  这是一个很大的范畴，包括上面转录任务和翻译任务在内的很多', 'time': '2017-01-31T12:07'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': 'probability mass function一般被译为概率质量函数', 'origin_text': '解释成样本采样空间的概率密度函数（如果xx\\\\RVx是连续的）或者  !!!概率分布律函数!!!  （如果xx\\\\RVx是离散的）。  要做好这样的任务（当我们讨论', 'time': '2017-01-31T12:23'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '密度估计', 'origin_text': '上描述的大多数任务都要求学习算法至少能隐式地抓住概率分布的结构。  !!!  密度分布!!!  可以让我们显式地抓住该分布。  原则上，我们可以在该分布上计算', 'time': '2017-01-31T12:30'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '因此，我们使用测试数据来评估系统性能，同训练机器学习系统的数据分来。', 'origin_text': '将决定其在现实生活中的性能如何。因此，我们将训练机器学习系统的  !!!训练集数据中的一部分作为测试集数据!!!  评估系统性能。性能度量的选择或许看上去简单且客观，但是选择一', 'time': '2017-01-31T12:47'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '很多', 'origin_text': '学习和监督学习不是严格定义的术语。它们之间界线通常是模糊的。  !!!大部分!!!  机器学习技术可以用于这两个任务。例如，概率的链式法则表明对于向', 'time': '2017-01-31T14:30'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '其上数据?', 'origin_text': '数据集中的样本都是彼此相互独立的，并且训练集和测试集是同分布的，  !!!其上数据!!!  采样自相同的分布。这个假设使我们能够在单个样本上用概率分布描述', 'time': '2017-01-31T22:11'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '通常会最佳（generally ）', 'origin_text': '算法的容量适合于所执行任务的复杂度和所提供数据的数量时，算法效果  !!!会最佳!!!  。容量不足的模型不能解决复杂任务。容量高的模型能够解决复杂的', 'time': '2017-02-01T12:21'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '任务所需', 'origin_text': '解决复杂任务。容量高的模型能够解决复杂的任务，但是当其容量高于  !!!任务!!!  时，有可能会过拟合。\\\\fig?展示了这个原理在使用中的情况。', 'time': '2017-02-01T12:22'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '真实二次', 'origin_text': '个原理在使用中的情况。我们比较了线性，二次和999次预测器拟合  !!!二次真实!!!  函数的效果。线性函数无法刻画真实函数的曲率，所以欠拟合。99', 'time': '2017-02-01T12:23'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': 'formalized 应该是 形式化 ', 'origin_text': '”最简单”的那一个。这个想法是在20世纪，由统计学习理论创始人  !!!提出来!!!  并精确化的{cite?}。统计学习理论提供了量化模型容量的不', 'time': '2017-02-01T12:42'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '似然', 'origin_text': '\\\\text{data}}(\\\\Vx)。θθ\\\\Vtheta的最大  !!!后验!!!  估计被定义为：θML=argmaxθpmodel(X;θ),=', 'time': '2017-02-05T21:13'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '还原？', 'origin_text': '}(\\\\cdot; \\\\Vtheta) 中。  否则，没有估计可以  !!!表示!!!  pdatapdatap_{\\\\text{data}}。    ', 'time': '2017-02-07T11:47'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '统计效率通常用于有参情况研究中', 'origin_text': '等价地，可能只需要较少的样本就能达到一个固定程度的泛化误差。  !!!通常，统计效率研究于有参情况!!!  （例如线性回归）。有参情况中我们的目标是估计参数值（假设有可能确', 'time': '2017-02-07T11:54'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '使用\\n\\n原文是makes predictions using...make predictions using...', 'origin_text': '不像最大似然方法预测时使用θθ\\\\Vtheta的点估计，贝叶斯方法  !!!预测!!!  θθ\\\\Vtheta的全分布。例如，在观测到mmm个样本后，下一', 'time': '2017-02-07T13:02'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '每个具有正概率密度的θ的值', 'origin_text': 'm{d}\\\\Vtheta .\\\\end{equation}这里，  !!!具有正概率密度的θθ\\\\Vtheta的每个值!!!  有助于下一个样本的预测，其中贡献由后验密度本身加权。在观测到数', 'time': '2017-02-07T13:04'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '线性映射', 'origin_text': 'Vx\\\\in\\\\SetR^n预测标量y∈Ry∈Ry\\\\in\\\\SetR的  !!!映射!!!  。该预测参数化为向量w∈Rnw∈Rn\\\\Vw \\\\in \\\\SetR', 'time': '2017-02-07T14:40'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '该预测参数为向量w 或者\\n该预测为向量w所参数化', 'origin_text': 'etR^n预测标量y∈Ry∈Ry\\\\in\\\\SetR的映射。该预测  !!!参数化为向量!!!  w∈Rnw∈Rn\\\\Vw \\\\in \\\\SetR^n：y^=w⊤x.', 'time': '2017-02-07T14:41'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '为确定', 'origin_text': '})简单表示为(X,y)(X,y)(\\\\MX, \\\\Vy)。  !!!确定!!!  模型参数向量ww\\\\Vw的后验分布，我们首先需要指定一个先验分布。', 'time': '2017-02-07T14:43'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '带通用核的核机器致力于泛化得更好', 'origin_text': '，核机器的计算量也会很大。我们将会在\\\\sec?回顾这个想法。  !!!带通用核的核机器会泛化得更好!!!  。我们将在\\\\sec?解释原因。现代深度学习的设计旨在克服核机', 'time': '2017-02-12T23:50'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '它甚至', 'origin_text': '-最近邻算法没有任何参数，而是使用训练数据的简单函数。事实上，  !!!甚至!!!  也没有一个真正的训练阶段或学习过程。反之，在测试阶段我们希望在', 'time': '2017-02-12T23:52'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '另一类', 'origin_text': '因此，小训练集上的输出将会非常随机。决策树，及其变种是  !!!一类!!!  将输入空间分成不同的区域，每个区域有独立的参数的算法{cite?', 'time': '2017-02-13T00:01'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '已知', 'origin_text': 'z=W⊤x\\\\Vz=\\\\MW^\\\\Tsp\\\\Vx。在\\\\sec?，我们  !!!看到!!!  设计矩阵 XX\\\\MX的主成分由X⊤XX⊤X\\\\MX^\\\\Tsp\\\\MX', 'time': '2017-02-21T12:44'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': 'PCA通过线性变换找到一个Var[z]Var[z]\\\\text{Var}[\\\\Vz]是对角矩阵的表示', 'origin_text': '} \\\\MX^\\\\Tsp \\\\MX .\\\\end{equation}  !!!PCA会找到一个Var[z]Var[z]\\\\text{Var}[\\\\Vz]是对角矩阵的表示（通过线性变换）!!!  z=W⊤xz=W⊤x\\\\Vz=\\\\MW^\\\\Tsp\\\\Vx。在\\\\se', 'time': '2017-02-21T12:45'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '主成分', 'origin_text': '^\\\\Tsp .\\\\end{equation}本节中，我们会探索  !!!主成分分析!!!  的另一种推导。主成分也可以通过奇异值分解得到。具体地，它们是', 'time': '2017-02-21T12:45'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '能够消除更复杂形式的特征依赖的表示学习 或者\\n能够消除特征依赖形式更为复杂的表示学习', 'origin_text': '虽然相关性是数据元素间依赖关系的一个重要范畴，但我们对于  !!!能够消除特征依赖更复杂形式的表示学习!!!  也很有兴趣。对此，我们需要比简单线性变换能做到更多的工具。', 'time': '2017-02-21T12:52'}\n{'user': 'acct:fairmiracle@hypothes.is', 'text': '代价\\n\\n损失函数包含正则化项听起来有点怪。代价函数=损失+正则化比较合理。但前文均用损失函数,wikipedia对loss function 和cost function也未作区分。\\nhttps://en.wikipedia.org/wiki/Loss_function\\n\\nhttp://stats.stackexchange.com/questions/179026/objective-function-cost-function-loss-function-are-they-the-same-thing', 'origin_text': '见的损失函数是负对数似然，最小化损失函数导致的最大似然估计。  !!!损失!!!  函数也可能含有附加项，如正则化项。例如，我们可以将权重衰减加到', 'time': '2017-02-21T14:58'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:zplin@hypothes.is', 'text': '嗯，我也不知道为什么当时这么改了', 'time': '2017-03-03T04:15'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞！终于清楚 损失函数 和 代价函数 的区别了！', 'time': '2017-03-02T16:35'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞！这个译得好！', 'time': '2017-03-02T15:42'}\n{'user': 'acct:liber145@hypothes.is', 'text': '有想很好地泛化么，感觉不是很通。又给改回去了，你看怎么样。', 'time': '2017-03-02T15:31'}\n{'user': 'acct:liber145@hypothes.is', 'text': '今天看到原文是 While the k-nearest neighbors algorithm，又给改回去了。', 'time': '2017-03-02T15:23'}\n{'user': 'acct:liber145@hypothes.is', 'text': '想表达 训练集和测试集的数据，画蛇添足了。这里修改为直接去掉。', 'time': '2017-02-01T02:07'}\n{'user': 'acct:liber145@hypothes.is', 'text': '额，翻译组有同学发现有教材书上翻译成这样了。暂时先弄成这样，之后可能会统一修改。', 'time': '2017-02-01T02:03'}\n{'user': 'acct:liber145@hypothes.is', 'text': '谢谢。之前的翻译太拗口了。进一步细看后，我觉得这句话是在讲结构化输出任务的特性。翻译成如下怎么样。\\n\\n结构化输出任务的输出是向量或者其他包含多个值的数据结构，并且构成输出的这些不同元素间具有重要关系。', 'time': '2017-02-01T01:45'}\n{'user': 'acct:liber145@hypothes.is', 'text': '缩写会理解为，比较 挑战 和 模式 有哪些不同，觉得不是很妥。比较两个挑战，还是觉得不妥。现计划改成下面这样，你看如何。\\n\\n我们会探讨拟合训练数据和泛化到新数据之间有哪些不同的挑战。', 'time': '2017-02-01T01:34'}\n{'user': 'acct:zplin@hypothes.is', 'text': '从“任务”的这种严格意义上说，学习过程本身不能算是任务。', 'time': '2017-01-25T14:41'}\n{'user': 'acct:liber145@hypothes.is', 'text': '多谢啦！：）我们二期校对截止时间在三月份，不过如果中间你有事情比较忙，可以随时告知我们。校对毕竟是一件比较耗时的事情，现在帮我们精细校对这么多，已经非常感谢啦！！', 'time': '2017-01-21T01:55'}\n{'user': 'acct:zplin@hypothes.is', 'text': '好的，我尽量', 'time': '2017-01-20T04:49'}\n{'user': 'acct:liber145@hypothes.is', 'text': '非常谢谢帮忙！你提供的修订都十分中肯，如果时间允许的话，不知道可不可以进行本章的中英校正，或是挑选其他感兴趣的章节。', 'time': '2017-01-19T22:46'}\n{'user': 'acct:liber145@hypothes.is', 'text': '嗯，好的。', 'time': '2017-01-19T22:41'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。我看了下链接的英文条目，觉得你说的有道理。翻译成必定发生的意思，确实不贴切。相比之下，“允许”更好一点。', 'time': '2017-01-19T22:40'}\n{'user': 'acct:zplin@hypothes.is', 'text': '很高兴能帮上忙', 'time': '2017-01-19T21:37'}\n{'user': 'acct:zplin@hypothes.is', 'text': '可以的。我主要想突出“深度”是修饰“表示”而不是修饰“分布”', 'time': '2017-01-19T21:35'}\n{'user': 'acct:zplin@hypothes.is', 'text': '嗯，这个我也想了很久，没想出比较精确地道的翻译。主要就是allow这个词我想不出在这里怎么译好。allow只是说为某事创造了可能，但并不是某事必然会发生。这里应该用的是《美国传统词典》allow条文第2个含义：To permit the presence of: https://www.ahdictionary.com/word/search.html?q=allow\\n译成“使……具有”感觉有点太肯定了，而“允许”确实有点怪。你们再集思广益一下', 'time': '2017-01-19T21:32'}\n{'user': 'acct:zplin@hypothes.is', 'text': '都可以。就是觉得用拷贝这个音译词显得不地道', 'time': '2017-01-19T21:20'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。书中出现了很多distributed representation，将其统一译作了“分布式表示”。这里修改为“深度的分布式表示”，你看如何。', 'time': '2017-01-19T19:49'}\n{'user': 'acct:liber145@hypothes.is', 'text': '允许指数增益，感觉有点怪，不知道你觉得如何。\\n\\n现打算修改为“ 这些很温和的假设使样本数目和可区分区间数目之间具有指数增益 ”\\n\\n', 'time': '2017-01-19T19:48'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的', 'time': '2017-01-19T19:40'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的，多谢科普！', 'time': '2017-01-19T19:38'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T19:28'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T19:26'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的', 'time': '2017-01-19T19:26'}\n{'user': 'acct:liber145@hypothes.is', 'text': '这个好！', 'time': '2017-01-19T19:24'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'OK', 'time': '2017-01-19T19:23'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'OK', 'time': '2017-01-19T19:22'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T19:22'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T19:21'}\n{'user': 'acct:liber145@hypothes.is', 'text': '这个好！我们暂时将learner给翻译成学习器了。这里我用学习器。', 'time': '2017-01-19T19:20'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好！', 'time': '2017-01-19T19:14'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'OK', 'time': '2017-01-19T19:13'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T19:12'}\n{'user': 'acct:liber145@hypothes.is', 'text': '这个好！！', 'time': '2017-01-19T19:10'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T19:10'}\n{'user': 'acct:liber145@hypothes.is', 'text': '哈哈，抄袭有点贬义了。用 复制或重复 怎么样。目前打算使用复制。', 'time': '2017-01-19T19:09'}\n{'user': 'acct:liber145@hypothes.is', 'text': '这个好！', 'time': '2017-01-19T19:03'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T18:59'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'OK', 'time': '2017-01-19T18:58'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。按照原文来，我给看成老版的了。你翻译的是对的。\\n\\n多谢你帮忙校对，给予了我们很大帮助。之前翻译组校对了一轮，但现在看来问题还是很多。多谢啦！', 'time': '2017-01-19T18:57'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。', 'time': '2017-01-19T18:52'}\n{'user': 'acct:zplin@hypothes.is', 'text': '”更“可以去掉，听起来更顺些，也不影响意思。\\n后半句我还是觉得译成”而仅仅通过它们对函数的影响来改变参数。“更接近原文，而且好像也挺顺的。你们再考虑考虑。毕竟原文没有提到参数与函数的关系，只是暗示。', 'time': '2017-01-19T17:39'}\n{'user': 'acct:liber145@hypothes.is', 'text': '比之前翻译的好很多！', 'time': '2017-01-19T17:36'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的！', 'time': '2017-01-19T17:35'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的。干脆去掉“更”，调整成这样，你看怎么样。\\n\\n通俗地讲，我们也可以说先验信念直接影响函数本身，间接影响参数（间接源自函数与参数的关系）。', 'time': '2017-01-19T17:27'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的', 'time': '2017-01-19T17:16'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'OK', 'time': '2017-01-19T17:16'}\n{'user': 'acct:liber145@hypothes.is', 'text': '好的', 'time': '2017-01-19T17:16'}\n{'user': 'acct:liber145@hypothes.is', 'text': '这里想指 其他上面列举过的任务 和 其他上面没列举过的任务。\\n翻译成 “其他同类型或其他类型的任务”，你看怎么样。', 'time': '2017-01-19T17:13'}\n{'user': 'acct:liber145@hypothes.is', 'text': \"在相对正式的``任务''定义中，学习过程本身并不是任务。\\n这样如何？\", 'time': '2017-01-19T17:11'}"
  },
  {
    "path": "Chapter5/machine_learning_basics.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Yujun Li \n\\chapter{\\glsentrytext{ML}基础}\n\\label{chap:machine_learning_basics}\n\\gls{DL}是\\gls{ML}的一个特定分支。\n我们要想充分理解\\gls{DL}，必须对\\gls{ML}的基本原理有深刻的理解。\n本章将探讨贯穿本书其余部分的一些\\gls{ML}重要原理。\n我们建议新手读者或是希望更全面了解的读者参考一些更全面覆盖基础知识的\\gls{ML}参考书，例如~\\cite{MurphyBook2012}或者~\\cite{bishop-book2006}。\n如果你已经熟知\\gls{ML}，可以跳过前面的部分，前往\\secref{sec:challenges_motivating_deep_learning}。\n\\secref{sec:challenges_motivating_deep_learning}涵盖了一些传统\\gls{ML}技术观点，这些技术对\\gls{DL}的发展有着深远影响。\n\n首先，我们将介绍学习算法的定义，并介绍一个简单的示例：\\gls{linear_regression}算法。\n接下来，我们会探讨拟合训练数据与寻找能够泛化到新数据的模式存在哪些不同的挑战。\n大部分\\gls{ML}算法都有\\emph{超参数}（必须在学习算法外设定）；我们将探讨如何使用额外的数据设置超参数。\n\\gls{ML}本质上属于应用统计学，更多地关注于如何用计算机统计地估计复杂函数，不太关注为这些函数提供置信区间；因此我们会探讨两种统计学的主要方法：频率派估计和\\gls{bayesian_inference}。\n大部分\\gls{ML}算法可以分成\\gls{supervised_learning}和\\gls{unsupervised_learning}两类；我们将探讨不同的分类，并为每类提供一些简单的\\gls{ML}算法作为示例。\n大部分\\gls{DL}算法都是基于被称为\\gls{SGD}的算法求解的。\n我们将介绍如何组合不同的算法部分，例如优化算法、\\gls{cost_function}、模型和\\gls{dataset}，来建立一个\\gls{ML}算法。\n最后在\\secref{sec:challenges_motivating_deep_learning}，我们会介绍一些限制传统\\gls{ML}泛化能力的因素。\n这些挑战促进了解决这些问题的\\gls{DL}算法的发展。\n\n% -- 95 --\n\n\\section{学习算法}\n\\label{sec:learning_algorithms}\n\\gls{ML}算法是一种能够从数据中学习的算法。\n然而，我们所谓的``学习''是什么意思呢？\n\\cite{Mitchell:1997:ML}提供了一个简洁的定义：``对于某类任务$T$和\\gls{performance_measures} $P$，一个计算机程序被认为可以从\\gls{experience} $E$中学习是指，通过\\gls{experience} $E$改进后，它在任务$T$上由\\gls{performance_measures} $P$衡量的性能有所提升。''\n\\gls{experience} $E$，任务$T$和\\gls{performance_measures} $P$的定义范围非常宽广，在本书中我们并不会试图去解释这些定义的具体意义。\n相反，我们会在接下来的章节中提供直观的解释和示例来介绍不同的任务、\\gls{performance_measures}和\\gls{experience}，这些将被用来构建\\gls{ML}算法。\n\n\\subsection{任务 $T$}\n\\label{sec:the_task_t}\n\\gls{ML}可以让我们解决一些人为设计和使用确定性程序很难解决的问题。\n从科学和哲学的角度来看，\\gls{ML}受到关注是因为提高我们对\\gls{ML}的认识需要提高我们对智能背后原理的理解。\n\n\n从``任务''的相对正式的定义上说，学习过程本身不能算是任务。\n学习是我们所谓的获取完成任务的能力。\n例如，我们的目标是使机器人能够行走，那么行走便是任务。\n我们可以编程让机器人学会如何行走，或者可以人工编写特定的指令来指导机器人如何行走。\n\n\n通常\\gls{ML}任务定义为\\gls{ML}系统应该如何处理\\firstgls{example:chap5}。\n\\gls{example:chap5}是指我们从某些希望\\gls{ML}系统处理的对象或事件中收集到的已经量化的\\firstgls{feature}的集合。\n我们通常会将\\gls{example:chap5}表示成一个向量$\\Vx\\in\\SetR^n$，其中向量的每一个元素$x_i$是一个\\gls{feature}。\n例如，一张图片的\\gls{feature}通常是指这张图片的像素值。\n\n% -- 96 --\n\n\\gls{ML}可以解决很多类型的任务。\n一些非常常见的\\gls{ML}任务列举如下：\n\\begin{itemize}\n    \\item \\textbf{分类}：\n    在这类任务中，计算机程序需要指定某些输入属于$k$类中的哪一类。\n    为了完成这个任务，学习算法通常会返回一个函数$f:\\SetR^n \\to \\{1,\\dots,k\\}$。\n    当$y=f(\\Vx)$时，模型将向量$\\Vx$所代表的输入分类到数字码$y$所代表的类别。\n    还有一些其他的分类问题，例如，$f$输出的是不同类别的概率分布。\n    分类任务中有一个任务是对象识别，其中输入是图片（通常由一组像素亮度值表示），输出是表示图片物体的数字码。\n    例如，Willow Garage PR2机器人能像服务员一样识别不同饮料，并送给点餐的顾客\\citep{Goodfellow2010}。\n    目前，最好的对象识别工作正是基于\\gls{DL}的\\citep{Krizhevsky-2012-small,Ioffe+Szegedy-2015}。\n    对象识别同时也是计算机识别人脸的基本技术，可用于标记相片合辑中的人脸\\citep{Taigman-et-al-CVPR2014}，有助于计算机更自然地与用户交互。\n    \n    \\item \\textbf{输入缺失分类}：\n    当输入向量的每个度量不被保证的时候，分类问题将会变得更有挑战性。\n    为了解决分类任务，学习算法只需要定义\\emph{一个}从输入向量映射到输出类别的函数。\n    当一些输入可能丢失时，学习算法必须学习\\emph{一组}函数，而不是单个分类函数。\n    每个函数对应着分类具有不同缺失输入子集的$\\Vx$。\n    这种情况在医疗诊断中经常出现，因为很多类型的医学测试是昂贵的，对身体有害的。\n    有效地定义这样一个大集合函数的方法是学习所有相关变量的概率分布，然后通过边缘化缺失变量来解决分类任务。 \n    使用$n$个输入变量，我们现在可以获得每个可能的缺失输入集合所需的所有$2^n$个不同的分类函数，但是计算机程序仅需要学习一个描述联合概率分布的函数。\n    参见~\\cite{Goodfellow-et-al-NIPS2013}了解以这种方式将深度概率模型应用于这类任务的示例。 \n    本节中描述的许多其他任务也可以推广到缺失输入的情况; 缺失输入分类只是\\gls{ML}能够解决的问题的一个示例。\n    \n% -- 97 --\n\n    \\item \\textbf{回归}：在这类任务中，计算机程序需要对给定输入预测数值。\n    为了解决这个任务，学习算法需要输出函数$f:\\SetR^n \\to \\SetR$。\n    除了返回结果的形式不一样外，这类问题和分类问题是很像的。\n    这类任务的一个示例是预测投保人的索赔金额（用于设置保险费），或者预测证券未来的价格。\n    这类预测也用在算法交易中。\n    \n    \\item \\textbf{\\gls{transcribe}}：\n    这类任务中，\\gls{ML}系统观测一些相对非结构化表示的数据，并\\gls{transcribe}信息为离散的文本形式。\n    例如，光学字符识别要求计算机程序根据文本图片返回文字序列（ASCII码或者Unicode码）。\n    谷歌街景以这种方式使用\\gls{DL}处理街道编号\\citep{Goodfellow+et+al-ICLR2014a}。\n    另一个例子是语音识别，计算机程序输入一段音频波形，输出一序列音频记录中所说的字符或单词ID的编码。\n    \\gls{DL}是现代语音识别系统的重要组成部分，被各大公司广泛使用，包括微软，IBM和谷歌\\citep{deepSpeechReviewSPM2012}。\n\n    \\item \\textbf{机器翻译}：在机器翻译任务中，输入是一种语言的符号序列，计算机程序必须将其转化成另一种语言的符号序列。\n    这通常适用于自然语言，如将英语译成法语。\n    最近，\\gls{DL}已经开始在这个任务上产生重要影响\\citep{Sutskever-et-al-NIPS2014,Bahdanau-et-al-ICLR2015-small}。\n\n    \\item \\textbf{结构化输出}：结构化输出任务的输出是向量或者其他包含多个值的数据结构，并且构成输出的这些不同元素间具有重要关系。\n    这是一个很大的范畴，包括上述\\gls{transcribe}任务和翻译任务在内的很多其他任务。\n    例如语法分析——映射自然语言句子到语法结构树，并标记树的节点为动词、名词、副词等等。\n    参考~\\cite{Collobert-AISTATS2011}将\\gls{DL}应用到语法分析的示例。\n    另一个例子是图像的像素级分割，将每一个像素分配到特定类别。\n    例如，\\gls{DL}可用于标注航拍照片中的道路位置\\citep{MnihHinton2010}。\n    在这些标注型的任务中，输出的结构形式不需要和输入尽可能相似。\n    例如，在为图片添加描述的任务中，计算机程序观察到一幅图，输出描述这幅图的自然语言句子\\citep{Kiros-et-al-ICML2014,Kiros-et-al-arxiv2014,Mao-et-al-2014,Vinyals-et-al-CVPR2015,Donahue-et-al-arxiv2014,Karpathy+Li-CVPR2015,Fang-et-al-CVPR2015,Xu-et-al-ICML2015}。\n    这类任务被称为\\emph{结构化输出任务}是因为输出值之间内部紧密相关。\n    例如，为图片添加标题的程序输出的单词必须组合成一个通顺的句子。\n\n% -- 98 --\n\n    \\item \\textbf{异常检测}：在这类任务中，计算机程序在一组事件或对象中筛选，并标记不正常或非典型的个体。\n    异常检测任务的一个示例是信用卡欺诈检测。\n    通过对你的购买习惯建模，信用卡公司可以检测到你的卡是否被滥用。\n    如果窃贼窃取你的信用卡或信用卡信息，窃贼采购物品的分布通常和你的不同。\n    当该卡发生了不正常的购买行为时，信用卡公司可以尽快冻结该卡以防欺诈。\n    参考~\\cite{chandola2009anomaly}了解欺诈检测方法。\n\n    \\item \\textbf{合成和采样}：在这类任务中，\\gls{ML}程序生成一些和训练数据相似的新\\gls{example:chap5}。\n    通过\\gls{ML}，合成和采样可能在媒体应用中非常有用，可以避免艺术家大量昂贵或者乏味费时的手动工作。\n    例如，视频游戏可以自动生成大型物体或风景的纹理，而不是让艺术家手动标记每个像素\\citep{Luo+al-AISTATS2013-small}。\n    在某些情况下，我们希望采样或合成过程可以根据给定的输入生成一些特定类型的输出。\n    例如，在语音合成任务中，我们提供书写的句子，要求程序输出这个句子语音的音频波形。\n    这是一类\\emph{结构化输出任务}，但是多了每个输入并非只有一个正确输出的条件，并且我们明确希望输出有很多变化，这可以使结果看上去更加自然和真实。\n\n    \\item \\textbf{缺失值填补}：在这类任务中，\\gls{ML}算法给定一个新\\gls{example:chap5} $\\Vx\\in\\SetR^n$，$\\Vx$中某些元素$x_i$缺失。\n    算法必须填补这些缺失值。\n\n% -- 99 --\n\n    \\item \\textbf{\\gls{denoising}}：在这类任务中，\\gls{ML}算法的输入是，\\emph{干净\\gls{example:chap5}}~$\\Vx \\in \\SetR^n$经过未知损坏过程后得到的\\emph{损坏\\gls{example:chap5}}~$\\tilde{\\Vx} \\in \\SetR^n$。\n    算法根据损坏后的\\gls{example:chap5} $\\tilde{\\Vx}$预测干净的\\gls{example:chap5} $\\Vx$，或者更一般地预测条件概率分布$p(\\Vx\\mid\\tilde{\\Vx})$。\n    \n    \\item \\textbf{密度估计}或\\textbf{\\gls{PMF}估计}：在密度估计问题中，\\gls{ML}算法学习函数$p_{\\text{model}}:\\SetR^n \\to \\SetR$，其中$p_{\\text{model}}(\\Vx)$可以解释成\\gls{example:chap5}采样空间的概率密度函数（如果$\\RVx$是连续的）或者\\gls{PMF}（如果$\\RVx$是离散的）。\n    要做好这样的任务（当我们讨论\\gls{performance_measures} $P$时，我们会明确定义任务是什么），算法需要学习观测到的数据的结构。\n    算法必须知道什么情况下\\gls{example:chap5}聚集出现，什么情况下不太可能出现。\n    以上描述的大多数任务都要求学习算法至少能隐式地捕获概率分布的结构。\n    密度估计可以让我们显式地捕获该分布。\n    原则上，我们可以在该分布上计算以便解决其他任务。\n    例如，如果我们通过密度估计得到了概率分布$p(\\Vx)$，我们可以用该分布解决缺失值填补任务。\n    如果$x_i$的值是缺失的，但是其他的变量值$\\Vx_{-i}$已知，那么我们可以得到条件概率分布$p(x_i\\mid\\Vx_{-i})$。\n    实际情况中，密度估计并不能够解决所有这类问题，因为在很多情况下$p(\\Vx)$是难以计算的。\n\\end{itemize}\n\n当然，还有很多其他同类型或其他类型的任务。\n这里我们列举的任务类型只是用来介绍\\gls{ML}可以做哪些任务，并非严格地定义\\gls{ML}任务分类。\n\n\\subsection{\\glsentrytext{performance_measures} $P$}\n\\label{sec:the_performance_measure_p}\n为了评估\\gls{ML}算法的能力，我们必须设计其性能的定量度量。\n通常\\gls{performance_measures} $P$是特定于系统执行的任务$T$而言的。\n\n对于诸如分类、缺失输入分类和\\gls{transcribe}任务，我们通常度量模型的\\firstgls{accuracy}。\n\\gls{accuracy}是指该模型输出正确结果的\\gls{example:chap5}比率。\n我们也可以通过\\firstgls{error_rate}得到相同的信息。\n\\gls{error_rate}是指该模型输出错误结果的\\gls{example:chap5}比率。\n我们通常把\\gls{error_rate}称为$0-1$\\gls{loss}的期望。\n在一个特定的\\gls{example:chap5}上，如果结果是对的，那么$0-1$\\gls{loss}是$0$；否则是$1$。\n但是对于密度估计这类任务而言，度量准确率，错误率或者其他类型的$0-1$\\gls{loss}是没有意义的。\n反之，我们必须使用不同的性能度量，使模型对每个\\gls{example:chap5}都输出一个连续数值的得分。\n最常用的方法是输出模型在一些\\gls{example:chap5}上概率对数的平均值。\n\n\n% -- 100 --\n\n通常，我们会更加关注\\gls{ML}算法在未观测数据上的性能如何，因为这将决定其在实际应用中的性能。\n因此，我们使用\\firstgls{test_set}数据来评估系统性能，将其与训练机器学习系统的训练集数据分开。\n\n\n\\gls{performance_measures}的选择或许看上去简单且客观，但是选择一个与系统理想表现对应的\\gls{performance_measures}通常是很难的。\n\n\n在某些情况下，这是因为很难确定应该度量什么。\n例如，在执行\\gls{transcribe}任务时，我们是应该度量系统\\gls{transcribe}整个序列的准确率，还是应该用一个更细粒度的指标，对序列中正确的部分元素以正面评价？\n在执行回归任务时，我们应该更多地惩罚频繁犯一些中等错误的系统，还是较少犯错但是犯很大错误的系统？\n这些设计的选择取决于应用。\n\n\n还有一些情况，我们知道应该度量哪些数值，但是度量它们不太现实。\n这种情况经常出现在密度估计中。\n很多最好的概率模型只能隐式地表示概率分布。\n在许多这类模型中，计算空间中特定点的概率是不可行的。\n在这些情况下，我们必须设计一个仍然对应于设计对象的替代标准，或者设计一个理想标准的良好近似。\n\n\\subsection{\\glsentrytext{experience} $E$}\n\\label{sec:the_experience_e}\n根据学习过程中的不同\\gls{experience}，\\gls{ML}算法可以大致分类为\\firstgls{unsupervised}算法和\\firstgls{supervised}算法。\n\n本书中的大部分学习算法可以被理解为在整个\\firstgls{dataset}上获取\\gls{experience}。\n\\gls{dataset}是指很多\\gls{example:chap5}组成的集合，如\\secref{sec:the_task_t}所定义的。\n有时我们也将\\gls{example:chap5}称为\\firstgls{data_points}。\n\n% -- 101 --\n\nIris（鸢尾花卉）\\gls{dataset}~\\citep{Fisher-1936}是统计学家和\\gls{ML}研究者使用了很久的\\gls{dataset}。\n它是$150$个鸢尾花卉植物不同部分测量结果的集合。\n每个单独的植物对应一个\\gls{example:chap5}。\n每个\\gls{example:chap5}的\\gls{feature}是该植物不同部分的测量结果：萼片长度、萼片宽度、花瓣长度和花瓣宽度。\n这个\\gls{dataset}也记录了每个植物属于什么品种，其中共有三个不同的品种。\n\n\\firstgls{unsupervised_learning_algorithm}训练含有很多\\gls{feature}的\\gls{dataset}，然后学习出这个\\gls{dataset}上有用的结构性质。\n在\\gls{DL}中，我们通常要学习生成\\gls{dataset}的整个概率分布，显式地，比如密度估计，或是隐式地，比如合成或\\gls{denoising}。\n还有一些其他类型的\\gls{unsupervised_learning}任务，例如聚类，将\\gls{dataset}分成相似\\gls{example:chap5}的集合。\n\n\\firstgls{supervised_learning_algorithm}训练含有很多\\gls{feature}的\\gls{dataset}，不过\\gls{dataset}中的\\gls{example:chap5}都有一个\\firstgls{label}或\\firstgls{target}。\n例如，Iris~\\gls{dataset}注明了每个鸢尾花卉\\gls{example:chap5}属于什么品种。\n\\gls{supervised_learning}算法通过研究Iris~\\gls{dataset}，学习如何根据测量结果将\\gls{example:chap5}划分为三个不同品种。\n\n大致说来，\\gls{unsupervised_learning}涉及到观察随机向量$\\RVx$的好几个\\gls{example:chap5}，试图显式或隐式地学习出概率分布$p(\\RVx)$，或者是该分布一些有意思的性质；\n而\\gls{supervised_learning}包含观察随机向量$\\RVx$及其相关联的值或向量$\\RVy$，然后从$\\RVx$预测$\\RVy$，通常是估计$p(\\RVy\\mid\\RVx)$。\n术语\\firstgls{supervised_learning}源自这样一个视角，教员或者老师提供\\gls{target} $\\RVy$给\\gls{ML}系统，指导其应该做什么。\n在\\gls{unsupervised_learning}中，没有教员或者老师，算法必须学会在没有指导的情况下理解数据。\n\n\\gls{unsupervised_learning}和\\gls{supervised_learning}不是严格定义的术语。\n它们之间界线通常是模糊的。\n很多\\gls{ML}技术可以用于这两个任务。\n例如，概率的链式法则表明对于向量$\\RVx\\in\\SetR^n$，联合分布可以分解成\n\\begin{equation}\n    p(\\RVx) = \\prod_{i=1}^n p(\\RSx_i \\mid \\RSx_1,\\dots,\\RSx_{i-1}) .\n\\end{equation}\n该分解意味着我们可以将其拆分成$n$个\\gls{supervised_learning}问题，来解决表面上的\\gls{unsupervised_learning} $p(\\Vx)$。\n另外，我们求解\\gls{supervised_learning}问题$p(y\\mid\\RVx)$时，也可以使用传统的\\gls{unsupervised_learning}策略学习联合分布$p(\\RVx,y)$，然后推断\n\\begin{equation}\n    p(y\\mid\\RVx) = \\frac{p(\\RVx,y)}{\\sum_{y'}p(\\RVx,y')}.\n\\end{equation}\n尽管\\gls{unsupervised_learning}和\\gls{supervised_learning}并非完全没有交集的正式概念，它们确实有助于粗略分类我们研究\\gls{ML}算法时遇到的问题。\n传统地，人们将回归、分类或者结构化输出问题称为\\gls{supervised_learning}。\n支持其他任务的密度估计通常被称为\\gls{unsupervised_learning}。\n\n% -- 102 --\n\n学习范式的其他变种也是有可能的。\n例如，半监督学习中，一些\\gls{example:chap5}有监督\\gls{target}，但其他\\gls{example:chap5}没有。\n在多实例学习中，\\gls{example:chap5}的整个集合被标记为含有或者不含有该类的\\gls{example:chap5}，但是集合中单独的样本是没有标记的。\n参考~\\cite{Kotzias2015}了解最近\\gls{deep_model}进行多实例学习的示例。\n\n有些\\gls{ML}算法并不是训练于一个固定的\\gls{dataset}上。\n例如，\\firstgls{reinforcement_learning}算法会和环境进行交互，所以学习系统和它的训练过程会有反馈回路。\n这类算法超出了本书的范畴。\n请参考~\\cite{Sutton+Barto-98}或~\\cite{Bertsekas+Tsitsiklis-book1996}了解强化学习相关知识，\\citet{Deepmind-atari-arxiv2013}介绍了强化学习方向的\\gls{DL}方法。\n\n大部分\\gls{ML}算法简单地训练于一个\\gls{dataset}上。\n\\gls{dataset}可以用很多不同方式来表示。\n在所有的情况下，\\gls{dataset}都是\\gls{example:chap5}的集合，而\\gls{example:chap5}是\\gls{feature}的集合。\n\n表示\\gls{dataset}的常用方法是\\firstgls{design_matrix}。\n\\gls{design_matrix}的每一行包含一个不同的\\gls{example:chap5}。\n每一列对应不同的\\gls{feature}。\n例如，Iris~\\gls{dataset}包含$150$个\\gls{example:chap5}，每个\\gls{example:chap5}有4个\\gls{feature}。\n这意味着我们可以将该\\gls{dataset}表示为\\gls{design_matrix} $\\MX\\in\\SetR^{150\\times 4}$，其中$X_{i,1}$表示第$i$个植物的萼片长度，$X_{i,2}$表示第$i$个植物的萼片宽度等等。\n我们在本书中描述的大部分学习算法都是讲述它们是如何运行在\\gls{design_matrix}\\gls{dataset}上的。\n\n当然，每一个\\gls{example:chap5}都能表示成向量，并且这些向量的维度相同，才能将一个\\gls{dataset}表示成\\gls{design_matrix}。\n这一点并非永远可能。\n例如，你有不同宽度和高度的照片的集合，那么不同的照片将会包含不同数量的像素。\n因此不是所有的照片都可以表示成相同长度的向量。\n\\secref{sec:data_types}和\\chapref{chap:sequence_modeling_recurrent_and_recursive_nets}将会介绍如何处理这些不同类型的异构数据。\n在上述这类情况下，我们不会将\\gls{dataset}表示成$m$行的矩阵，而是表示成$m$个元素的结合：$\\{\\Vx^{(1)},\\Vx^{(2)},\\dots,\\Vx^{(m)}\\}$。\n这种表示方式意味着\\gls{example:chap5}向量$\\Vx^{(i)}$和$\\Vx^{(j)}$可以有不同的大小。\n\n% -- 103 --\n\n在\\gls{supervised_learning}中，\\gls{example:chap5}包含一个\\gls{label}或\\gls{target}和一组\\gls{feature}。\n例如，我们希望使用学习算法从照片中识别对象。\n我们需要明确哪些对象会出现在每张照片中。\n我们或许会用数字编码表示，如$0$表示人、$1$表示车、$2$表示猫等等。\n通常在处理包含观测\\gls{feature}的\\gls{design_matrix} $\\MX$的\\gls{dataset}时，我们也会提供一个\\gls{label}向量$\\Vy$，其中$y_i$表示\\gls{example:chap5} $i$的\\gls{label}。\n\n\n当然，有时\\gls{label}可能不止一个数。\n例如，如果我们想要训练语音模型\\gls{transcribe}整个句子，那么每个句子\\gls{example:chap5}的\\gls{label}是一个单词序列。\n\n\n正如\\gls{supervised_learning}和\\gls{unsupervised_learning}没有正式的定义，\\gls{dataset}或者\\gls{experience}也没有严格的区分。\n这里介绍的结构涵盖了大多数情况，但始终有可能为新的应用设计出新的结构。\n\n\\subsection{示例：\\glsentrytext{linear_regression}}\n\\label{sec:example_linear_regression}\n我们将\\gls{ML}算法定义为，通过经验以提高计算机程序在某些任务上性能的算法。\n这个定义有点抽象。\n为了使这个定义更具体点，我们展示一个简单的\\gls{ML}示例：\\firstgls{linear_regression}。\n当我们介绍更多有助于理解\\gls{ML}特性的概念时，我们会反复回顾这个示例。\n\n顾名思义，\\gls{linear_regression}解决回归问题。\n换言之，我们的目标是建立一个系统，将向量$\\Vx\\in\\SetR^n$作为输入，预测标量$y\\in\\SetR$作为输出。\n\\gls{linear_regression}的输出是其输入的线性函数。\n令$\\hat{y}$表示模型预测$y$应该取的值。\n我们定义输出为\n\\begin{equation}\n    \\hat{y} = \\Vw^\\Tsp \\Vx ,\n\\end{equation}\n其中$\\Vw\\in\\SetR^n$是\\firstgls{parameters}向量。\n\n\\gls{parameters}是控制系统行为的值。\n在这种情况下，$w_i$是系数，会和\\gls{feature} $x_i$相乘之后全部相加起来。\n我们可以将$\\Vw$看作是一组决定每个\\gls{feature}如何影响预测的\\firstgls{weights}。\n如果\\gls{feature} $x_i$对应的权重$w_i$是正的，那么\\gls{feature}的值增加，我们的预测值$\\hat{y}$也会增加。\n如果\\gls{feature} $x_i$对应的权重$w_i$是负的，那么\\gls{feature}的值增加，我们的预测值$\\hat{y}$会减少。\n如果\\gls{feature}权重的大小很大，那么它对预测有很大的影响；如果\\gls{feature}权重的大小是零，那么它对预测没有影响。\n\n% -- 104 --\n\n因此，我们可以定义任务$T$：通过输出$\\hat{y} = \\Vw^\\Tsp \\Vx$从$\\Vx$预测$y$。\n接下来我们需要定义\\gls{performance_measures}——$P$。\n\n假设我们有$m$个输入\\gls{example:chap5}组成的\\gls{design_matrix}，我们不用它来训练模型，而是评估模型性能如何。\n我们也有每个\\gls{example:chap5}对应的正确值$y$组成的回归\\gls{target}向量。\n因为这个\\gls{dataset}只是用来评估性能，我们称之为\\firstgls{test_set}。\n我们将输入的\\gls{design_matrix}记作$\\MX^{\\text{(test)}}$，回归\\gls{target}向量记作$\\Vy^{(\\text{test})}$。\n\n度量模型性能的一种方法是计算模型在\\gls{test_set}上的\\firstgls{mean_squared_error}。\n如果$\\hat{\\Vy}^{(\\text{test})}$表示模型在\\gls{test_set}上的预测值，那么\\gls{mean_squared_error}表示为：\n\\begin{equation}\n    \\text{MSE}_{\\text{test}} = \\frac{1}{m} \\sum_i ( \\hat{\\Vy}^{(\\text{test})} - \\Vy^{(\\text{test})})_i^2.\n\\end{equation}\n直观上，当$\\hat{\\Vy}^{(\\text{test})} = \\Vy^{(\\text{test})}$时，我们会发现误差降为$0$。\n我们也可以看到\n\\begin{equation}\n    \\text{MSE}_{\\text{test}} = \\frac{1}{m} \\norm{ \\hat{\\Vy}^{(\\text{test})} - \\Vy^{(\\text{test})}}_2^2,\n\\end{equation}\n所以当预测值和\\gls{target}值之间的欧几里得距离增加时，误差也会增加。\n\n为了构建一个\\gls{ML}算法，我们需要设计一个算法，通过观察训练集$(\\MX^{(\\text{train})},\\Vy^{(\\text{train})})$获得\\gls{experience}，减少$\\text{MSE}_{\\text{test}}$以改进权重$\\Vw$。\n一种直观方式（我们将在后续的\\secref{sec:conditional_log_likelihood_and_mean_squared_error}说明其合法性）是最小化训练集上的\\gls{mean_squared_error}，即$\\text{MSE}_{\\text{train}}$。\n\n最小化$\\text{MSE}_{\\text{train}}$，我们可以简单地求解其导数为$\\mathbf{0}$的情况：\n\\begin{equation}\n\\nabla_{\\Vw} \\text{MSE}_{\\text{train}} = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\nabla_{\\Vw} \\frac{1}{m} \\norm{ \\hat{\\Vy}^{(\\text{train})} - \\Vy^{(\\text{train})}}_2^2 = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\frac{1}{m} \\nabla_{\\Vw} \\norm{ \\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})}}_2^2 = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\nabla_{\\Vw} \\left( \\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})} \\right)^\\Tsp \\left( \\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})} \\right) = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\nabla_{\\Vw} \\left( \n    \\Vw^\\Tsp \\MX^{(\\text{train})\\Tsp}\\MX^{(\\text{train})}\\Vw - 2\\Vw^\\Tsp\\MX^{(\\text{train})\\Tsp} \\Vy^{(\\text{train})} + \\Vy^{(\\text{train})\\Tsp}\\Vy^{(\\text{train})}  \n  \\right) = 0\n\\end{equation}\n\\begin{equation}\n    \\Rightarrow 2\\MX^{(\\text{train})\\Tsp}\\MX^{(\\text{train})} \\Vw  -\n    2\\MX^{(\\text{train})\\Tsp} \\Vy^{(\\text{train})}  = 0\n\\end{equation}\n\\begin{equation}\n\\label{eq:5.12}\n    \\Rightarrow \\Vw =  \\left(\\MX^{(\\text{train})\\Tsp}\\MX^{(\\text{train})}\n     \\right)^{-1} \\MX^{(\\text{train})\\Tsp} \\Vy^{(\\text{train})}\n\\end{equation}\n\n% -- 105 --\n\n通过\\eqnref{eq:5.12}给出解的系统方程被称为\\firstgls{normal_equations}。\n计算\\eqnref{eq:5.12}构成了一个简单的机器学习算法。\n\\figref{fig:chap5_linreg}展示了\\gls{linear_regression}算法的使用示例。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/linreg_color}}\n\\fi\n\\caption{一个\\gls{linear_regression}问题，其中训练集包括十个数据点，每个数据点包含一个特征。因为只有一个特征，权重向量$\\Vw$也只有一个要学习的参数$w_1$。\\emph{(左)}我们可以观察到\\gls{linear_regression}学习$w_1$，从而使得直线$y=w_1x$能够尽量接近穿过所有的训练点。\\emph{(右)}标注的点表示由\\gls{normal_equations}学习到的$w_1$的值，我们发现它可以最小化训练集上的\\gls{mean_squared_error}。}\n\\label{fig:chap5_linreg}\n\\end{figure}\n\n值得注意的是，术语\\firstgls{linear_regression}通常用来指稍微复杂一些，附加额外参数（截距项$b$）的模型。\n在这个模型中，\n\\begin{equation}\n    \\hat{y} = \\Vw^\\Tsp \\Vx + b,\n\\end{equation}\n因此从参数到预测的映射仍是一个线性函数，而从\\gls{feature}到预测的映射是一个仿射函数。\n如此扩展到仿射函数意味着模型预测的曲线仍然看起来像是一条直线，只是这条直线没必要经过原点。\n除了通过添加偏置参数$b$，我们还可以使用仅含权重的模型，但是$\\Vx$需要增加一项永远为$1$的元素。\n对应于额外$1$的权重起到了偏置参数的作用。\n当我们在本书中提到仿射函数时，我们会经常使用术语``线性''。\n\n% -- 106 --\n\n截距项$b$通常被称为仿射变换的\\,\\textbf{\\gls{bias_aff}}（bias）参数。\n这个术语的命名源自该变换的输出在没有任何输入时会偏移$b$。\n它和统计偏差中指代统计估计算法的某个量的期望估计偏离真实值的意思是不一样的。\n\n\\gls{linear_regression}当然是一个极其简单且有局限的学习算法，但是它提供了一个说明学习算法如何工作的例子。\n在接下来的小节中，我们将会介绍一些设计学习算法的基本原则，并说明如何使用这些原则来构建更复杂的学习算法。\n\n\\section{\\glsentrytext{capacity}、\\glsentrytext{overfitting}和\\glsentrytext{underfitting}}\n\\label{sec:capacity_overfitting_and_underfitting}\n\\gls{ML}的主要挑战是我们的算法必须能够在\\emph{先前未观测的新}输入上表现良好，而不只是在训练集上表现良好。 %?? space in book\n在先前未观测到的输入上表现良好的能力被称为\\firstgls{generalization}。\n\n通常情况下，当我们训练\\gls{ML}模型时，我们可以使用某个训练集，在训练集上计算一些被称为\\firstgls{training_error}的度量误差，目标是降低训练误差。\n目前为止，我们讨论的是一个简单的优化问题。\n\\gls{ML}和优化不同的地方在于，我们也希望\\firstgls{generalization_error}（也被称为\\firstgls{test_error}）很低。\n泛化误差被定义为新输入的误差期望。\n这里，期望的计算基于不同的可能输入，这些输入采自于系统在现实中遇到的分布。\n\n通常，我们度量模型在训练集中分出来的\\firstgls{test_set}\\gls{example:chap5}上的性能，来评估\\gls{ML}模型的泛化误差。\n\n在我们的\\gls{linear_regression}示例中，我们通过最小化\\gls{training_error}来训练模型，\n\\begin{equation}\n    \\frac{1}{m^{(\\text{train})}} \\norm{\\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})}}_2^2,\n\\end{equation}\n但是我们真正关注的是\\gls{test_error}~$\\frac{1}{m^{(\\text{test})}} \\norm{\\MX^{(\\text{test})}\\Vw - \\Vy^{(\\text{test})}}_2^2$。\n\n% -- 107 --\n\n当我们只能观测到训练集时，我们如何才能影响\\gls{test_set}的性能呢？\n\\firstgls{SLT}提供了一些答案。\n如果训练集和\\gls{test_set}的数据是任意收集的，那么我们能够做的确实很有限。\n如果我们可以对\\gls{training_set}和\\gls{test_set}数据的收集方式有些假设，那么我们能够对算法做些改进。\n\n\\gls{training_set}和\\gls{test_set}数据通过\\gls{dataset}上被称为\\firstgls{DGP}的概率分布生成。\n通常，我们会做一系列被统称为\\firstgls{iid}的假设。\n该假设是说，每个\\gls{dataset}中的\\gls{example:chap5}都是彼此\\firstgls{independent}，并且\\gls{training_set}和\\gls{test_set}是\\firstgls{id}，采样自相同的分布。\n这个假设使我们能够在单个样本的概率分布描述数据生成过程。\n然后相同的分布可以用来生成每一个训练\\gls{example:chap5}和每一个测试\\gls{example:chap5}。\n我们将这个共享的潜在分布称为\\firstgls{DGD}，记作$p_{\\text{data}}$。\n这个概率框架和独立同分布假设允许我们从数学上研究\\gls{training_error}和\\gls{test_error}之间的关系。\n\n我们能观察到\\gls{training_error}和\\gls{test_error}之间的直接联系是，随机模型\\gls{training_error}的期望和该模型\\gls{test_error}的期望是一样的。\n假设我们有概率分布$p(\\Vx,y)$，从中重复采样生成\\gls{training_set}和\\gls{test_set}。\n对于某个固定的$\\Vw$，\\gls{training_set}误差的期望恰好和\\gls{test_set}误差的期望一样，这是因为这两个期望的计算都使用了相同的数据集生成过程。\n这两种情况的唯一区别是\\gls{dataset}的名字不同。\n\n当然，当我们使用\\gls{ML}算法时，我们不会提前固定参数，然后采样得到两个\\gls{dataset}。\n我们采样得到训练集，然后挑选参数去降低训练集误差，然后采样得到\\gls{test_set}。\n在这个过程中，测试误差期望会大于或等于训练误差期望。\n以下是决定\\gls{ML}算法效果是否好的因素：\n\\begin{enumerate}\n    \\item 降低训练误差。\n    \\item 缩小训练误差和测试误差的差距。\n\\end{enumerate}\n\n这两个因素对应\\gls{ML}的两个主要挑战：\\firstgls{underfitting}和\\firstgls{overfitting}。\n\\gls{underfitting}是指模型不能在训练集上获得足够低的误差。\n而\\gls{overfitting}是指训练误差和和测试误差之间的差距太大。\n\n% -- 108 --\n\n通过调整模型的\\firstgls{capacity}，我们可以控制模型是否偏向于\\gls{overfitting}或者\\gls{underfitting}。\n通俗地，模型的\\gls{capacity}是指其拟合各种函数的能力。\n\\gls{capacity}低的模型可能很难拟合训练集。\n\\gls{capacity}高的模型可能会过拟合，因为记住了不适用于\\gls{test_set}的\\gls{training_set}性质。\n\n一种控制训练算法容量的方法是选择\\firstgls{hypothesis_space}，即学习算法可以选择为解决方案的函数集。\n例如，\\gls{linear_regression}算法将关于其输入的所有线性函数作为假设空间。\n广义\\gls{linear_regression}的假设空间包括多项式函数，而非仅有线性函数。\n这样做就增加了模型的容量。\n\n一次多项式提供了我们已经熟悉的\\gls{linear_regression}模型，其预测如下：\n\\begin{equation}\n    \\hat{y} = b + wx.\n\\end{equation}\n通过引入$x^2$作为\\gls{linear_regression}模型的另一个\\gls{feature}，我们能够学习关于$x$的二次函数模型：\n\\begin{equation}\n    \\hat{y} = b + w_1x + w_2x^2.\n\\end{equation}\n尽管该模型是\\emph{输入}的二次函数，但输出仍是\\emph{参数}的线性函数。\n因此我们仍然可以用\\gls{normal_equations}得到模型的闭解。\n我们可以继续添加$x$的更高幂作为额外\\gls{feature}，例如下面的$9$次多项式：\n\\begin{equation}\n    \\hat{y} = b + \\sum_{i=1}^9 w_i x^i.\n\\end{equation}\n\n当\\gls{ML}算法的\\gls{capacity}适合于所执行任务的复杂度和所提供训练数据的数量时，算法效果通常会最佳。\n\\gls{capacity}不足的模型不能解决复杂任务。\n\\gls{capacity}高的模型能够解决复杂的任务，但是当其容量高于任务所需时，有可能会过拟合。\n\n\\figref{fig:chap5_underfit_just_right_overfit}展示了这个原理的使用情况。\n我们比较了线性，二次和$9$次预测器拟合真实二次函数的效果。\n线性函数无法刻画真实函数的曲率，所以欠拟合。\n$9$次函数能够表示正确的函数，但是因为训练参数比训练\\gls{example:chap5}还多，所以它也能够表示无限多个刚好穿越训练\\gls{example:chap5}点的很多其他函数。\n我们不太可能从这很多不同的解中选出一个泛化良好的。\n在这个问题中，二次模型非常符合任务的真实结构，因此它可以很好地泛化到新数据上。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/underfit_just_right_overfit_color}}\n\\fi\n\\caption{我们用三个模型拟合了这个训练集的样本。训练数据是通过随机抽取$x$然后用二次函数确定性地生成$y$来合成的。\\emph{(左)}用一个线性函数拟合数据会导致\\gls{underfitting}——它无法捕捉数据中的\\gls{curvature}信息。\\emph{(中)}用二次函数拟合数据在未观察到的点上\\gls{generalization}得很好。这并不会导致明显的\\gls{underfitting}或者\\gls{overfitting}。\\emph{(右)}一个$9$阶的多项式拟合数据会导致\\gls{overfitting}。在这里我们使用\\,\\gls{Moore}来解这个欠定的\\gls{normal_equations}。得出的解能够精确地穿过所有的训练点，但可惜我们无法提取有效的结构信息。在两个数据点之间它有一个真实的函数所不包含的深谷。在数据的左侧，它也会急剧增长，而在这一区域真实的函数却是下降的。}\n\\label{fig:chap5_underfit_just_right_overfit}\n\\end{figure}\n\n% -- 109 --\n\n目前为止，我们探讨了通过改变输入\\gls{feature}的数目和加入这些\\gls{feature}对应的参数，改变模型的容量。\n事实上，还有很多方法可以改变模型的容量。\n容量不仅取决于模型的选择。\n模型规定了调整参数降低训练目标时，学习算法可以从哪些函数族中选择函数。\n这被称为模型的\\firstgls{representational_capacity}。\n在很多情况下，从这些函数中挑选出最优函数是非常困难的优化问题。\n实际中，学习算法不会真的找到最优函数，而仅是找到一个可以大大降低训练误差的函数。\n额外的限制因素，比如优化算法的不完美，意味着学习算法的\\firstgls{effective_capacity}可能小于模型族的\\gls{representational_capacity}。\n\n% -- 110 --\n\n提高\\gls{ML}模型泛化的现代思想可以追溯到早在托勒密时期的哲学家的思想。\n许多早期的学者提出一个简约原则，现在广泛被称为\\firstgls{OR}（c. 1287-1387）。\n该原则指出，在同样能够解释已知观测现象的假设中，我们应该挑选``最简单''的那一个。\n这个想法是在20世纪，由统计学习理论创始人形式化并精确化的\\citep{Vapnik71,Vapnik82,Blumer-et-al-1989,Vapnik95}。\n\n统计学习理论提供了量化模型容量的不同方法。\n在这些中，最有名的是\\firstall{VC}。\n\\glssymbol{VC}\\,维度量二元分类器的容量。\n\\glssymbol{VC}\\,维定义为该分类器能够分类的训练\\gls{example:chap5}的最大数目。\n假设存在$m$个不同$\\Vx$点的训练集，分类器可以任意地标记该$m$个不同的$\\Vx$点，\\glssymbol{VC}\\,维被定义为$m$的最大可能值。\n\n量化模型的容量使得统计学习理论可以进行量化预测。\n统计学习理论中最重要的结论阐述了训练误差和泛化误差之间差异的上界随着模型容量增长而增长，但随着训练\\gls{example:chap5}增多而下降\\citep{Vapnik71,Vapnik82,Blumer-et-al-1989,Vapnik95}。\n这些边界为\\gls{ML}算法可以有效解决问题提供了理论验证，但是它们很少应用于实际中的\\gls{DL}算法。\n一部分原因是边界太松，另一部分原因是很难确定\\gls{DL}算法的容量。\n由于有效容量受限于优化算法的能力，确定\\gls{DL}模型容量的问题特别困难。\n而且对于\\gls{DL}中的一般非凸优化问题，我们只有很少的理论分析。\n\n我们必须记住虽然更简单的函数更可能泛化（训练误差和测试误差的差距小），但我们仍然需要选择一个充分复杂的假设以达到低的\\gls{training_error}。\n通常，当模型容量上升时，训练误差会下降，直到其渐近最小可能误差（假设误差度量有最小值）。\n通常，\\gls{generalization_error}是一个关于模型容量的U形曲线函数。\n如\\figref{fig:chap5_generalization_vs_capacity}所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/generalization_vs_capacity_color}}\n\\fi\n\\caption{\\gls{capacity}和误差之间的典型关系。\\gls{training_error}和\\gls{test_error}表现得非常不同。在图的左端，\\gls{training_error}和\\gls{generalization_error}都非常高。这是\\firstgls{underfit_regime}。当我们增加\\gls{capacity}时，\\gls{training_error}减小，但是\\gls{training_error}和\\gls{generalization_error}之间的间距却不断扩大。最终，这个间距的大小超过了\\gls{training_error}的下降，我们进入到了\\firstgls{overfit_regime}，其中\\gls{capacity}过大，超过了\\firstgls{optimal_capacity}。}\n\\label{fig:chap5_generalization_vs_capacity}\n\\end{figure}\n\n% -- 111 --\n\n为考虑容量任意高的极端情况，我们介绍\\firstgls{nonparametric}\\emph{模型}的概念。\n至此，我们只探讨过参数模型，例如\\gls{linear_regression}。\n参数模型学习的函数在观测到新数据前，参数向量的分量个数是有限且固定的。\n非参数模型没有这些限制。\n\n有时，非参数模型仅是一些不能实际实现的理论抽象（比如搜索所有可能概率分布的算法）。\n然而，我们也可以设计一些实用的非参数模型，使它们的复杂度和训练集大小有关。\n这种算法的一个示例是\\firstgls{nearest_neighbor_regression}。\n不像\\gls{linear_regression}有固定长度的向量作为权重，\\gls{nearest_neighbor_regression}模型存储了训练集中所有的$\\MX$和$\\Vy$。\n当需要为测试点$\\Vx$分类时，模型会查询训练集中离该点最近的点，并返回相关的回归\\gls{target}。\n换言之，$\\hat{y}=y_i$其中$i=\\argmin \\norm{\\MX_{i,:}-\\Vx}_2^2$。\n该算法也可以扩展成$L^2$范数以外的距离度量，例如学成距离度量\\citep{RoweisNCA2005}。\n在最近向量不唯一的情况下，如果允许算法对所有离$\\Vx$最近的$\\MX_{i,:}$关联的$y_i$求平均，那么该算法会在任意回归\\gls{dataset}上达到最小可能的训练误差（如果存在两个相同的输入对应不同的输出，那么训练误差可能会大于零）。\n\n最后，我们也可以将参数学习算法嵌入另一个增加参数数目的算法来创建非参数学习算法。\n例如，我们可以想象这样一个算法，外层循环调整多项式的次数，内层循环通过\\gls{linear_regression}学习模型。\n\n% -- 112 --\n\n理想模型假设我们能够预先知道生成数据的真实概率分布。\n然而这样的模型仍然会在很多问题上发生一些错误，因为分布中仍然会有一些\\gls{noise}。\n在\\gls{supervised_learning}中，从$\\Vx$到$y$的映射可能本质上是随机的，或者$y$虽然是确定性函数，但不光受$\\Vx$影响，还受$\\Vx$之外的其他变量的影响。\n从预先知道的真实分布$p(\\Vx,y)$进行预测而出现的误差被称为\\firstgls{bayes_error}。\n\n\\gls{training_error}和\\gls{generalization_error}会随训练集的大小发生变化。\n泛化误差的期望从不会因训练\\gls{example:chap5}数目的增加而增加。\n对于非参数模型而言，更多的数据会得到更好的泛化能力，直到达到最佳可能的泛化误差。\n任何模型容量小于最优容量的固定参数模型会渐近到大于\\gls{bayes_error}的误差值。\n如\\figref{fig:chap5_training_size_grows}所示。\n值得注意的是，具有最优容量的模型仍然有可能在\\gls{training_error}和\\gls{generalization_error}之间存在很大的差距。\n在这种情况下，我们可以通过收集更多的训练\\gls{example:chap5}来缩小差距。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/training_size_grows}}\n\\fi\n\\caption{训练集大小对\\gls{training_error}，\\gls{test_error}以及\\gls{optimal_capacity}的影响。通过给一个$5$阶多项式添加适当大小的噪声，我们构造了一个合成的\\gls{regression}问题，生成单个测试集，然后生成一些不同尺寸的训练集。为了描述$95\\%$置信区间的\\gls{error_bar}，对于每一个尺寸，我们生成了$40$个不同的训练集。\\emph{(上)}两个不同的模型上训练集和测试集的\\,\\glssymbol{mean_squared_error}，一个二次模型，另一个模型的阶数通过最小化\\gls{test_error}来选择。两个模型都是用闭式解来拟合。对于二次模型来说，当训练集增加时\\gls{training_error}也随之增大。这是由于越大的数据集越难以拟合。同时，\\gls{test_error}随之减小，因为关于训练数据的不正确的假设越来越少。二次模型的容量并不足以解决这个问题，所以它的\\gls{test_error}趋近于一个较高的值。\\gls{optimal_capacity}点处的\\gls{test_error}趋近于\\gls{bayes_error}。\\gls{training_error}可以低于\\gls{bayes_error}，因为训练算法有能力记住训练集中特定的样本。当训练集趋向于无穷大时，任何固定容量的模型（在这里指的是二次模型）的\\gls{training_error}都至少增至\\gls{bayes_error}。\\emph{(下)}当训练集大小增大时，\\gls{optimal_capacity}（在这里是用最优多项式回归器的阶数衡量的）也会随之增大。\\gls{optimal_capacity}在达到足够捕捉模型复杂度之后就不再增长了。}\n\\label{fig:chap5_training_size_grows}\n\\end{figure}\n\n\\subsection{\\glsentrytext{no_free_lunch_theorem}}\n\\label{sec:the_no_free_lunch_theorem}\n学习理论表明\\gls{ML}算法能够在有限个训练集\\gls{example:chap5}中很好地泛化。\n这似乎违背一些基本的逻辑原则。\n归纳推理，或是从一组有限的\\gls{example:chap5}中推断一般的规则，在逻辑上不是很有效。\n为了逻辑地推断一个规则去描述集合中的元素，我们必须具有集合中每个元素的信息。\n\n在一定程度上，\\gls{ML}仅通过概率法则就可以避免这个问题，而无需使用纯逻辑推理整个确定性法则。\n\\gls{ML}保证找到一个在所关注的\\emph{大多数}\\gls{example:chap5}上\\emph{可能}正确的规则。\n\n可惜，即使这样也不能解决整个问题。\n\\gls{ML}的\\firstgls{no_free_lunch_theorem}表明~\\citep{Wolpert-1996}，在所有可能的数据生成分布上平均之后，每一个分类算法在未事先观测的点上都有相同的错误率。\n换言之，在某种意义上，没有一个\\gls{ML}算法总是比其他的要好。\n我们能够设想的最先进的算法和简单地将所有点归为同一类的简单算法有着相同的平均性能（在所有可能的任务上）。\n\n% -- 113 --\n\n幸运的是，这些结论仅在我们考虑\\emph{所有}可能的数据生成分布时才成立。\n在真实世界应用中，如果我们对遇到的概率分布进行假设的话，那么我们可以设计在这些分布上效果良好的学习算法。\n\n这意味着\\gls{ML}研究的\\gls{target}不是找一个通用学习算法或是绝对最好的学习算法。\n反之，我们的\\gls{target}是理解什么样的分布与人工智能获取经验的``真实世界''相关，什么样的学习算法在我们关注的数据生成分布上效果最好。\n\n\\subsection{\\glsentrytext{regularization}}\n\\label{sec:regularization}\n没有免费午餐定理暗示我们必须在特定任务上设计性能良好的\\gls{ML}算法。\n我们建立一组学习算法的偏好来达到这个要求。\n当这些偏好和我们希望算法解决的学习问题相吻合时，性能会更好。\n\n至此，我们具体讨论修改学习算法的方法只有，通过增加或减少学习算法可选假设空间的函数来增加或减少模型的\\gls{representational_capacity}。\n我们列举的一个具体示例是\\gls{linear_regression}增加或减少多项式的次数。\n目前为止讨论的观点都是过度简化的。\n\n算法的效果不仅很大程度上受影响于假设空间的函数数量，也取决于这些函数的具体形式。\n我们已经讨论的学习算法（\\gls{linear_regression}）具有包含其输入的线性函数集的假设空间。\n对于输入和输出确实接近线性相关的问题，这些线性函数是很有用的。\n对于完全非线性的问题它们不太有效。\n例如，我们用\\gls{linear_regression}，从$x$预测$\\sin(x)$，效果不会好。\n因此我们可以通过两种方式控制算法的性能，一是允许使用的函数种类，二是这些函数的数量。\n\n在假设空间中，相比于某一个学习算法，我们可能更偏好另一个学习算法。\n这意味着两个函数都是符合条件的，但是我们更偏好其中一个。\n只有非偏好函数比偏好函数在训练\\gls{dataset}上效果明显好很多时，我们才会考虑非偏好函数。\n\n% -- 115 --\n\n例如，我们可以加入\\firstgls{weight_decay}来修改\\gls{linear_regression}的训练标准。\n带权重衰减的\\gls{linear_regression}最小化训练集上的\\gls{mean_squared_error}和正则项的和$J(\\Vw)$，其偏好于平方$L^2$范数较小的权重。\n具体如下：\n\\begin{equation}\n    J(\\Vw) = \\text{MSE}_{\\text{train}} + \\lambda \\Vw^\\Tsp \\Vw,\n\\end{equation}\n其中$\\lambda$是提前挑选的值，控制我们偏好小范数权重的程度。\n当$\\lambda =0$，我们没有任何偏好。\n越大的$\\lambda$越偏好范数小的权重。\n最小化$J(\\Vw)$可以看作是拟合训练数据和偏好小权重范数之间的权衡。\n这会使得解决方案的斜率较小，或是将权重放在较少的\\gls{feature}上。\n我们可以训练具有不同$\\lambda$值的高次多项式回归模型，来举例说明如何通过权重衰减控制模型欠拟合或过拟合的趋势。\n如\\figref{fig:chap5_underfit_just_right_overfit_wd_color}所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/underfit_just_right_overfit_wd_color}}\n\\fi\n\\caption{我们使用高阶多项式回归模型来拟合\\figref{fig:chap5_underfit_just_right_overfit}中训练样本。真实函数是二次的，但是在这里我们只使用$9$阶多项式。我们通过改变\\gls{weight_decay}的量来避免高阶模型的过拟合问题。\\emph{(左)}当$\\lambda$非常大时，我们可以强迫模型学习到了一个没有斜率的函数。由于它只能表示一个常数函数，所以会导致\\gls{underfitting}。\\emph{(中)}取一个适当的$\\lambda$时，学习算法能够用一个正常的形状来恢复曲率。即使模型能够用更复杂的形状来来表示函数，\\gls{weight_decay}鼓励用一个带有更小参数的更简单的模型来描述它。\\emph{(右)}当\\gls{weight_decay}趋近于$0$（即使用\\,\\gls{Moore}来解这个带有最小\\gls{regularization}的欠定问题）时，这个$9$阶多项式会导致严重的\\gls{overfitting}，这和我们在图\\ref{fig:chap5_underfit_just_right_overfit}中看到的一样。}\n\\label{fig:chap5_underfit_just_right_overfit_wd_color}\n\\end{figure}\n\n更一般地，\\gls{regularization}一个学习函数$f(\\Vx;\\Vtheta)$的模型，我们可以给\\gls{cost_function}添加被称为\\firstgls{regularizer}的惩罚。\n在权重衰减的例子中，\\gls{regularizer}是$\\Omega(\\Vw) = \\Vw^\\Tsp \\Vw$。\n在\\chapref{chap:regularization_for_deep_learning}，我们将看到很多其他可能的\\gls{regularizer}。\n\n% -- 116 --\n\n表示对函数的偏好是比增减假设空间的成员函数更一般的控制模型\\gls{capacity}的方法。\n我们可以将去掉假设空间中的某个函数看作是对不赞成这个函数的无限偏好。\n\n在我们权重衰减的示例中，通过在最小化的\\gls{target}中额外增加一项，我们明确地表示了偏好权重较小的线性函数。\n有很多其他方法隐式或显式地表示对不同解的偏好。\n总而言之，这些不同的方法都被称为\\firstgls{regularization}。\n\\emph{\\gls{regularization}是指我们修改学习算法，使其降低泛化误差而非训练误差}。\n\\gls{regularization}是\\gls{ML}领域的中心问题之一，只有优化能够与其重要性相媲。\n\n\\gls{no_free_lunch_theorem}已经清楚地阐述了没有最优的学习算法，特别地，没有最优的\\gls{regularization}形式。\n反之，我们必须挑选一个非常适合于我们所要解决的任务的正则形式。\n\\gls{DL}中普遍的（特别是本书中的）理念是大量任务（例如所有人类能做的智能任务）也许都可以使用非常通用的\\gls{regularization}形式来有效解决。\n\n\\section{超参数和验证集}\n\\label{sec:hyperparameters_and_validation_sets}\n大多数\\gls{ML}算法都有超参数，可以设置来控制算法行为。\n超参数的值不是通过学习算法本身学习出来的（尽管我们可以设计一个嵌套的学习过程，一个学习算法为另一个学习算法学出最优超参数）。\n\n在\\figref{fig:chap5_underfit_just_right_overfit}所示的多项式回归示例中，有一个超参数：多项式的次数，作为\\textbf{\\gls{capacity}}超参数。\n控制\\gls{weight_decay}程度的$\\lambda$是另一个超参数。\n\n有时一个选项被设为学习算法不用学习的超参数，是因为它太难优化了。\n更多的情况是，该选项必须是超参数，因为它不适合在训练集上学习。\n这适用于控制模型\\gls{capacity}的所有超参数。\n如果在训练集上学习超参数，这些超参数总是趋向于最大可能的模型容量，导致过拟合（参考\\figref{fig:chap5_generalization_vs_capacity}）。\n例如，相比低次多项式和正的权重衰减设定，更高次的多项式和权重衰减参数设定$\\lambda=0$总能在训练集上更好地拟合。\n\n% -- 117 --\n\n为了解决这个问题，我们需要一个训练算法观测不到的\\firstgls{validation_set}\\gls{example:chap5}。\n\n早先我们讨论过和训练数据相同分布的\\gls{example:chap5}组成的\\gls{test_set}，它可以用来估计学习过程完成之后的\\gls{learner}的泛化误差。\n其重点在于测试\\gls{example:chap5}不能以任何形式参与到模型的选择中，包括设定超参数。\n基于这个原因，\\gls{test_set}中的\\gls{example:chap5}不能用于验证集。\n因此，我们总是从\\emph{训练}数据中构建验证集。\n特别地，我们将训练数据分成两个不相交的子集。\n其中一个用于学习参数。\n另一个作为验证集，用于估计训练中或训练后的泛化误差，更新超参数。\n用于学习参数的数据子集通常仍被称为训练集，尽管这会和整个训练过程用到的更大的\\gls{dataset}相混。\n用于挑选超参数的数据子集被称为\\firstgls{validation_set}。\n通常，$80\\%$的训练数据用于训练，$20\\%$用于验证。\n由于验证集是用来``训练''超参数的，验证集误差通常会低估泛化误差，但是一般比训练集误差低估的程度更小。\n所有超参数优化完成之后，泛化误差可能会通过\\gls{test_set}来估计。\n\n在实际中，当相同的\\gls{test_set}已在很多年中重复地用于评估不同算法的性能，并且考虑学术界在该\\gls{test_set}上的各种尝试，我们最后可能也会对\\gls{test_set}有着乐观的估计。\n\\gls{benchmarks}会因之变得陈旧，而不能反映系统的真实性能。\n值得庆幸的是，学术界往往会移到新的（通常会更巨大、更具挑战性）基准\\gls{dataset}上。\n\n\\subsection{交叉验证}\n\\label{sec:cross_validation}\n将\\gls{dataset}分成固定的训练集和固定的\\gls{test_set}后，若\\gls{test_set}很小，这将是有问题的。\n一个小规模的\\gls{test_set}意味着平均测试误差估计的统计不确定性，使得很难判断算法$A$是否比算法$B$在给定的任务上做得更好。\n\n% -- 118 --\n\n当\\gls{dataset}有十万计或者更多的\\gls{example:chap5}时，这不会是一个严重的问题。\n当\\gls{dataset}太小时，也有替代方法允许我们使用所有的\\gls{example:chap5}估计平均测试误差，代价是增加了计算量。\n这些过程是基于在原始数据上随机采样或分离出的不同\\gls{dataset}上重复训练和测试的想法。\n最常见的是$k$-折交叉验证过程，如\\algref{alg:xv}所示，将\\gls{dataset}分成$k$个不重合的子集。\n测试误差可以估计为$k$次计算后的平均测试误差。\n在第$i$次测试时，数据的第$i$个子集用于\\gls{test_set}，其他的数据用于训练集。\n带来的一个问题是不存在平均误差方差的无偏估计\\citep{Bengio-Grandvalet-JMLR-04}，但是我们通常会使用近似来解决。\n\n\\begin{algorithm}\n  \\caption{$k$-折交叉验证算法。\n当给定数据集$\\SetD$对于简单的训练/测试或训练/验证分割而言太小难以产生泛化误差的准确估计时（因为在小的测试集上，$L$可能具有过高的方差），$k$-折交叉验证算法可以用于估计学习算法$A$的泛化误差。\n数据集$\\SetD$包含的元素是抽象的样本 $\\Vz^{(i)}$（对于第$i$个样本），在\\gls{supervised_learning}的情况代表（输入，目标）对$\\Vz^{(i)} = (\\Vx^{(i)}, y^{(i)})$ ，或者\\gls{unsupervised_learning}的情况下仅用于输入$\\Vz^{(i)} = \\Vx^{(i)}$。\n该算法返回$\\SetD$中每个示例的误差向量$\\Ve$，其均值是估计的泛化误差。\n单个样本上的误差可用于计算平均值周围的置信区间（\\eqnref{eq:confidence_interval}）。\n虽然这些置信区间在使用交叉验证之后不能很好地证明，但是通常的做法是只有当算法$A$误差的置信区间低于并且不与算法$B$的置信区间相交时，我们才声明算法$A$比算法$B$更好。}\n\\label{alg:xv}\n\\begin{algorithmic}\n\\item[] \\hspace*{-4.2mm}{\\bf Define} {\\tt KFoldXV}($\\SetD,A,L,k$):\n\\REQUIRE $\\SetD$为给定数据集，其中元素为 $\\Vz^{(i)}$\n\\REQUIRE $A$ 为学习算法，可视为一个函数（使用数据集作为输入，输出一个学好的函数）\n\\REQUIRE $L$ 为\\gls{loss_function}，可视为来自学好的函数$f$，将样本 $\\Vz^{(i)} \\in \\SetD$ 映射到$\\SetR$中标量的函数\n\\REQUIRE $k$为折数\n\\STATE 将 $\\SetD$ 分为 $k$个互斥子集 $\\SetD_i$，它们的并集为$\\SetD$\n\\FOR{$i$ from $1$ to $k$}\n  \\STATE $f_i = A(\\SetD \\backslash \\SetD_i)$ \n  \\FOR{$\\Vz^{(j)}$ in $\\SetD_i$}\n    \\STATE $e_j = L(f_i, \\Vz^{(j)})$\n  \\ENDFOR\n\\ENDFOR\n\\STATE {\\bf Return} $\\Ve$\n\\end{algorithmic}\n\\end{algorithm}\n\n\\section{估计、偏差和方差}\n\\label{sec:estimators_bias_and_variance}\n统计领域为我们提供了很多工具来实现\\gls{ML}目标，不仅可以解决训练集上的任务，还可以泛化。\n基本的概念，例如参数估计、偏差和方差，对于正式地刻画泛化、欠拟合和过拟合都非常有帮助。\n\n\\subsection{点估计}\n\\label{sec:point_estimation}\n点估计试图为一些感兴趣的量提供单个``最优''预测。\n一般地，感兴趣的量可以是单个参数，或是某些参数模型中的一个向量参数，例如\\secref{sec:example_linear_regression}\\gls{linear_regression}中的权重，但是也有可能是整个函数。\n\n为了区分参数估计和真实值，我们习惯将参数$\\Vtheta$的点估计表示为$\\hat{\\Vtheta}$。\n\n令$\\{\\Vx^{(1)},\\dots,\\Vx^{(m)}\\}$是$m$个独立同分布（i.i.d.）的数据点。\n\\firstgls{point_estimator}或\\firstgls{statistics}是这些数据的任意函数：\n\\begin{equation}\n    \\hat{\\Vtheta}_m = g(\\Vx^{(1)}, \\dots, \\Vx^{(m)}) .\n\\end{equation}\n这个定义不要求$g$返回一个接近真实$\\Vtheta$的值，或者$g$的值域恰好是$\\Vtheta$的允许取值范围。\n点估计的定义非常宽泛，给了\\gls{estimator:chap5}的设计者极大的灵活性。\n虽然几乎所有的函数都可以称为\\gls{estimator:chap5}，但是一个良好的\\gls{estimator:chap5}的输出会接近生成训练数据的真实参数$\\Vtheta$。\n\n% -- 119 --\n\n现在，我们采取频率派在统计上的观点。\n换言之，我们假设真实参数$\\Vtheta$是固定但未知的，而点估计$\\hat{\\Vtheta}$是数据的函数。\n由于数据是随机过程采样出来的，数据的任何函数都是随机的。\n因此$\\hat{\\Vtheta}$是一个随机变量。\n\n% -- 120 --\n\n点估计也可以指输入和\\gls{target}变量之间关系的估计。\n我们将这种类型的点估计称为函数估计。\n\n\\paragraph{函数估计} 有时我们会关注函数估计（或函数近似）。\n这时我们试图从输入向量$\\Vx$预测变量$\\Vy$。\n我们假设有一个函数$f(\\Vx)$表示$\\Vy$和$\\Vx$之间的近似关系。\n例如，我们可能假设$\\Vy = f(\\Vx) + \\Vepsilon$，其中$\\Vepsilon$是$\\Vy$中未能从$\\Vx$预测的一部分。\n在函数估计中，我们感兴趣的是用模型估计去近似$f$，或者估计$\\hat{f}$。\n函数估计和估计参数$\\Vtheta$是一样的；函数估计$\\hat{f}$是函数空间中的一个点估计。\n\\gls{linear_regression}示例（\\secref{sec:example_linear_regression}中讨论的）和多项式回归示例（\\secref{sec:capacity_overfitting_and_underfitting}中讨论的）都既可以被解释为估计参数$\\Vw$，又可以被解释为估计从$\\Vx$到$y$的函数映射$\\hat{f}$。\n\n现在我们回顾点估计最常研究的性质，并探讨这些性质说明了估计的哪些特点。\n\n\\subsection{偏差}\n\\label{sec:bias}\n\\gls{estimator}的偏差被定义为：\n\\begin{equation}\n\\label{eq:5.20}\n    \\text{bias}(\\hat{\\Vtheta}_m) = \\SetE(\\hat{\\Vtheta}_m) - \\Vtheta,\n\\end{equation}\n其中期望作用在所有数据（看作是从随机变量采样得到的）上，$\\Vtheta$是用于定义数据生成分布的$\\Vtheta$的真实值。\n如果$\\text{bias}(\\hat{\\Vtheta}_m)=0$，那么\\gls{estimator:chap5} $\\hat{\\Vtheta}_m$被称为是\\firstgls{unbiased}，这意味着$\\SetE(\\hat{\\Vtheta}_m) = \\Vtheta$。\n如果$\\lim_{m\\to\\infty} \\text{bias}(\\hat{\\Vtheta}_m)=0$，那么\\gls{estimator:chap5} $\\hat{\\Vtheta}_m$被称为是\\firstgls{asymptotically_unbiased}，这意味着$\\lim_{m\\to\\infty} \\SetE(\\hat{\\Vtheta}_m) = \\Vtheta$。\n\n% -- 121 --\n\n\\paragraph{示例：伯努利分布}\n考虑一组服从均值为$\\theta$的伯努利分布的独立同分布的样本$\\{x^{(1)}, \\dots , x^{(m)}\\}$：\n\\begin{equation}\n    P(x^{(i)}; \\theta) = \\theta^{x^{(i)}} (1-\\theta)^{(1 - x^{(i)})}.\n\\end{equation}\n这个分布中参数$\\theta$的常用\\gls{estimator:chap5}是训练\\gls{example:chap5}的均值：\n\\begin{equation}\n\\label{eq:5.22}\n    \\hat{\\theta}_m = \\frac{1}{m} \\sum_{i=1}^m x^{(i)}.\n\\end{equation}\n判断这个\\gls{estimator:chap5}是否有偏，我们将\\eqnref{eq:5.22}代入\\eqnref{eq:5.20}：\n\\begin{align}\n    \\text{bias}(\\hat{\\theta}_m)     &= \\SetE[\\hat{\\theta}_m] - \\theta  \\\\\n            &= \\SetE \\left[ \\frac{1}{m} \\sum_{i=1}^m x^{(i)} \\right] - \\theta \\\\\n            &= \\frac{1}{m} \\sum_{i=1}^m \\SetE \\left[x^{(i)} \\right] - \\theta \\\\\n            &= \\frac{1}{m} \\sum_{i=1}^m \\sum_{x^{(i)} = 0}^1 \\left( x^{(i)} \\theta^{x^{(i)}} (1-\\theta)^{(1-x^{(i)})} \\right) - \\theta \\\\\n            &= \\frac{1}{m} \\sum_{i=1}^m (\\theta) - \\theta \\\\\n            &= \\theta - \\theta = 0\n\\end{align}\n\n因为$\\text{bias}(\\hat{\\theta})=0$，我们称估计$\\hat{\\theta}$是无偏的。\n\n\\paragraph{示例：均值的高斯分布估计}\n现在，考虑一组独立同分布的\\gls{example:chap5} $\\{x^{(1)}, \\dots , x^{(m)}\\}$服从高斯分布$p(x^{(i)}) = \\mathcal{N}(x^{(i)}; \\mu, \\sigma^2)$，其中$i\\in\\{1, \\dots, m\\}$。\n回顾高斯概率密度函数如下：\n\\begin{equation}\n    p(x^{(i)}; \\mu, \\sigma^2) = \\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left( -\\frac{1}{2} \\frac{(x^{(i)} - \\mu)^2}{\\sigma^2}  \\right).\n\\end{equation}\n\n高斯均值参数的常用\\gls{estimator:chap5}被称为\\firstgls{sample_mean}：\n\\begin{equation}\n    \\hat{\\mu}_m = \\frac{1}{m} \\sum_{i=1}^m x^{(i)}\n\\end{equation}\n判断\\gls{sample_mean}是否有偏，我们再次计算它的期望：\n\\begin{align}\n\\text{bias} (\\hat{\\mu}_m) &= \\SetE[ \\hat{\\mu}_m ]  - \\mu \\\\\n    &= \\SetE \\left[ \\frac{1}{m} \\sum_{i=1}^m x^{(i)}  \\right] - \\mu \\\\\n    &= \\left( \\frac{1}{m}\\sum_{i=1}^m \\SetE \\left[ x^{(i)} \\right] \\right) - \\mu \\\\\n    &= \\left( \\frac{1}{m}\\sum_{i=1}^m \\mu \\right) - \\mu \\\\\n    &= \\mu - \\mu = 0\n\\end{align}\n因此我们发现\\gls{sample_mean}是高斯均值参数的无偏\\gls{estimator:chap5}。\n\n% -- 122 --\n\n\\paragraph{示例：高斯分布方差估计}\n本例中，我们比较高斯分布方差参数$\\sigma^2$的两个不同估计。\n我们探讨是否有一个是有偏的。\n\n我们考虑的第一个方差估计被称为\\firstgls{sample_variance}：\n\\begin{equation}\n    \\hat{\\sigma}_m^2 = \\frac{1}{m} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2,\n\\end{equation}\n其中$\\hat{\\mu}_m$是\\gls{sample_mean}。\n更形式地，我们对计算感兴趣\n\\begin{equation}\n\\label{eq:5.37}\n    \\text{bias} (\\hat{\\sigma}_m^2) = \\SetE [ \\hat{\\sigma}_m^2 ]  - \\sigma^2.\n\\end{equation}\n我们首先估计项$\\SetE [ \\hat{\\sigma}_m^2 ]$：\n\\begin{align}\n    \\SetE [ \\hat{\\sigma}_m^2 ]  &= \\SetE \\left[ \\frac{1}{m} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2  \\right] \\\\\n    &= \\frac{m-1}{m} \\sigma^2\n\\end{align}\n回到\\eqnref{eq:5.37}，我们可以得出$\\hat{\\sigma}^2_m$的偏差是$-\\sigma^2/m$。\n因此\\gls{sample_variance}是有偏估计。\n\n\\firstgls{unbiased_sample_variance}估计\n\\begin{equation}\n    \\tilde{\\sigma}_m^2 = \\frac{1}{m-1} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2\n\\end{equation}\n提供了另一种可选方法。\n正如名字所言，这个估计是无偏的。\n换言之，我们会发现$\\SetE[\\tilde{\\sigma}_m^2] = \\sigma^2$：\n\\begin{align}\n    \\SetE[\\tilde{\\sigma}_m^2] &= \\SetE \\left[ \\frac{1}{m-1} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2 \\right] \\\\\n        &= \\frac{m}{m-1} \\SetE[ \\hat{\\sigma}_m^2 ]  \\\\\n        &= \\frac{m}{m-1} \\left( \\frac{m-1}{m} \\sigma^2 \\right) \\\\\n        &= \\sigma^2.\n\\end{align}\n\n% -- 123 --\n\n我们有两个\\gls{estimator:chap5}：一个是有偏的，另一个是无偏的。\n尽管无偏估计显然是令人满意的，但它并不总是``最好''的估计。\n我们将看到，经常会使用其他具有重要性质的有偏估计。\n\n\\subsection{方差和\\glsentrytext{standard_error}}\n\\label{sec:variance_and_standard_error}\n我们有时会考虑\\gls{estimator:chap5}的另一个性质是它作为数据样本的函数，期望的变化程度是多少。\n正如我们可以计算\\gls{estimator:chap5}的期望来决定它的偏差，我们也可以计算它的方差。\n\\gls{estimator:chap5}的\\firstgls{variance}就是一个\\gls{variance}\n\\begin{equation}\n    \\text{Var}(\\hat{\\theta})\n\\end{equation}\n其中随机变量是训练集。\n另外，方差的平方根被称为\\firstgls{standard_error}\\footnote{~严格的讲，standard error (se) 与 standard deviation (sd) 是两个概念。The standard error is ... an estimate of that standard deviation (摘自 wikipedia). 可以简单理解为，sd是理论值，se是计算值，在实际计算中，se会无限逼近sd。}，记作$\\text{SE}(\\hat{\\theta})$。\n\n\\gls{estimator:chap5}的方差或\\gls{standard_error}告诉我们，当独立地从潜在的数据生成过程中重采样数据集时，如何期望估计的变化。\n正如我们希望估计的偏差较小，我们也希望其方差较小。\n\n当我们使用有限的样本计算任何统计量时，真实参数的估计都是不确定的，在这个意义下，从相同的分布得到其他样本时，它们的统计量也会不一样。\n任何方差估计量的期望程度是我们想量化的误差的来源。\n\n均值的\\gls{standard_error}被记作\n\\begin{equation}\n\\label{eq:5.46}\n    \\text{SE}(\\hat{\\mu}_m) = \\sqrt{ \\text{Var} \\left[ \\frac{1}{m} \\sum_{i=1}^m x^{(i)} \\right] } = \\frac{\\sigma}{\\sqrt{m}},\n\\end{equation}\n其中$\\sigma^2$是\\gls{example:chap5} $x^{(i)}$的真实方差。\n通常通过$\\sigma$的估计值来估计\\gls{standard_error}。\n可惜，样本方差的平方根和方差无偏估计的平方根都不是\\gls{standard_deviation}的无偏估计。\n这两种计算方法都倾向于低估真实的\\gls{standard_deviation}，但仍用于实际中。\n相较而言，方差无偏估计的平方根较少被低估。\n对于较大的$m$，这种近似非常合理。\n\n% -- 124 --\n\n均值的\\gls{standard_error}在\\gls{ML}实验中非常有用。\n我们通常用\\gls{test_set}样本的误差均值来估计泛化误差。\n\\gls{test_set}中\\gls{example:chap5}的数量决定了这个估计的精确度。\n中心极限定理告诉我们均值会接近一个高斯分布，我们可以用\\gls{standard_error}计算出真实期望落在选定区间的概率。\n例如，以均值$\\hat{\\mu}_m$为中心的$95\\%$置信区间是\n\\begin{equation}\n\\label{eq:confidence_interval}\n    ( \\hat{\\mu}_m - 1.96\\text{SE}(\\hat{\\mu}_m), \\hat{\\mu}_m + 1.96 \\text{SE}(\\hat{\\mu}_m) ),\n\\end{equation}\n以上区间是基于均值$\\hat{\\mu}_m$和方差$\\text{SE}(\\hat{\\mu}_m)^2$的高斯分布。\n在\\gls{ML}实验中，我们通常说算法$A$比算法$B$好，是指算法$A$的误差的$95\\%$置信区间的上界小于算法$B$的误差的$95\\%$置信区间的下界。\n\n\\paragraph{示例：伯努利分布} 我们再次考虑从伯努利分布（回顾$P(x^{(i)}; \\theta) = \\theta^{x^{(i)}} (1-\\theta)^{1 - x^{(i)}}$）中独立同分布采样出来的一组\\gls{example:chap5} $\\{ x^{(1)}, \\dots, x^{(m)} \\}$。\n这次我们关注估计$\\hat{\\theta}_m = \\frac{1}{m} \\sum_{i=1}^m x^{(i)}$的方差：\n\\begin{align}\n    \\text{Var}\\left( \\hat{\\theta}_m \\right) &= \\text{Var}\\left( \\frac{1}{m} \\sum_{i=1}^m x^{(i)} \\right) \\\\\n    &= \\frac{1}{m^2} \\sum_{i=1}^m \\text{Var} \\left( x^{(i)} \\right) \\\\\n    &= \\frac{1}{m^2} \\sum_{i=1}^m \\theta (1 - \\theta) \\\\\n    &= \\frac{1}{m^2} m\\theta(1-\\theta) \\\\\n    &= \\frac{1}{m} \\theta(1-\\theta)\n\\end{align} \n\\gls{estimator:chap5}方差的下降速率是关于\\gls{dataset}\\gls{example:chap5}数目$m$的函数。\n这是常见估计量的普遍性质，在探讨一致性（参考\\secref{sec:consistency}）时，我们会继续讨论。\n\n% -- 125 --\n\n\\subsection{权衡偏差和方差以最小化均方误差}\n\\label{sec:trading_off_bias_and_variance_to_minimize_mean_squared_error}\n偏差和方差度量着估计量的两个不同误差来源。\n偏差度量着偏离真实函数或参数的误差期望。\n而方差度量着数据上任意特定采样可能导致的估计期望的偏差。\n\n当我们可以在一个偏差更大的估计和一个方差更大的估计中进行选择时，会发生什么呢？我们该如何选择？\n例如，想象我们希望近似\\figref{fig:chap5_underfit_just_right_overfit}中的函数，我们只可以选择一个偏差较大的估计或一个方差较大的估计，我们该如何选择呢？\n\n判断这种权衡最常用的方法是交叉验证。\n经验上，交叉验证在真实世界的许多任务中都非常成功。\n另外，我们也可以比较这些估计的\\firstall{mean_squared_error}：\n\\begin{align}\n    \\text{MSE} &= \\SetE[ ( \\hat{\\theta}_m - \\theta  )^2 ] \\\\\n        &= \\text{Bias}( \\hat{\\theta}_m )^2 + \\text{Var}( \\hat{\\theta}_m ) \\label{eq:5.54}\n\\end{align}\n\\glssymbol{mean_squared_error}\\,度量着估计和真实参数$\\theta$之间平方误差的总体期望偏差。\n如\\eqnref{eq:5.54}所示，\\glssymbol{mean_squared_error}\\,估计包含了偏差和方差。\n理想的估计具有较小的\\,\\glssymbol{mean_squared_error}\\,或是在检查中会稍微约束它们的偏差和方差。\n\n偏差和方差的关系和\\gls{ML}容量、欠拟合和过拟合的概念紧密相联。\n用\\,\\glssymbol{mean_squared_error}\\,度量泛化误差（偏差和方差对于泛化误差都是有意义的）时，增加容量会增加方差，降低偏差。\n如\\figref{fig:chap5_bias_variance_tradeoff}所示，我们再次在关于容量的函数中，看到泛化误差的U形曲线。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/bias_variance_tradeoff}}\n\\fi\n\\caption{当\\gls{capacity}增大（$x$轴）时，\\gls{BIAS}（用点表示）随之减小，而方差（虚线）随之增大，使得\\gls{generalization_error}（加粗曲线）产生了另一种U形。如果我们沿着轴改变\\gls{capacity}，会发现\\gls{optimal_capacity}，当\\gls{capacity}小于\\gls{optimal_capacity}会呈现\\gls{underfitting}，大于时导致\\gls{overfitting}。这种关系与\\secref{sec:capacity_overfitting_and_underfitting}以及\\figref{fig:chap5_generalization_vs_capacity}中讨论的\\gls{capacity}、\\gls{underfitting}和\\gls{overfitting}之间的关系类似。}\n\\label{fig:chap5_bias_variance_tradeoff}\n\\end{figure}\n\n% -- 126 --\n\n\\subsection{一致性}\n\\label{sec:consistency}\n目前我们已经探讨了固定大小训练集下不同\\gls{estimator:chap5}的性质。\n通常，我们也会关注训练数据增多后\\gls{estimator:chap5}的效果。\n特别地，我们希望当\\gls{dataset}中数据点的数量$m$增加时，点估计会收敛到对应参数的真实值。\n更形式地，我们想要\n\\begin{equation}\n\\label{eq:5.55}\n    \\plim_{m\\to\\infty} \\hat{\\theta}_m = \\theta.\n\\end{equation}\n符号$\\plim$表示依概率收敛，即对于任意的$\\epsilon > 0$，当$m\\to\\infty$时，有$P(|\\hat{\\theta}_m - \\theta| > \\epsilon) \\to 0$。\n\\eqnref{eq:5.55}表示的条件被称为\\firstgls{consistency}。\n有时它是指弱一致性，强一致性是指\\firstgls{almost_sure}从$\\hat{\\theta}$收敛到$\\theta$。\n\\firstgls{almost_sure_convergence}是指当$p(\\lim_{m\\to\\infty} \\RVx^{(m)} = \\Vx) = 1 $时，随机变量序列$\\RVx^{(1)}$，$\\RVx^{(2)}$，$\\dots$收敛到$\\Vx$。\n\n一致性保证了\\gls{estimator:chap5}的偏差会随数据\\gls{example:chap5}数目的增多而减少。\n然而，反过来是不正确的——渐近无偏并不意味着一致性。\n例如，考虑用包含$m$个样本的\\gls{dataset} $\\{x^{(1)},\\dots,x^{(m)}\\}$估计正态分布$\\mathcal{N}(x;\\mu,\\sigma^2)$的均值参数$\\mu$。\n我们可以使用\\gls{dataset}的第一个\\gls{example:chap5} $x^{(1)}$作为无偏估计量：$\\hat{\\theta} = x^{(1)}$。\n在该情况下，$\\SetE(\\hat{\\theta}_m) = \\theta$，所以不管观测到多少数据点，该\\gls{estimator:chap5}都是无偏的。\n然而，这不是一个一致估计，因为它\\emph{不}满足当$m\\to\\infty$时，$\\hat{\\theta}_m \\to \\theta$。\n\n% -- 127 --\n\n\\section{\\glsentrytext{maximum_likelihood_estimation}}\n\\label{sec:maximum_likelihood_estimation}\n之前，我们已经看过常用估计的定义，并分析了它们的性质。\n但是这些估计是从哪里来的呢？\n我们希望有些准则可以让我们从不同模型中得到特定函数作为好的估计，而不是猜测某些函数可能是好的估计，然后分析其偏差和方差。\n\n最常用的准则是\\gls{maximum_likelihood_estimation}。\n\n考虑一组含有$m$个\\gls{example:chap5}的\\gls{dataset} $\\SetX=\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)} \\}$，独立地由未知的真实数据生成分布$p_{\\text{data}}(\\RVx)$生成。\n\n令$p_{\\text{model}}( \\RVx; \\Vtheta )$是一族由$\\Vtheta$确定在相同空间上的概率分布。\n换言之，$p_{\\text{model}}(\\Vx;\\Vtheta)$将任意输入$\\Vx$映射到实数来估计真实概率$p_{\\text{data}}(\\Vx)$。\n\n对$\\Vtheta$的最大似然估计被定义为：\n\\begin{align}\n    \\Vtheta_{\\text{ML}} &= \\underset{\\Vtheta}{\\argmax} \\, p_{\\text{model}} (\\SetX; \\Vtheta), \\\\\n        &= \\underset{\\Vtheta}{\\argmax} \\prod_{i=1}^m p_{\\text{model}} (\\Vx^{(i)}; \\Vtheta).\n\\end{align}\n\n多个概率的乘积会因很多原因不便于计算。\n例如，计算中很可能会出现数值下溢。\n为了得到一个便于计算的等价优化问题，我们观察到似然对数不会改变其$\\argmax$但是将乘积转化成了便于计算的求和形式：\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\sum_{i=1}^m \\log p_{\\text{model}} (\\Vx^{(i)}; \\Vtheta) .\n\\end{equation}\n因为当我们重新缩放\\gls{cost_function}时$\\argmax$不会改变，我们可以除以$m$得到和训练数据经验分布$\\hat{p}_{\\text{data}}$相关的期望作为准则：\n\\begin{equation}\n\\label{eq:5.59}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\,\\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} \\log p_{\\text{model}} (\\Vx; \\Vtheta) .\n\\end{equation}\n\n一种解释\\gls{maximum_likelihood_estimation}的观点是将它看作最小化训练集上的经验分布$\\hat{p}_{\\text{data}}$和模型分布之间的差异，两者之间的差异程度可以通过~\\gls{KL}度量。\n\\gls{KL}被定义为\n\\begin{equation}\n    D_{\\text{KL}}(\\hat{p}_{\\text{data}} \\| p_{\\text{model}}) = \\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} [ \\log \\hat{p}_{\\text{data}}(\\Vx) - \\log p_{\\text{model}}(\\Vx) ] .\n\\end{equation}\n左边一项仅涉及到数据生成过程，和模型无关。\n这意味着当我们训练模型最小化~\\gls{KL}时，我们只需要最小化\n\\begin{equation}\n    -\\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} [ \\log p_{\\text{model}}(\\Vx)  ] ,\n\\end{equation}\n当然，这和\\eqnref{eq:5.59}中最大化是相同的。\n\n% -- 128 --\n\n最小化~\\gls{KL}其实就是在最小化分布之间的\\gls{cross_entropy}。\n许多作者使用术语``\\gls{cross_entropy}''特定表示伯努利或softmax分布的负对数似然，但那是用词不当的。\n任何一个由负对数似然组成的\\gls{loss}都是定义在训练集上的经验分布和定义在模型上的概率分布之间的\\gls{cross_entropy}。\n例如，\\gls{mean_squared_error}是经验分布和高斯模型之间的\\gls{cross_entropy}。\n\n我们可以将最大似然看作是使模型分布尽可能地和经验分布$\\hat{p}_{\\text{data}}$相匹配的尝试。\n理想情况下，我们希望匹配真实的数据生成分布$p_{\\text{data}}$，但我们没法直接知道这个分布。\n\n虽然最优$\\Vtheta$在最大化似然或是最小化~\\gls{KL}时是相同的，但目标函数值是不一样的。\n在软件中，我们通常将两者都称为最小化\\gls{cost_function}。\n因此最大化似然变成了最小化负对数似然（NLL)，或者等价的是最小化交叉熵。\n将最大化似然看作最小化~\\gls{KL}的视角在这个情况下是有帮助的，因为已知~\\gls{KL}最小值是零。\n当$\\Vx$取实数时，负对数似然可以是负值。\n\n\\subsection{条件对数似然和\\glsentrytext{mean_squared_error}}\n\\label{sec:conditional_log_likelihood_and_mean_squared_error}\n\\gls{maximum_likelihood_estimation}很容易扩展到估计条件概率$P(\\RVy \\mid \\RVx;\\Vtheta)$，从而给定$\\RVx$预测$\\RVy$。\n实际上这是最常见的情况，因为这构成了大多数\\gls{supervised_learning}的基础。\n如果$\\MX$表示所有的输入，$\\MY$表示我们观测到的\\gls{target}，那么条件\\gls{maximum_likelihood_estimation}是\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} P(\\MY \\mid \\MX; \\Vtheta).\n\\end{equation}\n如果假设\\gls{example:chap5}是独立同分布的，那么这可以分解成\n\\begin{equation}\n\\label{eq:5.63}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\sum_{i=1}^m \\log P(\\Vy^{(i)} \\mid \\Vx^{(i)}; \\Vtheta).\n\\end{equation}\n\n% -- 129 --\n\n\\paragraph{示例：\\gls{linear_regression}作为最大似然} \\secref{sec:example_linear_regression}介绍的\\gls{linear_regression}，可以被看作是最大似然过程。\n之前，我们将\\gls{linear_regression}作为学习从输入$\\Vx$映射到输出$\\hat{y}$的算法。\n从$\\Vx$到$\\hat{y}$的映射选自最小化\\gls{mean_squared_error}（我们或多或少介绍的一个标准）。\n现在，我们以\\gls{maximum_likelihood_estimation}的角度重新审视\\gls{linear_regression}。\n我们现在希望模型能够得到条件概率$p(y \\mid \\Vx)$，而不只是得到一个单独的预测$\\hat{y}$。\n想象有一个无限大的训练集，我们可能会观测到几个训练\\gls{example:chap5}有相同的输入$\\Vx$但是不同的$y$。\n现在学习算法的目标是拟合分布$p(y \\mid \\Vx)$到和$\\Vx$相匹配的不同的$y$。\n为了得到我们之前推导出的相同的\\gls{linear_regression}算法，我们定义$p(y \\mid \\Vx) = \\mathcal{N}(y; \\hat{y}(\\Vx; \\Vw), \\sigma^2)$。\n函数$\\hat{y}(\\Vx; \\Vw)$预测高斯的均值。\n在这个例子中，我们假设方差是用户固定的某个常量$\\sigma^2$。\n这种函数形式$p(y \\mid \\Vx)$会使得\\gls{maximum_likelihood_estimation}得出和之前相同的学习算法。\n由于假设\\gls{example:chap5}是独立同分布的，条件对数似然（\\eqnref{eq:5.63}）如下\n\\begin{align}\n     & \\sum_{i=1}^m \\log p(y^{(i)} \\mid \\Vx^{(i)}; \\Vtheta) \\\\\n    =& -m \\log\\sigma - \\frac{m}{2} \\log(2\\pi) - \\sum_{i=1}^m \\frac{ \\norm{\\hat{y}^{(i)} - y^{(i)} }^2 }{2\\sigma^2},\n\\end{align}\n其中$\\hat{y}^{(i)}$是\\gls{linear_regression}在第$i$个输入$\\Vx^{(i)}$上的输出，$m$是训练\\gls{example:chap5}的数目。\n对比\\gls{mean_squared_error}和对数似然，\n\\begin{equation}\n    \\text{MSE}_{\\text{train}} = \\frac{1}{m} \\sum_{i=1}^m \\norm{\\hat{y}^{(i)} - y^{(i)}}^2,\n\\end{equation}\n我们立刻可以看出最大化关于$\\Vw$的对数似然和最小化\\gls{mean_squared_error}会得到相同的参数估计$\\Vw$。\n这两个准则的值虽然不同，但是在相同的最优$\\Vw$位置取得最优值。\n这验证了\\,\\glssymbol{mean_squared_error}\\,可以用于\\gls{maximum_likelihood_estimation}。\n正如我们将看到的，\\gls{maximum_likelihood_estimation}有几个理想的性质。\n\n% -- 130 --\n\n\\subsection{最大似然的性质}\n\\label{sec:properties_of_maximum_likelihood}\n\\gls{maximum_likelihood_estimation}最吸引人的地方在于，它被证明当\\gls{example:chap5}数目$m\\to\\infty$时，就收敛率而言是最好的渐近估计。\n\n在合适的条件下，\\gls{maximum_likelihood_estimation}具有一致性（参考\\secref{sec:consistency}），意味着训练\\gls{example:chap5}数目趋向于无穷大时，参数的\\gls{maximum_likelihood_estimation}会收敛到参数的真实值。\n这些条件是：\n\\begin{itemize}\n    \\item 真实分布$p_{\\text{data}}$必须在模型族$p_{\\text{model}}(\\cdot; \\Vtheta)$ 中。\n    否则，没有估计可以还原$p_{\\text{data}}$。\n    \n    \\item 真实分布$p_{\\text{data}}$必须刚好对应一个$\\Vtheta$值。\n    否则，\\gls{MLE}恢复出真实分布$p_{\\text{data}}$后，也不能决定数据生成过程使用哪个$\\Vtheta$。\n\\end{itemize}\n\n除了\\gls{maximum_likelihood_estimation}，还有其他的归纳准则，其中许多共享一致估计的性质。\n然而，一致估计的\\firstgls{statistical_efficiency}可能区别很大。\n某些一致估计可能会在固定数目的样本上获得一个较低的泛化误差，或者等价地，可能只需要较少的\\gls{example:chap5}就能达到一个固定程度的泛化误差。\n\n统计效率通常用于\\firstgls{parametric_case}的研究中（例如\\gls{linear_regression}）。有参情况中我们的目标是估计参数值（假设有可能确定真实参数），而不是函数值。\n一种度量我们和真实参数相差多少的方法是计算\\gls{mean_squared_error}的期望，即计算$m$个从数据生成分布中出来的训练\\gls{example:chap5}上的估计参数和真实参数之间差值的平方。\n有参\\gls{mean_squared_error}估计随着$m$的增加而减少，当$m$较大时，Cram\\'er-Rao下界\\citep{Rao-1945,Cramer-1946}表明不存在\\gls{mean_squared_error}低于\\gls{MLE}的一致估计。\n\n因为这些原因（一致性和统计效率），最大似然通常是\\gls{ML}中的首选估计。\n当\\gls{example:chap5}数目小到会发生过拟合时，\\gls{regularization}策略如权重衰减可用于获得训练数据有限时方差较小的最大似然有偏版本。\n\n% -- 131 --\n\n\\section{贝叶斯统计}\n\\label{sec:bayesian_statistics}\n至此我们已经讨论了\\firstgls{frequentist_statistics}方法和基于估计单一值$\\Vtheta$的方法，然后基于该估计作所有的预测。\n另一种方法是在做预测时会考虑所有可能的$\\Vtheta$。\n后者属于\\firstgls{bayesian_statistics}的范畴。\n\n正如\\secref{sec:point_estimation}中讨论的，频率派的视角是真实参数$\\Vtheta$是未知的定值，而点估计$\\hat{\\Vtheta}$是\\gls{dataset}（可以看作是随机的）上的函数，从而是一个随机变量。\n\n贝叶斯统计的视角完全不同。\n贝叶斯用概率反映知识状态的确定性程度。\n\\gls{dataset}能够被直接观测到，因此不是随机的。\n另一方面，真实参数$\\Vtheta$是未知或不确定的，因此可以表示成随机变量。\n\n在观察到数据前，我们将$\\Vtheta$的已知知识表示成\\firstgls{prior_probability_distribution}，$p(\\Vtheta)$（有时简单地称为``先验''）。\n一般而言，\\gls{ML}实践者会选择一个相当宽泛的（即，高熵的）先验分布，反映在观测到任何数据前参数$\\Vtheta$的高度不确定性。\n例如，我们可能会假设先验$\\Vtheta$在有限区间中均匀分布。\n许多先验偏好于``更简单''的解（如小幅度的系数，或是接近常数的函数）。\n\n现在假设我们有一组数据样本$\\{x^{(1)},\\dots,x^{(m)}\\}$。\n通过\\gls{bayes_rule}结合数据似然$p(x^{(1)},\\dots,x^{(m)} \\mid \\Vtheta)$和先验，我们可以恢复数据对我们关于$\\Vtheta$信念的影响：\n\\begin{equation}\n        p(\\Vtheta \\mid x^{(1)},\\dots,x^{(m)}) = \n        \\frac{p(x^{(1)},\\dots,x^{(m)} \\mid \\Vtheta) p(\\Vtheta)}\n            {p(x^{(1)},\\dots,x^{(m)})}\n\\end{equation}\n在贝叶斯估计常用的情景下，先验开始是相对均匀的分布或高熵的高斯分布，观测数据通常会使后验的熵下降，并集中在参数的几个可能性很高的值。\n\n相对于\\gls{maximum_likelihood_estimation}，贝叶斯估计有两个重要区别。\n第一，不像最大似然方法预测时使用$\\Vtheta$的点估计，贝叶斯方法使用$\\Vtheta$的全分布。\n例如，在观测到$m$个\\gls{example:chap5}后，下一个数据\\gls{example:chap5}~$x^{(m+1)}$的预测分布如下：\n\\begin{equation}\n    p(x^{(m+1)} \\mid x^{(1)},\\dots,x^{(m)}) = \n    \\int p(x^{(m+1)} \\mid \\Vtheta) p(\\Vtheta \\mid x^{(1)},\\dots,x^{(m)})~d\\Vtheta .\n\\end{equation}\n这里，每个具有正概率密度的$\\Vtheta$的值有助于下一个\\gls{example:chap5}的预测，其中贡献由后验密度本身加权。\n在观测到\\gls{dataset} $\\{ x^{(1)},\\dots,x^{(m)}\\}$之后，如果我们仍然非常不确定$\\Vtheta$的值，那么这个不确定性会直接包含在我们所做的任何预测中。\n\n% -- 132 --\n\n在\\secref{sec:estimators_bias_and_variance}中，我们已经探讨频率派方法解决给定点估计$\\Vtheta$的不确定性的方法是评估方差，估计的方差评估了观测数据重新从观测数据中采样后，估计可能如何变化。\n对于如何处理估计不确定性的这个问题，贝叶斯派的答案是积分，这往往会防止过拟合。\n当然，积分仅仅是概率法则的应用，使贝叶斯方法容易验证，而频率派\\gls{ML}基于相当特别的决定构建了一个估计，将\\gls{dataset}里的所有信息归纳到一个单独的点估计。\n\n贝叶斯方法和最大似然方法的第二个最大区别是由贝叶斯先验分布造成的。\n先验能够影响概率质量密度朝参数空间中偏好先验的区域偏移。\n实践中，先验通常表现为偏好更简单或更光滑的模型。\n对贝叶斯方法的批判认为先验是人为主观判断影响预测的来源。\n\n当训练数据很有限时，贝叶斯方法通常泛化得更好，但是当训练\\gls{example:chap5}数目很大时，通常会有很大的计算\\gls{cost}。\n\n\n\\paragraph{示例：贝叶斯\\gls{linear_regression}}  我们使用贝叶斯估计方法学习\\gls{linear_regression}的参数。\n在\\gls{linear_regression}中，我们学习从输入向量$\\Vx\\in\\SetR^n$预测标量$y\\in\\SetR$的线性映射。\n该预测由向量$\\Vw \\in \\SetR^n$参数化：\n\\begin{equation}\n    \\hat{y} = \\Vw^\\Tsp \\Vx .\n\\end{equation}\n给定一组$m$个训练样本$(\\MX^{(\\text{train})}, \\Vy^{(\\text{train})})$，\n我们可以表示整个训练集对$y$的预测：\n\\begin{equation}\n    \\hat{\\Vy}^{(\\text{train})} = \\MX^{(\\text{train})} \\Vw .\n\\end{equation}\n表示为$\\Vy^{(\\text{train})}$上的高斯条件分布，我们得到\n\\begin{align}\n    p(\\Vy^{(\\text{train})} \\mid \\MX^{(\\text{train})}, \\Vw) &= \n    \\mathcal{N}( \\Vy^{(\\text{train})}; \\MX^{(\\text{train})}\\Vw, \\MI ) \\\\\n    & \\propto \\exp\\left( \n        -\\frac{1}{2}( \\Vy^{(\\text{train})} - \\MX^{(\\text{train})}\\Vw )^\\Tsp\n        ( \\Vy^{(\\text{train})} - \\MX^{(\\text{train})}\\Vw )\n    \\right),\n\\end{align}\n其中，我们根据标准的\\,\\glssymbol{mean_squared_error}\\,公式假设$y$上的高斯方差为$1$。\n在下文中，为减少符号负担，我们将$(\\MX^{(\\text{train})}, \\Vy^{(\\text{train})})$简单表示为$(\\MX, \\Vy)$。\n\n% -- 133 --\n\n为确定模型参数向量$\\Vw$的后验分布，我们首先需要指定一个先验分布。\n先验应该反映我们对这些参数取值的信念。\n虽然有时将我们的先验信念表示为模型的参数很难或很不自然，但在实践中我们通常假设一个相当广泛的分布来表示$\\Vtheta$的高度不确定性。\n实数值参数通常使用高斯作为先验分布：\n\\begin{equation}\n    p(\\Vw) = \\mathcal{N}( \\Vw; \\Vmu_0, \\VLambda_0 ) \n    \\propto \\exp\\left( \n    -\\frac{1}{2}( \\Vw-\\Vmu_0 )^\\Tsp \\VLambda_0^{-1} ( \\Vw-\\Vmu_0 )\n    \\right),\n\\end{equation}\n其中，$\\Vmu_0$和$\\VLambda_0$分别是先验分布的均值向量和协方差矩阵。\n\\footnote{除非有理由使用协方差矩阵的特定结构，我们通常假设其为对角协方差矩阵\n$\\VLambda_0=\\text{diag}(\\Vlambda_0)$。\n}\n\n确定好先验后，我们现在可以继续确定模型参数的\\textbf{后验}\\emph{分布}。\n\\begin{align}\n    p(\\Vw \\mid \\MX, \\Vy) &\\propto p(\\Vy \\mid \\MX, \\Vw) p(\\Vw) \\\\\n    & \\propto \n        \\exp\\left( \n            -\\frac{1}{2} ( \\Vy - \\MX\\Vw )^\\Tsp( \\Vy - \\MX\\Vw )\n        \\right)\n        \\exp\\left(\n    -\\frac{1}{2} ( \\Vw - \\Vmu_0)^\\Tsp \\VLambda_0^{-1} ( \\Vw - \\Vmu_0)\n        \\right) \\\\\n    & \\propto \\exp\n    \\left(\n    -\\frac{1}{2}\\left(\n    -2\\Vy^\\Tsp\\MX\\Vw + \\Vw^\\Tsp\\MX^\\Tsp\\MX\\Vw + \\Vw^\\Tsp\\VLambda_0^{-1}\\Vw - \n    2\\Vmu_0^\\Tsp \\VLambda_0^{-1}\\Vw\n    \\right)\n    \\right).\n\\end{align}\n现在我们定义$\\VLambda_m = (\\MX^\\Tsp\\MX + \\VLambda_0^{-1})^{-1}$和$\\Vmu_m = \\VLambda_m ( \\MX^\\Tsp \\Vy + \\VLambda_0^{-1}\\Vmu_0 )$。\n使用这些新的变量，我们发现后验可改写为高斯分布：\n\\begin{align}\n    p(\\Vw \\mid \\MX, \\Vy) &\\propto \\exp \\left(\n    -\\frac{1}{2} (\\Vw - \\Vmu_m )^\\Tsp \\VLambda_m^{-1}  (\\Vw - \\Vmu_m ) \n    + \\frac{1}{2} \\Vmu_m^\\Tsp \\VLambda_m^{-1}  \\Vmu_m \n    \\right) \\\\\n    &\\propto \\exp\\left(\n    -\\frac{1}{2} (\\Vw - \\Vmu_m)^\\Tsp \\VLambda_m^{-1} (\\Vw - \\Vmu_m)\n    \\right).\n\\end{align}\n分布的积分必须归一这个事实意味着要删去所有不包括参数向量$\\Vw$的项。\n\\eqnref{eq:3.23}显示了如何标准化多元高斯分布。\n\n% -- 134 --\n\n检查此后验分布可以让我们获得\\gls{bayesian_inference}效果的一些直觉。\n大多数情况下，我们设置$\\Vmu_0 = 0$。\n如果我们设置$\\VLambda_0 = \\frac{1}{\\alpha}\\MI$，那么$\\mu_m$对$\\Vw$的估计就和频率派带权重衰减惩罚$\\alpha\\Vw^\\Tsp\\Vw$的\\gls{linear_regression}的估计是一样的。\n一个区别是若$\\alpha$设为$0$则贝叶斯估计是未定义的——我们不能将贝叶斯学习过程初始化为一个无限宽的$\\Vw$先验。\n更重要的区别是贝叶斯估计会给出一个协方差矩阵，表示$\\Vw$所有不同值的可能范围，而不仅是估计$\\mu_m$。\n\n\\subsection{\\glsentrytext{MAP}(\\glssymbol{MAP})估计}\n\\label{sec:maximum_a_posteriori_map_estimation}\n原则上，我们应该使用参数$\\Vtheta$的完整贝叶斯后验分布进行预测，但单点估计常常也是需要的。\n希望使用点估计的一个常见原因是，对于大多数有意义的模型而言，大多数涉及到贝叶斯后验的计算是非常棘手的，点估计提供了一个可行的近似解。\n我们仍然可以让先验影响点估计的选择来利用贝叶斯方法的优点，而不是简单地回到\\gls{MLE}。\n一种能够做到这一点的合理方式是选择\\firstall{MAP}点估计。\n\\glssymbol{MAP}\\,估计选择后验概率最大的点（或在$\\Vtheta$是连续值的更常见情况下，概率密度最大的点）：\n\\begin{equation}\n\\label{eq:5.79}\n    \\Vtheta_{\\text{MAP}} = \\underset{\\Vtheta}{\\argmax} \\, p(\\Vtheta\\mid\\Vx)\n    = \\underset{\\Vtheta}{\\argmax} \\, \\log p(\\Vx \\mid \\Vtheta) + \\log p(\\Vtheta) .\n\\end{equation}\n我们可以认出上式右边的$\\log p(\\Vx \\mid \\Vtheta)$对应着标准的对数似然项，$\\log p(\\Vtheta)$对应着先验分布。\n\n% -- 135 --\n\n例如，考虑具有高斯先验权重$\\Vw$的\\gls{linear_regression}模型。\n如果先验是$\\mathcal{N}(\\Vw;\\mathbf{0},\\frac{1}{\\lambda}I^2)$，那么\\eqnref{eq:5.79}的对数先验项正比于熟悉的权重衰减惩罚$\\lambda \\Vw^\\Tsp\\Vw$，加上一个不依赖于$\\Vw$也不会影响学习过程的项。\n因此，具有高斯先验权重的\\glssymbol{MAP}~\\gls{bayesian_inference}对应着权重衰减。\n\n正如全\\gls{bayesian_inference}，\\glssymbol{MAP}\\,\\gls{bayesian_inference}的优势是能够利用来自先验的信息，这些信息无法从训练数据中获得。\n该附加信息有助于减少\\gls{MAP}点估计的方差（相比于ML估计）。\n然而，这个优点的代价是增加了偏差。\n\n许多正规化估计方法，例如权重衰减\\gls{regularization}的最大似然学习，可以被解释为\\gls{bayesian_inference}的\\,\\glssymbol{MAP}\\,近似。\n这个适应于\\gls{regularization}时加到\\gls{target}函数的附加项对应着$\\log p(\\Vtheta)$。\n并非所有的正则化惩罚都对应着~\\glssymbol{MAP}~\\gls{bayesian_inference}。\n例如，有些\\gls{regularizer}可能不是一个概率分布的对数。\n还有些\\gls{regularizer}依赖于数据，当然也不会是一个先验概率分布。\n\n\\glssymbol{MAP}\\,\\gls{bayesian_inference}提供了一个直观的方法来设计复杂但可解释的\\gls{regularizer}。\n例如，更复杂的惩罚项可以通过混合高斯分布作为先验得到，而不是一个单独的高斯分布\\citep{Nowlan-nips92}。\n\n\\section{\\glsentrytext{supervised_learning}算法}\n\\label{sec:supervised_learning_algorithms}\n回顾\\secref{sec:the_experience_e}，粗略地说，\\gls{supervised_learning}算法是给定一组输入$\\Vx$和输出$\\Vy$的训练集，学习如何关联输入和输出。\n在许多情况下，输出$\\Vy$很难自动收集，必须由人来提供``监督''，不过该术语仍然适用于训练集目标可以被自动收集的情况。\n\n% -- 136 --\n\n\\subsection{概率监督学习}\n\\label{sec:probabilistic_supervised_learning}\n本书的大部分\\gls{supervised_learning}算法都是基于估计概率分布$p(y\\mid\\Vx)$的。\n我们可以使用\\gls{maximum_likelihood_estimation}找到对于有参分布族$p(y\\mid\\Vx;\\Vtheta)$最好的参数向量$\\Vtheta$。 \n\n我们已经看到，\\gls{linear_regression}对应于分布族\n\\begin{equation}\n    p(y \\mid \\Vx; \\Vtheta) = \\mathcal{N}( y; \\Vtheta^\\Tsp \\Vx, \\MI).\n\\end{equation}\n通过定义一族不同的概率分布，我们可以将\\gls{linear_regression}扩展到分类情况中。\n如果我们有两个类，类$0$和类$1$，那么我们只需要指定这两类之一的概率。\n类$1$的概率决定了类$0$的概率，因为这两个值加起来必须等于$1$。\n\n我们用于\\gls{linear_regression}的实数正态分布是用均值参数化的。\n我们提供这个均值的任何值都是有效的。\n二元变量上的分布稍微复杂些，因为它的均值必须始终在$0$和$1$之间。\n解决这个问题的一种方法是使用~\\gls{logistic_sigmoid}~函数将线性函数的输出压缩进区间$(0,1)$。\n该值可以解释为概率：\n\\begin{equation}\n    p(y = 1 \\mid \\Vx; \\Vtheta) = \\sigma(\\Vtheta^\\Tsp \\Vx).\n\\end{equation}\n这个方法被称为\\firstgls{logistic_regression}，这个名字有点奇怪，因为该模型用于分类而非回归。\n\n\\gls{linear_regression}中，我们能够通过求解正规方程以找到最佳权重。\n相比而言，逻辑回归会更困难些。\n其最佳权重没有闭解。\n反之，我们必须最大化对数似然来搜索最优解。\n我们可以通过\\gls{GD}算法最小化负对数似然来搜索。\n\n通过确定正确的输入和输出变量上的有参条件概率分布族，相同的策略基本上可以用于任何\\gls{supervised_learning}问题。\n\n\\subsection{\\glsentrytext{SVM}}\n\\label{sec:support_vector_machines}\n\\firstall{SVM}是\\gls{supervised_learning}中最有影响力的方法之一\\citep{Boser92,Cortes95}。\n类似于逻辑回归，这个模型也是基于线性函数$\\Vw^\\Tsp \\Vx + b$的。\n不同于逻辑回归的是，支持向量机不输出概率，只输出类别。\n当$\\Vw^\\Tsp\\Vx + b$为正时，\\gls{SVM}预测属于正类。\n类似地，当$\\Vw^\\Tsp\\Vx + b$为负时，\\gls{SVM}预测属于负类。\n\n% -- 137 --\n\n\\gls{SVM}的一个重要创新是\\firstgls{kernel_trick}。\n\\gls{kernel_trick}观察到许多\\gls{ML}算法都可以写成\\gls{example:chap5}间\\gls{dot_product}的形式。\n例如，\\gls{SVM}中的线性函数可以重写为\n\\begin{equation}\n    \\Vw^\\Tsp \\Vx + b = b + \\sum_{i=1}^m \\alpha_i \\Vx^\\Tsp \\Vx^{(i)} ,\n\\end{equation}\n其中，$\\Vx^{(i)}$是训练\\gls{example:chap5}，$\\Valpha$是系数向量。\n学习算法重写为这种形式允许我们将$\\Vx$替换为\\gls{feature}函数$\\phi(\\Vx)$的输出，\\gls{dot_product}替换为被称为\\firstgls{kernel}的函数$k(\\Vx, \\Vx^{(i)}) = \\phi(\\Vx)\\cdot \\phi(\\Vx^{(i)})$。\n运算符$\\cdot$表示类似于$\\phi(\\Vx)^\\Tsp \\phi(\\Vx^{(i)})$的\\gls{dot_product}。\n对于某些\\gls{feature}空间，我们可能不会书面地使用向量\\gls{inner_product}。\n在某些无限维空间中，我们需要使用其他类型的\\gls{inner_product}，如基于积分而非加和的\\gls{inner_product}。\n这种类型\\gls{inner_product}的完整介绍超出了本书的范围。\n\n使用核估计替换\\gls{dot_product}之后，我们可以使用如下函数进行预测\n\\begin{equation}\n    f(\\Vx) = b + \\sum_i \\alpha_i k(\\Vx, \\Vx^{(i)}) .\n\\end{equation}\n这个函数关于$\\Vx$是非线性的，关于$\\phi(\\Vx)$是线性的。\n$\\Valpha$和$f(\\Vx)$之间的关系也是线性的。\n核函数完全等价于用$\\phi(\\Vx)$预处理所有的输入，然后在新的转换空间学习线性模型。\n\n\\gls{kernel_trick}十分强大有两个原因。\n首先，它使我们能够使用保证有效收敛的凸优化技术来学习非线性模型（关于$\\Vx$的函数）。\n这是可能的，因为我们可以认为$\\phi$是固定的，仅优化$\\alpha$，即优化算法可以将决策函数视为不同空间中的线性函数。\n其二，核函数$k$的实现方法通常有比直接构建$\\phi(\\Vx)$再算\\gls{dot_product}高效很多。\n\n在某些情况下，$\\phi(\\Vx)$甚至可以是无限维的，对于普通的显式方法而言，这将是无限的计算代价。\n在很多情况下，即使$\\phi(\\Vx)$是难算的，$k(\\Vx,\\Vx')$却会是一个关于$\\Vx$非线性的、易算的函数。\n举个无限维空间易算的核的例子，我们构建一个作用于非负整数$x$上的\\gls{feature}映射$\\phi(x)$。\n假设这个映射返回一个由开头$x$个$1$，随后是无限个$0$的向量。\n我们可以写一个核函数$k(x,x^{(i)}) = \\min(x, x^{(i)})$，完全等价于对应的无限维\\gls{dot_product}。\n\n% -- 138 --\n\n最常用的核函数是\\firstgls{gaussian_kernel}，\n\\begin{equation}\n    k(\\Vu, \\Vv) = \\mathcal{N} (\\Vu - \\Vv; \\mathbf{0}, \\sigma^2 I) ,\n\\end{equation}\n其中$\\mathcal{N}(x; \\Vmu, \\VSigma)$是标准正态密度。\n这个核也被称为\\firstall{RBF}核，因为其值沿$\\Vv$中从$\\Vu$向外辐射的方向减小。\n高斯核对应于无限维空间中的\\gls{dot_product}，但是该空间的推导没有整数上最小核的示例那么直观。\n\n我们可以认为高斯核在执行一种\\textbf{模板匹配}(template matching)。\n训练\\gls{label} $y$相关的训练\\gls{example:chap5} $\\Vx$变成了类别$y$的模版。\n当测试点$\\Vx'$到$\\Vx$的欧几里得距离很小，对应的高斯核响应很大时，表明$\\Vx'$和模版$\\Vx$非常相似。\n该模型进而会赋予相对应的训练\\gls{label} $y$较大的权重。\n总的来说，预测将会组合很多这种通过训练样本相似度加权的训练标签。\n\n\\gls{SVM}不是唯一可以使用\\gls{kernel_trick}来增强的算法。\n许多其他的线性模型也可以通过这种方式来增强。\n使用\\gls{kernel_trick}的算法类别被称为\\firstgls{kernel_machines}或\\firstgls{kernel_methods}\\citep{Williams+Rasmussen-nips8,SchBurSmo99}。    \n\n核机器的一个主要缺点是计算决策函数的成本关于训练\\gls{example:chap5}的数目是线性的。\n因为第$i$个\\gls{example:chap5}贡献$\\alpha_i k(\\Vx, \\Vx^{(i)})$到决策函数。\n\\gls{SVM}能够通过学习主要包含零的向量$\\Valpha$，以缓和这个缺点。\n那么判断新\\gls{example:chap5}的类别仅需要计算非零$\\alpha_i$对应的训练\\gls{example:chap5}的核函数。\n这些训练\\gls{example:chap5}被称为\\firstgls{support_vectors}。\n\n当\\gls{dataset}很大时，\\gls{kernel_machines}的计算量也会很大。这成为核机器方法的另一个痛点。\n我们将会在\\secref{sec:stochastic_gradient_descent_chap5}回顾这个想法。\n带通用核的核机器并不总是泛化得很好。\n我们将在\\secref{sec:challenges_motivating_deep_learning}解释原因。\n现代\\gls{DL}的设计旨在克服核机器的这些限制。\n当前\\gls{DL}的复兴始于~\\cite{Hinton06-small}表明神经网络能够在MNIST基准数据上胜过RBF核的\\gls{SVM}。\n\n% -- 139 --\n\n\\subsection{其他简单的\\glsentrytext{supervised_learning}算法}\n\\label{sec:other_simple_supervised_learning_algorithms}\n我们已经简要介绍过另一个非概率\\gls{supervised_learning}算法，最近邻回归。\n更一般地，k-最近邻是一类可用于分类或回归的技术。\n作为一个非参数学习算法，$k$-最近邻并不局限于固定数目的参数。\n我们通常认为$k$-最近邻算法没有任何参数，而是使用训练数据的简单函数。\n事实上，它甚至也没有一个真正的训练阶段或学习过程。\n反之，在测试阶段我们希望在新的测试输入$\\Vx$上产生$y$，我们需要在训练数据$\\MX$上找到$\\Vx$的$k$-最近邻。\n然后我们返回训练集上对应的$y$值的平均值。\n这几乎适用于任何类型可以确定$y$值平均值的\\gls{supervised_learning}。\n在分类情况中，我们可以关于~\\gls{one_hot}~编码向量$\\Vc$求平均，其中$c_y = 1$，其他的$i$值取$c_i=0$。\n然后，我们可以将这些~\\gls{one_hot}~编码的均值解释为类别的概率分布。\n作为一个非参数学习算法，$k$-近邻能达到非常高的容量。\n例如，假设我们有一个用$0$-$1$误差度量性能的多分类任务。\n在此设定中，当训练\\gls{example:chap5}数目趋向于无穷大时，$1$-最近邻收敛到两倍贝叶斯误差。\n超出贝叶斯误差的原因是它会随机从等距离的临近点中随机挑一个。\n而存在无限的训练数据时，所有测试点$\\Vx$周围距离为零的邻近点有无限多个。\n如果我们使用所有这些临近点投票的决策方式，而不是随机挑选一个，那么该过程将会收敛到贝叶斯错误率。\n$k$-最近邻的高容量使其在训练\\gls{example:chap5}数目大时能够获取较高的精度。\n然而，它的计算成本很高，另外在训练集较小时泛化能力很差。\n$k$-最近邻的一个弱点是它不能学习出哪一个\\gls{feature}比其他更具识别力。\n例如，假设我们要处理一个的回归任务，其中$\\Vx\\in\\SetR^{100}$是从各向同性的高斯分布中抽取的，但是只有一个变量$x_1$和结果相关。\n进一步假设该\\gls{feature}直接决定了输出，即在所有情况中$y=x_1$。\n\\gls{nearest_neighbor_regression}不能检测到这个简单模式。\n大多数点$\\Vx$的最近邻将取决于$x_2$到$x_{100}$的大多数\\gls{feature}，\n而不是单独取决于\\gls{feature} $x_1$。\n因此，小训练集上的输出将会非常随机。\n\n% -- 140 --\n\n\\firstgls{decision_tree}及其变种是另一类将输入空间分成不同的区域，每个区域有独立参数的算法\\citep{Breiman84}。\n如\\figref{fig:chap5_decision_tree}所示，决策树的每个节点都与输入空间的一个区域相关联，并且内部节点继续将区域分成子节点下的子区域（通常使用坐标轴拆分区域）。\n空间由此细分成不重叠的区域，叶节点和输入区域之间形成一一对应的关系。\n每个叶结点将其输入区域的每个点映射到相同的输出。\n决策树通常有特定的训练算法，超出了本书的范围。\n如果允许学习任意大小的决策树，那么它可以被视作非参数算法。\n然而实践中通常有大小限制，作为\\gls{regularizer}将其转变成有参模型。\n由于决策树通常使用坐标轴相关的拆分，并且每个子节点关联到常数输出，因此有时解决一些对于逻辑回归很简单的问题很费力。\n例如，假设有一个二分类问题，当$x_2>x_1$时分为正类，则决策树的分界不是坐标轴对齐的。\n因此，决策树将需要许多节点近似决策边界，坐标轴对齐使其算法步骤不断地来回穿梭于真正的决策函数。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/decision_tree}}\n\\fi\n\\caption{描述一个\\gls{decision_tree}如何工作的示意图。\\emph{(上)}树中每个节点都选择将输入样本送到左子节点($0$)或者右子节点($1$)。内部的节点用圆圈表示，叶节点用方块表示。每一个节点可以用一个二值的字符串识别并对应树中的位置，这个字符串是通过给起父亲节点的字符串添加一个位元来实现的（$0$表示选择左或者上，$1$表示选择右或者下）。\\emph{(下)}这个树将空间分为区域。这个二维平面说明\\gls{decision_tree}可以分割$\\SetR^2$。这个平面中画出了树的节点，每个内部点穿过分割线并用来给样本分类，叶节点画在样本所属区域的中心。结果是一个分块常数函数，每一个叶节点一个区域。每个叶需要至少一个训练样本来定义，所以\\gls{decision_tree}不可能用来学习一个\\gls{local_maxima}比训练样本数量还多的函数。}\n\\label{fig:chap5_decision_tree}\n\\end{figure}\n\n正如我们已经看到的，最近邻预测和决策树都有很多的局限性。\n尽管如此，在计算资源受限制时，它们都是很有用的学习算法。\n通过思考复杂算法和$k$-最近邻或决策树之间的相似性和差异，我们可以建立对更复杂学习算法的直觉。\n\n读者可以参考~\\cite{MurphyBook2012,bishop-book2006,Hastie2001}或其他\\gls{ML}教科书了解更多的传统\\gls{supervised_learning}算法。\n\n\\section{\\glsentrytext{unsupervised_learning}算法}\n\\label{sec:unsupervised_learning_algorithms}\n回顾\\secref{sec:the_experience_e}，无监督算法只处理``\\gls{feature}''，不操作监督信号。\n监督和无监督算法之间的区别没有规范严格的定义，因为没有客观的判断来区分监督者提供的值是\\gls{feature}还是\\gls{target}。\n通俗地说，\\gls{unsupervised_learning}的大多数尝试是指从不需要人为注释的\\gls{example:chap5}的分布中抽取信息。\n该术语通常与密度估计相关，学习从分布中采样、学习从分布中\\gls{denoise}、寻找数据分布的流形或是将数据中相关的\\gls{example:chap5}聚类。\n\n一个经典的\\gls{unsupervised_learning}任务是找到数据的``最佳''表示。\n``最佳''可以有不同的定义，但是一般来说，我们想要的是一个能尽量保留关于$\\Vx$的更多信息，同时受到一些惩罚或遵循一些约束的表示。这些惩罚或约束的目的是使表示保持简单的形式，或使其比$\\Vx$本身易于获取或使用。 \n\n% -- 142 --\n\n有很多方式定义较简单的表示。最常见的三种包括低维表示、稀疏表示和独立表示。\n低维表示尝试将$\\Vx$中的信息尽可能压缩在一个较小的表示中。\n稀疏表示将\\gls{dataset}嵌入到输入项大多数为零的表示中\\citep{Barlow89,Olshausen+Field-1996,Hinton+Ghahramani-97}。\n稀疏表示通常用于需要增加表示维数的情况，使得大部分为零的表示不会丢失很多信息。\n这会使得表示的整体结构倾向于将数据分布在表示空间的坐标轴上。\n独立表示试图\\emph{分开}数据分布中变化的来源，使得表示的维度是统计独立的。\n\n当然这三个标准并非相互排斥的。\n低维表示通常会产生比原始的高维数据具有较少或较弱依赖关系的元素。\n这是因为减少表示大小的一种方式是找到并消除冗余。\n识别并去除更多的冗余使得降维算法在丢失更少信息的同时显现更大的压缩。\n\n表示的概念是\\gls{DL}核心主题之一，因此也是本书的核心主题之一。\n本节会介绍表示学习算法中的一些简单示例。\n总的来说，这些示例算法会说明如何实施上面的三个标准。\n剩余的大部分章节会介绍额外的表示学习算法，它们以不同方式体现和发展这三个标准或是引入其他标准。\n\n\\subsection{\\glsentrytext{PCA}}\n\\label{sec:principal_components_analysis_chap5}\n在\\secref{sec:example_principal_components_analysis_chap2}中，我们看到\\,\\glssymbol{PCA}\\,算法提供了一种压缩数据的方式。\n我们也可以将\\,\\glssymbol{PCA}\\,视为学习数据表示的\\gls{unsupervised_learning}算法。\n这种表示基于上述简单表示的两个标准。\n\\,\\glssymbol{PCA}\\,学习一种比原始输入维数更低的表示。\n它也学习了一种元素之间彼此没有线性相关的表示。\n这是学习表示中元素统计独立标准的第一步。\n要实现完全独立性，表示学习算法也必须去掉变量间的非线性关系。\n\n% -- 143 --\n\n如\\figref{fig:chap5_pca}所示，\\glssymbol{PCA}\\,将输入$\\Vx$投影表示成$\\Vz$，学习数据的正交线性变换。\n在\\secref{sec:example_principal_components_analysis_chap2}中，我们看到了如何学习重建原始数据的最佳一维表示（就\\gls{mean_squared_error}而言），这种表示其实对应着数据的第一个主要成分。\n因此，我们可以用\\,\\glssymbol{PCA}\\,作为保留数据尽可能多信息的降维方法（再次就最小重构误差平方而言）。\n在下文中，我们将研究\\,\\glssymbol{PCA}\\,表示如何使原始数据表示$\\MX$去相关的.\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/pca_color}}\n\\fi\n\\caption{\\glssymbol{PCA}\\,学习一种线性投影，使最大方差的方向和新空间的轴对齐。\\emph{(左)}原始数据包含了$\\Vx$的样本。在这个空间中，方差的方向与轴的方向并不是对齐的。\\emph{(右)}变换过的数据$\\Vz = \\Vx^{\\top}\\MW$在轴$z_1$的方向上有最大的变化。第二大变化方差的方向沿着轴$z_2$。}\n\\label{fig:chap5_pca}\n\\end{figure}\n\n假设有一个$m\\times n$的\\gls{design_matrix} $\\MX$，数据的均值为零，$\\SetE[\\Vx\\,] = 0$。\n若非如此，通过预处理步骤使所有\\gls{example:chap5}减去均值，数据可以很容易地中心化。\n\n$\\MX$对应的无偏样本协方差矩阵给定如下\n\\begin{equation}\n    \\text{Var}[\\Vx\\,] = \\frac{1}{m-1} \\MX^\\Tsp \\MX .\n\\end{equation}\n\\glssymbol{PCA}\\,通过线性变换找到一个$\\text{Var}[\\Vz]$是对角矩阵的表示$\\Vz=\\MW^\\Tsp\\Vx$。\n\n在\\secref{sec:example_principal_components_analysis_chap2}，我们已知\\gls{design_matrix} $\\MX$的主成分由$\\MX^\\Tsp\\MX$的\\gls{feature}向量给定。\n从这个角度，我们有\n\\begin{equation}\n    \\MX^\\Tsp\\MX = \\MW \\VLambda \\MW^\\Tsp .\n\\end{equation}\n本节中，我们会探索主成分的另一种推导。\n主成分也可以通过奇异值分解(SVD)得到。\n具体来说，它们是$\\MX$的右奇异向量。\n为了说明这点，假设$\\MW$是奇异值分解$\\MX = \\MU\\VSigma\\MW^\\Tsp$的右奇异向量。\n以$\\MW$作为特征向量基，我们可以得到原来的特征向量方程：\n\\begin{equation}\n    \\MX^\\Tsp\\MX = \\left( \\MU\\VSigma \\MW^\\Tsp \\right)^\\Tsp \\MU\\VSigma \\MW^\\Tsp = \n    \\MW \\VSigma^2 \\MW^\\Tsp .\n\\end{equation}\n\n% -- 144 --\n\n\\glssymbol{SVD}\\,有助于说明\\,\\glssymbol{PCA}\\,后的$\\text{Var}[\\Vz]$是对角的。\n使用$\\MX$的\\,\\glssymbol{SVD}\\,分解，$\\MX$的方差可以表示为\n\\begin{align}\n    \\text{Var}[\\Vx] &= \\frac{1}{m-1} \\MX^\\Tsp\\MX \\\\\n    &= \\frac{1}{m-1} \\left( \\MU\\VSigma \\MW^\\Tsp \\right)^\\Tsp \\MU\\VSigma \\MW^\\Tsp \\\\\n    &= \\frac{1}{m-1} \\MW \\VSigma^\\Tsp \\MU^\\Tsp \\MU\\VSigma \\MW^\\Tsp \\\\\n    &= \\frac{1}{m-1} \\MW \\VSigma^2 \\MW^\\Tsp ,\n\\end{align}\n其中，我们使用$\\MU^\\Tsp\\MU = \\MI$，因为根据奇异值的定义矩阵$\\MU$是正交的。\n这表明$\\Vz$的协方差满足对角的要求：\n\\begin{align}\n    \\text{Var}[\\Vz] &= \\frac{1}{m-1} \\MZ^\\Tsp\\MZ \\\\\n    &= \\frac{1}{m-1} \\MW^\\Tsp \\MX^\\Tsp \\MX \\MW \\\\\n    &= \\frac{1}{m-1} \\MW^\\Tsp\\MW \\VSigma^2 \\MW^\\Tsp\\MW \\\\\n    &= \\frac{1}{m-1} \\VSigma^2 ,\n\\end{align}\n其中，再次使用\\,\\glssymbol{SVD}\\,的定义有$\\MW^\\Tsp\\MW = \\MI$。\n\n以上分析指明当我们通过线性变换$\\MW$将数据$\\Vx$投影到$\\Vz$时，得到的数据表示的协方差矩阵是对角的（即$\\VSigma^2$），立刻可得$\\Vz$中的元素是彼此无关的。\n\n\\glssymbol{PCA}\\,这种将数据变换为元素之间彼此不相关表示的能力是\\,\\glssymbol{PCA}\\,的一个重要性质。\n它是\\emph{消除数据中未知变化因素}的简单表示示例。\n在\\,\\glssymbol{PCA}\\,中，这个消除是通过寻找输入空间的一个旋转（由$\\MW$确定），\n使得方差的主坐标和$\\Vz$相关的新表示空间的基对齐。\n\n% -- 145 --\n\n虽然相关性是数据元素间依赖关系的一个重要范畴，但我们对于能够消除更复杂形式的\\gls{feature}依赖的表示学习也很感兴趣。\n对此，我们需要比简单线性变换更强的工具。\n\n\\subsection{$k$-均值聚类}\n\\label{sec:k_means_clustering}\n另外一个简单的表示学习算法是$k$-均值聚类。\n$k$-均值聚类算法将训练集分成$k$个靠近彼此的不同\\gls{example:chap5}聚类。\n因此我们可以认为该算法提供了$k$-维的~\\gls{one_hot}~编码向量$\\Vh$以表示输入$\\Vx$。\n当$\\Vx$属于聚类$i$时，有$h_i=1$，$\\Vh$的其他项为零。\n\n$k$-均值聚类提供的~\\gls{one_hot}~编码也是一种稀疏表示，因为每个输入的表示中大部分元素为零。\n之后，我们会介绍能够学习更灵活的稀疏表示的一些其他算法（表示中每个输入$\\Vx$不只一个非零项）。\n\\gls{one_hot}~编码是稀疏表示的一个极端示例，丢失了很多分布式表示的优点。\n\\gls{one_hot}~编码仍然有一些统计优点（自然地传达了相同聚类中的\\gls{example:chap5}彼此相似的观点），\n也具有计算上的优势，因为整个表示可以用一个单独的整数表示。\n\n$k$-均值聚类初始化$k$个不同的中心点$\\{\\Vmu^{(1)},\\dots,\\Vmu^{(k)}\\}$，然后迭代交换两个不同的步骤直到收敛。\n步骤一，每个训练\\gls{example:chap5}分配到最近的中心点$\\Vmu^{(i)}$所代表的聚类$i$。\n步骤二，每一个中心点$\\Vmu^{(i)}$更新为聚类$i$中所有训练\\gls{example:chap5} $\\Vx^{(j)}$的均值。\n\n关于聚类的一个问题是聚类问题本身是病态的。\n这是说没有单一的标准去度量聚类的数据在真实世界中效果如何。\n我们可以度量聚类的性质，例如类中元素到类中心点的欧几里得距离的均值。\n这使我们可以判断从聚类分配中重建训练数据的效果如何。\n然而我们不知道聚类的性质是否很好地对应到真实世界的性质。\n此外，可能有许多不同的聚类都能很好地对应到现实世界的某些属性。\n我们可能希望找到和一个\\gls{feature}相关的聚类，但是得到了一个和任务无关的，同样是合理的不同聚类。\n例如，假设我们在包含红色卡车图片、红色汽车图片、灰色卡车图片和灰色汽车图片的\\gls{dataset}上运行两个聚类算法。\n如果每个聚类算法聚两类，那么可能一个算法将汽车和卡车各聚一类，另一个根据红色和灰色各聚一类。\n假设我们还运行了第三个聚类算法，用来决定类别的数目。\n这有可能聚成了四类，红色卡车、红色汽车、灰色卡车和灰色汽车。\n现在这个新的聚类至少抓住了属性的信息，但是丢失了相似性信息。\n红色汽车和灰色汽车在不同的类中，正如红色汽车和灰色卡车也在不同的类中。\n该聚类算法没有告诉我们灰色汽车和红色汽车的相似度比灰色卡车和红色汽车的相似度更高。\n我们只知道它们是不同的。\n\n% -- 146 --\n\n这些问题说明了一些我们可能更偏好于分布式表示（相对于~\\gls{one_hot}~表示而言）的原因。\n分布式表示可以对每个车辆赋予两个属性——一个表示它颜色，一个表示它是汽车还是卡车。\n目前仍然不清楚什么是最优的分布式表示（学习算法如何知道我们关心的两个属性是颜色和是否汽车或卡车，而不是制造商和车龄？），\n但是多个属性减少了算法去猜我们关心哪一个属性的负担，允许我们通过比较很多属性而非测试一个单一属性来细粒度地度量相似性。\n\n\\section{\\glsentrytext{SGD}}\n\\label{sec:stochastic_gradient_descent_chap5}\n几乎所有的\\gls{DL}算法都用到了一个非常重要的算法：\\firstall{SGD}。\n\\gls{SGD}是\\secref{sec:gradient_based_optimization}介绍的\\gls{GD}算法的一个扩展。\n\n\\gls{ML}中反复出现的一个问题是好的泛化需要大的训练集，但大的训练集的计算代价也更大。\n\n% -- 147 --\n\n\\gls{ML}算法中的\\gls{cost_function}通常可以分解成每个\\gls{example:chap5}的\\gls{cost_function}的总和。\n例如，训练数据的负条件对数似然可以写成\n\\begin{equation}\n    J(\\Vtheta) = \\SetE_{\\RVx,\\RSy \\sim \\hat{p}_{\\text{data}}}\n    L(\\Vx, y, \\Vtheta) = \n    \\frac{1}{m} \\sum_{i=1}^m  L(\\Vx^{(i)}, y^{(i)}, \\Vtheta) ,\n\\end{equation}\n其中$L$是每个\\gls{example:chap5}的\\gls{loss}$L(\\Vx, y, \\Vtheta) = -\\log p(y\\mid\\Vx;\\Vtheta)$。\n\n对于这些相加的\\gls{cost_function}，\\gls{GD}需要计算\n\\begin{equation}\n    \\nabla_{\\Vtheta} J(\\Vtheta)\n    = \\frac{1}{m} \\sum_{i=1}^m  \n    \\nabla_{\\Vtheta} L(\\Vx^{(i)}, y^{(i)}, \\Vtheta) .\n\\end{equation}\n这个运算的计算代价是$O(m)$。\n随着训练集规模增长为数十亿的\\gls{example:chap5}，计算一步梯度也会消耗相当长的时间。\n\n\\gls{SGD}的核心是，梯度是期望。\n期望可使用小规模的样本近似估计。\n具体而言，在算法的每一步，我们从训练集中均匀抽出一\\firstgls{minibatch}\\gls{example:chap5} $\\SetB=\\{\\Vx^{(1)},\\dots,\\Vx^{(m')}\\}$。\n\\gls{minibatch}的数目$m'$通常是一个相对较小的数，从一到几百。\n重要的是，当训练集大小$m$增长时，$m'$通常是固定的。\n我们可能在拟合几十亿的\\gls{example:chap5}时，每次更新计算只用到几百个\\gls{example:chap5}。\n\n梯度的估计可以表示成\n\\begin{equation}\n    \\Vg = \\frac{1}{m'} \\nabla_{\\Vtheta} \\sum_{i=1}^{m'}\n    L(\\Vx^{(i)}, y^{(i)}, \\Vtheta).\n\\end{equation}\n使用来自\\gls{minibatch} $\\SetB$的\\gls{example:chap5}。\n然后，\\gls{SGD}算法使用如下的\\gls{GD}估计：\n\\begin{equation}\n    \\Vtheta \\leftarrow \\Vtheta - \\epsilon \\Vg,\n\\end{equation}\n其中，$\\epsilon$是\\gls{learning_rate}。\n\n\\gls{GD}往往被认为很慢或不可靠。\n以前，将\\gls{GD}应用到非凸优化问题被认为很鲁莽或没有原则。\n现在，我们知道\\gls{GD}用于本书第二部分中的训练时效果不错。\n优化算法不一定能保证在合理的时间内达到一个局部最小值，但它通常能及时地找到\\gls{cost_function}一个很小的值，并且是有用的。\n\n% -- 148 --\n\n\\gls{SGD}在\\gls{DL}之外有很多重要的应用。\n它是在大规模数据上训练大型线性模型的主要方法。\n对于固定大小的模型，每一步\\gls{SGD}更新的计算量不取决于训练集的大小$m$。\n在实践中，当训练集大小增长时，我们通常会使用一个更大的模型，但这并非是必须的。\n达到收敛所需的更新次数通常会随训练集规模增大而增加。\n然而，当$m$趋向于无穷大时，该模型最终会在\\gls{SGD}抽样完训练集上的所有\\gls{example:chap5}之前收敛到可能的最优测试误差。\n继续增加$m$不会延长达到模型可能的最优测试误差的时间。\n从这点来看，我们可以认为用\\,\\glssymbol{SGD}\\,训练模型的渐近代价是关于$m$的函数的$O(1)$级别。\n\n在\\gls{DL}兴起之前，学习非线性模型的主要方法是结合\\gls{kernel_trick}的线性模型。\n很多核学习算法需要构建一个$m\\times m$的矩阵$G_{i,j}=k(\\Vx^{(i)}, \\Vx^{(j)})$。\n构建这个矩阵的计算量是$O(m^2)$。\n当\\gls{dataset}是几十亿个\\gls{example:chap5}时，这个计算量是不能接受的。\n在学术界，\\gls{DL}从2006年开始受到关注的原因是，在数以万计\\gls{example:chap5}的中等规模\\gls{dataset}上，\\gls{DL}在新\\gls{example:chap5}上比当时很多热门算法泛化得更好。\n不久后，\\gls{DL}在工业界受到了更多的关注，因为其提供了一种训练大\\gls{dataset}上的非线性模型的可扩展方式。\n\n我们将会在\\chapref{chap:optimization_for_training_deep_models}继续探讨\\gls{SGD}及其很多改进方法。\n\n\\section{构建\\glsentrytext{ML}算法}\n\\label{sec:building_a_machine_learning_algorithm}\n几乎所有的深度学习算法都可以被描述为一个相当简单的配方：特定的\\gls{dataset}、\\gls{cost_function}、优化过程和模型。\n\n例如，\\gls{linear_regression}算法由以下部分组成：$\\MX$和$\\Vy$构成的\\gls{dataset}，\\gls{cost_function}\n\\begin{equation}\n    J(\\Vw, b) = -\\SetE_{\\RVx,\\RSy\\sim\\hat{p}_{\\text{data}}}\n    \\log p_{\\text{model}} (y \\mid \\Vx) ,\n\\end{equation}\n模型是$p_{\\text{model}} (y \\mid \\Vx) = \\mathcal{N}(y; \\Vx^\\Tsp \\Vw + b, 1)$，\n在大多数情况下，优化算法可以定义为求解\\gls{cost_function}梯度为零的\\gls{normal_equations}。\n\n意识到我们可以替换独立于其他组件的大多数组件，因此我们能得到很多不同的算法。\n\n% -- 149 --\n\n通常\\gls{cost_function}至少含有一项使学习过程进行统计估计的成分。\n最常见的\\gls{cost_function}是负对数似然，最小化\\gls{cost_function}导致的\\gls{maximum_likelihood_estimation}。\n\n\\gls{cost_function}也可能含有附加项，如\\gls{regularizer}。\n例如，我们可以将权重衰减加到\\gls{linear_regression}的\\gls{cost_function}中\n\\begin{equation}\n    J(\\Vw, b) = \\lambda \\norm{\\Vw}_2^2 - \\SetE_{\\RVx,\\RSy\\sim \\hat{p}_{\\text{data}}}\n    \\log p_{\\text{model}} (y \\mid \\Vx) .\n\\end{equation}\n该优化仍然有闭解。\n\n如果我们将该模型变成非线性的，那么大多数\\gls{cost_function}不再能通过闭解优化。\n这就要求我们选择一个迭代数值优化过程，如\\gls{GD}等。\n\n组合模型、\\gls{cost}和优化算法来构建学习算法的配方同时适用于\\gls{supervised_learning}和\\gls{unsupervised_learning}。\n\\gls{linear_regression}示例说明了如何适用于\\gls{supervised_learning}的。\n\\gls{unsupervised_learning}时，我们需要定义一个只包含$\\MX$的\\gls{dataset}、一个合适的无监督\\gls{cost}和一个模型。\n例如，通过指定如下\\gls{loss_function}可以得到\\,\\glssymbol{PCA}\\,的第一个主向量\n\\begin{equation}\n    J(\\Vw) = \\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} \\norm{\\Vx - r(\\Vx; \\Vw)}_2^2\n\\end{equation}\n模型定义为重构函数$r(\\Vx) = \\Vw^\\Tsp\\Vx \\,\\Vw$，并且$\\Vw$有范数为$1$的限制。\n\n在某些情况下，由于计算原因，我们不能实际计算\\gls{cost_function}。\n在这种情况下，只要我们有近似其梯度的方法，那么我们仍然可以使用迭代数值优化近似最小化\\gls{target}。\n\n尽管有时候不显然，但大多数学习算法都用到了上述配方。\n如果一个\\gls{ML}算法看上去特别独特或是手动设计的，那么通常需要使用特殊的优化方法进行求解。\n有些模型，如决策树或$k$-均值，需要特殊的优化，因为它们的\\gls{cost_function}有平坦的区域，\n使其不适合通过基于梯度的优化去最小化。\n在我们认识到大部分\\gls{ML}算法可以使用上述配方描述之后，我们可以将不同算法视为出于相同原因解决相关问题的一类方法，而不是一长串各个不同的算法。\n\n% -- 150 --\n\n\\section{促使\\glsentrytext{DL}发展的挑战}\n\\label{sec:challenges_motivating_deep_learning}\n本章描述的简单\\gls{ML}算法在很多不同的重要问题上效果都良好。\n但是它们不能成功解决人工智能中的核心问题，如语音识别或者对象识别。\n\n\\gls{DL}发展动机的一部分原因是传统学习算法在这类人工智能问题上泛化能力不足。\n\n本节介绍为何处理高维数据时在新\\gls{example:chap5}上泛化特别困难，以及为何在传统\\gls{ML}中实现泛化的机制不适合学习高维空间中复杂的函数。\n这些空间经常涉及巨大的计算代价。\n\\gls{DL}旨在克服这些以及其他一些难题。\n\n\\subsection{\\glsentrytext{curse_of_dimensionality}}\n\\label{sec:the_curse_of_dimensionality}\n当数据的维数很高时，很多\\gls{ML}问题变得相当困难。\n这种现象被称为\\firstgls{curse_of_dimensionality}。\n特别值得注意的是，一组变量不同的可能配置数量会随着变量数目的增加而指数级增长。\n\n维数灾难发生在计算机科学的许多地方，在\\gls{ML}中尤其如此。\n\n由\\gls{curse_of_dimensionality}带来的一个挑战是统计挑战。\n如\\figref{fig:chap5_curse}所示，统计挑战产生于$\\Vx$的可能配置数目远大于训练\\gls{example:chap5}的数目。\n为了充分理解这个问题，我们假设输入空间如图所示被分成单元格。\n空间是低维时，我们可以用由大部分数据占据的少量单元格去描述这个空间。\n泛化到新数据点时，通过检测和新输入点在相同单元格中的训练\\gls{example:chap5}，我们可以判断如何处理新数据点。\n例如，如果要估计某点$\\Vx$处的概率密度，我们可以返回$\\Vx$处单位体积单元格内训练\\gls{example:chap5}的数目除以训练\\gls{example:chap5}的总数。\n如果我们希望对一个\\gls{example:chap5}进行分类，我们可以返回相同单元格中训练\\gls{example:chap5}最多的类别。\n如果我们是做回归分析，我们可以平均该单元格中\\gls{example:chap5}对应的\\gls{target}值。\n但是，如果该单元格中没有\\gls{example:chap5}，该怎么办呢？  \n因为在高维空间中参数配置数目远大于\\gls{example:chap5}数目，大部分单元格中没有\\gls{example:chap5}。 \n我们如何能在这些新配置中找到一些有意义的东西呢？\n许多传统\\gls{ML}算法只是简单地假设在一个新点的输出应大致和最接近的训练点的输出相同。\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{ccc}\n    \\includegraphics[width=0.3\\textwidth]{Chapter5/figures/curse_1d_color} & \\includegraphics[width=0.3\\textwidth]{Chapter5/figures/curse_2d_color} & \\includegraphics[width=0.3\\textwidth]{Chapter5/figures/curse_3d_color}\n\\end{tabular}\n\\fi\n\\caption{当数据的相关维度增大时（从左向右），我们感兴趣的配置数目会随之指数级增长。\\emph{(左)}在这个一维的例子中，我们用一个变量来区分所感兴趣的$10$个区域。当每个区域都有足够的样本数时（每个区域对应图中的一个单元格），学习算法能够轻易地\\gls{generalization}得很好。\\gls{generalization}的一个直接方法是估计目标函数在每个区域的值（可能是在相邻区域之间插值）。\\emph{(中)}在二维情况下，对每个变量区分$10$个不同的值更加困难。我们需要追踪$10\\times10=100$个区域，至少需要很多样本来覆盖所有的区域。\\emph{(右)}三维情况下，区域数量增加到了$10^3=1000$，至少需要那么多的样本。对于需要区分的$d$维以及$v$个值来说，我们需要$O(v^d)$个区域和样本。这就是\\gls{curse_of_dimensionality}的一个示例。感谢由Nicolas Chapados提供的图片。}\n\\label{fig:chap5_curse}\n\\end{figure}\n\n% -- 151 --\n\n\\subsection{局部不变性和平滑\\glsentrytext{regularization}}\n\\label{sec:local_constancy_and_smoothness_regularization}\n为了更好地泛化，\\gls{ML}算法需要由先验信念引导应该学习什么类型的函数。\n此前，我们已经看到过由模型参数的概率分布形成的先验。\n通俗地讲，我们也可以说先验信念直接影响\\emph{函数}本身，而仅仅通过它们对函数的影响来间接改变参数。 \n此外，我们还能通俗地说，先验信念还间接地体现在选择一些偏好某类函数的算法，尽管这些偏好并没有通过我们对不同函数置信程度的概率分布表现出来（也许根本没法表现）。\n\n% -- 152 --\n\n其中最广泛使用的隐式``先验''是\\firstgls{smoothness_prior}，或\\firstgls{local_constancy_prior}。\n这个先验表明我们学习的函数不应在小区域内发生很大的变化。\n\n许多简单算法完全依赖于此先验达到良好的泛化，其结果是不能推广去解决\\gls{AI}级别任务中的统计挑战。\n本书中，我们将介绍\\gls{DL}如何引入额外的（显式或隐式的）先验去降低复杂任务中的泛化误差。\n这里，我们解释为什么仅依靠平滑先验不足以应对这类任务。\n\n有许多不同的方法来显式或隐式地表示学习函数应该具有光滑或局部不变的先验。\n所有这些不同的方法都旨在鼓励学习过程能够学习出函数$f^*$，对于大多数设置$\\Vx$和小变动$\\epsilon$，都满足条件\n\\begin{equation}\n    f^*(\\Vx) \\approx f^*(\\Vx + \\epsilon).\n\\end{equation}\n换言之，如果我们知道对应输入$\\Vx$的答案（例如，$\\Vx$是个有\\gls{label}的训练\\gls{example:chap5}），那么该答案对于$\\Vx$的邻域应该也适用。\n如果在有些邻域中我们有几个好答案，那么我们可以组合它们（通过某种形式的平均或插值法）以产生一个尽可能和大多数输入一致的答案。\n\n局部不变方法的一个极端例子是$k$-最近邻系列的学习算法。\n当一个区域里的所有点$\\Vx$在训练集中的$k$个最近邻是一样的，那么对这些点的预测也是一样的。\n当$k=1$时，不同区域的数目不会比训练\\gls{example:chap5}还多。\n\n$k$-最近邻算法只是复制了附近训练\\gls{example:chap5}的输出，而大部分核机器会在和附近训练\\gls{example:chap5}相关的训练集输出上插值。\n一类重要的核函数是\\firstgls{local_kernel}，其核函数$k(\\Vu,\\Vv)$在$\\Vu=\\Vv$时很大，\n当$\\Vu$和$\\Vv$距离拉大时而减小。\n局部核可以看作是执行模版匹配的相似函数，用于度量测试\\gls{example:chap5} $\\Vx$和每个训练\\gls{example:chap5} $\\Vx^{(i)}$有多么相似。\n近年来深度学习的很多推动力源自研究局部模版匹配的局限性，以及\\gls{DL}如何克服这些局限性\\citep{Bengio-localfailure-NIPS-2006-small}。\n\n决策树也有平滑学习的局限性，因为它将输入空间分成和叶节点一样多的区间，并在每个区间使用单独的参数（或者有些决策树的拓展有多个参数）。\n如果\\gls{target}函数需要至少拥有$n$个叶节点的树才能精确表示，那么至少需要$n$个训练\\gls{example:chap5}去拟合。\n需要几倍于$n$的\\gls{example:chap5}去达到预测输出上的某种统计置信度。\n\n% -- 153 --\n\n总的来说，区分输入空间中$O(k)$个区间，所有的这些方法需要$O(k)$个\\gls{example:chap5}。\n通常会有$O(k)$个参数，$O(1)$参数对应于$O(k)$区间之一。\n最近邻算法中，每个训练\\gls{example:chap5}至多用于定义一个区间，如\\figref{fig:chap5_non_distributed}所示。\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/non_distributed}}\n\\fi\n\\caption{\\gls{nearest_neighbor}算法如何划分输入空间的示例。每个区域内的一个样本（这里用圆圈表示）定义了区域边界（这里用线表示）。每个样本相关的$y$值定义了对应区域内所有数据点的输出。由\\gls{nearest_neighbor}定义并且匹配几何模式的区域被称为Voronoi图。这些连续区域的数量不会比训练样本的数量增加得更快。尽管此图具体说明了\\gls{nearest_neighbor}算法的效果，其他的单纯依赖局部光滑先验的机器学习算法也表现出了类似的\\gls{generalization}能力：每个训练样本仅仅能告诉学习者如何在其周围的相邻区域\\gls{generalization}。}\n\\label{fig:chap5_non_distributed}\n\\end{figure}\n\n\n有没有什么方法能表示区间数目比训练\\gls{example:chap5}数目还多的复杂函数？\n显然，只是假设函数的平滑性不能做到这点。\n例如，想象\\gls{target}函数作用在西洋跳棋盘上。\n棋盘包含许多变化，但只有一个简单的结构。\n想象一下，如果训练\\gls{example:chap5}数目远小于棋盘上的黑白方块数目，那么会发生什么。\n基于局部泛化和平滑性或局部不变性先验，如果新点和某个训练\\gls{example:chap5}位于相同的棋盘方块中，那么我们能够保证正确地预测新点的颜色。\n但如果新点所在的方块没有训练\\gls{example:chap5}，\\gls{learner}不一定能举一反三。\n如果仅依靠这个先验，一个\\gls{example:chap5}只能告诉我们它所在的方块的颜色。\n获得整个棋盘颜色的唯一方法是其上的每个方块至少要有一个\\gls{example:chap5}。\n\n% -- 154 --\n\n只要在要学习的真实函数的峰值和谷值处有足够多的\\gls{example:chap5}，那么平滑性假设和相关的无参数学习算法的效果都非常好。\n当要学习的函数足够平滑，并且只在少数几维变化，这样做一般没问题。\n在高维空间中，即使是非常平滑的函数，也会在不同维度上有不同的变化方式。\n如果函数在不同的区间中表现不一样，那么就非常难用一组训练\\gls{example:chap5}去刻画函数。\n如果函数是复杂的（我们想区分多于训练\\gls{example:chap5}数目的大量区间），有希望很好地泛化么？\n\n这些问题，即是否可以有效地表示复杂的函数以及所估计的函数是否可以很好地泛化到新的输入，答案是有。\n关键观点是，只要我们通过额外假设生成数据的分布来建立区域间的依赖关系，那么$O(k)$个\\gls{example:chap5}足以描述多如$O(2^k)$的大量区间。\n通过这种方式，我们确实能做到非局部的泛化\\citep{Bengio+Monperrus-2005,Bengio-Larochelle-NLMP-NIPS-2006-short}。\n为了利用这些优势，许多不同的\\gls{DL}算法都提出了一些适用于多种\\,\\glssymbol{AI}\\,任务的隐式或显式的假设。\n\n\n一些其他的\\gls{ML}方法往往会提出更强的，针对特定问题的假设。\n例如，假设\\gls{target}函数是周期性的，我们很容易解决棋盘问题。\n通常，神经网络不会包含这些很强的（针对特定任务的）假设，因此神经网络可以泛化到更广泛的各种结构中。\n人工智能任务的结构非常复杂，很难限制到简单的、人工手动指定的性质，如周期性，因此我们希望学习算法具有更通用的假设。\n\\gls{DL}的核心思想是假设数据由\\emph{因素或特征组合}产生，这些因素或特征可能来自一个层次结构的多个层级。\n许多其他类似的通用假设进一步提高了\\gls{DL}算法。\n这些很温和的假设允许了\\gls{example:chap5}数目和可区分区间数目之间的指数增益。\n这类指数增益将在\\secref{sec:universal_approximation_properties_and_depth}、\\secref{sec:distributed_representation}和\\secref{sec:exponential_gains_from_depth}中更详尽地介绍。\n深度的\\gls{distributed_representation}带来的指数增益有效地解决了\\gls{curse_of_dimensionality}带来的挑战。\n\n% -- 155 --\n\n\\subsection{\\glsentrytext{manifold_learning}}\n\\label{sec:manifold_learning}\n\\gls{manifold}是一个\\gls{ML}中很多想法内在的重要概念。\n\n\\firstgls{manifold}指连接在一起的区域。\n数学上，它是指一组点，且每个点都有其邻域。\n给定一个任意的点，其流形局部看起来像是欧几里得空间。\n日常生活中，我们将地球视为二维平面，但实际上它是三维空间中的球状\\gls{manifold}。\n\n每个点周围邻域的定义暗示着存在变换能够从一个位置移动到其邻域位置。\n例如在地球表面这个流形中，我们可以朝东南西北走。\n\n尽管术语``\\gls{manifold}''有正式的数学定义，但是\\gls{ML}倾向于更松散地定义一组点，只需要考虑少数嵌入在高维空间中的自由度或维数就能很好地近似。\n每一维都对应着局部的变化方向。\n如\\figref{fig:chap5_one_dim_manifold_and_data}所示，训练数据位于二维空间中的一维流形中。\n在\\gls{ML}中，我们允许流形的维数从一个点到另一个点有所变化。\n这经常发生于流形和自身相交的情况中。\n例如，数字``8''形状的流形在大多数位置只有一维，但在中心的相交处有两维。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/one_dim_manifold_and_data_color}}\n\\fi\n\\caption{从一个二维空间的分布中抽取的数据样本，这些样本实际上聚集在一维\\gls{manifold}附近，像一个缠绕的带子。实线代表学习器应该推断的隐式\\gls{manifold}。}\n\\label{fig:chap5_one_dim_manifold_and_data}\n\\end{figure}\n\n如果我们希望\\gls{ML}算法学习整个$\\SetR^n$上有趣变化的函数，那么很多\\gls{ML}问题看上去都是无望的。\n\\firstgls{manifold_learning}算法通过一个假设来克服这个障碍，该假设认为$\\SetR^n$中大部分区域都是无效的输入，有意义的输入只分布在包含少量数据点的子集构成的一组流形中，而学习函数的输出中，有意义的变化都沿着流形的方向或仅发生在我们切换到另一流形时。\n流形学习最初用于连续数值和无监督学习的环境，尽管这个概率集中的想法也能够泛化到离散数据和\\gls{supervised_learning}的设定下：关键假设仍然是概率质量高度集中。\n\n\n% -- 156 --\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.7\\textwidth]{Chapter5/figures/noise}}\n\\fi\n\\caption{随机地均匀抽取图像（根据均匀分布随机地选择每一个像素）会得到噪声图像。\n尽管在人工智能应用中以这种方式生成一个脸或者其他物体的图像是非零概率的，但是实际上我们从来没有观察到这种现象。\n这也意味着人工智能应用中遇到的图像在所有图像空间中的占比可以是忽略不计的。}\n\\label{fig:chap5_noise}\n\\end{figure}\n\n\n数据位于低维流形的假设并不总是对的或者有用的。\n我们认为在人工智能的一些场景中，如涉及到处理图像、声音或者文本时，流形假设至少是近似对的。\n这个假设的支持证据包含两类观察结果。\n\n第一个支持\\firstgls{manifold_hypothesis}的观察是现实生活中的图像、文本、声音的概率分布都是高度集中的。\n均匀的\\gls{noise}从来不会与这类领域的结构化输入类似。\n\\figref{fig:chap5_noise}显示均匀采样的点看上去像是没有信号时模拟电视上的静态模式。\n同样，如果我们均匀地随机抽取字母来生成文件，能有多大的概率得到一个有意义的英语文档？\n几乎是零。\n因为大部分字母长序列不对应着自然语言序列：\n自然语言序列的分布只占了字母序列的总空间里非常小的一部分。\n\n\n当然，集中的概率分布不足以说明数据位于一个相当小的流形中。\n我们还必须确保，我们遇到的\\gls{example:chap5}和其他\\gls{example:chap5}相互连接，每个\\gls{example:chap5}被其他高度相似的\\gls{example:chap5}包围，而这些高度相似的样本可以通过变换来遍历该流形得到。\n支持流形假设的第二个论点是，我们至少能够非正式地想象这些邻域和变换。\n在图像中，我们当然会认为有很多可能的变换仍然允许我们描绘出图片空间的流形：\n我们可以逐渐变暗或变亮光泽、逐步移动或旋转图中对象、逐渐改变对象表面的颜色等等。\n在大多数应用中很有可能会涉及到多个流形。\n例如，人脸图像的\\gls{manifold}不太可能连接到猫脸图像的\\gls{manifold}。\n\n% -- 157 --\n\n这些支持流形假设的思维实验传递了一些支持它的直观理由。\n更严格的实验\\citep{Cayton-2005,Narayanan+Mitter-NIPS2010,Scholkopf98-book,Roweis2000-lle-small,Tenenbaum2000-isomap,Brand2003,Belkin+Niyogi-nips2003,Donoho+Carrie-03,Weinberger04a}在\\gls{AI}中备受关注的一大类\\gls{dataset}上支持了这个假设。\n\n当数据位于低维流形中时，使用流形中的坐标而非$\\SetR^n$中的坐标表示\\gls{ML}数据更为自然。\n日常生活中，我们可以认为道路是嵌入在三维空间的一维流形。\n我们用一维道路中的地址号码确定地址，而非三维空间中的坐标。\n提取这些流形中的坐标是非常具有挑战性的，但是很有希望改进许多\\gls{ML}算法。\n这个一般性原则能够用在很多情况中。\n\\figref{fig:chap5_QMUL-facedataset}展示了包含人脸的\\gls{dataset}的流形结构。\n在本书的最后，我们会介绍一些学习这样的流形结构的必备方法。\n在\\figref{fig:chap20_kingma-vae-2d-faces-manifold}中，我们将看到\\gls{ML}算法如何成功完成这个\\gls{target}。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter5/figures/QMUL-facedataset}}\n\\fi\n\\caption{QMUL Multiview Face数据集中的训练样本\\citep{Gong-et-al-2000}，其中的物体是移动的从而覆盖对应两个旋转角度的二维\\gls{manifold}。\n我们希望学习算法能够发现并且理出这些\\gls{manifold}坐标。\n\\figref{fig:chap20_kingma-vae-2d-faces-manifold}提供了这样一个示例。}\n\\label{fig:chap5_QMUL-facedataset}\n\\end{figure}\n\n第一部分介绍了数学和\\gls{ML}中的基本概念，这将用于本书其他章节中。\n至此，我们已经做好了研究\\gls{DL}的准备。\n\n% -- 159 --\n\n\n"
  },
  {
    "path": "Chapter6/README.md",
    "content": "#第六章笔记\n"
  },
  {
    "path": "Chapter6/annotations.txt",
    "content": "{'user': 'acct:zplin@hypothes.is', 'text': '保证全局收敛', 'origin_text': '型的线性方程求解器，或者用于训练逻辑回归或SVM的凸优化算法那样  !!!具有全局的收敛保证!!!  。凸优化从任何一种初始参数出发都会收敛（理论上如此——在实践中', 'time': '2017-01-14T15:18'}\n{'user': 'acct:zplin@hypothes.is', 'text': '可靠？', 'origin_text': '凸优化从任何一种初始参数出发都会收敛（理论上如此——在实践中也很  !!!鲁棒!!!  但可能会遇到数值问题）。用于非凸损失函数的随机梯度下降没有这种', 'time': '2017-01-14T15:19'}\n{'user': 'acct:zplin@hypothes.is', 'text': '线性输出层很难满足这种限制', 'origin_text': '然而，对于所有输入，协方差矩阵都必须被限制成一个正定的矩阵。  !!!用线性输出层来满足这种限制是困难的!!!  ，所以通常使用其他的输出单元来对协方差参数化。对协方差建模的方', 'time': '2017-01-14T23:11'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '往往成效不佳', 'origin_text': '。不幸的是，均方误差和平均绝对误差在使用基于梯度的优化方法时  !!!往往会导致糟糕的结果!!!  。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。', 'time': '2017-01-16T12:36'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '可惜的', 'origin_text': '我们要优化的函数族里。这个代价函数通常被称为平均绝对误差。  !!!不幸的!!!  是，均方误差和平均绝对误差在使用基于梯度的优化方法时往往会导致糟', 'time': '2017-01-16T12:41'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '由于', 'origin_text': '元来对协方差参数化。对协方差建模的方法在\\\\?节中简要介绍。  !!!因为!!!  线性模型不会饱和，所以它们对基于梯度的优化算法没有任何困难并且可', 'time': '2017-01-16T12:43'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '不具有饱和性', 'origin_text': '参数化。对协方差建模的方法在\\\\?节中简要介绍。因为线性模型  !!!不会饱和!!!  ，所以它们对基于梯度的优化算法没有任何困难并且可以被用在相当广泛', 'time': '2017-01-16T12:44'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '因此易于采用基于梯度的优化算法，甚至可以使用其他多种优化算法。', 'origin_text': '对协方差建模的方法在\\\\?节中简要介绍。因为线性模型不会饱和，  !!!所以它们对基于梯度的优化算法没有任何困难并且可以被用在相当广泛的优化算法中!!!  。\\\\subsubsection{用于Bernoulli输出分', 'time': '2017-01-16T12:56'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '各种可用于输出的神经网络单元', 'origin_text': '型分布间的交叉熵。选择怎样表示输出决定了交叉熵函数的形式。  !!!任何种类的可以被用作输出的神经网络单元!!!  ，也可以被用作隐藏单元。这里，我们关注把这些单元用作模型的输出', 'time': '2017-01-16T13:00'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '我们着重讨论将这些单元用作模型输出时的情况', 'origin_text': '类的可以被用作输出的神经网络单元，也可以被用作隐藏单元。这里，  !!!我们关注把这些单元用作模型的输出!!!  ，但是原则上它们也可以在内部使用。我们将在\\\\?节中重温这些单元', 'time': '2017-01-16T13:05'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '不过', 'origin_text': '也可以被用作隐藏单元。这里，我们关注把这些单元用作模型的输出，  !!!但是!!!  原则上它们也可以在内部使用。我们将在\\\\?节中重温这些单元并且给', 'time': '2017-01-16T13:07'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '具有', 'origin_text': '单元}一种简单的输出单元是基于仿射变换的输出单元，仿射变换不  !!!带有!!!  非线性。这些单元往往被直接称为线性单元。给定特征\\\\bmh\\\\', 'time': '2017-01-16T13:17'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '最大似然框架也使得学习高斯分布的协方差矩阵更加容易(短语“makes it straightforward to”意思是：使得......更容易)', 'origin_text': 'equation}最大化对数似然此时等价于最小化均方误差。  !!!最大化似然的框架使它也可以很直观的来学习高斯分布的协方差矩阵!!!  ，或者使得高斯分布的协方差是输入的函数。然而，对于所有输入，协', 'time': '2017-01-16T13:54'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '或更容易地使高斯分布的协方差矩阵作为输入的函数（ 我认为“or to”中的“to”连接的是上句的“makes it straightforward to”中的“to”）', 'origin_text': '最大化似然的框架使它也可以很直观的来学习高斯分布的协方差矩阵，  !!!或者使得高斯分布的协方差是输入的函数!!!  。然而，对于所有输入，协方差矩阵都必须被限制成一个正定的矩阵。', 'time': '2017-01-16T13:54'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '限定', 'origin_text': '布的协方差是输入的函数。然而，对于所有输入，协方差矩阵都必须被  !!!限制!!!  成一个正定的矩阵。用线性输出层来满足这种限制是困难的，所以通常', 'time': '2017-01-16T14:02'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '正定矩阵', 'origin_text': '是输入的函数。然而，对于所有输入，协方差矩阵都必须被限制成一个  !!!正定的矩阵!!!  。用线性输出层来满足这种限制是困难的，所以通常使用其他的输出单', 'time': '2017-01-16T14:02'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '线性输出层难以满足这种约束', 'origin_text': '然而，对于所有输入，协方差矩阵都必须被限制成一个正定的矩阵。  !!!用线性输出层来满足这种限制是困难的!!!  ，所以通常使用其他的输出单元来对协方差参数化。对协方差建模的方', 'time': '2017-01-16T14:05'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '而后，最大化对数似然等价于最小化均方误差。', 'origin_text': 'm{y}}, \\\\bm{I} ).\\\\end{equation}  !!!最大化对数似然此时等价于最小化均方误差。!!!  最大化似然的框架使它也可以很直观的来学习高斯分布的协方差矩阵', 'time': '2017-01-16T14:16'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '计算', 'origin_text': '^\\\\top \\\\bm{h}+\\\\bm{b}。线性输出层经常被用来  !!!产生!!!  条件高斯分布的均值：p(\\\\bmy∣\\\\bmx)=N(\\\\bmy;\\\\', 'time': '2017-01-16T14:17'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '为满足该约束条件', 'origin_text': '效的概率，它必须处在区间[0,1][0,1][0, 1]中。  !!!满足这个限制!!!  需要一些细致的设计工作。假设我们打算使用线性单元，并且通过阈值', 'time': '2017-01-16T14:22'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '无法', 'origin_text': '{equation}这的确定义了一个有效的条件概率分布，但我们  !!!并不能!!!  使用梯度下降来高效地训练它。任何时候当\\\\bmw⊤\\\\bmh+b\\\\', 'time': '2017-01-16T14:26'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '改善', 'origin_text': '\\\\bm0\\\\bm0\\\\bm{0}通常是有问题的，因为学习算法对于如何  !!!提高!!!  相应的参数没有了指导。与之相对的，最好是使用一种不同的方', 'time': '2017-01-16T14:34'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '不再具有指导意义', 'origin_text': '0\\\\bm{0}通常是有问题的，因为学习算法对于如何提高相应的参数  !!!没有了指导!!!  。与之相对的，最好是使用一种不同的方法来保证无论何时模型', 'time': '2017-01-16T14:35'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '最好使用一种新的方法，', 'origin_text': '为学习算法对于如何提高相应的参数没有了指导。与之相对的，  !!!最好是使用一种不同的方法来!!!  保证无论何时模型给出了错误的答案时总能有一个很强的梯度。这种方', 'time': '2017-01-16T14:42'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '较大的', 'origin_text': '使用一种不同的方法来保证无论何时模型给出了错误的答案时总能有一个  !!!很强的!!!  梯度。这种方法是基于使用sigmoid输出单元结合最大似然来实', 'time': '2017-01-16T14:43'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '其', 'origin_text': '{w}^\\\\top \\\\bm{h}+b处于单位区间外时，模型的输出对  !!!它的!!!  参数的梯度都将为\\\\bm0\\\\bm0\\\\bm{0}。梯度为\\\\bm0\\\\', 'time': '2017-01-17T00:53'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '“任何时候”可删掉不翻译', 'origin_text': '一个有效的条件概率分布，但我们并不能使用梯度下降来高效地训练它。  !!!任何时候!!!  当\\\\bmw⊤\\\\bmh+b\\\\bmw⊤\\\\bmh+b\\\\bm{w}^\\\\t', 'time': '2017-01-17T00:58'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '相反', 'origin_text': '有问题的，因为学习算法对于如何提高相应的参数没有了指导。  !!!与之相对的!!!  ，最好是使用一种不同的方法来保证无论何时模型给出了错误的答案时总', 'time': '2017-01-17T01:00'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '该分布', 'origin_text': '率。我们然后对它归一化，可以发现这服从Bernoulli分布，  !!!它!!!  受zzz的sigmoid变换控制：logP~(y)=yz,P~', 'time': '2017-01-17T01:10'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '因此', 'origin_text': '小以至于不能用来学习，无论此时模型给出的是正确还是错误的答案。  !!!因为这个原因!!!  ，最大似然几乎总是训练sigmoid输出单元的优选方法。理论', 'time': '2017-01-17T01:53'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '与原文不符', 'origin_text': '。在学习算法中，我们最常需要的梯度是成本函数关于参数的梯度，即  !!!∇\\\\bmθJ(\\\\bmθ)∇\\\\bmθJ(\\\\bmθ)!!!  \\\\nabla_{\\\\bm{\\\\theta}J(\\\\bm{\\\\theta}', 'time': '2017-01-17T02:58'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '函数的另外一组(原句有歧义)', 'origin_text': '是一组变量，我们需要它们的导数，而\\\\bmy\\\\bmy\\\\bm{y}是  !!!另外一组函数的!!!  输入变量，但我们并不需要它们的导数。在学习算法中，我们最常需要', 'time': '2017-01-17T03:13'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '需要（此处翻译成“需要”更恰当，“http://cn.bing.com/dict/search?q=involve&go=%E6%90%9C%E7%B4%A2&qs=n&form=Z9LH5&sp=-1&pq=involve&sc=8-7&sk=&cvid=4BF5A24B685849339E113D5129D5EEBE”）', 'origin_text': '\\\\theta}J(\\\\bm{\\\\theta})}。许多机器学习任务  !!!涉及!!!  计算其他导数，作为学习过程的一部分，或者用来分析学习的模型。反', 'time': '2017-01-17T03:17'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '，以（增加连词“以”，更通顺）', 'origin_text': '(\\\\bm{\\\\theta})}。许多机器学习任务涉及计算其他导数  !!!，!!!  作为学习过程的一部分，或者用来分析学习的模型。反向传播算法也适', 'time': '2017-01-17T04:05'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '学习到的', 'origin_text': '机器学习任务涉及计算其他导数，作为学习过程的一部分，或者用来分析  !!!学习的!!!  模型。反向传播算法也适用于这些任务，并且不限于计算成本函数关于', 'time': '2017-01-17T04:10'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '局限', 'origin_text': '，或者用来分析学习的模型。反向传播算法也适用于这些任务，并且不  !!!限!!!  于计算成本函数关于参数的梯度。通过网络传播信息来计算导数的想法', 'time': '2017-01-17T04:11'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '通过在网络中传播信息来计算导数的观点非常普遍', 'origin_text': '播算法也适用于这些任务，并且不限于计算成本函数关于参数的梯度。  !!!通过网络传播信息来计算导数的想法是非常通用的!!!  ，并且可以用于计算诸如具有多个输出的函数fff的Jacobi矩阵', 'time': '2017-01-17T04:23'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '还需引入操作（operation）这一概念', 'origin_text': '矩阵、张量、或者甚至是另一类型的变量。为了形式化我们的图形，  !!!我们还需要引入操作!!!  。操作是一个或多个变量的简单函数。我们的图形语言伴随着一组被', 'time': '2017-01-17T04:49'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '是指具有', 'origin_text': '类型的变量。为了形式化我们的图形，我们还需要引入操作。操作  !!!是!!!  一个或多个变量的简单函数。我们的图形语言伴随着一组被允许的操作', 'time': '2017-01-17T04:52'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '一系列', 'origin_text': '入操作。操作是一个或多个变量的简单函数。我们的图形语言伴随着  !!!一组!!!  被允许的操作。可以通过将多个操作组合在一起来描述比该组中的操作', 'time': '2017-01-17T04:54'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '同时组合多个操作来', 'origin_text': '量的简单函数。我们的图形语言伴随着一组被允许的操作。可以通过  !!!将多个操作组合在一起来!!!  描述比该组中的操作更复杂的函数。不失一般性，我们定义一个', 'time': '2017-01-17T04:58'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '多项', 'origin_text': '操作仅返回单个输出变量。这并没有失去一般性，因为输出变量可以有  !!!多个条目!!!  ，例如向量。反向传播的软件实现通常支持具有多个输出的操作，但是', 'time': '2017-01-17T05:00'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '惩罚项', 'origin_text': '多个操作。这个权重不仅用于预测$\\\\hat{y}$，也用于权重衰减  !!!罚项!!!  $\\\\lambda\\xa0\\\\sum_i\\xa0w_i^2$。}\\\\end{fig', 'time': '2017-01-17T05:13'}\n{'user': 'acct:David_Chow@hypothes.is', 'text': '通过梯度∇\\\\bmyz∇\\\\bmyz\\\\nabla_{\\\\bm{y}} z与Jacobi矩阵∂\\\\bmy∂\\\\bmx∂\\\\bmy∂\\\\bmx\\\\frac{\\\\partial \\\\bm{y}}{\\\\partial \\\\bm{x}}相乘获得', 'origin_text': '阵。从这里我们看到变量\\\\bmx\\\\bmx\\\\bm{x}的梯度可以  !!!通过将Jacobi矩阵∂\\\\bmy∂\\\\bmx∂\\\\bmy∂\\\\bmx\\\\frac{\\\\partial \\\\bm{y}}{\\\\partial \\\\bm{x}}是ggg的n×mn×mn\\\\times m乘以梯度∇\\\\bmyz∇\\\\bmyz\\\\nabla_{\\\\bm{y}} z来得到!!!  。反向传播算法由图中每一个这样的Jacobi梯度的乘积操作所组', 'time': '2017-01-17T05:21'}\n{'user': 'acct:zplin@hypothes.is', 'text': '前馈网络是通往循环网络之路的概念基石', 'origin_text': '于对照片中的对象进行识别的卷积神经网络就是一种专门的前馈网络。  !!!前馈网络是向循环网络前进中的概念奠基石!!!  ，后者在自然语言的许多应用中发挥着巨大作用。前馈神经网络被称', 'time': '2017-01-27T19:21'}\n{'user': 'acct:zplin@hypothes.is', 'text': '含有噪声的近似实例，即f*(x)在不同点上的值', 'origin_text': 'm{x})去匹配$f^(\\\\bm{x})的值。训练数据为我们提供了  !!!在不同训练点上取值的、含有噪声的的值。训练数据为我们提供了在不同训练点上取值的、含有噪声的的值。训练数据为我们提供了在不同训练点上取值的、含有噪声的f^(\\\\bm{x})的近似实例!!!  。每个样例的近似实例。每个样例的近似实例。每个样例\\\\bm{x}', 'time': '2017-01-28T06:33'}\n{'user': 'acct:zplin@hypothes.is', 'text': '同样', 'origin_text': '\\\\phi(\\\\bm{x})上，这里ϕϕ\\\\phi是一个非线性变换。  !!!等价地!!!  ，我们可以使用\\\\?节中描述的核技巧，来得到一个基于隐含地使用ϕϕ', 'time': '2017-01-29T06:18'}\n{'user': 'acct:zplin@hypothes.is', 'text': '领域之间可借鉴之处微乎其微\\n\\ntransfer应该是指knowledge transfer', 'origin_text': '们数十年的努力，其中包括不同领域的（如语音识别或计算机视觉）专家  !!!以及不同领域间微小的迁移(transfer)。%此处难道是没有迁移吗？!!!          深度学习的策略是去学习ϕϕ\\\\phi。在这', 'time': '2017-01-29T06:45'}\n{'user': 'acct:zplin@hypothes.is', 'text': '从业人员各自善长特定的领域（如语音识别或计算机视觉）', 'origin_text': '主流的方法。这种方法对于每个单独的任务都需要人们数十年的努力，  !!!其中包括不同领域的（如语音识别或计算机视觉）专家!!!  以及不同领域间微小的迁移(transfer)。%此处难道是没有迁', 'time': '2017-01-29T06:39'}\n{'user': 'acct:zplin@hypothes.is', 'text': '如果我们想要的话', 'origin_text': 'bmθ\\\\bmθ\\\\bm{\\\\theta}，使它能够得到一个好的表示。  !!!如果我们希望!!!  ，这种方法也可以通过使它变得高度通用以获得第一种方法的优点——我', 'time': '2017-01-29T20:37'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '翻译成“自然语言处理”是否好些', 'origin_text': '专门的前馈网络。前馈网络是向循环网络前进中的概念奠基石，后者在  !!!自然语言!!!  的许多应用中发挥着巨大作用。前馈神经网络被称作网络是因为它们', 'time': '2017-03-11T14:18'}\n{'user': 'acct:caszhang@hypothes.is', 'text': 'neuroscience应该叫观察好些吧，天文叫观测。。', 'origin_text': ')f^{(i)}(\\\\bm{x})的选择，也或多或少地受到神经科学  !!!观测!!!  的指引，这些观测是关于生物神经元计算功能的。然而，现代的神经网', 'time': '2017-03-11T14:21'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '通过闭式', 'origin_text': '。线性模型，例如逻辑回归和线性回归，是非常吸引人的，因为无论是  !!!封闭形式!!!  还是使用凸优化，它们都能高效而可靠地拟合。线性模型也有明显的缺', 'time': '2017-03-11T14:24'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '函数一般叫“光滑”', 'origin_text': '但是对于测试集的泛化往往不佳。非常通用的特征映射通常只基于局部  !!!平滑!!!  的原则，并没有将足够的先验信息进行编码来解决高级问题。   ', 'time': '2017-03-11T14:28'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '包含的先验信息不足', 'origin_text': '集的泛化往往不佳。非常通用的特征映射通常只基于局部平滑的原则，  !!!并没有将足够的先验信息进行编码!!!  来解决高级问题。        另一种选择是手动地设计ϕϕ', 'time': '2017-03-11T14:29'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '语音识别和计算机视觉等不同领域的从业者需要专门进行研究，而领域之间的迁移很少', 'origin_text': '主流的方法。这种方法对于每个单独的任务都需要人们数十年的努力，  !!!其中包括不同领域的（如语音识别或计算机视觉）专家以及不同领域间微小的迁移(transfer)。%此处难道是没有迁移吗!!!  ？        深度学习的策略是去学习ϕϕ\\\\phi。在', 'time': '2017-03-11T14:30'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '一个可以完整工作的前馈网络', 'origin_text': '实例：学习XOR为了使前馈网络的想法更加具体，我们首先从  !!!前馈网络充分发挥作用的一个简单例子!!!  说起：学习XOR函数。XOR函数（”异或”逻辑）是两个二进制', 'time': '2017-03-11T14:34'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '评估整个训练集上表现的', 'origin_text': '是一个合适的损失函数。更加合适的方法将在\\\\?节中讨论。  !!!为了对在整个训练集上的表现进行评估，!!!  MSE损失函数为J(\\\\bmθ)=14∑\\\\bmx∈X(f∗(\\\\b', 'time': '2017-03-11T14:36'}\n{'user': 'acct:caszhang@hypothes.is', 'text': '闭式', 'origin_text': '\\\\bmθ)J(\\\\bmθ)J(\\\\bm{\\\\theta})，来得到一个  !!!封闭形式!!!  的解。解正规方程以后，我们得到\\\\bmw=0\\\\bmw=0\\\\bm', 'time': '2017-03-11T14:37'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:caszhang@hypothes.is', 'text': '另一种等价的做法是，...', 'time': '2017-03-11T14:26'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '首先，训练数据确实**是**(x,y)，那我们说训练数据**提供**了y，没毛病吧...\\n\\n其次，(x,y)不好描述，而且作者在这里也没有提到x，只说训练点，即使按照你的说法\\n> 训练数据提供的是函数对应各种输入(x)的取值(y)的近似例子\\n\\n你觉得大家会认为这是y的近似例子还是(x,y)的例子呢？...\\n\\n这个问题先到这吧，我们只能说作者表达的不好，但原文本身和我的翻译应该是对应的...', 'time': '2017-03-05T02:48'}\n{'user': 'acct:zplin@hypothes.is', 'text': '我的意思是，这些实例是f(x)有噪声的取值。就是说，我们不知道f这个函数到底是什么，但我们知道一些例子(example)，这些例子告诉我们y1*~f(x1)，y2*~f(x2)……这些(x1, y1), (x2, y2)都是近似的例子。之所以说近例，是因为y1*并不一定等于真正的y1。所以训练数据提供的是函数对应各种输入(x)的取值(y)的近似例子，并不是函数本身的实例。\\n主要争论点不在近似，而是在这个example是函数本身还是它的输入输出\\n不用客气，得有这样的反复讨论才能把事情做好。', 'time': '2017-03-04T22:28'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '额...这些实例并**不**直接是`$f^*(x)$`在不同`$x$`处的取值啊...\\n\\n先从语法分析吧：noisy approximate examples of `$f^*(x)$`是说含有噪声的`$f^*(x)$`的近似实例；而后面的evaluated at different training points用来修饰`$f^*(x)$`的。\\n\\n再结合上下文吧。咱们看后面一句，\\n> Each example is accompanied by a label `$y \\n\\\\approx f^*(x)$`.\\n\\n我们知道label是包含在训练数据里面的，如果前面一句说训练数据提供了`$f^*(x)$`的实例，那么`$y$`应该和`f^*(x)`相等才对，而不是现在的近似关系。\\n\\n最后，从汉语的角度，近似实例，近似什么呢？\\n\\n非常感谢你认真的校对~', 'time': '2017-03-04T17:56'}\n{'user': 'acct:zplin@hypothes.is', 'text': '那些实例其实都是f(x)对不同x取的值，所以才说是f(x) evaluated at different training points。那些example不是f(x)这个函数的实例，而是它怎么把一些x转化成y的实例', 'time': '2017-03-04T16:31'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是\\n>entry\\n\\n如果翻译成“多项”，会不会让人产生多项式的感觉...就是几项相加。“条目”这个翻译确实也不好...', 'time': '2017-03-04T09:28'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是\\n> a set of\\n\\n如果翻译成一系列，感觉更像是a series of...', 'time': '2017-03-04T09:19'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里我更倾向于直接翻译成“是指”，因为如果翻译成“操作是指具有一个或多个变量的简单函数”，读起来怪怪的...', 'time': '2017-03-04T09:17'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这个我改成“学得”了。', 'time': '2017-03-04T09:01'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里是显示问题...在pdf中显示是正确的，转换时出了点问题。正常的就是`$\\\\nabla_\\\\theta J(\\\\theta)$`', 'time': '2017-03-04T08:55'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '嗯嗯，你是对的~这里翻译确实会产生歧义...', 'time': '2017-03-04T08:45'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是\\n> produce\\n\\n这里严格来说用“计算”也可以，但我更倾向于“产生”，因为这里的上下文是指我们已经假定输出的分布符合条件高斯分布，我们**设计**神经网络的输出层来表示这个分布的均值。', 'time': '2017-03-04T06:58'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是\\n>robust\\n\\n文献中一般翻译成鲁棒，也有翻译成稳健的，但我们还是按照一般的说法来翻译吧。', 'time': '2017-03-04T06:41'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '原文是这样的\\n>The training data provides us with noisy, approximate examples of `$f^*(x)$` evaluated at different training points. \\n\\n我的理解是：`$f^*(x)$`是data generator函数，是我们想要近似的函数，但是data generator在生成数据后因为观测等原因，我们得到的是含有噪声的数据（真实数据）。所以这里是含有噪声的`$f^*(x)$`的近似实例', 'time': '2017-03-04T06:12'}"
  },
  {
    "path": "Chapter6/deep_feedforward_networks.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Kai Li\n\\chapter{\\glsentrytext{deep_feedforward_network}}\n\\label{chap:deep_feedforward_networks}\n\n\\firstgls{deep_feedforward_network}，也叫作\\firstgls{feedforward_neural_network}或者\\firstall{MLP}，是典型的深度学习模型。\\gls{feedforward_network}的目标是近似某个函数$f^*$。\n例如，对于分类器，$y = f^*(\\Vx)$将输入$\\Vx$映射到一个类别$y$。\n\\gls{feedforward_network}定义了一个映射$\\Vy = f(\\Vx; \\Vtheta)$，并且学习参数$\\Vtheta$的值，使它能够得到最佳的函数近似。\n\n这种模型被称为\\firstgls{feedforward}的，是因为信息流过$\\Vx$的函数，流经用于定义$f$的中间计算过程，最终到达输出$\\Vy$。\n%这里的feedforward是翻译成前向的，还是前馈的？\n在模型的输出和模型本身之间没有\\firstgls{feedback}连接。\n当前馈神经网络被扩展成包含\\gls{feedback}连接时，它们被称为\\firstgls{RNN}，在\\chapref{chap:sequence_modeling_recurrent_and_recursive_nets}介绍。\n\n\\gls{feedforward_network}对于机器学习的从业者是极其重要的。\n它们是许多重要商业应用的基础。\n例如，用于对照片中的对象进行识别的\\gls{CNN}就是一种专门的\\gls{feedforward_network}。\n\\gls{feedforward_network}是通往\\gls{recurrent_network}之路的概念基石，后者在自然语言的许多应用中发挥着巨大作用。\n\n\\gls{feedforward_neural_network}被称作\\firstgls{network}是因为它们通常用许多不同函数复合在一起来表示。\n该模型与一个有向无环图相关联，而图描述了函数是如何复合在一起的。\n例如，我们有三个函数$f^{(1)}, f^{(2)}$和$f^{(3)}$连接在一个链上以形成$f(\\Vx) = f^{(3)}(f^{(2)}(f^{(1)}(\\Vx)) )$。\n这些链式结构是神经网络中最常用的结构。\n在这种情况下，$f^{(1)}$被称为网络的\\firstgls{first_layer}，$f^{(2)}$被称为\\firstgls{second_layer}，以此类推。\n链的全长称为模型的\\firstgls{depth}。\n正是因为这个术语才出现了``深度学习''这个名字。\n\\gls{feedforward_network}的最后一层被称为\\firstgls{output_layer}。\n在神经网络训练的过程中，我们让$f(\\Vx)$去匹配$f^*(\\Vx)$的值。\n训练数据为我们提供了在不同训练点上取值的、含有噪声的$f^*(\\Vx)$的近似实例。\n每个样本$\\Vx$都伴随着一个标签$y\\approx f^*(\\Vx)$。\n训练样本直接指明了输出层在每一点$\\Vx$上必须做什么；它必须产生一个接近$y$的值。\n但是训练数据并没有直接指明其他层应该怎么做。\n学习算法必须决定如何使用这些层来产生想要的输出，但是训练数据并没有说每个单独的层应该做什么。\n相反，学习算法必须决定如何使用这些层来最好地实现$f^*$的近似。\n因为训练数据并没有给出这些层中的每一层所需的输出，所以这些层被称为\\firstgls{hidden_layer}。\n\n% -- 163 --\n\n最后，这些网络被称为\\emph{神经网络}是因为它们或多或少地受到神经科学的启发。\n网络中的每个\\gls{hidden_layer}通常都是向量值的。这些\\gls{hidden_layer}的维数决定了模型的\\firstgls{width}。\n向量的每个元素都可以被视为起到类似一个神经元的作用。\n除了将层想象成向量到向量的单个函数，我们也可以把层想象成由许多并行操作的\\firstgls{unit}组成，每个单元表示一个向量到标量的函数。\n每个单元在某种意义上类似一个神经元，它接收的输入来源于许多其他的单元，并计算它自己的激活值。\n使用多层向量值表示的想法来源于神经科学。\n用于计算这些表示的函数$f^{(i)}(\\Vx)$的选择，也或多或少地受到神经科学观测的指引，这些观测是关于生物神经元计算功能的。\n然而，现代的神经网络研究受到更多的是来自许多数学和工程学科的指引，并且神经网络的目标并不是完美地给大脑建模。\n我们最好将\\gls{feedforward_neural_network}想成是为了实现统计\\gls{generalization}而设计出的函数近似机，它偶尔从我们了解的大脑中提取灵感，但并不是大脑功能的模型。\n\n一种理解\\gls{feedforward_network}的方式是从线性模型开始，并考虑如何克服它的局限性。\n线性模型，例如\\gls{logistic_regression}和线性回归，是非常吸引人的，因为无论是通过闭解形式还是使用凸优化，它们都能高效且可靠地拟合。\n线性模型也有明显的缺陷，那就是该模型的能力被局限在线性函数里，所以它无法理解任何两个输入变量间的相互作用。\n\n为了扩展线性模型来表示$\\Vx$的非线性函数，我们可以不把线性模型用于$\\Vx$本身，而是用在一个变换后的输入$\\phi(\\Vx)$上，这里$\\phi$是一个非线性变换。\n同样，我们可以使用\\secref{sec:support_vector_machines}中描述的\\gls{kernel_trick}，来得到一个基于隐含地使用$\\phi$映射的非线性学习算法。\n我们可以认为$\\phi$提供了一组描述$\\Vx$的特征，或者认为它提供了$\\Vx$的一个新的表示。\n\n% -- 164 --\n\n剩下的问题就是如何选择映射$\\phi$。\n\\begin{enumerate}\n\\item 其中一种选择是使用一个通用的$\\phi$，例如无限维的$\\phi$，它隐含地用在基于~\\glssymbol{RBF}~核的\\gls{kernel_machines}上。\n如果$\\phi(\\Vx)$具有足够高的维数，我们总是有足够的能力来拟合训练集，但是对于测试集的\\gls{generalization}往往不佳。\n非常通用的特征映射通常只基于局部光滑的原则，并且没有将足够的先验信息进行编码来解决高级问题。\n\n\\item 另一种选择是手动地设计$\\phi$。\n在深度学习出现以前，这一直是主流的方法。\n这种方法对于每个单独的任务都需要人们数十年的努力，从业者各自擅长特定的领域（如语音识别或计算机视觉），并且不同领域之间很难迁移(transfer)。\n\n\\item 深度学习的策略是去学习$\\phi$。\n在这种方法中，我们有一个模型$y = f(\\Vx;\\theta, \\Vw) = \\phi(\\Vx; \\theta)^\\top \\Vw$。\n我们现在有两种参数：用于从一大类函数中学习$\\phi$的参数$\\Vtheta$，以及用于将$\\phi(\\Vx)$映射到所需的输出的参数$\\Vw$。\n这是\\gls{deep_feedforward_network}的一个例子，其中$\\phi$定义了一个\\gls{hidden_layer}。\n这是三种方法中唯一一种放弃了训练问题的凸性的，但是利大于弊。\n在这种方法中，我们将表示参数化为$\\phi(\\Vx; \\Vtheta)$，并且使用优化算法来寻找$\\Vtheta$，使它能够得到一个好的表示。\n如果我们想要的话，这种方法也可以通过使它变得高度通用以获得第一种方法的优点——我们只需使用一个非常广泛的函数族$\\phi(\\Vx; \\Vtheta)$。\n这种方法也可以获得第二种方法的优点。\n人类专家可以将他们的知识编码进网络来帮助\\gls{generalization}，他们只需要设计那些他们期望能够表现优异的函数族$\\phi(\\Vx; \\Vtheta)$即可。\n这种方法的优点是人类设计者只需要寻找正确的函数族即可，而不需要去寻找精确的函数。\n\\end{enumerate}\n\n这种通过学习特征来改善模型的一般化原则不仅仅适用于本章描述的\\gls{feedforward_neural_network}。\n它是深度学习中反复出现的主题，适用于全书描述的所有种类的模型。\n\\gls{feedforward_neural_network}是这个原则的应用，它学习从$\\Vx$到$\\Vy$的确定性映射并且没有反馈连接。\n后面出现的其他模型会把这些原则应用到学习随机映射、学习带有反馈的函数以及学习单个向量的概率分布。\n\n% -- 165 --\n\n本章我们先从\\gls{feedforward_network}的一个简单例子说起。\n接着，我们讨论部署一个\\gls{feedforward_network}所需的每个设计决策。\n首先，训练一个\\gls{feedforward_network}至少需要做和线性模型同样多的设计决策：选择一个优化模型、代价函数以及输出单元的形式。\n我们先回顾这些基于梯度学习的基本知识，然后去面对那些只出现在\\gls{feedforward_network}中的设计决策。\n\\gls{feedforward_network}已经引入了\\gls{hidden_layer}的概念，这需要我们去选择用于计算\\gls{hidden_layer}值的\\firstgls{activation_function}。\n我们还必须设计网络的结构，包括网络应该包含多少层、这些层应该如何连接，以及每一层包含多少单元。\n在深度神经网络的学习中需要计算复杂函数的梯度。\n我们给出\\firstgls{back_propagation}算法和它的现代推广，它们可以用来高效地计算这些梯度。\n最后，我们以某些历史观点来结束这一章。\n\n\\section{实例：学习XOR}\n\\label{sec:example_learning_xor}\n\n为了使\\gls{feedforward_network}的想法更加具体，我们首先从一个可以完整工作的\\gls{feedforward_network}说起。\n这个例子解决一个非常简单的任务：学习XOR函数。\n\nXOR函数（``异或''逻辑）是两个二进制值$x_1$和$x_2$的运算。\n当这些二进制值中恰好有一个为1时，XOR函数返回值为1。\n其余情况下返回值为0。\nXOR函数提供了我们想要学习的目标函数$y = f^*(\\Vx)$。\n我们的模型给出了一个函数$y=f(\\Vx; \\Vtheta)$并且我们的学习算法会不断调整参数$\\Vtheta$来使得$f$尽可能接近$f^*$。\n\n在这个简单的例子中，我们不会关心统计\\gls{generalization}。\n我们希望网络在这四个点$\\SetX =\\{[0, 0]^\\top, [0, 1]^\\top, [1, 0]^\\top, [1, 1]^\\top\\}$上表现正确。\n我们会用全部这四个点来训练我们的网络，唯一的挑战是拟合训练集。\n\n我们可以把这个问题当作是回归问题，并使用\\gls{mean_squared_error}损失函数。\n我们选择这个损失函数是为了尽可能简化本例中用到的数学。\n在应用领域，对于二进制数据建模时，\\glssymbol{mean_squared_error}通常并不是一个合适的损失函数。\n更加合适的方法将在\\secref{sec:sigmoid_units_for_bernoulli_output_distributions}中讨论。\n\n% -- 166 --\n\n评估整个训练集上表现的~\\glssymbol{mean_squared_error}~损失函数为\n\\begin{equation}\nJ(\\Vtheta) = \\frac{1}{4} \\sum_{\\Vx\\in \\SetX} (f^*(\\Vx) - f(\\Vx; \\Vtheta))^2.\n\\end{equation}\n\n我们现在必须要选择我们模型$f(\\Vx; \\Vtheta)$的形式。\n假设我们选择一个线性模型，$\\Vtheta$包含$\\Vw$和$b$，那么我们的模型被定义成\n\\begin{equation}\nf(\\Vx; \\Vw, b) = \\Vx^\\top \\Vw + b.\n\\end{equation}\n我们可以使用\\gls{normal_equations}关于$\\Vw$和$b$最小化$J(\\Vtheta)$，来得到一个闭式解。\n\n解\\gls{normal_equations}以后，我们得到$\\Vw = 0$以及$b = \\frac{1}{2}$。\n线性模型仅仅是在任意一点都输出0.5。\n为什么会发生这种事？\n\\figref{fig:chap6_xor_space_gray}演示了线性模型为什么不能用来表示XOR函数。\n解决这个问题的其中一种方法是使用一个模型来学习一个不同的特征空间，在这个空间上线性模型能够表示这个解。\n% fig 6.1\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/xor_space_gray}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{通过学习一个表示来解决XOR问题。\n图上的粗体数字标明了学得的函数必须在每个点输出的值。\n\\emph{(左)}直接应用于原始输入的线性模型不能实现XOR函数。\n当$x_1 = 0$时，模型的输出必须随着$x_2$的增大而增大。\n当$x_1 = 1$时，模型的输出必须随着$x_2$的增大而减小。\n线性模型必须对$x_2$使用固定的系数$w_2$。\n因此，线性模型不能使用$x_1$的值来改变$x_2$的系数，从而不能解决这个问题。 \n\\emph{(右)}在由神经网络提取的特征表示的变换空间中，线性模型现在可以解决这个问题了。\n在我们的示例解决方案中，输出必须为1的两个点折叠到了特征空间中的单个点。\n换句话说，非线性特征将$\\Vx = [1, 0]^\\top$和$\\Vx = [0, 1]^\\top$都映射到了特征空间中的单个点$\\Vh = [1, 0]^\\top$。\n线性模型现在可以将函数描述为$h_1$增大和$h_2$减小。\n在该示例中，学习特征空间的动机仅仅是使得模型的能力更大，使得它可以拟合训练集。\n在更现实的应用中，学习的表示也可以帮助模型\\gls{generalization}。}\n\\label{fig:chap6_xor_space_gray}\n\\end{figure}\n\n\n具体来说，我们这里引入一个非常简单的\\gls{feedforward_neural_network}，它有一层\\gls{hidden_layer}并且\\gls{hidden_layer}中包含两个单元。\n见\\figref{fig:chap6_example_mlp}中对该模型的解释。\n这个\\gls{feedforward_network}有一个通过函数$f^{(1)}(\\Vx;\\MW, \\Vc)$计算得到的\\gls{hidden_unit}的向量$\\Vh$。\n这些\\gls{hidden_unit}的值随后被用作第二层的输入。\n第二层就是这个网络的输出层。\n输出层仍然只是一个线性回归模型，只不过现在它作用于$\\Vh$而不是$\\Vx$。\n网络现在包含链接在一起的两个函数：$\\Vh=f^{(1)}(\\Vx; \\MW, \\Vc)$和$y = f^{(2)}(\\Vh; \\Vw, b)$，完整的模型是$f(\\Vx; \\MW, \\Vc, \\Vw, b) = f^{(2)}(f^{(1)}(\\Vx))$。\n% fig 6.2\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/example_mlp}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{使用两种不同样式绘制的\\gls{feedforward_network}的示例。\n具体来说，这是我们用来解决XOR问题的\\gls{feedforward_network}。\n它有单个\\gls{hidden_layer}，包含两个单元。\n\\emph{(左)}在这种样式中，我们将每个单元绘制为图中的一个节点。\n这种风格是清楚而明确的，但对于比这个例子更大的网络，它可能会消耗太多的空间。\n\\emph{(右)}在这种样式中，我们将表示每一层激活的整个向量绘制为图中的一个节点。\n这种样式更加紧凑。\n有时，我们对图中的边使用参数名进行注释，这些参数是用来描述两层之间的关系的。\n这里，我们用矩阵$\\MW$描述从$\\Vx$到$\\Vh$的映射，用向量$\\Vw$描述从$\\Vh$到$y$的映射。\n当标记这种图时，我们通常省略与每个层相关联的截距参数。}\n\\label{fig:chap6_example_mlp}\n\\end{figure}\n\n\n$f^{(1)}$应该是哪种函数？线性模型到目前为止都表现不错，让$f^{(1)}$也是线性的似乎很有诱惑力。\n可惜的是，如果$f^{(1)}$是线性的，那么\\gls{feedforward_network}作为一个整体对于输入仍然是线性的。\n暂时忽略截距项，假设$f^{(1)}(\\Vx)= \\MW^\\top \\Vx$并且$f^{(2)}(\\Vh)=\\Vh^\\top \\Vw$，那么$f(\\Vx) = \\Vw^\\top\\MW^\\top \\Vx$。\n我们可以将这个函数重新表示成$f(\\Vx) = \\Vx^\\top\\Vw'$其中$\\Vw' = \\MW\\Vw$。\n\n% -- 167 --\n\n显然，我们必须用非线性函数来描述这些特征。\n大多数神经网络通过仿射变换之后紧跟着一个被称为激活函数的固定非线性函数来实现这个目标，其中仿射变换由学得的参数控制。\n我们这里使用这种策略，定义$\\Vh=g(\\MW^\\top \\Vx+\\Vc)$，其中$\\MW$是线性变换的权重矩阵，$\\Vc$是偏置。\n此前，为了描述线性回归模型，我们使用权重向量和一个标量的偏置参数来描述从输入向量到输出标量的仿射变换。\n现在，因为我们描述的是向量$\\Vx$到向量$\\Vh$的仿射变换，所以我们需要一整个向量的偏置参数。\n激活函数$g$通常选择对每个元素分别起作用的函数，有$h_i =g(\\Vx^\\top \\MW_{:, i} + c_i)$。\n在现代神经网络中，默认的推荐是使用由激活函数$g(z)=\\max\\{0, z\\}$定义的\\firstgls{ReLU}或者称为~\\glssymbol{ReLU}~\\citep{Jarrett-ICCV2009-small,Nair-2010-small,Glorot+al-AI-2011-small}，如\\figref{fig:chap6_relu_color}所示。\n% fig 6.3\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/relu_color}}\n\\fi\n\\caption{\\gls{rectified_linear}激活函数。\n该激活函数是被推荐用于大多数\\gls{feedforward_neural_network}的默认激活函数。\n将此函数用于线性变换的输出将产生非线性变换。 然而，函数仍然非常接近线性，在这种意义上它是具有两个线性部分的分段线性函数。\n由于\\gls{ReLU}几乎是线性的，因此它们保留了许多使得线性模型易于使用基于梯度的方法进行优化的属性。 它们还保留了许多使得线性模型能够\\gls{generalization}良好的属性。 计算机科学的一个通用原则是，我们可以从最小的组件构建复杂的系统。\n就像图灵机的内存只需要能够存储0或1的状态，我们可以从\\gls{rectified_linear}函数构建一个\\gls{universal_function_approximator}。}\n\\label{fig:chap6_relu_color}\n\\end{figure}\n\n\n我们现在可以指明我们的整个网络是\n\\begin{equation}\nf(\\Vx; \\MW, \\Vc, \\Vw, b) = \\Vw^\\top \\max\\{ 0, \\MW^\\top \\Vx + \\Vc \\} +b.\n\\end{equation}\n\n% -- 168 --\n\n% -- 169 --\n\n我们现在可以给出XOR问题的一个解。\n令\n\\begin{align}\n\\MW &= \\begin{bmatrix}\n1 & 1\\\\\n1 & 1\n\\end{bmatrix},\\\\\n\\Vc &= \\begin{bmatrix}\n0\\\\\n-1\n\\end{bmatrix},\\\\\n\\Vw &= \\begin{bmatrix}\n1\\\\\n-2\n\\end{bmatrix},\n\\end{align}\n以及$b=0$。\n\n我们现在可以了解这个模型如何处理一批输入。\n令$\\MX$表示设计矩阵，它包含二进制输入空间中全部的四个点，每个样本占一行，那么矩阵表示为：\n\\begin{equation} \n\\MX = \\begin{bmatrix}\n0 & 0\\\\\n0 & 1\\\\ \n1 & 0\\\\ \n1 & 1\n\\end{bmatrix}. \n\\end{equation} \n神经网络的第一步是将输入矩阵乘以第一层的权重矩阵： \n\\begin{equation}\n\\MX\\MW = \\begin{bmatrix} \n0 & 0\\\\ \n1 & 1\\\\ \n1 & 1\\\\ \n2 & 2 \n\\end{bmatrix}.\n\\end{equation} \n然后，我们加上偏置向量$\\Vc$，得到 \n\\begin{equation} \n\\begin{bmatrix} \n0 & -1\\\\\n1 & 0\\\\ \n1 & 0\\\\ \n2 & 1 \n\\end{bmatrix}. \n\\end{equation}\n在这个空间中，所有的样本都处在一条斜率为1的直线上。\n当我们沿着这条直线移动时，输出需要从0升到1，然后再降回0。\n线性模型不能实现这样一种函数。\n为了用$\\Vh$对每个样本求值，我们使用\\gls{rectified_linear_transformation}： \n\\begin{equation}\n\\begin{bmatrix} \n0 & 0\\\\ \n1 & 0\\\\ \n1 & 0\\\\ \n2 & 1 \n\\end{bmatrix}. \n\\end{equation}\n\n% -- 170 --\n\n这个变换改变了样本间的关系。它们不再处于同一条直线上了。\n如\\figref{fig:chap6_xor_space_gray}所示，它们现在处在一个可以用线性模型解决的空间上。\n\n我们最后乘以一个权重向量$\\Vw$:\n\\begin{equation}\n\\begin{bmatrix}\n0\\\\\n1\\\\\n1\\\\\n0\n\\end{bmatrix}.\n\\end{equation}\n神经网络对这一批次中的每个样本都给出了正确的结果。\n\n在这个例子中，我们简单地指定了解决方案，然后说明它得到的误差为零。\n在实际情况中，可能会有数十亿的模型参数以及数十亿的训练样本，所以不能像我们这里做的那样进行简单地猜解。\n与之相对的，基于梯度的优化算法可以找到一些参数使得产生的误差非常小。\n我们这里给出的XOR问题的解处在损失函数的全局最小点，所以梯度下降算法可以收敛到这一点。\n梯度下降算法还可以找到XOR问题一些其他的等价解。\n梯度下降算法的收敛点取决于参数的初始值。\n在实践中，梯度下降通常不会找到像我们这里给出的那种干净的、容易理解的、整数值的解。\n\n\\section{基于梯度的学习}\n\\label{sec:gradient_based_learning}\n\n设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。\n在\\secref{sec:building_a_machine_learning_algorithm}中，我们描述了如何通过指定一个优化过程、代价函数和一个模型族来构建一个机器学习算法。\n\n我们到目前为止看到的线性模型和神经网络的最大区别，在于神经网络的非线性导致大多数我们感兴趣的\\gls{cost_function}都变得非凸。\n这意味着神经网络的训练通常使用迭代的、基于梯度的优化，仅仅使得代价函数达到一个非常小的值；而不是像用于训练线性回归模型的线性方程求解器，或者用于训练\\gls{logistic_regression}或~\\glssymbol{SVM}~的凸优化算法那样保证全局收敛。\n凸优化从任何一种初始参数出发都会收敛（理论上如此——在实践中也很鲁棒但可能会遇到数值问题）。\n用于非凸损失函数的随机梯度下降没有这种收敛性保证，并且对参数的初始值很敏感。\n对于\\gls{feedforward_neural_network}，将所有的权重值初始化为小随机数是很重要的。\n偏置可以初始化为零或者小的正值。\n这种用于训练\\gls{feedforward_neural_network}以及几乎所有深度模型的迭代的基于梯度的优化算法会在\\chapref{chap:optimization_for_training_deep_models}详细介绍，参数初始化会在\\secref{sec:parameter_initialization_strategies}中具体说明。\n就目前而言，只需要懂得，训练算法几乎总是基于使用梯度来使得代价函数下降的各种方法即可。\n一些特别的算法是对梯度下降思想的改进和提纯（在\\secref{sec:gradient_based_optimization}中介绍）还有一些更特别的，大多数是对随机梯度下降算法的改进（在\\secref{sec:stochastic_gradient_descent_chap5}中介绍）。\n\n% -- 171 --\n\n我们当然也可以用梯度下降来训练诸如线性回归和\\gls{SVM}之类的模型，并且事实上当训练集相当大时这是很常用的。\n从这点来看，训练神经网络和训练其他任何模型并没有太大区别。\n计算梯度对于神经网络会略微复杂一些，但仍然可以很高效而精确地实现。\n\\secref{sec:back_propagation_and_other_differentiation_algorithms}将会介绍如何用\\gls{BP}算法以及它的现代扩展算法来求得梯度。\n\n和其他的机器学习模型一样，为了使用基于梯度的学习方法我们必须选择一个代价函数，并且我们必须选择如何表示模型的输出。\n现在，我们重温这些设计上的考虑，并且特别强调神经网络的情景。\n\n\\subsection{代价函数}\n\\label{sec:cost_functions}\n\n深度神经网络设计中的一个重要方面是代价函数的选择。\n幸运的是，神经网络的代价函数或多或少是和其他的参数模型例如线性模型的代价函数相同的。\n\n在大多数情况下， 我们的参数模型定义了一个分布$p(\\Vy\\mid\\Vx;\\Vtheta)$并且我们简单地使用最大似然原理。\n这意味着我们使用训练数据和模型预测间的\\gls{cross_entropy}作为代价函数。\n\n有时，我们使用一个更简单的方法，不是预测$\\Vy$的完整概率分布，而是仅仅预测在给定$\\Vx$的条件下$\\Vy$的某种统计量。\n某些专门的损失函数允许我们来训练这些估计量的预测器。\n\n用于训练神经网络的完整的代价函数，通常在我们这里描述的基本代价函数的基础上结合一个正则项。\n我们已经在\\secref{sec:regularization}中看到正则化应用到线性模型中的一些简单的例子。\n用于线性模型的权重衰减方法也直接适用于深度神经网络，而且是最流行的正则化策略之一。\n用于神经网络的更高级的正则化策略将在\\chapref{chap:regularization_for_deep_learning}中讨论。\n\n% -- 172 --\n\n\\subsubsection{使用最大似然学习条件分布}\n\\label{sec:learning_conditional_distributions_with_maximum_likelihood}\n\n大多数现代的神经网络使用最大似然来训练。\n这意味着代价函数就是负的对数似然，它与训练数据和模型分布间的\\gls{cross_entropy}等价。\n这个代价函数表示为\n\\begin{equation}\nJ(\\Vtheta) = -\\SetE_{\\RVx, \\RVy \\sim \\hat{p}_\\text{data}} \\log p_\\text{model} (\\Vy \\mid \\Vx).\n\\end{equation}\n\n代价函数的具体形式随着模型而改变，取决于$\\log p_\\text{model}$的具体形式。\n上述方程的展开形式通常会有一些项不依赖于模型的参数，我们可以舍去。\n例如，正如我们在\\secref{sec:the_task_t}中看到的，如果$p_\\text{model}(\\Vy\\mid\\Vx) = \\CalN(\\Vy;f(\\Vx;\\Vtheta), \\MI)$，那么我们就重新得到了\\gls{mean_squared_error}代价，\n\\begin{equation}\nJ(\\theta) = \\frac{1}{2} \\SetE_{\\RVx, \\RVy \\sim  \\hat{p}_\\text{data}} || \\Vy - f(\\Vx; \\Vtheta) ||^2 + \\text{const},\n\\end{equation}\n至少系数$\\frac{1}{2}$和常数项不依赖于$\\Vtheta$。\n舍弃的常数是基于\\gls{gaussian_distribution}的方差，在这种情况下我们选择不把它参数化。\n之前，我们看到了对输出分布的最大似然估计和对线性模型\\gls{mean_squared_error}的最小化之间的等价性，但事实上，这种等价性并不要求$f(\\Vx; \\Vtheta)$用于预测\\gls{gaussian_distribution}的均值。\n\n使用最大似然来导出代价函数的方法的一个优势是，它减轻了为每个模型设计代价函数的负担。\n明确一个模型$p(\\Vy\\mid\\Vx)$则自动地确定了一个代价函数$\\log p(\\Vy\\mid\\Vx)$。\n\n贯穿神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性，来为学习算法提供一个好的指引。\n饱和（变得非常平）的函数破坏了这一目标，因为它们把梯度变得非常小。\n这在很多情况下都会发生，因为用于产生\\gls{hidden_unit}或者输出单元的输出的激活函数会饱和。\n负的对数似然帮助我们在很多模型中避免这个问题。\n很多输出单元都会包含一个指数函数，这在它的变量取绝对值非常大的负值时会造成饱和。\n负对数似然代价函数中的对数函数消除了某些输出单元中的指数效果。\n我们将会在\\secref{sec:output_units}中讨论代价函数和输出单元的选择间的相互作用。\n\n% -- 173 --\n\n用于实现最大似然估计的\\gls{cross_entropy}代价函数有一个不同寻常的特性，那就是当它被应用于实践中经常遇到的模型时，它通常没有最小值。\n对于离散型输出变量，大多数模型以一种特殊的形式来参数化，即它们不能表示概率零和一，但是可以无限接近。\n\\gls{logistic_regression}是其中一个例子。\n对于实值的输出变量，如果模型可以控制输出分布的密度（例如，通过学习\\gls{gaussian_output_distribution}的方差参数），那么它可能对正确的训练集输出赋予极其高的密度，这将导致\\gls{cross_entropy}趋向负无穷。\n\\chapref{chap:regularization_for_deep_learning}中描述的正则化技术提供了一些不同的方法来修正学习问题，使得模型不会通过这种方式来获得无限制的收益。\n\n\\subsubsection{学习条件统计量}\n\\label{sec:learning_conditional_statistics}\n\n有时我们并不是想学习一个完整的概率分布$p(\\Vy\\mid\\Vx; \\Vtheta)$，而仅仅是想学习在给定$\\Vx$时$\\Vy$的某个条件统计量。\n\n例如，我们可能有一个预测器$f(\\Vx; \\Vtheta)$，我们想用它来预测$\\Vy$的均值。\n如果我们使用一个足够强大的神经网络，我们可以认为这个神经网络能够表示一大类函数中的任何一个函数$f$，这个类仅仅被一些特征所限制，例如连续性和有界，而不是具有特殊的参数形式。\n从这个角度来看，我们可以把代价函数看作是一个\\firstgls{functional}而不仅仅是一个函数。\n泛函是函数到实数的映射。我们因此可以将学习看作是选择一个函数而不仅仅是选择一组参数。\n我们可以设计代价泛函在我们想要的某些特殊函数处取得最小值。\n例如，我们可以设计一个代价泛函，使它的最小值处于一个特殊的函数上，这个函数将$\\Vx$映射到给定$\\Vx$时$\\Vy$的期望值。\n对函数求解优化问题需要用到\\firstgls{calculus_of_variations}这个数学工具，我们将在\\secref{sec:calculus_of_variations}中讨论。\n理解\\gls{calculus_of_variations}对于理解本章的内容不是必要的。\n目前，只需要知道\\gls{calculus_of_variations}可以被用来导出下面的两个结果。\n\n% -- 174 --\n\n我们使用\\gls{calculus_of_variations}导出的第一个结果是解优化问题\n\\begin{equation}\nf^* = \\underset{f}{\\argmin}  \\ \\SetE_{\\RVx, \\RVy \\sim  p_\\text{data}} ||\\Vy-f(\\Vx)||^2\n\\end{equation}\n得到\n\\begin{equation}\nf^*(\\Vx) = \\SetE_{\\RVy\\sim p_\\text{data}(\\Vy|\\Vx)} [\\Vy],\n\\end{equation}\n要求这个函数处在我们要优化的类里。\n换句话说，如果我们能够用无穷多的、来源于真实的数据生成分布的样本进行训练，最小化\\gls{mean_squared_error}代价函数将得到一个函数，它可以用来对每个$\\Vx$的值预测出$\\Vy$的均值。\n\n不同的代价函数给出不同的统计量。\n第二个使用\\gls{calculus_of_variations}得到的结果是\n\\begin{equation}\nf^* = \\underset{f}{\\argmin} \\ \\SetE_{\\RVx, \\RVy \\sim  p_\\text{data}} ||\\Vy - f(\\Vx)||_1\n\\end{equation}\n将得到一个函数可以对每个$\\Vx$预测$\\Vy$取值的\\emph{中位数}，只要这个函数在我们要优化的函数族里。\n这个代价函数通常被称为\\firstgls{mean_absolute_error}。\n\n可惜的是，\\gls{mean_squared_error}和\\gls{mean_absolute_error}在使用基于梯度的优化方法时往往成效不佳。\n一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。\n这就是为什么\\gls{cross_entropy}代价函数比\\gls{mean_squared_error}或者\\gls{mean_absolute_error}更受欢迎的原因之一了，即使是在没必要估计整个$p(\\Vy\\mid\\Vx)$分布时。\n\n\n\\subsection{输出单元}\n\\label{sec:output_units}\n\n代价函数的选择与输出单元的选择紧密相关。\n大多数时候，我们简单地使用数据分布和模型分布间的\\gls{cross_entropy}。\n选择如何表示输出决定了\\gls{cross_entropy}函数的形式。\n\n任何可用作输出的神经网络单元，也可以被用作\\gls{hidden_unit}。\n这里，我们着重讨论将这些单元用作模型输出时的情况，不过原则上它们也可以在内部使用。\n我们将在\\secref{sec:hidden_units}中重温这些单元，并且给出当它们被用作\\gls{hidden_unit}时一些额外的细节。\n\n在本节中，我们假设\\gls{feedforward_network}提供了一组定义为$\\Vh=f(\\Vx;\\Vtheta)$的隐藏特征。\n输出层的作用是随后对这些特征进行一些额外的变换来完成整个网络必须完成的任务。\n\n% -- 175 --\n\n\\subsubsection{用于\\glsentrytext{gaussian_output_distribution}的线性单元}\n\\label{sec:linear_units_for_gaussian_output_distributions}\n\n一种简单的输出单元是基于仿射变换的输出单元，仿射变换不具有非线性。\n这些单元往往被直接称为线性单元。\n\n给定特征$\\Vh$，线性输出单元层产生一个向量$\\hat{\\Vy} = \\MW^\\top \\Vh+\\Vb$。\n\n线性输出层经常被用来产生条件\\gls{gaussian_distribution}的均值：\n\\begin{equation}\np(\\Vy\\mid\\Vx) = \\CalN(\\Vy; \\hat{\\Vy}, \\MI ).\n\\end{equation}\n最大化其对数似然此时等价于最小化\\gls{mean_squared_error}。\n\n最大似然框架也使得学习\\gls{gaussian_distribution}的协方差矩阵更加容易，或更容易地使\\gls{gaussian_distribution}的协方差矩阵作为输入的函数。\n然而，对于所有输入，协方差矩阵都必须被限定成一个正定矩阵。\n线性输出层很难满足这种限定，所以通常使用其他的输出单元来对协方差参数化。\n对协方差建模的方法将在\\secref{sec:other_output_types}中简要介绍。\n\n因为线性模型不会饱和，所以它们易于采用基于梯度的优化算法，甚至可以使用其他多种优化算法。\n\n\\subsubsection{用于\\glsentrytext{bernoulli_output_distribution}的\\glsentrytext{sigmoid}单元}\n\\label{sec:sigmoid_units_for_bernoulli_output_distributions}\n\n许多任务需要预测二值型变量$y$的值。\n具有两个类的分类问题可以归结为这种形式。\n\n此时最大似然的方法是定义$y$在$\\Vx$条件下的~\\gls{bernoulli_distribution}。\n\n\\gls{bernoulli_distribution}仅需单个参数来定义。\n神经网络只需要预测$P(y =1\\mid\\Vx)$即可。\n为了使这个数是有效的概率，它必须处在区间$[0, 1]$中。\n\n为满足该约束条件需要一些细致的设计工作。\n假设我们打算使用线性单元，并且通过阈值来限制它成为一个有效的概率：\n\\begin{equation}\nP(y=1 \\mid \\Vx) = \\max \\left \\{ 0, \\min \\{1, \\Vw^\\top \\Vh+b \\} \\right \\}.\n\\end{equation}\n这的确定义了一个有效的条件概率分布，但我们无法使用梯度下降来高效地训练它。\n当$\\Vw^\\top \\Vh+b$处于单位区间外时，模型的输出对其参数的梯度都将为$\\bm{0}$。\n梯度为$\\bm{0}$通常是有问题的，因为学习算法对于如何改善相应的参数不再具有指导意义。\n\n% -- 176 --\n\n相反，最好是使用一种新的方法来保证无论何时模型给出了错误的答案时，总能有一个较大的梯度。\n这种方法是基于使用~\\gls{sigmoid}~输出单元结合最大似然来实现的。\n\n\\gls{sigmoid}~输出单元定义为\n\\begin{equation}\n\\hat{y} = \\sigma \\left (\\Vw^\\top \\Vh + b \\right ),\n\\end{equation}\n这里$\\sigma$是\\secref{sec:useful_properties_of_common_functions}中介绍的~\\gls{logistic_sigmoid}~函数。\n\n我们可以认为~\\gls{sigmoid}~输出单元具有两个部分。\n首先，它使用一个线性层来计算$z=\\Vw^\\top \\Vh+b$。\n接着，它使用~\\gls{sigmoid}~激活函数将$z$转化成概率。\n\n我们暂时忽略对于$\\Vx$的依赖性，只讨论如何用$z$的值来定义$y$的概率分布。\n\\gls{sigmoid}~可以通过构造一个非归一化（和不为1）的概率分布$\\tilde{P}(y)$来得到。\n我们可以随后除以一个合适的常数来得到有效的概率分布。\n如果我们假定非归一化的对数概率对$y$ 和$z$是线性的，可以对它取指数来得到非归一化的概率。\n我们然后对它归一化，可以发现这服从~\\gls{bernoulli_distribution}，该分布受$z$的~\\gls{sigmoid}~变换控制：\n\\begin{align}\n\\log \\tilde{P}(y) &= yz,\\\\\n\\tilde{P}(y) &= \\exp(yz),\\\\\nP(y) &= \\frac{\\exp(yz)}{\\sum_{y' = 0}^1 \\exp(y' z)},\\\\\nP(y) &= \\sigma((2y-1)z).\n\\end{align}\n基于指数和归一化的概率分布在统计建模的文献中很常见。\n用于定义这种二值型变量分布的变量$z$被称为\\firstgls{logit}。\n\n% -- 177 --\n\n这种在对数空间里预测概率的方法可以很自然地使用最大似然学习。\n因为用于最大似然的代价函数是$-\\log P(y\\mid\\Vx)$，代价函数中的log抵消了~\\gls{sigmoid}~中的exp。\n如果没有这个效果，\\gls{sigmoid}~的饱和性会阻止基于梯度的学习做出好的改进。\n我们使用最大似然来学习一个由~\\gls{sigmoid}~参数化的~\\gls{bernoulli_distribution}，它的损失函数为\n\\begin{align}\nJ(\\Vtheta) &= -\\log P(y\\mid\\Vx)\\\\\n&= -\\log \\sigma ((2y-1)z)\\\\\n&= \\zeta((1-2y)z).\n\\end{align}\n\n这个推导使用了\\secref{sec:useful_properties_of_common_functions}中的一些性质。\n通过将损失函数写成~\\gls{softplus_function}的形式，我们可以看到它仅仅在$(1-2y)z$取绝对值非常大的负值时才会饱和。\n因此饱和只会出现在模型已经得到正确答案时——当$y=1$且$z$取非常大的正值时，或者$y=0$且$z$取非常小的负值时。\n当$z$的符号错误时，\\gls{softplus_function}的变量$(1-2y)z$可以简化为$|z|$。\n当$|z|$变得很大并且$z$的符号错误时，\\gls{softplus_function}渐近地趋向于它的变量$|z|$。\n对$z$求导则渐近地趋向于$\\text{sign}(z)$，所以，对于极限情况下极度不正确的$z$，\\gls{softplus_function}完全不会收缩梯度。\n这个性质很有用，因为它意味着基于梯度的学习可以很快地改正错误的$z$。\n\n当我们使用其他的损失函数，例如\\gls{mean_squared_error}之类的，损失函数会在$\\sigma(z)$饱和时饱和。\n\\gls{sigmoid}~激活函数在$z$取非常小的负值时会饱和到0，当$z$取非常大的正值时会饱和到1。\n这种情况一旦发生，梯度会变得非常小以至于不能用来学习，无论此时模型给出的是正确还是错误的答案。\n因此，最大似然几乎总是训练~\\gls{sigmoid}~输出单元的优选方法。\n\n理论上，\\gls{sigmoid}~的对数总是确定和有限的，因为~\\gls{sigmoid}~的返回值总是被限制在开区间$(0, 1)$上，而不是使用整个闭区间$[0, 1]$的有效概率。\n在软件实现时，为了避免数值问题，最好将负的对数似然写作$z$的函数，而不是$\\hat{y}=\\sigma(z)$的函数。\n如果~\\gls{sigmoid}~函数下溢到零，那么之后对$\\hat{y}$取对数会得到负无穷。\n\n\\subsubsection{用于\n\\glsentrytext{multinoulli_output_distribution}的softmax单元}\n\\label{sec:softmax_units_for_multinoulli_output_distributions}\n\n任何时候当我们想要表示一个具有$n$个可能取值的离散型随机变量的分布时，我们都可以使用softmax函数。\n它可以看作是~\\gls{sigmoid}~函数的扩展，其中~\\gls{sigmoid}~函数用来表示二值型变量的分布。\n\n% -- 178 --\n\nsoftmax函数最常用作分类器的输出，来表示$n$个不同类上的概率分布。\n比较少见的是，softmax函数可以在模型内部使用，例如如果我们想要在某个内部变量的$n$个不同选项中进行选择。\n\n在二值型变量的情况下，我们希望计算一个单独的数\n\\begin{equation}\n\\hat{y} = P(y=1\\mid\\Vx).\n\\end{equation}\n因为这个数需要处在0和1之间，并且我们想要让这个数的对数可以很好地用于对数似然的基于梯度的优化，我们选择去预测另外一个数$z=\\log \\hat{P}(y=1\\mid\\Vx)$。\n对其指数化和归一化，我们就得到了一个由~\\gls{sigmoid}~函数控制的~\\gls{bernoulli_distribution}。\n\n为了推广到具有$n$个值的离散型变量的情况，我们现在需要创造一个向量$\\hat{\\Vy}$，它的每个元素是$\\hat{y}_i = P(y=i\\mid\\Vx)$。\n我们不仅要求每个$\\hat{y}_i$元素介于0和1之间，还要使得整个向量的和为1，使得它表示一个有效的概率分布。\n用于~\\gls{bernoulli_distribution}的方法同样可以推广到~\\gls{multinoulli_distribution}。\n首先，线性层预测了未归一化的对数概率：\n\\begin{equation}\n\\Vz = \\MW^\\top \\Vh+\\Vb,\n\\end{equation}\n其中$z_i=\\log \\hat{P}(y=i\\mid\\Vx)$。\nsoftmax函数然后可以对$z$指数化和归一化来获得需要的$\\hat{\\Vy}$。\n最终，softmax函数的形式为\n\\begin{equation}\n\\text{softmax}(\\Vz)_i = \\frac{\\exp(z_i)}{\\sum_j \\exp(z_j)}.\n\\end{equation}\n\n和~\\gls{logistic_sigmoid}一样，当使用最大化对数似然训练softmax来输出目标值$\\RSy$时，使用指数函数工作地非常好。\n这种情况下，我们想要最大化$\\log P(\\RSy =i; \\Vz)=\\log \\text{softmax}(\\Vz)_i$。\n将softmax定义成指数的形式是很自然的因为对数似然中的log可以抵消softmax中的exp：\n\\begin{equation}\n\\log \\text{softmax}(\\Vz)_i = z_i - \\log \\sum_j \\exp(z_j).\n\\label{eq:6.30}\n\\end{equation}\n\n% -- 179 --\n\n\\eqnref{eq:6.30}中的第一项表示输入$z_i$总是对代价函数有直接的贡献。\n因为这一项不会饱和，所以即使$z_i$对\\eqnref{eq:6.30}的第二项的贡献很小，学习依然可以进行。\n当最大化对数似然时，第一项鼓励$z_i$被推高，而第二项则鼓励所有的$\\Vz$被压低。\n为了对第二项$\\log \\sum_j \\exp(z_j)$有一个直观的理解，注意到这一项可以大致近似为$\\max_j z_j$。\n这种近似是基于对任何明显小于$\\max_j z_j$的$z_k$，$\\exp(z_k)$都是不重要的。\n我们能从这种近似中得到的直觉是，负对数似然代价函数总是强烈地惩罚最活跃的不正确预测。\n如果正确答案已经具有了softmax的最大输入，那么$-z_i$项和$\\log\\sum_j \\exp(z_j) \\approx \\max_j z_j = z_i$项将大致抵消。\n这个样本对于整体训练代价贡献很小，这个代价主要由其他未被正确分类的样本产生。\n\n到目前为止我们只讨论了一个例子。\n总体来说，未正则化的最大似然会驱动模型去学习一些参数，而这些参数会驱动softmax函数来预测在训练集中观察到的每个结果的比率：\n\\begin{equation}\n\\text{softmax}(\\Vz(\\Vx; \\Vtheta))_i \\approx \\frac{\\sum_{j=1}^m \\bm{1}_{y^{(j)}=i, \\Vx^{(j)} = \\Vx}  }{ \\sum_{j=1}^{m} \\bm{1}_{\\Vx^{(j)} = \\Vx} }.\n\\end{equation}\n因为最大似然是一致的估计量，所以只要模型族能够表示训练的分布，这就能保证发生。\n在实践中，有限的模型能力和不完美的优化将意味着模型只能近似这些比率。\n\n除了对数似然之外的许多目标函数对softmax函数不起作用。\n具体来说，那些不使用对数来抵消softmax中的指数的目标函数，当指数函数的变量取非常小的负值时会造成梯度消失，从而无法学习。\n特别是，平方误差对于softmax单元来说是一个很差的损失函数，即使模型做出高度可信的不正确预测，也不能训练模型改变其输出\\citep{Bridle90}。\n要理解为什么这些损失函数可能失败，我们需要检查softmax函数本身。\n\n像~\\gls{sigmoid}~一样，softmax激活函数可能会饱和。\n\\gls{sigmoid}~函数具有单个输出，当它的输入极端负或者极端正时会饱和。\n对于softmax的情况，它有多个输出值。\n当输入值之间的差异变得极端时，这些输出值可能饱和。\n当softmax饱和时，基于softmax的许多代价函数也饱和，除非它们能够转化饱和的激活函数。\n\n% -- 180 --\n\n为了说明softmax函数对于输入之间差异的响应，观察到当对所有的输入都加上一个相同常数时softmax的输出不变：\n\\begin{equation}\n\\text{softmax}(\\Vz) = \\text{softmax}(\\Vz+c).\n\\end{equation}\n使用这个性质，我们可以导出一个数值方法稳定的softmax函数的变体：\n\\begin{equation}\n\\text{softmax}(\\Vz) = \\text{softmax}(\\Vz- \\max_i z_i).\n\\end{equation}\n变换后的形式允许我们在对softmax函数求值时只有很小的数值误差，即使是当$z$包含极正或者极负的数时。\n观察softmax数值稳定的变体，可以看到softmax函数由它的变量偏离$\\max_i z_i$的量来驱动。\n\n当其中一个输入是最大（$z_i = \\max_i z_i$）并且$z_i$远大于其他的输入时，相应的输出$\\text{softmax}(\\Vz)_i$会饱和到1。\n当$z_i$不是最大值并且最大值非常大时，相应的输出$\\text{softmax}(\\Vz)_i$也会饱和到0。\n这是~\\gls{sigmoid}~单元饱和方式的一般化，并且如果损失函数不被设计成对其进行补偿，那么也会造成类似的学习困难。\n\nsoftmax函数的变量$\\Vz$可以通过两种方式产生。\n最常见的是简单地使神经网络中softmax之前的层输出$\\Vz$的每个元素，就像先前描述的使用线性层$\\Vz={W}^\\top\\Vh+\\Vb$。\n虽然很直观，但这种方法是对分布的过度参数化。\n$n$个输出总和必须为1的约束意味着只有$n-1$个参数是必要的；第$n$个概率值可以通过1减去前面$n-1$个概率来获得。\n因此，我们可以强制要求$\\Vz$的一个元素是固定的。\n例如，我们可以要求$z_n=0$。\n事实上，这正是~\\gls{sigmoid}~单元所做的。\n定义$P(y=1\\mid\\Vx)=\\sigma(z)$等价于用二维的$\\Vz$以及$z_1=0$来定义$P(y=1\\mid\\Vx)=\\text{softmax}(\\Vz)_1$。\n无论是$n-1$个变量还是$n$个变量的方法，都描述了相同的概率分布，但会产生不同的学习机制。\n在实践中，无论是过度参数化的版本还是限制的版本都很少有差别，并且实现过度参数化的版本更为简单。\n\n从神经科学的角度看，有趣的是认为softmax是一种在参与其中的单元之间形成竞争的方式：softmax输出总是和为1，所以一个单元的值增加必然对应着其他单元值的减少。\n这与被认为存在于皮质中相邻神经元间的侧抑制类似。\n在极端情况下（当最大的$a_i$和其他的在幅度上差异很大时），它变成了\\firstgls{winner_take_all}的形式（其中一个输出接近1，其他的接近0）。\n\n``softmax''的名称可能会让人产生困惑。\n这个函数更接近于argmax函数而不是max函数。\n``soft''这个术语来源于softmax函数是连续可微的。\n``argmax''函数的结果表示为一个\\gls{one_hot}向量（只有一个元素为1，其余元素都为0的向量），不是连续和可微的。\nsoftmax函数因此提供了argmax的``软化''版本。max函数相应的软化版本是$\\text{softmax}(\\Vz)^\\top \\Vz$。\n可能最好是把softmax函数称为``softargmax''，但当前名称已经是一个根深蒂固的习惯了。\n\n% -- 181 --\n\n\\subsubsection{其他的输出类型}\n\\label{sec:other_output_types}\n\n之前描述的线性、\\gls{sigmoid}~和softmax输出单元是最常见的。\n神经网络可以推广到我们希望的几乎任何种类的输出层。\n最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。\n\n一般的，如果我们定义了一个条件分布$p(\\Vy\\mid\\Vx; \\Vtheta)$，最大似然原则建议我们使用$-\\log p(\\Vy\\mid \\Vx;\\Vtheta)$作为代价函数。\n\n一般来说，我们可以认为神经网络表示函数$f(\\Vx;\\Vtheta)$。\n这个函数的输出不是对$\\Vy$值的直接预测。\n相反，$f(\\Vx;\\Vtheta)=\\Vomega$提供了$y$分布的参数。\n我们的损失函数就可以表示成$-\\log p(\\RVy; \\Vomega(\\Vx))$。\n\n例如，我们想要学习在给定$\\RVx$时，$\\RVy$的条件\\gls{gaussian_distribution}的方差。\n简单情况下，方差$\\sigma^2$是一个常数，此时有一个解析表达式，这是因为方差的最大似然估计量仅仅是观测值$\\RVy$与它们的期望值的差值的平方平均。\n一种计算上代价更加高但是不需要写特殊情况代码的方法是简单地将方差作为分布$p(\\RVy\\mid\\Vx)$的其中一个属性，这个分布由$\\Vomega=f(\\Vx;\\Vtheta)$控制。\n负对数似然$-\\log p(\\Vy;\\Vomega(\\Vx))$将为代价函数提供一个必要的合适项来使我们的优化过程可以逐渐地学到方差。\n在标准差不依赖于输入的简单情况下，我们可以在网络中创建一个直接复制到$\\Vomega$中的新参数。\n这个新参数可以是$\\sigma$本身，或者可以是表示$\\sigma^2$的参数$v$，或者可以是表示$\\frac{1}{\\sigma^2}$的参数$\\beta$，取决于我们怎样对分布参数化。\n我们可能希望模型对不同的$\\RVx$值预测出$\\RVy$不同的方差。\n这被称为\\firstgls{heteroscedastic}模型。\n在异方差情况下，我们简单地把方差指定为$f(\\RVx;\\Vtheta)$其中一个输出值。\n实现它的典型方法是使用精度而不是方差来表示\\gls{gaussian_distribution}，就像\\eqnref{eq:3.22}所描述的。\n在多维变量的情况下，最常见的是使用一个对角精度矩阵\n\\begin{equation}\n\\text{diag}(\\Vbeta).\n\\end{equation}\n这个公式适用于梯度下降，因为由$\\Vbeta$参数化的\\gls{gaussian_distribution}的对数似然的公式仅涉及$\\beta_i$的乘法和$\\log \\beta_i$的加法。\n乘法、加法和对数运算的梯度表现良好。\n相比之下，如果我们用方差来参数化输出，我们需要用到除法。\n除法函数在零附近会变得任意陡峭。\n虽然大梯度可以帮助学习，但任意大的梯度通常导致不稳定。\n如果我们用标准差来参数化输出，对数似然仍然会涉及除法，并且还将涉及平方。\n通过平方运算的梯度可能在零附近消失，这使得学习被平方的参数变得困难。\n无论我们使用的是标准差，方差还是精度，我们必须确保\\gls{gaussian_distribution}的协方差矩阵是正定的。\n因为精度矩阵的特征值是协方差矩阵特征值的倒数，所以这等价于确保精度矩阵是正定的。\n如果我们使用对角矩阵，或者是一个常数乘以单位矩阵\\footnote{译者注：这里原文是``If we use a diagonal matrix, or a scalar times the diagonal matrix...''即``如果我们使用对角矩阵，或者是一个标量乘以对角矩阵...''，但一个标量乘以对角矩阵和对角矩阵没区别，结合上下文可以看出，这里原作者误把``identity''写成了``diagonal matrix''，因此这里采用``常数乘以单位矩阵''的译法。}，那么我们需要对模型输出强加的唯一条件是它的元素都为正。\n如果我们假设$\\Va$是用于确定对角精度的模型的原始激活，那么可以用softplus 函数来获得正的精度向量：$\\Vbeta=\\Vzeta(\\Va)$。\n这种相同的策略对于方差或标准差同样适用，也适用于常数乘以单位阵的情况。\n\n% -- 182 --\n\n学习一个比对角矩阵具有更丰富结构的协方差或者精度矩阵是很少见的。\n如果协方差矩阵是满的和有条件的，那么参数化的选择就必须要保证预测的协方差矩阵是正定的。\n这可以通过写成$\\VSigma(\\Vx)=\\MB(\\Vx)\\MB^\\top (\\Vx)$来实现，这里$\\MB$是一个无约束的方阵。\n如果矩阵是满秩的，那么一个实际问题是计算似然的代价是很高的，计算一个$d\\times d$的矩阵的行列式或者$\\VSigma(\\Vx)$的逆（或者等价地并且更常用地，对它特征值分解或者$\\MB(\\Vx)$的特征值分解）需要$O(d^3)$的计算量。\n\n% -- 183 --\n\n我们经常想要执行多峰回归(multimodal regression)，即预测条件分布$p(\\Vy\\mid\\Vx)$的实值，该条件分布对于相同的$\\Vx$值在$\\Vy$空间中有多个不同的峰值。\n在这种情况下，高斯混合是输出的自然表示\\citep{Jacobs-nc91,bishop1994mixture}。\n将高斯混合作为其输出的神经网络通常被称为\\firstgls{mixture_density_network}。\n具有$n$个分量的高斯混合输出由下面的条件分布定义：\n\\begin{equation}\np(\\Vy\\mid\\Vx) = \\sum_{i=1}^n p(\\RSc = i \\mid \\Vx) \\CalN(\\Vy; \\Vmu^{(i)}(\\Vx), \\VSigma^{(i)}(\\Vx)).\n\\end{equation}\n神经网络必须有三个输出：定义$p(\\RSc=i\\mid\\Vx)$的向量，对所有的$i$给出$\\Vmu^{(i)}(\\Vx)$的矩阵，以及对所有的$i$给出$\\VSigma^{(i)}(\\Vx)$的张量。\n这些输出必须满足不同的约束：\n\\begin{enumerate}\n\\item 混合组件$p(\\RSc=i\\mid\\Vx)$：它们由\\gls{latent_variable}\\footnote{我们之所以认为$\\RSc$是\\gls{latent}的，是因为我们不能直接在数据中观测到它：给定输入$\\RVx$和目标$\\RVy$，不可能确切地知道是哪个高斯组件产生$\\RVy$，但我们可以想象$\\RVy$是通过选择其中一个来产生的，并且将那个未被观测到的选择作为随机变量。}~$\\RSc$关联着，在$n$个不同组件上形成~\\gls{multinoulli_distribution}。\n这个分布通常可以由$n$维向量的softmax来获得，以确保这些输出是正的并且和为1。\n\n\\item 均值$\\Vmu^{(i)}(\\Vx)$：它们指明了与第$i$个高斯组件相关联的中心或者均值，并且是无约束的（通常对于这些输出单元完全没有非线性）。\n如果$\\RVy$是个$d$维向量，那么网络必须输出一个由$n$个这种$d$维向量组成的$n\\times d$ 的矩阵。\n用最大似然来学习这些均值要比学习只有一个输出模式的分布的均值稍稍复杂一些。我们只想更新那个真正产生观测数据的组件的均值。\n在实践中，我们并不知道是哪个组件产生了观测数据。\n负对数似然表达式将每个样本对每个组件的贡献进行赋权，权重的大小由相应的组件产生这个样本的概率来决定。\n\n\\item 协方差$\\VSigma^{(i)}(\\Vx)$：它们指明了每个组件$i$的协方差矩阵。\n和学习单个高斯组件时一样，我们通常使用对角矩阵来避免计算行列式。\n和学习混合均值时一样，最大似然是很复杂的，它需要将每个点的部分责任分配给每个混合组件。\n如果给定了混合模型的正确的负对数似然，梯度下降将自动地遵循正确的过程。\n\\end{enumerate}\n有报告说基于梯度的优化方法对于混合条件高斯（作为神经网络的输出）可能是不可靠的，部分是因为涉及到除法（除以方差）可能是数值不稳定的（当某个方差对于特定的实例变得非常小时，会导致非常大的梯度）。\n一种解决方法是\\firstgls{clip_gradients}（见\\secref{sec:clipping_gradients}），另外一种是启发式缩放梯度\\citep{Uria+al-ICML2014}。\n\n% -- 184 --\n\n高斯混合输出在语音生成模型\\citep{schuster1999supervised}和物理运动\\citep{Graves-arxiv2013}中特别有效。\n混合密度策略为网络提供了一种方法来表示多种输出模式，并且控制输出的方差，这对于在这些实数域中获得高质量的结果是至关重要的。\n混合密度网络的一个实例如\\figref{fig:chap6_mdn_color}所示。\n% fig 6.4\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/mdn_color}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{从具有混合密度输出层的神经网络中抽取的样本。\n输入$x$从\\gls{uniform_distribution}中采样，输出$y$从$p_{\\text{model}}(y\\mid x)$中采样。 神经网络能够学习从输入到输出分布的参数的非线性映射。 这些参数包括控制三个组件中的哪一个将产生输出的概率，以及每个组件各自的参数。\n每个混合组件都是\\gls{gaussian_distribution}，具有预测的均值和方差。 输出分布的这些方面都能够相对输入$x$变化，并且以非线性的方式改变。}\n\\label{fig:chap6_mdn_color}\n\\end{figure}\n\n\n一般的，我们可能希望继续对包含更多变量的、更大的向量$\\Vy$来建模，并在这些输出变量上施加更多更丰富的结构。\n例如，我们可能希望神经网络输出字符序列形成一个句子。\n在这些情况下，我们可以继续使用最大似然原理应用到我们的模型$p(\\Vy;\\Vomega(\\Vx))$上，但我们用来描述$\\Vy$的模型会变得非常复杂，超出了本章的范畴。\n\\chapref{chap:sequence_modeling_recurrent_and_recursive_nets}描述了如何使用循环神经网络来定义这种序列上的模型，第\\ref{part:deep_learning_research}部分描述了对任意概率分布进行建模的高级技术。\n\n\\section{\\glsentrytext{hidden_unit}}\n\\label{sec:hidden_units}\n\n到目前为止，我们集中讨论了神经网络的设计选择，这对于使用基于梯度的优化方法来训练的大多数参数化机器学习模型都是通用的。\n现在我们转向一个\\gls{feedforward_neural_network}独有的问题：该如何选择\\gls{hidden_unit}的类型，这些\\gls{hidden_unit}用在模型的\\gls{hidden_layer}中。\n\n% -- 185 --\n\n\\gls{hidden_unit}的设计是一个非常活跃的研究领域，并且还没有许多明确的指导性理论原则。\n\n\\gls{ReLU}是\\gls{hidden_unit}极好的默认选择。\n许多其他类型的\\gls{hidden_unit}也是可用的。\n决定何时使用哪种类型的\\gls{hidden_unit}是困难的事（尽管\\gls{ReLU}通常是一个可接受的选择）。\n我们这里描述对于每种\\gls{hidden_unit}的一些基本直觉。\n这些直觉可以用来建议我们何时来尝试一些单元。\n通常不可能预先预测出哪种\\gls{hidden_unit}工作得最好。\n设计过程充满了试验和错误，先直觉认为某种\\gls{hidden_unit}可能表现良好，然后用它组成神经网络进行训练，最后用验证集来评估它的性能。\n\n这里列出的一些\\gls{hidden_unit}可能并不是在所有的输入点上都是可微的。\n例如，\\gls{ReLU} $g(z)=\\max\\{0, z\\}$在$z=0$处不可微。\n这似乎使得$g$对于基于梯度的学习算法无效。\n在实践中，梯度下降对这些机器学习模型仍然表现得足够好。\n部分原因是神经网络训练算法通常不会达到代价函数的局部最小值，而是仅仅显著地减小它的值，如\\figref{fig:chap4_approx_opt_color}所示。\n这些想法会在\\chapref{chap:optimization_for_training_deep_models}中进一步描述。\n因为我们不再期望训练能够实际到达梯度为$\\bm{0}$的点，所以代价函数的最小值对应于梯度未定义的点是可以接受的。\n不可微的\\gls{hidden_unit}通常只在少数点上不可微。\n一般来说，函数$g(z)$具有左导数和右导数，左导数定义为紧邻在$z$左边的函数的斜率，右导数定义为紧邻在$z$右边的函数的斜率。\n只有当函数在$z$处的左导数和右导数都有定义并且相等时，函数在$z$点处才是可微的。\n神经网络中用到的函数通常对左导数和右导数都有定义。\n在$g(z)=\\max\\{0,z\\}$的情况下，在$z=0$处的左导数是0，右导数是1。\n神经网络训练的软件实现通常返回左导数或右导数的其中一个，而不是报告导数未定义或产生一个错误。\n这可以通过观察到在数字计算机上基于梯度的优化总是会受到数值误差的影响来启发式地给出理由。\n当一个函数被要求计算$g(0)$时，底层值真正为0 是不太可能的。\n相对的，它可能是被舍入为0的一个小量$\\epsilon$。\n在某些情况下，理论上有更好的理由，但这些通常对神经网络训练并不适用。\n重要的是，在实践中，我们可以放心地忽略下面描述的\\gls{hidden_unit}激活函数的不可微性。\n\n% -- 186 --\n\n除非另有说明，大多数的\\gls{hidden_unit}都可以描述为接受输入向量$\\Vx$，计算仿射变换$\\Vz=\\MW^\\top \\Vx+\\Vb$，然后使用一个逐元素的非线性函数$g(\\Vz)$。\n大多数\\gls{hidden_unit}的区别仅仅在于激活函数$g(\\Vz)$的形式。\n\n\\subsection{\\glsentrytext{ReLU}及其扩展}\n\\label{sec:rectified_linear_units_and_their_generalizations}\n\n\\gls{ReLU}使用激活函数$g(z)=\\max\\{0, z\\}$。\n\n\\gls{ReLU}易于优化，因为它们和线性单元非常类似。\n线性单元和\\gls{ReLU}的唯一区别在于\\gls{ReLU}在其一半的定义域上输出为零。\n这使得只要\\gls{ReLU}处于激活状态，它的导数都能保持较大。\n它的梯度不仅大而且一致。\n整流操作的二阶导数几乎处处为0，并且在\\gls{ReLU}处于激活状态时，它的一阶导数处处为1。\n这意味着相比于引入二阶效应的激活函数来说，它的梯度方向对于学习来说更加有用。\n\n\\gls{ReLU}通常作用于仿射变换之上：\n\\begin{equation}\n\\Vh = g(\\MW^\\top \\Vx + \\Vb).\n\\end{equation}\n当初始化仿射变换的参数时，可以将$\\Vb$的所有元素设置成一个小的正值，例如0.1。\n这使得\\gls{ReLU}很可能初始时就对训练集中的大多数输入呈现激活状态，并且允许导数通过。\n\n有很多\\gls{ReLU}的扩展存在。\n大多数这些扩展的表现比得上\\gls{ReLU}，并且偶尔表现得更好。\n\n\\gls{ReLU}的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为零的样本。\n\\gls{ReLU}的各种扩展保证了它们能在各个位置都接收到梯度。\n\n\\gls{ReLU}的三个扩展基于当$z_i<0$时使用一个非零的斜率$\\alpha_i$：$h_i =g(\\Vz, \\Valpha)_i = \\max(0, z_i) + \\alpha_i \\min(0, z_i)$。\n\\firstgls{absolute_value_rectification}固定$\\alpha_i=-1$来得到$g(z)=|z|$。\n它用于图像中的对象识别\\citep{Jarrett-ICCV2009}，其中寻找在输入照明极性反转下不变的特征是有意义的。\n\\gls{ReLU}的其他扩展比这应用地更广泛。\n\\firstgls{leaky_ReLU}\\citep{Maas-et-al-ICML2013}将$\\alpha_i$固定成一个类似0.01的小值，\\firstgls{PReLU}或者~\\textbf{\\glssymbol{PReLU}}~将$\\alpha_i$作为学习的参数\\citep{He-et-al-arxiv2015}。\n\n% -- 187 --\n\n\\firstgls{maxout_unit}\\citep{Goodfellow_maxout_2013}进一步扩展了\\gls{ReLU}。\n\\gls{maxout_unit}将$\\Vz$划分为每组具有$k$个值的组，而不是使用作用于每个元素的函数$g(z)$。\n每个\\gls{maxout_unit}则输出每组中的最大元素：\n\\begin{equation}\ng(\\Vz)_i = \\underset{j\\in \\SetG^{(i)}}{\\max} z_j\n\\end{equation}\n这里$\\SetG^{(i)}$是组$i$的输入索引集$\\{(i-1)k+1, \\ldots, ik\\}$。\n这提供了一种方法来学习对输入$\\Vx$空间中多个方向响应的分段线性函数。\n\n\\gls{maxout_unit}可以学习具有多达$k$段的分段线性的凸函数。\n\\gls{maxout_unit}因此可以视为\\emph{学习激活函数}本身而不仅仅是单元之间的关系。\n使用足够大的$k$，\\gls{maxout_unit}可以以任意的精确度来近似任何凸函数。\n特别地，具有两块的maxout层可以学习实现和传统层相同的输入$\\Vx$的函数，这些传统层可以使用\\gls{rectified_linear}激活函数、\\gls{absolute_value_rectification}、\\gls{leaky_ReLU} 或\\gls{PReLU}，或者可以学习实现与这些都不同的函数。\nmaxout层的参数化当然也将与这些层不同，所以即使是maxout学习去实现和其他种类的层相同的$\\Vx$的函数这种情况下，学习的机理也是不一样的。\n\n每个~\\gls{maxout_unit}现在由$k$个权重向量来参数化，而不仅仅是一个，所以~\\gls{maxout_unit}通常比\\gls{ReLU}需要更多的正则化。\n如果训练集很大并且每个单元的块数保持很低的话，它们可以在没有正则化的情况下工作得不错\\citep{cai2013deep}。\n\n\\gls{maxout_unit}还有一些其他的优点。\n在某些情况下，要求更少的参数可以获得一些统计和计算上的优点。\n具体来说，如果由$n$个不同的线性过滤器描述的特征可以在不损失信息的情况下，用每一组$k$个特征的最大值来概括的话，那么下一层可以获得$k$倍更少的权重数 。\n\n因为每个单元由多个过滤器驱动，\\gls{maxout_unit}具有一些冗余来帮助它们抵抗一种被称为\\firstgls{catastrophic_forgetting}的现象，这个现象是说神经网络忘记了如何执行它们过去训练的任务\\citep{Goodfellow+al-ICLR2014-small}。\n\n\\gls{ReLU}和它们的这些扩展都是基于一个原则，那就是如果它们的行为更接近线性，那么模型更容易优化。\n使用线性行为更容易优化的一般性原则同样也适用于除深度线性网络以外的情景。\n循环网络可以从序列中学习并产生状态和输出的序列。\n当训练它们时，需要通过一些\\gls{time_step}来传播信息，当其中包含一些线性计算（具有大小接近1的某些方向导数）时，这会更容易。\n作为性能最好的循环网络结构之一，LSTM通过求和在时间上传播信息，这是一种特别直观的线性激活。\n它将在\\secref{sec:the_long_short_term_memory_and_other_gated_rnns}中进一步讨论。\n\n% -- 188 --\n\n\\subsection{\\gls{logistic_sigmoid}与双曲正切函数}\n\\label{sec:logistic_sigmoid_and_hyperbolic_tangent}\n\n在引入\\gls{ReLU}之前，大多数神经网络使用~\\gls{logistic_sigmoid}~激活函数\n\\begin{equation}\ng(z) = \\sigma(z)\n\\end{equation}\n或者是双曲正切激活函数\n\\begin{equation}\ng(z) = \\text{tanh}(z).\n\\end{equation}\n这些激活函数紧密相关，因为$\\text{tanh}(z)=2\\sigma(2z)-1$。\n\n我们已经看过~\\gls{sigmoid}~单元作为输出单元用来预测二值型变量取值为1的概率。\n与分段线性单元不同，\\gls{sigmoid}~单元在其大部分定义域内都饱和——当$z$取绝对值很大的正值时，它们饱和到一个高值，当$z$取绝对值很大的负值时，它们饱和到一个低值，并且仅仅当$z$接近0时它们才对输入强烈敏感。\n\\gls{sigmoid}~单元的广泛饱和性会使得基于梯度的学习变得非常困难。\n因为这个原因，现在不鼓励将它们用作前馈网络中的\\gls{hidden_unit}。\n当使用一个合适的代价函数来抵消~\\gls{sigmoid}~的饱和性时，它们作为输出单元可以与基于梯度的学习相兼容。\n\n当必须要使用~\\gls{sigmoid}~激活函数时，双曲正切激活函数通常要比~\\gls{logistic_sigmoid}~函数表现更好。\n在$\\text{tanh}(0)=0$而$\\sigma(0)=\\frac{1}{2}$的意义上，它更像是单位函数。\n因为$\\text{tanh}$在0附近与单位函数类似，训练深层神经网络$\\hat{y}=\\Vw^\\top \\text{tanh}(\\MU^\\top \\text{tanh}(\\MV^\\top \\Vx))$类似于训练一个线性模型$\\hat{y}= \\Vw^\\top \\MU^\\top \\MV^\\top \\Vx$，只要网络的激活能够被保持地很小。\n这使得训练$\\text{tanh}$网络更加容易。\n\n% -- 189 --\n\n\\gls{sigmoid}~激活函数在除了\\gls{feedforward_network}以外的情景中更为常见。\n循环网络、许多概率模型以及一些\\gls{AE}有一些额外的要求使得它们不能使用分段线性激活函数，并且使得~\\gls{sigmoid}~单元更具有吸引力，尽管它存在饱和性的问题。\n\n\\subsection{其他\\gls{hidden_unit}}\n\\label{sec:other_hidden_units}\n\n也存在许多其他种类的\\gls{hidden_unit}，但它们并不常用。\n\n一般来说，很多种类的可微函数都表现得很好。\n许多未发布的激活函数与流行的激活函数表现得一样好。\n为了提供一个具体的例子，作者在MNIST数据集上使用$\\Vh=\\cos(\\MW\\Vx+\\Vb)$测试了一个\\gls{feedforward_network}，并获得了小于1\\%的误差率，这可以与更为传统的激活函数获得的结果相媲美。\n在新技术的研究和开发期间，通常会测试许多不同的激活函数，并且会发现许多标准方法的变体表现非常好。\n这意味着，通常新的\\gls{hidden_unit}类型只有在被明确证明能够提供显著改进时才会被发布。\n新的\\gls{hidden_unit}类型如果与已有的\\gls{hidden_unit}表现大致相当的话，那么它们是非常常见的，不会引起别人的兴趣。\n\n列出文献中出现的所有\\gls{hidden_unit}类型是不切实际的。\n我们只对一些特别有用和独特的类型进行强调。\n\n其中一种是完全没有激活函数$g(z)$。\n也可以认为这是使用单位函数作为激活函数的情况。\n我们已经看过线性单元可以用作神经网络的输出。\n它也可以用作\\gls{hidden_unit}。\n如果神经网络的每一层都仅由线性变换组成，那么网络作为一个整体也将是线性的。\n然而，神经网络的一些层是纯线性也是可以接受的。\n考虑具有$n$个输入和$p$个输出的神经网络层$\\Vh=g(\\MW^\\top \\Vx+\\Vb)$。\n我们可以用两层来代替它，一层使用权重矩阵$\\MU$，另一层使用权重矩阵$\\MV$。\n如果第一层没有激活函数，那么我们（用$\\MU$和$\\MV$替代$\\MW$）实际上是对基于$\\MW$的原始层的权重矩阵进行了因式分解。\n分解方法是计算$\\Vh=g(\\MV^\\top \\MU^\\top \\Vx+\\Vb)$。\n如果$U$产生了$q$个输出，那么$\\MU$和$V$一起仅包含$(n+p)q$个参数，而$\\MW$包含$np$个参数。\n如果$q$很小，这可以在很大程度上节省参数。\n这是以将线性变换约束为低秩的代价来实现的，但这些低秩关系往往是足够的。\n线性\\gls{hidden_unit}因此提供了一种减少网络中参数数量的有效方法。\n\n% -- 190 --\n\n\nsoftmax单元是另外一种经常用作输出的单元（如\\secref{sec:softmax_units_for_multinoulli_output_distributions}中所描述的），但有时也可以用作\\gls{hidden_unit}。\nsoftmax单元很自然地表示具有$k$个可能值的离散型随机变量的概率分布，所以它们可以用作一种开关。\n这些类型的\\gls{hidden_unit}通常仅用于明确地学习操作内存的高级结构中，将在\\secref{sec:explicit_memory}中描述。\n\n其他一些常见的\\gls{hidden_unit}类型包括：\n\\begin{itemize}\n\\item \\firstall{RBF}：$h_i = \\exp \\left (-\\frac{1}{\\sigma_i^2}|| \\MW_{:,i}-\\Vx||^2 \\right )$。\n这个函数在$\\Vx$接近模板$\\MW_{:,i}$时更加活跃。\n因为它对大部分$\\Vx$都饱和到0，因此很难优化。\n\n\\item \\textbf{\\gls{softplus}}函数：$g(a)=\\zeta(a)=\\log(1+e^a)$。\n这是\\gls{ReLU}的平滑版本，由~\\cite{Dugas01}引入用于函数近似，由~\\cite{Nair-2010-small}引入用于无向概率模型的条件分布。\n\\cite{Glorot+al-AI-2011-small}比较了softplus和\\gls{ReLU}，发现后者的结果更好。\n通常不鼓励使用~\\gls{softplus_function}。\nsoftplus表明\\gls{hidden_unit}类型的性能可能是非常反直觉的——因为它处处可导或者因为它不完全饱和，人们可能希望它具有优于\\gls{ReLU}的点，但根据经验来看，它并没有。\n\n\\item \\firstgls{hard_tanh}：它的形状和$\\text{tanh}$以及\\gls{ReLU}类似，但是不同于后者，它是有界的，$g(a)=\\max(-1, \\min(1,a))$。\n它由~\\cite{Collobert04}引入。\n\\end{itemize}\n\n\\gls{hidden_unit}的设计仍然是一个活跃的研究领域，许多有用的\\gls{hidden_unit}类型仍有待发现。\n\n\\section{架构设计}\n\\label{sec:architecture_design}\n\n神经网络设计的另一个关键点是确定它的架构。\n\\firstgls{architecture}一词是指网络的整体结构：它应该具有多少单元，以及这些单元应该如何连接。\n\n% -- 191 --\n\n大多数神经网络被组织成称为层的单元组。\n大多数神经网络架构将这些层布置成链式结构，其中每一层都是前一层的函数。\n在这种结构中，第一层由下式给出：\n\\begin{equation}\n\\Vh^{(1)}= g^{(1)}\\left ( \\MW^{(1)\\top} \\Vx + \\Vb^{(1)}\\right );\n\\end{equation}\n第二层由\n\\begin{equation}\n\\Vh^{(2)} = g^{(2)}\\left ( \\MW^{(2)\\top}\\Vh^{(1)}+\\Vb^{(2)} \\right );\n\\end{equation}\n给出，以此类推。\n\n在这些链式架构中，主要的架构考虑是选择网络的深度和每一层的宽度。\n我们将会看到，即使只有一个\\gls{hidden_layer}的网络也足够适应训练集。\n更深层的网络通常能够对每一层使用更少的单元数和更少的参数，并且经常容易泛化到测试集，但是通常也更难以优化。\n对于一个具体的任务，理想的网络架构必须通过实验，观测在验证集上的误差来找到。\n\n\\subsection{万能近似性质和深度}\n\\label{sec:universal_approximation_properties_and_depth}\n\n线性模型，通过矩阵乘法将特征映射到输出，顾名思义，仅能表示线性函数。\n它具有易于训练的优点，因为当使用线性模型时，许多损失函数会导出凸优化问题。\n可惜的是，我们经常希望我们的系统学习非线性函数。\n\n乍一看，我们可能认为学习非线性函数需要为我们想要学习的那种非线性专门设计一类模型族。\n幸运的是，具有\\gls{hidden_layer}的\\gls{feedforward_network}提供了一种万能近似框架。\n具体来说，\\firstgls{universal_approximation_theorem}\\citep{Hornik89,Cybenko89}表明，一个\\gls{feedforward_neural_network}如果具有线性输出层和至少一层具有任何一种``挤压''性质的激活函数（例如\\gls{logistic_sigmoid}激活函数）的\\gls{hidden_layer}，只要给予网络足够数量的\\gls{hidden_unit}，它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。\n\\gls{feedforward_network}的导数也可以任意好地来近似函数的导数\\citep{hornik1990universal}。\nBorel可测的概念超出了本书的范畴；对于我们想要实现的目标，只需要知道定义在$\\SetR^n$的有界闭集上的任意连续函数是Borel可测的，因此可以用神经网络来近似。\n神经网络也可以近似从任何有限维离散空间映射到另一个的任意函数。\n虽然原始定理最初以具有特殊激活函数的单元的形式来描述，这个激活函数当变量取绝对值非常大的正值和负值时都会饱和，\\gls{universal_approximation_theorem}也已经被证明对于更广泛类别的激活函数也是适用的，其中就包括现在常用的\\gls{ReLU}~\\citep{Leshno-et-al-1993}。\n\n% -- 192 --\n\n\\gls{universal_approximation_theorem}意味着无论我们试图学习什么函数，我们知道一个大的MLP一定能够\\emph{表示}这个函数。\n然而，我们不能保证训练算法能够\\emph{学得}这个函数。\n即使MLP能够表示该函数，学习也可能因两个不同的原因而失败。\n首先，用于训练的优化算法可能找不到用于期望函数的参数值。\n其次，训练算法可能由于过拟合而选择了错误的函数。\n回忆\\secref{sec:the_no_free_lunch_theorem}中的``没有免费的午餐''定理，说明了没有普遍优越的机器学习算法。\n\\gls{feedforward_network}提供了表示函数的万能系统，在这种意义上，给定一个函数，存在一个\\gls{feedforward_network}能够近似该函数。\n不存在万能的过程能够通过检查训练集上的样本，来找到一个能对训练集上没有的点也适用的函数。\n\n\\gls{universal_approximation_theorem}说明了，存在一个足够大的网络能够达到我们所希望的任意精度，但是定理并没有说这个网络有多大。\n\\cite{Barron93}提供了单层网络近似一大类函数所需大小的一些界。\n不幸的是，在最坏情况下，可能需要指数数量的\\gls{hidden_unit}（可能一个\\gls{hidden_unit}对应着一个需要区分的输入配置）。\n这在二进制值的情况下很容易看到：向量$\\Vv \\in \\{0,1\\}^n$上的可能的二值型函数的数量是$2^{2^n}$，并且选择一个这样的函数需要$2^n$位，这通常需要$O(2^n)$的自由度。\n\n总之，具有单层的\\gls{feedforward_network}足以表示任何函数，但是网络层可能大得不可实现，并且可能无法正确地学习和\\gls{generalization}。\n在很多情况下，使用更深的模型能够减少表示期望函数所需的单元的数量，并且可以减少\\gls{generalization}误差。\n\n% -- 193 --\n\n存在一些函数族能够被深度大于某个值$d$的网络高效地近似，而当深度被限制到小于或等于$d$时需要一个远远大于之前的模型。\n在很多情况下，浅层模型所需的\\gls{hidden_unit}的数量是$n$的指数级。\n这个结果最初是在那些不与连续可微的神经网络类似的机器学习模型中被证明，但现在已经扩展到了这些模型。\n第一个结果是关于逻辑门电路的\\citep{Hastad86}。\n后来的工作将这些结果扩展到了具有非负权重的线性阈值单元\\citep{Hastad91,Hajnal-et-al-1993}，然后扩展到了具有连续值激活的网络\\citep{Maass-1992,Maass-et-al-1994}。\n许多现代神经网络使用\\gls{ReLU}。\n\\cite{Leshno-et-al-1993}证明带有一大类非多项式激活函数族的浅层网络，包括\\gls{ReLU}，具有万能的近似性质，但是这些结果并没有强调深度或效率的问题——它们仅指出足够宽的\\gls{rectifier_network}能够表示任意函数。\n\\cite{Montufar-et-al-NIPS2014}指出一些用深度\\gls{rectifier_network}表示的函数可能需要浅层网络（一个\\gls{hidden_layer}）指数级的\\gls{hidden_unit}才能表示。\n更确切的说，他们说明分段线性网络（可以通过整流非线性或~\\gls{maxout_unit}获得）可以表示区域的数量是网络深度的指数级的函数。%这里为什么是非线性？\n\\figref{fig:chap6_space_folding}解释了带有\\gls{absolute_value_rectification}的网络是如何创建函数的镜像图像的，这些函数在某些\\gls{hidden_unit}的顶部计算，作用于\\gls{hidden_unit}的输入。\n每个\\gls{hidden_unit}指定在哪里折叠输入空间，来创造镜像响应（在绝对值非线性的两侧）。\n通过组合这些折叠操作，我们获得指数级的分段线性区域，他们可以概括所有种类的规则模式（例如，重复）。\n% fig 6.5\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=\\textwidth]{Chapter6/figures/space_folding.jpg}}\n\\fi\n\\caption{ % This is a screenshot.\n关于更深的整流网络具有指数优势的一个直观的几何解释，来自~\\cite{Montufar-et-al-NIPS2014}。 \n\\emph{(左)}\\gls{absolute_value_rectification}单元对其输入中的每对镜像点有相同的输出。\n镜像的对称轴由单元的权重和偏置定义的超平面给出。 在该单元顶部计算的函数（绿色决策面）将是横跨该对称轴的更简单模式的一个镜像。 \n\\emph{(中)}该函数可以通过折叠对称轴周围的空间来得到。\n\\emph{(右)}另一个重复模式可以在第一个的顶部折叠（由另一个下游单元）以获得另外的对称性（现在重复四次，使用了两个\\gls{hidden_layer}）。 \n经~\\cite{Montufar-et-al-NIPS2014}许可改编此图。}\n\\label{fig:chap6_space_folding}\n\\end{figure}\n\n\n\\cite{Montufar-et-al-NIPS2014}的主要定理指出，具有$d$个输入、深度为$l$、每个\\gls{hidden_layer}具有$n$个单元的深度\\gls{rectifier_network}可以描述的线性区域的数量是\n\\begin{equation}\nO \\left ( {n \\choose d}^{d(l-1)} n^d \\right ),\n\\end{equation}\n意味着，这是深度$l$的指数级。\n在每个单元具有$k$个过滤器的maxout网络中，线性区域的数量是\n\\begin{equation}\nO \\left ( k^{(l-1)+d} \\right ).\n\\end{equation}\n\n% -- 194 --\n\n当然，我们不能保证在机器学习（特别是AI）的应用中我们想要学得的函数类型享有这样的属性。\n\n我们还可能出于统计原因来选择深度模型。\n任何时候，当我们选择一个特定的机器学习算法时，我们隐含地陈述了一些先验，这些先验是关于算法应该学得什么样的函数的。\n选择深度模型默许了一个非常普遍的信念，那就是我们想要学得的函数应该涉及几个更加简单的函数的组合。\n这可以从表示学习的观点来解释， 我们相信学习的问题包含发现一组潜在的\\gls{factors_of_variation}，它们可以根据其他更简单的潜在的\\gls{factors_of_variation}来描述。\n或者，我们可以将深度结构的使用解释为另一种信念，那就是我们想要学得的函数是包含多个步骤的计算机程序，其中每个步骤使用前一步骤的输出。\n这些中间输出不一定是\\gls{factors_of_variation}，而是可以类似于网络用来组织其内部处理的计数器或指针。\n根据经验，更深的模型似乎确实在广泛的任务中泛化得更好\\citep{Bengio-NIPS2007,Erhan2009,Bengio-2009-book,UTLC+LISA-2011-small,Ciresan-et-al-2012,Krizhevsky-2012-small,sermanet-cvpr-13,Farabet-et-al-2013,couprie-iclr-13,LISA-EmotiW2013,Goodfellow+et+al-ICLR2014a,Szegedy-et-al-arxiv2014}。\n\\figref{fig:chap6_depth_color}和\\figref{fig:chap6_model_size_color}展示了一些实验结果的例子。\n这表明使用深层架构确实在模型学习的函数空间上表示了一个有用的先验。\n% fig 6.6\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/depth_color}}\n\\fi\n\\caption{深度的影响。\n实验结果表明，当从地址照片转录多位数字时，更深层的网络能够更好地\\gls{generalization}。\n数据来自~\\cite{Goodfellow+et+al-ICLR2014a}。\n测试集上的准确率随着深度的增加而不断增加。\n\\figref{fig:chap6_model_size_color}给出了一个对照实验，它说明了对模型尺寸其他方面的增加并不能产生相同的效果。}\n\\label{fig:chap6_depth_color}\n\\end{figure}\n\n% fig 6.7\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/model_size_color}}\n\\fi\n\\caption{参数数量的影响。\n更深的模型往往表现更好。\n这不仅仅是因为模型更大。\n\\cite{Goodfellow+et+al-ICLR2014a}的这项实验表明，增加\\gls{convolutional_network}层中参数的数量，但是不增加它们的深度，在提升测试集性能方面没有同样显著的效果，如此图所示。\n图例标明了每条曲线对应的网络深度，以及曲线表示的是卷积层还是全连接层的大小变化。\n我们可以观察到，在这种情况下，浅层模型在参数数量达到2000万时就过拟合，而深层模型在参数数量超过6000万时仍然表现良好。\n这表明，使用深层模型表达出了对模型可以学习的函数空间的有用偏好。\n具体来说，它表达了一种信念，即该函数应该由许多更简单的函数复合在一起而得到。\n这可能导致学习由更简单的表示所组成的表示（例如，由边所定义的角）或者学习具有顺序依赖步骤的程序（例如，首先定位一组对象，然后分割它们，之后识别它们）。}\n\\label{fig:chap6_model_size_color}\n\\end{figure}\n\n\\subsection{其他架构上的考虑}\n\\label{sec:other_architectural_considerations}\n\n目前为止，我们都将神经网络描述成层的简单链式结构，主要的考虑因素是网络的深度和每层的宽度。\n在实践中，神经网络显示出相当的多样性。\n\n许多神经网络架构已经被开发用于特定的任务。\n用于计算机视觉的卷积神经网络的特殊架构将在\\chapref{chap:convolutional_networks}中介绍。\n\\gls{feedforward_network}也可以推广到用于序列处理的循环神经网络，但有它们自己的架构考虑，将在\\chapref{chap:sequence_modeling_recurrent_and_recursive_nets}中介绍。\n\n% -- 195 --\n\n一般的，层并不一定都需要连接在一条链中，尽管这是最常见的做法。\n许多架构构建了一个主链，但随后又添加了额外的架构特性，例如从层$i$到层$i+2$或者更高层的跳跃连接。\n这些跳跃连接使得梯度更容易从输出层流向更接近输入的层。\n\n架构设计考虑的另外一个关键点是如何将层与层之间连接起来。\n默认的神经网络层采用矩阵$\\MW$描述的线性变换，每个输入单元连接到每个输出单元。\n在之后章节中的许多专用网络具有较少的连接，使得输入层中的每个单元仅连接到输出层单元的一个小子集。\n这些用于减少连接数量的策略减少了参数的数量以及用于评估网络的计算量，但通常高度依赖于问题。\n例如，\\chapref{chap:convolutional_networks}描述的卷积神经网络使用对于计算机视觉问题非常有效的稀疏连接的专用模式。\n在这一章中，很难对通用神经网络的架构给出更多具体的建议。\n我们在随后的章节中介绍一些特殊的架构策略，可以在不同的领域工作良好。\n\n% -- 196 --\n\n\\section{\\glsentrytext{BP}和其他的微分算法}\n\\label{sec:back_propagation_and_other_differentiation_algorithms}\n\n当我们使用\\gls{feedforward_neural_network}接收输入$\\Vx$并产生输出$\\hat{\\Vy}$时，信息通过网络向前流动。\n输入$\\Vx$提供初始信息，然后传播到每一层的\\gls{hidden_unit}，最终产生输出$\\hat{\\Vy}$。\n这称之为~\\firstgls{forward_propagation}。\n在训练过程中，前向传播可以持续向前直到它产生一个标量代价函数$J(\\Vtheta)$。\n\\firstgls{back_propagation}算法\\citep{RHW}，经常简称为\\textbf{\\glsdesc{BP}}，允许来自代价函数的信息通过网络向后流动，以便计算梯度。\n\n% -- 197 --\n\n计算梯度的解析表达式是很直观的，但是数值化地求解这样的表达式在计算上的代价可能很大。\n反向传播算法使用简单和廉价的程序来实现这个目标。\n\n反向传播这个术语经常被误解为用于多层神经网络的整个学习算法。\n实际上，反向传播仅指用于计算梯度的方法，而另一种算法，例如随机梯度下降，使用该梯度来进行学习。\n此外，反向传播经常被误解为仅适用于多层神经网络，但是原则上它可以计算任何函数的导数（对于一些函数，正确的响应是报告函数的导数是未定义的）。\n特别地，我们会描述如何计算一个任意函数$f$的梯度$\\nabla_{\\Vx} f(\\Vx, \\Vy)$，其中$\\Vx$是一组变量，我们需要它们的导数，而$\\Vy$是函数的另外一组输入变量，但我们并不需要它们的导数。\n在学习算法中，我们最常需要的梯度是代价函数关于参数的梯度，即$\\nabla_{\\Vtheta} J(\\Vtheta)$。\n许多机器学习任务需要计算其他导数，来作为学习过程的一部分，或者用来分析学得的模型。\n反向传播算法也适用于这些任务，不局限于计算代价函数关于参数的梯度。\n通过在网络中传播信息来计算导数的想法非常普遍，它还可以用于计算诸如多输出函数$f$的~\\gls{jacobian}~的值。\n我们这里描述的是最常用的情况，其中$f$只有单个输出。\n\n\\subsection{计算图}\n\\label{sec:computational_graphs}\n\n目前为止，我们已经用相对非正式的图形语言讨论了神经网络。\n为了更精确地描述反向传播算法，使用更精确的\\firstgls{computational_graph}语言是很有帮助的。\n\n将计算形式化为图形的方法有很多。\n\n这里，我们使用图中的每一个节点来表示一个变量。\n变量可以是标量、向量、矩阵、张量、或者甚至是另一类型的变量。\n\n为了形式化我们的图形，我们还需引入\\firstgls{operation}这一概念。\n操作是指一个或多个变量的简单函数。\n我们的图形语言伴随着一组被允许的操作。\n我们可以通过将多个操作复合在一起来描述更为复杂的函数。\n\n% -- 198 --\n\n不失一般性，我们定义一个操作仅返回单个输出变量。\n这并没有失去一般性，是因为输出变量可以有多个条目，例如向量。\n反向传播的软件实现通常支持具有多个输出的操作，但是我们在描述中避免这种情况，因为它引入了对概念理解不重要的许多额外细节。\n\n如果变量$y$是变量$x$通过一个操作计算得到的，那么我们画一条从$x$到$y$的有向边。\n我们有时用操作的名称来注释输出的节点，当上下文很明确时，有时也会省略这个标注。\n\n计算图的实例可以参考\\figref{fig:chap6_computational_graph}。\n% fig 6.8\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/computational_graph}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{一些计算图的示例。\n\\emph{(a)}使用$\\times$操作计算$z = xy$的图。 \n\\emph{(b)}用于\\gls{logistic_regression}预测$\\hat{y} = \\sigma(\\Vx^\\top \\Vw + b)$的图。 一些中间表达式在代数表达式中没有名称，但在图形中却需要。\n我们简单地将第$i$个这样的变量命名为$\\Vu^{(i)}$。\n\\emph{(c)}表达式$\\MH = \\max \\{ 0, \\MX\\MW+ \\Vb \\}$的计算图，在给定包含小批量输入数据的设计矩阵$\\MX$时，它计算\\gls{ReLU}激活的设计矩阵$\\MH$。\n\\emph{(d)}示例a-c对每个变量最多只实施一个操作，但是对变量实施多个操作也是可能的。 这里我们展示一个计算图，它对线性回归模型的权重$\\Vw$实施多个操作。\n这个权重不仅用于预测$\\hat{y}$，也用于权重衰减罚项$\\lambda \\sum_i w_i^2$。}\n\\label{fig:chap6_computational_graph}\n\\end{figure}\n\n\\subsection{微积分中的链式法则}\n\\label{sec:chain_rule_of_calculus}\n\n微积分中的链式法则（为了不与概率中的链式法则相混淆）用于计算复合函数的导数。\n反向传播是一种计算链式法则的算法，使用高效的特定运算顺序。\n\n设$x$是实数，$f$和$g$是从实数映射到实数的函数。\n假设$y=g(x)$并且$z=f(g(x))=f(y)$。\n那么链式法则是说\n\\begin{equation}\n\\frac{dz}{dx}=\\frac{dz}{dy} \\frac{dy}{dx}.\n\\label{eq:6.44}\n\\end{equation}\n\n我们可以将这种标量情况进行扩展。\n假设$\\Vx\\in \\SetR^m, \\Vy\\in \\SetR^n$，$g$是从$\\SetR^m$到$\\SetR^n$的映射，$f$是从$\\SetR^n$到$\\SetR$的映射。\n如果$\\Vy=g(\\Vx)$并且$z=f(\\Vy)$，那么\n\\begin{equation}\n\\frac{\\partial z}{\\partial x_i} = \\sum_j \\frac{\\partial z}{\\partial y_j} \\frac{\\partial y_j}{\\partial x_i}.\n\\end{equation}\n使用向量记法，可以等价地写成\n\\begin{equation}\n\\nabla_{\\Vx}z = \\left ( \\frac{\\partial \\Vy}{\\partial \\Vx} \\right )^\\top \\nabla_{\\Vy} z,\n\\end{equation}\n这里$\\frac{\\partial \\Vy}{\\partial \\Vx}$是$g$的$n\\times m$的~\\gls{jacobian_matrix}。\n\n从这里我们看到，变量$\\Vx$的梯度可以通过~\\gls{jacobian_matrix}$\\frac{\\partial \\Vy}{\\partial \\Vx}$和梯度$\\nabla_{\\Vy} z$相乘来得到。\n反向传播算法由图中每一个这样的~\\gls{jacobian}~梯度的乘积操作所组成。\n\n% -- 199 --\n\n通常我们将反向传播算法应用于任意维度的张量，而不仅仅用于向量。\n从概念上讲，这与使用向量的反向传播完全相同。 \n唯一的区别是如何将数字排列成网格以形成张量。 \n我们可以想象，在我们运行反向传播之前，将每个张量变平为一个向量，计算一个向量值梯度，然后将该梯度重新构造成一个张量。\n从这种重新排列的观点上看，反向传播仍然只是将~\\gls{jacobian}~乘以梯度。\n\n% -- 200 --\n\n为了表示值$z$关于张量$\\TSX$的梯度，我们记为$\\nabla_\\TSX z$，就像$\\TSX$是向量一样。\n$\\TSX$的索引现在有多个坐标——例如，一个3维的张量由三个坐标索引。\n我们可以通过使用单个变量$i$来表示完整的索引元组，从而完全抽象出来。\n对所有可能的元组$i$，$(\\nabla_\\TSX z)_i$给出$\\frac{\\partial z}{\\partial \\TEX_i}$。\n这与向量中索引的方式完全一致，$(\\nabla_{\\Vx} z)_i$给出$\\frac{\\partial z}{\\partial x_i}$。\n使用这种记法，我们可以写出适用于张量的链式法则。\n如果$\\TSY=g(\\TSX)$并且$z=f(\\TSY)$，那么\n\\begin{equation}\n  \\nabla_\\TSX z = \\sum_j (\\nabla_\\TSX \\TEY_j)\\frac{\\partial z}{\\partial \\TEY_j}.\n  \\label{eq:6.47}\n\\end{equation}\n\n\\subsection{递归地使用链式法则来实现\\glsentrytext{BP}}\n\\label{sec:recursively_applying_the_chain_rule_to_obtain_backprop}\n\n使用链式规则，我们可以直接写出某个标量关于计算图中任何产生该标量的节点的梯度的代数表达式。\n然而，实际在计算机中计算该表达式时会引入一些额外的考虑。\n\n具体来说，许多子表达式可能在梯度的整个表达式中重复若干次。\n任何计算梯度的程序都需要选择是存储这些子表达式还是重新计算它们几次。\n\\figref{fig:chap6_repeated_subexpression}给出了一个例子来说明这些重复的子表达式是如何出现的。\n在某些情况下，计算两次相同的子表达式纯粹是浪费。\n在复杂图中，可能存在指数多的这种计算上的浪费，使得简单的链式法则不可实现。\n在其他情况下，计算两次相同的子表达式可能是以较高的运行时间为代价来减少内存开销的有效手段。\n\n我们首先给出一个版本的反向传播算法，它指明了梯度的直接计算方式（\\algref{alg:bprop}以及相关的正向计算的\\algref{alg:fprop}），按照它实际完成的顺序并且递归地使用链式法则。\n我们可以直接执行这些计算或者将算法的描述视为用于计算反向传播的计算图的符号表示。\n然而，这些公式并没有明确地操作和构造用于计算梯度的符号图。\n这些公式将在后面的\\secref{sec:general_back_propagation}和\\algref{alg:backprop}中给出，其中我们还推广到了包含任意张量的节点。\n\n首先考虑描述如何计算单个标量$u^{(n)}$（例如训练样本上的损失函数）的计算图。\n我们想要计算这个标量对$n_i$个输入节点$u^{(1)}$到$u^{(n_i)}$的梯度。\n换句话说，我们希望对所有的$i\\in\\{1,2,\\ldots,n_i\\}$计算$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$。\n在使用反向传播计算梯度来实现参数的梯度下降时，$u^{(n)}$将对应单个或者小批量实例的代价函数，而$u^{(1)}$到$u^{(n_i)}$则对应于模型的参数。\n\n% -- 201 --\n\n我们假设图的节点已经以一种特殊的方式被排序，使得我们可以一个接一个地计算他们的输出，从$u^{(n_i+1)}$开始，一直上升到$u^{(n)}$。\n如\\algref{alg:fprop}中所定义的，每个节点$u^{(i)}$与操作$f^{(i)}$相关联，并且通过对以下函数求值来得到\n\\begin{equation}\n  u^{(i)} = f(\\SetA^{(i)}),\n\\end{equation}\n其中$\\SetA^{(i)}$是$u^{(i)}$所有父节点的集合。\n% alg 6.1\n\\begin{algorithm}[htbp]\n\\caption{计算将$n_i$个输入$u^{(1)}$到$u^{(n_i)}$映射到一个输出$u^{(n)}$的程序。\n这定义了一个计算图，其中每个节点通过将函数$f^{(i)}$应用到变量集合$\\SetA^{(i)}$上来计算$u^{(i)}$的值，$\\SetA^{(i)}$包含先前节点$u^{(j)}$的值满足$j<i$且$j \\in Pa(u^{(i)})$。\n计算图的输入是向量$\\Vx$，并且被分配给前$n_i$个节点$u^{(1)}$到$u^{(n_i)}$。计算图的输出可以从最后一个（输出）节点$u^{(n)}$读出。}\n\\label{alg:fprop}\n\\begin{algorithmic}\n\\FOR {$i=1, \\ldots, n_i$}\n \\STATE $u^{(i)} \\leftarrow x_i$\n\\ENDFOR\n\\FOR {$i=n_i+1, \\ldots, n$}\n \\STATE $\\SetA^{(i)} \\leftarrow \\{ u^{(j)} \\mid j \\in Pa(u^{(i)}) \\}$\n \\STATE $u^{(i)} \\leftarrow f^{(i)}(\\SetA^{(i)})$\n\\ENDFOR\n\\STATE {\\bf return} $u^{(n)}$\n\\end{algorithmic}\n\\end{algorithm}\n\n% -- 202 --\n\n该算法详细说明了前向传播的计算，我们可以将其放入图$\\CalG$中。\n为了执行反向传播，我们可以构造一个依赖于$\\CalG$并添加额外一组节点的计算图。\n这形成了一个子图$\\CalB$，它的每个节点都是$\\CalG$的节点。\n$\\CalB$中的计算和$\\CalG$中的计算顺序完全相反，而且$\\CalB$中的每个节点计算导数$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$与前向图中的节点$u^{(i)}$相关联。\n这通过对标量输出$u^{(n)}$使用链式法则来完成：\n\\begin{equation}\n  \\frac{\\partial u^{(n)}}{\\partial u^{(j)}} = \\sum_{i:j \\in Pa(u^{(i)})} \\frac{\\partial u^{(n)} }{ \\partial u^{(i)} } \\frac{ \\partial u^{(i)} }{ \\partial u^{(j)} }\n  \\label{eq:6.49}\n\\end{equation}\n这在\\algref{alg:bprop}中详细说明。\n子图$\\CalB$恰好包含每一条对应着$\\CalG$中从节点$u^{(j)}$到节点$u^{(i)}$的边。\n从$u^{(j)}$到$u^{(i)}$的边对应着计算$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$。\n另外，对于每个节点都要执行一个内积，内积的一个因子是对于$u^{j}$子节点$u^{(i)}$的已经计算的梯度，另一个因子是对于相同子节点$u^{(i)}$ 的偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$组成的向量。\n总而言之，执行反向传播所需的计算量与$\\CalG$中的边的数量成比例，其中每条边的计算包括计算偏导数（节点关于它的一个父节点的偏导数）以及执行一次乘法和一次加法。\n下面，我们将此分析推广到张量值节点，这只是在同一节点中对多个标量值进行分组并能够更高效地实现。\n% fig 6.9\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/repeated_subexpression}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{\n计算梯度时导致重复子表达式的计算图。\n令$w \\in \\SetR$为图的输入。\n我们对链中的每一步使用相同的操作函数$f: \\SetR \\to \\SetR$，这样$x=f(w), y=f(x), z=f(y)$。\n为了计算$\\frac{\\partial z}{\\partial w}$，我们应用\\eqnref{eq:6.44}得到：\n\\begin{align}\n& \\frac{\\partial z}{\\partial w}\\\\\n=& \\frac{\\partial z}{\\partial y} \\frac{\\partial y}{\\partial x} \\frac{\\partial x}{\\partial w}\\\\\n\\label{eq:6.52}\n=& f'(y)f'(x)f'(w)\\\\ \n\\label{eq:6.53}\n=& f'(f(f(w))) f'(f(w)) f'(w). \n\\end{align}\n\\eqnref{eq:6.52}建议我们采用的实现方式是，仅计算$f(w)$的值一次并将它存储在变量$x$中。\n这是\\gls{BP}算法所采用的方法。\n\\eqnref{eq:6.53}提出了一种替代方法，其中子表达式$f(w)$出现了不止一次。\n在替代方法中，每次只在需要时重新计算$f(w)$。\n当存储这些表达式的值所需的存储较少时，\\eqnref{eq:6.52}的\\gls{BP}方法显然是较优的，因为它减少了运行时间。\n然而，\\eqnref{eq:6.53}也是链式法则的有效实现，并且当存储受限时它是有用的。}\n\\label{fig:chap6_repeated_subexpression}\n\\end{figure}\n\n% -- 203 --\n\n反向传播算法被设计为减少公共子表达式的数量而不考虑存储的开销。\n具体来说，它大约对图中的每个节点执行一个~\\gls{jacobian}~乘积。\n这可以从\\algref{alg:bprop}中看出，反向传播算法访问了图中的节点$u^{(j)}$到节点$u^{(i)}$的每条边一次，以获得相关的偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$。\n反向传播因此避免了重复子表达式的指数爆炸。\n然而，其他算法可能通过对计算图进行简化来避免更多的子表达式，或者也可能通过重新计算而不是存储这些子表达式来节省内存。\n我们将在描述完反向传播算法本身后再重新审视这些想法。\n% alg 6.2\n\\begin{algorithm}[htb!]\n\\caption{\\gls{BP}算法的简化版本，用于计算$u^{(n)}$关于图中变量的导数。\n这个示例旨在通过演示所有变量都是标量的简化情况来进一步理解\\gls{BP}算法，这里我们希望计算关于$u^{(1)},\\ldots,u^{(n_i)}$的导数。\n这个简化版本计算了关于图中所有节点的导数。\n假定与每条边相关联的偏导数计算需要恒定的时间的话，该算法的计算成本与图中边的数量成比例。\n这与\\gls{forward_propagation}的计算次数具有相同的阶。\n每个$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$是$u^{(i)}$的父节点$u^{(j)}$的函数，从而将前向图的节点链接到\\gls{BP}图中添加的节点。}\n\\label{alg:bprop}\n\\begin{algorithmic}\n\\STATE 运行前向传播 (对于此例是\\algref{alg:fprop}) 获得网络的激活。\n\\STATE 初始化 {\\tt grad\\_table}，用于存储计算好的导数的数据结构。 ${\\tt grad\\_table}[u^{(i)}]$将存储$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$计算好的值。\n\\STATE ${\\tt grad\\_table}[u^{(n)}] \\leftarrow 1$\n\\FOR {$j=n-1$ down to 1}\n\\STATE 下一行使用存储的值计算 $\\frac{\\partial u^{(n)}}{\\partial u^{(j)}} =\n  \\sum_{i: j \\in Pa(u^{(i)})} \\frac{\\partial u^{(n)}}{\\partial u^{(i)}} \\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$：\n\\STATE ${\\tt grad\\_table}[ u^{(j)}] \\leftarrow \n\\sum_{i: j \\in Pa(u^{(i)})} {\\tt grad\\_table}[u^{(i)}]\n\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$\n\\ENDFOR\n\\STATE {\\bf return} $\\{ {\\tt grad\\_table}[ u^{(i)}] \\mid i=1, \\dots, n_i \\} $\n\\end{algorithmic}\n\\end{algorithm}\n\n\n% -- 204 --\n\n\\subsection{全连接MLP中的\\glsentrytext{BP}计算}\n\\label{sec:back_propagation_computation_in_fully_connected_mlp}\n\n为了阐明反向传播的上述定义，让我们考虑一个与全连接的多层MLP相关联的特定图。\n\n\\algref{alg:mlp-fprop}首先给出了前向传播，它将参数映射到与单个训练样本（输入，目标）$(\\Vx,\\Vy)$相关联的监督损失函数$L(\\hat{\\Vy}, \\Vy)$，其中$\\hat{\\Vy}$是当$\\Vx$提供输入时神经网络的输出。\n% alg 6.3\n\\begin{algorithm}[ht]\n\\caption{典型深度神经网络中的\\gls{forward_propagation}和代价函数的计算。\n损失函数$L(\\hat{\\Vy}, \\Vy)$取决于输出$\\hat{\\Vy}$和目标$\\Vy$（参考\\secref{sec:learning_conditional_distributions_with_maximum_likelihood}中损失函数的示例）。\n为了获得总代价$J$，损失函数可以加上正则项$\\Omega(\\theta)$，其中$\\theta$包含所有参数（权重和偏置）。\n\\algref{alg:mlp-bprop}说明了如何计算$J$关于参数$\\MW$和$\\Vb$的梯度。 为简单起见，该演示仅使用单个输入样本$\\Vx$。\n实际应用应该使用\\gls{minibatch}。\n请参考\\secref{sec:example_back_propagation_for_mlp_training}以获得更加真实的演示。}\n\\label{alg:mlp-fprop}\n\\begin{algorithmic}\n\\REQUIRE 网络深度， $l$\n\\REQUIRE $\\MW^{(i)}, i \\in \\{ 1, \\dots, l\\}$， 模型的权重矩阵\n\\REQUIRE $\\Vb^{(i)}, i \\in \\{ 1, \\dots, l\\}$， 模型的偏置参数\n\\REQUIRE $\\Vx$，程序的输入\n\\REQUIRE $\\Vy$，目标输出\n\\STATE $\\Vh^{(0)}=\\Vx$\n\\FOR {$k=1, \\ldots, l$}\n \\STATE $\\Va^{(k)} = \\Vb^{(k)} + \\MW^{(k)} \\Vh^{(k-1)}$\n \\STATE $\\Vh^{(k)} = f(\\Va^{(k)})$\n\\ENDFOR\n\\STATE $\\hat{\\Vy} = \\Vh^{(l)}$\n\\STATE $J = L(\\hat{\\Vy},\\Vy) + \\lambda \\Omega(\\theta)$\n\\end{algorithmic}\n\\end{algorithm}\n\n\\algref{alg:mlp-bprop}随后说明了将反向传播应用于该图所需的相关计算。\n% alg 6.4\n\\begin{algorithm}[htbp]\n\\caption{深度神经网络中\\algref{alg:mlp-fprop}的反向计算，它不止使用了输入$\\Vx $和目标$\\Vy$。\n该计算对于每一层$k$都产生了对激活$\\Va^{(k)}$的梯度，从输出层开始向后计算一直到第一个\\gls{hidden_layer}。\n这些梯度可以看作是对每层的输出应如何调整以减小误差的指导，根据这些梯度可以获得对每层参数的梯度。\n权重和偏置上的梯度可以立即用作随机梯度更新的一部分（梯度算出后即可执行更新），或者与其他基于梯度的优化方法一起使用。\n}\n\\label{alg:mlp-bprop}\n\\begin{algorithmic}\n\\STATE 在前向计算完成后，计算顶层的梯度：\n\\STATE $\\Vg \\leftarrow \\nabla_{\\hat{\\Vy}} J = \\nabla_{\\hat{\\Vy}} L(\\hat{\\Vy},\\Vy)$\n\\FOR {$k=l, l-1, \\dots, 1$}\n\\STATE 将关于层输出的梯度转换为非线性激活输入前的梯度（如果 $f$ 是逐元素的，则逐元素地相乘）：\n  \\STATE $\\Vg \\leftarrow \\nabla_{\\Va^{(k)}} J = \\Vg \\odot f'(\\Va^{(k)})$\n  \\STATE 计算关于权重和偏置的梯度（如果需要的话，还要包括正则项）：\n  \\STATE $\\nabla_{\\Vb^{(k)}} J = \\Vg + \\lambda \\nabla_{\\Vb^{(k)}} \\Omega(\\theta)$\n  \\STATE $\\nabla_{\\MW^{(k)}} J = \\Vg \\; \\Vh^{(k-1)\\top} + \\lambda \\nabla_{\\MW^{(k)}} \\Omega(\\theta)$\n  \\STATE 关于下一更低层的\\gls{hidden_layer}传播梯度：\n  \\STATE $\\Vg \\leftarrow \\nabla_{\\Vh^{(k-1)}} J = \\MW^{(k)\\top} \\; \\Vg$\n\\ENDFOR\n\\end{algorithmic}\n\\end{algorithm}\n\n\\algref{alg:mlp-fprop}和\\algref{alg:mlp-bprop}是简单而直观的演示。\n然而，它们专门针对特定的问题。\n\n现在的软件实现基于之后\\secref{sec:general_back_propagation}中描述的一般形式的反向传播，它可以通过显式地操作表示符号计算的数据结构，来适应任何计算图。\n\n\n% -- 205 --\n\n\\subsection{符号到符号的导数}\n\\label{sec:symbol_to_symbol_derivatives}\n\n代数表达式和计算图都对\\firstgls{symbol}或不具有特定值的变量进行操作。\n这些代数或者基于图的表达式被称为\\firstgls{symbolic_representation}。\n当我们实际使用或者训练神经网络时，我们必须给这些符号赋特定的值。\n我们用一个特定的\\firstgls{numeric_value}来替代网络的符号输入$\\Vx$，例如$[1.2, 3,765, -1.8]^\\top$。\n\n一些反向传播的方法采用计算图和一组用于图的输入的数值，然后返回在这些输入值处梯度的一组数值。\n我们将这种方法称为\\,\\textbf{符号到数值}的微分。\n这种方法用在诸如Torch~\\citep{Torch-2011}和Caffe~\\citep{Jia13caffe}之类的库中。\n\n% -- 206 --\n \n另一种方法是采用计算图以及添加一些额外的节点到计算图中，这些额外的节点提供了我们所需导数的符号描述。\n这是Theano~\\citep{bergstra+al:2010-scipy-small,Bastien-Theano-2012}和TensorFlow~\\citep{tensorflow}所采用的方法。\n\\figref{fig:chap6_symbol_to_symbol}给出了该方法如何工作的一个例子。\n这种方法的主要优点是导数可以使用与原始表达式相同的语言来描述。\n因为导数只是另外一张计算图，我们可以再次运行反向传播，对导数再进行求导就能得到更高阶的导数。\n高阶导数的计算在\\secref{sec:higher_order_derivatives}中描述。\n% fig 6.10\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/symbol_to_symbol}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{使用符号到符号的方法计算导数的示例。\n在这种方法中，\\gls{BP}算法不需要访问任何实际的特定数值。\n相反，它将节点添加到计算图中来描述如何计算这些导数。\n通用图形求值引擎可以在随后计算任何特定数值的导数。\n\\emph{(左)}在这个例子中，我们从表示$z=f(f(f(w)))$的图开始。\n\\emph{(右)}我们运行\\gls{BP}算法，指导它构造表达式$\\frac{dz}{dw}$对应的图。 在这个例子中，我们不解释\\gls{BP}算法如何工作。\n我们的目的只是说明想要的结果是什么：符号描述的导数的计算图。}\n\\label{fig:chap6_symbol_to_symbol}\n\\end{figure}\n\n我们将使用后一种方法，并且使用构造导数的计算图的方法来描述反向传播算法。\n图的任意子集之后都可以使用特定的数值来求值。\n这允许我们避免精确地指明每个操作应该在何时计算。\n相反，通用的图计算引擎只要当一个节点的父节点的值都可用时就可以进行求值。\n\n% -- 207 --\n  \n基于符号到符号的方法的描述包含了符号到数值的方法。\n符号到数值的方法可以理解为执行了与符号到符号的方法中构建图的过程中完全相同的计算。\n关键的区别是符号到数值的方法不向外暴露出计算图。\n\n\\subsection{一般化的\\glsentrytext{BP}}\n\\label{sec:general_back_propagation}\n\n反向传播算法非常简单。\n为了计算某个标量$z$关于图中它的一个祖先$\\Vx$的梯度，我们首先观察到它关于$z$的梯度由$\\frac{dz}{dz}=1$给出。\n然后，我们可以计算对图中$z$的每个父节点的梯度，通过现有的梯度乘以产生$z$的操作的~\\gls{jacobian}。\n我们继续乘以~\\gls{jacobian}，以这种方式向后穿过图，直到我们到达$\\Vx$。\n对于从$z$出发可以经过两个或更多路径向后行进而到达的任意节点，我们简单地对该节点来自不同路径上的梯度进行求和。\n\n更正式地，图$\\CalG$中的每个节点对应着一个变量。\n为了实现最大的一般化，我们将这个变量描述为一个张量$\\TSV$。\n张量通常可以具有任意维度，并且包含标量、向量和矩阵。\n\n我们假设每个变量$\\TSV$与下列子程序相关联：\n\\begin{itemize}\n    \\item \\verb|get_operation|($\\TSV$)：它返回用于计算$\\TSV$的操作，代表了在计算图中流入$\\TSV$的边。\n    例如，可能有一个Python或者C++的类表示矩阵乘法操作，以及~\\verb|get_operation|函数。\n    假设我们的一个变量是由矩阵乘法产生的，$\\MC=\\MA\\MB$。\n    那么，\\verb|get_operation|($\\TSV$)返回一个指向相应C++类的实例的指针。\n\n    \\item \\verb|get_consumers|($\\TSV, \\CalG$)：它返回一组变量，是计算图$\\CalG$中$\\TSV$的子节点。\n\n    \\item \\verb|get_inputs|($\\TSV, \\CalG$)：它返回一组变量，是计算图$\\CalG$中$\\TSV$的父节点。\n\\end{itemize}\n\n% -- 208 --\n  \n每个操作~\\verb|op|也与~\\verb|bprop|操作相关联。\n该~\\verb|bprop|操作可以计算如\\eqnref{eq:6.47}所描述的~\\gls{jacobian}~向量积。\n这是反向传播算法能够实现很大通用性的原因。\n每个操作负责了解如何通过它参与的图中的边来反向传播。\n例如，我们可以使用矩阵乘法操作来产生变量$\\MC=\\MA\\MB$。\n假设标量$z$关于$\\MC$的梯度是$\\MG$。\n矩阵乘法操作负责定义两个反向传播规则，每个规则对应于一个输入变量。\n如果我们调用~\\verb|bprop|方法来请求关于$\\MA$的梯度，那么在给定输出的梯度为$\\MG$的情况下，矩阵乘法操作的~\\verb|bprop|方法必须说明关于$\\MA$的梯度是$\\MG\\MB^\\top$。\n类似的，如果我们调用~\\verb|bprop|方法来请求关于$\\MB$的梯度，那么矩阵操作负责实现~\\verb|bprop|方法并指定希望的梯度是$\\MA^\\top\\MG$。\n反向传播算法本身并不需要知道任何微分法则。\n它只需要使用正确的参数调用每个操作的~\\verb|bprop|方法即可。\n正式地，~\\verb|op.bprop(inputs|$, \\TSX, \\TSG)$必须返回\n\\begin{equation}\n  \\sum_i (\\nabla_{\\TSX} \\verb|op.f(inputs|)_i) \\textsf{G}_i,\n\\end{equation}\n这只是如\\eqnref{eq:6.47}所表达的链式法则的实现。\n这里，\\verb|inputs|是提供给操作的一组输入，\\verb|op.f|是操作实现的数学函数，$\\TSX$是输入，我们想要计算关于它的梯度，$\\TSG$是操作对于输出的梯度。\n\n\\verb|op.bprop|方法应该总是假装它的所有输入彼此不同，即使它们不是。\n例如，如果~\\verb|mul|操作传递两个$x$来计算$x^2$，\\verb|op.bprop|方法应该仍然返回$x$作为对于两个输入的导数。\n反向传播算法后面会将这些变量加起来获得$2x$，这是$x$上总的正确的导数。\n\n反向传播算法的软件实现通常提供操作和其~\\verb|bprop|方法，所以深度学习软件库的用户能够对使用诸如矩阵乘法、指数运算、对数运算等等常用操作构建的图进行反向传播。\n构建反向传播新实现的软件工程师或者需要向现有库添加自己的操作的高级用户通常必须手动为新操作推导~\\verb|op.bprop|方法。\n\n反向传播算法的正式描述参考\\algref{alg:backprop}。\n\n% -- 209 --\n% alg 6.5\n\\begin{algorithm}[ht]\n\\caption{\\gls{BP}算法最外围的骨架。\n这部分做简单的设置和清理工作。\n大多数重要的工作发生在\\algref{alg:build_grad}的子程序{\\tt build\\_grad}中。\n}\n\\label{alg:backprop}\n\\begin{algorithmic}\n\\REQUIRE $\\SetT$，需要计算梯度的目标变量集\n\\REQUIRE $\\CalG$，计算图\n\\REQUIRE $z$， 要微分的变量\n\\STATE 令 $\\CalG'$ 为$\\CalG$剪枝后的计算图，其中仅包括$z$的祖先以及$\\SetT$中节点的后代。\n\\STATE 初始化 {\\tt grad\\_table}，它是关联张量和对应导数的数据结构。\n\\STATE ${\\tt grad\\_table}[z] \\leftarrow 1$\n\\FOR{$\\TSV$ in $\\SetT$}\n\\STATE ${\\tt build\\_grad}(\\TSV, \\CalG, \\CalG', {\\tt grad\\_table})$\n\\ENDFOR\n\\STATE Return {\\tt grad\\_table} restricted to $\\SetT$\n\\end{algorithmic}\n\\end{algorithm}\n\n\\begin{algorithm}[ht]\n\\caption{\\gls{BP}算法的内循环子程序${\\tt build\\_grad}(\\TSV, \\CalG, \\CalG', {\\tt grad\\_table})$，\n由\\algref{alg:backprop}中定义的\\gls{BP}算法调用。\n}\n\\label{alg:build_grad}\n\\begin{algorithmic}\n\\REQUIRE $\\TSV$，应该被加到$\\CalG$和{\\tt grad\\_table}的变量。\n\\REQUIRE $\\CalG$，要修改的图。\n\\REQUIRE $\\CalG'$，根据参与梯度的节点$\\CalG$的受限图。\n\\REQUIRE {\\tt grad\\_table}，将节点映射到对应梯度的数据结构。\n\\IF{$\\SetV$ is in {\\tt grad\\_table} }\n \\STATE Return ${\\tt grad\\_table}[\\TSV]$\n\\ENDIF\n\\STATE $i \\leftarrow 1$\n\\FOR{$\\TSC$ in ${\\tt get\\_consumers}(\\TSV, \\CalG')$ }\n\\STATE ${\\tt op} \\leftarrow {\\tt get\\_operation}(\\TSC)$\n\\STATE $\\TSD \\leftarrow {\\tt build\\_grad}(\\TSC, \\CalG, \\CalG', {\\tt grad\\_table})$\n\\STATE $\\TSG^{(i)} \\leftarrow {\\tt op.bprop}({\\tt get\\_inputs}(\\TSC, \\CalG'), \\TSV, \\TSD)$ \n\\STATE $i \\leftarrow i + 1$\n\\ENDFOR\n\\STATE $\\TSG \\leftarrow \\sum_i \\TSG^{(i)}$\n\\STATE ${\\tt grad\\_table}[\\TSV] = \\TSG$\n\\STATE 插入 $\\TSG$ 和将其生成到$\\CalG$中的操作\n\\STATE Return $\\TSG$\n\\end{algorithmic}\n\\end{algorithm}\n\n\n% -- 210 --\n  \n在\\secref{sec:chain_rule_of_calculus}中，我们使用反向传播作为一种策略来避免多次计算链式法则中的相同子表达式。\n由于这些重复子表达式的存在，简单的算法可能具有指数运行时间。\n现在我们已经详细说明了反向传播算法，我们可以去理解它的计算成本。\n如果我们假设每个操作的执行都有大致相同的开销，那么我们可以依据执行操作的数量来分析计算成本。\n注意这里我们将一个操作记为计算图的基本单位，它实际可能包含许多算术运算（例如，我们可能将矩阵乘法视为单个操作）。\n在具有$n$个节点的图中计算梯度，将永远不会执行超过$O(n^2)$个操作，或者存储超过$O(n^2)$个操作的输出。\n这里我们是对计算图中的操作进行计数，而不是由底层硬件执行的单独操作，所以重要的是要记住每个操作的运行时间可能是高度可变的。\n例如，两个矩阵相乘可能对应着图中的一个单独的操作，但这两个矩阵可能每个都包含数百万个元素。\n我们可以看到，计算梯度至多需要$O(n^2)$的操作，因为在最坏的情况下，前向传播的步骤将在原始图的全部$n$个节点上运行（取决于我们想要计算的值，我们可能不需要执行整个图）。\n反向传播算法在原始图的每条边添加一个~\\gls{jacobian}~向量积，可以用$O(1)$个节点来表达。\n因为计算图是有向无环图，它至多有$O(n^2)$条边。对于实践中常用图的类型，情况会更好。\n大多数神经网络的代价函数大致是链式结构的，使得反向传播只有$O(n)$的成本。\n这远远胜过简单的方法，简单方法可能需要在指数级的节点上运算。\n这种潜在的指数级代价可以通过非递归地扩展和重写递归链式法则（\\eqnref{eq:6.49}）来看出：\n\\begin{equation}\n  \\frac{\\partial u^{(n)}}{\\partial u^{(j)}} =\n  \\sum_{\\substack{\\text{path}(u^{(\\pi_1)}, u^{(\\pi_2)}, \\ldots, u^{(\\pi_t)}  ),\\\\ \\text{from } \\pi_1=j \\text{ to }\\pi_t = n}}\n  \\prod_{k=2}^t \\frac{\\partial u^{(\\pi_k)}}{\\partial u^{(\\pi_{k-1})}}.\n\\end{equation}\n由于节点$j$到节点$n$的路径数目可以关于这些路径的长度上指数地增长，所以上述求和符号中的项数（这些路径的数目），可能以前向传播图的深度的指数级增长。\n会产生如此大的成本是因为对于$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$，相同的计算会重复进行很多次。\n为了避免这种重新计算，我们可以将反向传播看作一种表填充算法，利用存储的中间结果$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$来对表进行填充。\n图中的每个节点对应着表中的一个位置，这个位置存储对该节点的梯度。\n通过顺序填充这些表的条目，反向传播算法避免了重复计算许多公共子表达式。\n这种表填充策略有时被称为\\firstgls{dynamic_programming}。\n  \n% -- 211 --\n  \n\\subsection{实例：用于MLP训练的\\glsentrytext{BP}}\n\\label{sec:example_back_propagation_for_mlp_training}\n\n作为一个例子，我们利用反向传播算法来训练\\gls{MLP}。\n\n这里，我们考虑一个具有单个\\gls{hidden_layer}的非常简单的\\gls{MLP}。\n为了训练这个模型，我们将使用\\gls{minibatch}随机梯度下降算法。\n反向传播算法用于计算单个\\gls{minibatch}上的代价的梯度。\n具体来说，我们使用训练集上的一\\gls{minibatch}实例，将其规范化为一个设计矩阵$\\MX$以及相关联的类标签向量$\\Vy$。\n网络计算隐藏特征层$\\MH=\\max\\{0, \\MX\\MW^{(1)}\\}$。\n为了简化表示，我们在这个模型中不使用偏置。\n假设我们的图语言包含~\\verb|relu|操作，该操作可以对$\\max\\{0,\\MZ\\}$表达式的每个元素分别进行计算。\n类的非归一化对数概率的预测将随后由$\\MH\\MW^{(2)}$ 给出。\n假设我们的图语言包含~\\verb|cross_entropy|操作，用以计算目标$\\Vy$和由这些未归一化对数概率定义的概率分布间的\\gls{cross_entropy}。\n所得到的\\gls{cross_entropy}定义了代价函数$J_\\text{MLE}$。最小化这个\\gls{cross_entropy}将执行对分类器的最大似然估计。\n然而，为了使得这个例子更加真实，我们也包含一个正则项。\n总的代价函数为\n\\begin{equation}\n  J = J_{\\text{MLE}} + \\lambda \\left ( \\sum_{i, j} \\left (W_{i, j}^{(1)} \\right )^2 + \\sum_{i, j} \\left (W_{i, j}^{(2)} \\right)^2 \\right )\n\\end{equation}\n包含了\\gls{cross_entropy}和系数为$\\lambda$的权重衰减项。\n它的计算图在\\figref{fig:chap6_mlp_example}中给出。\n% fig 6.11\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/mlp_example}}\n\\fi\n\\caption{用于计算代价函数的计算图，这个代价函数是使用\\gls{cross_entropy}损失以及权重衰减训练我们的单层~\\glssymbol{MLP}~示例所产生的。}\n\\label{fig:chap6_mlp_example}\n\\end{figure}\n\n这个示例的梯度计算图实在太大，以致绘制或者阅读都将是乏味的。\n这显示出了反向传播算法的优点之一，即它可以自动生成梯度，而这种计算对于软件工程师来说需要进行直观但冗长的手动推导。\n\n我们可以通过观察\\figref{fig:chap6_mlp_example}中的正向传播图来粗略地描述反向传播算法的行为。\n为了训练，我们希望计算$\\nabla_{\\MW^{(1)}} J$和$\\nabla_{\\MW^{(2)}} J$。\n有两种不同的路径从$J$后退到权重：一条通过\\gls{cross_entropy}代价，另一条通过权重衰减代价。\n权重衰减代价相对简单，它总是对$\\MW^{(i)}$上的梯度贡献$2\\lambda \\MW^{(i)}$。\n  \n% -- 212 --\n  \n另一条通过\\gls{cross_entropy}代价的路径稍微复杂一些。\n令$\\MG$是由~\\verb|cross_entropy|操作提供的对未归一化对数概率$\\MU^{(2)}$的梯度。\n反向传播算法现在需要探索两个不同的分支。\n在较短的分支上，它使用对矩阵乘法的第二个变量的反向传播规则，将$\\MH^\\top \\MG$加到$\\MW^{(2)}$的梯度上。\n另一条更长些的路径沿着网络逐步下降。\n首先，反向传播算法使用对矩阵乘法的第一个变量的反向传播规则，计算$\\nabla_{\\MH} J = \\MG\\MW^{(2)\\top}$。\n接下来，\\verb|relu|操作使用其反向传播规则对先前梯度的部分位置清零，这些位置对应着$\\MU^{(1)}$中所有小于0的元素。记上述结果为$\\MG'$。 \n反向传播算法的最后一步是使用对~\\verb|matmul|操作的第二个变量的反向传播规则，将$\\MX^\\top \\MG'$加到$\\MW^{(1)}$的梯度上。\n\n在计算了这些梯度以后，梯度下降算法或者其他优化算法所要做的就是使用这些梯度来更新参数。\n\n对于MLP，计算成本主要来源于矩阵乘法。\n在前向传播阶段，我们乘以每个权重矩阵，得到了$O(w)$数量的乘-加，其中$w$是权重的数量。\n在反向传播阶段，我们乘以每个权重矩阵的转置，这具有相同的计算成本。\n算法主要的存储成本是我们需要将输入存储到\\gls{hidden_layer}的非线性中去。\n这些值从被计算时开始存储，直到反向过程回到了同一点。\n因此存储成本是$O(mn_h)$，其中$m$是\\gls{minibatch}中样本的数目，$n_h$是\\gls{hidden_unit}的数量。\n  \n% -- 213 --\n  \n\\subsection{复杂化}\n\\label{sec:complications}\n\n我们这里描述的反向传播算法要比实践中实际使用的实现要简单。\n\n正如前面提到的，我们将操作的定义限制为返回单个张量的函数。\n大多数软件实现需要支持可以返回多个张量的操作。 \n例如，如果我们希望计算张量中的最大值和该值的索引，则最好在单次运算中计算两者，因此将该过程实现为具有两个输出的操作效率更高。\n\n我们还没有描述如何控制反向传播的内存消耗。\n反向传播经常涉及将许多张量加在一起。\n在朴素方法中，将分别计算这些张量中的每一个，然后在第二步中对所有这些张量求和。 \n朴素方法具有过高的存储瓶颈，可以通过保持一个缓冲器，并且在计算时将每个值加到该缓冲器中来避免该瓶颈。\n\n反向传播的现实实现还需要处理各种数据类型，例如32位浮点数、64位浮点数和整型。\n处理这些类型的策略需要特别的设计考虑。\n\n一些操作具有未定义的梯度，重要的是跟踪这种情况并且确定用户请求的梯度是否是未定义的。\n\n各种其他技术的特性使现实世界的微分更加复杂。 这些技术性并不是不可逾越的，本章已经描述了计算微分所需的关键知识工具，但重要的是要知道还有许多的精妙之处存在。\n  \n% -- 214 --\n  \n\\subsection{深度学习界以外的微分}\n\\label{sec:differentiation_outside_the_deep_learning_community}\n\n深度学习界在某种程度上已经与更广泛的计算机科学界隔离开来，并且在很大程度上发展了自己关于如何进行微分的文化态度。\n更一般地，\\firstgls{automatic_differentiation}领域关心如何以算法方式计算导数。 \n这里描述的反向传播算法只是自动微分的一种方法。 \n它是一种称为\\firstgls{reverse_mode_accumulation}的更广泛类型的技术的特殊情况。 \n其他方法以不同的顺序来计算链式法则的子表达式。 \n一般来说，确定一种计算的顺序使得计算开销最小，是困难的问题。 \n找到计算梯度的最优操作序列是NP完全问题\\citep{naumann2008optimal}，在这种意义上，它可能需要将代数表达式简化为它们最廉价的形式。\n\n例如，假设我们有变量$p_1,p_2\\ldots,p_n$表示概率，以及变量$z_1,z_2,\\ldots,z_n$表示未归一化的对数概率。\n假设我们定义\n\\begin{equation}\n  q_i = \\frac{\\exp(z_i)}{\\sum_i \\exp(z_i)},\n\\end{equation}\n其中我们通过指数化、求和与除法运算构建softmax函数，并构造\\gls{cross_entropy}损失函数$J=-\\sum_i p_i\\log q_i$。\n人类数学家可以观察到$J$对$z_i$的导数有一个非常简单的形式：$q_i-p_i$\n%\\footnote{译者注：$\\frac{\\partial J}{\\partial z_i} = -\\frac{p_i}{q_i}\\frac{\\partial q_i}{\\partial z_i} -\\sum_{j \\ne i} \\frac{p_j}{q_j} \\frac{\\partial q_j}{\\partial z_i}  = -\\frac{p_i}{q_i}(q_i - q_i^2) - \\sum_{j \\ne i} \\frac{p_j}{q_j}(-q_jq_i) =p_i(q_i - 1) + (1-p_i)q_i = q_i - p_i.$}。\n反向传播算法不能够以这种方式来简化梯度，而是会通过原始图中的所有对数和指数操作显式地传播梯度。\n一些软件库如Theano~\\citep{bergstra+al:2010-scipy-small,Bastien-Theano-2012}能够执行某些种类的代数替换来改进由纯反向传播算法提出的图。\n  \n% -- 215 --\n  \n当前向图$\\CalG$具有单个输出节点，并且每个偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$都可以用恒定的计算量来计算时，反向传播保证梯度计算的计算数目和前向计算的计算数目是同一个量级：这可以在\\algref{alg:bprop}中看出，因为每个局部偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$以及递归链式公式（\\eqnref{eq:6.49}）中相关的乘和加都只需计算一次。\n因此，总的计算量是$O(\\#\\text{edges})$。\n然而，可能通过对反向传播算法构建的计算图进行简化来减少这些计算量，并且这是NP完全问题。\n诸如Theano和TensorFlow的实现使用基于匹配已知简化模式的试探法，以便重复地尝试去简化图。\n我们定义反向传播仅用于计算标量输出的梯度，但是反向传播可以扩展到计算~\\gls{jacobian_matrix}（该~\\gls{jacobian_matrix}或者来源于图中的$k$个不同标量节点，或者来源于包含$k$个值的张量值节点）。\n朴素的实现可能需要$k$倍的计算：对于原始前向图中的每个内部标量节点，朴素的实现计算$k$个梯度而不是单个梯度。\n当图的输出数目大于输入的数目时，有时更偏向于使用另外一种形式的自动微分，称为\\firstgls{forward_mode_accumulation}。\n前向模式计算已经被提出用于循环神经网络梯度的实时计算，例如\\citep{Williams89b}。\n这也避免了存储整个图的值和梯度的需要，是计算效率和内存使用的折中。\n前向模式和后向模式的关系类似于左乘和右乘一系列矩阵之间的关系，例如\n\\begin{equation}\n  \\MA \\MB \\MC \\MD,\n\\end{equation}\n其中的矩阵可以认为是~\\gls{jacobian_matrix}。\n例如，如果$\\MD$是列向量，而$\\MA$有很多行，那么这对应于一幅具有单个输出和多个输入的图，并且从最后开始乘，反向进行，只需要矩阵-向量的乘积。\n这对应着反向模式。\n相反，从左边开始乘将涉及一系列的矩阵-矩阵乘积，这使得总的计算变得更加昂贵。\n然而，如果$\\MA$的行数小于$D$的列数，则从左到右乘更为便宜，这对应着前向模式。\n\n在机器学习以外的许多社区中，更常见的是使用传统的编程语言来直接实现微分软件，例如用Python或者C来编程，并且自动生成使用这些语言编写的不同函数的程序。\n在深度学习界中，计算图通常使用由专用库创建的明确的数据结构表示。\n专用方法的缺点是需要库开发人员为每个操作定义~\\verb|bprop|方法，并且限制了库的用户仅使用定义好的那些操作。\n然而，专用方法也允许定制每个操作的反向传播规则，允许开发者以非显而易见的方式提高速度或稳定性，对于这种方式自动的过程可能不能复制。\n\n因此，反向传播不是计算梯度的唯一方式或最佳方式，但它是一个非常实用的方法，继续为深度学习社区服务。 \n在未来，深度网络的微分技术可能会提高，因为深度学习的从业者更加懂得了更广泛的自动微分领域的进步。\n  \n% -- 216 --\n  \n\\subsection{高阶微分}\n\\label{sec:higher_order_derivatives}\n\n一些软件框架支持使用高阶导数。 \n在深度学习软件框架中，这至少包括Theano和TensorFlow。\n这些库使用一种数据结构来描述要被微分的原始函数，它们使用相同类型的数据结构来描述这个函数的导数表达式。\n这意味着符号微分机制可以应用于导数（从而产生高阶导数）。\n\n在深度学习的相关领域，很少会计算标量函数的单个二阶导数。\n相反，我们通常对Hessian矩阵的性质比较感兴趣。\n如果我们有函数$f:\\SetR^n \\to \\SetR$，那么Hessian矩阵的大小是$n\\times n$。\n在典型的深度学习应用中，$n$将是模型的参数数量，可能很容易达到数十亿。\n因此，完整的Hessian矩阵甚至不能表示。\n\n典型的深度学习方法是使用\\firstgls{Krylov_methods}，而不是显式地计算Hessian矩阵。\nKrylov方法是用于执行各种操作的一组迭代技术，这些操作包括像近似求解矩阵的逆、或者近似矩阵的特征值或特征向量等，而不使用矩阵-向量乘法以外的任何操作。\n\n为了在Hesssian矩阵上使用Krylov方法，我们只需要能够计算Hessian矩阵$\\MH$和一个任意向量$\\Vv$间的乘积即可。\n实现这一目标的一种直观方法\\citep{christianson1992automatic}是\n\\begin{equation}\n  \\MH \\Vv=\\nabla_{\\Vx} \\left [ (\\nabla_{\\Vx} f(x))^\\top \\Vv\\right ].\n\\end{equation}\n该表达式中两个梯度的计算都可以由适当的软件库自动完成。\n注意，外部梯度表达式是内部梯度表达式的函数的梯度。\n\n如果$\\Vv$本身是由计算图产生的一个向量，那么重要的是指定自动微分软件不要对产生$\\Vv$的图进行微分。\n\n虽然计算Hessian通常是不可取的，但是可以使用Hessian向量积。\n可以对所有的$i=1,\\ldots,n$简单地计算$\\MH \\Ve^{(i)}$，其中$\\Ve^{(i)}$是$e_i^{(i)}=1$并且其他元素都为0的\\gls{one_hot}向量。\n\n\\section{历史小记}\n\\label{sec:historical_notes}\n\n\\gls{feedforward_network}可以被视为一种高效的非线性函数近似器，它以使用梯度下降来最小化函数近似误差为基础。\n从这个角度来看，现代\\gls{feedforward_network}是一般函数近似任务的几个世纪进步的结晶。\n  \n% -- 217 --\n  \n处于反向传播算法底层的链式法则是17世纪发明的\\citep{Leibniz-1676,LHopital-1696}。\n微积分和代数长期以来被用于求解优化问题的封闭形式，但梯度下降直到19世纪才作为优化问题的一种迭代近似的求解方法被引入\\citep{cauchy1847}。\n\n从20世纪40年代开始，这些函数近似技术被用于导出诸如感知机的机器学习模型。 \n然而，最早的模型都是基于线性模型。 \n来自包括Marvin Minsky的批评指出了线性模型族的几个缺陷，例如它无法学习XOR函数，这导致了对整个神经网络方法的抵制。\n\n学习非线性函数需要\\gls{MLP}的发展和计算该模型梯度的方法。\n基于动态规划的链式法则的高效应用开始出现在20世纪60年代和70年代，主要用于控制领域\\citep{Kelley-1960,Bryson-et-al-1961,Dreyfus-1962,Bryson-1969,Dreyfus-1973}，也用于灵敏度分析\\citep{Linnainmaa-1976}。 \n\\cite{Werbos-1981}提出应用这些技术来训练人工神经网络。\n这个想法以不同的方式被独立地重新发现后\\citep{LeCun85,Parker-1985,Rumelhart86b-small}，最终在实践中得以发展。\n\\firstgls{parallel_distributed_processing}一书在其中一章提供了第一次成功使用反向传播的一些实验的结果\\citep{Rumelhart86c}，这对反向传播的普及做出了巨大的贡献，并且开启了一个研究多层神经网络非常活跃的时期。\n然而，该书作者提出的想法，特别是Rumelhart 和Hinton提出的想法远远超过了反向传播。\n它们包括一些关键思想，关于可能通过计算实现认知和学习的几个核心方面，后来被冠以`` 联结主义''的名称，因为它强调了神经元之间的连接作为学习和记忆的轨迹的重要性。\n特别地，这些想法包括分布式表示的概念\\citep{Hinton-et-al-PDP1986}。\n\n在反向传播的成功之后，神经网络研究获得了普及，并在20世纪90年代初达到高峰。 \n随后，其他机器学习技术变得更受欢迎，直到2006年开始的现代深度学习复兴。\n\n现代\\gls{feedforward_network}的核心思想自20世纪80年代以来没有发生重大变化。\n仍然使用相同的反向传播算法和相同的梯度下降方法。\n1986年至2015年神经网络性能的大部分改进可归因于两个因素。\n首先，较大的数据集减少了统计\\gls{generalization}对神经网络的挑战的程度。\n第二，神经网络由于更强大的计算机和更好的软件基础设施已经变得更大。\n然而，少量算法上的变化也显著改善了神经网络的性能。\n  \n% -- 218 --\n  \n其中一个算法上的变化是用\\gls{cross_entropy}族损失函数替代\\gls{mean_squared_error}损失函数。\n\\gls{mean_squared_error}在20世纪80年代和90年代流行，但逐渐被\\gls{cross_entropy}损失替代，并且最大似然原理的想法在统计学界和机器学习界之间广泛传播。\n使用\\gls{cross_entropy}损失大大提高了具有~\\gls{sigmoid}~和softmax输出的模型的性能，而当使用\\gls{mean_squared_error}损失时会存在饱和和学习缓慢的问题。\n\n另一个显著改善\\gls{feedforward_network}性能的算法上的主要变化是使用分段线性\\gls{hidden_unit}来替代~\\gls{sigmoid}~\\gls{hidden_unit}，例如用\\gls{ReLU}。\n使用$\\max\\{0, z\\}$函数的整流在早期神经网络中已经被引入，并且至少可以追溯到认知机（Cognitron）和神经认知机(Neocognitron)\\citep{Fukushima75,Fukushima80}。\n这些早期的模型没有使用\\gls{ReLU}，而是将整流用于非线性函数。\n尽管整流在早期很普及，在20世纪80年代，整流很大程度上被~\\gls{sigmoid}~所取代，也许是因为当神经网络非常小时，\\gls{sigmoid}~表现更好。\n到21世纪初，由于有些迷信的观念，认为必须避免具有不可导点的激活函数，所以避免了\\gls{ReLU}。\n这在2009年开始发生改变。\n\\cite{Jarrett-ICCV2009-small}观察到，在神经网络结构设计的几个不同因素中``使用整流非线性是提高识别系统性能的最重要的唯一因素''。\n\n对于小的数据集，\\cite{Jarrett-ICCV2009-small}观察到，使用整流非线性甚至比学习\\gls{hidden_layer}的权重值更加重要。\n随机的权重足以通过\\gls{rectifier_network}传播有用的信息，允许在顶部的分类器层学习如何将不同的特征向量映射到类标识。\n\n当有更多数据可用时，学习开始提取足够的有用知识来超越随机选择参数的性能。\n\\cite{Glorot+al-AI-2011-small}说明，在深度\\gls{rectifier_network}中的学习比在激活函数具有曲率或两侧饱和的深度网络中的学习更容易。\n\n\\gls{ReLU}还具有历史意义，因为它们表明神经科学继续对深度学习算法的发展产生影响。\n\\cite{Glorot+al-AI-2011-small}从生物学考虑\\gls{ReLU}的导出。\n半整流非线性旨在描述生物神经元的这些性质：(1) 对于某些输入，生物神经元是完全不活跃的。\n(2) 对于某些输入，生物神经元的输出和它的输入成比例。\n(3) 大多数时间，生物神经元是在它们不活跃的状态下进行操作（即它们应该具有\\firstgls{sparse_activation}）。\n  \n% -- 219 --\n  \n当2006年深度学习开始现代复兴时，\\gls{feedforward_network}仍然有不良的声誉。\n从2006年至2012年，人们普遍认为，\\gls{feedforward_network}不会表现良好，除非它们得到其他模型的辅助，例如概率模型。\n现在已经知道，只要具备适当的资源和工程实践，\\gls{feedforward_network}表现得非常好。\n今天，\\gls{feedforward_network}中基于梯度的学习被用作发展概率模型的工具，例如\\chapref{chap:deep_generative_models}中描述的\\gls{VAE}和生成式对抗网络。\n\\gls{feedforward_network}中基于梯度的学习自2012年以来一直被视为一种强大的技术，并应用于许多其他机器学习任务，而不是被视为必须由其他技术支持的不可靠技术。\n在2006 年，业内使用无监督学习来支持监督学习，现在更讽刺的是，更常见的是使用监督学习来支持无监督学习。\n\n\\gls{feedforward_network}还有许多未实现的潜力。\n未来，我们期望它们用于更多的任务，优化算法和模型设计的进步将进一步提高它们的性能。\n本章主要描述了神经网络模型族。\n在接下来的章节中，我们将讨论如何使用这些模型——如何对它们进行正则化和训练。\n\n  \n% -- 220 --\n  \n"
  },
  {
    "path": "Chapter7/README.md",
    "content": "#第七章笔记\n"
  },
  {
    "path": "Chapter7/annotations.txt",
    "content": "{'user': 'acct:vsooda@hypothes.is', 'text': '中文语法有误。考虑:\\n显示地对标签噪声进行建模是防止这一点的一种方法。', 'origin_text': '\\u2061p(y∣x)\\\\log p(y \\\\mid \\\\Vx)会是有害的。  !!!为了防止这一点的一种方法是显式地对标签上的噪声进行建模。!!!  例如，我们可以假设，对于一些小常数ϵϵ\\\\epsilon，训练集', 'time': '2017-02-03T03:29'}\n{'user': 'acct:vsooda@hypothes.is', 'text': '任何其他可能的标签也可能是正确的。', 'origin_text': '训练集标记yyy是正确的概率是1−ϵ1−ϵ1-\\\\epsilon，  !!!任何其他可能的标签可能是正确的。!!!  这个假设很容易就能解析地与代价函数结合，而不用显式地采噪声样本', 'time': '2017-02-03T03:39'}\n{'user': 'acct:fishlu@hypothes.is', 'text': '在机器学习中以增大训练误差为代价来减少测试误差的策略，统称为正则化。', 'origin_text': '表现好，并且能在新输入上泛化好的算法是机器学习中的一个核心问题。  !!!在机器学习中许多策略通过明确设计，以增大训练误差为代价来减少测试误差。这些策略统称为正则化!!!  。正如我们将看到的，深度学习工作者可以使用许多形式的正则化。', 'time': '2017-02-05T12:58'}\n{'user': 'acct:fishlu@hypothes.is', 'text': '设计一个不仅在训练数据上表现好', 'origin_text': '                              !!!设计不仅在训练数据上表现好!!!  ，并且能在新输入上泛化好的算法是机器学习中的一个核心问题。在机', 'time': '2017-02-05T12:58'}\n{'user': 'acct:fishlu@hypothes.is', 'text': '我们可以看到深度学习工作者已经在使用各种形式的正则化。然而，开发更有效的正则化策略还是这个领域的主要研究方向之一。', 'origin_text': '，以增大训练误差为代价来减少测试误差。这些策略统称为正则化。  !!!正如我们将看到的，深度学习工作者可以使用许多形式的正则化。事实上，开发更有效的正则化策略已成为本领域的主要研究工作之一!!!  。\\\\chap?介绍了泛化、欠拟合、过拟合、偏差、方差和正则化', 'time': '2017-02-05T13:05'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '机器学习的一个核心问题在于，如何使算法不仅在训练数据上表现良好，并且在新输入的样本上也有同样的性能。', 'origin_text': '                              !!!设计不仅在训练数据上表现好，并且能在新输入上泛化好的算法是机器学习中的一个核心问题!!!  。在机器学习中许多策略通过明确设计，以增大训练误差为代价来减少', 'time': '2017-03-08T00:41'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '许多机器学习中精心设计的策略目标都在于减少测试误差(test error)，与之相伴的就是有可能带来训练误差的增加。', 'origin_text': '现好，并且能在新输入上泛化好的算法是机器学习中的一个核心问题。  !!!在机器学习中许多策略通过明确设计，以增大训练误差为代价来减少测试误差!!!  。这些策略统称为正则化。正如我们将看到的，深度学习工作者可以', 'time': '2017-03-08T00:44'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '参数、范数、惩罚', 'origin_text': '。现在我们回顾几种创建这些大型深度正则化模型的策略。  !!!参数范数惩罚!!!  正则化在深度学习的出现前就已经应用了数十年。线性模型，如线', 'time': '2017-03-08T00:57'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '许多正则化方法都是基于限制模型的能力，如在神经网络、线性回归或者逻辑回归中，通过对目标函数J增加一个参数范数惩罚项Ω(θ)Ω(θ)|Omega(\\\\Vtheta)。', 'origin_text': '型，如线性回归和逻辑回归可以使用简单、直接有效的正则化策略。  !!!许多正则化方法通过对目标函数 JJJ添加一个参数范数惩罚Ω(θ)Ω(θ)\\\\Omega(\\\\Vtheta)，限制模型（如神经网络、线性回归或逻辑回归）的学习能力!!!  。我们将正则化后的目标函数记为J~J~\\\\tilde{J}：J', 'time': '2017-03-08T01:01'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '当梯度为0时，J^J^\\\\hat J取得最小', 'origin_text': '们可以得出的一个最小点，我们可以得出\\\\MH$是半正定的结论。  !!!当J^J^\\\\hat J取最小时，其梯度!!!  ∇wJ^(w)=H(w−w∗)∇wJ^(w)=H(w−w∗)\\\\', 'time': '2017-03-08T01:22'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '规模', 'origin_text': '减是权重衰减最常见的形式，我们还可以使用其他的方法惩罚模型参数的  !!!大小!!!  。另一种选择是使用L1L1L^1正则化。对模型参数ww\\\\V', 'time': '2017-03-08T01:27'}\n{'user': 'acct:FlyingFire@hypothes.is', 'text': '而其他在梯度为0的情况下会使用解析解', 'origin_text': '性回归实例。许多不同的优化过程是可能的，有些可能会利用梯度下降  !!!而其他可能使用梯度为0的解析解!!!  ，但在所有程序中αα\\\\alpha在Ω(θ)>kΩ(θ)>k\\\\Om', 'time': '2017-03-08T01:59'}\n{'user': 'acct:friskit@hypothes.is', 'text': '应该是\\\\mu\\n\\n貌似是笔误', 'origin_text': ' \\\\Vx, \\\\Vmu)。关于所有掩码的算术平均值由下式给出∑  !!!u!!!  p(μ)p(y∣x,μ),∑up(μ)p(y∣x,μ),\\\\beg', 'time': '2017-03-13T04:42'}\n\n\n\n@NBZCC\n\n7.1\n\n\\gls{ML}中的一个核心问题是设计不仅在训练数据上表现好，并且能在新输入上泛化好的算法。\n\\gls{ML}中的一个核心问题是如何设计不仅在训练数据上表现好，并且能在新输入上泛化好的算法。\n\n！\n在\\gls{ML}中，许多策略显式地被设计为减少测试误差（可能会以增大训练误差为代价）。\n在\\gls{ML}中，许多策略有意被设计用来减少测试误差（可能会以增大训练误差为代价）。 \n注：为字有两种理解，避免误解\n\n！\n然而，本章的大多数内容涉及这些基本概念在特定\\gls{NN}中的扩展概念。\n然而，本章的大多数内容是关于这些基本概念在特定\\gls{NN}中的扩展概念。\n注：就是相关概念扩展。\n\n在\\secref{sec:regularization}中，我们将\\gls{regularization}定义为``对学习算法的修改——旨在减少\\gls{generalization}误差而不是训练误差''。\n在\\secref{sec:regularization}中，我们将\\gls{regularization}定义为”用以减少学习算法的\\gls{generalization}误差而非训练误差的修改”。\n\n！\n有些策略向\\gls{objective_function}增加参数值软约束的额外项。\n有些策略向\\gls{objective_function}增加额外项来对参数值进行软约束。\n注:原文为加额外项可看作是软约束\n\n如果我们仔细选择\n如果我们细心选择\n\n！！\n其他形式的\\gls{regularization}（如\\gls{ensemble}方法）结合多个假说来解释训练数据。\n其他形式的\\gls{regularization}，被称为\\gls{ensemble}方法，则结合多个假说来解释训练数据。\n注：集成方法就是结合多个假说解释训练数据\n\n！！！\n它会降低原始目标$J$关于训练数据的误差并同时减小参数$\\Vtheta$的规模（或在某些衡量下参数子集的规模）。\n它会降低原始目标$J$关于训练数据的误差并同时减小在某些衡量标准下参数$\\Vtheta$（或参数子集）的规模。\n注：与原文内容意思不同，括号内的某些衡量标准在原文外\n\n！！\n选择不同的参数范数$\\Omega$会偏好不同的解法。\n选择不同的参数范数$\\Omega$会偏好不同的解。\n注：解法相同，解不同\n\n！！\n在探究不同范数的\\gls{regularization}表现之前，我们需要说明一下，在神经网络中我们通常只对每一层仿射变换的\\emph{权重}做惩罚而不对\\gls{bias_aff}做正则惩罚。\n在探究不同范数的\\gls{regularization}表现之前，我们需要说明一下，在神经网络中，参数包括每一层仿射变换的权重和\\gls{bias_aff}，我们通常\\emph{只对权重}做惩罚而不对\\gls{bias_aff}做正则惩罚。\n注:原文强调Only the weights,除了权重加粗以外更重要的是只对，个人认为不应分离，所以改变了翻译语序让两个重点在一起,方便加粗.\n\n！!\n 拟合多个超参数的代价很大\n 寻找合适的多个超参数代价很大.\n 注:超参数的选择调整并不属于拟合。\n\n 我们已经看到过最简单和最常见的参数范数惩罚\n 我们已经看到过最简单而又最常见的参数范数惩罚\n\n！！\n 当我们不知道正确的值应该是正还是负时，零是有意义的默认值。\n 当我们不知道正确的值应该是正还是负时，将零设为默认值是讲得通的。\n 注:make sense 讲得通，也可以译作明智的.\n\n！\n我们可以通过研究正则化化后目标函数的梯度，洞察一些权重衰减的正则化表现。\n我们可以通过研究正则化后目标函数的梯度，对权重衰减正则化的表现进行一些了解。\n注：原文为some insight 应该是一些了解而不是一些表现\n\n！！\n令$\\Vw^*$为不含\\gls{regularization}的\\gls{objective_function}\n令$\\Vw^*$为不含正则化项的\\gls{objective_function}\n注：或未正则化的目标函数，正则化通常只行为而不是具体东西\n\n！！\n现在我们探讨最小化含有\\gls{regularization}的$\\hat J$。\n现在我们探讨最小化含有正则化项的$\\hat J$。\n注：同上\n\n！\n具体来说，我们会根据$\\frac{\\lambda_i}{\\lambda_i + \\alpha}$因子缩放与$\\MH$第$i$个特征向量对齐的$\\Vw^*$的分量。\n具体来说，$\\Vw^*$在$\\MH$第 $i$个特征向量方向上的分量会缩放为原来的$\\frac{\\lambda_i}{\\lambda_i+\\alpha}$。\n注：数学上一般说在某个向量方向上而不是用对齐这种说法。\n\n 比如我们还可以使用$L^1$\\gls{regularization}。\n 一个选择是使用$L^1$\\gls{regularization}。\n 注:本小节就是$L^1$正则化，不用表明是举例,而且更符合原文.\n\n！！\n 由于$L^1$惩罚项在满的、一般的~\\gls{hessian}~\n 由于$L^1$惩罚项完全一般化的~\\gls{hessian}~\n注：原文fully形容general\n\n！！！\n考虑所有$i$且$w_i^* > 0$的情形，会有两种可能输出\n对每个$i$,考虑$w_i^* > 0$的情形，会有两种可能结果\n注:这个译文会理解为所有w_i都要>0，但实际上是分开对每个i考虑.两种情况有不同的结果，可与输出y区分开来.\n\n！！！\n这是因为在方向$i$上$J(\\Vw; \\MX, \\Vy) $对$ \\hat J(\\Vw; \\MX, \\Vy)$的贡献受到抑制，$L^1$\\gls{regularization}项将$w_i$推向0。\n这是因为在方向$i$上$J(\\Vw; \\MX, \\Vy) $对$ \\hat J(\\Vw; \\MX, \\Vy)$的贡献被抵消，$L^1$\\gls{regularization}项将$w_i$推至0。\n注:两种情况贡献都会受到抑制,这一种直接被抵消至0,另一种抑制不到0,所以后面一种也应修改。\n\n！！！\n\\item  $w_i^* > \\frac{\\alpha}{H_{i,i}}$的情况。在这种情况下，\\gls{regularization}不会将$w_i$的最优值推至0，而仅仅在那个方向上移动$\\frac{\\alpha}{H_{i,i}}$的距离。\n\\item  $w_i^* > \\frac{\\alpha}{H_{i,i}}$的情况。在这种情况下，\\gls{regularization}不会将$w_i$的最优值推至0，而仅仅在那个方向上移动$\\frac{\\alpha}{H_{i,i}}$的距离。\n注：同上\n\n7.2\n考虑通过参数范数\\gls{regularization}的\\gls{cost_function}：\n考虑经过参数范数\\gls{regularization}的\\gls{cost_function}：\n\n！！！\n每个惩罚是一个系数之间的乘积，被称为\\firstgls{KKT}乘子，以及一个表示约束是否满足的函数。\n每个惩罚是一个被称为\\firstgls{KKT}乘子的系数以及一个表示约束是否满足的函数之间的乘积。\n注:原文是系数乘以函数，这个系数叫做KKT乘子，具体可以查阅4.4节或相关文献.\n\n！\n解决这个问题我们需要同时改变$\\Vtheta$和$\\alpha$。\n解决这个问题我们需要对$\\Vtheta$和$\\alpha$都做出调整。\n注：并非同时，只是都要改变，这个解的表达式有两层最值，解法可分开调整。原文也没有same time字样。\n\n但在所有程序中\n但在所有过程中\n\n！！\n最优值$\\alpha^*$也将鼓励$\\Omega(\\Vtheta)$收缩，但不会像$\\Omega(\\Vtheta)$小于$k$时那么强烈。\n最优值$\\alpha^*$也将鼓励$\\Omega(\\Vtheta)$收缩，但不会强到使得$\\Omega(\\Vtheta)$小于$k$。\n注:原文为so strongly to make\n\n当使用权重范数的惩罚训练时，即使可以通过增加权重以显著减少$J$，这些配置也可能是局部最优的。\n当使用带有权重范数的惩罚进行训练后，这些权重配置可能是局部最优的，即使可以通过增加权重以显著减少$J$。\n\n7.3\n！！\n都依赖于求逆矩阵$\\MX^\\top\\MX$\n都依赖于对矩阵$\\MX^\\top\\MX$求逆\n注:原翻译让人以为求$\\MX^\\top\\MX$\n\n！\n或因为例子较少（即相对输入特征（$\\MX$的列）来说）\n或因为例子较少（即相对输入特征的维数来说）\n注:既然没有翻译rows of X,那么columns of X也可以意译为特征的维数,还可以避免括号内再加括号.\n\n那么$2 \\Vw$也会以较高似然实现完美分类\n那么$2 \\Vw$也会以更高似然实现完美分类\n注:因为更高才会更新w\n\n！\n使用\\gls{regularization}解决欠定问题的想法超出了\\gls{ML}的范畴。\n使用\\gls{regularization}解决欠定问题的想法不局限于\\gls{ML}。\n注：下文在继续介绍机器学习外的正则化，语气不应否定。\n\n7.4\n\n！！\n在比较\\gls{ML}算法A和\\gls{ML}算法B时，应该确保这两个算法使用同一人工设计的数据集增强方案进行评估。\n在比较\\gls{ML}算法A和\\gls{ML}算法B时，应该确保这两个算法使用同一人工设计的数据集增强方案。\n注：前面已有比较，没必要再加评估，原文的 evaluated 应该是指算法求解，毕竟测试集通常不会增强。\n\n7.5\n\n在一般情况下，噪声注入远比简单地收缩参数强大\n在一般情况下，注入噪声远比简单地收缩参数强大\n注：与收缩参数结构一致\n\n在\\secref{sec:dropout}所述~\\gls{dropout}~算法是这种做法的主要发展方向。\n在\\secref{sec:dropout}所述~\\gls{dropout}~算法是这种做法的主要发展。\n注：Dropout作为一个特殊算法并不能算方向\n\n等同于最小化附加\\gls{regularization}项的$J$：\n$ \\eta \\SetE_{p(\\Vx,y)}[\\norm{\\nabla_{\\MW}~\\hat y(\\Vx)}^2]$。\n等同于最小化附加\\gls{regularization}项:\n$ \\eta \\SetE_{p(\\Vx,y)}[\\norm{\\nabla_{\\MW}~\\hat y(\\Vx)}^2]$的$J$。\n注：直接加在后面感觉阅读起来更清楚\n\n！!\n找到的点不只是极小点，还是由平坦区域所包围的最小点\n找到的点不只是极小点，还是由平坦区域所包围的极小点\n注：最小点和极小点意义不同\n\n7.6\n-\n\n7.7\n!\n额外的训练样本以同样的方式将模型的参数推向泛化更好的方向，当模型的一部分在任务之间共享时，模型的这一部分更多地被约束为良好的值（假设共享是合理的），往往能更好地泛化。\n正如额外的训练样本能够将模型参数推向具有更好泛化能力的值一样，当模型的一部分被多个额外的任务共享时，这部分将被约束为良好的值（如果共享合理），通常会带来更好的泛化能力。\n注：这句有点长，但是之前的翻译不太看得懂，特别是前半句，改了后觉得还行。\n\n！！\n一些顶层因素不与输出任务$(\\Vh^{(3)})$的任意一个关联是有意义的\n一些顶层因素不与输出任务$(\\Vh^{(3)})$的任意一个关联是讲得通的\n注：后一句话时解释为什么可以这样做，所以是讲得通。\n\n！！\n这意味着如果我们返回使验证集误差最低的参数设置，就可以获得更好的模型（因此，有希望获得更好的测试误差）。\n这意味着我们可以获得验证集误差更低的模型（这样有希望获得更好的测试误差），只要返回使验证集误差最低的参数设置。\n注：原文不是更好的模型，实际也不是这样做一定都更好。\n\n7.8\n！！\n很多控制模型容量的超参数在验证集上都是这样的U型性能曲线，如\\figref{fig:chap7_learning_curve}。\n这个地方是5.3不是7.3\n\n！\n我们通过拟合训练集的步数来控制模型的有效容量。\n我们通过控制拟合训练集的步数来控制模型的有效容量。\n注：翻译让人误解为对步数进行拟合。\n\n在第二轮额外的训练步骤中\n在第二轮，即额外的训练步骤中\n注：避免不必要的误解\n\n此过程有一些细微之处\n此过程处理上有一些细微的差别\n\n例如，我们没有办法知道重新训练时，对参数进行相同次数的更新和对数据集进行相同的遍数哪一个更好。\n例如，我们没有办法知道重新训练时，对参数进行相同次数的更新和对数据集进行相同次数的遍历哪一个更好。\n注：保持结构对称\n\n！\n相反，我们可以监控验证集的平均损失函数，并继续训练，直到它低于\\gls{early_stopping}过程终止时的目标值。\n取而代之的，我们可以监控验证集的平均损失函数，并继续训练，直到它低于\\gls{early_stopping}过程终止时的目标值。\n注：前文指终止策略没了，所以我们用新的取代\n\n！\n除了由于限制训练的迭代次数而明显减少的计算成本，还带来了\\gls{regularization}的益处（不需要添加惩罚项的\\gls{cost_function}或计算这种附加项的\\gls{gradient}）。\n除了由于限制训练的迭代次数而明显减少的计算成本，还不需要向\\gls{cost_function}添加的惩罚项或计算这种附加项的\\gls{gradient}也能起到正则化的效果。\n注：如何在正则化得到益处是此处的重点说明，不应放在括号里而求\n\n！！！\n那么$L^2~$\\gls{regularization}和\\gls{weight_decay}可以被看作是等价的\n那么$L^2~$\\gls{regularization}和\\gls{early_stopping}可以被看作是等价的\n注：是和提前停止等价而不是权重衰减\n\n！！！\n对应显著曲率（\\gls{objective_function}）方向的参数值\\gls{regularization}小于小曲率方向。\n当然，在\\gls{early_stopping}的情况下，这实际上意味着对应于显著曲率方向的参数比较小的曲率方向的参数更早地停止学习。\n在大曲率（\\gls{objective_function}）方向上的参数值受\\gls{regularization}影响小于小曲率方向。\n当然，在\\gls{early_stopping}的情况下，这实际上意味着在大曲率方向的参数比较小的曲率方向的参数更早地学习到。\n注：原文的意思是因为提前终止了，小曲率方向的参数没法学习到，而大曲率方向的参数则已经学习到一部分，对应其他正则化中小曲率方向受正则化影响大，大曲率方向影响小，另外统一下大小曲率便于理解。\n\n！\n相反，\\gls{early_stopping}通常涉及监控验证集误差，以便在空间特别好的点处终止轨迹。\n替代的，\\gls{early_stopping}通常涉及监控验证集误差，以便在空间特别好的点处终止轨迹。\n注：此处指提前终止采用的算法怎样执行。与之前的instead问题相同。\n\n！\n而\\gls{weight_decay}需要多个训练实验测试其超参数的不同值。\n而\\gls{weight_decay}需要进行多个不同超参数值的训练实验。\n注：原文没有寻找或测试超参数值的意思，实际上多个训练实验的目的只是为了得到更好泛化结果，对超参数值应该如何取并不关心\n\n7.9\n但我们根据领域和模型结构方面的知识\n但我们根据相关领域和模型结构方面的知识\n\n！\n这种构造架构使得许多分类模型中的参数能与之对应的\\gls{unsupervised}模型的参数匹配。\n构造的这种架构使得分类模型中的许多参数能与\\gls{unsupervised}模型中对应的的参数匹配。\n注：此处解释只有两个模型，避免误解为多个模型\n\n7.9.1\n\n！\n目前为止，最流行和广泛使用的\\gls{parameter_sharing}出现在应用于\\gls{CV}的\\firstacr{CNN}中。\n自然图像有许多统计属性是对转换不变的。\n目前为止，最流行和广泛使用的\\gls{parameter_sharing}出现在应用于\\gls{CV}的\\firstacr{CNN}中。\n\n自然图像有许多统计属性是对转换不变的。\n注：原文换行了\n\n！！\n相同的特征（具有相同权重的\\gls{hidden_unit}）在输入的不同位置上计算获得。\n在输入每个位置上都会进行相同特征（具有相同权重的\\gls{hidden_unit}）的计算。\n注:意译便于理解，感觉是这么个意思。\n\n7.10\n\n\\gls{representation}的\\gls{sparse}，在另一方面描述了许多元素是零（或接近零）的\\gls{representation}。\n另一方面，\\gls{representation}的\\gls{sparse}描述了许多\\gls{representation}元素是零（或接近零）的\\gls{representation}。\n注：前文的参数的稀疏是一方面，表示的稀疏是另一方面，和下文举例对应\n\n！\n和\\gls{KL}惩罚\\citep{Larochelle+Bengio-2008}有利于表示元素约束于单位区间上。\n和有利于将表示元素约束于单位区间上的\\gls{KL}惩罚\\citep{Larochelle+Bengio-2008}。\n注：原译文不太好理解\n\n！！\n例如，\\textbf{正交匹配追踪}(orthogonal matching pursuit)\\citep{pati93orthogonal}通过解决\\gls{constrained_optimization}问题将输入值$\\Vx$编码成\\gls{representation} $\\Vh$\n例如，\\textbf{正交匹配追踪}(orthogonal matching pursuit)\\citep{pati93orthogonal}通过解决下属\\gls{constrained_optimization}问题将输入值$\\Vx$编码成\\gls{representation} $\\Vh$\n注：原文在problem后立即接了具体问题，此处改变位置应解释下。\n\n7.11\n\n！！\n在误差完全相关即$c=v$的情况下，均方误差减少到$v$，所以\\gls{model_averaging}没有任何帮助\n在误差完全相关即$c=v$的情况下，平方误差减少到$v$，所以\\gls{model_averaging}没有任何帮助\n注：是平方误差而不是均方\n\n！\n\\gls{ensemble}平均至少与它的任何成员表现得一样好\n平均下来，\\gls{ensemble}至少与它的任何成员表现得一样好\n注：此处平均对应公式里求期望。\n\n！！\n\\gls{NN}的解能达到足够多的变化意味着他们可以从\\gls{model_averaging}中受益\n\\gls{NN}的能找到足够多的不同的解，这意味着他们可以从\\gls{model_averaging}中受益\n注：解的变化这一说法很奇怪，其实就是找到许多不同的极小点作为解。\n\n！\n\\gls{boosting}技术已经被应用于构建神经网络的\\gls{ensemble}\\citep{Schwenk-nips10}，即通过向\\gls{ensemble}逐步添加\\gls{NN}。\n\\gls{boosting}也可以将单个神经网络解释为一个\\gls{ensemble}\\citep{Schwenk-nips10}，即逐渐增加\\gls{NN}的\\gls{hidden_unit}。\n注：原文里都是具体解释前文，不应翻译为通过。\n\n7.12\n！\n\\firstgls{dropout}\\citep{Srivastava14}提供了\\gls{regularization}一大类模型的方法，\n注：这个地方会编译成Dropout(Dropout)，不过我不知道怎么改\n\n！\n替换采样\n放回抽样\n注：更正式的说法，该节有两处应一起修改或不修改\n\n！！\n我们会使用基于\\gls{minibatch}的学习算法和较小的步长\n我们会使用基于能产生较小步长的\\gls{minibatch}学习算法\n注：原文we use a minibatch-based learning algorithm ithat makes smalll steps\n\n！\n期望包含多达指数级的项，但我们可以通过抽样$\\Vmu$获得梯度的无偏估计。\n这个期望包含多达指数级的项，但我们可以通过抽样$\\Vmu$获得梯度的无偏估计。\n注：避免误解\n\n！！\n该模型具有所有单元，但我们将模型的权重修改为和单元$i$的概率的乘积。\n该模型具有所有单元，但我们将单元$i$的输出的权重乘以单元$i$的被包含概率。\n注：原文如此，翻译有偏\n\n！！！\n\\cite{Goodfellow-et-al-ICML2013}实验发现，\\gls{ensemble}预测\\gls{weight_scaling_inference_rule}比\\gls{monte_carlo}近似的效果更好（在分类精度方面）。\n即使允许\\gls{monte_carlo}近似采样多达1000子网络时也比不过\\gls{ensemble}。\n\\cite{Goodfellow-et-al-ICML2013}实验发现，在对\\gls{ensemble}预测的近似方面，\\gls{weight_scaling_inference_rule}比\\gls{monte_carlo}近似更好（就分类精度而言）。\n即使允许\\gls{monte_carlo}近似采样多达1000子网络时也比不过\\gls{weight_scaling_inference_rule}。\n注：蒙特卡洛近似和权重比例推断规则都是对这个集成预测器准确度的近似，是这两个相比。而不是蒙特卡洛和集成相比，具体可看原文.\n\n随机\\gls{pooling}是构造\\gls{CNN}\\gls{ensemble}的一种随机\\gls{pooling}的形式(见\\secref{sec:pooling})\n随机\\gls{pooling}是构造\\gls{CNN}\\gls{ensemble}的一种随机化\\gls{pooling}的形式(见\\secref{sec:pooling})\n注：两个随机池化不好理解,建议为了区分从属关系将randomized换位随机化\n\n!\n\\cite{WardeFarley+al-ICLR2014}将\\gls{dropout}与大\\gls{ensemble}的训练相比并得出结论：相比独立模型\\gls{ensemble}获得泛化误差，\\gls{dropout}会带来额外的改进。\n\\cite{WardeFarley+al-ICLR2014}将\\gls{dropout}与大\\gls{ensemble}的训练相比并得出结论：相比由独立模型\\gls{ensemble}获得的泛化误差改进，\\gls{dropout}会改进更多。\n注：是dropout对泛化误差的改进更多，those是指improvements\n\n要么是脸部的另一特征，如嘴。\n要么是像嘴这样的脸部的另一特征。\n注：如嘴这个太短了，感觉奇怪\n\n7.13\n#没什么问题 感觉挺好\n\n7.14\n！\n\\section{\\glsentrytext{tangent_distance}、\\glsentrytext{tangent_prop}和流形正切分类器}\n\\label{sec:tangent_distance_tangent_prop_and_manifold_tangent_classifier}\n如\\secref{sec:manifold_learning}所述，许多\\gls{ML}的目标旨在假设数据位于低维流形附近来克服维数灾难。\n\\section{\\glsentrytext{tangent_distance}、\\glsentrytext{tangent_prop}和流形正切分类器}\n\\label{sec:tangent_distance_tangent_prop_and_manifold_tangent_classifier}\n如\\secref{sec:manifold_learning}所述，许多\\gls{ML}通过假设数据位于低维流形附近来克服维数灾难。\n注：目标是克服维数灾难而不是这一方法\n\n！！\n当然，这种算法需要制定一个切向量。\n当然，这种算法需要指定那些切向量。\n注：One指用户，指定与后文（倒数第二段）对应。\n\n在这两种情况下，该算法的用户通过指定一组不改变网络输出的转换，编码其先验知识。\n在这两种情况下，该算法的用户通过指定一组应当不会改变网络输出的转换，将其先验知识编码至算法中。\n注：是加入先验知识认为本应不会改变输出的扰动来正则化\n\n\\gls{tangent_prop}也涉及到\\gls{double_backprop}\\citep{DruckerLeCun92}和\\gls{adversarial_training}\\citep{Szegedy-et-al-arxiv2014,Goodfellow-2015-adversarial}。\n\\gls{tangent_prop}也和\\gls{double_backprop}\\citep{DruckerLeCun92}以及\\gls{adversarial_training}\\citep{Szegedy-et-al-arxiv2014,Goodfellow-2015-adversarial}有关联。\n注：后文的意思是他们的正则化效果有一定关联。\n\n！！\n如移动身体的部分\n如正在移动的身体某些部分\n注：原文意思为对象即使在移动也是同一对象\n\n\n\n\n=============================   Replies   =============================\n\n"
  },
  {
    "path": "Chapter7/regularization.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Shenjian Zhao\n\\chapter{\\glsentrytext{DL}中的正则化}\n\\label{chap:regularization_for_deep_learning}\n\\gls{ML}中的一个核心问题是设计不仅在训练数据上表现好，并且能在新输入上泛化好的算法。\n在\\gls{ML}中，许多策略显式地被设计来减少测试误差（可能会以增大训练误差为代价）。\n这些策略被统称为\\gls{regularization}。\n我们将在后文看到，\\gls{DL}工作者可以使用许多不同形式的\\gls{regularization}策略。\n事实上，开发更有效的\\gls{regularization}策略已成为本领域的主要研究工作之一。\n\n\\chapref{chap:machine_learning_basics}介绍了\\gls{generalization}、\\gls{underfitting}、\\gls{overfitting}、\\gls{bias_sta}、\\gls{variance}和\\gls{regularization}的基本概念。\n如果你不熟悉这些概念，请参考该章节再继续阅读本章。\n\n在本章中，我们会更详细地介绍\\gls{regularization}，重点介绍深度模型（或组成深度模型的模块）的\\gls{regularization}策略。\n\n本章中的某些章节涉及\\gls{ML}中的标准概念。\n如果你已经熟悉了这些概念，可以随意跳过相关章节。\n然而，本章的大多数内容是关于这些基本概念在特定\\gls{NN}中的扩展概念。\n\n在\\secref{sec:regularization}中，我们将\\gls{regularization}定义为``对学习算法的修改——旨在减少\\gls{generalization}误差而不是训练误差''。\n目前有许多\\gls{regularization}策略。\n有些策略向\\gls{ML}模型添加限制参数值的额外约束。\n有些策略向\\gls{objective_function}增加额外项来对参数值进行软约束。\n如果我们细心选择，这些额外的约束和惩罚可以改善模型在测试集上的表现。\n有时侯，这些约束和惩罚被设计为编码特定类型的先验知识；\n其他时候，这些约束和惩罚被设计为偏好简单模型，以便提高\\gls{generalization}能力。\n有时，惩罚和约束对于确定欠定的问题是必要的。\n其他形式的\\gls{regularization}，如被称为\\gls{ensemble}的方法，则结合多个假说来解释训练数据。\n\n% -- 221 --\n\n在\\gls{DL}的背景下，大多数\\gls{regularization}策略都会对\\gls{estimator}进行\\gls{regularization}。\n\\gls{estimator}的\\gls{regularization}以\\gls{bias_sta}的增加换取\\gls{variance}的减少。\n一个有效的\\gls{regularization}是有利的``交易''，也就是能显著减少\\gls{variance}而不过度增加\\gls{bias_sta}。\n我们在\\chapref{chap:machine_learning_basics}中讨论\\gls{generalization}和\\gls{overfitting}时，主要侧重模型族训练的3个情形：（1）不包括真实的数据生成过程——对应\\gls{underfitting}和含有\\gls{bias_sta}的情况，（2）匹配真实数据生成过程，（3）包括真实的数据生成过程，同时还包括许多其他可能的生成过程——\\gls{variance}（而不是\\gls{bias_sta}）主导的\\gls{overfitting}。\n\\gls{regularization}的目标是使模型从第三种情况转化为第二种情况。\n\n在实践中，过于复杂的模型族不一定包括目标函数或真实数据生成过程，甚至也不包括近似过程。\n我们几乎从未知晓真实数据的生成过程，所以我们永远不知道被估计的模型族是否包括生成过程。\n然而，\\gls{DL}算法的大多数应用都是针对这样的情况，其中真实数据的生成过程几乎肯定在模型族之外。\n\\gls{DL}算法通常应用于极为复杂的领域，如图像、音频序列和文本，本质上这些领域的真实生成过程涉及模拟整个宇宙。\n从某种程度上说，我们总是持方枘（数据生成过程）而欲内圆凿（我们的模型族）。\n\n这意味着控制模型的复杂度不是找到合适规模的模型（带有正确的参数个数）这样一个简单的事情。\n相反，我们可能会发现，或者说在实际的深度学习场景中我们几乎总是会发现，最好的拟合模型（从最小化\\gls{generalization}误差的意义上）是一个适当\\gls{regularization}的大型模型。\n\n现在我们回顾几种策略，以创建这些\\gls{regularization}的大型深度模型。\n\n% -- 222 --\n\n\\section{参数范数惩罚}\n\\label{sec:parameter_norm_penalties}\n\\gls{regularization}在\\gls{DL}的出现前就已经被使用了数十年。\n\\gls{linear_model}，如\\gls{linear_regression}和\\gls{logistic_regression}可以使用简单、直接、有效的\\gls{regularization}策略。\n\n许多\\gls{regularization}方法通过对\\gls{objective_function} $J$添加一个参数范数惩罚$\\Omega(\\Vtheta)$，限制模型（如\\gls{NN}、\\gls{linear_regression}或\\gls{logistic_regression}）的学习能力。\n我们将正则化后的\\gls{objective_function}记为$\\tilde{J}$：\n\\begin{align}\n \\tilde{J}(\\Vtheta;\\MX, \\Vy) = J(\\Vtheta;\\MX, \\Vy) + \\alpha \\Omega(\\Vtheta),\n\\end{align}\n其中$\\alpha \\in [0, \\infty)$是权衡范数惩罚项$\\Omega$和标准\\gls{objective_function} $J(\\MX;\\Vtheta)$相对贡献的超参数。\n将$\\alpha$设为0表示没有\\gls{regularization}。\n$\\alpha$越大，对应\\gls{regularization}惩罚越大。\n\n当我们的训练算法最小化\\gls{regularization}后的\\gls{objective_function} $\\tilde{J}$时，它会降低原始目标$J$关于训练数据的误差并同时减小在某些衡量标准下参数$\\Vtheta$（或参数子集）的规模。\n选择不同的参数范数$\\Omega$会偏好不同的解。\n在本节中，我们会讨论各种范数惩罚对模型的影响。\n\n在探究不同范数的\\gls{regularization}表现之前，我们需要说明一下，在神经网络中，参数包括每一层仿射变换的权重和\\gls{bias_aff}，我们通常\\emph{只对权重}做惩罚而不对\\gls{bias_aff}做正则惩罚。\n精确拟合\\gls{bias_aff}所需的数据通常比拟合权重少得多。\n每个权重会指定两个变量如何相互作用。\n我们需要在各种条件下观察这两个变量才能良好地拟合权重。\n而每个\\gls{bias_aff}仅控制一个单变量。\n这意味着，我们不对其进行\\gls{regularization}也不会导致太大的\\gls{variance}。\n另外，\\gls{regularization}\\gls{bias_aff}参数可能会导致明显的\\gls{underfitting}。\n因此，我们使用向量$\\Vw$表示所有应受范数惩罚影响的权重，而向量$\\Vtheta$表示所有参数(包括$\\Vw$和无需\\gls{regularization}的参数)。\n\n在\\gls{NN}的情况下，有时希望对网络的每一层使用单独的惩罚，并分配不同的$\\alpha$系数。\n寻找合适的多个超参数的代价很大，因此为了减少搜索空间，我们会在所有层使用相同的\\gls{weight_decay}。\n\n% -- 223 --\n\n\\subsection{$L^2$参数\\glsentrytext{regularization}}\n\\label{sec:l2_parameter_regularization}\n在\\secref{sec:capacity_overfitting_and_underfitting}中我们已经看到过最简单而又最常见的参数范数惩罚，即通常被称为\\firstgls{weight_decay}的$L^2$参数范数惩罚。\n这个\\gls{regularization}策略通过向\\gls{objective_function}添加一个正则项$\\Omega(\\Vtheta) = \\frac{1}{2} \\norm{\\Vw}_2^2$，使权重更加接近原点\\footnote{更一般地，我们可以将参数\\gls{regularization}为接近空间中的任意特定点，令人惊讶的是这样也仍有\\gls{regularization}效果，但是特定点越接近真实值结果越好。\n当我们不知道正确的值应该是正还是负时，零是有意义的默认值。\n由于模型参数\\gls{regularization}为零的情况更为常见，我们将只探讨这种特殊情况。}。\n在其他学术圈，$L^2$也被称为\\gls{ridge_regression}或~\\gls{tikhonov_regularization}。\n\n我们可以通过研究\\gls{regularization}后\\gls{objective_function}的\\gls{gradient}，洞察一些\\gls{weight_decay}的\\gls{regularization}表现。\n为了简单起见，我们假定其中没有\\gls{bias_aff}参数，因此$\\Vtheta$就是$\\Vw$。\n这样一个模型具有以下总的\\gls{objective_function}：\n\\begin{align}\n  \\tilde{J}(\\Vw;\\MX, \\Vy) =\\frac{\\alpha}{2} \\Vw^\\top \\Vw +  J(\\Vw;\\MX, \\Vy),\n\\end{align}\n与之对应的\\gls{gradient}为\n\\begin{align}\n \\nabla_{\\Vw} \\tilde{J}(\\Vw;\\MX,\\Vy) =\\alpha \\Vw +  \\nabla_{\\Vw} J(\\Vw;\\MX, \\Vy).\n\\end{align}\n使用单步\\gls{gradient}下降更新权重，即执行以下更新：\n\\begin{align}\n \\Vw \\leftarrow \\Vw - \\epsilon(\\alpha \\Vw + \\nabla_{\\Vw} J(\\Vw;\\MX, \\Vy)).\n\\end{align}\n换种写法就是：\n\\begin{align}\n \\Vw \\leftarrow (1-\\epsilon \\alpha)\\Vw - \\epsilon \\nabla_{\\Vw} J(\\Vw;\\MX, \\Vy).\n\\end{align}\n我们可以看到，加入\\gls{weight_decay}后会引起学习规则的修改，即在每步执行通常的\\gls{gradient}更新之前先收缩权重向量（将权重向量乘以一个常数因子）。\n这是单个步骤发生的变化。\n但是，在训练的整个过程会发生什么呢？\n\n% -- 224 --\n\n我们进一步简化分析，令$\\Vw^*$为未\\gls{regularization}的\\gls{objective_function}取得最小训练误差时的权重向量，即$\\Vw^* = \\argmin_{\\Vw} J(\\Vw)$， 并在$\\Vw^*$的邻域对\\gls{objective_function}做二次近似。  \n如果\\gls{objective_function}确实是二次的(如以均方误差拟合\\gls{linear_regression}模型的情况)，则该近似是完美的。\n近似的$\\hat J(\\Vtheta)$如下\n\\begin{align}\n \\hat J(\\Vtheta) = J(\\Vw^*) + \\frac{1}{2}(\\Vw - \\Vw^*)^\\top \\MH (\\Vw - \\Vw^*),\n\\end{align}\n其中$\\MH$是$J$在$\\Vw^*$处计算的~\\gls{hessian}~矩阵(关于$\\Vw$)。\n因为$\\Vw^*$被定义为最优，即梯度消失为$0$，所以该二次近似中没有一阶项。\n同样地，因为$\\Vw^*$是$J$的一个最优点，我们可以得出$\\MH$是半正定的结论。\n\n当$\\hat J$取得最小时，其梯度\n\\begin{align}\n\\label{eq:gradient}\n  \\nabla_{\\Vw} \\hat{J}(\\Vw) = \\MH (\\Vw - \\Vw^*)\n\\end{align}\n为$0$。\n\n为了研究\\gls{weight_decay}带来的影响，我们在\\eqnref{eq:gradient}中添加\\gls{weight_decay}的梯度。 \n现在我们探讨最小化\\gls{regularization}后的$\\hat J$。\n我们使用变量$\\tilde{\\Vw}$表示此时的最优点:\n\\begin{align}\n \\alpha \\tilde{\\Vw} + \\MH (\\tilde{\\Vw} - \\Vw^*) = 0 \\\\\n (\\MH + \\alpha \\MI) \\tilde{\\Vw} = \\MH \\Vw^* \\\\\n \\tilde{\\Vw} = (\\MH + \\alpha \\MI)^{-1} \\MH \\Vw^* \\label{eq:final_w}\n \\end{align}\n\n当$\\alpha$趋向于$0$时，\\gls{regularization}的解$\\tilde{\\Vw}$会趋向$\\Vw^*$。 \n那么当$\\alpha$增加时会发生什么呢？\n因为$\\MH$是实对称的，所以我们可以将其分解为一个对角矩阵$\\VLambda$和一组特征向量的标准正交基$\\MQ$，并且有$\\MH = \\MQ \\VLambda \\MQ^\\top$。\n将其应用于\\eqnref{eq:final_w}，可得：\n\\begin{align}\n \\tilde \\Vw &= ( \\MQ \\VLambda \\MQ^\\top + \\alpha \\MI)^{-1} \\MQ \\VLambda \\MQ^\\top \\Vw^* \\\\\n                 &=  [ \\MQ( \\VLambda+ \\alpha \\MI)  \\MQ^\\top ]^{-1} \\MQ \\VLambda \\MQ^\\top \\Vw^* \\\\\n                 &= \\MQ( \\VLambda+ \\alpha \\MI)^{-1} \\VLambda \\MQ^\\top \\Vw^*. \\label{eq:713L2}\n\\end{align}\n我们可以看到\\gls{weight_decay}的效果是沿着由$\\MH$的特征向量所定义的轴缩放$\\Vw^*$。\n具体来说，我们会根据$\\frac{\\lambda_i}{\\lambda_i + \\alpha}$因子缩放与$\\MH$第$i$个特征向量对齐的$\\Vw^*$的分量。\n（不妨查看\\figref{fig:chap2_eigen_ellipse}回顾这种缩放的原理）。\n\n沿着$\\MH$特征值较大的方向(如$\\lambda_i \\gg \\alpha$)\\gls{regularization}的影响较小。\n而$\\lambda_i \\ll \\alpha$的分量将会收缩到几乎为零。\n这种效应如\\figref{fig:chap7_reg_l2}所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/reg_l2}}\n\\fi\n\\caption{$L^2$（或\\gls{weight_decay}）\\gls{regularization}对最佳$\\Vw$值的影响。\n实线椭圆表示没有\\gls{regularization}目标的等值线。\n虚线圆圈表示$L^2$正则化项的等值线。\n在$\\tilde{\\Vw}$点，这两个竞争目标达到平衡。\n目标函数$J$的~\\gls{hessian}~的第一维特征值很小。\n当从$\\Vw^*$水平移动时，\\gls{objective_function}不会增加得太多。\n因为\\gls{objective_function}对这个方向没有强烈的偏好，所以正则化项对该轴具有强烈的影响。\n正则化项将$w_1$拉向零。\n而\\gls{objective_function}对沿着第二维远离$\\Vw^*$的移动非常敏感。\n对应的特征值较大，表示高\\gls{curvature}。\n因此，\\gls{weight_decay}对$w_2$的位置影响相对较小。\n}\n\\label{fig:chap7_reg_l2}\n\\end{figure}\n\n% -- 225 --\n\n只有在显著减小\\gls{objective_function}方向上的参数会保留得相对完好。\n在无助于\\gls{objective_function}减小的方向（对应~\\gls{hessian}~矩阵较小的特征值）上改变参数不会显著增加\\gls{gradient}。\n这种不重要方向对应的分量会在训练过程中因\\gls{regularization}而衰减掉。\n\n\n目前为止，我们讨论了\\gls{weight_decay}对优化一个抽象通用的二次\\gls{cost_function}的影响。\n这些影响具体是怎么和机器学习关联的呢？\n我们可以研究\\gls{linear_regression}，它的真实\\gls{cost_function}是二次的，因此我们可以使用相同的方法分析。\n再次应用分析，我们会在这种情况下得到相同的结果，但这次我们使用训练数据的术语表述。\n\\gls{linear_regression}的\\gls{cost_function}是平方误差之和：\n\\begin{align}\n (\\MX \\Vw - \\Vy)^\\top (\\MX \\Vw - \\Vy).\n\\end{align}\n我们添加$L^2$正则项后，\\gls{objective_function}变为\n\\begin{align}\n  (\\MX \\Vw - \\Vy)^\\top (\\MX \\Vw - \\Vy) + \\frac{1}{2}\\alpha \\Vw^\\top \\Vw.\n\\end{align}\n这将普通方程的解从\n\\begin{align}\n\\label{eq:716w}\n  \\Vw = (\\MX^\\top \\MX)^{-1} \\MX^\\top \\Vy\n\\end{align}\n变为\n\\begin{align}\n\\label{eq:717mw}\n   \\Vw = (\\MX^\\top \\MX + \\alpha \\MI)^{-1} \\MX^\\top \\Vy .\n\\end{align}\n\\eqnref{eq:716w}中的矩阵$\\MX^\\top\\MX$与\\gls{covariance}矩阵$\\frac{1}{m}\\MX^\\top\\MX$成正比。\n$L^2$正则项将这个矩阵替换为\\eqnref{eq:717mw}中的$ (\\MX^\\top \\MX + \\alpha \\MI)^{-1}$\n这个新矩阵与原来的是一样的，不同的仅仅是在对角加了$\\alpha$。\n这个矩阵的对角项对应每个输入特征的\\gls{variance}。\n我们可以看到，$L^2$\\gls{regularization}能让学习算法``感知''到输入$\\Vx$具有较高的方差，这会使得学习算法压缩那些与输出目标的\\gls{covariance}较小（相对增加方差）的特征的权重。\n\n\\subsection{$L^1$参数\\glsentrytext{regularization}}\n\\label{sec:l1_regularization}\n$L^2$\\gls{weight_decay}是\\gls{weight_decay}最常见的形式，我们还可以使用其他的方法限制模型参数的规模。\n一个选择是使用$L^1$\\gls{regularization}。\n\n形式地，对模型参数$\\Vw$的$L^1$\\gls{regularization}被定义为：\n\\begin{align}\n \\Omega(\\Vtheta) = \\norm{ \\Vw }_1 = \\sum_i | w_i |,\n \\end{align}\n即各个参数的绝对值之和\\footnote{如同$L^2$\\gls{regularization}，我们也可以将参数\\gls{regularization}到其他非零值$\\Vw^{(o)}$。在这种情况下，$L^1$\\gls{regularization}将会引入不同的项$\\Omega(\\Vtheta)=\n\\|\\Vw - \\Vw^{(o)} \\|_1 = \\sum_i | w_i - w_i^{(o)} |$。}。\n接着我们将讨论$L^1$\\gls{regularization}对简单\\gls{linear_regression}模型的影响，与分析$L^2$\\gls{regularization}时一样不考虑\\gls{bias_aff}参数。  \n我们尤其感兴趣的是找出$L^1$和$L^2$\\gls{regularization}之间的差异。\n与$L^2$\\gls{weight_decay}类似，我们也可以通过缩放惩罚项$\\Omega$的正超参数$\\alpha$来控制$L^1$\\gls{weight_decay}的强度。 \n因此，\\gls{regularization}的\\gls{objective_function} $\\tilde{J}(\\Vw;\\MX, \\Vy)$如下所示\n\\begin{align}\n\\tilde{J}(\\Vw;\\MX, \\Vy) = \\alpha \\| \\Vw \\|_1 +  J(\\Vw;\\MX, \\Vy) ,\n\\end{align}\n对应的梯度(实际上是次梯度)：\n\\begin{align}\n\\label{eq:subgradient}\n  \\nabla_{\\Vw} \\tilde{J}(\\Vw; \\MX, \\Vy) = \\alpha \\text{sign}(\\Vw) + \\nabla_{\\Vw} J(\\Vw; \\MX, \\Vy), % ?? may be wrong\n\\end{align}\n其中$\\text{sign}(\\Vw)$只是简单地取$\\Vw$各个元素的正负号。\n\n% -- 227 --\n\n观察\\eqnref{eq:subgradient}，我们立刻发现$L^1$的\\gls{regularization}效果与$L^2$大不一样。\n具体来说，我们可以看到\\gls{regularization}对\\gls{gradient}的影响不再是线性地缩放每个$w_i$；而是添加了一项与$\\text{sign}(w_i)$同号的常数。\n使用这种形式的\\gls{gradient}之后，我们不一定能得到$J(\\MX, \\Vy;\\Vw)$二次近似的直接算术解（$L^2$\\gls{regularization}时可以）。 \n \n简单\\gls{linear_model}具有二次\\gls{cost_function}，我们可以通过\\gls{taylor}级数表示。\n或者我们可以设想，这是逼近更复杂模型的\\gls{cost_function}的截断\\gls{taylor}级数。\n在这个设定下，\\gls{gradient}由下式给出\n\\begin{align}\n  \\nabla_{\\Vw} \\hat{J}(\\Vw) = \\MH (\\Vw - \\Vw^*),\n\\end{align}\n同样，$\\MH$是$J$在$\\Vw^*$处的\\gls{hessian}矩阵(关于$\\Vw$)。\n\n由于$L^1$惩罚项在完全一般化的~\\gls{hessian}~的情况下，无法得到直接清晰的代数表达式，因此我们将进一步简化假设~\\gls{hessian}~是对角的，即$\\MH = \\text{diag}([H_{1,1},\\dots, H_{n,n}])$，其中每个$H_{i,i}>0$。\n如果\\gls{linear_regression}问题中的数据已被预处理（如可以使用PCA），去除了输入特征之间的相关性，那么这一假设成立。\n\n我们可以将$L^1$\\gls{regularization}目标函数的二次近似分解成关于参数的求和：\n\\begin{align}\n \\hat J(\\Vw; \\MX, \\Vy) = J(\\Vw^*; \\MX, \\Vy) + \\sum_i \\Bigg [\\frac{1}{2} H_{i,i} (w_i - w_i^*)^2 \n + \\alpha |w_i| \\Bigg].  % I think this is correct\n\\end{align}\n如下列形式的解析解（对每一维$i$）可以最小化这个近似\\gls{cost_function}：\n\\begin{align}\nw_i = \\text{sign}(w_i^*) \\max\\Big\\{ |w_i^*| - \\frac{\\alpha}{H_{i,i}} , 0\\Big\\} .\n\\end{align}\n对每个$i$,考虑$w_i^* > 0$的情形，会有两种可能结果：\n\\begin{enumerate}\n\\item $w_i^* \\leq \\frac{\\alpha}{H_{i,i}}$的情况。\n\\gls{regularization}后目标中的$w_i$最优值是$w_i = 0$。\n这是因为在方向$i$上$J(\\Vw; \\MX, \\Vy) $对$ \\hat J(\\Vw; \\MX, \\Vy)$的贡献被抵消，$L^1$\\gls{regularization}项将$w_i$推至$0$。\n\\item  $w_i^* > \\frac{\\alpha}{H_{i,i}}$的情况。在这种情况下，\\gls{regularization}不会将$w_i$的最优值推至0，而仅仅在那个方向上移动$\\frac{\\alpha}{H_{i,i}}$的距离。\n\\end{enumerate}\n$w_i^* < 0$的情况与之类似，但是$L^1$惩罚项使$w_i$更接近0(增加$ \\frac{\\alpha}{H_{i,i}}$)或者为0。\n\n相比$L^2$\\gls{regularization}，$L^1$\\gls{regularization}会产生更\\firstgls{sparse}的解。\n此处\\gls{sparse}性指的是最优值中的一些参数为$0$。\n和$L^2$\\gls{regularization}相比，$L^1$\\gls{regularization}的\\gls{sparse}性具有本质的不同。\n\\eqnref{eq:713L2}给出了$L^2$\\gls{regularization}的解$\\tilde \\Vw$。 \n如果我们使用~\\gls{hessian}~矩阵$\\MH$为对角正定矩阵的假设（与$L^1$\\gls{regularization}分析时一样），重新考虑这个等式，我们发现\n$\\tilde{w_i} = \\frac{H_{i,i}}{H_{i,i} + \\alpha} w_i^*$。\n如果$w_i^*$不是零，那么$\\tilde{w_i}$也会保持非零。 \n这表明$L^2$\\gls{regularization}不会使参数变得\\gls{sparse}，而$L^1$\\gls{regularization}有可能通过足够大的$\\alpha$实现\\gls{sparse}。\n \n由$L^1$\\gls{regularization}导出的\\gls{sparse}性质已经被广泛地用于\\firstgls{feature_selection}机制。\n\\gls{feature_selection}从可用的特征子集选择出有意义的特征，化简\\gls{ML}问题。\n著名的LASSO~\\citep{Tibshirani95}（Least Absolute Shrinkage and\nSelection Operator）模型将$L^1$惩罚和\\gls{linear_model}结合，并使用最小二乘\\gls{cost_function}。 \n$L^1$惩罚使部分子集的权重为零，表明相应的特征可以被安全地忽略。\n \n在\\secref{sec:maximum_a_posteriori_map_estimation}，我们看到许多\\gls{regularization}策略可以被解释为~\\glssymbol{MAP}~贝叶斯推断，\n特别是$L^2$\\gls{regularization}相当于权重是高斯先验的~\\glssymbol{MAP}~贝叶斯推断。\n对于$L^1$\\gls{regularization}，用于\\gls{regularization}\\gls{cost_function}的惩罚项$\\alpha \\Omega(\\Vw) =  \\alpha \\sum_i |w_i |$与通过~\\glssymbol{MAP}~贝叶斯推断最大化的对数先验项是等价的（$\\Vw \\in \\SetR^n$并且权重先验是各向同性的拉普拉斯分布（\\eqnref{eq:chap3_laplace}））：\n\\begin{align}\n\\log p(\\Vw) = \\sum_i \\log \\text{Laplace}(w_i;0,\\frac{1}{\\alpha}) = \n  -\\alpha \\norm{\\Vw}_1 + n \\log \\alpha - n \\log 2.\n\\end{align}\n因为是关于$\\Vw$最大化进行学习，我们可以忽略$\\log \\alpha - \\log 2$项，因为它们与$\\Vw$无关。\n \n % -- 229 --\n \n \\section{作为约束的范数惩罚}\n \\label{sec:7.2}\n考虑经过参数范数\\gls{regularization}的\\gls{cost_function}：\n\\begin{align}\n \\tilde{J}(\\Vtheta;\\MX, \\Vy) = J(\\Vtheta;\\MX, \\Vy) + \\alpha \\Omega(\\Vtheta) .\n\\end{align}\n\n回顾\\secref{sec:constrained_optimization}我们可以构造一个\\gls{generalized_lagrange_function}来最小化带约束的函数，即在原始\\gls{objective_function}上添加一系列惩罚项。\n每个惩罚是一个被称为\\firstgls{KKT}乘子的系数以及一个表示约束是否满足的函数之间的乘积。\n如果我们想约束$\\Omega(\\Vtheta)$小于某个常数$k$，我们可以构建\\gls{generalized_lagrange_function}\n\\begin{align}\n \\CalL(\\Vtheta, \\alpha; \\MX, \\Vy) = J(\\Vtheta; \\MX, \\Vy) + \\alpha (\\Omega(\\Vtheta) - k).\n\\end{align}\n\n这个约束问题的解由下式给出\n\\begin{align}\n \\Vtheta^* = \\underset{\\Vtheta}{ \\argmin} \\underset{\\alpha, \\alpha \\geq 0}{\\max} \\CalL(\\Vtheta, \\alpha).\n\\end{align}\n\n如\\secref{sec:constrained_optimization}中描述的，解决这个问题我们需要对$\\Vtheta$和$\\alpha$都做出调整。\n\\secref{sec:example_linear_least_squares}给出了一个带$L^2$约束的\\gls{linear_regression}实例。\n还有许多不同的优化方法，有些可能会使用\\gls{GD}而其他可能会使用\\gls{gradient}为0的解析解，但在所有过程中$\\alpha$在$\\Omega(\\Vtheta) > k$时必须增加，在$\\Omega(\\Vtheta) < k$时必须减小。\n所有正值的$\\alpha$都鼓励$\\Omega(\\Vtheta)$收缩。\n最优值$\\alpha^*$也将鼓励$\\Omega(\\Vtheta)$收缩，但不会强到使得$\\Omega(\\Vtheta)$小于$k$。\n\n为了洞察约束的影响，我们可以固定$\\alpha^*$，把这个问题看成只跟$\\Vtheta$有关的函数：\n\\begin{align}\n \\Vtheta^* =  \\underset{\\Vtheta}{ \\argmin} ~\\CalL(\\Vtheta, \\alpha^*) = \n \\underset{\\Vtheta}{ \\argmin}~\n J(\\Vtheta; \\MX, \\Vy) + \\alpha^* \\Omega(\\Vtheta).\n\\end{align}\n这和最小化$\\tilde J$的\\gls{regularization}训练问题是完全一样的。\n因此，我们可以把参数范数惩罚看作对权重强加的约束。\n如果$\\Omega$是$L^2$范数，那么权重就是被约束在一个$L^2$球中。\n如果$\\Omega$是$L^1$范数，那么权重就是被约束在一个$L^1$范数限制的区域中。\n通常我们不知道\\gls{weight_decay}系数$\\alpha^*$约束的区域大小，因为$\\alpha^*$的值不直接告诉我们$k$的值。\n原则上我们可以解得$k$，但$k$和$\\alpha^*$之间的关系取决于$J$的形式。\n虽然我们不知道约束区域的确切大小，但我们可以通过增加或者减小$\\alpha$来大致扩大或收缩约束区域。\n较大的$\\alpha$，将得到一个较小的约束区域。\n较小的$\\alpha$，将得到一个较大的约束区域。\n\n% -- 230 --\n\n有时候，我们希望使用显式的限制，而不是惩罚。\n如\\secref{sec:constrained_optimization}所述，我们可以修改下降算法（如\\gls{SGD}算法），使其先计算$J(\\Vtheta)$的下降步，然后将$\\Vtheta$投影到满足$\\Omega(\\Vtheta) < k$的最近点。\n如果我们知道什么样的$k$是合适的，而不想花时间寻找对应于此$k$处的$\\alpha$值，这会非常有用。\n\n另一个使用显式约束和重投影而不是使用惩罚强加约束的原因是惩罚可能会导致\\gls{objective_function}非凸而使算法陷入局部极小(对应于小的$\\Vtheta$）。\n当训练\\gls{NN}时，这通常表现为训练带有几个``死亡单元''的\\gls{NN}。\n这些单元不会对网络学到的函数有太大影响，因为进入或离开它们的权重都非常小。\n当使用权重范数的惩罚训练时，即使可以通过增加权重以显著减少$J$，这些配置也可能是局部最优的。\n因为重投影实现的显式约束不鼓励权重接近原点，所以在这些情况下效果更好。\n通过重投影实现的显式约束只在权重变大并试图离开限制区域时产生作用。\n\n最后，因为重投影的显式约束还对优化过程增加了一定的稳定性，所以这是另一个好处。\n当使用较高的学习率时，很可能进入正反馈，即大的权重诱导大\\gls{gradient}，然后使得权重获得较大更新。\n如果这些更新持续增加权重的大小，$\\Vtheta$就会迅速增大，直到离原点很远而发生溢出。\n重投影的显式约束可以防止这种反馈环引起权重无限制地持续增加。\n\\cite{Hinton-et-al-arxiv2012}建议结合使用约束和高学习速率，这样能更快地探索参数空间，并保持一定的稳定性。\n\n% -- 231 --\n\n\\cite{Hinton-et-al-arxiv2012}尤其推荐由\\cite{Srebro05}引入的策略：约束\\gls{NN}层的权重矩阵每列的范数，而不是限制整个权重矩阵的~\\ENNAME{Frobenius}~范数。\n分别限制每一列的范数可以防止某一\\gls{hidden_unit}有非常大的权重。\n如果我们将此约束转换成~\\ENNAME{Lagrange}~函数中的一个惩罚，这将与$L^2$ \\gls{weight_decay}类似但每个\\gls{hidden_unit}的权重都具有单独的~\\glssymbol{KKT}~乘子。\n每个~\\glssymbol{KKT}~乘子分别会被动态更新，以使每个\\gls{hidden_unit}服从约束。\n在实践中，列范数的限制总是通过重投影的显式约束来实现。\n\n\\section{\\glsentrytext{regularization}和欠约束问题}\n\\label{sec:regularization_and_under_constrained_problems}\n在某些情况下，为了正确定义\\gls{ML}问题，\\gls{regularization}是必要的。\n\\gls{ML}中许多\\gls{linear_model}，包括\\gls{linear_regression}和PCA，都依赖于对矩阵$\\MX^\\top\\MX$求逆。\n只要$\\MX^\\top\\MX$是奇异的，这些方法就会失效。\n当数据生成分布在一些方向上确实没有差异时，或因为例子较少（即相对输入特征的维数来说）而在一些方向上没有观察到\\gls{variance}时，这个矩阵就是奇异的。\n在这种情况下，（人们往往使得）\\gls{regularization}的许多形式对应求逆$\\MX^\\top\\MX + \\alpha \\MI$。\n（因为）这个\\gls{regularization}矩阵可以保证是可逆的。\n\n相关矩阵可逆时，这些线性问题有\\gls{closed_form_solution}。\n没有\\gls{closed_form_solution}的问题也可能是欠定的。\n一个例子是应用于线性可分问题的\\gls{logistic_regression}。\n如果权重向量$\\Vw$能够实现完美分类，那么$2 \\Vw$也会以更高似然实现完美分类。\n类似\\gls{SGD}的迭代优化算法将持续增加$\\Vw$的大小，理论上永远不会停止。\n在实践中，数值实现的\\gls{GD}最终会达到导致数值溢出的超大权重，此时的行为将取决于程序员如何处理这些不是真正数字的值。\n\n大多数形式的\\gls{regularization}能够保证应用于欠定问题的迭代方法收敛。\n例如，当似然的斜率等于\\gls{weight_decay}的系数时， \\gls{weight_decay}将阻止\\gls{GD}继续增加权重的大小。\n\n使用\\gls{regularization}解决欠定问题的想法不局限于\\gls{ML}。\n同样的想法在几个基本线性代数问题中也非常有用。\n\n% -- 232 --\n\n正如我们在\\secref{sec:the_moore_penrose_pseudoinverse}看到的，我们可以使用~\\ENNAME{Moore-Penrose}~求解欠定线性方程。 \n回想$\\MX$伪逆$\\MX^+$的一个定义：\n\\begin{align} \n\\label{eq:729pseudo}\n \\MX^+ = \\lim_{\\alpha \\searrow 0} (\\MX^\\top \\MX + \\alpha \\MI)^{-1}\\MX^\\top.\n\\end{align}\n现在我们可以将\\secref{eq:729pseudo}看作进行具有\\gls{weight_decay}的\\gls{linear_regression}。\n具体来说，当\\gls{regularization}系数趋向0时，\\eqnref{eq:729pseudo}是\\eqnref{eq:717mw}的极限。\n因此，我们可以将伪逆解释为使用\\gls{regularization}来稳定欠定问题。\n\n\n\\section{数据集增强}\n\\label{sec:dataset_augmentation_chap7}\n让\\gls{ML}模型泛化得更好的最好办法是使用更多的数据进行训练。\n当然，在实践中，我们拥有的数据量是很有限的。\n解决这个问题的一种方法是创建假数据并添加到训练集中。\n对于一些\\gls{ML}任务，创建新的假数据相当简单。\n\n对分类来说这种方法是最简单的。\n分类器需要一个复杂的高维输入$\\Vx$，并用单个类别标识$y$概括$\\Vx$。\n这意味着分类面临的一个主要任务是要对各种各样的变换保持不变。\n我们可以轻易通过转换训练集中的$\\Vx$来生成新的$(\\Vx, y)$对。\n\n这种方法对于其他许多任务来说并不那么容易。\n例如，除非我们已经解决了密度估计问题，否则在密度估计任务中生成新的假数据是很困难的。\n\n数据集增强对一个具体的分类问题来说是特别有效的方法：对象识别。\n图像是高维的并包括各种巨大的变化因素，其中有许多可以轻易地模拟。\n即使模型已使用卷积和\\gls{pooling}技术（\\chapref{chap:convolutional_networks}）对部分平移保持不变，沿训练图像每个方向平移几个像素的操作通常可以大大改善泛化。\n许多其他操作如旋转图像或缩放图像也已被证明非常有效。\n\n我们必须要小心，不能使用会改变类别的转换。\n例如，光学字符识别任务需要认识到``b''和``d''以及``6''和``9''的区别，所以对这些任务来说，水平翻转和旋转$180^{\\circ}$并不是合适的数据集增强方式。\n\n% -- 233 --\n\n能保持我们希望的分类不变，但不容易执行的转换也是存在的。\n例如，平面外绕轴转动难以通过简单的几何运算在输入像素上实现。\n\n数据集增强对语音识别任务也是有效的\\citep{Jaitly_VTLP_2013}。\n\n在\\gls{NN}的输入层注入噪声\\citep{SietsmaDow91}也可以被看作是数据增强的一种方式。\n对于许多分类甚至一些回归任务而言，即使小的随机噪声被加到输入，任务仍应该是能够被解决的。\n然而 ，\\gls{NN}被证明对噪声不是非常健壮\\citep{TangElias10}。\n改善\\gls{NN}健壮性的方法之一是简单地将随机噪声添加到输入再进行训练。\n输入噪声注入是一些\\gls{unsupervised_learning}算法的一部分，如\\gls{DAE}\\citep{VincentPLarochelleH2008}。\n向\\gls{hidden_unit}施加噪声也是可行的，这可以被看作在多个抽象层上进行的数据集增强。\n\\cite{Poole14}最近表明，噪声的幅度被细心调整后，该方法是非常高效的。\n我们将在\\secref{sec:dropout}介绍一个强大的\\gls{regularization}策略~\\gls{dropout}，该策略可以被看作是通过与噪声\\emph{相乘}构建新输入的过程。\n\n在比较\\gls{ML}基准测试的结果时，考虑其采取的数据集增强是很重要的。\n通常情况下，人工设计的数据集增强方案可以大大减少\\gls{ML}技术的泛化误差。\n将一个\\gls{ML}算法的性能与另一个进行对比时，对照实验是必要的。\n在比较\\gls{ML}算法A和\\gls{ML}算法B时，应该确保这两个算法使用同一人工设计的数据集增强方案。\n假设算法$A$在没有数据集增强时表现不佳，而$B$结合大量人工转换的数据后表现良好。\n在这样的情况下，很可能是合成转化引起了性能改进，而不是\\gls{ML}算法$B$比算法$A$更好。 \n有时候，确定实验是否已经适当控制需要主观判断。\n例如，向输入注入噪声的\\gls{ML}算法是执行数据集增强的一种形式。\n通常，普适操作（例如，向输入添加高斯噪声）被认为是\\gls{ML}算法的一部分，\n而特定于一个应用领域（如随机地裁剪图像）的操作被认为是独立的预处理步骤。\n\n% -- 234 --\n\n\\section{噪声鲁棒性}\n\\label{sec:noise_robustness}\n\n\\secref{sec:dataset_augmentation_chap7}已经提出将噪声作用于输入，作为数据集增强策略。\n对于某些模型而言，向输入添加方差极小的噪声等价于对权重施加范数惩罚\\citep{Bishop1995,bishop95training}。\n在一般情况下，注入噪声远比简单地收缩参数强大，特别是噪声被添加到\\gls{hidden_unit}时会更加强大。\n向\\gls{hidden_unit}添加噪声是值得单独讨论重要的话题；在\\secref{sec:dropout}所述~\\gls{dropout}~算法是这种做法的主要发展方向。\n\n另一种\\gls{regularization}模型的噪声使用方式是将其加到权重。\n这项技术主要用于\\gls{RNN}~\\citep{JimGilesHorne1996,Graves-2011}。\n这可以被解释为关于权重的贝叶斯\\gls{inference}的随机实现。\n贝叶斯学习过程将权重视为不确定的，并且可以通过概率分布表示这种不确定性。\n向权重添加噪声是反映这种不确定性的一种实用的随机方法。\n\n在某些假设下，施加于权重的噪声可以被解释为与更传统的\\gls{regularization}形式等同，鼓励要学习的函数保持稳定。\n我们研究回归的情形，也就是训练将一组特征$\\Vx$映射成一个标量的函数$\\hat y(\\Vx)$，并使用最小二乘\\gls{cost_function}衡量模型预测值$\\hat y(\\Vx)$与真实值$y$的误差：\n\\begin{align}\n J = \\SetE_{p(x,y)}[(\\hat y(\\Vx) - y)^2].\n\\end{align}\n训练集包含$m$对标注样例$\\{(\\Vx^{(1)}, y^{(1)}),\\dots,(\\Vx^{(m)}, y^{(m)})\\}$。\n\n现在我们假设对每个输入表示，网络权重添加随机扰动$\\epsilon_{\\Vw} \\sim \\CalN(\\Vepsilon;0, \\eta\\MI \\, )$。\n想象我们有一个标准的$l$层MLP。\n我们将扰动模型记为$\\hat y_{\\epsilon_{\\MW}} (\\Vx)$。\n尽管有噪声注入，我们仍然希望减少网络输出误差的平方。\n因此目标函数变为：\n\\begin{align}\n \\tilde J_{\\MW} &= \\SetE_{p(\\Vx,y,\\epsilon_{\\MW})}[(\\hat y_{\\epsilon_{\\MW}}(\\Vx) - y)^2] \\\\\n   &=  \\SetE_{p(\\Vx,y,\\epsilon_{\\MW})}[\\hat y_{\\epsilon_{\\MW}}^2(\\Vx) -  2y\\hat y_{\\epsilon_{\\MW}}\n   (\\Vx)+ y^2] .\n\\end{align}\n\n对于小的$\\eta$，最小化带权重噪声（方差为$\\eta \\MI$\\,）的$J$等同于最小化附加\\gls{regularization}项：\n$ \\eta \\SetE_{p(\\Vx,y)}[\\norm{\\nabla_{\\MW}~\\hat y(\\Vx)}^2]$的$J$。\n这种形式的\\gls{regularization}鼓励参数进入权重小扰动对输出相对影响较小的参数空间区域。\n换句话说，它推动模型进入对权重小的变化相对不敏感的区域，找到的点不只是极小点，还是由平坦区域所包围的极小点\\citep{Hochreiter95}。\n在简化的线性回归中（例如，$\\hat y(\\Vx) = \\Vw^\\top \\Vx + b$），正则项退化为$ \\eta \\SetE_{p(\\Vx)}[\\norm{\\Vx}^2]$，这与函数的参数无关，因此不会对$\\tilde J_{\\Vw}$关于模型参数的梯度有影响。\n\n% -- 235 --\n\n\\subsection{向输出目标注入噪声}\n\\label{sec:injecting_noise_at_the_output_targets}\n大多数数据集的$y$标签都有一定错误。\n错误的$y$不利于最大化$\\log p(y \\mid \\Vx)$。\n避免这种情况的一种方法是显式地对标签上的噪声进行建模。\n例如，我们可以假设，对于一些小常数$\\epsilon$，训练集标记$y$是正确的概率是$1-\\epsilon$，（以$\\epsilon$的概率）任何其他可能的标签也可能是正确的。\n这个假设很容易就能解析地与\\gls{cost_function}结合，而不用显式地抽取噪声样本。\n例如，\\textbf{标签平滑}（label smoothing）通过把确切分类目标从0和1替换成$\\frac{\\epsilon}{k-1}$和$1-\\epsilon$，\\gls{regularization}具有$k$个输出的~\\gls{softmax}~的模型。\n标准交叉熵损失可以用在这些非确切目标的输出上。\n使用~\\gls{softmax}~和明确目标的最大似然学习可能永远不会收敛——\n\\gls{softmax}~永远无法真正预测0概率或1概率，因此它会继续学习越来越大的权重，使预测更极端。\n使用如\\gls{weight_decay}等其他\\gls{regularization}策略能够防止这种情况。\n标签平滑的优势是能够防止模型追求确切概率而不影响模型学习正确分类。\n这种策略自20世纪80年代就已经被使用，并在现代神经网络继续保持显著特色\\citep{Szegedy-et-al-2015}。\n\n% -- 236 --\n\n\\section{\\glsentrytext{semi_supervised_learning}}\n\\label{sec:semi_supervised_learning}\n在\\gls{semi_supervised_learning}的框架下，$P(\\RVx)$产生的未标记样本和$P(\\RVx, \\RVy)$中的标记样本都用于估计$P(\\RVy \\mid \\RVx)$或者根据$\\RVx$预测$\\RVy$。\n\n在\\gls{DL}的背景下，\\gls{semi_supervised_learning}通常指的是学习一个\\gls{representation} $\\Vh = f(\\Vx)$。 \n学习\\gls{representation}的目的是使相同类中的\\gls{example}有类似的表示。\n\\gls{unsupervised_learning}可以为如何在\\gls{representation}空间聚集\\gls{example}提供有用线索。\n在输入空间紧密聚集的\\gls{example}应该被映射到类似的表示。\n在许多情况下，新空间上的线性分类器可以达到较好的泛化\\citep{Belkin+Niyogi-2002,Chapelle+al-2003}。\n这种方法的一个经典变种是使用\\gls{PCA}作为分类前（在投影后的数据上分类）的预处理步骤。\n\n我们可以构建这样一个模型，其中生成模型$P(\\RVx)$或$P(\\RVx, \\RVy)$与判别模型$P(\\RVy \\mid \\RVx)$共享参数，而不用分离\\gls{unsupervised}和\\gls{supervised}部分。\n我们权衡\\gls{supervised}模型\\gls{criterion} $-\\log P(\\RVy \\mid \\RVx)$和\\gls{unsupervised}或生成模型\\gls{criterion}（如$-\\log P(\\RVx)$或$-\\log P(\\RVx, \\RVy)$）。\n生成模型\\gls{criterion}表达了对\\gls{supervised_learning}问题解的特殊形式的先验知识\\citep{LasserreJ2006}，即$P(\\RVx)$的结构通过某种共享参数的方式连接到$P(\\RVy \\mid \\RVx)$。\n通过控制在总\\gls{criterion}中的生成\\gls{criterion}，我们可以获得比纯生成或纯判别训练\\gls{criterion}更好的权衡\\citep{LasserreJ2006,Larochelle+Bengio-2008-small}。\n\n\\cite{Russ+Geoff-nips-2007}描述了一种学习回归\\gls{kernel_machines}中核函数的方法，其中建模$P(\\RVx)$时使用的未标记样本大大提高了$P(\\RVy \\mid \\RVx)$的效果。\n\n更多\\gls{semi_supervised_learning}的信息，请参阅~\\cite{Chapelle-2006}。\n\n\\section{\\glsentrytext{multitask_learning}}\n\\label{sec:multitask_learning}\n\\gls{multitask_learning}~\\citep{caruana93a}是通过合并几个任务中的样例（可以视为对参数施加的软约束）来提高泛化的一种方式。\n正如额外的训练样本能够将模型参数推向具有更好泛化能力的值一样，当模型的一部分被多个额外的任务共享时，这部分将被约束为良好的值（如果共享合理），通常会带来更好的泛化能力。\n\n\\figref{fig:chap7_multi_factor_output}展示了\\gls{multitask_learning}中非常普遍的一种形式，其中不同的\\gls{supervised}任务（给定$\\RVx$预测$\\RVy^{(i)}$）共享相同的输入$\\RVx$以及一些中间层表示$\\Vh^{(\\text{share})}$，能学习共同的因素池。\n该模型通常可以分为两类相关的参数：\n\\begin{enumerate}\n \\item 具体任务的参数 （只能从各自任务的样本中实现良好的泛化）。如\\figref{fig:chap7_multi_factor_output}中的上层。\n \\item 所有任务共享的通用参数（从所有任务的汇集数据中获益）。如\\figref{fig:chap7_multi_factor_output}中的下层。\n\\end{enumerate}\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/multi_factor_output}}\n\\fi\n\\caption{\\gls{multitask_learning}在深度学习框架中可以以多种方式进行，该图说明了任务共享相同输入但涉及不同目标随机变量的常见情况。\n\\gls{deep_network}的较低层（无论是\\gls{supervised}前馈的，还是包括向下箭头的生成组件）可以跨这样的任务共享，而任务特定的参数（分别关联于从$\\Vh^{(1)}$和$\\Vh^{(2)}$进入和发出的权重）可以在共享表示$\\Vh^{(\\text{shared})}$之上学习。\n这里的基本假设是存在解释输入$\\RVx$变化的共同因素池，而每个任务与这些因素的子集相关联。\n在该示例中，额外假设顶层\\gls{hidden_unit} $\\Vh^{(1)}$和$\\Vh^{(2)}$专用于每个任务（分别预测$\\RVy^{(1)}$和$\\RVy^{(2)}$），而一些中间层表示$\\Vh^{(\\text{shared})}$在所有任务之间共享。\n在\\gls{unsupervised_learning}情况下，一些顶层因素不与输出任务$(\\Vh^{(3)})$的任意一个关联是有意义的：这些因素可以解释一些输入变化但与预测$\\RVy^{(1)}$或$\\RVy^{(2)}$不相关。\n}\n\\label{fig:chap7_multi_factor_output}\n\\end{figure}\n\n因为共享参数，其统计强度可大大提高（共享参数的样本数量相对于单任务模式增加的比例），并能改善泛化和泛化误差的范围\\citep{baxter95a}。\n当然，仅当不同的任务之间存在某些统计关系的假设是合理（意味着某些参数能通过不同任务共享）时才会发生这种情况。\n\n从\\gls{DL}的观点看，底层的先验知识如下：\\emph{能解释数据变化（在与之相关联的不同任务中观察到）的因素中，某些因素是跨两个或更多任务共享的。}\n\n% -- 238 --\n\n\\section{\\glsentrytext{early_stopping}}\n\\label{sec:early_stopping}\n当训练有足够的表示能力甚至会过拟合的大模型时，我们经常观察到，训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。\n\\figref{fig:chap7_learning_curve}是这些现象的一个例子，这种现象总是非常可靠地反复出现。\n\n\n这意味着我们只要返回使验证集误差最低的参数设置，就可以获得验证集误差更低的模型（并且因此有希望获得更好的测试误差）。\n在每次验证集误差有所改善后，我们存储模型参数的副本。\n当训练算法终止时，我们返回这些参数而不是最新的参数。\n当验证集上的误差在事先指定的循环次数内没有进一步改善时，算法就会终止。\n此过程在\\algref{alg:early_stopping}中有更正式的说明。\n\n\n% -- 239 --\n\n这种策略被称为\\firstgls{early_stopping}。\n这可能是\\gls{DL}中最常用的\\gls{regularization}形式。\n它的流行主要是因为有效性和简单性。\n\n\\begin{algorithm}[ht]\n\\caption{用于确定最佳训练时间量的\\gls{early_stopping}元算法。\n这种元算法是一种通用策略，可以很好地在各种训练算法和各种量化验证集误差的方法上工作。\n}\n\\label{alg:early_stopping}\n\\begin{algorithmic}\n\\STATE 令 $n$ 为评估间隔的步数。\n\\STATE 令 $p$ 为 ``耐心(patience)''，即观察到较坏的验证集表现$p$次后终止。 \n\\STATE 令 $\\Vtheta_{o}$ 为初始参数。\n\\STATE $\\Vtheta \\leftarrow \\Vtheta_{o}$\n\\STATE $i \\leftarrow 0$\n\\STATE $j \\leftarrow 0$\n\\STATE $v \\leftarrow \\infty$\n\\STATE $\\Vtheta^* \\leftarrow \\Vtheta$\n\\STATE $i^* \\leftarrow i$\n\\WHILE{$j < p$}\n    \\STATE 运行训练算法$n$步，更新 $\\Vtheta$ 。\n    \\STATE $i \\leftarrow i + n$\n    \\STATE $v' \\leftarrow \\text{ValidationSetError}(\\Vtheta)$\n    \\IF{$v' < v$}\n        \\STATE $j \\leftarrow 0$\n        \\STATE $\\Vtheta^* \\leftarrow \\Vtheta$\n        \\STATE $i^* \\leftarrow i$\n        \\STATE $v \\leftarrow v'$\n    \\ELSE\n        \\STATE $j \\leftarrow j + 1$\n    \\ENDIF\n\\ENDWHILE\n% pdflatex told me \\RETURN was not recognized, wtf\n\\STATE 最佳参数为 $\\Vtheta^*$，最佳训练步数为$i^*$\n\\end{algorithmic}\n\\end{algorithm}\n\n\n我们可以认为\\gls{early_stopping}是非常高效的超参数选择算法。\n按照这种观点，训练步数仅是另一个超参数。\n我们从\\figref{fig:chap7_learning_curve}可以看到，这个超参数在验证集上具有U型性能曲线。\n很多控制模型容量的超参数在验证集上都是这样的U型性能曲线，如\\figref{fig:chap5_generalization_vs_capacity}。\n在\\gls{early_stopping}的情况下，我们通过控制拟合训练集的步数来控制模型的有效容量。\n大多数超参数的选择必须使用高代价的猜测和检查过程，我们需要在训练开始时猜测一个超参数，然后运行几个步骤检查它的训练效果。\n``训练时间''是唯一只要跑一次训练就能尝试很多值的超参数。\n通过\\gls{early_stopping}自动选择超参数的唯一显著的代价是训练期间要定期评估验证集。\n在理想情况下，这可以并行在与主训练过程分离的机器上，或独立的CPU，或独立的GPU上完成。\n如果没有这些额外的资源，可以使用比训练集小的验证集或较不频繁地评估验证集来减小评估代价，较粗略地估算取得最佳的训练时间。\n\n另一个\\gls{early_stopping}的额外代价是需要保持最佳的参数副本。\n这种代价一般是可忽略的，因为可以将它储存在较慢较大的存储器上（例如，在GPU内存中训练，但将最佳参数存储在主存储器或磁盘驱动器上）。\n由于最佳参数的写入很少发生而且从不在训练过程中读取，这些偶发的慢写入对总训练时间的影响不大。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/learning_curve_color}}\n\\fi\n\\caption{学习曲线显示负对数似然损失如何随时间变化（表示为遍历数据集的训练迭代数，或\\firstgls{epochs}）。\n在这个例子中，我们在MNIST上训练了一个~\\gls{maxout}~网络。\n我们可以观察到训练目标随时间持续减小，但验证集上的平均损失最终会再次增加，形成不对称的U形曲线。\n}\n\\label{fig:chap7_learning_curve}\n\\end{figure}\n\n% -- 240 --\n\n\\gls{early_stopping}是一种非常不显眼的\\gls{regularization}形式，它几乎不需要改变基本训练过程、\\gls{objective_function}或一组允许的参数值。\n这意味着，无需破坏学习动态就能很容易地使用\\gls{early_stopping}。\n相对于\\gls{weight_decay}，必须小心不能使用太多的\\gls{weight_decay}，以防网络陷入不良\\gls{local_minimum}(对应于病态的小权重)。\n\n\\gls{early_stopping}可单独使用或与其他的\\gls{regularization}策略结合使用。\n即使为鼓励更好泛化，使用\\gls{regularization}策略改进\\gls{objective_function}，在训练目标的\\gls{local_minimum}达到最好泛化也是非常罕见的。\n\n\\gls{early_stopping}需要验证集，这意味着某些训练数据不能被馈送到模型。\n为了更好地利用这一额外的数据，我们可以在完成\\gls{early_stopping}的首次训练之后，进行额外的训练。\n在第二轮，即额外的训练步骤中，所有的训练数据都被包括在内。\n有两个基本的策略都可以用于第二轮训练过程。\n\n% -- 241 --\n\n一个策略（\\algref{alg:early_stopping_retrain}）是再次初始化模型，然后使用所有数据再次训练。\n在这个第二轮训练过程中，我们使用第一轮\\gls{early_stopping}训练确定的最佳步数。\n此过程有一些细微之处。\n例如，我们没有办法知道重新训练时，对参数进行相同次数的更新和对数据集进行相同次数的遍历哪一个更好。\n由于训练集变大了，在第二轮训练时，每一次遍历数据集将会更多次地更新参数。\n\n另一个策略是保持从第一轮训练获得的参数，然后使用全部的数据\\emph{继续}训练。\n在这个阶段，已经没有验证集指导我们需要在训练多少步后终止。\n取而代之，我们可以监控验证集的平均损失函数，并继续训练，直到它低于\\gls{early_stopping}过程终止时的目标值。\n此策略避免了重新训练模型的高成本，但表现并没有那么好。\n例如，验证集的目标不一定能达到之前的目标值，所以这种策略甚至不能保证终止。\n我们会在\\algref{alg:early_stopping_continue}中更正式地介绍这个过程。\n\n\\gls{early_stopping}对减少训练过程的计算成本也是有用的。\n除了由于限制训练的迭代次数而明显减少的计算成本，还带来了\\gls{regularization}的益处（不需要添加惩罚项的\\gls{cost_function}或计算这种附加项的\\gls{gradient}）。\n\n\\begin{algorithm}[ht]\n\\caption{使用\\gls{early_stopping}确定训练步数，然后在所有数据上训练的元算法。\n}\n\\label{alg:early_stopping_retrain}\n\\begin{algorithmic}\n\\STATE 令 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 为训练集。\n\\STATE 将 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 分别分割为 $(\\MX^{(\\text{subtrain})}$, $\\MX^{(\\text{valid})})$ 和 $(\\Vy^{(\\text{subtrain})}$, $\\Vy^{(\\text{valid})})$。\n\\STATE 从随机 $\\Vtheta$开始，使用$\\MX^{(\\text{subtrain})}$ 和 $\\Vy^{(\\text{subtrain})}$作为训练集，$\\MX^{(\\text{valid})}$ 和 $\\Vy^{(\\text{valid})}$ 作为验证集，运行 (\\algref{alg:early_stopping})。这将返回最佳训练步数$i^*$。\n\\STATE 将 $\\Vtheta$ 再次设为随机值。\n\\STATE 在 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 上训练 $i^*$ 步。  \n\\end{algorithmic}\n\\end{algorithm}\n\n\\begin{algorithm}[ht]\n\\caption{\n使用\\gls{early_stopping}确定将会\\gls{overfitting}的目标值，然后在所有数据上训练直到再次\n达到该值的元算法。\n}\n\\label{alg:early_stopping_continue}\n\\begin{algorithmic}\n\\STATE 令 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 为训练集。\n\\STATE 将 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 分别分割为 $(\\MX^{(\\text{subtrain})}$, $\\MX^{(\\text{valid})})$ 和 $(\\Vy^{(\\text{subtrain})}$, $\\Vy^{(\\text{valid})})$。\n\\STATE 从随机 $\\Vtheta$开始，使用$\\MX^{(\\text{subtrain})}$ 和 $\\Vy^{(\\text{subtrain})}$作为训练集，$\\MX^{(\\text{valid})}$ 和 $\\Vy^{(\\text{valid})}$ 作为验证集，运行 (\\algref{alg:early_stopping})。这会更新$\\Vtheta$。\n\\STATE $\\epsilon \\leftarrow J(\\Vtheta, \\MX^{(\\text{subtrain})},\\Vy^{(\\text{subtrain})})$\n\\WHILE{$J(\\Vtheta, \\MX^{(\\text{valid})}, \\Vy^{(\\text{valid})}) > \\epsilon$}\n\\STATE 在 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 上训练 $n$ 步。  \n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n% -- 242 --\n\n\\paragraph{\\gls{early_stopping}为何具有\\gls{regularization}效果:}\n目前为止，我们已经声明\\gls{early_stopping}是一种\\gls{regularization}策略，但我们只通过展示验证集误差的学习曲线是一个U型曲线来支持这种说法。\n\\gls{early_stopping}\\gls{regularization}模型的真正机制是什么呢？ \n\\cite{Bishop1995}和~\\cite{Sjoberg95}认为\\gls{early_stopping}可以将优化过程的参数空间限制在初始参数值$\\Vtheta_0$的小邻域内。\n更具体地，想象用学习率$\\epsilon$进行$\\tau$个优化步骤（对应于$\\tau$个训练迭代）。\n我们可以将$\\epsilon \\tau$作为有效\\gls{capacity}的度量。\n假设\\gls{gradient}有界，限制迭代的次数和学习速率能够限制从$\\Vtheta_0$到达的参数空间的大小，如\\figref{fig:chap7_reg_l1_vs_l2_mistake}所示。\n在这个意义上，$\\epsilon \\tau$的效果就好像是\\gls{weight_decay}系数的倒数。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter7/figures/reg_early_stop_vs_l2}}\n\\fi\n\\caption{\\gls{early_stopping}效果的示意图。\n\\emph{(左)}实线轮廓线表示负对数似然的轮廓。\n虚线表示从原点开始的~\\glssymbol{SGD}~所经过的轨迹。 % ??\n\\gls{early_stopping}的轨迹在较早的点$\\tilde \\Vw$处停止，而不是停止在最小化代价的点$\\Vw^*$处。\n\\emph{(右)}为了对比，使用$L^2$\\gls{regularization}效果的示意图。\n虚线圆圈表示$L^2$惩罚的轮廓，$L^2$惩罚使得总代价的最小值比非\\gls{regularization}代价的最小值更靠近原点。\n}\n\\label{fig:chap7_reg_l1_vs_l2_mistake}\n\\end{figure}\n\n事实上，在二次误差的简单\\gls{linear_model}和简单的\\gls{GD}情况下，我们可以展示\\gls{early_stopping}相当于$L^2$\\gls{regularization}。\n\n为了与经典$L^2$\\gls{regularization}比较，我们只考察唯一的参数是线性权重（$\\Vtheta = \\Vw$）的简单情形。\n我们在权重$\\Vw$的经验最佳值$\\Vw^*$附近以二次近似建模\\gls{cost_function} $J$：\n\\begin{align}\n \\hat J(\\Vtheta) = J(\\Vw^*) + \\frac{1}{2}  (\\Vw- \\Vw^*)^\\top \\MH  (\\Vw - \\Vw^*),\n\\end{align}\n其中$\\MH$是$J$关于$\\Vw$在$\\Vw^*$点的\\gls{hessian}。\n鉴于假设$\\Vw^*$是$J(\\Vw)$的最小点，我们知道$\\MH$为半正定。\n在局部\\gls{taylor}级数逼近下，\\gls{gradient}由下式给出：\n\\begin{align}\n \\nabla_{\\Vw} \\hat J (\\Vw) = \\MH (\\Vw - \\Vw^*).\n\\end{align}\n\n% -- 243 --\n\n接下来我们研究训练时参数向量的轨迹。\n为简化起见，我们将参数向量初始化为原点\\footnote{对于\\gls{NN}，我们需要打破\\gls{hidden_unit}间的对称平衡因此不能将所有参数都初始化为$\\mathbf{0}$（如\\secref{sec:gradient_based_learning}所讨论的）。\n然而，对于其他任何初始值$\\Vw_{(0)}$该论证都成立}，也就是$\\Vw^{(0)} = 0$。\n我们通过分析$\\hat{J}$上的\\gls{GD}来研究$J$上近似的\\gls{GD}的效果：\n\\begin{align}\n\\Vw^{(\\tau)} &= \\Vw^{(\\tau-1)} -\\epsilon \\nabla_{\\Vw} \\hat{J}( \\Vw^{(\\tau-1)} ) \\\\\n&=  \\Vw^{(\\tau-1)}  - \\epsilon  \\MH ( \\Vw^{(\\tau-1)} -  \\Vw^* ), \\\\\n\\Vw^{(\\tau)}  -  \\Vw^* &= (\\MI - \\epsilon  \\MH) ( \\Vw^{(\\tau-1)} -  \\Vw^* ).\n \\end{align}\n现在让我们在$\\MH$特征向量的空间中改写表达式，利用$\\MH$的特征分解：$\\MH = \\MQ \\VLambda \\MQ^\\top$，其中$\\VLambda$是对角矩阵，$\\MQ$是特征向量的一组标准正交基。\n\\begin{align}\n\\Vw^{(\\tau)}  -  \\Vw^* &= (\\MI - \\epsilon \\MQ \\VLambda \\MQ^\\top) ( \\Vw^{(\\tau-1)} -  \\Vw^* ) \\\\\n\\MQ^\\top (\\Vw^{(\\tau)}  -  \\Vw^*) &= (\\MI - \\epsilon \\VLambda)\\MQ^\\top ( \\Vw^{(\\tau-1)} -  \\Vw^* )\n\\end{align}\n假定$\\Vw^{(0)} = 0$并且$\\epsilon$选择得足够小以保证$|1 - \\epsilon \\lambda_i |<1$，经过$\\tau$次参数更新后轨迹如下：\n\\begin{align} \\label{eq:740qw}\n\\MQ^\\top  \\Vw^{(\\tau)} = [\\MI - (\\MI - \\epsilon \\VLambda)^\\tau] \\MQ^\\top  \\Vw^* .\n\\end{align}\n现在，\\eqnref{eq:713L2}中$\\MQ^\\top \\tilde \\Vw$的表达式能被重写为：\n\\begin{align}\n\\MQ^\\top  \\tilde \\Vw &= (\\VLambda + \\alpha \\MI)^{-1} \\VLambda \\MQ^\\top  \\Vw^*, \\\\\n\\MQ^\\top  \\tilde \\Vw &= [\\MI - (\\VLambda + \\alpha \\MI)^{-1} \\alpha] \\MQ^\\top  \\Vw^*. \n\\label{eq:742qw}\n\\end{align}\n比较\\eqnref{eq:740qw}和\\eqnref{eq:742qw}，我们能够发现，如果超参数$\\epsilon,\\alpha$和$\\tau$满足如下：\n\\begin{align}\n(\\MI - \\epsilon \\VLambda)^\\tau =  (\\VLambda + \\alpha \\MI)^{-1} \\alpha,\n\\end{align}\n那么$L^2~$\\gls{regularization}和\\gls{early_stopping}可以被看作是等价的（至少在\\gls{objective_function}的二次近似下）。\n进一步取对数，使用$\\log~(1+x)$的级数展开，我们可以得出结论：如果所有$\\lambda_i$是小的（即$\\epsilon \\lambda_i \\ll 1$且$\\lambda_i / \\alpha \\ll 1$），那么\n\\begin{align}\n\\tau \\approx \\frac{1}{\\epsilon \\alpha}, \\\\\n\\alpha \\approx \\frac{1}{\\tau \\epsilon}.\n\\end{align}\n也就是说，在这些假设下，训练迭代次数$\\tau$起着与$L^2$参数成反比的作用，$\\tau \\epsilon$的倒数与\\gls{weight_decay}系数的作用类似。\n\n在大曲率（\\gls{objective_function}）方向上的参数值受\\gls{regularization}影响小于小曲率方向。\n当然，在\\gls{early_stopping}的情况下，这实际上意味着在大曲率方向的参数比较小曲率方向的参数更早地学习到。\n \n本节中的推导表明长度为$\\tau$的轨迹结束于$L^2$\\gls{regularization}目标的极小点。\n当然，\\gls{early_stopping}比简单的轨迹长度限制更丰富————\\gls{early_stopping}通常涉及监控验证集误差，以便在空间特别好的点处终止轨迹。\n因此\\gls{early_stopping}比\\gls{weight_decay}更具有优势，\\gls{early_stopping}能自动确定\\gls{regularization}的正确量，而\\gls{weight_decay}需要进行多个不同超参数值的训练实验。\n\n% -- 245 --\n\n\\section{参数绑定和参数共享}\n\\label{sec:parameter_tying_and_parameter_sharing}\n目前为止，本章讨论对参数添加约束或惩罚时，一直是相对于固定的区域或点。\n例如，$L^2$\\gls{regularization}（或\\gls{weight_decay}）对参数偏离零的固定值进行惩罚。\n然而，有时我们可能需要其他的方式来表达我们对模型参数适当值的先验知识。\n有时候，我们可能无法准确地知道应该使用什么样的参数，但我们根据相关领域和模型结构方面的知识得知模型参数之间应该存在一些相关性。\n\n我们经常想要表达的一种常见依赖是某些参数应当彼此接近。\n考虑以下情形：我们有两个模型执行相同的分类任务（具有相同类别），但输入分布稍有不同。\n形式地，我们有参数为$\\Vw^{(A)}$的模型$A$和参数为$\\Vw^{(B)}$的模型$B$。\n这两种模型将输入映射到两个不同但相关的输出：$\\hat y^{(A)} = f(\\Vw^{(A)}, \\Vx)$和$\\hat y^{(B)} = f(\\Vw^{(B)}, \\Vx)$。\n\n我们可以想象，这些任务会足够相似（或许具有相似的输入和输出分布），因此我们认为模型参数应彼此靠近：\n$\\forall i, w_i^{(A)}$应该与$ w_i^{(B)}$接近。\n我们可以通过\\gls{regularization}利用此信息。\n具体来说，我们可以使用以下形式的参数范数惩罚：\n$\\Omega(\\Vw^{(A)}, \\Vw^{(B)}) = \\norm{\\Vw^{(A)}-\\Vw^{(B)}}_2^2$。\n在这里我们使用$L^2$惩罚，但也可以使用其他选择。\n\n这种方法由\\cite{LasserreJ2006}提出，\\gls{regularization}一个模型（\\gls{supervised}模式下训练的分类器）的参数，使其接近另一个\\gls{unsupervised}模式下训练的模型（捕捉观察到的输入数据的分布）的参数。\n构造的这种架构使得分类模型中的许多参数能与\\gls{unsupervised}模型中对应的参数匹配。\n\n参数范数惩罚是\\gls{regularization}参数使其彼此接近的一种方式，而更流行的方法是使用约束：\\emph{强迫某些参数相等}。\n由于我们将各种模型或模型组件解释为共享唯一的一组参数，这种\\gls{regularization}方法通常被称为\\firstgls{parameter_sharing}。\n和\\gls{regularization}参数使其接近（通过范数惩罚）相比，\\gls{parameter_sharing}的一个显著优点是，只有参数（唯一一个集合）的子集需要被存储在内存中。\n对于某些特定模型，如\\gls{CNN}，这可能可以显著减少模型所占用的内存。\n\n\n% -- 246 --\n\\subsection{\\glsentrytext{CNN}}\n目前为止，最流行和广泛使用的\\gls{parameter_sharing}出现在应用于\\gls{CV}的\\firstacr{CNN}中。\n\n自然图像有许多统计属性是对转换不变的。\n例如，猫的照片即使向右边移了一个像素，仍保持猫的照片。\n\\glssymbol{CNN}通过在图像多个位置共享参数来考虑这个特性。\n相同的特征（具有相同权重的\\gls{hidden_unit}）在输入的不同位置上计算获得。\n这意味着无论猫出现在图像中的第$i$列或$i + 1$列，我们都可以使用相同的猫探测器找到猫。\n\n\\gls{parameter_sharing}显著降低了\\glssymbol{CNN}模型的参数数量，并显著提高了网络的大小而不需要相应地增加训练数据。\n它仍然是将领域知识有效地整合到网络架构的最佳范例之一。\n\n我们将会在\\chapref{chap:convolutional_networks}中更详细地讨论\\gls{CNN}。\n\n\\section{\\glsentrytext{sparse}\\glsentrytext{representation}}\n\\label{sec:sparse_representations}\n前文所述的\\gls{weight_decay}直接惩罚模型参数。\n另一种策略是惩罚\\gls{NN}中的激活单元，\\gls{sparse}化激活单元。\n这种策略间接地对模型参数施加了复杂惩罚。\n\n我们已经讨论过（在\\secref{sec:l1_regularization}中）$L^1$惩罚如何诱导\\gls{sparse}的参数，即许多参数为零（或接近于零）。\n另一方面，\\gls{representation}的\\gls{sparse}性描述了一个\\gls{representation}中许多元素是零（或接近零）的情况。\n我们可以\\gls{linear_regression}的情况下简单说明这种区别：\n\\begin{align}\n\\underset{\\Vy ~\\in~ \\SetR^m}{\n \\begin{bmatrix}\n  18 \\\\  5 \\\\ 15 \\\\ -9 \\\\ -3\n \\end{bmatrix}} = \n \\underset{\\MA ~\\in~ \\SetR^{m \\times n}}{\n \\begin{bmatrix}\n  4 & 0 & 0 & -2 & 0 & 0 \\\\\n  0 & 0 & -1 & 0 & 3 & 0 \\\\\n  0 & 5 & 0 & 0 & 0 & 0 \\\\\n  1 & 0 & 0 & -1 & 0 & -4 \\\\\n  1 & 0 & 0 & 0 & -5 & 0\n \\end{bmatrix}} \n  \\underset{\\Vx ~\\in~ \\SetR^n}{\n  \\begin{bmatrix}\n 2 \\\\ 3\\\\ -2\\\\ -5 \\\\ 1 \\\\ 4\n \\end{bmatrix} }\\\\\n \\underset{\\Vy ~\\in~ \\SetR^m}{\n \\begin{bmatrix}\n  -14 \\\\  1 \\\\ 19 \\\\  2 \\\\ 23\n \\end{bmatrix}} = \n \\underset{\\MB ~\\in~ \\SetR^{m \\times n}}{\n \\begin{bmatrix}\n  3 & -1 & 2 & -5 & 4 & 1 \\\\\n  4 & 2 & -3 & -1 & 1 & 3 \\\\\n  -1 & 5 & 4 & 2 & -3 & -2 \\\\\n  3 & 1 & 2 & -3 & 0 & -3 \\\\\n  -5 & 4 & -2 & 2 & -5 & -1\n \\end{bmatrix}} \n  \\underset{\\Vh ~\\in~ \\SetR^n}{\n  \\begin{bmatrix}\n 0 \\\\ 2 \\\\ 0 \\\\ 0 \\\\ -3 \\\\ 0\n \\end{bmatrix} }\n\\end{align}\n\n% -- 247 --\n\n第一个表达式是参数\\gls{sparse}的\\gls{linear_regression}模型的例子。\n第二个表达式是数据$\\Vx$具有\\gls{sparse}\\gls{representation} $\\Vh$的线性回归。\n也就是说，$\\Vh$是$\\Vx$的一个函数，在某种意义上\\gls{representation}存在于$\\Vx$中的信息，但只是用一个\\gls{sparse}向量\\gls{representation}。\n\n\\gls{representation}的\\gls{regularization}可以使用参数\\gls{regularization}中同种类型的机制实现。\n\n\\gls{representation}的范数惩罚\\gls{regularization}是通过向\\gls{loss_function} $J$添加对\\gls{representation}的范数惩罚来实现的。\n我们将这个惩罚记作$\\Omega(\\Vh)$。\n和以前一样，我们将\\gls{regularization}后的损失函数记作$\\tilde J$：\n\\begin{align}\n \\tilde J(\\Vtheta; \\MX, \\Vy) =  J(\\Vtheta; \\MX, \\Vy)  + \\alpha \\Omega(\\Vh),\n\\end{align}\n其中$\\alpha \\in [0, \\infty]$ 权衡范数惩罚项的相对贡献，越大的$\\alpha$对应越多的\\gls{regularization}。\n\n正如对参数的$L^1$惩罚诱导参数\\gls{sparse}性，对\\gls{representation}元素的$L^1$惩罚诱导\\gls{sparse}的\\gls{representation}：\n$\\Omega(\\Vh) = \\norm{\\Vh}_1 = \\sum_i |h_i|$。\n当然$L^1$惩罚是使\\gls{representation}\\gls{sparse}的方法之一。\n其他方法还包括从\\gls{representation}上的\\ENNAME{Student}-$t$先验导出的惩罚\\citep{Olshausen+Field-1996,Bergstra-Phd-2011}和\\gls{KL}惩罚\\citep{Larochelle+Bengio-2008}，这些方法对于将表示中的元素约束于单位区间上特别有用。\n\\cite{HonglakL2008-small}和\\cite{Goodfellow2009}都提供了\\gls{regularization}几个样本平均激活的例子，即令$\\frac{1}{m}\\sum_i \\Vh^{(i)}$接近某些目标值（如每项都是$.01$的向量）。\n\n还有一些其他方法通过激活值的硬性约束来获得\\gls{representation}\\gls{sparse}。\n例如，\\textbf{正交匹配追踪}(orthogonal matching pursuit)\\citep{pati93orthogonal}通过解决以下\\gls{constrained_optimization}问题将输入值$\\Vx$编码成\\gls{representation} $\\Vh$\n\\begin{align}\n \\underset{\\Vh, \\norm{\\Vh}_0 < k}{\\argmin} \\norm{\\Vx - \\MW \\Vh}^2,\n\\end{align}\n其中$\\norm{\\Vh}_0 $是$\\Vh$中非零项的个数。\n当$\\MW$被约束为正交时，我们可以高效地解决这个问题。\n这种方法通常被称为\\ENNAME{OMP}-$k$，通过$k$指定允许的非零特征数量。\n\\cite{Coates2011b}证明\\ENNAME{OMP}-$1$可以成为深度架构中非常有效的特征提取器。\n\n% -- 248 --\n\n含有\\gls{hidden_unit}的模型在本质上都能变得\\gls{sparse}。\n在本书中，我们将看到在各种情况下使用\\gls{sparse}\\gls{regularization}的例子。\n\n\\section{\\glsentrytext{bagging}和其他\\glsentrytext{ensemble}方法}\n\\label{sec:bagging_and_other_ensemble_methods}\n\\firstgls{bagging}是通过结合几个模型降低泛化误差的技术\\citep{ML:Breiman:bagging}。\n主要想法是分别训练几个不同的模型，然后让所有模型表决测试样例的输出。\n这是\\gls{ML}中常规策略的一个例子，被称为\\firstgls{model_averaging}。\n采用这种策略的技术被称为\\gls{ensemble}方法。\n\n\\firstgls{model_averaging}奏效的原因是不同的模型通常不会在测试集上产生完全相同的误差。\n\n假设我们有$k$个回归模型。\n假设每个模型在每个例子上的误差是$\\epsilon_i$，这个误差服从零均值\\gls{variance}为$\\SetE[\\epsilon_i^2] = v$且\\gls{covariance}为$\\SetE[\\epsilon_i \\epsilon_j] = c$的多维正态分布。\n通过所有\\gls{ensemble}模型的平均预测所得误差是$\\frac{1}{k} \\sum_i \\epsilon_i$。 \n\\gls{ensemble}预测器平方误差的期望是\n\\begin{align}\n \\SetE \\Bigg[\\Bigg(\\frac{1}{k} \\sum_i \\epsilon_i \\Bigg)^2\\Bigg] &= \\frac{1}{k^2} \n \\SetE \\Bigg[\\sum_i \\Bigg(\\epsilon_i^2 + \\sum_{j \\neq i} \\epsilon_i \\epsilon_j\\Bigg)\\Bigg], \\\\\n&= \\frac{1}{k} v + \\frac{k-1}{k} c .                             \n\\end{align}\n在误差完全相关即$c=v$的情况下，均方误差减少到$v$，所以\\gls{model_averaging}没有任何帮助。\n在错误完全不相关即$c =0$的情况下，该\\gls{ensemble}平方误差的期望仅为$\\frac{1}{k}v$。\n这意味着\\gls{ensemble}平方误差的期望会随着\\gls{ensemble}规模增大而线性减小。\n换言之，平均上，\\gls{ensemble}至少与它的任何成员表现得一样好，并且如果成员的误差是独立的，\\gls{ensemble}将显著地比其成员表现得更好。\n\n不同的\\gls{ensemble}方法以不同的方式构建\\gls{ensemble}模型。\n例如，\\gls{ensemble}的每个成员可以使用不同的算法和\\gls{objective_function}训练成完全不同的模型。\n\\gls{bagging}是一种允许重复多次使用同一种模型、训练算法和\\gls{objective_function}的方法。\n\n% -- 249 --\n\n具体来说，\\gls{bagging}涉及构造$k$个不同的数据集。\n每个数据集从原始数据集中重复采样构成，和原始数据集具有相同数量的样例。\n这意味着，每个数据集以高概率缺少一些来自原始数据集的例子，还包含若干重复的例子（如果所得训练集与原始数据集大小相同，那所得数据集中大概有原始数据集$2/3$的实例）。\n模型$i$在数据集$i$上训练。\n每个数据集所含样本的差异导致了训练模型之间的差异。\n\\figref{fig:chap7_bagging}是一个例子。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/bagging}}\n\\fi\n\\caption{描述\\gls{bagging}如何工作的草图。\n假设我们在上述数据集（包含一个8、一个6和一个9）上训练数字8的检测器。\n假设我们制作了两个不同的重采样数据集。\n\\gls{bagging}训练程序通过有放回采样构建这些数据集。\n第一个数据集忽略9并重复8。\n在这个数据集上，检测器得知数字顶部有一个环就对应于一个8。\n第二个数据集中，我们忽略6并重复9。\n在这种情况下，检测器得知数字底部有一个环就对应于一个8。\n这些单独的分类规则中的每一个都是不可靠的，但如果我们平均它们的输出，就能得到鲁棒的检测器，只有当8的两个环都存在时才能实现最大置信度。\n}\n\\label{fig:chap7_bagging}\n\\end{figure}\n\n\\gls{NN}能找到足够多的不同的解，意味着他们可以从\\gls{model_averaging}中受益(即使所有模型都在同一数据集上训练)。\n\\gls{NN}中随机初始化的差异、\\gls{minibatch}的随机选择、超参数的差异或不同输出的非确定性实现往往足以使得\\gls{ensemble}中的不同成员具有部分独立的误差。\n\n% -- 250 --\n\n\\gls{model_averaging}是一个减少泛化误差的非常强大可靠的方法。\n在科学论文中比较算法的表现时，它通常是不鼓励使用的，因为任何\\gls{ML}算法都可以从\\gls{model_averaging}中大幅获益（以增加计算和存储为代价）。\n\n\\gls{ML}比赛中的取胜算法通常是使用超过几十种\\gls{model_averaging}的方法。\n最近一个突出的例子是\\ENNAME{Netflix Grand Prize}\\citep{Koren09}。\n\n不是所有构建\\gls{ensemble}的技术都是为了让\\gls{ensemble}模型比单一模型更加\\gls{regularization}。\n例如，一种被称为\\textbf{Boosting}的技术\\citep{ConfLT:Freund:gametheorie,ConfML:Freund:AdaBoostCompar}构建比单个模型\\gls{capacity}更高的\\gls{ensemble}模型。\n通过向\\gls{ensemble}逐步添加\\gls{NN}，\\gls{boosting}已经被应用于构建神经网络的\\gls{ensemble}\\citep{nips-10:Holger+Yoshua:1998}。\n通过逐渐增加\\gls{NN}的\\gls{hidden_unit}，\\gls{boosting}也可以将单个神经网络解释为一个\\gls{ensemble}。\n\n\\section{\\glsentrytext{dropout}}\n\\label{sec:dropout}\n\\textbf{Dropout}~\\citep{Srivastava14}提供了\\gls{regularization}一大类模型的方法，计算方便但功能强大。\n为了有个初步的近似感受，我们可以认为\\gls{dropout}是\\gls{ensemble}大量深层\\gls{NN}的实用\\gls{bagging}方法。\n\\gls{bagging}涉及训练多个模型，并在每个测试样本上评估多个模型。\n当每个模型都是一个很大的\\gls{NN}时，这似乎是不切实际的，因为训练和评估这样的网络需要花费很多运行时间和内存。\n通常我们只能\\gls{ensemble}五至十个神经网络，如\\cite{Szegedy-et-al-arxiv2014}\\gls{ensemble}了六个神经网络赢得ILSVRC，超过这个数量就会迅速变得难以处理。\n\\gls{dropout}提供了一种廉价的\\gls{bagging}\\gls{ensemble}近似，能够训练和评估指数级数量的\\gls{NN}。\n\n具体而言，\\gls{dropout}训练的\\gls{ensemble}包括所有从基础网络除去非输出单元后形成的子网络，如\\figref{fig:chap7_subnetworks}所示。\n最先进的\\gls{NN}基于一系列仿射变换和非线性变换，我们只需将一些单元的输出乘零就能有效地删除一个单元。\n这个过程需要对模型（如径向基函数网络，单元的状态和参考值之间存在一定区别）进行一些修改。\n为了简单起见，我们在这里提出乘零的简单\\gls{dropout}算法，但是它被简单修改后，可以与从网络中移除单元的其他操作结合使用。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/subnetworks}}\n\\fi\n\\caption{\\gls{dropout}训练由所有子网络组成的\\gls{ensemble}，其中子网络通过从基本网络中删除非输出单元构建。\n我们从具有两个可见单元和两个\\gls{hidden_unit}的基本网络开始。\n这四个单元有十六个可能的子集。\n右图展示了从原始网络中丢弃不同的单元子集而形成的所有十六个子网络。\n在这个小例子中，所得到的网络中相当一部分没有输入单元或没有从输入连接到输出的路径。\n当层较宽时，丢弃所有从输入到输出的可能路径的概率变小，所以这个问题不太可能在出现层较宽的网络中。}\n\\label{fig:chap7_subnetworks}\n\\end{figure}\n\n% -- 251 --\n\n回想一下\\gls{bagging}学习，我们定义$k$个不同的模型，从训练集有放回采样构造$k$个不同的数据集，然后在训练集$i$上训练模型$i$。\n\\gls{dropout}的目标是在指数级数量的\\gls{NN}上近似这个过程。\n具体来说，在训练中使用\\gls{dropout}时，我们会使用基于\\gls{minibatch}产生较小步长的学习算法，如\\gls{SGD}等。\n我们每次在\\gls{minibatch}中加载一个样本，然后随机抽样应用于网络中所有输入和\\gls{hidden_unit}的不同二值\\gls{mask}。\n对于每个单元，\\gls{mask}是独立采样的。\n\\gls{mask}值为1的采样概率（导致包含一个单元）是训练开始前一个固定的超参数。\n它不是模型当前参数值或输入样本的函数。\n通常在每一个\\gls{minibatch}训练的神经网络中，一个输入单元被包括的概率为$0.8$，一个\\gls{hidden_unit}被包括的概率为$0.5$。\n然后，我们运行和之前一样的前向传播、反向传播以及学习更新。\n\\figref{fig:chap7_dropout_fprop}说明了在\\gls{dropout}下的前向传播。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/dropout_fprop}}\n\\fi\n\\caption{在使用\\gls{dropout}的前馈网络中前向传播的示例。\n(顶部)在此示例中，我们使用具有两个输入单元，具有两个\\gls{hidden_unit}的\\gls{hidden_layer}以及一个输出单元的前馈网络。\n(底部)为了执行具有\\gls{dropout}的前向传播，我们随机地对向量$\\Vmu$进行采样，其中网络中的每个输入或\\gls{hidden_unit}对应一项。\n$\\Vmu$中的每项都是二值的且独立于其他项采样。\n超参数的采样概率为$1$，\\gls{hidden_layer}的采样概率通常为$0.5$，输入的采样概率通常为$0.8$。\n网络中的每个单元乘以相应的\\gls{mask}，然后正常地继续沿着网络的其余部分前向传播。\n这相当于从\\figref{fig:chap7_subnetworks}中随机选择一个子网络并沿着前向传播。\n}\n\\label{fig:chap7_dropout_fprop}\n\\end{figure}\n% -- 252 --\n\n更正式地说，假设一个\\gls{mask}向量$\\Vmu$指定被包括的单元，$J(\\Vtheta, \\Vmu)$是由参数$\\Vtheta$和\\gls{mask} $\\Vmu$定义的模型代价。\n那么\\gls{dropout}训练的目标是最小化$\\SetE_{\\Vmu} J(\\Vtheta, \\Vmu)$。 \n这个期望包含多达指数级的项，但我们可以通过抽样$\\Vmu$获得梯度的无偏估计。\n\n\\gls{dropout}训练与\\gls{bagging}训练不太一样。\n在\\gls{bagging}的情况下，所有模型都是独立的。\n在\\gls{dropout}的情况下，所有模型共享参数，其中每个模型继承父\\gls{NN}参数的不同子集。\n\\gls{parameter_sharing}使得在有限可用的内存下表示指数级数量的模型变得可能。\n在\\gls{bagging}的情况下，每一个模型在其相应训练集上训练到收敛。\n在\\gls{dropout}的情况下，通常大部分模型都没有显式地被训练，因为通常父\\gls{NN}会很大，以致于到宇宙毁灭都不可能采样完所有的子网络。\n取而代之的是，在单个步骤中我们训练一小部分的子网络，\\gls{parameter_sharing}会使得剩余的子网络也能有好的参数设定。\n这些是仅有的区别。\n除了这些，\\gls{dropout}与\\gls{bagging}算法一样。\n例如，每个子网络中遇到的训练集确实是有放回采样的原始训练集的一个子集。\n\n\\gls{bagging}\\gls{ensemble}必须根据所有成员的累积投票做一个预测。\n在这种背景下，我们将这个过程称为\\firstgls{inference}。\n目前为止，我们在介绍\\gls{bagging}和\\gls{dropout}时没有要求模型具有明确的概率。\n现在，我们假定该模型的作用是输出一个概率分布。\n在\\gls{bagging}的情况下，每个模型$i$产生一个概率分布$p^{(i)}(y \\mid \\Vx)$。 \n\\gls{ensemble}的预测由这些分布的算术平均值给出，\n\\begin{align}\n \\frac{1}{k} \\sum_{i=1}^k p^{(i)}(y \\mid \\Vx).\n\\end{align}\n\n在\\gls{dropout}的情况下，通过\\gls{mask} $\\Vmu$定义每个子模型的概率分布$p(y \\mid \\Vx, \\Vmu)$。\n所有\\gls{mask}的算术平均值由下式给出\n\\begin{align}\n  \\sum_{\\Vmu} p(\\Vmu) p(y \\mid \\Vx, \\Vmu),\n\\end{align}\n其中$p(\\Vmu)$是训练时采样$\\Vmu$的概率分布。\n\n% -- 254 --\n\n因为这个求和包含多达指数级的项，除非该模型的结构允许某种形式的简化，否则是不可能计算的。\n目前为止，无法得知深度\\gls{NN}是否允许某种可行的简化。\n相反，我们可以通过采样近似\\gls{inference}，即平均许多\\gls{mask}的输出。\n即使是$10-20$个\\gls{mask}就足以获得不错的表现。\n\n然而，一个更好的方法能不错地近似整个\\gls{ensemble}的预测，且只需一个前向传播的代价。\n要做到这一点，我们改用\\gls{ensemble}成员预测分布的几何平均而不是算术平均。\n\\cite{WardeFarley+al-ICLR2014}提出的论点和经验证据表明，在这个情况下几何平均与算术平均表现得差不多。\n\n多个概率分布的几何平均不能保证是一个概率分布。\n为了保证结果是一个概率分布，我们要求没有子模型给某一事件分配概率0，并重新标准化所得分布。\n通过几何平均直接定义的非标准化概率分布由下式给出\n\\begin{align}\n\\tilde{p}_{\\text{ensemble}}(y \\mid \\Vx) = \\sqrt[2^d]{\\prod_{\\Vmu} p(y \\mid \\Vx, \\Vmu)},\n\\end{align}\n其中$d$是可被丢弃的单元数。\n这里为简化介绍，我们使用均匀分布的$\\Vmu$，但非均匀分布也是可以的。\n为了作出预测，我们必须重新标准化\\gls{ensemble}：\n\\begin{align}\np_{\\text{ensemble}}(y \\mid \\Vx)  = \\frac{\\tilde{p}_{\\text{ensemble}}(y \\mid \\Vx)}\n {\\sum_{y'}\\tilde{p}_{\\text{ensemble}}(y' \\mid \\Vx) }.\n\\end{align}\n \n涉及\\gls{dropout}的一个重要观点\\citep{Hinton-et-al-arxiv2012}是，我们可以通过评估模型中$p(y \\mid \\Vx)$来近似$ p_{\\text{ensemble}}$：\n该模型具有所有单元，但我们将单元$i$的输出的权重乘以单元$i$的被包含概率。\n这个修改的动机是得到从该单元输出的正确期望值。\n我们把这种方法称为\\firstgls{weight_scaling_inference_rule}。\n目前还没有在深度非线性网络上对这种近似推断规则的准确性作任何理论分析，但经验上它表现得很好。\n\n % -- 255 --\n \n因为我们通常使用$\\frac{1}{2}$的包含概率，权重比例规则一般相当于在训练结束后将权重除$2$，然后像平常一样使用模型。\n实现相同结果的另一种方法是在训练期间将单元的状态乘$2$。\n无论哪种方式，我们的目标是确保在测试时一个单元的期望总输入与在训练时该单元的期望总输入是大致相同的（即使近半单位在训练时丢失）。\n\n对许多不具有非线性\\gls{hidden_unit}的模型族而言，\\gls{weight_scaling_inference_rule}是精确的。\n举个简单的例子，考虑\\gls{softmax}回归分类，其中由向量$\\RVv$表示$n$个输入变量：\n\\begin{align}\n P(\\RSy = \\Sy \\mid \\RVv) = \\text{softmax}\\big(\\MW^\\top\\RVv + \\Vb\\big)_y.\n\\end{align}\n我们可以根据二值向量$\\Vd$逐元素的乘法将一类子模型进行索引：\n\\begin{align}\nP(\\RSy = \\Sy \\mid \\RVv; \\Vd) = \\text{softmax}\\big(\\MW^\\top(\\Vd \\odot \\RVv) + \\Vb \\big)_y.\n\\end{align}\n\\gls{ensemble}预测器被定义为重新标准化所有\\gls{ensemble}成员预测的几何平均：\n\\begin{align} \\label{eq:758pe}\nP_{\\text{ensemble}}(\\RSy = \\Sy \\mid \\RVv)  = \\frac{\\tilde{P}_{\\text{ensemble}}(\\RSy = \\Sy \\mid \\RVv)}\n {\\sum_{y'}\\tilde{P}_{\\text{ensemble}}(\\RSy = \\Sy' \\mid \\RVv) },\n\\end{align}\n其中\n\\begin{align}\n\\tilde{P}_{\\text{ensemble}}(\\RSy=\\Sy \\mid \\RVv) =\n\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} P(\\RSy = \\Sy \\mid \\RVv; \\Vd)}.\n\\end{align}\n\n为了证明\\gls{weight_scaling_inference_rule}是精确的，我们简化$ \\tilde{P}_{\\text{ensemble}}$：\n\\begin{align}\n\\tilde{P}_{\\text{ensemble}}(\\RSy=\\Sy \\mid \\RVv) =\n\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} P(\\RSy = \\Sy \\mid \\RVv; \\Vd)} \\\\\n= \\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} \\text{softmax}(\\MW^\\top(\\Vd \\odot \\RVv) + \\Vb)_y} \\\\\n= \\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} \\frac{\\exp (\\MW_{y,:}^\\top(\\Vd \\odot \\RVv) + \\Vb_y)}\n{\\sum_{y'}\\exp (\\MW_{y',;}^\\top(\\Vd \\odot \\RVv) + \\Vb_{y'})}}\\\\\n=  \\frac{\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n}\\exp (\\MW_{y,:}^\\top(\\Vd \\odot \\RVv) + \\Vb_y)}}\n{ \\sqrt[2^n] \\prod_{\\Vd \\in \\{0,1\\}^n} \\sum_{y'}\\exp (\\MW_{y',:}^\\top(\\Vd \\odot \\RVv) + \\Vb_{y'})}\n\\end{align}\n由于$\\tilde P$将被标准化，我们可以放心地忽略那些相对$y$不变的乘法：\n\\begin{align}\n\\tilde{P}_{\\text{ensemble}}(\\RSy=\\Sy \\mid \\RVv) &\\propto \n\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} \\exp (\\MW_{y,:}^\\top(\\Vd \\odot \\RVv) + \\Vb_y)} \\\\\n& = \\exp \\Bigg(\\frac{1}{2^n} \\sum_{\\Vd \\in \\{0,1\\}^n} \\MW_{y,;}^\\top(\\Vd \\odot \\RVv) + \\Vb_y \\Bigg) \\\\\n& = \\exp \\Big(\\frac{1}{2}\\MW_{y,:}^\\top \\RVv + \\Vb_y \\Big) .\n\\end{align}\n将其代入\\eqnref{eq:758pe}，我们得到了一个权重为$\\frac{1}{2}\\MW$的\\gls{softmax}分类器。\n\n% -- 256 --\n\n\\gls{weight_scaling_inference_rule}在其他设定下也是精确的，包括条件正态输出的回归网络以及那些隐藏层不包含非线性的深度网络。\n然而，\\gls{weight_scaling_inference_rule}对具有非线性的深度模型仅仅是一个近似。\n虽然这个近似尚未有理论上的分析，但在实践中往往效果很好。\n\\cite{Goodfellow-et-al-ICML2013}实验发现，在对\\gls{ensemble}预测的近似方面，\\gls{weight_scaling_inference_rule}比\\gls{monte_carlo}近似更好（就分类精度而言）。\n即使允许\\gls{monte_carlo}近似采样多达1000子网络时也比不过\\gls{weight_scaling_inference_rule}。\n\\cite{gal2015bayesian}发现一些模型可以通过二十个样本和\\gls{monte_carlo}近似获得更好的分类精度。\n似乎\\gls{inference}近似的最佳选择是与问题相关的。\n\n\\cite{Srivastava14}显示，\\gls{dropout}比其他标准的计算开销小的\\gls{regularization}方法（如\\gls{weight_decay}、过滤器范数约束和\\gls{sparse}激活的\\gls{regularization}）更有效。\n\\gls{dropout}也可以与其他形式的\\gls{regularization}合并，得到进一步的提升。\n\n计算方便是\\gls{dropout}的一个优点。\n训练过程中使用\\gls{dropout}产生$n$个随机二进制数与状态相乘，每个样本每次更新只需$\\CalO(n)$的计算复杂度。\n根据实现，也可能需要$\\CalO(n)$的存储空间来持续保存这些二进制数（直到反向传播阶段）。\n使用训练好的模型\\gls{inference}时，计算每个样本的代价与不使用\\gls{dropout}是一样的，尽管我们必须在开始运行\\gls{inference}前将权重除以2。\n\n% -- 257 --\n\n\\gls{dropout}的另一个显著优点是不怎么限制适用的模型或训练过程。\n几乎在所有使用\\gls{distributed_representation}且可以用\\gls{SGD}训练的模型上都表现很好。\n包括前馈神经网络、概率模型，如\\gls{RBM}\\citep{Srivastava14}，以及\\gls{RNN}\\citep{Bayer-et-al-arXiv-2014,Pascanu-et-al-ICLR2014}。\n许多效果差不多的其他\\gls{regularization}策略对模型结构的限制更严格。\n\n虽然\\gls{dropout}在特定模型上每一步的代价是微不足道的，但在一个完整的系统上使用\\gls{dropout}的代价可能会是显著的。\n因为\\gls{dropout}是一个\\gls{regularization}技术，它减少了模型的有效容量。\n为了抵消这种影响，我们必须增大模型规模。\n不出意外的话，使用\\gls{dropout}时最佳验证集的误差会低很多，但这是以更大的模型和更多训练算法的迭代次数为代价换来的。\n对于非常大的数据集，\\gls{regularization}带来的泛化误差减少得很小。\n在这些情况下，使用\\gls{dropout}和更大模型的计算代价可能超过\\gls{regularization}带来的好处。\n\n只有极少的训练样本可用时，\\gls{dropout}不会很有效。\n在只有不到5000的样本的\\ENNAME{Alternative Splicing}数据集上\\citep{Xiong2011}，贝叶斯神经网络\\citep{Neal1996}比\\gls{dropout}表现得更好\\citep{Srivastava14}。\n当有其他未分类的数据可用时，\\gls{unsupervised}特征学习也比\\gls{dropout}更有优势。\n\n\n\\cite{Wager+al-2013}表明，当\\gls{dropout}作用于\\gls{linear_regression}时，相当于每个输入特征具有不同\\gls{weight_decay}系数的$L^2$\\gls{weight_decay}。 每个特征的\\gls{weight_decay}系数的大小是由其方差来确定的。\n其他\\gls{linear_model}也有类似的结果。\n而对于深度模型而言，\\gls{dropout}与\\gls{weight_decay}是不等同的。\n\n\n使用\\gls{dropout}训练时的随机性不是这个方法成功的必要条件。\n它仅仅是近似所有子模型总和的一个方法。\n\\cite{WangManning-ICML2013-small}导出了近似这种边缘分布的解析解。\n他们的近似被称为\\firstgls{fast_dropout}，减小梯度计算中的随机性而获得更快的收敛速度。\n这种方法也可以在测试时应用，能够比\\gls{weight_scaling_inference_rule}更合理地（但计算也更昂贵）近似所有子网络的平均。\n\\gls{fast_dropout}在小神经网络上的性能几乎与标准的\\gls{dropout}相当，但在大问题上尚未产生显著改善或尚未应用。\n\n% -- 258 --\n\n随机性对实现\\gls{dropout}的\\gls{regularization}效果不是必要的，同时也不是充分的。\n为了证明这一点，\\cite{WardeFarley+al-ICLR2014}使用一种被称为\\textbf{Dropout Boosting}的方法设计了一个对照实验，具有与传统\\gls{dropout}方法完全相同的噪声\\gls{mask}， 但缺乏\\gls{regularization}效果。\n\\gls{dropout_boosting}训练整个\\gls{ensemble}以最大化训练集上的似然。\n从传统\\gls{dropout}类似于\\gls{bagging}的角度来看，这种方式类似于\\gls{boosting}。\n如预期一样，和单一模型训练整个网络相比，\\gls{dropout_boosting}几乎没有\\gls{regularization}效果。\n这表明，使用\\gls{bagging}解释\\gls{dropout}具有使用稳健性噪声解释\\gls{dropout}之外的额外价值。\n只有当随机抽样的\\gls{ensemble}成员相互独立地训练，才能达到\\gls{bagging}\\gls{ensemble}的\\gls{regularization}效果。\n\n\\gls{dropout}启发其他以随机方法训练指数量级的共享权重的\\gls{ensemble}。\n\\ENNAME{DropConnect}是\n\\gls{dropout}的一个特殊情况，其中一个标量权重和单个\\gls{hidden_unit}状态之间的每个乘积被认为是可以丢弃的一个单元\\citep{Wan+al-ICML2013-small}。\n随机\\gls{pooling}是构造\\gls{CNN}\\gls{ensemble}的一种随机化\\gls{pooling}的形式(见\\secref{sec:pooling})，其中每个卷积网络参与每个特征图的不同空间位置。\n目前为止，\\gls{dropout}仍然是最广泛使用的隐式\\gls{ensemble}方法。\n\n一个关于\\gls{dropout}的重要见解是，通过随机行为训练网络并平均多个随机决定进行预测，实现了一种\\gls{parameter_sharing}的\\gls{bagging}形式。\n早些时候，我们将\\gls{dropout}描述为通过包括或排除单元形成模型\\gls{ensemble}的\\gls{bagging}。\n然而，这种\\gls{parameter_sharing}策略不一定要基于包括和排除。\n原则上，任何一种随机的修改都是可接受的。\n在实践中，我们必须选择让\\gls{NN}能够学习对抗的修改类型。\n在理想情况下，我们也应该使用可以快速近似\\gls{inference}的模型族。\n我们可以认为由向量$\\Vmu$参数化的任何形式的修改，是对$\\Vmu$所有可能的值训练$p(y \\mid \\Vx, \\Vmu)$的\\gls{ensemble}。\n注意，这里不要求$\\Vmu$具有有限数量的值。\n例如，$\\Vmu$可以是实值。\n\\cite{Srivastava14}表明，权重乘以$\\Vmu \\sim \\CalN(\\mathbf{1}, \\MI)$比基于二值\\gls{mask}\\gls{dropout}表现得更好。\n由于$\\SetE[\\Vmu] = 1$，标准网络自动实现\\gls{ensemble}的近似\\gls{inference}，而不需要\\gls{weight_scaling_inference_rule}。\n\n% -- 259 --\n\n目前为止，我们将\\gls{dropout}介绍为一种纯粹高效近似\\gls{bagging}的方法。\n然而，还有比这更进一步的\\gls{dropout}观点。\n\\gls{dropout}不仅仅是训练一个\\gls{bagging}的\\gls{ensemble}模型，\n并且是共享\\gls{hidden_unit}的\\gls{ensemble}模型。\n这意味着无论其他\\gls{hidden_unit}是否在模型中，每个\\gls{hidden_unit}必须都能够表现良好。\n\\gls{hidden_unit}必须准备好进行模型之间的交换和互换。\n\\cite{Hinton-et-al-arxiv2012-small}由生物学的想法受到启发：有性繁殖涉及到两个不同生物体之间交换基因，进化产生的压力使得基因不仅是良好的而且要准备好不同有机体之间的交换。\n这样的基因和这些特点对环境的变化是非常稳健的，因为它们一定会正确适应任何一个有机体或模型不寻常的特性。\n因此\\gls{dropout}\\gls{regularization}使得每个\\gls{hidden_unit}不仅要是一个很好的特征，更要在许多情况下是良好的特征。\n\\cite{WardeFarley+al-ICLR2014}将\\gls{dropout}与大\\gls{ensemble}的训练相比并得出结论：相比独立模型\\gls{ensemble}获得泛化误差改进，\\gls{dropout}会带来额外的改进。\n\n\\gls{dropout}强大的大部分原因来自施加到\\gls{hidden_unit}的\\gls{mask}噪声，了解这一事实是重要的。\n这可以看作是对输入内容的信息高度智能化、自适应破坏的一种形式，而不是对输入原始值的破坏。\n例如，如果模型学得通过鼻检测脸的\\gls{hidden_unit} $h_i$，那么丢失$h_i$对应于擦除图像中有鼻子的信息。\n模型必须学习另一种$h_i$，要么是鼻子存在的冗余编码，要么是像嘴这样的脸部的另一特征。\n传统的噪声注入技术，在输入端加非结构化的噪声不能够随机地从脸部图像中抹去关于鼻子的信息，除非噪声的幅度大到几乎能抹去图像中所有的信息。\n破坏提取的特征而不是原始值，让破坏过程充分利用该模型迄今获得的关于输入分布的所有知识。\n\n\\gls{dropout}的另一个重要方面是噪声是乘性的。\n如果是固定规模的加性噪声，那么加了噪声$\\epsilon$的\\gls{rectified_linear}\\gls{hidden_unit}可以简单地学会使$h_i$变得很大（使增加的噪声$\\epsilon$变得不显著）。\n乘性噪声不允许这样病态地解决噪声鲁棒性问题。\n\n% -- 260 --\n\n另一种\\gls{DL}算法——\\gls{batch_normalization}，在训练时向\\gls{hidden_unit}引入加性和乘性噪声重新参数化模型。\n\\gls{batch_normalization}的主要目的是改善优化，但噪声具有\\gls{regularization}的效果，有时没必要再使用\\gls{dropout}。\n\\gls{batch_normalization}将会在\\secref{sec:batch_normalization}中被更详细地讨论。\n\n\n\n\\section{对抗训练}\n\\label{sec:adversarial_training}\n在许多情况下，\\gls{NN}在独立同分布的测试集上进行评估已经达到了人类表现。\n因此，我们自然要怀疑这些模型在这些任务上是否获得了真正的人类层次的理解。\n为了探索网络对底层任务的理解层次，我们可以探索这个模型错误分类的例子。\n\\cite{Szegedy-ICLR2014}发现，在精度达到人类水平的\\gls{NN}上通过优化过程故意构造数据点，其上的误差率接近\\NUMTEXT{100\\%}，模型在这个输入点$\\Vx'$的输出与附近的数据点$\\Vx$非常不同。\n在许多情况下，$\\Vx'$与$\\Vx$非常近似，人类观察者不会察觉原始样本和\\firstgls{adversarial_example}之间的差异，但是网络会作出非常不同的预测。\n见\\figref{fig:chap7_panda_577}中的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{tabular}{>{\\centering\\arraybackslash}m{.2\\figwidth}m{.5in}>{\\centering\\arraybackslash}m{.2\\figwidth}m{.1in}>{\\centering\\arraybackslash}m{.2\\figwidth}}\n    \\centering\\arraybackslash\n%abs max for panda was 138, eps was 1., so relative eps is approximately .007\n    \\includegraphics[width=.2 \\figwidth]{Chapter7/figures/panda_577.png} &%\n    \\centering\\arraybackslash%\n$\\ +\\ .007\\ \\times$ &%\n    \\includegraphics[width=.2\\figwidth]{Chapter7/figures/nematode_082.png} &%\n    $=$ & %\n    \\includegraphics[width=.2\\figwidth]{Chapter7/figures/gibbon_993.png} \\\\\n    $\\centering \\Vx$     &%\n    & $\\text{sign} (\\nabla_{\\Vx} J(\\Vtheta, \\Vx, y) )$ & & $\\Vx + \\epsilon \\text{sign} (\\nabla_{\\Vx} J(\\Vtheta, \\Vx, y) )$ \\\\\n    $y=$``panda'' &                & ``nematode''     &   & ``gibbon'' \\\\\n    w/ 57.7\\% confidence &        &   w/ 8.2\\% confidence & & w/ 99.3 \\% confidence\n\\end{tabular}    \n\\fi\n\\caption[Fast adversarial sample generation]{\n在ImageNet上应用GoogLeNet~\\citep{Szegedy-et-al-arxiv2014}的\\gls{adversarial_example}生成的演示。\n通过添加一个不可察觉的小向量（其中元素等于\\gls{cost_function}相对于输入的梯度元素的符号），我们可以改变GoogLeNet对此图像的分类结果。\n经\\citet{Goodfellow-2015-adversarial}许可转载。\n}\n\\label{fig:chap7_panda_577}\n\\end{figure}\n\n% -- 261 --\n\n\\gls{adversarial_example}在很多领域有很多影响，例如计算机安全，这超出了本章的范围。\n然而，它们在\\gls{regularization}的背景下很有意思，因为我们可以通过\\firstgls{adversarial_training}减少原有独立同分布的测试集的错误率——在对抗扰动的训练集样本上训练网络\\citep{Szegedy-ICLR2014,Goodfellow-2015-adversarial}。\n\n\n\\cite{Goodfellow-2015-adversarial}表明，这些\\gls{adversarial_example}的主要原因之一是过度线性。\n\\gls{NN}主要是基于线性块构建的。\n因此在一些实验中，它们实现的整体函数被证明是高度线性的。\n这些线性函数很容易优化。\n不幸的是，如果一个线性函数具有许多输入，那么它的值可以非常迅速地改变。\n如果我们用$\\epsilon$改变每个输入，那么权重为$\\Vw$的线性函数可以改变$\\epsilon \\norm{\\Vw}_1$之多，如果$\\Vw$是高维的这会是一个非常大的数。\n\\gls{adversarial_training}通过鼓励网络在训练数据附近的局部区域恒定来限制这一高度敏感的局部线性行为。\n这可以被看作是一种明确地向\\gls{supervised}\\gls{NN}引入局部恒定先验的方法。\n\n对抗训练有助于体现积极\\gls{regularization}与大型函数族结合的力量。\n纯粹的\\gls{linear_model}，如\\gls{logistic_regression}，由于它们被限制为线性而无法抵抗\\gls{adversarial_example}。\n\\gls{NN}能够表示范围广泛的函数，从接近线性到局部近似恒定，从而可以灵活地捕获到训练数据中的线性趋势同时学习抵抗局部扰动。\n\n\\gls{adversarial_example}也提供了一种实现\\gls{semi_supervised_learning}的方法。\n在数据集中没有分配标签的点$\\Vx$处，模型自己为其分配一些标签$\\hat y$。\n模型的标记$\\hat y$未必是真正的标签，但如果模型是高品质的，那么$\\hat y$提供正确标签的可能性很大。\n我们可以搜索一个\\gls{adversarial_example} $\\Vx'$，导致分类器输出一个标签$y'$且$y' \\neq \\hat y$。\n不使用真正的标签，而是由训练好的模型提供标签产生的\\gls{adversarial_example}被称为\\firstgls{virtual_adversarial_example}\\citep{miyato2015distributional}。\n我们可以训练分类器为$\\Vx$和$\\Vx'$分配相同的标签。\n这鼓励分类器学习一个沿着未标签数据所在流形上任意微小变化都很鲁棒的函数。\n驱动这种方法的假设是，不同的类通常位于分离的流形上，并且小扰动不会使数据点从一个类的流形跳到另一个类的流形上。\n\n% -- 262 -- \n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%       Hard to translate\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\\section{\\glsentrytext{tangent_distance}、\\glsentrytext{tangent_prop}和流形正切分类器}\n\\label{sec:tangent_distance_tangent_prop_and_manifold_tangent_classifier}\n如\\secref{sec:manifold_learning}所述，许多\\gls{ML}通过假设数据位于低维流形附近来克服维数灾难。\n\n一个利用流形假设的早期尝试是\\firstgls{tangent_distance}算法\\citep{Simard93-small,Simard98}。\n它是一种非参数的最近邻算法，其中使用的度量不是通用的欧几里德距离，而是根据邻近流形关于聚集概率的知识导出的。\n这个算法假设我们尝试分类的样本和同一流形上的样本具有相同的类别。\n由于分类器应该对局部因素（对应于流形上的移动）的变化保持不变，一种合理的度量是将点$\\Vx_1$和$\\Vx_2$各自所在流形$M_1$和$M_2$的距离作为点$\\Vx_1$和$\\Vx_2$之间的最近邻距离。\n然而这可能在计算上是困难的（它需要解决一个寻找$M_1$和$M_2$最近点对的优化问题），一种局部合理的廉价替代是使用$\\Vx_i$点处切平面近似$M_i$，并测量两条切平面或一个切平面和点之间的距离。\n这可以通过求解一个低维线性系统（就流形的维数而言）来实现。\n当然，这种算法需要指定那些切向量。\n\n受相关启发，\\firstgls{tangent_prop}算法\\citep{Simard92-short}（\\figref{fig:chap7_mtc_color}）训练带有额外惩罚的\\gls{NN}分类器，使\\gls{NN}的每个输出$f(\\Vx)$对已知的变化因素是局部不变的。\n这些变化因素对应于沿着的相同样本聚集的流形的移动。\n这里实现局部不变性的方法是要求$\\nabla_{\\Vx} f(\\Vx)$与已知流形的切向$\\Vv^{(i)}$正交，或者等价地通过\\gls{regularization}惩罚$\\Omega$使$f$在$\\Vx$的$\\Vv^{(i)}$方向的导数较小：\n\\begin{align} \\label{eq:767}\n \\Omega(f) = \\sum_i \\Big((\\nabla_{\\Vx} f(\\Vx)^\\top \\Vv^{(i)}) \\Big)^2 .\n\\end{align}\n这个\\gls{regularization}项当然可以通过适当的超参数缩放，并且对于大多数\\gls{NN}，我们需要对许多输出求和(此处为描述简单，$f(\\Vx)$为唯一输出)。\n与\\gls{tangent_distance}算法一样，切向量是从先验知识推导的，通常是从变换（如平移、旋转和缩放图像）的效果获得的形式知识。\n\\gls{tangent_prop}不仅用于\\gls{supervised_learning}\\citep{Simard92-short}，还在\\gls{RL}\\citep{Thrun-NIPS1994}中有所应用。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/mtc_color}}\n\\fi\n\\caption{\\gls{tangent_prop}算法\\citep{Simard92-short}和\\gls{manifold}正切分类器主要思想的示意图\\citep{Dauphin-et-al-NIPS2011-small}，它们都\\gls{regularization}分类器的输出函数$f(\\Vx)$。\n每条曲线表示不同类别的\\gls{manifold}，这里表示嵌入二维空间中的一维\\gls{manifold}。\n在一条曲线上，我们选择单个点并绘制一个与类别\\gls{manifold}相切（平行并接触\\gls{manifold}）的向量以及与类别\\gls{manifold}垂直（与\\gls{manifold}正交）的向量。\n在多维情况下，可以存在许多切线方向和法线方向。\n我们希望分类函数在垂直于\\gls{manifold}方向上快速改变，并且在类别\\gls{manifold}的方向上保持不变。\n\\gls{tangent_prop}和\\gls{manifold}正切分类器都会\\gls{regularization} $f(\\Vx)$，使其不随$\\Vx$沿\\gls{manifold}的移动而剧烈变化。\n\\gls{tangent_prop}需要用户手动指定正切方向的计算函数（例如指定小平移后的图像保留在相同类别的\\gls{manifold}中），而\\gls{manifold}正切分类器通过训练\\gls{AE}拟合训练数据来估计\\gls{manifold}的正切方向 。\n我们将在\\chapref{chap:autoencoders}中讨论使用\\gls{AE}来估计\\gls{manifold}。\n}\n\\label{fig:chap7_mtc_color}\n\\end{figure}\n% -- 263 --\n\n\\gls{tangent_prop}与数据集增强密切相关。\n在这两种情况下，该算法的用户通过指定一组应当不会改变网络输出的转换，将其先验知识编码至算法中。\n不同的是在数据集增强的情况下，网络显式地训练正确分类这些施加大量变换后产生的不同输入。\n\\gls{tangent_prop}不需要显式访问一个新的输入点。\n取而代之，它解析地对模型\\gls{regularization}从而在指定转换的方向抵抗扰动。\n虽然这种解析方法是聪明优雅的，但是它有两个主要的缺点。\n首先，模型的\\gls{regularization}只能抵抗无穷小的扰动。\n显式的数据集增强能抵抗较大的扰动。\n其次，我们很难在基于\\gls{ReLU}的模型上使用无限小的方法。\n这些模型只能通过关闭单元或缩小它们的权重才能缩小它们的导数。\n它们不能像\\ENNAME{sigmoid}或\\ENNAME{tanh}单元一样通过较大权重在高值处饱和以收缩导数。\n数据集增强在\\gls{ReLU}上工作得很好，因为不同的整流单元会在每一个原始输入的不同转换版本上被激活。\n\n% -- 264 --\n\n\\gls{tangent_prop}也和\\gls{double_backprop}\\citep{DruckerLeCun92}以及\\gls{adversarial_training}\\citep{Szegedy-ICLR2014,Goodfellow-2015-adversarial}有关联。\n\\gls{double_backprop}\\gls{regularization}使\\gls{jacobian}矩阵偏小，而\\gls{adversarial_training}找到原输入附近的点，训练模型在这些点上产生与原来输入相同的输出。\n\\gls{tangent_prop}和手动指定转换的数据集增强都要求模型在输入变化的某些特定的方向上保持不变。\n\\gls{double_backprop}和\\gls{adversarial_training}都要求模型对输入所有方向中的变化（只要该变化较小）都应当保持不变。\n正如数据集增强是\\gls{tangent_prop}非无限小的版本，\\gls{adversarial_training}是\\gls{double_backprop}非无限小的版本。\n\n流形正切分类器\\citep{Dauphin-et-al-NIPS2011}无需知道切线向量的先验。\n我们将在\\chapref{chap:autoencoders}看到，\\gls{AE}可以估算流形的切向量。\n流形正切分类器使用这种技术来避免用户指定切向量。\n如\\figref{fig:chap14_cifar_cae}所示，这些估计的切向量不仅对图像经典几何变换（如转化、旋转和缩放）保持不变，还必须掌握对特定对象（如正在移动的身体某些部分）保持不变的因素。\n因此根据流形正切分类器提出的算法相当简单：\n（1）使用\\gls{AE}通过\\gls{unsupervised_learning}来学习流形的结构，以及（2）如\\gls{tangent_prop}（\\eqnref{eq:767}）一样使用这些切面\\gls{regularization}\\gls{NN}分类器。\n\n在本章中，我们已经描述了大多数用于\\gls{regularization}\\gls{NN}的通用策略。\n\\gls{regularization}是\\gls{ML}的中心主题，因此我们将不时在其余各章中重新回顾。\n\\gls{ML}的另一个中心主题是优化，我们将在下一章描述。\n\n% -- 265 --\n"
  },
  {
    "path": "Chapter8/README.md",
    "content": "#第八章笔记\n"
  },
  {
    "path": "Chapter8/annotations.txt",
    "content": "{'user': 'acct:happynoom@hypothes.is', 'text': '复杂度随着输入维度增加呈几何级数增长', 'origin_text': '性分类器而言，精确地最小化0−10−10-1损失通常是不可解的（  !!!复杂度几何级数增长于输入维数!!!  ）{cite?}。在这种情况下，我们通常会优化替代损失函数。', 'time': '2017-01-16T10:34'}\n{'user': 'acct:happynoom@hypothes.is', 'text': '，从而，', 'origin_text': '别的距离以改进分类器的鲁棒性，获得一个更强壮的，值得信赖的分类器  !!!。因而，!!!  相较于简单地最小化训练集上的平均0−10−10-1损失，从训练数', 'time': '2017-01-16T10:41'}\n{'user': 'acct:happynoom@hypothes.is', 'text': '可以考虑将batch翻译为“批量”，以适应汉语读者。', 'origin_text': '练集的优化算法被称为batch或确定性梯度算法，因为它们会同时大  !!!batch!!!  地处理所有的样本。这个术语可能有点令人困惑，因为这个词”bat', 'time': '2017-01-16T10:51'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '代理损失函数', 'origin_text': '同的方法，我们真正优化的目标会更加不同于我们希望优化的目标。  !!!替代损失函数!!!  和提前终止有时，我们真正关心的损失函数（比如分类误差）并不能', 'time': '2017-01-17T09:28'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '要抛掷n次硬币都正面朝上的难度是指数级的', 'origin_text': '易抛硬币得到正面朝上一次而获取局部极小值。在nnn-维空间中，  !!!指数级不太可能nnn次抛掷硬币都得到正面朝上!!!  。参看{Dauphin-et-al-NIPS2014-smal', 'time': '2017-02-05T02:56'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '简化', 'origin_text': '要很大的改动。局部极小值凸优化问题的一个突出特点是其可以  !!!归约!!!  为寻找一个局部极小值的问题。任何一个局部极小值都是全局最小值。', 'time': '2017-01-18T02:32'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '较优的可行解', 'origin_text': '个凸问题时，若发现了任何形式的临界点，我们都会知道已经找到了一个  !!!很好的解!!!  。对于非凸函数时，如神经网络，有可能会存在多个局部极小值', 'time': '2017-01-18T02:36'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '鞍点扩散对于训练算法来说有哪些影响呢？', 'origin_text': '理论证明了另一类和神经网络相关的高维随机函数也满足这种情况。  !!!训练算法时的鞍点扩散会有哪些影响呢!!!  ？对于只使用梯度信息的一阶优化算法而言，情况是不明的。鞍点附', 'time': '2017-01-18T07:14'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '目前情况还不清楚。', 'origin_text': '鞍点扩散会有哪些影响呢？对于只使用梯度信息的一阶优化算法而言，  !!!情况是不明的。!!!  鞍点附近的梯度通常会非常小。另一方面，实验中梯度下降似乎可以', 'time': '2017-01-18T07:42'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '也主张，应该可以通过分析来表明连续时间的梯度下降会逃离而不是吸引到鞍点，不过， 对梯度下降在更多的使用场景来说，情况或许会有不同。', 'origin_text': '出该区间。{GoodfellowOptimization15}  !!!还认为，或许可以解析地表明连续时间的梯度下降会逃离，而不是吸引，附近的鞍点，但是对于梯度下降更现实的使用，情况或许是不同的!!!  。\\\\begin{figure}[!htb]\\\\ifOpenSo', 'time': '2017-01-26T04:00'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '可能会使大量已完成的优化工作成为无用功。', 'origin_text': '当参数接近这样的悬崖区域时，梯度下降更新可以使参数弹射得非常远，  !!!可能会无效化已经完成的大量优化工作!!!  。图经\\xa0{Pascanu+al-ICML2013-small}许', 'time': '2017-01-19T05:42'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '当计算图变的极深时，神经网络优化算法会面临的另外一个难题就是长期依赖问题——由于变深的结构使模型丧失了学习到先前信息的能力，让优化变得极其困难。\\n深层的计算图不仅前馈网络中存在，在循环神经网络（在第十章中描述）结构中也是一样的，因为要在很长时间序列的各时刻重复操作相同的网络模块，并且模型参数共享，这使问题更加凸显。\\n\\n说明：\\n\\n这段感觉原文表述就有些问题，读起来感觉意思不连贯，在此小节并没有详说“长期依赖”是个什么东西，我调整了一下， 增加已经对长期依赖的简单说明来呼应标题，在破折号后面的一句行文解释来说明长期依赖对优化的困难，后接作者描述就显得意思上连贯了。', 'origin_text': '因素的相乘。因此，长期时间序列会产生大量相乘。长期依赖  !!!当计算图变得非常之深时，神经网络优化算法必须克服的另一个难题出现了。多层前馈网络会有这么深的计算图。\\\\chap?会介绍的循环网络会在很长的时间序列的每个时间点上重复应用相同的操作，因此也会有很深的计算图。反复使用相同的参数产生了尤为突出的困难。!!!  例如，假设某个计算图中包含一条重复与矩阵WW\\\\MW相乘的', 'time': '2017-01-20T02:25'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '隐变量', 'origin_text': '训练集可以唯一确定一组模型参数，那么该模型被称为可辨认的。带有  !!!潜变量!!!  的模型通常是不可辨认的，因为通过批次交换潜变量我们能得到等价的模', 'time': '2017-01-19T14:37'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'explosion 建议翻译成 “膨胀”\\n', 'origin_text': 'λi\\\\lambda_i不在111附近时，若在量级上大于111则会  !!!爆炸!!!  ；若小于111时则会消失。\\\\textbf{梯度消失（或弥散）问', 'time': '2017-01-20T02:30'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '膨胀的', 'origin_text': '。消失的梯度使得难以知道参数朝哪个方向移动能够改进代价函数，而  !!!爆炸!!!  梯度会使得学习不稳定。之前描述的诱发梯度截断的悬崖结构便是爆炸', 'time': '2017-01-20T02:30'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '各时刻', 'origin_text': '诱发梯度截断的悬崖结构便是爆炸梯度现象的一个例子。此处描述的  !!!每个时间点!!!  重复与WW\\\\MW相乘非常类似于寻求矩阵WW\\\\MW的最大特征值及对', 'time': '2017-01-20T02:49'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '各时刻', 'origin_text': 'x\\\\Vx中所有与WW\\\\MW的主特征向量垂直的成分。循环网络在  !!!每个时间步上!!!  使用相同的矩阵WW\\\\MW，而前馈网络并没有。因而即使是非常深层', 'time': '2017-01-20T02:52'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '一定', 'origin_text': 'WW\\\\MW，而前馈网络并没有。因而即使是非常深层的前馈网络也能  !!!很大!!!  程度上避免梯度消失和爆炸问题{cite?}。在循环网络已经被', 'time': '2017-01-20T02:52'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '时刻', 'origin_text': '崖结构在循环神经网络的代价函数中很常见，因为这类模型会涉及到多个  !!!时间步长!!!  因素的相乘。因此，长期时间序列会产生大量相乘。长期依赖', 'time': '2017-01-20T03:09'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '系数？', 'origin_text': '循环神经网络的代价函数中很常见，因为这类模型会涉及到多个时间步长  !!!因素!!!  的相乘。因此，长期时间序列会产生大量相乘。长期依赖当计', 'time': '2017-01-20T03:09'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '在更详细地描述循环网络之后', 'origin_text': '前馈网络也能很大程度上避免梯度消失和爆炸问题{cite?}。  !!!在循环网络已经被更详细地描述了之后!!!  ，我们将会在\\\\sec?进一步讨论循环网络训练中的挑战。非精确', 'time': '2017-01-20T03:09'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '噪音', 'origin_text': '知道精确的梯度或是Hessian矩阵。在实践中，通常这些量会有  !!!噪扰!!!  ，甚至是有偏的估计。几乎每一个深度学习算法都需要基于采样的估计', 'time': '2017-01-20T03:22'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '代理', 'origin_text': '到了梯度估计的欠完整性。我们可以选择比真实损失函数更容易估计的  !!!替代!!!  损失函数来避免这个问题。局部和全局结构间的弱对应迄今为止', 'time': '2017-01-20T03:28'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '找到', 'origin_text': '寻一个围绕山形结构的宽弧。大多数优化研究的难点集中于训练是否  !!!到达!!!  了全局最小值，局部最小值，或是鞍点，但在实践中神经网络不会到达任', 'time': '2017-01-20T03:55'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '不一定存在', 'origin_text': 'ig?表明神经网络通常不会到达梯度很小的区域。甚至，这些临界点  !!!不是必然存在的!!!  。例如，损失函数 −logp(y∣x;θ)−log\\u2061p(y∣x', 'time': '2017-01-20T03:56'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '而是当随着训练模型逐渐稳定后，收敛于某个值。', 'origin_text': '\\\\log p(y\\\\mid\\\\Vx;\\\\Vtheta)没有全局极小点，  !!!而是当模型更自信时会逐渐趋向某个值!!!  。  对于具有离散标签yyy和softmax分布p(y∣x)p', 'time': '2017-01-20T04:02'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '则负对数似然可以无限趋近但不会等于零。', 'origin_text': 'id\\\\Vx)的分类器而言，若模型能够正确分类训练集上的每个样本，  !!!则负对数似然可以任意地趋近于零，但是不可能实际达到零值!!!  。同样地，实值模型p(y∣x)=N(y;f(θ),β−1)p(', 'time': '2017-01-20T10:04'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '无穷', 'origin_text': '(\\\\Vtheta),\\\\beta^{-1})的负对数似然会趋向于负  !!!无限大!!!  ——如果f(θ)f(θ)f(\\\\Vtheta)能够正确预测所有的训', 'time': '2017-01-20T04:08'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '先决条件', 'origin_text': '一步讨论循环网络训练中的挑战。非精确梯度大多数优化算法的  !!!出发点!!!  都是我们知道精确的梯度或是Hessian矩阵。在实践中，通常这', 'time': '2017-01-20T06:45'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '若J(θ)J(θ)J(\\\\Vtheta)是当前点θθ\\\\Vtheta的病态条件', 'origin_text': '迄今为止，我们讨论的许多问题都是关于损失函数在单点的性质——  !!!若J(θ)J(θ)J(\\\\Vtheta)在当前点θθ\\\\Vtheta是病态条件数!!!  ，或者θθ\\\\Vtheta在悬崖中，或者θθ\\\\Vtheta是一个隐', 'time': '2017-01-20T06:59'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '无限制', 'origin_text': '(\\\\Vtheta)能够正确预测所有的训练集目标yyy，学习算法会  !!!无边界!!!  地增加ββ\\\\beta。如\\\\fig?所示，即使没有局部极小值和鞍', 'time': '2017-01-20T07:03'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '局部下降不确定能不能找到有效解的短路径', 'origin_text': '一些性质，如近似的有偏梯度或正确方向估计的方差。在这些情况下，  !!!局部下降或许能或许不能定义到达有效解的短路径!!!  ，我们并不能真的遵循局部下降的路径。目标函数可能有诸如病态条件', 'time': '2017-01-20T07:07'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '困难', 'origin_text': 'ig?所示。目前，我们还不了解这些问题中的哪一个与神经网络优化  !!!难题!!!  最相关，这是研究领域的热点方向。不管哪个问题最重要，如果', 'time': '2017-01-20T07:12'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '输出光滑的连续值', 'origin_text': '适用于神经网络的单元输出离散值的情况。然而，大多数神经网络单元  !!!输出平稳的增值!!!  ，使得局部搜索求解优化可行。一些理论结果表明，存在某类问题是不', 'time': '2017-01-20T08:31'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '但是 在实际情况中 我们通过设置更多参数，很容易发现针对大型网络来说还不错的解决方案。\\n\\n说明：\\n目前的翻译 有三个定语，太冗长。', 'origin_text': '。其他结果表明，寻求给定规模的网络的一个解决方案是不可解的，  !!!但在实践中，我们可以通过一个有很多对应于可接受解决方案的参数设定的更大的神经网络，很容易地找到一个解决方案。!!!  此外，在神经网络训练中，我们通常不关注函数的精确极小值，而只关', 'time': '2017-01-20T10:05'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '想要对优化算法是否能完成此目标进行理论分析是非常困难的', 'origin_text': '确极小值，而只关注将其值下降到足够小以获得一个很好的泛化误差。  !!!关于优化算法能否达到这个目标的理论分析是极其困难的。!!!  因此， 研究优化算法性能上更现实的界限仍然是机器学习研究中的一', 'time': '2017-01-20T09:03'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '在现实中研究优化算法的性能上界仍然是学术界的重要目标', 'origin_text': '关于优化算法能否达到这个目标的理论分析是极其困难的。因此，   !!!研究优化算法性能上更现实的界限仍然是机器学习研究中的一个重要目标。!!!  基本算法之前我们已经介绍了梯度下降（\\\\sec?），即', 'time': '2017-01-20T09:05'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '应用最广的', 'origin_text': '梯度下降随机梯度下降（SGD）及其变种很可能是一般机器学习中  !!!用得最多的!!!  优化算法，特别是在深度学习中。如\\\\sec?讨论，通过计算独立同', 'time': '2017-01-20T09:08'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '按照数据生成分布抽取m个小批量（独立同分布的）样本，通过计算它们梯度均值，', 'origin_text': '习中用得最多的优化算法，特别是在深度学习中。如\\\\sec?讨论，  !!!通过计算独立同分布地从数据生成分布中抽取的mmm个minibatch样本的梯度均值!!!  ，我们可以得到梯度的无偏估计。\\\\alg?展示了如何使用这个下', 'time': '2017-01-20T09:35'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '学习率', 'origin_text': '\\\\end{algorithm}SGD算法中的一个关键参数是  !!!学习速率!!!  。之前，我们介绍的SGD使用固定的学习速率。在实践中，有必要', 'time': '2017-01-29T01:18'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '应该谨慎的参考这个问题的大部分指导', 'origin_text': '目标函数值随时间变化的学习曲线。与其说是科学，这更是一门艺术，  !!!关于这个问题的大多数指导都应该被怀疑地看待!!!  。使用线性时间表时，参数选择为ϵ0ϵ0\\\\epsilon_0，ϵ', 'time': '2017-01-29T02:28'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '这更像', 'origin_text': '的选择方法是画出目标函数值随时间变化的学习曲线。与其说是科学，  !!!这更!!!  是一门艺术，关于这个问题的大多数指导都应该被怀疑地看待。使用线', 'time': '2017-01-29T02:29'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '如果学习率太小', 'origin_text': '的，特别是训练于随机代价函数上，例如由信号丢失引起的代价函数。  !!!如果学习速率太慢!!!  ，那么学习进程会缓慢。如果初始学习速率太低，那么学习可能会卡在', 'time': '2017-01-29T02:31'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '那么学习过程会很缓慢', 'origin_text': '机代价函数上，例如由信号丢失引起的代价函数。如果学习速率太慢，  !!!那么学习进程会缓慢!!!  。如果初始学习速率太低，那么学习可能会卡在一个相当高的损失值。', 'time': '2017-01-29T02:32'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '最优初始学习率的效果会好于大约迭代100次左右后最佳的学习率', 'origin_text': '会卡在一个相当高的损失值。通常，就总训练时间和最终损失值而言，  !!!最优初始学习速率会高于大约迭代100步后输出最好效果的学习速率!!!  。因此，通常最好是检测最早的几轮迭代，使用一个高于此时效果最佳', 'time': '2017-01-29T12:54'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '选择一个比在效果上表现最佳的学习率更大的学习率。', 'origin_text': '后输出最好效果的学习速率。因此，通常最好是检测最早的几轮迭代，  !!!使用一个高于此时效果最佳学习速率的学习速率!!!  ，但又不能太高以致严重的不稳定性。SGD和相关的miniba', 'time': '2017-01-29T13:18'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '但又不能太大导致严重的震荡', 'origin_text': '检测最早的几轮迭代，使用一个高于此时效果最佳学习速率的学习速率，  !!!但又不能太高以致严重的不稳定性!!!  。SGD和相关的minibatch或在线基于梯度的优化的最重', 'time': '2017-01-29T13:19'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': 'SGD及相关的minibatch亦或更广义的基于梯度优化的在线学习算法，一个重要的性质是每一步更新的计算时间不依赖训练样本数目的多寡。', 'origin_text': '效果最佳学习速率的学习速率，但又不能太高以致严重的不稳定性。  !!!SGD和相关的minibatch或在线基于梯度的优化的最重要的性质是每一步更新的计算时间不会随着训练样本数目而增加。!!!  即使训练样本数目非常大时，这也能收敛。对于足够大的数据集，S', 'time': '2017-01-29T13:49'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '用舍近求远的方法来求解问题。', 'origin_text': '梯度下降方向移动，却远离了任何解决方案，如\\\\fig?所示，或者是  !!!沿着一个不必要的长路径到达解决方法!!!  ，如\\\\fig?所示。目前，我们还不了解这些问题中的哪一个与神经', 'time': '2017-02-05T03:07'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '却和所有解决方案南辕北辙，', 'origin_text': '。在其他情况下，局部移动可能太过贪心化，朝着梯度下降方向移动，  !!!却远离了任何解决方案!!!  ，如\\\\fig?所示，或者是沿着一个不必要的长路径到达解决方法，如', 'time': '2017-02-05T03:08'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '最终的观点还是建议在传统优化算法上研究怎样选择更佳的初始化点，来实现目标更切实可行。', 'origin_text': '并且我们能够在该良好区域上初始化学习，那么这些问题都可以避免。  !!!最后一个观点建议研究选择良好的初始点以使用传统优化算法!!!  。优化的理论限制一些理论结果表明，我们为神经网络设计的任', 'time': '2017-02-05T03:18'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '多了个”权“', 'origin_text': '每层的梯度消失和爆炸问题，如\\\\sec?所述。不幸的是，这些  !!!初始权权重!!!  的最佳准则往往不会带来最佳效果。这可能有三种不同的原因。首先', 'time': '2017-02-15T05:29'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '可惜', 'origin_text': '同权重矩阵用于每层的梯度消失和爆炸问题，如\\\\sec?所述。  !!!不幸的是!!!  ，这些初始权权重的最佳准则往往不会带来最佳效果。这可能有三种不', 'time': '2017-02-15T05:29'}\n{'user': 'acct:hugh0120@hypothes.is', 'text': 'contour翻译为等高线更为合适', 'origin_text': '机梯度的方差。\\xa0我们通过此图说明动量如何克服这两个问题的第一个。  !!!轮廓线!!!  描绘了一个二次损失函数（具有病态条件数的Hessian矩阵）。横', 'time': '2017-03-02T13:11'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '自适应学习率算法', 'origin_text': '参数为正确的数值范围，或是设置不同单元计算互相不同的函数。  !!!具有自适应学习速率的算法!!!  神经网络研究员早就意识到学习速率肯定是难以设置的超参数之一，', 'time': '2017-03-05T04:02'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '在本书第三部分讨论的一个常用策略是使用相同的输入数据集，用非监督模型训练出来的参数来初始化监督模型', 'origin_text': '参数的简单固定或随机方法，还有可能使用机器学习初始化模型参数。  !!!本书第III部分讨论的常用策略是初始化监督模型的参数为无监督模型训练于相同的输入上学习出的参数。!!!  我们也可以在相关问题上使用监督训练。即使是运行监督训练在一个', 'time': '2017-03-05T04:18'}\n{'user': 'acct:codeVerySlow@hypothes.is', 'text': '正则化项 原文有terms', 'origin_text': 'Vtheta)，该代价函数通常包括整个训练集上的性能评估和额外的  !!!正则化!!!  。首先，我们会介绍机器学习任务训练算法中的优化和纯优化在哪', 'time': '2017-03-05T11:11'}\n{'user': 'acct:codeVerySlow@hypothes.is', 'text': '这一点不同于纯优化，纯优化的目标是最小化J本身', 'origin_text': '低代价函数 J(θ)J(θ)J(\\\\Vtheta)来提高PPP。  !!!这一点不同于纯优化最小化JJJ本身!!!  。训练深度模型的优化算法通常也会包括一些用于机器学习目标函数特', 'time': '2017-03-05T11:12'}\n{'user': 'acct:codeVerySlow@hypothes.is', 'text': '误差量', 'origin_text': '机器学习算法的目标是降低方程\\\\eqn?所示的期望泛化误差。这个  !!!数据量!!!  被称为风险。在这里我们要强调该期望取自真实的潜在分布pdata', 'time': '2017-03-05T11:22'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '具有自适应学习速率（由RMSProp和AdaDelta代表）的算法族都表现得相当鲁棒，不分伯仲，没有哪个算法能脱颖而出，拨得头筹。', 'origin_text': '}展示了许多优化算法在大量学习任务上的价值比较。虽然结果表明，  !!!具有自适应学习速率（由RMSProp和AdaDelta代表）的算法族表现得相当鲁棒，但没有单一的算法表现为最好的。!!!  目前，最流行的活跃使用的优化算法包括SGD，具动量的SGD，', 'time': '2017-03-05T11:38'}\n{'user': 'acct:huangpingchun@hypothes.is', 'text': '最流行和使用最活跃', 'origin_text': '的算法族表现得相当鲁棒，但没有单一的算法表现为最好的。目前，  !!!最流行的活跃使用!!!  的优化算法包括SGD，具动量的SGD，RMSProp，具动量的R', 'time': '2017-03-05T13:02'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:liber145@hypothes.is', 'text': '这个翻译很赞！', 'time': '2017-03-05T04:08'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞啊！这个翻译很赞！', 'time': '2017-03-05T03:35'}\n{'user': 'acct:liber145@hypothes.is', 'text': '读起来 膨胀 舒服，意思上我倾向于 爆炸，指出梯度变化过于剧烈，膨胀的程度可能不够。\\n另外，google里，词组 梯度爆炸 比 梯度膨胀 出现得高。', 'time': '2017-03-05T02:50'}\n{'user': 'acct:liber145@hypothes.is', 'text': '赞！这个翻译清楚多了！', 'time': '2017-03-05T01:46'}\n{'user': 'acct:liber145@hypothes.is', 'text': 'hidden variable 翻译成 隐变量 了，\\n这里 latent variable 翻译成 潜变量', 'time': '2017-03-04T23:03'}"
  },
  {
    "path": "Chapter8/optimization_for_training_deep_models.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Yujun Li \n\\chapter{\\glsentrytext{deep_model}中的优化}\n\\label{chap:optimization_for_training_deep_models}\n% 267 head\n\\gls{DL}算法在许多情况下都涉及到优化。\n例如，模型中的进行推断（如\\,\\glssymbol{PCA}）涉及到求解优化问题。\n我们经常使用解析优化去证明或设计算法。\n在\\gls{DL}涉及到的诸多优化问题中，最难的是\\gls{NN}训练。\n甚至是用几百台机器投入几天到几个月来解决单个\\gls{NN}训练问题，也是很常见的。\n因为这其中的优化问题很重要，代价也很高，因此研究者们开发了一组专门为此设计的优化技术。\n本章会介绍\\gls{NN}训练中的这些优化技术。\n\n% 267 mid\n如果你不熟悉基于梯度优化的基本原则，我们建议回顾\\chapref{chap:numerical_computation}。\n该章简要概述了一般的\\gls{nume_optimization}。\n\n\n本章主要关注这一类特定的优化问题：寻找\\gls{NN}上的一组参数$\\Vtheta$，它能显著地降低\\gls{cost_function} $J(\\Vtheta)$，该\\gls{cost_function}通常包括整个\\gls{training_set}上的性能评估和额外的\\gls{regularization}项。\n% 267 mid\n\n\n首先，我们会介绍在\\gls{ML}任务中作为训练算法使用的优化与纯优化有哪些不同。\n接下来，我们会介绍导致\\gls{NN}优化困难的几个具体挑战。\n然后，我们会介绍几个实用算法，包括优化算法本身和初始化参数的策略。\n更高级的算法能够在训练中自适应调整\\gls{learning_rate}，或者使用\\gls{cost_function}二阶导数包含的信息。\n最后，我们会介绍几个将简单优化算法结合成高级过程的优化策略，以此作为总结。\n% 268 head\n\n\n\\section{学习和纯优化有什么不同}\n\\label{sec:how_learning_differs_from_pure_optimization}\n用于\\gls{deep_model}训练的优化算法与传统的优化算法在几个方面有所不同。\n\\gls{ML}通常是间接作用的。\n在大多数\\gls{ML}问题中，我们关注某些性能度量$P$，其定义于\\gls{test_set}上并且可能是不可解的。\n因此，我们只是间接地优化$P$。\n我们希望通过降低一个不同的\\gls{cost_function} $J(\\Vtheta)$来提高$P$。\n这一点与纯优化不同，纯优化最小化目标$J$本身。\n训练\\gls{deep_model}的优化算法通常也会包括一些针对\\gls{ML}\\gls{objective_function}的特定结构进行的特化。\n% 268 mid\n\n\n通常，\\gls{cost_function}可写为\\gls{training_set}上的平均，如\n\\begin{equation}\n\\label{eq:8.1}\n    J(\\Vtheta) = \\SetE_{(\\RVx, \\RSy) \\sim\\hat{p}_\\text{data}} L(f(\\Vx ; \\Vtheta), y), % ??\n\\end{equation}\n其中$L$是每个样本的\\gls{loss_function}，$f(\\Vx;\\Vtheta)$是输入$\\Vx$时所预测的输出，$\\hat{p}_{\\text{data}}$是\\gls{empirical_distribution}。\n\\gls{supervised_learning}中，$y$是目标输出。\n在本章中，我们会介绍不带\\gls{regularization}的\\gls{supervised}学习，$L$的变量是$f(\\Vx;\\Vtheta)$和$y$。\n不难将这种\\gls{supervised_learning}扩展成其他形式，如包括$\\Vtheta$或者$\\Vx$作为参数，或是去掉参数$y$，以发展不同形式的\\gls{regularization}或是\\gls{unsupervised_learning}。\n% 268 mid\n\n\n\\eqnref{eq:8.1}定义了\\gls{training_set}上的\\gls{objective_function}。\n通常，我们更希望最小化取自\\emph{\\gls{DGD}}\\,$p_{\\text{data}}$的期望，而不仅仅是有限\\gls{training_set}上的对应\\gls{objective_function}：\n\\begin{equation}\n\\label{eq:8.2}\n    J^*(\\Vtheta) = \\SetE_{(\\RVx, \\RSy) \\sim p_\\text{data}} L(f(\\Vx ;\\Vtheta),y). % ??\n\\end{equation}\n% 268 end\n\n\n\\subsection{\\glsentrytext{empirical_risk_minimization}}\n\\label{sec:empirical_risk_minimization}\n\\gls{ML}算法的目标是降低\\eqnref{eq:8.2}所示的期望\\gls{generalization_error}。\n这个数据量被称为\\firstgls{risk}。\n在这里，我们强调该期望取自真实的\\gls{underlying}分布$p_{\\text{data}}$。\n如果我们知道了真实分布$p_{\\text{data}}(\\Vx, y)$，那么最小化风险变成了一个可以被优化算法解决的优化问题。\n然而，我们遇到的\\gls{ML}问题，通常是不知道$p_\\text{data}(\\Vx, y)$，只知道\\gls{training_set}中的样本。\n% 269 head\n\n\n将\\gls{ML}问题转化回一个优化问题的最简单方法是最小化\\gls{training_set}上的期望损失。\n这意味着用\\gls{training_set}上的\\gls{empirical_distribution}\\,$\\hat{p}(\\Vx,y)$替代真实分布$p(\\Vx,y)$。\n现在，我们将最小化\\firstgls{empirical_risk}：\n\\begin{equation}\n\\label{eq:8.3}\n    \\SetE_{\\RVx, \\RSy \\sim \\hat{p}_\\text{data}} [L(f(\\Vx ; \\Vtheta), y)] % ?? \\RVx\n    = \\frac{1}{m} \\sum_{i=1}^m L( f(\\Vx^{(i)}; \\Vtheta), y^{(i)}) ,\n\\end{equation}\n其中$m$表示训练样本的数目。\n% 269 mid\n\n\n基于最小化这种平均\\gls{training_error}的训练过程被称为\\firstgls{empirical_risk_minimization}。\n在这种情况下，\\gls{ML}仍然和传统的直接优化很相似。\n我们并不直接最优化\\gls{risk}，而是最优化\\gls{empirical_risk}，希望也能够很大地降低\\gls{risk}。\n一系列不同的理论构造了一些条件，使得在这些条件下真实\\gls{risk}的期望可以下降不同的量。\n% 269 mid\n\n\n然而，\\gls{empirical_risk_minimization}很容易导致\\gls{overfitting}。\n高\\gls{capacity}的模型会简单地记住\\gls{training_set}。\n在很多情况下，\\gls{empirical_risk_minimization}并非真的可行。\n最有效的现代优化算法是基于\\gls{GD}的，但是很多有用的\\gls{loss_function}，如$0-1$损失，没有有效的导数（导数要么为零，要么处处未定义）。\n这两个问题说明，在\\gls{DL}中我们很少使用\\gls{empirical_risk_minimization}。\n反之，我们会使用一个稍有不同的方法，我们真正优化的目标会更加不同于我们希望优化的目标。\n% 269 end\n\n\n\\subsection{\\glsentrytext{surrogate_loss_function}和\\glsentrytext{early_stopping}}\n\\label{sec:surrogate_loss_functions_and_early_stopping}\n% 269 end\n有时，我们真正关心的\\gls{loss_function}（比如分类误差）并不能被高效地优化。\n例如，即使对于\\gls{linear_classifier}而言，精确地最小化$0-1$损失通常是不可解的（复杂度是输入维数的指数级别）\\citep{Marcotte-92}。\n在这种情况下，我们通常会优化\\firstgls{surrogate_loss_function}。\n\\gls{surrogate_loss_function}作为原目标的代理，还具备一些优点。  \n例如，正确类别的负对数似然通常用作$0-1$损失的替代。\n负对数似然允许模型估计给定样本的类别的条件概率，如果该模型效果好，那么它能够输出期望最小分类误差所对应的类别。\n% 270 head\n\n\n在某些情况下，\\gls{surrogate_loss_function}比原函数学到的更多。\n例如，使用对数似然替代函数时，在\\gls{training_set}上的$0-1$损失达到$0$之后，\\gls{test_set}上的$0-1$损失还能持续下降很长一段时间。\n这是因为即使$0-1$损失期望是零时，我们还能拉开不同类别的距离以改进分类器的鲁棒性，获得一个更强壮的、更值得信赖的分类器，从而，相对于简单地最小化\\gls{training_set}上的平均$0-1$损失，它能够从训练数据中抽取更多信息。\n% 270 head\n\n\n一般的优化和我们用于训练算法的优化有一个重要不同：训练算法通常不会停止在\\gls{local_minimum}。\n反之，\\gls{ML}通常最小化\\gls{surrogate_loss_function}，但是在基于\\gls{early_stopping}（\\secref{sec:early_stopping}）的收敛条件满足时停止。\n通常，\\gls{early_stopping}使用真实\\gls{underlying}\\gls{loss_function}，如\\gls{validation_set}上的$0-1$损失，并设计为在\\gls{overfitting}发生之前终止。\n与纯优化不同的是，\\gls{early_stopping}时\\gls{surrogate_loss_function}仍然有较大的导数，而纯优化终止时过程已经收敛，导数较小。\n% 270 mid\n\n\n\\subsection{\\gls{batch}算法和\\gls{minibatch}算法}\n\\label{sec:batch_and_minibatch_algorithms}\n\\gls{ML}算法和一般优化算法不同的一点是，\\gls{ML}算法的\\gls{objective_function}通常可以分解为训练样本上的求和。\n%\\gls{ML}优化算法通常使用整个\\gls{cost_function}中的一部分项去更新其参数。\n\\gls{ML}中的优化算法在计算参数的每一次更新时通常仅使用整个\\gls{cost_function}中一部分项来估计\\gls{cost_function}的期望值。\n% 270 mid\n\n例如，\\gls{maximum_likelihood_estimation}问题可以在对数空间中分解成各个样本的总和：\n\\begin{equation}\n\\label{eq:8.4}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\sum_{i=1}^m\n    \\log p_{\\text{model}} (\\Vx^{(i)}, y^{(i)}; \\Vtheta) .\n\\end{equation}\n% 270 mid\n\n\n最大化这个总和等价于最大化\\gls{training_set}在\\gls{empirical_distribution}上的期望：\n\\begin{equation}\n\\label{eq:8.5}\n    J(\\Vtheta) = \\SetE_{\\RVx, \\RSy \\sim\\hat{p}_\\text{data}} \n    \\log p_{\\text{model}} (\\Vx,y ; \\Vtheta) .\n\\end{equation}\n%  270 end\n\n\n优化算法用到的\\gls{objective_function}$J$中的大多数属性也是\\gls{training_set}上的期望。\n例如，最常用的属性是梯度：\n\\begin{equation}\n\\label{eq:8.6}\n    \\nabla_{\\Vtheta} J(\\Vtheta) = \\SetE_{\\RVx, \\RSy \\sim\\hat{p}_{\\text{data}}} \n    \\nabla_{\\Vtheta} \\log p_{\\text{model}} (\\Vx,y; \\Vtheta) .\n\\end{equation}\n%  271 head\n\n\n准确计算这个期望的计算代价非常大，因为我们需要在整个数据集上的每个样本上评估模型。\n在实践中，我们可以从数据集中随机采样少量的样本，然后计算这些样本上的平均值。\n%  271 head\n\n\n回想一下，$n$个样本均值的\\gls{standard_error}（\\eqnref{eq:5.46}）是$\\sigma/\\sqrt{n}$，其中$\\sigma$是样本值真实的\\gls{standard_deviation}。\n分母$\\sqrt{n}$表明使用更多样本来估计梯度的方法的回报是低于线性的。\n比较两个假想的梯度计算，一个基于$100$个样本，另一个基于$10,000$个样本。\n后者需要的计算量是前者的$100$倍，但却只降低了$10$倍的均值\\gls{standard_error}。\n如果能够快速地计算出梯度估计值，而不是缓慢地计算准确值，那么大多数优化算法会收敛地更快（就总的计算量而言，而不是指更新次数）。\n%  271 mid\n\n\n另一个促使我们从小数目样本中获得梯度的统计估计的动机是\\gls{training_set}的冗余。\n在最坏的情况下，\\gls{training_set}中所有的$m$个样本都是彼此相同的拷贝。\n基于采样的梯度估计可以使用单个样本计算出正确的梯度，而比原来的做法少花了$m$倍时间。\n实践中，我们不太可能真的遇到这种最坏情况，但我们可能会发现大量样本都对梯度做出了非常相似的贡献。\n\n使用整个\\gls{training_set}的优化算法被称为\\firstgls{batch}或\\firstgls{deterministic}梯度算法，因为它们会在一个大\\gls{batch}中同时处理所有样本。\n这个术语可能有点令人困惑，因为这个词``\\gls{batch}''也经常被用来描述\\gls{minibatch}\\gls{SGD}算法中用到的\\gls{minibatch}样本。\n通常，术语``\\gls{batch}\\gls{GD}''指使用全部\\gls{training_set}，而术语``\\gls{batch}''单独出现时指一组样本。\n例如，我们普遍使用术语``\\gls{batch}大小''表示\\gls{minibatch}的大小。\n%  271 mid\n\n\n每次只使用单个样本的优化算法有时被称为\\firstgls{stochastic}或者\\firstgls{online}算法。\n术语``\\gls{online}''通常是指从连续产生样本的数据流中抽取样本的情况，而不是从一个固定大小的\\gls{training_set}中遍历多次采样的情况。\n%  271 end\n\n\n% 272 head\n大多数用于\\gls{DL}的算法介于以上两者之间，使用一个以上，而又不是全部的训练样本。\n传统上，这些会被称为\\firstgls{minibatch}或\\firstgls{minibatch_stochastic}方法 ，现在通常将它们简单地称为\\firstgls{stochastic}方法。\n\n\n随机方法的典型示例是\\gls{SGD}，这将在\\secref{sec:stochastic_gradient_descent_chap8}中详细描述。\n% 272 mid\n\n\\gls{minibatch}的大小通常由以下几个因素决定：\n\\begin{itemize}\n    \\item 更大的\\gls{batch}会计算更精确的梯度估计，但是回报却是小于线性的。\n    \n    \\item 极小\\gls{batch}通常难以充分利用多核架构。\n    这促使我们使用一些绝对最小\\gls{batch}，低于这个值的小\\gls{batch}处理不会减少计算时间。\n    \n    \\item 如果\\gls{batch}处理中的所有样本可以并行地处理（通常确是如此），那么内存消耗和\\gls{batch}大小会正比。\n    对于很多硬件设施，这是\\gls{batch}大小的限制因素。\n    \n    \\item 在某些硬件上使用特定大小的数组时，运行时间会更少。\n    尤其是在使用\\,\\glssymbol{GPU}\\,时，通常使用$2$的幂数作为\\gls{batch}大小可以获得更少的运行时间。\n    一般，$2$的幂数的取值范围是$32$到$256$，$16$有时在尝试大模型时使用。\n% 272 mid    \n    \\item \n    可能是由于小\\gls{batch}在学习过程中加入了\\gls{noise}，它们会有一些\\gls{regularize}效果~\\citep{Wilson-2003}。\n    \\gls{generalization_error}通常在\\gls{batch}大小为$1$时最好。\n    因为梯度估计的高方差，小\\gls{batch}训练需要较小的\\gls{learning_rate}以保持稳定性。\n    因为降低的\\gls{learning_rate}和消耗更多步骤来遍历整个\\gls{training_set}都会产生更多的步骤，所以会导致总的运行时间非常大。\n\\end{itemize}\n% 272 mid\n\n\n不同的算法使用不同的方法从\\gls{minibatch}中获取不同的信息。\n有些算法对采样误差比其他算法更敏感，这通常有两个可能原因。\n一个是它们使用了很难在少量样本上精确估计的信息，另一个是它们以放大采样误差的方式使用了信息。\n仅基于梯度$\\Vg$的更新方法通常相对鲁棒，并能使用较小的\\gls{batch}获得成功，如$100$。\n使用\\gls{hessian}矩阵$\\MH$，计算如$\\MH^{-1}\\Vg$更新的二阶方法通常需要更大的\\gls{batch}，如$10,000$。\n这些大\\gls{batch}需要最小化估计$\\MH^{-1}\\Vg$的波动。\n假设$\\MH$被精确估计，但是有\\gls{poor_conditioning}数。\n乘以$\\MH$或是其逆会放大之前存在的误差（这个示例中是指$\\Vg$的估计误差）。\n即使$\\MH$被精确估计，$\\Vg$中非常小的变化也会导致更新值$\\MH^{-1}\\Vg$中非常大的变化。\n当然，我们通常只会近似地估计$\\MH$，因此相对于我们使用具有较差条件数的操作去估计$\\Vg$，更新$\\MH^{-1}\\Vg$会含有更多的误差。\n% 273 head\n\n% 273 head\n\\gls{minibatch}是随机抽取的这点也很重要。\n从一组样本中计算出梯度期望的\\gls{unbiased}估计要求这些样本是独立的。\n我们也希望两个连续的梯度估计是互相独立的，因此两个连续的\\gls{minibatch}样本也应该是彼此独立的。\n很多现实的数据集自然排列，从而使得连续的样本之间具有高度相关性。\n例如，假设我们有一个很长的血液样本测试结果清单。\n清单上的数据有可能是这样获取的，头五个血液样本于不同时间段取自第一个病人，接下来三个血液样本取自第二个病人，再随后的血液样本取自第三个病人，等等。\n如果我们从这个清单上顺序抽取样本，那么我们的每个\\gls{minibatch}数据的偏差都很大，因为这个\\gls{minibatch}很可能只代表着数据集上众多患者中的某一个患者。\n在这种数据集中的顺序有很大影响的情况下，很有必要在抽取\\gls{minibatch}样本前打乱样本顺序。\n对于非常大的数据集，如数据中心含有几十亿样本的数据集，我们每次构建\\gls{minibatch}样本时都将样本完全均匀地抽取出来是不太现实的。\n幸运的是，实践中通常将样本顺序打乱一次，然后按照这个顺序存储起来就足够了。\n之后训练模型时会用到的一组组\\gls{minibatch}连续样本是固定的，每个独立的模型每次遍历训练数据时都会重复使用这个顺序。\n然而，这种偏离真实随机采样的方法并没有很严重的有害影响。\n不以某种方式打乱样本顺序才会极大地降低算法的性能。\n% 273 mid\n\n\n很多\\gls{ML}上的优化问题都可以分解成并行地计算不同样本上单独的更新。\n换言之，我们在计算\\gls{minibatch}样本$\\MX$上最小化$J(\\MX)$的更新时，同时可以计算其他\\gls{minibatch}样本上的更新。\n这类\\gls{asynchronous}并行分布式方法将在\\secref{sec:large_scale_distributed_implementations}中进一步讨论。\n% 273 end\n\n\n\\gls{minibatch}\\gls{SGD}的一个有趣动机是，只要没有重复使用样本，\n它将遵循着真实\\emph{\\gls{generalization_error}}（\\eqnref{eq:8.2}）的梯度。\n很多\\gls{minibatch}\\gls{SGD}方法的实现都会打乱数据顺序一次，然后多次遍历数据来更新参数。\n第一次遍历时，每个\\gls{minibatch}样本都用来计算真实\\gls{generalization_error}的\\gls{unbiased}估计。\n第二次遍历时，估计将会是\\gls{biased}的，因为它重新抽取了已经用过的样本，而不是从和原先样本相同的\\gls{DGD}中获取新的无偏的样本。\n%  274 head\n\n\n从\\gls{online_learning}的情况中我们最容易看出\\gls{SGD}最小化的是真实的\\gls{generalization_error}的原因。\n这时样本或者说（单个样本的）\\gls{minibatch}都是从数据\\firstgls{stream}中抽取出来的。\n换言之，\\gls{learner}好像是一个每次看到新样本的人，\n每个样本$(\\Vx,y)$都来自\\gls{DGD}~$p_{\\text{data}}(\\Vx,y)$，而不是使用大小固定的\\gls{training_set}。\n这种情况下，样本永远不会重复；每次更新的样本是从分布$p_\\text{data}$中采样获得的无偏样本。\n%  274 mid\n\n\n在$\\Vx$和$y$是离散时，以上的等价性最容易被看出来。\n在这种情况下，\\gls{generalization_error}（\\eqnref{eq:8.2}）可以表示为\n\\begin{equation}\n\\label{eq:8.7}\n    J^*(\\Vtheta) = \\sum_{\\Vx} \\sum_y p_{\\text{data}}(\\Vx, y) L(f(\\Vx; \\Vtheta),y),\n\\end{equation}\n上式的准确梯度为\n\\begin{equation}\n\\label{eq:8.8}\n    \\Vg = \\nabla_{\\Vtheta} J^*(\\Vtheta) = \\sum_{\\Vx} \\sum_y p_{\\text{data}}\n    (\\Vx, y) \\nabla_{\\Vtheta} L(f(\\Vx;\\Vtheta),y) .\n\\end{equation}\n在\\eqnref{eq:8.5}和\\eqnref{eq:8.6}中，我们已经在对数似然中看到了同样的结果；现在我们发现这一点在似然之外的其他函数$L$上也是成立的。\n在一些关于$p_\\text{data}$和$L$的温和假设下，在$\\Vx$和$y$是连续时也能得到类似的结果。\n%  274 mid\n\n\n因此，我们可以从\\gls{DGD}~$p_\\text{data}$抽取\\gls{minibatch}样本$\\{ \\Vx^{(1)}, \\dots,\\Vx^{(m)} \\}$以及对应的目标$y^{(i)}$，然后计算该\\gls{minibatch}上损失函数关于对应参数的梯度\n\\begin{equation}\n\\label{eq:8.9}\n    \\hat{\\Vg} = \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),y^{(i)} ).\n\\end{equation}\n以此获得\\gls{generalization_error}准确梯度的\\gls{unbiased}估计。\n最后，在方向$\\hat{\\Vg}$上更新$\\Vtheta$也就意味着以（真实）\\gls{generalization_error}为目标进行\\,\\glssymbol{SGD}\\,。\n%  274 end\n\n\n当然，这个解释只能用于样本没有重复使用的情况。\n然而，除非\\gls{training_set}特别大，通常最好是多次遍历\\gls{training_set}。\n当多次遍历数据集更新时，只有第一遍满足\\gls{generalization_error}梯度的\\gls{unbiased}估计。\n但是，额外的遍历更新当然会由于减小\\gls{training_error}而得到足够的好处，以抵消其带来的\\gls{training_error}和\\gls{test_error}间差距的增加。\n% -- 275 head\n\n\n随着数据集的规模迅速增长，超越了计算能力的增速，\n\\gls{ML}应用每个样本只使用一次的情况变得越来越常见，甚至是不完整地使用\\gls{training_set}。\n在使用一个非常大的\\gls{training_set}时，\\gls{overfitting}不再是问题，而\\gls{underfitting}和计算效率变成了主要的顾虑。\n读者也可以参考~\\cite{bottou-bousquet-2008}中关于训练样本数目增长时，\\gls{generalization_error}上计算瓶颈影响的讨论。\n% -- 275 mid\n\n\n\\section{\\glsentrytext{NN}优化中的挑战}\n\\label{sec:challenges_in_neural_network_optimization}\n优化通常是一个极其困难的任务。\n传统的\\gls{ML}会小心设计\\gls{objective_function}和约束，以确保优化问题是凸的，\n从而避免一般优化问题的复杂度。\n在训练\\gls{NN}时，我们肯定会遇到一般的\\gls{nonconvex}情况。\n即使是\\gls{convex_optimization}，也并非没有任何问题。\n在这一节中，我们会总结几个训练\\gls{deep_model}时会涉及到的主要挑战。\n% -- 275 mid\n\n\n\\subsection{\\glsentrytext{ill_conditioning}}\n\\label{sec:ill_conditioning}\n在优化凸函数时，会遇到一些挑战。\n这其中最突出的是\\,\\gls{hessian}\\,矩阵$\\MH$的\\gls{ill_conditioning}。\n这是\\gls{nume_optimization}、\\gls{convex_optimization}或其他形式的优化中普遍存在的问题，更多细节请回顾\\secref{sec:beyond_the_gradient_jacobian_and_hessian_matrices}。\n% -- 275 mid\n\n\\gls{ill_conditioning}问题一般被认为存在于\\gls{NN}训练过程中。\n\\gls{ill_conditioning}体现在\\gls{SGD}会``卡''在某些地方，此时即使很小的更新步长也会增加\\gls{cost_function}。\n% -- 275 mid\n\n回顾\\eqnref{eq:4.9}，\\gls{cost_function}的二阶\\gls{taylor}级数展开预测\\gls{GD}中的$-\\epsilon\\Vg$步骤会增加\n\\begin{equation}\n    \\frac{1}{2} \\epsilon^2 \\Vg^\\top \\MH\\Vg - \\epsilon\\Vg^\\top\\Vg\n\\end{equation}\n到代价中。\n当$\\frac{1}{2} \\epsilon^2 \\Vg^\\top\\MH\\Vg$超过$\\epsilon\\Vg^\\top\\Vg$时，梯度的\\gls{ill_conditioning}会成为问题。\n我们可以通过监测平方梯度范数$\\Vg^\\top\\Vg$和$\\Vg^\\top \\MH\\Vg$，来判断\\gls{ill_conditioning}是否不利于\\gls{NN}训练任务。\n在很多情况中，梯度范数不会在训练过程中显著缩小，但是$\\Vg^\\top\\MH\\Vg$的增长会超过一个数量级。\n其结果是尽管梯度很强，学习会变得非常缓慢，因为\\gls{learning_rate}必须收缩以弥补更强的\\gls{curvature}。\n如\\figref{fig:chap8_grad_norm_increases}所示，成功训练的\\gls{NN}中，梯度显著增加。\n% -- 276 head\n\n% -- 276 end\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/grad_norm_increases_color}}\n\\fi\n\\caption{\\gls{GD}通常不会到达任何类型的\\gls{critical_points}。\n此示例中，在用于对象检测的\\gls{convolutional_network}的整个训练期间， 梯度范数持续增加。\n\\emph{(左)}各个梯度计算的范数如何随时间分布的散点图。\n为了方便作图，每\\gls{epoch}仅绘制一个梯度范数。 \n我们将所有梯度范数的移动平均绘制为实曲线。\n梯度范数明显随时间增加，而不是如我们所期望的那样随训练过程收敛到\\gls{critical_points}而减小。\n\\emph{(右)}尽管梯度递增，训练过程却相当成功。 \n\\gls{validation_set}上的分类误差可以降低到较低水平。\n}\n\\label{fig:chap8_grad_norm_increases}\n\\end{figure}\n% -- 276 end\n\n\n% -- 276 mid\n尽管\\gls{ill_conditioning}还存在于除了\\gls{NN}训练的其他情况中，有些适用于其他情况的解决\\gls{ill_conditioning}的技术并不适用于\\gls{NN}。\n例如，\\gls{newton_method}在解决带有\\gls{poor_conditioning}的\\,\\gls{hessian}\\,矩阵的\\gls{convex_optimization}问题时，是一个非常优秀的工具，\n但是我们将会在以下小节中说明\\gls{newton_method}运用到\\gls{NN}时需要很大的改动。\n\n\n% -- 276 mid\n\\subsection{\\glsentrytext{local_minima}}\n\\label{sec:local_minima}\n\\gls{convex_optimization}问题的一个突出特点是其可以简化为寻找一个\\gls{local_minimum}的问题。\n任何一个\\gls{local_minimum}都是\\gls{global_minimum}。\n有些凸函数的底部是一个平坦的区域，而不是单一的\\gls{global_minimum}，但该平坦区域中的任意点都是一个可以接受的解。\n优化一个凸问题时，若发现了任何形式的\\gls{critical_points}，我们都会知道已经找到了一个不错的可行解。\n% -- 277 head\n\n\n对于\\gls{nonconvex}函数时，如\\gls{NN}，有可能会存在多个\\gls{local_minima}。\n事实上，几乎所有的\\gls{deep_model}基本上都会有非常多的\\gls{local_minima}。\n然而，我们会发现这并不是主要问题。\n% -- 277 mid\n\n\n由于\\firstgls{model_identifiability}问题，\\gls{NN}和任意具有多个等效参数化\\gls{latent_variable}的模型都会具有多个\\gls{local_minima}。\n如果一个足够大的\\gls{training_set}可以唯一确定一组模型参数，那么该模型被称为\\gls{identifiable}。\n带有\\gls{latent_variable}的模型通常是不\\gls{identifiable}，因为通过相互交换\\gls{latent_variable}我们能得到等价的模型。\n例如，考虑\\gls{NN}的第一层，我们可以交换单元$i$和单元$j$的传入权重向量、传出权重向量而得到等价的模型。\n如果\\gls{NN}有$m$层，每层有$n$个单元，那么会有$n!^m$种排列\\gls{hidden_unit}的方式。\n这种不可辨认性被称为\\firstgls{weight_space_symmetry}。\n% -- 277 mid\n\n\n除了\\gls{weight_space_symmetry}，很多\\gls{NN}还有其他导致不可辨认的原因。\n例如，在任意\\gls{rectified_linear}网络或者~\\gls{maxout}~网络中，\n我们可以将传入权重和\\gls{bias_aff}放缩$\\alpha$倍，然后将传出权重放缩$\\frac{1}{\\alpha}$倍，而保持模型等价。\n这意味着，如果\\gls{cost_function}不包括如\\gls{weight_decay}这种直接依赖于权重而非模型输出的项，那么\\gls{rectified_linear}网络或者~\\gls{maxout}~网络的每一个\\gls{local_minimum}都在等价的\\gls{local_minima}的$(m\\times n)$维双曲线上。\n% -- 277 mid\n\n\n这些\\gls{model_identifiability}问题意味着\\gls{NN}\\gls{cost_function}具有非常多、甚至不可数无限多的\\gls{local_minima}。\n然而，所有这些由于不可辨识性问题而产生的\\gls{local_minima}都有相同的\\gls{cost_function}值。\n因此，这些\\gls{local_minima}并非是\\gls{nonconvex}所带来的问题。\n% -- 277 mid\n\n\n如果\\gls{local_minima}相比\\gls{global_minimum}拥有很大的\\gls{cost}，\\gls{local_minima}会带来很大的隐患。\n我们可以构建没有\\gls{hidden_unit}的小规模\\gls{NN}，其\\gls{local_minima}的\\gls{cost}比\\gls{global_minimum}的\\gls{cost}大很多~\\citep{Sontag-cs89,Brady89,Gori-pami91}。\n如果具有很大\\gls{cost}的\\gls{local_minima}是常见的，那么这将给基于梯度的优化算法带来极大的问题。\n% -- 277 end\n\n\n对于实际中感兴趣的网络，是否存在大量\\gls{cost}很高的\\gls{local_minima}，优化算法是否会碰到这些\\gls{local_minima}，都是尚未解决的公开问题。\n多年来，大多数从业者认为\\gls{local_minima}是困扰\\gls{NN}优化的常见问题。\n如今，情况有所变化。\n这个问题仍然是学术界的热点问题，但是学者们现在猜想，对于足够大的\\gls{NN}而言，\n大部分\\gls{local_minima}都具有很小的\\gls{cost_function}，我们能不能找到真正的\\gls{global_minimum}并不重要，而是需要在参数空间中找到一个\\gls{cost}很小（但不是最小）的点~\\citep{Saxe-et-al-ICLR13,Dauphin-et-al-NIPS2014-small,GoodfellowOptimization15,Choromanska-et-al-AISTATS2015}。\n% 278 head\n\n很多从业者将\\gls{NN}优化中的所有困难都归结于\\gls{local_minima}。\n我们鼓励从业者要仔细分析特定的问题。\n一种能够排除\\gls{local_minima}是主要问题的检测方法是画出梯度范数随时间的变化。\n如果梯度范数没有缩小到一个微小的值，那么该问题既不是\\gls{local_minima}，也不是其他形式的\\gls{critical_points}。\n%这种消极的测试可以排除局部极小值是造成问题的原因。\n在高维空间中，很难明确证明\\gls{local_minima}是导致问题的原因。\n许多并非\\gls{local_minima}的结构也具有很小的梯度。\n% 278 mid\n\n\\subsection{高原、\\glsentrytext{saddle_points}和其他平坦区域}\n\\label{sec:plateaus_saddle_points_and_other_flat_regions}\n对于很多高维\\gls{nonconvex}函数而言，\\gls{local_minima}（以及\\gls{maxima}）事实上都远少于另一类梯度为零的点：\\gls{saddle_points}。\n\\gls{saddle_points}附近的某些点比\\gls{saddle_points}有更大的\\gls{cost}，而其他点则有更小的\\gls{cost}。\n在\\gls{saddle_points}处，\\gls{hessian}\\,矩阵同时具有正负特征值。\n位于正特征值对应的特征向量方向的点比\\gls{saddle_points}有更大的\\gls{cost}，反之，位于负特征值对应的特征向量方向的点有更小的\\gls{cost}。\n我们可以将\\gls{saddle_points}视为\\gls{cost_function}某个横截面上的\\gls{local_minimum}，同时也可以视为\\gls{cost_function}某个横截面上的\\gls{local_maximum}。\n\\figref{fig:chap4_saddle_3d_color}\\,给了一个示例。\n% 278 mid\n\n\n多类随机函数表现出以下性质：低维空间中，\\gls{local_minima}很普遍。\n在更高维空间中，\\gls{local_minima}很罕见，而\\gls{saddle_points}则很常见。\n对于这类函数$f:\\SetR^n \\to \\SetR$而言，\\gls{saddle_points}和\\gls{local_minima}的数目比率的期望随$n$指数级增长。\n我们可以从直觉上理解这种现象——\\gls{hessian}\\,矩阵在\\gls{local_minimum}处只有正特征值。\n而在\\gls{saddle_points}处，\\gls{hessian}\\,矩阵则同时具有正负特征值。\n试想一下，每个特征值的正负号由抛硬币决定。\n在一维情况下，很容易抛硬币得到正面朝上一次而获取\\gls{local_minimum}。\n在$n$-维空间中，要抛掷$n$次硬币都正面朝上的难度是指数级的。 \n具体可以参考~\\cite{Dauphin-et-al-NIPS2014-small}，它回顾了相关的理论工作。\n% -- 278 end\n\n\n很多随机函数一个惊人性质是，当我们到达\\gls{cost}较低的区间时，\\gls{hessian}\\,矩阵的特征值为正的可能性更大。\n和抛硬币类比，这意味着如果我们处于低\\gls{cost}的\\gls{critical_points}时，抛掷硬币正面朝上$n$次的概率更大。\n这也意味着，\\gls{local_minima}具有低\\gls{cost}的可能性比高\\gls{cost}要大得多。\n具有高\\gls{cost}的\\gls{critical_points}更有可能是\\gls{saddle_points}。\n具有极高\\gls{cost}的\\gls{critical_points}就很可能是\\gls{local_maxima}了。\n% -- 279 head\n\n\n以上现象出现在许多种类的随机函数中。\n那么是否在\\gls{NN}中也有发生呢？\n\\cite{Baldi89}从理论上证明，不具非线性的浅层\\gls{AE}（\\chapref{chap:autoencoders}中将介绍的一种将输出训练为输入拷贝的\\gls{feedforward_network}）只有\\gls{global_minima}和\\gls{saddle_points}，没有\\gls{cost}比\\gls{global_minima}更大的\\gls{local_minima}。\n他们还发现这些结果能够扩展到不具非线性的更深的网络上，不过没有证明。\n这类网络的输出是其输入的线性函数，但它们仍然有助于分析非线性\\gls{NN}模型，因为它们的\\gls{loss_function}是关于参数的\\gls{nonconvex}函数。\n这类网络本质上是多个矩阵组合在一起。\n\\cite{Saxe-et-al-ICLR13}精确解析了这类网络中完整的学习动态，表明这些模型的学习能够捕捉到许多在训练具有非线性\\gls{activation_function}的\\gls{deep_model}时观察到的定性特征。\n\\cite{Dauphin-et-al-NIPS2014-small}通过实验表明，真实的\\gls{NN}也存在包含很多高\\gls{cost}\\gls{saddle_points}的\\gls{loss_function}。\n\\cite{Choromanska-et-al-AISTATS2015}提供了额外的理论论点，表明另一类和\\gls{NN}相关的高维随机函数也满足这种情况。\n\n% -- 279 mid\n\n\\gls{saddle_points}激增对于训练算法来说有哪些影响呢？\n对于只使用梯度信息的一阶优化算法而言，目前情况还不清楚。\n\\gls{saddle_points}附近的梯度通常会非常小。\n另一方面，实验中\\gls{GD}似乎可以在许多情况下逃离\\gls{saddle_points}。\n\\cite{GoodfellowOptimization15}可视化了最新\\gls{NN}的几个学习轨迹，\\figref{fig:chap8_plot_atmu_relu_5}\\,给了一个例子。\n这些可视化显示，在突出的\\gls{saddle_points}附近，\\gls{cost_function}都是平坦的，权重都为零。\n但是他们也展示了\\gls{GD}轨迹能够迅速逸出该区间。\n\\cite{GoodfellowOptimization15}也主张，应该可以通过分析来表明连续时间的\\gls{GD}会逃离而不是吸引到\\gls{saddle_points}，但对\\gls{GD}更现实的使用场景来说，情况或许会有所不同。\n\n% -- 279 mid\n\n% 280 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/plot_atmu_relu_5}}\n\\fi\n\\caption{\\gls{NN}\\gls{cost_function}的可视化。\n这些可视化对应用于真实\\gls{object_recognition}和\\gls{NLP}任务的\\gls{feedforward_neural_network}、\\gls{convolutional_network}和\\gls{recurrent_network}而言是类似的。\n令人惊讶的是，这些可视化通常不会显示出很多明显的障碍。\n大约2012年，在\\gls{SGD}开始成功训练非常大的模型之前，相比这些投影所显示的\\gls{NN}\\gls{cost_function}的表面通常被认为有更多的\\gls{nonconvex}结构。\n该投影所显示的主要障碍是初始参数附近的高\\gls{cost}\\gls{saddle_points}，但如由蓝色路径所示，\\glssymbol{SGD}\\,训练轨迹能轻易地逃脱该鞍点。\n大多数训练时间花费在横穿\\gls{cost_function}中相对平坦的峡谷，可能由于梯度中的高噪声、或该区域中~\\gls{hessian}~矩阵的\\gls{poor_conditioning}，或者需要经过间接的弧路径绕过图中可见的高``山'' 。\n图经~\\citet{GoodfellowOptimization15}许可改编。\n}\n\\label{fig:chap8_plot_atmu_relu_5}\n\\end{figure}\n% 280 head\n\n\n% -- 279 end\n对于\\gls{newton_method}而言，\\gls{saddle_points}显然是一个问题。\n\\gls{GD}旨在朝``下坡''移动，而非明确寻求\\gls{critical_points}。\n而\\gls{newton_method}的目标是寻求梯度为零的点。\n如果没有适当的修改，\\gls{newton_method}就会跳进一个\\gls{saddle_points}。\n高维空间中\\gls{saddle_points}的激增或许解释了在\\gls{NN}训练中为什么\\gls{second_order_method}无法成功取代\\gls{GD}。\n\\cite{Dauphin-et-al-NIPS2014-small}介绍了二阶优化的\\firstgls{saddle_free_newton_method}，并表明和传统版本的牛顿法相比有显著改进。\n\\gls{second_order_method}目前仍然难以扩展到大型\\gls{NN}，但是如果这类无鞍算法能够扩展的话，还是很有希望的。\n% -- 280 mid\n\n\n除了\\gls{minima}和\\gls{saddle_points}，还存在其他梯度为零的点。\n例如\\gls{maxima}，它的情况从优化的角度看与\\gls{saddle_points}很类似，很多算法不会被吸引到\\gls{maxima}，除了未经修改的\\gls{newton_method}。\n和\\gls{minima}一样，许多种类的随机函数的\\gls{maxima}在高维空间中也是指数级稀少。\n% -- 280 mid\n\n\n也可能存在恒值的、宽且平坦的区域。\n在这些区域，梯度和\\,\\gls{hessian}\\,矩阵都是零。\n这种退化的情形对所有\\gls{nume_optimization}算法而言都是主要问题。\n在凸问题中，一个宽而平坦的区间肯定包含\\gls{global_minima}，但是对于一般的优化问题而言，\n这样的区域可能会对应着\\gls{objective_function}中一个较高的值。\n% -- 280 end\n\n\n\\subsection{悬崖和\\glsentrytext{explode_gradient}}\n\\label{sec:cliffs_and_exploding_gradients}\n% 281 head\n多层\\gls{NN}经常存在像悬崖一样的斜率较大区域，如\\figref{fig:chap8_cliff}所示。\n这是由于几个较大的权重相乘导致的。\n遇到斜率极大的悬崖结构时，梯度更新会很大程度地改变参数值，通常会完全跳过这类悬崖结构。\n% 281 head\n\n\n% 281 end\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/cliff_color}}\n\\fi\n\\caption{高度非线性的\\gls{DNN}或\\gls{RNN}的\\gls{objective_function}通常包含由几个参数连乘而导致的参数空间中尖锐非线性。\n这些非线性在某些区域会产生非常大的导数。\n当参数接近这样的悬崖区域时，\\gls{GD}更新可以使参数弹射得非常远，可能会使大量已完成的优化工作成为无用功。\n图经 \\citet{Pascanu+al-ICML2013-small}许可改编。}\n\\label{fig:chap8_cliff}\n\\end{figure}\n% 281 end\n\n\n不管我们是从上还是从下接近悬崖，情况都很糟糕，但幸运的是我们可以用使用\\secref{sec:clipping_gradients}介绍的启发式\\firstgls{gradient_clipping}来避免其严重的后果。\n其基本想法源自梯度并没有指明最佳步长，只说明了在无限小区域内的最佳方向。\n当传统的\\gls{GD}算法提议更新很大一步时，启发式\\gls{gradient_clipping}会干涉来减小步长，从而使其不太可能走出梯度近似为\\gls{steepest}方向的悬崖区域。\n悬崖结构在\\gls{RNN}的\\gls{cost_function}中很常见，因为这类模型会涉及到多个因子的相乘，其中每个因子对应一个\\gls{time_step}。\n因此，长期时间序列会产生大量相乘。\n% 281 mid\n\n\n% 281 end\n\\subsection{\\glsentrytext{long_term_dependency}}\n\\label{sec:long_term_dependencies}\n当\\gls{computational_graph}变得极深时，\\gls{NN}优化算法会面临的另外一个难题就是\\gls{long_term_dependency}问题——由于变深的结构使模型丧失了学习到先前信息的能力，让优化变得极其困难。 \n深层的\\gls{computational_graph}不仅存在于\\gls{feedforward_network}，还存在于之后介绍的\\gls{recurrent_network}中（在\\chapref{chap:sequence_modeling_recurrent_and_recursive_nets}中描述）。\n因为\\gls{recurrent_network}要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图，并且模型参数共享，这使问题更加凸显。\n\n% 282 head\n\n例如，假设某个\\gls{computational_graph}中包含一条反复与矩阵$\\MW$相乘的路径。\n那么$t$步后，相当于乘以$\\MW^t$。\n假设$\\MW$有特征值分解$\\MW = \\MV \\text{diag}(\\Vlambda) \\MV^{-1}$。\n在这种简单的情况下，很容易看出\n\\begin{equation}\n  \\MW^t = (\\MV \\text{diag}(\\Vlambda) \\MV^{-1})^t = \\MV\\text{diag}(\\Vlambda)^t  \\MV^{-1}.\n\\end{equation}\n当特征值$\\lambda_i$的绝对值不在$1$附近时，若绝对值大于$1$则会爆炸；若小于$1$时则会消失。\n\\firstgls{vanish_explode_gradient}是指该\\gls{computational_graph}上的梯度也会因为$\\text{diag}(\\Vlambda)^t$大幅度变化。\n\\gls{vanish_gradient}使得我们难以知道参数朝哪个方向移动能够改进\\gls{cost_function}，而\\gls{explode_gradient}会使得学习不稳定。\n之前描述的促使我们使用\\gls{gradient_clipping}的悬崖结构便是\\gls{explode_gradient}现象的一个例子。\n\n% 282 mid\n\n此处描述的在各\\gls{time_step}重复与$\\MW$相乘非常类似于寻求矩阵$\\MW$的最大特征值及对应特征向量的\\firstgls{power_method}。\n从这个观点来看，$\\Vx^\\top\\MW^t$最终会丢弃$\\Vx$中所有与$\\MW$的主特征向量正交的成分。\n\n% 282 mid\n\n\\gls{recurrent_network}在各\\gls{time_step}上使用相同的矩阵$\\MW$，而\\gls{feedforward_network}并没有。\n所以即使使用非常深层的\\gls{feedforward_network}，也能很大程度上有效地避免\\gls{vanish_explode_gradient}~\\citep{Sussillo14}。\n\n% 282 mid\n\n在更详细地描述\\gls{recurrent_network}之后，我们将会在\\secref{sec:the_challenge_of_long_term_dependencies}进一步讨论\\gls{recurrent_network}训练中的挑战。\n\n% 282 mid\n\n\\subsection{非精确梯度}\n\\label{sec:inexact_gradients}\n大多数优化算法的先决条件都是我们知道精确的梯度或是\\,\\gls{hessian}\\,矩阵。\n在实践中，通常这些量会有\\gls{noise}，甚至是\\gls{biased}的估计。\n几乎每一个\\gls{DL}算法都需要基于采样的估计，至少使用训练样本的\\gls{minibatch}来计算梯度。\n\n% 282 end\n\n在其他情况，我们希望最小化的\\gls{objective_function}实际上是难以处理的。\n当\\gls{objective_function}不可解时，通常其梯度也是难以处理的。\n在这种情况下，我们只能近似梯度。\n这些问题主要出现在第三部分中更高级的模型中。\n例如，\\gls{contrastive_divergence}是用来近似\\gls{BM}中难以处理的对数似然梯度的一种技术。\n\n% 283 head\n\n各种\\gls{NN}优化算法的设计都考虑到了梯度估计的缺陷。\n我们可以选择比真实\\gls{loss_function}更容易估计的\\gls{surrogate_loss_function}来避免这个问题。\n\n% 283 mid\n\n\\subsection{局部和全局结构间的弱对应}\n\\label{sec:poor_correspondence_between_local_and_global_structure}\n迄今为止，我们讨论的许多问题都是关于\\gls{loss_function}在单个点的性质——若$J(\\Vtheta)$是当前点$\\Vtheta$的\\gls{poor_conditioning}，或者$\\Vtheta$在悬崖中，或者$\\Vtheta$是一个下降方向不明显的\\gls{saddle_points}，那么会很难更新当前步。\n\n% 283 mid\n\n如果该方向在局部改进很大，但并没有指向\\gls{cost}低得多的遥远区域，那么我们有可能在单点处克服以上所有困难，但仍然表现不佳。\n\n% 283 mid\n\n\\cite{GoodfellowOptimization15}认为大部分训练的运行时间取决于到达解决方案的轨迹长度。 \n如\\figref{fig:chap8_plot_atmu_relu_5}所示，学习轨迹将花费大量的时间探寻一个围绕山形结构的宽弧。\n\n% 283 mid\n\n大多数优化研究的难点集中于训练是否找到了\\gls{global_minimum}、\\gls{local_minimum}或是\\gls{saddle_points}，但在实践中\\gls{NN}不会到达任何一种\\gls{critical_points}。\n\\figref{fig:chap8_grad_norm_increases}表明\\gls{NN}通常不会到达梯度很小的区域。\n甚至，这些\\gls{critical_points}不一定存在。\n例如，\\gls{loss_function} $-\\log p(y\\mid\\Vx;\\Vtheta)$ 可以没有\\gls{global_minimum}，而是当随着训练模型逐渐稳定后，渐近地收敛于某个值。    \n对于具有离散的$y$和~\\ENNAME{softmax}~分布$p(y\\mid\\Vx)$的分类器而言，若模型能够正确分类\\gls{training_set}上的每个样本，则负对数似然可以无限趋近但不会等于零。\n同样地，实值模型$p(y\\mid\\Vx) = \\mathcal{N}(y;f(\\Vtheta),\\beta^{-1})$的负对数似然会趋向于负无穷——如果$f(\\Vtheta)$能够正确预测所有\\gls{training_set}中的目标$y$，学习算法会无限制地增加$\\beta$。\n\\figref{fig:chap8_bad_global}给出了一个失败的例子，即使没有\\gls{local_minima}和\\gls{saddle_points}，该例还是不能从局部优化中找到一个良好的\\gls{cost_function}值。\n\n% 283 end\n\n% 284 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/bad_global_color}}\n\\fi\n\\caption{如果局部表面没有指向全局解，基于局部下坡移动的优化可能就会失败。\n这里我们提供一个例子，说明即使在没有\\gls{saddle_points}或\\gls{local_minima}的情况下，优化过程会如何失败。\n此例中的\\gls{cost_function}仅包含朝向低值而不是\\gls{minima}的渐近线。\n在这种情况下，造成这种困难的主要原因是初始化在``山''的错误一侧，并且无法遍历。\n在高维空间中，学习算法通常可以环绕过这样的高山，但是相关的轨迹可能会很长，并且导致过长的训练时间，如\\figref{fig:chap8_plot_atmu_relu_5}所示。\n}\n\\label{fig:chap8_bad_global}\n\\end{figure}\n\n% 284 head\n\n未来的研究需要进一步探索影响学习轨迹长度和更好地表征训练过程的结果。\n\n% 284 mid\n\n许多现有研究方法在求解具有困难全局结构的问题时，旨在寻求良好的初始点，而不是开发非局部范围更新的算法。\n\n% 284 mid\n\n\\gls{GD}和基本上所有的可以有效训练\\gls{NN}的学习算法，都是基于局部较小更新。\n之前的小节主要集中于为何这些局部范围更新的正确方向难以计算。\n我们也许能计算\\gls{objective_function}的一些性质，如近似的有偏梯度或正确方向估计的方差。\n在这些情况下，局部下降有可能定义了通向有效解的足够短的路径，也有可能没有，但真正糟糕的是我们并不能真的做到遵循局部下降的路径。\n\\gls{objective_function}可能有诸如\\gls{poor_conditioning}或不连续梯度的问题，使得梯度为\\gls{objective_function}提供较好近似的区间非常小。\n在这些情况下，步长为$\\epsilon$的局部下降可能定义了到达解的合理的短路经，但是我们只能计算步长为$\\delta \\ll \\epsilon$的局部下降方向。\n在这些情况下，局部下降或许能定义通向解的路径，但是该路径包含很多次更新，因此遵循该路径会带来很高的计算代价。\n有时，比如说当\\gls{objective_function}有一个宽而平的区域，或是我们试图寻求精确的\\gls{critical_points}（通常来说后一种情况只发生于显式求解\\gls{critical_points}的方法，如\\gls{newton_method}）时，局部信息不能为我们提供任何指导。\n在这些情况下，\\gls{local_descent}完全无法定义通向解的路径。\n在其他情况下，局部移动可能太过贪心，朝着下坡方向移动，却和所有可行解南辕北辙，如\\figref{fig:chap8_bad_global}所示，或者是用舍近求远的方法来求解问题，如\\figref{fig:chap8_plot_atmu_relu_5}所示。\n目前，我们还不了解这些问题中的哪一个与\\gls{NN}优化中的难点最相关，这是研究领域的热点方向。\n\n% 285 head\n\n不管哪个问题最重要，如果存在一个区域，我们遵循\\gls{local_descent}便能合理地直接到达某个解，并且我们能够在该良好区域上初始化学习，那么这些问题都可以避免。\n最后的这个观点建议在传统优化算法上研究怎样选择更佳的初始化点，以此来实现目标更切实可行。\n\n% 285 mid\n\n\\subsection{优化的理论限制}\n\\label{sec:theoretical_limits_of_optimization}\n一些理论结果表明，我们为\\gls{NN}设计的任何优化算法都有性能限制\\citep{Blum92,JuddBook,wolpert96no}。\n通常这些结果不影响\\gls{NN}在实践中的应用。\n\n% 285 mid\n\n一些理论结果仅适用于\\gls{NN}的单元输出离散值的情况。\n然而，大多数\\gls{NN}单元输出光滑的连续值，使得局部搜索求解优化可行。\n一些理论结果表明，存在某类问题是不可解的，但很难判断一个特定问题是否属于该类。\n其他结果表明，寻找给定规模的网络的一个可行解是很困难的，\n但在实际情况中，我们通过设置更多参数，使用更大的网络，能轻松找到可接受的解。\n此外，在\\gls{NN}训练中，我们通常不关注某个函数的精确\\gls{minimum}，而只关注将其值下降到足够小以获得一个良好的\\gls{generalization_error}。\n对优化算法是否能完成此目标进行理论分析是非常困难的。\n因此，研究优化算法更现实的性能上界仍然是学术界的一个重要目标。\n\n% 285 end\n\n% 286 head\n\n\\section{基本算法}\n\\label{sec:basic_algorithms}\n之前我们已经介绍了\\gls{GD}（\\secref{sec:gradient_based_optimization}），即沿着整个\\gls{training_set}的梯度方向下降。\n这可以使用\\gls{SGD}很大程度地加速，沿着随机挑选的\\gls{minibatch}数据的梯度下降方向，就像\\secref{sec:stochastic_gradient_descent_chap5}和\\secref{sec:batch_and_minibatch_algorithms}中讨论的一样。\n\n% 286 head\n\n\\subsection{\\glsentrytext{SGD}}\n\\label{sec:stochastic_gradient_descent_chap8}\n\\glsacr{SGD}及其变种很可能是一般\\gls{ML}中应用最多的优化算法，特别是在\\gls{DL}中。\n如\\secref{sec:batch_and_minibatch_algorithms}中所讨论的，按照\\gls{DGD}抽取$m$个\\gls{minibatch}（独立同分布的）样本，通过计算它们梯度均值，我们可以得到梯度的\\gls{unbiased}估计。\n\n% 286 mid\n\n\\algref{alg:sgd}展示了如何沿着这个梯度的估计下降。\n\n% 286 mid\n\n% 286 end\n\n\\begin{algorithm}[ht]\n\\caption{\\gls{SGD}（\\glssymbol{SGD}）在第$k$个训练迭代的更新}\n\\label{alg:sgd}\n\\begin{algorithmic}\n\\REQUIRE \\gls{learning_rate} $\\epsilon_k$\n\\REQUIRE 初始参数$\\Vtheta$\n\\WHILE{停止\\gls{criterion}未满足}\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，其中$\\Vx^{(i)}$对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度估计： $\\hat{\\Vg} \\leftarrow + \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta - \\epsilon \\hat{\\Vg}$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n% 286 end\n\n% 286 mid\n\n\\glssymbol{SGD}\\,算法中的一个关键参数是\\gls{learning_rate}。\n之前，我们介绍的\\,\\glssymbol{SGD}\\,使用固定的\\gls{learning_rate}。\n在实践中，有必要随着时间的推移逐渐降低\\gls{learning_rate}，因此我们将第$k$步迭代的\\gls{learning_rate}记作$\\epsilon_k$。\n\n% 286 mid\n\n这是因为\\,\\glssymbol{SGD}\\,中梯度估计引入的噪声源（$m$个训练样本的随机采样）并不会在\\gls{minimum}处消失。\n相比之下，当我们使用\\gls{batch}\\gls{GD}到达\\gls{minimum}时，整个\\gls{cost_function}的真实梯度会变得很小，之后为$\\mathbf{0}$，因此\\gls{batch}\\gls{GD}可以使用固定的\\gls{learning_rate}。\n保证\\,\\glssymbol{SGD}\\,收敛的一个充分条件是\n\\begin{equation}\n\\label{eq:8.12}\n    \\sum_{k=1}^\\infty \\epsilon_k = \\infty,\n\\end{equation}\n且\n\\begin{equation}\n\\label{eq:8.13}\n    \\sum_{k=1}^\\infty \\epsilon_k^2 < \\infty.\n\\end{equation}\n\n% 287 head\n\n实践中，一般会线性衰减\\gls{learning_rate}直到第$\\tau$次迭代：\n\\begin{equation}\n\\label{eq:8.14}\n    \\epsilon_k = (1-\\alpha) \\epsilon_0 + \\alpha \\epsilon_\\tau\n\\end{equation}\n其中$\\alpha = \\frac{k}{\\tau}$。\n在$\\tau$步迭代之后，一般使$\\epsilon$保持常数。\n\n% 287 mid\n\n\\gls{learning_rate}可通过试验和误差来选取，通常最好的选择方法是监测\\gls{objective_function}值随时间变化的学习曲线。\n与其说是科学，这更像是一门艺术，我们应该谨慎地参考关于这个问题的大部分指导。\n使用线性策略时，需要选择的参数为$\\epsilon_0$，$\\epsilon_\\tau$，$\\tau$。  \n通常$\\tau$被设为需要反复遍历\\gls{training_set}几百次的迭代次数。\n通常$\\epsilon_\\tau$应设为大约$\\epsilon_0$的$1\\%$。\n主要问题是如何设置$\\epsilon_0$。\n若$\\epsilon_0$太大，学习曲线将会剧烈振荡，\\gls{cost_function}值通常会明显增加。\n温和的振荡是良好的，容易在训练随机\\gls{cost_function}（例如使用\\,\\gls{dropout}\\,的\\gls{cost_function}）时出现。\n如果\\gls{learning_rate}太小，那么学习过程会很缓慢。\n如果初始\\gls{learning_rate}太低，那么学习可能会卡在一个相当高的\\gls{cost}值。\n通常，就总训练时间和最终\\gls{cost}值而言，最优的初始\\gls{learning_rate}会高于在大约迭代$100$次左右后效果最佳的\\gls{learning_rate}。\n因此，通常最好是检测最早的几轮迭代，选择一个比在效果上表现最佳的\\gls{learning_rate}更大的\\gls{learning_rate}，但又不能太大导致严重的震荡。  \n\n% 287 mid\n\n\\glssymbol{SGD}\\,及相关的\\gls{minibatch}亦或更广义的基于梯度优化的在线学习算法，一个重要的性质是每一步更新的计算时间不依赖完整训练集样本数目的多寡。\n即使训练集样本数目非常大时，它们也能收敛。\n对于足够大的数据集，\\glssymbol{SGD}\\,可能会在处理完整个\\gls{training_set}之前就收敛到最终\\gls{test_set}误差的某个固定容差范围内。\n\n% 287 mid\n\n% 287 end\n\n研究优化算法的收敛率，一般会衡量\\firstgls{excess_error} $J(\\Vtheta) - \\min_{\\Vtheta} J(\\Vtheta)$，即当前\\gls{cost_function}超出最低可能\\gls{cost}的量。\n\\glssymbol{SGD}\\,应用于凸问题时，$k$步迭代后的\\gls{excess_error}量级是$O(\\frac{1}{\\sqrt{k}})$，在强凸情况下是$O(\\frac{1}{k})$。\n除非假定额外的条件，否则这些界限不能进一步改进。\n\\gls{batch}\\gls{GD}在理论上比\\gls{SGD}有更好的收敛率。\n然而，Cram\\'er-Rao界限~\\citep{Cramer-1946,Rao-1945}指出，\\gls{generalization_error}的下降速度不会快于$O(\\frac{1}{k})$。\n\\cite{bottou-bousquet-2008-small}因此认为对于\\gls{ML}任务，不值得探寻收敛快于$O(\\frac{1}{k})$的优化算法——更快的收敛可能对应着\\gls{overfitting}。\n此外，渐近分析掩盖了\\gls{SGD}在少量更新步之后的很多优点。\n对于大数据集，\\glssymbol{SGD}\\,只需非常少量样本计算梯度从而实现初始快速更新，其好处超过了其缓慢的渐近收敛带来的坏处。\n本章剩余部分介绍的大多数算法致力于追求实践中有价值的好处，而不在意它的学习率有常数级别的额外误差（在渐进分析上比不上$O(\\frac{1}{k})$的额外误差）。\n我们也可以在学习过程中逐渐增大\\gls{minibatch}的大小，以此权衡\\gls{batch}\\gls{GD}和\\gls{SGD}两者的优点。\n\n% 288 mid\n\n了解\\,\\glssymbol{SGD}\\,更多的信息，请查看~\\cite{Bottou98}。\n\n% 288 mid\n\n\\subsection{\\glsentrytext{momentum}}\n\\label{sec:momentum}\n虽然\\gls{SGD}仍然是非常受欢迎的优化方法，但其学习过程有时会很慢。\n\\gls{momentum}方法~\\citep{polyak1964some}旨在加速学习，特别是处理高\\gls{curvature}、小但一致的梯度，或是带\\gls{noise}的梯度。\n\\gls{momentum}算法积累了之前梯度指数级衰减的移动平均，并且继续沿该方向移动。\n\\gls{momentum}的效果如\\figref{fig:chap8_momentum}所示。\n\n% 288 mid\n\n% 289 head\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/momentum_color}}\n\\fi\n\\caption{\\gls{momentum}的主要目的是解决两个问题：\\gls{hessian}\\,矩阵的\\gls{poor_conditioning}和随机梯度的方差。 \n我们通过此图说明\\gls{momentum}如何克服这两个问题的第一个。\n等高线描绘了一个二次\\gls{loss_function}（具有\\gls{poor_conditioning}的\\,\\gls{hessian}\\,矩阵）。\n横跨轮廓的红色路径表示\\gls{momentum}学习规则所遵循的路径，它使该函数最小化。\n我们在该路径的每个步骤画一个箭头，表示\\gls{GD}将在该点采取的步骤。\n我们可以看到，一个\\gls{poor_conditioning}的二次\\gls{objective_function}看起来像一个长而窄的山谷或具有陡峭边的峡谷。\n\\gls{momentum}正确地纵向穿过峡谷，而普通的梯度步骤则会浪费时间在峡谷的窄轴上来回移动。\n比较\\figref{fig:chap4_poor_conditioning_color}，它也显示了没有\\gls{momentum}的\\gls{GD}的行为。\n}\n\\label{fig:chap8_momentum}\n\\end{figure}\n\n% 289 head\n\n从形式上看，\\gls{momentum}算法引入了变量$\\Vv$充当速度角色——它代表参数在参数空间移动的方向和速率。\n速度被设为负梯度的指数衰减平均。\n名称\\firstgls{momentum}来自物理类比，根据牛顿运动定律，负梯度是移动参数空间中粒子的力。\n\\gls{momentum}在物理学上定义为质量乘以速度。\n在\\gls{momentum}学习算法中，我们假设是单位质量，因此速度向量$\\Vv$也可以看作是粒子的\\gls{momentum}。\n\\gls{hyperparameter}$\\alpha\\in[0,1)$决定了之前梯度的贡献衰减得有多快。\n更新规则如下：\n\\begin{align}\n\\Vv & \\leftarrow \\alpha \\Vv - \\epsilon \\nabla_{\\Vtheta} \\left( \\frac{1}{m} \\sum_{i=1}^m  L(\\Vf(\\Vx^{(i)}; \\Vtheta), \\Vy^{(i)}   )  \\right), \\\\\n\\Vtheta & \\leftarrow \\Vtheta  + \\Vv .\n\\end{align}\n速度$\\Vv$累积了梯度元素$\\nabla_{\\Vtheta}( \\frac{1}{m} \\sum_{i=1}^m L( \\Vf(\\Vx^{(i)}; \\Vtheta), \\Vy^{(i)} )  )$。\n相对于$\\epsilon$，$\\alpha$越大，之前梯度对现在方向的影响也越大。\n带\\gls{momentum}的\\,\\glssymbol{SGD}\\,算法如\\algref{alg:momentum}所示。\n\n% 289 end\n\n% 289 mid\n\n\\begin{algorithm}[ht]\n\\caption{使用\\gls{momentum}的\\gls{SGD}（\\glssymbol{SGD}）}\n\\label{alg:momentum}\n\\begin{algorithmic}\n\\REQUIRE \\gls{learning_rate} $\\epsilon$， \\gls{momentum}参数 $\\alpha$\n\\REQUIRE 初始参数 $\\Vtheta$，初始速度 $\\Vv$\n\\WHILE{没有达到停止\\gls{criterion}}\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度估计：$\\Vg \\leftarrow \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$\n    \\STATE  计算速度更新：$\\Vv \\leftarrow \\alpha \\Vv - \n    \\epsilon \\Vg$\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Vv$ \n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n% 289 mid\n\n% 289 end\n\n之前，步长只是梯度范数乘以\\gls{learning_rate}。\n现在，步长取决于梯度\\emph{序列}的大小和排列。\n当许多连续的梯度指向相同的方向时，步长最大。\n如果\\gls{momentum}算法总是观测到梯度$\\Vg$，那么它会在方向$-g$上不停加速，直到达到最终速度，其中步长大小为\n\\begin{equation}\n    \\frac{\\epsilon \\norm{\\Vg}}{1-\\alpha} .\n\\end{equation}\n因此将\\gls{momentum}的\\gls{hyperparameter}视为$\\frac{1}{1-\\alpha}$有助于理解。\n例如，$\\alpha=0.9$对应着最大速度$10$倍于\\gls{GD}算法。\n\n% 290 head\n\n在实践中，$\\alpha$的一般取值为$0.5$，$0.9$和$0.99$。\n和\\gls{learning_rate}一样，$\\alpha$也会随着时间不断调整。 \n一般初始值是一个较小的值，随后会慢慢变大。\n随着时间推移调整$\\alpha$没有收缩$\\epsilon$重要。\n\n% 290 mid\n\n我们可以将\\gls{momentum}算法视为模拟连续时间下牛顿动力学下的粒子。\n这种物理类比有助于直觉上理解\\gls{momentum}和\\gls{GD}算法是如何表现的。\n\n% 290 mid\n\n粒子在任意时间点的位置由$\\Vtheta(t)$给定。\n粒子会受到净力$\\Vf(t)$。\n该力会导致粒子加速：\n\\begin{equation}\n    \\Vf(t) = \\frac{\\partial^2}{\\partial t^2} \\Vtheta(t) .\n\\end{equation}\n与其将其视为位置的二阶\\gls{differential_equation}，我们不如引入表示粒子在时间$t$处速度的变量$\\Vv(t)$，将牛顿动力学重写为一阶\\gls{differential_equation}：\n\\begin{align}\n    \\Vv(t) &= \\frac{\\partial}{\\partial t} \\Vtheta(t) , \\\\\n    \\Vf(t) &= \\frac{\\partial}{\\partial t} \\Vv(t) .\n\\end{align}\n由此，\\gls{momentum}算法包括通过数值模拟求解\\gls{differential_equation}。\n求解\\gls{differential_equation}的一个简单数值方法是欧拉方法，通过在每个梯度方向上小且有限的步来简单模拟该等式定义的动力学。\n% 290 mid\n\n\n这解释了\\gls{momentum}更新的基本形式，但具体是哪些力呢？\n一个力正比于\\gls{cost_function}的负梯度$-\\nabla_{\\Vtheta} J(\\Vtheta)$。\n该力推动粒子沿着\\gls{cost_function}表面下坡的方向移动。\n\\gls{GD}算法基于每个梯度简单地更新一步，而使用\\gls{momentum}算法的牛顿方案则使用该力改变粒子的速度。\n我们可以将粒子视作在冰面上滑行的冰球。\n每当它沿着表面最陡的部分下降时，它会沿该方向加速滑行，直到开始向上滑动为止。\n% 291 head\n\n\n另一个力也是必要的。\n如果\\gls{cost_function}的梯度是唯一的力，那么粒子可能永远不会停下来。\n想象一下，假设理想情况下冰面没有摩擦，一个冰球从山谷的一端下滑，上升到另一端，永远来回振荡。\n要解决这个问题，我们添加另一个正比于$-\\Vv(t)$的力。\n在物理术语中，此力对应于粘性阻力，就像粒子必须通过一个抵抗介质，如糖浆。\n这会导致粒子随着时间推移逐渐失去能量，最终收敛到\\gls{local_minimum}。\n% 291 mid\n\n\n为什么要特别使用$-\\Vv(t)$和粘性阻力呢？\n部分原因是因为$-\\Vv(t)$在数学上的便利——速度的整数幂很容易处理。\n然而，其他物理系统具有基于速度的其他整数幂的其他类型的阻力。\n例如，颗粒通过空气时会受到正比于速度平方的湍流阻力，而颗粒沿着地面移动时会受到恒定大小的摩擦力。\n这些选择都不合适。\n湍流阻力，正比于速度的平方，在速度很小时会很弱。\n不够强到使粒子停下来。\n非零值初始速度的粒子仅受到湍流阻力，会从初始位置永远地移动下去，和初始位置的距离大概正比于$O(\\log t)$。\n因此我们必须使用速度较低幂次的力。\n如果幂次为零，相当于干摩擦，那么力太强了。\n当\\gls{cost_function}的梯度表示的力很小但非零时，由于摩擦导致的恒力会使得粒子在达到\\gls{local_minimum}之前就停下来。\n粘性阻力避免了这两个问题——它足够弱，可以使梯度引起的运动直到达到最小，但又足够强，使得坡度不够时可以阻止运动。\n% 291 end\n\n\n\\subsection{\\glsentrytext{nmomentum}}\n\\label{sec:nesterov_momentum}\n受Nesterov加速梯度算法\\citep{Nesterov83b,Nesterov03}启发，\\cite{sutskeverimportance}提出了\\gls{momentum}算法的一个变种。\n这种情况的更新规则如下：\n\\begin{align}\n    \\Vv &\\leftarrow \\alpha\\Vv - \\epsilon \\nabla_{\\Vtheta} \\left[\n    \\frac{1}{m} \\sum_{i=1}^m L\\big( \\Vf(\\Vx^{(i)}; \\Vtheta + \\alpha \\Vv), \\Vy^{(i)} \\big)\n \\right], \\\\\n    \\Vtheta &\\leftarrow \\Vtheta + \\Vv ,\n\\end{align}\n其中参数$\\alpha$和$\\epsilon$发挥了和标准\\gls{momentum}方法中类似的作用。 \n\\gls{nmomentum}和标准\\gls{momentum}之间的区别体现在梯度计算上。\n\\gls{nmomentum}中，梯度计算在施加当前速度之后。\n因此，\\gls{nmomentum}可以解释为往标准\\gls{momentum}方法中添加了一个\\emph{校正因子}。\n完整的\\,\\gls{nmomentum}算法如\\algref{alg:nesterov}所示。\n% 292 mid\n\n\n% 292 head\n\\begin{algorithm}[ht]\n\\caption{使用\\,\\gls{nmomentum}的\\gls{SGD}（\\glssymbol{SGD}）}\n\\label{alg:nesterov}\n\\begin{algorithmic}\n\\REQUIRE  \\gls{learning_rate} $\\epsilon$， \\gls{momentum}参数 $\\alpha$\n\\REQUIRE 初始参数 $\\Vtheta$，初始速度 $\\Vv$\n\\WHILE{没有达到停止\\gls{criterion}}\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，对应目标为$\\Vy^{(i)}$。\n    \\STATE 应用临时更新： $\\tilde{\\Vtheta} \\leftarrow \\Vtheta  + \\alpha \\Vv$\n         \\STATE 计算梯度（在临时点）：$\\Vg \\leftarrow \n         \\frac{1}{m} \\nabla_{\\tilde{\\Vtheta}} \\sum_i L(f(\\Vx^{(i)};\\tilde{\\Vtheta}),\\Vy^{(i)})$\n    \\STATE 计算速度更新：$\\Vv \\leftarrow \\alpha \\Vv - \n    \\epsilon \\Vg$\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Vv$ \n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n% 292 head\n\n% 292 mid\n\n在凸\\gls{batch}梯度的情况下，\\gls{nmomentum}将\\gls{excess_error}收敛率从$O(1/k)$（$k$步后）改进到$O(1/k^2)$，如~\\cite{Nesterov83b}所示。\n可惜，在随机梯度的情况下，\\gls{nmomentum}没有改进收敛率。\n\n% 292 mid\n\n\\section{参数初始化策略}\n\\label{sec:parameter_initialization_strategies}\n有些优化算法本质上是非迭代的，只是求解一个解点。\n有些其它优化算法本质上是迭代的，但是应用于这一类的优化问题时，能在可接受的时间内收敛到可接受的解，并且与初始值无关。\n\\gls{DL}训练算法通常没有这两种奢侈的性质。\n\\gls{DL}模型的训练算法通常是迭代的，因此要求使用者指定一些开始迭代的初始点。\n此外，训练\\gls{deep_model}是一个足够困难的问题，以致于大多数算法都很大程度地受到初始化选择的影响。\n初始点能够决定算法是否收敛，有些初始点十分不稳定，使得该算法会遭遇数值困难，并完全失败。\n当学习收敛时，初始点可以决定学习收敛得多快，以及是否收敛到一个\\gls{cost}高或低的点。\n此外，差不多\\gls{cost}的点可以具有区别极大的\\gls{generalization_error}，初始点也可以影响\\gls{generalization}。\n\n% 293 head\n\n现代的初始化策略是简单的、启发式的。\n设定改进的初始化策略是一项困难的任务，因为\\gls{NN}优化至今还未被很好地理解。\n大多数初始化策略基于在\\gls{NN}初始化时实现一些很好的性质。\n然而，我们并没有很好地理解这些性质中的哪些会在学习开始进行后的哪些情况下得以保持。\n进一步的难点是，有些初始点从优化的观点看或许是有利的，但是从\\gls{generalization}的观点看是不利的。\n我们对于初始点如何影响\\gls{generalization}的理解更是相当原始的，几乎没有提供如何选择初始点的任何指导。\n\n% 293 mid\n\n也许完全确知的唯一特性是初始参数需要在不同单元间``破坏对称性''。\n如果具有相同\\gls{activation_function}的两个\\gls{hidden_unit}连接到相同的输入，那么这些单元必须具有不同的初始参数。\n如果它们具有相同的初始参数，然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。\n即使模型或训练算法能够使用随机性为不同的单元计算不同的更新（例如使用\\,\\gls{dropout}的训练），通常来说，最好还是初始化每个单元使其和其他单元计算不同的函数。\n这或许有助于确保没有输入模式丢失在\\gls{forward_propagation}的零空间中，以及没有梯度模式丢失在\\gls{backward_propagation}的零空间中。\n每个单元计算不同函数的目标促使了参数的随机初始化。\n我们可以明确地搜索一大组彼此互不相同的基函数，但这经常会导致明显的计算代价。  \n例如，如果我们有和输出一样多的输入，我们可以使用Gram-Schmidt正交化于初始的权重矩阵，保证每个单元计算彼此非常不同的函数。\n与之相比，在高维空间上使用高熵分布来随机初始化，计算代价更小并且不太可能分配单元计算彼此相同的函数。\n\n% 293 mid\n\n通常情况下，我们可以为每个单元的\\gls{bias_aff}设置启发式挑选的常数，仅随机初始化权重。\n额外的参数（例如用于编码预测条件方差的参数）通常和偏置一样设置为启发式选择的常数。\n\n% 293 end\n\n我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。\n高斯或均匀分布的选择似乎不会有很大的差别，但也没有被详尽地研究。\n然而，初始分布的大小确实对优化过程的结果和网络\\gls{generalize}能力都有很大的影响。\n\n% 294 head\n\n更大的初始权重具有更强的破坏对称性的作用，有助于避免冗余的单元。\n它们也有助于避免在每层线性成分的前向或\\gls{backward_propagation}中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。\n如果初始权重太大，那么会在\\gls{forward_propagation}或\\gls{backward_propagation}中产生爆炸的值。\n在循环网络中，很大的权重也可能导致\\firstgls{chaos}（对于输入中很小的扰动非常敏感，导致确定性\\gls{forward_propagation}过程表现随机）。\n在一定程度上，梯度爆炸问题可以通过\\gls{gradient_clipping}来缓解（执行\\gls{GD}步骤之前设置梯度的阈值）。\n较大的权重也会产生使得\\gls{activation_function}饱和的值，导致饱和单元的梯度完全丢失。\n这些竞争因素决定了权重的理想初始大小。\n% 294 mid\n\n\n关于如何初始化网络，\\gls{regularization}和优化有着非常不同的观点。\n优化观点建议权重应该足够大以成功传播信息，但是\\gls{regularization}希望其小一点。\n诸如\\gls{SGD}这类对权重较小的增量更新，趋于停止在更靠近初始参数的区域（不管是由于卡在低梯度的区域，还是由于触发了基于\\gls{overfitting} 的\\gls{early_stopping}准则）的优化算法倾向于最终参数应接近于初始参数。\n回顾\\secref{sec:early_stopping}，在某些模型上，\\gls{early_stopping}的\\gls{GD}等价于\\gls{weight_decay}。\n在一般情况下，\\gls{early_stopping}的\\gls{GD}和\\gls{weight_decay}不同，但是提供了一个宽松的类比去考虑初始化的影响。\n我们可以将初始化参数$\\Vtheta$为$\\Vtheta_0$类比于强置均值为$\\Vtheta_0$的高斯先验$p(\\Vtheta)$。\n从这个角度来看，选择$\\Vtheta_0$接近$0$是有道理的。\n这个先验表明，单元间彼此互不交互比交互更有可能。\n只有在目标函数的似然项表达出对交互很强的偏好时，单元才会交互。\n另一方面，如果我们初始化$\\Vtheta_0$为很大的值，那么我们的先验指定了哪些单元应互相交互，以及它们应如何交互。\n% 294 end\n\n\n有些启发式方法可用于选择权重的初始大小。\n一种初始化$m$个输入和$n$输出的全连接层的权重的启发式方法是从分布$U(-\\frac{1}{\\sqrt{m}}, \\frac{1}{\\sqrt{m}})$中采样权重，\n而~\\citet{GlorotAISTATS2010-small}建议使用\\firstgls{normalized_initialization}\n\\begin{equation}\n    W_{i,j} \\sim U \\left(-\\sqrt{\\frac{6}{m+n}}, \\sqrt{\\frac{6}{m+n}}\\right) .\n\\end{equation}\n后一种启发式方法初始化所有的层，折衷于使其具有相同激活方差和使其具有相同梯度方差之间。\n这假设网络是不含非线性的链式矩阵乘法，据此推导得出。\n现实的\\gls{NN}显然会违反这个假设，但很多设计于线性模型的策略在其非线性对应中的效果也不错。\n% 295 head\n\n\n\\cite{Saxe-et-al-ICLR13}推荐初始化为随机正交矩阵，仔细挑选负责每一层非线性缩放或者说\\,\\textbf{增益}(gain)因子$g$。\n他们得到了用于不同类型的非线性\\gls{activation_function}的特定缩放因子。\n这种初始化方案也是启发于不含非线性的矩阵相乘序列的\\gls{deep_network}。\n在该模型下，这个初始化方案保证了达到收敛所需的训练迭代总数独立于深度。\n\n\n增加缩放因子$g$将网络推向网络\\gls{forward_propagation}时激活范数增加，\\gls{backward_propagation}时梯度范数增加的区域。\n\\cite{Sussillo14}表明，正确设置缩放因子足以训练深达$1000$层的网络，而不需要使用正交初始化。\n这种方法的一个重要观点是，在\\gls{feedforward_network}中，激活和梯度会在每一步\\gls{forward_propagation}或\\gls{backward_propagation}中增加或缩小，遵循随机游走行为。\n这是因为\\gls{feedforward_network}在每一层使用了不同的权重矩阵。\n如果该随机游走调整到保持范数，那么\\gls{feedforward_network}能够很大程度地避免相同权重矩阵用于每层的\\gls{vanish_explode_gradient}，如\\secref{sec:long_term_dependencies}所述。\n% 295 end\n\n\n可惜，这些初始权重的最佳准则往往不会带来最佳效果。\n这可能有三种不同的原因。\n首先，我们可能使用了错误的标准——它实际上并不利于保持整个网络信号的范数。\n其次，初始化时强加的性质可能在学习开始进行后不能保持。\n最后，该标准可能成功提高了优化速度，但意外地增大了\\gls{generalization_error}。\n在实践中，我们通常需要将权重范围视为\\gls{hyperparameter}，其最优值大致接近，但并不完全等于理论预测。\n% 296 head\n\n\n数值范围准则的一个缺点是，设置所有的初始权重具有相同的标准差，例如$\\frac{1}{\\sqrt{m}}$，会使得层很大时每个单一权重会变得极其小。\n\\cite{martens2010hessian-small}提出了一种被称为\\firstgls{sparse_initialization}的替代方案，每个单元初始化为恰好有$k$个非零权重。\n这个想法保持该单元输入的总数量独立于输入数目$m$，而不使单一权重元素的大小随$m$缩小。\n稀疏初始化有助于实现单元之间在初始化时更具多样性。\n但是，获得较大取值的权重也同时被加了很强的先验。\n因为\\gls{GD}需要很长时间缩小``不正确''的大值，这个初始化方案可能会导致某些单元出问题，例如\\,\\gls{maxout}\\,单元有几个过滤器，互相之间必须仔细调整。\n% 296 mid\n\n\n计算资源允许的话，将每层权重的初始数值范围设为\\gls{hyperparameter}通常是个好主意，使用\\secref{sec:automatic_hyperparameter_optimization_algorithms}介绍的\\gls{hyperparameter}搜索算法，如随机搜索，挑选这些数值范围。\n是否选择使用密集或稀疏初始化也可以设为一个\\gls{hyperparameter}。\n作为替代，我们可以手动搜索最优初始范围。\n一个好的挑选初始数值范围的经验法则是观测单个\\gls{minibatch}数据上的激活或梯度的幅度或标准差。\n如果权重太小，那么当激活值在\\gls{minibatch}上\\gls{forward_propagation}于网络时，激活值的幅度会缩小。\n通过重复识别具有小得不可接受的激活值的第一层，并提高其权重，最终有可能得到一个初始激活全部合理的网络。\n如果学习在这点上仍然很慢，观测梯度的幅度或标准差可能也会有所帮助。\n这个过程原则上是自动的，且通常计算量低于基于\\gls{validation_set}误差的\\gls{hyperparameter}优化，因为它是基于初始模型在单批数据上的行为反馈，而不是在\\gls{validation_set}上训练模型的反馈。\n由于这个协议很长时间都被启发式使用，最近~\\cite{mishkin2015all}更正式地研究了该协议。\n% 296 mid\n\n\n目前为止，我们关注在权重的初始化上。\n幸运的是，其他参数的初始化通常更容易。\n% 296 end\n\n\n设置\\gls{bias_aff}的方法必须和设置权重的方法协调。\n设置\\gls{bias_aff}为零通常在大多数权重初始化方案中是可行的。\n存在一些我们可能设置\\gls{bias_aff}为非零值的情况：\n% 297 head\n\n\\begin{itemize}\n\\item 如果\\gls{bias_aff}是作为输出单元，那么初始化\\gls{bias_aff}以获取正确的输出边缘统计通常是有利的。\n要做到这一点，我们假设初始权重足够小，该单元的输出仅由\\gls{bias_aff}决定。\n这说明设置\\gls{bias_aff}为应用于\\gls{training_set}上输出边缘统计的\\gls{activation_function}的逆。\n例如，如果输出是类上的分布，且该分布是高度偏态分布，第$i$类的边缘概率由某个向量$\\Vc$的第$i$个元素给定，那么我们可以通过求解方程$\\text{softmax}(\\Vb)=\\Vc$来设置偏置向量$\\Vb$。\n这不仅适用于分类器，也适用于我们将在第三部分遇到的模型，例如\\gls{AE}和\\gls{BM}。\n这些模型拥有输出类似于输入数据$\\Vx$的网络层，初始化这些层的偏置以匹配$\\Vx$上的边缘分布将有助于模型学习。\n% 297 mid\n\n\n\\item 有时，我们可能想要选择\\gls{bias_aff}以避免初始化引起太大饱和。\n例如，我们可能会将ReLU的\\gls{hidden_unit}设为$0.1$而非$0$，以避免ReLU在初始化时饱和。\n尽管这种方法违背不希望偏置具有很强输入的权重初始化准则。\n例如，不建议使用随机游走初始化\\citep{Sussillo14}。\n% 297 mid\n\n\n\\item 有时，一个单元会控制其他单元能否参与到等式中。\n在这种情况下，我们有一个单元输出$u$，另一个单元$h\\in[0,1]$，那么我们可以将$h$视作门，以决定$uh\\approx 1$还是$uh\\approx 0$。\n在这种情形下，我们希望设置\\gls{bias_aff} $h$，使得在初始化的大多数情况下$h\\approx 1$。\n否则，$u$没有机会学习。\n例如，\\cite{Jozefowicz-et-al-ICML2015}提议设置~\\glssymbol{LSTM}~模型遗忘门的\\gls{bias_aff}为$1$，如\\secref{sec:the_long_short_term_memory_and_other_gated_rnns}所述。\n\\end{itemize}\n% 297 end\n\n\n另一种常见类型的参数是方差或精确度参数。\n例如，我们用以下模型进行带条件方差估计的\\gls{linear_regression}\n\\begin{equation}\n    p(y\\mid\\Vx) = \\mathcal{N} (y \\mid \\Vw^\\top \\Vx + b, 1/\\beta) ,\n\\end{equation}\n其中$\\beta$是精确度参数。\n通常我们能安全地初始化方差或精确度参数为$1$。\n另一种方法假设初始权重足够接近零，设置偏置可以忽略权重的影响，然后设定偏置以产生输出的正确边缘均值，并将方差参数设置为\\gls{training_set}输出的边缘方差。\n% 298 head\n\n\n除了这些初始化模型参数的简单常数或随机方法，还有可能使用\\gls{ML}初始化模型参数。\n在本书第三部分讨论的一个常用策略是使用相同的输入数据集，用无监督模型训练出来的参数来初始化监督模型。\n我们也可以在相关问题上使用监督训练。\n即使是在一个不相关的任务上运行监督训练，有时也能得到一个比随机初始化具有更快收敛率的初始值。\n这些初始化策略有些能够得到更快的收敛率和更好的\\gls{generalization_error}，原因在于它们编码了模型初始参数的分布信息。\n其他一些策略表现出效果不错的原因则主要在于它们设置参数为正确的数值范围，或是设置不同单元计算互相不同的函数。\n% 298 mid\n\n\n\\section{自适应\\glsentrytext{learning_rate}算法}\n\\label{sec:algorithms_with_adaptive_learning_rates}\n\\gls{NN}研究员早就意识到\\gls{learning_rate}肯定是难以设置的\\gls{hyperparameter}之一，因为它对模型的性能有显著的影响。\n正如我们在\\secref{sec:gradient_based_optimization}和\\secref{sec:challenges_in_neural_network_optimization}中所探讨的，损失通常高度敏感于参数空间中的某些方向，而不敏感于其他。\n\\gls{momentum}算法可以在一定程度缓解这些问题，但这样做的代价是引入了另一个\\gls{hyperparameter}。\n在这种情况下，自然会问有没有其他方法。\n如果我们相信方向敏感度在某种程度是轴对齐的，那么每个参数设置不同的\\gls{learning_rate}，在整个学习过程中自动适应这些\\gls{learning_rate}是有道理的。\n\n\n\n\\textbf{Delta-bar-delta}算法\\citep{jacobs1988}是一个早期的在训练时适应模型参数各自\\gls{learning_rate}的启发式方法。\n该方法基于一个很简单的想法，如果损失对于某个给定模型参数的偏导保持相同的符号，那么\\gls{learning_rate}应该增加。如果对于该参数的偏导变化了符号，那么\\gls{learning_rate}应减小。\n当然，这种方法只能应用于全\\gls{batch}优化中。\n% 298 mid\n\n\n最近，提出了一些增量（或者基于\\gls{minibatch}）的算法来自适应模型参数的\\gls{learning_rate}。\n这节将简要回顾其中一些算法。\n% 298 end\n\n\n% 299 head\n\\subsection{\\glsentrytext{adagrad}}\n\\label{sec:adagrad}\n\\textbf{AdaGrad}算法，如\\algref{alg:ada_grad}所示，独立地适应所有模型参数的\\gls{learning_rate}，按照每个参数的梯度历史值的平方和的平方根成反比缩放每个参数\\citep{Duchi+al-2011}。\n具有损失最大偏导的参数相应地有一个快速下降的\\gls{learning_rate}，而具有小偏导的参数在\\gls{learning_rate}上有相对较小的下降。\n净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。\n% 299 head\n\n\n在\\gls{convex_optimization}背景中，\\gls{adagrad} 算法具有一些令人满意的理论性质。\n然而，经验上已经发现，对于训练\\gls{DNN}模型而言，\\emph{从训练开始时}积累梯度平方会导致有效\\gls{learning_rate}过早和过量的减小。\n\\gls{adagrad}\\,在某些\\gls{DL}模型上效果不错，但不是全部。\n\n\n\\begin{algorithm}[ht]\n\\caption{AdaGrad算法}\n\\label{alg:ada_grad}\n\\begin{algorithmic}\n\\REQUIRE 全局\\gls{learning_rate} $\\epsilon$\n\\REQUIRE 初始参数$\\Vtheta$\n\\REQUIRE 小常数$\\delta$，为了数值稳定大约设为$10^{-7}$\n\\STATE 初始化梯度累积变量$\\Vr = 0$\n\\WHILE{没有达到停止\\gls{criterion}}\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度： $\\Vg \\leftarrow  \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 累积平方梯度：$\\Vr \\leftarrow \\Vr + \\Vg \\odot \\Vg$\n    \\STATE 计算更新：$\\Delta \\Vtheta \\leftarrow -\n    \\frac{\\epsilon}{\\delta+ \\sqrt{\\Vr}} \\odot\\Vg$  \\ \\  （逐元素地应用除和求平方根）\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\\subsection{RMSProp}\n\\label{sec:rmsprop}\n\\textbf{RMSProp}算法\\citep{Hinton-ipam2012}修改AdaGrad以在\\gls{nonconvex}设定下效果更好，改变梯度积累为指数加权的移动平均。\n\\gls{adagrad}\\,旨在应用于凸问题时快速收敛。\n当应用于\\gls{nonconvex}函数训练\\gls{NN}时，学习轨迹可能穿过了很多不同的结构，最终到达一个局部是凸的碗状的区域。\nAdaGrad根据平方梯度的整个历史收缩\\gls{learning_rate}，可能使得\\gls{learning_rate}在达到这样的凸结构前就变得太小了。\nRMSProp使用指数衰减平均以丢弃遥远过去的历史，使其能够在找到碗状凸结构后快速收敛，\n它就像一个初始化于该碗状结构的AdaGrad算法实例。\n\n% -- 299 --\n\nRMSProp的标准形式如\\algref{alg:rms_prop}所示，结合Nesterov动量的形式如\\algref{alg:rms_nesterov}所示。\n相比于AdaGrad，使用移动平均引入了一个新的\\gls{hyperparameter}$\\rho$，用来控制移动平均的长度范围。\n\n% -- 300 --\n\n经验上，RMSProp已被证明是一种有效且实用的\\gls{DNN}优化算法。\n目前它是\\gls{DL}从业者经常采用的优化方法之一。\n\n\n\\begin{algorithm}[ht]\n\\caption{RMSProp算法}\n\\label{alg:rms_prop}\n\\begin{algorithmic}\n\\REQUIRE 全局\\gls{learning_rate} $\\epsilon$，衰减速率$\\rho$\n\\REQUIRE  初始参数$\\Vtheta$\n\\REQUIRE 小常数$\\delta$，通常设为$10^{-6}$（用于被小数除时的数值稳定）\n\\STATE 初始化累积变量 $\\Vr = 0$\n\\WHILE{没有达到停止\\gls{criterion}}\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度：$\\Vg \\leftarrow  \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 累积平方梯度：$\\Vr \\leftarrow \\rho\n    \\Vr + (1-\\rho) \\Vg \\odot \\Vg$\n    \\STATE 计算参数更新：$\\Delta \\Vtheta =\n    -\\frac{\\epsilon}{\\sqrt{\\delta + \\Vr}} \\odot \\Vg$  \\ \\  ($\\frac{1}{\\sqrt{\\delta + \\Vr}}$ 逐元素应用)\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\\begin{algorithm}[ht]\n\\caption{使用Nesterov\\,\\gls{momentum}的RMSProp算法}\n\\label{alg:rms_nesterov}\n\\begin{algorithmic}\n\\REQUIRE 全局\\gls{learning_rate} $\\epsilon$，衰减速率$\\rho$， \\gls{momentum}系数$\\alpha$\n\\REQUIRE 初始参数$\\Vtheta$，初始参数$\\Vv$\n\\STATE 初始化累积变量 $\\Vr = 0$\n\\WHILE{没有达到停止\\gls{criterion}} % NOTE: do not capitalize the condition\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算临时更新：$\\tilde{\\Vtheta} \\leftarrow \\Vtheta + \\alpha \\Vv$\n    \\STATE 计算梯度：$\\Vg \\leftarrow  \n         \\frac{1}{m} \\nabla_{\\tilde{\\Vtheta}} \\sum_i L(f(\\Vx^{(i)};\\tilde{\\Vtheta}),\\Vy^{(i)})$ \n    \\STATE  累积梯度：$\\Vr \\leftarrow \\rho\n    \\Vr + (1-\\rho) \\Vg \\odot \\Vg$\n    \\STATE  计算速度更新：$\\Vv \\leftarrow \\alpha \\Vv\n    -\\frac{\\epsilon}{\\sqrt{\\Vr}} \\odot \\Vg$ \\ \\  ($\\frac{1}{\\sqrt{\\Vr}}$ 逐元素应用)\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Vv$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\\subsection{Adam}\n\\label{sec:adam}\n\\textbf{Adam}~\\citep{kingma2014adam}是另一种\\gls{learning_rate}自适应的优化算法，如\\algref{alg:adam}所示。\n``Adam''这个名字派生自短语``adaptive moments''。\n在前述算法背景下，它也许最好被看作结合了RMSProp和\\gls{momentum}的具有一些重要区别的变种。\n首先，在Adam中，\\gls{momentum}直接并入了梯度一阶矩（指数加权）的估计。\n将\\gls{momentum}加入RMSProp最直观的方法是将\\gls{momentum}应用于缩放后的梯度。\n结合缩放的\\gls{momentum}使用没有明确的理论动机。\n其次，Adam包括偏置修正，修正从原点初始化的一阶矩（\\gls{momentum}项）和（非中心的）二阶矩的估计（\\algref{alg:adam}）。\nRMSProp也采用了（非中心的）二阶矩估计，然而缺失了修正因子。\n因此，不像Adam，RMSProp二阶矩估计可能在训练初期有很高的偏置。\nAdam通常被认为对\\gls{hyperparameter}的选择相当鲁棒，尽管\\gls{learning_rate}有时需要改为与建议的默认值不同的值。\n\n\\begin{algorithm}[ht]\n\\caption{Adam算法}\n\\label{alg:adam}\n\\begin{algorithmic}\n\\REQUIRE 步长 $\\epsilon$ （建议默认为： $0.001$）\n\\REQUIRE 矩估计的指数衰减速率， $\\rho_1$ 和 $\\rho_2$ 在区间 $[0, 1)$内。\n（建议默认为：分别为$0.9$ 和 $0.999$）\n\\REQUIRE 用于数值稳定的小常数 $\\delta$  （建议默认为： $10^{-8}$）\n\\REQUIRE 初始参数 $\\Vtheta$\n\\STATE 初始化一阶和二阶矩变量 $\\Vs = 0 $, $\\Vr = 0$\n\\STATE 初始化\\gls{time_step} $t=0$ \n\\WHILE{没有达到停止\\gls{criterion}}\n    \\STATE 从\\gls{training_set}中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的\\gls{minibatch}，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度：$\\Vg \\leftarrow \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE $t \\leftarrow t + 1$\n    \\STATE 更新有偏一阶矩估计： $\\Vs \\leftarrow \\rho_1 \\Vs + (1-\\rho_1) \\Vg$\n    \\STATE 更新有偏二阶矩估计：$\\Vr \\leftarrow \\rho_2 \\Vr + (1-\\rho_2) \\Vg \\odot \\Vg$\n    \\STATE 修正一阶矩的\\gls{bias_sta}：$\\hat{\\Vs} \\leftarrow \\frac{\\Vs}{1-\\rho_1^t}$\n    \\STATE 修正二阶矩的\\gls{bias_sta}：$\\hat{\\Vr} \\leftarrow \\frac{\\Vr}{1-\\rho_2^t}$\n    \\STATE 计算更新：$\\Delta \\Vtheta = - \\epsilon \\frac{\\hat{\\Vs}}{\\sqrt{\\hat{\\Vr}} + \\delta}$ \\ \\  （逐元素应用操作）\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n% -- 301 --\n\n\\subsection{选择正确的优化算法}\n\\label{sec:choosing_the_right_optimization_algorithms}\n在本节中，我们讨论了一系列算法，通过自适应每个模型参数的\\gls{learning_rate}以解决优化\\gls{deep_model}中的难题。\n此时，一个自然的问题是：该选择哪种算法呢？\n\n遗憾的是，目前在这一点上没有达成共识。\n\\cite{Schaul2014_unittests}展示了许多优化算法在大量学习任务上极具价值的比较。\n虽然结果表明，具有自适应\\gls{learning_rate}（以RMSProp和AdaDelta为代表）的算法族表现得相当鲁棒，不分伯仲，但没有哪个算法能脱颖而出。\n\n目前，最流行并且使用很高的优化算法包括SGD、具\\gls{momentum}的SGD、RMSProp、具\\gls{momentum}的RMSProp、AdaDelta和Adam。\n此时，选择哪一个算法似乎主要取决于使用者对算法的熟悉程度（以便调节\\gls{hyperparameter}）。\n\n\\section{二阶近似方法}\n\\label{sec:approximate_second_order_methods}\n在本节中，我们会讨论训练\\gls{DNN}的二阶方法。\n参考\\cite{LeCun+98backprop}了解该问题的早期处理方法。\n为表述简单起见，我们只考察\\gls{objective_function}为经验风险：\n\\begin{equation}\n    J(\\Vtheta) = \\SetE_{\\RVx, \\RSy \\sim \\hat{p}_{\\text{data}}(\\Vx,y) } [ L(f(\\Vx; \\Vtheta), y) ] =\n\\frac{1}{m} \\sum_{i=1}^m L(f(\\Vx^{(i)}; \\Vtheta), y^{(i)}).\n\\end{equation}\n然而，我们在这里讨论的方法很容易扩展到更一般的\\gls{objective_function}，例如，\\chapref{chap:regularization_for_deep_learning}讨论的包括参数正则项的函数。\n\n% -- 302 --\n\n\\subsection{\\glsentrytext{newton_method}}\n\\label{sec:newton_method}\n在\\secref{sec:gradient_based_optimization}，我们介绍了二阶梯度方法。\n与一阶方法相比，二阶方法使用二阶导数改进了优化。\n最广泛使用的二阶方法是\\gls{newton_method}。\n我们现在更详细地描述\\gls{newton_method}，重点在其应用于\\gls{NN}的训练。\n\n\\gls{newton_method}是基于二阶泰勒级数展开在某点$\\Vtheta_0$附近来近似$J(\\Vtheta)$的优化方法，其忽略了高阶导数：\n\\begin{equation}\n    J(\\Vtheta) \\approx J(\\Vtheta_0) + (\\Vtheta - \\Vtheta_0)^\\top \\nabla_{\\Vtheta}   \n    J(\\Vtheta_0) + \\frac{1}{2} (\\Vtheta - \\Vtheta_0)^\\top \\MH(\\Vtheta - \\Vtheta_0),\n\\end{equation}\n最速下降法中$\\MH$是$J$相对于$\\Vtheta$的\\,\\gls{hessian}\\,矩阵在$\\Vtheta_0$处的估计。\n如果我们再求解这个函数的\\gls{critical_points}，我们将得到牛顿参数更新规则：\n\\begin{equation}\n    \\Vtheta^* = \\Vtheta_0 - \\MH^{-1}\\nabla_{\\Vtheta} J(\\Vtheta_0).\n\\label{eq:8.27}\n\\end{equation}\n因此，对于局部的二次函数（具有正定的$\\MH$\\,），用$\\MH^{-1}$重新调整梯度，\\gls{newton_method}会直接跳到极小值。\n如果\\gls{objective_function}是凸的但非二次的（有高阶项），该更新将是迭代的，得到和\\gls{newton_method}相关的算法，如\\algref{alg:newton}所示。\n\n对于非二次的表面，只要\\,\\gls{hessian}\\,矩阵保持正定，\\gls{newton_method}能够迭代地应用。\n这意味着一个两步迭代过程。\n首先，更新或计算\\,\\gls{hessian}\\,逆（通过更新二阶近似）。\n其次，根据\\eqnref{eq:8.27}更新参数。\n\n% -- 303 --\n\n在\\secref{sec:plateaus_saddle_points_and_other_flat_regions}，我们讨论了\\gls{newton_method}只适用于\\,\\gls{hessian}\\,矩阵是正定的情况。\n在\\gls{DL}中，\\gls{objective_function}的表面通常\\gls{nonconvex}（有很多特征），如\\gls{saddle_points}。\n因此使用\\gls{newton_method}是有问题的。\n如果\\,\\gls{hessian}\\,矩阵的特征值并不都是正的，例如，靠近\\gls{saddle_points}处，\\gls{newton_method}实际上会导致更新朝错误的方向移动。\n这种情况可以通过正则化\\,\\gls{hessian}\\,矩阵来避免。\n常用的正则化策略包括在\\,\\gls{hessian}\\,矩阵对角线上增加常数$\\alpha$。\n正则化更新变为\n\\begin{equation}\n    \\Vtheta^* = \\Vtheta_0 - [ H( f(\\Vtheta_0)) + \\alpha \\MI  ]^{-1} \\nabla_{\\Vtheta} f(\\Vtheta_0).\n\\end{equation}\n这个正则化策略用于\\gls{newton_method}的近似，例如Levenberg-Marquardt算法\\citep{Levenberg44,Marquardt63}，只要\\,\\gls{hessian}\\,矩阵的负特征值仍然相对接近零，效果就会很好。\n在\\gls{curvature}方向更极端的情况下，$\\alpha$的值必须足够大，以抵消负特征值。\n然而，如果$\\alpha$持续增加，\\gls{hessian}\\,矩阵会变得由对角矩阵$\\alpha \\MI$主导，通过\\gls{newton_method}所选择的方向会收敛到普通梯度除以$\\alpha$。\n当很强的负\\gls{curvature}存在时，$\\alpha$可能需要特别大，以致于\\gls{newton_method}比选择合适\\gls{learning_rate}的\\gls{GD}的步长更小。\n\n\\begin{algorithm}[ht]\n\\caption{目标为$J(\\Vtheta)= \\frac{1}{m} \\sum_{i=1}^m L(f(\\Vx^{(i)};\\Vtheta), y^{(i)})$的\\gls{newton_method}}\n\\label{alg:newton}\n\\begin{algorithmic}\n\\REQUIRE 初始参数$\\Vtheta_{0}$\n\\REQUIRE 包含 $m$个样本的\\gls{training_set}\n\\WHILE{没有达到停止\\gls{criterion}} \n      \\STATE 计算梯度： $\\Vg \\leftarrow \n     \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n      \\STATE 计算\\,\\gls{hessian}\\,矩阵：$\\MH \\leftarrow  \n     \\frac{1}{m} \\nabla_{\\Vtheta}^2 \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 计算\\,\\gls{hessian}\\,逆：$\\MH^{-1}$\n    \\STATE 计算更新： $\\Delta \\Vtheta = - \\MH^{-1} \\Vg$\n    \\STATE 应用更新：$\\Vtheta = \\Vtheta+\\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n除了\\gls{objective_function}的某些特征带来的挑战，如\\gls{saddle_points}，\\gls{newton_method}用于训练大型\\gls{NN}还受限于其显著的计算负担。\n\\gls{hessian}\\,矩阵中元素数目是参数数量的平方，因此，如果参数数目为$k$（甚至是在非常小的\\gls{NN}中$k$也可能是百万级别），\\gls{newton_method}需要计算$k\\times k$矩阵的逆，计算复杂度为$O(k^3)$。\n另外，由于参数将每次更新都会改变，\\emph{每次训练迭代}都需要计算\\,\\gls{hessian}\\,矩阵的逆。\n其结果是，只有参数很少的网络才能在实际中用\\gls{newton_method}训练。\n在本节的剩余部分，我们将讨论一些试图保持\\gls{newton_method}优点，同时避免计算障碍的替代算法。\n\n\\subsection{\\glsentrytext{CG}法}\n\\label{sec:conjugate_gradients}\n\\gls{CG}法是一种通过迭代下降的\\firstgls{conjugate_directions}以有效避免\\,\\gls{hessian}\\,矩阵求逆计算的方法。\n这种方法的灵感来自于对最速下降方法弱点的仔细研究（详细信息请查看\\secref{sec:gradient_based_optimization}），其中线搜索迭代地用于与梯度相关的方向上。\n\\figref{fig:chap8_steepest_descent_quadratic}说明了该方法在二次碗型目标中如何表现的，是一个相当低效的来回往复，锯齿形模式。\n这是因为每一个由梯度给定的线搜索方向，都保证正交于上一个线搜索方向。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/steepest_descent_quadratic_color}}\n\\fi\n\\caption{将最速下降法应用于二次代价表面。\n在每个步骤，最速下降法沿着由初始点处的梯度定义的线跳到最低代价的点。\n这解决了\\figref{fig:chap4_poor_conditioning_color}中使用固定\\gls{learning_rate}所遇到的一些问题，但即使使用最佳步长，算法仍然朝最优方向曲折前进。\n根据定义，在沿着给定方向的目标最小值处，最终点处的梯度与该方向正交。\n}\n\\label{fig:chap8_steepest_descent_quadratic}\n\\end{figure}\n\n\n% -- 304 --\n\n假设上一个搜索方向是$\\Vd_{t-1}$。   \n在极小值处，也就是（上一次）线搜索终止的地方，方向$\\Vd_{t-1}$处的方向导数为零：$\\nabla_{\\Vtheta} J(\\Vtheta) \\cdot \\Vd_{t-1} = 0$。\n因为该点的梯度定义了当前的搜索方向，$\\Vd_t = \\nabla_{\\Vtheta} J(\\Vtheta)$将不会贡献于方向$\\Vd_{t-1}$。\n因此方向$\\Vd_t$正交于$\\Vd_{t-1}$。\n最速下降多次迭代中，方向$\\Vd_{t-1}$和$\\Vd_t$之间的关系如\\figref{fig:chap8_steepest_descent_quadratic}所示。\n如图展示的，下降正交方向的选择不会保持前一搜索方向上的最小值。\n这产生了锯齿形的过程。\n在当前梯度方向下降到极小值，我们必须重新最小化之前梯度方向上的目标。\n因此，通过遵循每次线搜索结束时的梯度，我们在某种程度上撤销了在之前线搜索的方向上取得的进展。\n\\gls{CG}法试图解决这个问题。\n\n在\\gls{CG}法中，我们寻求一个和先前线搜索方向\\firstgls{conjugate}的搜索方向，即它不会撤销该方向上的进展。\n在训练迭代$t$时，下一步的搜索方向$\\Vd_t$的形式如下：\n\\begin{equation}\n    \\Vd_t = \\nabla_{\\Vtheta} J(\\Vtheta) + \\beta_t \\Vd_{t-1},\n\\end{equation}\n其中，系数$\\beta_t$的大小控制我们应沿方向$\\Vd_{t-1}$加回多少到当前搜索方向上。\n\n% -- 305 --\n\n如果$\\Vd_t^\\top \\MH \\Vd_{t-1} = 0$，其中$\\MH$是\\,\\gls{hessian}\\,矩阵，则两个方向$\\Vd_t$和$\\Vd_{t-1}$被称为共轭的。\n\n适应共轭的直接方法会涉及到$\\MH$特征向量的计算以选择$\\beta_t$。\n这将无法满足我们的开发目标：寻找在大问题比\\gls{newton_method}计算更加可行的方法。\n我们能否不进行这些计算而得到共轭方向？\n幸运的是这个问题的答案是肯定的。\n\n两种用于计算$\\beta_t$的流行方法是：\n\\begin{enumerate}\n\\item Fletcher-Reeves:\n\\begin{equation}\n    \\beta_t = \\frac{ \\nabla_{\\Vtheta} J(\\Vtheta_t)^\\top \\nabla_{\\Vtheta} J(\\Vtheta_t) }\n{ \\nabla_{\\Vtheta} J(\\Vtheta_{t-1})^\\top \\nabla_{\\Vtheta} J(\\Vtheta_{t-1}) }\n\\end{equation}\n\n\\item Polak-Ribi\\`{e}re:\n\\begin{equation}\n    \\beta_t = \\frac{ (\\nabla_{\\Vtheta} J(\\Vtheta_t) - \\nabla_{\\Vtheta} J(\\Vtheta_{t-1}))^\\top \\nabla_{\\Vtheta} J(\\Vtheta_t) }\n{ \\nabla_{\\Vtheta} J(\\Vtheta_{t-1})^\\top \\nabla_{\\Vtheta} J(\\Vtheta_{t-1}) }\n\\end{equation}\n\\end{enumerate}\n对于二次曲面而言，共轭方向确保梯度沿着前一方向幅度不会变大。\n因此，我们在前一方向上仍然处于极小值。\n其结果是，在$k$-维参数空间中，\\gls{CG}法只需要至多$k$次线搜索就能达到极小值。\n\\gls{CG}法如\\algref{alg:cg}所示。\n\n\\begin{algorithm}[ht]\n\\caption{\\gls{CG}法}\n\\label{alg:cg}\n\\begin{algorithmic}\n\\REQUIRE 初始参数 $\\Vtheta_{0}$\n\\REQUIRE 包含$m$个样本的\\gls{training_set}\n\\STATE 初始化 $\\Vrho_{0} = 0$\n\\STATE 初始化 $g_0 = 0$\n\\STATE 初始化 $t = 1$\n\\WHILE{没有达到停止\\gls{criterion}}\n    \\STATE 初始化梯度 ${\\Vg}_{t} = 0$\n    \\STATE 计算梯度：$\\Vg_{t} \\leftarrow\n         \\frac{1}{m}\\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 计算 $\\beta_{t} = \\frac{(\\Vg_{t}-\\Vg_{t-1})^\\top \\Vg_{t}}{\\Vg_{t-1}^\\top \\Vg_{t-1}}$  (Polak-Ribi\\`{e}re)\n    \\STATE (非线性\\gls{CG}法：视情况可重置$\\beta_{t}$为零，\n           例如  $t$是常数$k$的倍数时，如 $k=5$)\n    \\STATE 计算搜索方向： $\\Vrho_{t} = -\\Vg_{t} + \\beta_{t} \\Vrho_{t-1}$ \n    \\STATE 执行\\gls{line_search}寻找：$\\epsilon^{*} = \\arg\\!\\min_{\\epsilon}\n    \\frac{1}{m} \\sum_{i=1}^{m}L(f(\\Vx^{(i)};\\Vtheta_t + \\epsilon \\Vrho_t),\\Vy^{(i)})$ \n    \\STATE （对于真正二次的\\gls{cost_function}，存在$\\epsilon^*$的解析解，而无需显式地搜索）\n    \\STATE 应用更新：$\\Vtheta_{t+1} = \\Vtheta_{t}+ \\epsilon^{*} \\Vrho_{t}$\n    \\STATE $t \\leftarrow t + 1$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\\paragraph{\\gls{nonlinear_CG}法：}\n目前，我们已经讨论了用于二次\\gls{objective_function}的\\gls{CG}法。\n当然，本章我们主要关注于探索训练\\gls{NN}和其他相关\\gls{DL}模型的优化方法，其对应的\\gls{objective_function}比二次函数复杂得多。\n或许令人惊讶，\\gls{CG}法在这种情况下仍然是适用的，尽管需要作一些修改。\n没有目标是二次的保证，共轭方向也不再保证在以前方向上的目标仍是极小值。\n其结果是，\\textbf{\\gls{nonlinear_CG}法}\\,算法会包括一些偶尔的重设，\\gls{CG}法沿未修改的梯度重启线搜索。\n\n% -- 306 --\n\n实践者报告在实践中使用\\gls{nonlinear_CG}法训练\\gls{NN}是合理的，尽管在开始\\gls{nonlinear_CG}法前使用\\gls{SGD}迭代若干步来初始化效果更好。\n另外，尽管（非线性）\\gls{CG}法传统上作为批方法，\\gls{minibatch}版本已经成功用于训练\\gls{NN}~\\citep{Le-ICML2011}。\n针对神经网路的\\gls{CG}法应用早已被提出，例如缩放的\\gls{CG}法\\citep{Moller}。\n\n\\subsection{\\glsentrytext{BFGS}}\n\\label{sec:bfgs}\n\\textbf{Broyden-Fletcher-Goldfarb-Shanno}（\\textbf{\\gls{BFGS}}）算法具有\\gls{newton_method}的一些优点，但没有\\gls{newton_method}的计算负担。\n在这方面，\\gls{BFGS}\\,和\\gls{CG}法很像。\n然而，\\gls{BFGS}\\,使用了一个更直接的方法近似牛顿更新。回顾牛顿更新由下式给出\n\\begin{equation}\n    \\Vtheta^* = \\Vtheta_0 - \\MH^{-1} \\nabla_{\\Vtheta} J(\\Vtheta_0),\n\\end{equation}\n其中，$\\MH$是$J$相对于$\\Vtheta$的\\,\\gls{hessian}\\,矩阵在$\\Vtheta_0$处的估计。\n运用\\gls{newton_method}的主要计算难点在于计算\\,\\gls{hessian}\\,逆$\\MH^{-1}$。\n拟\\gls{newton_method}所采用的方法（\\gls{BFGS}\\,是其中最突出的）是使用矩阵$\\MM_t$近似逆，迭代地低秩更新精度以更好地近似$\\MH^{-1}$。\n\n% -- 307 --\n\n\\gls{BFGS}\\,近似的说明和推导出现在很多关于优化的教科书中，包括\\cite{Lue84}。\n\n当\\,\\gls{hessian}\\,逆的近似$\\MM_t$更新时，下降方向$\\Vrho_t$为$\\Vrho_t = \\MM_t \\Vg_t$。\n该方向上的线搜索用于决定该方向上的步长$\\epsilon^*$。\n参数的最后更新为：\n\\begin{equation}\n    \\Vtheta_{t+1} = \\Vtheta_t + \\epsilon^* \\Vrho_t.\n\\end{equation}\n\n和\\gls{CG}法相似，\\gls{BFGS}\\,算法迭代一系列线搜索，其方向含二阶信息。\n然而和\\gls{CG}法不同的是，该方法的成功并不严重依赖于线搜索找到该方向上和真正极小值很近的一点。\n因此，相比于\\gls{CG}法，\\gls{BFGS}\\,的优点是其可以花费较少的时间改进每个线搜索。\n在另一方面，\\gls{BFGS}\\,算法必须存储\\,\\gls{hessian}\\,逆矩阵$\\MM$，需要$O(n^2)$的存储空间，使\\,\\gls{BFGS}\\,不适用于大多数具有百万级参数的现代\\gls{DL}模型。\n\n\\paragraph{存储受限的\\,\\gls{BFGS}（或\\,\\gls{LBFGS}）}\n通过避免存储完整的\\,\\gls{hessian}\\,逆近似$\\MM$，\\gls{BFGS}\\,算法的存储代价可以显著降低。\n\\gls{LBFGS}\\,算法使用和\\,\\gls{BFGS}\\,算法相同的方法计算$\\MM$的近似，但开始时假设上一步的$\\MM$即$\\MM^{(t-1)}$是单位矩阵，而不是每一步都为下一步存储近似。\n如果使用精确的线搜索，\\gls{LBFGS}\\,定义的方向会是相互共轭的。\n然而，不同于\\gls{CG}法，即使线搜索只是找到近似的极小值点，该过程的效果仍然不错。\n这里描述的无存储的\\,\\gls{LBFGS}\\,方法可以拓展为包含\\,\\gls{hessian}\\,矩阵更多的信息，每步存储一些用于更新$\\MM$的向量，且每步的存储代价是$O(n)$。\n\n% -- 308 --\n\n\\section{优化策略和元算法}\n\\label{sec:optimization_strategies_and_meta_algorithms}\n许多优化技术并非真正的算法，而是一般化的模板，可以特殊化而产生算法，或是并入到很多不同的算法中。\n\n\\subsection{\\glsentrytext{Batch_normalization}}\n\\label{sec:batch_normalization}\n\\gls{batch_normalization}~\\citep{Ioffe+Szegedy-2015}是优化\\gls{DNN}中最激动人心的最新创新之一。\n实际上它并不是一个优化算法，而是一个自适应的重参数化的方法，试图解决训练非常深的模型的困难。\n\n非常深的模型会涉及多个函数或层组合。\n在其他层不改变的假设下，梯度用于如何更新每一个参数。\n在实践中，我们同时更新所有层。\n当我们进行更新时，可能会发生一些意想不到的结果，这是因为许多组合在一起的函数同时改变时，计算更新的假设是其他函数保持不变。\n举一个简单的例子，假设我们有一个\\gls{DNN}，每一层只有一个单元，并且在每个\\gls{hidden_layer}不使用\\gls{activation_function}：$\\hat{y} = xw_1 w_2 w_3 \\dots w_l$。\n此处，$w_i$表示用于层$i$的权重。层$i$的输出是$h_i = h_{i-1} w_i$。\n输出$\\hat{y}$是输入$x$的线性函数，但是权重$w_i$的非线性函数。\n假设我们的\\gls{cost_function} $\\hat{y}$上的梯度为$1$，所以我们希望稍稍降低$\\hat{y}$。\n然后\\gls{backward_propagation}算法可以计算梯度$\\Vg = \\nabla_{\\Vw} \\hat{y}$。\n想想我们在更新$\\Vw \\leftarrow \\Vw - \\epsilon \\Vg$时会发生什么。\n近似$\\hat{y}$的一阶泰勒级数会预测$\\hat{y}$的值下降$\\epsilon \\Vg^\\top \\Vg$。\n如果我们希望$\\hat{y}$下降$0.1$，那么梯度中的一阶信息表明我们应设置\\gls{learning_rate}$\\epsilon$为$\\frac{0.1}{\\Vg^\\top \\Vg}$。\n然而，实际的更新将包括二阶，三阶，直到$l$阶的影响。\n$\\hat{y}$的更新值为\n\\begin{equation}\n    x(w_1-\\epsilon g_1)(w_2-\\epsilon g_2)\\dots(w_l-\\epsilon g_l),\n\\end{equation}\n这个更新中所产生的一个二阶项示例是$\\epsilon^2 g_1 g_2 \\prod_{i=3}^l w_i$ 。\n如果 $\\prod_{i=3}^l w_i$很小，那么该项可以忽略不计。而如果层$3$到层$l$的权重都比$1$大时，该项可能会指数级大。\n这使得我们很难选择一个合适的\\gls{learning_rate}，因为某一层中参数更新的效果很大程度上取决于其他所有层。\n二阶优化算法通过考虑二阶相互影响来解决这个问题，但我们可以看到，在非常深的网络中，更高阶的相互影响会很显著。\n即使是二阶优化算法，计算代价也很高，并且通常需要大量近似，以免真正计算所有的重要二阶相互作用。\n因此对于$n>2$的情况，建立$n$阶优化算法似乎是无望的。\n那么我们可以做些什么呢？\n\n% -- 309 --\n\n\\gls{batch_normalization}提出了一种几乎可以重参数化所有\\gls{deep_network}的优雅方法。\n重参数化显著减少了多层之间协调更新的问题。\n\\gls{batch_normalization}可应用于网络的任何输入层或\\gls{hidden_layer}。\n设$\\MH$是需要标准化的某层的\\gls{minibatch}\\gls{activation_function}，排布为设计矩阵，每个样本的激活出现在矩阵的每一行中。\n为了标准化$\\MH$，我们将其替换为\n\\begin{equation}\n\\MH' = \\frac{\\MH - \\Vmu}{\\Vsigma},\n\\end{equation}\n其中$\\Vmu$是包含每个单元均值的向量，$\\Vsigma$是包含每个单元标准差的向量。\n此处的算术是基于广播向量$\\Vmu$和向量$\\Vsigma$应用于矩阵$\\MH$的每一行。\n在每一行内，运算是逐元素的，因此$H_{i,j}$标准化为减去$\\mu_j$再除以$\\sigma_j$。\n网络的其余部分操作$\\MH'$的方式和原网络操作$\\MH$的方式一样。\n\n在训练阶段，\n\\begin{equation}\n    \\Vmu = \\frac{1}{m} \\sum_i \\MH_{i,:}\n\\end{equation}\n和\n\\begin{equation}\n    \\Vsigma = \\sqrt{ \\delta + \\frac{1}{m} \\sum_i (\\MH - \\Vmu)_i^2 },\n\\end{equation}\n其中$\\delta$是个很小的正值，比如$10^{-8}$，以强制避免遇到$\\sqrt{z}$的梯度在$z=0$处未定义的问题。\n至关重要的是，\\emph{我们反向传播这些操作}，来计算均值和标准差，并应用它们于标准化$\\MH$。\n这意味着，梯度不会再简单地增加$h_i$的\\gls{standard_deviation}或均值；标准化操作会除掉这一操作的影响，归零其在梯度中的元素。\n这是\\gls{batch_normalization}方法的一个重大创新。\n以前的方法添加\\gls{cost_function}的惩罚，以鼓励单元标准化激活统计量，或是在每个\\gls{GD}步骤之后重新标准化单元统计量。\n前者通常会导致不完全的标准化，而后者通常会显著地消耗时间，因为学习算法会反复改变均值和方差而标准化步骤会反复抵消这种变化。\n\\gls{batch_normalization}重参数化模型，以使一些单元在定义上就总是标准化的，巧妙地回避了这两个问题。\n\n% -- 310 --\n\n在测试阶段，$\\Vmu$和$\\Vsigma$可以被替换为训练阶段收集的运行均值。\n这使得模型可以对单一样本评估，而无需使用定义于整个\\gls{minibatch}的$\\Vmu$和$\\Vsigma$。\n\n回顾例子$\\hat{y} = x w_1 w_2 \\dots w_l$，我们看到，我们可以通过标准化$h_{l-1}$很大程度地解决了学习这个模型的问题。\n假设$x$采样自一个单位高斯分布，\n那么$h_{l-1}$也是来自高斯分布，因为从$x$到$h_l$的变换是线性的。\n然而，$h_{l-1}$不再有零均值和单位方差。\n使用\\gls{batch_normalization}后，我们得到的归一化$\\hat{h}_{l-1}$恢复了零均值和单位方差的特性。\n对于底层的几乎任意更新而言，$\\hat{h}_{l-1}$仍然保持着单位高斯分布。\n然后输出$\\hat{y}$可以学习为一个简单的线性函数$\\hat{y} = w_l \\hat{h}_{l-1}$。\n现在学习这个模型非常简单，因为低层的参数在大多数情况下没有什么影响；它们的输出总是重新标准化为单位高斯分布。\n只在少数个例中，低层会有影响。\n改变某个低层权重为$0$，可能使输出退化；改变低层权重的符号可能反转$\\hat{h}_{l-1}$和$y$之间的关系。\n这些情况都是非常罕见的。\n没有标准化，几乎每一个更新都会对$h_{l-1}$的统计量有着极端的影响。\n因此，\\gls{batch_normalization}显著地使得模型更易学习。\n在这个示例中，容易学习的代价是使得底层网络没有用。\n在我们的线性示例中，较低层不再有任何有害的影响，但它们也不再有任何有益的影响。\n这是因为我们已经标准化了一阶和二阶统计量，这是线性网络可以影响的所有因素。\n在具有非线性\\gls{activation_function}的\\gls{DNN}中，较低层可以进行数据的非线性变换，所以它们仍然是有用的。\n\\gls{batch_normalization}仅标准化每个单元的均值和方差，以稳定化学习，但允许单元和单元之间的关系，以及单个单元的非线性统计量之间的关系发生变化。\n\n由于网络的最后一层能够学习线性变换，实际上我们可能希望移除一层内单元之间的所有线性关系。\n事实上，这是~\\cite{Desjardins2015}中采用的方法，为\\gls{batch_normalization}提供了灵感。\n令人遗憾的是，消除所有的线性关联比标准化各个独立单元的均值和\\gls{standard_deviation}代价更高，因此\\gls{batch_normalization}仍是迄今最实用的方法。\n\n% -- 311 --\n\n标准化一个单元的均值和标准差会降低包含该单元的\\gls{NN}的表达能力。\n为了保持网络的表现力，通常会将\\gls{batch}\\gls{hidden_unit}激活$\\MH$替换为$\\gamma \\MH' + \\Vbeta$，而不是简单地使用标准化的$\\MH'$。\n变量$\\Vgamma$和$\\Vbeta$是允许新变量有任意均值和\\gls{standard_deviation}的学习参数。\n乍一看，这似乎是无用的——为什么我们将均值设为$0$，然后又引入参数允许它被重设为任意值$\\Vbeta$？\n答案是新的参数可以表示旧参数作为输入的同一族函数，但是新参数有不同的学习动态。\n在旧参数中，$\\MH$的均值取决于$\\MH$下层中参数的复杂关联。\n在新参数中，$\\Vgamma \\MH' + \\Vbeta$的均值仅由$\\Vbeta$确定。\n新参数很容易通过\\gls{GD}来学习。\n\n大多数\\gls{NN}层会采取$\\phi(\\MX\\MW+ \\Vb)$的形式，其中$\\phi$是某个固定的非线性\\gls{activation_function}，如\\gls{rectified_linear}变换。\n自然想到我们应该将\\gls{batch_normalization}应用于输入$\\MX$还是变换后的值$\\MX\\MW+\\Vb$。\n\\cite{Ioffe+Szegedy-2015}推荐后者。\n更具体地，$\\MX\\MW+\\Vb$应替换为$\\MX\\MW$的标准化形式。\n偏置项应被忽略，因为参数$\\Vbeta$会加入\\gls{batch_normalization}重参数化，它是冗余的。\n一层的输入通常是前一层的非线性\\gls{activation_function}（如\\gls{rectified_linear}函数）的输出。\n因此，输入的统计量更符合非高斯分布，而更不服从线性操作的标准化。\n\n\\chapref{chap:convolutional_networks}所述的卷积网络，在特征映射中每个空间位置同样地标准化$\\Vmu$和$\\Vsigma$是很重要的，能使特征映射的统计量在不同的空间位置，仍然保持相同。\n\n\\subsection{坐标下降}\n\\label{sec:coordinate_descent}\n在某些情况下，将一个优化问题分解成几个部分，可以更快地解决原问题。\n如果我们相对于某个单一变量$x_i$最小化$f(\\Vx)$，然后相对于另一个变量$x_j$等等，反复循环所有的变量，我们会保证到达（局部）极小值。\n这种做法被称为\\firstgls{coordinate_descent}，因为我们一次优化一个坐标。\n更一般地，\\firstgls{block_coordinate_descent}是指对于某个子集的变量同时最小化。\n术语``\\gls{coordinate_descent}''通常既指块坐标下降，也指严格的单个坐标下降。\n\n% -- 312 --\n\n当优化问题中的不同变量能够清楚地分成相对独立的组，或是当优化一组变量明显比优化所有变量效率更高时，坐标下降最有意义。\n例如，考虑\\gls{cost_function}\n\\begin{equation}\n    J(\\MH, \\MW) = \\sum_{i,j} |H_{i,j}| + \\sum_{i,j} \\left( \\MX - \\MW^\\top \\MH \\right)_{i,j}^2 .\n\\end{equation}\n该函数描述了一种被称为\\gls{sparse_coding}的学习问题，其目标是寻求一个权重矩阵$\\MW$，可以线性解码激活值矩阵$\\MH$以重构\\gls{training_set}$\\MX$。\n\\gls{sparse_coding}的大多数应用还涉及到\\gls{weight_decay}或$\\MW$列范数的约束，以避免极小$\\MH$和极大$\\MW$的病态解。\n\n函数$J$不是凸的。\n然而，我们可以将训练算法的输入分成两个集合：字典参数$\\MW$和编码表示$\\MH$。\n最小化关于这两者之一的任意一组变量的\\gls{objective_function}都是凸问题。\n因此，块坐标下降允许我们使用高效的\\gls{convex_optimization}算法，交替固定$\\MH$优化$\\MW$和固定$\\MW$优化$\\MH$。\n\n当一个变量的值很大程度地影响另一个变量的最优值时，坐标下降不是一个很好的方法，如函数$f(\\Vx)=(x_1 - x_2)^2+\\alpha(x_1^2 + x_2^2)$，其中$\\alpha$是正值常数。\n第一项鼓励两个变量具有相似的值，而第二项鼓励它们接近零。\n解是两者都为零。\n\\gls{newton_method}可以一步解决这个问题，因为它是一个正定二次问题。\n但是，对于小值$\\alpha$而言，坐标下降会使进展非常缓慢，因为第一项不允许单个变量变为和其他变量当前值显著不同的值。\n\n\n\\subsection{Polyak平均}\n\\label{sec:polyak_averaging}\nPolyak平均\\citep{Polyak+Juditsky-1992}会平均优化算法在参数空间访问轨迹中的几个点。\n如果$t$次迭代\\gls{GD}访问了点$\\Vtheta^{(1)},\\dots,\\Vtheta^{(t)}$，那么Polyak平均算法的输出是$\\hat{\\Vtheta}^{(t)} = \\frac{1}{t} \\sum_i \\Vtheta^{(i)}$。\n在某些问题中，如\\gls{GD}应用于凸问题时，这种方法具有较强的收敛保证。\n当应用于\\gls{NN}时，其验证更多是启发式的，但在实践中表现良好。\n基本想法是，优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。\n尽管两边所有位置的均值应比较接近谷底。\n\n% -- 313 --\n\n在\\gls{nonconvex}问题中，优化轨迹的路径可以非常复杂，并且经过了许多不同的区域。\n包括参数空间中遥远过去的点，可能与当前点在\\gls{cost_function}上相隔很大的障碍，看上去不像一个有用的行为。\n其结果是，当应用Polyak平均于\\gls{nonconvex}问题时，通常会使用指数衰减计算平均值：\n\\begin{equation}\n    \\hat{\\Vtheta}^{(t)} = \\alpha \\hat{\\Vtheta}^{(t-1)} + (1-\\alpha) \\Vtheta^{(t)} .\n\\end{equation}\n\n这个计算平均值的方法被用于大量数值应用中。最近的例子请查看\\cite{Szegedy-et-al-2015}。\n\n\\subsection{监督\\glsentrytext{pretraining}}\n\\label{sec:supervised_pretraining}\n有时，如果模型太复杂难以优化，或是如果任务非常困难，直接训练模型来解决特定任务的挑战可能太大。\n有时训练一个较简单的模型来求解问题，然后使模型更复杂会更有效。\n训练模型来求解一个简化的问题，然后转移到最后的问题，有时也会更有效些。\n这些在直接训练目标模型求解目标问题之前，训练简单模型求解简化问题的方法统称为\\firstgls{pretraining}。\n\n\n\\firstgls{greedy_algorithm}将问题分解成许多部分，然后独立地在每个部分求解最优值。\n令人遗憾的是，结合各个最佳的部分不能保证得到一个最佳的完整解。\n然而，贪心算法计算上比求解最优联合解的算法高效得多，并且贪心算法的解在不是最优的情况下，往往也是可以接受的。\n贪心算法也可以紧接一个\\firstgls{fine_tuning}阶段，联合优化算法搜索全问题的最优解。\n使用贪心解初始化联合优化算法，可以极大地加速算法，并提高寻找到的解的质量。\n\n\\gls{pretraining}算法，特别是贪心\\gls{pretraining}，在\\gls{DL}中是普遍存在的。\n在本节中，我们会具体描述这些将监督学习问题分解成其他简化的监督学习问题的\\gls{pretraining}算法。\n这种方法被称为\\firstgls{greedy_supervised_pretraining}。\n\n% -- 314 --\n\n在\\gls{greedy_supervised_pretraining}的原始版本\\citep{Bengio-nips-2006-short}中，每个阶段包括一个仅涉及最终\\gls{NN}的子集层的监督学习训练任务。\n\\gls{greedy_supervised_pretraining}的一个例子如\\figref{fig:chap8_deep_sup}所示，其中每个附加的\\gls{hidden_layer}作为浅层监督\\gls{MLP}的一部分\\gls{pretraining}，以先前训练的\\gls{hidden_layer}输出作为输入。\n\\cite{Simonyan2015}~\\gls{pretraining}深度卷积网络（11层权重），然后使用该网络前四层和最后三层初始化更深的网络（多达19层权重），并非一次\\gls{pretraining}一层。\n非常深的新网络的中间层是随机初始化的。\n然后联合训练新网络。\n还有一种选择，由\\cite{Yu+al-2010}提出，将先前训练\\gls{MLP}的\\emph{输出}，以及原始输入，作为每个附加阶段的输入。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/deep_sup}}\n\\fi\n\\caption{一种形式的\\gls{greedy_supervised_pretraining}的示意图~\\citep{Bengio-nips-2006-small}。\n(a)我们从训练一个足够浅的架构开始。\n(b)同一个架构的另一描绘。\n(c)我们只保留原始网络的输入到隐藏层，并丢弃隐藏到输出层。 \n我们将第一层\\gls{hidden_layer}的输出作为输入发送到另一监督单隐层\\,\\glssymbol{MLP}（使用与第一个网络相同的目标训练），从而可以添加第二层\\gls{hidden_layer}。 \n这可以根据需要重复多层。\n(d)所得架构的另一种描绘，可视为\\gls{feedforward_network}。 \n为了进一步改进优化，我们可以联合地\\gls{fine_tuning}所有层（仅在该过程的结束或者该过程的每个阶段）。\n}\n\\label{fig:chap8_deep_sup}\n\\end{figure}\n\n\n为什么\\gls{greedy_supervised_pretraining}会有帮助呢？\n最初由~\\cite{Bengio-nips-2006}提出的假说是，其有助于更好地指导深层结构的中间层的学习。\n一般情况下，\\gls{pretraining}对于优化和\\gls{generalization}都是有帮助的。\n\n另一个与监督\\gls{pretraining}有关的方法扩展了迁移学习的想法：\\cite{yosinski-nips2014}在一组任务上\\gls{pretraining}了$8$层权重的深度卷积网络（1000个ImageNet对象类的子集），然而用该网络的前$k$层初始化同样规模的网络。\n然后第二个网络的所有层（上层随机初始化）联合训练以执行不同的任务（1000个ImageNet对象类的另一个子集），但训练样本少于第一个任务。\n\\gls{NN}中另一个和迁移学习相关的方法将在\\secref{sec:transfer_learning_and_domain_adaptation}讨论。\n\n另一条相关的工作线是\\textbf{FitNets}~\\citep{Romero-et-al-ICLR2015-small}方法。\n这种方法始于训练深度足够低和宽度足够大（每层单元数），容易训练的网络。\n然后，这个网络成为第二个网络（被指定为\\,\\textbf{学生}）的\\,\\textbf{老师}。\n学生网络更深更窄（11至19层），且在正常情况下很难用SGD训练。\n训练学生网络不仅需要预测原任务的输出，还需要预测教师网络中间层的值，这样使得训练学生网络变得更容易。\n这个额外的任务说明了\\gls{hidden_layer}应如何使用，并且能够简化优化问题。\n附加参数被引入来从更深的学生网络中间层去回归$5$层教师网络的中间层。\n然而，该目标是预测教师网络的中间\\gls{hidden_layer}，并非预测最终分类目标。\n学生网络的低层因而具有两个目标：帮助学生网络的输出完成其目标和预测教师网络的中间层。\n尽管一个窄而深的网络似乎比宽而浅的网络更难训练，但窄而深网络的泛化能力可能更好，\n并且如果其足够窄，参数足够少，那么其计算代价更小。\n没有\\gls{hidden_layer}的提示，学生网络在\\gls{training_set}和\\gls{test_set}上的实验表现都很差。\n因而中间层的提示是有助于训练很难训练的网络的方法之一，但是其他优化技术或是架构上的变化也可能解决这个问题。\n\n% -- 316 --\n\n\\subsection{设计有助于优化的模型}\n\\label{sec:designing_models_to_aid_optimization}\n改进优化的最好方法并不总是改进优化算法。\n相反，\\gls{deep_model}中优化的许多改进来自于设计易于优化的模型。\n\n原则上，我们可以使用呈锯齿非单调模式上上下下的\\gls{activation_function}，但是，这将使优化极为困难。\n在实践中，\\emph{选择一族容易优化的模型比使用一个强大的优化算法更重要}。\n\\gls{NN}学习在过去30年的大多数进步主要来自于改变模型族，而非改变优化过程。\n1980年代用于训练\\gls{NN}的带\\gls{momentum}的\\gls{SGD}，仍然是现代\\gls{NN}应用中的前沿算法。\n\n具体来说，现代\\gls{NN}的\\emph{设计选择}体现在层之间的线性变换，几乎处处可导的\\gls{activation_function}，和大部分定义域都有明显的梯度。\n特别地，创新的模型，如\\,\\glssymbol{LSTM}，\\gls{ReLU}和\\,\\gls{maxout}\\,单元都比先前的模型（如基于\\,\\gls{sigmoid}\\,单元的\\gls{deep_network}）使用更多的线性函数。\n这些模型都具有简化优化的性质。\n如果线性变换的\\,\\gls{jacobian}\\,具有相对合理的奇异值，那么梯度能够流经很多层。\n此外，线性函数在一个方向上一致增加，所以即使模型的输出远离正确值，也可以简单清晰地计算梯度，使其输出方向朝降低\\gls{loss_function}的方向移动。\n换言之，现代\\gls{NN}的设计方案旨在使其\\emph{局部}梯度信息合理地对应着移向一个遥远的解。\n\n其他的模型设计策略有助于使优化更简单。\n例如，层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度，因而缓解了梯度消失的问题\\citep{Srivastava-et-al-arxiv2015}。\n一个和跳跃连接相关的想法是添加和网络中间\\gls{hidden_layer}相连的输出的额外副本，如GoogLeNet~\\citep{Szegedy-et-al-arxiv2014}和深度监督网络\\citep{Lee-et-al-2014}。\n这些``辅助头''被训练来执行和网络顶层主要输出相同的任务，以确保底层网络能够接受较大的梯度。\n当训练完成时，辅助头可能被丢弃。\n这是之前小节介绍到的\\gls{pretraining}策略的替代方法。\n以这种方式，我们可以在一个阶段联合训练所有层，而不改变架构，使得中间层（特别是低层）能够通过更短的路径得到一些如何更新的有用信息。\n这些信息为底层提供了误差信号。\n\n% -- 317 --\n\n\\subsection{\\glsentrytext{continuation_method}和\\glsentrytext{curriculum_learning}}\n\\label{sec:continuation_methods_and_curriculum_learning}\n正如\\secref{sec:poor_correspondence_between_local_and_global_structure}探讨的，许多优化挑战都来自于\\gls{cost_function}的全局结构，不能仅通过局部更新方向上更好的估计来解决。\n解决这个问题的主要方法是尝试初始化参数到某种区域内，该区域可以通过局部下降很快连接到参数空间中的解。\n\n\n\\firstgls{continuation_method}是一族通过挑选初始点使优化更容易的方法，以确保局部优化花费大部分时间在表现良好的空间。\n\\gls{continuation_method}的背后想法是构造一系列具有相同参数的\\gls{objective_function}。\n为了最小化\\gls{cost_function} $J(\\Vtheta)$，我们构建新的\\gls{cost_function} $\\{J^{(0)},\\dots,J^{(n)}\\}$。\n这些\\gls{cost_function}的难度逐步提高，其中$J^{(0)}$是最容易最小化的，$J^{(n)}$是最难的，真正的\\gls{cost_function}驱动整个过程。\n当我们说$J^{(i)}$比$J^{(i+1)}$更容易时，是指其在更多的$\\Vtheta$空间上表现良好。\n随机初始化更有可能落入局部下降可以成功最小化\\gls{cost_function}的区域，因为其良好区域更大。\n这系列\\gls{cost_function}设计为前一个解是下一个的良好初始点。\n因此，我们首先解决一个简单的问题，然后改进解以解决逐步变难的问题，直到我们求解真正问题的解。\n\n传统的\\gls{continuation_method}（用于\\gls{NN}训练之前的\\gls{continuation_method}）通常基于平滑\\gls{objective_function}。\n读者可以查看~\\cite{Wu-97}了解这类方法的示例，以及一些相关方法的综述。\n\\gls{continuation_method}也和参数中加入\\gls{noise}的模拟退火紧密相关\\citep{Kirkpatrick83}。\n\\gls{continuation_method}在最近几年非常成功。\n参考~\\cite{Mobahi+Fisher-AAAI2015}了解近期文献的概述，特别是在~\\glssymbol{AI}~方面的应用。\n\n% -- 318 --\n\n传统上，\\gls{continuation_method}主要用来克服\\gls{local_minima}的问题。\n具体地，它被设计来在有很多\\gls{local_minima}的情况下，求解一个\\gls{global_minimum}。\n这些连续方法会通过``模糊''原来的\\gls{cost_function}来构建更容易的\\gls{cost_function}。\n这些模糊操作可以是用采样来近似\n\\begin{equation}\n    J^{(i)}(\\Vtheta) = \\SetE_{\\theta' \\sim \\mathcal{N}(\\Vtheta'; \\Vtheta, \\sigma^{(i)2})} J(\\Vtheta')\n\\end{equation}\n这个方法的直觉是有些\\gls{nonconvex}函数在模糊后会近似凸的。\n在许多情况下，这种模糊保留了关于全局极小值的足够信息，我们可以通过逐步求解模糊更少的问题来求解全局极小值。\n这种方法有三种可能失败的方式。\n首先，它可能成功地定义了一连串\\gls{cost_function}，并从开始的一个凸函数起（逐一地）沿着函数链最佳轨迹逼近全局最小值，但可能需要非常多的逐步\\gls{cost_function}，整个过程的成本仍然很高。\n另外，即使\\gls{continuation_method}可以适用，NP-hard的优化问题仍然是NP-hard。\n其他两种\\gls{continuation_method}失败的原因是不实用。\n其一，不管如何模糊，函数都没法变成凸的，比如函数$J(\\Vtheta) = -\\Vtheta^\\top \\Vtheta$。\n其二，函数可能在模糊后是凸的，但模糊函数的最小值可能会追踪到一个局部最小值，而非原始\\gls{cost_function}的全局最小值。\n\n\n尽管\\gls{continuation_method}最初用来解决局部最小值的问题，而局部最小值已不再认为是\\gls{NN}优化中的主要问题了。\n幸运的是，\\gls{continuation_method}仍然有所帮助。\n\\gls{continuation_method}引入的简化\\gls{objective_function}能够消除平坦区域，减少梯度估计的方差，提高\\,\\gls{hessian}\\,矩阵的条件数，使局部更新更容易计算，或是改进局部更新方向与朝向全局解方向之间的对应关系。\n\n\\cite{Bengio+al-2009}指出被称为\\firstgls{curriculum_learning}或者\\firstgls{shaping}的方法可以被解释为\\gls{continuation_method}。\n\\gls{curriculum_learning}基于规划学习过程的想法，首先学习简单的概念，然后逐步学习依赖于这些简化概念的复杂概念。\n之前这一基本策略被用来加速动物训练过程\\citep{Skinner1958,Peterson2004,Krueger+Dayan-2009}和\\gls{ML}过程\\citep{solomonoff1989system,Elman93,Sanger-1994}。\n\\cite{Bengio+al-2009}验证这一策略为\\gls{continuation_method}，通过增加简单样本的影响（通过分配它们较大的系数到\\gls{cost_function}，或者更频繁地采样），先前的$J^{(i)}$会变得更容易。\n实验证明，在大规模的神经语言模型任务上使用\\gls{curriculum_learning}，可以获得更好的结果。\n课程学习已经成功应用于大量的自然语言\\citep{Spitkovsky-et-al-HLT2010,collobert2011natural,Mikolov-ASRU-2011,Tu+Honavar-IJCAI2011}和计算机视觉\\citep{Kumar+al-2010,Lee+Grauman-CVPR2011,Supancic+Ramanan-CVPR2013}任务上。\n\\gls{curriculum_learning}被证实为与人类教学方式一致\\citep{Khan+Zhu+Mutlu-2011}：\n教师刚开始会展示更容易、更典型的示例，然后帮助学习者在不太显然的情况下提炼决策面。\n在人类教学上，基于\\gls{curriculum_learning}的策略比基于样本均匀采样的策略\\emph{更有效}，也能提高其他学习策略的效率\\citep{Basu+Christensen-AAAI2013}。\n\n% -- 319 --\n\n\\gls{curriculum_learning}研究的另一个重要贡献体现在训练循环\\gls{NN}捕获长期依赖：\n\\cite{Zaremba+Sutskever-arxiv2014}发现使用\\emph{\\gls{stochastic_curriculum}}获得了更好的结果，其中容易和困难的示例混合在一起，随机提供给学习者，更难示例（这些具有长期依赖）的平均比例在逐渐上升。\n而使用确定性课程，并没有发现超过基线（完整\\gls{training_set}的普通训练）的改进。\n\n现在我们已经介绍了一些基本的\\gls{NN}模型，以及如何进行正则化和优化。\n在接下来的章节中，我们转向特化的\\gls{NN}家族，允许其扩展到能够处理很大规模的数据和具有特殊结构的数据。\n在本章中讨论的优化算法在较少改动后或者无需改动，通常就可以直接用于这些特化的架构。\n\n% -- 320 --\n"
  },
  {
    "path": "Chapter9/README.md",
    "content": "#第九章笔记\n"
  },
  {
    "path": "Chapter9/annotations.txt",
    "content": "{'user': 'acct:zhiding@hypothes.is', 'text': '卷积神经网络', 'origin_text': '看作是二维的像素网格）。卷积网络在诸多应用领域都表现优异。“  !!!卷积网络!!!  ”一词表明该网络使用了卷积这种数学运算。卷积是一种特殊的线性运', 'time': '2017-01-12T07:43'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '然后我们会介绍池化，这是一种几乎所有卷积网络都会用到的操作。', 'origin_text': '么是卷积运算。接着，我们会解释在神经网络中使用卷积运算的动机。  !!!然后我们会介绍一种几乎所有的卷积神经网络都会用到的操作池化。!!!  通常来说，卷积神经网络中用到的卷积运算和其他领域（例如工程领域', 'time': '2017-01-12T07:48'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '广泛应用', 'origin_text': '域以及纯数学领域）中的定义并不完全一致。我们会对神经网络实践中  !!!用得比较多!!!  的几种卷积函数的变体进行说明。我们也会说明如何在多种不同维数的', 'time': '2017-01-12T07:54'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络是神经科学的原理中影响着深度学习的典型代表', 'origin_text': '上使用卷积运算。之后我们讨论使得卷积运算更加高效的一些方法。  !!!卷积神经网络是神经科学的原理影响深度学习的典型代表!!!  ，我们之后也会讨论这些神经科学的原理，并对卷积神经网络在深度学习', 'time': '2017-01-12T07:59'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络', 'origin_text': '影响深度学习的典型代表，我们之后也会讨论这些神经科学的原理，并对  !!!卷积神经网络!!!  在深度学习发展史中的作用作出评价。本章没有涉及如何为你的卷积神', 'time': '2017-01-12T08:00'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '因为本章的目标是说明卷积网络所提供的各种工具，第\\\\?章将会对如何在具体环境中选择使用相应的工具给出通用的准则。', 'origin_text': '用作出评价。本章没有涉及如何为你的卷积神经网络选择合适的结构，  !!!因为本章的目标是说明卷积神经网络提供的强大工具，第\\\\?章会对在具体环境中使用相应的工具给出一些指导。!!!  对于卷积网络结构的研究进展得如此迅速，以至于针对特定问题，数月', 'time': '2017-01-12T08:16'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '基准测试', 'origin_text': '一些指导。对于卷积网络结构的研究进展得如此迅速，以至于针对特定  !!!问题!!!  ，数月甚至几周就会产生一个新的最优的网络结构，甚至在写这本书时也', 'time': '2017-01-12T08:20'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '公开', 'origin_text': '络结构的研究进展得如此迅速，以至于针对特定问题，数月甚至几周就会  !!!产生!!!  一个新的最优的网络结构，甚至在写这本书时也不好描述究竟哪种结构是', 'time': '2017-01-12T08:20'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '受到了噪声干扰', 'origin_text': '可以在任意时刻从传感器中读出飞船的位置。现在假设我们的传感器  !!!含有噪声!!!  。为了得到飞船位置的低噪声估计，我们对得到的测量结果进行平均。', 'time': '2017-01-12T08:26'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '距', 'origin_text': '加权函数w(a)w(a)w(a) 来实现，其中aaa表示测量结果  !!!据!!!  当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作', 'time': '2017-01-12T08:32'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '就得到了一个新的对于飞船位置的平滑估计函数', 'origin_text': '前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作，  !!!就得到了对于飞船位置的连续估计函数!!!  sss：s(t)=∫x(a)w(t−a)da.s(t)=∫x(', 'time': '2017-01-12T08:35'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '在参数为负值时，$w$的取值必须为$0$', 'origin_text': '是一个有效的概率密度函数，否则输出就不再是一个加权平均。另外，  !!!www在参数为负值时必须为0!!!  ，否则它会涉及到未来，这不是我们能够做到的。但这些限制仅仅是对', 'time': '2017-01-12T08:41'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这不是我们能够推测得了的。', 'origin_text': '平均。另外，www在参数为负值时必须为0，否则它会涉及到未来，  !!!这不是我们能够做到的!!!  。但这些限制仅仅是对我们这个例子来说。通常，卷积被定义在满足', 'time': '2017-01-12T08:43'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络\\n', 'origin_text': '述积分式的任意函数上，并且也可能被用于加权平均以外的目的。在  !!!卷积神经网络!!!  的术语中，第一个参数（在这个例子中，函数xxx）叫做输入，第二个', 'time': '2017-01-12T08:48'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积的第一个参数（在这个例子中，函数$x$）叫做输入', 'origin_text': '并且也可能被用于加权平均以外的目的。在卷积神经网络的术语中，  !!!第一个参数（在这个例子中，函数xxx）叫做输入!!!  ，第二个参数（函数www）叫做核函数。输出有时被称作特征映射。', 'time': '2017-01-12T08:54'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '激光传感器在每个瞬间反馈测量结果的想法是不切实际的', 'origin_text': '）叫做核函数。输出有时被称作特征映射。在我们的例子中，  !!!激光传感器能够在任意时刻给出测量结果的想法是不现实的!!!  。一般地，当我们用计算机处理数据时，时间会被离散化，传感器会给', 'time': '2017-01-12T16:44'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '传感器会在定期地反馈数据', 'origin_text': '是不现实的。一般地，当我们用计算机处理数据时，时间会被离散化，  !!!传感器会给出特定时间间隔的数据!!!  。所以比较现实的的假设是传感器每秒给出一次测量结果，这样，时间', 'time': '2017-01-12T16:45'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '所以在我们的例子中，假设传感器每一秒反馈一次测量结果是比较现实的。', 'origin_text': '机处理数据时，时间会被离散化，传感器会给出特定时间间隔的数据。  !!!所以比较现实的的假设是传感器每秒给出一次测量结果，!!!  这样，时间ttt只能取整数值。如果我们假设xxx和www都定义', 'time': '2017-01-12T16:49'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '时刻', 'origin_text': '数据。所以比较现实的的假设是传感器每秒给出一次测量结果，这样，  !!!时间!!!  ttt只能取整数值。如果我们假设xxx和www都定义在整数时刻', 'time': '2017-01-12T16:54'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这些高维数组', 'origin_text': '入通常是高维数据数组，而核也是由算法产生的高维参数数组。我们把  !!!这种高维数组!!!  叫做张量。因为输入与核的每一个元素都分开存储，我们经常假设在存', 'time': '2017-01-12T17:08'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '通常', 'origin_text': '这种高维数组叫做张量。因为输入与核的每一个元素都分开存储，我们  !!!经常!!!  假设在存储了数据的有限点集以外，这些函数的值都为零。这意味着在', 'time': '2017-01-12T17:17'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '我们有时在多个维度上进行卷积运算', 'origin_text': '可以统一地把无限的求和当作对有限个数组元素的求和来用。最后，  !!!我们有时对多个维度进行卷积运算!!!  。例如，如果把二维的图像III作为输入，我们也相应的需要使用二', 'time': '2017-01-12T17:27'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '我们可以通过对有限个数组元素的求和来实现无限求和', 'origin_text': '数据的有限点集以外，这些函数的值都为零。这意味着在实际操作中，  !!!我们可以统一地把无限的求和当作对有限个数组元素的求和来用!!!  。最后，我们有时对多个维度进行卷积运算。例如，如果把二维的', 'time': '2017-01-12T17:27'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '如果把一张二维的图像$I$作为输入', 'origin_text': '素的求和来用。最后，我们有时对多个维度进行卷积运算。例如，  !!!如果把二维的图像III作为输入!!!  ，我们也相应的需要使用二维的核KKK：S(i,j)=(I∗K)', 'time': '2017-01-12T17:27'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '我们也许也需要使用一个二维的核$K$', 'origin_text': '对多个维度进行卷积运算。例如，如果把二维的图像III作为输入，  !!!我们也相应的需要使用二维的核K!!!  KK：S(i,j)=(I∗K)(i,j)=∑m∑nI(m,n)', 'time': '2017-01-12T17:29'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '实现更为直接', 'origin_text': '\\\\end{equation}通常，下面的公式在机器学习库中  !!!更方便应用!!!  ，因为它在mmm和nnn的有效范围内变化更少。%（这是为什么？）', 'time': '2017-01-12T17:32'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '因为$m$和$n$的有效取值范围更加小', 'origin_text': 'equation}通常，下面的公式在机器学习库中更方便应用，  !!!因为它在mmm和nnn的有效范围内变化更少!!!  。%（这是为什么？）卷积运算可交换性的出现是因为我们相对', 'time': '2017-01-12T17:35'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '我们将核相对于输入进行了翻转', 'origin_text': '变化更少。%（这是为什么？）卷积运算可交换性的出现是因为  !!!我们相对输入翻转了核!!!  ，这意味着当mmm增大时，输入的索引增大，但核的索引相应的减小。', 'time': '2017-01-12T17:37'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '多维数组的数据', 'origin_text': '\\\\end{equation}在机器学习的应用中，输入通常是  !!!高维数据数组!!!  ，而核也是由算法产生的高维参数数组。我们把这种高维数组叫做张量', 'time': '2017-01-12T17:37'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '就可以定义', 'origin_text': '取整数值。如果我们假设xxx和www都定义在整数时刻ttt上，  !!!就得到了!!!  离散形式的卷积：s(t)=(x∗w)(t)=∑a=−∞∞x(a', 'time': '2017-01-12T17:37'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '而核通常是由学习算法优化得到的多维数组的参数', 'origin_text': 'quation}在机器学习的应用中，输入通常是高维数据数组，  !!!而核也是由算法产生的高维参数数组!!!  。我们把这种高维数组叫做张量。因为输入与核的每一个元素都分开', 'time': '2017-01-12T17:37'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '因为在输入与核中的每一个元素都必须是明确分开存储的', 'origin_text': '核也是由算法产生的高维参数数组。我们把这种高维数组叫做张量。  !!!因为输入与核的每一个元素都分开存储!!!  ，我们经常假设在存储了数据的有限点集以外，这些函数的值都为零。', 'time': '2017-01-12T17:37'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '从$m$的取值增大的意义上而言，输入的数据索引在增大，但是核的数据索引在减小', 'origin_text': '么？）卷积运算可交换性的出现是因为我们相对输入翻转了核，  !!!这意味着当mmm增大时，输入的索引增大，但核的索引相应的减小!!!  。翻转核的唯一目的就是为了得到可交换性。尽管可交换性在证明时', 'time': '2017-01-13T17:28'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '我们将核翻转的唯一原因只是为了可以得到可交换的性质', 'origin_text': '这意味着当mmm增大时，输入的索引增大，但核的索引相应的减小。  !!!翻转核的唯一目的就是为了得到可交换性!!!  。尽管可交换性在证明时很有用，但在神经网络的应用中却不是一个重', 'time': '2017-01-13T17:29'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '对核并没有进行翻转', 'origin_text': '络库会实现一个相关的函数，称为互相关函数，和卷积运算几乎一样但是  !!!并不翻转核!!!  ：S(i,j)=(I∗K)(i,j)=∑m∑nI(i+m,j+', 'time': '2017-01-13T17:50'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '应用互相关函数但称之为卷积', 'origin_text': 'K(m, n).\\\\end{equation}许多机器学习的库  !!!使用互相关函数但是叫它卷积!!!  。在这本书中我们遵循把两种运算都叫做卷积的这个传统，只有在用到', 'time': '2017-01-13T17:51'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '在与核翻转有关的上下文中，我们会特别指出是否对核进行了翻转', 'origin_text': '是叫它卷积。在这本书中我们遵循把两种运算都叫做卷积的这个传统，  !!!只有在用到核的翻转时才会在上下文中特别指明区别!!!  。在机器学习中，学习算法会在核合适的位置学得恰当的值， 所以一', 'time': '2017-01-14T15:30'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '对核进行了翻转', 'origin_text': '学习中是很少见的，卷积经常和其他的函数一起使用，无论卷积运算是否  !!!翻转了它的核!!!  ，这些函数的组合通常是不可交换的。图\\\\?演示了一个在2维张量', 'time': '2017-01-14T15:40'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '矩阵每一行中元素都与上一行对应位置平移一个单位的元素相同', 'origin_text': '些元素被限制为必须和另一些元素相等。例如对于单变量的离散卷积，  !!!矩阵的每一行都必须和上一行移动一个元素后相等!!!  。这种矩阵叫做Toeplitz矩阵。对于二维情况，卷积对应着', 'time': '2017-01-14T15:54'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '一个几乎所有元素都为零的矩阵', 'origin_text': '除了这些元素相等的限制以外，卷积通常对应着一个非常稀疏的矩阵（  !!!几乎所有的元素都为零!!!  ）。这是因为核通常要远小于输入的图像。任何一个使用矩阵乘法但是', 'time': '2017-01-14T16:04'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '分块循环矩阵', 'origin_text': '矩阵叫做Toeplitz矩阵。对于二维情况，卷积对应着一个双重  !!!块循环矩阵!!!  。除了这些元素相等的限制以外，卷积通常对应着一个非常稀疏的矩阵', 'time': '2017-01-14T16:04'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '核的大小', 'origin_text': '通常对应着一个非常稀疏的矩阵（几乎所有的元素都为零）。这是因为  !!!核!!!  通常要远小于输入的图像。任何一个使用矩阵乘法但是并不依赖矩阵结构', 'time': '2017-01-14T16:05'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '输入图像的大小', 'origin_text': '非常稀疏的矩阵（几乎所有的元素都为零）。这是因为核通常要远小于  !!!输入的图像!!!  。任何一个使用矩阵乘法但是并不依赖矩阵结构的特殊性质的神经网络算', 'time': '2017-01-14T16:06'}\n{'user': 'acct:corenel@hypothes.is', 'text': '已经被用于读取美国10％以上的支票', 'origin_text': '票的卷积网络{cite?}。到90年代末，NEC部署的这个系统  !!!用于读取美国所有支票的10％以上!!!  。后来，微软部署了若干个基于卷积网络的OCR和手写识别系统{c', 'time': '2017-01-15T10:42'}\n{'user': 'acct:corenel@hypothes.is', 'text': '也被用作在许多比赛中的取胜手段。', 'origin_text': '以前的更为深入的卷积网络历史可以参见{cite?}。卷积网络  !!!也被用来赢得许多比赛!!!  。当前对深度学习的商业兴趣的热度始于{Krizhevsky-2', 'time': '2017-01-15T10:44'}\n{'user': 'acct:corenel@hypothes.is', 'text': '但是卷积网络也已经被用于前些年影响较小的其他机器学习和计算机视觉竞赛中获胜。', 'origin_text': 'ky-2012-small}赢得了ImageNet对象识别挑战，  !!!但是卷积网络已经被用于赢得其他机器学习和计算机视觉竞赛了，这些比赛在几年前影响较小。!!!  卷积网络是用反向传播训练的第一个有效的深度网络之一。现', 'time': '2017-01-15T10:45'}\n{'user': 'acct:corenel@hypothes.is', 'text': '接受', 'origin_text': '在许多方面，它们为余下的深度学习传递火炬，并为一般的神经网络被  !!!接收!!!  铺平了道路。卷积网络提供了一种方法来专业化神经网络，以处理具', 'time': '2017-01-15T10:48'}\n{'user': 'acct:corenel@hypothes.is', 'text': '特化', 'origin_text': '并为一般的神经网络被接收铺平了道路。卷积网络提供了一种方法来  !!!专业化!!!  神经网络，以处理具有清楚的网格结构拓扑的数据，以及将这样的模型放', 'time': '2017-01-15T10:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使其能够', 'origin_text': '络被接收铺平了道路。卷积网络提供了一种方法来专业化神经网络，  !!!以!!!  处理具有清楚的网格结构拓扑的数据，以及将这样的模型放大到非常大的', 'time': '2017-01-15T10:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '特化', 'origin_text': '为了处理一维序列数据，我们接下来转向神经网络框架的另一种强大的  !!!专业化!!!  ：循环神经网络。                 ', 'time': '2017-01-15T10:49'}\n{'user': 'acct:corenel@hypothes.is', 'text': '使得它们能够与位于网络结构顶层的分类层相互独立地确定', 'origin_text': '第\\\\?部分描述了更多的无监督学习方法。使用无监督标准学习特征，  !!!允许它们的确定与位于网络结构顶层的分类层相分离!!!  。然后只需提取一次全部训练集的特征，构造用于最后一层的新训练集', 'time': '2017-01-15T10:56'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '传统的神经网络通过一个参数矩阵和另一个参数的矩阵乘法运算来描述每一个输入和每一个输出单元之间的交互。', 'origin_text': '了一种处理大小可变的输入的方法。我们下面依次介绍这些思想。  !!!传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。其中，参数矩阵的每一个独立的参数都描述了每一个输入单元与每一个输出单元间的交互。这意味着每一个输出单元与每一个输入单元都产生交互。!!!  然而，卷积神经网络具有稀疏交互（也叫做稀疏连接或者稀疏权重）的特', 'time': '2017-01-16T14:53'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这是使核的规模远小于输入的规模来达到的。', 'origin_text': '卷积神经网络具有稀疏交互（也叫做稀疏连接或者稀疏权重）的特征。  !!!这通过使得核的规模远小于输入的规模来实现!!!  。举个例子，当进行图像处理时，输入的图像可能包含百万个像素点，', 'time': '2017-01-16T15:06'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '当处理一张图像的时候', 'origin_text': '的特征。这通过使得核的规模远小于输入的规模来实现。举个例子，  !!!当进行图像处理时!!!  ，输入的图像可能包含百万个像素点，但是我们可以通过只占用几十到上', 'time': '2017-01-16T15:08'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '数千或数百万个', 'origin_text': '入的规模来实现。举个例子，当进行图像处理时，输入的图像可能包含  !!!百万个!!!  像素点，但是我们可以通过只占用几十到上百个像素点的核来探测一些小', 'time': '2017-01-16T15:14'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '小于', 'origin_text': 'mes n)的运行时间。在很多应用方面，只需保持kkk的数量级  !!!远小于!!!  mmm，就能在机器学习的任务中取得好的表现。稀疏连接的图形化解', 'time': '2017-01-16T16:42'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '处在网络深层的单元可能与绝大部分的输入是间接连接的', 'origin_text': '稀疏连接的图形化解释如图\\\\?和图\\\\?所示。在深度卷积网络中，  !!!处在深层的单元可能\\\\emph{不直接}地与绝大部分输入连接!!!  ，如图\\\\?所示。这允许网络可以通过只描述稀疏交互的基石来高效地', 'time': '2017-01-16T16:51'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '设计决策', 'origin_text': '作用在输入的每一位置上（除了一些可能的边界像素，取决于对于边界的  !!!决策设计!!!  ）。卷积运算中的参数共享保证了我们只需要学习一个参数集合，而不', 'time': '2017-01-16T17:10'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '可能遇见的一些边界像素', 'origin_text': '在卷积神经网络中，核的每一个元素都作用在输入的每一位置上（除了  !!!一些可能的边界像素!!!  ，取决于对于边界的决策设计）。卷积运算中的参数共享保证了我们只', 'time': '2017-01-16T17:11'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '并且$k$比$m$要小很多个数量级', 'origin_text': 'imes n)），但它显著地把模型的存储需求降低至kkk个参数，  !!!并且kkk通常是远小于mmm的数量级!!!  。因为mmm 和nnn通常规模很接近，kkk在实际中相对于m×', 'time': '2017-01-16T17:16'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '$k$的大小', 'origin_text': '常是远小于mmm的数量级。因为mmm 和nnn通常规模很接近，  !!!kkk!!!  在实际中相对于m×nm×nm\\\\times n是很小的。因此，卷', 'time': '2017-01-16T17:17'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '通常$m$和$n$有着大致相同的规模', 'origin_text': '需求降低至kkk个参数，并且kkk通常是远小于mmm的数量级。  !!!因为mmm 和nnn通常规模很接近!!!  ，kkk在实际中相对于m×nm×nm\\\\times n是很小的。', 'time': '2017-01-16T17:20'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '稀疏连接和参数共享是如何显著提高线性函数在一张图像上进行边缘检测的效率', 'origin_text': 'igure}作为前两条原则的一个实际例子，图\\\\?说明了  !!!稀疏连接和参数共享是如何显著地提高用于图像边缘检测的线性函数的效率的!!!  。\\\\begin{figure}\\\\ifOpenSource\\\\c', 'time': '2017-01-16T17:30'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '能够使得输入平移的任意函数', 'origin_text': 'f(x)对于变换ggg具有等变性。对于卷积来说，如果令ggg是  !!!输入的任意平移函数!!!  ，那么卷积函数对于ggg具有等变性。举个例子，令III表示图像', 'time': '2017-01-16T17:36'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '是表示图像在整数坐标上亮度的函数', 'origin_text': '平移函数，那么卷积函数对于ggg具有等变性。举个例子，令III  !!!表示图像的明亮度函数（取值为整数）!!!  ，ggg表示图像函数的变换函数（把一个图像函数映射到另一个图像函', 'time': '2017-01-16T17:40'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '其中图像函数满足', 'origin_text': '函数的函数）使得I′=g(I)I′=g(I)I’ = g(I)，  !!!其中!!!  I′(x,y)=I(x−1,y)I′(x,y)=I(x−1,y)', 'time': '2017-01-16T17:44'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '一个单位', 'origin_text': ' = I(x-1, y)。这个函数把III中的每个像素向右移动  !!!一格!!!  。如果我们先对III进行这种变换然后进行卷积操作所得到的结果，', 'time': '2017-01-16T17:44'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这意味着通过卷积可以得到一个由输入中出现不同特征的时刻所组成的时间轴', 'origin_text': '此处误写成了I′I′I’。} 。%译者注当处理时间序列数据时，  !!!卷积产生一条用来表明输入中出现不同特征的某种时间轴!!!  。如果我们把输入中的一个事件向后延时，在输出中也会有完全相同的', 'time': '2017-01-17T03:37'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '延后', 'origin_text': '输入中的一个事件向后延时，在输出中也会有完全相同的表示，只是时间  !!!延时!!!  了。图像与之类似，卷积产生了一个2维映射来表明某种属性在输入的', 'time': '2017-01-17T03:53'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '某些特征在输入中出现的位置', 'origin_text': '示，只是时间延时了。图像与之类似，卷积产生了一个2维映射来表明  !!!某种属性在输入的什么位置出现了!!!  。如果我们移动输入中的对象，它的表示也会在输出中移动同样的量。', 'time': '2017-01-17T04:40'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络', 'origin_text': '置时，一些作用在邻居像素的函数是很有用的。例如在处理图像时，在  !!!卷积神经网络!!!  的第一层进行图像的边缘检测是很有用的。相同的边缘或多或少地散落', 'time': '2017-01-17T04:48'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '例如，我们在处理已经通过剪裁居中的人脸图像，我们可能想要提取不同位置上的不同特征', 'origin_text': '参数共享。但在某些情况下，我们并不希望对整幅图进行参数共享。  !!!例如当我们在处理人脸图像（图像已经被剪裁成人脸在中心）时，我们可能会希望在不同的部位探测出不同的特征!!!  （处理人脸上部的网络需要去搜寻眉毛，处理人脸下部的网络就需要去搜', 'time': '2017-01-17T04:55'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '一个图像尺度和旋转的变化', 'origin_text': '搜寻下巴了）。卷积对其他的一些变换并不是天然等变的，例如  !!!对于图像尺度或者角度的变换!!!  ，需要其他的一些机制来处理这些变换。最后，一些不能被传统的由', 'time': '2017-01-17T05:00'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '有一些数据并不能由固定大小的矩阵乘法定义的神经网络来处理，但是卷积可以处理这些数据。', 'origin_text': '尺度或者角度的变换，需要其他的一些机制来处理这些变换。最后，  !!!一些不能被传统的由（固定大小的）矩阵乘法定义的神经网络处理的特殊数据，可能通过卷积神经网络来处理!!!  ，我们将在\\\\?节中进行讨论。池化卷积神经网络的卷积层通常', 'time': '2017-01-17T05:04'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络中一个典型的层包含三级', 'origin_text': '能通过卷积神经网络来处理，我们将在\\\\?节中进行讨论。池化  !!!卷积神经网络的卷积层通常包含三级!!!  （如图\\\\?所示）。在第一级中，卷积层并行地进行多个卷积运算来产', 'time': '2017-01-17T05:07'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这一层并行地计算多个卷积生成一组线性激活响应', 'origin_text': '卷积神经网络的卷积层通常包含三级（如图\\\\?所示）。在第一级中，  !!!卷积层并行地进行多个卷积运算来产生一组线性激活函数!!!  。在第二级中，非线性的激活函数如整流线性单元函数等作用在第一级', 'time': '2017-01-17T05:10'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '每一个线性激活响应将会通过一个非线性的激活函数，例如修正线性激活函数', 'origin_text': '积层并行地进行多个卷积运算来产生一组线性激活函数。在第二级中，  !!!非线性的激活函数如整流线性单元函数等作用在第一级中的每一个线性输出上!!!  。这一级有时也被称为探测级。在第三级中，我们使用池化函数来更', 'time': '2017-01-17T05:14'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这一层的输出', 'origin_text': '时也被称为探测级。在第三级中，我们使用池化函数来更进一步地调整  !!!卷积层的输出!!!  。\\\\begin{figure}[!htb]\\\\ifOpenSo', 'time': '2017-01-17T05:19'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '在所有的情况中', 'origin_text': 'L2L2L^2范数以及依靠据中心像素距离的加权平均函数。  !!!不管采用什么样的池化函数!!!  ，当输入作出少量平移时，池化能帮助我们的表示近似不变。对于平移', 'time': '2017-01-17T05:19'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '输出的表征', 'origin_text': '不管采用什么样的池化函数，当输入作出少量平移时，池化能帮助  !!!我们的表示!!!  近似不变。对于平移的不变性是说当我们把输入平移一微小的量，大多', 'time': '2017-01-20T05:54'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '平移的不变性是指', 'origin_text': '池化函数，当输入作出少量平移时，池化能帮助我们的表示近似不变。  !!!对于平移的不变性是说!!!  当我们把输入平移一微小的量，大多数通过池化函数的输出值并不会发生', 'time': '2017-01-20T05:57'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '输入进行少量的平移', 'origin_text': '时，池化能帮助我们的表示近似不变。对于平移的不变性是说当我们把  !!!输入平移一微小的量!!!  ，大多数通过池化函数的输出值并不会发生改变。图\\\\?用了一个例子', 'time': '2017-01-20T05:58'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '经过池化函数后的大多数输出并不会发生改变', 'origin_text': '表示近似不变。对于平移的不变性是说当我们把输入平移一微小的量，  !!!大多数通过池化函数的输出值并不会发生改变!!!  。图\\\\?用了一个例子来说明这是如何实现的。\\\\emph{局部平', 'time': '2017-01-20T06:06'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '很有用', 'origin_text': '一个例子来说明这是如何实现的。\\\\emph{局部平移不变性是一个  !!!很重要!!!  的性质，尤其是当我们关心某个特征是否出现而不关心它出现的具体位置', 'time': '2017-01-20T06:14'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '网络', 'origin_text': 'figure}使用池化可以看作是增加了一个无限强的先验：  !!!卷积!!!  层学得的函数必须具有对少量平移的不变性。当这个假设成立时，池化', 'time': '2017-01-20T07:06'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '关于这一层输入大小的函数', 'origin_text': '算效率，因为下一层少了约kkk 倍的输入。当下一层的参数数目是  !!!其输入大小的函数!!!  时（例如当下一层是全连接的依赖矩阵乘法的网络层时），这种对于输入', 'time': '2017-01-20T07:41'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '将特征一起动态地池化', 'origin_text': '在不同情况下应当使用哪种池化函数给出了一些指导{cite?}。  !!!动态地把特征池化在一起!!!  也是可行的，例如，通过针对特定属性的位置运行聚类算法{cite?', 'time': '2017-01-28T06:56'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '对于感兴趣特征的位置进行聚类算法', 'origin_text': '些指导{cite?}。动态地把特征池化在一起也是可行的，例如，  !!!通过针对特定属性的位置运行聚类算法!!!  {cite?}。这种方法对于每幅图像产生一个不同的池化区域集合', 'time': '2017-01-20T07:55'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这个先验也要求除了那些处在隐藏单元所在的小的空间连续的感受野的权值外', 'origin_text': '是说一个隐藏单元的权值必须和它邻居的权值相等，但在空间中改变。  !!!这个先验也要求除了那些处在隐藏单元空间连续的小的接收域以内的权值外!!!  ，其余的权值都为零。%这样翻译对吗？其实这里加个图更好总之，我', 'time': '2017-01-20T08:24'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '由多个并行的卷积运算组成', 'origin_text': '们提到神经网络中的卷积时，我们通常是指一次特定的运算，而这种运算  !!!包含了并行地使用多个卷积!!!  。这是因为带有单个核的卷积只能提取一种类型的特征，尽管它作用在', 'time': '2017-01-20T12:13'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '强度', 'origin_text': '的网格。例如，一幅彩色图像在每一个像素点都会有红绿蓝三种颜色的  !!!亮度!!!  。在多层的卷积神经网络中，第二层的输入是第一层的输出，通常在每', 'time': '2017-01-20T13:09'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络', 'origin_text': '一幅彩色图像在每一个像素点都会有红绿蓝三种颜色的亮度。在多层的  !!!卷积神经网络!!!  中，第二层的输入是第一层的输出，通常在每个位置包含多个卷积的输出', 'time': '2017-01-20T13:10'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '通道$i$的一个输出单元与通道$j$的一个输入单元之间的连接强度', 'origin_text': 'extsf{K}i,j,k,l\\\\TEK_{i,j,k,l}，表示  !!!输出的处于通道iii中的一个单元和输入的处于通道jjj中的一个单元的连接强度!!!  ，并且在输出单元和输入单元之间有一个kkk行lll列的偏置。假', 'time': '2017-01-20T13:34'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '全卷积', 'origin_text': '的代价是提取特征没有先前那么好了）。我们可以把这一过程看作是对  !!!卷积!!!  函数输出的下采样(downsampling)。如果我们只想对输', 'time': '2017-01-20T13:48'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '在输出的每个方向上每间隔$s$个像素进行采样', 'origin_text': '卷积函数输出的下采样(downsampling)。如果我们只想  !!!对输出的每个方向上的sss个像素进行采样!!!  ，那么我们可以定义一个下采样卷积函数ccc使得\\\\begin{e', 'time': '2017-01-20T13:50'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '卷积网络', 'origin_text': '它计算了许多将被丢弃的值。}\\\\end{figure}在任何  !!!卷积神经网络!!!  的应用中都有一个重要性质，那就是能够隐含地对输入\\\\𝗍𝖾𝗑�', 'time': '2017-01-20T13:59'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '实现', 'origin_text': '被丢弃的值。}\\\\end{figure}在任何卷积神经网络的  !!!应用!!!  中都有一个重要性质，那就是能够隐含地对输入\\\\𝗍𝖾𝗑𝗍𝖻', 'time': '2017-01-20T13:59'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '表征', 'origin_text': '}\\\\TSV用零进行填充(pad)使得它加宽。如果没有这个性质，  !!!表示!!!  的宽度在每一层就会缩减，缩减的幅度是比核少一个像素这么多。对输', 'time': '2017-01-20T14:23'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '的术语中', 'origin_text': '核只允许访问那些图像中能够完全包含整个核的位置。在MATLAB  !!!中!!!  ，这称为有效卷积。在这种情况下，输出的所有像素都是输入中相同数', 'time': '2017-01-20T16:18'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '我们并不真正想用卷积', 'origin_text': '效卷积”和”相同卷积”之间的某个位置。在一些情况下，  !!!我们并不一定真正想用卷积!!!  ，而只是用一些局部连接的网络层{cite?}。在这种情况下，我', 'time': '2017-01-24T12:42'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '并且相同的特征不会出现在所有的空间上', 'origin_text': 'figure}当我们知道每一个特征都是一小部分空间的函数  !!!而不是整个空间的特征时!!!  ，局部连接层是很有用的。例如，如果我们想要辨别一张图片是否是人', 'time': '2017-01-24T14:07'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '下半部分', 'origin_text': '想要辨别一张图片是否是人脸图像时，我们只需要去寻找嘴是否在图像的  !!!下部中央部分!!!  即可。使用那些连接被更进一步限制的卷积或者局部连接层也是有用', 'time': '2017-01-25T06:34'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '平铺', 'origin_text': '通道只和随后的两个输入通道相连。}\\\\end{figure}  !!!拼贴!!!  卷积{cite?}对卷积层和局部连接层进行了折衷。%这里翻译成啥', 'time': '2017-01-25T07:19'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '平铺', 'origin_text': '合的大小，而不是整个输出的特征映射的大小。图\\\\?对局部连接层、  !!!拼贴!!!  卷积和标准卷积进行了比较。\\\\begin{figure}[!h', 'time': '2017-01-25T07:19'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '平铺', 'origin_text': 'b”的边的核。}\\\\end{figure}为了代数地定义  !!!拼贴!!!  卷积，令\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖪}\\\\textbf{K}\\\\', 'time': '2017-01-25T07:20'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '为了用代数的方法定义平铺卷积', 'origin_text': '记为”a”和”b”的边的核。}\\\\end{figure}  !!!为了代数地定义拼贴卷积!!!  ，令\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖪}\\\\textbf{K}\\\\TS', 'time': '2017-01-25T07:25'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '各自', 'origin_text': '中的两维对应着输出映射中的不同位置。%译者注我们这里并不是使用  !!!分别!!!  的索引来表示输出映射中的每一个位置，输出的位置在每个方向上在tt', 'time': '2017-01-25T07:48'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '推广', 'origin_text': ' 1等等。在每一维上使用不同的ttt可以很直观地对这个方程进行  !!!扩展!!!  。%这里需要重新理解一下局部连接层与拼贴卷积层都和最', 'time': '2017-01-25T08:01'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '平铺', 'origin_text': '这个方程进行扩展。%这里需要重新理解一下局部连接层与  !!!拼贴!!!  卷积层都和最大池化有一些有趣的关联：这些层的探测单元都是由不同的', 'time': '2017-01-25T08:02'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '滤波器', 'origin_text': '卷积层都和最大池化有一些有趣的关联：这些层的探测单元都是由不同的  !!!过滤器!!!  驱动的。如果这些过滤器能够学会探测相同隐含特征的不同变换形式，', 'time': '2017-01-25T08:03'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '其中包含', 'origin_text': '矩阵乘法的形式（如果我们首先把输入张量变形为一个扁平的向量）。  !!!涉及到!!!  的矩阵是卷积核的函数。这个矩阵是稀疏的并且核的每个元素都复制给', 'time': '2017-01-25T08:17'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '是关于', 'origin_text': '式（如果我们首先把输入张量变形为一个扁平的向量）。涉及到的矩阵  !!!是!!!  卷积核的函数。这个矩阵是稀疏的并且核的每个元素都复制给矩阵的很', 'time': '2017-01-25T08:17'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '矩阵中的多个元素', 'origin_text': '的矩阵是卷积核的函数。这个矩阵是稀疏的并且核的每个元素都复制给  !!!矩阵的很多个元素!!!  。这种观点能够帮助我们导出卷积神经网络需要的很多其他运算。', 'time': '2017-01-25T08:50'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '在转置运算与前向传播相协调的过程中必须非常小心', 'origin_text': '来实现，但在一般情况下需要用到第三种运算来实现。%这里不是很懂  !!!必须非常小心地来使这种转置运算和前向传播过程相协调!!!  。转置运算返回的输出的大小取决于三个方面：零填充的策略、前向传', 'time': '2017-01-25T08:59'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '相同形式', 'origin_text': '和\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖹}\\\\textbf{Z}\\\\TSZ  !!!相同格式!!!  的隐藏单元\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖧}\\\\textbf{H}', 'time': '2017-01-25T09:27'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '这可以通过', 'origin_text': '𝖾𝗑𝗍𝖻𝖿{𝖪}\\\\textbf{K}\\\\TSK的梯度，  !!!通过!!!  g(\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖧},\\\\𝗍𝖾𝗑𝗍𝖻�', 'time': '2017-01-25T09:28'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '获取', 'origin_text': '},\\\\textbf{E},s)g(\\\\TSH, \\\\TSE, s)来  !!!得到!!!  。为了训练编码器，我们需要获得对于\\\\𝗍𝖾𝗑𝗍𝖻𝖿{', 'time': '2017-01-25T09:29'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '通过用c和h对g求微分也是可行的', 'origin_text': 'extbf{E},s)c(\\\\TSK, \\\\TSE, s)来得到。  !!!也可能通过用ccc和hhh对ggg求微分得到!!!  ，但这些运算对于任何标准神经网络上的反向传播算法来说都是不需要的', 'time': '2017-01-25T09:31'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '平铺', 'origin_text': '题。对于局部连接层，很自然地对每个单元都给定它特有的偏置，对于  !!!拼贴!!!  卷积，也很自然地用与核一样的拼贴模式来共享参数。对于卷积层来说', 'time': '2017-01-25T09:33'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '处于相同平铺模式下的核所对应的偏置之间共享参数', 'origin_text': '，很自然地对每个单元都给定它特有的偏置，对于拼贴卷积，也很自然地  !!!用与核一样的拼贴模式!!!  来共享参数。对于卷积层来说，通常的做法是在输出的每一个通道上都', 'time': '2017-01-25T09:35'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '问题规模', 'origin_text': '信号的逐点相乘，并使用Fourier逆变换转换回时域。对于某些  !!!问题大小!!!  ，这可能比离散型卷积的朴素实现更快。当一个ddd维的核可以表', 'time': '2017-01-28T06:57'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '每一维一个向量', 'origin_text': '积的朴素实现更快。当一个ddd维的核可以表示成ddd个向量（  !!!每维一个向量!!!  ）的外积时，该核称为可分离的。当核可分离时，朴素的卷积是低效的', 'time': '2017-01-29T15:17'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '当核是可分离的时候', 'origin_text': '表示成ddd个向量（每维一个向量）的外积时，该核称为可分离的。  !!!当核可分离时!!!  ，朴素的卷积是低效的。它等价于组合ddd个一维卷积，每个卷积使', 'time': '2017-01-29T15:19'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '并且核也只要更少的参数来表示成向量', 'origin_text': '个。组合方法显著快于使用它们的外积来执行一个ddd维的卷积。  !!!并且核也需要更少的参数表示为向量!!!  。如果核在每一维都是www个元素宽，那么朴素的多维卷积需要O(', 'time': '2017-01-29T15:39'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '不是由有监督方式训练得到的特征', 'origin_text': '反向传播通过整个网络。减少卷积网络训练成本的一种方式是使用那些  !!!不是通过有监督方式训练的特征!!!  。有三种基本策略不通过有监督训练而得到卷积核。其中一个是简', 'time': '2017-01-29T16:33'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '可以不通过', 'origin_text': '种方式是使用那些不是通过有监督方式训练的特征。有三种基本策略  !!!不通过!!!  有监督训练而得到卷积核。其中一个是简单地随机初始化它们。另一', 'time': '2017-01-29T16:40'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '滤波器', 'origin_text': '辑回归或者SVM，那么学习最后一层通常是凸优化问题。随机  !!!过滤器!!!  经常在卷积网络中表现得出乎意料得好{Jarrett-ICCV20', 'time': '2017-01-30T05:22'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '代替', 'origin_text': '网络为我们提供了相对于多层感知机更进一步采用预训练策略的机会。  !!!不是!!!  一次训练整个卷积层，我们可以训练一小块模型，就像{Coates2', 'time': '2017-01-30T06:08'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '感受野', 'origin_text': '单细胞。简单细胞的活动在某种程度上可以概括为在一个小的空间位置  !!!接受域内!!!  的图像的线性函数。卷积网络的检测器单元被设计为模拟简单细胞的这', 'time': '2017-01-31T13:56'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '其他神经元会对Bill Clinton, Jennifer Ansion等人的出现作出响应', 'origin_text': '，这个神经元会触发。当然，这与Halle Berry自己无关；  !!!其他神经元响应Bill Clinton，Jennifer Aniston等的出现!!!  。这些内侧颞叶神经元比现代卷积网络更通用，它们在读取名称', 'time': '2017-01-31T15:06'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '在手臂长度距离内一块拇指大小的区域', 'origin_text': '部分是非常低的分辨率，除了一个被称为中央凹的小块。中央凹仅观察  !!!保持在手臂长度的拇指大小的区域!!!  。虽然我们觉得我们可以看到高分辨率的整个场景，但这是由我们的大', 'time': '2017-02-04T11:02'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '滤波器', 'origin_text': '用非常不同的激活和池化函数。单个神经元的激活可能不能用单个线性  !!!过滤器!!!  的响应来很好地表征。最近的V1模型涉及对每个神经元的多个二次过', 'time': '2017-02-05T04:40'}\n{'user': 'acct:zhiding@hypothes.is', 'text': '物体', 'origin_text': 'rizhevsky-2012-small}赢得了ImageNet  !!!对象!!!  识别挑战，但是卷积网络已经被用于赢得其他机器学习和计算机视觉竞赛', 'time': '2017-02-05T17:52'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '基准', 'origin_text': '一些指导。对于卷积网络结构的研究进展得如此迅速，以至于针对特定  !!!问题!!!  ，数月甚至几周就会产生一个新的最优的网络结构，甚至在写这本书时也', 'time': '2017-02-11T10:43'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '逐步', 'origin_text': '竟哪种结构是最好的。然而，最好的结构也是由本章所描述的基本部件  !!!一点一点!!!  搭建起来的。卷积运算在通常形式中，卷积是对两个实值函', 'time': '2017-02-11T10:45'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '实参', 'origin_text': '点一点搭建起来的。卷积运算在通常形式中，卷积是对两个  !!!实值函数!!!  的一种数学运算。为了给出卷积的定义，我们从两个可能会用到的函数', 'time': '2017-02-11T10:47'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '受到一定程度的噪声干扰', 'origin_text': '可以在任意时刻从传感器中读出飞船的位置。现在假设我们的传感器  !!!含有噪声!!!  。为了得到飞船位置的低噪声估计，我们对得到的测量结果进行平均。', 'time': '2017-02-11T10:51'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '预测到', 'origin_text': '再是一个加权平均。另外，www在参数为负值时必须为0，否则它会  !!!涉及到!!!  未来，这不是我们能够做到的。但这些限制仅仅是对我们这个例子来说', 'time': '2017-02-11T11:01'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '本例', 'origin_text': '数（函数www）叫做核函数。输出有时被称作特征映射。在  !!!我们的例子!!!  中，激光传感器能够在任意时刻给出测量结果的想法是不现实的。一般', 'time': '2017-02-11T11:05'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '经常', 'origin_text': '统一地把无限的求和当作对有限个数组元素的求和来用。最后，我们  !!!有时!!!  对多个维度进行卷积运算。例如，如果把二维的图像III作为输入，', 'time': '2017-02-11T11:14'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '机器学习的上下文中', 'origin_text': '的这个传统，只有在用到核的翻转时才会在上下文中特别指明区别。在  !!!机器学习!!!  中，学习算法会在核合适的位置学得恰当的值， 所以一个基于核翻转的', 'time': '2017-02-18T09:48'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '成千上万', 'origin_text': '入的规模来实现。举个例子，当进行图像处理时，输入的图像可能包含  !!!百万个!!!  像素点，但是我们可以通过只占用几十到上百个像素点的核来探测一些小', 'time': '2017-02-18T11:01'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '时间复杂度', 'origin_text': ' n个参数以及O(k×n)O(k×n)O(k\\\\times n)的  !!!运行时间!!!  。在很多应用方面，只需保持kkk的数量级远小于mmm，就能在机', 'time': '2017-02-18T11:06'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '实际应用中', 'origin_text': 'k×n)O(k×n)O(k\\\\times n)的运行时间。在很多  !!!应用方面!!!  ，只需保持kkk的数量级远小于mmm，就能在机器学习的任务中取得', 'time': '2017-02-18T11:07'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '是否考虑边界像素取决于边界设计策略', 'origin_text': '上。在卷积神经网络中，核的每一个元素都作用在输入的每一位置上（  !!!除了一些可能的边界像素，取决于对于边界的决策设计!!!  ）。卷积运算中的参数共享保证了我们只需要学习一个参数集合，而不', 'time': '2017-02-18T13:37'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '运算时间', 'origin_text': '每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的  !!!时间!!!  （仍然是O(k×n)O(k×n)O(k\\\\times n)），但它', 'time': '2017-02-18T14:03'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '部分网络', 'origin_text': '测出不同的特征（处理人脸上部的网络需要去搜寻眉毛，处理人脸下部的  !!!网络!!!  就需要去搜寻下巴了）。卷积对其他的一些变换并不是天然等变', 'time': '2017-02-19T05:07'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '部分网络', 'origin_text': '）时，我们可能会希望在不同的部位探测出不同的特征（处理人脸上部的  !!!网络!!!  需要去搜寻眉毛，处理人脸下部的网络就需要去搜寻下巴了）。', 'time': '2017-02-19T05:07'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '可以', 'origin_text': '能被传统的由（固定大小的）矩阵乘法定义的神经网络处理的特殊数据，  !!!可能!!!  通过卷积神经网络来处理，我们将在\\\\?节中进行讨论。池化卷', 'time': '2017-02-19T05:08'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '进一步', 'origin_text': '出上。这一级有时也被称为探测级。在第三级中，我们使用池化函数  !!!来更进一步!!!  地调整卷积层的输出。\\\\begin{figure}[!htb]', 'time': '2017-02-19T05:17'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '基于', 'origin_text': '常用的池化函数包括相邻矩形区域内的平均值、L2L2L^2范数以及  !!!依靠!!!  据中心像素距离的加权平均函数。不管采用什么样的池化函数，', 'time': '2017-02-19T05:21'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '精确', 'origin_text': '。例如，当判定一张图像中是否包含人脸时，我们并不需要知道眼睛的  !!!具体!!!  像素位置，我们只需要知道有一只眼睛在脸的左边，有一只在右边就行了', 'time': '2017-02-19T05:35'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '或多或少的改变参数', 'origin_text': '弱先验具有较高的熵值，例如方差很大的高斯分布，这样的先验允许数据  !!!对于参数的改变具有或多或少的自由性!!!  。强先验具有较低的熵值，例如方差很小的高斯分布，这样的先验在决', 'time': '2017-02-19T12:06'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '很低', 'origin_text': '样的先验允许数据对于参数的改变具有或多或少的自由性。强先验具有  !!!较低!!!  的熵值，例如方差很小的高斯分布，这样的先验在决定参数最终取值时起', 'time': '2017-02-19T12:07'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '。', 'origin_text': '或多或少的自由性。强先验具有较低的熵值，例如方差很小的高斯分布  !!!，!!!  这样的先验在决定参数最终取值时起着更加积极的作用。一个无限强', 'time': '2017-02-19T12:07'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '需要对', 'origin_text': '先验在决定参数最终取值时起着更加积极的作用。一个无限强的先验  !!!对!!!  一些参数的概率置零并且要求禁止对这些参数赋值，无论数据对于这些参', 'time': '2017-02-19T12:09'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '完全', 'origin_text': '起着更加积极的作用。一个无限强的先验对一些参数的概率置零并且  !!!要求!!!  禁止对这些参数赋值，无论数据对于这些参数的值给出了多大的支持。', 'time': '2017-02-19T12:10'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '类比全链接网络', 'origin_text': '数据对于这些参数的值给出了多大的支持。我们可以把卷积神经网络  !!!想成和全连接网络类似!!!  ，但对于这个全连接网络的权值有一个无限强的先验。这个无限强的先', 'time': '2017-02-19T12:11'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '指', 'origin_text': '对于这个全连接网络的权值有一个无限强的先验。这个无限强的先验是  !!!说!!!  一个隐藏单元的权值必须和它邻居的权值相等，但在空间中改变。这个', 'time': '2017-02-19T12:12'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '但可以在空间上移动', 'origin_text': '这个无限强的先验是说一个隐藏单元的权值必须和它邻居的权值相等，  !!!但在空间中改变!!!  。这个先验也要求除了那些处在隐藏单元空间连续的小的接收域以内的', 'time': '2017-02-19T12:16'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '指', 'origin_text': '是对网络中一层的参数引入了一个无限强的先验概率分布。这个先验是  !!!说!!!  该层应该学得的函数只包含局部连接关系并且对平移具有等变性。类似', 'time': '2017-02-19T12:37'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '会', 'origin_text': '洞察卷积神经网络是如何工作的。其中一个关键的洞察是卷积和池化  !!!可能!!!  导致欠拟合。与任何其他先验类似，卷积和池化只有当先验的假设合理', 'time': '2017-02-19T12:45'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '卷积神经网络结构', 'origin_text': '确的空间信息，那么在所有的特征上使用池化将会增大训练误差。一些  !!!卷积神经网络!!!  {cite?}为了既获得具有较高不变性的特征又获得当平移不变性不', 'time': '2017-02-19T12:49'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '有能力', 'origin_text': '。其他不使用卷积的模型即使我们把图像中的所有像素点都置换后依然  !!!有可能!!!  进行学习。对于许多图像数据集，还有一些分别的基准，有些是针对那', 'time': '2017-02-19T12:56'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '植入', 'origin_text': '现拓扑结构的模型，还有一些是针对设计者将空间关系的知识通过硬编码  !!!给了!!!  它们的模型。基本卷积函数的变体当在神经网络的上下文中', 'time': '2017-02-19T13:05'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '略有区别', 'origin_text': '是特指数学文献中使用的那种标准的离散卷积运算。实际应用中的函数  !!!略微有些不同!!!  。这里我们详细讨论一下这些差异，并且对神经网络中用到的函数的一', 'time': '2017-02-19T13:10'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '我们通常是指由多个并行卷积组成的运算', 'origin_text': '些重要性质进行重点说明。首先，当我们提到神经网络中的卷积时，  !!!我们通常是指一次特定的运算，而这种运算包含了并行地使用多个卷积!!!  。这是因为带有单个核的卷积只能提取一种类型的特征，尽管它作用在', 'time': '2017-02-19T13:12'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '每一层', 'origin_text': '类型的特征，尽管它作用在多个空间位置上。我们通常希望神经网络的  !!!一层!!!  能够在多个位置提取多种类型的特征。另外，输入通常也不仅仅是实', 'time': '2017-02-19T13:14'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '观测数据的向量', 'origin_text': '类型的特征。另外，输入通常也不仅仅是实值的网格，而是由一系列  !!!向量值的观测数据!!!  构成的网格。例如，一幅彩色图像在每一个像素点都会有红绿蓝三种颜', 'time': '2017-02-19T13:16'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '多个不同', 'origin_text': '的卷积神经网络中，第二层的输入是第一层的输出，通常在每个位置包含  !!!多个!!!  卷积的输出。当用于图像时，我们通常把卷积的输入输出都看作是3维', 'time': '2017-02-19T13:18'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '处理', 'origin_text': '二层的输入是第一层的输出，通常在每个位置包含多个卷积的输出。当  !!!用于!!!  图像时，我们通常把卷积的输入输出都看作是3维的张量，其中一个索引', 'time': '2017-02-19T13:18'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '实际上它们包含4维向量', 'origin_text': '引标明在每个通道上的空间坐标。软件实现通常使用批处理模式，所以  !!!它们会使用4维的张量!!!  ，第四维索引用于标明批处理中不同的实例，但我们为简明起见这里忽略', 'time': '2017-02-19T13:20'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '所以即使使用了核翻转， 也不一定保证网络的线性运算是可交换的', 'origin_text': '见这里忽略批处理索引。因为卷积神经网络通常使用多通道的卷积，  !!!它们基于的线性运算并不保证一定是可交换的，即使使用了核翻转也是如此!!!  。这些多通道的运算只有当其中的每个运算的输出和输入具有相同的通', 'time': '2017-02-19T13:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '只有当其中的每个运算的输出和输入具有相同的通道数时，这些多通道的运算才是可交换的。', 'origin_text': '于的线性运算并不保证一定是可交换的，即使使用了核翻转也是如此。  !!!这些多通道的运算只有当其中的每个运算的输出和输入具有相同的通道数时才是可交换的。!!!  假定我们有一个4维的核张量\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖪}', 'time': '2017-02-19T13:25'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '一个', 'origin_text': '�𝗑𝗍𝖻𝖿{𝖵}\\\\textbf{V}\\\\TSV组成，它的  !!!每一个!!!  元素是\\\\textsf{V}i,j,k\\\\textsf{V}i,j,', 'time': '2017-02-19T13:26'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '增加', 'origin_text': '的空间维度最终会缩减到1×11×11\\\\times 1，这种情况下  !!!另外!!!  的层就不可能进行有意义的卷积了。第二种特殊的情况是只进行足够的', 'time': '2017-02-19T13:46'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '只要有硬件支持，网络能包含任意多的卷积层，这是因为卷积运算不改变下一层网络的结构。', 'origin_text': '相同的大小。在MATLAB中，这称为相同卷积。在这种情况下，  !!!网络能够包含任意多的卷积层，只要硬件可以支持，这是因为卷积运算并没有改变相关的结构!!!  。然而，输入像素中靠近边界的部分相比于中间部分对于输出像素的影', 'time': '2017-02-19T13:52'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '例如', 'origin_text': 't+1},\\\\end{equation}这里百分号是取模运算，  !!!其中!!!  t%t=0,(t+1)%t=1t%t=0,(t+1)%t=1t\\\\', 'time': '2017-02-20T01:11'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '滤波器', 'origin_text': '有趣的关联：这些层的探测单元都是由不同的过滤器驱动的。如果这些  !!!过滤器!!!  能够学会探测相同隐含特征的不同变换形式，那么最大池化的单元对于学', 'time': '2017-02-20T01:14'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '通常需要除卷积以外的其他运算', 'origin_text': '。卷积层对于平移具有内置的不变性。实现卷积神经网络时，  !!!采用除卷积以外的其他一些运算通常也是必须的!!!  。为了实现学习，必须在给定输出的梯度时能够计算核的梯度。在一', 'time': '2017-02-20T01:17'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '在卷积层用于反向传播误差导数计算', 'origin_text': '算。通过卷积定义的矩阵转置的乘法就是这样一种运算。这种运算  !!!用于通过卷积层反向传播误差的导数!!!  ，所以它在训练多于一个隐藏层的卷积神经网络时是必要的。如果我们', 'time': '2017-02-20T01:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '得到', 'origin_text': '其余部分并且被用来计算损失函数JJJ。在反向传播过程中，我们会  !!!收到!!!  一个张量\\\\𝗍𝖾𝗑𝗍𝖻𝖿{𝖦}\\\\textbf{G}\\\\', 'time': '2017-02-20T01:42'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '介绍\\n', 'origin_text': '_{q, l, n}.\\\\end{eqnarray}第\\\\?章  !!!描述!!!  的自编码器网络，是一些训练成把输入拷贝到输出的前馈网络。一个简', 'time': '2017-02-20T01:44'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '被训练成', 'origin_text': 'end{eqnarray}第\\\\?章描述的自编码器网络，是一些  !!!训练成!!!  把输入拷贝到输出的前馈网络。一个简单的例子是PCA算法，将输入', 'time': '2017-02-20T01:45'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '我们有充分的理由相信：当计算成本和过拟合不是主要问题时，卷积神经网络是很好的一个网络模型。', 'origin_text': '入。这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。  !!!这提供了使用卷积网络的令人信服的理由，即使当计算成本和过拟合也不是主要问题时。!!!  例如，考虑一组图像的集合，其中每个图像具有不同的高度和宽度。', 'time': '2017-02-20T02:23'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '直接', 'origin_text': '清楚如何用固定大小的权重矩阵对这样的输入进行建模。卷积就可以很  !!!直观!!!  的应用；核依据输入的大小简单地被使用不同次，并且卷积运算的输出也', 'time': '2017-02-20T02:30'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '成绩等级', 'origin_text': '种类的观察。例如，如果我们正在处理大学申请，并且我们的特征包括  !!!成绩!!!  和标准化测试分数，但不是每个申请人都进行了标准化测试，则使用相同', 'time': '2017-02-20T02:42'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '需要进一步斟酌，但我也没有好的表述方法', 'origin_text': '积算法现代卷积网络的应用通常涉及包含超过百万个单元的网络。  !!!强大的实现!!!  要利用并行计算资源，很关键的，如\\\\?节中所描述。然而，在很多情', 'time': '2017-02-20T02:45'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '针对某些问题的规模，这种算法比离散卷积的实现更快。', 'origin_text': '，执行两个信号的逐点相乘，并使用Fourier逆变换转换回时域。  !!!对于某些问题大小，这可能比离散型卷积的朴素实现更快!!!  。当一个ddd维的核可以表示成ddd个向量（每维一个向量）的', 'time': '2017-02-20T02:51'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '元素', 'origin_text': '并且核也需要更少的参数表示为向量。如果核在每一维都是www个  !!!元素宽!!!  ，那么朴素的多维卷积需要O(wd)O(wd)O(w^d)的运行时', 'time': '2017-02-20T03:05'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '如何设计', 'origin_text': '和参数存储空间。当然，并不是每个卷积都可以表示成这种形式。  !!!设计!!!  更快的执行卷积或近似卷积，而不损害模型准确性的方法，是一个活跃的', 'time': '2017-02-20T03:07'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '消耗资源', 'origin_text': '网络还要耗资源。随机或无监督的特征通常，卷积网络训练中最  !!!昂贵!!!  的部分是学习特征。 输出层通常相对便宜，因为在通过若干层池化之', 'time': '2017-02-20T03:08'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '每步梯度计算需要完整的运行整个网络的前向传播和反向传播', 'origin_text': '作为该层输入的特征的数量较少。当使用梯度下降执行有监督训练时，  !!!每个梯度步骤需要完整的运行前向传播和反向传播通过整个网络!!!  。减少卷积网络训练成本的一种方式是使用那些不是通过有监督方式训', 'time': '2017-02-20T03:14'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '一个用于特征学习的中间方法', 'origin_text': '的性能，然后选择最好的结构并使用更昂贵的方法来训练整个网络。  !!!一个中间方法是学习特征，但是使用一些特殊的方法，这些方法!!!  不需要在每个梯度步骤中都进行完整的前向和反向传播。与多层感知机', 'time': '2017-02-20T03:22'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '单独地', 'origin_text': '的前向和反向传播。与多层感知机一样，我们使用贪心逐层式预训练，  !!!独立地!!!  训练第一层，然后从第一层提取所有特征一次，然后用那些特征隔离训练', 'time': '2017-02-20T03:24'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '单独地', 'origin_text': '，独立地训练第一层，然后从第一层提取所有特征一次，然后用那些特征  !!!隔离!!!  训练第二层，以此类推。第\\\\?章描述了如何实现有监督的贪心逐层预', 'time': '2017-02-20T03:24'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '案例', 'origin_text': '络的神经科学基础卷积网络也许是生物学启发人工智能的最为成功的  !!!故事!!!  。虽然卷积网络已经被许多其他领域指导，但是神经网络的一些关键设', 'time': '2017-02-20T03:31'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '虽然卷积神经网络在很多其他领域做了修改', 'origin_text': '科学基础卷积网络也许是生物学启发人工智能的最为成功的故事。  !!!虽然卷积网络已经被许多其他领域指导!!!  ，但是神经网络的一些关键设计原则来自神经科学。卷积网络的历史', 'time': '2017-02-20T03:33'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '此处应另起一段', 'origin_text': '述V1的三个性质：\\\\begin{enumerate}+ V1  !!!布置在空间图中。!!!    它实际上具有二维结构来反映视网膜中的图像结构。  例如，', 'time': '2017-02-20T03:41'}\n{'user': 'acct:zhaoyu611@hypothes.is', 'text': '视图', 'origin_text': '相同的基本原理也适用于视觉系统的其他区域。在我们视觉系统的卡通  !!!试图!!!  中，当我们逐渐深入大脑时，遵循池化的基本探测策略被反复执行。当', 'time': '2017-02-20T03:44'}\n\n=============================   Replies   =============================\n\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这个很厉害~我真没注意过这个细节...', 'time': '2017-03-12T14:33'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里不是这样的...原文是\\n> This provides a compelling reason to use convolutional networks even when computational cost and overfitting are not significant issues.\\n\\n因为卷积网络的计算开销会小很多，所以这里才说“即使计算开销和过拟合不是主要问题时，也应该使用卷积网络”。', 'time': '2017-03-12T14:17'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这样说不太好理解...还是简单一点吧...', 'time': '2017-03-12T10:05'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '滤波器会很怪，会让人自然联想到低通滤波器之类的...filter还是翻译成过滤器吧', 'time': '2017-03-12T09:04'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里翻译很棒~', 'time': '2017-03-12T08:04'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这样翻译不太对啊...因为输出会包含很多个通道（例如红绿蓝），然后处在这个通道中的一个单元例如（x,y）。', 'time': '2017-03-12T07:52'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里如果翻译成强度会怪怪的...intensity有亮度的含义，所以我建议翻译成亮度', 'time': '2017-03-12T07:36'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': 'can 翻译成 “可能”更合适吧...', 'time': '2017-03-12T06:30'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里我改成了“关于那一层输入大小的函数”，因为如果说“这一层”可能会引起歧义。', 'time': '2017-03-12T05:18'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里翻译很赞~', 'time': '2017-03-11T08:30'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '为了统一，我们对representation统一翻译为表示。注意这里不是输出的表示，因为输出=表示，这里是输入的表示。', 'time': '2017-03-11T08:20'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '直译确实是“在所有的情况下”，但是这里作为一段话的开头不是很合适，因为读者肯定会产生“你所指的情况是什么”的疑问，所以我这里采用意译。', 'time': '2017-03-11T08:17'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里感觉\"尺度\"和\"旋转\"并列在一起有点奇怪，我就改成了“角度”，要不我都改成“对于图像的放缩或者旋转变换”？', 'time': '2017-03-11T07:15'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '额...我觉得还是平移函数 比较好...', 'time': '2017-03-08T07:41'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里翻译很赞~我对于这种长句子的翻译有时读起来会很奇怪...', 'time': '2017-03-08T07:33'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '边界设计策略感觉不是很好...因为会让人误以为是设计不同形状的边界。我倾向于改成 对边界决策的设计。', 'time': '2017-03-08T07:20'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里改成时间复杂度会有点怪...原文是\\n> the sparsely connected approach requires only $k \\\\times n$ parameters and $O(k \\\\times n)$\\nruntime.\\n\\n如果改成时间复杂度，读起来会变成“稀疏的连接方法只需要$O(k \\\\times n)$的时间复杂度”，而我们一般情况下会说“稀疏的连接方法的时间复杂度只有$O(k\\\\times n)$”，所以我还是建议保留 运行时间，你认为怎么样？', 'time': '2017-03-08T06:54'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里不是参数矩阵和参数矩阵的乘法，而是 参数矩阵*输入=输出 这种关系', 'time': '2017-03-08T06:22'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里翻译很赞~', 'time': '2017-03-08T04:26'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这里我觉得省略“上下文”会简洁一些...', 'time': '2017-03-08T04:12'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '这样说太拗口了...我改成了\"我们将核翻转的唯一原因在于得到可交换性。\"', 'time': '2017-03-08T04:04'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': 'straightforward 我觉得此处翻译为 简单 更加合适一些。', 'time': '2017-03-07T12:55'}\n{'user': 'acct:KevinLee1110@hypothes.is', 'text': '感觉“实变函数”更为常见？', 'time': '2017-03-06T15:45'}"
  },
  {
    "path": "Chapter9/convolutional_networks.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n% Translator: Kai Li\n\\chapter{\\glsentrytext{convolutional_network}}\n\\label{chap:convolutional_networks}\n\n\\firstgls{convolutional_network}\\citep{LeCun89a}，也叫做\\firstall{CNN}，是一种专门用来处理具有类似网格结构的数据的神经网络。\n例如时间序列数据（可以认为是在时间轴上有规律地采样形成的一维网格）和图像数据（可以看作是二维的像素网格）。\n\\gls{convolutional_network}在诸多应用领域都表现优异。\n``\\gls{CNN}''一词表明该网络使用了\\firstgls{convolution}这种数学运算。\n卷积是一种特殊的线性运算。\n\\emph{\\gls{convolutional_network}是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。}\n\n本章，我们首先说明什么是卷积运算。\n接着，我们会解释在神经网络中使用卷积运算的动机。\n然后我们会介绍\\firstgls{pooling}，这是一种几乎所有的\\gls{convolutional_network}都会用到的操作。\n通常来说，\\gls{CNN}中用到的卷积运算和其他领域（例如工程领域以及纯数学领域）中的定义并不完全一致。\n我们会对神经网络实践中广泛应用的几种卷积函数的变体进行说明。\n我们也会说明如何在多种不同维数的数据上使用卷积运算。\n之后我们讨论使得卷积运算更加高效的一些方法。\n\\gls{convolutional_network}是神经科学原理影响深度学习的典型代表。\n我们之后也会讨论这些神经科学的原理，并对\\gls{convolutional_network}在深度学习发展史中的作用作出评价。\n本章没有涉及如何为你的\\gls{convolutional_network}选择合适的结构，因为本章的目标是说明\\gls{convolutional_network}提供的各种工具。\n\\chapref{chap:practical_methodology}将会对如何在具体环境中选择使用相应的工具给出通用的准则。\n对于\\gls{convolutional_network}结构的研究进展得如此迅速，以至于针对特定基准(benchmark)，数月甚至几周就会公开一个新的最优的网络结构，甚至在写这本书时也不好描述究竟哪种结构是最好的。\n然而，最好的结构也是由本章所描述的基本部件逐步搭建起来的。\n\n% -- 321 --\n \n\\section{卷积运算}\n\\label{sec:the_convolution_operation}\n\n在通常形式中，卷积是对两个实变函数的一种数学运算\\footnote{译者注：本书中operation视语境有时翻译成``运算''，有时翻译成``操作''。}。\n为了给出卷积的定义，我们从两个可能会用到的函数的例子出发。\n\n假设我们正在用激光传感器追踪一艘宇宙飞船的位置。\n我们的激光传感器给出一个单独的输出$x(t)$，表示宇宙飞船在时刻$t$ 的位置。\n$x$和$t$都是实值的，这意味着我们可以在任意时刻从传感器中读出飞船的位置。\n\n现在假设我们的传感器受到一定程度的噪声干扰。\n为了得到飞船位置的低噪声估计，我们对得到的测量结果进行平均。\n显然，时间上越近的测量结果越相关，所以我们采用一种加权平均的方法，对于最近的测量结果赋予更高的权重。\n我们可以采用一个加权函数$w(a)$ 来实现，其中$a$表示测量结果距当前时刻的时间间隔。\n如果我们对任意时刻都采用这种加权平均的操作，就得到了一个新的对于飞船位置的平滑估计函数$s$：\n\\begin{equation}\ns(t) = \\int x(a)w(t-a)da.\n\\end{equation}\n\n这种运算就叫做\\firstgls{convolution}。\n卷积运算通常用星号表示：\n\\begin{equation}\ns(t) = (x*w)(t).\n\\end{equation}\n\n在我们的例子中，$w$必须是一个有效的概率密度函数，否则输出就不再是一个加权平均。\n另外，在参数为负值时，$w$的取值必须为0，否则它会预测到未来，这不是我们能够推测得了的。\n但这些限制仅仅是对我们这个例子来说。\n通常，卷积被定义在满足上述积分式的任意函数上，并且也可能被用于加权平均以外的目的。\n\n在\\gls{convolutional_network}的术语中，卷积的第一个参数（在这个例子中，函数$x$）通常叫做\\firstgls{input}，第二个参数（函数$w$）叫做\\firstgls{kernel}。\n输出有时被称作\\firstgls{feature_map}。\n\n% -- 322 --\n \n在本例中，激光传感器在每个瞬间反馈测量结果的想法是不切实际的。\n一般地，当我们用计算机处理数据时，时间会被离散化，传感器会定期地反馈数据。\n所以在我们的例子中，假设传感器每秒反馈一次测量结果是比较现实的。\n这样，时刻$t$只能取整数值。\n如果我们假设$x$和$w$都定义在整数时刻$t$上，就可以定义离散形式的卷积：\n\\begin{equation}\ns(t) = (x*w)(t) = \\sum_{a = -\\infty}^{\\infty} x(a)w(t-a).\n\\end{equation}\n\n在机器学习的应用中，输入通常是多维数组的数据，而核通常是由学习算法优化得到的多维数组的参数。\n我们把这些多维数组叫做张量。\n因为在输入与核中的每一个元素都必须明确地分开存储，我们通常假设在存储了数值的有限点集以外，这些函数的值都为零。\n这意味着在实际操作中，我们可以通过对有限个数组元素的求和来实现无限求和。\n\n最后，我们经常一次在多个维度上进行卷积运算。\n例如，如果把一张二维的图像$I$作为输入，我们也许也想要使用一个二维的核$K$：\n\\begin{equation}\nS(i,j) = (I*K)(i,j) = \\sum_m \\sum_n I(m,n) K(i-m, j-n).\n\\end{equation}\n\n卷积是可交换的(commutative)，我们可以等价地写作：\n\\begin{equation}\nS(i, j) = (K*I)(i,j) = \\sum_m \\sum_n I(i-m, j-n) K(m, n).\n\\end{equation}\n\n通常，下面的公式在机器学习库中实现更为简单，因为$m$和$n$的有效取值范围相对较小。\n\n% -- 323 --\n \n卷积运算可交换性的出现是因为我们将核相对输入进行了\\firstgls{flip}，从$m$增大的角度来看，输入的索引在增大，但是核的索引在减小。\n我们将核翻转的唯一目的是实现可交换性。\n尽管可交换性在证明时很有用，但在神经网络的应用中却不是一个重要的性质。\n与之不同的是，许多神经网络库会实现一个相关的函数，称为\\firstgls{cross_correlation}，和卷积运算几乎一样但是并没有对核进行翻转：\n\\begin{equation}\nS(i, j) = (I*K)(i, j) = \\sum_m \\sum_n I(i+m, j+n) K(m, n).\n\\end{equation}\n许多机器学习的库实现的是互相关函数但是称之为卷积。\n在这本书中我们遵循把两种运算都叫做卷积的这个传统，在与核翻转有关的上下文中，我们会特别指明是否对核进行了翻转。\n在机器学习中，学习算法会在核合适的位置学得恰当的值， 所以一个基于核翻转的卷积运算的学习算法所学得的核，是对未进行翻转的算法学得的核的翻转。\n单独使用卷积运算在机器学习中是很少见的，卷积经常与其他的函数一起使用，无论卷积运算是否对它的核进行了翻转，这些函数的组合通常是不可交换的。\n\n\\figref{fig:chap9_conv_2d}演示了一个在2维张量上的卷积运算（没有对核进行翻转）的例子。\n% fig 9.1\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/conv_2d}}\n\\fi\n\\caption{一个2维卷积的例子（没有对核进行翻转）。\n我们限制只对核完全处在图像中的位置进行输出，在一些上下文中称为``\\gls{valid}''卷积。\n我们用画有箭头的盒子来说明输出张量的左上角元素是如何通过对输入张量相应的左上角区域应用核进行卷积得到的。}\n\\label{fig:chap9_conv_2d}\n\\end{figure}\n\n离散卷积可以看作矩阵的乘法，然而，这个矩阵的一些元素被限制为必须和另外一些元素相等。\n例如对于单变量的离散卷积，矩阵每一行中的元素都与上一行对应位置平移一个单位的元素相同。\n这种矩阵叫做\\firstgls{Toeplitz_matrix}。\n对于二维情况，卷积对应着一个\\firstgls{doubly_block_circulant_matrix}。\n%这里不是很理解双重分块循环矩阵\n除了这些元素相等的限制以外，卷积通常对应着一个非常稀疏的矩阵（一个几乎所有元素都为零的矩阵）。\n这是因为核的大小通常要远小于输入图像的大小。任何一个使用矩阵乘法但是并不依赖矩阵结构的特殊性质的神经网络算法，都适用于卷积运算，并且不需要对神经网络做出大的修改。\n典型的\\gls{CNN}为了更有效地处理大规模输入，确实使用了一些专门化的技巧，但这些在理论分析方面并不是严格必要的。\n\n% -- 324 --\n \n\\section{动机}\n\\label{sec:motivation}\n\n卷积运算通过三个重要的思想来帮助改进机器学习系统：\\firstgls{sparse_interactions}、\\firstgls{parameter_sharing}、\\firstgls{equivariant_representations}。\n另外，卷积提供了一种处理大小可变的输入的方法。\n我们下面依次介绍这些思想。\n\n传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。%\\footnote{译者注：这里可以粗略地理解为输入$\\times$参数矩阵=输出。}\n其中，参数矩阵中每一个单独的参数都描述了一个输入单元与一个输出单元间的交互。\n这意味着每一个输出单元与每一个输入单元都产生交互。\n然而，\\gls{convolutional_network}具有\\firstgls{sparse_interactions}（也叫做\\firstgls{sparse_connectivity}或者\\firstgls{sparse_weights}）的特征。\n这是使核的大小远小于输入的大小来达到的。\n举个例子，当处理一张图像时，输入的图像可能包含成千上万个像素点，但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征，例如图像的边缘。\n这意味着我们需要存储的参数更少，不仅减少了模型的存储需求，而且提高了它的统计效率。\n这也意味着为了得到输出我们只需要更少的计算量。\n这些效率上的提高往往是很显著的。\n如果有$m$个输入和$n$个输出，那么矩阵乘法需要$m \\times n$个参数并且相应算法的时间复杂度为$O(m\\times n)$（对于每一个例子）。\n如果我们限制每一个输出拥有的连接数为$k$，那么稀疏的连接方法只需要$k\\times n$个参数以及$O(k\\times n)$的运行时间。\n在很多实际应用中，只需保持$k$比$m$小几个数量级，就能在机器学习的任务中取得好的表现。\n\\gls{sparse_connectivity}的图形化解释如\\figref{fig:chap9_area_of_effect}和\\figref{fig:chap9_receptive_field}所示。\n在深度\\gls{convolutional_network}中，处在网络深层的单元可能与绝大部分输入是\\emph{间接}交互的，如\\figref{fig:chap9_deep_receptive_field}所示。\n这允许网络可以通过只描述\\gls{sparse_interactions}的基石来高效地描述多个变量的复杂交互。\n% fig 9.2\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/area_of_effect}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[Caption for LOF]{\\gls{sparse_connectivity}，对每幅图从下往上看。\n我们强调了一个输入单元$x_3$以及在$\\Vs$中受该单元影响的输出单元。\n\\emph{(上)}当$\\Vs$是由核宽度为3的卷积产生时，只有三个输出受到$\\Vx$的影响\\protect\\footnotemark。\n\\emph{(下)}当$\\Vs$是由矩阵乘法产生时，连接不再是稀疏的，所以所有的输出都会受到$x_3$的影响。}\n\\label{fig:chap9_area_of_effect}\n\\end{figure}\n% \\footnotetext{译者注：译者认为此处应当是$x_3$。}\n\n% fig 9.3\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/receptive_field}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[Caption for LOF]{\\gls{sparse_connectivity}，对每幅图从上往下看。\n我们强调了一个输出单元$s_3$以及$\\Vx$中影响该单元的输入单元。\n这些单元被称为$s_3$的\\firstgls{receptive_field}\\protect\\footnotemark。\n\\emph{(上)}当$\\Vs$是由核宽度为3的卷积产生时，只有三个输入影响$s_3$。\n\\emph{(下)}当$\\Vs$是由矩阵乘法产生时，连接不再是稀疏的，所以所有的输入都会影响$s_3$。}\n\\label{fig:chap9_receptive_field}\n\\end{figure}\n%\\footnotetext{译者注：在生物中称之为``感受野''。}\n\n% fig 9.4\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/deep_receptive_field}}\n\\fi\n\\caption{处于\\gls{convolutional_network}更深的层中的单元，它们的\\gls{receptive_field}要比处在浅层的单元的\\gls{receptive_field}更大。\n如果网络还包含类似\\gls{stride}卷积（\\figref{fig:chap9_stride_conv}）或者\\gls{pooling}（\\secref{sec:pooling}）之类的结构特征，这种效应会加强。\n这意味着在\\gls{convolutional_network}中尽管\\emph{直接}连接都是很稀疏的，但处在更深的层中的单元可以\\emph{间接地}连接到全部或者大部分输入图像。}\n\\label{fig:chap9_deep_receptive_field}\n\\end{figure}\n\n% -- 325 --\n \n\\firstgls{parameter_sharing}是指在一个模型的多个函数中使用相同的参数。\n在传统的神经网络中，当计算一层的输出时，权重矩阵的每一个元素只使用一次，当它乘以输入的一个元素后就再也不会用到了。\n作为\\gls{parameter_sharing}的同义词，我们可以说一个网络含有\\firstgls{tied_weights}，因为用于一个输入的权重也会被绑定在其他的权重上。\n在\\gls{CNN}中，核的每一个元素都作用在输入的每一位置上（是否考虑边界像素取决于对边界决策的设计）。\n卷积运算中的\\gls{parameter_sharing}保证了我们只需要学习一个参数集合，而不是对于每一位置都需要学习一个单独的参数集合。\n这虽然没有改变\\gls{forward_propagation}的运行时间（仍然是$O(k\\times n)$），但它显著地把模型的存储需求降低至$k$个参数，并且$k$通常要比$m$小很多个数量级。\n因为$m$ 和$n$通常有着大致相同的大小，$k$在实际中相对于$m\\times n$是很小的。\n因此，卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。\n\\figref{fig:chap9_parameter_sharing}演示了\\gls{parameter_sharing}是如何实现的。\n% fig 9.5\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/parameter_sharing}}\n\\fi\n\\caption{\\gls{parameter_sharing}。\n黑色箭头表示在两个不同的模型中使用了特定参数的连接。\n\\emph{(上)}黑色箭头表示在卷积模型中对3元素核的中间元素的使用。\n因为\\gls{parameter_sharing}，这个单独的参数被用于所有的输入位置。\n\\emph{(下)}这个单独的黑色箭头表示在全连接模型中对权重矩阵的中间元素的使用。\n这个模型没有使用\\gls{parameter_sharing}，所以参数只使用了一次。}\n\\label{fig:chap9_parameter_sharing}\n\\end{figure}\n% -- 326 --\n \n% -- 327 --\n \n作为前两条原则的一个实际例子，\\figref{fig:chap9_efficiency_of_edge_detection}说明了\\gls{sparse_connectivity}和\\gls{parameter_sharing}是如何显著提高线性函数在一张图像上进行边缘检测的效率的。\n% fig 9.6\n\\begin{figure}\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering    \n\\subfigure{ \\label{fig:chap9_efficiency_of_edge_detection_a}     \n\\includegraphics[width=0.35\\textwidth]{Chapter9/figures/sundance.png}}     \n\\subfigure{ \\label{fig:chap9_efficiency_of_edge_detection_b}     \n\\includegraphics[width=0.35\\textwidth]{Chapter9/figures/edges.png}}     \n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{边缘检测的效率。\n右边的图像是通过先获得原始图像中的每个像素，然后减去左边相邻像素的值而形成的。\n这个操作给出了输入图像中所有垂直方向上的边缘的强度，对目标检测来说是有用的。\n两个图像的高度均为280个像素。\n输入图像的宽度为320个像素，而输出图像的宽度为319个像素。\n这个变换可以通过包含两个元素的卷积核来描述，使用卷积需要$319\\times 280\\times 3 = 267,960$次浮点运算（每个输出像素需要两次乘法和一次加法）。\n为了用矩阵乘法描述相同的变换，需要一个包含$320\\times 280\\times 319\\times 280$个或者说超过80亿个元素的矩阵，这使得卷积对于表示这种变换更有效40亿倍。\n直接运行矩阵乘法的算法将执行超过160亿次浮点运算，这使得卷积在计算上大约有60,000倍的效率。\n当然，矩阵的大多数元素将为零。\n如果我们只存储矩阵的非零元，则矩阵乘法和卷积都需要相同数量的浮点运算来计算。\n矩阵仍然需要包含$2\\times 319\\times 280=178,640$个元素。\n将小的局部区域上的相同线性变换应用到整个输入上，卷积是描述这种变换的极其有效的方法。\n照片来源：Paula Goodfellow。}   \n\\label{fig:chap9_efficiency_of_edge_detection}     \n\\end{figure}\n% -- 328 --\n \n对于卷积，\\gls{parameter_sharing}的特殊形式使得神经网络层具有对平移\\firstgls{equivariance}的性质。\n如果一个函数满足输入改变，输出也以同样的方式改变这一性质，我们就说它是等变(equivariant)的。\n特别地，如果函数$f(x)$与$g(x)$满足$f(g(x))= g(f(x))$，我们就说$f(x)$对于变换$g$具有等变性。\n对于卷积来说，如果令$g$是输入的任意平移函数，那么卷积函数对于$g$具有等变性。\n举个例子，令$I$表示图像在整数坐标上的亮度函数，$g$表示图像函数的变换函数（把一个图像函数映射到另一个图像函数的函数）使得$I' = g(I)$，其中图像函数$I'$满足$I'(x,y) = I(x-1, y)$。\n这个函数把$I$中的每个像素向右移动一个单位。\n如果我们先对$I$进行这种变换然后进行卷积操作所得到的结果，与先对$I$进行卷积然后再对输出使用平移函数$g$得到的结果是一样的\\footnote{译者注：原文将此处误写成了$I'$。} 。%译者注\n当处理时间序列数据时，这意味着通过卷积可以得到一个由输入中出现不同特征的时刻所组成的时间轴。\n如果我们把输入中的一个事件向后延时，在输出中仍然会有完全相同的表示，只是时间延后了。\n图像与之类似，卷积产生了一个2维映射来表明某些特征在输入中出现的位置。\n如果我们移动输入中的对象，它的表示也会在输出中移动同样的量。\n当我们知道某个相邻小规模像素的函数在不同的位置都是有用的的时候，前述性质是有用的。\n例如在处理图像时，在\\gls{convolutional_network}的第一层进行图像的边缘检测是很有用的。\n相同的边缘或多或少地散落在图像的各处，所以应当对整个图像进行\\gls{parameter_sharing}。\n但在某些情况下，我们并不希望对整幅图进行\\gls{parameter_sharing}。\n例如，在处理已经通过剪裁而使其居中的人脸图像时，我们可能想要提取不同位置上的不同特征（处理人脸上部的部分网络需要去搜寻眉毛，处理人脸下部的部分网络就需要去搜寻下巴了）。\n\n% -- 329 --\n \n卷积对其他的一些变换并不是天然等变的，例如对于图像的放缩或者旋转变换，需要其他的一些机制来处理这些变换。\n\n最后，一些不能被传统的由（固定大小的）矩阵乘法定义的神经网络处理的特殊数据，可能通过卷积神经网络来处理，我们将在\\secref{sec:data_types}中进行讨论。\n\n\\section{\\glsentrytext{pooling}}\n\\label{sec:pooling}\n\n\\gls{convolutional_network}中一个典型层包含三级（如\\figref{fig:chap9_conv_layer}所示）。\n在第一级中，这一层并行地计算多个卷积产生一组线性激活响应。\n在第二级中，每一个线性激活响应将会通过一个非线性的激活函数，例如\\gls{rectified_linear}激活函数。\n这一级有时也被称为\\firstgls{detector_stage}。\n在第三级中，我们使用\\firstgls{pooling_funciton}来进一步调整这一层的输出。\n% fig 9.7\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/conv_layer}}\n\\fi\n\\caption{一个典型\\gls{CNN}层的组件。\n有两组常用的术语用于描述这些层。\n\\emph{(左)}在这组术语中，\\gls{convolutional_network}被视为少量相对复杂的层，每层具有许多``级''。\n在这组术语中，核张量与网络层之间存在一一对应关系。\n在本书中，我们通常使用这组术语。\n\\emph{(右)}在这组术语中，\\gls{convolutional_network}被视为更多数量的简单层；每一个处理步骤都被认为是一个独立的层。\n这意味着不是每一``层''都有参数。}\n\\label{fig:chap9_conv_layer}\n\\end{figure}\n\n\\gls{pooling}函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。\n例如，\\firstgls{max_pooling}函数\\citep{zhou1988computation}给出相邻矩形区域内的最大值。\n其他常用的\\gls{pooling}函数包括相邻矩形区域内的平均值、$L^2$范数以及基于据中心像素距离的加权平均函数。\n\n% -- 330 --\n \n不管采用什么样的\\gls{pooling}函数，当输入作出少量平移时，\\gls{pooling}能够帮助输入的表示近似\\firstgls{invariant}。\n对于平移的不变性是指当我们对输入进行少量平移时，经过\\gls{pooling}函数后的大多数输出并不会发生改变。\n\\figref{fig:chap9_max_pool_invariance}用了一个例子来说明这是如何实现的。\n\\emph{局部平移不变性是一个很有用的性质，尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时}。\n例如，当判定一张图像中是否包含人脸时，我们并不需要知道眼睛的精确像素位置，我们只需要知道有一只眼睛在脸的左边，有一只在右边就行了。\n但在一些其他领域，保存特征的具体位置却很重要。\n例如当我们想要寻找一个由两条边相交而成的拐角时，我们就需要很好地保存边的位置来判定它们是否相交。\n% fig 9.8\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/max_pool_invariance}}\n\\fi\n\\caption{\\gls{max_pooling}引入了不变性。\n\\emph{(上)}卷积层中间输出的视图。\n下面一行显示非线性的输出。\n上面一行显示\\gls{max_pooling}的输出，每个\\gls{pool}的宽度为三个像素并且\\gls{pooling}区域的\\gls{stride}为一个像素。\n\\emph{(下)}相同网络的视图，不过对输入右移了一个像素。\n下面一行的所有值都发生了改变，但上面一行只有一半的值发生了改变，这是因为\\gls{max_pooling}单元只对周围的最大值比较敏感，而不是对精确的位置。}\n\\label{fig:chap9_max_pool_invariance}\n\\end{figure}\n\n% -- 331 --\n \n使用\\gls{pooling}可以看作是增加了一个无限强的先验：这一层学得的函数必须具有对少量平移的不变性。\n当这个假设成立时，\\gls{pooling}可以极大地提高网络的统计效率。\n\n对空间区域进行\\gls{pooling}产生了平移不变性，但当我们对分离参数的卷积的输出进行\\gls{pooling}时，特征能够学得应该对于哪种变换具有不变性（如\\figref{fig:chap9_learned_rotation}所示）。\n% fig 9.9\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/learned_rotation}}\n\\fi\n\\caption{学习不变性的示例。\n使用分离的参数学得多个特征，再使用\\gls{pooling}单元进行\\gls{pooling}，可以学得对输入的某些变换的不变性。\n这里我们展示了用三个学得的过滤器和一个\\gls{max_pooling}单元可以学得对旋转变换的不变性。\n这三个过滤器都旨在检测手写的数字5。\n每个过滤器尝试匹配稍微不同方向的5。\n当输入中出现5时，相应的过滤器会匹配它并且在探测单元中引起大的激活。\n然后，无论哪个探测单元被激活，\\gls{max_pooling}单元都具有大的激活。\n我们在这里演示了网络如何处理两个不同的输入，这导致两个不同的探测单元被激活，然而对\\gls{pooling}单元的影响大致相同。\n这个原则在\\,\\gls{maxout}\\,网络\\citep{Goodfellow-et-al-ICML2013}和其他卷积网络中更有影响。\n空间位置上的\\gls{max_pooling}对于平移是天然不变的；这种多通道方法只在学习其他变换时是必要的。}\n\\label{fig:chap9_learned_rotation}\n\\end{figure}\n\n% -- 332 --\n \n因为\\gls{pooling}综合了全部邻居的反馈，这使得\\gls{pooling}单元少于探测单元成为可能，我们可以通过综合\\gls{pooling}区域的$k$个像素的统计特征而不是单个像素来实现。\n\\figref{fig:chap9_pool_downsample}给出了一个例子。\n这种方法提高了网络的计算效率，因为下一层少了约$k$ 倍的输入。\n当下一层的参数数目是关于那一层输入大小的函数时（例如当下一层是全连接的基于矩阵乘法的网络层时），这种对于输入规模的减小也可以提高统计效率并且减少对于参数的存储需求。\n% fig 9.10\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/pool_downsample}}\n\\fi\n\\caption{带有\\gls{downsampling}的\\gls{pooling}。\n这里我们使用\\gls{max_pooling}，\\gls{pool}的宽度为三并且\\gls{pool}之间的\\gls{stride}为二。\n这使得表示的大小减少了一半，减轻了下一层的计算和统计负担。\n注意到最右边的\\gls{pooling}区域尺寸较小，但如果我们不想忽略一些探测单元的话就必须包含这个区域。}\n\\label{fig:chap9_pool_downsample}\n\\end{figure}\n\n% -- 333 --\n \n在很多任务中，\\gls{pooling}对于处理不同大小的输入具有重要作用。\n例如我们想对不同大小的图像进行分类时，分类层的输入必须是固定的大小，而这通常通过调整\\gls{pooling}区域的偏置大小来实现，这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。\n例如，最终的\\gls{pooling}层可能会输出四组综合统计特征，每组对应着图像的一个象限，而与图像的大小无关。\n\n一些理论工作对于在不同情况下应当使用哪种\\gls{pooling}函数给出了一些指导\\citep{boureau-icml-10}。\n将特征一起动态地\\gls{pooling}也是可行的，例如，对于感兴趣特征的位置运行聚类算法\\citep{boureau-iccv-11}。\n这种方法对于每幅图像产生一个不同的\\gls{pooling}区域集合。\n另一种方法是先\\emph{学习}一个单独的\\gls{pooling}结构，再应用到全部的图像中\\citep{jia2012beyond}。\n\n\\gls{pooling}可能会使得一些利用自顶向下信息的神经网络结构变得复杂，例如\\gls{BM}和\\gls{AE}。\n这些问题将在\\chapref{part:deep_learning_research}中当我们遇到这些类型的网络时进一步讨论。\n\\gls{CBM}中的\\gls{pooling}出现在\\secref{sec:convolutional_boltzmann_machines}。\n一些可微网络中需要的在\\gls{pooling}单元上进行的类逆运算将在\\secref{sec:convolutional_generative_networks}中讨论。\n\n\\figref{fig:chap9_cnn_classifier}给出了一些使用卷积和\\gls{pooling}操作的用于分类的完整\\gls{convolutional_network}结构的例子。\n% fig 9.11\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/cnn_classifier}}\n\\fi\n\\caption{\\gls{convolutional_network}用于分类的结构示例。\n本图中使用的具体\\gls{stride}和深度并不建议实际使用；它们被设计得非常浅以适合页面。\n实际的\\gls{convolutional_network}还常常涉及大量的分支，不同于这里为简单起见所使用的链式结构。\n\\emph{(左)}处理固定大小的图像的\\gls{convolutional_network}。\n在卷积层和\\gls{pooling}层几层交替之后，卷积特征映射的张量被重新变形以展平空间维度。\n网络的其余部分是一个普通的前馈网络分类器，如\\chapref{chap:deep_feedforward_networks}所述。\n\\emph{(中)}处理大小可变的图像的\\gls{convolutional_network}，但仍保持全连接的部分。\n该网络使用具有可变大小但是数量固定的\\gls{pool}的\\gls{pooling}操作，以便向网络的全连接部分提供固定576个单位大小的向量。 \n\\emph{(右)}没有任何全连接权重层的\\gls{convolutional_network}。\n相对的，最后的卷积层为每个类输出一个特征映射。\n该模型可能会用来学习每个类出现在每个空间位置的可能性的映射。\n将特征映射进行平均得到的单个值，提供了顶部softmax分类器的变量。}\n\\label{fig:chap9_cnn_classifier}\n\\end{figure}\n\n\\section{卷积与\\glsentrytext{pooling}作为一种无限强的先验}\n\\label{sec:convolution_and_pooling_as_an_infinitely_strong_prior}\n\n回忆一下\\secref{sec:capacity_overfitting_and_underfitting}中\\firstgls{prior_probability_distribution}的概念。\n这是一个模型参数的概率分布，它刻画了在我们看到数据之前我们认为什么样的模型是合理的信念。\n\n% -- 334 --\n \n先验被认为是强或者弱取决于先验中概率密度的集中程度。\n弱先验具有较高的熵值，例如方差很大的\\gls{gaussian_distribution}。这样的先验允许数据对于参数的改变具有或多或少的自由性。\n强先验具有较低的熵值，例如方差很小的\\gls{gaussian_distribution}。这样的先验在决定参数最终取值时起着更加积极的作用。\n\n一个无限强的先验需要对一些参数取某些值的概率置零并且完全禁止对这些参数赋予这些值，无论数据对于这些参数值给出了多大的支持。\n\n我们可以把\\gls{convolutional_network}类比成全连接网络，但对于这个全连接网络的权重有一个无限强的先验。\n这个无限强的先验是说一个\\gls{hidden_unit}的权重必须和它邻居的权重相同，但可以在空间上移动。\n这个先验也要求除了那些处在\\gls{hidden_unit}的小的空间连续的\\gls{receptive_field}内的权重以外，其余的权重都为零。\n%这样翻译对吗？其实这里加个图更好\n总之，我们可以把卷积的使用当作是对网络中一层的参数引入了一个无限强的\\gls{prior_probability_distribution}。\n这个先验说明了该层应该学得的函数只包含局部连接关系并且对平移具有等变性。\n类似的，使用\\gls{pooling}也是一个无限强的先验：每一个单元都具有对少量平移的不变性。\n\n当然，把\\gls{CNN}当作一个具有无限强先验的全连接网络来实现会导致极大的计算浪费。\n但把\\gls{CNN}想成具有无限强先验的全连接网络可以帮助我们更好地洞察\\gls{CNN}是如何工作的。\n\n其中一个关键的洞察是卷积和\\gls{pooling}可能导致\\gls{underfitting}。\n与任何其他先验类似，卷积和\\gls{pooling}只有当先验的假设合理且正确时才有用。\n如果一项任务依赖于保存精确的空间信息，那么在所有的特征上使用\\gls{pooling}将会增大训练误差。\n一些\\gls{convolutional_network}结构~\\citep{Szegedy-et-al-arxiv2014}为了既获得具有较高不变性的特征又获得当平移不变性不合理时不会导致\\gls{underfitting}的特征，被设计成在一些通道上使用\\gls{pooling}而在另一些通道上不使用。\n当一项任务涉及到要对输入中相隔较远的信息进行合并时，那么卷积所利用的先验可能就不正确了。\n\n另一个关键洞察是当我们比较卷积模型的统计学习表现时，只能以基准中的其他卷积模型作为比较的对象。\n其他不使用卷积的模型即使我们把图像中的所有像素点都置换后依然有可能进行学习。\n对于许多图像数据集，还有一些分别的基准，有些是针对那些具有\\firstgls{permutation_invariant}并且必须通过学习发现拓扑结构的模型，还有一些是针对模型设计者将空间关系的知识植入了它们的模型。\n\n% -- 336 --\n\n\\section{基本卷积函数的变体}\n\\label{sec:variants_of_the_basic_convolution_function}\n\n当在神经网络的上下文中讨论卷积时，我们通常不是特指数学文献中使用的那种标准的离散卷积运算。\n实际应用中的函数略有不同。\n这里我们详细讨论一下这些差异，并且对神经网络中用到的函数的一些重要性质进行重点说明。\n\n首先，当我们提到神经网络中的卷积时，我们通常是指由多个并行卷积组成的运算。\n这是因为具有单个核的卷积只能提取一种类型的特征，尽管它作用在多个空间位置上。\n我们通常希望网络的每一层能够在多个位置提取多种类型的特征。\n\n另外，输入通常也不仅仅是实值的网格，而是由一系列观测数据的向量构成的网格。\n例如，一幅彩色图像在每一个像素点都会有红绿蓝三种颜色的亮度。\n在多层的\\gls{convolutional_network}中，第二层的输入是第一层的输出，通常在每个位置包含多个不同卷积的输出。\n当处理图像时，我们通常把卷积的输入输出都看作是3维的张量，其中一个索引用于标明不同的通道（例如红绿蓝），另外两个索引标明在每个通道上的空间坐标。\n软件实现通常使用批处理模式，所以实际上会使用4维的张量，第四维索引用于标明批处理中不同的实例，但我们为简明起见这里忽略批处理索引。\n\n因为\\gls{convolutional_network}通常使用多通道的卷积，所以即使使用了核翻转， 也不一定保证网络的线性运算是可交换的。\n只有当其中的每个运算的输出和输入具有相同的通道数时，这些多通道的运算才是可交换的。\n\n假定我们有一个4维的核张量$\\TSK$，它的每一个元素是$\\TEK_{i,j,k,l}$，表示输出中处于通道$i$的一个单元和输入中处于通道$j$中的一个单元的连接强度，并且在输出单元和输入单元之间有$k$行$l$列的偏移。\n假定我们的输入由观测数据$\\TSV$组成，它的每一个元素是$\\TEV_{i,j,k}$，表示处在通道$i$中第$j$行第$k$列的值。\n假定我们的输出$\\TSZ$和输入$\\TSV$具有相同的形式。\n如果输出$\\TSZ$是通过对$\\TSK$和$\\TSV$进行卷积而不涉及翻转$\\TSK$得到的，那么\n\\begin{equation}\n\\TEZ_{i,j,k} = \\sum_{l,m,n} \\TEV_{l, j+m-1, k+n-1} \\TEK_{i,l,m,n},\n\\end{equation}\n这里对所有的$l$，$m$和$n$进行求和是对所有（在求和式中）有效的张量索引的值进行求和。\n在线性代数中，向量的索引通常从1开始，这就是上述公式中$-1$的由来。\n但是像C或Python这类编程语言索引通常从0开始，这使得上述公式可以更加简洁。\n\n% -- 337 --\n \n我们有时会希望跳过核中的一些位置来降低计算的开销（相应的代价是提取特征没有先前那么好了）。\n我们可以把这一过程看作是对全卷积函数输出的下采样(downsampling)。\n如果我们只想在输出的每个方向上每间隔$s$个像素进行采样，那么我们可以定义一个下采样卷积函数$c$使得\n\\begin{equation}\n\\TEZ_{i,j,k} = c(\\TSK, \\TSV, s)_{i,j,k} = \\sum_{l,m,n} [\\TEV_{l,(j-1)\\times s+m, (k-1)\\times s +n,}\n \\TEK_{i,l,m,n}].\n \\label{eq:9.8}\n\\end{equation}\n我们把$s$称为下采样卷积的\\firstgls{stride}。\n当然也可以对每个移动方向定义不同的步幅。\n\\figref{fig:chap9_stride_conv}演示了一个实例。\n% fig 9.12\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/stride_conv}}\n\\fi\n\\caption{带有\\gls{stride}的卷积。\n在这个例子中，我们的\\gls{stride}为二。\n\\emph{(上)}\\,在单个操作中实现的\\gls{stride}为二的卷积。\n\\emph{(下)}\\,\\gls{stride}大于一个像素的卷积在数学上等价于单位\\gls{stride}的卷积随后\\gls{downsampling}。\n显然，涉及\\gls{downsampling}的两步法在计算上是浪费的，因为它计算了许多将被丢弃的值。}\n\\label{fig:chap9_stride_conv}\n\\end{figure}\n\n在任何\\gls{convolutional_network}的实现中都有一个重要性质，那就是能够隐含地对输入$\\TSV$用零进行填充(pad)使得它加宽。\n如果没有这个性质，\\gls{representation}的宽度在每一层就会缩减，缩减的幅度是比核少一个像素这么多。\n对输入进行零填充允许我们对核的宽度和输出的大小进行独立的控制。\n如果没有零填充，我们就被迫面临二选一的局面，要么选择网络空间宽度的快速缩减，要么选择一个小型的核——这两种情境都会极大得限制网络的表示能力。\n\\figref{fig:chap9_zero_pad_shrink}给出了一个例子。\n% fig 9.13\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/zero_pad_shrink}}\n\\fi\n\\caption{零填充对网络大小的影响。\n考虑一个\\gls{convolutional_network}，每层有一个宽度为六的核。 \n在这个例子中，我们不使用任何\\gls{pooling}，所以只有卷积操作本身缩小网络的大小。\n\\emph{(上)}在这个卷积网络中，我们不使用任何隐含的零填充。\n这使得表示在每层缩小五个像素。\n从十六个像素的输入开始，我们只能有三个卷积层，并且最后一层不能移动核，所以可以说只有两层是真正的卷积层。\n可以通过使用较小的核来减缓收缩速率，但是较小的核表示能力不足，并且在这种结构中一些收缩是不可避免的。\n\\emph{(下)}通过向每层添加五个隐含的零，我们防止了表示随深度收缩。\n这允许我们设计一个任意深的卷积网络。}\n\\label{fig:chap9_zero_pad_shrink}\n\\end{figure}\n\n有三种零填充设定的情况值得注意。\n第一种是无论怎样都不使用零填充的极端情况，并且卷积核只允许访问那些图像中能够完全包含整个核的位置。\n在MATLAB的术语中，这称为\\firstgls{valid}卷积。\n在这种情况下，输出的所有像素都是输入中相同数量像素的函数，这使得输出像素的表示更加规范。\n然而，输出的大小在每一层都会缩减。\n如果输入的图像宽度是$m$，核的宽度是$k$，那么输出的宽度就会变成$m-k+1$。\n如果卷积核非常大的话缩减率会非常显著。\n因为缩减数大于0，这限制了网络中能够包含的卷积层的层数。\n当层数增加时，网络的空间维度最终会缩减到$1\\times 1$，这种情况下增加的层就不可能进行有意义的卷积了。\n第二种特殊的情况是只进行足够的零填充来保持输出和输入具有相同的大小。\n在MATLAB的术语中，这称为\\firstgls{same}卷积。\n在这种情况下，只要硬件支持，网络就能包含任意多的卷积层，这是因为卷积运算不改变下一层的结构。。\n然而，输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。\n这可能会导致边界像素存在一定程度的欠表示。\n这使得第三种极端情况产生了，在MATLAB中称为\\firstgls{full}卷积。\n它进行了足够多的零填充使得每个像素在每个方向上恰好被访问了$k$次，最终输出图像的宽度为$m+k-1$。%\\footnote{译者注：图\\ref{fig:chap9_zero_pad_shrink}给出了\\gls{valid}卷积和\\gls{same}卷积的例子，这里对\\gls{full}卷积略作说明：我们可以认为\\gls{full}卷积是在输入的两端各填充$k-1$个零，使得输入的每个像素都恰好被核访问$k$次，最终得到的输出的宽度为$[m+2(k-1)]-k+1=m+k-1$}\n在这种情况下，输出像素中靠近边界的部分相比于中间部分是更少像素的函数。\n这将导致学得一个在卷积特征映射的所有位置都表现不错的单核更为困难。\n通常零填充的最优数量（对于测试集的分类正确率）处于``\\gls{valid}卷积''和``\\gls{same}卷积''之间的某个位置。\n\n% -- 338 --\n \n% -- 339 --\n\n在一些情况下，我们并不是真的想使用卷积，而是想用一些局部连接的网络层\\citep{LeCun86,LeCun89a}。\n在这种情况下，我们的\\gls{MLP}对应的邻接矩阵是相同的，但每一个连接都有它自己的权重，用一个6维的张量$\\TSW$来表示。\n$\\TSW$的索引分别是：输出的通道$i$，输出的行$j$和列$k$，输入的通道$l$，输入的行偏置$m$和列偏置$n$。\n局部连接层的线性部分可以表示为\n\\begin{equation}\n\\TEZ_{i,j,k} = \\sum_{l,m,n} [\\TEV_{l, j+m-1, k+n-1} w_{i, j, k, l, m, n}]. %这里应该是$\\TEW$?\n\\end{equation}\n这有时也被称为\\firstgls{unshared_convolution}，因为它和具有一个小核的离散卷积运算很像，但并不横跨位置来共享参数。\n图\\ref{fig:chap9_local}比较了局部连接、卷积和全连接的区别。\n% fig 9.14\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/local}}\n\\fi\n\\caption{局部连接，卷积和全连接的比较。\n\\emph{(上)}每一小片（接受域）有两个像素的局部连接层。\n每条边用唯一的字母标记，来显示每条边都有自身的权重参数。\n\\emph{(中)}核宽度为两个像素的卷积层。\n该模型与局部连接层具有完全相同的连接。\n区别不在于哪些单元相互交互，而在于如何共享参数。\n局部连接层没有\\gls{parameter_sharing}。\n正如用于标记每条边的字母重复出现所指示的，卷积层在整个输入上重复使用相同的两个权重。\n\\emph{(下)}全连接层类似于局部连接层，它的每条边都有其自身的参数（在该图中用字母明确标记的话就太多了）。 然而，它不具有局部连接层的连接受限的特征。}\n\\label{fig:chap9_local}\n\\end{figure}\n \n% -- 340 --\n \n当我们知道每一个特征都是一小块空间的函数并且相同的特征不会出现在所有的空间上时，局部连接层是很有用的。\n例如，如果我们想要辨别一张图片是否是人脸图像时，我们只需要去寻找嘴是否在图像下半部分即可。\n\n使用那些连接被更进一步限制的卷积或者局部连接层也是有用的，例如，限制每一个输出的通道$i$仅仅是输入通道$l$的一部分的函数时。\n实现这种情况的一种通用方法是使输出的前$m$个通道仅仅连接到输入的前$n$个通道，输出的接下来的$m$个通道仅仅连接到输入的接下来的$n$个通道，以此类推。\n\\figref{fig:chap9_conv_groups}给出了一个例子。\n对少量通道间的连接进行建模允许网络使用更少的参数，这降低了存储的消耗以及提高了统计效率，并且减少了前向和反向传播所需要的计算量。\n这些目标的实现并没有减少\\gls{hidden_unit}的数目。\n% fig 9.15\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/conv_groups}}\n\\fi\n\\caption{\\gls{convolutional_network}的前两个输出通道只和前两个输入通道相连，随后的两个输出通道只和随后的两个输入通道相连。}\n\\label{fig:chap9_conv_groups}\n\\end{figure}\n\n\\firstgls{tiled_convolution}\\citep{Gregor+LeCun-2010,Le2010}对卷积层和局部连接层进行了折衷。\n这里并不是对\\emph{每一个}空间位置的权重集合进行学习，我们学习一组核使得当我们在空间移动时它们可以循环利用。\n这意味着在近邻的位置上拥有不同的过滤器，就像局部连接层一样，但是对于这些参数的存储需求仅仅会增长常数倍，这个常数就是核的集合的大小，而不是整个输出的特征映射的大小。\n\\figref{fig:chap9_tiled}对局部连接层、\\gls{tiled_convolution}和标准卷积进行了比较。\n% fig 9.16\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/tiled}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{局部连接层、\\gls{tiled_convolution}和标准卷积的比较。\n当使用相同大小的核时，这三种方法在单元之间具有相同的连接。\n此图是对使用两个像素宽的核的说明。\n这三种方法之间的区别在于它们如何共享参数。\n\\emph{(上)}局部连接层根本没有共享参数。\n我们对每个连接使用唯一的字母标记，来表明每个连接都有它自身的权重。\n\\emph{(中)}\\gls{tiled_convolution}有$t$个不同的核。\n这里我们说明$t=2$的情况。\n其中一个核具有标记为``a''和``b''的边，而另一个具有标记为``c''和``d''的边。\n每当我们在输出中右移一个像素后，我们使用一个不同的核。\n这意味着，与局部连接层类似，输出中的相邻单元具有不同的参数。\n与局部连接层不同的是，在我们遍历所有可用的$t$个核之后，我们循环回到了第一个核。\n如果两个输出单元间隔$t$个步长的倍数，则它们共享参数。\n\\emph{(下)}传统卷积等效于$t=1$的\\gls{tiled_convolution}。\n它只有一个核，并且被应用到各个地方，我们在图中表示为在各处使用具有标记为``a''和``b''的边的核。}\n\\label{fig:chap9_tiled}\n\\end{figure}\n \n% -- 341 --\n \n为了用代数的方法定义\\gls{tiled_convolution}，令$\\TSK$是一个6维的张量\\footnote{译者注：原文将$\\TSK$误写成了$k$。}，其中的两维对应着输出映射中的不同位置。\n$\\TSK$在这里并没有对输出映射中的每一个位置使用单独的索引，输出的位置在每个方向上在$t$个不同的核组成的集合中进行循环。\n如果$t$等于输出的宽度，这就是局部连接层了。\n\\begin{equation}\n\\TEZ_{i, j, k} = \\sum_{l, m, n} \\TEV_{l, j+m-1, k+n-1} \\TEK_{i, l, m, n, j\\% t +1, k\\% t+1},\n\\end{equation}\n这里百分号是取模运算，它的性质包括$t\\% t =0, (t+1)\\% t = 1$等等。\n在每一维上使用不同的$t$可以很容易对这个方程进行扩展。\n \n% -- 342 --\n  \n% -- 343 --\n \n局部连接层与\\gls{tiled_convolution}层都和\\gls{max_pooling}有一些有趣的关联：这些层的探测单元都是由不同的过滤器驱动的。\n如果这些过滤器能够学会探测相同隐含特征的不同变换形式，那么\\gls{max_pooling}的单元对于学得的变换就具有不变性（如\\figref{fig:chap9_learned_rotation}所示）。\n卷积层对于平移具有内置的不变性。\n \n% -- 344 --\n \n实现\\gls{convolutional_network}时，通常也需要除卷积以外的其他运算。\n为了实现学习，必须在给定输出的梯度时能够计算核的梯度。\n在一些简单情况下，这种运算可以通过卷积来实现，但在很多我们感兴趣的情况下，包括\\gls{stride}大于1的情况，并不具有这样的性质。\n\n回忆一下卷积是一种线性运算，所以可以表示成矩阵乘法的形式（如果我们首先把输入张量变形为一个扁平的向量）。\n其中包含的矩阵是关于卷积核的函数。\n这个矩阵是稀疏的并且核的每个元素都复制给矩阵的多个元素。\n这种观点能够帮助我们导出实现一个\\gls{convolutional_network}所需的很多其他运算。\n\n通过卷积定义的矩阵转置的乘法就是这样一种运算。\n这种运算用于在卷积层反向传播误差的导数，所以它在训练多于一个\\gls{hidden_layer}的\\gls{convolutional_network}时是必要的。\n如果我们想要从\\gls{hidden_layer}单元重构可视化单元时，同样的运算也是需要的\\citep{Simard92-short}。\n重构可视化单元是本书第\\ref{part:deep_learning_research}部分的模型广泛用到的一种运算，这些模型包括\\gls{AE}、\\glssymbol{RBM}和稀疏编码等等。\n构建这些模型的卷积化的版本都要用到转置化卷积。\n类似核梯度运算，这种输入梯度运算在某些情况下可以用卷积来实现，但在一般情况下需要用到第三种运算来实现。%这里不是很懂\n必须非常小心地来使这种转置运算和\\gls{forward_propagation}过程相协调。\n转置运算返回的输出的大小取决于三个方面：零填充的策略、\\gls{forward_propagation}运算的\\gls{stride}以及\\gls{forward_propagation}的输出映射的大小。\n在一些情况下，不同大小的输入通过\\gls{forward_propagation}过程能够得到相同大小的输出映射，所以必须明确地告知转置运算原始输入的大小。\n\n这三种运算——卷积、从输出到权重的反向传播和从输出到输入的反向传播——对于训练任意深度的前馈\\gls{convolutional_network}，以及训练带有（基于卷积的转置的）重建函数的\\gls{convolutional_network}，这三种运算都足以计算它们所需的所有梯度。\n对于完全一般的多维、多样例情况下的公式，完整的推导可以参考~\\cite{Goodfellow-TR2010}。 \n为了直观说明这些公式是如何起作用的，我们这里给出一个二维单个样例的版本。\n \n% -- 345 --\n \n假设我们想要训练这样一个\\gls{convolutional_network}，它包含\\gls{stride}为$s$的\\gls{stride}卷积，该卷积的核为$\\TSK$，作用于多通道的图像$\\TSV$，定义为$c(\\TSK, \\TSV, s)$，就像\\eqnref{eq:9.8}中一样。\n假设我们想要最小化某个损失函数$J(\\TSV, \\TSK)$。\n在\\gls{forward_propagation}过程中，我们需要用$c$本身来输出$\\TSZ$，然后$\\TSZ$传递到网络的其余部分并且被用来计算损失函数$J$。\n在反向传播过程中，我们会得到一个张量$\\TSG$满足$\\TEG_{i, j, k} = \\frac{\\partial}{\\partial \\TEZ_{i, j, k}} J(\\TSV, \\TSK)$。\n\n为了训练网络，我们需要对核中的权重求导。\n为了实现这个目的，我们可以使用一个函数\n\\begin{equation}\ng(\\TSG, \\TSV, s)_{i, j, k, l} = \\frac{\\partial}{\\partial \\TEK_{i, j, k, l}} J(\\TSV, \\TSK) = \\sum_{m, n} \\TEG_{i, m, n} \\TEV_{j, (m-1)\\times s+k, (n-1)\\times s+l}.\n\\end{equation}\n\n如果这一层不是网络的底层，我们需要对$\\TSV$求梯度来使得误差进一步反向传播。\n我们可以使用如下的函数\n\\begin{eqnarray}\nh(\\TSK, \\TSG, s)_{i, j, k} &=& \\frac{\\partial }{\\partial \\TEV_{i, j, k}} J(\\TSV, \\TSK)\\\\\n&=& \\sum_{\\substack{l, m\\\\\n                  \\text{s.t.}\\\\\n                  (l-1)\\times s+m = j}} \\sum_{\\substack{n, p\\\\\n                                                            \\text{s.t.}\\\\\n                                                            (n-1)\\times s +p = k}}\n            \\sum_q \\TEK_{q,i,m,p} \\TEG_{q, l, n}.\n\\end{eqnarray}\n\n\\chapref{chap:autoencoders}描述的\\gls{AE}网络，是一些被训练成把输入拷贝到输出的前馈网络。\n一个简单的例子是\\,\\glssymbol{PCA}\\,算法，将输入$\\Vx$拷贝到一个近似的重构值$\\Vr$，通过函数${\\MW}^\\top \\MW \\Vx$来实现。\n使用权重矩阵转置的乘法，就像\\,\\glssymbol{PCA}\\,算法这种，在一般的\\gls{AE}中是很常见的。\n为了使这些模型卷积化，我们可以用函数$h$来实现卷积运算的转置。\n假定我们有和$\\TSZ$相同形式的隐藏单元$\\TSH$，并且我们定义一种重构运算\n\\begin{equation}\n\\TSR = h(\\TSK, \\TSH, s).\n\\end{equation}\n\n为了训练\\gls{AE}，我们会得到关于$\\TSR$的梯度，表示为一个张量$\\TSE$。\n为了训练解码器，我们需要获得对于$\\TSK$的梯度，这通过$g(\\TSH, \\TSE, s)$来得到。\n为了训练编码器，我们需要获得对于$\\TSH$的梯度，这通过$c(\\TSK, \\TSE, s)$来得到。\n通过用$c$和$h$对$g$求微分也是可行的，但这些运算对于任何标准神经网络上的反向传播算法来说都是不需要的。\n \n% -- 346 --\n \n一般来说，在卷积层从输入到输出的变换中我们不仅仅只用线性运算。\n我们一般也会在进行非线性运算前，对每个输出加入一些偏置项。\n这样就产生了如何在偏置项中共享参数的问题。\n对于局部连接层，很自然地对每个单元都给定它特有的偏置，对于\\gls{tiled_convolution}，也很自然地用与核一样的平铺模式来共享参数。\n对于卷积层来说，通常的做法是在输出的每一个通道上都设置一个偏置，这个偏置在每个卷积映射的所有位置上共享。\n然而，如果输入是已知的固定大小，也可以在输出映射的每个位置学习一个单独的偏置。\n分离这些偏置可能会稍稍降低模型的统计效率，但同时也允许模型来校正图像中不同位置的统计差异。\n例如，当使用隐含的零填充时，图像边缘的探测单元接收到较少的输入，因此需要较大的偏置。\n\n\\section{结构化输出}\n\\label{sec:structured_outputs}\n\n\\gls{CNN}可以用于输出高维的结构化对象，而不仅仅是预测分类任务的类标签或回归任务的实数值。\n通常这个对象只是一个张量，由标准卷积层产生。\n例如，模型可以产生张量$\\TSS$，其中$\\TES_{i,j,k}$是网络的输入像素$(j, k)$属于类$i$的概率。\n这允许模型标记图像中的每个像素，并绘制沿着单个对象轮廓的精确掩模。\n\n经常出现的一个问题是输出平面可能比输入平面要小，如\\figref{fig:chap9_zero_pad_shrink}所示。\n用于对图像中单个对象分类的常用结构中，网络空间维数的最大减少来源于使用大\\gls{stride}的\\gls{pooling}层。\n为了产生与输入大小相似的输出映射，我们可以完全避免使用\\gls{pooling}\\citep{jain2007supervised}。\n另一种策略是单纯地产生一张低分辨率的标签网格\\citep{Pinheiro+Collobert-ICML2014,Pinheiro+Collobert-CVPR2015}。\n最后，原则上可以使用具有单位\\gls{stride}的\\gls{pooling}操作。\n\n对图像逐个像素标记的一种策略是先产生图像标签的原始猜测，然后使用相邻像素之间的交互来修正该原始猜测。\n重复这个修正步骤数次对应于在每一步使用相同的卷积，该卷积在深层网络的最后几层之间共享权重\\citep{jain2007supervised}。\n这使得在层之间共享参数的连续的卷积层所执行的一系列运算，形成了一种特殊的\\gls{RNN}~\\citep{Pinheiro+Collobert-ICML2014,Pinheiro+Collobert-CVPR2015}。\n\\figref{fig:chap9_iterative}给出了这样一个循环\\gls{convolutional_network}的结构。\n% fig 9.17\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/iterative}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{用于像素标记的\\gls{recurrent_convolutional_network}的示例。\n输入是图像张量$\\TSX$，它的轴对应图像的行、列和通道（红，绿，蓝）。\n目标是输出标签张量$\\hat{Y}$，它遵循每个像素的标签的概率分布。\n该张量的轴对应图像的行、列和不同类别。\n\\gls{recurrent_network}通过使用$\\hat{Y}$的先前估计作为创建新估计的输入，来迭代地改善其估计，而不是单次输出$\\hat{Y}$，。\n每个更新的估计使用相同的参数，并且估计可以如我们所愿地被改善任意多次。\n每一步使用的卷积核张量$\\TSU$，是用来计算给定输入图像的隐藏表示的。\n核张量$\\TSV$用于产生给定隐藏值时标签的估计。\n除了第一步之外，核$\\TSW$都对$\\hat{Y}$进行卷积来提供隐藏层的输入。\n在第一步中，此项由零代替。\n因为每一步使用相同的参数，所以这是一个\\gls{recurrent_network}的例子，如\\chapref{chap:sequence_modeling_recurrent_and_recursive_nets}所述。}\n\\label{fig:chap9_iterative}\n\\end{figure}\n\n% -- 347 --\n \n一旦对每个像素都进行了预测，我们就可以使用各种方法来进一步处理这些预测，以便获得图像在区域上的分割\\citep{Briggman-et-al-NIPS2009,Turaga2010,Farabet-et-al-2013}。\n一般的想法是假设大片相连的像素倾向于对应着相同的标签。\n图模型可以描述相邻像素间的概率关系。\n或者，\\gls{convolutional_network}可以被训练来最大化地近似图模型的训练目标\\citep{Ning-et-al-2005,Thompson-et-al-NIPS2014}。\n\n\\section{数据类型}\n\\label{sec:data_types}\n\n\\gls{convolutional_network}使用的数据通常包含多个通道，每个通道是时间上或空间中某一点的不同观测量。\n参考表\\,\\ref{table:data_types}\\,来了解具有不同维数和通道数的数据类型的例子。\n \n% -- 348 --\n\\begin{table}[htbp!]\n\\centering\n \\begin{tabular}[t]{l|p{0.4\\textwidth}|p{0.4\\textwidth}}\n& 单通道 & 多通道\\\\ \\hline\n1维 & \n音频波形：卷积的轴对应于时间。我们将时间离散化并且在每个时间点测量一次波形的振幅。 &  \n骨架动画(skeleton animation)数据：计算机渲染的3D角色动画是通过随时间调整``骨架''的姿势而生成的。 在每个时间点，角色的姿势通过骨架中的每个关节的角度来描述。我们输入到卷积模型的数据的每个通道，表示一个关节关于一个轴的角度。\\\\ \\hline\n2维 & \n已经使用\\gls{Fourier_transform}预处理过的音频数据：我们可以将音频波形变换成2维张量，不同的行对应不同的频率，不同的列对应不同的时间点。在时间轴上使用卷积对于时间上的移动具有等变性。在频率轴上使用卷积使得模型对于在频率上的移动具有等变性，这使得在不同八度音阶中播放的相同旋律产生相同的表示，但处于网络输出中的不同高度。 & %Fourier transform这里不是很清楚，在频率上使用卷积是做什么的？\n彩色图像数据：其中一个通道包含红色像素，另一个包含绿色像素，最后一个包含蓝色像素。在图像的水平轴和竖直轴上移动卷积核，赋予了两个方向上平移等变性。\\\\ \\hline\n3维 &\n体积数据：这种数据一般来源于医学成像技术，例如CT扫描等。 & \n彩色视频数据：其中一个轴对应着时间，另一个轴对应着视频帧的高度，最后一个对应着视频帧的宽度。\\\\\n\\end{tabular}\n\\caption{用于\\gls{convolutional_network}的不同数据格式的示例。}\n\\label{table:data_types}\n\\end{table}\n% -- 349 --\n \n\\gls{convolutional_network}用于视频的例子，可以参考~\\cite{Chen-Ting-2010}。\n\n到目前为止，我们仅讨论了训练和测试数据中的每个样例都有相同的空间维度的情况。\n\\gls{convolutional_network}的一个优点是它们还可以处理具有可变的空间尺度的输入。\n这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。\n这为\\gls{convolutional_network}的使用提供了令人信服的理由，即使当计算开销和过拟合都不是主要问题时。\n%\\footnote{译者注：传统的基于矩阵乘法的神经网络会面对计算开销和过拟合的问题，即使当计算开销和过拟合都不是主要问题时，我们也有充分的理由来使用卷积网络而不是传统的神经网络，因为卷积网络可以处理可变大小的输入。}\n\n例如，考虑一组图像的集合，其中每个图像具有不同的高度和宽度。\n目前还不清楚如何用固定大小的权重矩阵对这样的输入进行建模。\n卷积就可以很直接地应用；核依据输入的大小简单地被使用不同次，并且卷积运算的输出也相应地放缩。\n卷积可以被视为矩阵乘法；相同的卷积核为每种大小的输入引入了一个不同大小的\\gls{doubly_block_circulant_matrix}。\n有时，网络的输出允许和输入一样具有可变的大小，例如如果我们想要为输入的每个像素分配一个类标签。\n在这种情况下，不需要进一步的设计工作。\n在其他情况下，网络必须产生一些固定大小的输出，例如，如果我们想要为整个图像指定单个类标签。\n在这种情况下，我们必须进行一些额外的设计步骤，例如插入一个\\gls{pooling}层，\\gls{pooling}区域的大小要与输入的大小成比例，以便保持固定数量的\\gls{pooling}输出。\n这种策略的一些例子可以参考\\figref{fig:chap9_cnn_classifier}。\n\n注意，使用卷积处理可变尺寸的输入，仅对输入是因为包含对同种事物的不同量的观察(时间上不同长度的记录，空间上不同宽度的观察等)而导致的尺寸变化这种情况才有意义。\n如果输入是因为它可以选择性地包括不同种类的观察而具有可变尺寸，使用卷积是不合理的。\n例如，如果我们正在处理大学申请，并且我们的特征包括成绩等级和标准化测试分数，但不是每个申请人都进行了标准化测试，则使用相同的权重来对成绩特征和测试分数特征进行卷积是没有意义的。\n\n\\section{高效的卷积算法}\n\\label{sec:efficient_convolution_algorithms}\n\n现代\\gls{convolutional_network}的应用通常需要包含超过百万个单元的网络。\n利用并行计算资源的强大实现是很关键的，如\\secref{sec:large_scale_deep_learning}中所描述的。\n然而，在很多情况下，也可以通过选择适当的卷积算法来加速卷积。\n \n% -- 350 --\n \n卷积等效于使用\\gls{Fourier_transform}将输入与核都转换到频域、执行两个信号的逐点相乘，再使用傅立叶逆变换转换回时域。\n对于某些问题的规模，这种算法可能比离散卷积的朴素实现更快。\n\n当一个$d$维的核可以表示成$d$个向量（每一维一个向量）的外积时，该核被称为\\firstgls{separable}。\n当核可分离时，朴素的卷积是低效的。\n它等价于组合$d$个一维卷积，每个卷积使用这些向量中的一个。\n组合方法显著快于使用它们的外积来执行一个$d$维的卷积。\n并且核也只要更少的参数来表示成向量。\n如果核在每一维都是$w$个元素宽，那么朴素的多维卷积需要$O(w^d)$的运行时间和参数存储空间，而可分离卷积只需要$O(w\\times d)$的运行时间和参数存储空间。\n当然，并不是每个卷积都可以表示成这种形式。\n\n设计更快的执行卷积或近似卷积，而不损害模型准确性的方法，是一个活跃的研究领域。 \n甚至仅提高\\gls{forward_propagation}效率的技术也是有用的，因为在商业环境中，通常部署网络比训练网络还要耗资源。\n\n\\section{随机或无监督的特征}\n\\label{sec:random_or_unsupervised_features}\n\n通常，\\gls{convolutional_network}训练中最昂贵的部分是学习特征。 \n输出层的计算代价通常相对不高，因为在通过若干层\\gls{pooling}之后作为该层输入的特征的数量较少。\n当使用梯度下降执行\\gls{supervised}训练时，每步梯度计算需要完整地运行整个网络的前向传播和反向传播。\n减少\\gls{convolutional_network}训练成本的一种方式是使用那些不是由\\gls{supervised}方式训练得到的特征。\n\n有三种基本策略可以不通过\\gls{supervised}训练而得到卷积核。\n其中一种是简单地随机初始化它们。\n另一种是手动设计它们，例如设置每个核在一个特定的方向或尺度来检测边缘。\n最后，可以使用无监督的标准来学习核。\n例如，\\cite{Coates2011}将$k$均值聚类算法应用于小图像块，然后使用每个学得的中心作为卷积核。\n第\\ref{part:deep_learning_research}部分描述了更多的无监督学习方法。\n使用无监督的标准来学习特征，允许这些特征的确定与位于网络结构顶层的分类层相分离。\n然后只需提取一次全部训练集的特征，构造用于最后一层的新训练集。\n假设最后一层类似\\gls{logistic_regression}或者\\,\\glssymbol{SVM}，那么学习最后一层通常是凸优化问题。\n\n \n% -- 351 --\n \n随机过滤器经常在\\gls{convolutional_network}中表现得出乎意料得好~\\cite{Jarrett-ICCV2009-small,Saxe-ICML2011,pinto2011scaling,cox2011beyond}。\n\\cite{Saxe-ICML2011}~说明，由卷积和随后的\\gls{pooling}组成的层，当赋予随机权重时，自然地变得具有频率选择性和平移不变性。\n他们认为这提供了一种廉价的方法来选择\\gls{convolutional_network}的结构：首先通过仅训练最后一层来评估几个\\gls{convolutional_network}结构的性能，然后选择最好的结构并使用更昂贵的方法来训练整个网络。\n\n一个中间方法是学习特征，但是使用那种不需要在每个梯度计算步骤中都进行完整的前向和反向传播的方法。\n与多层感知机一样，我们使用\\gls{greedy_layer_wise_pretraining}，单独训练第一层，然后一次性地从第一层提取所有特征，之后用那些特征单独训练第二层，以此类推。\n\\chapref{chap:optimization_for_training_deep_models}描述了如何实现\\gls{supervised}的\\gls{greedy_layer_wise_pretraining}，第\\ref{part:deep_learning_research}部分将此扩展到了无监督的范畴。\n卷积模型的\\gls{greedy_layer_wise_pretraining}的经典模型是卷积\\gls{DBN}\\citep{HonglakL2009}。\n\\gls{convolutional_network}为我们提供了相对于多层感知机更进一步采用预训练策略的机会。\n我们可以训练一小块模型，而并非一次训练整个卷积层，就像~\\cite{Coates2011}使用$k$均值做的那样。\n然后，我们可以用来自这个小块模型的参数来定义卷积层的核。\n这意味着使用无监督学习来训练\\gls{convolutional_network}\\emph{并且在训练的过程中完全不使用卷积}是可能的。\n使用这种方法，我们可以训练非常大的模型，并且只在推断期间产生高计算成本\\citep{ranzato-cvpr-07-small,Jarrett-ICCV2009-small,koray-nips-10-small,icml2013_coates13}。\n这种方法大约在2007到2013年间流行，当时标记的数据集很小，并且计算能力有限。\n如今，大多数\\gls{convolutional_network}以纯粹\\gls{supervised}的方式训练，在每次训练迭代中使用通过整个网络的完整的前向和反向传播。\n \n% -- 352 --\n \n与其他无监督预训练的方法一样，使用这种方法的一些好处仍然难以说清成因。\n可能是无监督预训练可以提供一些相对于\\gls{supervised}训练的正则化，或者它可以简单地允许我们训练更大的结构，因为它的学习规则降低了计算成本。\n\n\\section{\\glsentrytext{convolutional_network}的神经科学基础}\n\\label{sec:the_neuroscientific_basis_for_convolutional_networks}\n\n\\gls{convolutional_network}也许是生物学启发人工智能的最为成功的案例。\n虽然\\gls{convolutional_network}也受到了许多其他领域的指导，但是神经网络的一些关键设计原则来自于神经科学。\n\n\\gls{convolutional_network}的历史始于神经科学实验，这些实验远早于相关计算模型的发展。\n为了确定关于哺乳动物视觉系统如何工作的许多最基本的事实，神经生理学家David Hubel和Torsten Wiesel合作多年\\citep{Hubel+Wiesel-1959,Hubel62,Hubel+Wiesel-1968}。\n他们的成就最终获得了诺贝尔奖。\n他们的发现对当代深度学习模型有最大影响的是基于记录猫的单个神经元的活动。\n他们观察了猫的脑内神经元如何响应投影在猫前面屏幕上精确位置的图像。\n他们的伟大发现是，处于视觉系统较为前面的神经元对非常特定的光模式（例如精确定向的条纹）反应最强烈，但对其他模式几乎完全没有反应。\n\n他们的工作有助于表征大脑功能的许多方面，这些方面超出了本书的范围。\n从深度学习的角度来看，我们可以专注于简化的、草图形式的大脑功能视图。\n\n在这个简化的视图中，我们关注被称为V1的大脑的一部分，也称为\\firstgls{primary_visual_cortex}。\nV1是大脑对视觉输入开始执行显著高级处理的第一个区域。\n在该草图视图中，图像是由光到达眼睛并刺激视网膜（眼睛后部的光敏组织）形成的。\n视网膜中的神经元对图像执行一些简单的预处理，但是基本不改变它被表示的方式。\n然后图像通过视神经和称为\\emph{外侧膝状核}的脑部区域。 \n这些解剖区域的主要作用是仅仅将信号从眼睛传递到位于头后部的V1。\n \n% -- 353 --\n \n\\gls{convolutional_network}层被设计为描述V1的三个性质：\n\\begin{enumerate}\n  \\item V1是以某种具有空间对应关系的方式排布的。\n  %这里翻译不好\n  它实际上具有二维结构来反映视网膜中的图像结构。\n  例如，到达视网膜下半部的光仅影响V1中相应的一半。 \n  \\gls{convolutional_network}通过用二维映射定义特征的方式来体现该特性。\n\n  \\item V1包含许多\\firstgls{simple_cells}。\n  简单细胞的活动在某种程度上可以概括为在一个小的空间位置感受野内的图像的线性函数。\n  \\gls{convolutional_network}的检测器单元被设计为模拟简单细胞的这些性质。\n\n  \\item V1还包括许多\\firstgls{complex_cells}。\n  这些细胞响应的特征类似于由简单细胞检测的那些特征，但是复杂细胞对于特征的位置微小偏移具有不变性。 \n  这启发了\\gls{convolutional_network}的\\gls{pooling}单元。\n  复杂细胞对于照明中的一些变化也是不变的，不能简单地通过在空间位置上\\gls{pooling}来刻画。 \n  这些不变性激发了\\gls{convolutional_network}中的一些跨通道\\gls{pooling}策略，例如maxout单元\\citep{Goodfellow-et-al-ICML2013}。\n\\end{enumerate}\n\n虽然我们最了解V1，但是一般认为相同的基本原理也适用于视觉系统的其他区域。\n在我们视觉系统的草图视图中，当我们逐渐深入大脑时，遵循\\gls{pooling}的基本探测策略被反复执行。\n当我们穿过大脑的多个解剖层时，我们最终会看到一些响应特定概念的细胞，这些细胞对输入的很多种变换都具有不变性。\n这些细胞被昵称为``祖母细胞''——这个想法是一个人可能有一个神经元，当看到他祖母的照片时该神经元被激活，无论祖母是出现在照片的左边或右边，无论照片是她的脸部的特写镜头还是她的全身照，也无论她处在光亮还是黑暗中，等等。\n\n这些祖母细胞已经被证明确实存在于人脑中，在一个被称为\\emph{内侧颞叶}的区域\\citep{quiroga2005invariant}。\n研究人员测试了单个神经元是否会响应名人的照片。\n他们发现了后来被称为``Halle Berry神经元''的神经元：由Halle Berry的概念激活的单个神经元。\n当一个人看到Halle Berry的照片，Halle Berry的图画，甚至包含单词``Halle Berry''的文本时，这个神经元会触发。\n当然，这与Halle Berry本人无关；其他神经元会对Bill Clinton，Jennifer Aniston等的出现做出响应。\n \n% -- 354 --\n \n这些内侧颞叶神经元比现代\\gls{convolutional_network}更通用一些，这些网络在读取名称时不会自动联想到识别人或对象。\n与\\gls{convolutional_network}的最后一层在特征上最接近的类比是称为\\emph{颞下皮质}（IT）的脑区。\n当查看一个对象时，信息从视网膜经LGN流到V1，然后到V2，V4，之后是IT。\n这发生在瞥见对象的前100ms内。\n如果允许一个人继续观察对象更多的时间，那么信息将开始回流，因为大脑使用自上而下的反馈来更新较低级脑区中的激活。\n然而，如果我们打断人的注视，并且只观察前100ms内的大多数前向激活导致的放电率，那么IT被证明与\\gls{convolutional_network}非常相似。\n\\gls{convolutional_network}可以预测IT放电率，并且在执行对象识别任务时与人类（时间有限的情况）非常类似\\citep{dicarlo-tutorial-2013}。\n\n话虽如此，\\gls{convolutional_network}和哺乳动物的视觉系统之间还是有许多区别。\n这些区别有一些是计算神经科学家所熟知的，但超出了本书的范围。\n还有一些区别尚未知晓，因为关于哺乳动物视觉系统如何工作的许多基本问题仍未得到回答。\n简要列表如下：\n\\begin{itemize}\n  \\item 人眼大部分是非常低的分辨率，除了一个被称为\\firstgls{fovea}的小块。\n  中央凹仅观察在手臂长度距离内一块拇指大小的区域。\n  虽然我们觉得我们可以看到高分辨率的整个场景，但这是由我们的大脑的潜意识部分创建的错觉，因为它缝合了我们瞥见的若干个小区域。\n  大多数\\gls{convolutional_network}实际上接收大的全分辨率的照片作为输入。\n  人类大脑控制几次眼动，称为\\firstgls{saccade}，以瞥见场景中最显眼的或任务相关的部分。\n  将类似的\\gls{attention_mechanism}融入深度学习模型是一个活跃的研究方向。\n  在深度学习的背景下，\\gls{attention_mechanism}对于自然语言处理是最成功的，参考\\secref{sec:using_an_attention_mechanism_and_aligning_pieces_of_data}。\n  研究者已经研发了几种具有视觉机制的视觉模型，但到目前为止还没有成为主导方法\\citep{Larochelle2010,Denil2012}。\n  \n  \\item 人类视觉系统与许多其他感觉相集成，例如听觉，以及像我们的心情和想法一样的因素。\n  \\gls{convolutional_network}迄今为止纯粹是视觉的。\n  \n  \\item 人类视觉系统不仅仅用于识别对象。\n  它能够理解整个场景，包括许多对象，对象和对象之间的关系，以及处理我们的身体与世界交互所需的丰富的三维几何信息。\n  \\gls{convolutional_network}已经应用于这些问题中的一些，但是这些应用还处于起步阶段。\n  \n  \\item 即使像V1这样简单的大脑区域也受到来自较高级别的反馈的严重影响。\n  反馈已经在神经网络模型中被广泛地探索，但还没有被证明提供了引人注目的改进。\n  \n  \\item 虽然前馈IT放电频率刻画了与\\gls{convolutional_network}特征很多相同的信息，但是仍不清楚中间计算的相似程度。\n  大脑可能使用非常不同的激活和\\gls{pooling}函数。\n  单个神经元的激活可能不能用单个线性过滤器的响应来很好地表征。\n  最近的V1模型涉及对每个神经元的多个二次过滤器\\citep{rust:2005}。\n  事实上，我们的``简单细胞''和``复杂细胞''的草图图片可能并没有区别；简单细胞和复杂细胞可能是相同种类的细胞，但是它们的``参数''使得它们能够实现从我们所说的``简单''到``复杂''的连续的行为。\n\\end{itemize}\n \n% -- 355 --\n \n还值得一提的是，神经科学很少告诉我们该如何\\emph{训练}\\gls{convolutional_network}。\n具有跨多个空间位置的\\gls{parameter_sharing}的模型结构，可以追溯到早期关于视觉的联结主义模型\\citep{Marr76}，但是这些模型没有使用现代的反向传播算法和梯度下降。\n例如，\\citep{Fukushima80}结合了现代\\gls{convolutional_network}的大多数模型结构设计元素，但依赖于层次化的无监督聚类算法。\n\n\\cite{Lang+Hinton88}引入反向传播来训练\\firstall{TDNNs}。\n使用当代术语来说，TDNN是用于时间序列的一维\\gls{convolutional_network}。\n用于这些模型的反向传播不受任何神经科学观察的启发，并且被一些人认为是生物不可信的。\n在基于使用反向传播训练的TDNN成功之后，\\cite{LeCun89d}通过将相同的训练算法应用于图像的2维卷积来发展现代\\gls{convolutional_network}。\n\n到目前为止，我们已经描述了简单细胞对于某些特征是如何呈现粗略的线性和选择性，复杂细胞是如何更加的非线性，并且对于这些简单细胞特征的某些变换具有不变性，以及在选择性和不变性之间交替放置的层可以产生对非常特定现象作出反应的祖母细胞。\n我们还没有精确描述这些单个细胞检测到了什么。\n在深度非线性网络中，可能难以理解单个细胞的功能。\n第一层中的简单细胞相对更容易分析，因为它们的响应由线性函数驱动。\n在人工神经网络中，我们可以直接显示卷积核的图像，来查看卷积层的相应通道是如何响应的。\n在生物神经网络中，我们不能访问权重本身。\n相反，我们在神经元自身中放置一个电极，在动物视网膜前显示几个白噪声图像样本，并记录这些样本中的每一个是如何导致神经元激活的。\n然后，我们可以对这些响应拟合线性模型，以获得近似的神经元权重。\n这种方法被称为\\firstgls{reverse_correlation}\\citep{ringach2004reverse}。\n \n% -- 356 --\n \n\\gls{reverse_correlation}向我们表明，大多数的V1细胞具有由\\firstgls{Gabor_function}所描述的权重。\n\\gls{Gabor_function}描述在图像中的2维点处的权重。我们可以认为图像是2维坐标$I(x,y)$的函数。\n类似地，我们可以认为简单细胞是在图像中的一组位置采样，这组位置由一组$x$坐标$\\SetX$和一组$y$坐标$\\SetY$来定义，并且使用的权重$w(x,y)$也是位置的函数。\n从这个观点来看，简单细胞对于图像的响应由下式给出\n\\begin{equation}\n  s(I)=\\sum_{x\\in \\SetX} \\sum_{y\\in \\SetY} w(x, y)I(x,y).\n\\end{equation}\n特别地，$w(x,y)$采用\\gls{Gabor_function}的形式：\n\\begin{equation}\n  w(x, y; \\alpha, \\beta_x, \\beta_y, f, \\phi, x_0, y_0, \\tau) = \\alpha \\exp(-\\beta_x x'^2 - \\beta_y y'^2) \\cos (fx' + \\phi),\n\\end{equation}\n其中\n\\begin{equation}\n  x' = (x-x_0)\\cos(\\tau) + (y-y_0)\\sin(\\tau)\n\\end{equation}\n以及\n\\begin{equation}\n  y' = -(x-x_0) \\sin(\\tau) + (y-y_0)\\cos(\\tau).\n\\end{equation}\n\n这里$\\alpha, \\beta_x, \\beta_y, f, \\phi, x_0, y_0, \\tau$都是控制~\\gls{Gabor_function}性质的参数。\n\\figref{fig:chap9_Gabor_functions}给出了\\gls{Gabor_function}在不同参数集上的一些例子。\n% fig 9.18\n\\begin{figure}\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering    \n\\subfigure{ \\label{fig:chap9_Gabor_functions_a}     \n\\includegraphics[width=0.3\\textwidth]{Chapter9/figures/gabor_coordinate_system.png}}     \n\\subfigure{ \\label{fig:chap9_Gabor_functions_b}     \n\\includegraphics[width=0.3\\textwidth]{Chapter9/figures/gabor_scale.png}}\n\\subfigure{ \\label{fig:chap9_Gabor_functions_c}     \n\\includegraphics[width=0.3\\textwidth]{Chapter9/figures/gabor_sinusoid.png}}     \n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{具有各种参数设置的\\gls{Gabor_function}。\n白色表示绝对值大的正权重，黑色表示绝对值大的负权重，背景灰色对应于零权重。\n\\emph{(左)}控制坐标系的参数具有不同值的\\gls{Gabor_function}，这些参数包括：$x_0$、$y_0$和$\\gamma$。\n在该网格中的每个\\gls{Gabor_function}被赋予和它在网格中的位置成比例的$x_0$和$y_0$的值，并且$\\tau$被选择为使得每个Gabor过滤器对从网格中心辐射出的方向非常敏感。\n对于其他两幅图，$x_0$、$y_0$和$\\gamma$固定为零。\n\\emph{(中)}具有不同高斯比例参数$\\beta_x$和$\\beta_y$的\\gls{Gabor_function}。\n当我们从左到右通过网格时，\\gls{Gabor_function}被设置为增加宽度（减少$\\beta_x$）；当我们从上到下通过网格时，\\gls{Gabor_function}被设置为为增加高度（减少$\\beta_y$）。\n对于其他两幅图，$\\beta$值固定为图像宽度的1.5倍。\n\\emph{(右)}具有不同的正弦参数$f$和$\\phi$的\\gls{Gabor_function}。\n当我们从上到下移动时，$f$增加；当我们从左到右移动时，$\\phi$增加。对于其他两幅图，$\\phi$固定为0，$f$固定为图像宽度的5倍。}     \n\\label{fig:chap9_Gabor_functions}     \n\\end{figure}\n\n参数$x_0,y_0$和$\\tau$定义坐标系。\n我们平移和旋转$x$和$y$来得到$x'$和$y'$。\n具体地，简单细胞会响应以点$(x_0, y_0)$为中心的图像特征，并且当我们沿着从水平方向旋转$\\tau$弧度的线移动时，简单细胞将响应亮度的变化。\n \n% -- 357 --\n \n作为$x'$和$y'$的函数，函数$w$会响应当我们沿着$x'$移动时的亮度变化。\n它有两个重要的因子：一个是高斯函数，另一个是余弦函数。\n\n高斯因子$ \\alpha \\exp(-\\beta_x x'^2 - \\beta_y y'^2)$可以被视为阈值项，用于保证简单细胞仅对接近$x'$和$y'$都为零点处的值响应，换句话说，接近细胞接受域的中心。\n尺度因子$\\alpha$调整简单细胞响应的总的量级，而$\\beta_x$和$\\beta_y$控制接受域消退的速度。\n\n余弦因子$ \\cos (fx' + \\phi)$控制简单细胞如何响应延$x‘$轴的亮度改变。\n参数$f$控制余弦的频率，$\\phi$控制它的相位偏移。\n\n合在一起，简单细胞的这个草图视图意味着，简单细胞对在特定位置处、特定方向上、特定空间频率的亮度进行响应。\n当图像中的光波与细胞的权重具有相同的相位时，简单细胞是最兴奋的。\n这种情况发生在当图像亮时，它的权重为正，而图像暗时，它的权重为负。\n当光波与权重完全异相时，简单细胞被抑制——当图像较暗时，它的权重为正；较亮时，它的权重为负。\n \n% -- 358 --\n \n复杂细胞的草图视图是它计算包含两个简单细胞响应的2维向量的$L^2$范数：$c(I)=\\sqrt{s_0(I)^2 + s_1(I)^2}$。\n一个重要的特殊情况是当$s_1$和$s_0$具有除$\\phi$ 以外都相同的参数，并且$\\phi$被设置为使得$s_1$与$s_0$相位相差四分之一周期时。\n在这种情况下，$s_0$和$s_1$形成\\firstgls{quadrature_pair}。\n当高斯重新加权的图像$I(x,y)\\exp(-\\beta_x x'^2 -\\beta_y y^2)$包含具有频率$f$、在方向$\\tau$上、接近$(x_0, y_0)$的高振幅正弦波时，用先前方法定义的复杂细胞会响应，并且\\emph{不管该波的相位偏移}。\n换句话说，复杂细胞对于图像在方向$\\tau$上的微小平移或者翻转图像（用白色代替黑色，反之亦然）具有不变性。\n\n神经科学和机器学习之间最显著的对应关系，是从视觉上比较机器学习模型学得的特征与使用V1得到的特征。\n\\cite{Olshausen+Field-1996}说明，一个简单的无监督学习算法，稀疏编码，学习的特征具有与简单细胞类似的感受野。\n从那时起，我们发现，当应用于自然图像时，极其多样的统计学习算法都会学习到类\\gls{Gabor_function}的特征。这包括大多数深度学习算法，它们在其第一层中学习这些特征。\n\\figref{fig:chap9_feature_detectors}给出了一些例子。\n因为如此众多不同的学习算法会学习到边缘检测器，所以很难仅基于学习算法学得的特征，来断定哪一个特定的学习算法是``正确''的大脑模型（虽然，当应用于自然图像时，如果一个算法\\emph{不能}学得某种检测器时，它能够作为一种否定标志）。\n这些特征是自然图像的统计结构的重要部分，并且可以通过许多不同的统计建模方法来重新获得。\n读者可以参考\\citep{hyvarinen-book2009}来获得自然图像统计领域的综述。\n% fig 9.19\n\\begin{figure}\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering    \n\\subfigure{ \\label{fig:chap9_feature_detectors_a}     \n\\includegraphics[width=0.4\\textwidth]{Chapter9/figures/s3c_filters.png}}    \n\\subfigure{ \\label{fig:chap9_feature_detectors_b}     \n\\includegraphics[width=0.4\\textwidth]{Chapter9/figures/maxout_kernels.png}}  \n\\fi\n\\caption{许多机器学习算法在应用于自然图像时，会学习那些用来检测边缘或边缘的特定颜色的特征。 \n这些特征检测器使人联想到已知存在于初级视觉皮层中的~\\gls{Gabor_function}。   \n\\emph{(左)}通过应用于小图像块的无监督学习算法（\\gls{ss}稀疏编码）学得的权重。%这里不是很懂\n\\emph{(右)}由完全\\gls{supervised}的卷积~\\gls{maxout}~网络的第一层学得的卷积核。 相邻的一对过滤器驱动相同的~\\gls{maxout_unit}。}     \n\\label{fig:chap9_feature_detectors}     \n\\end{figure}\n\n\\section{卷积网络与深度学习的历史}\n\\label{sec:convolutional_networks_and_the_history_of_deep_learning}\n \n% -- 359 --\n \n\\gls{convolutional_network}在深度学习的历史中发挥了重要作用。\n它们是将研究大脑获得的深刻理解成功用于机器学习应用的关键例子。\n它们也是首批表现良好的深度模型之一，远远早于任意深度模型被认为是可行之前。\n\\gls{convolutional_network}也是第一个解决重要商业应用的神经网络，并且仍然处于当今深度学习商业应用的前沿。\n例如，在20世纪90年代，AT\\&T的神经网络研究小组开发了一个用于读取支票的\\gls{convolutional_network}\\citep{LeCun98-small}。\n到90年代末，NEC部署的这个系统已经被用于读取美国10％以上的支票。\n后来，微软部署了若干个基于\\gls{convolutional_network}的OCR和手写识别系统\\citep{simard-03-small}。 \n关于\\gls{convolutional_network}的这种应用和更现代应用的更多细节，参考\\chapref{chap:applications}。\n读者可以参考\\citep{Lecun_convolutionalnetworks}了解2010年之前的更为深入的\\gls{convolutional_network}历史。\n\n\\gls{convolutional_network}也被用作在许多比赛中的取胜手段。\n当前对深度学习的商业兴趣的热度始于\\cite{Krizhevsky-2012-small}赢得了ImageNet对象识别挑战，但是在那之前，\\gls{convolutional_network}也已经被用于赢得前些年影响较小的其他机器学习和计算机视觉竞赛了。\n \n% -- 360 --\n \n\\gls{convolutional_network}是第一批能使用反向传播有效训练的深度网络之一。\n现在仍不完全清楚为什么\\gls{convolutional_network}在一般的反向传播网络被认为已经失败时反而成功了。\n这可能可以简单地归结为\\gls{convolutional_network}比全连接网络计算效率更高，因此使用它们运行多个实验并调整它们的实现和超参数更容易。\n更大的网络也似乎更容易训练。\n利用现代硬件，大型全连接的网络在许多任务上也表现得很合理，即使使用过去那些全连接网络被认为不能工作得很好的数据集和当时流行的激活函数时，现在也能执行得很好。\n心理可能是神经网络成功的主要阻碍（实践者没有期望神经网络有效，所以他们没有认真努力地使用神经网络）。\n无论如何，幸运的是\\gls{convolutional_network}在几十年前就表现良好。\n在许多方面，它们为余下的深度学习传递火炬，并为一般的神经网络被接受铺平了道路。\n\n\\gls{convolutional_network}提供了一种方法来特化神经网络，使其能够处理具有清楚的网格结构拓扑的数据，以及将这样的模型扩展到非常大的规模。 \n这种方法在二维图像拓扑上是最成功的。\n为了处理一维序列数据，我们接下来转向神经网络框架的另一种强大的特化：\\gls{RNN}。\n\n \n% -- 361 --\n"
  },
  {
    "path": "Makefile",
    "content": "all:\n\txelatex dlbook_cn.tex && bibtex dlbook_cn.aux && texindy dlbook_cn.idx && makeglossaries dlbook_cn && xelatex dlbook_cn.tex && xelatex dlbook_cn.tex\n\nclean:\n\tfind . -type f -iregex '.*\\.\\(aux\\|log\\|toc\\|backup\\|acr\\|brf\\|gz\\|acn\\|xdy\\|alg\\)$$'  -delete\n"
  },
  {
    "path": "README.md",
    "content": "# Deep Learning 中文翻译\n\n在众多网友的帮助和校对下，中文版终于出版了。尽管还有很多问题，但至少90%的内容是可读的，并且是准确的。\n我们尽可能地保留了原书[Deep Learning](http://www.deeplearningbook.org/)中的意思并保留原书的语句。\n\n然而我们水平有限，我们无法消除众多读者的方差。我们仍需要大家的建议和帮助，一起减小翻译的偏差。\n\n大家所要做的就是阅读，然后汇总你的建议，提issue（最好不要一个一个地提）。如果你确定你的建议不需要商量，可以直接发起PR。\n\n对应的翻译者：\n  - 第1、4、7、10、14、20章及第12.4、12.5节由 @swordyork 负责\n  - 第2、5、8、11、15、18章由 @liber145 负责\n  - 第3、6、9章由 @KevinLee1110 负责\n  - 第13、16、17、19章及第12.1至12.3节由 @futianfan 负责\n\n\n\n面向的读者\n--------------------\n\n请直接下载[PDF](https://github.com/exacity/deeplearningbook-chinese/releases/download/v0.5-beta/dlbook_cn_v0.5-beta.pdf)阅读。\n不打算提供EPUB等格式，如有需要请自行修改。\n\n这一版准确性已经有所提高，读者可以以中文版为主、英文版为辅来阅读学习，但我们仍建议研究者阅读[原版](http://www.deeplearningbook.org/)。\n\n\n\n出版及开源原因\n--------------------\n\n本书由人民邮电出版社出版，如果你觉得中文版PDF对你有所帮助，希望你能支持下纸质正版书籍。\n如果你觉得中文版不行，希望你能多提建议。非常感谢各位！\n纸质版也会进一步更新，需要大家更多的建议和意见，一起完善中文版。\n\n纸质版目前在人民邮电出版社的异步社区出售，见[地址](http://www.epubit.com.cn/book/details/4278)。\n价格不低，但看了样本之后，我们认为物有所值。\n注意，我们不会通过媒体进行宣传，希望大家先看电子版内容，再判断是否购买纸质版。\n\n\n以下是开源的具体原因：\n\n 1. 我们不是文学工作者，不专职翻译。单靠我们，无法给出今天的翻译，众多网友都给我们提出了宝贵的建议，因此开源帮了很大的忙。出版社会给我们稿费（我们也不知道多少，可能2万左右），我们也不好意思自己用，商量之后觉得捐出是最合适的，以所有贡献过的网友的名义（我们把稿费捐给了杉树公益，用于4名贵州高中生三年的生活费，见[捐赠情况](https://github.com/exacity/deeplearningbook-chinese/blob/master/donation.pdf)）。\n 2. PDF电子版对于技术类书籍来说是很重要的，随时需要查询，拿着纸质版到处走显然不合适。国外很多技术书籍都有对应的电子版（虽然不一定是正版），而国内的几乎没有。个人认为这是出版社或者作者认为国民素质还没有高到主动为知识付费的境界，所以不愿意\"泄露\"电子版。时代在进步，我们也需要改变。特别是翻译作品普遍质量不高的情况下，要敢为天下先。\n 3. 深度学习发展太快，日新月异，所以我们希望大家更早地学到相关的知识。我觉得原作者开放PDF电子版也有类似的考虑，也就是先阅读后付费。我们认为中国人口素质已经足够高，懂得为知识付费。当然这不是付给我们的，是付给出版社的，出版社再付给原作者。我们不希望中文版的销量因PDF电子版的存在而下滑。出版社只有值回了版权才能在以后引进更多的优秀书籍。我们这个开源翻译先例也不会成为一个反面案例，以后才会有更多的PDF电子版。\n 4. 开源也涉及版权问题，出于版权原因，我们不再更新此初版PDF文件，请大家以最终的纸质版为准。（但源码会一直更新）\n\n\n\n致谢\n--------------------\n\n我们有3个类别的校对人员。\n - 负责人也就是对应的翻译者。\n - 简单阅读，对语句不通顺或难以理解的地方提出修改意见。\n - 中英对比，进行中英对应阅读，排除少翻错翻的情况。\n\n所有校对建议都保存在各章的`annotations.txt`文件中。\n\n| 章节 | 负责人 | 简单阅读 | 中英对比 |\n| ------------ | ------------ | ------------ | ------------ |\n| [第一章 前言](https://exacity.github.io/deeplearningbook-chinese/Chapter1_introduction/) | @swordyork | lc, @SiriusXDJ, @corenel, @NeutronT | @linzhp |\n| [第二章 线性代数](https://exacity.github.io/deeplearningbook-chinese/Chapter2_linear_algebra/) | @liber145 | @SiriusXDJ, @angrymidiao | @badpoem |\n| [第三章 概率与信息论](https://exacity.github.io/deeplearningbook-chinese/Chapter3_probability_and_information_theory/) | @KevinLee1110 | @SiriusXDJ | @kkpoker, @Peiyan |\n| [第四章 数值计算](https://exacity.github.io/deeplearningbook-chinese/Chapter4_numerical_computation/) | @swordyork | @zhangyafeikimi | @hengqujushi |\n| [第五章 机器学习基础](https://exacity.github.io/deeplearningbook-chinese/Chapter5_machine_learning_basics/) | @liber145 | @wheaio, @huangpingchun | @fairmiracle, @linzhp |\n| [第六章 深度前馈网络](https://exacity.github.io/deeplearningbook-chinese/Chapter6_deep_feedforward_networks/) | @KevinLee1110 | David_Chow, @linzhp, @sailordiary |  |\n| [第七章 深度学习中的正则化](https://exacity.github.io/deeplearningbook-chinese/Chapter7_regularization/) | @swordyork | | @NBZCC |\n| [第八章 深度模型中的优化](https://exacity.github.io/deeplearningbook-chinese/Chapter8_optimization_for_training_deep_models/) | @liber145 | @happynoom, @codeVerySlow |  @huangpingchun |\n| [第九章 卷积网络](https://exacity.github.io/deeplearningbook-chinese/Chapter9_convolutional_networks/) | @KevinLee1110 | @zhaoyu611, @corenel | @zhiding |\n| [第十章 序列建模：循环和递归网络](https://exacity.github.io/deeplearningbook-chinese/Chapter10_sequence_modeling_rnn/) | @swordyork | lc | @zhaoyu611, @yinruiqing |\n| [第十一章 实践方法论](https://exacity.github.io/deeplearningbook-chinese/Chapter11_practical_methodology/) | @liber145 |  |  |\n| [第十二章 应用](https://exacity.github.io/deeplearningbook-chinese/Chapter12_applications/) | @swordyork, @futianfan |  | @corenel |\n| [第十三章 线性因子模型](https://exacity.github.io/deeplearningbook-chinese/Chapter13_linear_factor_models/) | @futianfan | @cloudygoose | @ZhiweiYang |\n| [第十四章 自编码器](https://exacity.github.io/deeplearningbook-chinese/Chapter14_autoencoders/) | @swordyork |  | @Seaball, @huangpingchun |\n| [第十五章 表示学习](https://exacity.github.io/deeplearningbook-chinese/Chapter15_representation_learning/) | @liber145 | @cnscottzheng | |\n| [第十六章 深度学习中的结构化概率模型](https://exacity.github.io/deeplearningbook-chinese/Chapter16_structured_probabilistic_modelling/) | @futianfan | |\n| [第十七章 蒙特卡罗方法](https://exacity.github.io/deeplearningbook-chinese/Chapter17_monte_carlo_methods/) | @futianfan |  | @sailordiary  |\n| [第十八章 面对配分函数](https://exacity.github.io/deeplearningbook-chinese/Chapter18_confronting_the_partition_function/) | @liber145 | | @tankeco |\n| [第十九章 近似推断](https://exacity.github.io/deeplearningbook-chinese/Chapter19_approximate_inference/) | @futianfan | | @sailordiary, @hengqujushi, huanghaojun |\n| [第二十章 深度生成模型](https://exacity.github.io/deeplearningbook-chinese/Chapter20_deep_generative_models/) | @swordyork | | |\n| 参考文献 | | | @pkuwwt |\n\n我们会在纸质版正式出版的时候，在书中致谢，正式感谢各位作出贡献的同学！\n\n还有很多同学提出了不少建议，我们都列在此处。\n\n@tttwwy @tankeco @fairmiracle @GageGao @huangpingchun @MaHongP @acgtyrant @yanhuibin315 @Buttonwood @titicacafz \n@weijy026a @RuiZhang1993 @zymiboxpay @xingkongliang @oisc @tielei @yuduowu @Qingmu @HC-2016 @xiaomingabc \n@bengordai @Bojian @JoyFYan @minoriwww @khty2000 @gump88 @zdx3578 @PassStory @imwebson @wlbksy @roachsinai @Elvinczp \n@endymecy name:YUE-DaJiong @9578577 @linzhp @cnscottzheng @germany-zhu  @zhangyafeikimi @showgood163 @gump88\n@kangqf @NeutronT @badpoem @kkpoker @Seaball @wheaio @angrymidiao @ZhiweiYang @corenel @zhaoyu611 @SiriusXDJ @dfcv24 EmisXXY\nFlyingFire vsooda @friskit-china @poerin @ninesunqian @JiaqiYao @Sofring @wenlei @wizyoung @imageslr @@indam @XuLYC\n@zhouqingping @freedomRen @runPenguin @pkuwwt @wuqi @tjliupeng @neo0801 @jt827859032 @demolpc @fishInAPool\n@xiaolangyuxin @jzj1993 @whatbeg LongXiaJun jzd\n\n如有遗漏，请务必通知我们，可以发邮件至`echo c3dvcmQueW9ya0BnbWFpbC5jb20K | base64 --decode`。\n这是我们必须要感谢的，所以不要不好意思。\n\n\nTODO\n---------\n\n 1. 排版\n\n\n\n注意\n-----------\n\n - 各种问题或者建议可以提issue，建议使用中文。 \n - 由于版权问题，我们不能将图片和bib上传，请见谅。\n - Due to copyright issues, we would not upload figures and the bib file.\n - 可用于学习研究目的，不得用于任何商业行为。谢谢！\n\n\n\nMarkdown格式\n------------\n这种格式确实比较重要，方便查阅，也方便索引。初步转换后，生成网页，具体见[deeplearningbook-chinese](https://exacity.github.io/deeplearningbook-chinese)。\n注意，这种转换没有把图放进去，也不会放图。目前使用单个[脚本](scripts/convert2md.sh)，基于latex文件转换，以后可能会更改但原则是不直接修改[md文件](docs/_posts)。\n需要的同学可以自行修改[脚本](scripts/convert2md.sh)。\n\n\n\nHTML格式\n------------\n读者可以使用[pdf2htmlEX](https://github.com/coolwanglu/pdf2htmlEX)进行转换，直接将PDF转换为HTML。\n\n\n\nUpdating.....\n"
  },
  {
    "path": "acknowledgments.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\chapter*{中文版致谢}\n\\addcontentsline{toc}{chapter}{致谢}\n\n首先，我们要感谢原作者在本书翻译时给予我们的大力帮助。特别是，原作者和我们分享了书中的原图和参考文献库，这极大节省了我们的时间和精力。\n\n本书涉及的内容博大且思想深刻，如果没有众多同学和网友的帮助，我们不可能顺利完成翻译。\n \n我们才疏学浅而受此重任，深知自身水平难以将本书翻译得很准确。\n因此我们完成草稿后，将书稿公开于Github，及早接受网友的批评和建议。\n以下网友为本书的翻译草稿提供了很多及时的反馈和宝贵的修改意见：\n@tttwwy @tankeco @fairmiracle @GageGao @huangpingchun @MaHongP @acgtyrant @yanhuibin315 @Buttonwood @titicacafz @weijy026a @RuiZhang1993 @zymiboxpay @xingkongliang \n@oisc @tielei @yuduowu @Qingmu @HC-2016 @xiaomingabc @bengordai @Bojian @JoyFYan @minoriwww @khty2000 @gump88 @zdx3578 @PassStory @imwebson @wlbksy @roachsinai \n@Elvinczp @endymecy @9578577 @linzhp @cnscottzheng @germany-zhu @zhangyafeikimi @showgood163 @kangqf @NeutronT @badpoem @kkpoker @Seaball @wheaio @angrymidiao\n@ZhiweiYang @corenel @zhaoyu611 @SiriusXDJ @dfcv24 @EmisXXY @FlyingFire @vsooda @friskit-china @poerin @ninesunqian @JiaqiYao @Sofring @wenlei @wizyoung \n@imageslr @indam @XuLYC @zhouqingping @freedomRen @runPenguin @piantou\n \n在此期间，我们四位译者再次进行了校对并且相互之间也校对了一遍。\n然而仅仅通过我们的校对，实在难以发现翻译中存在的问题。\n因此，我们邀请一些同学和网友帮助我们校对。\n经过他们的校对，本书的翻译质量得到了极大的提升。\n在此我们一一列出，以表示我们由衷的感谢！\n \n\\begin{itemize}\n\\item  第一章（引言）： 刘畅、许丁杰、潘雨粟和NeutronT对本章进行了阅读，并对很多语句提出了不少修改建议。林中鹏进行了校对，他提出了很多独到的修改建议。\n\\item  第二章（线性代数）：许丁杰和骆徐圣阅读本章，并修改语句。李若愚进行了校对，提出了很多细心的建议。\n\\item  第三章（概率与信息论）：许丁杰阅读本章，并修改语句。李培炎和何翊卓进行了校对，并修改了很多中文用词，使翻译更加准确。\n\\item  第四章（数值计算）：张亚霏阅读本章，并对其他章节也有提出了一些修改建议。张源源进行了校对，并指出了原文可能存在的问题，非常仔细。\n\\item  第五章（机器学习基础）：郭浩和黄平春阅读本章，并修改语句。李东和林中鹏进行了校对。本章篇幅较长，能够有现在的翻译质量离不开这四位的贡献。\n\\item  第六章（深度前馈网络）：周卫林、林中鹏和张远航阅读本章，并提出修改意见。\n\\item  第七章（深度学习中的正则化）：周柏村进行了非常细心的校对，指出了大量问题，令翻译更加准确。\n\\item  第八章（深度模型中的优化）：房晓宇和吴翔阅读本章。黄平春进行了校对，他提出的很多建议让行文更加流畅易懂。\n\\item  第九章（卷积网络）：赵雨和潘雨粟阅读本章，并润色语句。丁志铭进行了非常仔细的校对，并指出很多翻译问题。\n\\item  第十章（序列建模：循环和递归网络）：刘畅阅读本章。赵雨提供了详细的校对建议，尹瑞清根据他的翻译版本，给我们的版本提出了很多建议。虽然仍存在一些分歧，但我们两个版本的整合，让翻译质量提升很多。\n\\item  第十二章（应用）：潘雨粟进行了校对，在他的校对之前，本章阅读起来比较困难。他提供的修改建议，不仅提高了行文流畅度，还提升了译文的准确度。\n\\item  第十三章（线性因子模型）：贺天行阅读本章，修改语句。杨志伟校对本章，润色大量语句。\n\\item  第十四章（自编码器）：李雨慧和黄平春进行了校对。李雨慧提升了语言的流畅度，黄平春纠正了不少错误，提高了准确性。\n\\item  第十五章（表示学习）：cnscottzheng阅读本章，并修改语句。\n\\item  第十七章（蒙特卡罗方法）：张远航提供了非常细致的校对，后续还校对了一遍，使译文质量大大提升。\n\\item  第十八章（直面配分函数）：吴家楠进行了校对，提升了译文准确性和可读性。\n\\item  第十九章（近似推断）：黄浩军、张远航和张源源进行了校对。这章虽篇幅不大，但内容有深度，译文在三位的帮助下提高了准确度。\n\\end{itemize}\n \n所有校对的修改建议都保存在Github上，再次感谢以上同学和网友的付出。\n经过这五个多月的修改，草稿慢慢变成了初稿。\n尽管还有很多问题，但大部分内容是可读的，并且是准确的。\n当然目前的翻译仍存在一些没有及时发现的问题，因此翻译也将持续更新，不断修改。\n我们非常希望读者能到Github提建议，并且非常欢迎，无论多么小的修改建议，都是非常宝贵的。\n\n此外，我们还要感谢魏太云学长，他帮助我们与出版社沟通交流，并给予了我们很多排版上的指导。\n\n最后，感谢我们的导师张志华教授，没有老师的支持，我们难以完成翻译。\n\n\n\\chapter*{原书致谢}\n\n如果没有他人的贡献，这本书将不可能完成。\n我们感谢为本书提出建议和帮助组织内容结构的人：\nGuillaume Alain, Kyunghyun Cho, \\c{C}a\\u{g}lar G\\\"ul\\c{c}ehre, David Krueger, Hugo Larochelle, Razvan Pascanu and Thomas Roh\\'ee 。\n\n\n我们感谢为本书内容提供反馈的人。其中一些人对许多章都给出了建议：\nMart\\'in Abadi, Guillaume Alain, Ion Androutsopoulos, Fred Bertsch, Olexa Bilaniuk, Ufuk Can Biçici, Matko Bo\\v{s}njak, John Boersma, Greg Brockman, Alexandre de Brébisson, Pierre Luc Carrier, Sarath Chandar, Pawel Chilinski, Mark Daoust, Oleg Dashevskii, Laurent Dinh, Stephan Dreseitl, Jim Fan, Miao Fan, Meire Fortunato, Fr\\'ed\\'eric Francis, Nando de Freitas, \\c{C}a\\u{g}lar G\\\"ul\\c{c}ehre, Jurgen Van Gael, Javier Alonso Garc\\'ia, Jonathan Hunt, Gopi Jeyaram, Chingiz Kabytayev, Lukasz Kaiser, Varun Kanade, Asifullah Khan, Akiel Khan, John King, Diederik P. Kingma, Yann LeCun, Rudolf Mathey, Matías Mattamala, Abhinav Maurya, Kevin Murphy, Oleg Mürk, Roman Novak, Augustus Q. Odena, Simon Pavlik, Karl Pichotta, Eddie Pierce, Kari Pulli, Roussel Rahman, Tapani Raiko, Anurag Ranjan, Johannes Roith, Mihaela Rosca, Halis Sak, César Salgado, Grigory Sapunov, Yoshinori Sasaki, Mike Schuster, Julian Serban, Nir Shabat, Ken Shirriff, Andre Simpelo, Scott Stanley, David Sussillo, Ilya Sutskever, Carles Gelada Sáez, Graham Taylor, Valentin Tolmer, Massimiliano Tomassoli, An Tran, Shubhendu Trivedi, Alexey Umnov, Vincent Vanhoucke, Marco Visentini-Scarzanella, Martin Vita, David Warde-Farley, Dustin Webb, Kelvin Xu, Wei Xue, Ke Yang, Li Yao, Zygmunt Zaj\\k{a}c and Ozan \\c{C}a\\u{g}layan.\n\n\n我们也要感谢对单个章节提供有效反馈的人：\n\n\n\\begin{itemize}\n\\item 数学符号： Zhang Yuanhang.\n\\item  第一章（引言）： \nYusuf Akgul, Sebastien Bratieres, Samira Ebrahimi, Charlie Gorichanaz, Brendan Loudermilk, Eric Morris, Cosmin Pârvulescu and Alfredo Solano.\n\\item  第二章（线性代数）：\nAmjad Almahairi, Nikola Bani\\'{c}, Kevin Bennett, Philippe Castonguay, Oscar Chang, Eric Fosler-Lussier, Andrey Khalyavin, Sergey Oreshkov, Istv\\'an Petr\\'as, Dennis Prangle, Thomas Roh\\'ee, Gitanjali Gulve Sehgal, Colby Toland, Alessandro Vitale and Bob Welland.\n\\item  第三章（概率与信息论）：\nJohn Philip Anderson, Kai Arulkumaran, Vincent Dumoulin, Rui Fa, Stephan Gouws, Artem Oboturov, Antti Rasmus, Alexey Surkov and Volker Tresp.\n\\item  第四章（数值计算）：\nTran Lam AnIan Fischer and Hu Yuhuang.\n\\item  第五章（机器学习基础）：\nDzmitry Bahdanau, Justin Domingue, Nikhil Garg, Makoto Otsuka, Bob Pepin, Philip Popien, Emmanuel Rayner, Peter Shepard, Kee-Bong Song, Zheng Sun and Andy Wu.\n\\item 第六章（深度前馈网络）：\nUriel Berdugo, Fabrizio Bottarel, Elizabeth Burl, Ishan Durugkar, Jeff Hlywa, Jong Wook Kim, David Krueger and Aditya Kumar Praharaj.\n\\item 第七章（深度学习中的正则化）：\nMorten Kolbæk, Kshitij Lauria, Inkyu Lee, Sunil Mohan, Hai Phong Phan and Joshua Salisbury.\n\\item  第八章（深度模型中的优化）：\nMarcel Ackermann, Peter Armitage, Rowel Atienza, Andrew Brock, Tegan Maharaj, James Martens, Kashif Rasul, Klaus Strobl and Nicholas Turner.\n\\item 第九章（卷积网络）：\nMart\\'in Arjovsky, Eugene Brevdo, Konstantin Divilov, Eric Jensen, Mehdi Mirza, Alex Paino, Marjorie Sayer, Ryan Stout and Wentao Wu.\n\\item 第十章（序列建模：循环和递归网络）：\nGökçen Eraslan, Steven Hickson, Razvan Pascanu, Lorenzo von Ritter, Rui Rodrigues, Dmitriy Serdyuk, Dongyu Shi and Kaiyu Yang.\n\\item 第十一章（实践方法论）：\nDaniel Beckstein.\n\\item 第十二章（应用）：\nGeorge Dahl, Vladimir Nekrasov and Ribana Roscher.\n\\item 第十三章（线性因子模型）：\nJayanth Koushik.\n\\item 第十五章（表示学习）：\n    Kunal Ghosh.\n\\item 第十六章（ 深度学习中的结构化概率模型）： \n    Minh Lê and Anton Varfolom.\n\\item 第十八章（直面配分函数）：\n\tSam Bowman.\n\\item 第十九章（近似推断）：\nYujia Bao.\n\\item 第二十章（深度生成模型）：\nNicolas Chapados, Daniel Galvez, Wenming Ma, Fady Medhat, Shakir Mohamed and Gr\\'egoire Montavon.\n\\item 参考文献：\nLukas Michelbacher and Leslie N. Smith.\n\\end{itemize}\n% CHECK: make sure the chapters are still in order\n\n\n我们还要感谢那些允许我们从他们的出版物中复制图片、数据的人。\n我们在图片标题的文字中注明了他们的贡献。\n\n我们还要感谢Lu Wang为我们写了pdf2htmlEX，我们用它来制作这本书的网页版本，Lu Wang还帮助我们改进了生成的HTML的质量。\n\n\n我们还要感谢Ian的妻子Daniela Flori Goodfellow，在Ian的写作过程中的耐心支持和检查。\n\n\n我们还要感谢Google Brain团队提供了学术环境，从而使得Ian能够花费大量时间写作此书并接受同行的反馈和指导。\n我们特别感谢Ian的前任经理Greg Corrado 和他的现任经理Samy Bengio对这个项目的支持。\n最后我们还要感谢Geoffrey Hinton在写作困难时的鼓励。\n\n\n"
  },
  {
    "path": "acknowledgments_github.md",
    "content": "#致谢\n\n\n2016年12月8日\n------------\n - @tttwwy ==> 链接问题\n - @tankeco ==> Chapter12 语句不通\n - @fairmiracle ==> Chapter2 公式问题，Chapter4 邻域==>领域\n - @GageGao ==> Chapter5 Iris在里面被翻译成虹膜，应该翻译成鸢尾花\n - @huangpingchun ==> Chapter1 \"多么\"误打为\"多少\"了, Chapter5大量建议，详见[issue](https://github.com/exacity/deeplearningbook-chinese/issues/10)\n - @MaHongP ==> Chapter6 纠正词语, p139 ，\"仿射\"，\"及其\" \n - @acgtyrant ==> 翻译者改进英式中文\n - @yanhuibin315 ==> gitbook\n - @Buttonwood ==> Chapter2 dot product\n - @titicacafz ==> Chapter2 dot product\n - @weijy026a ==> Chapter1 Inventors翻译建议\n - @RuiZhang1993 ==> Chapter2 公式有误\n - @zymiboxpay ==> Chapter2 等号消失\n - @xingkongliang ==> Chapter2 公式有误\n - @oisc ==>  Chapter2 公式2.83 2.84有误 是arg max\n\n\n\n2016年12月9日\n------------\n - @fairmiracle ==> Chapter4 公式，语句，详见[issue](https://github.com/exacity/deeplearningbook-chinese/issues/3#issuecomment-265854595).\n - @huangpingchun ==> Chapter1 邻域==>领域\n - @tielei ==> Chapter9 equivariance\n - @yuduowu ==> contact issue\n - @minoriwww ==> Chapter2 \"排布\"==>\"排列\"\n - @khty2000 ==> Chapter2 \"X{-S}\"问题，矩阵横列错误\n - @Qingmu ==> 用WinEdit打开文件问题\n - @tielei ==> Chapter9 公式的index问题\n\n\n\n2016年12月10日\n-------------\n - @fairmiracle ==> Chapter5 \"\\Vy\"==>\"\\Vx\"；多余括号；in action，more frequently，more formally 提议校对，imputation 翻译建议\n - @huangpingchun ==> Chapter5 not completely formal or distinct concepts, VC维，imputation of missing data 翻译建议\n - @tielei ==> Chapter9 \"full convolution\"；翻译建议；\"tiling range\"\n\n\n\n2016年12月12日\n-------------\n - @fairmiracle ==> Chapter6 公式错误\n - @huangpingchun ==> Chapter7 \"模型平均\"重复\n\n\n\n2016年12月13日\n-------------\n - @huangpingchun ==> inference的统一翻译 \n - @HC-2016 ==> Chapter6 单位阵还是对角阵问题，详见[issue](https://github.com/exacity/deeplearningbook-chinese/issues/19#issuecomment-266683442).\n - @xiaomingabc ==> Chapter1 病句问题\n\n\n\n2016年12月14日\n--------------\n - @fairmiracle ==> Chapter7 \\norm 括号打错\n - @bengordai ==> Chapter1 区分出合法邮件与垃圾邮件\n\n\n\n2016年12月15日\n--------------\n - @huangpingchun ==> Chapter5 \"supervised\"误译为\"无监督, Chapter7 模块翻译\n - @Bojian ==> Chapter5 \"supervised\"误译为\"无监督\"，\"三维空间中球状流形\"翻译建议\n\n\n\n2016年12月16日\n-------------\n - @huangpingchun ==> \"infinite\" 翻译统一化\n - @JoyFYan ==> 错字\"植\"\n - @fairmiracle ==> 修正翻译\"based on making small local moves\"\n\n2016年12月18日\n--------------\n - @bengordai ==> Chapter6, \"until\"和\"address\"的翻译；双引号\n\n\n2016年12月20日\n-------------\n - @fairmiracle ==> Chapter8, f \n\n\n2016年12月20日\n-------------\n - @zdx3578 ==> 错别字\"如果\"改成\"如何\"\n\n\n2016年12月21日\n-------------\n - @huangpingchun ==> Chapter8, vanishing Long-Term Dependencies翻译\n\n\n2016年12月22日\n-------------\n - @PassStory ==> Chapter2, m -> n\n - @imwebson ==> Chapter2, m -> n\n - @HC-2016 ==> Chapter6, 语句问题；错别字\"相应\"改成\"响应\"\n - @Elvinczp ==> Chapter6, 错别字\"网路\"改成\"网络\"\n - @imwebson ==> Chapter6, \"winner-take-all\"翻译成\"赢者通吃\"\n\n\n2016年12月23日\n-------------\n - @zdx3578 ==> Chapter5, one-hot\n - @wlbksy  ==> Chapter14, 编译问题\n - @zdx3578 ==> Chapter6, 错别字\"有\"改成\"由\", \"难么\"改成\"那么\"\"\n\n\n2016年12月25日\n---------------\n - @roachsinai ==> Chapter10, 第315行公式错误\n - @minoriwww ==> Chapter6, \"loosely\"翻译为\"或多或少地\"；\"funciton\"翻译为\"功能\"\n\n\n2016年12月26日\n---------------\n - @zdx3578 ==> Chapter8, 280页翻译\n\n\n2016年12月27日\n---------------\n - @huangpingchun ==> Chapter8, 8.7.4节翻译\n\n\n2016年12月29日\n---------------\n - @zdx3578 ==> Chapter11, 11.4节翻译\n\n\n2016年12月31日\n---------------\n - @endymecy ==> Chapter10, 公式20错误\n\n\n2017年1月3日\n---------------\n - @endymecy ==> Chapter14, 语句问题\n\n\n2017年1月5日\n---------------\n - @tonyzeng2016 ==> Chapter8, 8.1.2最后一段翻译建议\n - @zdx3578 ==> Chapter18, \"intractable\"翻译建议\n\n\n2017年1月7日\n---------------\n - @zdx3578 ==> Chapter20, 公式错误，少子图\n - name:YUE-DaJiong ==> Chapter20, discriminator network\n\n\n2017年1月11日\n---------------\n - @HeimingX ==> Chapter5，5.9节翻译\n\n\n2017年2月4日\n---------------\n - @zhangyafeikimi ==> Chapter8，\"树木\"=>\"数目\"\n\n\n2017年2月7日\n---------------\n - @germany-zhu  ==> Chapter1, 语音术语\n - @kangqf ==> Chapter8, loccal_minima 笔误\n\n\n2017年3月17日\n---------------\n - @yaoxiuyong ==> Chapter 5, 5.1.4节特征权重增加／减少校对\n\n2017年4月5日\n---------------\n - @sailordiary ==> Chapter3, \"Reverend\"=>\"牧师\"，详见[issue](https://github.com/exacity/deeplearningbook-chinese/issues/53)\n\n2017年4月7日\n---------------\n - @poerin ==> Chapter6, 去掉\"第\"\n\n2017年4月9日\n---------------\n - @ninesunqian ==> Chapter6, \"二进制函数\"=>\"二值型函数\"\n\n2017年4月21日\n---------------\n - @JiaqiYao ==> Chapter6, 公式`q_i - p_i`的推导，详见[issue](https://github.com/exacity/deeplearningbook-chinese/issues/66)\n - @zhouqingping  ==> Chapter 7, 有放回采样\n\n\n2017年4月25日\n---------------\n - @ninesunqian ==> Chapter 8, line search, gaussian value 翻译调整\n\n2017年4月28日\n---------------\n - @sailordinary ==> Chapter 8, 语句调整\n - @freedomRen ==> Chapter 8, 语句调整\n\n2017年4月30日\n---------------\n - @ninesunqian ==> Chapter9, 图9.18子图顺序问题\n\n2017年5月2日\n---------------\n - @jt827859032 ==> Chapter5, 5.1节一处翻译调整\n - @demolpc ==> Chapter5, 5.2节三处翻译调整\n - @Sofring, @wenlei ==> Chapter 1, “人体”翻译\n\n2017年5月5日\n---------------\n - @jt827859032 ==> Chapter5, 5.1节一处翻译调整\n\n2017年5月21日\n---------------\n - @neo0801 ==> Chapter2, 2.2节一处翻译调整\n\n2017年6月7日\n---------------\n - @tjliupeng ==> Chapter 5, 翻译调整\n\n2017年6月21日\n---------------\n - @xiaolangyuxin ==> Chapter2, 翻译校正\n\n2017年6月23日\n---------------\n - @whatbeg ==> Section 8.7, 两处翻译调整\n\n2017年7月14日\n---------------\n - @xiaolangyuxin ==> Section 4.4, 翻译调整\n\n2017年7月17日\n---------------\n - @tjliupeng ==> Section 8.4，翻译调整\n\n2017年7月30日\n---------------\n - @xiaolangyuxin ==> Section 8.4, \"多块\" -> \"多快\"\n\n2017年10月14日\n---------------\n - @CarlKing5019 ==> Chapter 2, 翻译调整\n\n2017年10月28日\n---------------\n - @Godricly ==> Section 8.2.1，翻译调整\n\n2017年11月27日\n---------------\n - @12wang3 ==> Section 5.3.1，翻译指正。\n\n2018年5月22日\n---------------\n - @caisp ==> Section 2.4，翻译调整\n\n2018年11月26日\n---------------\n - @CristopherOh ==> Section 5.3，翻译指正\n"
  },
  {
    "path": "applied_math_and_machine_learning_basics.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\part{应用数学与机器学习基础}\n\\label{part:applied_math_and_machine_learning_basics}\n\n\\newpage\n\n本书这一部分将介绍理解\\gls{DL}所需的基本数学概念。\n我们从应用数学的一般概念开始，这能使我们定义许多变量的函数，找到这些函数的最高和最低点，并量化信念度。\n\n接着，我们描述\\gls{ML}的基本目标，并描述如何实现这些目标。\n我们需要指定代表某些信念的模型、设计衡量这些信念与现实对应程度的\\gls{cost_function}以及使用训练算法最小化这个\\gls{cost_function}。\n\n\n这个基本框架是广泛多样的\\gls{ML}算法的基础，其中也包括非深度的\\gls{ML}方法。\n在本书的后续部分，我们将在这个框架下开发\\gls{DL}算法。\n\n\\input{Chapter2/linear_algebra.tex}\n\\input{Chapter3/probability_and_information_theory.tex}\n\\input{Chapter4/numerical_computation.tex}\n\\input{Chapter5/machine_learning_basics.tex}\n\n"
  },
  {
    "path": "breakcites.sty",
    "content": "% breakcites\n% Style file to allow citations to be broken across lines.\n% - Don Hosek   3/14/89 (LaTeX209-Version)\n% - Leo Broska 02/20/97 (LaTeX-2e-Version)\n%\n\\def\\@citex[#1]#2{%\n  \\let\\@citea\\@empty\n  \\@cite{\\@for\\@citeb:=#2\\do\n    {\\@citea\\def\\@citea{,\\penalty\\@m\\ }%\n     \\edef\\@citeb{\\expandafter\\@firstofone\\@citeb}%\n     \\if@filesw\\immediate\\write\\@auxout{\\string\\citation{\\@citeb}}\\fi\n     \\@ifundefined{b@\\@citeb}{\\mbox{\\reset@font\\bfseries ?}%\n       \\G@refundefinedtrue\n       \\@latex@warning\n         {Citation `\\@citeb' on page \\thepage \\space undefined}}%\n       {\\csname b@\\@citeb\\endcsname}}}{#1}}\n\n"
  },
  {
    "path": "deep_learning_research.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\part{深度学习研究}\n\\label{part:deep_learning_research}\n\n\\newpage\n本书这一部分描述目前研究社群所追求的、更有远见和更先进的\\gls{DL}方法。\n\n在本书的前两部分，我们已经展示了如何解决\\gls{supervised_learning}问题，即在给定足够的映射样本的情况下，学习将一个向量映射到另一个。\n\n我们想要解决的问题并不全都属于这个类别。\n我们可能希望生成新的样本、或确定一个点的似然性、或处理缺失值以及利用一组大量的未标记样本或相关任务的样本。\n当前应用于工业的最先进技术的缺点是我们的学习算法需要大量的监督数据才能实现良好的精度。\n在本书这一部分，我们讨论一些推测性的方法，来减少现有模型工作所需的标注数据量，并适用于更广泛的任务。 \n实现这些目标通常需要某种形式的\\gls{unsupervised}或\\gls{semi_supervised}学习。\n\n许多\\gls{DL}算法被设计为处理\\gls{unsupervised_learning}问题，但不像\\gls{DL}已经在很大程度上解决了各种任务的\\gls{supervised_learning}问题，没有一个算法能以同样的方式真正解决\\gls{unsupervised_learning}问题。\n在本书这一部分，我们描述\\gls{unsupervised_learning}的现有方法和一些如何在这一领域取得进展的流行思想。\n\n\\gls{unsupervised_learning}困难的核心原因是被建模的随机变量的高维度。\n这带来了两个不同的挑战：统计挑战和计算挑战。\n\\emph{统计挑战}与泛化相关：我们可能想要区分的配置数会随着感兴趣的维度数指数增长，并且这快速变得比可能具有的（或者在有限计算资源下使用的）样本数大得多。\n与高维分布相关联的\\emph{计算挑战}之所以会出现，是因为用于学习或使用训练模型的许多算法（特别是基于估计显式概率函数的算法）涉及难处理的计算量，并且随维数呈指数增长。\n\n使用概率模型，这种计算挑战来自执行难解的\\gls{inference}或归一化分布。\n\\begin{itemize}\n \\item \\emph{难解的\\gls{inference}}：\\gls{inference}主要在\\chapref{chap:approximate_inference}讨论。\n\\gls{inference}关于捕获$a$，$b$和$c$上联合分布的模型，给定其他变量$b$的情况下，猜测一些变量$a$的可能值。\n为了计算这样的条件概率，我们需要对变量$c$的值求和，以及计算对$a$和$c$的值求和的归一化常数。\n \\item \\emph{难解的归一化常数（\\gls{partition_function}）}：\\gls{partition_function}主要在\\chapref{chap:confronting_the_partition_function}讨论。\n归一化概率函数的常数在\\gls{inference}（上文）以及学习中出现。\n许多概率模型涉及这样的归一化常数。\n不幸的是，学习这样的模型通常需要相对于模型参数计算\\gls{partition_function}对数的梯度。\n该计算通常与计算\\gls{partition_function}本身一样难解。\n\\glsacr{mcmc}（\\chapref{chap:monte_carlo_methods}）通常用于处理\\gls{partition_function}。\n不幸的是，当模型分布的模式众多且分离良好时，\\glssymbol{mcmc}方法会出现问题，特别是在高维空间中（\\secref{sec:the_challenge_of_mixing_between_separated_modes}）。\n\\end{itemize}\n\n面对这些难以处理的计算的一种方法是近似它们，如在本书的第三部分中讨论的，研究者已经提出了许多方法。\n这里还讨论另一种有趣的方式是通过设计模型，完全避免这些难以处理的计算，因此不需要这些计算的方法是非常有吸引力的。\n近年来，研究者已经提出了数种具有该动机的生成模型。\n其中\\chapref{chap:deep_generative_models}讨论了各种各样的现代生成式建模方法。\n\n第三部分对于研究者来说是最重要的，研究者想要了解\\gls{DL}领域的广度，并将领域推向真正的\\gls{AI}。\n\n\n\n\\input{Chapter13/linear_factor_models.tex}\n\\input{Chapter14/autoencoders.tex}\n\\input{Chapter15/representation_learning.tex}\n\\input{Chapter16/structured_probabilistic_modelling.tex}\n\\input{Chapter17/monte_carlo_methods.tex}\n\\input{Chapter18/confronting_the_partition_function.tex}\n\\input{Chapter19/approximate_inference.tex}\n\\input{Chapter20/deep_generative_models.tex}\n"
  },
  {
    "path": "deep_networks_modern_practices.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\part{深度网络：现代实践}\n\\label{part:deep_networks_modern_practices}\n\n\\newpage\n本书这一部分总结现代\\gls{DL}用于解决实际应用的现状。\n\n\\gls{DL}有着悠久的历史和许多愿景。\n数种提出的方法尚未完全结出果实。\n数个雄心勃勃的目标尚未实现。\n这些较不发达的\\gls{DL}分支将出现在本书的最后部分。\n\n这一部分仅关注那些基本上已在工业中大量使用的技术方法。\n\n现代\\gls{DL}为\\gls{supervised_learning}提供了一个强大的框架。\n通过添加更多层以及向层内添加更多单元，\\gls{deep_network}可以表示复杂性不断增加的函数。\n给定足够大的模型和足够大的标注训练数据集，我们可以通过\\gls{DL}将输入向量映射到输出向量，完成大多数对人来说能迅速处理的任务。\n其他任务，比如不能被描述为将一个向量与另一个相关联的任务，或者对于一个人来说足够困难并需要时间思考和反复琢磨才能完成的任务，现在仍然超出了\\gls{DL}的能力范围。\n\n% ??\n本书这一部分描述参数化函数近似技术的核心，几乎所有现代实际应用的\\gls{DL}背后都用到了这一技术。\n首先，我们描述用于表示这些函数的前馈\\gls{deep_network}模型。\n接着，我们提出正则化和优化这种模型的高级技术。\n将这些模型扩展到大输入（如高分辨率图像或长时间序列）需要专门化。\n我们将会介绍扩展到大图像的\\gls{convolutional_network}和用于处理时间序列的\\gls{RNN}。\n最后，我们提出实用方法的一般准则，有助于设计、构建和配置一些涉及\\gls{DL}的应用，并回顾其中一些应用。\n\n这些章节对于从业者来说是最重要的，也就是现在想开始实现和使用\\gls{DL}算法解决现实问题的人需要阅读这些章节。\n\n\n\\input{Chapter6/deep_feedforward_networks.tex}\n\\input{Chapter7/regularization.tex}\n\\input{Chapter8/optimization_for_training_deep_models.tex} \n\\input{Chapter9/convolutional_networks.tex}\n\\input{Chapter10/sequence_modeling_rnn.tex}\n\\input{Chapter11/practical_methodology.tex}\n\\input{Chapter12/applications.tex}\n\n\n"
  },
  {
    "path": "dlbook_cn.bib",
    "content": " \n"
  },
  {
    "path": "dlbook_cn.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\documentclass[twoside,nofonts,fancyhdr,openany,UTF8]{ctexbook}\n\\usepackage{natbib}\n\n% CJK related\n\\setCJKmainfont[AutoFakeBold=true]{Adobe Song Std}\n\\setCJKsansfont{Adobe Heiti Std}\n\\setCJKmonofont{Adobe Fangsong Std}\n\\CTEXsetup[format={\\raggedright}]{chapter}\n\\CTEXsetup[format={\\Large\\bfseries}]{section}\n\\CTEXsetup[format={\\large\\bfseries}]{subsection}\n\\CTEXsetup[format={\\normalsize\\bfseries}]{subsubsection}\n\n% Needed for some foreign characters\n\\usepackage[T1]{fontenc}\n\n\\usepackage{amsmath}\n\\usepackage{subfigure}\n\\usepackage{amsfonts}\n\\usepackage{amsthm}\n\\usepackage{multirow}\n\\usepackage{colortbl}\n\\usepackage{booktabs}\n% This allows us to cite chapters by name, which was useful for making the\n% acknowledgements page\n\\usepackage{nameref}\n\\usepackage{breakcites}\n\n\\usepackage[tocindentauto]{tocstyle}\n\\usetocstyle{standard}\n\n\\usepackage{bm}\n\\usepackage{float}\n\\newcommand{\\boldindex}[1]{\\textbf{\\hyperpage{#1}}}\n\\usepackage{makeidx}\\makeindex\n% Make bibliography and index appear in table of contents\n\\usepackage[nottoc]{tocbibind}\n\\usepackage[font=small]{caption}\n\n\\usepackage[section]{placeins}\n\\usepackage[chapter]{algorithm}\n\\usepackage{algorithmic}\n% Include chapter number in algorithm number\n\\renewcommand{\\thealgorithm}{\\arabic{chapter}.\\arabic{algorithm}}\n\\makeatletter\n\\renewcommand*{\\ALG@name}{算法}\n\\makeatother\n\n\n\n\\usepackage[pdfpagelabels=true,\npdffitwindow=false,\npdfview=FitH,\npdfstartview=FitH,\npagebackref=true,\nbreaklinks=true,\ncolorlinks=false,\nbookmarks=true,\nhidelinks=true,\nbookmarksnumbered=true,\nbookmarksopen=true,\nbookmarksopenlevel=1,\nbookmarksdepth=1,\nplainpages=true]{hyperref}\n\\usepackage{bookmark}\n\n\\usepackage{zref-abspage}\n\\setcounter{tocdepth}{3}\n\\setcounter{secnumdepth}{3}\n\n\n% my page\n\\usepackage[vcentering,dvips]{geometry}\n\\geometry{papersize={7in,9in},bottom=3pc,top=5pc,left=5pc,right=5pc,bmargin=4.5pc,footskip=18pt,headsep=25pt}\n\\setlength\\emergencystretch{1.5em}\n\n% my command\n\\newcommand{\\firstgls}[1]{\\textbf{\\,\\gls{#1}}（\\glsdesc{#1}）}\n\\newcommand{\\firstacr}[1]{\\textbf{\\,\\gls{#1}}（\\glssymbol{#1}）}\n\\newcommand{\\glsacr}[1]{\\gls{#1}（\\glssymbol{#1}）}\n\\newcommand{\\firstall}[1]{\\textbf{\\,\\gls{#1}}（\\glsdesc{#1}, \\glssymbol{#1}）}\n\\newcommand{\\ENNAME}[1]{\\text{#1}}\n\\newcommand{\\NUMTEXT}[1]{\\text{#1}}\n\\newcommand{\\figref}[1]{图\\,\\ref{#1}\\,}\n\\newcommand{\\chapref}[1]{第\\ref{#1}章}\n\\newcommand{\\secref}[1]{第\\,\\ref{#1}\\,节}\n\\newcommand{\\algref}[1]{算法\\,\\ref{#1}\\,}\n\\newcommand{\\eqnref}[1]{式\\,\\eqref{#1}\\,}\n\n\n% Draft\n\\usepackage{draftwatermark}\n\\SetWatermarkText{DRAFT}\n\\SetWatermarkLightness{0.9}\n\\usepackage{background}\n\\SetBgContents{仅供学习使用，不得用于商业目的。\n\\url{https://github.com/exacity/deeplearningbook-chinese}}\n\\SetBgScale{1}\n\\SetBgAngle{0}\n\\SetBgOpacity{1}\n\\SetBgColor{red}\n\\SetBgPosition{current page.north}\n\\SetBgVshift{-0.5cm}\n\n\\newif\\ifOpenSource\n\\OpenSourcetrue\n\n% http://tex.stackexchange.com/questions/198140/glossaries-and-custom-section-headings-broken  \\glsentrytext!\n\\usepackage[nomain,acronym,xindy,toc,nopostdot]{glossaries}\n\\makeglossaries\n\\usepackage[xindy]{imakeidx}\n\\makeindex\n\n\n% symbol and \n\\include{math_symbol}\n\\include{terminology}\n\n\n\n% title \n\\title{\\Huge\\textbf{深度学习}}\n\\author{}\n\\date{\\today}\n\n\n\\begin{document}\n\\frontmatter\n\n\\maketitle\n\\cleardoublepage\n\n% From en book -B\n\\setlength{\\parskip}{0.25 \\baselineskip}\n% Sean said to make figures 26 picas wide\n\\newlength{\\figwidth}\n\\setlength{\\figwidth}{26pc}\n% Spacing between notation sections\n\\newlength{\\notationgap}\n\\setlength{\\notationgap}{1pc}\n% From en book -E\n\n\n\\tableofcontents\n\n\\newpage\n\\input{acknowledgments.tex}\n\\input{website.tex}\n\\input{notation.tex}\n\\mainmatter\n\n\\input{Chapter1/introduction.tex}\n\\input{applied_math_and_machine_learning_basics.tex}\n\\input{deep_networks_modern_practices.tex}\n\\input{deep_learning_research.tex}\n\n\n\\backmatter\n\\bookmarksetup{startatroot}\n\n\\appendix\n\n\\small{\n\\bibliography{dlbook_cn}\n\\bibliographystyle{natbib}\n\\clearpage\n}\n\n\\printglossary[title=术语]\n\\end{document}\n"
  },
  {
    "path": "docs/Gemfile",
    "content": "source 'https://rubygems.org'\ngem 'github-pages', group: :jekyll_plugins\n"
  },
  {
    "path": "docs/_config.yml",
    "content": "title:            Deep Learning Book Chinese Translation\ndescription:      \ndisqus_shortname: exacity\nreading_time:     false\nwords_per_minute: 200\nshare: false\n\n# Your site's domain goes here (eg: https://mmistakes.github.io, http://yourdomain.com, etc)\n# When testing locally leave blank or use http://localhost:4000\nbaseurl: \nurl: https://exacity.github.io/deeplearningbook-chinese\n\n# Owner/author information\nowner:\n  name:           Exacity\n  avatar:         \n  bio:            \n  email:          \n  # Social networking links used in footer. Update and remove as you like.\n  twitter:        \n  facebook:       \n  github:         \n  stackexchange:  \n  linkedin:       \n  instagram:      \n  flickr:         \n  tumblr:         \n  # google plus id, include the '+', eg +mmistakes\n  google_plus:\n\n# Background image to be tiled on all pages\nbackground: \n\n# Analytics and webmaster tools stuff goes here\ngoogle_analytics:   \ngoogle_verify: ft1w5-dLDQXQyhaWdywVI_d2H_aSVSZSxwvzVAh6fmE\n# https://ssl.bing.com/webmaster/configure/verify/ownership Option 2 content= goes here\nbing_verify:         \n\n# http://en.wikipedia.org/wiki/List_of_tz_database_time_zones\ntimezone:    \nfuture:      false  # publish future dated posts --  true, false (default) \nhighlighter: rouge\nmarkdown:    kramdown\ngems:\n  - jekyll-sitemap\n  - jekyll-paginate\n  - jekyll-gist\n  - jekyll-feed\nsass:\n  sass_dir: _sass\n  style: compressed\n\n# https://github.com/mojombo/jekyll/wiki/Permalinks\npermalink:   /:categories/:title/\n\n# Amount of post to show on home page\npaginate: 20\n\nkramdown:\n  input: GFM\n  auto_ids: true\n  footnote_nr: 1\n  entity_output: as_char\n  toc_levels: 1..6\n  enable_coderay: false\n\ninclude: \n  - .htaccess\nexclude: \n  - \"*.less\"\n  - \"*.sublime-project\"\n  - \"*.sublime-workspace\"\n  - .asset-cache\n  - .bundle\n  - .jekyll-assets-cache\n  - .sass-cache\n  - CHANGELOG\n  - Capfile\n  - Gemfile\n  - Gruntfile.js\n  - LICENSE\n  - README\n  - Rakefile\n  - config\n  - gulpfile.js\n  - lib\n  - log\n  - node_modules\n  - package.json\n  - spec\n  - tmp\n"
  },
  {
    "path": "docs/_includes/browser-upgrade.html",
    "content": "<!--[if lt IE 9]><div class=\"upgrade\"><strong><a href=\"http://whatbrowser.org/\">Your browser is quite old!</strong> Why not upgrade to a different browser to better enjoy this site?</a></div><![endif]-->"
  },
  {
    "path": "docs/_includes/disqus_comments.html",
    "content": "{% if site.disqus_shortname %}\n    <script type=\"text/javascript\">\n        /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */\n        var disqus_shortname = '{{ site.disqus_shortname }}'; // required: replace example with your forum shortname\n\n        /* * * DON'T EDIT BELOW THIS LINE * * */\n        (function() {\n            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';\n            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n        })();\n\n        /* * * DON'T EDIT BELOW THIS LINE * * */\n        (function () {\n            var s = document.createElement('script'); s.async = true;\n            s.type = 'text/javascript';\n            s.src = '//' + disqus_shortname + '.disqus.com/count.js';\n            (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n        }());\n    </script>\n    <noscript>Please enable JavaScript to view the <a href=\"http://disqus.com/?ref_noscript\">comments powered by Disqus.</a></noscript>\n    <a href=\"http://disqus.com\" class=\"dsq-brlink\">comments powered by <span class=\"logo-disqus\">Disqus</span></a>\n{% endif %}"
  },
  {
    "path": "docs/_includes/feed-footer.html",
    "content": "&lt;p&gt;&lt;a href=&quot;{{ site.url }}{{ post.url }}&quot;&gt;{{ post.title | xml_escape }}&lt;/a&gt; was originally published by {{ site.owner.name }} at &lt;a href=&quot;{{ site.url }}&quot;&gt;{{ site.title }}&lt;/a&gt; on {{ post.date | date: \"%B %d, %Y\" }}.&lt;/p&gt;"
  },
  {
    "path": "docs/_includes/footer.html",
    "content": "<span>&copy; {{ site.time | date: '%Y' }} {{ site.owner.name }}. Powered by <a href=\"http://jekyllrb.com\" rel=\"nofollow\">Jekyll</a> using the <a href=\"https://mademistakes.com/work/hpstr-jekyll-theme/\" rel=\"nofollow\">HPSTR Theme</a>.</span>"
  },
  {
    "path": "docs/_includes/gallery",
    "content": "{% assign images = include.images | split:\" \" %}\n{% assign caption = include.caption %}\n{% assign cols = include.cols %}\n\n{% case cols %}\n    {% when 1 %}\n        {% assign class = \"\" %}\n    {% when 2 %}\n        {% assign class = \"half\" %}\n    {% when 3 %}\n        {% assign class = \"third\" %}\n    {% else %}\n        {% assign class = \"\" %}\n{% endcase %}\n\n<figure {% if class != \"\" %}class=\"{{ class }}\"{% endif %}>\n    {% for image in images %}\n    <a href=\"{{ image }}\"><img src=\"{{ image }}\" alt=\"\"></a>\n    {% endfor %}\n    <figcaption>{{ caption }}</figcaption>\n</figure>\n"
  },
  {
    "path": "docs/_includes/head.html",
    "content": "<meta charset=\"utf-8\">\n<title>{% if page.title %}{{ page.title }} &#8211; {% endif %}{{ site.title }}</title>\n<meta name=\"description\" content=\"{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}\">\n{% if page.tags %}<meta name=\"keywords\" content=\"{{ page.tags | join: ', ' }}\">{% endif %}\n\n{% if site.owner.twitter %}<!-- Twitter Cards -->\n{% if page.image.feature %}<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:image\" content=\"{{ site.url }}/images/{{ page.image.feature }}\">\n{% else %}<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"{% if page.image.thumb %}{{ site.url }}/images/{{ page.image.thumb }}{% else %}{{ site.url }}/images/{{ site.logo }}{% endif %}\">{% endif %}\n<meta name=\"twitter:title\" content=\"{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}\">\n<meta name=\"twitter:description\" content=\"{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}\">\n<meta name=\"twitter:creator\" content=\"@{{ site.owner.twitter }}\">{% endif %}\n\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}\">\n<meta property=\"og:description\" content=\"{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}\">\n<meta property=\"og:url\" content=\"{{ site.url }}{{ page.url }}\">\n<meta property=\"og:site_name\" content=\"{{ site.title }}\">\n\n{% if site.google_verify %}<meta name=\"google-site-verification\" content=\"{{ site.google_verify }}\">{% endif %}\n{% if site.bing_verify %}<meta name=\"msvalidate.01\" content=\"{{ site.bing_verify }}\">{% endif %}\n\n{% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}\n<link rel=\"canonical\" href=\"{{ canonical }}\">\n<link href=\"{{ site.url }}/feed.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ site.title }} Feed\">\n\n<!-- http://t.co/dKP3o1e -->\n<meta name=\"HandheldFriendly\" content=\"True\">\n<meta name=\"MobileOptimized\" content=\"320\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n<!-- For all browsers -->\n<link rel=\"stylesheet\" href=\"{{ site.url }}/assets/css/main.css\">\n<!-- Webfonts -->\n<link href=\"//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic\" rel=\"stylesheet\" type=\"text/css\">\n\n<meta http-equiv=\"cleartype\" content=\"on\">\n\n<!-- Load Modernizr -->\n<script src=\"{{ site.url }}/assets/js/vendor/modernizr-2.6.2.custom.min.js\"></script>\n\n<!-- Icons -->\n<!-- 16x16 -->\n<link rel=\"shortcut icon\" href=\"{{ site.url }}/favicon.ico\">\n<!-- 32x32 -->\n<link rel=\"shortcut icon\" href=\"{{ site.url }}/favicon.png\">\n<!-- 57x57 (precomposed) for iPhone 3GS, pre-2011 iPod Touch and older Android devices -->\n<link rel=\"apple-touch-icon-precomposed\" href=\"{{ site.url }}/images/apple-touch-icon-precomposed.png\">\n<!-- 72x72 (precomposed) for 1st generation iPad, iPad 2 and iPad mini -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"{{ site.url }}/images/apple-touch-icon-72x72-precomposed.png\">\n<!-- 114x114 (precomposed) for iPhone 4, 4S, 5 and post-2011 iPod Touch -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"{{ site.url }}/images/apple-touch-icon-114x114-precomposed.png\">\n<!-- 144x144 (precomposed) for iPad 3rd and 4th generation -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"144x144\" href=\"{{ site.url }}/images/apple-touch-icon-144x144-precomposed.png\">\n\n{% if page.image.background or site.background %}\n{% capture background %}{% if page.image.background %}{{ page.image.background }}{% else %}{{ site.background }}{% endif %}{% endcapture %}\n{% unless background contains 'http://' or background contains 'https://' %}{% capture background %}{{ site.url }}/images/{{ background }}{% endcapture %}{% endunless %}\n<style type=\"text/css\">body {background-image:url({{ background }});}</style>\n{% endif %}\n"
  },
  {
    "path": "docs/_includes/math_symbol.html",
    "content": "\\(\n\\newcommand{\\argmax}{\\arg\\max}\n\\newcommand{\\argmin}{\\arg\\min}\n\\newcommand{\\sigmoid}{\\text{sigmoid}}\n\\newcommand{\\norm}[1]{\\left\\lVert#1\\right\\rVert}\n\\newcommand{\\Tr}{\\text{Tr}}\n\n\\newcommand{\\Var}{\\text{Var}}\n\\newcommand{\\Cov}{\\text{Cov}}\n\\newcommand{\\plim}{\\text{plim}}\n\\newcommand{\\Tsp}{\\top}\n\n% Scala\n\\newcommand{\\Sa}{\\mathit{a}}\n\\newcommand{\\Sb}{\\mathit{b}}\n\\newcommand{\\Sc}{\\mathit{c}}\n\\newcommand{\\Sd}{\\mathit{d}}\n\\newcommand{\\Se}{\\mathit{e}}\n\\newcommand{\\Sf}{\\mathit{f}}\n\\newcommand{\\Sg}{\\mathit{g}}\n\\newcommand{\\Sh}{\\mathit{h}}\n\\newcommand{\\Si}{\\mathit{i}}\n\\newcommand{\\Sj}{\\mathit{j}}\n\\newcommand{\\Sk}{\\mathit{k}}\n\\newcommand{\\Sl}{\\mathit{l}}\n\\newcommand{\\Sm}{\\mathit{m}}\n\\newcommand{\\Sn}{\\mathit{n}}\n\\newcommand{\\So}{\\mathit{o}}\n\\newcommand{\\Sp}{\\mathit{p}}\n\\newcommand{\\Sq}{\\mathit{q}}\n\\newcommand{\\Sr}{\\mathit{r}}\n\\newcommand{\\Ss}{\\mathit{s}}\n\\newcommand{\\St}{\\mathit{t}}\n\\newcommand{\\Su}{\\mathit{u}}\n\\newcommand{\\Sv}{\\mathit{v}}\n\\newcommand{\\Sw}{\\mathit{w}}\n\\newcommand{\\Sx}{\\mathit{x}}\n\\newcommand{\\Sy}{\\mathit{y}}\n\\newcommand{\\Sz}{\\mathit{z}}\n\n\\newcommand{\\SA}{\\mathit{A}}\n\\newcommand{\\SB}{\\mathit{B}}\n\\newcommand{\\SC}{\\mathit{C}}\n\\newcommand{\\SD}{\\mathit{D}}\n\\newcommand{\\SE}{\\mathit{E}}\n\\newcommand{\\SF}{\\mathit{F}}\n\\newcommand{\\SG}{\\mathit{G}}\n\\newcommand{\\SH}{\\mathit{H}}\n\\newcommand{\\SJ}{\\mathit{J}}\n\\newcommand{\\SK}{\\mathit{K}}\n\\newcommand{\\SI}{\\mathit{L}}\n\\newcommand{\\SM}{\\mathit{M}}\n\\newcommand{\\SN}{\\mathit{N}}\n\\newcommand{\\SO}{\\mathit{O}}\n\\newcommand{\\SP}{\\mathit{P}}\n\\newcommand{\\SQ}{\\mathit{Q}}\n\\newcommand{\\SR}{\\mathit{R}}\n\\newcommand{\\ST}{\\mathit{T}}\n\\newcommand{\\SU}{\\mathit{U}}\n\\newcommand{\\SV}{\\mathit{V}}\n\\newcommand{\\SW}{\\mathit{W}}\n\\newcommand{\\SX}{\\mathit{X}}\n\\newcommand{\\SY}{\\mathit{Y}}\n\\newcommand{\\SZ}{\\mathit{Z}}\n\n\n\n% Vector\n\\newcommand{\\Va}{\\boldsymbol{\\mathit{a}}}\n\\newcommand{\\Vb}{\\boldsymbol{\\mathit{b}}}\n\\newcommand{\\Vc}{\\boldsymbol{\\mathit{c}}}\n\\newcommand{\\Vd}{\\boldsymbol{\\mathit{d}}}\n\\newcommand{\\Ve}{\\boldsymbol{\\mathit{e}}}\n\\newcommand{\\Vf}{\\boldsymbol{\\mathit{f}}}\n\\newcommand{\\Vg}{\\boldsymbol{\\mathit{g}}}\n\\newcommand{\\Vh}{\\boldsymbol{\\mathit{h}}}\n\\newcommand{\\Vi}{\\boldsymbol{\\mathit{i}}}\n\\newcommand{\\Vj}{\\boldsymbol{\\mathit{j}}}\n\\newcommand{\\Vk}{\\boldsymbol{\\mathit{k}}}\n\\newcommand{\\Vl}{\\boldsymbol{\\mathit{l}}}\n\\newcommand{\\Vm}{\\boldsymbol{\\mathit{m}}}\n\\newcommand{\\Vn}{\\boldsymbol{\\mathit{n}}}\n\\newcommand{\\Vo}{\\boldsymbol{\\mathit{o}}}\n\\newcommand{\\Vp}{\\boldsymbol{\\mathit{p}}}\n\\newcommand{\\Vq}{\\boldsymbol{\\mathit{q}}}\n\\newcommand{\\Vr}{\\boldsymbol{\\mathit{r}}}\n\\newcommand{\\Vs}{\\boldsymbol{\\mathit{s}}}\n\\newcommand{\\Vt}{\\boldsymbol{\\mathit{t}}}\n\\newcommand{\\Vu}{\\boldsymbol{\\mathit{u}}}\n\\newcommand{\\Vv}{\\boldsymbol{\\mathit{v}}}\n\\newcommand{\\Vw}{\\boldsymbol{\\mathit{w}}}\n\\newcommand{\\Vx}{\\boldsymbol{\\mathit{x}}}\n\\newcommand{\\Vy}{\\boldsymbol{\\mathit{y}}}\n\\newcommand{\\Vz}{\\boldsymbol{\\mathit{z}}}\n\n% Matrix\n\\newcommand{\\MA}{\\boldsymbol{\\mathit{A}}}\n\\newcommand{\\MB}{\\boldsymbol{\\mathit{B}}}\n\\newcommand{\\MC}{\\boldsymbol{\\mathit{C}}}\n\\newcommand{\\MD}{\\boldsymbol{\\mathit{D}}}\n\\newcommand{\\ME}{\\boldsymbol{\\mathit{E}}}\n\\newcommand{\\MF}{\\boldsymbol{\\mathit{F}}}\n\\newcommand{\\MG}{\\boldsymbol{\\mathit{G}}}\n\\newcommand{\\MH}{\\boldsymbol{\\mathit{H}}}\n\\newcommand{\\MI}{\\boldsymbol{\\mathit{I}}}\n\\newcommand{\\MJ}{\\boldsymbol{\\mathit{J}}}\n\\newcommand{\\MK}{\\boldsymbol{\\mathit{K}}}\n\\newcommand{\\ML}{\\boldsymbol{\\mathit{L}}}\n\\newcommand{\\MM}{\\boldsymbol{\\mathit{M}}}\n\\newcommand{\\MN}{\\boldsymbol{\\mathit{N}}}\n\\newcommand{\\MO}{\\boldsymbol{\\mathit{O}}}\n\\newcommand{\\MP}{\\boldsymbol{\\mathit{P}}}\n\\newcommand{\\MQ}{\\boldsymbol{\\mathit{Q}}}\n\\newcommand{\\MR}{\\boldsymbol{\\mathit{R}}}\n\\newcommand{\\MS}{\\boldsymbol{\\mathit{S}}}\n\\newcommand{\\MT}{\\boldsymbol{\\mathit{T}}}\n\\newcommand{\\MU}{\\boldsymbol{\\mathit{U}}}\n\\newcommand{\\MV}{\\boldsymbol{\\mathit{V}}}\n\\newcommand{\\MW}{\\boldsymbol{\\mathit{W}}}\n\\newcommand{\\MX}{\\boldsymbol{\\mathit{X}}}\n\\newcommand{\\MY}{\\boldsymbol{\\mathit{Y}}}\n\\newcommand{\\MZ}{\\boldsymbol{\\mathit{Z}}}\n\\newcommand{\\RMX}{\\boldsymbol{\\mathrm{X}}}\n\n\n%Tensor\n\\newcommand{\\TSA}{\\textsf{\\textbf{A}}}\n\\newcommand{\\TSB}{\\textsf{\\textbf{B}}}\n\\newcommand{\\TSC}{\\textsf{\\textbf{C}}}\n\\newcommand{\\TSD}{\\textsf{\\textbf{D}}}\n\\newcommand{\\TSE}{\\textsf{\\textbf{E}}}\n\\newcommand{\\TSF}{\\textsf{\\textbf{F}}}\n\\newcommand{\\TSG}{\\textsf{\\textbf{G}}}\n\\newcommand{\\TSH}{\\textsf{\\textbf{H}}}\n\\newcommand{\\TSI}{\\textsf{\\textbf{I}}}\n\\newcommand{\\TSJ}{\\textsf{\\textbf{J}}}\n\\newcommand{\\TSK}{\\textsf{\\textbf{K}}}\n\\newcommand{\\TSL}{\\textsf{\\textbf{L}}}\n\\newcommand{\\TSM}{\\textsf{\\textbf{M}}}\n\\newcommand{\\TSN}{\\textsf{\\textbf{N}}}\n\\newcommand{\\TSO}{\\textsf{\\textbf{O}}}\n\\newcommand{\\TSP}{\\textsf{\\textbf{P}}}\n\\newcommand{\\TSQ}{\\textsf{\\textbf{Q}}}\n\\newcommand{\\TSR}{\\textsf{\\textbf{R}}}\n\\newcommand{\\TSS}{\\textsf{\\textbf{S}}}\n\\newcommand{\\TST}{\\textsf{\\textbf{T}}}\n\\newcommand{\\TSU}{\\textsf{\\textbf{U}}}\n\\newcommand{\\TSV}{\\textsf{\\textbf{V}}}\n\\newcommand{\\TSW}{\\textsf{\\textbf{W}}}\n\\newcommand{\\TSX}{\\textsf{\\textbf{X}}}\n\\newcommand{\\TSY}{\\textsf{\\textbf{Y}}}\n\\newcommand{\\TSZ}{\\textsf{\\textbf{Z}}}\n\n% Tensor Element\n\\newcommand{\\TEA}{\\textit{\\textsf{A}}}\n\\newcommand{\\TEB}{\\textit{\\textsf{B}}}\n\\newcommand{\\TEC}{\\textit{\\textsf{C}}}\n\\newcommand{\\TED}{\\textit{\\textsf{D}}}\n\\newcommand{\\TEE}{\\textit{\\textsf{E}}}\n\\newcommand{\\TEF}{\\textit{\\textsf{F}}}\n\\newcommand{\\TEG}{\\textit{\\textsf{G}}}\n\\newcommand{\\TEH}{\\textit{\\textsf{H}}}\n\\newcommand{\\TEI}{\\textit{\\textsf{I}}}\n\\newcommand{\\TEJ}{\\textit{\\textsf{J}}}\n\\newcommand{\\TEK}{\\textit{\\textsf{K}}}\n\\newcommand{\\TEL}{\\textit{\\textsf{L}}}\n\\newcommand{\\TEM}{\\textit{\\textsf{M}}}\n\\newcommand{\\TEN}{\\textit{\\textsf{N}}}\n\\newcommand{\\TEO}{\\textit{\\textsf{O}}}\n\\newcommand{\\TEP}{\\textit{\\textsf{P}}}\n\\newcommand{\\TEQ}{\\textit{\\textsf{Q}}}\n\\newcommand{\\TER}{\\textit{\\textsf{R}}}\n\\newcommand{\\TES}{\\textit{\\textsf{S}}}\n\\newcommand{\\TET}{\\textit{\\textsf{T}}}\n\\newcommand{\\TEU}{\\textit{\\textsf{U}}}\n\\newcommand{\\TEV}{\\textit{\\textsf{V}}}\n\\newcommand{\\TEW}{\\textit{\\textsf{W}}}\n\\newcommand{\\TEX}{\\textit{\\textsf{X}}}\n\\newcommand{\\TEY}{\\textit{\\textsf{Y}}}\n\\newcommand{\\TEZ}{\\textit{\\textsf{Z}}}\n\n% Random Scala\n\\newcommand{\\RSa}{\\mathrm{a}}\n\\newcommand{\\RSb}{\\mathrm{b}}\n\\newcommand{\\RSc}{\\mathrm{c}}\n\\newcommand{\\RSd}{\\mathrm{d}}\n\\newcommand{\\RSe}{\\mathrm{e}}\n\\newcommand{\\RSf}{\\mathrm{f}}\n\\newcommand{\\RSg}{\\mathrm{g}}\n\\newcommand{\\RSh}{\\mathrm{h}}\n\\newcommand{\\RSi}{\\mathrm{i}}\n\\newcommand{\\RSj}{\\mathrm{j}}\n\\newcommand{\\RSk}{\\mathrm{k}}\n\\newcommand{\\RSl}{\\mathrm{l}}\n\\newcommand{\\RSm}{\\mathrm{m}}\n\\newcommand{\\RSn}{\\mathrm{n}}\n\\newcommand{\\RSo}{\\mathrm{o}}\n\\newcommand{\\RSp}{\\mathrm{p}}\n\\newcommand{\\RSq}{\\mathrm{q}}\n\\newcommand{\\RSr}{\\mathrm{r}}\n\\newcommand{\\RSs}{\\mathrm{s}}\n\\newcommand{\\RSt}{\\mathrm{t}}\n\\newcommand{\\RSu}{\\mathrm{u}}\n\\newcommand{\\RSv}{\\mathrm{v}}\n\\newcommand{\\RSw}{\\mathrm{w}}\n\\newcommand{\\RSx}{\\mathrm{x}}\n\\newcommand{\\RSy}{\\mathrm{y}}\n\\newcommand{\\RSz}{\\mathrm{z}}\n\n\n% Random Vector\n\\newcommand{\\RVa}{\\mathbf{a}}\n\\newcommand{\\RVb}{\\mathbf{b}}\n\\newcommand{\\RVc}{\\mathbf{c}}\n\\newcommand{\\RVd}{\\mathbf{d}}\n\\newcommand{\\RVe}{\\mathbf{e}}\n\\newcommand{\\RVf}{\\mathbf{f}}\n\\newcommand{\\RVg}{\\mathbf{g}}\n\\newcommand{\\RVh}{\\mathbf{h}}\n\\newcommand{\\RVi}{\\mathbf{i}}\n\\newcommand{\\RVj}{\\mathbf{j}}\n\\newcommand{\\RVk}{\\mathbf{k}}\n\\newcommand{\\RVl}{\\mathbf{l}}\n\\newcommand{\\RVm}{\\mathbf{m}}\n\\newcommand{\\RVn}{\\mathbf{n}}\n\\newcommand{\\RVo}{\\mathbf{o}}\n\\newcommand{\\RVp}{\\mathbf{p}}\n\\newcommand{\\RVq}{\\mathbf{q}}\n\\newcommand{\\RVr}{\\mathbf{r}}\n\\newcommand{\\RVs}{\\mathbf{s}}\n\\newcommand{\\RVt}{\\mathbf{t}}\n\\newcommand{\\RVu}{\\mathbf{u}}\n\\newcommand{\\RVv}{\\mathbf{v}}\n\\newcommand{\\RVw}{\\mathbf{w}}\n\\newcommand{\\RVx}{\\mathbf{x}}\n\\newcommand{\\RVy}{\\mathbf{y}}\n\\newcommand{\\RVz}{\\mathbf{z}}\n\n% Random Matrix\n% will be added later\n\n\\newcommand{\\Valpha}{\\boldsymbol{\\alpha}}\n\\newcommand{\\Vbeta}{\\boldsymbol{\\beta}}\n\\newcommand{\\Vtheta}{\\boldsymbol{\\theta}}\n\\newcommand{\\Vlambda}{\\boldsymbol{\\lambda}}\n\\newcommand{\\VLambda}{\\boldsymbol{\\Lambda}}\n\\newcommand{\\Vepsilon}{\\boldsymbol{\\epsilon}}\n\\newcommand{\\Vmu}{\\boldsymbol{\\mu}}\n\\newcommand{\\VPhi}{\\boldsymbol{\\Phi}}\n\\newcommand{\\Vsigma}{\\boldsymbol{\\sigma}}\n\\newcommand{\\VSigma}{\\boldsymbol{\\Sigma}}\n\\newcommand{\\Vrho}{\\boldsymbol{\\rho}}\n\\newcommand{\\Vgamma}{\\boldsymbol{\\gamma}}\n\\newcommand{\\Vomega}{\\boldsymbol{\\omega}}\n\\newcommand{\\Vpsi}{\\boldsymbol{\\psi}}\n\n\\newcommand{\\CalB}{\\mathcal{B}}\n\\newcommand{\\CalC}{\\mathcal{C}}\n\\newcommand{\\CalG}{\\mathcal{G}}\n\\newcommand{\\CalH}{\\mathcal{H}}\n\\newcommand{\\CalL}{\\mathcal{L}}\n\\newcommand{\\CalM}{\\mathcal{M}}\n\\newcommand{\\CalN}{\\mathcal{N}}\n\\newcommand{\\CalO}{\\mathcal{O}}\n\\newcommand{\\CalD}{\\mathcal{D}}\n\\newcommand{\\CalU}{\\mathcal{U}}\n\\newcommand{\\CalF}{\\mathcal{F}}\n\\newcommand{\\CalT}{\\mathcal{T}}\n\n% Set\n\\newcommand{\\SetA}{\\mathbb{A}}\n\\newcommand{\\SetB}{\\mathbb{B}}\n\\newcommand{\\SetD}{\\mathbb{D}}\n\\newcommand{\\SetE}{\\mathbb{E}}\n\\newcommand{\\SetG}{\\mathbb{G}}\n\\newcommand{\\SetL}{\\mathbb{L}}\n\\newcommand{\\SetN}{\\mathbb{N}}\n\\newcommand{\\SetR}{\\mathbb{R}}\n\\newcommand{\\SetS}{\\mathbb{S}}\n\\newcommand{\\SetT}{\\mathbb{T}}\n\\newcommand{\\SetV}{\\mathbb{V}}\n\\newcommand{\\SetX}{\\mathbb{X}}\n\\newcommand{\\SetY}{\\mathbb{Y}}\n\\)\n"
  },
  {
    "path": "docs/_includes/navigation.html",
    "content": "<nav id=\"dl-menu\" class=\"dl-menuwrapper\" role=\"navigation\">\n\t<button class=\"dl-trigger\">Open Menu</button>\n\t<ul class=\"dl-menu\">\n\t\t<li><a href=\"{{ site.url }}/\">Index</a></li>\n\t\t<li><a href=\"https://github.com/exacity/deeplearningbook-chinese\">Github</a></li>\n\t    {% for link in site.data.navigation %}\n\t    {% if link.url contains 'http' %}\n\t        {% assign domain = '' %}\n\t        {% else %}\n\t        {% assign domain = site.url %}\n\t    {% endif %}\n\t    <li><a href=\"{{ domain }}{{ link.url }}\" {% if link.url contains 'http' %}target=\"_blank\"{% endif %}>{{ link.title }}</a></li>\n\t  {% endfor %}\n\t</ul><!-- /.dl-menu -->\n</nav><!-- /.dl-menuwrapper -->\n"
  },
  {
    "path": "docs/_includes/pagination.html",
    "content": "{% if paginator.total_pages > 1 %}\n<div class=\"pagination\">\n  <ul class=\"inline-list\">\n    {% comment %} Link for previous page {% endcomment %}\n    {% if paginator.previous_page %}\n      {% if paginator.previous_page == 1 %}\n        <li><a href=\"{{ site.url }}\" class=\"btn\">Previous</a></li>\n      {% else %}\n        <li><a href=\"{{ site.url }}/page{{ paginator.previous_page }}/\" class=\"btn\">Previous</a></li>\n      {% endif %}\n    {% endif %}\n\n    {% comment %} First page {% endcomment %}\n    {% if paginator.page == 1 %}\n      <li><strong class=\"current-page\">1</strong></li>\n    {% else %}\n      <li><a href=\"{{ site.url }}\">1</a></li>\n    {% endif %}\n\n    {% assign page_start = 2 %}\n    {% if paginator.page > 4 %}\n      {% assign page_start = paginator.page | minus: 2 %}\n      {% comment %} Ellipsis for truncated links {% endcomment %}\n      <li>…</li>\n    {% endif %}\n\n    {% assign page_end = paginator.total_pages | minus: 1 %}\n    {% assign pages_to_end = paginator.total_pages | minus: paginator.page %}\n    {% if pages_to_end > 4 %}\n      {% assign page_end = paginator.page | plus: 2 %}\n    {% endif %}\n\n    {% for index in (page_start..page_end) %}\n      {% if index == paginator.page %}\n        <li><strong class=\"current-page\">{{index}}</strong></li>\n      {% else %}\n        {% comment %} Distance from current page and this link {% endcomment %}\n        {% assign dist = paginator.page | minus: index %}\n        {% if dist < 0 %}\n          {% comment %} Distance must be a positive value {% endcomment %}\n          {% assign dist = 0 | minus: dist %}\n        {% endif %}\n        <li><a href=\"{{ site.url }}/page{{ index }}/\">{{index}}</a></li>\n      {% endif %}\n    {% endfor %}\n\n    {% comment %} Ellipsis for truncated links {% endcomment %}\n    {% if pages_to_end > 3 %}\n      <li>…</li>\n    {% endif %}\n\n    {% if paginator.page == paginator.total_pages %}\n      <li><strong class=\"current-page\">{{ paginator.page }}</strong></li>\n    {% else %}\n      <li><a href=\"{{ site.url }}/page{{ paginator.total_pages }}/\">{{ paginator.total_pages }}</a></li>\n    {% endif %}\n\n    {% comment %}\n      Link next page\n    {% endcomment %}\n    {% if paginator.next_page %}\n      <li><a href=\"{{ site.url }}/page{{ paginator.next_page }}/\" class=\"btn\">Next</a></li>\n    {% endif %}\n  </ul>\n</div>\n{% endif %}"
  },
  {
    "path": "docs/_includes/read-more.html",
    "content": "<div class=\"read-more\">\n  {% for post in site.related_posts limit:1 %}\n    <div class=\"read-more-header\">\n      <a href=\"{{ site.url }}{{ page.previous.url }}\" class=\"read-more-btn\">Read More</a>\n    </div><!-- /.read-more-header -->\n    <div class=\"read-more-content\">\n      <h3><a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\">{{ post.title }}</a></h3>\n      <p>{% if post.description %}{{ post.description }}{% else %}{{ post.content | strip_html | strip_newlines | truncate: 140 }}&hellip;{% endif %} <a href=\"{{ site.url }}{{ post.url }}\">Continue reading</a></p>\n    </div><!-- /.read-more-content -->\n  {% endfor %}\n  <div class=\"read-more-list\">\n    {% for post in site.related_posts limit:2 offset:1 %}\n      <div class=\"list-item\">\n        <h4><a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\">{{ post.title }}</a></h4>\n        <span>Published on {{ post.date | date: \"%B %d, %Y\" }}</span>\n      </div><!-- /.list-item -->\n    {% endfor %}\n  </div><!-- /.read-more-list -->\n</div><!-- /.read-more -->"
  },
  {
    "path": "docs/_includes/read-time-index.html",
    "content": "{% assign readtime = post.content | strip_html | number_of_words | divided_by:site.words_per_minute %}\nReading time ~{% if readtime <= 1 %}1 minute{% else %}{{ readtime }} minutes{% endif %}"
  },
  {
    "path": "docs/_includes/read-time.html",
    "content": "{% assign readtime = content | strip_html | number_of_words | divided_by:site.words_per_minute %}\nReading time ~{% if readtime <= 1 %}1 minute{% else %}{{ readtime }} minutes{% endif %}"
  },
  {
    "path": "docs/_includes/scripts.html",
    "content": "<script type=\"text/javascript\" src=\"//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>\n<script>\nMathJax.Hub.Config({\n  tex2jax: {\n    inlineMath: [['$','$'], ['\\\\(','\\\\)']],\n    processEscapes: true\n  }\n});\n</script>\n<script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js\"></script>\n<script>window.jQuery || document.write('<script src=\"{{ site.url }}/assets/js/vendor/jquery-1.9.1.min.js\"><\\/script>')</script>\n<script src=\"{{ site.url }}/assets/js/scripts.min.js\"></script>\n\n{% if site.google_analytics %}\n<!-- Asynchronous Google Analytics snippet -->\n<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n  ga('create', '{{ site.google_analytics }}', 'auto');  \n  ga('require', 'linkid', 'linkid.js');\n  ga('send', 'pageview');\n</script>\n{% endif %}\n\n{% if page.comments != false %}{% include disqus_comments.html %}{% endif %}\n"
  },
  {
    "path": "docs/_includes/social-share.html",
    "content": "<div class=\"social-share\">\n  <ul class=\"socialcount socialcount-small inline-list\">\n    <li class=\"facebook\"><a href=\"https://www.facebook.com/sharer/sharer.php?u={{ site.url }}{{ page.url }}\" title=\"Share on Facebook\"><span class=\"count\"><i class=\"fa fa-facebook-square\"></i> Like</span></a></li>\n    <li class=\"twitter\"><a href=\"https://twitter.com/intent/tweet?text={{ site.url }}{{ page.url }}\" title=\"Share on Twitter\"><span class=\"count\"><i class=\"fa fa-twitter-square\"></i> Tweet</span></a></li>\n    <li class=\"googleplus\"><a href=\"https://plus.google.com/share?url={{ site.url }}{{ page.url }}\" title=\"Share on Google Plus\"><span class=\"count\"><i class=\"fa fa-google-plus-square\"></i> +1</span></a></li>\n  </ul>\n</div><!-- /.social-share -->"
  },
  {
    "path": "docs/_layouts/page.html",
    "content": "<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n{% include head.html %}\n</head>\n\n<body id=\"page\" {% if page.image.feature %}class=\"feature\"{% endif %}>\n\n{% include browser-upgrade.html %}\n{% include navigation.html %}\n\n{% if page.image.feature %}\n<div class=\"entry-header\">\n  {% if page.image.credit %}<div class=\"image-credit\">Image source: <a href=\"{{ page.image.creditlink }}\">{{ page.image.credit }}</a></div><!-- /.image-credit -->{% endif %}\n  <div class=\"entry-image\">\n    <img src=\"{{ site.url }}/images/{{ page.image.feature }}\" alt=\"{{ page.title }}\">\n  </div><!-- /.entry-image -->\n</div><!-- /.entry-header -->\n{% endif %}\n\n<div id=\"main\" role=\"main\">\n  <article class=\"hentry\">\n    <header class=\"header-title\">\n      <div class=\"header-title-wrap\">\n        <h1 class=\"entry-title\">{{ page.title }}</h1>\n        {% if site.reading_time %}\n        <p class=\"entry-reading-time\">\n          <i class=\"fa fa-clock-o\"></i>\n          {% include read-time.html %}\n        </p><!-- /.entry-reading-time -->\n        {% endif %}\n      </div><!-- /.header-title-wrap -->\n    </header>\n    <div class=\"entry-content\">\n      {{ content }}\n      <footer class=\"entry-meta\">\n        {% if page.modified %}<span>Updated on <span class=\"entry-date date published updated\"><time datetime=\"{{ page.modified }}\">{{ page.modified | date: \"%B %d, %Y\" }}</time></span></span>\n        <span class=\"author vcard\"><span class=\"fn\">{{ site.owner.name }}</span></span>{% endif %}\n        {% if page.share != false %}{% include social-share.html %}{% endif %}\n      </footer>\n    </div><!-- /.entry-content -->\n    {% if page.comments != false and site.disqus_shortname %}<section id=\"disqus_thread\"></section><!-- /#disqus_thread -->{% endif %}\n  </article>\n</div><!-- /#main -->\n\n<div class=\"footer-wrapper\">\n  <footer role=\"contentinfo\">\n    {% include footer.html %}\n  </footer>\n</div><!-- /.footer-wrapper -->\n\n{% include scripts.html %}          \n\n</body>\n</html>\n"
  },
  {
    "path": "docs/_layouts/post-index.html",
    "content": "<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n{% include head.html %}\n</head>\n\n<body id=\"post-index\" {% if page.image.feature %}class=\"feature\"{% endif %}>\n\n{% include browser-upgrade.html %}\n{% include navigation.html %}\n\n<div class=\"entry-header\">\n  {% if page.image.credit %}<div class=\"image-credit\">Image source: <a href=\"{{ page.image.creditlink }}\">{{ page.image.credit }}</a></div><!-- /.image-credit -->{% endif %}\n  {% if page.image.feature %}\n    <div class=\"entry-image\">\n      <img src=\"{{ site.url }}/images/{{ page.image.feature }}\" alt=\"{{ page.title }}\">\n    </div><!-- /.entry-image -->\n  {% endif %}\n  <div class=\"header-title\">\n    <div class=\"header-title-wrap\">\n      <h1>{{ site.title }}</h1>\n    </div><!-- /.header-title-wrap -->\n  </div><!-- /.header-title -->\n</div><!-- /.entry-header -->\n\n<div id=\"main\" role=\"main\">\n  {{ content }}\n</div><!-- /#main -->\n\n<div class=\"footer-wrapper\">\n  <footer role=\"contentinfo\">\n    {% include footer.html %}\n  </footer>\n</div><!-- /.footer-wrapper -->\n\n{% include scripts.html %}          \n\n</body>\n</html>\n"
  },
  {
    "path": "docs/_layouts/post.html",
    "content": "<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n{% include head.html %}\n</head>\n\n<body id=\"post\" {% if page.image.feature %}class=\"feature\"{% endif %}>\n\n{% include browser-upgrade.html %}\n{% include navigation.html %}\n{% include math_symbol.html %}\n\n{% if page.image.feature %}\n<div class=\"entry-header\">\n  {% if page.image.credit %}<div class=\"image-credit\">Image source: {% if page.image.creditlink %}<a href=\"{{ page.image.creditlink }}\">{% endif %}{{ page.image.credit }}{% if page.image.creditlink %}</a>{% endif %}</div><!-- /.image-credit -->{% endif %}\n  <div class=\"entry-image\">\n    <img src=\"{{ site.url }}/images/{{ page.image.feature }}\" alt=\"{{ page.title }}\">\n  </div><!-- /.entry-image -->\n</div><!-- /.entry-header -->\n{% endif %}\n\n<div id=\"main\" role=\"main\">\n  <article class=\"hentry\">\n    <header class=\"header-title\">\n      <div class=\"header-title-wrap\">\n        {% if page.link %}\n          <h1 class=\"entry-title\"><i class=\"fa fa-bookmark permalink\"></i> <a href=\"{{ page.link }}\">{{ page.title }}</a></h1>\n        {% else %}\n          <h1 class=\"entry-title\"><a href=\"{{ site.url }}{{ page.url }}\" rel=\"bookmark\" title=\"{{ page.title }}\">{{ page.title }}</a></h1>\n        {% endif %}\n        {% if site.reading_time %}\n        <p class=\"entry-reading-time\">\n          <i class=\"fa fa-clock-o\"></i>\n          {% include read-time.html %}\n        </p><!-- /.entry-reading-time -->\n        {% endif %}\n      </div><!-- /.header-title-wrap -->\n    </header>\n    <div class=\"entry-content\">\n      {{ content }}\n      <footer class=\"entry-meta\">\n        <span class=\"entry-tags\">{% for tag in page.tags %}<a href=\"{{ site.url }}/tags/#{{ tag }}\" title=\"Pages tagged {{ tag }}\" class=\"tag\"><span class=\"term\">{{ tag }}</span></a>{% unless forloop.last %}{% endunless %}{% endfor %}</span>\n        {% if page.modified %}<span>Updated on <span class=\"entry-date date updated\"><time datetime=\"{{ page.modified }}\">{{ page.modified | date: \"%B %d, %Y\" }}</time></span></span>\n        <span class=\"author vcard\"><span class=\"fn\">{{ site.owner.name }}</span></span>{% endif %}\n        {% if page.share != false %}{% include social-share.html %}{% endif %}\n      </footer>\n    </div><!-- /.entry-content -->\n    {% if page.comments != false and site.disqus_shortname %}<section id=\"disqus_thread\"></section><!-- /#disqus_thread -->{% endif %}\n  </article>\n</div><!-- /#main -->\n\n<div class=\"footer-wrapper\">\n  <footer role=\"contentinfo\">\n    {% include footer.html %}\n  </footer>\n</div><!-- /.footer-wrapper -->\n\n{% include scripts.html %}\t        \n\n</body>\n</html>\n"
  },
  {
    "path": "docs/_posts/2016-12-01-Chapter1_introduction.md",
    "content": "---\ntitle: 引言\nlayout: post\nshare: false\n---\n远在古希腊时期，发明家就梦想着创造能自主思考的机器。\n神话人物皮格马利翁(Pygmalion)、代达罗斯(Daedalus)和赫淮斯托斯(Hephaestus)可以被看作传说中的发明家，而加拉蒂亚(Galatea)、塔洛斯(Talos)和潘多拉(Pandora)则可以被视为人造生命{cite?}。\n\n当人类第一次构思可编程计算机时，就已经在思考计算机能否变得智能（尽管这距造出第一台计算机还有一百多年）{cite?}。\n如今，人工智能已经成为一个具有众多实际应用和活跃研究课题的领域，并且正在蓬勃发展。\n我们期望通过智能软件自动地处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究。\n\n在人工智能的早期，那些对人类智力来说非常困难、但对计算机来说相对简单的问题得到迅速解决，比如，那些可以通过一系列形式化的数学规则来描述的问题。\n人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务，如识别人们所说的话或图像中的脸。对于这些问题，我们人类往往可以凭借直觉轻易地解决。\n\n\n针对这些比较直观的问题，本书讨论一种解决方案。\n该方案可以让计算机从经验中学习，并根据层次化的概念体系来理解世界，而每个概念则通过与某些相对简单的概念之间的关系来定义。\n让计算机从经验获取知识，可以避免由人类来给计算机形式化地指定它需要的所有知识。\n层次化的概念让计算机构建较简单的概念来学习复杂概念。\n如果绘制出这些概念如何建立在彼此之上的图，我们将得到一张\"深\"（层次很多）的图。\n基于这个原因，我们称这种方法为~AI深度学习。\n\n<!-- % -- 1 -- -->\n\nAI~许多早期的成功发生在相对朴素且形式化的环境中， 而且不要求计算机具备很多关于世界的知识。\n例如，IBM的深蓝（Deep Blue）国际象棋系统在1997年击败了世界冠军Garry Kasparov{cite?}。\n显然国际象棋是一个非常简单的领域，因为它仅含有64个位置并只能以严格限制的方式移动32个棋子。\n设计一种成功的国际象棋策略是巨大的成就，但向计算机描述棋子及其允许的走法并不是挑战的困难所在。\n国际象棋完全可以由一个非常简短的、完全形式化的规则列表来描述，并可以容易地由程序员事先准备好。\n\n讽刺的是，抽象和形式化的任务对人类而言是最困难的脑力任务之一，但对计算机而言却属于最容易的。\n计算机早就能够打败人类最好的象棋选手，但直到最近计算机才在识别对象或语音任务中达到人类平均水平。\n一个人的日常生活需要关于世界的巨量知识。\n很多这方面的知识是主观的、直观的，因此很难通过形式化的方式表达清楚。\n计算机需要获取同样的知识才能表现出智能。\n人工智能的一个关键挑战就是如何将这些非形式化的知识传达给计算机。\n\n一些人工智能项目力求将关于世界的知识用形式化的语言进行硬编码(hard-code)。\n计算机可以使用逻辑推理规则来自动地理解这些形式化语言中的声明。\n这就是众所周知的人工智能的知识库方法。\n然而，这些项目最终都没有取得重大的成功。\n其中最著名的项目是Cyc {cite?}。\nCyc包括一个推断引擎和一个使用CycL语言描述的声明数据库。\n这些声明是由人类监督者输入的。\n这是一个笨拙的过程。\n人们设法设计出足够复杂的形式化规则来精确地描述世界。\n例如，Cyc不能理解一个关于名为~Fred~的人在早上剃须的故事{cite?}。\n它的推理引擎检测到故事中的不一致性：它知道人体的构成不包含电气零件，但由于~Fred~正拿着一个电动剃须刀，它认为实体\n\"正在剃须的Fred\"\\,(\"FredWhileShaving\")含有电气部件。\n因此它产生了这样的疑问——Fred~在刮胡子的时候是否仍然是一个人。\n\n依靠硬编码的知识体系面对的困难表明，AI~系统需要具备自己获取知识的能力，即从原始数据中提取模式的能力。\n这种能力被称为机器学习。\n引入机器学习使计算机能够解决涉及现实世界知识的问题，并能作出看似主观的决策。\n比如，一个被称为逻辑回归的简单机器学习算法可以决定是否建议剖腹产{cite?}。\n而同样是简单机器学习算法的朴素贝叶斯则可以区分垃圾电子邮件和合法电子邮件。\n\n<!-- % -- 2 -- -->\n\n这些简单的机器学习算法的性能在很大程度上依赖于给定数据的表示。\n例如，当逻辑回归被用于判断产妇是否适合剖腹产时，AI~系统不会直接检查患者。\n相反，医生需要告诉系统几条相关的信息，诸如是否存在子宫疤痕。\n表示患者的每条信息被称为一个特征。\n逻辑回归学习病人的这些特征如何与各种结果相关联。\n然而，它丝毫不能影响该特征定义的方式。\n如果将病人的MRI扫描作为逻辑回归的输入，而不是医生正式的报告，它将无法作出有用的预测。\nMRI扫描的单一像素与分娩过程中并发症之间的相关性微乎其微。\n\n在整个计算机科学乃至日常生活中，对表示的依赖都是一个普遍现象。\n在计算机科学中，如果数据集合被精巧地结构化并被智能地索引，那么诸如搜索之类的操作的处理速度就可以成指数级地加快。\n人们可以很容易地在阿拉伯数字的表示下进行算术运算，但在罗马数字的表示下运算会比较耗时。\n因此，毫不奇怪，表示的选择会对机器学习算法的性能产生巨大的影响。\n\\fig?展示了一个简单的可视化例子。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/polar_color}}\n\\fi\n\\caption{不同表示的例子：假设我们想在散点图中画一条线来分隔两类数据。\n在左图，我们使用笛卡尔坐标表示数据，这个任务是不可能的。 \n右图中，我们用极坐标表示数据，可以用垂直线简单地解决这个任务。（与David Warde-Farley合作画出此图。）}\n\\end{figure}\n\n许多人工智能任务都可以通过以下方式解决：先提取一个合适的特征集，然后将这些特征提供给简单的机器学习算法。\n例如，对于通过声音鉴别说话者的任务来说，一个有用的特征是对其声道大小的估计。\n这个特征为判断说话者是男性、女性还是儿童提供了有力线索。\n\n然而，对于许多任务来说，我们很难知道应该提取哪些特征。\n例如，假设我们想编写一个程序来检测照片中的车。\n我们知道，汽车有轮子，所以我们可能会想用车轮的存在与否作为特征。\n不幸的是，我们难以准确地根据像素值来描述车轮看上去像什么。\n虽然车轮具有简单的几何形状，但它的图像可能会因场景而异，如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者遮挡的车轮一部分的前景物体等等。\n\n<!-- % -- 3 -- -->\n\n解决这个问题的途径之一是使用机器学习来发掘表示本身，而不仅仅把表示映射到输出。\n这种方法我们称之为表示学习。\n学习到的表示往往比手动设计的表示表现得更好。\n并且它们只需最少的人工干预，就能让AI系统迅速适应新的任务。\n表示学习算法只需几分钟就可以为简单的任务发现一个很好的特征集，对于复杂任务则需要几小时到几个月。\n手动为一个复杂的任务设计特征需要耗费大量的人工时间和精力；甚至需要花费整个社群研究人员几十年的时间。\n\n表示学习算法的典型例子是自编码器。\n自编码器由一个编码器函数和一个解码器函数组合而成。\n编码器函数将输入数据转换为一种不同的表示，而解码器函数则将这个新的表示转换到原来的形式。\n我们期望当输入数据经过编码器和解码器之后尽可能多地保留信息，同时希望新的表示有各种好的特性，\n这也是自编码器的训练目标。\n为了实现不同的特性，我们可以设计不同形式的自编码器。\n\n当设计特征或设计用于学习特征的算法时，我们的目标通常是分离出能解释观察数据的变差因素。\n在此背景下，\"因素\"这个词仅指代影响的不同来源；因素通常不是乘性组合。\n这些因素通常是不能被直接观察到的量。\n相反，它们可能是现实世界中观察不到的物体或者不可观测的力，但会影响可观测的量。\n为了对观察到的数据提供有用的简化解释或推断其原因，它们还可能以概念的形式存在于人类的思维中。\n它们可以被看作数据的概念或者抽象，帮助我们了解这些数据的丰富多样性。\n当分析语音记录时，变差因素包括说话者的年龄、性别、他们的口音和他们正在说的词语。\n当分析汽车的图像时，变差因素包括汽车的位置、它的颜色、太阳的角度和亮度。\n\n<!-- % -- 4 -- -->\n\n在许多现实的人工智能应用中，困难主要源于多个变差因素同时影响着我们能够观察到的每一个数据。\n比如，在一张包含红色汽车的图片中，其单个像素在夜间可能会非常接近黑色。\n汽车轮廓的形状取决于视角。\n大多数应用需要我们\\emph{理清}变差因素并忽略我们不关心的因素。\n\n显然，从原始数据中提取如此高层次、抽象的特征是非常困难的。\n许多诸如说话口音这样的变差因素，只能通过对数据进行复杂的、接近人类水平的理解来辨识。\n这几乎与获得原问题的表示一样困难，因此，乍一看，表示学习似乎并不能帮助我们。\n\n深度学习通过其他较简单的表示来表达复杂表示，解决了表示学习中的核心问题。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/deep_learning}}\n\\fi\n\\caption{深度学习模型的示意图。 计算机难以理解原始感观输入数据的含义，如表示为像素值集合的图像。\n将一组像素映射到对象标识的函数非常复杂。\n如果直接处理，学习或评估此映射似乎是不可能的。\n深度学习将所需的复杂映射分解为一系列嵌套的简单映射（每个由模型的不同层描述）来解决这一难题。\n输入展示在可见层，这样命名的原因是因为它包含我们能观察到的变量。\n然后是一系列从图像中提取越来越多抽象特征的隐藏层。\n因为它们的值不在数据中给出，所以将这些层称为\"隐藏\"; 模型必须确定哪些概念有利于解释观察数据中的关系。\n这里的图像是每个隐藏单元表示的特征的可视化。\n给定像素，第一层可以轻易地通过比较相邻像素的亮度来识别边缘。\n有了第一隐藏层描述的边缘，第二隐藏层可以容易地搜索可识别为角和扩展轮廓的边集合。\n给定第二隐藏层中关于角和轮廓的图像描述，第三隐藏层可以找到轮廓和角的特定集合来检测特定对象的整个部分。\n最后，根据图像描述中包含的对象部分，可以识别图像中存在的对象。\n经~{ZeilerFergus14}许可转载此图。\n}\n\\end{figure}\n\n深度学习让计算机通过较简单概念构建复杂的概念。\n\\fig?展示了深度学习系统如何通过组合较简单的概念（例如转角和轮廓，它们转而由边线定义）来表示图像中人的概念。\n深度学习模型的典型例子是前馈深度网络或多层感知机。\n多层感知机仅仅是一个将一组输入值映射到输出值的数学函数。\n该函数由许多较简单的函数复合而成。\n我们可以认为不同数学函数的每一次应用都为输入提供了新的表示。\n\n学习数据的正确表示的想法是解释深度学习的一个视角。\n另一个视角是深度促使计算机学习一个多步骤的计算机程序。\n每一层表示都可以被认为是并行执行另一组指令之后计算机的存储器状态。\n更深的网络可以按顺序执行更多的指令。\n顺序指令提供了极大的能力，因为后面的指令可以参考早期指令的结果。\n从这个角度上看，在某层激活函数里，并非所有信息都蕴涵着解释输入的变差因素。\n表示还存储着状态信息，用于帮助程序理解输入。\n这里的状态信息类似于传统计算机程序中的计数器或指针。\n它与具体的输入内容无关，但有助于模型组织其处理过程。\n\n<!-- % -- 6 -- -->\n\n目前主要有两种度量模型深度的方式。\n第一种方式是基于评估架构所需执行的顺序指令的数目。\n假设我们将模型表示为给定输入后，计算对应输出的流程图，则可以将这张流程图中的最长路径视为模型的深度。\n正如两个使用不同语言编写的等价程序将具有不同的长度；相同的函数可以被绘制为具有不同深度的流程图，其深度取决于我们可以用来作为一个步骤的函数。\n\\fig?说明了语言的选择如何给相同的架构两个不同的衡量。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/language}}\n\\fi\n\\caption{将输入映射到输出的计算图表的示意图，其中每个节点执行一个操作。\n深度是从输入到输出的最长路径的长度，但这取决于可能的计算步骤的定义。\n这些图中所示的计算是逻辑回归模型的输出，$\\sigma(\\Vw^T \\Vx)$，其中$\\sigma$是~logistic sigmoid~函数。\n如果我们使用加法、乘法和~logistic sigmoid~作为我们计算机语言的元素，那么这个模型深度为三。\n如果我们将逻辑回归视为元素本身，那么这个模型深度为一。\n}\n\\end{figure}\n\n另一种是在深度概率模型中使用的方法，它不是将计算图的深度视为模型深度，而是将描述概念彼此如何关联的图的深度视为模型深度。\n在这种情况下，计算每个概念表示的计算流程图的深度可能比概念本身的图更深。\n这是因为系统对较简单概念的理解在给出更复杂概念的信息后可以进一步精细化。\n例如，一个~AI~系统观察其中一只眼睛在阴影中的脸部图像时，它最初可能只看到一只眼睛。\n但当检测到脸部的存在后，系统可以推断第二只眼睛也可能是存在的。\n在这种情况下，概念的图仅包括两层（关于眼睛的层和关于脸的层），但如果我们细化每个概念的估计将需要额外的$n$次计算，即计算的图将包含$2n$层。\n\n<!-- % -- 7 -- -->\n\n由于并不总是清楚计算图的深度或概率模型图的深度哪一个是最有意义的，并且由于不同的人选择不同的最小元素集来构建相应的图，因此就像计算机程序的长度不存在单一的正确值一样，架构的深度也不存在单一的正确值。\n另外，也不存在模型多么深才能被修饰为\"深\"的共识。\n但相比传统机器学习，深度学习研究的模型涉及更多学到功能或学到概念的组合，这点毋庸置疑。\n\n总之， 这本书的主题——深度学习是通向人工智能的途径之一。\n具体来说，它是机器学习的一种，一种能够使计算机系统从经验和数据中得到提高的技术。\n我们坚信机器学习可以构建出在复杂实际环境下运行的~AI~系统，并且是唯一切实可行的方法。\n深度学习是一种特定类型的机器学习，具有强大的能力和灵活性，它将大千世界表示为嵌套的层次概念体系\n（由较简单概念间的联系定义复杂概念、从一般抽象概括到高级抽象表示）。\n\\fig?说明了这些不同的~AI~学科之间的关系。\\fig?展示了每个学科如何工作的高层次原理。\n\n\\begin{figure}[!hbt]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.65\\textwidth]{Chapter1/figures/venn}}\n\\fi\n\\caption{维恩图展示了深度学习是一种表示学习，也是一种机器学习，可以用于许多（但不是全部）AI~方法。\n维恩图的每个部分包括一个~AI~技术的示例。\n}\n\\end{figure}\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/which_part_learned}}\n\\fi\n\\caption{流程图展示了~AI~系统的不同部分如何在不同的~AI~学科中彼此相关。\n阴影框表示能从数据中学习的组件。}\n\\end{figure}\n\n\n# 本书面向的读者\n\n\n这本书对各类读者都有一定用处，但我们主要是为两类受众对象而写的。\n其中一类受众对象是学习机器学习的大学生（本科或研究生），包括那些已经开始职业生涯的深度学习和人工智能研究者。\n另一类受众对象是没有机器学习或统计背景但希望能快速地掌握这方面知识并在他们的产品或平台中使用深度学习的软件工程师。\n深度学习在许多软件领域都已被证明是有用的，包括计算机视觉、语音和音频处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、网络广告和金融。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.65\\textwidth]{Chapter1/figures/dependency}}\n\\fi\n\\caption{本书的高层组织。\n从一章到另一章的箭头表示前一章是理解后一章的必备内容。}\n\\end{figure}\n\n<!-- % -- 8 -- -->\n\n为了最好地服务各类读者，我们将本书组织为三个部分。\n第一部分介绍基本的数学工具和机器学习的概念。\n第二部分介绍最成熟的深度学习算法，这些技术基本上已经得到解决。\n第三部分讨论某些具有展望性的想法，它们被广泛地认为是深度学习未来的研究重点。\n\n读者可以随意跳过不感兴趣或与自己背景不相关的部分。\n熟悉线性代数、概率和基本机器学习概念的读者可以跳过第一部分，例如，当读者只是想实现一个能工作的系统则不需要阅读超出第二部分的内容。\n为了帮助读者选择章节，\\fig?展示了这本书的高层组织结构的流程图。\n\n<!-- % -- 10 -- -->\n\n我们假设所有读者都具备计算机科学背景。\n也假设读者熟悉编程，并且对计算的性能问题、复杂性理论、入门级微积分和一些图论术语有基本的了解。\n<!-- %  -->\n\n# 深度学习的历史趋势\n\n通过历史背景了解深度学习是最简单的方式。\n这里我们仅指出深度学习的几个关键趋势，而不是提供其详细的历史：\n\n+ 深度学习有着悠久而丰富的历史，但随着许多不同哲学观点的渐渐消逝，与之对应的名称也渐渐尘封。\n+ 随着可用的训练数据量不断增加，深度学习变得更加有用。\n+ 随着时间的推移，针对深度学习的计算机软硬件基础设施都有所改善，深度学习模型的规模也随之增长。\n+ 随着时间的推移，深度学习已经解决日益复杂的应用，并且精度不断提高。\n\n\n\n## 神经网络的众多名称和命运变迁\n\n\n我们期待这本书的许多读者都听说过深度学习这一激动人心的新技术，并对一本书提及一个新兴领域的\"历史\"而感到惊讶。\n事实上，深度学习的历史可以追溯到20世纪40年代。\n深度学习\\emph{看似}是一个全新的领域，只不过因为在目前流行的前几年它是相对冷门的，同时也因为它被赋予了许多不同的名称（其中大部分已经不再使用），最近才成为众所周知的\"深度学习\"。\n这个领域已经更换了很多名称，它反映了不同的研究人员和不同观点的影响。\n\n全面地讲述深度学习的历史超出了本书的范围。\n然而，一些基本的背景对理解深度学习是有用的。\n一般来说，目前为止深度学习已经经历了三次发展浪潮：20世纪40年代到60年代深度学习的雏形出现在控制论中，20世纪80年代到90年代深度学习表现为联结主义，直到2006年，才真正以深度学习之名复兴。\n\\fig?给出了定量的展示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/cybernetics_connectionism_ngrams_color}}\n\\fi\n\\caption{根据Google图书中短语\"控制论\"、\"联结主义\"或\"神经网络\"频率衡量的人工神经网络研究的历史浪潮（图中展示了三次浪潮的前两次，第三次最近才出现）。\n第一次浪潮开始于20世纪40年代到20世纪60年代的控制论，随着生物学习理论的发展{cite?}\n和第一个模型的实现（如感知机~{cite?}） ，能实现单个神经元的训练。\n第二次浪潮开始于1980-1995年间的联结主义方法，可以使用反向传播{cite?} 训练具有一两个隐藏层的神经网络。\n当前第三次浪潮，也就是深度学习，大约始于2006年{cite?}，并且现在在2016年以书的形式出现。\n另外两次浪潮类似地出现在书中的时间比相应的科学活动晚得多。\n}\n\\end{figure}\n\n<!-- % -- 12 -- -->\n\n我们今天知道的一些最早的学习算法，是旨在模拟生物学习的计算模型，即大脑怎样学习或为什么能学习的模型。\n其结果是深度学习以人工神经网络之名而淡去。\n彼时，深度学习模型被认为是受生物大脑（无论人类大脑或其他动物的大脑）所启发而设计出来的系统。\n尽管有些机器学习的神经网络有时被用来理解大脑功能{cite?}，但它们一般都没有被设计成生物功能的真实模型。\n深度学习的神经观点受两个主要思想启发。\n一个想法是大脑作为例子证明智能行为是可能的，因此，概念上，建立智能的直接途径是逆向大脑背后的计算原理，并复制其功能。\n另一种看法是，理解大脑和人类智能背后的原理也非常有趣，因此机器学习模型除了解决工程应用的能力， 如果能让人类对这些基本的科学问题有进一步的认识也将会很有用。\n\n<!-- % -- 13 -- -->\n  \n现代术语\"深度学习\"超越了目前机器学习模型的神经科学观点。\n它诉诸于学习\\emph{多层次组合}这一更普遍的原理，这一原理也可以应用于那些并非受神经科学启发的机器学习框架。\n \n \n现代深度学习的最早前身是从神经科学的角度出发的简单线性模型。\n这些模型被设计为使用一组$\\Sn$个输入$\\Sx_1, \\dots ,\\Sx_n$并将它们与一个输出$\\Sy$相关联。 \n这些模型希望学习一组权重$\\Sw_1, \\dots, \\Sw_n $，并计算它们的输出$f(\\Vx, \\Vw) = \\Sx_1 \\Sw_1 + \\dots + \\Sx_n \\Sw_n$。\n如\\fig?所示，这第一波神经网络研究浪潮被称为控制论。\n\nMcCulloch-Pitts~神经元{cite?}是脑功能的早期模型。\n该线性模型通过检验函数$f(\\Vx,\\Vw)$的正负来识别两种不同类别的输入。\n显然，模型的权重需要正确设置后才能使模型的输出对应于期望的类别。\n这些权重可以由操作人员设定。\n在20世纪50年代，感知机{cite?}成为第一个能根据每个类别的输入样本来学习权重的模型。\n约在同一时期，\\textbf{自适应线性单元}(adaptive linear element, ADALINE)简单地返回函数$f(\\Vx)$本身的值来预测一个实数{cite?}，并且它还可以学习从数据预测这些数。\n\n这些简单的学习算法大大影响了机器学习的现代景象。\n用于调节ADALINE权重的训练算法是被称为随机梯度下降的一种特例。\n稍加改进后的随机梯度下降算法仍然是当今深度学习的主要训练算法。\n\n基于感知机和ADALINE中使用的函数$f(\\Vx, \\Vw)$的模型被称为线性模型。\n尽管在许多情况下，这些模型以不同于原始模型的方式进行\\emph{训练}，但仍是目前最广泛使用的机器学习模型。\n\n线性模型有很多局限性。\n最著名的是，它们无法学习异或（XOR）函数，即$f([0,1], \\Vw) = 1$和$f([1,0], \\Vw)=1$，但$f([1,1], \\Vw)=0$和$f([0,0],\\Vw)= 0$。\n观察到线性模型这个缺陷的批评者对受生物学启发的学习普遍地产生了抵触{cite?}。\n这导致了神经网络热潮的第一次大衰退。\n\n现在，神经科学被视为深度学习研究的一个重要灵感来源，但它已不再是该领域的主要指导。\n\n<!-- % -- 14 -- -->\n\n如今神经科学在深度学习研究中的作用被削弱，主要原因是我们根本没有足够的关于大脑的信息来作为指导去使用它。\n要获得对被大脑实际使用算法的深刻理解，我们需要有能力同时监测（至少是）数千相连神经元的活动。\n我们不能够做到这一点，所以我们甚至连大脑最简单、最深入研究的部分都还远远没有理解{cite?}。\n\n神经科学已经给了我们依靠单一深度学习算法解决许多不同任务的理由。\n神经学家们发现，如果将雪貂的大脑重新连接，使视觉信号传送到听觉区域，它们可以学会用大脑的听觉处理区域去\"看\"~{cite?}。\n这暗示着大多数哺乳动物的大脑能够使用单一的算法就可以解决其大脑可以解决的大部分不同任务。\n在这个假设之前，机器学习研究是比较分散的，研究人员在不同的社群研究自然语言处理、计算机视觉、运动规划和语音识别。\n如今，这些应用社群仍然是独立的，但是对于深度学习研究团体来说，同时研究许多或甚至所有这些应用领域是很常见的。\n\n我们能够从神经科学得到一些粗略的指南。\n仅通过计算单元之间的相互作用而变得智能的基本思想是受大脑启发的。\n新认知机{cite?}受哺乳动物视觉系统的结构启发，引入了一个处理图片的强大模型架构，它后来成为了现代卷积网络的基础{cite?}（我们将会在\\sec?看到）。\n目前大多数神经网络是基于一个称为整流线性单元的神经单元模型。\n原始认知机{cite?}受我们关于大脑功能知识的启发， 引入了一个更复杂的版本。\n简化的现代版通过吸收来自不同观点的思想而形成，{Nair-2010}和~{Glorot+al-AI-2011-small}援引神经科学作为影响，{Jarrett-ICCV2009}援引更多面向工程的影响。\n虽然神经科学是灵感的重要来源，但它不需要被视为刚性指导。\n我们知道，真实的神经元计算着与现代整流线性单元非常不同的函数，但更接近真实神经网络的系统并没有导致机器学习性能的提升。\n此外，虽然神经科学已经成功地启发了一些神经网络\\emph{架构}，但我们对用于神经科学的生物学习还没有足够多的了解，因此也就不能为训练这些架构用的\\emph{学习算法}提供太多的借鉴。\n\n\n媒体报道经常强调深度学习与大脑的相似性。\n的确，深度学习研究者比其他机器学习领域（如核方法或贝叶斯统计）的研究者更可能地引用大脑作为影响，但是大家不应该认为深度学习在尝试模拟大脑。\n现代深度学习从许多领域获取灵感，特别是应用数学的基本内容如线性代数、概率论、信息论和数值优化。\n尽管一些深度学习的研究人员引用神经科学作为灵感的重要来源，然而其他学者完全不关心神经科学。\n\n<!-- % -- 15 -- -->\n\n值得注意的是，了解大脑是如何在算法层面上工作的尝试确实存在且发展良好。\n这项尝试主要被称为\"计算神经科学\"，并且是独立于深度学习的领域。\n研究人员在两个领域之间来回研究是很常见的。\n深度学习领域主要关注如何构建计算机系统，从而成功解决需要智能才能解决的任务，而计算神经科学领域主要关注构建大脑如何真实工作的比较精确的模型。\n\n在20世纪80年代，神经网络研究的第二次浪潮在很大程度上是伴随一个被称为联结主义或\\textbf{并行分布处理}( parallel distributed processing)潮流而出现的{cite?}。\n联结主义是在认知科学的背景下出现的。\n认知科学是理解思维的跨学科途径，即它融合多个不同的分析层次。\n在20世纪80年代初期，大多数认知科学家研究符号推理模型。\n尽管这很流行，但符号模型很难解释大脑如何真正使用神经元实现推理功能。 \n联结主义者开始研究真正基于神经系统实现的认知模型{cite?}，其中很多复苏的想法可以追溯到心理学家~Donald Hebb~在20世纪40年代的工作{cite?}。\n\n联结主义的中心思想是，当网络将大量简单的计算单元连接在一起时可以实现智能行为。\n这种见解同样适用于生物神经系统中的神经元，因为它和计算模型中隐藏单元起着类似的作用。\n\n在上世纪80年代的联结主义期间形成的几个关键概念在今天的深度学习中仍然是非常重要的。\n\n其中一个概念是分布式表示{cite?}。\n其思想是：系统的每一个输入都应该由多个特征表示，并且每一个特征都应该参与到多个可能输入的表示。\n例如，假设我们有一个能够识别红色、绿色、或蓝色的汽车、卡车和鸟类的视觉系统，\n表示这些输入的其中一个方法是将九个可能的组合：红卡车，红汽车，红鸟，绿卡车等等使用单独的神经元或隐藏单元激活。\n这需要九个不同的神经元，并且每个神经必须独立地学习颜色和对象身份的概念。\n改善这种情况的方法之一是使用分布式表示，即用三个神经元描述颜色，三个神经元描述对象身份。 \n这仅仅需要6个神经元而不是9个，并且描述红色的神经元能够从汽车、卡车和鸟类的图像中学习红色，而不仅仅是从一个特定类别的图像中学习。 \n分布式表示的概念是本书的核心，我们将在\\chap?中更加详细地描述。\n\n<!-- % -- 16 -- -->\n\n联结主义潮流的另一个重要成就是反向传播在训练具有内部表示的深度神经网络中的成功使用以及反向传播算法的普及{cite?}。\n这个算法虽然曾黯然失色不再流行，但截至写书之时，它仍是训练深度模型的主导方法。% ??\n\n在20世纪90年代，研究人员在使用神经网络进行序列建模的方面取得了重要进展。\n{Hochreiter91}和~{Bengio-trnn93-small}指出了对长序列进行建模的一些根本性数学难题，这将在\\sec?中描述。\n{Hochreiter+Schmidhuber-1997}引入长短期记忆网络来解决这些难题。\n如今，LSTM~在许多序列建模任务中广泛应用，包括Google的许多自然语言处理任务。\n\n神经网络研究的第二次浪潮一直持续到上世纪90年代中期。\n基于神经网络和其他AI技术的创业公司开始寻求投资，其做法野心勃勃但不切实际。\n当AI研究不能实现这些不合理的期望时，投资者感到失望。\n同时，机器学习的其他领域取得了进步。\n比如，核方法{cite?}和图模型{cite?}都在很多重要任务上实现了很好的效果。\n这两个因素导致了神经网络热潮的第二次衰退，并一直持续到2007年。\n\n在此期间，神经网络继续在某些任务上获得令人印象深刻的表现{cite?}。\n加拿大高级研究所（CIFAR）通过其神经计算和自适应感知（NCAP）研究计划帮助维持神经网络研究。\n该计划联合了分别由~Geoffrey Hinton、Yoshua Bengio和~Yann LeCun~领导的多伦多大学、蒙特利尔大学和纽约大学的机器学习研究小组。\n这个多学科的CIFAR NCAP研究计划还囊括了神经科学家、人类和计算机视觉专家。\n\n<!-- % -- 17 -- -->\n\n在那个时候，人们普遍认为深度网络是难以训练的。\n现在我们知道，20世纪80年代就存在的算法能工作得非常好，但是直到在2006年前后都没有体现出来。\n这可能仅仅由于其计算代价太高，而以当时可用的硬件难以进行足够的实验。\n\n神经网络研究的第三次浪潮始于2006年的突破。\nGeoffrey Hinton~表明名为深度信念网络的神经网络可以使用一种称为贪婪逐层预训练的策略来有效地训练{cite?}，我们将在\\sec?中更详细地描述。\n其他CIFAR附属研究小组很快表明，同样的策略可以被用来训练许多其他类型的深度网络{cite?}，并能系统地帮助提高在测试样例上的泛化能力。\n神经网络研究的这一次浪潮普及了\"深度学习\"这一术语的使用，强调研究者现在有能力训练以前不可能训练的比较深的神经网络，并着力于深度的理论重要性上{cite?}。\n此时，深度神经网络已经优于与之竞争的基于其他机器学习技术以及手工设计功能的~AI~系统。\n在写这本书的时候，神经网络的第三次发展浪潮仍在继续，尽管深度学习的研究重点在这一段时间内发生了巨大变化。\n第三次浪潮已开始着眼于新的无监督学习技术和深度模型在小数据集的泛化能力，但目前更多的兴趣点仍是比较传统的监督学习算法和深度模型充分利用大型标注数据集的能力。\n\n\n## 与日俱增的数据量\n\n人们可能想问，既然人工神经网络的第一个实验在20世纪50年代就完成了，但为什么深度学习直到最近才被认为是关键技术。\n自20世纪90年代以来，深度学习就已经成功用于商业应用，但通常被视为是一种只有专家才可以使用的艺术而不是一种技术，这种观点一直持续到最近。\n确实，要从一个深度学习算法获得良好的性能需要一些技巧。\n幸运的是，随着训练数据的增加，所需的技巧正在减少。\n目前在复杂的任务达到人类水平的学习算法，与20世纪80年代努力解决玩具问题(toy problem)的学习算法几乎是一样的，尽管我们使用这些算法训练的模型经历了变革，即简化了极深架构的训练。\n最重要的新进展是现在我们有了这些算法得以成功训练所需的资源。\n\\fig?展示了基准数据集的大小如何随着时间的推移而显著增加。\n这种趋势是由社会日益数字化驱动的。\n由于我们的活动越来越多发生在计算机上，我们做什么也越来越多地被记录。\n由于我们的计算机越来越多地联网在一起，这些记录变得更容易集中管理，并更容易将它们整理成适于机器学习应用的数据集。\n因为统计估计的主要负担（观察少量数据以在新数据上泛化）已经减轻，\"大数据\"时代使机器学习更加容易。\n截至2016年，一个粗略的经验法则是，监督深度学习算法在每类给定约5000个标注样本情况下一般将达到可以接受的性能，当至少有1000万个标注样本的数据集用于训练时，它将达到或超过人类表现。\n此外，在更小的数据集上获得成功是一个重要的研究领域，为此我们应特别侧重于如何通过无监督或半监督学习充分利用大量的未标注样本。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/dataset_size_color}}\n\\fi\n\\caption{与日俱增的数据量。\n20世纪初，统计学家使用数百或数千的手动制作的度量来研究数据集{cite?}。\n20世纪50年代到80年代，受生物启发的机器学习开拓者通常使用小的合成数据集，如低分辨率的字母位图，设计为在低计算成本下表明神经网络能够学习特定功能{cite?}。\n20世纪80年代和90年代，机器学习变得更加统计，并开始利用包含成千上万个样本的更大数据集，如手写扫描数字的MNIST数据集（如\\fig?）所示{cite?}。\n在21世纪初的第一个十年，相同大小更复杂的数据集持续出现，如CIFAR-10数据集{cite?} 。\n在这十年结束和下五年，明显更大的数据集（包含数万到数千万的样例）完全改变了深度学习的可能实现的事。\n这些数据集包括公共Street View House Numbers数据集 {cite?}、各种版本的ImageNet数据集{cite?}以及Sports-1M数据集{cite?}。\n在图顶部，我们看到翻译句子的数据集通常远大于其他数据集，如根据Canadian Hansard制作的IBM数据集{cite?}和WMT 2014英法数据集{cite?} 。\n}\n\\end{figure}\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter1/figures/mnist}}\n\\fi\n\\caption{MNIST数据集的输入样例。\n\"NIST\"代表国家标准和技术研究所(National Institute of Standards and Technology)，是最初收集这些数据的机构。\n\"M\"代表\"修改的(Modified)\"，为更容易地与机器学习算法一起使用，数据已经过预处理。\nMNIST数据集包括手写数字的扫描和相关标签（描述每个图像中包含0-9中哪个数字）。\n这个简单的分类问题是深度学习研究中最简单和最广泛使用的测试之一。\n尽管现代技术很容易解决这个问题，它仍然很受欢迎。\nGeoffrey Hinton将其描述为\"机器学习的\\emph{果蝇}\"，这意味着机器学习研究人员可以在受控的实验室条件下研究他们的算法，就像生物学家经常研究果蝇一样。\n}\n\\end{figure}\n\n<!-- % -- 20 -- -->\n\n\n## 与日俱增的模型规模\n\n\n\n20世纪80年代，神经网络只能取得相对较小的成功，而现在神经网络非常成功的另一个重要原因是我们现在拥有的计算资源可以运行更大的模型。\n联结主义的主要见解之一是，当动物的许多神经元一起工作时会变得聪明。\n单独神经元或小集合的神经元不是特别有用。\n\n生物神经元不是特别稠密地连接在一起。\n如\\fig?所示，几十年来，我们的机器学习模型中每个神经元的连接数量已经与哺乳动物的大脑在同一数量级上。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/number_of_synapses_color}}\n\\fi\n\\caption{与日俱增的每神经元连接数。 % ？ 可以翻成平均吗 ？\n最初，人工神经网络中神经元之间的连接数受限于硬件能力。\n而现在，神经元之间的连接数大多是出于设计考虑。\n一些人工神经网络中每个神经元的连接数与猫一样多，并且对于其他神经网络来说，每个神经元的连接与较小哺乳动物（如小鼠）一样多是非常普遍的。\n甚至人类大脑每个神经元的连接也没有过高的数量。\n生物神经网络规模来自{number_of_neurons}。\n}\n{\\tiny\n\\begin{enumerate}\n+sep0em\n+ % 1\n    自适应线性单元~{cite?}\n+ % 2\n    神经认知机~{cite?}\n+ % 3\n    GPU-加速 卷积网络~{cite?}\n+ % 4\n    深度玻尔兹曼机~{cite?}\n+ % 5\n    无监督卷积网络~{cite?}\n+ % 6\n    GPU-加速 多层感知机~{cite?}\n+ % 7\n    分布式自编码器~{cite?}\n+ % 8\n    Multi-GPU 卷积网络~{cite?}\n+ % 9\n    COTS HPC  无监督卷积网络~{cite?}\n+ % 10\n    GoogLeNet~{cite?}\n\\end{enumerate}\n} % end tiny\n\\end{figure}\n\n如\\fig?所示，就神经元的总数目而言，直到最近神经网络都是惊人的小。\n自从隐藏单元引入以来，人工神经网络的规模大约每2.4年扩大一倍。\n这种增长是由更大内存、更快的计算机和更大的可用数据集驱动的。\n更大的网络能够在更复杂的任务中实现更高的精度。\n这种趋势看起来将持续数十年。\n除非有能力迅速扩展的新技术，否则至少要到21世纪50年代，人工神经网络将才能具备与人脑相同数量级的神经元。\n生物神经元表示的功能可能比目前的人工神经元所表示的更复杂，因此生物神经网络可能比图中描绘的甚至要更大。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/number_of_neurons_color}}\n\\fi\n\\caption{与日俱增的神经网络规模。\n自从引入隐藏单元，人工神经网络的大小大约每2.4年翻一倍。\n生物神经网络规模来自~{number_of_neurons}。\n}\n{\\tiny\n\\begin{enumerate}\n+sep-.1em\n+ % 1\n    感知机~{cite?}\n+ % 2\n    自适应线性单元~{cite?}\n+ % 3\n    神经认知机~{cite?}\n+ % 4\n    早期后向传播网络~{cite?}\n+ % 5\n    用于语音识别的循环神经网络~{cite?}\n+ % 6\n    用于语音识别的多层感知机~{cite?}\n+ % 7\n    均匀场sigmoid信念网络~{cite?}\n+ % 8\n    LeNet-5~{cite?}\n+ % 9\n    回声状态网络~{cite?}\n+ % 10\n    深度信念网络~{cite?}\n+ % 11\n    GPU-加速卷积网络~{cite?}\n+ % 12\n    深度玻尔兹曼机~{cite?}\n+ % 13\n    GPU-加速深度信念网络~{cite?}\n+ % 14\n    无监督卷积网络~{cite?}\n+ % 15\n    GPU-加速多层感知机~{cite?}\n+ % 16\n    OMP-1 网络~{cite?}\n+ % 17\n    分布式自编码器~{cite?}\n+ % 18\n    Multi-GPU卷积网络~{cite?}\n+ % 19\n    COTS HPC 无监督卷积网络~{cite?}\n+ % 20\n    GoogLeNet~{cite?}\n\\end{enumerate}\n}\n\\end{figure}\n\n\n现在看来，其神经元比一个水蛭还少的神经网络不能解决复杂的人工智能问题是不足为奇的。\n即使现在的网络，从计算系统角度来看它可能相当大的，但实际上它比相对原始的脊椎动物如青蛙的神经系统还要小。\n\n由于更快的CPU、通用GPU的出现（在\\sec?中讨论）、更快的网络连接和更好的分布式计算的软件基础设施，模型规模随着时间的推移不断增加是深度学习历史中最重要的趋势之一。\n人们普遍预计这种趋势将很好地持续到未来。\n\n<!-- % -- 21 -- -->\n\n\n## 与日俱增的精度、复杂度和对现实世界的冲击\n\n\n20世纪80年代以来，深度学习提供精确识别和预测的能力一直在提高。\n而且，深度学习持续成功地被应用于越来越广泛的实际问题中。\n\n最早的深度模型被用来识别裁剪紧凑且非常小的图像中的单个对象{cite?}。\n此后，神经网络可以处理的图像尺寸逐渐增加。\n现代对象识别网络能处理丰富的高分辨率照片，并且不需要在被识别的对象附近进行裁剪{cite?}。\n类似地，最早的网络只能识别两种对象（或在某些情况下，单类对象的存在与否），而这些现代网络通常能够识别至少1000个不同类别的对象。\n对象识别中最大的比赛是每年举行的ImageNet大型视觉识别挑战（ILSVRC）。\n深度学习迅速崛起的激动人心的一幕是卷积网络第一次大幅赢得这一挑战，它将最高水准的前5错误率从~26.1\\%~降到~15.3\\%~{cite?}，这意味着该卷积网络针对每个图像的可能类别生成一个顺序列表，除了15.3\\%的测试样本，其他测试样本的正确类标都出现在此列表中的前5项里。\n此后，深度卷积网络连续地赢得这些比赛，截至写本书时，深度学习的最新结果将这个比赛中的前5错误率降到了~3.6\\%， 如\\fig?所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter1/figures/imagenet_color}}\n\\fi\n\\caption{日益降低的错误率。\n由于深度网络达到了在ImageNet大规模视觉识别挑战中竞争所必需的规模，它们每年都能赢得胜利，并且产生越来越低的错误率。\n数据来源于 {russakovsky2014imagenet}和~{He-et-al-arxiv2015}。}\n\\end{figure}\n\n<!-- % -- 23 -- -->\n\n深度学习也对语音识别产生了巨大影响。\n语音识别在20世纪90年代得到提高后，直到约2000年都停滞不前。\n深度学习的引入{cite?}使得语音识别错误率陡然下降，有些错误率甚至降低了一半。\n我们将在\\sec?更详细地探讨这个历史。\n\n深度网络在行人检测和图像分割中也取得了引人注目的成功{cite?}，并且在交通标志分类上取得了超越人类的表现{cite?}。\n\n在深度网络的规模和精度有所提高的同时，它们可以解决的任务也日益复杂。\n{Goodfellow+et+al-ICLR2014a}表明，神经网络可以学习输出描述图像的整个字符序列，而不是仅仅识别单个对象。\n此前，人们普遍认为，这种学习需要对序列中的单个元素进行标注{cite?}。\n循环神经网络，如之前提到的~LSTM~序列模型，现在用于对序列和其他序列之间的关系进行建模，而不是仅仅固定输入之间的关系。\n这种序列到序列的学习似乎引领着另一个应用的颠覆性发展，即机器翻译{cite?}。\n\n<!-- % -- 24 -- -->\n\n这种复杂性日益增加的趋势已将其推向逻辑结论，即神经图灵机{cite?}的引入，它能学习读取存储单元和向存储单元写入任意内容。\n这样的神经网络可以从期望行为的样本中学习简单的程序。\n例如，从杂乱和排好序的样本中学习对一系列数进行排序。\n这种自我编程技术正处于起步阶段，但原则上未来可以适用于几乎所有的任务。\n\n\n深度学习的另一个最大的成就是其在强化学习领域的扩展。\n在强化学习中，一个自主的智能体必须在没有人类操作者指导的情况下，通过试错来学习执行任务。\nDeepMind表明，基于深度学习的强化学习系统能够学会玩Atari视频游戏，并在多种任务中可与人类匹敌{cite?}。\n深度学习也显著改善了机器人强化学习的性能{cite?}。\n\n许多深度学习应用都是高利润的。现在深度学习被许多顶级的技术公司使用，包括Google、Microsoft、Facebook、IBM、Baidu、Apple、Adobe、Netflix、NVIDIA和NEC等。\n\n深度学习的进步也严重依赖于软件基础架构的进展。\n软件库如Theano~{cite?}、PyLearn2~{cite?}、Torch~{cite?}、DistBelief~{cite?}、Caffe~{cite?}、MXNet~{cite?}和TensorFlow~{cite?}都能支持重要的研究项目或商业产品。\n\n深度学习也为其他科学做出了贡献。\n用于对象识别的现代卷积网络为神经科学家们提供了可以研究的视觉处理模型{cite?}。\n深度学习也为处理海量数据以及在科学领域作出有效的预测提供了非常有用的工具。\n它已成功地用于预测分子如何相互作用从而帮助制药公司设计新的药物{cite?}，搜索亚原子粒子{cite?}，以及自动解析用于构建人脑三维图的显微镜图像{cite?}等。\n我们期待深度学习未来能够出现在越来越多的科学领域中。\n\n<!-- % -- 25 -- -->\n\n总之，深度学习是机器学习的一种方法。在过去几十年的发展中，它大量借鉴了我们关于人脑、统计学和应用数学的知识。\n近年来，得益于更强大的计算机、更大的数据集和能够训练更深网络的技术，深度学习的普及性和实用性都有了极大的发展。\n未来几年充满了进一步提高深度学习并将它带到新领域的挑战和机遇。\n\n<!-- % -- 26 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-02-Chapter2_linear_algebra.md",
    "content": "---\ntitle: 线性代数\nlayout: post\nshare: false\n---\n\n线性代数作为数学的一个分支，广泛应用于科学和工程中。\n然而，因为线性代数主要是面向连续数学，而非离散数学，所以很多计算机科学家很少接触它。\n掌握好线性代数对于理解和从事机器学习算法相关工作是很有必要的，尤其对于深度学习算法而言。\n因此，在开始介绍深度学习之前，我们集中探讨一些必备的线性代数知识。\n\n\n如果你已经很熟悉线性代数，那么可以轻松地跳过本章。\n如果你已经了解这些概念，但是需要一份索引表来回顾一些重要公式，那么我们推荐\\emph{The Matrix Cookbook} {cite?}。\n如果你没有接触过线性代数，那么本章将告诉你本书所需的线性代数知识，不过我们仍然非常建议你参考其他专门讲解线性代数的文献，例如~{shilov1977linear}。\n最后，本章略去了很多重要但是对于理解深度学习非必需的线性代数知识。\n\n\n\n\n\n# 标量、向量、矩阵和张量\n\n\n学习线性代数，会涉及以下几类数学概念：\n\n+ 标量：一个标量就是一个单独的数，它不同于线性代数中研究的其他大部分对象（通常是多个数的数组）。\n    我们用斜体表示标量。标量通常被赋予小写的变量名称。\n    当我们介绍标量时，会明确它们是哪种类型的数。\n    比如，在定义实数标量时，我们可能会说\"令$\\Ss \\in \\SetR$表示一条线的斜率\"；在定义自然数标量时，我们可能会说\"令$\\Sn\\in\\SetN$表示元素的数目\"。\n\n<!-- % -- 29 -- -->\n\n+ 向量：一个向量是一列数。\n    这些数是有序排列的。\n    通过次序中的索引，我们可以确定每个单独的数。\n    通常我们赋予向量粗体的小写变量名称，比如$\\Vx$。\n    向量中的元素可以通过带脚标的斜体表示。\n    向量$\\Vx$的第一个元素是$\\Sx_1$，第二个元素是$\\Sx_2$，等等。\n    我们也会注明存储在向量中的元素是什么类型的。\n    如果每个元素都属于$\\SetR$，并且该向量有$\\Sn$个元素，那么该向量属于实数集$\\SetR$的$\\Sn$次笛卡尔乘积构成的集合，记为$\\SetR^n$。\n    当需要明确表示向量中的元素时，我们会将元素排列成一个方括号包围的纵列：\n    \\begin{equation}\n        \\Vx=\\begin{bmatrix} \\Sx_1   \\\\  \n                            \\Sx_2   \\\\ \n                            \\vdots  \\\\ \n                            \\Sx_n \n                \\end{bmatrix}.\n    \\end{equation}\n    我们可以把向量看作空间中的点，每个元素是不同坐标轴上的坐标。\n    \n    有时我们需要索引向量中的一些元素。\n    在这种情况下，我们定义一个包含这些元素索引的集合，然后将该集合写在脚标处。\n    比如，指定$\\Sx_1$，$\\Sx_3$和$\\Sx_6$，我们定义集合$S=\\{1,3,6\\}$，然后写作$\\Vx_S$。我\n    们用符号－表示集合的补集中的索引。\n    比如$\\Vx_{-1}$表示$\\Vx$中除$\\Sx_1$外的所有元素，$\\Vx_{-S}$表示$\\Vx$中除$\\Sx_1$，$\\Sx_3$，$\\Sx_6$外所有元素构成的向量。\n\n+ 矩阵：矩阵是一个二维数组，其中的每一个元素被两个索引（而非一个）所确定。\n    我们通常会赋予矩阵粗体的大写变量名称，比如$\\MA$。\n    如果一个实数矩阵高度为$m$，宽度为$n$，那么我们说$\\MA\\in \\SetR^{m\\times n}$。\n    我们在表示矩阵中的元素时，通常以不加粗的斜体形式使用其名称，索引用逗号间隔。\n    比如，$\\SA_{1,1}$表示$\\MA$左上的元素，$\\SA_{m,n}$表示$\\MA$右下的元素。\n    我们通过用\":\"表示水平坐标，以表示垂直坐标$\\Si$中的所有元素。\n    比如，$\\MA_{i,:}$表示$\\MA$中垂直坐标$i$上的一横排元素。\n    这也被称为$\\MA$的第$i$~行。\n    同样地，$\\MA_{:,i}$表示$\\MA$的第$i$~列。\n    当我们需要明确表示矩阵中的元素时，我们将它们写在用方括号括起来的数组中：\n    \\begin{equation}\n        \\begin{bmatrix}\n            A_{1,1} & A_{1,2} \\\\\n            A_{2,1} & A_{2,2} \\\\\n        \\end{bmatrix}.\n    \\end{equation}\n    有时我们需要索引矩阵值表达式，而这些表达式不是单个字母。\n    在这种情况下，我们在表达式后面接下标，但不必将矩阵的变量名称小写化。\n    比如，$f(\\MA)_{i,j}$表示函数$f$作用在$\\MA$上输出的矩阵的第$i$行第$j$列元素。\n\n<!-- % -- 30 -- -->\n\n+ 张量：在某些情况下，我们会讨论坐标超过两维的数组。\n    一般地，一个数组中的元素分布在若干维坐标的规则网格中，我们称之为张量。\n    我们使用字体$\\TSA$来表示张量\"A\"。\n    张量$\\TSA$中坐标为$(i,j,k)$的元素记作$\\TEA_{i,j,k}$。\n\n\n\n转置是矩阵的重要操作之一。\n矩阵的转置是以对角线为轴的镜像，这条从左上角到右下角的对角线被称为主对角线。\n\\fig?显示了这个操作。\n我们将矩阵$\\MA$的转置表示为$\\MA^\\top$，定义如下\n\\begin{equation}\n(\\MA^\\top)_{i,j}= \\SA_{j,i}.\n\\end{equation}\n\n向量可以看作只有一列的矩阵。\n对应地，向量的转置可以看作是只有一行的矩阵。\n有时，我们通过将向量元素作为行矩阵写在文本行中，然后使用转置操作将其变为标准的列向量，来定义一个向量，比如$\\Vx=[\\Sx_1, \\Sx_2, \\Sx_3]^\\top$.\n\n\n标量可以看作是只有一个元素的矩阵。\n因此，标量的转置等于它本身，$\\Sa=\\Sa^\\top$。\n\n\\begin{figure}[!hbt]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter2/figures/transpose}}\n\\fi\n\\caption{矩阵的转置可以看成以主对角线为轴的一个镜像。}\n\\end{figure}\n\n<!-- % -- 31 -- -->\n\n只要矩阵的形状一样，我们可以把两个矩阵相加。\n两个矩阵相加是指对应位置的元素相加，比如$\\MC=\\MA+\\MB$，其中$\\SC_{i,j}= \\SA_{i,j}+\\SB_{i,j}$。\n\n\n标量和矩阵相乘，或是和矩阵相加时，我们只需将其与矩阵的每个元素相乘或相加，比如$\\MD = \\Sa \\cdot \\MB + \\Sc$，其中$\\SD_{i,j} = \\Sa\\cdot  \\SB_{i,j} + \\Sc$。\n\n\n在深度学习中，我们也使用一些不那么常规的符号。\n我们允许矩阵和向量相加，产生另一个矩阵：$\\MC=\\MA + \\Vb$，其中$\\SC_{i,j}= \\SA_{i,j} + \\Sb_{j}$。\n换言之，向量$\\Vb$和矩阵$\\MA$的每一行相加。\n这个简写方法使我们无需在加法操作前定义一个将向量$\\Vb$复制到每一行而生成的矩阵。\n这种隐式地复制向量$\\Vb$到很多位置的方式，被称为广播。\n\n\n\n\n\n# 矩阵和向量相乘\n\n\n矩阵乘法是矩阵运算中最重要的操作之一。\n两个矩阵$\\MA$和$\\MB$的矩阵乘积是第三个矩阵$\\MC$。\n为了使乘法定义良好，矩阵$\\MA$的列数必须和矩阵$\\MB$的行数相等。\n如果矩阵$\\MA$的形状是$\\Sm \\times \\Sn$，矩阵$\\MB$的形状是$\\Sn\\times \\Sp$，那么矩阵$\\MC$的形状是$\\Sm\\times \\Sp$。\n我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法，例如\n\\begin{equation}\n    \\MC=\\MA\\MB.\n\\end{equation}\n\n\n具体地，该乘法操作定义为\n\\begin{equation}\n    \\SC_{i,j}=\\sum_k \\SA_{i,k} \\SB_{k,j}.\n\\end{equation}\n\n\n需要注意的是，两个矩阵的标准乘积\\emph{不是}指两个矩阵中对应元素的乘积。\n不过，那样的矩阵操作确实是存在的，被称为元素对应乘积或者Hadamard乘积，记为$\\MA\\odot\\MB$。\n\n\n两个相同维数的向量$\\Vx$和$\\Vy$的点积可看作是矩阵乘积$\\Vx^\\top\\Vy$。\n我们可以把矩阵乘积$\\MC=\\MA\\MB$中计算$\\SC_{i,j}$的步骤看作是$\\MA$的第$\\Si$行和$\\MB$的第$\\Sj$列之间的点积。\n\n\n矩阵乘积运算有许多有用的性质，从而使矩阵的数学分析更加方便。\n比如，矩阵乘积服从分配律：\n\\begin{equation}\n    \\MA(\\MB+\\MC)=\\MA\\MB +\\MA\\MC.\n\\end{equation}\n矩阵乘积也服从结合律：\n\\begin{equation}\n\\MA(\\MB\\MC)=(\\MA\\MB)\\MC.\n\\end{equation}\n\n\n<!-- % -- 32 -- -->\n\n\n不同于标量乘积，矩阵乘积\\emph{并不}满足交换律（$\\MA\\MB=\\MB\\MA$的情况并非总是满足）。\n然而，两个向量的点积满足交换律：\n\\begin{equation}\n\\Vx^\\top\\Vy=\\Vy^\\top\\Vx.\n\\end{equation}\n\n\n矩阵乘积的转置有着简单的形式：\n\\begin{equation}\n(\\MA\\MB)^\\top=\\MB^\\top\\MA^\\top.\n\\end{equation}\n利用两个向量点积的结果是标量，标量转置是自身的事实，我们可以证明\\eqn?：\n\\begin{equation}\n    \\Vx^\\top \\Vy = \\left(\\Vx^\\top \\Vy \\right)^\\top = \\Vy^\\top \\Vx.\n\\end{equation}\n\n\n由于本书的重点不是线性代数，我们并不试图展示矩阵乘积的所有重要性质，但读者应该知道矩阵乘积还有很多有用的性质。\n\n\n现在我们已经知道了足够多的线性代数符号，可以表达下列线性方程组：\n\\begin{equation}\n\\MA\\Vx=\\Vb\n\\end{equation}\n其中$\\MA\\in \\SetR^{m\\times n}$是一个已知矩阵，$\\Vb\\in\\SetR^m$是一个已知向量，$\\Vx\\in\\SetR^n$是一个我们要求解的未知向量。\n向量$\\Vx$的每一个元素$\\Sx_i$都是未知的。\n矩阵$\\MA$的每一行和$\\Vb$中对应的元素构成一个约束。\n我们可以把\\eqn?重写为\n\\begin{gather}\n\\MA_{1,:}\\Vx=b_1\\\\\n\\MA_{2,:}\\Vx=b_2 \\\\\n\\cdots \\\\\n\\MA_{m,:}\\Vx=b_m\n\\end{gather}\n或者，更明确地，写作\n\\begin{gather}\n    \\MA_{1,1}x_1+\\MA_{1,2}x_2+\\cdots \\MA_{1,n}x_n = b_1\\\\\n    \\MA_{2,1}x_1+\\MA_{2,2}x_2+\\cdots \\MA_{2,n}x_n = b_2\\\\\n    \\cdots\\\\\n    \\MA_{m,1}x_1+\\MA_{m,2}x_2+\\cdots \\MA_{m,n}x_n = b_m.\n\\end{gather}\n\n\n矩阵向量乘积符号为这种形式的方程提供了更紧凑的表示。\n\n\n\n<!-- % -- 33 -- -->\n\n\n\n# 单位矩阵和逆矩阵\n\n\n\n线性代数提供了被称为矩阵逆的强大工具。\n对于大多数矩阵$\\MA$，我们都能通过矩阵逆解析地求解\\eqn?。\n\n\n为了描述矩阵逆，我们首先需要定义单位矩阵的概念。\n任意向量和单位矩阵相乘，都不会改变。\n我们将保持$\\Sn$维向量不变的单位矩阵记作$\\MI_{\\Sn}$。\n形式上，$\\MI_{\\Sn}\\in \\SetR^{\\Sn\\times \\Sn}$，\n\\begin{equation}\n    \\forall \\Vx \\in \\SetR^{\\Sn}, \\MI_{\\Sn} \\Vx = \\Vx.\n\\end{equation}\n单位矩阵的结构很简单：所有沿主对角线的元素都是$1$，而所有其他位置的元素都是$0$。\n如\\fig?所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{equation*}\n\\begin{bmatrix} \n1 & 0 & 0 \\\\\n0 & 1 & 0 \\\\\n0 & 0 & 1 \\\\\n\\end{bmatrix}\n\\end{equation*}\n\\fi\n\\caption{单位矩阵的一个样例：这是$\\MI_3$。}\n\\end{figure}\n\n\n矩阵$\\MA$的矩阵逆记作$\\MA^{-1}$，其定义的矩阵满足如下条件\n\\begin{equation} \\MA^{-1}\\MA = \\MI_{\\Sn}. \\end{equation}\n\n现在我们可以通过以下步骤求解\\eqn?：\n\\begin{gather}\n\\MA\\Vx=\\Vb \\\\\n\\MA^{-1}\\MA\\Vx = \\MA^{-1}\\Vb \\\\\n\\MI_{\\Sn} \\Vx=\\MA^{-1}\\Vb \\\\\n\\Vx=\\MA^{-1}\\Vb. \n\\end{gather}\n\n\n当然，这取决于我们能否找到一个逆矩阵$\\MA^{-1}$。\n在接下来的章节中，我们会讨论逆矩阵$\\MA^{-1}$存在的条件。\n\n\n当逆矩阵$\\MA^{-1}$存在时，有几种不同的算法都能找到它的闭解形式。\n理论上，相同的逆矩阵可用于多次求解不同向量$\\Vb$的方程。\n然而，逆矩阵$\\MA^{-1}$主要是作为理论工具使用的，并不会在大多数软件应用程序中实际使用。\n这是因为逆矩阵$\\MA^{-1}$在数字计算机上只能表现出有限的精度，有效使用向量$\\Vb$的算法通常可以得到更精确的$\\Vx$。\n\n\n\n<!-- % -- 34 -- -->\n\n\n\n# 线性相关和生成子空间\n\n\n如果逆矩阵$\\MA^{-1}$存在，那么\\eqn?肯定对于每一个向量$\\Vb$恰好存在一个解。\n但是，对于方程组而言，对于向量$\\Vb$的某些值，有可能不存在解，或者存在无限多个解。\n存在多于一个解但是少于无限多个解的情况是不可能发生的；因为如果$\\Vx$和$\\Vy$都是某方程组的解，则\n\\begin{equation}\n\\Vz=\\alpha \\Vx + (1-\\alpha) \\Vy\n\\end{equation}\n（其中$\\alpha$取任意实数）也是该方程组的解。\n\n\n为了分析方程有多少个解，我们可以将$\\MA$的列向量看作从原点（元素都是零的向量）出发的不同方向，确定有多少种方法可以到达向量$\\Vb$。\n在这个观点下，向量$\\Vx$中的每个元素表示我们应该沿着这些方向走多远，即$\\Sx_{\\Si}$表示我们需要沿着第$\\Si$个向量的方向走多远：\n\\begin{equation}\n\\MA \\Vx = \\sum_i x_i \\MA_{:,i}.\n\\end{equation}\n一般而言，这种操作被称为线性组合。\n形式上，一组向量的线性组合，是指每个向量乘以对应标量系数之后的和，即：\n\\begin{equation}\n    \\sum_i \\Sc_i \\Vv^{(i)}.\n\\end{equation}\n一组向量的生成子空间是原始向量线性组合后所能抵达的点的集合。\n\n\n确定$\\MA\\Vx=\\Vb$是否有解相当于确定向量$\\Vb$是否在$\\MA$列向量的生成子空间中。\n这个特殊的生成子空间被称为$\\MA$的列空间或者$\\MA$的值域。\n\n\n为了使方程$\\MA \\Vx=\\Vb$对于任意向量$\\Vb \\in \\SetR^m$都存在解，我们要求$\\MA$的列空间构成整个$\\SetR^{\\Sm}$。\n如果$\\SetR^m$中的某个点不在$\\MA$的列空间中，那么该点对应的$\\Vb$会使得该方程没有解。\n矩阵$\\MA$的列空间是整个$\\SetR^m$的要求，意味着$\\MA$至少有$m$列，即$n\\geq m$。\n否则，$\\MA$列空间的维数会小于$m$。\n例如，假设$\\MA$是一个$3\\times 2$的矩阵。\n目标$\\Vb$是$3$维的，但是$\\Vx$只有$2$维。\n所以无论如何修改$\\Vx$的值，也只能描绘出$\\SetR^3$空间中的二维平面。\n当且仅当向量$\\Vb$在该二维平面中时，该方程有解。\n\n\n\n<!-- % -- 35 -- -->\n\n\n不等式$n\\geq m$仅是方程对每一点都有解的必要条件。\n这不是一个充分条件，因为有些列向量可能是冗余的。\n假设有一个$\\SetR^{2\\times 2}$中的矩阵，它的两个列向量是相同的。\n那么它的列空间和它的一个列向量作为矩阵的列空间是一样的。\n换言之，虽然该矩阵有$2$列，但是它的列空间仍然只是一条线，不能涵盖整个$\\SetR^2$空间。\n\n\n正式地说，这种冗余被称为线性相关。\n如果一组向量中的任意一个向量都不能表示成其他向量的线性组合，那么这组向量称为线性无关。\n如果某个向量是一组向量中某些向量的线性组合，那么我们将这个向量加入这组向量后不会增加这组向量的生成子空间。\n这意味着，如果一个矩阵的列空间涵盖整个$\\SetR^m$，那么该矩阵必须包含至少一组$m$个线性无关的向量。\n这是\\eqn?对于每一个向量$\\Vb$的取值都有解的充分必要条件。\n值得注意的是，这个条件是说该向量集恰好有$m$个线性无关的列向量，而不是至少$m$个。\n不存在一个$m$维向量的集合具有多于$m$个彼此线性不相关的列向量，但是一个有多于$m$个列向量的矩阵有可能拥有不止一个大小为$m$的线性无关向量集。\n\n\n要想使矩阵可逆，我们还需要保证\\eqn?对于每一个$\\Vb$值至多有一个解。\n为此，我们需要确保该矩阵至多有$m$个列向量。\n否则，该方程会有不止一个解。\n\n\n综上所述，这意味着该矩阵必须是一个方阵，即$m=n$，并且所有列向量都是线性无关的。一个列向量线性相关的方阵被称为奇异的。\n\n\n如果矩阵$\\MA$不是一个方阵或者是一个奇异的方阵，该方程仍然可能有解。\n但是我们不能使用矩阵逆去求解。\n\n\n目前为止，我们已经讨论了逆矩阵左乘。我们也可以定义逆矩阵右乘：\n\\begin{equation}\n\\MA\\MA^{-1}=\\MI.\n\\end{equation}\n对于方阵而言，它的左逆和右逆是相等的。\n\n\n\n\n\n# 范数\n\n\n有时我们需要衡量一个向量的大小。\n在机器学习中，我们经常使用被称为范数的函数衡量向量大小。\n形式上，$L^p$范数定义如下\n\\begin{equation}\n    \\norm{\\Vx}_p = \\left( \\sum_i |x_i|^p \\right)^{\\frac{1}{p}}\n\\end{equation}\n其中$p\\in \\SetR$，$p\\geq 1$。\n\n\n\n<!-- % -- 36 -- -->\n\n\n范数（包括$L^p$范数）是将向量映射到非负值的函数。\n直观上来说，向量$\\Vx$的范数衡量从原点到点$\\Vx$的距离。\n更严格地说，范数是满足下列性质的任意函数：\n\n+ $f(\\Vx) = 0 \\Rightarrow \\Vx = \\mathbf{0}$ \n+ $f(\\Vx + \\Vy) \\leq f(\\Vx) + f(\\Vy)$ （三角不等式）\n+ $\\forall \\alpha \\in \\SetR$, $f(\\alpha \\Vx) = |\\alpha| f(\\Vx)$\n\n\n\n当$p=2$时，$L^2$范数被称为欧几里得范数。\n它表示从原点出发到向量$\\Vx$确定的点的欧几里得距离。\n$L^2$范数在机器学习中出现地十分频繁，经常简化表示为$\\norm{x}$，略去了下标$2$。\n平方$L^2$范数也经常用来衡量向量的大小，可以简单地通过点积 $\\Vx^\\top\\Vx$计算。\n\n\n平方$L^2$范数在数学和计算上都比$L^2$范数本身更方便。\n例如，平方$L^2$范数对$\\Vx$中每个元素的导数只取决于对应的元素，而$L^2$范数对每个元素的导数却和整个向量相关。\n但是在很多情况下，平方$L^2$范数也可能不受欢迎，因为它在原点附近增长得十分缓慢。\n在某些机器学习应用中，区分恰好是零的元素和非零但值很小的元素是很重要的。\n在这些情况下，我们转而使用在各个位置斜率相同，同时保持简单的数学形式的函数：$L^1$范数。\n$L^1$范数可以简化如下：\n\\begin{equation}\n    \\norm{\\Vx}_1 = \\sum_i  |x_i|.\n\\end{equation}\n当机器学习问题中零和非零元素之间的差异非常重要时，通常会使用$L^1$范数。\n每当$\\Vx$中某个元素从$0$增加$\\epsilon$，对应的$L^1$范数也会增加$\\epsilon$。\n\n\n有时候我们会统计向量中非零元素的个数来衡量向量的大小。\n有些作者将这种函数称为\"$L^0$范数\"，但是这个术语在数学意义上是不对的。\n向量的非零元素的数目不是范数，因为对向量缩放$\\alpha$倍不会改变该向量非零元素的数目。\n$L^1$范数经常作为表示非零元素数目的替代函数。\n\n\n\n<!-- % -- 37 -- -->\n\n\n另外一个经常在机器学习中出现的范数是$L^\\infty$范数，也被称为\\,最大范数。\n这个范数表示向量中具有最大幅值的元素的绝对值：\n\\begin{equation}\n    \\norm{\\Vx}_\\infty = \\max_i |x_i|.\n\\end{equation}\n\n\n有时候我们可能也希望衡量矩阵的大小。\n在深度学习中，最常见的做法是使用Frobenius 范数，\n\\begin{equation}\n    \\norm{\\MA}_F = \\sqrt{\\sum_{i,j} A_{i,j}^2}, \n<!-- %%lyj 原文是\\norm{A}_F ... -->\n\\end{equation}\n其类似于向量的$L^2$范数。\n\n\n两个向量的点积可以用范数来表示。\n具体地，\n\\begin{equation}\n    \\Vx^\\top\\Vy = \\norm{\\Vx}_2\\norm{\\Vy}_2 \\cos \\theta\n\\end{equation}\n其中$\\theta$表示$\\Vx$和$\\Vy$之间的夹角。\n\n\n\n\n\n# 特殊类型的矩阵和向量\n\n\n有些特殊类型的矩阵和向量是特别有用的。\n\n\n对角矩阵只在主对角线上含有非零元素，其他位置都是零。\n形式上，矩阵$\\MD$是对角矩阵，当且仅当对于所有的$i\\neq j$，$\\SD_{i,j}=0$。\n我们已经看到过一个对角矩阵：单位矩阵，对角元素全部是$1$。\n我们用$\\text{diag}(\\Vv)$表示一个对角元素由向量$\\Vv$中元素给定的对角方阵。\n对角矩阵受到关注的部分原因是对角矩阵的乘法计算很高效。\n计算乘法$\\text{diag}(\\Vv)\\Vx$，我们只需要将$\\Vx$中的每个元素$x_i$放大$v_i$倍。\n换言之，$\\text{diag}(\\Vv)\\Vx=\\Vv \\odot \\Vx$。\n计算对角方阵的逆矩阵也很高效。\n对角方阵的逆矩阵存在，当且仅当对角元素都是非零值，在这种情况下，$\\text{diag}(\\Vv)^{-1}=\\text{diag}([1/v_1,\\dots,1/v_n]^\\top)$。\n在很多情况下，我们可以根据任意矩阵导出一些通用的机器学习算法；但通过将一些矩阵限制为对角矩阵，我们可以得到计算代价较低的（并且简明扼要的）算法。\n\n\n不是所有的对角矩阵都是方阵。\n长方形的矩阵也有可能是对角矩阵。\n非方阵的对角矩阵没有逆矩阵，但我们仍然可以高效地计算它们的乘法。\n对于一个长方形对角矩阵$\\MD$而言，乘法$\\MD\\Vx$会涉及到$\\Vx$中每个元素的缩放，如果$\\MD$是瘦长型矩阵，那么在缩放后的末尾添加一些零；如果$\\MD$是胖宽型矩阵，那么在缩放后去掉最后一些元素。\n\n\n<!-- % -- 38 -- -->\n\n对称矩阵是转置和自己相等的矩阵：\n\\begin{equation}\n    \\MA=\\MA^\\top.\n\\end{equation}\n当某些不依赖参数顺序的双参数函数生成元素时，对称矩阵经常会出现。\n例如，如果$\\MA$是一个距离度量矩阵，$\\MA_{i,j}$表示点$i$到点$j$的距离，那么$\\MA_{i,j}=\\MA_{j,i}$，因为距离函数是对称的。\n\n\n单位向量是具有单位范数的向量：\n\\begin{equation}\n\\norm{\\Vx}_2=1.\n\\end{equation}\n\n\n如果$\\Vx^\\top \\Vy = 0$，那么向量$\\Vx$和向量$\\Vy$互相正交。\n如果两个向量都有非零范数，那么这两个向量之间的夹角是$90$度。\n在$\\SetR^n$中，至多有$n$个范数非零向量互相正交。\n如果这些向量不仅互相正交，并且范数都为$1$，那么我们称它们是标准正交。\n\n\n正交矩阵是指行向量和列向量是分别标准正交的方阵：\n\\begin{equation}\n    \\MA^\\top\\MA=\\MA\\MA^\\top=\\MI.\n\\end{equation}\n这意味着 \n\\begin{equation}\n    \\MA^{-1}=\\MA^\\top,\n\\end{equation}\n所以正交矩阵受到关注是因为求逆计算代价小。\n我们需要注意正交矩阵的定义。\n违反直觉的是，正交矩阵的行向量不仅是正交的，还是标准正交的。\n对于行向量或列向量互相正交但不是标准正交的矩阵，没有对应的专有术语。\n\n\n\n\n\n# 特征分解\n\n\n许多数学对象可以通过将它们分解成多个组成部分或者找到它们的一些属性而更好地理解，这些属性是通用的，而不是由我们选择表示它们的方式产生的。\n\n<!-- % -- 39 -- -->\n\n例如，整数可以分解为质因数。\n我们可以用十进制或二进制等不同方式表示整数$12$，但是$12=2\\times 2\\times 3$永远是对的。\n从这个表示中我们可以获得一些有用的信息，比如$12$不能被$5$整除，或者$12$的倍数可以被$3$整除。\n\n\n正如我们可以通过分解质因数来发现整数的一些内在性质，我们也可以通过分解矩阵来发现矩阵表示成数组元素时不明显的函数性质。\n\n\n特征分解是使用最广的矩阵分解之一，即我们将矩阵分解成一组特征向量和特征值。\n\n\n方阵$\\MA$的特征向量是指与$\\MA$相乘后相当于对该向量进行缩放的非零向量$\\Vv$：\n\\begin{equation}\n    \\MA\\Vv=\\lambda \\Vv.\n\\end{equation}\n标量$\\lambda$被称为这个特征向量对应的特征值。\n（类似地，我们也可以定义左特征向量 $\\Vv^\\top\\MA=\\lambda \\Vv^\\top$，但是通常我们更关注右特征向量）。\n\n\n如果$\\Vv$是$\\MA$的特征向量，那么任何缩放后的向量$s\\Vv$~($s\\in \\SetR$，$s\\neq 0$)也是$\\MA$的特征向量。\n此外，$s\\Vv$和$\\Vv$有相同的特征值。\n基于这个原因，通常我们只考虑单位特征向量。\n\n\n假设矩阵$\\MA$有$n$个线性无关的特征向量$\\{\\Vv^{(1)}, \\dots, \\Vv^{(n)}\\}$，对应着特征值$\\{\\lambda_1, \\dots , \\lambda_n \\}$。\n我们将特征向量连接成一个矩阵，使得每一列是一个特征向量：$\\MV=[\\Vv^{(1)}, \\dots, \\Vv^{(n)}]$.\n类似地，我们也可以将特征值连接成一个向量$\\Vlambda = [\\lambda_1, \\dots , \\lambda_n]^\\top$。\n因此$\\MA$的特征分解可以记作\n\\begin{equation}\n    \\MA = \\MV \\text{diag}(\\Vlambda) \\MV^{-1}.\n\\end{equation}\n\n\n我们已经看到了\\emph{构建}具有特定特征值和特征向量的矩阵，能够使我们在目标方向上延伸空间。\n我们还常常希望将矩阵分解成特征值和特征向量。\n这样可以帮助我们分析矩阵的特定性质，就像质因数分解有助于我们理解整数。\n\n\n不是每一个矩阵都可以分解成特征值和特征向量。\n在某些情况下，特征分解存在，但是会涉及复数而非实数。\n幸运的是，在本书中，我们通常只需要分解一类有简单分解的矩阵。\n具体来讲，每个实对称矩阵都可以分解成实特征向量和实特征值：\n\\begin{equation}\n    \\MA = \\MQ \\VLambda \\MQ^\\top.\n\\end{equation}\n其中$\\MQ$是$\\MA$的特征向量组成的正交矩阵，$\\VLambda$是对角矩阵。\n特征值$\\Lambda_{i,i}$对应的特征向量是矩阵$\\MQ$的第$i$列，记作$\\MQ_{:,i}$。\n因为$\\MQ$是正交矩阵，我们可以将$\\MA$看作沿方向$\\Vv^{(i)}$延展$\\lambda_i$倍的空间。\n如\\fig?所示的例子。\n\n<!-- % -- 40 -- -->\n\n虽然任意一个实对称矩阵$\\MA$都有特征分解，但是特征分解可能并不唯一。\n如果两个或多个特征向量拥有相同的特征值，那么在由这些特征向量产生的生成子空间中，任意一组正交向量都是该特征值对应的特征向量。\n因此，我们可以等价地从这些特征向量中构成$\\MQ$作为替代。\n按照惯例，我们通常按降序排列$\\VLambda$的元素。\n在该约定下，特征分解唯一当且仅当所有的特征值都是唯一的。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter2/figures/eigen_ellipse_color}}\n\\fi\n\\caption{特征向量和特征值的作用效果。\n特征向量和特征值的作用效果的一个实例。\n在这里，矩阵$\\MA$有两个标准正交的特征向量，对应特征值为$\\lambda_1$的$\\Vv^{(1)}$以及对应特征值为$\\lambda_2$的$\\Vv^{(2)}$。\n\\emph{(左)}我们画出了所有的单位向量$\\Vu\\in\\SetR^2$的集合，构成一个单位圆。\n\\emph{(右)}我们画出了所有的$\\MA\\Vu$点的集合。\n通过观察$\\MA$拉伸单位圆的方式，我们可以看到它将$\\Vv^{(i)}$方向的空间拉伸了$\\lambda_i$倍。\t}\n\\end{figure}\n\n<!-- % -- 41 -- -->\n\n\n矩阵的特征分解给了我们很多关于矩阵的有用信息。\n矩阵是奇异的当且仅当含有零特征值。\n实对称矩阵的特征分解也可以用于优化二次方程$f(\\Vx) = \\Vx^\\top \\MA \\Vx$，其中限制$\\norm{\\Vx}_2 = 1$。\n当$\\Vx$等于$\\MA$的某个特征向量时，$f$将返回对应的特征值。\n在限制条件下，函数$f$的最大值是最大特征值，最小值是最小特征值。\n\n\n所有特征值都是正数的矩阵被称为正定；所有特征值都是非负数的矩阵被称为半正定。\n同样地，所有特征值都是负数的矩阵被称为负定；所有特征值都是非正数的矩阵被称为半负定。\n半正定矩阵受到关注是因为它们保证$\\forall \\Vx, \\Vx^\\top \\MA \\Vx \\geq 0$。\n此外，正定矩阵还保证$\\Vx^\\top \\MA \\Vx =0 \\Rightarrow \\Vx = \\mathbf{0}$。\n\n\n\n\n\n\n# 奇异值分解\n\n\n在\\sec?，我们探讨了如何将矩阵分解成特征向量和特征值。\n还有另一种分解矩阵的方法，被称为奇异值分解，将矩阵分解为奇异向量和奇异值。\n通过奇异值分解，我们会得到一些与特征分解相同类型的信息。\n然而，奇异值分解有更广泛的应用。\n每个实数矩阵都有一个奇异值分解，但不一定都有特征分解。\n例如，非方阵的矩阵没有特征分解，这时我们只能使用奇异值分解。\n\n\n回想一下， 我们使用特征分解去分析矩阵$\\MA$时， 得到特征向量构成的矩阵$\\MV$和特征值构成的向量$\\Vlambda$，我们可以重新将$\\MA$写作\n\\begin{equation}\n    \\MA=\\MV\\text{diag}(\\Vlambda)\\MV^{-1}.\n\\end{equation}\n\n奇异值分解是类似的，只不过这回我们将矩阵$\\MA$分解成三个矩阵的乘积：\n\\begin{equation}\n    \\MA=\\MU\\MD\\MV^\\top.\n\\end{equation}\n\n\n假设$\\MA$是一个$m\\times n$的矩阵，那么$\\MU$是一个$m\\times m$的矩阵，$\\MD$是一个$m\\times n$的矩阵，$\\MV$是一个$n\\times n$矩阵。\n\n\n<!-- % -- 42 -- -->\n\n这些矩阵中的每一个经定义后都拥有特殊的结构。\n矩阵$\\MU$和$\\MV$都定义为正交矩阵，而矩阵$\\MD$定义为对角矩阵。\n注意，矩阵$\\MD$不一定是方阵。\n\n\n对角矩阵$\\MD$对角线上的元素被称为矩阵$\\MA$的奇异值。\n矩阵$\\MU$的列向量被称为左奇异向量，矩阵$\\MV$的列向量被称右奇异向量。\n\n\n事实上，我们可以用与$\\MA$相关的特征分解去解释$\\MA$的奇异值分解。\n$\\MA$的左奇异向量是$\\MA\\MA^\\top$的特征向量。\n$\\MA$的右奇异向量是$\\MA^\\top\\MA$的特征向量。\n$\\MA$的非零奇异值是$\\MA^\\top\\MA$特征值的平方根，同时也是$\\MA\\MA^\\top$特征值的平方根。\n\n\nSVD\\,最有用的一个性质可能是拓展矩阵求逆到非方矩阵上。我们将在下一节中探讨。\n\n\n\n\n\n# Moore-Penrose 伪逆\n\n\n\n对于非方矩阵而言，其逆矩阵没有定义。\n假设在下面的问题中，我们希望通过矩阵$\\MA$的左逆$\\MB$来求解线性方程，\n\\begin{equation}\n    \\MA\\Vx=\\Vy\n\\end{equation}\n等式两边左乘左逆$\\MB$后，我们得到\n\\begin{equation}\n    \\Vx=\\MB\\Vy.\n\\end{equation}\n取决于问题的形式，我们可能无法设计一个唯一的映射将$\\MA$映射到$\\MB$。\n\n\n如果矩阵$\\MA$的行数大于列数，那么上述方程可能没有解。\n如果矩阵$\\MA$的行数小于列数，那么上述矩阵可能有多个解。\n\n\nMoore-Penrose 伪逆使我们在这类问题上取得了一定的进展。\n矩阵$\\MA$的伪逆定义为：\n\\begin{equation}\n    \\MA^+ = \\lim_{\\alpha \\searrow 0} (\\MA^\\top\\MA + \\alpha \\MI)^{-1} \\MA^\\top.\n\\end{equation}\n计算伪逆的实际算法没有基于这个定义，而是使用下面的公式：\n\\begin{equation}\n    \\MA^+ = \\MV\\MD^+\\MU^\\top.\n\\end{equation}\n其中，矩阵$\\MU$，$\\MD$和$\\MV$是矩阵$\\MA$奇异值分解后得到的矩阵。\n对角矩阵$\\MD$的伪逆$\\MD^+$是其非零元素取倒数之后再转置得到的。\n\n<!-- % -- 43 -- -->\n\n当矩阵$\\MA$的列数多于行数时，使用伪逆求解线性方程是众多可能解法中的一种。\n特别地，$\\Vx=\\MA^+\\Vy$是方程所有可行解中欧几里得范数$\\norm{\\Vx}_2$最小的一个。\n\n\n当矩阵$\\MA$的行数多于列数时，可能没有解。\n在这种情况下，通过伪逆得到的$\\Vx$使得$\\MA\\Vx$和$\\Vy$的欧几里得距离$\\norm{\\MA\\Vx-\\Vy}_2$最小。\n\n\n\n\n\n\n# 迹运算\n\n\n迹运算返回的是矩阵对角元素的和：\n\\begin{equation}\n    \\Tr(\\MA)= \\sum_i \\MA_{i,i}.\n\\end{equation}\n迹运算因为很多原因而有用。\n若不使用求和符号，有些矩阵运算很难描述，而通过矩阵乘法和迹运算符号可以清楚地表示。\n例如，迹运算提供了另一种描述矩阵Frobenius 范数的方式：\n\\begin{equation}\n    \\norm{A}_F = \\sqrt{\\text{Tr}(\\MA \\MA^\\top)}.\n\\end{equation}\n\n\n用迹运算表示表达式，我们可以使用很多有用的等式巧妙地处理表达式。\n例如，迹运算在转置运算下是不变的：\n\\begin{equation}\n    \\Tr(\\MA)=\\Tr(\\MA^\\top).\n\\end{equation}\n\n\n多个矩阵相乘得到的方阵的迹，和将这些矩阵中的最后一个挪到最前面之后相乘的迹是相同的。\n当然，我们需要考虑挪动之后矩阵乘积依然定义良好：\n\\begin{equation}\n\\Tr(\\MA\\MB\\MC)=\\Tr(\\MC\\MA\\MB)= \\Tr(\\MB\\MC\\MA).\n\\end{equation}\n或者更一般地，\n\\begin{equation} \n\\Tr(\\prod_{i=1}^n \\MF^{(i)})= \\Tr(\\MF^{(n)} \\prod_{i=1}^{n-1} \\MF^{(i)}).\n\\end{equation}\n即使循环置换后矩阵乘积得到的矩阵形状变了，迹运算的结果依然不变。\n例如，假设矩阵$\\MA\\in \\SetR^{m\\times n}$，矩阵$\\MB\\in \\SetR^{n\\times m}$，我们可以得到\n\\begin{equation} \n    \\Tr(\\MA\\MB)= \\Tr(\\MB\\MA)\n\\end{equation}\n尽管$\\MA\\MB \\in \\SetR^{m\\times m}$和$\\MB\\MA \\in \\SetR^{n\\times n}$。\n\n\n<!-- % -- 44 -- -->\n\n另一个有用的事实是标量在迹运算后仍然是它自己：$a=\\Tr(a)$。\n\n\n\n\n\n# 行列式\n\n\n行列式，记作$\\text{det}(\\MA)$，是一个将方阵$\\MA$映射到实数的函数。\n行列式等于矩阵特征值的乘积。\n行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。\n如果行列式是$0$，那么空间至少沿着某一维完全收缩了，使其失去了所有的体积。\n如果行列式是$1$，那么这个转换保持空间体积不变。\n\n\n\n\n\n# 实例：主成分分析\n\n\n主成分分析是一个简单的机器学习算法，可以通过基础的线性代数知识推导。\n\n\n假设在$\\SetR^n$空间中我们有$m$个点$\\{\\Vx^{(1)}, \\dots ,\\Vx^{(m)}\\}$，我们希望对这些点进行有损压缩。\n有损压缩表示我们使用更少的内存，但损失一些精度去存储这些点。\n我们希望损失的精度尽可能少。\n\n\n一种编码这些点的方式是用低维表示。\n对于每个点$\\Vx^{(i)} \\in \\SetR^n$，会有一个对应的编码向量$\\Vc^{(i)}\\in \\SetR^l$。\n如果$l$比$n$小，那么我们便使用了更少的内存来存储原来的数据。\n我们希望找到一个编码函数，根据输入返回编码，$f(\\Vx)=\\Vc$；我们也希望找到一个解码函数，给定编码重构输入，$\\Vx\\approx g(f(\\Vx))$。\n\n\nPCA~由我们选择的解码函数而定。\n具体地，为了简化解码器，我们使用矩阵乘法将编码映射回$\\SetR^n$，即$g(\\Vc)=\\MD\\Vc$，其中$\\MD\\in \\SetR^{n\\times l}$是定义解码的矩阵。\n\n<!-- % -- 45 -- -->\n\n目前为止所描述的问题，可能会有多个解。\n因为如果我们按比例地缩小所有点对应的编码向量$c_i$，那么我们只需按比例放大$\\MD_{:,i}$，即可保持结果不变。\n为了使问题有唯一解，我们限制$\\MD$中所有列向量都有单位范数。\n\n\n计算这个解码器的最优编码可能是一个困难的问题。\n为了使编码问题简单一些，PCA\\,限制$\\MD$的列向量彼此正交（注意，除非$l=n$，否则严格意义上$\\MD$不是一个正交矩阵）。\n\n\n为了将这个基本想法变为我们能够实现的算法，首先我们需要明确如何根据每一个输入$\\Vx$得到一个最优编码$\\Vc^*$。\n一种方法是最小化原始输入向量$\\Vx$和重构向量$g(\\Vc^*)$之间的距离。\n我们使用范数来衡量它们之间的距离。\n在\\,PCA\\,算法中，我们使用$L^2$范数：\n\\begin{equation}\n \\Vc^* = \\underset{\\Vc}{\\arg\\min} \\norm{\\Vx-g(\\Vc)}_2.\n\\end{equation}\n\n\n我们可以用平方$L^2$范数替代$L^2$范数，因为两者在相同的值$\\Vc$上取得最小值。\n这是因为$L^2$范数是非负的，并且平方运算在非负值上是单调递增的。\n\\begin{equation}\n\\Vc^* = \\argmin_{\\Vc} \\norm{\\Vx - g(\\Vc)}_2^2.\n\\end{equation}\n该最小化函数可以简化成\n\\begin{equation}\n(\\Vx-g(\\Vc))^\\top(\\Vx-g(\\Vc))\n\\end{equation}\n（\\eqn?中$L^2$范数的定义）\n\\begin{equation}\n    = \\Vx^\\top\\Vx - \\Vx^\\top g(\\Vc) - g(\\Vc)^\\top\\Vx + g(\\Vc)^\\top g(\\Vc)\n\\end{equation}\n(分配律)\n\\begin{equation}\n    = \\Vx^\\top \\Vx - 2\\Vx^\\top g(\\Vc) + g(\\Vc)^\\top g(\\Vc)\n\\end{equation}\n(因为标量$g(\\Vc)^\\top\\Vx$的转置等于自己)\n\n\n因为第一项$\\Vx^\\top\\Vx$不依赖于$\\Vc$，所以我们可以忽略它，得到如下的优化目标：\n\\begin{equation}\n\\Vc^* = \\underset{\\Vc}{\\arg\\min} - 2\\Vx^\\top g(\\Vc) + g(\\Vc)^\\top g(\\Vc).\n\\end{equation}\n\n<!-- % -- 46 -- -->\n\n更进一步，我们代入$g(\\Vc)$的定义：\n\\begin{equation}\n    \\Vc^* = \\underset{\\Vc}{\\arg\\min} - 2\\Vx^\\top\\MD\\Vc + \\Vc^\\top\\MD^\\top\\MD\\Vc\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vc}{\\arg\\min} -2\\Vx^\\top\\MD\\Vc + \\Vc^\\top\\MI_l\\Vc\n\\end{equation}\n(矩阵$\\MD$的正交性和单位范数约束)\n\\begin{equation}\n    = \\underset{\\Vc}{\\arg\\min} -2\\Vx^\\top\\MD\\Vc + \\Vc^\\top\\Vc\n\\end{equation}\n\n\n我们可以通过向量微积分来求解这个最优化问题（如果你不清楚怎么做，请参考\\sec?）\n\\begin{gather}\n    \\nabla_{\\Vc} (-2\\Vx^\\top \\MD \\Vc + \\Vc^\\top\\Vc) = 0\\\\\n    -2\\MD^\\top\\Vx + 2\\Vc = 0\\\\\n    \\Vc = \\MD^\\top \\Vx.\n\\end{gather}\n\n\n这使得算法很高效：最优编码$\\Vx$只需要一个矩阵-向量乘法操作。\n为了编码向量，我们使用编码函数：\n\\begin{equation}\n    f(\\Vx)=\\MD^\\top\\Vx.\n\\end{equation}\n进一步使用矩阵乘法，我们也可以定义\\,PCA\\,重构操作：\n\\begin{equation}\n    r(\\Vx)=g(f(\\Vx)) = \\MD\\MD^\\top \\Vx.\n\\end{equation}\n\n\n接下来，我们需要挑选编码矩阵$\\MD$。\n要做到这一点，我们回顾最小化输入和重构之间$L^2$距离的这个想法。\n因为用相同的矩阵$\\MD$对所有点进行解码，我们不能再孤立地看待每个点。\n反之，我们必须最小化所有维数和所有点上的误差矩阵的\\,Frobenius 范数：\n\\begin{equation}\n    \\MD^* =  \\underset{\\MD}{\\arg\\min} \\sqrt{\\sum_{i,j}\\left( \\Vx_j^{(i)} - r(\\Vx^{(i)})_j\\right)^2} \\text{ subject to } \\MD^\\top\\MD = \\MI_l.\n\\end{equation}\n\n为了推导用于寻求$\\MD^*$的算法，我们首先考虑$l=1$的情况。\n在这种情况下，$\\MD$是一个单一向量$\\Vd$。\n将\\eqn?代入\\eqn?，简化$\\MD$为$\\Vd$，问题简化为\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\sum_i \\norm{\\Vx^{(i)} - \\Vd\\Vd^\\top \\Vx^{(i)}}_2^2\n    \\text{ subject to } \\norm{\\Vd}_2 = 1.\n\\end{equation}\n\n<!-- % -- 47 -- -->\n\n上述公式是直接代入得到的，但不是文体表述最舒服的方式。\n在上述公式中，我们将标量$\\Vd^\\top\\Vx^{(i)}$放在向量$\\Vd$的右边。\n将该标量放在左边的写法更为传统。\n于是我们通常写作\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\sum_i \\norm{\\Vx^{(i)} - \\Vd^\\top \\Vx^{(i)}\\Vd}_2^2\n        \\text{ subject to } \\norm{\\Vd}_2 = 1,\n\\end{equation}\n或者，考虑到标量的转置和自身相等，我们也可以写作\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\sum_i \\norm{\\Vx^{(i)} - \\Vx^{(i)\\top}\\Vd\\Vd}_2^2\n        \\text{ subject to } \\norm{\\Vd}_2 = 1.\n\\end{equation}\n读者应该对这些重排写法慢慢熟悉起来。\n\n\n此时，使用单一矩阵来重述问题，比将问题写成求和形式更有帮助。\n这有助于我们使用更紧凑的符号。\n将表示各点的向量堆叠成一个矩阵，记为$\\MX\\in\\SetR^{m\\times n}$，其中$\\MX_{i,:}=\\Vx^{(i)^\\top}$。\n原问题可以重新表述为：\n\\begin{equation}\n    \\Vd^* = \\underset{\\Vd}{\\arg\\min} \\norm{\\MX - \\MX\\Vd\\Vd^\\top}_F^2\n        \\text{ subject to } \\Vd^\\top \\Vd = 1.\n\\end{equation}\n暂时不考虑约束，我们可以将\\,Frobenius 范数简化成下面的形式：\n\\begin{equation}\n     \\underset{\\Vd}{\\arg\\min} \\norm{\\MX - \\MX \\Vd\\Vd^\\top}_F^2\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, \\Tr \\left( \\left( \\MX - \\MX \\Vd\\Vd^\\top  \\right)^\\top \\left( \\MX - \\MX \\Vd\\Vd^\\top  \\right) \\right)\n\\end{equation}\n（\\eqn?）\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, \\Tr \\left( \\MX^\\top\\MX - \\MX^\\top\\MX \\Vd\\Vd^\\top - \\Vd\\Vd^\\top \\MX^\\top\\MX + \\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top  \\right)\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, \\Tr( \\MX^\\top\\MX)  - \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)  - \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX) + \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top)\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)  - \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX) + \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top)\n\\end{equation}\n（因为与$\\Vd$无关的项不影响$\\arg\\min$）\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top) + \\Tr(\\Vd\\Vd^\\top \\MX^\\top\\MX\\Vd\\Vd^\\top)\n\\end{equation}\n（因为循环改变迹运算中相乘矩阵的顺序不影响结果，如\\eqn?所示）\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top) + \\Tr(\\MX^\\top\\MX\\Vd\\Vd^\\top\\Vd\\Vd^\\top )\n\\end{equation}\n（再次使用上述性质）\n\n<!-- % -- 48 -- -->\n\n此时，我们再来考虑约束条件:\n\\begin{equation}\n    \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top) + \\Tr(\\MX^\\top\\MX\\Vd\\Vd^\\top\\Vd\\Vd^\\top )\n    \\text{ subject to } \\Vd^\\top \\Vd = 1\n\\end{equation}\n\\begin{equation}\n    = \\underset{\\Vd}{\\arg\\min} \\, - 2\\Tr(\\MX^\\top\\MX \\Vd \\Vd^\\top) + \\Tr(\\MX^\\top\\MX\\Vd\\Vd^\\top )\n    \\text{ subject to } \\Vd^\\top \\Vd = 1\n\\end{equation}\n (因为约束条件)\n \\begin{equation}\n     = \\underset{\\Vd}{\\arg\\min} \\, - \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)\n     \\text{ subject to } \\Vd^\\top \\Vd = 1\n \\end{equation}\n \\begin{equation}\n     = \\underset{\\Vd}{\\arg\\max} \\, \\Tr(\\MX^\\top\\MX \\Vd\\Vd^\\top)\n     \\text{ subject to } \\Vd^\\top \\Vd = 1\n \\end{equation}\n \\begin{equation}\n     = \\underset{\\Vd}{\\arg\\max} \\, \\Tr(\\Vd^\\top\\MX^\\top\\MX \\Vd)\n     \\text{ subject to } \\Vd^\\top \\Vd = 1 .\n \\end{equation}\n\n\n这个优化问题可以通过特征分解来求解。\n具体来讲，最优的$\\Vd$是$\\MX^\\top\\MX$最大特征值对应的特征向量。\n\n\n以上推导特定于$l=1$的情况， 仅得到了第一个主成分。\n更一般地，当我们希望得到主成分的基时，矩阵$\\MD$由前$l$个最大的特征值对应的特征向量组成。\n这个结论可以通过归纳法证明，我们建议将此证明作为练习。\n\n\n线性代数是理解深度学习所必须掌握的基础数学学科之一。\n另一门在机器学习中无处不在的重要数学学科是概率论，我们将在下一章探讨。\n\n\n\n<!-- % -- 49 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-03-Chapter3_probability_and_information_theory.md",
    "content": "---\ntitle: 概率与信息论\nlayout: post\nshare: false\n---\n\n本章我们讨论概率论和信息论。\n\n概率论是用于表示不确定性声明的数学框架。\n<!-- %(statement要不要换一下说法) -->\n它不仅提供了量化不确定性的方法，也提供了用于导出新的不确定性声明的公理。\n在人工智能领域，概率论主要有两种用途。\n首先，概率法则告诉我们~AI~系统如何推理，据此我们设计一些算法来计算或者估算由概率论导出的表达式。\n其次，我们可以用概率和统计从理论上分析我们提出的~AI~系统的行为。\n\n概率论是众多科学学科和工程学科的基本工具。\n我们提供这一章，是为了确保那些背景偏软件工程而较少接触概率论的读者也可以理解本书的内容。\n\n概率论使我们能够提出不确定的声明以及在不确定性存在的情况下进行推理，而信息论使我们能够量化概率分布中的不确定性总量。\n\n如果你已经对概率论和信息论很熟悉了，那么除了\\sec?以外的整章内容，你都可以跳过。\n而在\\sec?中，我们会介绍用来描述机器学习中结构化概率模型的图。\n即使你对这些主题没有任何的先验知识，本章对于完成深度学习的研究项目来说也已经足够，尽管如此我们还是建议你能够参考一些额外的资料，例如~{Jaynes03}。\n\n<!-- % -- 51 -- -->\n\n\n# 为什么要使用概率？\n\n\n计算机科学的许多分支处理的实体大部分都是完全确定且必然的。\n程序员通常可以安全地假定CPU将完美地执行每条机器指令。\n虽然硬件错误确实会发生，但它们足够罕见，以致于大部分软件应用在设计时并不需要考虑这些因素的影响。\n鉴于许多计算机科学家和软件工程师在一个相对干净和确定的环境中工作，机器学习对于概率论的大量使用是很令人吃惊的。\n\n这是因为机器学习通常必须处理不确定量，有时也可能需要处理随机(非确定性的)量。\n<!-- %(这里uncertain和stochastic有什么区别？) -->\n不确定性和随机性可能来自多个方面。\n至少从20世纪80年代开始，研究人员就对使用概率论来量化不确定性提出了令人信服的论据。\n这里给出的许多论据都是根据~{Pearl88}的工作总结或启发得到的。\n\n几乎所有的活动都需要一些在不确定性存在的情况下进行推理的能力。\n事实上，除了那些被定义为真的数学声明，我们很难认定某个命题是千真万确的或者确保某件事一定会发生。\n\n不确定性有三种可能的来源：\n\n\\begin{enumerate}\n+ 被建模系统内在的随机性。\n例如，大多数量子力学的解释，都将亚原子粒子的动力学描述为概率的。\n我们还可以创建一些我们假设具有随机动态的理论情境，例如一个假想的纸牌游戏，在这个游戏中我们假设纸牌被真正混洗成了随机顺序。\n\n+ 不完全观测。\n即使是确定的系统，当我们不能观测到所有驱动系统行为的变量时，该系统也会呈现随机性。\n例如，在Monty Hall问题中，一个游戏节目的参与者被要求在三个门之间选择，并且会赢得放置在选中门后的奖品。\n其中两扇门通向山羊，第三扇门通向一辆汽车。\n选手的每个选择所导致的结果是确定的，但是站在选手的角度，结果是不确定的。\n\n+ 不完全建模。\n当我们使用一些必须舍弃某些观测信息的模型时，舍弃的信息会导致模型的预测出现不确定性。\n例如，假设我们制作了一个机器人，它可以准确地观察周围每一个对象的位置。\n在对这些对象将来的位置进行预测时，如果机器人采用的是离散化的空间，那么离散化的方法将使得机器人无法确定对象们的精确位置：因为每个对象都可能处于它被观测到的离散单元的任何一个角落。\n\\end{enumerate}\n\n<!-- % -- 52 --   -->\n\n在很多情况下，使用一些简单而不确定的规则要比复杂而确定的规则更为实用，即使真正的规则是确定的并且我们建模的系统可以足够精确地容纳复杂的规则。\n例如，\"多数鸟儿都会飞\"这个简单的规则描述起来很简单很并且使用广泛，而正式的规则——\"除了那些还没学会飞翔的幼鸟，因为生病或是受伤而失去了飞翔能力的鸟，包括食火鸟(cassowary)、鸵鸟(ostrich)、几维(kiwi，一种新西兰产的无翼鸟)等不会飞的鸟类……以外，鸟儿会飞\"，很难应用、维护和沟通，即使经过这么多的努力，这个规则还是很脆弱而且容易失效。\n\n尽管我们的确需要一种用以对不确定性进行表示和推理的方法，但是概率论并不能明显地提供我们在人工智能领域需要的所有工具。\n概率论最初的发展是为了分析事件发生的频率。\n我们可以很容易地看出概率论，对于像在扑克牌游戏中抽出一手特定的牌这种事件的研究中，是如何使用的。\n这类事件往往是可以重复的。\n当我们说一个结果发生的概率为$p$，这意味着如果我们反复实验(例如，抽取一手牌)无限次，有$p$的比例可能会导致这样的结果。\n这种推理似乎并不立即适用于那些不可重复的命题。\n如果一个医生诊断了病人，并说该病人患流感的几率为40\\%，这意味着非常不同的事情——我们既不能让病人有无穷多的副本，也没有任何理由去相信病人的不同副本在具有不同的潜在条件下表现出相同的症状。\n在医生诊断病人的例子中，我们用概率来表示一种信任度，其中1表示非常肯定病人患有流感，而0表示非常肯定病人没有流感。\n前面那种概率，直接与事件发生的频率相联系，被称为频率派概率；而后者，涉及到确定性水平，被称为贝叶斯概率。\n\n关于不确定性的常识推理，如果我们已经列出了若干条我们期望它具有的性质，那么满足这些性质的唯一一种方法就是将贝叶斯概率和频率派概率视为等同的。\n例如，如果我们要在扑克牌游戏中根据玩家手上的牌计算她能够获胜的概率，我们使用和医生情境完全相同的公式，就是我们依据病人的某些症状计算她是否患病的概率。\n为什么一小组常识性假设蕴含了必须是相同的公理控制两种概率？更多的细节参见~{Ramsey1926}。\n\n<!-- % -- 53 -- -->\n\n概率可以被看作是用于处理不确定性的逻辑扩展。\n逻辑提供了一套形式化的规则，可以在给定某些命题是真或假的假设下，判断另外一些命题是真的还是假的。\n概率论提供了一套形式化的规则，可以在给定一些命题的似然后，计算其他命题为真的似然。\n\n\n# 随机变量\n\n\n随机变量是可以随机地取不同值的变量。\n我们通常用无格式字体(plain typeface)中的小写字母来表示随机变量本身，而用手写体中的小写字母来表示随机变量能够取到的值。\n例如，$x_1$和$x_2$都是随机变量~$\\RSx$可能的取值。\n对于向量值变量，我们会将随机变量写成$\\RVx$，它的一个可能取值为$\\Vx$。\n就其本身而言，一个随机变量只是对可能的状态的描述；它必须伴随着一个概率分布来指定每个状态的可能性。\n\n随机变量可以是离散的或者连续的。\n离散随机变量拥有有限或者可数无限多的状态。\n注意这些状态不一定非要是整数；它们也可能只是一些被命名的状态而没有数值。\n连续随机变量伴随着实数值。\n\n\n# 概率分布\n\n\n概率分布用来描述随机变量或一簇随机变量在每一个可能取到的状态的可能性大小。\n我们描述概率分布的方式取决于随机变量是离散的还是连续的。\n\n\n## 离散型变量和概率质量函数\n\n\n离散型变量的概率分布可以用概率质量函数\\footnote{译者注：国内有些教材也将它翻译成概率分布律。}来描述。\n我们通常用大写字母$P$来表示概率质量函数。\n通常每一个随机变量都会有一个不同的概率质量函数，并且读者必须根据随机变量来推断所使用的~PMF，而不是根据函数的名称来推断；例如，$P(\\RSx)$ 通常和$P(\\RSy)$不一样。\n\n<!-- % -- 54 -- -->\n\n概率质量函数将随机变量能够取得的每个状态映射到随机变量取得该状态的概率。\n$\\RSx = x$的概率用$P(x)$来表示，概率为1表示$\\RSx = x$是确定的，概率为0表示$\\RSx=x$是不可能发生的。\n有时为了使得PMF的使用不相互混淆，我们会明确写出随机变量的名称：$P(\\RSx = x)$。\n有时我们会先定义一个随机变量，然后用$\\sim$符号来说明它遵循的分布：$\\RSx\\sim P(\\RSx)$。\n\n概率质量函数可以同时作用于多个随机变量。\n这种多个变量的概率分布被称为联合概率分布。\n$P(\\RSx = x, \\RSy = y)$表示$\\RSx = x$和$\\RSy = y$同时发生的概率。我们也可以简写为$P(x, y)$。\n\n如果一个函数$P$是随机变量 $\\RSx$的~PMF，必须满足下面这几个条件：\n\n+ $P$的定义域必须是$\\RSx$所有可能状态的集合。\n\n+ $\\forall x \\in \\RSx, 0\\le P(x)\\le 1.$不可能发生的事件概率为0，并且不存在比这概率更低的状态。\n类似的，能够确保一定发生的事件概率为1，而且不存在比这概率更高的状态。\n\n+ $\\sum_{x \\in \\RSx} P(x) = 1.$我们把这条性质称之为归一化的。\n如果没有这条性质，当我们计算很多事件其中之一发生的概率时可能会得到大于1的概率。\n\n\n例如，考虑一个离散型随机变量 $\\RSx$有$k$个不同的状态。\n我们可以假设$\\RSx$是均匀分布的（也就是将它的每个状态视为等可能的），通过将它的PMF设为\n\\begin{equation}\nP(\\RSx = x_i) = \\frac{1}{k}\n\\end{equation}\n对于所有的$i$都成立。\n我们可以看出这满足上述成为概率质量函数的条件。\n因为$k$是一个正整数，所以$\\frac{1}{k}$是正的。我们也可以看出\n\\begin{equation}\n\\sum_i P(\\RSx = x_i) = \\sum_i \\frac{1}{k} = \\frac{k}{k} = 1,\n\\end{equation}\n因此分布也满足归一化条件。\n\n<!-- % -- 55 -- -->\n\n\n## 连续型变量和概率密度函数\n\n\n当我们研究的对象是连续型随机变量时，我们用概率密度函数而不是概率质量函数来描述它的概率分布。\n如果一个函数$p$是概率密度函数，必须满足下面这几个条件：\n\n+ $p$的定义域必须是$\\RSx$所有可能状态的集合。\n\n+ $\\forall x \\in \\RSx, p(x)\\ge 0.$注意，我们并不要求$p(x)\\le 1$。\n\n+ $\\int p(x) dx = 1.$\n\n\n概率密度函数 $p(x)$并没有直接对特定的状态给出概率，相对的，它给出了落在面积为$\\delta x$ 的无限小的区域内的概率为$p(x)\\delta x$。\n\n我们可以对概率密度函数求积分来获得点集的真实概率质量。\n特别地，$x$落在集合$\\SetS$中的概率可以通过$p(x)$对这个集合求积分来得到。\n在单变量的例子中，$x$落在区间$[a, b]$的概率是$\\int_{[a,b]} p(x)dx$。\n\n为了给出一个连续型随机变量的~PDF~的例子，我们可以考虑实数区间上的均匀分布。\n我们可以使用函数$u(x; a, b)$，其中$a$和$b$是区间的端点且满足$b>a$。\n符号\"$;$\"表示\"以什么为参数\"；我们把$x$作为函数的自变量，$a$和$b$作为定义函数的参数。\n为了确保区间外没有概率，我们对所有的$x\\not\\in[a,b]$，令$u(x; a, b)=0$。\n在$[a,b]$内，有$u(x; a, b)= \\frac{1}{b-a}$。\n我们可以看出任何一点都非负。\n另外，它的积分为1。我们通常用$\\RSx \\sim U(a, b)$表示$x$在$[a, b]$上是均匀分布的。\n\n\n# 边缘概率\n\n\n有时候，我们知道了一组变量的联合概率分布，但想要了解其中一个子集的概率分布。\n这种定义在子集上的概率分布被称为边缘概率分布。\n\n例如，假设有离散型随机变量 $\\RSx$和$\\RSy$，并且我们知道$P(\\RSx, \\RSy)$。\n我们可以依据下面的求和法则来计算$P(\\RSx)$：\n\\begin{equation}\n\\forall x \\in \\RSx, P(\\RSx = x) = \\sum_y P(\\RSx = x, \\RSy = y).\n\\end{equation}\n\n<!-- % -- 56 -- -->\n\n\"边缘概率\"的名称来源于手算边缘概率的计算过程。\n当$P(\\RSx, \\RSy)$的每个值被写在由每行表示不同的$x$值，每列表示不同的$y$值形成的网格中时，对网格中的每行求和是很自然的事情，然后将求和的结果$P(x)$写在每行右边的纸的边缘处。\n\n对于连续型变量，我们需要用积分替代求和：\n\\begin{equation}\np(x) = \\int p(x, y)dy.\n\\end{equation}\n\n\n# 条件概率\n\n\n在很多情况下，我们感兴趣的是某个事件，在给定其他事件发生时出现的概率。\n这种概率叫做条件概率。\n我们将给定$\\RSx = x$，$\\RSy = y$发生的条件概率记为$P(\\RSy = y\\mid \\RSx =x)$。\n这个条件概率可以通过下面的公式计算：\n\\begin{equation}\nP(\\RSy = y\\mid \\RSx = x) = \\frac{P(\\RSy = y, \\RSx = x)}{P(\\RSx = x)} .\n\\end{equation}\n条件概率只在$P(\\RSx = x)>0$时有定义。\n我们不能计算给定在永远不会发生的事件上的条件概率。\n\n这里需要注意的是，不要把条件概率和计算当采用某个动作后会发生什么相混淆。\n假定某个人说德语，那么他是德国人的条件概率是非常高的，但是如果随机选择的一个人会说德语，他的国籍不会因此而改变。\n计算一个行动的后果被称为干预查询。\n干预查询属于因果模型的范畴，我们不会在本书中讨论。\n\n\n# 条件概率的链式法则\n\n\n任何多维随机变量的联合概率分布，都可以分解成只有一个变量的条件概率相乘的形式：\n\\begin{equation}\nP(\\RSx^{(1)}, \\ldots, \\RSx^{(n)}) = P(\\RSx^{(1)}) \\Pi_{i=2}^n P(\\RSx^{(i)} \\mid \\RSx^{(1)}, \\ldots, \\RSx^{(i-1)}) .\n\\end{equation}\n\n<!-- % -- 57 -- -->\n\n这个规则被称为概率的链式法则或者乘法法则。\n它可以直接从\\eqn?条件概率的定义中得到。\n例如，使用两次定义可以得到\n\\begin{eqnarray*}\nP(\\RSa, \\RSb, \\RSc) &=& P(\\RSa \\mid \\RSb, \\RSc) P(\\RSb, \\RSc)\\\\\nP(\\RSb, \\RSc) &=& P(\\RSb \\mid \\RSc) P(\\RSc)\\\\\nP(\\RSa, \\RSb, \\RSc) &=& P(\\RSa \\mid \\RSb, \\RSc) P(\\RSb \\mid \\RSc) P(\\RSc).\n\\end{eqnarray*}\n\n\n# 独立性和条件独立性\n\n\n两个随机变量 $\\RSx$和$\\RSy$，如果它们的概率分布可以表示成两个因子的乘积形式，并且一个因子只包含$\\RSx$另一个因子只包含$\\RSy$，我们就称这两个随机变量是相互独立的：\n\\begin{equation}\n\\forall x \\in \\RSx, y \\in \\RSy, p(\\RSx = x, \\RSy = y) = p(\\RSx = x)p(\\RSy = y).\n\\end{equation}\n\n如果关于$\\RSx$和$\\RSy$的条件概率分布对于$z$的每一个值都可以写成乘积的形式，那么这两个随机变量 $\\RSx$和$\\RSy$在给定随机变量~$z$时是条件独立的：\n\\begin{equation}\n\\forall x \\in \\RSx, y \\in \\RSy, z \\in \\RSz, p( \\RSx=x, \\RSy=y \\mid \\RSz=z) =\np(\\RSx = x \\mid \\RSz = z) p(\\RSy = y \\mid \\RSz = z).\n\\end{equation}\n\n我们可以采用一种简化形式来表示独立性和条件独立性：$\\RSx \\bot \\RSy$表示$\\RSx$和$\\RSy$相互独立，$\\RSx \\bot \\RSy \\mid \\RSz$表示$\\RSx$和$\\RSy$在给定$\\RSz$时条件独立。\n\n\n# 期望、方差和协方差\n\n\n函数$f(x)$关于某分布$P(\\RSx)$的期望或者期望值是指，当$x$由$P$产生，$f$作用于$x$时，$f(x)$的平均值。\n对于离散型随机变量，这可以通过求和得到：\n\\begin{equation}\n\\SetE_{\\RSx \\sim P}[f(x)] = \\sum_x P(x)f(x),\n\\end{equation}\n对于连续型随机变量可以通过求积分得到：\n\\begin{equation}\n\\SetE_{\\RSx \\sim p}[f(x)] = \\int p(x)f(x)dx.\n\\end{equation}\n当概率分布在上下文中指明时，我们可以只写出期望作用的随机变量的名称来进行简化，例如$\\SetE_{\\RSx}[f(x)]$。\n如果期望作用的随机变量也很明确，我们可以完全不写脚标，就像$\\SetE[f(x)]$。\n默认地，我们假设$\\SetE[\\cdot]$表示对方括号内的所有随机变量的值求平均。\n类似的，当没有歧义时，我们还可以省略方括号。\n\n<!-- % -- 58 -- -->\n\n期望是线性的，例如，\n\\begin{equation}\n\\SetE_{\\RSx}[\\alpha f(x) + \\beta g(x)] = \\alpha \\SetE_{\\RSx}[f(x)] + \\beta \\SetE_{\\RSx}[g(x)],\n\\end{equation}\n其中$\\alpha$和$\\beta$不依赖于$x$。\n\n方差衡量的是当我们对$x$依据它的概率分布进行采样时，随机变量 $\\RSx$的函数值会呈现多大的差异：\n\\begin{equation}\n\\Var(f(x)) = \\SetE \\left [(f(x) - \\SetE[f(x)])^2 \\right].\n\\end{equation}\n当方差很小时，$f(x)$的值形成的簇比较接近它们的期望值。方差的平方根被称为标准差。\n\n协方差在某种意义上给出了两个变量线性相关性的强度以及这些变量的尺度：\n\\begin{equation}\n\\Cov(f(x), g(y)) = \\SetE[ ( f(x)-\\SetE[f(x)] )( g(y)-\\SetE[g(y)] ) ].\n\\end{equation}\n协方差的绝对值如果很大则意味着变量值变化很大并且它们同时距离各自的均值很远。\n如果协方差是正的，那么两个变量都倾向于同时取得相对较大的值。\n如果协方差是负的，那么其中一个变量倾向于取得相对较大的值的同时，另一个变量倾向于取得相对较小的值，反之亦然。\n其他的衡量指标如相关系数将每个变量的贡献归一化，为了只衡量变量的相关性而不受各个变量尺度大小的影响。\n\n协方差和相关性是有联系的，但实际上是不同的概念。\n它们是有联系的，因为两个变量如果相互独立那么它们的协方差为零，如果两个变量的协方差不为零那么它们一定是相关的。\n然而，独立性又是和协方差完全不同的性质。\n两个变量如果协方差为零，它们之间一定没有线性关系。\n独立性比零协方差的要求更强，因为独立性还排除了非线性的关系。\n两个变量相互依赖但具有零协方差是可能的。\n例如，假设我们首先从区间$[-1, 1]$上的均匀分布中采样出一个实数$x$。\n然后我们对一个随机变量 $s$进行采样。\n$s$以$\\frac{1}{2}$的概率值为1，否则为-1。\n我们可以通过令$y=sx$来生成一个随机变量 $y$。\n显然，$x$和$y$不是相互独立的，因为$x$完全决定了$y$的尺度。\n然而，$\\Cov(x,y)=0$。\n\n<!-- % -- 59 -- -->\n\n随机向量$\\Vx \\in \\SetR^n$的协方差矩阵是一个$n\\times n$的矩阵，并且满足\n\\begin{equation}\n\\Cov(\\RVx)_{i,j} = \\Cov(\\RSx_i, \\RSx_j).\n\\end{equation}\n协方差矩阵的对角元是方差：\n\\begin{equation}\n\\Cov(\\RSx_i, \\RSx_i) = \\Var(\\RSx_i).\n\\end{equation}\n\n\n# 常用概率分布\n\n\n许多简单的概率分布在机器学习的众多领域中都是有用的。\n\n\n## Bernoulli分布\n\n\nBernoulli分布是单个二值随机变量的分布。\n它由单个参数$\\phi \\in [0, 1]$控制，$\\phi$给出了随机变量等于1的概率。\n它具有如下的一些性质：\n\\begin{gather}\nP(\\RSx =1) = \\phi\\\\\nP(\\RSx =0) = 1-\\phi\\\\\nP(\\RSx = x) = \\phi^x (1-\\phi)^{1-x}\\\\\n\\SetE_{\\RSx}[\\RSx] = \\phi\\\\\n\\Var_{\\RSx}(\\RSx) = \\phi(1-\\phi)\n\\end{gather}\n\n\n## Multinoulli分布\n\n\nMultinoulli分布或者范畴分布是指在具有$k$个不同状态的单个离散型随机变量上的分布，其中$k$是一个有限值。\\footnote{\"multinoulli\"这个术语是最近被Gustavo Lacerdo发明、被{MurphyBook2012}推广的。\nMultinoulli分布是多项式分布的一个特例。\n多项式分布是$\\{0,\\ldots, n\\}^k$中的向量的分布，用于表示当对~Multinoulli分布采样$n$次时$k$个类中的每一个被访问的次数。\n很多文章使用\"多项式分布\"而实际上说的是~Multinoulli分布，但是他们并没有说是对$n=1$的情况，这点需要注意。}\nMultinoulli分布由向量$\\Vp \\in [0, 1]^{k-1}$参数化，其中每一个分量$p_i$表示第$i$个状态的概率。\n最后的第$k$个状态的概率可以通过$1-\\Vone^\\top \\Vp$给出。\n注意我们必须限制$\\Vone^\\top \\Vp \\le 1$。\nMultinoulli分布经常用来表示对象分类的分布，所以我们很少假设状态1具有数值1之类的。\n因此，我们通常不需要去计算~Multinoulli分布的随机变量的期望和方差。\n\n<!-- % -- 60 -- -->\n\nBernoulli分布和~Multinoulli分布足够用来描述在它们领域内的任意分布。\n它们能够描述这些分布，不是因为它们特别强大，而是因为它们的领域很简单；\n它们可以对那些，能够将所有的状态进行枚举的离散型随机变量进行建模。\n当处理的是连续型随机变量时，会有不可数无限多的状态，所以任何通过少量参数描述的概率分布都必须在分布上加以严格的限制。\n\n\n## 高斯分布\n\n\n\n实数上最常用的分布就是正态分布，也称为高斯分布：\n\\begin{equation}\n\\CalN(x; \\mu, \\sigma^2) = \\sqrt{\\frac{1}{2\\pi \\sigma^2}} \\exp \\left ( -\\frac{1}{2\\sigma^2} (x-\\mu)^2 \\right ).\n\\end{equation}\n\n\\fig?画出了正态分布的概率密度函数。\n<!-- % fig 3.1 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/normal_color}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{正态分布。\n正态分布 $\\CalN(x; \\mu, \\sigma^2)$呈现经典的\"钟形曲线\"的形状，其中中心峰的$x$坐标由$\\mu$给出，峰的宽度受$\\sigma$控制。\n在这个示例中，我们展示的是标准正态分布，其中$\\mu=0, \\sigma = 1$。}\n\\end{figure}\n\n正态分布由两个参数控制，$\\mu \\in \\SetR$和$\\sigma \\in (0, \\infty)$。\n参数$\\mu$给出了中心峰值的坐标，这也是分布的均值：$\\SetE[\\RSx] = \\mu$。\n分布的标准差用$\\sigma$表示，方差用$\\sigma^2$表示。\n\n当我们要对概率密度函数求值时，我们需要对$\\sigma$平方并且取倒数。\n当我们需要经常对不同参数下的概率密度函数求值时，一种更高效的参数化分布的方式是使用参数$\\beta \\in (0, \\infty)$，来控制分布的精度(或方差的倒数)：\n\\begin{equation}\n\\CalN(x; \\mu, \\beta^{-1}) = \\sqrt{\\frac{\\beta}{2\\pi}} \\exp \\left(  -\\frac{1}{2}\\beta (x-\\mu)^2 \\right).\n\\end{equation}\n\n采用正态分布在很多应用中都是一个明智的选择。\n当我们由于缺乏关于某个实数上分布的先验知识而不知道该选择怎样的形式时，正态分布是默认的比较好的选择，其中有两个原因。\n\n<!-- % -- 61 -- -->\n\n第一，我们想要建模的很多分布的真实情况是比较接近正态分布的。\n中心极限定理说明很多独立随机变量的和近似服从正态分布。\n这意味着在实际中，很多复杂系统都可以被成功地建模成正态分布的噪声，即使系统可以被分解成一些更结构化的部分。\n\n第二，在具有相同方差的所有可能的概率分布中，正态分布在实数上具有最大的不确定性。\n因此，我们可以认为正态分布是对模型加入的先验知识量最少的分布。\n充分利用和证明这个想法需要更多的数学工具，我们推迟到\\sec?进行讲解。\n\n正态分布可以推广到$\\SetR^n$空间，这种情况下被称为多维正态分布。\n它的参数是一个正定对称矩阵$\\VSigma$：\n\\begin{equation}\n\\CalN(\\Vx; \\Vmu, \\VSigma) = \\sqrt{ \\frac{1}{ (2\\pi)^n \\det(\\VSigma)}}  \\exp \\left ( -\\frac{1}{2} (\\Vx-\\Vmu)^\\top \\VSigma^{-1} (\\Vx- \\Vmu) \\right).\n\\end{equation}\n\n参数$\\Vmu$仍然表示分布的均值，只不过现在是向量值。\n参数$\\VSigma$给出了分布的协方差矩阵。\n和单变量的情况类似，当我们希望对很多不同参数下的概率密度函数多次求值时，协方差矩阵并不是一个很高效的参数化分布的方式，因为对概率密度函数求值时需要对$\\VSigma$求逆。\n我们可以使用一个精度矩阵 $\\Vbeta$ 进行替代：\n\\begin{equation}\n\\CalN(\\Vx; \\Vmu, \\Vbeta^{-1}) = \\sqrt{ \\frac{\\det(\\Vbeta)}{ (2\\pi)^n}}  \\exp \\left ( -\\frac{1}{2} (\\Vx-\\Vmu)^\\top \\Vbeta (\\Vx- \\Vmu) \\right).\n\\end{equation}\n\n<!-- % -- 62 -- -->\n\n我们常常把协方差矩阵固定成一个对角阵。\n一个更简单的版本是各向同性高斯分布，它的协方差矩阵是一个标量乘以单位阵。\n\n\n## 指数分布和Laplace分布\n\n\n在深度学习中，我们经常会需要一个在$x=0$点处取得边界点(sharp point)的分布。\n为了实现这一目的，我们可以使用指数分布：\n\\begin{equation}\np(x; \\lambda) = \\lambda \\Vone_{x\\ge 0} \\exp(-\\lambda x).\n\\end{equation}\n指数分布使用指示函数(indicator function)$\\Vone_{x\\ge 0}$来使得当$x$取负值时的概率为零。\n\n一个联系紧密的概率分布是Laplace分布，它允许我们在任意一点$\\mu$处设置概率质量的峰值\n\\begin{equation}\n\\text{Laplace}(x; \\mu, \\gamma) = \\frac{1}{2\\gamma} \\exp \\left( -\\frac{|x-\\mu|}{\\gamma}  \\right).\n\\end{equation}\n\n\n## Dirac分布和经验分布\n\n\n在一些情况下，我们希望概率分布中的所有质量都集中在一个点上。\n这可以通过Dirac delta函数 $\\delta(x)$定义概率密度函数来实现：\n\\begin{equation}\np(x) = \\delta(x-\\mu).\n\\end{equation}\nDirac delta函数被定义成在除了0以外的所有点的值都为0，但是积分为1。\nDirac delta函数不像普通函数一样对$x$的每一个值都有一个实数值的输出，它是一种不同类型的数学对象，被称为广义函数，广义函数是依据积分性质定义的数学对象。\n我们可以把~Dirac delta函数想成一系列函数的极限点，这一系列函数把除0以外的所有点的概率密度越变越小。\n\n<!-- % -- 63 -- -->\n\n通过把$p(x)$定义成$\\delta$函数左移$-\\mu$个单位，我们得到了一个在$x=\\mu$ 处具有无限窄也无限高的峰值的概率质量。\n\nDirac分布经常作为经验分布的一个组成部分出现：\n\\begin{equation}\n\\hat{p}(\\Vx) = \\frac{1}{m} \\sum_{i=1}^m \\delta(\\Vx - \\Vx^{(i)})\n\\end{equation}\n经验分布将概率密度$\\frac{1}{m}$赋给$m$个点$\\Vx^{(1)}, \\ldots, \\Vx^{(m)}$中的每一个，这些点是给定的数据集或者采样的集合。\n只有在定义连续型随机变量的经验分布时，Dirac delta函数才是必要的。\n对于离散型随机变量，情况更加简单：经验分布可以被定义成一个~Multinoulli分布，对于每一个可能的输入，其概率可以简单地设为在训练集上那个输入值的经验频率。\n\n当我们在训练集上训练模型时，我们可以认为从这个训练集上得到的经验分布指明了我们采样来源的分布。\n关于经验分布另外一种重要的观点是，它是训练数据的似然最大的那个概率密度函数(见\\sec?)。\n\n\n## 分布的混合\n\n\n通过组合一些简单的概率分布来定义新的概率分布也是很常见的。\n一种通用的组合方法是构造混合分布。\n混合分布由一些组件(component)分布构成。\n每次实验，样本是由哪个组件分布产生的取决于从一个~Multinoulli分布中采样的结果：\n\\begin{equation}\nP(\\RSx) = \\sum_i P(\\RSc = i) P(\\RSx \\mid \\RSc = i),\n\\end{equation}\n这里$P(\\RSc)$是对各组件的一个~Multinoulli分布。\n\n我们已经看过一个混合分布的例子了：实值变量的经验分布对于每一个训练实例来说，就是以~Dirac分布为组件的混合分布。\n\n<!-- % -- 64 -- -->\n\n混合模型是组合简单概率分布来生成更丰富的分布的一种简单策略。\n在\\chap?中，我们更加详细地探讨从简单概率分布构建复杂模型的技术。\n\n混合模型使我们能够一瞥以后会用到的一个非常重要的概念——潜变量。\n潜变量是我们不能直接观测到的随机变量。\n混合模型的组件标识变量$\\RSc$就是其中一个例子。\n潜变量在联合分布中可能和$\\RSx$有关，在这种情况下，$P(\\RSx, \\RSc) = P(\\RSx \\mid \\RSc)P(\\RSc)$。\n潜变量的分布$P(\\RSc)$以及关联潜变量和观测变量的条件分布$P(\\RSx \\mid\\RSc)$，共同决定了分布$P(\\RSx)$的形状，尽管描述$P(\\RSx)$时可能并不需要潜变量。\n潜变量将在\\sec?中深入讨论。\n\n一个非常强大且常见的混合模型是高斯混合模型，它的组件$p(\\RVx \\mid \\RSc= i)$是高斯分布。\n每个组件都有各自的参数，均值$\\Vmu^{(i)}$和协方差矩阵 $\\VSigma^{(i)}$。\n有一些混合可以有更多的限制。\n例如，协方差矩阵可以通过$\\VSigma^{(i)} = \\VSigma, \\forall i$的形式在组件之间共享参数。\n和单个高斯分布一样，高斯混合模型有时会限制每个组件的协方差矩阵为对角的或者各向同性的(标量乘以单位矩阵）。\n\n除了均值和协方差以外，高斯混合模型的参数指明了给每个组件$i$的先验概率 $\\alpha_i = P(\\RSc = i)$。\n\"先验\"一词表明了在观测到$\\RVx$~\\emph{之前}传递给模型关于$\\RSc$的信念。\n作为对比，$P(\\RSc \\mid \\Vx)$是后验概率，因为它是在观测到$\\RSx$\\emph{之后}进行计算的。\n高斯混合模型是概率密度的万能近似器，在这种意义下，任何平滑的概率密度都可以用具有足够多组件的高斯混合模型以任意精度来逼近。\n\n\\fig?演示了某个高斯混合模型生成的样本。\n<!-- % fig 3.2 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/mog_color}}\n\\fi\n\\caption{来自高斯混合模型的样本。\n在这个示例中，有三个组件。\n从左到右，第一个组件具有各向同性的协方差矩阵，这意味着它在每个方向上具有相同的方差。 第二个组件具有对角的协方差矩阵，这意味着它可以沿着每个轴的对齐方向单独控制方差。\n该示例中，沿着$x_2$轴的方差要比沿着$x_1$轴的方差大。 第三个组件具有满秩的协方差矩阵，使它能够沿着任意基的方向单独地控制方差。}\n\\end{figure}\n\n\n\n# 常用函数的有用性质\n\n\n某些函数在处理概率分布时经常会出现，尤其是深度学习的模型中用到的概率分布。\n\n<!-- % -- 65 -- -->\n\n其中一个函数是~\\textbf{logistic sigmoid}~函数：\n\\begin{equation}\n\\sigma(x) = \\frac{1}{1+\\exp(-x)}.\n\\end{equation}\nlogistic sigmoid~函数通常用来产生~Bernoulli分布中的参数$\\phi$，因为它的范围是$(0,1)$，处在$\\phi$的有效取值范围内。\n\\fig?给出了sigmoid函数的图示。\nsigmoid函数在变量取绝对值非常大的正值或负值时会出现饱和现象，意味着函数会变得很平，并且对输入的微小改变会变得不敏感。\n<!-- % fig 3.3 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/sigmoid_color}}\n\\fi\n\\caption{logistic sigmoid函数。}\n\\end{figure}\n\n另外一个经常遇到的函数是softplus函数{cite?}：\n\\begin{equation}\n\\zeta(x) = \\log(1+\\exp(x)).\n\\end{equation}\nsoftplus函数可以用来产生正态分布的$\\beta$和$\\sigma$参数，因为它的范围是$(0,\\infty)$。\n当处理包含sigmoid函数的表达式时它也经常出现。\nsoftplus函数名来源于它是另外一个函数的平滑（或\"软化\"）形式，这个函数是\n\\begin{equation}\nx^+ = \\max(0, x).\n\\end{equation}\n\\fig?给出了~softplus函数的图示。\n<!-- % fig 3.4 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/softplus_color}}\n\\fi\n\\caption{softplus函数。}\n\\end{figure}\n\n\n<!-- % -- 66 -- -->\n\n下面一些性质非常有用，你可能要记下来：\n\\begin{gather}\n\\sigma(x) = \\frac{\\exp(x)}{\\exp(x)+\\exp(0)}\\\\\n\\frac{d}{dx} \\sigma(x) = \\sigma(x)(1 - \\sigma(x))\\\\\n1-\\sigma(x) = \\sigma(-x)\\\\\n\\log \\sigma(x) = -\\zeta(-x)\\\\\n\\frac{d}{dx} \\zeta(x) = \\sigma(x)\\\\\n\\forall x \\in (0, 1), \\sigma^{-1}(x) = \\log \\left (  \\frac{x}{1-x} \\right)\\\\\n\\forall x>0, \\zeta^{-1}(x) = \\log(\\exp(x) - 1)\\\\\n\\zeta(x) = \\int_{-\\infty}^x \\sigma(y) dy\\\\\n\\zeta(x) - \\zeta(-x) = x\n\\end{gather}\n函数$\\sigma^{-1}(x)$在统计学中被称为分对数，但这个函数在机器学习中很少用到。\n\n<!-- % -- 67 -- -->\n\n\\eqn?为函数名\"softplus\"提供了其他的正当理由。\nsoftplus函数被设计成正部函数的平滑版本，这个正部函数是指$x^+ = \\max \\{ 0, x\\}$。\n与正部函数相对的是负部函数 $x^- = \\max\\{ 0, -x\\}$。\n为了获得类似负部函数的一个平滑函数，我们可以使用$\\zeta(-x)$。\n就像$x$可以用它的正部和负部通过等式$x^+ - x^- = x$恢复一样，我们也可以用同样的方式对$\\zeta(x)$和$\\zeta(-x)$进行操作，就像\\eqn?中那样。\n\n\n# 贝叶斯规则\n\n\n我们经常会需要在已知$P(\\RSy \\mid \\RSx)$时计算$P(\\RSx \\mid \\RSy)$。\n幸运的是，如果还知道$P(\\RSx)$，我们可以用贝叶斯规则来实现这一目的：\n\\begin{equation}\nP(\\RSx \\mid \\RSy) = \\frac{P(\\RSx) P(\\RSy \\mid \\RSx)}{P(\\RSy)}.\n\\end{equation}\n注意到$P(\\RSy)$出现在上面的公式中，它通常使用$P(\\RSy) = \\sum_x P(\\RSy \\mid x) P(x)$来计算，所以我们并不需要事先知道$P(\\RSy)$的信息。\n\n贝叶斯规则可以从条件概率的定义直接推导得出，但我们最好记住这个公式的名字，因为很多文献通过名字来引用这个公式。\n这个公式是以牧师Thomas Bayes的名字来命名的，他是第一个发现这个公式特例的人。\n这里介绍的一般形式由Pierre-Simon Laplace独立发现。\n\n\n# 连续型变量的技术细节\n\n\n连续型随机变量和概率密度函数的深入理解需要用到数学分支测度论的相关内容来扩展概率论。\n测度论超出了本书的范畴，但我们可以简要勾勒一些测度论用来解决的问题。\n\n在\\sec?中，我们已经看到连续型向量值随机变量 $\\RVx$落在某个集合$\\SetS$ 中的概率是通过$p(\\Vx)$对集合$\\SetS$积分得到的。\n对于集合$\\SetS$的一些选择可能会引起悖论。\n例如，构造两个集合$\\SetS_1$和$\\SetS_2$使得$p(\\Vx\\in \\SetS_1) + p(\\Vx\\in \\SetS_2)>1$并且$\\SetS_1 \\cap \\SetS_2 = \\emptyset$是可能的。\n这些集合通常是大量使用了实数的无限精度来构造的，例如通过构造分形形状(fractal-shaped)的集合或者是通过有理数相关集合的变换定义的集合。\\footnote{Banach-Tarski定理给出了这类集合的一个有趣的例子。\n译者注：我们这里把\"the set of rational numbers\"翻译成\"有理数相关集合\"，理解为\"一些有理数组成的集合\"，如果直接用后面的翻译读起来会比较拗口。}\n测度论的一个重要贡献就是提供了一些集合的特征使得我们在计算概率时不会遇到悖论。\n在本书中，我们只对相对简单的集合进行积分，所以测度论的这个方面不会成为一个相关考虑。\n\n<!-- % -- 68 -- -->\n\n对于我们的目的，测度论更多的是用来描述那些适用于$\\SetR^n$上的大多数点，却不适用于一些边界情况的定理。\n测度论提供了一种严格的方式来描述那些非常微小的点集。\n这种集合被称为\"零测度\"的。\n我们不会在本书中给出这个概念的正式定义。\n然而，直观地理解这个概念是有用的，我们可以认为零测度集在我们的度量空间中不占有任何的体积。\n例如，在$\\SetR^2$空间中，一条直线的测度为零，而填充的多边形具有正的测度。\n类似的，一个单独的点的测度为零。\n可数多个零测度集的并仍然是零测度的(所以所有有理数构成的集合测度为零)。\n\n另外一个有用的测度论中的术语是\"几乎处处\"。\n某个性质如果是几乎处处都成立的，那么它在整个空间中除了一个测度为零的集合以外都是成立的。\n因为这些例外只在空间中占有极其微小的量，它们在多数应用中都可以被放心地忽略。\n概率论中的一些重要结果对于离散值成立但对于连续值只能是\"几乎处处\"成立。\n\n连续型随机变量的另一技术细节，涉及到处理那种相互之间有确定性函数关系的连续型变量。\n假设我们有两个随机变量 $\\RVx$和$\\RVy$满足$\\Vy = g(\\Vx)$，其中$g$是可逆的、连续可微的函数。\n可能有人会想$p_y(\\Vy) = p_x(g^{-1}(\\Vy))$。\n但实际上这并不对。\n\n举一个简单的例子，假设我们有两个标量值随机变量 $\\RSx$和$\\RSy$，并且满足$\\RSy= \\frac{\\RSx}{2}$以及$\\RSx \\sim U(0, 1)$。\n如果我们使用$p_y(y) = p_x(2y)$，那么$p_y$ 除了区间$[0, \\frac{1}{2}]$以外都为0，并且在这个区间上的值为1。\n这意味着\n\\begin{equation}\n\\int p_y(y)dy = \\frac{1}{2},\n\\end{equation}\n而这违背了概率密度的定义(积分为1)。\n这个常见错误之所以错是因为它没有考虑到引入函数$g$后造成的空间变形。\n回忆一下，$\\Vx$落在无穷小的体积为$\\delta \\Vx$的区域内的概率为$p(\\Vx)\\delta\\Vx$。\n因为$g$可能会扩展或者压缩空间，在$\\Vx$空间内的包围着$\\Vx$ 的无穷小体积在$\\Vy$空间中可能有不同的体积。\n\n<!-- % -- 69 -- -->\n\n为了看出如何改正这个问题，我们回到标量值的情况。\n我们需要保持下面这个性质：\n\\begin{equation}\n|p_y(g(x))dy| = |p_x(x)dx|.\n\\end{equation}\n求解上式，我们得到\n\\begin{equation}\np_y(y) = p_x(g^{-1}(y)) \\left \\vert \\frac{\\partial x}{\\partial y} \\right \\vert\n\\end{equation}\n或者等价地，\n\\begin{equation}\np_x(x) = p_y(g(x)) \\left | \\frac{\\partial g(x)}{\\partial x} \\right |.\n\\end{equation}\n在高维空间中，微分运算扩展为Jacobian矩阵的行列式——矩阵的每个元素为$J_{i, j} = \\frac{\\partial x_i}{\\partial y_j}$。\n因此，对于实值向量$\\Vx$和$\\Vy$，\n\\begin{equation}\np_x(\\Vx) = p_y(g(\\Vx)) \\left | \\det \\left ( \\frac{\\partial g(\\Vx)}{\\partial \\Vx} \\right) \\right |.\n\\end{equation}\n\n\n# 信息论\n\n\n信息论是应用数学的一个分支，主要研究的是对一个信号包含信息的多少进行量化。\n它最初被发明是用来研究在一个含有噪声的信道上用离散的字母表来发送消息，例如通过无线电传输来通信。\n在这种情况下，信息论告诉我们如何对消息设计最优编码以及计算消息的期望长度，这些消息是使用多种不同编码机制、从特定的概率分布上采样得到的。\n在机器学习中，我们也可以把信息论应用于连续型变量，此时某些消息长度的解释不再适用。\n信息论是电子工程和计算机科学中许多领域的基础。\n在本书中，我们主要使用信息论的一些关键思想来描述概率分布或者量化概率分布之间的相似性。\n有关信息论的更多细节，参见~{cover-book2006}或者~{MacKay03}。\n\n信息论的基本想法是一个不太可能的事件居然发生了，要比一个非常可能的事件发生，能提供更多的信息。\n消息说：\"今天早上太阳升起\"信息量是如此之少以至于没有必要发送，但一条消息说：\"今天早上有日食\"信息量就很丰富。\n\n<!-- % -- 70 -- -->\n\n我们想要通过这种基本想法来量化信息。\n特别地，\n\n+ 非常可能发生的事件信息量要比较少，并且极端情况下，确保能够发生的事件应该没有信息量。\n\n+ 较不可能发生的事件具有更高的信息量。\n\n+ 独立事件应具有增量的信息。\n例如，投掷的硬币两次正面朝上传递的信息量，应该是投掷一次硬币正面朝上的信息量的两倍。\n\n\n为了满足上述三个性质，我们定义一个事件$\\RSx = x$的自信息为\n\\begin{equation}\nI(x) = -\\log P(x).\n\\end{equation}\n在本书中，我们总是用$\\log$来表示自然对数，其底数为$e$。\n因此我们定义的$I(x)$单位是奈特。\n一奈特是以$\\frac{1}{e}$的概率观测到一个事件时获得的信息量。\n其他的材料中使用底数为2的对数，单位是比特或者香农；通过比特度量的信息只是通过奈特度量信息的常数倍。\n\n当$\\RSx$是连续的，我们使用类似的关于信息的定义，但有些来源于离散形式的性质就丢失了。\n例如，一个具有单位密度的事件信息量仍然为0，但是不能保证它一定发生。\n\n自信息只处理单个的输出。\n我们可以用香农熵来对整个概率分布中的不确定性总量进行量化：\n\\begin{equation}\nH(\\RSx) = \\SetE_{\\RSx \\sim P}[I(x)] = -\\SetE_{\\RSx \\sim P}[\\log P(x)],\n\\end{equation}\n也记作$H(P)$。\n换言之，一个分布的香农熵是指遵循这个分布的事件所产生的期望信息总量。\n它给出了对依据概率分布 $P$生成的符号进行编码所需的比特数在平均意义上的下界(当对数底数不是2时，单位将有所不同)。\n那些接近确定性的分布(输出几乎可以确定)具有较低的熵；那些接近均匀分布的概率分布具有较高的熵。\n\\fig?给出了一个说明。\n当$\\RSx$是连续的，香农熵被称为微分熵。\n<!-- % fig 3.5 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/entropy_demo_color}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{二值随机变量的香农熵。%此处不翻译为\"二元随机变量\"，是因为元表示自变量\n该图说明了更接近确定性的分布是如何具有较低的香农熵，而更接近均匀分布的分布是如何具有较高的香农熵。\n水平轴是$p$，表示二值随机变量等于1的概率。\n熵由$(p-1)\\log(1-p) - p\\log p$给出。\n当$p$接近0时，分布几乎是确定的，因为随机变量几乎总是0。\n当$p$接近1时，分布也几乎是确定的，因为随机变量几乎总是1。\n当$p = 0.5$时，熵是最大的，因为分布在两个结果（0和1）上是均匀的。}\n\\end{figure}\n\n\n<!-- % -- 71 -- -->\n\n如果我们对于同一个随机变量 $\\RSx$有两个单独的概率分布 $P(\\RSx)$和$Q(\\RSx)$，我们可以使用KL散度来衡量这两个分布的差异：\n\\begin{equation}\nD_{\\text{KL}}(P||Q) = \\SetE_{\\RSx \\sim P} \\left [  \\log \\frac{P(x)}{Q(x)} \\right ] = \\SetE_{\\RSx \\sim P} [\\log P(x) - \\log Q(x)].\n\\end{equation}\n\n在离散型变量的情况下，KL散度衡量的是，当我们使用一种被设计成能够使得概率分布 $Q$ 产生的消息的长度最小的编码，发送包含由概率分布 $P$产生的符号的消息时，所需要的额外信息量(如果我们使用底数为2的对数时，信息量用比特衡量，但在机器学习中，我们通常用奈特和自然对数。)\n\nKL散度有很多有用的性质，最重要的是它是非负的。\nKL散度为0当且仅当$P$和$Q$在离散型变量的情况下是相同的分布，或者在连续型变量的情况下是\"几乎处处\"相同的。\n因为~KL散度是非负的并且衡量的是两个分布之间的差异，它经常被用作分布之间的某种距离。\n然而，它并不是真的距离因为它不是对称的：对于某些$P$和$Q$，$D_\\text{KL}(P||Q) \\ne D_\\text{KL}(Q||P)$。\n这种非对称性意味着选择$D_\\text{KL}(P||Q)$还是$D_\\text{KL}(Q||P)$影响很大。\n更多细节可以看\\fig?。\n<!-- % fig 3.6 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/kl_direction_color}}\n\\fi\n\\caption{KL散度是不对称的。\n假设我们有一个分布$p(x)$，并且希望用另一个分布$q(x)$来近似它。\n我们可以选择最小化$D_\\text{KL}(p||q)$或最小化$D_\\text{KL}(q||p)$。\n为了说明每种选择的效果，我们令$p$是两个高斯分布的混合，令$q$为单个高斯分布。\n选择使用~KL散度的哪个方向是取决于问题的。\n一些应用需要这个近似分布$q$在真实分布$p$放置高概率的所有地方都放置高概率，而其他应用需要这个近似分布$q$在真实分布$p$放置低概率的所有地方都很少放置高概率。 \nKL散度方向的选择反映了对于每种应用，优先考虑哪一种选择。\n\\emph{(左)}最小化$D_\\text{KL}(p||q)$的效果。\n在这种情况下，我们选择一个$q$使得它在$p$具有高概率的地方具有高概率。\n当$p$具有多个峰时，$q$选择将这些峰模糊到一起，以便将高概率质量放到所有峰上。 \n\\emph{(右)}最小化$D_\\text{KL}(q||p)$的效果。\n在这种情况下，我们选择一个$q$使得它在$p$具有低概率的地方具有低概率。\n当$p$具有多个峰并且这些峰间隔很宽时，如该图所示，最小化~KL散度会选择单个峰，以避免将概率质量放置在$p$的多个峰之间的低概率区域中。\n这里，我们说明当$q$被选择成强调左边峰时的结果。\n我们也可以通过选择右边峰来得到~KL散度相同的值。\n如果这些峰没有被足够强的低概率区域分离，那么~KL散度的这个方向仍然可能选择模糊这些峰。}\n\\end{figure}\n\n\n<!-- % -- 72 -- -->\n\n一个和~KL散度密切联系的量是交叉熵 $H(P, Q) = H(P) + D_\\text{KL}(P||Q)$，它和~KL散度很像但是缺少左边一项：\n\\begin{equation}\nH(P, Q) = -\\SetE_{\\RSx\\sim P} \\log Q(x).\n\\end{equation}\n针对$Q$最小化交叉熵等价于最小化~KL散度，因为$Q$并不参与被省略的那一项。\n\n当我们计算这些量时，经常会遇到$0\\log 0$这个表达式。\n按照惯例，在信息论中，我们将这个表达式处理为$\\lim_{x \\to 0} x\\log x = 0$。\n\n<!-- % -- 73 -- -->\n\n\n# 结构化概率模型\n\n\n机器学习的算法经常会涉及到在非常多的随机变量上的概率分布。\n通常，这些概率分布涉及到的直接相互作用都是介于非常少的变量之间的。\n使用单个函数来描述整个联合概率分布是非常低效的(无论是计算上还是统计上)。\n\n我们可以把概率分布分解成许多因子的乘积形式，而不是使用单一的函数来表示概率分布。\n例如，假设我们有三个随机变量 $\\RSa, \\RSb$和$\\RSc$，并且$\\RSa$影响$\\RSb$的取值，$\\RSb$影响$\\RSc$的取值，但是$\\RSa$和$\\RSc$在给定$\\RSb$时是条件独立的。\n我们可以把全部三个变量的概率分布重新表示为两个变量的概率分布的连乘形式：\n\\begin{equation}\np(\\RSa, \\RSb, \\RSc) = p(\\RSa)p(\\RSb\\mid \\RSa)p(\\RSc\\mid\\RSb).\n\\end{equation}\n\n这种分解可以极大地减少用来描述一个分布的参数数量。\n每个因子使用的参数数目是它的变量数目的指数倍。\n这意味着，如果我们能够找到一种使每个因子分布具有更少变量的分解方法，我们就能极大地降低表示联合分布的成本。\n\n我们可以用图来描述这种分解。\n这里我们使用的是图论中的\"图\"的概念：由一些可以通过边互相连接的顶点的集合构成。\n当我们用图来表示这种概率分布的分解，我们把它称为结构化概率模型或者图模型。\n\n有两种主要的结构化概率模型：有向的和无向的。\n两种图模型都使用图$\\CalG$，其中图的每个节点对应着一个随机变量，连接两个随机变量的边意味着概率分布可以表示成这两个随机变量之间的直接作用。\n\n有向模型使用带有有向边的图，它们用条件概率分布来表示分解，就像上面的例子。\n特别地，有向模型对于分布中的每一个随机变量 $\\RSx_i$都包含着一个影响因子，这个组成$\\RSx_i$条件概率的影响因子被称为$\\RSx_i$的父节点，记为$Pa_\\CalG(\\RSx_i)$：\n\\begin{equation}\np(\\RVx) = \\prod_i p(\\RSx_i \\mid Pa_\\CalG(\\RSx_i)).\n\\end{equation}\n\\fig?给出了一个有向图的例子以及它表示的概率分布的分解。\n<!-- % fig 3.7 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/directed}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{关于随机变量$\\RSa, \\RSb, \\RSc, \\RSd$和$\\RSe$的有向图模型。\n这幅图对应的概率分布可以分解为\n\\begin{equation}\np(\\RSa, \\RSb, \\RSc, \\RSd, \\RSe) = p(\\RSa) p(\\RSb \\mid \\RSa) p(\\RSc \\mid \\RSa, \\RSb) p(\\RSd \\mid \\RSb) p(\\RSe \\mid \\RSc).\n\\end{equation}\n该图模型使我们能够快速看出此分布的一些性质。\n例如，$\\RSa$和$\\RSc$直接相互影响，但$\\RSa$和$\\RSe$只有通过$\\RSc$间接相互影响。}\n\\end{figure}\n\n\n<!-- % -- 74 -- -->\n\n无向模型使用带有无向边的图，它们将分解表示成一组函数；不像有向模型那样，这些函数通常不是任何类型的概率分布。\n$\\CalG$中任何满足两两之间有边连接的顶点的集合被称为团。\n无向模型中的每个团$\\CalC^{(i)}$都伴随着一个因子$\\phi^{(i)}(\\CalC^{(i)})$。\n 这些因子仅仅是函数，并不是概率分布。\n 每个因子的输出都必须是非负的，但是并没有像概率分布中那样要求因子的和或者积分为1。\n\n随机变量的联合概率与所有这些因子的乘积成比例——意味着因子的值越大则可能性越大。\n当然，不能保证这种乘积的求和为1。\n所以我们需要除以一个归一化常数$Z$来得到归一化的概率分布，归一化常数$Z$被定义为$\\phi$函数乘积的所有状态的求和或积分。\n概率分布为：\n\\begin{equation}\np(\\RVx) = \\frac{1}{Z} \\prod_i \\phi^{(i)} \\left (\\CalC^{(i)} \\right).\n\\end{equation}\n\\fig?给出了一个无向图的例子以及它表示的概率分布的分解。\n<!-- % fig 3.8 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter3/figures/undirected}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{关于随机变量$\\RSa, \\RSb, \\RSc, \\RSd$和$\\RSe$的无向图模型。\n这幅图对应的概率分布可以分解为\n\\begin{equation}\np(\\RSa, \\RSb, \\RSc, \\RSd, \\RSe) = \\frac{1}{Z} \\phi^{(1)} (\\RSa, \\RSb, \\RSc) \\phi^{(2)}(\\RSb, \\RSd) \\phi^{(3)} (\\RSc, \\RSe).\n\\end{equation}\n该图模型使我们能够快速看出此分布的一些性质。\n例如，$\\RSa$和$\\RSc$直接相互影响，但$\\RSa$和$\\RSe$只有通过$\\RSc$间接相互影响。}\n\\end{figure}\n\n\n<!-- % -- 75 -- -->\n\n请记住，这些图模型表示的分解仅仅是描述概率分布的一种语言。\n它们不是互相排斥的概率分布族。\n有向或者无向不是概率分布的特性；它是概率分布的一种特殊描述所具有的特性，而任何概率分布都可以用这两种方式进行描述。\n\n在本书第\\?部分和第\\?部分中， 我们仅仅将结构化概率模型视作一门语言，来描述不同的机器学习算法选择表示的直接的概率关系。\n在讨论研究课题之前，读者不需要更深入地理解结构化概率模型。\n在第\\?部分的研究课题中，我们将更为详尽地探讨结构化概率模型。\n\n本章复习了概率论中与深度学习最为相关的一些基本概念。\n我们还剩下一些基本的数学工具需要讨论：数值方法。\n\n<!-- % -- 76 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-04-Chapter4_numerical_computation.md",
    "content": "---\ntitle: 数值计算\nlayout: post\nshare: false\n---\n\n机器学习算法通常需要大量的数值计算。\n这通常是指通过迭代过程更新解的估计值来解决数学问题的算法，而不是通过解析过程推导出公式来提供正确解的方法。\n常见的操作包括优化（找到最小化或最大化函数值的参数）和线性方程组的求解。\n对数字计算机来说实数无法在有限内存下精确表示，因此仅仅是计算涉及实数的函数也是困难的。\n\n\n# 上溢和下溢\n\n连续数学在数字计算机上的根本困难是，我们需要通过有限数量的位模式来表示无限多的实数。\n这意味着我们在计算机中表示实数时，几乎总会引入一些近似误差。\n在许多情况下，这仅仅是舍入误差。\n舍入误差会导致一些问题，特别是当许多操作复合时，即使是理论上可行的算法，如果在设计时没有考虑最小化舍入误差的累积，在实践时也可能会导致算法失效。\n\n一种极具毁灭性的舍入误差是下溢。\n当接近零的数被四舍五入为零时发生下溢。\n许多函数在其参数为零而不是一个很小的正数时才会表现出质的不同。\n例如，我们通常要避免被零除（一些软件环境将在这种情况下抛出异常，有些会返回一个非数字(not-a-number, NaN)的占位符）或避免取零的对数（这通常被视为$-\\infty$，进一步的算术运算会使其变成非数字）。\n\n<!-- % -- 77 -- -->\n\n另一个极具破坏力的数值错误形式是上溢。\n当大量级的数被近似为$\\infty$或$-\\infty$时发生上溢。\n进一步的运算通常会导致这些无限值变为非数字。\n\n必须对上溢和下溢进行数值稳定的一个例子是softmax函数。\nsoftmax函数经常用于预测与~Multinoulli分布相关联的概率，定义为\n\\begin{align}\n \\text{softmax}(\\Vx)_i = \\frac{\\exp(\\Sx_i)}{\\sum_{j=1}^n \\exp(\\Sx_j)} .\n\\end{align}\n考虑一下当所有$\\Sx_i$都等于某个常数$\\Sc$时会发生什么。\n从理论分析上说，我们可以发现所有的输出都应该为$\\frac{1}{n}$。\n从数值计算上说，当$\\Sc$量级很大时，这可能不会发生。\n如果$\\Sc$是很小的负数，$\\exp(c)$就会下溢。\n这意味着~softmax函数的分母会变成0，所以最后的结果是未定义的。\n当$\\Sc$是非常大的正数时，$\\exp(c)$的上溢再次导致整个表达式未定义。\n这两个困难能通过计算$\\text{softmax}(\\Vz)$同时解决，其中$\\Vz = \\Vx - \\max_i \\Sx_i$。\n简单的代数计算表明，$\\text{softmax}$解析上的函数值不会因为从输入向量减去或加上标量而改变。\n减去$\\max_i x_i$导致$\\exp$的最大参数为$0$，这排除了上溢的可能性。\n同样地，分母中至少有一个值为1的项，这就排除了因分母下溢而导致被零除的可能性。\n\n还有一个小问题。\n分子中的下溢仍可以导致整体表达式被计算为零。\n这意味着，如果我们在计算$\\log ~\\text{softmax}(\\Vx)$时，先计算$\\text{softmax}$再把结果传给$\\log$函数，会错误地得到$-\\infty$。\n相反，我们必须实现一个单独的函数，并以数值稳定的方式计算$\\log \\text{softmax}$。\n我们可以使用相同的技巧来稳定$\\log \\text{softmax}$函数。\n\n在大多数情况下，我们没有明确地对本书描述的各种算法所涉及的数值考虑进行详细说明。\n底层库的开发者在实现深度学习算法时应该牢记数值问题。\n本书的大多数读者可以简单地依赖保证数值稳定的底层库。\n在某些情况下，我们有可能在实现一个新的算法时自动保持数值稳定。\nTheano~{cite?}就是这样软件包的一个例子，它能自动检测并稳定深度学习中许多常见的数值不稳定的表达式。\n\n<!-- % -- 78 -- -->\n\n\n# 病态条件\n\n\n条件数表征函数相对于输入的微小变化而变化的快慢程度。\n输入被轻微扰动而迅速改变的函数对于科学计算来说可能是有问题的，因为输入中的舍入误差可能导致输出的巨大变化。\n\n考虑函数$f(\\Vx) = \\MA^{-1} \\Vx$。\n当$\\MA \\in \\SetR^{n \\times n}$ 具有特征值分解时，其条件数为\n\\begin{align}\n \\underset{i,j}{\\max}~ \\Bigg| \\frac{\\lambda_i}{ \\lambda_j} \\Bigg|.\n\\end{align}\n这是最大和最小特征值的模之比\\footnote{译者注：与通常的条件数定义有所不同。}。\n当该数很大时，矩阵求逆对输入的误差特别敏感。\n\n这种敏感性是矩阵本身的固有特性，而不是矩阵求逆期间舍入误差的结果。\n即使我们乘以完全正确的矩阵逆，病态条件的矩阵也会放大预先存在的误差。\n在实践中，该错误将与求逆过程本身的数值误差进一步复合。\n\n\n\n\n# 基于梯度的优化方法\n\n\n大多数深度学习算法都涉及某种形式的优化。\n优化指的是改变$\\Vx$以最小化或最大化某个函数$f(\\Vx)$的任务。\n我们通常以最小化$f(\\Vx)$指代大多数最优化问题。\n最大化可经由最小化算法最小化$-f(\\Vx)$来实现。\n\n我们把要最小化或最大化的函数称为目标函数或准则。\n当我们对其进行最小化时，我们也把它称为代价函数、损失函数或误差函数。\n虽然有些机器学习著作赋予这些名称特殊的意义，但在这本书中我们交替使用这些术语。\n\n我们通常使用一个上标$*$表示最小化或最大化函数的$\\Vx$值。\n如我们记$\\Vx^*=\\argmin f(\\Vx)$。\n\n我们假设读者已经熟悉微积分，这里简要回顾微积分概念如何与优化联系。\n\n<!-- % -- 79 -- -->\n\n假设我们有一个函数$\\Sy = f(\\Sx)$， 其中$\\Sx$和$\\Sy$是实数。\n这个函数的导数记为$f^\\prime(x)$或$\\frac{dy}{dx}$。\n导数$f^\\prime(\\Sx)$代表$f(\\Sx)$在点$x$处的斜率。\n换句话说，它表明如何缩放输入的小变化才能在输出获得相应的变化：\n$f(\\Sx+\\epsilon) \\approx f(\\Sx) + \\epsilon f^\\prime(\\Sx) $。\n\n因此导数对于最小化一个函数很有用，因为它告诉我们如何更改$x$来略微地改善$y$。\n例如，我们知道对于足够小的$\\epsilon$来说，$f(\\Sx-\\epsilon \\text{sign}(f^\\prime(\\Sx)) )$是比$f(\\Sx)$小的。\n因此我们可以将$\\Sx$往导数的反方向移动一小步来减小$f(\\Sx)$。\n这种技术被称为梯度下降{cite?}。\n\\fig?展示了一个例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/gradient_descent_color}}\n\\fi\n\\caption{梯度下降。 \n梯度下降算法如何使用函数导数的示意图，即沿着函数的下坡方向（导数反方向）直到最小。}\n\\end{figure}\n\n<!-- % -- 80 -- -->\n\n当$f^\\prime(\\Sx)=0$，导数无法提供往哪个方向移动的信息。\n$ f^\\prime(\\Sx)=0 $的点称为临界点或驻点。\n一个局部极小点意味着这个点的$f(\\Sx)$小于所有邻近点，因此不可能通过移动无穷小的步长来减小$f(\\Sx)$。\n一个局部极大点意味着这个点的$f(\\Sx)$大于所有邻近点，因此不可能通过移动无穷小的步长来增大$f(\\Sx)$。\n有些临界点既不是最小点也不是最大点。这些点被称为鞍点。\n见\\fig?给出的各种临界点的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/critical_color}}\n\\fi\n\\caption{临界点的类型。 \n一维情况下，三种临界点的示例。\n临界点是斜率为零的点。\n这样的点可以是局部极小点，其值低于相邻点; 局部极大点，其值高于相邻点; 或鞍点，同时存在更高和更低的相邻点。\n}\n\\end{figure}\n\n使$f(x)$取得绝对的最小值（相对所有其他值）的点是全局最小点。\n函数可能只有一个全局最小点或存在多个全局最小点，\n还可能存在不是全局最优的局部极小点。\n在深度学习的背景下，我们要优化的函数可能含有许多不是最优的局部极小点，或者还有很多处于非常平坦的区域内的鞍点。\n尤其是当输入是多维的时候，所有这些都将使优化变得困难。\n因此，我们通常寻找使$f$非常小的点，但这在任何形式意义下并不一定是最小。\n见\\fig?的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/approx_opt_color}}\n\\fi\n\\caption{近似最小化。 \n当存在多个局部极小点或平坦区域时，优化算法可能无法找到全局最小点。\n在深度学习的背景下，即使找到的解不是真正最小的，但只要它们对应于代价函数显著低的值，我们通常就能接受这样的解。\n}\n\\end{figure}\n\n我们经常最小化具有多维输入的函数：$f: \\SetR^n \\rightarrow \\SetR $。 \n为了使\"最小化\"的概念有意义，输出必须是一维的(标量)。\n\n<!-- % -- 81 -- -->\n\n针对具有多维输入的函数，我们需要用到偏导数的概念。\n偏导数 $\\frac{\\partial}{\\partial \\Sx_i}f(\\Vx)$衡量点$\\Vx$处只有$x_i$增加时$f(\\Vx)$如何变化。\n梯度是相对一个向量求导的导数:$f$的梯度是包含所有偏导数的向量，记为$\\nabla_{\\Vx} f(\\Vx)$。\n梯度的第$i$个元素是$f$关于$x_i$的偏导数。\n在多维情况下，临界点是梯度中所有元素都为零的点。\n\n在$\\Vu$（单位向量）方向的方向导数是函数$f$在$\\Vu$方向的斜率。\n换句话说，方向导数是函数$f(\\Vx + \\alpha \\Vu)$关于$\\alpha$的导数（在$\\alpha = 0$时取得）。\n使用链式法则，我们可以看到当$\\alpha=0$时，$\\frac{\\partial}{\\partial \\alpha} f(\\Vx + \\alpha \\Vu) = \\Vu^\\Tsp \\nabla_{\\Vx} f(\\Vx)$。\n\n为了最小化$f$，我们希望找到使$f$下降得最快的方向。\n计算方向导数：\n\\begin{align}\n \\underset{\\Vu, \\Vu^\\Tsp\\Vu = 1}{\\min} \\Vu^\\Tsp & \\nabla_{\\Vx} f(\\Vx) \\\\\n = \\underset{\\Vu, \\Vu^\\Tsp\\Vu = 1}{\\min} \\| \\Vu \\|_2 \\| &\\nabla_{\\Vx}f(\\Vx) \\|_2 \\cos \\theta\n\\end{align}\n其中$\\theta$是$\\Vu$与梯度的夹角。\n将$ \\| \\Vu \\|_2 = 1$代入，并忽略与$\\Vu$无关的项，就能简化得到$ \\underset{\\Vu}{\\min} \\cos \\theta $。 \n这在$\\Vu$与梯度方向相反时取得最小。\n换句话说，梯度向量指向上坡，负梯度向量指向下坡。\n我们在负梯度方向上移动可以减小$f$。\n这被称为\\textbf{最速下降法}(method of steepest descent)或梯度下降。\n\n最速下降建议新的点为\n\\begin{align}\n  \\Vx' = \\Vx - \\epsilon \\nabla_{\\Vx} f(\\Vx)\n\\end{align}\n其中$\\epsilon$为学习率，是一个确定步长大小的正标量。\n我们可以通过几种不同的方式选择$\\epsilon$。\n普遍的方式是选择一个小常数。\n有时我们通过计算，选择使方向导数消失的步长。\n还有一种方法是根据几个$\\epsilon$计算$f(\\Vx - \\epsilon \\nabla_{\\Vx} f(\\Vx))$， 并选择其中能产生最小目标函数值的$\\epsilon$。\n这种策略被称为线搜索。\n\n最速下降在梯度的每一个元素为零时收敛（或在实践中，很接近零时）。\n在某些情况下，我们也许能够避免运行该迭代算法，并通过解方程$\\nabla_{\\Vx} f(\\Vx)= 0$直接跳到临界点。\n\n<!-- % -- 82 -- -->\n\n虽然梯度下降被限制在连续空间中的优化问题，但不断向更好的情况移动一小步（即近似最佳的小移动）的一般概念可以推广到离散空间。\n递增带有离散参数的目标函数被称为爬山算法{cite?}。\n\n\n## 梯度之上：Jacobian和Hessian矩阵\n\n有时我们需要计算输入和输出都为向量的函数的所有偏导数。\n包含所有这样的偏导数的矩阵被称为\\textbf{Jacobian}矩阵。\n具体来说，如果我们有一个函数：$\\Vf: \\SetR^m \\rightarrow \\SetR^n$，$\\Vf$的~Jacobian~矩阵$\\MJ \\in \\SetR^{n \\times m}$定义为$J_{i,j} = \\frac{\\partial}{\\partial \\Sx_j} f(\\Vx)_i$。\n\n有时，我们也对导数的导数感兴趣，即二阶导数。\n例如，有一个函数$f: \\SetR^m \\rightarrow \\SetR$，$f$的一阶导数(关于$\\Sx_j$)关于$x_i$的导数记为$\\frac{\\partial^2}{\\partial \\Sx_i \\partial \\Sx_j} f$。\n在一维情况下，我们可以将$\\frac{\\partial^2}{\\partial \\Sx^2} f$为$f\"(\\Sx)$。\n二阶导数告诉我们，一阶导数将如何随着输入的变化而改变。\n它表示只基于梯度信息的梯度下降步骤是否会产生如我们预期的那样大的改善，因此它是重要的。\n我们可以认为，二阶导数是对曲率的衡量。\n假设我们有一个二次函数（虽然很多实践中的函数都不是二次的，但至少在局部可以很好地用二次近似）。\n如果这样的函数具有零二阶导数，那就没有曲率。\n也就是一条完全平坦的线，仅用梯度就可以预测它的值。\n我们使用沿负梯度方向大小为$\\epsilon$的下降步，当该梯度是$1$时，代价函数将下降$\\epsilon$。\n如果二阶导数是负的，函数曲线向下凹陷(向上凸出)，因此代价函数将下降的比$\\epsilon$多。\n如果二阶导数是正的，函数曲线是向上凹陷(向下凸出)，\n因此代价函数将下降的比$\\epsilon$少。\n从\\fig?可以看出不同形式的曲率如何影响基于梯度的预测值与真实的代价函数值的关系。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/curvature_color}}\n\\fi\n\\caption{二阶导数确定函数的曲率。\n这里我们展示具有各种曲率的二次函数。\n虚线表示我们仅根据梯度信息进行梯度下降后预期的代价函数值。\n对于负曲率，代价函数实际上比梯度预测下降得更快。\n没有曲率时，梯度正确预测下降值。\n对于正曲率，函数比预期下降得更慢，并且最终会开始增加，因此太大的步骤实际上可能会无意地增加函数值。\n}\n\\end{figure}\n\n当我们的函数具有多维输入时，二阶导数也有很多。\n我们可以将这些导数合并成一个矩阵，称为\\textbf{Hessian}矩阵。\nHessian~矩阵$\\MH(f)(\\Vx)$定义为\n\\begin{align}\n \\MH(f)(\\Vx)_{i,j} = \\frac{\\partial^2}{\\partial \\Sx_i \\partial  \\Sx_j} f(\\Vx).\n\\end{align}\nHessian~等价于梯度的~Jacobian~矩阵。\n\n<!-- % -- 83 -- -->\n\n微分算子在任何二阶偏导连续的点处可交换，也就是它们的顺序可以互换：\n\\begin{align}\n \\frac{\\partial^2}{\\partial \\Sx_i \\partial \\Sx_j} f(\\Vx) = \\frac{\\partial^2}{\\partial \\Sx_j\\partial \\Sx_i} f(\\Vx) .\n\\end{align}\n这意味着$H_{i,j} = H_{j,i}$， 因此~Hessian~矩阵在这些点上是对称的。\n在深度学习背景下，我们遇到的大多数函数的~Hessian~几乎处处都是对称的。\n因为~Hessian~矩阵是实对称的，我们可以将其分解成一组实特征值和一组特征向量的正交基。\n在特定方向$\\Vd$上的二阶导数可以写成$\\Vd^\\Tsp \\MH \\Vd$。\n当$\\Vd$是$\\MH$的一个特征向量时，这个方向的二阶导数就是对应的特征值。\n对于其他的方向$\\Vd$，方向二阶导数是所有特征值的加权平均，权重在0和1之间，且与$\\Vd$夹角越小的特征向量的权重越大。\n最大特征值确定最大二阶导数，最小特征值确定最小二阶导数。\n\n<!-- % -- 84 -- -->\n\n我们可以通过（方向）二阶导数预期一个梯度下降步骤能表现得多好。\n我们在当前点$\\Vx^{(0)}$处作函数$f(\\Vx)$的近似二阶泰勒级数：\n\\begin{align}\n f(\\Vx) \\approx f(\\Vx^{(0)}) + (\\Vx - \\Vx^{(0)})^\\Tsp \\Vg + \n \\frac{1}{2}  (\\Vx - \\Vx^{(0)})^\\Tsp \\MH  (\\Vx - \\Vx^{(0)}),\n\\end{align}\n其中$\\Vg$是梯度，$\\MH$是$ \\Vx^{(0)}$点的~Hessian。\n如果我们使用学习率 $\\epsilon$，那么新的点$\\Vx$将会是$\\Vx^{(0)}-\\epsilon \\Vg$。\n代入上述的近似，可得\n\\begin{align}\n f(\\Vx^{(0)} - \\epsilon \\Vg ) \\approx f(\\Vx^{(0)})  - \\epsilon \\Vg^\\Tsp \\Vg + \\frac{1}{2} \\epsilon^2 \\Vg^\\Tsp \\MH  \\Vg.\n\\end{align}\n其中有3项：函数的原始值、函数斜率导致的预期改善、函数曲率导致的校正。\n当最后一项太大时，梯度下降实际上是可能向上移动的。\n当$\\Vg^\\Tsp \\MH  \\Vg$为零或负时，近似的泰勒级数表明增加$\\epsilon$将永远使$f$下降。\n在实践中，泰勒级数不会在$\\epsilon$大的时候也保持准确，因此在这种情况下我们必须采取更启发式的选择。\n当$\\Vg^\\Tsp \\MH  \\Vg$为正时，通过计算可得，使近似泰勒级数下降最多的最优步长为\n\\begin{align}\n \\epsilon^* = \\frac{ \\Vg^\\Tsp \\Vg}{ \\Vg^\\Tsp \\MH  \\Vg} .\n\\end{align}\n最坏的情况下，$\\Vg$与$\\MH$最大特征值$\\lambda_{\\max}$对应的特征向量对齐，则最优步长是$\\frac{1}{\\lambda_{\\max}}$。\n我们要最小化的函数能用二次函数很好地近似的情况下，Hessian~的特征值决定了学习率的量级。\n\n二阶导数还可以被用于确定一个临界点是否是局部极大点、局部极小点或鞍点。\n回想一下，在临界点处$f'(x) = 0$。\n而$f\"(x) > 0$意味着$f'(x)$会随着我们移向右边而增加，移向左边而减小，也就是 $f'(x - \\epsilon) < 0$ 和 $f'(x+\\epsilon)>0$对足够小的$\\epsilon$成立。 换句话说，当我们移向右边，斜率开始指向右边的上坡，当我们移向左边，斜率开始指向左边的上坡。\n因此我们得出结论，当$f'(x) = 0$且$f\"(x) > 0$时，$\\Vx$是一个局部极小点。\n同样，当$f'(x) = 0$且$f\"(x) < 0$时，$\\Vx$是一个局部极大点。\n这就是所谓的二阶导数测试。\n不幸的是，当$f\"(x) = 0$时测试是不确定的。\n在这种情况下，$\\Vx$可以是一个鞍点或平坦区域的一部分。\n\n<!-- % -- 85 -- -->\n\n在多维情况下，我们需要检测函数的所有二阶导数。\n利用~Hessian~的特征值分解，我们可以将二阶导数测试扩展到多维情况。\n在临界点处（$\\nabla_{\\Vx} f(\\Vx) = 0$），我们通过检测~Hessian~的特征值来判断该临界点是一个局部极大点、局部极小点还是鞍点。\n当~Hessian~是正定的（所有特征值都是正的），则该临界点是局部极小点。\n因为方向二阶导数在任意方向都是正的，参考单变量的二阶导数测试就能得出此结论。\n同样的，当~Hessian~是负定的（所有特征值都是负的），这个点就是局部极大点。\n在多维情况下，实际上我们可以找到确定该点是否为鞍点的积极迹象（某些情况下）。\n如果~Hessian~的特征值中至少一个是正的且至少一个是负的，那么$\\Vx$是$f$某个横截面的局部极大点，却是另一个横截面的局部极小点。\n见\\fig?中的例子。\n最后，多维二阶导数测试可能像单变量版本那样是不确定的。\n当所有非零特征值是同号的且至少有一个特征值是$0$时，这个检测就是不确定的。\n这是因为单变量的二阶导数测试在零特征值对应的横截面上是不确定的。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/saddle_3d_color}}\n\\fi\n\\caption{既有正曲率又有负曲率的鞍点。\n示例中的函数是$f(\\Vx) = x_1^2 - x_2^2$。\n函数沿$x_1$轴向上弯曲。\n$x_1$轴是~Hessian~的一个特征向量，并且具有正特征值。\n函数沿$x_2$轴向下弯曲。\n该方向对应于~Hessian~负特征值的特征向量。\n名称\"鞍点\"源自该处函数的鞍状形状。\n这是具有鞍点函数的典型示例。\n维度多于一个时，鞍点不一定要具有0特征值：仅需要同时具有正特征值和负特征值。\n我们可以想象这样一个鞍点（具有正负特征值）在一个横截面内是局部极大点，而在另一个横截面内是局部极小点。\n}\n\\end{figure}\n\n多维情况下，单个点处每个方向上的二阶导数是不同。\nHessian~的条件数衡量这些二阶导数的变化范围。\n当~Hessian~的条件数很差时，梯度下降法也会表现得很差。\n这是因为一个方向上的导数增加得很快，而在另一个方向上增加得很慢。\n梯度下降不知道导数的这种变化，所以它不知道应该优先探索导数长期为负的方向。\n病态条件也导致很难选择合适的步长。\n步长必须足够小，以免冲过最小而向具有较强正曲率的方向上升。\n这通常意味着步长太小，以致于在其他较小曲率的方向上进展不明显。\n见\\fig?的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter4/figures/poor_conditioning_color}}\n\\fi\n\\caption{梯度下降无法利用包含在~Hessian~矩阵中的曲率信息。\n这里我们使用梯度下降来最小化~Hessian~矩阵条件数为5的二次函数$f(\\Vx)$。\n这意味着最大曲率方向具有比最小曲率方向多五倍的曲率。\n在这种情况下，最大曲率在$[1,1]^\\top$方向上，最小曲率在$[1,-1]^\\top$方向上。\n红线表示梯度下降的路径。\n这个非常细长的二次函数类似一个长峡谷。\n梯度下降把时间浪费于在峡谷壁反复下降，因为它们是最陡峭的特征。\n由于步长有点大，有超过函数底部的趋势，因此需要在下一次迭代时在对面的峡谷壁下降。\n与指向该方向的特征向量对应的~Hessian~的大的正特征值表示该方向上的导数快速增加，因此基于~Hessian~的优化算法可以预测，在此情况下最陡峭方向实际上不是有前途的搜索方向。\n}\n\\end{figure}\n\n<!-- % -- 86 -- -->\n\n我们可以使用~Hessian~矩阵的信息来指导搜索，以解决这个问题。\n其中最简单的方法是牛顿法。\n牛顿法基于一个二阶泰勒展开来近似$\\Vx^{(0)}$附近的$f(\\Vx)$：\n\\begin{align}\n f(\\Vx) \\approx f(\\Vx^{(0)}) + (\\Vx - \\Vx^{(0)})^\\Tsp \\nabla_{\\Vx} f(\\Vx^{(0)}) + \n \\frac{1}{2}  (\\Vx - \\Vx^{(0)})^\\Tsp \\MH(f)(\\Vx^{(0)})  (\\Vx - \\Vx^{(0)}).\n\\end{align}\n接着通过计算，我们可以得到这个函数的临界点：\n \\Vx^* =  \\Vx^{(0)} -  \\MH(f)(\\Vx^{(0)})^{-1}  \\nabla_{\\Vx} f(\\Vx^{(0)}) .\n\\end{align}\n当$f$是一个正定二次函数时，牛顿法只要应用一次\\eqn?就能直接跳到函数的最小点。\n如果$f$不是一个真正二次但能在局部近似为正定二次，牛顿法则需要多次迭代应用\\eqn?。\n迭代地更新近似函数和跳到近似函数的最小点可以比梯度下降更快地到达临界点。\n这在接近局部极小点时是一个特别有用的性质，但是在鞍点附近是有害的。\n如\\eqn?所讨论的，当附近的临界点是最小点（Hessian~的所有特征值都是正的）时牛顿法才适用，而梯度下降不会被吸引到鞍点(除非梯度指向鞍点)。\n\n仅使用梯度信息的优化算法被称为\\,\\textbf{一阶优化算法}(first-order optimization algorithms)，如梯度下降。\n使用~Hessian~矩阵的优化算法被称为\\,\\textbf{二阶最优化算法}(second-order optimization algorithms){cite?}，如牛顿法。\n\n在本书大多数上下文中使用的优化算法适用于各种各样的函数，但几乎都没有保证。\n因为在深度学习中使用的函数族是相当复杂的，所以深度学习算法往往缺乏保证。\n在许多其他领域，优化的主要方法是为有限的函数族设计优化算法。\n\n在深度学习的背景下，限制函数满足Lipschitz连续或其导数Lipschitz连续可以获得一些保证。\nLipschitz~连续函数的变化速度以Lipschitz常数 $\\CalL$为界：\n\\begin{align}\n \\forall \\Vx,~\\forall \\Vy, ~| f(\\Vx) - f(\\Vy)|  \\leq \\CalL \\| \\Vx - \\Vy \\|_2 .\n\\end{align}\n这个属性允许我们量化我们的假设——梯度下降等算法导致的输入的微小变化将使输出只产生微小变化，因此是很有用的。\nLipschitz~连续性也是相当弱的约束，并且深度学习中很多优化问题经过相对较小的修改后就能变得~Lipschitz连续。\n\n<!-- % -- 88 -- -->\n\n最成功的特定优化领域或许是凸优化。\n凸优化通过更强的限制提供更多的保证。\n凸优化算法只对凸函数适用，即~Hessian~处处半正定的函数。\n因为这些函数没有鞍点而且其所有局部极小点必然是全局最小点，所以表现很好。\n然而，深度学习中的大多数问题都难以表示成凸优化的形式。\n凸优化仅用作一些深度学习算法的子程序。\n凸优化中的分析思路对证明深度学习算法的收敛性非常有用，然而一般来说，深度学习背景下凸优化的重要性大大减少。 \n有关凸优化的详细信息，详见~{Boyd04}或~{rockafellar1997convex}。\n\n\n\n# 约束优化\n\n有时候，在$\\Vx$的所有可能值下最大化或最小化一个函数$f(x)$不是我们所希望的。\n相反，我们可能希望在$\\Vx$的某些集合$\\SetS$中找$f(\\Vx)$的最大值或最小值。\n这被称为约束优化。\n在约束优化术语中，集合$\\SetS$内的点$\\Vx$被称为可行点。\n\n我们常常希望找到在某种意义上小的解。\n针对这种情况下的常见方法是强加一个范数约束，如$\\| \\Vx \\| \\leq 1$。\n\n约束优化的一个简单方法是将约束考虑在内后简单地对梯度下降进行修改。\n如果我们使用一个小的恒定步长$\\epsilon$，我们可以先取梯度下降的单步结果，然后将结果投影回$\\SetS$。\n如果我们使用线搜索，我们只能在步长为$\\epsilon$范围内搜索可行的新$\\Vx$点，或者我们可以将线上的每个点投影到约束区域。\n如果可能的话，在梯度下降或线搜索前将梯度投影到可行域的切空间会更高效{cite?}。\n\n一个更复杂的方法是设计一个不同的、无约束的优化问题，其解可以转化成原始约束优化问题的解。\n例如，我们要在$\\Vx \\in \\SetR^2$中最小化$f(\\Vx)$，其中$\\Vx$约束为具有单位$L^2$范数。\n我们可以关于$\\theta$最小化$g(\\theta) = f([\\cos \\theta, \\sin \\theta]^\\Tsp)$，最后返回$[\\cos \\theta, \\sin \\theta]$作为原问题的解。\n这种方法需要创造性；优化问题之间的转换必须专门根据我们遇到的每一种情况进行设计。\n\n<!-- % -- 89 --  -->\n\nKarush–Kuhn–Tucker方法\\footnote{KKT~方法是\\textbf{Lagrange乘子法}（只允许等式约束）的推广。}是针对约束优化非常通用的解决方案。\n为介绍KKT方法，我们引入一个称为广义Lagrangian或广义Lagrange函数的新函数。\n\n为了定义Lagrangian，我们先要通过等式和不等式的形式描述$\\SetS$。 \n我们希望通过$m$个函数$g^{(i)}$和$n$个函数$h^{(j)}$描述$\\SetS$，那么$\\SetS$可以表示为$\\SetS = \\{ \\Vx \\mid \\forall i, g^{(i)}(\\Vx) = 0 ~\\text{and}~ \\forall j, h^{(j)}(\\Vx) \\leq 0  \\}$。\n其中涉及$g^{(i)}$的等式称为等式约束，涉及$h^{(j)}$的不等式称为不等式约束。\n\n我们为每个约束引入新的变量$\\lambda_i$和$\\alpha_j$，这些新变量被称为~KKT~乘子。广义Lagrangian~可以如下定义：\n\\begin{align}\n L(\\Vx, \\Vlambda, \\Valpha) = f(\\Vx) + \\sum_i \\lambda_i g^{(i)}(\\Vx)  + \\sum_j \\alpha_j h^{(j)}(\\Vx).\n\\end{align}\n\n现在，我们可以通过优化无约束的广义Lagrangian~解决约束最小化问题。\n只要存在至少一个可行点且$f(\\Vx)$不允许取$\\infty$，那么\n\\begin{align}\n \\underset{\\Vx}{\\min}~  \\underset{\\Vlambda}{\\max}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha) \n\\end{align}\n与如下函数有相同的最优目标函数值和最优点集$\\Vx$\n\\begin{align}\n \\underset{\\Vx \\in \\SetS}{\\min}~ f(\\Vx).\n\\end{align}\n这是因为当约束满足时，\n\\begin{align}\n  \\underset{\\Vlambda}{\\max}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha)  = f(\\Vx) ,\n\\end{align}\n而违反任意约束时，\n\\begin{align}\n  \\underset{\\Vlambda}{\\max}  \n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha)  = \\infty .\n\\end{align}\n这些性质保证不可行点不会是最佳的，并且可行点范围内的最优点不变。\n\n<!-- % -- 90 -- -->\n\n要解决约束最大化问题，我们可以构造$-f(\\Vx)$的广义Lagrange函数，从而导致以下优化问题：\n\\begin{align}\n \\underset{\\Vx}{\\min}~ \\underset{\\Vlambda}{\\max}  ~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max} \n  -f(\\Vx) + \\sum_i \\lambda_i g^{(i)}(\\Vx)  + \\sum_j \\alpha_j h^{(j)}(\\Vx).\n\\end{align}\n我们也可将其转换为在外层最大化的问题：\n\\begin{align}\n \\underset{\\Vx}{\\max}~ \\underset{\\Vlambda}{\\min}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\min} \n  f(\\Vx) + \\sum_i \\lambda_i g^{(i)}(\\Vx) - \\sum_j \\alpha_j h^{(j)}(\\Vx).\n\\end{align}\n等式约束对应项的符号并不重要；因为优化可以自由选择每个$\\lambda_i$的符号，我们可以随意将其定义为加法或减法。\n\n不等式约束特别有趣。\n如果$h^{(i)}(\\Vx^*)= 0$，我们就说这个约束$h^{(i)}(\\Vx)$是\\textbf{活跃}(active)的。\n如果约束不是活跃的，则有该约束的问题的解与去掉该约束的问题的解至少存在一个相同的局部解。\n一个不活跃约束有可能排除其他解。\n例如，整个区域（代价相等的宽平区域）都是全局最优点的凸问题可能因约束消去其中的某个子区域，或在非凸问题的情况下，收敛时不活跃的约束可能排除了较好的局部驻点。\n然而，无论不活跃的约束是否被包括在内，收敛时找到的点仍然是一个驻点。\n因为一个不活跃的约束$h^{(i)}$必有负值，那么$\n \\underset{\\Vx}{\\min}~  \\underset{\\Vlambda}{\\max}~\n \\underset{\\Valpha, \\Valpha \\geq 0}{\\max}   L(\\Vx, \\Vlambda, \\Valpha) \n$中的$\\alpha_i = 0$。\n因此，我们可以观察到在该解中$\\Valpha \\odot \\Vh(\\Vx) = 0$。\n换句话说，对于所有的$i$， $\\alpha_i \\geq 0$或$ h^{(j)}(\\Vx) \\leq 0$在收敛时必有一个是活跃的。\n为了获得关于这个想法的一些直观解释，我们可以说这个解是由不等式强加的边界，我们必须通过对应的~KKT~乘子影响$\\Vx$的解，或者不等式对解没有影响，我们则归零~KKT~乘子。\n\n我们可以使用一组简单的性质来描述约束优化问题的最优点。\n这些性质称为Karush–Kuhn–Tucker条件{cite?}。\n这些是确定一个点是最优点的必要条件，但不一定是充分条件。\n这些条件是：\n\n+ 广义Lagrangian~的梯度为零。\n+ 所有关于$\\Vx$和~KKT~乘子的约束都满足。\n+ 不等式约束显示的\"互补松弛性\"：$\\Valpha \\odot \\Vh(\\Vx) = 0$。\n\n有关~KKT~方法的详细信息，请参阅~{NumOptBook}。\n\n<!-- % -- 91 -- -->\n\n\n# 实例：线性最小二乘\n\n假设我们希望找到最小化下式的$\\Vx$值\n\\begin{align}\n f(\\Vx) = \\frac{1}{2}\\| \\MA \\Vx - \\Vb \\|_2^2 .\n\\end{align}\n存在专门的线性代数算法能够高效地解决这个问题；但是，我们也可以探索如何使用基于梯度的优化来解决这个问题，这可以作为这些技术是如何工作的一个简单例子。\n\n首先，我们计算梯度：\n\\begin{align}\n \\nabla_{\\Vx} f(\\Vx) = \\MA^\\Tsp (\\MA \\Vx - \\Vb) = \\MA^\\Tsp \\MA \\Vx - \\MA^\\Tsp \\Vb .\n\\end{align}\n\n然后，我们可以采用小的步长，并按照这个梯度下降。见\\alg?中的详细信息。\n\n\\begin{algorithm}[ht]\n\\caption{从任意点$\\Vx$开始，使用梯度下降关于$\\Vx$最小化\n$ f(\\Vx) = \\frac{1}{2} || \\MA \\Vx - \\Vb ||_2^2$的算法。\n}\n\\begin{algorithmic}\n\\STATE 将步长 ($\\epsilon$) 和容差 ($\\delta$)设为小的正数。\n\\WHILE{ $ || \\MA^\\top \\MA \\Vx - \\MA^\\top \\Vb ||_2 > \\delta $}\n\\STATE $\\Vx \\leftarrow \\Vx - \\epsilon \\left( \\MA^\\top \\MA \\Vx - \\MA^\\top \\Vb \\right)$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n我们也可以使用牛顿法解决这个问题。\n因为在这个情况下，真实函数是二次的，牛顿法所用的二次近似是精确的，该算法会在一步后收敛到全局最小点。\n\n现在假设我们希望最小化同样的函数，但受 $\\Vx^\\Tsp \\Vx \\leq 1$ 的约束。 \n要做到这一点，我们引入~Lagrangian\n\\begin{align}\n L(\\Vx, \\lambda) = f(\\Vx) + \\lambda (\\Vx^\\Tsp \\Vx - 1).\n\\end{align}\n现在，我们解决以下问题\n\\begin{align}\n  \\underset{\\Vx}{\\min}~\n \\underset{\\lambda, \\lambda \\geq 0}{\\max}~ L(\\Vx, \\lambda) .\n\\end{align}\n\n<!-- % -- 92 -- -->\n\n我们可以用~Moore-Penrose~伪逆：$\\Vx = \\MA^+ \\Vb$找到无约束最小二乘问题的最小范数解。\n如果这一点是可行，那么这也是约束问题的解。\n否则，我们必须找到约束是活跃的解。\n关于$\\Vx$对~Lagrangian~微分，我们得到方程\n\\begin{align}\n \\MA^\\Tsp \\MA \\Vx - \\MA^\\Tsp \\Vb + 2 \\lambda \\Vx = 0.\n\\end{align}\n这就告诉我们，该解的形式将会是\n\\begin{align}\n\\Vx =  (\\MA^\\Tsp \\MA + 2 \\lambda \\MI )^{-1} \\MA^\\Tsp \\Vb.\n\\end{align}\n$\\lambda$的选择必须使结果服从约束。\n我们可以关于$\\lambda$进行梯度上升找到这个值。\n为了做到这一点，观察\n\\begin{align}\n \\frac{\\partial}{\\partial \\lambda} L(\\Vx, \\lambda)  = \\Vx^\\Tsp \\Vx - 1.\n\\end{align}\n当$\\Vx$的范数超过1时，该导数是正的，所以为了跟随导数上坡并相对$\\lambda$增加~Lagrangian，我们需要增加$\\lambda$。\n因为$\\Vx^\\Tsp \\Vx$的惩罚系数增加了，求解关于$\\Vx$的线性方程现在将得到具有较小范数的解。\n求解线性方程和调整$\\lambda$的过程将一直持续到$\\Vx$具有正确的范数并且关于$\\lambda$的导数是$0$。\n\n本章总结了开发机器学习算法所需的数学基础。\n现在，我们已经准备好建立和分析一些成熟的学习系统。\n\n<!-- % -- 93 -- -->\n\n\n"
  },
  {
    "path": "docs/_posts/2016-12-05-Chapter5_machine_learning_basics.md",
    "content": "---\ntitle: 机器学习基础\nlayout: post\nshare: false\n---\n深度学习是机器学习的一个特定分支。\n我们要想充分理解深度学习，必须对机器学习的基本原理有深刻的理解。\n本章将探讨贯穿本书其余部分的一些机器学习重要原理。\n我们建议新手读者或是希望更全面了解的读者参考一些更全面覆盖基础知识的机器学习参考书，例如~{MurphyBook2012}或者~{bishop-book2006}。\n如果你已经熟知机器学习，可以跳过前面的部分，前往\\sec?。\n\\sec?涵盖了一些传统机器学习技术观点，这些技术对深度学习的发展有着深远影响。\n\n首先，我们将介绍学习算法的定义，并介绍一个简单的示例：线性回归算法。\n接下来，我们会探讨拟合训练数据与寻找能够泛化到新数据的模式存在哪些不同的挑战。\n大部分机器学习算法都有\\emph{超参数}（必须在学习算法外设定）；我们将探讨如何使用额外的数据设置超参数。\n机器学习本质上属于应用统计学，更多地关注于如何用计算机统计地估计复杂函数，不太关注为这些函数提供置信区间；因此我们会探讨两种统计学的主要方法：频率派估计和贝叶斯推断。\n大部分机器学习算法可以分成监督学习和无监督学习两类；我们将探讨不同的分类，并为每类提供一些简单的机器学习算法作为示例。\n大部分深度学习算法都是基于被称为随机梯度下降的算法求解的。\n我们将介绍如何组合不同的算法部分，例如优化算法、代价函数、模型和数据集，来建立一个机器学习算法。\n最后在\\sec?，我们会介绍一些限制传统机器学习泛化能力的因素。\n这些挑战促进了解决这些问题的深度学习算法的发展。\n\n<!-- % -- 95 -- -->\n\n\n# 学习算法\n\n机器学习算法是一种能够从数据中学习的算法。\n然而，我们所谓的\"学习\"是什么意思呢？\n{Mitchell:1997:ML}提供了一个简洁的定义：\"对于某类任务$T$和性能度量 $P$，一个计算机程序被认为可以从经验 $E$中学习是指，通过经验 $E$改进后，它在任务$T$上由性能度量 $P$衡量的性能有所提升。\"\n经验 $E$，任务$T$和性能度量 $P$的定义范围非常宽广，在本书中我们并不会试图去解释这些定义的具体意义。\n相反，我们会在接下来的章节中提供直观的解释和示例来介绍不同的任务、性能度量和经验，这些将被用来构建机器学习算法。\n\n\n## 任务 $T$\n\n机器学习可以让我们解决一些人为设计和使用确定性程序很难解决的问题。\n从科学和哲学的角度来看，机器学习受到关注是因为提高我们对机器学习的认识需要提高我们对智能背后原理的理解。\n\n\n从\"任务\"的相对正式的定义上说，学习过程本身不能算是任务。\n学习是我们所谓的获取完成任务的能力。\n例如，我们的目标是使机器人能够行走，那么行走便是任务。\n我们可以编程让机器人学会如何行走，或者可以人工编写特定的指令来指导机器人如何行走。\n\n\n通常机器学习任务定义为机器学习系统应该如何处理样本。\n样本是指我们从某些希望机器学习系统处理的对象或事件中收集到的已经量化的特征的集合。\n我们通常会将样本表示成一个向量$\\Vx\\in\\SetR^n$，其中向量的每一个元素$x_i$是一个特征。\n例如，一张图片的特征通常是指这张图片的像素值。\n\n<!-- % -- 96 -- -->\n\n机器学习可以解决很多类型的任务。\n一些非常常见的机器学习任务列举如下：\n\n+ \\textbf{分类}：\n    在这类任务中，计算机程序需要指定某些输入属于$k$类中的哪一类。\n    为了完成这个任务，学习算法通常会返回一个函数$f:\\SetR^n \\to \\{1,\\dots,k\\}$。\n    当$y=f(\\Vx)$时，模型将向量$\\Vx$所代表的输入分类到数字码$y$所代表的类别。\n    还有一些其他的分类问题，例如，$f$输出的是不同类别的概率分布。\n    分类任务中有一个任务是对象识别，其中输入是图片（通常由一组像素亮度值表示），输出是表示图片物体的数字码。\n    例如，Willow Garage PR2机器人能像服务员一样识别不同饮料，并送给点餐的顾客{cite?}。\n    目前，最好的对象识别工作正是基于深度学习的{cite?}。\n    对象识别同时也是计算机识别人脸的基本技术，可用于标记相片合辑中的人脸{cite?}，有助于计算机更自然地与用户交互。\n    \n+ \\textbf{输入缺失分类}：\n    当输入向量的每个度量不被保证的时候，分类问题将会变得更有挑战性。\n    为了解决分类任务，学习算法只需要定义\\emph{一个}从输入向量映射到输出类别的函数。\n    当一些输入可能丢失时，学习算法必须学习\\emph{一组}函数，而不是单个分类函数。\n    每个函数对应着分类具有不同缺失输入子集的$\\Vx$。\n    这种情况在医疗诊断中经常出现，因为很多类型的医学测试是昂贵的，对身体有害的。\n    有效地定义这样一个大集合函数的方法是学习所有相关变量的概率分布，然后通过边缘化缺失变量来解决分类任务。 \n    使用$n$个输入变量，我们现在可以获得每个可能的缺失输入集合所需的所有$2^n$个不同的分类函数，但是计算机程序仅需要学习一个描述联合概率分布的函数。\n    参见~{Goodfellow-et-al-NIPS2013}了解以这种方式将深度概率模型应用于这类任务的示例。 \n    本节中描述的许多其他任务也可以推广到缺失输入的情况; 缺失输入分类只是机器学习能够解决的问题的一个示例。\n    \n<!-- % -- 97 -- -->\n\n+ \\textbf{回归}：在这类任务中，计算机程序需要对给定输入预测数值。\n    为了解决这个任务，学习算法需要输出函数$f:\\SetR^n \\to \\SetR$。\n    除了返回结果的形式不一样外，这类问题和分类问题是很像的。\n    这类任务的一个示例是预测投保人的索赔金额（用于设置保险费），或者预测证券未来的价格。\n    这类预测也用在算法交易中。\n    \n+ \\textbf{转录}：\n    这类任务中，机器学习系统观测一些相对非结构化表示的数据，并转录信息为离散的文本形式。\n    例如，光学字符识别要求计算机程序根据文本图片返回文字序列（ASCII码或者Unicode码）。\n    谷歌街景以这种方式使用深度学习处理街道编号{cite?}。\n    另一个例子是语音识别，计算机程序输入一段音频波形，输出一序列音频记录中所说的字符或单词ID的编码。\n    深度学习是现代语音识别系统的重要组成部分，被各大公司广泛使用，包括微软，IBM和谷歌{cite?}。\n\n+ \\textbf{机器翻译}：在机器翻译任务中，输入是一种语言的符号序列，计算机程序必须将其转化成另一种语言的符号序列。\n    这通常适用于自然语言，如将英语译成法语。\n    最近，深度学习已经开始在这个任务上产生重要影响{cite?}。\n\n+ \\textbf{结构化输出}：结构化输出任务的输出是向量或者其他包含多个值的数据结构，并且构成输出的这些不同元素间具有重要关系。\n    这是一个很大的范畴，包括上述转录任务和翻译任务在内的很多其他任务。\n    例如语法分析——映射自然语言句子到语法结构树，并标记树的节点为动词、名词、副词等等。\n    参考~{Collobert-AISTATS2011}将深度学习应用到语法分析的示例。\n    另一个例子是图像的像素级分割，将每一个像素分配到特定类别。\n    例如，深度学习可用于标注航拍照片中的道路位置{cite?}。\n    在这些标注型的任务中，输出的结构形式不需要和输入尽可能相似。\n    例如，在为图片添加描述的任务中，计算机程序观察到一幅图，输出描述这幅图的自然语言句子{cite?}。\n    这类任务被称为\\emph{结构化输出任务}是因为输出值之间内部紧密相关。\n    例如，为图片添加标题的程序输出的单词必须组合成一个通顺的句子。\n\n<!-- % -- 98 -- -->\n\n+ \\textbf{异常检测}：在这类任务中，计算机程序在一组事件或对象中筛选，并标记不正常或非典型的个体。\n    异常检测任务的一个示例是信用卡欺诈检测。\n    通过对你的购买习惯建模，信用卡公司可以检测到你的卡是否被滥用。\n    如果窃贼窃取你的信用卡或信用卡信息，窃贼采购物品的分布通常和你的不同。\n    当该卡发生了不正常的购买行为时，信用卡公司可以尽快冻结该卡以防欺诈。\n    参考~{chandola2009anomaly}了解欺诈检测方法。\n\n+ \\textbf{合成和采样}：在这类任务中，机器学习程序生成一些和训练数据相似的新样本。\n    通过机器学习，合成和采样可能在媒体应用中非常有用，可以避免艺术家大量昂贵或者乏味费时的手动工作。\n    例如，视频游戏可以自动生成大型物体或风景的纹理，而不是让艺术家手动标记每个像素{cite?}。\n    在某些情况下，我们希望采样或合成过程可以根据给定的输入生成一些特定类型的输出。\n    例如，在语音合成任务中，我们提供书写的句子，要求程序输出这个句子语音的音频波形。\n    这是一类\\emph{结构化输出任务}，但是多了每个输入并非只有一个正确输出的条件，并且我们明确希望输出有很多变化，这可以使结果看上去更加自然和真实。\n\n+ \\textbf{缺失值填补}：在这类任务中，机器学习算法给定一个新样本 $\\Vx\\in\\SetR^n$，$\\Vx$中某些元素$x_i$缺失。\n    算法必须填补这些缺失值。\n\n<!-- % -- 99 -- -->\n\n+ \\textbf{去噪}：在这类任务中，机器学习算法的输入是，\\emph{干净样本}~$\\Vx \\in \\SetR^n$经过未知损坏过程后得到的\\emph{损坏样本}~$\\tilde{\\Vx} \\in \\SetR^n$。\n    算法根据损坏后的样本 $\\tilde{\\Vx}$预测干净的样本 $\\Vx$，或者更一般地预测条件概率分布$p(\\Vx\\mid\\tilde{\\Vx})$。\n    \n+ \\textbf{密度估计}或\\textbf{概率质量函数估计}：在密度估计问题中，机器学习算法学习函数$p_{\\text{model}}:\\SetR^n \\to \\SetR$，其中$p_{\\text{model}}(\\Vx)$可以解释成样本采样空间的概率密度函数（如果$\\RVx$是连续的）或者概率质量函数（如果$\\RVx$是离散的）。\n    要做好这样的任务（当我们讨论性能度量 $P$时，我们会明确定义任务是什么），算法需要学习观测到的数据的结构。\n    算法必须知道什么情况下样本聚集出现，什么情况下不太可能出现。\n    以上描述的大多数任务都要求学习算法至少能隐式地捕获概率分布的结构。\n    密度估计可以让我们显式地捕获该分布。\n    原则上，我们可以在该分布上计算以便解决其他任务。\n    例如，如果我们通过密度估计得到了概率分布$p(\\Vx)$，我们可以用该分布解决缺失值填补任务。\n    如果$x_i$的值是缺失的，但是其他的变量值$\\Vx_{-i}$已知，那么我们可以得到条件概率分布$p(x_i\\mid\\Vx_{-i})$。\n    实际情况中，密度估计并不能够解决所有这类问题，因为在很多情况下$p(\\Vx)$是难以计算的。\n\n\n当然，还有很多其他同类型或其他类型的任务。\n这里我们列举的任务类型只是用来介绍机器学习可以做哪些任务，并非严格地定义机器学习任务分类。\n\n\n## 性能度量 $P$\n\n为了评估机器学习算法的能力，我们必须设计其性能的定量度量。\n通常性能度量 $P$是特定于系统执行的任务$T$而言的。\n\n对于诸如分类、缺失输入分类和转录任务，我们通常度量模型的准确率。\n准确率是指该模型输出正确结果的样本比率。\n我们也可以通过错误率得到相同的信息。\n错误率是指该模型输出错误结果的样本比率。\n我们通常把错误率称为$0-1$损失的期望。\n在一个特定的样本上，如果结果是对的，那么$0-1$损失是$0$；否则是$1$。\n但是对于密度估计这类任务而言，度量准确率，错误率或者其他类型的$0-1$损失是没有意义的。\n反之，我们必须使用不同的性能度量，使模型对每个样本都输出一个连续数值的得分。\n最常用的方法是输出模型在一些样本上概率对数的平均值。\n\n\n<!-- % -- 100 -- -->\n\n通常，我们会更加关注机器学习算法在未观测数据上的性能如何，因为这将决定其在实际应用中的性能。\n因此，我们使用测试集数据来评估系统性能，将其与训练机器学习系统的训练集数据分开。\n\n\n性能度量的选择或许看上去简单且客观，但是选择一个与系统理想表现对应的性能度量通常是很难的。\n\n\n在某些情况下，这是因为很难确定应该度量什么。\n例如，在执行转录任务时，我们是应该度量系统转录整个序列的准确率，还是应该用一个更细粒度的指标，对序列中正确的部分元素以正面评价？\n在执行回归任务时，我们应该更多地惩罚频繁犯一些中等错误的系统，还是较少犯错但是犯很大错误的系统？\n这些设计的选择取决于应用。\n\n\n还有一些情况，我们知道应该度量哪些数值，但是度量它们不太现实。\n这种情况经常出现在密度估计中。\n很多最好的概率模型只能隐式地表示概率分布。\n在许多这类模型中，计算空间中特定点的概率是不可行的。\n在这些情况下，我们必须设计一个仍然对应于设计对象的替代标准，或者设计一个理想标准的良好近似。\n\n\n## 经验 $E$\n\n根据学习过程中的不同经验，机器学习算法可以大致分类为无监督算法和监督算法。\n\n本书中的大部分学习算法可以被理解为在整个数据集上获取经验。\n数据集是指很多样本组成的集合，如\\sec?所定义的。\n有时我们也将样本称为数据点。\n\n<!-- % -- 101 -- -->\n\nIris（鸢尾花卉）数据集~{cite?}是统计学家和机器学习研究者使用了很久的数据集。\n它是$150$个鸢尾花卉植物不同部分测量结果的集合。\n每个单独的植物对应一个样本。\n每个样本的特征是该植物不同部分的测量结果：萼片长度、萼片宽度、花瓣长度和花瓣宽度。\n这个数据集也记录了每个植物属于什么品种，其中共有三个不同的品种。\n\n无监督学习算法训练含有很多特征的数据集，然后学习出这个数据集上有用的结构性质。\n在深度学习中，我们通常要学习生成数据集的整个概率分布，显式地，比如密度估计，或是隐式地，比如合成或去噪。\n还有一些其他类型的无监督学习任务，例如聚类，将数据集分成相似样本的集合。\n\n监督学习算法训练含有很多特征的数据集，不过数据集中的样本都有一个标签或目标。\n例如，Iris~数据集注明了每个鸢尾花卉样本属于什么品种。\n监督学习算法通过研究Iris~数据集，学习如何根据测量结果将样本划分为三个不同品种。\n\n大致说来，无监督学习涉及到观察随机向量$\\RVx$的好几个样本，试图显式或隐式地学习出概率分布$p(\\RVx)$，或者是该分布一些有意思的性质；\n而监督学习包含观察随机向量$\\RVx$及其相关联的值或向量$\\RVy$，然后从$\\RVx$预测$\\RVy$，通常是估计$p(\\RVy\\mid\\RVx)$。\n术语监督学习源自这样一个视角，教员或者老师提供目标 $\\RVy$给机器学习系统，指导其应该做什么。\n在无监督学习中，没有教员或者老师，算法必须学会在没有指导的情况下理解数据。\n\n无监督学习和监督学习不是严格定义的术语。\n它们之间界线通常是模糊的。\n很多机器学习技术可以用于这两个任务。\n例如，概率的链式法则表明对于向量$\\RVx\\in\\SetR^n$，联合分布可以分解成\n\\begin{equation}\n    p(\\RVx) = \\prod_{i=1}^n p(\\RSx_i \\mid \\RSx_1,\\dots,\\RSx_{i-1}) .\n\\end{equation}\n该分解意味着我们可以将其拆分成$n$个监督学习问题，来解决表面上的无监督学习 $p(\\Vx)$。\n另外，我们求解监督学习问题$p(y\\mid\\RVx)$时，也可以使用传统的无监督学习策略学习联合分布$p(\\RVx,y)$，然后推断\n\\begin{equation}\n    p(y\\mid\\RVx) = \\frac{p(\\RVx,y)}{\\sum_{y'}p(\\RVx,y')}.\n\\end{equation}\n尽管无监督学习和监督学习并非完全没有交集的正式概念，它们确实有助于粗略分类我们研究机器学习算法时遇到的问题。\n传统地，人们将回归、分类或者结构化输出问题称为监督学习。\n支持其他任务的密度估计通常被称为无监督学习。\n\n<!-- % -- 102 -- -->\n\n学习范式的其他变种也是有可能的。\n例如，半监督学习中，一些样本有监督目标，但其他样本没有。\n在多实例学习中，样本的整个集合被标记为含有或者不含有该类的样本，但是集合中单独的样本是没有标记的。\n参考~{Kotzias2015}了解最近深度模型进行多实例学习的示例。\n\n有些机器学习算法并不是训练于一个固定的数据集上。\n例如，强化学习算法会和环境进行交互，所以学习系统和它的训练过程会有反馈回路。\n这类算法超出了本书的范畴。\n请参考~{Sutton+Barto-98}或~{Bertsekas+Tsitsiklis-book1996}了解强化学习相关知识，{Deepmind-atari-arxiv2013}介绍了强化学习方向的深度学习方法。\n\n大部分机器学习算法简单地训练于一个数据集上。\n数据集可以用很多不同方式来表示。\n在所有的情况下，数据集都是样本的集合，而样本是特征的集合。\n\n表示数据集的常用方法是设计矩阵。\n设计矩阵的每一行包含一个不同的样本。\n每一列对应不同的特征。\n例如，Iris~数据集包含$150$个样本，每个样本有4个特征。\n这意味着我们可以将该数据集表示为设计矩阵 $\\MX\\in\\SetR^{150\\times 4}$，其中$X_{i,1}$表示第$i$个植物的萼片长度，$X_{i,2}$表示第$i$个植物的萼片宽度等等。\n我们在本书中描述的大部分学习算法都是讲述它们是如何运行在设计矩阵数据集上的。\n\n当然，每一个样本都能表示成向量，并且这些向量的维度相同，才能将一个数据集表示成设计矩阵。\n这一点并非永远可能。\n例如，你有不同宽度和高度的照片的集合，那么不同的照片将会包含不同数量的像素。\n因此不是所有的照片都可以表示成相同长度的向量。\n\\sec?和\\chap?将会介绍如何处理这些不同类型的异构数据。\n在上述这类情况下，我们不会将数据集表示成$m$行的矩阵，而是表示成$m$个元素的结合：$\\{\\Vx^{(1)},\\Vx^{(2)},\\dots,\\Vx^{(m)}\\}$。\n这种表示方式意味着样本向量$\\Vx^{(i)}$和$\\Vx^{(j)}$可以有不同的大小。\n\n<!-- % -- 103 -- -->\n\n在监督学习中，样本包含一个标签或目标和一组特征。\n例如，我们希望使用学习算法从照片中识别对象。\n我们需要明确哪些对象会出现在每张照片中。\n我们或许会用数字编码表示，如$0$表示人、$1$表示车、$2$表示猫等等。\n通常在处理包含观测特征的设计矩阵 $\\MX$的数据集时，我们也会提供一个标签向量$\\Vy$，其中$y_i$表示样本 $i$的标签。\n\n\n当然，有时标签可能不止一个数。\n例如，如果我们想要训练语音模型转录整个句子，那么每个句子样本的标签是一个单词序列。\n\n\n正如监督学习和无监督学习没有正式的定义，数据集或者经验也没有严格的区分。\n这里介绍的结构涵盖了大多数情况，但始终有可能为新的应用设计出新的结构。\n\n\n## 示例：线性回归\n\n我们将机器学习算法定义为，通过经验以提高计算机程序在某些任务上性能的算法。\n这个定义有点抽象。\n为了使这个定义更具体点，我们展示一个简单的机器学习示例：线性回归。\n当我们介绍更多有助于理解机器学习特性的概念时，我们会反复回顾这个示例。\n\n顾名思义，线性回归解决回归问题。\n换言之，我们的目标是建立一个系统，将向量$\\Vx\\in\\SetR^n$作为输入，预测标量$y\\in\\SetR$作为输出。\n线性回归的输出是其输入的线性函数。\n令$\\hat{y}$表示模型预测$y$应该取的值。\n我们定义输出为\n\\begin{equation}\n    \\hat{y} = \\Vw^\\Tsp \\Vx ,\n\\end{equation}\n其中$\\Vw\\in\\SetR^n$是参数向量。\n\n参数是控制系统行为的值。\n在这种情况下，$w_i$是系数，会和特征 $x_i$相乘之后全部相加起来。\n我们可以将$\\Vw$看作是一组决定每个特征如何影响预测的权重。\n如果特征 $x_i$对应的权重$w_i$是正的，那么特征的值增加，我们的预测值$\\hat{y}$也会增加。\n如果特征 $x_i$对应的权重$w_i$是负的，那么特征的值增加，我们的预测值$\\hat{y}$会减少。\n如果特征权重的大小很大，那么它对预测有很大的影响；如果特征权重的大小是零，那么它对预测没有影响。\n\n<!-- % -- 104 -- -->\n\n因此，我们可以定义任务$T$：通过输出$\\hat{y} = \\Vw^\\Tsp \\Vx$从$\\Vx$预测$y$。\n接下来我们需要定义性能度量——$P$。\n\n假设我们有$m$个输入样本组成的设计矩阵，我们不用它来训练模型，而是评估模型性能如何。\n我们也有每个样本对应的正确值$y$组成的回归目标向量。\n因为这个数据集只是用来评估性能，我们称之为测试集。\n我们将输入的设计矩阵记作$\\MX^{\\text{(test)}}$，回归目标向量记作$\\Vy^{(\\text{test})}$。\n\n度量模型性能的一种方法是计算模型在测试集上的均方误差。\n如果$\\hat{\\Vy}^{(\\text{test})}$表示模型在测试集上的预测值，那么均方误差表示为：\n\\begin{equation}\n    \\text{MSE}_{\\text{test}} = \\frac{1}{m} \\sum_i ( \\hat{\\Vy}^{(\\text{test})} - \\Vy^{(\\text{test})})_i^2.\n\\end{equation}\n直观上，当$\\hat{\\Vy}^{(\\text{test})} = \\Vy^{(\\text{test})}$时，我们会发现误差降为$0$。\n我们也可以看到\n\\begin{equation}\n    \\text{MSE}_{\\text{test}} = \\frac{1}{m} \\norm{ \\hat{\\Vy}^{(\\text{test})} - \\Vy^{(\\text{test})}}_2^2,\n\\end{equation}\n所以当预测值和目标值之间的欧几里得距离增加时，误差也会增加。\n\n为了构建一个机器学习算法，我们需要设计一个算法，通过观察训练集$(\\MX^{(\\text{train})},\\Vy^{(\\text{train})})$获得经验，减少$\\text{MSE}_{\\text{test}}$以改进权重$\\Vw$。\n一种直观方式（我们将在后续的\\sec?说明其合法性）是最小化训练集上的均方误差，即$\\text{MSE}_{\\text{train}}$。\n\n最小化$\\text{MSE}_{\\text{train}}$，我们可以简单地求解其导数为$\\mathbf{0}$的情况：\n\\begin{equation}\n\\nabla_{\\Vw} \\text{MSE}_{\\text{train}} = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\nabla_{\\Vw} \\frac{1}{m} \\norm{ \\hat{\\Vy}^{(\\text{train})} - \\Vy^{(\\text{train})}}_2^2 = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\frac{1}{m} \\nabla_{\\Vw} \\norm{ \\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})}}_2^2 = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\nabla_{\\Vw} \\left( \\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})} \\right)^\\Tsp \\left( \\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})} \\right) = 0\n\\end{equation}\n\\begin{equation}\n\\Rightarrow \\nabla_{\\Vw} \\left( \n    \\Vw^\\Tsp \\MX^{(\\text{train})\\Tsp}\\MX^{(\\text{train})}\\Vw - 2\\Vw^\\Tsp\\MX^{(\\text{train})\\Tsp} \\Vy^{(\\text{train})} + \\Vy^{(\\text{train})\\Tsp}\\Vy^{(\\text{train})}  \n  \\right) = 0\n\\end{equation}\n\\begin{equation}\n    \\Rightarrow 2\\MX^{(\\text{train})\\Tsp}\\MX^{(\\text{train})} \\Vw  -\n    2\\MX^{(\\text{train})\\Tsp} \\Vy^{(\\text{train})}  = 0\n\\end{equation}\n\\begin{equation}\n    \\Rightarrow \\Vw =  \\left(\\MX^{(\\text{train})\\Tsp}\\MX^{(\\text{train})}\n     \\right)^{-1} \\MX^{(\\text{train})\\Tsp} \\Vy^{(\\text{train})}\n\\end{equation}\n\n<!-- % -- 105 -- -->\n\n通过\\eqn?给出解的系统方程被称为正规方程。\n计算\\eqn?构成了一个简单的机器学习算法。\n\\fig?展示了线性回归算法的使用示例。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/linreg_color}}\n\\fi\n\\caption{一个线性回归问题，其中训练集包括十个数据点，每个数据点包含一个特征。因为只有一个特征，权重向量$\\Vw$也只有一个要学习的参数$w_1$。\\emph{(左)}我们可以观察到线性回归学习$w_1$，从而使得直线$y=w_1x$能够尽量接近穿过所有的训练点。\\emph{(右)}标注的点表示由正规方程学习到的$w_1$的值，我们发现它可以最小化训练集上的均方误差。}\n\\end{figure}\n\n值得注意的是，术语线性回归通常用来指稍微复杂一些，附加额外参数（截距项$b$）的模型。\n在这个模型中，\n\\begin{equation}\n    \\hat{y} = \\Vw^\\Tsp \\Vx + b,\n\\end{equation}\n因此从参数到预测的映射仍是一个线性函数，而从特征到预测的映射是一个仿射函数。\n如此扩展到仿射函数意味着模型预测的曲线仍然看起来像是一条直线，只是这条直线没必要经过原点。\n除了通过添加偏置参数$b$，我们还可以使用仅含权重的模型，但是$\\Vx$需要增加一项永远为$1$的元素。\n对应于额外$1$的权重起到了偏置参数的作用。\n当我们在本书中提到仿射函数时，我们会经常使用术语\"线性\"。\n\n<!-- % -- 106 -- -->\n\n截距项$b$通常被称为仿射变换的\\,\\textbf{偏置}（bias）参数。\n这个术语的命名源自该变换的输出在没有任何输入时会偏移$b$。\n它和统计偏差中指代统计估计算法的某个量的期望估计偏离真实值的意思是不一样的。\n\n线性回归当然是一个极其简单且有局限的学习算法，但是它提供了一个说明学习算法如何工作的例子。\n在接下来的小节中，我们将会介绍一些设计学习算法的基本原则，并说明如何使用这些原则来构建更复杂的学习算法。\n\n\n# 容量、过拟合和欠拟合\n\n机器学习的主要挑战是我们的算法必须能够在\\emph{先前未观测的新}输入上表现良好，而不只是在训练集上表现良好。 %?? space in book\n在先前未观测到的输入上表现良好的能力被称为泛化。\n\n通常情况下，当我们训练机器学习模型时，我们可以使用某个训练集，在训练集上计算一些被称为训练误差的度量误差，目标是降低训练误差。\n目前为止，我们讨论的是一个简单的优化问题。\n机器学习和优化不同的地方在于，我们也希望泛化误差（也被称为测试误差）很低。\n泛化误差被定义为新输入的误差期望。\n这里，期望的计算基于不同的可能输入，这些输入采自于系统在现实中遇到的分布。\n\n通常，我们度量模型在训练集中分出来的测试集样本上的性能，来评估机器学习模型的泛化误差。\n\n在我们的线性回归示例中，我们通过最小化训练误差来训练模型，\n\\begin{equation}\n    \\frac{1}{m^{(\\text{train})}} \\norm{\\MX^{(\\text{train})}\\Vw - \\Vy^{(\\text{train})}}_2^2,\n\\end{equation}\n但是我们真正关注的是测试误差~$\\frac{1}{m^{(\\text{test})}} \\norm{\\MX^{(\\text{test})}\\Vw - \\Vy^{(\\text{test})}}_2^2$。\n\n<!-- % -- 107 -- -->\n\n当我们只能观测到训练集时，我们如何才能影响测试集的性能呢？\n统计学习理论提供了一些答案。\n如果训练集和测试集的数据是任意收集的，那么我们能够做的确实很有限。\n如果我们可以对训练集和测试集数据的收集方式有些假设，那么我们能够对算法做些改进。\n\n训练集和测试集数据通过数据集上被称为数据生成过程的概率分布生成。\n通常，我们会做一系列被统称为独立同分布假设的假设。\n该假设是说，每个数据集中的样本都是彼此相互独立的，并且训练集和测试集是同分布的，采样自相同的分布。\n这个假设使我们能够在单个样本的概率分布描述数据生成过程。\n然后相同的分布可以用来生成每一个训练样本和每一个测试样本。\n我们将这个共享的潜在分布称为数据生成分布，记作$p_{\\text{data}}$。\n这个概率框架和独立同分布假设允许我们从数学上研究训练误差和测试误差之间的关系。\n\n我们能观察到训练误差和测试误差之间的直接联系是，随机模型训练误差的期望和该模型测试误差的期望是一样的。\n假设我们有概率分布$p(\\Vx,y)$，从中重复采样生成训练集和测试集。\n对于某个固定的$\\Vw$，训练集误差的期望恰好和测试集误差的期望一样，这是因为这两个期望的计算都使用了相同的数据集生成过程。\n这两种情况的唯一区别是数据集的名字不同。\n\n当然，当我们使用机器学习算法时，我们不会提前固定参数，然后采样得到两个数据集。\n我们采样得到训练集，然后挑选参数去降低训练集误差，然后采样得到测试集。\n在这个过程中，测试误差期望会大于或等于训练误差期望。\n以下是决定机器学习算法效果是否好的因素：\n\\begin{enumerate}\n+ 降低训练误差。\n+ 缩小训练误差和测试误差的差距。\n\\end{enumerate}\n\n这两个因素对应机器学习的两个主要挑战：欠拟合和过拟合。\n欠拟合是指模型不能在训练集上获得足够低的误差。\n而过拟合是指训练误差和和测试误差之间的差距太大。\n\n<!-- % -- 108 -- -->\n\n通过调整模型的容量，我们可以控制模型是否偏向于过拟合或者欠拟合。\n通俗地，模型的容量是指其拟合各种函数的能力。\n容量低的模型可能很难拟合训练集。\n容量高的模型可能会过拟合，因为记住了不适用于测试集的训练集性质。\n\n一种控制训练算法容量的方法是选择假设空间，即学习算法可以选择为解决方案的函数集。\n例如，线性回归算法将关于其输入的所有线性函数作为假设空间。\n广义线性回归的假设空间包括多项式函数，而非仅有线性函数。\n这样做就增加了模型的容量。\n\n一次多项式提供了我们已经熟悉的线性回归模型，其预测如下：\n\\begin{equation}\n    \\hat{y} = b + wx.\n\\end{equation}\n通过引入$x^2$作为线性回归模型的另一个特征，我们能够学习关于$x$的二次函数模型：\n\\begin{equation}\n    \\hat{y} = b + w_1x + w_2x^2.\n\\end{equation}\n尽管该模型是\\emph{输入}的二次函数，但输出仍是\\emph{参数}的线性函数。\n因此我们仍然可以用正规方程得到模型的闭解。\n我们可以继续添加$x$的更高幂作为额外特征，例如下面的$9$次多项式：\n\\begin{equation}\n    \\hat{y} = b + \\sum_{i=1}^9 w_i x^i.\n\\end{equation}\n\n当机器学习算法的容量适合于所执行任务的复杂度和所提供训练数据的数量时，算法效果通常会最佳。\n容量不足的模型不能解决复杂任务。\n容量高的模型能够解决复杂的任务，但是当其容量高于任务所需时，有可能会过拟合。\n\n\\fig?展示了这个原理的使用情况。\n我们比较了线性，二次和$9$次预测器拟合真实二次函数的效果。\n线性函数无法刻画真实函数的曲率，所以欠拟合。\n$9$次函数能够表示正确的函数，但是因为训练参数比训练样本还多，所以它也能够表示无限多个刚好穿越训练样本点的很多其他函数。\n我们不太可能从这很多不同的解中选出一个泛化良好的。\n在这个问题中，二次模型非常符合任务的真实结构，因此它可以很好地泛化到新数据上。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/underfit_just_right_overfit_color}}\n\\fi\n\\caption{我们用三个模型拟合了这个训练集的样本。训练数据是通过随机抽取$x$然后用二次函数确定性地生成$y$来合成的。\\emph{(左)}用一个线性函数拟合数据会导致欠拟合——它无法捕捉数据中的曲率信息。\\emph{(中)}用二次函数拟合数据在未观察到的点上泛化得很好。这并不会导致明显的欠拟合或者过拟合。\\emph{(右)}一个$9$阶的多项式拟合数据会导致过拟合。在这里我们使用\\,Moore-Penrose 伪逆来解这个欠定的正规方程。得出的解能够精确地穿过所有的训练点，但可惜我们无法提取有效的结构信息。在两个数据点之间它有一个真实的函数所不包含的深谷。在数据的左侧，它也会急剧增长，而在这一区域真实的函数却是下降的。}\n\\end{figure}\n\n<!-- % -- 109 -- -->\n\n目前为止，我们探讨了通过改变输入特征的数目和加入这些特征对应的参数，改变模型的容量。\n事实上，还有很多方法可以改变模型的容量。\n容量不仅取决于模型的选择。\n模型规定了调整参数降低训练目标时，学习算法可以从哪些函数族中选择函数。\n这被称为模型的表示容量。\n在很多情况下，从这些函数中挑选出最优函数是非常困难的优化问题。\n实际中，学习算法不会真的找到最优函数，而仅是找到一个可以大大降低训练误差的函数。\n额外的限制因素，比如优化算法的不完美，意味着学习算法的有效容量可能小于模型族的表示容量。\n\n<!-- % -- 110 -- -->\n\n提高机器学习模型泛化的现代思想可以追溯到早在托勒密时期的哲学家的思想。\n许多早期的学者提出一个简约原则，现在广泛被称为奥卡姆剃刀（c. 1287-1387）。\n该原则指出，在同样能够解释已知观测现象的假设中，我们应该挑选\"最简单\"的那一个。\n这个想法是在20世纪，由统计学习理论创始人形式化并精确化的{cite?}。\n\n统计学习理论提供了量化模型容量的不同方法。\n在这些中，最有名的是Vapnik-Chervonenkis维度。\nVC\\,维度量二元分类器的容量。\nVC\\,维定义为该分类器能够分类的训练样本的最大数目。\n假设存在$m$个不同$\\Vx$点的训练集，分类器可以任意地标记该$m$个不同的$\\Vx$点，VC\\,维被定义为$m$的最大可能值。\n\n量化模型的容量使得统计学习理论可以进行量化预测。\n统计学习理论中最重要的结论阐述了训练误差和泛化误差之间差异的上界随着模型容量增长而增长，但随着训练样本增多而下降{cite?}。\n这些边界为机器学习算法可以有效解决问题提供了理论验证，但是它们很少应用于实际中的深度学习算法。\n一部分原因是边界太松，另一部分原因是很难确定深度学习算法的容量。\n由于有效容量受限于优化算法的能力，确定深度学习模型容量的问题特别困难。\n而且对于深度学习中的一般非凸优化问题，我们只有很少的理论分析。\n\n我们必须记住虽然更简单的函数更可能泛化（训练误差和测试误差的差距小），但我们仍然需要选择一个充分复杂的假设以达到低的训练误差。\n通常，当模型容量上升时，训练误差会下降，直到其渐近最小可能误差（假设误差度量有最小值）。\n通常，泛化误差是一个关于模型容量的U形曲线函数。\n如\\fig?所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/generalization_vs_capacity_color}}\n\\fi\n\\caption{容量和误差之间的典型关系。训练误差和测试误差表现得非常不同。在图的左端，训练误差和泛化误差都非常高。这是欠拟合机制。当我们增加容量时，训练误差减小，但是训练误差和泛化误差之间的间距却不断扩大。最终，这个间距的大小超过了训练误差的下降，我们进入到了过拟合机制，其中容量过大，超过了最佳容量。}\n\\end{figure}\n\n<!-- % -- 111 -- -->\n\n为考虑容量任意高的极端情况，我们介绍非参数\\emph{模型}的概念。\n至此，我们只探讨过参数模型，例如线性回归。\n参数模型学习的函数在观测到新数据前，参数向量的分量个数是有限且固定的。\n非参数模型没有这些限制。\n\n有时，非参数模型仅是一些不能实际实现的理论抽象（比如搜索所有可能概率分布的算法）。\n然而，我们也可以设计一些实用的非参数模型，使它们的复杂度和训练集大小有关。\n这种算法的一个示例是最近邻回归。\n不像线性回归有固定长度的向量作为权重，最近邻回归模型存储了训练集中所有的$\\MX$和$\\Vy$。\n当需要为测试点$\\Vx$分类时，模型会查询训练集中离该点最近的点，并返回相关的回归目标。\n换言之，$\\hat{y}=y_i$其中$i=\\argmin \\norm{\\MX_{i,:}-\\Vx}_2^2$。\n该算法也可以扩展成$L^2$范数以外的距离度量，例如学成距离度量{cite?}。\n在最近向量不唯一的情况下，如果允许算法对所有离$\\Vx$最近的$\\MX_{i,:}$关联的$y_i$求平均，那么该算法会在任意回归数据集上达到最小可能的训练误差（如果存在两个相同的输入对应不同的输出，那么训练误差可能会大于零）。\n\n最后，我们也可以将参数学习算法嵌入另一个增加参数数目的算法来创建非参数学习算法。\n例如，我们可以想象这样一个算法，外层循环调整多项式的次数，内层循环通过线性回归学习模型。\n\n<!-- % -- 112 -- -->\n\n理想模型假设我们能够预先知道生成数据的真实概率分布。\n然而这样的模型仍然会在很多问题上发生一些错误，因为分布中仍然会有一些噪声。\n在监督学习中，从$\\Vx$到$y$的映射可能内在是随机的，或者$y$可能是其他变量（包括$\\Vx$在内）的确定性函数。\n从预先知道的真实分布$p(\\Vx,y)$预测而出现的误差被称为贝叶斯误差。\n\n训练误差和泛化误差会随训练集的大小发生变化。\n泛化误差的期望从不会因训练样本数目的增加而增加。\n对于非参数模型而言，更多的数据会得到更好的泛化能力，直到达到最佳可能的泛化误差。\n任何模型容量小于最优容量的固定参数模型会渐近到大于贝叶斯误差的误差值。\n如\\fig?所示。\n值得注意的是，具有最优容量的模型仍然有可能在训练误差和泛化误差之间存在很大的差距。\n在这种情况下，我们可以通过收集更多的训练样本来缩小差距。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/training_size_grows}}\n\\fi\n\\caption{训练集大小对训练误差，测试误差以及最佳容量的影响。通过给一个$5$阶多项式添加适当大小的噪声，我们构造了一个合成的回归问题，生成单个测试集，然后生成一些不同尺寸的训练集。为了描述$95\\%$置信区间的误差条，对于每一个尺寸，我们生成了$40$个不同的训练集。\\emph{(上)}两个不同的模型上训练集和测试集的\\,MSE，一个二次模型，另一个模型的阶数通过最小化测试误差来选择。两个模型都是用闭式解来拟合。对于二次模型来说，当训练集增加时训练误差也随之增大。这是由于越大的数据集越难以拟合。同时，测试误差随之减小，因为关于训练数据的不正确的假设越来越少。二次模型的容量并不足以解决这个问题，所以它的测试误差趋近于一个较高的值。最佳容量点处的测试误差趋近于贝叶斯误差。训练误差可以低于贝叶斯误差，因为训练算法有能力记住训练集中特定的样本。当训练集趋向于无穷大时，任何固定容量的模型（在这里指的是二次模型）的训练误差都至少增至贝叶斯误差。\\emph{(下)}当训练集大小增大时，最佳容量（在这里是用最优多项式回归器的阶数衡量的）也会随之增大。最佳容量在达到足够捕捉模型复杂度之后就不再增长了。}\n\\end{figure}\n\n\n## 没有免费午餐定理\n\n学习理论表明机器学习算法能够在有限个训练集样本中很好地泛化。\n这似乎违背一些基本的逻辑原则。\n归纳推理，或是从一组有限的样本中推断一般的规则，在逻辑上不是很有效。\n为了逻辑地推断一个规则去描述集合中的元素，我们必须具有集合中每个元素的信息。\n\n在一定程度上，机器学习仅通过概率法则就可以避免这个问题，而无需使用纯逻辑推理整个确定性法则。\n机器学习保证找到一个在所关注的\\emph{大多数}样本上\\emph{可能}正确的规则。\n\n可惜，即使这样也不能解决整个问题。\n机器学习的没有免费午餐定理表明~{cite?}，在所有可能的数据生成分布上平均之后，每一个分类算法在未事先观测的点上都有相同的错误率。\n换言之，在某种意义上，没有一个机器学习算法总是比其他的要好。\n我们能够设想的最先进的算法和简单地将所有点归为同一类的简单算法有着相同的平均性能（在所有可能的任务上）。\n\n<!-- % -- 113 -- -->\n\n幸运的是，这些结论仅在我们考虑\\emph{所有}可能的数据生成分布时才成立。\n在真实世界应用中，如果我们对遇到的概率分布进行假设的话，那么我们可以设计在这些分布上效果良好的学习算法。\n\n这意味着机器学习研究的目标不是找一个通用学习算法或是绝对最好的学习算法。\n反之，我们的目标是理解什么样的分布与人工智能获取经验的\"真实世界\"相关，什么样的学习算法在我们关注的数据生成分布上效果最好。\n\n\n## 正则化\n\n没有免费午餐定理暗示我们必须在特定任务上设计性能良好的机器学习算法。\n我们建立一组学习算法的偏好来达到这个要求。\n当这些偏好和我们希望算法解决的学习问题相吻合时，性能会更好。\n\n至此，我们具体讨论修改学习算法的方法只有，通过增加或减少学习算法可选假设空间的函数来增加或减少模型的表示容量。\n我们列举的一个具体示例是线性回归增加或减少多项式的次数。\n目前为止讨论的观点都是过度简化的。\n\n算法的效果不仅很大程度上受影响于假设空间的函数数量，也取决于这些函数的具体形式。\n我们已经讨论的学习算法（线性回归）具有包含其输入的线性函数集的假设空间。\n对于输入和输出确实接近线性相关的问题，这些线性函数是很有用的。\n对于完全非线性的问题它们不太有效。\n例如，我们用线性回归，从$x$预测$\\sin(x)$，效果不会好。\n因此我们可以通过两种方式控制算法的性能，一是允许使用的函数种类，二是这些函数的数量。\n\n在假设空间中，相比于某一个学习算法，我们可能更偏好另一个学习算法。\n这意味着两个函数都是符合条件的，但是我们更偏好其中一个。\n只有非偏好函数比偏好函数在训练数据集上效果明显好很多时，我们才会考虑非偏好函数。\n\n<!-- % -- 115 -- -->\n\n例如，我们可以加入权重衰减来修改线性回归的训练标准。\n带权重衰减的线性回归最小化训练集上的均方误差和正则项的和$J(\\Vw)$，其偏好于平方$L^2$范数较小的权重。\n具体如下：\n\\begin{equation}\n    J(\\Vw) = \\text{MSE}_{\\text{train}} + \\lambda \\Vw^\\Tsp \\Vw,\n\\end{equation}\n其中$\\lambda$是提前挑选的值，控制我们偏好小范数权重的程度。\n当$\\lambda =0$，我们没有任何偏好。\n越大的$\\lambda$偏好范数越小的权重。\n最小化$J(\\Vw)$可以看作是拟合训练数据和偏好小权重范数之间的权衡。\n这会使得解决方案的斜率较小，或是将权重放在较少的特征上。\n我们可以训练具有不同$\\lambda$值的高次多项式回归模型，来举例说明如何通过权重衰减控制模型欠拟合或过拟合的趋势。\n如\\fig?所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/underfit_just_right_overfit_wd_color}}\n\\fi\n\\caption{我们使用高阶多项式回归模型来拟合\\fig?中训练样本。真实函数是二次的，但是在这里我们只使用$9$阶多项式。我们通过改变权重衰减的量来避免高阶模型的过拟合问题。\\emph{(左)}当$\\lambda$非常大时，我们可以强迫模型学习到了一个没有斜率的函数。由于它只能表示一个常数函数，所以会导致欠拟合。\\emph{(中)}取一个适当的$\\lambda$时，学习算法能够用一个正常的形状来恢复曲率。即使模型能够用更复杂的形状来来表示函数，权重衰减鼓励用一个带有更小参数的更简单的模型来描述它。\\emph{(右)}当权重衰减趋近于$0$（即使用\\,Moore-Penrose 伪逆来解这个带有最小正则化的欠定问题）时，这个$9$阶多项式会导致严重的过拟合，这和我们在图\\?中看到的一样。}\n\\end{figure}\n\n更一般地，正则化一个学习函数$f(\\Vx;\\Vtheta)$的模型，我们可以给代价函数添加被称为正则化项的惩罚。\n在权重衰减的例子中，正则化项是$\\Omega(\\Vw) = \\Vw^\\Tsp \\Vw$。\n在\\chap?，我们将看到很多其他可能的正则化项。\n\n<!-- % -- 116 -- -->\n\n表示对函数的偏好是比增减假设空间的成员函数更一般的控制模型容量的方法。\n我们可以将去掉假设空间中的某个函数看作是对不赞成这个函数的无限偏好。\n\n在我们权重衰减的示例中，通过在最小化的目标中额外增加一项，我们明确地表示了偏好权重较小的线性函数。\n有很多其他方法隐式或显式地表示对不同解的偏好。\n总而言之，这些不同的方法都被称为正则化。\n\\emph{正则化是指我们修改学习算法，使其降低泛化误差而非训练误差}。\n正则化是机器学习领域的中心问题之一，只有优化能够与其重要性相媲。\n\n没有免费午餐定理已经清楚地阐述了没有最优的学习算法，特别地，没有最优的正则化形式。\n反之，我们必须挑选一个非常适合于我们所要解决的任务的正则形式。\n深度学习中普遍的（特别是本书中的）理念是大量任务（例如所有人类能做的智能任务）也许都可以使用非常通用的正则化形式来有效解决。\n\n\n# 超参数和验证集\n\n大多数机器学习算法都有超参数，可以设置来控制算法行为。\n超参数的值不是通过学习算法本身学习出来的（尽管我们可以设计一个嵌套的学习过程，一个学习算法为另一个学习算法学出最优超参数）。\n\n在\\fig?所示的多项式回归示例中，有一个超参数：多项式的次数，作为\\textbf{容量}超参数。\n控制权重衰减程度的$\\lambda$是另一个超参数。\n\n有时一个选项被设为学习算法不用学习的超参数，是因为它太难优化了。\n更多的情况是，该选项必须是超参数，因为它不适合在训练集上学习。\n这适用于控制模型容量的所有超参数。\n如果在训练集上学习超参数，这些超参数总是趋向于最大可能的模型容量，导致过拟合（参考\\fig?）。\n例如，相比低次多项式和正的权重衰减设定，更高次的多项式和权重衰减参数设定$\\lambda=0$总能在训练集上更好地拟合。\n\n<!-- % -- 117 -- -->\n\n为了解决这个问题，我们需要一个训练算法观测不到的验证集样本。\n\n早先我们讨论过和训练数据相同分布的样本组成的测试集，它可以用来估计学习过程完成之后的学习器的泛化误差。\n其重点在于测试样本不能以任何形式参与到模型的选择中，包括设定超参数。\n基于这个原因，测试集中的样本不能用于验证集。\n因此，我们总是从\\emph{训练}数据中构建验证集。\n特别地，我们将训练数据分成两个不相交的子集。\n其中一个用于学习参数。\n另一个作为验证集，用于估计训练中或训练后的泛化误差，更新超参数。\n用于学习参数的数据子集通常仍被称为训练集，尽管这会和整个训练过程用到的更大的数据集相混。\n用于挑选超参数的数据子集被称为验证集。\n通常，$80\\%$的训练数据用于训练，$20\\%$用于验证。\n由于验证集是用来\"训练\"超参数的，尽管验证集的误差通常会比训练集误差小，验证集会低估泛化误差。\n所有超参数优化完成之后，泛化误差可能会通过测试集来估计。\n\n在实际中，当相同的测试集已在很多年中重复地用于评估不同算法的性能，并且考虑学术界在该测试集上的各种尝试，我们最后可能也会对测试集有着乐观的估计。\n基准会因之变得陈旧，而不能反映系统的真实性能。\n值得庆幸的是，学术界往往会移到新的（通常会更巨大、更具挑战性）基准数据集上。\n\n\n## 交叉验证\n\n将数据集分成固定的训练集和固定的测试集后，若测试集的误差很小，这将是有问题的。\n一个小规模的测试集意味着平均测试误差估计的统计不确定性，使得很难判断算法$A$是否比算法$B$在给定的任务上做得更好。\n\n<!-- % -- 118 -- -->\n\n当数据集有十万计或者更多的样本时，这不会是一个严重的问题。\n当数据集太小时，也有替代方法允许我们使用所有的样本估计平均测试误差，代价是增加了计算量。\n这些过程是基于在原始数据上随机采样或分离出的不同数据集上重复训练和测试的想法。\n最常见的是$k$-折交叉验证过程，如\\alg?所示，将数据集分成$k$个不重合的子集。\n测试误差可以估计为$k$次计算后的平均测试误差。\n在第$i$次测试时，数据的第$i$个子集用于测试集，其他的数据用于训练集。\n带来的一个问题是不存在平均误差方差的无偏估计{cite?}，但是我们通常会使用近似来解决。\n\n\\begin{algorithm}\n  \\caption{$k$-折交叉验证算法。\n当给定数据集$\\SetD$对于简单的训练/测试或训练/验证分割而言太小难以产生泛化误差的准确估计时（因为在小的测试集上，$L$可能具有过高的方差），$k$-折交叉验证算法可以用于估计学习算法$A$的泛化误差。\n数据集$\\SetD$包含的元素是抽象的样本 $\\Vz^{(i)}$（对于第$i$个样本），在监督学习的情况代表（输入，目标）对$\\Vz^{(i)} = (\\Vx^{(i)}, y^{(i)})$ ，或者无监督学习的情况下仅用于输入$\\Vz^{(i)} = \\Vx^{(i)}$。\n该算法返回$\\SetD$中每个示例的误差向量$\\Ve$，其均值是估计的泛化误差。\n单个样本上的误差可用于计算平均值周围的置信区间（\\eqn?）。\n虽然这些置信区间在使用交叉验证之后不能很好地证明，但是通常的做法是只有当算法$A$误差的置信区间低于并且不与算法$B$的置信区间相交时，我们才声明算法$A$比算法$B$更好。}\n\\begin{algorithmic}\n+[] \\hspace*{-4.2mm}{\\bf Define} {\\tt KFoldXV}($\\SetD,A,L,k$):\n\\REQUIRE $\\SetD$为给定数据集，其中元素为 $\\Vz^{(i)}$\n\\REQUIRE $A$ 为学习算法，可视为一个函数（使用数据集作为输入，输出一个学好的函数）\n\\REQUIRE $L$ 为损失函数，可视为来自学好的函数$f$，将样本 $\\Vz^{(i)} \\in \\SetD$ 映射到$\\SetR$中标量的函数\n\\REQUIRE $k$为折数\n\\STATE 将 $\\SetD$ 分为 $k$个互斥子集 $\\SetD_i$，它们的并集为$\\SetD$\n\\FOR{$i$ from $1$ to $k$}\n  \\STATE $f_i = A(\\SetD \\backslash \\SetD_i)$ \n  \\FOR{$\\Vz^{(j)}$ in $\\SetD_i$}\n    \\STATE $e_j = L(f_i, \\Vz^{(j)})$\n  \\ENDFOR\n\\ENDFOR\n\\STATE {\\bf Return} $\\Ve$\n\\end{algorithmic}\n\\end{algorithm}\n\n\n# 估计、偏差和方差\n\n统计领域为我们提供了很多工具来实现机器学习目标，不仅可以解决训练集上的任务，还可以泛化。\n基本的概念，例如参数估计、偏差和方差，对于正式地刻画泛化、欠拟合和过拟合都非常有帮助。\n\n\n## 点估计\n\n点估计试图为一些感兴趣的量提供单个\"最优\"预测。\n一般地，感兴趣的量可以是单个参数，或是某些参数模型中的一个向量参数，例如\\sec?线性回归中的权重，但是也有可能是整个函数。\n\n为了区分参数估计和真实值，我们习惯将参数$\\Vtheta$的点估计表示为$\\hat{\\Vtheta}$。\n\n令$\\{\\Vx^{(1)},\\dots,\\Vx^{(m)}\\}$是$m$个独立同分布（i.i.d.）的数据点。\n点估计或统计量是这些数据的任意函数：\n\\begin{equation}\n    \\hat{\\Vtheta}_m = g(\\Vx^{(1)}, \\dots, \\Vx^{(m)}) .\n\\end{equation}\n这个定义不要求$g$返回一个接近真实$\\Vtheta$的值，或者$g$的值域恰好是$\\Vtheta$的允许取值范围。\n点估计的定义非常宽泛，给了估计量的设计者极大的灵活性。\n虽然几乎所有的函数都可以称为估计量，但是一个良好的估计量的输出会接近生成训练数据的真实参数$\\Vtheta$。\n\n<!-- % -- 119 -- -->\n\n现在，我们采取频率派在统计上的观点。\n换言之，我们假设真实参数$\\Vtheta$是固定但未知的，而点估计$\\hat{\\Vtheta}$是数据的函数。\n由于数据是随机过程采样出来的，数据的任何函数都是随机的。\n因此$\\hat{\\Vtheta}$是一个随机变量。\n\n<!-- % -- 120 -- -->\n\n点估计也可以指输入和目标变量之间关系的估计。\n我们将这种类型的点估计称为函数估计。\n\n\\paragraph{函数估计} 有时我们会关注函数估计（或函数近似）。\n这时我们试图从输入向量$\\Vx$预测变量$\\Vy$。\n我们假设有一个函数$f(\\Vx)$表示$\\Vy$和$\\Vx$之间的近似关系。\n例如，我们可能假设$\\Vy = f(\\Vx) + \\Vepsilon$，其中$\\Vepsilon$是$\\Vy$中未能从$\\Vx$预测的一部分。\n在函数估计中，我们感兴趣的是用模型估计去近似$f$，或者估计$\\hat{f}$。\n函数估计和估计参数$\\Vtheta$是一样的；函数估计$\\hat{f}$是函数空间中的一个点估计。\n线性回归示例（\\sec?中讨论的）和多项式回归示例（\\sec?中讨论的）都既可以被解释为估计参数$\\Vw$，又可以被解释为估计从$\\Vx$到$y$的函数映射$\\hat{f}$。\n\n现在我们回顾点估计最常研究的性质，并探讨这些性质说明了估计的哪些特点。\n\n\n## 偏差\n\n估计的偏差被定义为：\n\\begin{equation}\n    \\text{bias}(\\hat{\\Vtheta}_m) = \\SetE(\\hat{\\Vtheta}_m) - \\Vtheta,\n\\end{equation}\n其中期望作用在所有数据（看作是从随机变量采样得到的）上，$\\Vtheta$是用于定义数据生成分布的$\\Vtheta$的真实值。\n如果$\\text{bias}(\\hat{\\Vtheta}_m)=0$，那么估计量 $\\hat{\\Vtheta}_m$被称为是无偏，这意味着$\\SetE(\\hat{\\Vtheta}_m) = \\Vtheta$。\n如果$\\lim_{m\\to\\infty} \\text{bias}(\\hat{\\Vtheta}_m)=0$，那么估计量 $\\hat{\\Vtheta}_m$被称为是渐近无偏，这意味着$\\lim_{m\\to\\infty} \\SetE(\\hat{\\Vtheta}_m) = \\Vtheta$。\n\n<!-- % -- 121 -- -->\n\n\\paragraph{示例：伯努利分布}\n考虑一组服从均值为$\\theta$的伯努利分布的独立同分布的样本$\\{x^{(1)}, \\dots , x^{(m)}\\}$：\n\\begin{equation}\n    P(x^{(i)}; \\theta) = \\theta^{x^{(i)}} (1-\\theta)^{(1 - x^{(i)})}.\n\\end{equation}\n这个分布中参数$\\theta$的常用估计量是训练样本的均值：\n\\begin{equation}\n    \\hat{\\theta}_m = \\frac{1}{m} \\sum_{i=1}^m x^{(i)}.\n\\end{equation}\n判断这个估计量是否有偏，我们将\\eqn?代入\\eqn?：\n\\begin{align}\n    \\text{bias}(\\hat{\\theta}_m)     &= \\SetE[\\hat{\\theta}_m] - \\theta  \\\\\n            &= \\SetE \\left[ \\frac{1}{m} \\sum_{i=1}^m x^{(i)} \\right] - \\theta \\\\\n            &= \\frac{1}{m} \\sum_{i=1}^m \\SetE \\left[x^{(i)} \\right] - \\theta \\\\\n            &= \\frac{1}{m} \\sum_{i=1}^m \\sum_{x^{(i)} = 0}^1 \\left( x^{(i)} \\theta^{x^{(i)}} (1-\\theta)^{(1-x^{(i)})} \\right) - \\theta \\\\\n            &= \\frac{1}{m} \\sum_{i=1}^m (\\theta) - \\theta \\\\\n            &= \\theta - \\theta = 0\n\\end{align}\n\n因为$\\text{bias}(\\hat{\\theta})=0$，我们称估计$\\hat{\\theta}$是无偏的。\n\n\\paragraph{示例：均值的高斯分布估计}\n现在，考虑一组独立同分布的样本 $\\{x^{(1)}, \\dots , x^{(m)}\\}$服从高斯分布$p(x^{(i)}) = \\mathcal{N}(x^{(i)}; \\mu, \\sigma^2)$，其中$i\\in\\{1, \\dots, m\\}$。\n回顾高斯概率密度函数如下：\n\\begin{equation}\n    p(x^{(i)}; \\mu, \\sigma^2) = \\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left( -\\frac{1}{2} \\frac{(x^{(i)} - \\mu)^2}{\\sigma^2}  \\right).\n\\end{equation}\n\n高斯均值参数的常用估计量被称为样本均值, %采样均值：\n\\begin{equation}\n    \\hat{\\mu}_m = \\frac{1}{m} \\sum_{i=1}^m x^{(i)}\n\\end{equation}\n判断样本均值, %采样均值是否有偏，我们再次计算它的期望：\n\\begin{align}\n\\text{bias} (\\hat{\\mu}_m) &= \\SetE[ \\hat{\\mu}_m ]  - \\mu \\\\\n    &= \\SetE \\left[ \\frac{1}{m} \\sum_{i=1}^m x^{(i)}  \\right] - \\mu \\\\\n    &= \\left( \\frac{1}{m}\\sum_{i=1}^m \\SetE \\left[ x^{(i)} \\right] \\right) - \\mu \\\\\n    &= \\left( \\frac{1}{m}\\sum_{i=1}^m \\mu \\right) - \\mu \\\\\n    &= \\mu - \\mu = 0\n\\end{align}\n因此我们发现样本均值, %采样均值是高斯均值参数的无偏估计量。\n\n<!-- % -- 122 -- -->\n\n\\paragraph{示例：高斯分布方差估计}\n本例中，我们比较高斯分布方差参数$\\sigma^2$的两个不同估计。\n我们探讨是否有一个是有偏的。\n\n我们考虑的第一个方差估计被称为样本方差, %采样方差：\n\\begin{equation}\n    \\hat{\\sigma}_m^2 = \\frac{1}{m} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2,\n\\end{equation}\n其中$\\hat{\\mu}_m$是样本均值, %采样均值。\n更形式地，我们对计算感兴趣\n\\begin{equation}\n    \\text{bias} (\\hat{\\sigma}_m^2) = \\SetE [ \\hat{\\sigma}_m^2 ]  - \\sigma^2.\n\\end{equation}\n我们首先估计项$\\SetE [ \\hat{\\sigma}_m^2 ]$：\n\\begin{align}\n    \\SetE [ \\hat{\\sigma}_m^2 ]  &= \\SetE \\left[ \\frac{1}{m} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2  \\right] \\\\\n    &= \\frac{m-1}{m} \\sigma^2\n\\end{align}\n回到\\eqn?，我们可以得出$\\hat{\\sigma}^2_m$的偏差是$-\\sigma^2/m$。\n因此样本方差, %采样方差是有偏估计。\n\n无偏样本方差, %采样方差估计\n\\begin{equation}\n    \\tilde{\\sigma}_m^2 = \\frac{1}{m-1} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2\n\\end{equation}\n提供了另一种可选方法。\n正如名字所言，这个估计是无偏的。\n换言之，我们会发现$\\SetE[\\tilde{\\sigma}_m^2] = \\sigma^2$：\n\\begin{align}\n    \\SetE[\\tilde{\\sigma}_m^2] &= \\SetE \\left[ \\frac{1}{m-1} \\sum_{i=1}^m \\left( x^{(i)} - \\hat{\\mu}_m \\right)^2 \\right] \\\\\n        &= \\frac{m}{m-1} \\SetE[ \\hat{\\sigma}_m^2 ]  \\\\\n        &= \\frac{m}{m-1} \\left( \\frac{m-1}{m} \\sigma^2 \\right) \\\\\n        &= \\sigma^2.\n\\end{align}\n\n<!-- % -- 123 -- -->\n\n我们有两个估计量：一个是有偏的，另一个是无偏的。\n尽管无偏估计显然是令人满意的，但它并不总是\"最好\"的估计。\n我们将看到，经常会使用其他具有重要性质的有偏估计。\n\n\n## 方差和标准差\n\n我们有时会考虑估计量的另一个性质是它作为数据样本的函数，期望的变化程度是多少。\n正如我们可以计算估计量的期望来决定它的偏差，我们也可以计算它的方差。\n估计量的方差就是一个方差\n\\begin{equation}\n    \\text{Var}(\\hat{\\theta})\n\\end{equation}\n其中随机变量是训练集。\n另外，方差的平方根被称为标准差，记作$\\text{SE}(\\hat{\\theta})$。\n\n估计量的方差或标准差告诉我们，当独立地从潜在的数据生成过程中重采样数据集时，如何期望估计的变化。\n正如我们希望估计的偏差较小，我们也希望其方差较小。\n\n当我们使用有限的样本计算任何统计量时，真实参数的估计都是不确定的，在这个意义下，从相同的分布得到其他样本时，它们的统计量也会不一样。\n任何方差估计量的期望程度是我们想量化的误差的来源。\n\n均值的标准差被记作\n\\begin{equation}\n    \\text{SE}(\\hat{\\mu}_m) = \\sqrt{ \\text{Var} \\left[ \\frac{1}{m} \\sum_{i=1}^m x^{(i)} \\right] } = \\frac{\\sigma}{\\sqrt{m}},\n\\end{equation}\n其中$\\sigma^2$是样本 $x^{(i)}$的真实方差。\n标准差通常被记作$\\sigma$。\n可惜，样本方差的平方根和方差无偏估计的平方根都不是标准差的无偏估计。\n这两种计算方法都倾向于低估真实的标准差，但仍用于实际中。\n相较而言，方差无偏估计的平方根较少被低估。\n对于较大的$m$，这种近似非常合理。\n\n<!-- % -- 124 -- -->\n\n均值的标准差在机器学习实验中非常有用。\n我们通常用测试集样本的误差均值来估计泛化误差。\n测试集中样本的数量决定了这个估计的精确度。\n中心极限定理告诉我们均值会接近一个高斯分布，我们可以用标准差计算出真实期望落在选定区间的概率。\n例如，以均值$\\hat{\\mu}_m$为中心的$95\\%$置信区间是\n\\begin{equation}\n    ( \\hat{\\mu}_m - 1.96\\text{SE}(\\hat{\\mu}_m), \\hat{\\mu}_m + 1.96 \\text{SE}(\\hat{\\mu}_m) ),\n\\end{equation}\n以上区间是基于均值$\\hat{\\mu}_m$和方差$\\text{SE}(\\hat{\\mu}_m)^2$的高斯分布。\n在机器学习实验中，我们通常说算法$A$比算法$B$好，是指算法$A$的误差的$95\\%$置信区间的上界小于算法$B$的误差的$95\\%$置信区间的下界。\n\n\\paragraph{示例：伯努利分布} 我们再次考虑从伯努利分布（回顾$P(x^{(i)}; \\theta) = \\theta^{x^{(i)}} (1-\\theta)^{1 - x^{(i)}}$）中独立同分布采样出来的一组样本 $\\{ x^{(1)}, \\dots, x^{(m)} \\}$。\n这次我们关注估计$\\hat{\\theta}_m = \\frac{1}{m} \\sum_{i=1}^m x^{(i)}$的方差：\n\\begin{align}\n    \\text{Var}\\left( \\hat{\\theta}_m \\right) &= \\text{Var}\\left( \\frac{1}{m} \\sum_{i=1}^m x^{(i)} \\right) \\\\\n    &= \\frac{1}{m^2} \\sum_{i=1}^m \\text{Var} \\left( x^{(i)} \\right) \\\\\n    &= \\frac{1}{m^2} \\sum_{i=1}^m \\theta (1 - \\theta) \\\\\n    &= \\frac{1}{m^2} m\\theta(1-\\theta) \\\\\n    &= \\frac{1}{m} \\theta(1-\\theta)\n\\end{align} \n估计量方差的下降速率是关于数据集样本数目$m$的函数。\n这是常见估计量的普遍性质，在探讨一致性（参考\\sec?）时，我们会继续讨论。\n\n<!-- % -- 125 -- -->\n\n\n## 权衡偏差和方差以最小化均方误差\n\n偏差和方差度量着估计量的两个不同误差来源。\n偏差度量着偏离真实函数或参数的误差期望。\n而方差度量着数据上任意特定采样可能导致的估计期望的偏差。\n\n当我们可以在一个偏差更大的估计和一个方差更大的估计中进行选择时，会发生什么呢？我们该如何选择？\n例如，想象我们希望近似\\fig?中的函数，我们只可以选择一个偏差较大的估计或一个方差较大的估计，我们该如何选择呢？\n\n判断这种权衡最常用的方法是交叉验证。\n经验上，交叉验证在真实世界的许多任务中都非常成功。\n另外，我们也可以比较这些估计的均方误差：\n\\begin{align}\n    \\text{MSE} &= \\SetE[ ( \\hat{\\theta}_m - \\theta  )^2 ] \\\\\n\\end{align}\nMSE\\,度量着估计和真实参数$\\theta$之间平方误差的总体期望偏差。\n如\\eqn?所示，MSE\\,估计包含了偏差和方差。\n理想的估计具有较小的\\,MSE\\,或是在检查中会稍微约束它们的偏差和方差。\n\n偏差和方差的关系和机器学习容量、欠拟合和过拟合的概念紧密相联。\n用\\,MSE\\,度量泛化误差（偏差和方差对于泛化误差都是有意义的）时，增加容量会增加方差，降低偏差。\n如\\fig?所示，我们再次在关于容量的函数中，看到泛化误差的U形曲线。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/bias_variance_tradeoff}}\n\\fi\n\\caption{当容量增大（$x$轴）时，偏差（用点表示）随之减小，而方差（虚线）随之增大，使得泛化误差（加粗曲线）产生了另一种U形。如果我们沿着轴改变容量，会发现最佳容量，当容量小于最佳容量会呈现欠拟合，大于时导致过拟合。这种关系与\\sec?以及\\fig?中讨论的容量、欠拟合和过拟合之间的关系类似。}\n\\end{figure}\n\n<!-- % -- 126 -- -->\n\n\n## 一致性\n\n目前我们已经探讨了固定大小训练集下不同估计量的性质。\n通常，我们也会关注训练数据增多后估计量的效果。\n特别地，我们希望当数据集中数据点的数量$m$增加时，点估计会收敛到对应参数的真实值。\n更形式地，我们想要\n\\begin{equation}\n    \\plim_{m\\to\\infty} \\hat{\\theta}_m = \\theta.\n\\end{equation}\n符号$\\plim$表示依概率收敛，即对于任意的$\\epsilon > 0$，当$m\\to\\infty$时，有$P(|\\hat{\\theta}_m - \\theta| > \\epsilon) \\to 0$。\n\\eqn?表示的条件被称为一致性。\n有时它是指弱一致性，强一致性是指几乎必然从$\\hat{\\theta}$收敛到$\\theta$。\n几乎必然收敛是指当$p(\\lim_{m\\to\\infty} \\RVx^{(m)} = \\Vx) = 1 $时，随机变量序列$\\RVx^{(1)}$，$\\RVx^{(2)}$，$\\dots$收敛到$\\Vx$。\n\n一致性保证了估计量的偏差会随数据样本数目的增多而减少。\n然而，反过来是不正确的——渐近无偏并不意味着一致性。\n例如，考虑用包含$m$个样本的数据集 $\\{x^{(1)},\\dots,x^{(m)}\\}$估计正态分布$\\mathcal{N}(x;\\mu,\\sigma^2)$的均值参数$\\mu$。\n我们可以使用数据集的第一个样本 $x^{(1)}$作为无偏估计量：$\\hat{\\theta} = x^{(1)}$。\n在该情况下，$\\SetE(\\hat{\\theta}_m) = \\theta$，所以不管观测到多少数据点，该估计量都是无偏的。\n然而，这不是一个一致估计，因为它\\emph{不}满足当$m\\to\\infty$时，$\\hat{\\theta}_m \\to \\theta$。\n\n<!-- % -- 127 -- -->\n\n\n# 最大似然估计\n\n之前，我们已经看过常用估计的定义，并分析了它们的性质。\n但是这些估计是从哪里来的呢？\n我们希望有些准则可以让我们从不同模型中得到特定函数作为好的估计，而不是猜测某些函数可能是好的估计，然后分析其偏差和方差。\n\n最常用的准则是最大似然估计。\n\n考虑一组含有$m$个样本的数据集 $\\SetX=\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)} \\}$，独立地由未知的真实数据生成分布$p_{\\text{data}}(\\RVx)$生成。\n\n令$p_{\\text{model}}( \\RVx; \\Vtheta )$是一族由$\\Vtheta$确定在相同空间上的概率分布。\n换言之，$p_{\\text{model}}(\\Vx;\\Vtheta)$将任意输入$\\Vx$映射到实数来估计真实概率$p_{\\text{data}}(\\Vx)$。\n\n对$\\Vtheta$的最大似然估计被定义为：\n\\begin{align}\n    \\Vtheta_{\\text{ML}} &= \\underset{\\Vtheta}{\\argmax} \\, p_{\\text{model}} (\\SetX; \\Vtheta), \\\\\n        &= \\underset{\\Vtheta}{\\argmax} \\prod_{i=1}^m p_{\\text{model}} (\\Vx^{(i)}; \\Vtheta).\n\\end{align}\n\n多个概率的乘积会因很多原因不便于计算。\n例如，计算中很可能会出现数值下溢。\n为了得到一个便于计算的等价优化问题，我们观察到似然对数不会改变其$\\argmax$但是将乘积转化成了便于计算的求和形式：\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\sum_{i=1}^m \\log p_{\\text{model}} (\\Vx^{(i)}; \\Vtheta) .\n\\end{equation}\n因为当我们重新缩放代价函数时$\\argmax$不会改变，我们可以除以$m$得到和训练数据经验分布$\\hat{p}_{\\text{data}}$相关的期望作为准则：\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\,\\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} \\log p_{\\text{model}} (\\Vx; \\Vtheta) .\n\\end{equation}\n\n一种解释最大似然估计的观点是将它看作最小化训练集上的经验分布$\\hat{p}_{\\text{data}}$和模型分布之间的差异，两者之间的差异程度可以通过~KL散度度量。\nKL散度被定义为\n\\begin{equation}\n    D_{\\text{KL}}(\\hat{p}_{\\text{data}} \\| p_{\\text{model}}) = \\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} [ \\log \\hat{p}_{\\text{data}}(\\Vx) - \\log p_{\\text{model}}(\\Vx) ] .\n\\end{equation}\n左边一项仅涉及到数据生成过程，和模型无关。\n这意味着当我们训练模型最小化~KL散度时，我们只需要最小化\n\\begin{equation}\n    -\\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} [ \\log p_{\\text{model}}(\\Vx)  ] ,\n\\end{equation}\n当然，这和\\eqn?中最大化是相同的。\n\n<!-- % -- 128 -- -->\n\n最小化~KL散度其实就是在最小化分布之间的交叉熵。\n许多作者使用术语\"交叉熵\"特定表示伯努利或softmax分布的负对数似然，但那是用词不当的。\n任何一个由负对数似然组成的损失都是定义在训练集上的经验分布和定义在模型上的概率分布之间的交叉熵。\n例如，均方误差是经验分布和高斯模型之间的交叉熵。\n\n我们可以将最大似然看作是使模型分布尽可能地和经验分布$\\hat{p}_{\\text{data}}$相匹配的尝试。\n理想情况下，我们希望匹配真实的数据生成分布$p_{\\text{data}}$，但我们没法直接知道这个分布。\n\n虽然最优$\\Vtheta$在最大化似然或是最小化~KL散度时是相同的，但目标函数值是不一样的。\n在软件中，我们通常将两者都称为最小化代价函数。\n因此最大化似然变成了最小化负对数似然（NLL)，或者等价的是最小化交叉熵。\n将最大化似然看作最小化~KL散度的视角在这个情况下是有帮助的，因为已知~KL散度最小值是零。\n当$\\Vx$取实数时，负对数似然可以是负值。\n\n\n## 条件对数似然和均方误差\n\n最大似然估计很容易扩展到估计条件概率$P(\\RVy \\mid \\RVx;\\Vtheta)$，从而给定$\\RVx$预测$\\RVy$。\n实际上这是最常见的情况，因为这构成了大多数监督学习的基础。\n如果$\\MX$表示所有的输入，$\\MY$表示我们观测到的目标，那么条件最大似然估计是\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} P(\\MY \\mid \\MX; \\Vtheta).\n\\end{equation}\n如果假设样本是独立同分布的，那么这可以分解成\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\sum_{i=1}^m \\log P(\\Vy^{(i)} \\mid \\Vx^{(i)}; \\Vtheta).\n\\end{equation}\n\n<!-- % -- 129 -- -->\n\n\\paragraph{示例：线性回归作为最大似然} \\sec?介绍的线性回归，可以被看作是最大似然过程。\n之前，我们将线性回归作为学习从输入$\\Vx$映射到输出$\\hat{y}$的算法。\n从$\\Vx$到$\\hat{y}$的映射选自最小化均方误差（我们或多或少介绍的一个标准）。\n现在，我们以最大似然估计的角度重新审视线性回归。\n我们现在希望模型能够得到条件概率$p(y \\mid \\Vx)$，而不只是得到一个单独的预测$\\hat{y}$。\n想象有一个无限大的训练集，我们可能会观测到几个训练样本有相同的输入$\\Vx$但是不同的$y$。\n现在学习算法的目标是拟合分布$p(y \\mid \\Vx)$到和$\\Vx$相匹配的不同的$y$。\n为了得到我们之前推导出的相同的线性回归算法，我们定义$p(y \\mid \\Vx) = \\mathcal{N}(y; \\hat{y}(\\Vx; \\Vw), \\sigma^2)$。\n函数$\\hat{y}(\\Vx; \\Vw)$预测高斯的均值。\n在这个例子中，我们假设方差是用户固定的某个常量$\\sigma^2$。\n这种函数形式$p(y \\mid \\Vx)$会使得最大似然估计得出和之前相同的学习算法。\n由于假设样本是独立同分布的，条件对数似然（\\eqn?）如下\n\\begin{align}\n     & \\sum_{i=1}^m \\log p(y^{(i)} \\mid \\Vx^{(i)}; \\Vtheta) \\\\\n    =& -m \\log\\sigma - \\frac{m}{2} \\log(2\\pi) - \\sum_{i=1}^m \\frac{ \\norm{\\hat{y}^{(i)} - y^{(i)} }^2 }{2\\sigma^2},\n\\end{align}\n其中$\\hat{y}^{(i)}$是线性回归在第$i$个输入$\\Vx^{(i)}$上的输出，$m$是训练样本的数目。\n对比均方误差和对数似然，\n\\begin{equation}\n    \\text{MSE}_{\\text{train}} = \\frac{1}{m} \\sum_{i=1}^m \\norm{\\hat{y}^{(i)} - y^{(i)}}^2,\n\\end{equation}\n我们立刻可以看出最大化关于$\\Vw$的对数似然和最小化均方误差会得到相同的参数估计$\\Vw$。\n但是对于相同的最优$\\Vw$，这两个准则有着不同的值。\n这验证了\\,MSE\\,可以用于最大似然估计。\n正如我们将看到的，最大似然估计有几个理想的性质。\n\n<!-- % -- 130 -- -->\n\n\n## 最大似然的性质\n\n最大似然估计最吸引人的地方在于，它被证明当样本数目$m\\to\\infty$时，就收敛率而言是最好的渐近估计。\n\n在合适的条件下，最大似然估计具有一致性（参考\\sec?），意味着训练样本数目趋向于无穷大时，参数的最大似然估计会收敛到参数的真实值。\n这些条件是：\n\n+ 真实分布$p_{\\text{data}}$必须在模型族$p_{\\text{model}}(\\cdot; \\Vtheta)$ 中。\n    否则，没有估计可以还原$p_{\\text{data}}$。\n    \n+ 真实分布$p_{\\text{data}}$必须刚好对应一个$\\Vtheta$值。\n    否则，最大似然估计恢复出真实分布$p_{\\text{data}}$后，也不能决定数据生成过程使用哪个$\\Vtheta$。\n\n\n除了最大似然估计，还有其他的归纳准则，其中许多共享一致估计的性质。\n然而，一致估计的统计效率可能区别很大。\n某些一致估计可能会在固定数目的样本上获得一个较低的泛化误差，或者等价地，可能只需要较少的样本就能达到一个固定程度的泛化误差。\n\n统计效率通常用于有参情况的研究中（例如线性回归）。有参情况中我们的目标是估计参数值（假设有可能确定真实参数），而不是函数值。\n一种度量我们和真实参数相差多少的方法是计算均方误差的期望，即计算$m$个从数据生成分布中出来的训练样本上的估计参数和真实参数之间差值的平方。\n有参均方误差估计随着$m$的增加而减少，当$m$较大时，Cram\\'er-Rao下界{cite?}表明不存在均方误差低于最大似然估计的一致估计。\n\n因为这些原因（一致性和统计效率），最大似然通常是机器学习中的首选估计。\n当样本数目小到会发生过拟合时，正则化策略如权重衰减可用于获得训练数据有限时方差较小的最大似然有偏版本。\n\n<!-- % -- 131 -- -->\n\n\n# 贝叶斯统计\n\n至此我们已经讨论了频率派统计方法和基于估计单一值$\\Vtheta$的方法，然后基于该估计作所有的预测。\n另一种方法是在做预测时会考虑所有可能的$\\Vtheta$。\n后者属于贝叶斯统计的范畴。\n\n正如\\sec?中讨论的，频率派的视角是真实参数$\\Vtheta$是未知的定值，而点估计$\\hat{\\Vtheta}$是考虑数据集上函数（可以看作是随机的）的随机变量。\n\n贝叶斯统计的视角完全不同。\n贝叶斯用概率反映知识状态的确定性程度。\n数据集能够被直接观测到，因此不是随机的。\n另一方面，真实参数$\\Vtheta$是未知或不确定的，因此可以表示成随机变量。\n\n在观察到数据前，我们将$\\Vtheta$的已知知识表示成先验概率分布，$p(\\Vtheta)$（有时简单地称为\"先验\"）。\n一般而言，机器学习实践者会选择一个相当宽泛的（即，高熵的）先验分布，反映在观测到任何数据前参数$\\Vtheta$的高度不确定性。\n例如，我们可能会假设先验$\\Vtheta$在有限区间中均匀分布。\n许多先验偏好于\"更简单\"的解（如小幅度的系数，或是接近常数的函数）。\n\n现在假设我们有一组数据样本$\\{x^{(1)},\\dots,x^{(m)}\\}$。\n通过贝叶斯规则结合数据似然$p(x^{(1)},\\dots,x^{(m)} \\mid \\Vtheta)$和先验，我们可以恢复数据对我们关于$\\Vtheta$信念的影响：\n\\begin{equation}\n        p(\\Vtheta \\mid x^{(1)},\\dots,x^{(m)}) = \n        \\frac{p(x^{(1)},\\dots,x^{(m)} \\mid \\Vtheta) p(\\Vtheta)}\n            {p(x^{(1)},\\dots,x^{(m)})}\n\\end{equation}\n在贝叶斯估计常用的情景下，先验开始是相对均匀的分布或高熵的高斯分布，观测数据通常会使后验的熵下降，并集中在参数的几个可能性很高的值。\n\n相对于最大似然估计，贝叶斯估计有两个重要区别。\n第一，不像最大似然方法预测时使用$\\Vtheta$的点估计，贝叶斯方法使用$\\Vtheta$的全分布。\n例如，在观测到$m$个样本后，下一个数据样本~$x^{(m+1)}$的预测分布如下：\n\\begin{equation}\n    p(x^{(m+1)} \\mid x^{(1)},\\dots,x^{(m)}) = \n    \\int p(x^{(m+1)} \\mid \\Vtheta) p(\\Vtheta \\mid x^{(1)},\\dots,x^{(m)})~d\\Vtheta .\n\\end{equation}\n这里，每个具有正概率密度的$\\Vtheta$的值有助于下一个样本的预测，其中贡献由后验密度本身加权。\n在观测到数据集 $\\{ x^{(1)},\\dots,x^{(m)}\\}$之后，如果我们仍然非常不确定$\\Vtheta$的值，那么这个不确定性会直接包含在我们所做的任何预测中。\n\n<!-- % -- 132 -- -->\n\n在\\sec?中，我们已经探讨频率派方法解决给定点估计$\\Vtheta$的不确定性的方法是评估方差，估计的方差评估了观测数据重新从观测数据中采样后，估计可能如何变化。\n对于如何处理估计不确定性的这个问题，贝叶斯派的答案是积分，这往往会防止过拟合。\n当然，积分仅仅是概率法则的应用，使贝叶斯方法容易验证，而频率派机器学习基于相当特别的决定构建了一个估计，将数据集里的所有信息归纳到一个单独的点估计。\n\n贝叶斯方法和最大似然方法的第二个最大区别是由贝叶斯先验分布造成的。\n先验能够影响概率质量密度朝参数空间中偏好先验的区域偏移。\n实践中，先验通常表现为偏好更简单或更光滑的模型。\n对贝叶斯方法的批判认为先验是人为主观判断影响预测的来源。\n\n当训练数据很有限时，贝叶斯方法通常泛化得更好，但是当训练样本数目很大时，通常会有很大的计算代价。\n\n\n\\paragraph{示例：贝叶斯线性回归}  我们使用贝叶斯估计方法学习线性回归的参数。\n在线性回归中，我们学习从输入向量$\\Vx\\in\\SetR^n$预测标量$y\\in\\SetR$的线性映射。\n该预测由向量$\\Vw \\in \\SetR^n$参数化：\n\\begin{equation}\n    \\hat{y} = \\Vw^\\Tsp \\Vx .\n\\end{equation}\n给定一组$m$个训练样本$(\\MX^{(\\text{train})}, \\Vy^{(\\text{train})})$，\n我们可以表示整个训练集对$y$的预测：\n\\begin{equation}\n    \\hat{\\Vy}^{(\\text{train})} = \\MX^{(\\text{train})} \\Vw .\n\\end{equation}\n表示为$\\Vy^{(\\text{train})}$上的高斯条件分布，我们得到\n\\begin{align}\n    p(\\Vy^{(\\text{train})} \\mid \\MX^{(\\text{train})}, \\Vw) &= \n    \\mathcal{N}( \\Vy^{(\\text{train})}; \\MX^{(\\text{train})}\\Vw, \\MI ) \\\\\n    & \\propto \\exp\\left( \n        -\\frac{1}{2}( \\Vy^{(\\text{train})} - \\MX^{(\\text{train})}\\Vw )^\\Tsp\n        ( \\Vy^{(\\text{train})} - \\MX^{(\\text{train})}\\Vw )\n    \\right),\n\\end{align}\n其中，我们根据标准的\\,MSE\\,公式假设$y$上的高斯方差为$1$。\n在下文中，为减少符号负担，我们将$(\\MX^{(\\text{train})}, \\Vy^{(\\text{train})})$简单表示为$(\\MX, \\Vy)$。\n\n<!-- % -- 133 -- -->\n\n为确定模型参数向量$\\Vw$的后验分布，我们首先需要指定一个先验分布。\n先验应该反映我们对这些参数取值的信念。\n虽然有时将我们的先验信念表示为模型的参数很难或很不自然，但在实践中我们通常假设一个相当广泛的分布来表示$\\Vtheta$的高度不确定性。\n实数值参数通常使用高斯作为先验分布：\n\\begin{equation}\n    p(\\Vw) = \\mathcal{N}( \\Vw; \\Vmu_0, \\VLambda_0 ) \n    \\propto \\exp\\left( \n    -\\frac{1}{2}( \\Vw-\\Vmu_0 )^\\Tsp \\VLambda_0^{-1} ( \\Vw-\\Vmu_0 )\n    \\right),\n\\end{equation}\n其中，$\\Vmu_0$和$\\VLambda_0$分别是先验分布的均值向量和协方差矩阵。\n\\footnote{除非有理由使用协方差矩阵的特定结构，我们通常假设其为对角协方差矩阵\n$\\VLambda_0=\\text{diag}(\\Vlambda_0)$。\n}\n\n确定好先验后，我们现在可以继续确定模型参数的\\textbf{后验}\\emph{分布}。\n\\begin{align}\n    p(\\Vw \\mid \\MX, \\Vy) &\\propto p(\\Vy \\mid \\MX, \\Vw) p(\\Vw) \\\\\n    & \\propto \n        \\exp\\left( \n            -\\frac{1}{2} ( \\Vy - \\MX\\Vw )^\\Tsp( \\Vy - \\MX\\Vw )\n        \\right)\n        \\exp\\left(\n    -\\frac{1}{2} ( \\Vw - \\Vmu_0)^\\Tsp \\VLambda_0^{-1} ( \\Vw - \\Vmu_0)\n        \\right) \\\\\n    & \\propto \\exp\n    \\left(\n    -\\frac{1}{2}\\left(\n    -2\\Vy^\\Tsp\\MX\\Vw + \\Vw^\\Tsp\\MX^\\Tsp\\MX\\Vw + \\Vw^\\Tsp\\VLambda_0^{-1}\\Vw - \n    2\\Vmu_0^\\Tsp \\VLambda_0^{-1}\\Vw\n    \\right)\n    \\right).\n\\end{align}\n现在我们定义$\\VLambda_m = (\\MX^\\Tsp\\MX + \\VLambda_0^{-1})^{-1}$和$\\Vmu_m = \\VLambda_m ( \\MX^\\Tsp \\Vy + \\VLambda_0^{-1}\\Vmu_0 )$。\n使用这些新的变量，我们发现后验可改写为高斯分布：\n\\begin{align}\n    p(\\Vw \\mid \\MX, \\Vy) &\\propto \\exp \\left(\n    -\\frac{1}{2} (\\Vw - \\Vmu_m )^\\Tsp \\VLambda_m^{-1}  (\\Vw - \\Vmu_m ) \n    + \\frac{1}{2} \\Vmu_m^\\Tsp \\VLambda_m^{-1}  \\Vmu_m \n    \\right) \\\\\n    &\\propto \\exp\\left(\n    -\\frac{1}{2} (\\Vw - \\Vmu_m)^\\Tsp \\VLambda_m^{-1} (\\Vw - \\Vmu_m)\n    \\right).\n\\end{align}\n分布的积分必须归一这个事实意味着要删去所有不包括参数向量$\\Vw$的项。\n\\eqn?显示了如何标准化多元高斯分布。\n\n<!-- % -- 134 -- -->\n\n检查此后验分布可以让我们获得贝叶斯推断效果的一些直觉。\n大多数情况下，我们设置$\\Vmu_0 = 0$。\n如果我们设置$\\VLambda_0 = \\frac{1}{\\alpha}\\MI$，那么$\\mu_m$对$\\Vw$的估计就和频率派带权重衰减惩罚$\\alpha\\Vw^\\Tsp\\Vw$的线性回归的估计是一样的。\n一个区别是若$\\alpha$设为$0$则贝叶斯估计是未定义的——我们不能将贝叶斯学习过程初始化为一个无限宽的$\\Vw$先验。\n更重要的区别是贝叶斯估计会给出一个协方差矩阵，表示$\\Vw$所有不同值的可能范围，而不仅是估计$\\mu_m$。\n\n\n## 最大后验(MAP)估计\n\n原则上，我们应该使用参数$\\Vtheta$的完整贝叶斯后验分布进行预测，但单点估计常常也是需要的。\n希望使用点估计的一个常见原因是，对于大多数有意义的模型而言，大多数涉及到贝叶斯后验的计算是非常棘手的，点估计提供了一个可行的近似解。\n我们仍然可以让先验影响点估计的选择来利用贝叶斯方法的优点，而不是简单地回到最大似然估计。\n一种能够做到这一点的合理方式是选择最大后验点估计。\nMAP\\,估计选择后验概率最大的点（或在$\\Vtheta$是连续值的更常见情况下，概率密度最大的点）：\n\\begin{equation}\n    \\Vtheta_{\\text{MAP}} = \\underset{\\Vtheta}{\\argmax} \\, p(\\Vtheta\\mid\\Vx)\n    = \\underset{\\Vtheta}{\\argmax} \\, \\log p(\\Vx \\mid \\Vtheta) + \\log p(\\Vtheta) .\n\\end{equation}\n我们可以认出上式右边的$\\log p(\\Vx \\mid \\Vtheta)$对应着标准的对数似然项，$\\log p(\\Vtheta)$对应着先验分布。\n\n<!-- % -- 135 -- -->\n\n例如，考虑具有高斯先验权重$\\Vw$的线性回归模型。\n如果先验是$\\mathcal{N}(\\Vw;\\mathbf{0},\\frac{1}{\\lambda}I^2)$，那么\\eqn?的对数先验项正比于熟悉的权重衰减惩罚$\\lambda \\Vw^\\Tsp\\Vw$，加上一个不依赖于$\\Vw$也不会影响学习过程的项。\n因此，具有高斯先验权重的MAP~贝叶斯推断对应着权重衰减。\n\n正如全贝叶斯推断，MAP\\,贝叶斯推断的优势是能够利用来自先验的信息，这些信息无法从训练数据中获得。\n该附加信息有助于减少最大后验点估计的方差（相比于ML估计）。\n然而，这个优点的代价是增加了偏差。\n\n许多正规化估计方法，例如权重衰减正则化的最大似然学习，可以被解释为贝叶斯推断的\\,MAP\\,近似。\n这个适应于正则化时加到目标函数的附加项对应着$\\log p(\\Vtheta)$。\n并非所有的正则化惩罚都对应着~MAP~贝叶斯推断。\n例如，有些正则化项可能不是一个概率分布的对数。\n还有些正则化项依赖于数据，当然也不会是一个先验概率分布。\n\nMAP\\,贝叶斯推断提供了一个直观的方法来设计复杂但可解释的正则化项。\n例如，更复杂的惩罚项可以通过混合高斯分布作为先验得到，而不是一个单独的高斯分布{cite?}。\n\n\n# 监督学习算法\n\n回顾\\sec?，粗略地说，监督学习算法是给定一组输入$\\Vx$和输出$\\Vy$的训练集，学习如何关联输入和输出。\n在许多情况下，输出$\\Vy$很难自动收集，必须由人来提供\"监督\"，不过该术语仍然适用于训练集目标可以被自动收集的情况。\n\n<!-- % -- 136 -- -->\n\n\n## 概率监督学习\n\n本书的大部分监督学习算法都是基于估计概率分布$p(y\\mid\\Vx)$的。\n我们可以使用最大似然估计找到对于有参分布族$p(y\\mid\\Vx;\\Vtheta)$最好的参数向量$\\Vtheta$。 \n\n我们已经看到，线性回归对应于分布族\n\\begin{equation}\n    p(y \\mid \\Vx; \\Vtheta) = \\mathcal{N}( y; \\Vtheta^\\Tsp \\Vx, \\MI).\n\\end{equation}\n通过定义一族不同的概率分布，我们可以将线性回归扩展到分类情况中。\n如果我们有两个类，类$0$和类$1$，那么我们只需要指定这两类之一的概率。\n类$1$的概率决定了类$0$的概率，因为这两个值加起来必须等于$1$。\n\n我们用于线性回归的实数正态分布是用均值参数化的。\n我们提供这个均值的任何值都是有效的。\n二元变量上的分布稍微复杂些，因为它的均值必须始终在$0$和$1$之间。\n解决这个问题的一种方法是使用~logistic sigmoid~函数将线性函数的输出压缩进区间$(0,1)$。\n该值可以解释为概率：\n\\begin{equation}\n    p(y = 1 \\mid \\Vx; \\Vtheta) = \\sigma(\\Vtheta^\\Tsp \\Vx).\n\\end{equation}\n这个方法被称为逻辑回归，这个名字有点奇怪，因为该模型用于分类而非回归。\n\n线性回归中，我们能够通过求解正规方程以找到最佳权重。\n相比而言，逻辑回归会更困难些。\n其最佳权重没有闭解。\n反之，我们必须最大化对数似然来搜索最优解。\n我们可以通过梯度下降算法最小化负对数似然来搜索。\n\n通过确定正确的输入和输出变量上的有参条件概率分布族，相同的策略基本上可以用于任何监督学习问题。\n\n\n## 支持向量机\n\n支持向量机是监督学习中最有影响力的方法之一{cite?}。\n类似于逻辑回归，这个模型也是基于线性函数$\\Vw^\\Tsp \\Vx + b$的。\n不同于逻辑回归的是，支持向量机不输出概率，只输出类别。\n当$\\Vw^\\Tsp\\Vx + b$为正时，支持向量机预测属于正类。\n类似地，当$\\Vw^\\Tsp\\Vx + b$为负时，支持向量机预测属于负类。\n\n<!-- % -- 137 -- -->\n\n支持向量机的一个重要创新是核技巧。\n核技巧观察到许多机器学习算法都可以写成样本间点积的形式。\n例如，支持向量机中的线性函数可以重写为\n\\begin{equation}\n    \\Vw^\\Tsp \\Vx + b = b + \\sum_{i=1}^m \\alpha_i \\Vx^\\Tsp \\Vx^{(i)} ,\n\\end{equation}\n其中，$\\Vx^{(i)}$是训练样本，$\\Valpha$是系数向量。\n学习算法重写为这种形式允许我们将$\\Vx$替换为特征函数$\\phi(\\Vx)$的输出，点积替换为被称为核函数的函数$k(\\Vx, \\Vx^{(i)}) = \\phi(\\Vx)\\cdot \\phi(\\Vx^{(i)})$。\n运算符$\\cdot$表示类似于$\\phi(\\Vx)^\\Tsp \\phi(\\Vx^{(i)})$的点积。\n对于某些特征空间，我们可能不会书面地使用向量内积。\n在某些无限维空间中，我们需要使用其他类型的内积，如基于积分而非加和的内积。\n这种类型内积的完整介绍超出了本书的范围。\n\n使用核估计替换点积之后，我们可以使用如下函数进行预测\n\\begin{equation}\n    f(\\Vx) = b + \\sum_i \\alpha_i k(\\Vx, \\Vx^{(i)}) .\n\\end{equation}\n这个函数关于$\\Vx$是非线性的，关于$\\phi(\\Vx)$是线性的。\n$\\Valpha$和$f(\\Vx)$之间的关系也是线性的。\n核函数完全等价于用$\\phi(\\Vx)$预处理所有的输入，然后在新的转换空间学习线性模型。\n\n核技巧十分强大有两个原因。\n首先，它使我们能够使用保证有效收敛的凸优化技术来学习非线性模型（关于$\\Vx$的函数）。\n这是可能的，因为我们可以认为$\\phi$是固定的，仅优化$\\alpha$，即优化算法可以将决策函数视为不同空间中的线性函数。\n其二，核函数$k$的实现方法通常有比直接构建$\\phi(\\Vx)$再算点积高效很多。\n\n在某些情况下，$\\phi(\\Vx)$甚至可以是无限维的，对于普通的显式方法而言，这将是无限的计算代价。\n在很多情况下，即使$\\phi(\\Vx)$是难算的，$k(\\Vx,\\Vx')$却会是一个关于$\\Vx$非线性的、易算的函数。\n举个无限维空间易算的核的例子，我们构建一个作用于非负整数$x$上的特征映射$\\phi(x)$。\n假设这个映射返回一个由开头$x$个$1$，随后是无限个$0$的向量。\n我们可以写一个核函数$k(x,x^{(i)}) = \\min(x, x^{(i)})$，完全等价于对应的无限维点积。\n\n<!-- % -- 138 -- -->\n\n最常用的核函数是高斯核，\n\\begin{equation}\n    k(\\Vu, \\Vv) = \\mathcal{N} (\\Vu - \\Vv; \\mathbf{0}, \\sigma^2 I) ,\n\\end{equation}\n其中$\\mathcal{N}(x; \\Vmu, \\VSigma)$是标准正态密度。\n这个核也被称为径向基函数核，因为其值沿$\\Vv$中从$\\Vu$向外辐射的方向减小。\n高斯核对应于无限维空间中的点积，但是该空间的推导没有整数上最小核的示例那么直观。\n\n我们可以认为高斯核在执行一种\\textbf{模板匹配}(template matching)。\n训练标签 $y$相关的训练样本 $\\Vx$变成了类别$y$的模版。\n当测试点$\\Vx'$到$\\Vx$的欧几里得距离很小，对应的高斯核响应很大时，表明$\\Vx'$和模版$\\Vx$非常相似。\n该模型进而会赋予相对应的训练标签 $y$较大的权重。\n总的来说，预测将会组合很多这种通过训练样本相似度加权的训练标签。\n\n支持向量机不是唯一可以使用核技巧来增强的算法。\n许多其他的线性模型也可以通过这种方式来增强。\n使用核技巧的算法类别被称为核机器或核方法{cite?}。    \n\n核机器的一个主要缺点是计算决策函数的成本关于训练样本的数目是线性的。\n因为第$i$个样本贡献$\\alpha_i k(\\Vx, \\Vx^{(i)})$到决策函数。\n支持向量机能够通过学习主要包含零的向量$\\Valpha$，以缓和这个缺点。\n那么判断新样本的类别仅需要计算非零$\\alpha_i$对应的训练样本的核函数。\n这些训练样本被称为支持向量。\n\n当数据集很大时，核机器的计算量也会很大。\n我们将会在\\sec?回顾这个想法。\n带通用核的核机器致力于泛化得更好。\n我们将在\\sec?解释原因。\n现代深度学习的设计旨在克服核机器的这些限制。\n当前深度学习的复兴始于~{Hinton06-small}表明神经网络能够在MNIST基准数据上胜过RBF核的支持向量机。\n\n<!-- % -- 139 -- -->\n\n\n## 其他简单的监督学习算法\n\n我们已经简要介绍过另一个非概率监督学习算法，最近邻回归。\n更一般地，k-最近邻是一类可用于分类或回归的技术。\n作为一个非参数学习算法，$k$-最近邻并不局限于固定数目的参数。\n我们通常认为$k$-最近邻算法没有任何参数，而是使用训练数据的简单函数。\n事实上，它甚至也没有一个真正的训练阶段或学习过程。\n反之，在测试阶段我们希望在新的测试输入$\\Vx$上产生$y$，我们需要在训练数据$\\MX$上找到$\\Vx$的$k$-最近邻。\n然后我们返回训练集上对应的$y$值的平均值。\n这几乎适用于任何类型可以确定$y$值平均值的监督学习。\n在分类情况中，我们可以关于~one-hot~编码向量$\\Vc$求平均，其中$c_y = 1$，其他的$i$值取$c_i=0$。\n然后，我们可以解释这些~one-hot~编码的均值为类别的概率分布。\n作为一个非参数学习算法，$k$-近邻能达到非常高的容量。\n例如，假设我们有一个用$0$-$1$误差度量性能的多分类任务。\n在此设定中，当训练样本数目趋向于无穷大时，$1$-最近邻收敛到两倍贝叶斯误差。\n超出贝叶斯误差的原因是它会随机从等距离的临近点中随机挑一个。\n而存在无限的训练数据时，所有测试点$\\Vx$周围距离为零的邻近点有无限多个。\n如果我们使用所有这些临近点投票的决策方式，而不是随机挑选一个，那么该过程将会收敛到贝叶斯错误率。\n$k$-最近邻的高容量使其在训练样本数目大时能够获取较高的精度。\n然而，它的计算成本很高，另外在训练集较小时泛化能力很差。\n$k$-最近邻的一个弱点是它不能学习出哪一个特征比其他更具识别力。\n例如，假设我们要处理一个的回归任务，其中$\\Vx\\in\\SetR^{100}$是从各向同性的高斯分布中抽取的，但是只有一个变量$x_1$和结果相关。\n进一步假设该特征直接决定了输出，即在所有情况中$y=x_1$。\n最近邻回归不能检测到这个简单模式。\n大多数点$\\Vx$的最近邻将取决于$x_2$到$x_{100}$的大多数特征，\n而不是单独取决于特征 $x_1$。\n因此，小训练集上的输出将会非常随机。\n\n<!-- % -- 140 -- -->\n\n决策树及其变种是另一类将输入空间分成不同的区域，每个区域有独立参数的算法{cite?}。\n如\\fig?所示，决策树的每个节点都与输入空间的一个区域相关联，并且内部节点继续将区域分成子节点下的子区域（通常使用坐标轴拆分区域）。\n空间由此细分成不重叠的区域，叶节点和输入区域之间形成一一对应的关系。\n每个叶结点将其输入区域的每个点映射到相同的输出。\n决策树通常有特定的训练算法，超出了本书的范围。\n如果允许学习任意大小的决策树，那么它可以被视作非参数算法。\n然而实践中通常有大小限制，作为正则化项将其转变成有参模型。\n由于决策树通常使用坐标轴相关的拆分，并且每个子节点关联到常数输出，因此有时解决一些对于逻辑回归很简单的问题很费力。\n例如，假设有一个二分类问题，当$x_2>x_1$时分为正类，则决策树的分界不是坐标轴对齐的。\n因此，决策树将需要许多节点近似决策边界，坐标轴对齐使其算法步骤不断地来回穿梭于真正的决策函数。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/decision_tree}}\n\\fi\n\\caption{描述一个决策树如何工作的示意图。\\emph{(上)}树中每个节点都选择将输入样本送到左子节点($0$)或者右子节点($1$)。内部的节点用圆圈表示，叶节点用方块表示。每一个节点可以用一个二值的字符串识别并对应树中的位置，这个字符串是通过给起父亲节点的字符串添加一个位元来实现的（$0$表示选择左或者上，$1$表示选择右或者下）。\\emph{(下)}这个树将空间分为区域。这个二维平面说明决策树可以分割$\\SetR^2$。这个平面中画出了树的节点，每个内部点穿过分割线并用来给样本分类，叶节点画在样本所属区域的中心。结果是一个分块常数函数，每一个叶节点一个区域。每个叶需要至少一个训练样本来定义，所以决策树不可能用来学习一个局部极大值比训练样本数量还多的函数。}\n\\end{figure}\n\n正如我们已经看到的，最近邻预测和决策树都有很多的局限性。\n尽管如此，在计算资源受限制时，它们都是很有用的学习算法。\n通过思考复杂算法和$k$-最近邻或决策树之间的相似性和差异，我们可以建立对更复杂学习算法的直觉。\n\n读者可以参考~{MurphyBook2012,bishop-book2006,Hastie2001}或其他机器学习教科书了解更多的传统监督学习算法。\n\n\n# 无监督学习算法\n\n回顾\\sec?，无监督算法只处理\"特征\"，不操作监督信号。\n监督和无监督算法之间的区别没有规范严格的定义，因为没有客观的判断来区分监督者提供的值是特征还是目标。\n通俗地说，无监督学习的大多数尝试是指从不需要人为注释的样本的分布中抽取信息。\n该术语通常与密度估计相关，学习从分布中采样、学习从分布中去噪、寻找数据分布的流形或是将数据中相关的样本聚类。\n\n一个经典的无监督学习任务是找到数据的\"最佳\"表示。\n\"最佳\"可以是不同的表示，但是一般来说，是指该表示在比本身表示的信息\\emph{更简单}或更易访问而受到一些惩罚或限制的情况下，尽可能地保存关于$\\Vx$更多的信息。 \n\n<!-- % -- 142 -- -->\n\n有很多方式定义较简单的表示。最常见的三种包括低维表示、稀疏表示和独立表示。\n低维表示尝试将$\\Vx$中的信息尽可能压缩在一个较小的表示中。\n稀疏表示将数据集嵌入到输入项大多数为零的表示中{cite?}。\n稀疏表示通常用于需要增加表示维数的情况，使得大部分为零的表示不会丢失很多信息。\n这会使得表示的整体结构倾向于将数据分布在表示空间的坐标轴上。\n独立表示试图\\emph{分开}数据分布中变化的来源，使得表示的维度是统计独立的。\n\n当然这三个标准并非相互排斥的。\n低维表示通常会产生比原始的高维数据具有较少或较弱依赖关系的元素。\n这是因为减少表示大小的一种方式是找到并消除冗余。\n识别并去除更多的冗余使得降维算法在丢失更少信息的同时显现更大的压缩。\n\n表示的概念是深度学习核心主题之一，因此也是本书的核心主题之一。\n本节会介绍表示学习算法中的一些简单示例。\n总的来说，这些示例算法会说明如何实施上面的三个标准。\n剩余的大部分章节会介绍额外的表示学习算法，它们以不同方式处理这三个标准或是引入其他标准。\n\n\n## 主成分分析\n\n在\\sec?中，我们看到\\,PCA\\,算法提供了一种压缩数据的方式。\n我们也可以将\\,PCA\\,视为学习数据表示的无监督学习算法。\n这种表示基于上述简单表示的两个标准。\n\\,PCA\\,学习一种比原始输入维数更低的表示。\n它也学习了一种元素之间彼此没有线性相关的表示。\n这是学习表示中元素统计独立标准的第一步。\n要实现完全独立性，表示学习算法也必须去掉变量间的非线性关系。\n\n<!-- % -- 143 -- -->\n\n如\\fig?所示，PCA\\,将输入$\\Vx$投影表示成$\\Vz$，学习数据的正交线性变换。\n在\\sec?中，我们看到了如何学习重建原始数据的最佳一维表示（就均方误差而言），这种表示其实对应着数据的第一个主要成分。\n因此，我们可以用\\,PCA\\,作为保留数据尽可能多信息的降维方法（再次就最小重构误差平方而言）。\n在下文中，我们将研究\\,PCA\\,表示如何使原始数据表示$\\MX$去相关的.\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/pca_color}}\n\\fi\n\\caption{PCA\\,学习一种线性投影，使最大方差的方向和新空间的轴对齐。\\emph{(左)}原始数据包含了$\\Vx$的样本。在这个空间中，方差的方向与轴的方向并不是对齐的。\\emph{(右)}变换过的数据$\\Vz = \\Vx^{\\top}\\MW$在轴$z_1$的方向上有最大的变化。第二大变化方差的方向沿着轴$z_2$。}\n\\end{figure}\n\n假设有一个$m\\times n$的设计矩阵 $\\MX$，数据的均值为零，$\\SetE[\\Vx\\,] = 0$。\n若非如此，通过预处理步骤使所有样本减去均值，数据可以很容易地中心化。\n\n$\\MX$对应的无偏样本协方差矩阵给定如下\n\\begin{equation}\n    \\text{Var}[\\Vx\\,] = \\frac{1}{m-1} \\MX^\\Tsp \\MX .\n\\end{equation}\nPCA\\,通过线性变换找到一个$\\text{Var}[\\Vz]$是对角矩阵的表示$\\Vz=\\MW^\\Tsp\\Vx$。\n\n在\\sec?，我们已知设计矩阵 $\\MX$的主成分由$\\MX^\\Tsp\\MX$的特征向量给定。\n从这个角度，我们有\n\\begin{equation}\n    \\MX^\\Tsp\\MX = \\MW \\VLambda \\MW^\\Tsp .\n\\end{equation}\n本节中，我们会探索主成分的另一种推导。\n主成分也可以通过奇异值分解(SVD)得到。\n具体来说，它们是$\\MX$的右奇异向量。\n为了说明这点，假设$\\MW$是奇异值分解$\\MX = \\MU\\VSigma\\MW^\\Tsp$的右奇异向量。\n以$\\MW$作为特征向量基，我们可以得到原来的特征向量方程：\n\\begin{equation}\n    \\MX^\\Tsp\\MX = \\left( \\MU\\VSigma \\MW^\\Tsp \\right)^\\Tsp \\MU\\VSigma \\MW^\\Tsp = \n    \\MW \\VSigma^2 \\MW^\\Tsp .\n\\end{equation}\n\n<!-- % -- 144 -- -->\n\nSVD\\,有助于说明\\,PCA\\,后的$\\text{Var}[\\Vz]$是对角的。\n使用$\\MX$的\\,SVD\\,分解，$\\MX$的方差可以表示为\n\\begin{align}\n    \\text{Var}[\\Vx] &= \\frac{1}{m-1} \\MX^\\Tsp\\MX \\\\\n    &= \\frac{1}{m-1} \\left( \\MU\\VSigma \\MW^\\Tsp \\right)^\\Tsp \\MU\\VSigma \\MW^\\Tsp \\\\\n    &= \\frac{1}{m-1} \\MW \\VSigma^\\Tsp \\MU^\\Tsp \\MU\\VSigma \\MW^\\Tsp \\\\\n    &= \\frac{1}{m-1} \\MW \\VSigma^2 \\MW^\\Tsp ,\n\\end{align}\n其中，我们使用$\\MU^\\Tsp\\MU = \\MI$，因为根据奇异值的定义矩阵$\\MU$是正交的。\n这表明$\\Vz$的协方差满足对角的要求：\n\\begin{align}\n    \\text{Var}[\\Vz] &= \\frac{1}{m-1} \\MZ^\\Tsp\\MZ \\\\\n    &= \\frac{1}{m-1} \\MW^\\Tsp \\MX^\\Tsp \\MX \\MW \\\\\n    &= \\frac{1}{m-1} \\MW^\\Tsp\\MW \\VSigma^2 \\MW^\\Tsp\\MW \\\\\n    &= \\frac{1}{m-1} \\VSigma^2 ,\n\\end{align}\n其中，再次使用\\,SVD\\,的定义有$\\MW^\\Tsp\\MW = \\MI$。\n\n以上分析指明当我们通过线性变换$\\MW$将数据$\\Vx$投影到$\\Vz$时，得到的数据表示的协方差矩阵是对角的（即$\\VSigma^2$），立刻可得$\\Vz$中的元素是彼此无关的。\n\nPCA\\,这种将数据变换为元素之间彼此不相关表示的能力是\\,PCA\\,的一个重要性质。\n它是\\emph{消除数据中未知变化因素}的简单表示示例。\n在\\,PCA\\,中，这个消除是通过寻找输入空间的一个旋转（由$\\MW$确定），\n使得方差的主坐标和$\\Vz$相关的新表示空间的基对齐。\n\n<!-- % -- 145 -- -->\n\n虽然相关性是数据元素间依赖关系的一个重要范畴，但我们对于能够消除更复杂形式的特征依赖的表示学习也很感兴趣。\n对此，我们需要比简单线性变换更强的工具。\n\n\n## $k$-均值聚类\n\n另外一个简单的表示学习算法是$k$-均值聚类。\n$k$-均值聚类算法将训练集分成$k$个靠近彼此的不同样本聚类。\n因此我们可以认为该算法提供了$k$-维的~one-hot~编码向量$\\Vh$以表示输入$\\Vx$。\n当$\\Vx$属于聚类$i$时，有$h_i=1$，$\\Vh$的其他项为零。\n\n$k$-均值聚类提供的~one-hot~编码也是一种稀疏表示，因为每个输入的表示中大部分元素为零。\n之后，我们会介绍能够学习更灵活的稀疏表示的一些其他算法（表示中每个输入$\\Vx$不只一个非零项）。\none-hot~编码是稀疏表示的一个极端示例，丢失了很多分布式表示的优点。\none-hot~编码仍然有一些统计优点（自然地传达了相同聚类中的样本彼此相似的观点），\n也具有计算上的优势，因为整个表示可以用一个单独的整数表示。\n\n$k$-均值聚类初始化$k$个不同的中心点$\\{\\Vmu^{(1)},\\dots,\\Vmu^{(k)}\\}$，然后迭代交换两个不同的步骤直到收敛。\n步骤一，每个训练样本分配到最近的中心点$\\Vmu^{(i)}$所代表的聚类$i$。\n步骤二，每一个中心点$\\Vmu^{(i)}$更新为聚类$i$中所有训练样本 $\\Vx^{(j)}$的均值。\n\n关于聚类的一个问题是聚类问题本身是病态的。\n这是说没有单一的标准去度量聚类的数据在真实世界中效果如何。\n我们可以度量聚类的性质，例如类中元素到类中心点的欧几里得距离的均值。\n这使我们可以判断从聚类分配中重建训练数据的效果如何。\n然而我们不知道聚类的性质是否很好地对应到真实世界的性质。\n此外，可能有许多不同的聚类都能很好地对应到现实世界的某些属性。\n我们可能希望找到和一个特征相关的聚类，但是得到了一个和任务无关的，同样是合理的不同聚类。\n例如，假设我们在包含红色卡车图片、红色汽车图片、灰色卡车图片和灰色汽车图片的数据集上运行两个聚类算法。\n如果每个聚类算法聚两类，那么可能一个算法将汽车和卡车各聚一类，另一个根据红色和灰色各聚一类。\n假设我们还运行了第三个聚类算法，用来决定类别的数目。\n这有可能聚成了四类，红色卡车、红色汽车、灰色卡车和灰色汽车。\n现在这个新的聚类至少抓住了属性的信息，但是丢失了相似性信息。\n红色汽车和灰色汽车在不同的类中，正如红色汽车和灰色卡车也在不同的类中。\n该聚类算法没有告诉我们灰色汽车和红色汽车的相似度比灰色卡车和红色汽车的相似度更高。\n我们只知道它们是不同的。\n\n<!-- % -- 146 -- -->\n\n这些问题说明了一些我们可能更偏好于分布式表示（相对于~one-hot~表示而言）的原因。\n分布式表示可以对每个车辆赋予两个属性——一个表示它颜色，一个表示它是汽车还是卡车。\n目前仍然不清楚什么是最优的分布式表示（学习算法如何知道我们关心的两个属性是颜色和是否汽车或卡车，而不是制造商和车龄？），\n但是多个属性减少了算法去猜我们关心哪一个属性的负担，允许我们通过比较很多属性而非测试一个单一属性来细粒度地度量相似性。\n\n\n# 随机梯度下降\n\n几乎所有的深度学习算法都用到了一个非常重要的算法：随机梯度下降。\n随机梯度下降是\\sec?介绍的梯度下降算法的一个扩展。\n\n机器学习中反复出现的一个问题是好的泛化需要大的训练集，但大的训练集的计算代价也更大。\n\n<!-- % -- 147 -- -->\n\n机器学习算法中的代价函数通常可以分解成每个样本的代价函数的总和。\n例如，训练数据的负条件对数似然可以写成\n\\begin{equation}\n    J(\\Vtheta) = \\SetE_{\\RVx,\\RSy \\sim \\hat{p}_{\\text{data}}}\n    L(\\Vx, y, \\Vtheta) = \n    \\frac{1}{m} \\sum_{i=1}^m  L(\\Vx^{(i)}, y^{(i)}, \\Vtheta) ,\n\\end{equation}\n其中$L$是每个样本的损失$L(\\Vx, y, \\Vtheta) = -\\log p(y\\mid\\Vx;\\Vtheta)$。\n\n对于这些相加的代价函数，梯度下降需要计算\n\\begin{equation}\n    \\nabla_{\\Vtheta} J(\\Vtheta)\n    = \\frac{1}{m} \\sum_{i=1}^m  \n    \\nabla_{\\Vtheta} L(\\Vx^{(i)}, y^{(i)}, \\Vtheta) .\n\\end{equation}\n这个运算的计算代价是$O(m)$。\n随着训练集规模增长为数十亿的样本，计算一步梯度也会消耗相当长的时间。\n\n随机梯度下降的核心是，梯度是期望。\n期望可使用小规模的样本近似估计。\n具体而言，在算法的每一步，我们从训练集中均匀抽出一小批量样本 $\\SetB=\\{\\Vx^{(1)},\\dots,\\Vx^{(m')}\\}$。\n小批量的数目$m'$通常是一个相对较小的数，从一到几百。\n重要的是，当训练集大小$m$增长时，$m'$通常是固定的。\n我们可能在拟合几十亿的样本时，每次更新计算只用到几百个样本。\n\n梯度的估计可以表示成\n\\begin{equation}\n    \\Vg = \\frac{1}{m'} \\nabla_{\\Vtheta} \\sum_{i=1}^{m'}\n    L(\\Vx^{(i)}, y^{(i)}, \\Vtheta).\n\\end{equation}\n使用来自小批量 $\\SetB$的样本。\n然后，随机梯度下降算法使用如下的梯度下降估计：\n\\begin{equation}\n    \\Vtheta \\leftarrow \\Vtheta - \\epsilon \\Vg,\n\\end{equation}\n其中，$\\epsilon$是学习率。\n\n梯度下降往往被认为很慢或不可靠。\n以前，将梯度下降应用到非凸优化问题被认为很鲁莽或没有原则。\n现在，我们知道梯度下降用于本书第二部分中的训练时效果不错。\n优化算法不一定能保证在合理的时间内达到一个局部最小值，但它通常能及时地找到代价函数一个很小的值，并且是有用的。\n\n<!-- % -- 148 -- -->\n\n随机梯度下降在深度学习之外有很多重要的应用。\n它是在大规模数据上训练大型线性模型的主要方法。\n对于固定大小的模型，每一步随机梯度下降更新的计算量不取决于训练集的大小$m$。\n在实践中，当训练集大小增长时，我们通常会使用一个更大的模型，但这并非是必须的。\n达到收敛所需的更新次数通常会随训练集规模增大而增加。\n然而，当$m$趋向于无穷大时，该模型最终会在随机梯度下降抽样完训练集上的所有样本之前收敛到可能的最优测试误差。\n继续增加$m$不会延长达到模型可能的最优测试误差的时间。\n从这点来看，我们可以认为用\\,SGD\\,训练模型的渐近代价是关于$m$的函数的$O(1)$级别。\n\n在深度学习兴起之前，学习非线性模型的主要方法是结合核技巧的线性模型。\n很多核学习算法需要构建一个$m\\times m$的矩阵$G_{i,j}=k(\\Vx^{(i)}, \\Vx^{(j)})$。\n构建这个矩阵的计算量是$O(m^2)$。\n当数据集是几十亿个样本时，这个计算量是不能接受的。\n在学术界，深度学习从2006年开始受到关注的原因是，在数以万计样本的中等规模数据集上，深度学习在新样本上比当时很多热门算法泛化得更好。\n不久后，深度学习在工业界受到了更多的关注，因为其提供了一种训练大数据集上的非线性模型的可扩展方式。\n\n我们将会在\\chap?继续探讨随机梯度下降及其很多改进方法。\n\n\n# 构建机器学习算法\n\n几乎所有的深度学习算法都可以被描述为一个相当简单的配方：特定的数据集、代价函数、优化过程和模型。\n\n例如，线性回归算法由以下部分组成：$\\MX$和$\\Vy$构成的数据集，代价函数\n\\begin{equation}\n    J(\\Vw, b) = -\\SetE_{\\RVx,\\RSy\\sim\\hat{p}_{\\text{data}}}\n    \\log p_{\\text{model}} (y \\mid \\Vx) ,\n\\end{equation}\n模型是$p_{\\text{model}} (y \\mid \\Vx) = \\mathcal{N}(y; \\Vx^\\Tsp \\Vw + b, 1)$，\n在大多数情况下，优化算法可以定义为求解代价函数梯度为零的正规方程。\n\n意识到我们可以替换独立于其他组件的大多数组件，因此我们能得到很多不同的算法。\n\n<!-- % -- 149 -- -->\n\n通常代价函数至少含有一项使学习过程进行统计估计的成分。\n最常见的代价函数是负对数似然，最小化代价函数导致的最大似然估计。\n\n代价函数也可能含有附加项，如正则化项。\n例如，我们可以将权重衰减加到线性回归的代价函数中\n\\begin{equation}\n    J(\\Vw, b) = \\lambda \\norm{\\Vw}_2^2 - \\SetE_{\\RVx,\\RSy\\sim \\hat{p}_{\\text{data}}}\n    \\log p_{\\text{model}} (y \\mid \\Vx) .\n\\end{equation}\n该优化仍然有闭解。\n\n如果我们将该模型变成非线性的，那么大多数代价函数不再能通过闭解优化。\n这就要求我们选择一个迭代数值优化过程，如梯度下降等。\n\n组合模型、代价和优化算法来构建学习算法的配方同时适用于监督学习和无监督学习。\n线性回归示例说明了如何适用于监督学习的。\n无监督学习时，我们需要定义一个只包含$\\MX$的数据集、一个合适的无监督代价和一个模型。\n例如，通过指定如下损失函数可以得到\\,PCA\\,的第一个主向量\n\\begin{equation}\n    J(\\Vw) = \\SetE_{\\RVx \\sim \\hat{p}_{\\text{data}}} \\norm{\\Vx - r(\\Vx; \\Vw)}_2^2\n\\end{equation}\n模型定义为重构函数$r(\\Vx) = \\Vw^\\Tsp\\Vx \\,\\Vw$，并且$\\Vw$有范数为$1$的限制。\n\n在某些情况下，由于计算原因，我们不能实际计算代价函数。\n在这种情况下，只要我们有近似其梯度的方法，那么我们仍然可以使用迭代数值优化近似最小化目标。\n\n尽管有时候不显然，但大多数学习算法都用到了上述配方。\n如果一个机器学习算法看上去特别独特或是手动设计的，那么通常需要使用特殊的优化方法进行求解。\n有些模型，如决策树或$k$-均值，需要特殊的优化，因为它们的代价函数有平坦的区域，\n使其不适合通过基于梯度的优化去最小化。\n在我们认识到大部分机器学习算法可以使用上述配方描述之后，我们可以将不同算法视为出于相同原因解决相关问题的一类方法，而不是一长串各个不同的算法。\n\n<!-- % -- 150 -- -->\n\n\n# 促使深度学习发展的挑战\n\n本章描述的简单机器学习算法在很多不同的重要问题上效果都良好。\n但是它们不能成功解决人工智能中的核心问题，如语音识别或者对象识别。\n\n深度学习发展动机的一部分原因是传统学习算法在这类人工智能问题上泛化能力不足。\n\n本节介绍为何处理高维数据时在新样本上泛化特别困难，以及为何在传统机器学习中实现泛化的机制不适合学习高维空间中复杂的函数。\n这些空间经常涉及巨大的计算代价。\n深度学习旨在克服这些以及其他一些难题。\n\n\n## 维数灾难\n\n当数据的维数很高时，很多机器学习问题变得相当困难。\n这种现象被称为维数灾难。\n特别值得注意的是，一组变量不同的可能配置数量会随着变量数目的增加而指数级增长。\n\n维数灾难发生在计算机科学的许多地方，在机器学习中尤其如此。\n\n由维数灾难带来的一个挑战是统计挑战。\n如\\fig?所示，统计挑战产生于$\\Vx$的可能配置数目远大于训练样本的数目。\n为了充分理解这个问题，我们假设输入空间如图所示被分成单元格。\n空间是低维时，我们可以用由大部分数据占据的少量单元格去描述这个空间。\n泛化到新数据点时，通过检测和新输入点在相同单元格中的训练样本，我们可以判断如何处理新数据点。\n例如，如果要估计某点$\\Vx$处的概率密度，我们可以返回$\\Vx$处单位体积单元格内训练样本的数目除以训练样本的总数。\n如果我们希望对一个样本进行分类，我们可以返回相同单元格中训练样本最多的类别。\n如果我们是做回归分析，我们可以平均该单元格中样本对应的目标值。\n但是，如果该单元格中没有样本，该怎么办呢？  \n因为在高维空间中参数配置数目远大于样本数目，大部分单元格中没有样本。 \n我们如何能在这些新配置中找到一些有意义的东西呢？\n许多传统机器学习算法只是简单地假设在一个新点的输出应大致和最接近的训练点的输出相同。\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{ccc}\n    \\includegraphics[width=0.3\\textwidth]{Chapter5/figures/curse_1d_color} & \\includegraphics[width=0.3\\textwidth]{Chapter5/figures/curse_2d_color} & \\includegraphics[width=0.3\\textwidth]{Chapter5/figures/curse_3d_color}\n\\end{tabular}\n\\fi\n\\caption{当数据的相关维度增大时（从左向右），我们感兴趣的配置数目会随之指数级增长。\\emph{(左)}在这个一维的例子中，我们用一个变量来区分所感兴趣的$10$个区域。当每个区域都有足够的样本数时（每个区域对应图中的一个单元格），学习算法能够轻易地泛化得很好。泛化的一个直接方法是估计目标函数在每个区域的值（可能是在相邻区域之间插值）。\\emph{(中)}在二维情况下，对每个变量区分$10$个不同的值更加困难。我们需要追踪$10\\times10=100$个区域，至少需要很多样本来覆盖所有的区域。\\emph{(右)}三维情况下，区域数量增加到了$10^3=1000$，至少需要那么多的样本。对于需要区分的$d$维以及$v$个值来说，我们需要$O(v^d)$个区域和样本。这就是维数灾难的一个示例。感谢由Nicolas Chapados提供的图片。}\n\\end{figure}\n\n<!-- % -- 151 -- -->\n\n\n## 局部不变性和平滑正则化\n\n为了更好地泛化，机器学习算法需要由先验信念引导应该学习什么类型的函数。\n此前，我们已经看到过由模型参数的概率分布形成的先验。\n通俗地讲，我们也可以说先验信念直接影响\\emph{函数}本身，而仅仅通过它们对函数的影响来间接改变参数。 \n此外，我们还能通俗地说，先验信念还间接地体现在选择一些偏好某类函数的算法，尽管这些偏好并没有通过我们对不同函数置信程度的概率分布表现出来（也许根本没法表现）。\n\n<!-- % -- 152 -- -->\n\n其中最广泛使用的隐式\"先验\"是平滑先验，或局部不变性先验。\n这个先验表明我们学习的函数不应在小区域内发生很大的变化。\n\n许多简单算法完全依赖于此先验达到良好的泛化，其结果是不能推广去解决人工智能级别任务中的统计挑战。\n本书中，我们将介绍深度学习如何引入额外的（显式或隐式的）先验去降低复杂任务中的泛化误差。\n这里，我们解释为什么仅依靠平滑先验不足以应对这类任务。\n\n有许多不同的方法来显式或隐式地表示学习函数应该具有光滑或局部不变的先验。\n所有这些不同的方法都旨在鼓励学习过程能够学习出函数$f^*$，对于大多数设置$\\Vx$和小变动$\\epsilon$，都满足条件\n\\begin{equation}\n    f^*(\\Vx) \\approx f^*(\\Vx + \\epsilon).\n\\end{equation}\n换言之，如果我们知道对应输入$\\Vx$的答案（例如，$\\Vx$是个有标签的训练样本），那么该答案对于$\\Vx$的邻域应该也适用。\n如果在有些邻域中我们有几个好答案，那么我们可以组合它们（通过某种形式的平均或插值法）以产生一个尽可能和大多数输入一致的答案。\n\n局部不变方法的一个极端例子是$k$-最近邻系列的学习算法。\n当一个区域里的所有点$\\Vx$在训练集中的$k$个最近邻是一样的，那么对这些点的预测也是一样的。\n当$k=1$时，不同区域的数目不会比训练样本还多。\n\n虽然$k$-最近邻算法复制了附近训练样本的输出，大部分核机器也是在和附近训练样本相关的训练集输出上插值。\n一类重要的核函数是局部核，其核函数$k(\\Vu,\\Vv)$在$\\Vu=\\Vv$时很大，\n当$\\Vu$和$\\Vv$距离拉大时而减小。\n局部核可以看作是执行模版匹配的相似函数，用于度量测试样本 $\\Vx$和每个训练样本 $\\Vx^{(i)}$有多么相似。\n近年来深度学习的很多推动力源自研究局部模版匹配的局限性，以及深度学习如何克服这些局限性{cite?}。\n\n决策树也有平滑学习的局限性，因为它将输入空间分成和叶节点一样多的区间，并在每个区间使用单独的参数（或者有些决策树的拓展有多个参数）。\n如果目标函数需要至少拥有$n$个叶节点的树才能精确表示，那么至少需要$n$个训练样本去拟合。\n需要几倍于$n$的样本去达到预测输出上的某种统计置信度。\n\n<!-- % -- 153 -- -->\n\n总的来说，区分输入空间中$O(k)$个区间，所有的这些方法需要$O(k)$个样本。\n通常会有$O(k)$个参数，$O(1)$参数对应于$O(k)$区间之一。\n最近邻算法中，每个训练样本至多用于定义一个区间，如\\fig?所示。\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/non_distributed}}\n\\fi\n\\caption{最近邻算法如何划分输入空间的示例。每个区域内的一个样本（这里用圆圈表示）定义了区域边界（这里用线表示）。每个样本相关的$y$值定义了对应区域内所有数据点的输出。由最近邻定义并且匹配几何模式的区域被称为Voronoi图。这些连续区域的数量不会比训练样本的数量增加得更快。尽管此图具体说明了最近邻算法的效果，其他的单纯依赖局部光滑先验的机器学习算法也表现出了类似的泛化能力：每个训练样本仅仅能告诉学习者如何在其周围的相邻区域泛化。}\n\\end{figure}\n\n\n有没有什么方法能表示区间数目比训练样本数目还多的复杂函数？\n显然，只是假设函数的平滑性不能做到这点。\n例如，想象目标函数作用在西洋跳棋盘上。\n棋盘包含许多变化，但只有一个简单的结构。\n想象一下，如果训练样本数目远小于棋盘上的黑白方块数目，那么会发生什么。\n基于局部泛化和平滑性或局部不变性先验，如果新点和某个训练样本位于相同的棋盘方块中，那么我们能够保证正确地预测新点的颜色。\n但如果新点所在的方块没有训练样本，学习器不一定能举一反三。\n如果仅依靠这个先验，一个样本只能告诉我们它所在的方块的颜色。\n获得整个棋盘颜色的唯一方法是其上的每个方块至少要有一个样本。\n\n<!-- % -- 154 -- -->\n\n只要在要学习的真实函数的峰值和谷值处有足够多的样本，那么平滑性假设和相关的无参数学习算法的效果都非常好。\n当要学习的函数足够平滑，并且只在少数几维变化，这样做一般没问题。\n在高维空间中，即使是非常平滑的函数，也会在不同维度上有不同的变化方式。\n如果函数在不同的区间中表现不一样，那么就非常难用一组训练样本去刻画函数。\n如果函数是复杂的（我们想区分多于训练样本数目的大量区间），有希望很好地泛化么？\n\n这些问题，即是否可以有效地表示复杂的函数以及所估计的函数是否可以很好地泛化到新的输入，答案是有。\n关键观点是，只要我们通过额外假设生成数据的分布来建立区域间的依赖关系，那么$O(k)$个样本足以描述多如$O(2^k)$的大量区间。\n通过这种方式，我们确实能做到非局部的泛化{cite?}。\n为了利用这些优势，许多不同的深度学习算法都提出了一些适用于多种\\,AI\\,任务的隐式或显式的假设。\n\n\n一些其他的机器学习方法往往会提出更强的，针对特定问题的假设。\n例如，假设目标函数是周期性的，我们很容易解决棋盘问题。\n通常，神经网络不会包含这些很强的（针对特定任务的）假设，因此神经网络可以泛化到更广泛的各种结构中。\n人工智能任务的结构非常复杂，很难限制到简单的、人工手动指定的性质，如周期性，因此我们希望学习算法具有更通用的假设。\n深度学习的核心思想是假设数据由\\emph{因素或特征组合}产生，这些因素或特征可能来自一个层次结构的多个层级。\n许多其他类似的通用假设进一步提高了深度学习算法。\n这些很温和的假设允许了样本数目和可区分区间数目之间的指数增益。\n这类指数增益将在\\sec?、\\sec?和\\sec?中更详尽地介绍。\n深度的分布式表示带来的指数增益有效地解决了维数灾难带来的挑战。\n\n<!-- % -- 155 -- -->\n\n\n## 流形学习\n\n流形是一个机器学习中很多想法内在的重要概念。\n\n流形指连接在一起的区域。\n数学上，它是指一组点，且每个点都有其邻域。\n给定一个任意的点，其流形局部看起来像是欧几里得空间。\n日常生活中，我们将地球视为二维平面，但实际上它是三维空间中的球状流形。\n\n每个点周围邻域的定义暗示着存在变换能够从一个位置移动到其邻域位置。\n例如在地球表面这个流形中，我们可以朝东南西北走。\n\n尽管术语\"流形\"有正式的数学定义，但是机器学习倾向于更松散地定义一组点，只需要考虑少数嵌入在高维空间中的自由度或维数就能很好地近似。\n每一维都对应着局部的变化方向。\n如\\fig?所示，训练数据位于二维空间中的一维流形中。\n在机器学习中，我们允许流形的维数从一个点到另一个点有所变化。\n这经常发生于流形和自身相交的情况中。\n例如，数字\"8\"形状的流形在大多数位置只有一维，但在中心的相交处有两维。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter5/figures/one_dim_manifold_and_data_color}}\n\\fi\n\\caption{从一个二维空间的分布中抽取的数据样本，这些样本实际上聚集在一维流形附近，像一个缠绕的带子。实线代表学习器应该推断的隐式流形。}\n\\end{figure}\n\n如果我们希望机器学习算法学习整个$\\SetR^n$上有趣变化的函数，那么很多机器学习问题看上去都是无望的。\n流形学习算法通过一个假设来克服这个障碍，该假设认为$\\SetR^n$中大部分区域都是无效的输入，有意义的输入只分布在包含少量数据点的子集构成的一组流形中，而学习函数的输出中，有意义的变化都沿着流形的方向或仅发生在我们切换到另一流形时。\n流形学习最初用于连续数值和无监督学习的环境，尽管这个概率集中的想法也能够泛化到离散数据和监督学习的设定下：关键假设仍然是概率质量高度集中。\n\n\n<!-- % -- 156 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.7\\textwidth]{Chapter5/figures/noise}}\n\\fi\n\\caption{随机地均匀抽取图像（根据均匀分布随机地选择每一个像素）会得到噪声图像。\n尽管在人工智能应用中以这种方式生成一个脸或者其他物体的图像是非零概率的，但是实际上我们从来没有观察到这种现象。\n这也意味着人工智能应用中遇到的图像在所有图像空间中的占比可以是忽略不计的。}\n\\end{figure}\n\n\n数据位于低维流形的假设并不总是对的或者有用的。\n我们认为在人工智能的一些场景中，如涉及到处理图像、声音或者文本时，流形假设至少是近似对的。\n这个假设的支持证据包含两类观察结果。\n\n第一个支持流形假设的观察是现实生活中的图像、文本、声音的概率分布都是高度集中的。\n均匀的噪声从来不会与这类领域的结构化输入类似。\n\\fig?显示均匀采样的点看上去像是没有信号时模拟电视上的静态模式。\n同样，如果我们均匀地随机抽取字母来生成文件，能有多大的概率得到一个有意义的英语文档？\n几乎是零。\n因为大部分字母长序列不对应着自然语言序列：\n自然语言序列的分布只占了字母序列的总空间里非常小的一部分。\n\n\n当然，集中的概率分布不足以说明数据位于一个相当小的流形中。\n我们还必须确保，我们遇到的样本和其他样本相互连接，每个样本被其他高度相似的样本包围，而这些高度相似的样本可以通过变换来遍历该流形得到。\n支持流形假设的第二个论点是，我们至少能够非正式地想象这些邻域和变换。\n在图像中，我们当然会认为有很多可能的变换仍然允许我们描绘出图片空间的流形：\n我们可以逐渐变暗或变亮光泽、逐步移动或旋转图中对象、逐渐改变对象表面的颜色等等。\n在大多数应用中很有可能会涉及到多个流形。\n例如，人脸图像的流形不太可能连接到猫脸图像的流形。\n\n<!-- % -- 157 -- -->\n\n这些支持流形假设的思维实验传递了一些支持它的直观理由。\n更严格的实验{cite?}在人工智能中备受关注的一大类数据集上支持了这个假设。\n\n当数据位于低维流形中时，使用流形中的坐标而非$\\SetR^n$中的坐标表示机器学习数据更为自然。\n日常生活中，我们可以认为道路是嵌入在三维空间的一维流形。\n我们用一维道路中的地址号码确定地址，而非三维空间中的坐标。\n提取这些流形中的坐标是非常具有挑战性的，但是很有希望改进许多机器学习算法。\n这个一般性原则能够用在很多情况中。\n\\fig?展示了包含人脸的数据集的流形结构。\n在本书的最后，我们会介绍一些学习这样的流形结构的必备方法。\n在\\fig?中，我们将看到机器学习算法如何成功完成这个目标。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter5/figures/QMUL-facedataset}}\n\\fi\n\\caption{QMUL Multiview Face数据集中的训练样本{cite?}，其中的物体是移动的从而覆盖对应两个旋转角度的二维流形。\n我们希望学习算法能够发现并且理出这些流形坐标。\n\\fig?提供了这样一个示例。}\n\\end{figure}\n\n第一部分介绍了数学和机器学习中的基本概念，这将用于本书其他章节中。\n至此，我们已经做好了研究深度学习的准备。\n\n<!-- % -- 159 -- -->\n\n\n\n"
  },
  {
    "path": "docs/_posts/2016-12-06-Chapter6_deep_feedforward_networks.md",
    "content": "---\ntitle: 深度前馈网络\nlayout: post\nshare: false\n---\n\n深度前馈网络，也叫作前馈神经网络或者多层感知机，是典型的深度学习模型。前馈网络的目标是近似某个函数$f^*$。\n例如，对于分类器，$y = f^*(\\Vx)$将输入$\\Vx$映射到一个类别$y$。\n前馈网络定义了一个映射$\\Vy = f(\\Vx; \\Vtheta)$，并且学习参数$\\Vtheta$的值，使它能够得到最佳的函数近似。\n\n这种模型被称为前向的，是因为信息流过$\\Vx$的函数，流经用于定义$f$的中间计算过程，最终到达输出$\\Vy$。\n<!-- %这里的feedforward是翻译成前向的，还是前馈的？ -->\n在模型的输出和模型本身之间没有反馈连接。\n当前馈神经网络被扩展成包含反馈连接时，它们被称为循环神经网络，在\\chap?介绍。\n\n前馈网络对于机器学习的从业者是极其重要的。\n它们是许多重要商业应用的基础。\n例如，用于对照片中的对象进行识别的卷积神经网络就是一种专门的前馈网络。\n前馈网络是通往循环网络之路的概念基石，后者在自然语言的许多应用中发挥着巨大作用。\n\n前馈神经网络被称作网络是因为它们通常用许多不同函数复合在一起来表示。\n该模型与一个有向无环图相关联，而图描述了函数是如何复合在一起的。\n例如，我们有三个函数$f^{(1)}, f^{(2)}$和$f^{(3)}$连接在一个链上以形成$f(\\Vx) = f^{(3)}(f^{(2)}(f^{(1)}(\\Vx)) )$。\n这些链式结构是神经网络中最常用的结构。\n在这种情况下，$f^{(1)}$被称为网络的第一层，$f^{(2)}$被称为第二层，以此类推。\n链的全长称为模型的深度。\n正是因为这个术语才出现了\"深度学习\"这个名字。\n前馈网络的最后一层被称为输出层。\n在神经网络训练的过程中，我们让$f(\\Vx)$去匹配$f^*(\\Vx)$的值。\n训练数据为我们提供了在不同训练点上取值的、含有噪声的$f^*(\\Vx)$的近似实例。\n每个样本$\\Vx$都伴随着一个标签$y\\approx f^*(\\Vx)$。\n训练样本直接指明了输出层在每一点$\\Vx$上必须做什么；它必须产生一个接近$y$的值。\n但是训练数据并没有直接指明其他层应该怎么做。\n学习算法必须决定如何使用这些层来产生想要的输出，但是训练数据并没有说每个单独的层应该做什么。\n相反，学习算法必须决定如何使用这些层来最好地实现$f^*$的近似。\n因为训练数据并没有给出这些层中的每一层所需的输出，所以这些层被称为隐藏层。\n\n<!-- % -- 163 -- -->\n\n最后，这些网络被称为\\emph{神经网络}是因为它们或多或少地受到神经科学的启发。\n网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度。\n向量的每个元素都可以被视为起到类似一个神经元的作用。\n除了将层想象成向量到向量的单个函数，我们也可以把层想象成由许多并行操作的单元组成，每个单元表示一个向量到标量的函数。\n每个单元在某种意义上类似一个神经元，它接收的输入来源于许多其他的单元，并计算它自己的激活值。\n使用多层向量值表示的想法来源于神经科学。\n用于计算这些表示的函数$f^{(i)}(\\Vx)$的选择，也或多或少地受到神经科学观测的指引，这些观测是关于生物神经元计算功能的。\n然而，现代的神经网络研究受到更多的是来自许多数学和工程学科的指引，并且神经网络的目标并不是完美地给大脑建模。\n我们最好将前馈神经网络想成是为了实现统计泛化而设计出的函数近似机，它偶尔从我们了解的大脑中提取灵感，但并不是大脑功能的模型。\n\n一种理解前馈网络的方式是从线性模型开始，并考虑如何克服它的局限性。\n线性模型，例如逻辑回归和线性回归，是非常吸引人的，因为无论是通过闭解形式还是使用凸优化，它们都能高效且可靠地拟合。\n线性模型也有明显的缺陷，那就是该模型的能力被局限在线性函数里，所以它无法理解任何两个输入变量间的相互作用。\n\n为了扩展线性模型来表示$\\Vx$的非线性函数，我们可以不把线性模型用于$\\Vx$本身，而是用在一个变换后的输入$\\phi(\\Vx)$上，这里$\\phi$是一个非线性变换。\n同样，我们可以使用\\sec?中描述的核技巧，来得到一个基于隐含地使用$\\phi$映射的非线性学习算法。\n我们可以认为$\\phi$提供了一组描述$\\Vx$的特征，或者认为它提供了$\\Vx$的一个新的表示。\n\n<!-- % -- 164 -- -->\n\n剩下的问题就是如何选择映射$\\phi$。\n\\begin{enumerate}\n+ 其中一种选择是使用一个通用的$\\phi$，例如无限维的$\\phi$，它隐含地用在基于~RBF~核的核机器上。\n如果$\\phi(\\Vx)$具有足够高的维数，我们总是有足够的能力来拟合训练集，但是对于测试集的泛化往往不佳。\n非常通用的特征映射通常只基于局部光滑的原则，并且没有将足够的先验信息进行编码来解决高级问题。\n\n+ 另一种选择是手动地设计$\\phi$。\n在深度学习出现以前，这一直是主流的方法。\n这种方法对于每个单独的任务都需要人们数十年的努力，从业者各自擅长特定的领域（如语音识别或计算机视觉），并且不同领域之间很难迁移(transfer)。\n\n+ 深度学习的策略是去学习$\\phi$。\n在这种方法中，我们有一个模型$y = f(\\Vx;\\theta, \\Vw) = \\phi(\\Vx; \\theta)^\\top \\Vw$。\n我们现在有两种参数：用于从一大类函数中学习$\\phi$的参数$\\Vtheta$，以及用于将$\\phi(\\Vx)$映射到所需的输出的参数$\\Vw$。\n这是深度前馈网络的一个例子，其中$\\phi$定义了一个隐藏层。\n这是三种方法中唯一一种放弃了训练问题的凸性的，但是利大于弊。\n在这种方法中，我们将表示参数化为$\\phi(\\Vx; \\Vtheta)$，并且使用优化算法来寻找$\\Vtheta$，使它能够得到一个好的表示。\n如果我们想要的话，这种方法也可以通过使它变得高度通用以获得第一种方法的优点——我们只需使用一个非常广泛的函数族$\\phi(\\Vx; \\Vtheta)$。\n这种方法也可以获得第二种方法的优点。\n人类专家可以将他们的知识编码进网络来帮助泛化，他们只需要设计那些他们期望能够表现优异的函数族$\\phi(\\Vx; \\Vtheta)$即可。\n这种方法的优点是人类设计者只需要寻找正确的函数族即可，而不需要去寻找精确的函数。\n\\end{enumerate}\n\n这种通过学习特征来改善模型的一般化原则不仅仅适用于本章描述的前馈神经网络。\n它是深度学习中反复出现的主题，适用于全书描述的所有种类的模型。\n前馈神经网络是这个原则的应用，它学习从$\\Vx$到$\\Vy$的确定性映射并且没有反馈连接。\n后面出现的其他模型会把这些原则应用到学习随机映射、学习带有反馈的函数以及学习单个向量的概率分布。\n\n<!-- % -- 165 -- -->\n\n本章我们先从前馈网络的一个简单例子说起。\n接着，我们讨论部署一个前馈网络所需的每个设计决策。\n首先，训练一个前馈网络至少需要做和线性模型同样多的设计决策：选择一个优化模型、代价函数以及输出单元的形式。\n我们先回顾这些基于梯度学习的基本知识，然后去面对那些只出现在前馈网络中的设计决策。\n前馈网络已经引入了隐藏层的概念，这需要我们去选择用于计算隐藏层值的激活函数。\n我们还必须设计网络的结构，包括网络应该包含多少层、这些层应该如何连接，以及每一层包含多少单元。\n在深度神经网络的学习中需要计算复杂函数的梯度。\n我们给出反向传播算法和它的现代推广，它们可以用来高效地计算这些梯度。\n最后，我们以某些历史观点来结束这一章。\n\n\n# 实例：学习XOR\n\n\n为了使前馈网络的想法更加具体，我们首先从一个可以完整工作的前馈网络说起。\n这个例子解决一个非常简单的任务：学习XOR函数。\n\nXOR函数（\"异或\"逻辑）是两个二进制值$x_1$和$x_2$的运算。\n当这些二进制值中恰好有一个为1时，XOR函数返回值为1。\n其余情况下返回值为0。\nXOR函数提供了我们想要学习的目标函数$y = f^*(\\Vx)$。\n我们的模型给出了一个函数$y=f(\\Vx; \\Vtheta)$并且我们的学习算法会不断调整参数$\\Vtheta$来使得$f$尽可能接近$f^*$。\n\n在这个简单的例子中，我们不会关心统计泛化。\n我们希望网络在这四个点$\\SetX =\\{[0, 0]^\\top, [0, 1]^\\top, [1, 0]^\\top, [1, 1]^\\top\\}$上表现正确。\n我们会用全部这四个点来训练我们的网络，唯一的挑战是拟合训练集。\n\n我们可以把这个问题当作是回归问题，并使用均方误差损失函数。\n我们选择这个损失函数是为了尽可能简化本例中用到的数学。\n在应用领域，对于二进制数据建模时，MSE通常并不是一个合适的损失函数。\n更加合适的方法将在\\sec?中讨论。\n\n<!-- % -- 166 -- -->\n\n评估整个训练集上表现的~MSE~损失函数为\n\\begin{equation}\nJ(\\Vtheta) = \\frac{1}{4} \\sum_{\\Vx\\in \\SetX} (f^*(\\Vx) - f(\\Vx; \\Vtheta))^2.\n\\end{equation}\n\n我们现在必须要选择我们模型$f(\\Vx; \\Vtheta)$的形式。\n假设我们选择一个线性模型，$\\Vtheta$包含$\\Vw$和$b$，那么我们的模型被定义成\n\\begin{equation}\nf(\\Vx; \\Vw, b) = \\Vx^\\top \\Vw + b.\n\\end{equation}\n我们可以使用正规方程关于$\\Vw$和$b$最小化$J(\\Vtheta)$，来得到一个闭式解。\n\n解正规方程以后，我们得到$\\Vw = 0$以及$b = \\frac{1}{2}$。\n线性模型仅仅是在任意一点都输出0.5。\n为什么会发生这种事？\n\\fig?演示了线性模型为什么不能用来表示XOR函数。\n解决这个问题的其中一种方法是使用一个模型来学习一个不同的特征空间，在这个空间上线性模型能够表示这个解。\n<!-- % fig 6.1 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/xor_space_gray}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{通过学习一个表示来解决XOR问题。\n图上的粗体数字标明了学得的函数必须在每个点输出的值。\n\\emph{(左)}直接应用于原始输入的线性模型不能实现XOR函数。\n当$x_1 = 0$时，模型的输出必须随着$x_2$的增大而增大。\n当$x_1 = 1$时，模型的输出必须随着$x_2$的增大而减小。\n线性模型必须对$x_2$使用固定的系数$w_2$。\n因此，线性模型不能使用$x_1$的值来改变$x_2$的系数，从而不能解决这个问题。 \n\\emph{(右)}在由神经网络提取的特征表示的变换空间中，线性模型现在可以解决这个问题了。\n在我们的示例解决方案中，输出必须为1的两个点折叠到了特征空间中的单个点。\n换句话说，非线性特征将$\\Vx = [1, 0]^\\top$和$\\Vx = [0, 1]^\\top$都映射到了特征空间中的单个点$\\Vh = [1, 0]^\\top$。\n线性模型现在可以将函数描述为$h_1$增大和$h_2$减小。\n在该示例中，学习特征空间的动机仅仅是使得模型的能力更大，使得它可以拟合训练集。\n在更现实的应用中，学习的表示也可以帮助模型泛化。}\n\\end{figure}\n\n\n具体来说，我们这里引入一个非常简单的前馈神经网络，它有一层隐藏层并且隐藏层中包含两个单元。\n见\\fig?中对该模型的解释。\n这个前馈网络有一个通过函数$f^{(1)}(\\Vx;\\MW, \\Vc)$计算得到的隐藏单元的向量$\\Vh$。\n这些隐藏单元的值随后被用作第二层的输入。\n第二层就是这个网络的输出层。\n输出层仍然只是一个线性回归模型，只不过现在它作用于$\\Vh$而不是$\\Vx$。\n网络现在包含链接在一起的两个函数：$\\Vh=f^{(1)}(\\Vx; \\MW, \\Vc)$和$y = f^{(2)}(\\Vh; \\Vw, b)$，完整的模型是$f(\\Vx; \\MW, \\Vc, \\Vw, b) = f^{(2)}(f^{(1)}(\\Vx))$。\n<!-- % fig 6.2 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/example_mlp}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{使用两种不同样式绘制的前馈网络的示例。\n具体来说，这是我们用来解决XOR问题的前馈网络。\n它有单个隐藏层，包含两个单元。\n\\emph{(左)}在这种样式中，我们将每个单元绘制为图中的一个节点。\n这种风格是清楚而明确的，但对于比这个例子更大的网络，它可能会消耗太多的空间。\n\\emph{(右)}在这种样式中，我们将表示每一层激活的整个向量绘制为图中的一个节点。\n这种样式更加紧凑。\n有时，我们对图中的边使用参数名进行注释，这些参数是用来描述两层之间的关系的。\n这里，我们用矩阵$\\MW$描述从$\\Vx$到$\\Vh$的映射，用向量$\\Vw$描述从$\\Vh$到$y$的映射。\n当标记这种图时，我们通常省略与每个层相关联的截距参数。}\n\\end{figure}\n\n\n$f^{(1)}$应该是哪种函数？线性模型到目前为止都表现不错，让$f^{(1)}$也是线性的似乎很有诱惑力。\n可惜的是，如果$f^{(1)}$是线性的，那么前馈网络作为一个整体对于输入仍然是线性的。\n暂时忽略截距项，假设$f^{(1)}(\\Vx)= \\MW^\\top \\Vx$并且$f^{(2)}(\\Vh)=\\Vh^\\top \\Vw$，那么$f(\\Vx) = \\Vw^\\top\\MW^\\top \\Vx$。\n我们可以将这个函数重新表示成$f(\\Vx) = \\Vx^\\top\\Vw'$其中$\\Vw' = \\MW\\Vw$。\n\n<!-- % -- 167 -- -->\n\n显然，我们必须用非线性函数来描述这些特征。\n大多数神经网络通过仿射变换之后紧跟着一个被称为激活函数的固定非线性函数来实现这个目标，其中仿射变换由学得的参数控制。\n我们这里使用这种策略，定义$\\Vh=g(\\MW^\\top \\Vx+\\Vc)$，其中$\\MW$是线性变换的权重矩阵，$\\Vc$是偏置。\n此前，为了描述线性回归模型，我们使用权重向量和一个标量的偏置参数来描述从输入向量到输出标量的仿射变换。\n现在，因为我们描述的是向量$\\Vx$到向量$\\Vh$的仿射变换，所以我们需要一整个向量的偏置参数。\n激活函数$g$通常选择对每个元素分别起作用的函数，有$h_i =g(\\Vx^\\top \\MW_{:, i} + c_i)$。\n在现代神经网络中，默认的推荐是使用由激活函数$g(z)=\\max\\{0, z\\}$定义的整流线性单元或者称为~ReLU~{cite?}，如\\fig?所示。\n<!-- % fig 6.3 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/relu_color}}\n\\fi\n\\caption{整流线性激活函数。\n该激活函数是被推荐用于大多数前馈神经网络的默认激活函数。\n将此函数用于线性变换的输出将产生非线性变换。 然而，函数仍然非常接近线性，在这种意义上它是具有两个线性部分的分段线性函数。\n由于整流线性单元几乎是线性的，因此它们保留了许多使得线性模型易于使用基于梯度的方法进行优化的属性。 它们还保留了许多使得线性模型能够泛化良好的属性。 计算机科学的一个通用原则是，我们可以从最小的组件构建复杂的系统。\n就像图灵机的内存只需要能够存储0或1的状态，我们可以从整流线性函数构建一个万能函数近似器。}\n\\end{figure}\n\n\n我们现在可以指明我们的整个网络是\n\\begin{equation}\nf(\\Vx; \\MW, \\Vc, \\Vw, b) = \\Vw^\\top \\max\\{ 0, \\MW^\\top \\Vx + \\Vc \\} +b.\n\\end{equation}\n\n<!-- % -- 168 -- -->\n\n<!-- % -- 169 -- -->\n\n我们现在可以给出XOR问题的一个解。\n令\n\\begin{align}\n\\MW &= \\begin{bmatrix}\n1 & 1\\\\\n1 & 1\n\\end{bmatrix},\\\\\n\\Vc &= \\begin{bmatrix}\n0\\\\\n-1\n\\end{bmatrix},\\\\\n\\Vw &= \\begin{bmatrix}\n1\\\\\n-2\n\\end{bmatrix},\n\\end{align}\n以及$b=0$。\n\n我们现在可以了解这个模型如何处理一批输入。\n令$\\MX$表示设计矩阵，它包含二进制输入空间中全部的四个点，每个样本占一行，那么矩阵表示为：\n\\begin{equation} \n\\MX = \\begin{bmatrix}\n0 & 0\\\\\n0 & 1\\\\ \n1 & 0\\\\ \n1 & 1\n\\end{bmatrix}. \n\\end{equation} \n神经网络的第一步是将输入矩阵乘以第一层的权重矩阵： \n\\begin{equation}\n\\MX\\MW = \\begin{bmatrix} \n0 & 0\\\\ \n1 & 1\\\\ \n1 & 1\\\\ \n2 & 2 \n\\end{bmatrix}.\n\\end{equation} \n然后，我们加上偏置向量$\\Vc$，得到 \n\\begin{equation} \n\\begin{bmatrix} \n0 & -1\\\\\n1 & 0\\\\ \n1 & 0\\\\ \n2 & 1 \n\\end{bmatrix}. \n\\end{equation}\n在这个空间中，所有的样本都处在一条斜率为1的直线上。\n当我们沿着这条直线移动时，输出需要从0升到1，然后再降回0。\n线性模型不能实现这样一种函数。\n为了用$\\Vh$对每个样本求值，我们使用整流线性变换： \n\\begin{equation}\n\\begin{bmatrix} \n0 & 0\\\\ \n1 & 0\\\\ \n1 & 0\\\\ \n2 & 1 \n\\end{bmatrix}. \n\\end{equation}\n\n<!-- % -- 170 -- -->\n\n这个变换改变了样本间的关系。它们不再处于同一条直线上了。\n如\\fig?所示，它们现在处在一个可以用线性模型解决的空间上。\n\n我们最后乘以一个权重向量$\\Vw$:\n\\begin{equation}\n\\begin{bmatrix}\n0\\\\\n1\\\\\n1\\\\\n0\n\\end{bmatrix}.\n\\end{equation}\n神经网络对这一批次中的每个样本都给出了正确的结果。\n\n在这个例子中，我们简单地指定了解决方案，然后说明它得到的误差为零。\n在实际情况中，可能会有数十亿的模型参数以及数十亿的训练样本，所以不能像我们这里做的那样进行简单地猜解。\n与之相对的，基于梯度的优化算法可以找到一些参数使得产生的误差非常小。\n我们这里给出的XOR问题的解处在损失函数的全局最小点，所以梯度下降算法可以收敛到这一点。\n梯度下降算法还可以找到XOR问题一些其他的等价解。\n梯度下降算法的收敛点取决于参数的初始值。\n在实践中，梯度下降通常不会找到像我们这里给出的那种干净的、容易理解的、整数值的解。\n\n\n# 基于梯度的学习\n\n\n设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。\n在\\sec?中，我们描述了如何通过指定一个优化过程、代价函数和一个模型族来构建一个机器学习算法。\n\n我们到目前为止看到的线性模型和神经网络的最大区别，在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。\n这意味着神经网络的训练通常使用迭代的、基于梯度的优化，仅仅使得代价函数达到一个非常小的值；而不是像用于训练线性回归模型的线性方程求解器，或者用于训练逻辑回归或~SVM~的凸优化算法那样保证全局收敛。\n凸优化从任何一种初始参数出发都会收敛（理论上如此——在实践中也很鲁棒但可能会遇到数值问题）。\n用于非凸损失函数的随机梯度下降没有这种收敛性保证，并且对参数的初始值很敏感。\n对于前馈神经网络，将所有的权重值初始化为小随机数是很重要的。\n偏置可以初始化为零或者小的正值。\n这种用于训练前馈神经网络以及几乎所有深度模型的迭代的基于梯度的优化算法会在\\chap?详细介绍，参数初始化会在\\sec?中具体说明。\n就目前而言，只需要懂得，训练算法几乎总是基于使用梯度来使得代价函数下降的各种方法即可。\n一些特别的算法是对梯度下降思想的改进和提纯（在\\sec?中介绍）还有一些更特别的，大多数是对随机梯度下降算法的改进（在\\sec?中介绍）。\n\n<!-- % -- 171 -- -->\n\n我们当然也可以用梯度下降来训练诸如线性回归和支持向量机之类的模型，并且事实上当训练集相当大时这是很常用的。\n从这点来看，训练神经网络和训练其他任何模型并没有太大区别。\n计算梯度对于神经网络会略微复杂一些，但仍然可以很高效而精确地实现。\n\\sec?将会介绍如何用反向传播算法以及它的现代扩展算法来求得梯度。\n\n和其他的机器学习模型一样，为了使用基于梯度的学习方法我们必须选择一个代价函数，并且我们必须选择如何表示模型的输出。\n现在，我们重温这些设计上的考虑，并且特别强调神经网络的情景。\n\n\n## 代价函数\n\n\n深度神经网络设计中的一个重要方面是代价函数的选择。\n幸运的是，神经网络的代价函数或多或少是和其他的参数模型例如线性模型的代价函数相同的。\n\n在大多数情况下， 我们的参数模型定义了一个分布$p(\\Vy\\mid\\Vx;\\Vtheta)$并且我们简单地使用最大似然原理。\n这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数。\n\n有时，我们使用一个更简单的方法，不是预测$\\Vy$的完整概率分布，而是仅仅预测在给定$\\Vx$的条件下$\\Vy$的某种统计量。\n某些专门的损失函数允许我们来训练这些估计量的预测器。\n\n用于训练神经网络的完整的代价函数，通常在我们这里描述的基本代价函数的基础上结合一个正则项。\n我们已经在\\sec?中看到正则化应用到线性模型中的一些简单的例子。\n用于线性模型的权重衰减方法也直接适用于深度神经网络，而且是最流行的正则化策略之一。\n用于神经网络的更高级的正则化策略将在\\chap?中讨论。\n\n<!-- % -- 172 -- -->\n\n\\subsubsection{使用最大似然学习条件分布}\n\n大多数现代的神经网络使用最大似然来训练。\n这意味着代价函数就是负的对数似然，它与训练数据和模型分布间的交叉熵等价。\n这个代价函数表示为\n\\begin{equation}\nJ(\\Vtheta) = -\\SetE_{\\RVx, \\RVy \\sim \\hat{p}_\\text{data}} \\log p_\\text{model} (\\Vy \\mid \\Vx).\n\\end{equation}\n\n代价函数的具体形式随着模型而改变，取决于$\\log p_\\text{model}$的具体形式。\n上述方程的展开形式通常会有一些项不依赖于模型的参数，我们可以舍去。\n例如，正如我们在\\sec?中看到的，如果$p_\\text{model}(\\Vy\\mid\\Vx) = \\CalN(\\Vy;f(\\Vx;\\Vtheta), \\MI)$，那么我们就重新得到了均方误差代价，\n\\begin{equation}\nJ(\\theta) = \\frac{1}{2} \\SetE_{\\RVx, \\RVy \\sim  \\hat{p}_\\text{data}} || \\Vy - f(\\Vx; \\Vtheta) ||^2 + \\text{const},\n\\end{equation}\n至少系数$\\frac{1}{2}$和常数项不依赖于$\\Vtheta$。\n舍弃的常数是基于高斯分布的方差，在这种情况下我们选择不把它参数化。\n之前，我们看到了对输出分布的最大似然估计和对线性模型均方误差的最小化之间的等价性，但事实上，这种等价性并不要求$f(\\Vx; \\Vtheta)$用于预测高斯分布的均值。\n\n使用最大似然来导出代价函数的方法的一个优势是，它减轻了为每个模型设计代价函数的负担。\n明确一个模型$p(\\Vy\\mid\\Vx)$则自动地确定了一个代价函数$\\log p(\\Vy\\mid\\Vx)$。\n\n贯穿神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性，来为学习算法提供一个好的指引。\n饱和（变得非常平）的函数破坏了这一目标，因为它们把梯度变得非常小。\n这在很多情况下都会发生，因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。\n负的对数似然帮助我们在很多模型中避免这个问题。\n很多输出单元都会包含一个指数函数，这在它的变量取绝对值非常大的负值时会造成饱和。\n负对数似然代价函数中的对数函数消除了某些输出单元中的指数效果。\n我们将会在\\sec?中讨论代价函数和输出单元的选择间的相互作用。\n\n<!-- % -- 173 -- -->\n\n用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性，那就是当它被应用于实践中经常遇到的模型时，它通常没有最小值。\n对于离散型输出变量，大多数模型以一种特殊的形式来参数化，即它们不能表示概率零和一，但是可以无限接近。\n逻辑回归是其中一个例子。\n对于实值的输出变量，如果模型可以控制输出分布的密度（例如，通过学习高斯输出分布的方差参数），那么它可能对正确的训练集输出赋予极其高的密度，这将导致交叉熵趋向负无穷。\n\\chap?中描述的正则化技术提供了一些不同的方法来修正学习问题，使得模型不会通过这种方式来获得无限制的收益。\n\n\\subsubsection{学习条件统计量}\n\n有时我们并不是想学习一个完整的概率分布$p(\\Vy\\mid\\Vx; \\Vtheta)$，而仅仅是想学习在给定$\\Vx$时$\\Vy$的某个条件统计量。\n\n例如，我们可能有一个预测器$f(\\Vx; \\Vtheta)$，我们想用它来预测$\\Vy$的均值。\n如果我们使用一个足够强大的神经网络，我们可以认为这个神经网络能够表示一大类函数中的任何一个函数$f$，这个类仅仅被一些特征所限制，例如连续性和有界，而不是具有特殊的参数形式。\n从这个角度来看，我们可以把代价函数看作是一个泛函而不仅仅是一个函数。\n泛函是函数到实数的映射。我们因此可以将学习看作是选择一个函数而不仅仅是选择一组参数。\n我们可以设计代价泛函在我们想要的某些特殊函数处取得最小值。\n例如，我们可以设计一个代价泛函，使它的最小值处于一个特殊的函数上，这个函数将$\\Vx$映射到给定$\\Vx$时$\\Vy$的期望值。\n对函数求解优化问题需要用到变分法这个数学工具，我们将在\\sec?中讨论。\n理解变分法对于理解本章的内容不是必要的。\n目前，只需要知道变分法可以被用来导出下面的两个结果。\n\n<!-- % -- 174 -- -->\n\n我们使用变分法导出的第一个结果是解优化问题\n\\begin{equation}\nf^* = \\underset{f}{\\argmin}  \\ \\SetE_{\\RVx, \\RVy \\sim  p_\\text{data}} ||\\Vy-f(\\Vx)||^2\n\\end{equation}\n得到\n\\begin{equation}\nf^*(\\Vx) = \\SetE_{\\RVy\\sim p_\\text{data}(\\Vy|\\Vx)} [\\Vy],\n\\end{equation}\n要求这个函数处在我们要优化的类里。\n换句话说，如果我们能够用无穷多的、来源于真实的数据生成分布的样本进行训练，最小化均方误差代价函数将得到一个函数，它可以用来对每个$\\Vx$的值预测出$\\Vy$的均值。\n\n不同的代价函数给出不同的统计量。\n第二个使用变分法得到的结果是\n\\begin{equation}\nf^* = \\underset{f}{\\argmin} \\ \\SetE_{\\RVx, \\RVy \\sim  p_\\text{data}} ||\\Vy - f(\\Vx)||_1\n\\end{equation}\n将得到一个函数可以对每个$\\Vx$预测$\\Vy$取值的\\emph{中位数}，只要这个函数在我们要优化的函数族里。\n这个代价函数通常被称为平均绝对误差。\n\n可惜的是，均方误差和平均绝对误差在使用基于梯度的优化方法时往往成效不佳。\n一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。\n这就是为什么交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了，即使是在没必要估计整个$p(\\Vy\\mid\\Vx)$分布时。\n\n\n\n## 输出单元\n\n\n代价函数的选择与输出单元的选择紧密相关。\n大多数时候，我们简单地使用数据分布和模型分布间的交叉熵。\n选择如何表示输出决定了交叉熵函数的形式。\n\n任何可用作输出的神经网络单元，也可以被用作隐藏单元。\n这里，我们着重讨论将这些单元用作模型输出时的情况，不过原则上它们也可以在内部使用。\n我们将在\\sec?中重温这些单元，并且给出当它们被用作隐藏单元时一些额外的细节。\n\n在本节中，我们假设前馈网络提供了一组定义为$\\Vh=f(\\Vx;\\Vtheta)$的隐藏特征。\n输出层的作用是随后对这些特征进行一些额外的变换来完成整个网络必须完成的任务。\n\n<!-- % -- 175 -- -->\n\n\\subsubsection{用于高斯输出分布的线性单元}\n\n一种简单的输出单元是基于仿射变换的输出单元，仿射变换不具有非线性。\n这些单元往往被直接称为线性单元。\n\n给定特征$\\Vh$，线性输出单元层产生一个向量$\\hat{\\Vy} = \\MW^\\top \\Vh+\\Vb$。\n\n线性输出层经常被用来产生条件高斯分布的均值：\n\\begin{equation}\np(\\Vy\\mid\\Vx) = \\CalN(\\Vy; \\hat{\\Vy}, \\MI ).\n\\end{equation}\n最大化其对数似然此时等价于最小化均方误差。\n\n最大似然框架也使得学习高斯分布的协方差矩阵更加容易，或更容易地使高斯分布的协方差矩阵作为输入的函数。\n然而，对于所有输入，协方差矩阵都必须被限定成一个正定矩阵。\n线性输出层很难满足这种限定，所以通常使用其他的输出单元来对协方差参数化。\n对协方差建模的方法将在\\sec?中简要介绍。\n\n因为线性模型不会饱和，所以它们易于采用基于梯度的优化算法，甚至可以使用其他多种优化算法。\n\n\\subsubsection{用于Bernoulli输出分布的sigmoid单元}\n\n许多任务需要预测二值型变量$y$的值。\n具有两个类的分类问题可以归结为这种形式。\n\n此时最大似然的方法是定义$y$在$\\Vx$条件下的~Bernoulli分布。\n\nBernoulli分布仅需单个参数来定义。\n神经网络只需要预测$P(y =1\\mid\\Vx)$即可。\n为了使这个数是有效的概率，它必须处在区间$[0, 1]$中。\n\n为满足该约束条件需要一些细致的设计工作。\n假设我们打算使用线性单元，并且通过阈值来限制它成为一个有效的概率：\n\\begin{equation}\nP(y=1 \\mid \\Vx) = \\max \\left \\{ 0, \\min \\{1, \\Vw^\\top \\Vh+b \\} \\right \\}.\n\\end{equation}\n这的确定义了一个有效的条件概率分布，但我们无法使用梯度下降来高效地训练它。\n当$\\Vw^\\top \\Vh+b$处于单位区间外时，模型的输出对其参数的梯度都将为$\\bm{0}$。\n梯度为$\\bm{0}$通常是有问题的，因为学习算法对于如何改善相应的参数不再具有指导意义。\n\n<!-- % -- 176 -- -->\n\n相反，最好是使用一种新的方法来保证无论何时模型给出了错误的答案时，总能有一个较大的梯度。\n这种方法是基于使用~sigmoid~输出单元结合最大似然来实现的。\n\nsigmoid~输出单元定义为\n\\begin{equation}\n\\hat{y} = \\sigma \\left (\\Vw^\\top \\Vh + b \\right ),\n\\end{equation}\n这里$\\sigma$是\\sec?中介绍的~logistic sigmoid~函数。\n\n我们可以认为~sigmoid~输出单元具有两个部分。\n首先，它使用一个线性层来计算$z=\\Vw^\\top \\Vh+b$。\n接着，它使用~sigmoid~激活函数将$z$转化成概率。\n\n我们暂时忽略对于$\\Vx$的依赖性，只讨论如何用$z$的值来定义$y$的概率分布。\nsigmoid~可以通过构造一个非归一化（和不为1）的概率分布$\\tilde{P}(y)$来得到。\n我们可以随后除以一个合适的常数来得到有效的概率分布。\n如果我们假定非归一化的对数概率对$y$ 和$z$是线性的，可以对它取指数来得到非归一化的概率。\n我们然后对它归一化，可以发现这服从~Bernoulli分布，该分布受$z$的~sigmoid~变换控制：\n\\begin{align}\n\\log \\tilde{P}(y) &= yz,\\\\\n\\tilde{P}(y) &= \\exp(yz),\\\\\nP(y) &= \\frac{\\exp(yz)}{\\sum_{y' = 0}^1 \\exp(y' z)},\\\\\nP(y) &= \\sigma((2y-1)z).\n\\end{align}\n基于指数和归一化的概率分布在统计建模的文献中很常见。\n用于定义这种二值型变量分布的变量$z$被称为分对数。\n\n<!-- % -- 177 -- -->\n\n这种在对数空间里预测概率的方法可以很自然地使用最大似然学习。\n因为用于最大似然的代价函数是$-\\log P(y\\mid\\Vx)$，代价函数中的log抵消了~sigmoid~中的exp。\n如果没有这个效果，sigmoid~的饱和性会阻止基于梯度的学习做出好的改进。\n我们使用最大似然来学习一个由~sigmoid~参数化的~Bernoulli分布，它的损失函数为\n\\begin{align}\nJ(\\Vtheta) &= -\\log P(y\\mid\\Vx)\\\\\n&= -\\log \\sigma ((2y-1)z)\\\\\n&= \\zeta((1-2y)z).\n\\end{align}\n\n这个推导使用了\\sec?中的一些性质。\n通过将损失函数写成~softplus函数的形式，我们可以看到它仅仅在$(1-2y)z$取绝对值非常大的负值时才会饱和。\n因此饱和只会出现在模型已经得到正确答案时——当$y=1$且$z$取非常大的正值时，或者$y=0$且$z$取非常小的负值时。\n当$z$的符号错误时，softplus函数的变量$(1-2y)z$可以简化为$|z|$。\n当$|z|$变得很大并且$z$的符号错误时，softplus函数渐近地趋向于它的变量$|z|$。\n对$z$求导则渐近地趋向于$\\text{sign}(z)$，所以，对于极限情况下极度不正确的$z$，softplus函数完全不会收缩梯度。\n这个性质很有用，因为它意味着基于梯度的学习可以很快地改正错误的$z$。\n\n当我们使用其他的损失函数，例如均方误差之类的，损失函数会在$\\sigma(z)$饱和时饱和。\nsigmoid~激活函数在$z$取非常小的负值时会饱和到0，当$z$取非常大的正值时会饱和到1。\n这种情况一旦发生，梯度会变得非常小以至于不能用来学习，无论此时模型给出的是正确还是错误的答案。\n因此，最大似然几乎总是训练~sigmoid~输出单元的优选方法。\n\n理论上，sigmoid~的对数总是确定和有限的，因为~sigmoid~的返回值总是被限制在开区间$(0, 1)$上，而不是使用整个闭区间$[0, 1]$的有效概率。\n在软件实现时，为了避免数值问题，最好将负的对数似然写作$z$的函数，而不是$\\hat{y}=\\sigma(z)$的函数。\n如果~sigmoid~函数下溢到零，那么之后对$\\hat{y}$取对数会得到负无穷。\n\n\\subsubsection{用于\nMultinoulli输出分布的softmax单元}\n\n任何时候当我们想要表示一个具有$n$个可能取值的离散型随机变量的分布时，我们都可以使用softmax函数。\n它可以看作是~sigmoid~函数的扩展，其中~sigmoid~函数用来表示二值型变量的分布。\n\n<!-- % -- 178 -- -->\n\nsoftmax函数最常用作分类器的输出，来表示$n$个不同类上的概率分布。\n比较少见的是，softmax函数可以在模型内部使用，例如如果我们想要在某个内部变量的$n$个不同选项中进行选择。\n\n在二值型变量的情况下，我们希望计算一个单独的数\n\\begin{equation}\n\\hat{y} = P(y=1\\mid\\Vx).\n\\end{equation}\n因为这个数需要处在0和1之间，并且我们想要让这个数的对数可以很好地用于对数似然的基于梯度的优化，我们选择去预测另外一个数$z=\\log \\hat{P}(y=1\\mid\\Vx)$。\n对其指数化和归一化，我们就得到了一个由~sigmoid~函数控制的~Bernoulli分布。\n\n为了推广到具有$n$个值的离散型变量的情况，我们现在需要创造一个向量$\\hat{\\Vy}$，它的每个元素是$\\hat{y}_i = P(y=i\\mid\\Vx)$。\n我们不仅要求每个$\\hat{y}_i$元素介于0和1之间，还要使得整个向量的和为1，使得它表示一个有效的概率分布。\n用于~Bernoulli分布的方法同样可以推广到~Multinoulli分布。\n首先，线性层预测了未归一化的对数概率：\n\\begin{equation}\n\\Vz = \\MW^\\top \\Vh+\\Vb,\n\\end{equation}\n其中$z_i=\\log \\hat{P}(y=i\\mid\\Vx)$。\nsoftmax函数然后可以对$z$指数化和归一化来获得需要的$\\hat{\\Vy}$。\n最终，softmax函数的形式为\n\\begin{equation}\n\\text{softmax}(\\Vz)_i = \\frac{\\exp(z_i)}{\\sum_j \\exp(z_j)}.\n\\end{equation}\n\n和~logistic sigmoid一样，当使用最大化对数似然训练softmax来输出目标值$\\RSy$时，使用指数函数工作地非常好。\n这种情况下，我们想要最大化$\\log P(\\RSy =i; \\Vz)=\\log \\text{softmax}(\\Vz)_i$。\n将softmax定义成指数的形式是很自然的因为对数似然中的log可以抵消softmax中的exp：\n\\begin{equation}\n\\log \\text{softmax}(\\Vz)_i = z_i - \\log \\sum_j \\exp(z_j).\n\\end{equation}\n\n<!-- % -- 179 -- -->\n\n\\eqn?中的第一项表示输入$z_i$总是对代价函数有直接的贡献。\n因为这一项不会饱和，所以即使$z_i$对\\eqn?的第二项的贡献很小，学习依然可以进行。\n当最大化对数似然时，第一项鼓励$z_i$被推高，而第二项则鼓励所有的$\\Vz$被压低。\n为了对第二项$\\log \\sum_j \\exp(z_j)$有一个直观的理解，注意到这一项可以大致近似为$\\max_j z_j$。\n这种近似是基于对任何明显小于$\\max_j z_j$的$z_k$，$\\exp(z_k)$都是不重要的。\n我们能从这种近似中得到的直觉是，负对数似然代价函数总是强烈地惩罚最活跃的不正确预测。\n如果正确答案已经具有了softmax的最大输入，那么$-z_i$项和$\\log\\sum_j \\exp(z_j) \\approx \\max_j z_j = z_i$项将大致抵消。\n这个样本对于整体训练代价贡献很小，这个代价主要由其他未被正确分类的样本产生。\n\n到目前为止我们只讨论了一个例子。\n总体来说，未正则化的最大似然会驱动模型去学习一些参数，而这些参数会驱动softmax函数来预测在训练集中观察到的每个结果的比率：\n\\begin{equation}\n\\text{softmax}(\\Vz(\\Vx; \\Vtheta))_i \\approx \\frac{\\sum_{j=1}^m \\bm{1}_{y^{(j)}=i, \\Vx^{(j)} = \\Vx}  }{ \\sum_{j=1}^{m} \\bm{1}_{\\Vx^{(j)} = \\Vx} }.\n\\end{equation}\n因为最大似然是一致的估计量，所以只要模型族能够表示训练的分布，这就能保证发生。\n在实践中，有限的模型能力和不完美的优化将意味着模型只能近似这些比率。\n\n除了对数似然之外的许多目标函数对softmax函数不起作用。\n具体来说，那些不使用对数来抵消softmax中的指数的目标函数，当指数函数的变量取非常小的负值时会造成梯度消失，从而无法学习。\n特别是，平方误差对于softmax单元来说是一个很差的损失函数，即使模型做出高度可信的不正确预测，也不能训练模型改变其输出{cite?}。\n要理解为什么这些损失函数可能失败，我们需要检查softmax函数本身。\n\n像~sigmoid~一样，softmax激活函数可能会饱和。\nsigmoid~函数具有单个输出，当它的输入极端负或者极端正时会饱和。\n对于softmax的情况，它有多个输出值。\n当输入值之间的差异变得极端时，这些输出值可能饱和。\n当softmax饱和时，基于softmax的许多代价函数也饱和，除非它们能够转化饱和的激活函数。\n\n<!-- % -- 180 -- -->\n\n为了说明softmax函数对于输入之间差异的响应，观察到当对所有的输入都加上一个相同常数时softmax的输出不变：\n\\begin{equation}\n\\text{softmax}(\\Vz) = \\text{softmax}(\\Vz+c).\n\\end{equation}\n使用这个性质，我们可以导出一个数值方法稳定的softmax函数的变体：\n\\begin{equation}\n\\text{softmax}(\\Vz) = \\text{softmax}(\\Vz- \\max_i z_i).\n\\end{equation}\n变换后的形式允许我们在对softmax函数求值时只有很小的数值误差，即使是当$z$包含极正或者极负的数时。\n观察softmax数值稳定的变体，可以看到softmax函数由它的变量偏离$\\max_i z_i$的量来驱动。\n\n当其中一个输入是最大（$z_i = \\max_i z_i$）并且$z_i$远大于其他的输入时，相应的输出$\\text{softmax}(\\Vz)_i$会饱和到1。\n当$z_i$不是最大值并且最大值非常大时，相应的输出$\\text{softmax}(\\Vz)_i$也会饱和到0。\n这是~sigmoid~单元饱和方式的一般化，并且如果损失函数不被设计成对其进行补偿，那么也会造成类似的学习困难。\n\nsoftmax函数的变量$\\Vz$可以通过两种方式产生。\n最常见的是简单地使神经网络较早的层输出$\\Vz$的每个元素，就像先前描述的使用线性层$\\Vz={W}^\\top\\Vh+\\Vb$。\n虽然很直观，但这种方法是对分布的过度参数化。\n$n$个输出总和必须为1的约束意味着只有$n-1$个参数是必要的；第$n$个概率值可以通过1减去前面$n-1$个概率来获得。\n因此，我们可以强制要求$\\Vz$的一个元素是固定的。\n例如，我们可以要求$z_n=0$。\n事实上，这正是~sigmoid~单元所做的。\n定义$P(y=1\\mid\\Vx)=\\sigma(z)$等价于用二维的$\\Vz$以及$z_1=0$来定义$P(y=1\\mid\\Vx)=\\text{softmax}(\\Vz)_1$。\n无论是$n-1$个变量还是$n$个变量的方法，都描述了相同的概率分布，但会产生不同的学习机制。\n在实践中，无论是过度参数化的版本还是限制的版本都很少有差别，并且实现过度参数化的版本更为简单。\n\n从神经科学的角度看，有趣的是认为softmax是一种在参与其中的单元之间形成竞争的方式：softmax输出总是和为1，所以一个单元的值增加必然对应着其他单元值的减少。\n这与被认为存在于皮质中相邻神经元间的侧抑制类似。\n在极端情况下（当最大的$a_i$和其他的在幅度上差异很大时），它变成了赢者通吃的形式（其中一个输出接近1，其他的接近0）。\n\n\"softmax\"的名称可能会让人产生困惑。\n这个函数更接近于argmax函数而不是max函数。\n\"soft\"这个术语来源于softmax函数是连续可微的。\n\"argmax\"函数的结果表示为一个one-hot向量（只有一个元素为1，其余元素都为0的向量），不是连续和可微的。\nsoftmax函数因此提供了argmax的\"软化\"版本。max函数相应的软化版本是$\\text{softmax}(\\Vz)^\\top \\Vz$。\n可能最好是把softmax函数称为\"softargmax\"，但当前名称已经是一个根深蒂固的习惯了。\n\n<!-- % -- 181 -- -->\n\n\\subsubsection{其他的输出类型}\n\n之前描述的线性、sigmoid~和softmax输出单元是最常见的。\n神经网络可以推广到我们希望的几乎任何种类的输出层。\n最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。\n\n一般的，如果我们定义了一个条件分布$p(\\Vy\\mid\\Vx; \\Vtheta)$，最大似然原则建议我们使用$-\\log p(\\Vy\\mid \\Vx;\\Vtheta)$作为代价函数。\n\n一般来说，我们可以认为神经网络表示函数$f(\\Vx;\\Vtheta)$。\n这个函数的输出不是对$\\Vy$值的直接预测。\n相反，$f(\\Vx;\\Vtheta)=\\Vomega$提供了$y$分布的参数。\n我们的损失函数就可以表示成$-\\log p(\\RVy; \\Vomega(\\Vx))$。\n\n例如，我们想要学习在给定$\\RVx$时，$\\RVy$的条件高斯分布的方差。\n简单情况下，方差$\\sigma^2$是一个常数，此时有一个解析表达式，这是因为方差的最大似然估计量仅仅是观测值$\\RVy$与它们的期望值的差值的平方平均。\n一种计算上代价更加高但是不需要写特殊情况代码的方法是简单地将方差作为分布$p(\\RVy\\mid\\Vx)$的其中一个属性，这个分布由$\\Vomega=f(\\Vx;\\Vtheta)$控制。\n负对数似然$-\\log p(\\Vy;\\Vomega(\\Vx))$将为代价函数提供一个必要的合适项来使我们的优化过程可以逐渐地学到方差。\n在标准差不依赖于输入的简单情况下，我们可以在网络中创建一个直接复制到$\\Vomega$中的新参数。\n这个新参数可以是$\\sigma$本身，或者可以是表示$\\sigma^2$的参数$v$，或者可以是表示$\\frac{1}{\\sigma^2}$的参数$\\beta$，取决于我们怎样对分布参数化。\n我们可能希望模型对不同的$\\RVx$值预测出$\\RVy$不同的方差。\n这被称为异方差模型。\n在异方差情况下，我们简单地把方差指定为$f(\\RVx;\\Vtheta)$其中一个输出值。\n实现它的典型方法是使用精度而不是方差来表示高斯分布，就像\\eqn?所描述的。\n在多维变量的情况下，最常见的是使用一个对角精度矩阵\n\\begin{equation}\n\\text{diag}(\\Vbeta).\n\\end{equation}\n这个公式适用于梯度下降，因为由$\\Vbeta$参数化的高斯分布的对数似然的公式仅涉及$\\beta_i$的乘法和$\\log \\beta_i$的加法。\n乘法、加法和对数运算的梯度表现良好。\n相比之下，如果我们用方差来参数化输出，我们需要用到除法。\n除法函数在零附近会变得任意陡峭。\n虽然大梯度可以帮助学习，但任意大的梯度通常导致不稳定。\n如果我们用标准差来参数化输出，对数似然仍然会涉及除法，并且还将涉及平方。\n通过平方运算的梯度可能在零附近消失，这使得学习被平方的参数变得困难。\n无论我们使用的是标准差，方差还是精度，我们必须确保高斯分布的协方差矩阵是正定的。\n因为精度矩阵的特征值是协方差矩阵特征值的倒数，所以这等价于确保精度矩阵是正定的。\n如果我们使用对角矩阵，或者是一个常数乘以单位矩阵\\footnote{译者注：这里原文是\"If we use a diagonal matrix, or a scalar times the diagonal matrix...\"即\"如果我们使用对角矩阵，或者是一个标量乘以对角矩阵...\"，但一个标量乘以对角矩阵和对角矩阵没区别，结合上下文可以看出，这里原作者误把\"identity\"写成了\"diagonal matrix\"，因此这里采用\"常数乘以单位矩阵\"的译法。}，那么我们需要对模型输出强加的唯一条件是它的元素都为正。\n如果我们假设$\\Va$是用于确定对角精度的模型的原始激活，那么可以用softplus 函数来获得正的精度向量：$\\Vbeta=\\Vzeta(\\Va)$。\n这种相同的策略对于方差或标准差同样适用，也适用于常数乘以单位阵的情况。\n\n<!-- % -- 182 -- -->\n\n学习一个比对角矩阵具有更丰富结构的协方差或者精度矩阵是很少见的。\n如果协方差矩阵是满的和有条件的，那么参数化的选择就必须要保证预测的协方差矩阵是正定的。\n这可以通过写成$\\VSigma(\\Vx)=\\MB(\\Vx)\\MB^\\top (\\Vx)$来实现，这里$\\MB$是一个无约束的方阵。\n如果矩阵是满秩的，那么一个实际问题是计算似然的代价是很高的，计算一个$d\\times d$的矩阵的行列式或者$\\VSigma(\\Vx)$的逆（或者等价地并且更常用地，对它特征值分解或者$\\MB(\\Vx)$的特征值分解）需要$O(d^3)$的计算量。\n\n<!-- % -- 183 -- -->\n\n我们经常想要执行多峰回归(multimodal regression)，即预测条件分布$p(\\Vy\\mid\\Vx)$的实值，该条件分布对于相同的$\\Vx$值在$\\Vy$空间中有多个不同的峰值。\n在这种情况下，高斯混合是输出的自然表示{cite?}。\n将高斯混合作为其输出的神经网络通常被称为混合密度网络。\n具有$n$个分量的高斯混合输出由下面的条件分布定义：\n\\begin{equation}\np(\\Vy\\mid\\Vx) = \\sum_{i=1}^n p(\\RSc = i \\mid \\Vx) \\CalN(\\Vy; \\Vmu^{(i)}(\\Vx), \\VSigma^{(i)}(\\Vx)).\n\\end{equation}\n神经网络必须有三个输出：定义$p(\\RSc=i\\mid\\Vx)$的向量，对所有的$i$给出$\\Vmu^{(i)}(\\Vx)$的矩阵，以及对所有的$i$给出$\\VSigma^{(i)}(\\Vx)$的张量。\n这些输出必须满足不同的约束：\n\\begin{enumerate}\n+ 混合组件$p(\\RSc=i\\mid\\Vx)$：它们由潜变量\\footnote{我们之所以认为$\\RSc$是潜在的，是因为我们不能直接在数据中观测到它：给定输入$\\RVx$和目标$\\RVy$，不可能确切地知道是哪个高斯组件产生$\\RVy$，但我们可以想象$\\RVy$是通过选择其中一个来产生的，并且将那个未被观测到的选择作为随机变量。}~$\\RSc$关联着，在$n$个不同组件上形成~Multinoulli分布。\n这个分布通常可以由$n$维向量的softmax来获得，以确保这些输出是正的并且和为1。\n\n+ 均值$\\Vmu^{(i)}(\\Vx)$：它们指明了与第$i$个高斯组件相关联的中心或者均值，并且是无约束的（通常对于这些输出单元完全没有非线性）。\n如果$\\RVy$是个$d$维向量，那么网络必须输出一个由$n$个这种$d$维向量组成的$n\\times d$ 的矩阵。\n用最大似然来学习这些均值要比学习只有一个输出模式的分布的均值稍稍复杂一些。我们只想更新那个真正产生观测数据的组件的均值。\n在实践中，我们并不知道是哪个组件产生了观测数据。\n负对数似然表达式将每个样本对每个组件的贡献进行赋权，权重的大小由相应的组件产生这个样本的概率来决定。\n\n+ 协方差$\\VSigma^{(i)}(\\Vx)$：它们指明了每个组件$i$的协方差矩阵。\n和学习单个高斯组件时一样，我们通常使用对角矩阵来避免计算行列式。\n和学习混合均值时一样，最大似然是很复杂的，它需要将每个点的部分责任分配给每个混合组件。\n如果给定了混合模型的正确的负对数似然，梯度下降将自动地遵循正确的过程。\n\\end{enumerate}\n有报告说基于梯度的优化方法对于混合条件高斯（作为神经网络的输出）可能是不可靠的，部分是因为涉及到除法（除以方差）可能是数值不稳定的（当某个方差对于特定的实例变得非常小时，会导致非常大的梯度）。\n一种解决方法是梯度截断（见\\sec?），另外一种是启发式缩放梯度{cite?}。\n\n<!-- % -- 184 -- -->\n\n高斯混合输出在语音生成模型{cite?}和物理运动{cite?}中特别有效。\n混合密度策略为网络提供了一种方法来表示多种输出模式，并且控制输出的方差，这对于在这些实数域中获得高质量的结果是至关重要的。\n混合密度网络的一个实例如\\fig?所示。\n<!-- % fig 6.4 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/mdn_color}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{从具有混合密度输出层的神经网络中抽取的样本。\n输入$x$从均匀分布中采样，输出$y$从$p_{\\text{model}}(y\\mid x)$中采样。 神经网络能够学习从输入到输出分布的参数的非线性映射。 这些参数包括控制三个组件中的哪一个将产生输出的概率，以及每个组件各自的参数。\n每个混合组件都是高斯分布，具有预测的均值和方差。 输出分布的这些方面都能够相对输入$x$变化，并且以非线性的方式改变。}\n\\end{figure}\n\n\n一般的，我们可能希望继续对包含更多变量的、更大的向量$\\Vy$来建模，并在这些输出变量上施加更多更丰富的结构。\n例如，我们可能希望神经网络输出字符序列形成一个句子。\n在这些情况下，我们可以继续使用最大似然原理应用到我们的模型$p(\\Vy;\\Vomega(\\Vx))$上，但我们用来描述$\\Vy$的模型会变得非常复杂，超出了本章的范畴。\n\\chap?描述了如何使用循环神经网络来定义这种序列上的模型，第\\?部分描述了对任意概率分布进行建模的高级技术。\n\n\n# 隐藏单元\n\n\n到目前为止，我们集中讨论了神经网络的设计选择，这对于使用基于梯度的优化方法来训练的大多数参数化机器学习模型都是通用的。\n现在我们转向一个前馈神经网络独有的问题：该如何选择隐藏单元的类型，这些隐藏单元用在模型的隐藏层中。\n\n<!-- % -- 185 -- -->\n\n隐藏单元的设计是一个非常活跃的研究领域，并且还没有许多明确的指导性理论原则。\n\n整流线性单元是隐藏单元极好的默认选择。\n许多其他类型的隐藏单元也是可用的。\n决定何时使用哪种类型的隐藏单元是困难的事（尽管整流线性单元通常是一个可接受的选择）。\n我们这里描述对于每种隐藏单元的一些基本直觉。\n这些直觉可以用来建议我们何时来尝试一些单元。\n通常不可能预先预测出哪种隐藏单元工作得最好。\n设计过程充满了试验和错误，先直觉认为某种隐藏单元可能表现良好，然后用它组成神经网络进行训练，最后用验证集来评估它的性能。\n\n这里列出的一些隐藏单元可能并不是在所有的输入点上都是可微的。\n例如，整流线性单元 $g(z)=\\max\\{0, z\\}$在$z=0$处不可微。\n这似乎使得$g$对于基于梯度的学习算法无效。\n在实践中，梯度下降对这些机器学习模型仍然表现得足够好。\n部分原因是神经网络训练算法通常不会达到代价函数的局部最小值，而是仅仅显著地减小它的值，如\\fig?所示。\n这些想法会在\\chap?中进一步描述。\n因为我们不再期望训练能够实际到达梯度为$\\bm{0}$的点，所以代价函数的最小值对应于梯度未定义的点是可以接受的。\n不可微的隐藏单元通常只在少数点上不可微。\n一般来说，函数$g(z)$具有左导数和右导数，左导数定义为紧邻在$z$左边的函数的斜率，右导数定义为紧邻在$z$右边的函数的斜率。\n只有当函数在$z$处的左导数和右导数都有定义并且相等时，函数在$z$点处才是可微的。\n神经网络中用到的函数通常对左导数和右导数都有定义。\n在$g(z)=\\max\\{0,z\\}$的情况下，在$z=0$处的左导数是0，右导数是1。\n神经网络训练的软件实现通常返回左导数或右导数的其中一个，而不是报告导数未定义或产生一个错误。\n这可以通过观察到在数字计算机上基于梯度的优化总是会受到数值误差的影响来启发式地给出理由。\n当一个函数被要求计算$g(0)$时，底层值真正为0 是不太可能的。\n相对的，它可能是被舍入为0的一个小量$\\epsilon$。\n在某些情况下，理论上有更好的理由，但这些通常对神经网络训练并不适用。\n重要的是，在实践中，我们可以放心地忽略下面描述的隐藏单元激活函数的不可微性。\n\n<!-- % -- 186 -- -->\n\n除非另有说明，大多数的隐藏单元都可以描述为接受输入向量$\\Vx$，计算仿射变换$\\Vz=\\MW^\\top \\Vx+\\Vb$，然后使用一个逐元素的非线性函数$g(\\Vz)$。\n大多数隐藏单元的区别仅仅在于激活函数$g(\\Vz)$的形式。\n\n\n## 整流线性单元及其扩展\n\n\n整流线性单元使用激活函数$g(z)=\\max\\{0, z\\}$。\n\n整流线性单元易于优化，因为它们和线性单元非常类似。\n线性单元和整流线性单元的唯一区别在于整流线性单元在其一半的定义域上输出为零。\n这使得只要整流线性单元处于激活状态，它的导数都能保持较大。\n它的梯度不仅大而且一致。\n整流操作的二阶导数几乎处处为0，并且在整流线性单元处于激活状态时，它的一阶导数处处为1。\n这意味着相比于引入二阶效应的激活函数来说，它的梯度方向对于学习来说更加有用。\n\n整流线性单元通常作用于仿射变换之上：\n\\begin{equation}\n\\Vh = g(\\MW^\\top \\Vx + \\Vb).\n\\end{equation}\n当初始化仿射变换的参数时，可以将$\\Vb$的所有元素设置成一个小的正值，例如0.1。\n这使得整流线性单元很可能初始时就对训练集中的大多数输入呈现激活状态，并且允许导数通过。\n\n有很多整流线性单元的扩展存在。\n大多数这些扩展的表现比得上整流线性单元，并且偶尔表现得更好。\n\n整流线性单元的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为零的样本。\n整流线性单元的各种扩展保证了它们能在各个位置都接收到梯度。\n\n整流线性单元的三个扩展基于当$z_i<0$时使用一个非零的斜率$\\alpha_i$：$h_i =g(\\Vz, \\Valpha)_i = \\max(0, z_i) + \\alpha_i \\min(0, z_i)$。\n绝对值整流固定$\\alpha_i=-1$来得到$g(z)=|z|$。\n它用于图像中的对象识别{cite?}，其中寻找在输入照明极性反转下不变的特征是有意义的。\n整流线性单元的其他扩展比这应用地更广泛。\n渗漏整流线性单元{cite?}将$\\alpha_i$固定成一个类似0.01的小值，参数化整流线性单元或者~\\textbf{PReLU}~将$\\alpha_i$作为学习的参数{cite?}。\n\n<!-- % -- 187 -- -->\n\nmaxout单元{cite?}进一步扩展了整流线性单元。\nmaxout单元将$\\Vz$划分为每组具有$k$个值的组，而不是使用作用于每个元素的函数$g(z)$。\n每个maxout单元则输出每组中的最大元素：\n\\begin{equation}\ng(\\Vz)_i = \\underset{j\\in \\SetG^{(i)}}{\\max} z_j\n\\end{equation}\n这里$\\SetG^{(i)}$是组$i$的输入索引集$\\{(i-1)k+1, \\ldots, ik\\}$。\n这提供了一种方法来学习对输入$\\Vx$空间中多个方向响应的分段线性函数。\n\nmaxout单元可以学习具有多达$k$段的分段线性的凸函数。\nmaxout单元因此可以视为\\emph{学习激活函数}本身而不仅仅是单元之间的关系。\n使用足够大的$k$，maxout单元可以以任意的精确度来近似任何凸函数。\n特别地，具有两块的maxout层可以学习实现和传统层相同的输入$\\Vx$的函数，这些传统层可以使用整流线性激活函数、绝对值整流、渗漏整流线性单元 或参数化整流线性单元，或者可以学习实现与这些都不同的函数。\nmaxout层的参数化当然也将与这些层不同，所以即使是maxout学习去实现和其他种类的层相同的$\\Vx$的函数这种情况下，学习的机理也是不一样的。\n\n每个~maxout单元现在由$k$个权重向量来参数化，而不仅仅是一个，所以~maxout单元通常比整流线性单元需要更多的正则化。\n如果训练集很大并且每个单元的块数保持很低的话，它们可以在没有正则化的情况下工作得不错{cite?}。\n\nmaxout单元还有一些其他的优点。\n在某些情况下，要求更少的参数可以获得一些统计和计算上的优点。\n具体来说，如果由$n$个不同的线性过滤器描述的特征可以在不损失信息的情况下，用每一组$k$个特征的最大值来概括的话，那么下一层可以获得$k$倍更少的权重数 。\n\n因为每个单元由多个过滤器驱动，maxout单元具有一些冗余来帮助它们抵抗一种被称为灾难遗忘的现象，这个现象是说神经网络忘记了如何执行它们过去训练的任务{cite?}。\n\n整流线性单元和它们的这些扩展都是基于一个原则，那就是如果它们的行为更接近线性，那么模型更容易优化。\n使用线性行为更容易优化的一般性原则同样也适用于除深度线性网络以外的情景。\n循环网络可以从序列中学习并产生状态和输出的序列。\n当训练它们时，需要通过一些时间步来传播信息，当其中包含一些线性计算（具有大小接近1的某些方向导数）时，这会更容易。\n作为性能最好的循环网络结构之一，LSTM通过求和在时间上传播信息，这是一种特别直观的线性激活。\n它将在\\sec?中进一步讨论。\n\n<!-- % -- 188 -- -->\n\n\n## logistic sigmoid与双曲正切函数\n\n\n在引入整流线性单元之前，大多数神经网络使用~logistic sigmoid~激活函数\n\\begin{equation}\ng(z) = \\sigma(z)\n\\end{equation}\n或者是双曲正切激活函数\n\\begin{equation}\ng(z) = \\text{tanh}(z).\n\\end{equation}\n这些激活函数紧密相关，因为$\\text{tanh}(z)=2\\sigma(2z)-1$。\n\n我们已经看过~sigmoid~单元作为输出单元用来预测二值型变量取值为1的概率。\n与分段线性单元不同，sigmoid~单元在其大部分定义域内都饱和——当$z$取绝对值很大的正值时，它们饱和到一个高值，当$z$取绝对值很大的负值时，它们饱和到一个低值，并且仅仅当$z$接近0时它们才对输入强烈敏感。\nsigmoid~单元的广泛饱和性会使得基于梯度的学习变得非常困难。\n因为这个原因，现在不鼓励将它们用作前馈网络中的隐藏单元。\n当使用一个合适的代价函数来抵消~sigmoid~的饱和性时，它们作为输出单元可以与基于梯度的学习相兼容。\n\n当必须要使用~sigmoid~激活函数时，双曲正切激活函数通常要比~logistic sigmoid~函数表现更好。\n在$\\text{tanh}(0)=0$而$\\sigma(0)=\\frac{1}{2}$的意义上，它更像是单位函数。\n因为$\\text{tanh}$在0附近与单位函数类似，训练深层神经网络$\\hat{y}=\\Vw^\\top \\text{tanh}(\\MU^\\top \\text{tanh}(\\MV^\\top \\Vx))$类似于训练一个线性模型$\\hat{y}= \\Vw^\\top \\MU^\\top \\MV^\\top \\Vx$，只要网络的激活能够被保持地很小。\n这使得训练$\\text{tanh}$网络更加容易。\n\n<!-- % -- 189 -- -->\n\nsigmoid~激活函数在除了前馈网络以外的情景中更为常见。\n循环网络、许多概率模型以及一些自编码器有一些额外的要求使得它们不能使用分段线性激活函数，并且使得~sigmoid~单元更具有吸引力，尽管它存在饱和性的问题。\n\n\n## 其他隐藏单元\n\n\n也存在许多其他种类的隐藏单元，但它们并不常用。\n\n一般来说，很多种类的可微函数都表现得很好。\n许多未发布的激活函数与流行的激活函数表现得一样好。\n为了提供一个具体的例子，作者在MNIST数据集上使用$\\Vh=\\cos(\\MW\\Vx+\\Vb)$测试了一个前馈网络，并获得了小于1\\%的误差率，这可以与更为传统的激活函数获得的结果相媲美。\n在新技术的研究和开发期间，通常会测试许多不同的激活函数，并且会发现许多标准方法的变体表现非常好。\n这意味着，通常新的隐藏单元类型只有在被明确证明能够提供显著改进时才会被发布。\n新的隐藏单元类型如果与已有的隐藏单元表现大致相当的话，那么它们是非常常见的，不会引起别人的兴趣。\n\n列出文献中出现的所有隐藏单元类型是不切实际的。\n我们只对一些特别有用和独特的类型进行强调。\n\n其中一种是完全没有激活函数$g(z)$。\n也可以认为这是使用单位函数作为激活函数的情况。\n我们已经看过线性单元可以用作神经网络的输出。\n它也可以用作隐藏单元。\n如果神经网络的每一层都仅由线性变换组成，那么网络作为一个整体也将是线性的。\n然而，神经网络的一些层是纯线性也是可以接受的。\n考虑具有$n$个输入和$p$个输出的神经网络层$\\Vh=g(\\MW^\\top \\Vx+\\Vb)$。\n我们可以用两层来代替它，一层使用权重矩阵$\\MU$，另一层使用权重矩阵$\\MV$。\n如果第一层没有激活函数，那么我们对基于$\\MW$的原始层的权重矩阵进行因式分解。\n分解方法是计算$\\Vh=g(\\MV^\\top \\MU^\\top \\Vx+\\Vb)$。\n如果$U$产生了$q$个输出，那么$\\MU$和$V$一起仅包含$(n+p)q$个参数，而$\\MW$包含$np$个参数。\n如果$q$很小，这可以在很大程度上节省参数。\n这是以将线性变换约束为低秩的代价来实现的，但这些低秩关系往往是足够的。\n线性隐藏单元因此提供了一种减少网络中参数数量的有效方法。\n\n<!-- % -- 190 -- -->\n\n\nsoftmax单元是另外一种经常用作输出的单元（如\\sec?中所描述的），但有时也可以用作隐藏单元。\nsoftmax单元很自然地表示具有$k$个可能值的离散型随机变量的概率分布，所以它们可以用作一种开关。\n这些类型的隐藏单元通常仅用于明确地学习操作内存的高级结构中，将在\\sec?中描述。\n\n其他一些常见的隐藏单元类型包括：\n\n+ 径向基函数：$h_i = \\exp \\left (-\\frac{1}{\\sigma_i^2}|| \\MW_{:,i}-\\Vx||^2 \\right )$。\n这个函数在$\\Vx$接近模板$\\MW_{:,i}$时更加活跃。\n因为它对大部分$\\Vx$都饱和到0，因此很难优化。\n\n+ \\textbf{softplus}函数：$g(a)=\\zeta(a)=\\log(1+e^a)$。\n这是整流线性单元的平滑版本，由~{Dugas01}引入用于函数近似，由~{Nair-2010-small}引入用于无向概率模型的条件分布。\n{Glorot+al-AI-2011-small}比较了softplus和整流线性单元，发现后者的结果更好。\n通常不鼓励使用~softplus函数。\nsoftplus表明隐藏单元类型的性能可能是非常反直觉的——因为它处处可导或者因为它不完全饱和，人们可能希望它具有优于整流线性单元的点，但根据经验来看，它并没有。\n\n+ 硬双曲正切函数：它的形状和$\\text{tanh}$以及整流线性单元类似，但是不同于后者，它是有界的，$g(a)=\\max(-1, \\min(1,a))$。\n它由~{Collobert04}引入。\n\n\n隐藏单元的设计仍然是一个活跃的研究领域，许多有用的隐藏单元类型仍有待发现。\n\n\n# 架构设计\n\n\n神经网络设计的另一个关键点是确定它的架构。\n架构一词是指网络的整体结构：它应该具有多少单元，以及这些单元应该如何连接。\n\n<!-- % -- 191 -- -->\n\n大多数神经网络被组织成称为层的单元组。\n大多数神经网络架构将这些层布置成链式结构，其中每一层都是前一层的函数。\n在这种结构中，第一层由下式给出：\n\\begin{equation}\n\\Vh^{(1)}= g^{(1)}\\left ( \\MW^{(1)\\top} \\Vx + \\Vb^{(1)}\\right );\n\\end{equation}\n第二层由\n\\begin{equation}\n\\Vh^{(2)} = g^{(2)}\\left ( \\MW^{(2)\\top}\\Vh^{(1)}+\\Vb^{(2)} \\right );\n\\end{equation}\n给出，以此类推。\n\n在这些链式架构中，主要的架构考虑是选择网络的深度和每一层的宽度。\n我们将会看到，即使只有一个隐藏层的网络也足够适应训练集。\n更深层的网络通常能够对每一层使用更少的单元数和更少的参数，并且经常容易泛化到测试集，但是通常也更难以优化。\n对于一个具体的任务，理想的网络架构必须通过实验，观测在验证集上的误差来找到。\n\n\n## 万能近似性质和深度\n\n\n线性模型，通过矩阵乘法将特征映射到输出，顾名思义，仅能表示线性函数。\n它具有易于训练的优点，因为当使用线性模型时，许多损失函数会导出凸优化问题。\n可惜的是，我们经常希望我们的系统学习非线性函数。\n\n乍一看，我们可能认为学习非线性函数需要为我们想要学习的那种非线性专门设计一类模型族。\n幸运的是，具有隐藏层的前馈网络提供了一种万能近似框架。\n具体来说，万能近似定理, %万能逼近定理{cite?}表明，一个前馈神经网络如果具有线性输出层和至少一层具有任何一种\"挤压\"性质的激活函数（例如logistic sigmoid激活函数）的隐藏层，只要给予网络足够数量的隐藏单元，它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。\n前馈网络的导数也可以任意好地来近似函数的导数{cite?}。\nBorel可测的概念超出了本书的范畴；对于我们想要实现的目标，只需要知道定义在$\\SetR^n$的有界闭集上的任意连续函数是Borel可测的，因此可以用神经网络来近似。\n神经网络也可以近似从任何有限维离散空间映射到另一个的任意函数。\n虽然原始定理最初以具有特殊激活函数的单元的形式来描述，这个激活函数当变量取绝对值非常大的正值和负值时都会饱和，万能近似定理, %万能逼近定理也已经被证明对于更广泛类别的激活函数也是适用的，其中就包括现在常用的整流线性单元~{cite?}。\n\n<!-- % -- 192 -- -->\n\n万能近似定理, %万能逼近定理意味着无论我们试图学习什么函数，我们知道一个大的MLP一定能够\\emph{表示}这个函数。\n然而，我们不能保证训练算法能够\\emph{学得}这个函数。\n即使MLP能够表示该函数，学习也可能因两个不同的原因而失败。\n首先，用于训练的优化算法可能找不到用于期望函数的参数值。\n其次，训练算法可能由于过拟合而选择了错误的函数。\n回忆\\sec?中的\"没有免费的午餐\"定理，说明了没有普遍优越的机器学习算法。\n前馈网络提供了表示函数的万能系统，在这种意义上，给定一个函数，存在一个前馈网络能够近似该函数。\n不存在万能的过程既能够验证训练集上的特殊样本，又能够选择一个函数来扩展到训练集上没有的点。\n\n万能近似定理, %万能逼近定理说明了，存在一个足够大的网络能够达到我们所希望的任意精度，但是定理并没有说这个网络有多大。\n{Barron93}提供了单层网络近似一大类函数所需大小的一些界。\n不幸的是，在最坏情况下，可能需要指数数量的隐藏单元（可能一个隐藏单元对应着一个需要区分的输入配置）。\n这在二进制值的情况下很容易看到：向量$\\Vv \\in \\{0,1\\}^n$上的可能的二值型函数的数量是$2^{2^n}$，并且选择一个这样的函数需要$2^n$位，这通常需要$O(2^n)$的自由度。\n\n总之，具有单层的前馈网络足以表示任何函数，但是网络层可能大得不可实现，并且可能无法正确地学习和泛化。\n在很多情况下，使用更深的模型能够减少表示期望函数所需的单元的数量，并且可以减少泛化误差。\n\n<!-- % -- 193 -- -->\n\n存在一些函数族能够在网络的深度大于某个值$d$时被高效地近似，而当深度被限制到小于或等于$d$时需要一个远远大于之前的模型。\n在很多情况下，浅层模型所需的隐藏单元的数量是$n$的指数级。\n这个结果最初被证明是在那些不与连续可微的神经网络类似的机器学习模型中出现，但现在已经扩展到了这些模型。\n第一个结果是关于逻辑门电路的{cite?}。\n后来的工作将这些结果扩展到了具有非负权重的线性阈值单元{cite?}，然后扩展到了具有连续值激活的网络{cite?}。\n许多现代神经网络使用整流线性单元。\n{Leshno-et-al-1993}证明带有一大类非多项式激活函数族的浅层网络，包括整流线性单元，具有万能的近似性质，但是这些结果并没有强调深度或效率的问题——它们仅指出足够宽的整流网络能够表示任意函数。\n{Montufar-et-al-NIPS2014}指出一些用深度整流网络表示的函数可能需要浅层网络（一个隐藏层）指数级的隐藏单元才能表示。\n更确切的说，他们说明分段线性网络（可以通过整流非线性或~maxout单元获得）可以表示区域的数量是网络深度的指数级的函数。%这里为什么是非线性？\n\\fig?解释了带有绝对值整流的网络是如何创建函数的镜像图像的，这些函数在某些隐藏单元的顶部计算，作用于隐藏单元的输入。\n每个隐藏单元指定在哪里折叠输入空间，来创造镜像响应（在绝对值非线性的两侧）。\n通过组合这些折叠操作，我们获得指数级的分段线性区域，他们可以概括所有种类的规则模式（例如，重复）。\n<!-- % fig 6.5 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=\\textwidth]{Chapter6/figures/space_folding.jpg}}\n\\fi\n\\caption{ % This is a screenshot.\n关于更深的整流网络具有指数优势的一个直观的几何解释，来自~{Montufar-et-al-NIPS2014}。 \n\\emph{(左)}绝对值整流单元对其输入中的每对镜像点有相同的输出。\n镜像的对称轴由单元的权重和偏置定义的超平面给出。 在该单元顶部计算的函数（绿色决策面）将是横跨该对称轴的更简单模式的一个镜像。 \n\\emph{(中)}该函数可以通过折叠对称轴周围的空间来得到。\n\\emph{(右)}另一个重复模式可以在第一个的顶部折叠（由另一个下游单元）以获得另外的对称性（现在重复四次，使用了两个隐藏层）。 \n经~{Montufar-et-al-NIPS2014}许可改编此图。}\n\\end{figure}\n\n\n{Montufar-et-al-NIPS2014}的主要定理指出，具有$d$个输入、深度为$l$、每个隐藏层具有$n$个单元的深度整流网络可以描述的线性区域的数量是\n\\begin{equation}\nO \\left ( {n \\choose d}^{d(l-1)} n^d \\right ),\n\\end{equation}\n意味着，这是深度$l$的指数级。\n在每个单元具有$k$个过滤器的maxout网络中，线性区域的数量是\n\\begin{equation}\nO \\left ( k^{(l-1)+d} \\right ).\n\\end{equation}\n\n<!-- % -- 194 -- -->\n\n当然，我们不能保证在机器学习（特别是AI）的应用中我们想要学得的函数类型享有这样的属性。\n\n我们还可能出于统计原因来选择深度模型。\n任何时候，当我们选择一个特定的机器学习算法时，我们隐含地陈述了一些先验，这些先验是关于算法应该学得什么样的函数的。\n选择深度模型默许了一个非常普遍的信念，那就是我们想要学得的函数应该涉及几个更加简单的函数的组合。\n这可以从表示学习的观点来解释， 我们相信学习的问题包含发现一组潜在的变差因素，它们可以根据其他更简单的潜在的变差因素来描述。\n或者，我们可以将深度结构的使用解释为另一种信念，那就是我们想要学得的函数是包含多个步骤的计算机程序，其中每个步骤使用前一步骤的输出。\n这些中间输出不一定是变差因素，而是可以类似于网络用来组织其内部处理的计数器或指针。\n根据经验，更深的模型似乎确实在广泛的任务中泛化得更好{cite?}。\n\\fig?和\\fig?展示了一些实验结果的例子。\n这表明使用深层架构确实在模型学习的函数空间上表示了一个有用的先验。\n<!-- % fig 6.6 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/depth_color}}\n\\fi\n\\caption{深度的影响。\n实验结果表明，当从地址照片转录多位数字时，更深层的网络能够更好地泛化。\n数据来自~{Goodfellow+et+al-ICLR2014a}。\n测试集上的准确率随着深度的增加而不断增加。\n\\fig?给出了一个对照实验，它说明了对模型尺寸其他方面的增加并不能产生相同的效果。}\n\\end{figure}\n\n<!-- % fig 6.7 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/model_size_color}}\n\\fi\n\\caption{参数数量的影响。\n更深的模型往往表现更好。\n这不仅仅是因为模型更大。\n{Goodfellow+et+al-ICLR2014a}的这项实验表明，增加卷积网络层中参数的数量，但是不增加它们的深度，在提升测试集性能方面几乎没有效果，如此图所示。\n图例标明了用于画出每条曲线的网络深度，以及曲线表示的是卷积层还是全连接层的大小变化。\n我们可以观察到，在这种情况下，浅层模型在参数数量达到2000万时就过拟合，而深层模型在参数数量超过6000万时仍然表现良好。\n这表明，使用深层模型表达出了对模型可以学习的函数空间的有用偏好。\n具体来说，它表达了一种信念，即该函数应该由许多更简单的函数复合在一起而得到。\n这可能导致学习由更简单的表示所组成的表示（例如，由边所定义的角）或者学习具有顺序依赖步骤的程序（例如，首先定位一组对象，然后分割它们，之后识别它们）。}\n\\end{figure}\n\n\n## 其他架构上的考虑\n\n\n目前为止，我们都将神经网络描述成层的简单链式结构，主要的考虑因素是网络的深度和每层的宽度。\n在实践中，神经网络显示出相当的多样性。\n\n许多神经网络架构已经被开发用于特定的任务。\n用于计算机视觉的卷积神经网络的特殊架构将在\\chap?中介绍。\n前馈网络也可以推广到用于序列处理的循环神经网络，但有它们自己的架构考虑，将在\\chap?中介绍。\n\n<!-- % -- 195 -- -->\n\n一般的，层不需要连接在链中，尽管这是最常见的做法。\n许多架构构建了一个主链，但随后又添加了额外的架构特性，例如从层$i$到层$i+2$或者更高层的跳跃连接。\n这些跳跃连接使得梯度更容易从输出层流向更接近输入的层。\n\n架构设计考虑的另外一个关键点是如何将层与层之间连接起来。\n默认的神经网络层采用矩阵$\\MW$描述的线性变换，每个输入单元连接到每个输出单元。\n在之后章节中的许多专用网络具有较少的连接，使得输入层中的每个单元仅连接到输出层单元的一个小子集。\n这些用于减少连接数量的策略减少了参数的数量以及用于评估网络的计算量，但通常高度依赖于问题。\n例如，\\chap?描述的卷积神经网络使用对于计算机视觉问题非常有效的稀疏连接的专用模式。\n在这一章中，很难对通用神经网络的架构给出更多具体的建议。\n我们在随后的章节中介绍一些特殊的架构策略，可以在不同的领域工作良好。\n\n<!-- % -- 196 -- -->\n\n\n# 反向传播和其他的微分算法\n\n\n当我们使用前馈神经网络接收输入$\\Vx$并产生输出$\\hat{\\Vy}$时，信息通过网络向前流动。\n输入$\\Vx$提供初始信息，然后传播到每一层的隐藏单元，最终产生输出$\\hat{\\Vy}$。\n这称之为~前向传播。\n在训练过程中，前向传播可以持续向前直到它产生一个标量代价函数$J(\\Vtheta)$。\n反向传播算法{cite?}，经常简称为\\textbf{\\glsdesc{BP}}，允许来自代价函数的信息通过网络向后流动，以便计算梯度。\n\n<!-- % -- 197 -- -->\n\n计算梯度的解析表达式是很直观的，但是数值化地求解这样的表达式在计算上的代价可能很大。\n反向传播算法使用简单和廉价的程序来实现这个目标。\n\n反向传播这个术语经常被误解为用于多层神经网络的整个学习算法。\n实际上，反向传播仅指用于计算梯度的方法，而另一种算法，例如随机梯度下降，使用该梯度来进行学习。\n此外，反向传播经常被误解为仅适用于多层神经网络，但是原则上它可以计算任何函数的导数（对于一些函数，正确的响应是报告函数的导数是未定义的）。\n特别地，我们会描述如何计算一个任意函数$f$的梯度$\\nabla_{\\Vx} f(\\Vx, \\Vy)$，其中$\\Vx$是一组变量，我们需要它们的导数，而$\\Vy$是函数的另外一组输入变量，但我们并不需要它们的导数。\n在学习算法中，我们最常需要的梯度是代价函数关于参数的梯度，即$\\nabla_{\\Vtheta} J(\\Vtheta)$。\n许多机器学习任务需要计算其他导数，来作为学习过程的一部分，或者用来分析学得的模型。\n反向传播算法也适用于这些任务，不局限于计算代价函数关于参数的梯度。\n通过在网络中传播信息来计算导数的想法非常普遍，它还可以用于计算诸如多输出函数$f$的~Jacobian~的值。\n我们这里描述的是最常用的情况，其中$f$只有单个输出。\n\n\n## 计算图\n\n\n目前为止，我们已经用相对非正式的图形语言讨论了神经网络。\n为了更精确地描述反向传播算法，使用更精确的计算图语言是很有帮助的。\n\n将计算形式化为图形的方法有很多。\n\n这里，我们使用图中的每一个节点来表示一个变量。\n变量可以是标量、向量、矩阵、张量、或者甚至是另一类型的变量。\n\n为了形式化我们的图形，我们还需引入操作这一概念。\n操作是指一个或多个变量的简单函数。\n我们的图形语言伴随着一组被允许的操作。\n我们可以通过将多个操作复合在一起来描述更为复杂的函数。\n\n<!-- % -- 198 -- -->\n\n不失一般性，我们定义一个操作仅返回单个输出变量。\n这并没有失去一般性，是因为输出变量可以有多个条目，例如向量。\n反向传播的软件实现通常支持具有多个输出的操作，但是我们在描述中避免这种情况，因为它引入了对概念理解不重要的许多额外细节。\n\n如果变量$y$是变量$x$通过一个操作计算得到的，那么我们画一条从$x$到$y$的有向边。\n我们有时用操作的名称来注释输出的节点，当上下文很明确时，有时也会省略这个标注。\n\n计算图的实例可以参考\\fig?。\n<!-- % fig 6.8 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/computational_graph}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{一些计算图的示例。\n\\emph{(a)}使用$\\times$操作计算$z = xy$的图。 \n\\emph{(b)}用于逻辑回归预测$\\hat{y} = \\sigma(\\Vx^\\top \\Vw + b)$的图。 一些中间表达式在代数表达式中没有名称，但在图形中却需要。\n我们简单地将第$i$个这样的变量命名为$\\Vu^{(i)}$。\n\\emph{(c)}表达式$\\MH = \\max \\{ 0, \\MX\\MW+ \\Vb \\}$的计算图，在给定包含小批量输入数据的设计矩阵$\\MX$时，它计算整流线性单元激活的设计矩阵$\\MH$。\n\\emph{(d)}示例a-c对每个变量最多只实施一个操作，但是对变量实施多个操作也是可能的。 这里我们展示一个计算图，它对线性回归模型的权重$\\Vw$实施多个操作。\n这个权重不仅用于预测$\\hat{y}$，也用于权重衰减罚项$\\lambda \\sum_i w_i^2$。}\n\\end{figure}\n\n\n## 微积分中的链式法则\n\n\n微积分中的链式法则（为了不与概率中的链式法则相混淆）用于计算复合函数的导数。\n反向传播是一种计算链式法则的算法，使用高效的特定运算顺序。\n\n设$x$是实数，$f$和$g$是从实数映射到实数的函数。\n假设$y=g(x)$并且$z=f(g(x))=f(y)$。\n那么链式法则是说\n\\begin{equation}\n\\frac{dz}{dx}=\\frac{dz}{dy} \\frac{dy}{dx}.\n\\end{equation}\n\n我们可以将这种标量情况进行扩展。\n假设$\\Vx\\in \\SetR^m, \\Vy\\in \\SetR^n$，$g$是从$\\SetR^m$到$\\SetR^n$的映射，$f$是从$\\SetR^n$到$\\SetR$的映射。\n如果$\\Vy=g(\\Vx)$并且$z=f(\\Vy)$，那么\n\\begin{equation}\n\\frac{\\partial z}{\\partial x_i} = \\sum_j \\frac{\\partial z}{\\partial y_j} \\frac{\\partial y_j}{\\partial x_i}.\n\\end{equation}\n使用向量记法，可以等价地写成\n\\begin{equation}\n\\nabla_{\\Vx}z = \\left ( \\frac{\\partial \\Vy}{\\partial \\Vx} \\right )^\\top \\nabla_{\\Vy} z,\n\\end{equation}\n这里$\\frac{\\partial \\Vy}{\\partial \\Vx}$是$g$的$n\\times m$的~Jacobian矩阵。\n\n从这里我们看到，变量$\\Vx$的梯度可以通过~Jacobian矩阵$\\frac{\\partial \\Vy}{\\partial \\Vx}$和梯度$\\nabla_{\\Vy} z$相乘来得到。\n反向传播算法由图中每一个这样的~Jacobian~梯度的乘积操作所组成。\n\n<!-- % -- 199 -- -->\n\n通常我们将反向传播算法应用于任意维度的张量，而不仅仅用于向量。\n从概念上讲，这与使用向量的反向传播完全相同。 \n唯一的区别是如何将数字排列成网格以形成张量。 \n我们可以想象，在我们运行反向传播之前，将每个张量变平为一个向量，计算一个向量值梯度，然后将该梯度重新构造成一个张量。\n从这种重新排列的观点上看，反向传播仍然只是将~Jacobian~乘以梯度。\n\n<!-- % -- 200 -- -->\n\n为了表示值$z$关于张量$\\TSX$的梯度，我们记为$\\nabla_\\TSX z$，就像$\\TSX$是向量一样。\n$\\TSX$的索引现在有多个坐标——例如，一个3维的张量由三个坐标索引。\n我们可以通过使用单个变量$i$来表示完整的索引元组，从而完全抽象出来。\n对所有可能的元组$i$，$(\\nabla_\\TSX z)_i$给出$\\frac{\\partial z}{\\partial \\TEX_i}$。\n这与向量中索引的方式完全一致，$(\\nabla_{\\Vx} z)_i$给出$\\frac{\\partial z}{\\partial x_i}$。\n使用这种记法，我们可以写出适用于张量的链式法则。\n如果$\\TSY=g(\\TSX)$并且$z=f(\\TSY)$，那么\n\\begin{equation}\n  \\nabla_\\TSX z = \\sum_j (\\nabla_\\TSX \\TEY_j)\\frac{\\partial z}{\\partial \\TEY_j}.\n\\end{equation}\n\n\n## 递归地使用链式法则来实现反向传播\n\n\n使用链式规则，我们可以直接写出某个标量关于计算图中任何产生该标量的节点的梯度的代数表达式。\n然而，实际在计算机中计算该表达式时会引入一些额外的考虑。\n\n具体来说，许多子表达式可能在梯度的整个表达式中重复若干次。\n任何计算梯度的程序都需要选择是存储这些子表达式还是重新计算它们几次。\n\\fig?给出了一个例子来说明这些重复的子表达式是如何出现的。\n在某些情况下，计算两次相同的子表达式纯粹是浪费。\n在复杂图中，可能存在指数多的这种计算上的浪费，使得简单的链式法则不可实现。\n在其他情况下，计算两次相同的子表达式可能是以较高的运行时间为代价来减少内存开销的有效手段。\n\n我们首先给出一个版本的反向传播算法，它指明了梯度的直接计算方式（\\alg?以及相关的正向计算的\\alg?），按照它实际完成的顺序并且递归地使用链式法则。\n我们可以直接执行这些计算或者将算法的描述视为用于计算反向传播的计算图的符号表示。\n然而，这些公式并没有明确地操作和构造用于计算梯度的符号图。\n这些公式将在后面的\\sec?和\\alg?中给出，其中我们还推广到了包含任意张量的节点。\n\n首先考虑描述如何计算单个标量$u^{(n)}$（例如训练样本上的损失函数）的计算图。\n我们想要计算这个标量对$n_i$个输入节点$u^{(1)}$到$u^{(n_i)}$的梯度。\n换句话说，我们希望对所有的$i\\in\\{1,2,\\ldots,n_i\\}$计算$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$。\n在使用反向传播计算梯度来实现参数的梯度下降时，$u^{(n)}$将对应单个或者小批量实例的代价函数，而$u^{(1)}$到$u^{(n_i)}$则对应于模型的参数。\n\n<!-- % -- 201 -- -->\n\n我们假设图的节点已经以一种特殊的方式被排序，使得我们可以一个接一个地计算他们的输出，从$u^{(n_i+1)}$开始，一直上升到$u^{(n)}$。\n如\\alg?中所定义的，每个节点$u^{(i)}$与操作$f^{(i)}$相关联，并且通过对以下函数求值来得到\n\\begin{equation}\n  u^{(i)} = f(\\SetA^{(i)}),\n\\end{equation}\n其中$\\SetA^{(i)}$是$u^{(i)}$所有父节点的集合。\n<!-- % alg 6.1 -->\n\\begin{algorithm}[htbp]\n\\caption{计算将$n_i$个输入$u^{(1)}$到$u^{(n_i)}$映射到一个输出$u^{(n)}$的程序。\n这定义了一个计算图，其中每个节点通过将函数$f^{(i)}$应用到变量集合$\\SetA^{(i)}$上来计算$u^{(i)}$的值，$\\SetA^{(i)}$包含先前节点$u^{(j)}$的值满足$j<i$且$j \\in Pa(u^{(i)})$。\n计算图的输入是向量$\\Vx$，并且被分配给前$n_i$个节点$u^{(1)}$到$u^{(n_i)}$。计算图的输出可以从最后一个（输出）节点$u^{(n)}$读出。}\n\\begin{algorithmic}\n\\FOR {$i=1, \\ldots, n_i$}\n \\STATE $u^{(i)} \\leftarrow x_i$\n\\ENDFOR\n\\FOR {$i=n_i+1, \\ldots, n$}\n \\STATE $\\SetA^{(i)} \\leftarrow \\{ u^{(j)} \\mid j \\in Pa(u^{(i)}) \\}$\n \\STATE $u^{(i)} \\leftarrow f^{(i)}(\\SetA^{(i)})$\n\\ENDFOR\n\\STATE {\\bf return} $u^{(n)}$\n\\end{algorithmic}\n\\end{algorithm}\n\n<!-- % -- 202 -- -->\n\n该算法详细说明了前向传播的计算，我们可以将其放入图$\\CalG$中。\n为了执行反向传播，我们可以构造一个依赖于$\\CalG$并添加额外一组节点的计算图。\n这形成了一个子图$\\CalB$，它的每个节点都是$\\CalG$的节点。\n$\\CalB$中的计算和$\\CalG$中的计算顺序完全相反，而且$\\CalB$中的每个节点计算导数$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$与前向图中的节点$u^{(i)}$相关联。\n这通过对标量输出$u^{(n)}$使用链式法则来完成：\n\\begin{equation}\n  \\frac{\\partial u^{(n)}}{\\partial u^{(j)}} = \\sum_{i:j \\in Pa(u^{(i)})} \\frac{\\partial u^{(n)} }{ \\partial u^{(i)} } \\frac{ \\partial u^{(i)} }{ \\partial u^{(j)} }\n\\end{equation}\n这在\\alg?中详细说明。\n子图$\\CalB$恰好包含每一条对应着$\\CalG$中从节点$u^{(j)}$到节点$u^{(i)}$的边。\n从$u^{(j)}$到$u^{(i)}$的边对应着计算$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$。\n另外，对于每个节点都要执行一个内积，内积的一个因子是对于$u^{j}$子节点$u^{(i)}$的已经计算的梯度，另一个因子是对于相同子节点$u^{(i)}$ 的偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$组成的向量。\n总而言之，执行反向传播所需的计算量与$\\CalG$中的边的数量成比例，其中每条边的计算包括计算偏导数（节点关于它的一个父节点的偏导数）以及执行一次乘法和一次加法。\n下面，我们将此分析推广到张量值节点，这只是在同一节点中对多个标量值进行分组并能够更高效地实现。\n<!-- % fig 6.9 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/repeated_subexpression}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{\n计算梯度时导致重复子表达式的计算图。\n令$w \\in \\SetR$为图的输入。\n我们对链中的每一步使用相同的操作函数$f: \\SetR \\to \\SetR$，这样$x=f(w), y=f(x), z=f(y)$。\n为了计算$\\frac{\\partial z}{\\partial w}$，我们应用\\eqn?得到：\n\\begin{align}\n& \\frac{\\partial z}{\\partial w}\\\\\n=& \\frac{\\partial z}{\\partial y} \\frac{\\partial y}{\\partial x} \\frac{\\partial x}{\\partial w}\\\\\n=& f'(y)f'(x)f'(w)\\\\ \n=& f'(f(f(w))) f'(f(w)) f'(w). \n\\end{align}\n\\eqn?建议我们采用的实现方式是，仅计算$f(w)$的值一次并将它存储在变量$x$中。\n这是反向传播算法所采用的方法。\n\\eqn?提出了一种替代方法，其中子表达式$f(w)$出现了不止一次。\n在替代方法中，每次只在需要时重新计算$f(w)$。\n当存储这些表达式的值所需的存储较少时，\\eqn?的反向传播方法显然是较优的，因为它减少了运行时间。\n然而，\\eqn?也是链式法则的有效实现，并且当存储受限时它是有用的。}\n\\end{figure}\n\n<!-- % -- 203 -- -->\n\n反向传播算法被设计为减少公共子表达式的数量而不考虑存储的开销。\n具体来说，它大约对图中的每个节点执行一个~Jacobian~乘积。\n这可以从\\alg?中看出，反向传播算法访问了图中的节点$u^{(j)}$到节点$u^{(i)}$的每条边一次，以获得相关的偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$。\n反向传播因此避免了重复子表达式的指数爆炸。\n然而，其他算法可能通过对计算图进行简化来避免更多的子表达式，或者也可能通过重新计算而不是存储这些子表达式来节省内存。\n我们将在描述完反向传播算法本身后再重新审视这些想法。\n<!-- % alg 6.2 -->\n\\begin{algorithm}[htb!]\n\\caption{反向传播算法的简化版本，用于计算$u^{(n)}$关于图中变量的导数。\n这个示例旨在通过演示所有变量都是标量的简化情况来进一步理解反向传播算法，这里我们希望计算关于$u^{(1)},\\ldots,u^{(n_i)}$的导数。\n这个简化版本计算了关于图中所有节点的导数。\n假定与每条边相关联的偏导数计算需要恒定的时间的话，该算法的计算成本与图中边的数量成比例。\n这与前向传播的计算次数具有相同的阶。\n每个$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$是$u^{(i)}$的父节点$u^{(j)}$的函数，从而将前向图的节点链接到反向传播图中添加的节点。}\n\\begin{algorithmic}\n\\STATE 运行前向传播 (对于此例是\\alg?) 获得网络的激活。\n\\STATE 初始化 {\\tt grad\\_table}，用于存储计算好的导数的数据结构。 ${\\tt grad\\_table}[u^{(i)}]$将存储$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$计算好的值。\n\\STATE ${\\tt grad\\_table}[u^{(n)}] \\leftarrow 1$\n\\FOR {$j=n-1$ down to 1}\n\\STATE 下一行使用存储的值计算 $\\frac{\\partial u^{(n)}}{\\partial u^{(j)}} =\n  \\sum_{i: j \\in Pa(u^{(i)})} \\frac{\\partial u^{(n)}}{\\partial u^{(i)}} \\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$：\n\\STATE ${\\tt grad\\_table}[ u^{(j)}] \\leftarrow \n\\sum_{i: j \\in Pa(u^{(i)})} {\\tt grad\\_table}[u^{(i)}]\n\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$\n\\ENDFOR\n\\STATE {\\bf return} $\\{ {\\tt grad\\_table}[ u^{(i)}] \\mid i=1, \\dots, n_i \\} $\n\\end{algorithmic}\n\\end{algorithm}\n\n\n<!-- % -- 204 -- -->\n\n\n## 全连接MLP中的反向传播计算\n\n\n为了阐明反向传播的上述定义，让我们考虑一个与全连接的多层MLP相关联的特定图。\n\n\\alg?首先给出了前向传播，它将参数映射到与单个训练样本（输入，目标）$(\\Vx,\\Vy)$相关联的监督损失函数$L(\\hat{\\Vy}, \\Vy)$，其中$\\hat{\\Vy}$是当$\\Vx$提供输入时神经网络的输出。\n<!-- % alg 6.3 -->\n\\begin{algorithm}[ht]\n\\caption{典型深度神经网络中的前向传播和代价函数的计算。\n损失函数$L(\\hat{\\Vy}, \\Vy)$取决于输出$\\hat{\\Vy}$和目标$\\Vy$（参考\\sec?中损失函数的示例）。\n为了获得总代价$J$，损失函数可以加上正则项$\\Omega(\\theta)$，其中$\\theta$包含所有参数（权重和偏置）。\n\\alg?说明了如何计算$J$关于参数$\\MW$和$\\Vb$的梯度。 为简单起见，该演示仅使用单个输入样本$\\Vx$。\n实际应用应该使用小批量。\n请参考\\sec?以获得更加真实的演示。}\n\\begin{algorithmic}\n\\REQUIRE 网络深度， $l$\n\\REQUIRE $\\MW^{(i)}, i \\in \\{ 1, \\dots, l\\}$， 模型的权重矩阵\n\\REQUIRE $\\Vb^{(i)}, i \\in \\{ 1, \\dots, l\\}$， 模型的偏置参数\n\\REQUIRE $\\Vx$，程序的输入\n\\REQUIRE $\\Vy$，目标输出\n\\STATE $\\Vh^{(0)}=\\Vx$\n\\FOR {$k=1, \\ldots, l$}\n \\STATE $\\Va^{(k)} = \\Vb^{(k)} + \\MW^{(k)} \\Vh^{(k-1)}$\n \\STATE $\\Vh^{(k)} = f(\\Va^{(k)})$\n\\ENDFOR\n\\STATE $\\hat{\\Vy} = \\Vh^{(l)}$\n\\STATE $J = L(\\hat{\\Vy},\\Vy) + \\lambda \\Omega(\\theta)$\n\\end{algorithmic}\n\\end{algorithm}\n\n\\alg?随后说明了将反向传播应用于该图所需的相关计算。\n<!-- % alg 6.4 -->\n\\begin{algorithm}[htbp]\n\\caption{深度神经网络中\\alg?的反向计算，它不止使用了输入$\\Vx $和目标$\\Vy$。\n该计算对于每一层$k$都产生了对激活$\\Va^{(k)}$的梯度，从输出层开始向后计算一直到第一个隐藏层。\n这些梯度可以看作是对每层的输出应如何调整以减小误差的指导，根据这些梯度可以获得对每层参数的梯度。\n权重和偏置上的梯度可以立即用作随机梯度更新的一部分（梯度算出后即可执行更新），或者与其他基于梯度的优化方法一起使用。\n}\n\\begin{algorithmic}\n\\STATE 在前向计算完成后，计算顶层的梯度：\n\\STATE $\\Vg \\leftarrow \\nabla_{\\hat{\\Vy}} J = \\nabla_{\\hat{\\Vy}} L(\\hat{\\Vy},\\Vy)$\n\\FOR {$k=l, l-1, \\dots, 1$}\n\\STATE 将关于层输出的梯度转换为非线性激活输入前的梯度（如果 $f$ 是逐元素的，则逐元素地相乘）：\n  \\STATE $\\Vg \\leftarrow \\nabla_{\\Va^{(k)}} J = \\Vg \\odot f'(\\Va^{(k)})$\n  \\STATE 计算关于权重和偏置的梯度（如果需要的话，还要包括正则项）：\n  \\STATE $\\nabla_{\\Vb^{(k)}} J = \\Vg + \\lambda \\nabla_{\\Vb^{(k)}} \\Omega(\\theta)$\n  \\STATE $\\nabla_{\\MW^{(k)}} J = \\Vg \\; \\Vh^{(k-1)\\top} + \\lambda \\nabla_{\\MW^{(k)}} \\Omega(\\theta)$\n  \\STATE 关于下一更低层的隐藏层传播梯度：\n  \\STATE $\\Vg \\leftarrow \\nabla_{\\Vh^{(k-1)}} J = \\MW^{(k)\\top} \\; \\Vg$\n\\ENDFOR\n\\end{algorithmic}\n\\end{algorithm}\n\n\\alg?和\\alg?是简单而直观的演示。\n然而，它们专门针对特定的问题。\n\n现在的软件实现基于之后\\sec?中描述的一般形式的反向传播，它可以通过显式地操作表示符号计算的数据结构，来适应任何计算图。\n\n\n<!-- % -- 205 -- -->\n\n\n## 符号到符号的导数\n\n\n代数表达式和计算图都对符号或不具有特定值的变量进行操作。\n这些代数或者基于图的表达式被称为符号表示。\n当我们实际使用或者训练神经网络时，我们必须给这些符号赋特定的值。\n我们用一个特定的数值来替代网络的符号输入$\\Vx$，例如$[1.2, 3,765, -1.8]^\\top$。\n\n一些反向传播的方法采用计算图和一组用于图的输入的数值，然后返回在这些输入值处梯度的一组数值。\n我们将这种方法称为\\,\\textbf{符号到数值}的微分。\n这种方法用在诸如Torch~{cite?}和Caffe~{cite?}之类的库中。\n\n<!-- % -- 206 -- -->\n \n另一种方法是采用计算图以及添加一些额外的节点到计算图中，这些额外的节点提供了我们所需导数的符号描述。\n这是Theano~{cite?}和TensorFlow~{cite?}所采用的方法。\n\\fig?给出了该方法如何工作的一个例子。\n这种方法的主要优点是导数可以使用与原始表达式相同的语言来描述。\n因为导数只是另外一张计算图，我们可以再次运行反向传播，对导数再进行求导就能得到更高阶的导数。\n高阶导数的计算在\\sec?中描述。\n<!-- % fig 6.10 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/symbol_to_symbol}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{使用符号到符号的方法计算导数的示例。\n在这种方法中，反向传播算法不需要访问任何实际的特定数值。\n相反，它将节点添加到计算图中来描述如何计算这些导数。\n通用图形求值引擎可以在随后计算任何特定数值的导数。\n\\emph{(左)}在这个例子中，我们从表示$z=f(f(f(w)))$的图开始。\n\\emph{(右)}我们运行反向传播算法，指导它构造表达式$\\frac{dz}{dw}$对应的图。 在这个例子中，我们不解释反向传播算法如何工作。\n我们的目的只是说明想要的结果是什么：符号描述的导数的计算图。}\n\\end{figure}\n\n我们将使用后一种方法，并且使用构造导数的计算图的方法来描述反向传播算法。\n图的任意子集之后都可以使用特定的数值来求值。\n这允许我们避免精确地指明每个操作应该在何时计算。\n相反，通用的图计算引擎只要当一个节点的父节点的值都可用时就可以进行求值。\n\n<!-- % -- 207 -- -->\n  \n基于符号到符号的方法的描述包含了符号到数值的方法。\n符号到数值的方法可以理解为执行了与符号到符号的方法中构建图的过程中完全相同的计算。\n关键的区别是符号到数值的方法不会显示出计算图。\n\n\n## 一般化的反向传播\n\n\n反向传播算法非常简单。\n为了计算某个标量$z$关于图中它的一个祖先$\\Vx$的梯度，我们首先观察到它关于$z$的梯度由$\\frac{dz}{dz}=1$给出。\n然后，我们可以计算对图中$z$的每个父节点的梯度，通过现有的梯度乘以产生$z$的操作的~Jacobian。\n我们继续乘以~Jacobian，以这种方式向后穿过图，直到我们到达$\\Vx$。\n对于从$z$出发可以经过两个或更多路径向后行进而到达的任意节点，我们简单地对该节点来自不同路径上的梯度进行求和。\n\n更正式地，图$\\CalG$中的每个节点对应着一个变量。\n为了实现最大的一般化，我们将这个变量描述为一个张量$\\TSV$。\n张量通常可以具有任意维度，并且包含标量、向量和矩阵。\n\n我们假设每个变量$\\TSV$与下列子程序相关联：\n\n+ \\verb|get_operation|($\\TSV$)：它返回用于计算$\\TSV$的操作，代表了在计算图中流入$\\TSV$的边。\n    例如，可能有一个Python或者C++的类表示矩阵乘法操作，以及~\\verb|get_operation|函数。\n    假设我们的一个变量是由矩阵乘法产生的，$\\MC=\\MA\\MB$。\n    那么，\\verb|get_operation|($\\TSV$)返回一个指向相应C++类的实例的指针。\n\n+ \\verb|get_consumers|($\\TSV, \\CalG$)：它返回一组变量，是计算图$\\CalG$中$\\TSV$的子节点。\n\n+ \\verb|get_inputs|($\\TSV, \\CalG$)：它返回一组变量，是计算图$\\CalG$中$\\TSV$的父节点。\n\n\n<!-- % -- 208 -- -->\n  \n每个操作~\\verb|op|也与~\\verb|bprop|操作相关联。\n该~\\verb|bprop|操作可以计算如\\eqn?所描述的~Jacobian~向量积。\n这是反向传播算法能够实现很大通用性的原因。\n每个操作负责了解如何通过它参与的图中的边来反向传播。\n例如，我们可以使用矩阵乘法操作来产生变量$\\MC=\\MA\\MB$。\n假设标量$z$关于$\\MC$的梯度是$\\MG$。\n矩阵乘法操作负责定义两个反向传播规则，每个规则对应于一个输入变量。\n如果我们调用~\\verb|bprop|方法来请求关于$\\MA$的梯度，那么在给定输出的梯度为$\\MG$的情况下，矩阵乘法操作的~\\verb|bprop|方法必须说明关于$\\MA$的梯度是$\\MG\\MB^\\top$。\n类似的，如果我们调用~\\verb|bprop|方法来请求关于$\\MB$的梯度，那么矩阵操作负责实现~\\verb|bprop|方法并指定希望的梯度是$\\MA^\\top\\MG$。\n反向传播算法本身并不需要知道任何微分法则。\n它只需要使用正确的参数调用每个操作的~\\verb|bprop|方法即可。\n正式地，~\\verb|op.bprop(inputs|$, \\TSX, \\TSG)$必须返回\n\\begin{equation}\n  \\sum_i (\\nabla_{\\TSX} \\verb|op.f(inputs|)_i) \\textsf{G}_i,\n\\end{equation}\n这只是如\\eqn?所表达的链式法则的实现。\n这里，\\verb|inputs|是提供给操作的一组输入，\\verb|op.f|是操作实现的数学函数，$\\TSX$是输入，我们想要计算关于它的梯度，$\\TSG$是操作对于输出的梯度。\n\n\\verb|op.bprop|方法应该总是假装它的所有输入彼此不同，即使它们不是。\n例如，如果~\\verb|mul|操作传递两个$x$来计算$x^2$，\\verb|op.bprop|方法应该仍然返回$x$作为对于两个输入的导数。\n反向传播算法后面会将这些变量加起来获得$2x$，这是$x$上总的正确的导数。\n\n反向传播算法的软件实现通常提供操作和其~\\verb|bprop|方法，所以深度学习软件库的用户能够对使用诸如矩阵乘法、指数运算、对数运算等等常用操作构建的图进行反向传播。\n构建反向传播新实现的软件工程师或者需要向现有库添加自己的操作的高级用户通常必须手动为新操作推导~\\verb|op.bprop|方法。\n\n反向传播算法的正式描述参考\\alg?。\n\n<!-- % -- 209 -- -->\n<!-- % alg 6.5 -->\n\\begin{algorithm}[ht]\n\\caption{反向传播算法最外围的骨架。\n这部分做简单的设置和清理工作。\n大多数重要的工作发生在\\alg?的子程序{\\tt build\\_grad}中。\n}\n\\begin{algorithmic}\n\\REQUIRE $\\SetT$，需要计算梯度的目标变量集\n\\REQUIRE $\\CalG$，计算图\n\\REQUIRE $z$， 要微分的变量\n\\STATE 令 $\\CalG'$ 为$\\CalG$剪枝后的计算图，其中仅包括$z$的祖先以及$\\SetT$中节点的后代。\n\\STATE 初始化 {\\tt grad\\_table}，它是关联张量和对应导数的数据结构。\n\\STATE ${\\tt grad\\_table}[z] \\leftarrow 1$\n\\FOR{$\\TSV$ in $\\SetT$}\n\\STATE ${\\tt build\\_grad}(\\TSV, \\CalG, \\CalG', {\\tt grad\\_table})$\n\\ENDFOR\n\\STATE Return {\\tt grad\\_table} restricted to $\\SetT$\n\\end{algorithmic}\n\\end{algorithm}\n\n\\begin{algorithm}[ht]\n\\caption{反向传播算法的内循环子程序${\\tt build\\_grad}(\\TSV, \\CalG, \\CalG', {\\tt grad\\_table})$，\n由\\alg?中定义的反向传播算法调用。\n}\n\\begin{algorithmic}\n\\REQUIRE $\\TSV$，应该被加到$\\CalG$和{\\tt grad\\_table}的变量。\n\\REQUIRE $\\CalG$，要修改的图。\n\\REQUIRE $\\CalG'$，根据参与梯度的节点$\\CalG$的受限图。\n\\REQUIRE {\\tt grad\\_table}，将节点映射到对应梯度的数据结构。\n\\IF{$\\SetV$ is in {\\tt grad\\_table} }\n \\STATE Return ${\\tt grad\\_table}[\\TSV]$\n\\ENDIF\n\\STATE $i \\leftarrow 1$\n\\FOR{$\\TSC$ in ${\\tt get\\_consumers}(\\TSV, \\CalG')$ }\n\\STATE ${\\tt op} \\leftarrow {\\tt get\\_operation}(\\TSC)$\n\\STATE $\\TSD \\leftarrow {\\tt build\\_grad}(\\TSC, \\CalG, \\CalG', {\\tt grad\\_table})$\n\\STATE $\\TSG^{(i)} \\leftarrow {\\tt op.bprop}({\\tt get\\_inputs}(\\TSC, \\CalG'), \\TSV, \\TSD)$ \n\\STATE $i \\leftarrow i + 1$\n\\ENDFOR\n\\STATE $\\TSG \\leftarrow \\sum_i \\TSG^{(i)}$\n\\STATE ${\\tt grad\\_table}[\\TSV] = \\TSG$\n\\STATE 插入 $\\TSG$ 和将其生成到$\\CalG$中的操作\n\\STATE Return $\\TSG$\n\\end{algorithmic}\n\\end{algorithm}\n\n\n<!-- % -- 210 -- -->\n  \n在\\sec?中，我们使用反向传播作为一种策略来避免多次计算链式法则中的相同子表达式。\n由于这些重复子表达式的存在，简单的算法可能具有指数运行时间。\n现在我们已经详细说明了反向传播算法，我们可以去理解它的计算成本。\n如果我们假设每个操作的执行都有大致相同的开销，那么我们可以依据执行操作的数量来分析计算成本。\n注意这里我们将一个操作记为计算图的基本单位，它实际可能包含许多算术运算（例如，我们可能将矩阵乘法视为单个操作）。\n在具有$n$个节点的图中计算梯度，将永远不会执行超过$O(n^2)$个操作，或者存储超过$O(n^2)$个操作的输出。\n这里我们是对计算图中的操作进行计数，而不是由底层硬件执行的单独操作，所以重要的是要记住每个操作的运行时间可能是高度可变的。\n例如，两个矩阵相乘可能对应着图中的一个单独的操作，但这两个矩阵可能每个都包含数百万个元素。\n我们可以看到，计算梯度至多需要$O(n^2)$的操作，因为在最坏的情况下，前向传播的步骤将在原始图的全部$n$个节点上运行（取决于我们想要计算的值，我们可能不需要执行整个图）。\n反向传播算法在原始图的每条边添加一个~Jacobian~向量积，可以用$O(1)$个节点来表达。\n因为计算图是有向无环图，它至多有$O(n^2)$条边。对于实践中常用图的类型，情况会更好。\n大多数神经网络的代价函数大致是链式结构的，使得反向传播只有$O(n)$的成本。\n这远远胜过简单的方法，简单方法可能需要在指数级的节点上运算。\n这种潜在的指数级代价可以通过非递归地扩展和重写递归链式法则（\\eqn?）来看出：\n\\begin{equation}\n  \\frac{\\partial u^{(n)}}{\\partial u^{(j)}} =\n  \\sum_{\\substack{\\text{path}(u^{(\\pi_1)}, u^{(\\pi_2)}, \\ldots, u^{(\\pi_t)}  ),\\\\ \\text{from } \\pi_1=j \\text{ to }\\pi_t = n}}\n  \\prod_{k=2}^t \\frac{\\partial u^{(\\pi_k)}}{\\partial u^{(\\pi_{k-1})}}.\n\\end{equation}\n由于节点$j$到节点$n$的路径数目可以关于这些路径的长度上指数地增长，所以上述求和符号中的项数（这些路径的数目），可能以前向传播图的深度的指数级增长。\n会产生如此大的成本是因为对于$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$，相同的计算会重复进行很多次。\n为了避免这种重新计算，我们可以将反向传播看作一种表填充算法，利用存储的中间结果$\\frac{\\partial u^{(n)}}{\\partial u^{(i)}}$来对表进行填充。\n图中的每个节点对应着表中的一个位置，这个位置存储对该节点的梯度。\n通过顺序填充这些表的条目，反向传播算法避免了重复计算许多公共子表达式。\n这种表填充策略有时被称为动态规划。\n  \n<!-- % -- 211 -- -->\n  \n\n## 实例：用于MLP训练的反向传播\n\n\n作为一个例子，我们利用反向传播算法来训练多层感知机。\n\n这里，我们考虑一个具有单个隐藏层的非常简单的多层感知机。\n为了训练这个模型，我们将使用小批量随机梯度下降算法。\n反向传播算法用于计算单个小批量上的代价的梯度。\n具体来说，我们使用训练集上的一小批量实例，将其规范化为一个设计矩阵$\\MX$以及相关联的类标签向量$\\Vy$。\n网络计算隐藏特征层$\\MH=\\max\\{0, \\MX\\MW^{(1)}\\}$。\n为了简化表示，我们在这个模型中不使用偏置。\n假设我们的图语言包含~\\verb|relu|操作，该操作可以对$\\max\\{0,\\MZ\\}$表达式的每个元素分别进行计算。\n类的非归一化对数概率的预测将随后由$\\MH\\MW^{(2)}$ 给出。\n假设我们的图语言包含~\\verb|cross_entropy|操作，用以计算目标$\\Vy$和由这些未归一化对数概率定义的概率分布间的交叉熵。\n所得到的交叉熵定义了代价函数$J_\\text{MLE}$。最小化这个交叉熵将执行对分类器的最大似然估计。\n然而，为了使得这个例子更加真实，我们也包含一个正则项。\n总的代价函数为\n\\begin{equation}\n  J = J_{\\text{MLE}} + \\lambda \\left ( \\sum_{i, j} \\left (W_{i, j}^{(1)} \\right )^2 + \\sum_{i, j} \\left (W_{i, j}^{(2)} \\right)^2 \\right )\n\\end{equation}\n包含了交叉熵和系数为$\\lambda$的权重衰减项。\n它的计算图在\\fig?中给出。\n<!-- % fig 6.11 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter6/figures/mlp_example}}\n\\fi\n\\caption{用于计算代价函数的计算图，这个代价函数是使用交叉熵损失以及权重衰减训练我们的单层~MLP~示例所产生的。}\n\\end{figure}\n\n这个示例的梯度计算图实在太大，以致绘制或者阅读都将是乏味的。\n这显示出了反向传播算法的优点之一，即它可以自动生成梯度，而这种计算对于软件工程师来说需要进行直观但冗长的手动推导。\n\n我们可以通过观察\\fig?中的正向传播图来粗略地描述反向传播算法的行为。\n为了训练，我们希望计算$\\nabla_{\\MW^{(1)}} J$和$\\nabla_{\\MW^{(2)}} J$。\n有两种不同的路径从$J$后退到权重：一条通过交叉熵代价，另一条通过权重衰减代价。\n权重衰减代价相对简单，它总是对$\\MW^{(i)}$上的梯度贡献$2\\lambda \\MW^{(i)}$。\n  \n<!-- % -- 212 -- -->\n  \n另一条通过交叉熵代价的路径稍微复杂一些。\n令$\\MG$是由~\\verb|cross_entropy|操作提供的对未归一化对数概率$\\MU^{(2)}$的梯度。\n反向传播算法现在需要探索两个不同的分支。\n在较短的分支上，它使用对矩阵乘法的第二个变量的反向传播规则，将$\\MH^\\top \\MG$加到$\\MW^{(2)}$的梯度上。\n另一条更长些的路径沿着网络逐步下降。\n首先，反向传播算法使用对矩阵乘法的第一个变量的反向传播规则，计算$\\nabla_{\\MH} J = \\MG\\MW^{(2)\\top}$。\n接下来，\\verb|relu|操作使用其反向传播规则对先前梯度的部分位置清零，这些位置对应着$\\MU^{(1)}$中所有小于0的元素。记上述结果为$\\MG'$。 \n反向传播算法的最后一步是使用对~\\verb|matmul|操作的第二个变量的反向传播规则，将$\\MX^\\top \\MG'$加到$\\MW^{(1)}$的梯度上。\n\n在计算了这些梯度以后，梯度下降算法或者其他优化算法所要做的就是使用这些梯度来更新参数。\n\n对于MLP，计算成本主要来源于矩阵乘法。\n在前向传播阶段，我们乘以每个权重矩阵，得到了$O(w)$数量的乘-加，其中$w$是权重的数量。\n在反向传播阶段，我们乘以每个权重矩阵的转置，这具有相同的计算成本。\n算法主要的存储成本是我们需要将输入存储到隐藏层的非线性中去。\n这些值从被计算时开始存储，直到反向过程回到了同一点。\n因此存储成本是$O(mn_h)$，其中$m$是小批量中样本的数目，$n_h$是隐藏单元的数量。\n  \n<!-- % -- 213 -- -->\n  \n\n## 复杂化\n\n\n我们这里描述的反向传播算法要比实践中实际使用的实现要简单。\n\n正如前面提到的，我们将操作的定义限制为返回单个张量的函数。\n大多数软件实现需要支持可以返回多个张量的操作。 \n例如，如果我们希望计算张量中的最大值和该值的索引，则最好在单次运算中计算两者，因此将该过程实现为具有两个输出的操作效率更高。\n\n我们还没有描述如何控制反向传播的内存消耗。\n反向传播经常涉及将许多张量加在一起。\n在朴素方法中，将分别计算这些张量中的每一个，然后在第二步中对所有这些张量求和。 \n朴素方法具有过高的存储瓶颈，可以通过保持一个缓冲器，并且在计算时将每个值加到该缓冲器中来避免该瓶颈。\n\n反向传播的现实实现还需要处理各种数据类型，例如32位浮点数、64位浮点数和整型。\n处理这些类型的策略需要特别的设计考虑。\n\n一些操作具有未定义的梯度，并且重要的是跟踪这些情况并且确定用户请求的梯度是否是未定义的。\n\n各种其他技术的特性使现实世界的微分更加复杂。 这些技术性并不是不可逾越的，本章已经描述了计算微分所需的关键知识工具，但重要的是要知道还有许多的精妙之处存在。\n  \n<!-- % -- 214 -- -->\n  \n\n## 深度学习界以外的微分\n\n\n深度学习界在某种程度上已经与更广泛的计算机科学界隔离开来，并且在很大程度上发展了自己关于如何进行微分的文化态度。\n更一般地，自动微分领域关心如何以算法方式计算导数。 \n这里描述的反向传播算法只是自动微分的一种方法。 \n它是一种称为反向模式累加的更广泛类型的技术的特殊情况。 \n其他方法以不同的顺序来计算链式法则的子表达式。 \n一般来说，确定一种计算的顺序使得计算开销最小，是困难的问题。 \n找到计算梯度的最优操作序列是NP完全问题{cite?}，在这种意义上，它可能需要将代数表达式简化为它们最廉价的形式。\n\n例如，假设我们有变量$p_1,p_2\\ldots,p_n$表示概率，以及变量$z_1,z_2,\\ldots,z_n$表示未归一化的对数概率。\n假设我们定义\n\\begin{equation}\n  q_i = \\frac{\\exp(z_i)}{\\sum_i \\exp(z_i)},\n\\end{equation}\n其中我们通过指数化、求和与除法运算构建softmax函数，并构造交叉熵损失函数$J=-\\sum_i p_i\\log q_i$。\n人类数学家可以观察到$J$对$z_i$的导数有一个非常简单的形式：$q_i-p_i$\n<!-- %\\footnote{译者注：$\\frac{\\partial J}{\\partial z_i} = -\\frac{p_i}{q_i}\\frac{\\partial q_i}{\\partial z_i} -\\sum_{j \\ne i} \\frac{p_j}{q_j} \\frac{\\partial q_j}{\\partial z_i}  = -\\frac{p_i}{q_i}(q_i - q_i^2) - \\sum_{j \\ne i} \\frac{p_j}{q_j}(-q_jq_i) =p_i(q_i - 1) + (1-p_i)q_i = q_i - p_i.$}。 -->\n反向传播算法不能够以这种方式来简化梯度，而是会通过原始图中的所有对数和指数操作显式地传播梯度。\n一些软件库如Theano~{cite?}能够执行某些种类的代数替换来改进由纯反向传播算法提出的图。\n  \n<!-- % -- 215 -- -->\n  \n当前向图$\\CalG$具有单个输出节点，并且每个偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$都可以用恒定的计算量来计算时，反向传播保证梯度计算的计算数目和前向计算的计算数目是同一个量级：这可以在\\alg?中看出，因为每个局部偏导数$\\frac{\\partial u^{(i)}}{\\partial u^{(j)}}$以及递归链式公式（\\eqn?）中相关的乘和加都只需计算一次。\n因此，总的计算量是$O(\\#\\text{edges})$。\n然而，可能通过对反向传播算法构建的计算图进行简化来减少这些计算量，并且这是NP完全问题。\n诸如Theano和TensorFlow的实现使用基于匹配已知简化模式的试探法，以便重复地尝试去简化图。\n我们定义反向传播仅用于计算标量输出的梯度，但是反向传播可以扩展到计算~Jacobian矩阵（该~Jacobian矩阵或者来源于图中的$k$个不同标量节点，或者来源于包含$k$个值的张量值节点）。\n朴素的实现可能需要$k$倍的计算：对于原始前向图中的每个内部标量节点，朴素的实现计算$k$个梯度而不是单个梯度。\n当图的输出数目大于输入的数目时，有时更偏向于使用另外一种形式的自动微分，称为前向模式累加。\n前向模式计算已经被提出用于循环神经网络梯度的实时计算，例如{cite?}。\n这也避免了存储整个图的值和梯度的需要，是计算效率和内存使用的折中。\n前向模式和后向模式的关系类似于左乘和右乘一系列矩阵之间的关系，例如\n\\begin{equation}\n  \\MA \\MB \\MC \\MD,\n\\end{equation}\n其中的矩阵可以认为是~Jacobian矩阵。\n例如，如果$\\MD$是列向量，而$\\MA$有很多行，那么这对应于一幅具有单个输出和多个输入的图，并且从最后开始乘，反向进行，只需要矩阵-向量的乘积。\n这对应着反向模式。\n相反，从左边开始乘将涉及一系列的矩阵-矩阵乘积，这使得总的计算变得更加昂贵。\n然而，如果$\\MA$的行数小于$D$的列数，则从左到右乘更为便宜，这对应着前向模式。\n\n在机器学习以外的许多社区中，更常见的是使用传统的编程语言来直接实现微分软件，例如用Python或者C来编程，并且自动生成使用这些语言编写的不同函数的程序。\n在深度学习界中，计算图通常使用由专用库创建的明确的数据结构表示。\n专用方法的缺点是需要库开发人员为每个操作定义~\\verb|bprop|方法，并且限制了库的用户仅使用定义好的那些操作。\n然而，专用方法也允许定制每个操作的反向传播规则，允许开发者以非显而易见的方式提高速度或稳定性，对于这种方式自动的过程可能不能复制。\n\n因此，反向传播不是计算梯度的唯一方式或最佳方式，但它是一个非常实用的方法，继续为深度学习社区服务。 \n在未来，深度网络的微分技术可能会提高，因为深度学习的从业者更加懂得了更广泛的自动微分领域的进步。\n  \n<!-- % -- 216 -- -->\n  \n\n## 高阶微分\n\n\n一些软件框架支持使用高阶导数。 \n在深度学习软件框架中，这至少包括Theano和TensorFlow。\n这些库使用一种数据结构来描述要被微分的原始函数，它们使用相同类型的数据结构来描述这个函数的导数表达式。\n这意味着符号微分机制可以应用于导数（从而产生高阶导数）。\n\n在深度学习的相关领域，很少会计算标量函数的单个二阶导数。\n相反，我们通常对Hessian矩阵的性质比较感兴趣。\n如果我们有函数$f:\\SetR^n \\to \\SetR$，那么Hessian矩阵的大小是$n\\times n$。\n在典型的深度学习应用中，$n$将是模型的参数数量，可能很容易达到数十亿。\n因此，完整的Hessian矩阵甚至不能表示。\n\n典型的深度学习方法是使用Krylov方法，而不是显式地计算Hessian矩阵。\nKrylov方法是用于执行各种操作的一组迭代技术，这些操作包括像近似求解矩阵的逆、或者近似矩阵的特征值或特征向量等，而不使用矩阵-向量乘法以外的任何操作。\n\n为了在Hesssian矩阵上使用Krylov方法，我们只需要能够计算Hessian矩阵$\\MH$和一个任意向量$\\Vv$间的乘积即可。\n实现这一目标的一种直观方法{cite?}是\n\\begin{equation}\n  \\MH \\Vv=\\nabla_{\\Vx} \\left [ (\\nabla_{\\Vx} f(x))^\\top \\Vv\\right ].\n\\end{equation}\n该表达式中两个梯度的计算都可以由适当的软件库自动完成。\n注意，外部梯度表达式是内部梯度表达式的函数的梯度。\n\n如果$\\Vv$本身是由计算图产生的一个向量，那么重要的是指定自动微分软件不要对产生$\\Vv$的图进行微分。\n\n虽然计算Hessian通常是不可取的，但是可以使用Hessian向量积。\n可以对所有的$i=1,\\ldots,n$简单地计算$\\MH \\Ve^{(i)}$，其中$\\Ve^{(i)}$是$e_i^{(i)}=1$并且其他元素都为0的one-hot向量。\n\n\n# 历史小记\n\n\n前馈网络可以被视为一种高效的非线性函数近似器，它以使用梯度下降来最小化函数近似误差为基础。\n从这个角度来看，现代前馈网络是一般函数近似任务的几个世纪进步的结晶。\n  \n<!-- % -- 217 -- -->\n  \n处于反向传播算法底层的链式法则是17世纪发明的{cite?}。\n微积分和代数长期以来被用于求解优化问题的封闭形式，但梯度下降直到19世纪才作为优化问题的一种迭代近似的求解方法被引入{cite?}。\n\n从20世纪40年代开始，这些函数近似技术被用于导出诸如感知机的机器学习模型。 \n然而，最早的模型都是基于线性模型。 \n来自包括Marvin Minsky的批评指出了线性模型族的几个缺陷，例如它无法学习XOR函数，这导致了对整个神经网络方法的抵制。\n\n学习非线性函数需要多层感知机的发展和计算该模型梯度的方法。\n基于动态规划的链式法则的高效应用开始出现在20世纪60年代和70年代，主要用于控制领域{cite?}，也用于灵敏度分析{cite?}。 \n{Werbos-1981}提出应用这些技术来训练人工神经网络。\n这个想法以不同的方式被独立地重新发现后{cite?}，最终在实践中得以发展。\n并行分布式处理一书在其中一章提供了第一次成功使用反向传播的一些实验的结果{cite?}，这对反向传播的普及做出了巨大的贡献，并且开启了一个研究多层神经网络非常活跃的时期。\n然而，该书作者提出的想法，特别是Rumelhart 和Hinton提出的想法远远超过了反向传播。\n它们包括一些关键思想，关于可能通过计算实现认知和学习的几个核心方面，后来被冠以\" 联结主义\"的名称，因为它强调了神经元之间的连接作为学习和记忆的轨迹的重要性。\n特别地，这些想法包括分布式表示的概念{cite?}。\n\n在反向传播的成功之后，神经网络研究获得了普及，并在20世纪90年代初达到高峰。 \n随后，其他机器学习技术变得更受欢迎，直到2006年开始的现代深度学习复兴。\n\n现代前馈网络的核心思想自20世纪80年代以来没有发生重大变化。\n仍然使用相同的反向传播算法和相同的梯度下降方法。\n1986年至2015年神经网络性能的大部分改进可归因于两个因素。\n首先，较大的数据集减少了统计泛化对神经网络的挑战的程度。\n第二，神经网络由于更强大的计算机和更好的软件基础设施已经变得更大。\n然而，少量算法上的变化也显著改善了神经网络的性能。\n  \n<!-- % -- 218 -- -->\n  \n其中一个算法上的变化是用交叉熵族损失函数替代均方误差损失函数。\n均方误差在20世纪80年代和90年代流行，但逐渐被交叉熵损失替代，并且最大似然原理的想法在统计学界和机器学习界之间广泛传播。\n使用交叉熵损失大大提高了具有~sigmoid~和softmax输出的模型的性能，而当使用均方误差损失时会存在饱和和学习缓慢的问题。\n\n另一个显著改善前馈网络性能的算法上的主要变化是使用分段线性隐藏单元来替代~sigmoid~隐藏单元，例如用整流线性单元。\n使用$\\max\\{0, z\\}$函数的整流在早期神经网络中已经被引入，并且至少可以追溯到认知机（Cognitron）和神经认知机(Neocognitron){cite?}。\n这些早期的模型没有使用整流线性单元，而是将整流用于非线性函数。\n尽管整流在早期很普及，在20世纪80年代，整流很大程度上被~sigmoid~所取代，也许是因为当神经网络非常小时，sigmoid~表现更好。\n到21世纪初，由于有些迷信的观念，认为必须避免具有不可导点的激活函数，所以避免了整流线性单元。\n这在2009年开始发生改变。\n{Jarrett-ICCV2009-small}观察到，在神经网络结构设计的几个不同因素中\"使用整流非线性是提高识别系统性能的最重要的唯一因素\"。\n\n对于小的数据集，{Jarrett-ICCV2009-small}观察到，使用整流非线性甚至比学习隐藏层的权重值更加重要。\n随机的权重足以通过整流网络传播有用的信息，允许在顶部的分类器层学习如何将不同的特征向量映射到类标识。\n\n当有更多数据可用时，学习开始提取足够的有用知识来超越随机选择参数的性能。\n{Glorot+al-AI-2011-small}说明，在深度整流网络中的学习比在激活函数具有曲率或两侧饱和的深度网络中的学习更容易。\n\n整流线性单元还具有历史意义，因为它们表明神经科学继续对深度学习算法的发展产生影响。\n{Glorot+al-AI-2011-small}从生物学考虑整流线性单元的导出。\n半整流非线性旨在描述生物神经元的这些性质：(1) 对于某些输入，生物神经元是完全不活跃的。\n(2) 对于某些输入，生物神经元的输出和它的输入成比例。\n(3) 大多数时间，生物神经元是在它们不活跃的状态下进行操作（即它们应该具有稀疏激活）。\n  \n<!-- % -- 219 -- -->\n  \n当2006年深度学习开始现代复兴时，前馈网络仍然有不良的声誉。\n从2006年至2012年，人们普遍认为，前馈网络不会表现良好，除非它们得到其他模型的辅助，例如概率模型。\n现在已经知道，只要具备适当的资源和工程实践，前馈网络表现得非常好。\n今天，前馈网络中基于梯度的学习被用作发展概率模型的工具，例如\\chap?中描述的变分自编码器和生成式对抗网络。\n前馈网络中基于梯度的学习自2012年以来一直被视为一种强大的技术，并应用于许多其他机器学习任务，而不是被视为必须由其他技术支持的不可靠技术。\n在2006 年，业内使用无监督学习来支持监督学习，现在更讽刺的是，更常见的是使用监督学习来支持无监督学习。\n\n前馈网络还有许多未实现的潜力。\n未来，我们期望它们用于更多的任务，优化算法和模型设计的进步将进一步提高它们的性能。\n本章主要描述了神经网络模型族。\n在接下来的章节中，我们将讨论如何使用这些模型——如何对它们进行正则化和训练。\n\n  \n<!-- % -- 220 -- -->\n  \n\n"
  },
  {
    "path": "docs/_posts/2016-12-07-Chapter7_regularization.md",
    "content": "---\ntitle: 深度学习中的正则化\nlayout: post\nshare: false\n---\n机器学习中的一个核心问题是设计不仅在训练数据上表现好，并且能在新输入上泛化好的算法。\n在机器学习中，许多策略显式地被设计来减少测试误差（可能会以增大训练误差为代价）。\n这些策略被统称为正则化。\n我们将在后文看到，深度学习工作者可以使用许多不同形式的正则化策略。\n事实上，开发更有效的正则化策略已成为本领域的主要研究工作之一。\n\n\\chap?介绍了泛化、欠拟合、过拟合、偏差、方差和正则化的基本概念。\n如果你不熟悉这些概念，请参考该章节再继续阅读本章。\n\n在本章中，我们会更详细地介绍正则化，重点介绍深度模型（或组成深度模型的模块）的正则化策略。\n\n本章中的某些章节涉及机器学习中的标准概念。\n如果你已经熟悉了这些概念，可以随意跳过相关章节。\n然而，本章的大多数内容是关于这些基本概念在特定神经网络中的扩展概念。\n\n在\\sec?中，我们将正则化定义为\"对学习算法的修改——旨在减少泛化误差而不是训练误差\"。\n目前有许多正则化策略。\n有些策略向机器学习模型添加限制参数值的额外约束。\n有些策略向目标函数增加额外项来对参数值进行软约束。\n如果我们细心选择，这些额外的约束和惩罚可以改善模型在测试集上的表现。\n有时侯，这些约束和惩罚被设计为编码特定类型的先验知识；\n其他时候，这些约束和惩罚被设计为偏好简单模型，以便提高泛化能力。\n有时，惩罚和约束对于确定欠定的问题是必要的。\n其他形式的正则化，如被称为集成的方法，则结合多个假说来解释训练数据。\n\n<!-- % -- 221 -- -->\n\n在深度学习的背景下，大多数正则化策略都会对估计进行正则化。\n估计的正则化以偏差的增加换取方差的减少。\n一个有效的正则化是有利的\"交易\"，也就是能显著减少方差而不过度增加偏差。\n我们在\\chap?中讨论泛化和过拟合时，主要侧重模型族训练的3个情形：（1）不包括真实的数据生成过程——对应欠拟合和含有偏差的情况，（2）匹配真实数据生成过程，（3）除了包括真实的数据生成过程，还包括许多其他可能的生成过程——方差（而不是偏差）主导的过拟合。\n正则化的目标是使模型从第三种情况转化为第二种情况。\n\n在实践中，过于复杂的模型族不一定包括目标函数或真实数据生成过程，甚至也不包括近似过程。\n我们几乎从未知晓真实数据的生成过程，所以我们永远不知道被估计的模型族是否包括生成过程。\n然而，深度学习算法的大多数应用都是针对这样的情况，其中真实数据的生成过程几乎肯定在模型族之外。\n深度学习算法通常应用于极为复杂的领域，如图像、音频序列和文本，本质上这些领域的真实生成过程涉及模拟整个宇宙。\n从某种程度上说，我们总是持方枘（数据生成过程）而欲内圆凿（我们的模型族）。\n\n这意味着控制模型的复杂度不是找到合适规模的模型（带有正确的参数个数）这样一个简单的事情。\n相反，我们可能会发现，或者说在实际的深度学习场景中我们几乎总是会发现，最好的拟合模型（从最小化泛化误差的意义上）是一个适当正则化的大型模型。\n\n现在我们回顾几种策略，以创建这些正则化的大型深度模型。\n\n<!-- % -- 222 -- -->\n\n\n# 参数范数惩罚\n\n正则化在深度学习的出现前就已经被使用了数十年。\n线性模型，如线性回归和逻辑回归可以使用简单、直接、有效的正则化策略。\n\n许多正则化方法通过对目标函数 $J$添加一个参数范数惩罚$\\Omega(\\Vtheta)$，限制模型（如神经网络、线性回归或逻辑回归）的学习能力。\n我们将正则化后的目标函数记为$\\tilde{J}$：\n\\begin{align}\n \\tilde{J}(\\Vtheta;\\MX, \\Vy) = J(\\Vtheta;\\MX, \\Vy) + \\alpha \\Omega(\\Vtheta),\n\\end{align}\n其中$\\alpha \\in [0, \\infty)$是权衡范数惩罚项$\\Omega$和标准目标函数 $J(\\MX;\\Vtheta)$相对贡献的超参数。\n将$\\alpha$设为0表示没有正则化。\n$\\alpha$越大，对应正则化惩罚越大。\n\n当我们的训练算法最小化正则化后的目标函数 $\\tilde{J}$时，它会降低原始目标$J$关于训练数据的误差并同时减小在某些衡量标准下参数$\\Vtheta$（或参数子集）的规模。\n选择不同的参数范数$\\Omega$会偏好不同的解。\n在本节中，我们会讨论各种范数惩罚对模型的影响。\n\n在探究不同范数的正则化表现之前，我们需要说明一下，在神经网络中，参数包括每一层仿射变换的权重和偏置，我们通常\\emph{只对权重}做惩罚而不对偏置做正则惩罚。\n精确拟合偏置所需的数据通常比拟合权重少得多。\n每个权重会指定两个变量如何相互作用。\n我们需要在各种条件下观察这两个变量才能良好地拟合权重。\n而每个偏置仅控制一个单变量。\n这意味着，我们不对其进行正则化也不会导致太大的方差。\n另外，正则化偏置参数可能会导致明显的欠拟合。\n因此，我们使用向量$\\Vw$表示所有应受范数惩罚影响的权重，而向量$\\Vtheta$表示所有参数(包括$\\Vw$和无需正则化的参数)。\n\n在神经网络的情况下，有时希望对网络的每一层使用单独的惩罚，并分配不同的$\\alpha$系数。\n寻找合适的多个超参数的代价很大，因此为了减少搜索空间，我们会在所有层使用相同的权重衰减。\n\n<!-- % -- 223 -- -->\n\n\n## $L^2$参数正则化\n\n在\\sec?中我们已经看到过最简单而又最常见的参数范数惩罚，即通常被称为权重衰减的$L^2$参数范数惩罚。\n这个正则化策略通过向目标函数添加一个正则项$\\Omega(\\Vtheta) = \\frac{1}{2} \\norm{\\Vw}_2^2$，使权重更加接近原点\\footnote{更一般地，我们可以将参数正则化为接近空间中的任意特定点，令人惊讶的是这样也仍有正则化效果，但是特定点越接近真实值结果越好。\n当我们不知道正确的值应该是正还是负时，零是有意义的默认值。\n由于模型参数正则化为零的情况更为常见，我们将只探讨这种特殊情况。}。\n在其他学术圈，$L^2$也被称为岭回归或~Tikhonov正则。\n\n我们可以通过研究正则化后目标函数的梯度，洞察一些权重衰减的正则化表现。\n为了简单起见，我们假定其中没有偏置参数，因此$\\Vtheta$就是$\\Vw$。\n这样一个模型具有以下总的目标函数：\n\\begin{align}\n  \\tilde{J}(\\Vw;\\MX, \\Vy) =\\frac{\\alpha}{2} \\Vw^\\top \\Vw +  J(\\Vw;\\MX, \\Vy),\n\\end{align}\n与之对应的梯度为\n\\begin{align}\n \\nabla_{\\Vw} \\tilde{J}(\\Vw;\\MX,\\Vy) =\\alpha \\Vw +  \\nabla_{\\Vw} J(\\Vw;\\MX, \\Vy).\n\\end{align}\n使用单步梯度下降更新权重，即执行以下更新：\n\\begin{align}\n \\Vw \\leftarrow \\Vw - \\epsilon(\\alpha \\Vw + \\nabla_{\\Vw} J(\\Vw;\\MX, \\Vy)).\n\\end{align}\n换种写法就是：\n\\begin{align}\n \\Vw \\leftarrow (1-\\epsilon \\alpha)\\Vw - \\epsilon \\nabla_{\\Vw} J(\\Vw;\\MX, \\Vy).\n\\end{align}\n我们可以看到，加入权重衰减后会引起学习规则的修改，即在每步执行通常的梯度更新之前先收缩权重向量（将权重向量乘以一个常数因子）。\n这是单个步骤发生的变化。\n但是，在训练的整个过程会发生什么呢？\n\n<!-- % -- 224 -- -->\n\n我们进一步简化分析，令$\\Vw^*$为未正则化的目标函数取得最小训练误差时的权重向量，即$\\Vw^* = \\argmin_{\\Vw} J(\\Vw)$， 并在$\\Vw^*$的邻域对目标函数做二次近似。  \n如果目标函数确实是二次的(如以均方误差拟合线性回归模型的情况)，则该近似是完美的。\n近似的$\\hat J(\\Vtheta)$如下\n\\begin{align}\n \\hat J(\\Vtheta) = J(\\Vw^*) + \\frac{1}{2}(\\Vw - \\Vw^*)^\\top \\MH (\\Vw - \\Vw^*),\n\\end{align}\n其中$\\MH$是$J$在$\\Vw^*$处计算的~Hessian~矩阵(关于$\\Vw$)。\n因为$\\Vw^*$被定义为最优，即梯度消失为$0$，所以该二次近似中没有一阶项。\n同样地，因为$\\Vw^*$是$J$的一个最优点，我们可以得出$\\MH$是半正定的结论。\n\n当$\\hat J$取得最小时，其梯度\n\\begin{align}\n  \\nabla_{\\Vw} \\hat{J}(\\Vw) = \\MH (\\Vw - \\Vw^*)\n\\end{align}\n为$0$。\n\n为了研究权重衰减带来的影响，我们在\\eqn?中添加权重衰减的梯度。 \n现在我们探讨最小化正则化后的$\\hat J$。\n我们使用变量$\\tilde{\\Vw}$表示此时的最优点:\n\\begin{align}\n \\alpha \\tilde{\\Vw} + \\MH (\\tilde{\\Vw} - \\Vw^*) = 0 \\\\\n (\\MH + \\alpha \\MI) \\tilde{\\Vw} = \\MH \\Vw^* \\\\\n \\end{align}\n\n当$\\alpha$趋向于$0$时，正则化的解$\\tilde{\\Vw}$会趋向$\\Vw^*$。 \n那么当$\\alpha$增加时会发生什么呢？\n因为$\\MH$是实对称的，所以我们可以将其分解为一个对角矩阵$\\VLambda$和一组特征向量的标准正交基$\\MQ$，并且有$\\MH = \\MQ \\VLambda \\MQ^\\top$。\n将其应用于\\eqn?，可得：\n\\begin{align}\n \\tilde \\Vw &= ( \\MQ \\VLambda \\MQ^\\top + \\alpha \\MI)^{-1} \\MQ \\VLambda \\MQ^\\top \\Vw^* \\\\\n                 &=  [ \\MQ( \\VLambda+ \\alpha \\MI)  \\MQ^\\top ]^{-1} \\MQ \\VLambda \\MQ^\\top \\Vw^* \\\\\n\\end{align}\n我们可以看到权重衰减的效果是沿着由$\\MH$的特征向量所定义的轴缩放$\\Vw^*$。\n具体来说，我们会根据$\\frac{\\lambda_i}{\\lambda_i + \\alpha}$因子缩放与$\\MH$第$i$个特征向量对齐的$\\Vw^*$的分量。\n（不妨查看\\fig?回顾这种缩放的原理）。\n\n沿着$\\MH$特征值较大的方向(如$\\lambda_i \\gg \\alpha$)正则化的影响较小。\n而$\\lambda_i \\ll \\alpha$的分量将会收缩到几乎为零。\n这种效应如\\fig?所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/reg_l2}}\n\\fi\n\\caption{$L^2$（或权重衰减）正则化对最佳$\\Vw$值的影响。\n实线椭圆表示没有正则化目标的等值线。\n虚线圆圈表示$L^2$正则化项的等值线。\n在$\\tilde{\\Vw}$点，这两个竞争目标达到平衡。\n目标函数$J$的~Hessian~的第一维特征值很小。\n当从$\\Vw^*$水平移动时，目标函数不会增加得太多。\n因为目标函数对这个方向没有强烈的偏好，所以正则化项对该轴具有强烈的影响。\n正则化项将$w_1$拉向零。\n而目标函数对沿着第二维远离$\\Vw^*$的移动非常敏感。\n对应的特征值较大，表示高曲率。\n因此，权重衰减对$w_2$的位置影响相对较小。\n}\n\\end{figure}\n\n<!-- % -- 225 -- -->\n\n只有在显著减小目标函数方向上的参数会保留得相对完好。\n在无助于目标函数减小的方向（对应~Hessian~矩阵较小的特征值）上改变参数不会显著增加梯度。\n这种不重要方向对应的分量会在训练过程中因正则化而衰减掉。\n\n\n目前为止，我们讨论了权重衰减对优化一个抽象通用的二次代价函数的影响。\n这些影响具体是怎么和机器学习关联的呢？\n我们可以研究线性回归，它的真实代价函数是二次的，因此我们可以使用相同的方法分析。\n再次应用分析，我们会在这种情况下得到相同的结果，但这次我们使用训练数据的术语表述。\n线性回归的代价函数是平方误差之和：\n\\begin{align}\n (\\MX \\Vw - \\Vy)^\\top (\\MX \\Vw - \\Vy).\n\\end{align}\n我们添加$L^2$正则项后，目标函数变为\n\\begin{align}\n  (\\MX \\Vw - \\Vy)^\\top (\\MX \\Vw - \\Vy) + \\frac{1}{2}\\alpha \\Vw^\\top \\Vw.\n\\end{align}\n这将普通方程的解从\n\\begin{align}\n  \\Vw = (\\MX^\\top \\MX)^{-1} \\MX^\\top \\Vy\n\\end{align}\n变为\n\\begin{align}\n   \\Vw = (\\MX^\\top \\MX + \\alpha \\MI)^{-1} \\MX^\\top \\Vy .\n\\end{align}\n\\eqn?中的矩阵$\\MX^\\top\\MX$与协方差矩阵$\\frac{1}{m}\\MX^\\top\\MX$成正比。\n$L^2$正则项将这个矩阵替换为\\eqn?中的$ (\\MX^\\top \\MX + \\alpha \\MI)^{-1}$\n这个新矩阵与原来的是一样的，不同的仅仅是在对角加了$\\alpha$。\n这个矩阵的对角项对应每个输入特征的方差。\n我们可以看到，$L^2$正则化能让学习算法\"感知\"到具有较高方差的输入$\\Vx$，因此与输出目标的协方差较小（相对增加方差）的特征的权重将会收缩。\n\n\n## $L^1$参数正则化\n\n$L^2$权重衰减是权重衰减最常见的形式，我们还可以使用其他的方法限制模型参数的规模。\n一个选择是使用$L^1$正则化。\n\n形式地，对模型参数$\\Vw$的$L^1$正则化被定义为：\n\\begin{align}\n \\Omega(\\Vtheta) = \\norm{ \\Vw }_1 = \\sum_i | w_i |,\n \\end{align}\n即各个参数的绝对值之和\\footnote{如同$L^2$正则化，我们能将参数正则化到其他非零值$\\Vw^{(o)}$。在这种情况下，$L^1$正则化将会引入不同的项$\\Omega(\\Vtheta)=\n\\|\\Vw - \\Vw^{(o)} \\|_1 = \\sum_i | w_i - w_i^{(o)} |$。}。\n接着我们将讨论$L^1$正则化对简单线性回归模型的影响，与分析$L^2$正则化时一样不考虑偏置参数。  \n我们尤其感兴趣的是找出$L^1$和$L^2$正则化之间的差异。\n与$L^2$权重衰减类似，我们也可以通过缩放惩罚项$\\Omega$的正超参数$\\alpha$来控制$L^1$权重衰减的强度。 \n因此，正则化的目标函数 $\\tilde{J}(\\Vw;\\MX, \\Vy)$如下所示\n\\begin{align}\n\\tilde{J}(\\Vw;\\MX, \\Vy) = \\alpha \\| \\Vw \\|_1 +  J(\\Vw;\\MX, \\Vy) ,\n\\end{align}\n对应的梯度(实际上是次梯度)：\n\\begin{align}\n  \\nabla_{\\Vw} \\tilde{J}(\\Vw; \\MX, \\Vy) = \\alpha \\text{sign}(\\Vw) + \\nabla_{\\Vw} J(\\Vw; \\MX, \\Vy), % ?? may be wrong\n\\end{align}\n其中$\\text{sign}(\\Vw)$只是简单地取$\\Vw$各个元素的正负号。\n\n<!-- % -- 227 -- -->\n\n观察\\eqn?，我们立刻发现$L^1$的正则化效果与$L^2$大不一样。\n具体来说，我们可以看到正则化对梯度的影响不再是线性地缩放每个$w_i$；而是添加了一项与$\\text{sign}(w_i)$同号的常数。\n使用这种形式的梯度之后，我们不一定能得到$J(\\MX, \\Vy;\\Vw)$二次近似的直接算术解（$L^2$正则化时可以）。 \n \n简单线性模型具有二次代价函数，我们可以通过泰勒级数表示。\n或者我们可以设想，这是逼近更复杂模型的代价函数的截断泰勒级数。\n在这个设定下，梯度由下式给出\n\\begin{align}\n  \\nabla_{\\Vw} \\hat{J}(\\Vw) = \\MH (\\Vw - \\Vw^*),\n\\end{align}\n同样，$\\MH$是$J$在$\\Vw^*$处的Hessian矩阵(关于$\\Vw$)。\n\n由于$L^1$惩罚项在完全一般化的~Hessian~的情况下，无法得到直接清晰的代数表达式，因此我们将进一步简化假设~Hessian~是对角的，即$\\MH = \\text{diag}([H_{1,1},\\dots, H_{n,n}])$，其中每个$H_{i,i}>0$。\n如果线性回归问题中的数据已被预处理（如可以使用PCA），去除了输入特征之间的相关性，那么这一假设成立。\n\n我们可以将$L^1$正则化目标函数的二次近似分解成关于参数的求和：\n\\begin{align}\n \\hat J(\\Vw; \\MX, \\Vy) = J(\\Vw^*; \\MX, \\Vy) + \\sum_i \\Bigg [\\frac{1}{2} H_{i,i} (w_i - w_i^*)^2 \n + \\alpha |w_i| \\Bigg].  % I think this is correct\n\\end{align}\n如下列形式的解析解（对每一维$i$）可以最小化这个近似代价函数：\n\\begin{align}\nw_i = \\text{sign}(w_i^*) \\max\\Big\\{ |w_i^*| - \\frac{\\alpha}{H_{i,i}} , 0\\Big\\} .\n\\end{align}\n对每个$i$,考虑$w_i^* > 0$的情形，会有两种可能结果：\n\\begin{enumerate}\n+ $w_i^* \\leq \\frac{\\alpha}{H_{i,i}}$的情况。\n正则化后目标中的$w_i$最优值是$w_i = 0$。\n这是因为在方向$i$上$J(\\Vw; \\MX, \\Vy) $对$ \\hat J(\\Vw; \\MX, \\Vy)$的贡献被抵消，$L^1$正则化项将$w_i$推至$0$。\n+  $w_i^* > \\frac{\\alpha}{H_{i,i}}$的情况。在这种情况下，正则化不会将$w_i$的最优值推至0，而仅仅在那个方向上移动$\\frac{\\alpha}{H_{i,i}}$的距离。\n\\end{enumerate}\n$w_i^* < 0$的情况与之类似，但是$L^1$惩罚项使$w_i$更接近0(增加$ \\frac{\\alpha}{H_{i,i}}$)或者为0。\n\n相比$L^2$正则化，$L^1$正则化会产生更稀疏的解。\n此处稀疏性指的是最优值中的一些参数为$0$。\n和$L^2$正则化相比，$L^1$正则化的稀疏性具有本质的不同。\n\\eqn?给出了$L^2$正则化的解$\\tilde \\Vw$。 \n如果我们使用~Hessian~矩阵$\\MH$为对角正定矩阵的假设（与$L^1$正则化分析时一样），重新考虑这个等式，我们发现\n$\\tilde{w_i} = \\frac{H_{i,i}}{H_{i,i} + \\alpha} w_i^*$。\n如果$w_i^*$不是零，那么$\\tilde{w_i}$也会保持非零。 \n这表明$L^2$正则化不会使参数变得稀疏，而$L^1$正则化有可能通过足够大的$\\alpha$实现稀疏。\n \n由$L^1$正则化导出的稀疏性质已经被广泛地用于特征选择机制。\n特征选择从可用的特征子集选择出有意义的特征，化简机器学习问题。\n著名的LASSO~{cite?}（Least Absolute Shrinkage and\nSelection Operator）模型将$L^1$惩罚和线性模型结合，并使用最小二乘代价函数。 \n$L^1$惩罚使部分子集的权重为零，表明相应的特征可以被安全地忽略。\n \n在\\sec?，我们看到许多正则化策略可以被解释为~MAP~贝叶斯推断，\n特别是$L^2$正则化相当于权重是高斯先验的~MAP~贝叶斯推断。\n对于$L^1$正则化，用于正则化代价函数的惩罚项$\\alpha \\Omega(\\Vw) =  \\alpha \\sum_i |w_i |$与通过~MAP~贝叶斯推断最大化的对数先验项是等价的（$\\Vw \\in \\SetR^n$并且权重先验是各向同性的拉普拉斯分布（\\eqn?））：\n\\begin{align}\n\\log p(\\Vw) = \\sum_i \\log \\text{Laplace}(w_i;0,\\frac{1}{\\alpha}) = \n  -\\alpha \\norm{\\Vw}_1 + n \\log \\alpha - n \\log 2.\n\\end{align}\n因为是关于$\\Vw$最大化进行学习，我们可以忽略$\\log \\alpha - \\log 2$项，因为它们与$\\Vw$无关。\n \n % -- 229 --\n \n \\section{作为约束的范数惩罚}\n考虑经过参数范数正则化的代价函数：\n\\begin{align}\n \\tilde{J}(\\Vtheta;\\MX, \\Vy) = J(\\Vtheta;\\MX, \\Vy) + \\alpha \\Omega(\\Vtheta) .\n\\end{align}\n\n回顾\\sec?我们可以构造一个广义Lagrange函数来最小化带约束的函数，即在原始目标函数上添加一系列惩罚项。\n每个惩罚是一个被称为Karush–Kuhn–Tucker乘子的系数以及一个表示约束是否满足的函数之间的乘积。\n如果我们想约束$\\Omega(\\Vtheta)$小于某个常数$k$，我们可以构建广义Lagrange函数\n\\begin{align}\n \\CalL(\\Vtheta, \\alpha; \\MX, \\Vy) = J(\\Vtheta; \\MX, \\Vy) + \\alpha (\\Omega(\\Vtheta) - k).\n\\end{align}\n\n这个约束问题的解由下式给出\n\\begin{align}\n \\Vtheta^* = \\underset{\\Vtheta}{ \\argmin} \\underset{\\alpha, \\alpha \\geq 0}{\\max} \\CalL(\\Vtheta, \\alpha).\n\\end{align}\n\n如\\sec?中描述的，解决这个问题我们需要对$\\Vtheta$和$\\alpha$都做出调整。\n\\sec?给出了一个带$L^2$约束的线性回归实例。\n还有许多不同的优化方法，有些可能会使用梯度下降而其他可能会使用梯度为0的解析解，但在所有过程中$\\alpha$在$\\Omega(\\Vtheta) > k$时必须增加，在$\\Omega(\\Vtheta) < k$时必须减小。\n所有正值的$\\alpha$都鼓励$\\Omega(\\Vtheta)$收缩。\n最优值$\\alpha^*$也将鼓励$\\Omega(\\Vtheta)$收缩，但不会强到使得$\\Omega(\\Vtheta)$小于$k$。\n\n为了洞察约束的影响，我们可以固定$\\alpha^*$，把这个问题看成只跟$\\Vtheta$有关的函数：\n\\begin{align}\n \\Vtheta^* =  \\underset{\\Vtheta}{ \\argmin} ~\\CalL(\\Vtheta, \\alpha^*) = \n \\underset{\\Vtheta}{ \\argmin}~\n J(\\Vtheta; \\MX, \\Vy) + \\alpha^* \\Omega(\\Vtheta).\n\\end{align}\n这和最小化$\\tilde J$的正则化训练问题是完全一样的。\n因此，我们可以把参数范数惩罚看作对权重强加的约束。\n如果$\\Omega$是$L^2$范数，那么权重就是被约束在一个$L^2$球中。\n如果$\\Omega$是$L^1$范数，那么权重就是被约束在一个$L^1$范数限制的区域中。\n通常我们不知道权重衰减系数$\\alpha^*$约束的区域大小，因为$\\alpha^*$的值不直接告诉我们$k$的值。\n原则上我们可以解得$k$，但$k$和$\\alpha^*$之间的关系取决于$J$的形式。\n虽然我们不知道约束区域的确切大小，但我们可以通过增加或者减小$\\alpha$来大致扩大或收缩约束区域。\n较大的$\\alpha$，将得到一个较小的约束区域。\n较小的$\\alpha$，将得到一个较大的约束区域。\n\n<!-- % -- 230 -- -->\n\n有时候，我们希望使用显式的限制，而不是惩罚。\n如\\sec?所述，我们可以修改下降算法（如随机梯度下降算法），使其先计算$J(\\Vtheta)$的下降步，然后将$\\Vtheta$投影到满足$\\Omega(\\Vtheta) < k$的最近点。\n如果我们知道什么样的$k$是合适的，而不想花时间寻找对应于此$k$处的$\\alpha$值，这会非常有用。\n\n另一个使用显式约束和重投影而不是使用惩罚强加约束的原因是惩罚可能会导致目标函数非凸而使算法陷入局部极小(对应于小的$\\Vtheta$）。\n当训练神经网络时，这通常表现为训练带有几个\"死亡单元\"的神经网络。\n这些单元不会对网络学到的函数有太大影响，因为进入或离开它们的权重都非常小。\n当使用权重范数的惩罚训练时，即使可以通过增加权重以显著减少$J$，这些配置也可能是局部最优的。\n因为重投影实现的显式约束不鼓励权重接近原点，所以在这些情况下效果更好。\n通过重投影实现的显式约束只在权重变大并试图离开限制区域时产生作用。\n\n最后，因为重投影的显式约束还对优化过程增加了一定的稳定性，所以这是另一个好处。\n当使用较高的学习率时，很可能进入正反馈，即大的权重诱导大梯度，然后使得权重获得较大更新。\n如果这些更新持续增加权重的大小，$\\Vtheta$就会迅速增大，直到离原点很远而发生溢出。\n重投影的显式约束可以防止这种反馈环引起权重无限制地持续增加。\n{Hinton-et-al-arxiv2012}建议结合使用约束和高学习速率，这样能更快地探索参数空间，并保持一定的稳定性。\n\n<!-- % -- 231 -- -->\n\n{Hinton-et-al-arxiv2012}尤其推荐由{Srebro05}引入的策略：约束神经网络层的权重矩阵每列的范数，而不是限制整个权重矩阵的~Frobenius~范数。\n分别限制每一列的范数可以防止某一隐藏单元有非常大的权重。\n如果我们将此约束转换成~Lagrange~函数中的一个惩罚，这将与$L^2$ 权重衰减类似但每个隐藏单元的权重都具有单独的~KKT~乘子。\n每个~KKT~乘子分别会被动态更新，以使每个隐藏单元服从约束。\n在实践中，列范数的限制总是通过重投影的显式约束来实现。\n\n\n# 正则化和欠约束问题\n\n在某些情况下，为了正确定义机器学习问题，正则化是必要的。\n机器学习中许多线性模型，包括线性回归和PCA，都依赖于对矩阵$\\MX^\\top\\MX$求逆。\n只要$\\MX^\\top\\MX$是奇异的，这些方法就会失效。\n当数据生成分布在一些方向上确实没有差异时，或因为例子较少（即相对输入特征的维数来说）而在一些方向上没有观察到方差时，这个矩阵就是奇异的。\n在这种情况下，正则化的许多形式对应求逆$\\MX^\\top\\MX + \\alpha \\MI$。\n这个正则化矩阵可以保证是可逆的。\n\n相关矩阵可逆时，这些线性问题有闭式解。\n没有闭式解的问题也可能是欠定的。\n一个例子是应用于线性可分问题的逻辑回归。\n如果权重向量$\\Vw$能够实现完美分类，那么$2 \\Vw$也会以更高似然实现完美分类。\n类似随机梯度下降的迭代优化算法将持续增加$\\Vw$的大小，理论上永远不会停止。\n在实践中，数值实现的梯度下降最终会达到导致数值溢出的超大权重，此时的行为将取决于程序员如何处理这些不是真正数字的值。\n\n大多数形式的正则化能够保证应用于欠定问题的迭代方法收敛。\n例如，当似然的斜率等于权重衰减的系数时， 权重衰减将阻止梯度下降继续增加权重的大小。\n\n使用正则化解决欠定问题的想法不局限于机器学习。\n同样的想法在几个基本线性代数问题中也非常有用。\n\n<!-- % -- 232 -- -->\n\n正如我们在\\sec?看到的，我们可以使用~Moore-Penrose~求解欠定线性方程。 \n回想$\\MX$伪逆$\\MX^+$的一个定义：\n\\begin{align} \n \\MX^+ = \\lim_{\\alpha \\searrow 0} (\\MX^\\top \\MX + \\alpha \\MI)^{-1}\\MX^\\top.\n\\end{align}\n现在我们可以将\\sec?看作进行具有权重衰减的线性回归。\n具体来说，当正则化系数趋向0时，\\eqn?是\\eqn?的极限。\n因此，我们可以将伪逆解释为使用正则化来稳定欠定问题。\n\n\n\n# 数据集增强\n\n让机器学习模型泛化得更好的最好办法是使用更多的数据进行训练。\n当然，在实践中，我们拥有的数据量是很有限的。\n解决这个问题的一种方法是创建假数据并添加到训练集中。\n对于一些机器学习任务，创建新的假数据相当简单。\n\n对分类来说这种方法是最简单的。\n分类器需要一个复杂的高维输入$\\Vx$，并用单个类别标识$y$概括$\\Vx$。\n这意味着分类面临的一个主要任务是要对各种各样的变换保持不变。\n我们可以轻易通过转换训练集中的$\\Vx$来生成新的$(\\Vx, y)$对。\n\n这种方法对于其他许多任务来说并不那么容易。\n例如，除非我们已经解决了密度估计问题，否则在密度估计任务中生成新的假数据是很困难的。\n\n数据集增强对一个具体的分类问题来说是特别有效的方法：对象识别。\n图像是高维的并包括各种巨大的变化因素，其中有许多可以轻易地模拟。\n即使模型已使用卷积和池化技术（\\chap?）对部分平移保持不变，沿训练图像每个方向平移几个像素的操作通常可以大大改善泛化。\n许多其他操作如旋转图像或缩放图像也已被证明非常有效。\n\n我们必须要小心，不能使用会改变类别的转换。\n例如，光学字符识别任务需要认识到\"b\"和\"d\"以及\"6\"和\"9\"的区别，所以对这些任务来说，水平翻转和旋转$180^{\\circ}$并不是合适的数据集增强方式。\n\n<!-- % -- 233 -- -->\n\n能保持我们希望的分类不变，但不容易执行的转换也是存在的。\n例如，平面外绕轴转动难以通过简单的几何运算在输入像素上实现。\n\n数据集增强对语音识别任务也是有效的{cite?}。\n\n在神经网络的输入层注入噪声{cite?}也可以被看作是数据增强的一种方式。\n对于许多分类甚至一些回归任务而言，即使小的随机噪声被加到输入，任务仍应该是能够被解决的。\n然而 ，神经网络被证明对噪声不是非常健壮{cite?}。\n改善神经网络健壮性的方法之一是简单地将随机噪声添加到输入再进行训练。\n输入噪声注入是一些无监督学习算法的一部分，如去噪自编码器{cite?}。\n向隐藏单元施加噪声也是可行的，这可以被看作在多个抽象层上进行的数据集增强。\n{Poole14}最近表明，噪声的幅度被细心调整后，该方法是非常高效的。\n我们将在\\sec?介绍一个强大的正则化策略~Dropout，该策略可以被看作是通过与噪声\\emph{相乘}构建新输入的过程。\n\n在比较机器学习基准测试的结果时，考虑其采取的数据集增强是很重要的。\n通常情况下，人工设计的数据集增强方案可以大大减少机器学习技术的泛化误差。\n将一个机器学习算法的性能与另一个进行对比时，对照实验是必要的。\n在比较机器学习算法A和机器学习算法B时，应该确保这两个算法使用同一人工设计的数据集增强方案。\n假设算法$A$在没有数据集增强时表现不佳，而$B$结合大量人工转换的数据后表现良好。\n在这样的情况下，很可能是合成转化引起了性能改进，而不是机器学习算法$B$比算法$A$更好。 \n有时候，确定实验是否已经适当控制需要主观判断。\n例如，向输入注入噪声的机器学习算法是执行数据集增强的一种形式。\n通常，普适操作（例如，向输入添加高斯噪声）被认为是机器学习算法的一部分，\n而特定于一个应用领域（如随机地裁剪图像）的操作被认为是独立的预处理步骤。\n\n<!-- % -- 234 -- -->\n\n\n# 噪声鲁棒性\n\n\n\\sec?已经提出将噪声作用于输入，作为数据集增强策略。\n对于某些模型而言，向输入添加方差极小的噪声等价于对权重施加范数惩罚{cite?}。\n在一般情况下，注入噪声远比简单地收缩参数强大，特别是噪声被添加到隐藏单元时会更加强大。\n向隐藏单元添加噪声是值得单独讨论重要的话题；在\\sec?所述~Dropout~算法是这种做法的主要发展方向。\n\n另一种正则化模型的噪声使用方式是将其加到权重。\n这项技术主要用于循环神经网络~{cite?}。\n这可以被解释为关于权重的贝叶斯推断的随机实现。\n贝叶斯学习过程将权重视为不确定的，并且可以通过概率分布表示这种不确定性。\n向权重添加噪声是反映这种不确定性的一种实用的随机方法。\n\n在某些假设下，施加于权重的噪声可以被解释为与更传统的正则化形式等同，鼓励要学习的函数保持稳定。\n我们研究回归的情形，也就是训练将一组特征$\\Vx$映射成一个标量的函数$\\hat y(\\Vx)$，并使用最小二乘代价函数衡量模型预测值$\\hat y(\\Vx)$与真实值$y$的误差：\n\\begin{align}\n J = \\SetE_{p(x,y)}[(\\hat y(\\Vx) - y)^2].\n\\end{align}\n训练集包含$m$对标注样例$\\{(\\Vx^{(1)}, y^{(1)}),\\dots,(\\Vx^{(m)}, y^{(m)})\\}$。\n\n现在我们假设对每个输入表示，网络权重添加随机扰动$\\epsilon_{\\Vw} \\sim \\CalN(\\Vepsilon;0, \\eta\\MI \\, )$。\n想象我们有一个标准的$l$层MLP。\n我们将扰动模型记为$\\hat y_{\\epsilon_{\\MW}} (\\Vx)$。\n尽管有噪声注入，我们仍然希望减少网络输出误差的平方。\n因此目标函数变为：\n\\begin{align}\n \\tilde J_{\\MW} &= \\SetE_{p(\\Vx,y,\\epsilon_{\\MW})}[(\\hat y_{\\epsilon_{\\MW}}(\\Vx) - y)^2] \\\\\n   &=  \\SetE_{p(\\Vx,y,\\epsilon_{\\MW})}[\\hat y_{\\epsilon_{\\MW}}^2(\\Vx) -  2y\\hat y_{\\epsilon_{\\MW}}\n   (\\Vx)+ y^2] .\n\\end{align}\n\n对于小的$\\eta$，最小化带权重噪声（方差为$\\eta \\MI$\\,）的$J$等同于最小化附加正则化项：\n$ \\eta \\SetE_{p(\\Vx,y)}[\\norm{\\nabla_{\\MW}~\\hat y(\\Vx)}^2]$的$J$。\n这种形式的正则化鼓励参数进入权重小扰动对输出相对影响较小的参数空间区域。\n换句话说，它推动模型进入对权重小的变化相对不敏感的区域，找到的点不只是极小点，还是由平坦区域所包围的极小点{cite?}。\n在简化的线性回归中（例如，$\\hat y(\\Vx) = \\Vw^\\top \\Vx + b$），正则项退化为$ \\eta \\SetE_{p(\\Vx)}[\\norm{\\Vx}^2]$，这与函数的参数无关，因此不会对$\\tilde J_{\\Vw}$关于模型参数的梯度有影响。\n\n<!-- % -- 235 -- -->\n\n\n## 向输出目标注入噪声\n\n大多数数据集的$y$标签都有一定错误。\n错误的$y$不利于最大化$\\log p(y \\mid \\Vx)$。\n避免这种情况的一种方法是显式地对标签上的噪声进行建模。\n例如，我们可以假设，对于一些小常数$\\epsilon$，训练集标记$y$是正确的概率是$1-\\epsilon$，（以$\\epsilon$的概率）任何其他可能的标签也可能是正确的。\n这个假设很容易就能解析地与代价函数结合，而不用显式地抽取噪声样本。\n例如，\\textbf{标签平滑}（label smoothing）通过把确切分类目标从0和1替换成$\\frac{\\epsilon}{k-1}$和$1-\\epsilon$，正则化具有$k$个输出的~softmax函数~的模型。\n标准交叉熵损失可以用在这些非确切目标的输出上。\n使用~softmax函数~和明确目标的最大似然学习可能永远不会收敛——\nsoftmax函数~永远无法真正预测0概率或1概率，因此它会继续学习越来越大的权重，使预测更极端。\n使用如权重衰减等其他正则化策略能够防止这种情况。\n标签平滑的优势是能够防止模型追求确切概率而不影响模型学习正确分类。\n这种策略自20世纪80年代就已经被使用，并在现代神经网络继续保持显著特色{cite?}。\n\n<!-- % -- 236 -- -->\n\n\n# 半监督学习\n\n在半监督学习的框架下，$P(\\RVx)$产生的未标记样本和$P(\\RVx, \\RVy)$中的标记样本都用于估计$P(\\RVy \\mid \\RVx)$或者根据$\\RVx$预测$\\RVy$。\n\n在深度学习的背景下，半监督学习通常指的是学习一个表示 $\\Vh = f(\\Vx)$。 \n学习表示的目的是使相同类中的样本有类似的表示。\n无监督学习可以为如何在表示空间聚集样本提供有用线索。\n在输入空间紧密聚集的样本应该被映射到类似的表示。\n在许多情况下，新空间上的线性分类器可以达到较好的泛化{cite?}。\n这种方法的一个经典变种是使用主成分分析作为分类前（在投影后的数据上分类）的预处理步骤。\n\n我们可以构建这样一个模型，其中生成模型$P(\\RVx)$或$P(\\RVx, \\RVy)$与判别模型$P(\\RVy \\mid \\RVx)$共享参数，而不用分离无监督和监督部分。\n我们权衡监督模型准则 $-\\log P(\\RVy \\mid \\RVx)$和无监督或生成模型准则（如$-\\log P(\\RVx)$或$-\\log P(\\RVx, \\RVy)$）。\n生成模型准则表达了对监督学习问题解的特殊形式的先验知识{cite?}，即$P(\\RVx)$的结构通过某种共享参数的方式连接到$P(\\RVy \\mid \\RVx)$。\n通过控制在总准则中的生成准则，我们可以获得比纯生成或纯判别训练准则更好的权衡{cite?}。\n\n{Russ+Geoff-nips-2007}描述了一种学习回归核机器中核函数的方法，其中建模$P(\\RVx)$时使用的未标记样本大大提高了$P(\\RVy \\mid \\RVx)$的效果。\n\n更多半监督学习的信息，请参阅~{Chapelle-2006}。\n\n\n# 多任务学习\n\n多任务学习~{cite?}是通过合并几个任务中的样例（可以视为对参数施加的软约束）来提高泛化的一种方式。\n正如额外的训练样本能够将模型参数推向具有更好泛化能力的值一样，当模型的一部分被多个额外的任务共享时，这部分将被约束为良好的值（如果共享合理），通常会带来更好的泛化能力。\n\n\\fig?展示了多任务学习中非常普遍的一种形式，其中不同的监督任务（给定$\\RVx$预测$\\RVy^{(i)}$）共享相同的输入$\\RVx$以及一些中间层表示$\\Vh^{(\\text{share})}$，能学习共同的因素池。\n该模型通常可以分为两类相关的参数：\n\\begin{enumerate}\n+ 具体任务的参数 （只能从各自任务的样本中实现良好的泛化）。如\\fig?中的上层。\n+ 所有任务共享的通用参数（从所有任务的汇集数据中获益）。如\\fig?中的下层。\n\\end{enumerate}\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/multi_factor_output}}\n\\fi\n\\caption{多任务学习在深度学习框架中可以以多种方式进行，该图说明了任务共享相同输入但涉及不同目标随机变量的常见情况。\n深度网络的较低层（无论是监督前馈的，还是包括向下箭头的生成组件）可以跨这样的任务共享，而任务特定的参数（分别与从$\\Vh^{(1)}$和$\\Vh^{(2)}$进入和发出的权重）可以在共享表示$\\Vh^{(\\text{shared})}$之上学习。\n这里的基本假设是存在解释输入$\\RVx$变化的共同因素池，而每个任务与这些因素的子集相关联。\n在该示例中，额外假设顶层隐藏单元 $\\Vh^{(1)}$和$\\Vh^{(2)}$专用于每个任务（分别预测$\\RVy^{(1)}$和$\\RVy^{(2)}$），而一些中间层表示$\\Vh^{(\\text{shared})}$在所有任务之间共享。\n在无监督学习情况下，一些顶层因素不与输出任务$(\\Vh^{(3)})$的任意一个关联是有意义的：这些因素可以解释一些输入变化但与预测$\\RVy^{(1)}$或$\\RVy^{(2)}$不相关。\n}\n\\end{figure}\n\n因为共享参数，其统计强度可大大提高（共享参数的样本数量相对于单任务模式增加的比例），并能改善泛化和泛化误差的范围{cite?}。\n当然，仅当不同的任务之间存在某些统计关系的假设是合理（意味着某些参数能通过不同任务共享）时才会发生这种情况。\n\n从深度学习的观点看，底层的先验知识如下：\\emph{能解释数据变化（在与之相关联的不同任务中观察到）的因素中，某些因素是跨两个或更多任务共享的。}\n\n<!-- % -- 238 -- -->\n\n\n# 提前终止\n\n当训练有足够的表示能力甚至会过拟合的大模型时，我们经常观察到，训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。\n\\fig?是这些现象的一个例子，这种现象几乎一定会出现。\n\n\n这意味着我们只要返回使验证集误差最低的参数设置，就可以获得验证集误差更低的模型（并且因此有希望获得更好的测试误差）。\n在每次验证集误差有所改善后，我们存储模型参数的副本。\n当训练算法终止时，我们返回这些参数而不是最新的参数。\n当验证集上的误差在事先指定的循环次数内没有进一步改善时，算法就会终止。\n此过程在\\alg?中有更正式的说明。\n\n\n<!-- % -- 239 -- -->\n\n这种策略被称为提前终止。\n这可能是深度学习中最常用的正则化形式。\n它的流行主要是因为有效性和简单性。\n\n\\begin{algorithm}[ht]\n\\caption{用于确定最佳训练时间量的提前终止元算法。\n这种元算法是一种通用策略，可以很好地在各种训练算法和各种量化验证集误差的方法上工作。\n}\n\\begin{algorithmic}\n\\STATE 令 $n$ 为评估间隔的步数。\n\\STATE 令 $p$ 为 \"耐心(patience)\"，即观察到较坏的验证集表现$p$次后终止。 \n\\STATE 令 $\\Vtheta_{o}$ 为初始参数。\n\\STATE $\\Vtheta \\leftarrow \\Vtheta_{o}$\n\\STATE $i \\leftarrow 0$\n\\STATE $j \\leftarrow 0$\n\\STATE $v \\leftarrow \\infty$\n\\STATE $\\Vtheta^* \\leftarrow \\Vtheta$\n\\STATE $i^* \\leftarrow i$\n\\WHILE{$j < p$}\n    \\STATE 运行训练算法$n$步，更新 $\\Vtheta$ 。\n    \\STATE $i \\leftarrow i + n$\n    \\STATE $v' \\leftarrow \\text{ValidationSetError}(\\Vtheta)$\n    \\IF{$v' < v$}\n        \\STATE $j \\leftarrow 0$\n        \\STATE $\\Vtheta^* \\leftarrow \\Vtheta$\n        \\STATE $i^* \\leftarrow i$\n        \\STATE $v \\leftarrow v'$\n    \\ELSE\n        \\STATE $j \\leftarrow j + 1$\n    \\ENDIF\n\\ENDWHILE\n<!-- % pdflatex told me \\RETURN was not recognized, wtf -->\n\\STATE 最佳参数为 $\\Vtheta^*$，最佳训练步数为$i^*$\n\\end{algorithmic}\n\\end{algorithm}\n\n\n我们可以认为提前终止是非常高效的超参数选择算法。\n按照这种观点，训练步数仅是另一个超参数。\n我们从\\fig?可以看到，这个超参数在验证集上具有U型性能曲线。\n很多控制模型容量的超参数在验证集上都是这样的U型性能曲线，如\\fig?。\n在提前终止的情况下，我们通过控制拟合训练集的步数来控制模型的有效容量。\n大多数超参数的选择必须使用高代价的猜测和检查过程，我们需要在训练开始时猜测一个超参数，然后运行几个步骤检查它的训练效果。\n\"训练时间\"是唯一只要跑一次训练就能尝试很多值的超参数。\n通过提前终止自动选择超参数的唯一显著的代价是训练期间要定期评估验证集。\n在理想情况下，这可以并行在与主训练过程分离的机器上，或独立的CPU，或独立的GPU上完成。\n如果没有这些额外的资源，可以使用比训练集小的验证集或较不频繁地评估验证集来减小评估代价，较粗略地估算取得最佳的训练时间。\n\n另一个提前终止的额外代价是需要保持最佳的参数副本。\n这种代价一般是可忽略的，因为可以将它储存在较慢较大的存储器上（例如，在GPU内存中训练，但将最佳参数存储在主存储器或磁盘驱动器上）。\n由于最佳参数的写入很少发生而且从不在训练过程中读取，这些偶发的慢写入对总训练时间的影响不大。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/learning_curve_color}}\n\\fi\n\\caption{学习曲线显示负对数似然损失如何随时间变化（表示为遍历数据集的训练迭代数，或轮数）。\n在这个例子中，我们在MNIST上训练了一个~maxout~网络。\n我们可以观察到训练目标随时间持续减小，但验证集上的平均损失最终会再次增加，形成不对称的U形曲线。\n}\n\\end{figure}\n\n<!-- % -- 240 -- -->\n\n提前终止是一种非常不显眼的正则化形式，它几乎不需要改变基本训练过程、目标函数或一组允许的参数值。\n这意味着，无需破坏学习动态就能很容易地使用提前终止。\n相对于权重衰减，必须小心不能使用太多的权重衰减，以防网络陷入不良局部极小点(对应于病态的小权重)。\n\n提前终止可单独使用或与其他的正则化策略结合使用。\n即使为鼓励更好泛化，使用正则化策略改进目标函数，在训练目标的局部极小点达到最好泛化也是非常罕见的。\n\n提前终止需要验证集，这意味着某些训练数据不能被馈送到模型。\n为了更好地利用这一额外的数据，我们可以在完成提前终止的首次训练之后，进行额外的训练。\n在第二轮，即额外的训练步骤中，所有的训练数据都被包括在内。\n有两个基本的策略都可以用于第二轮训练过程。\n\n<!-- % -- 241 -- -->\n\n一个策略（\\alg?）是再次初始化模型，然后使用所有数据再次训练。\n在这个第二轮训练过程中，我们使用第一轮提前终止训练确定的最佳步数。\n此过程有一些细微之处。\n例如，我们没有办法知道重新训练时，对参数进行相同次数的更新和对数据集进行相同次数的遍历哪一个更好。\n由于训练集变大了，在第二轮训练时，每一次遍历数据集将会更多次地更新参数。\n\n另一个策略是保持从第一轮训练获得的参数，然后使用全部的数据\\emph{继续}训练。\n在这个阶段，已经没有验证集指导我们需要在训练多少步后终止。\n取而代之，我们可以监控验证集的平均损失函数，并继续训练，直到它低于提前终止过程终止时的目标值。\n此策略避免了重新训练模型的高成本，但表现并没有那么好。\n例如，验证集的目标不一定能达到之前的目标值，所以这种策略甚至不能保证终止。\n我们会在\\alg?中更正式地介绍这个过程。\n\n提前终止对减少训练过程的计算成本也是有用的。\n除了由于限制训练的迭代次数而明显减少的计算成本，还带来了正则化的益处（不需要添加惩罚项的代价函数或计算这种附加项的梯度）。\n\n\\begin{algorithm}[ht]\n\\caption{使用提前终止确定训练步数，然后在所有数据上训练的元算法。\n}\n\\begin{algorithmic}\n\\STATE 令 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 为训练集。\n\\STATE 将 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 分别分割为 $(\\MX^{(\\text{subtrain})}$, $\\MX^{(\\text{valid})})$ 和 $(\\Vy^{(\\text{subtrain})}$, $\\Vy^{(\\text{valid})})$。\n\\STATE 从随机 $\\Vtheta$开始，使用$\\MX^{(\\text{subtrain})}$ 和 $\\Vy^{(\\text{subtrain})}$作为训练集，$\\MX^{(\\text{valid})}$ 和 $\\Vy^{(\\text{valid})}$ 作为验证集，运行 (\\alg?)。这将返回最佳训练步数$i^*$。\n\\STATE 将 $\\Vtheta$ 再次设为随机值。\n\\STATE 在 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 上训练 $i^*$ 步。  \n\\end{algorithmic}\n\\end{algorithm}\n\n\\begin{algorithm}[ht]\n\\caption{\n使用提前终止确定将会过拟合的目标值，然后在所有数据上训练直到再次\n达到该值的元算法。\n}\n\\begin{algorithmic}\n\\STATE 令 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 为训练集。\n\\STATE 将 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 分别分割为 $(\\MX^{(\\text{subtrain})}$, $\\MX^{(\\text{valid})})$ 和 $(\\Vy^{(\\text{subtrain})}$, $\\Vy^{(\\text{valid})})$。\n\\STATE 从随机 $\\Vtheta$开始，使用$\\MX^{(\\text{subtrain})}$ 和 $\\Vy^{(\\text{subtrain})}$作为训练集，$\\MX^{(\\text{valid})}$ 和 $\\Vy^{(\\text{valid})}$ 作为验证集，运行 (\\alg?)。这会更新$\\Vtheta$。\n\\STATE $\\epsilon \\leftarrow J(\\Vtheta, \\MX^{(\\text{subtrain})},\\Vy^{(\\text{subtrain})})$\n\\WHILE{$J(\\Vtheta, \\MX^{(\\text{valid})}, \\Vy^{(\\text{valid})}) > \\epsilon$}\n\\STATE 在 $\\MX^{(\\text{train})}$ 和 $\\Vy^{(\\text{train})}$ 上训练 $n$ 步。  \n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n<!-- % -- 242 -- -->\n\n\\paragraph{提前终止为何具有正则化效果:}\n目前为止，我们已经声明提前终止是一种正则化策略，但我们只通过展示验证集误差的学习曲线是一个U型曲线来支持这种说法。\n提前终止正则化模型的真正机制是什么呢？ \n{Bishop1995}和~{Sjoberg95}认为提前终止可以将优化过程的参数空间限制在初始参数值$\\Vtheta_0$的小邻域内。\n更具体地，想象用学习率$\\epsilon$进行$\\tau$个优化步骤（对应于$\\tau$个训练迭代）。\n我们可以将$\\epsilon \\tau$作为有效容量的度量。\n假设梯度有界，限制迭代的次数和学习速率能够限制从$\\Vtheta_0$到达的参数空间的大小，如\\fig?所示。\n在这个意义上，$\\epsilon \\tau$的效果就好像是权重衰减系数的倒数。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter7/figures/reg_early_stop_vs_l2}}\n\\fi\n\\caption{提前终止效果的示意图。\n\\emph{(左)}实线轮廓线表示负对数似然的轮廓。\n虚线表示从原点开始的~SGD~所经过的轨迹。 % ??\n提前终止的轨迹在较早的点$\\tilde \\Vw$处停止，而不是停止在最小化代价的点$\\Vw^*$处。\n\\emph{(右)}为了对比，使用$L^2$正则化效果的示意图。\n虚线圆圈表示$L^2$惩罚的轮廓，$L^2$惩罚使得总代价的最小值比非正则化代价的最小值更靠近原点。\n}\n\\end{figure}\n\n事实上，在二次误差的简单线性模型和简单的梯度下降情况下，我们可以展示提前终止相当于$L^2$正则化。\n\n为了与经典$L^2$正则化比较，我们只考察唯一的参数是线性权重（$\\Vtheta = \\Vw$）的简单情形。\n我们在权重$\\Vw$的经验最佳值$\\Vw^*$附近以二次近似建模代价函数 $J$：\n\\begin{align}\n \\hat J(\\Vtheta) = J(\\Vw^*) + \\frac{1}{2}  (\\Vw- \\Vw^*)^\\top \\MH  (\\Vw - \\Vw^*),\n\\end{align}\n其中$\\MH$是$J$关于$\\Vw$在$\\Vw^*$点的Hessian。\n鉴于假设$\\Vw^*$是$J(\\Vw)$的最小点，我们知道$\\MH$为半正定。\n在局部泰勒级数逼近下，梯度由下式给出：\n\\begin{align}\n \\nabla_{\\Vw} \\hat J (\\Vw) = \\MH (\\Vw - \\Vw^*).\n\\end{align}\n\n<!-- % -- 243 -- -->\n\n接下来我们研究训练时参数向量的轨迹。\n为简化起见，我们将参数向量初始化为原点\\footnote{对于神经网络，我们需要打破隐藏单元间的对称平衡因此不能将所有参数都初始化为$\\mathbf{0}$（如\\sec?所讨论的）。\n然而，对于其他任何初始值$\\Vw_{(0)}$该论证都成立}，也就是$\\Vw^{(0)} = 0$。\n我们通过分析$\\hat{J}$上的梯度下降来研究$J$上近似的梯度下降的效果：\n\\begin{align}\n\\Vw^{(\\tau)} &= \\Vw^{(\\tau-1)} -\\epsilon \\nabla_{\\Vw} \\hat{J}( \\Vw^{(\\tau-1)} ) \\\\\n&=  \\Vw^{(\\tau-1)}  - \\epsilon  \\MH ( \\Vw^{(\\tau-1)} -  \\Vw^* ), \\\\\n\\Vw^{(\\tau)}  -  \\Vw^* &= (\\MI - \\epsilon  \\MH) ( \\Vw^{(\\tau-1)} -  \\Vw^* ).\n \\end{align}\n现在让我们在$\\MH$特征向量的空间中改写表达式，利用$\\MH$的特征分解：$\\MH = \\MQ \\VLambda \\MQ^\\top$，其中$\\VLambda$是对角矩阵，$\\MQ$是特征向量的一组标准正交基。\n\\begin{align}\n\\Vw^{(\\tau)}  -  \\Vw^* &= (\\MI - \\epsilon \\MQ \\VLambda \\MQ^\\top) ( \\Vw^{(\\tau-1)} -  \\Vw^* ) \\\\\n\\MQ^\\top (\\Vw^{(\\tau)}  -  \\Vw^*) &= (\\MI - \\epsilon \\VLambda)\\MQ^\\top ( \\Vw^{(\\tau-1)} -  \\Vw^* )\n\\end{align}\n假定$\\Vw^{(0)} = 0$并且$\\epsilon$选择得足够小以保证$|1 - \\epsilon \\lambda_i |<1$，经过$\\tau$次参数更新后轨迹如下：\n\\MQ^\\top  \\Vw^{(\\tau)} = [\\MI - (\\MI - \\epsilon \\VLambda)^\\tau] \\MQ^\\top  \\Vw^* .\n\\end{align}\n现在，\\eqn?中$\\MQ^\\top \\tilde \\Vw$的表达式能被重写为：\n\\begin{align}\n\\MQ^\\top  \\tilde \\Vw &= (\\VLambda + \\alpha \\MI)^{-1} \\VLambda \\MQ^\\top  \\Vw^*, \\\\\n\\MQ^\\top  \\tilde \\Vw &= [\\MI - (\\VLambda + \\alpha \\MI)^{-1} \\alpha] \\MQ^\\top  \\Vw^*. \n\\end{align}\n比较\\eqn?和\\eqn?，我们能够发现，如果超参数$\\epsilon,\\alpha$和$\\tau$满足如下：\n\\begin{align}\n(\\MI - \\epsilon \\VLambda)^\\tau =  (\\VLambda + \\alpha \\MI)^{-1} \\alpha,\n\\end{align}\n那么$L^2~$正则化和提前终止可以被看作是等价的（至少在目标函数的二次近似下）。\n进一步取对数，使用$\\log~(1+x)$的级数展开，我们可以得出结论：如果所有$\\lambda_i$是小的（即$\\epsilon \\lambda_i \\ll 1$且$\\lambda_i / \\alpha \\ll 1$），那么\n\\begin{align}\n\\tau \\approx \\frac{1}{\\epsilon \\alpha}, \\\\\n\\alpha \\approx \\frac{1}{\\tau \\epsilon}.\n\\end{align}\n也就是说，在这些假设下，训练迭代次数$\\tau$起着与$L^2$参数成反比的作用，$\\tau \\epsilon$的倒数与权重衰减系数的作用类似。\n\n在大曲率（目标函数）方向上的参数值受正则化影响小于小曲率方向。\n当然，在提前终止的情况下，这实际上意味着在大曲率方向的参数比较小曲率方向的参数更早地学习到。\n \n本节中的推导表明长度为$\\tau$的轨迹结束于$L^2$正则化目标的极小点。\n当然，提前终止比简单的轨迹长度限制更丰富；取而代之，提前终止通常涉及监控验证集误差，以便在空间特别好的点处终止轨迹。\n因此提前终止比权重衰减更具有优势，提前终止能自动确定正则化的正确量，而权重衰减需要进行多个不同超参数值的训练实验。\n\n<!-- % -- 245 -- -->\n\n\n# 参数绑定和参数共享\n\n目前为止，本章讨论对参数添加约束或惩罚时，一直是相对于固定的区域或点。\n例如，$L^2$正则化（或权重衰减）对参数偏离零的固定值进行惩罚。\n然而，有时我们可能需要其他的方式来表达我们对模型参数适当值的先验知识。\n有时候，我们可能无法准确地知道应该使用什么样的参数，但我们根据相关领域和模型结构方面的知识得知模型参数之间应该存在一些相关性。\n\n我们经常想要表达的一种常见依赖是某些参数应当彼此接近。\n考虑以下情形：我们有两个模型执行相同的分类任务（具有相同类别），但输入分布稍有不同。\n形式地，我们有参数为$\\Vw^{(A)}$的模型$A$和参数为$\\Vw^{(B)}$的模型$B$。\n这两种模型将输入映射到两个不同但相关的输出：$\\hat y^{(A)} = f(\\Vw^{(A)}, \\Vx)$和$\\hat y^{(B)} = f(\\Vw^{(B)}, \\Vx)$。\n\n我们可以想象，这些任务会足够相似（或许具有相似的输入和输出分布），因此我们认为模型参数应彼此靠近：\n$\\forall i, w_i^{(A)}$应该与$ w_i^{(B)}$接近。\n我们可以通过正则化利用此信息。\n具体来说，我们可以使用以下形式的参数范数惩罚：\n$\\Omega(\\Vw^{(A)}, \\Vw^{(B)}) = \\norm{\\Vw^{(A)}-\\Vw^{(B)}}_2^2$。\n在这里我们使用$L^2$惩罚，但也可以使用其他选择。\n\n这种方法由{LasserreJ2006}提出，正则化一个模型（监督模式下训练的分类器）的参数，使其接近另一个无监督模式下训练的模型（捕捉观察到的输入数据的分布）的参数。\n构造的这种架构使得分类模型中的许多参数能与无监督模型中对应的参数匹配。\n\n参数范数惩罚是正则化参数使其彼此接近的一种方式，而更流行的方法是使用约束：\\emph{强迫某些参数相等}。\n由于我们将各种模型或模型组件解释为共享唯一的一组参数，这种正则化方法通常被称为参数共享。\n和正则化参数使其接近（通过范数惩罚）相比，参数共享的一个显著优点是，只有参数（唯一一个集合）的子集需要被存储在内存中。\n对于某些特定模型，如卷积神经网络，这可能可以显著减少模型所占用的内存。\n\n\n<!-- % -- 246 -- -->\n\n## 卷积神经网络\n\n目前为止，最流行和广泛使用的参数共享出现在应用于计算机视觉的卷积神经网络中。\n\n自然图像有许多统计属性是对转换不变的。\n例如，猫的照片即使向右边移了一个像素，仍保持猫的照片。\nCNN通过在图像多个位置共享参数来考虑这个特性。\n相同的特征（具有相同权重的隐藏单元）在输入的不同位置上计算获得。\n这意味着无论猫出现在图像中的第$i$列或$i + 1$列，我们都可以使用相同的猫探测器找到猫。\n\n参数共享显著降低了CNN模型的参数数量，并显著提高了网络的大小而不需要相应地增加训练数据。\n它仍然是将领域知识有效地整合到网络架构的最佳范例之一。\n\n我们将会在\\chap?中更详细地讨论卷积神经网络。\n\n\n# 稀疏表示\n\n前文所述的权重衰减直接惩罚模型参数。\n另一种策略是惩罚神经网络中的激活单元，稀疏化激活单元。\n这种策略间接地对模型参数施加了复杂惩罚。\n\n我们已经讨论过（在\\sec?中）$L^1$惩罚如何诱导稀疏的参数，即许多参数为零（或接近于零）。\n另一方面，表示的稀疏描述了许多元素是零（或接近零）的表示。\n我们可以线性回归的情况下简单说明这种区别：\n\\begin{align}\n\\underset{\\Vy ~\\in~ \\SetR^m}{\n \\begin{bmatrix}\n  18 \\\\  5 \\\\ 15 \\\\ -9 \\\\ -3\n \\end{bmatrix}} = \n \\underset{\\MA ~\\in~ \\SetR^{m \\times n}}{\n \\begin{bmatrix}\n  4 & 0 & 0 & -2 & 0 & 0 \\\\\n  0 & 0 & -1 & 0 & 3 & 0 \\\\\n  0 & 5 & 0 & 0 & 0 & 0 \\\\\n  1 & 0 & 0 & -1 & 0 & -4 \\\\\n  1 & 0 & 0 & 0 & -5 & 0\n \\end{bmatrix}} \n  \\underset{\\Vx ~\\in~ \\SetR^n}{\n  \\begin{bmatrix}\n 2 \\\\ 3\\\\ -2\\\\ -5 \\\\ 1 \\\\ 4\n \\end{bmatrix} }\\\\\n \\underset{\\Vy ~\\in~ \\SetR^m}{\n \\begin{bmatrix}\n  -14 \\\\  1 \\\\ 19 \\\\  2 \\\\ 23\n \\end{bmatrix}} = \n \\underset{\\MB ~\\in~ \\SetR^{m \\times n}}{\n \\begin{bmatrix}\n  3 & -1 & 2 & -5 & 4 & 1 \\\\\n  4 & 2 & -3 & -1 & 1 & 3 \\\\\n  -1 & 5 & 4 & 2 & -3 & -2 \\\\\n  3 & 1 & 2 & -3 & 0 & -3 \\\\\n  -5 & 4 & -2 & 2 & -5 & -1\n \\end{bmatrix}} \n  \\underset{\\Vh ~\\in~ \\SetR^n}{\n  \\begin{bmatrix}\n 0 \\\\ 2 \\\\ 0 \\\\ 0 \\\\ -3 \\\\ 0\n \\end{bmatrix} }\n\\end{align}\n\n<!-- % -- 247 -- -->\n\n第一个表达式是参数稀疏的线性回归模型的例子。\n第二个表达式是数据$\\Vx$具有稀疏表示 $\\Vh$的线性回归。\n也就是说，$\\Vh$是$\\Vx$的一个函数，在某种意义上表示存在于$\\Vx$中的信息，但只是用一个稀疏向量表示。\n\n表示的正则化可以使用参数正则化中同种类型的机制实现。\n\n表示的范数惩罚正则化是通过向损失函数 $J$添加对表示的范数惩罚来实现的。\n我们将这个惩罚记作$\\Omega(\\Vh)$。\n和以前一样，我们将正则化后的损失函数记作$\\tilde J$：\n\\begin{align}\n \\tilde J(\\Vtheta; \\MX, \\Vy) =  J(\\Vtheta; \\MX, \\Vy)  + \\alpha \\Omega(\\Vh),\n\\end{align}\n其中$\\alpha \\in [0, \\infty]$ 权衡范数惩罚项的相对贡献，越大的$\\alpha$对应越多的正则化。\n\n正如对参数的$L^1$惩罚诱导参数稀疏性，对表示元素的$L^1$惩罚诱导稀疏的表示：\n$\\Omega(\\Vh) = \\norm{\\Vh}_1 = \\sum_i |h_i|$。\n当然$L^1$惩罚是使表示稀疏的方法之一。\n其他方法还包括从表示上的Student-$t$先验导出的惩罚{cite?}和KL散度惩罚{cite?}，这些方法对于将表示中的元素约束于单位区间上特别有用。\n{HonglakL2008-small}和{Goodfellow2009}都提供了正则化几个样本平均激活的例子，即令$\\frac{1}{m}\\sum_i \\Vh^{(i)}$接近某些目标值（如每项都是$.01$的向量）。\n\n还有一些其他方法通过激活值的硬性约束来获得表示稀疏。\n例如，\\textbf{正交匹配追踪}(orthogonal matching pursuit){cite?}通过解决以下约束优化问题将输入值$\\Vx$编码成表示 $\\Vh$\n\\begin{align}\n \\underset{\\Vh, \\norm{\\Vh}_0 < k}{\\argmin} \\norm{\\Vx - \\MW \\Vh}^2,\n\\end{align}\n其中$\\norm{\\Vh}_0 $是$\\Vh$中非零项的个数。\n当$\\MW$被约束为正交时，我们可以高效地解决这个问题。\n这种方法通常被称为OMP-$k$，通过$k$指定允许的非零特征数量。\n{Coates2011b}证明OMP-$1$可以成为深度架构中非常有效的特征提取器。\n\n<!-- % -- 248 -- -->\n\n含有隐藏单元的模型在本质上都能变得稀疏。\n在本书中，我们将看到在各种情况下使用稀疏正则化的例子。\n\n\n# Bagging和其他集成方法\n\nBagging是通过结合几个模型降低泛化误差的技术{cite?}。\n主要想法是分别训练几个不同的模型，然后让所有模型表决测试样例的输出。\n这是机器学习中常规策略的一个例子，被称为模型平均。\n采用这种策略的技术被称为集成方法。\n\n模型平均奏效的原因是不同的模型通常不会在测试集上产生完全相同的误差。\n\n假设我们有$k$个回归模型。\n假设每个模型在每个例子上的误差是$\\epsilon_i$，这个误差服从零均值方差为$\\SetE[\\epsilon_i^2] = v$且协方差为$\\SetE[\\epsilon_i \\epsilon_j] = c$的多维正态分布。\n通过所有集成模型的平均预测所得误差是$\\frac{1}{k} \\sum_i \\epsilon_i$。 \n集成预测器平方误差的期望是\n\\begin{align}\n \\SetE \\Bigg[\\Bigg(\\frac{1}{k} \\sum_i \\epsilon_i \\Bigg)^2\\Bigg] &= \\frac{1}{k^2} \n \\SetE \\Bigg[\\sum_i \\Bigg(\\epsilon_i^2 + \\sum_{j \\neq i} \\epsilon_i \\epsilon_j\\Bigg)\\Bigg], \\\\\n&= \\frac{1}{k} v + \\frac{k-1}{k} c .                             \n\\end{align}\n在误差完全相关即$c=v$的情况下，均方误差减少到$v$，所以模型平均没有任何帮助。\n在错误完全不相关即$c =0$的情况下，该集成平方误差的期望仅为$\\frac{1}{k}v$。\n这意味着集成平方误差的期望会随着集成规模增大而线性减小。\n换言之，平均上，集成至少与它的任何成员表现得一样好，并且如果成员的误差是独立的，集成将显著地比其成员表现得更好。\n\n不同的集成方法以不同的方式构建集成模型。\n例如，集成的每个成员可以使用不同的算法和目标函数训练成完全不同的模型。\nBagging是一种允许重复多次使用同一种模型、训练算法和目标函数的方法。\n\n<!-- % -- 249 -- -->\n\n具体来说，Bagging涉及构造$k$个不同的数据集。\n每个数据集从原始数据集中重复采样构成，和原始数据集具有相同数量的样例。\n这意味着，每个数据集以高概率缺少一些来自原始数据集的例子，还包含若干重复的例子（如果所得训练集与原始数据集大小相同，那所得数据集中大概有原始数据集$2/3$的实例）。\n模型$i$在数据集$i$上训练。\n每个数据集所含样本的差异导致了训练模型之间的差异。\n\\fig?是一个例子。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/bagging}}\n\\fi\n\\caption{描述Bagging如何工作的草图。\n假设我们在上述数据集（包含一个8、一个6和一个9）上训练数字8的检测器。\n假设我们制作了两个不同的重采样数据集。\nBagging训练程序通过有放回采样构建这些数据集。\n第一个数据集忽略9并重复8。\n在这个数据集上，检测器得知数字顶部有一个环就对应于一个8。\n第二个数据集中，我们忽略6并重复9。\n在这种情况下，检测器得知数字底部有一个环就对应于一个8。\n这些单独的分类规则中的每一个都是不可靠的，但如果我们平均它们的输出，就能得到鲁棒的检测器，只有当8的两个环都存在时才能实现最大置信度。\n}\n\\end{figure}\n\n神经网络能找到足够多的不同的解，意味着他们可以从模型平均中受益(即使所有模型都在同一数据集上训练)。\n神经网络中随机初始化的差异、小批量的随机选择、超参数的差异或不同输出的非确定性实现往往足以使得集成中的不同成员具有部分独立的误差。\n\n<!-- % -- 250 -- -->\n\n模型平均是一个减少泛化误差的非常强大可靠的方法。\n在作为科学论文算法的基准时，它通常是不鼓励使用的，因为任何机器学习算法都可以从模型平均中大幅获益（以增加计算和存储为代价）。\n\n机器学习比赛中的取胜算法通常是使用超过几十种模型平均的方法。\n最近一个突出的例子是Netflix Grand Prize{cite?}。\n\n不是所有构建集成的技术都是为了让集成模型比单一模型更加正则化。\n例如，一种被称为\\textbf{Boosting}的技术{cite?}构建比单个模型容量更高的集成模型。\n通过向集成逐步添加神经网络，Boosting已经被应用于构建神经网络的集成{cite?}。\n通过逐渐增加神经网络的隐藏单元，Boosting也可以将单个神经网络解释为一个集成。\n\n\n# Dropout\n\n\\textbf{Dropout}~{cite?}提供了正则化一大类模型的方法，计算方便但功能强大。\n在第一种近似下，Dropout可以被认为是集成大量深层神经网络的实用Bagging方法。\nBagging涉及训练多个模型，并在每个测试样本上评估多个模型。\n当每个模型都是一个很大的神经网络时，这似乎是不切实际的，因为训练和评估这样的网络需要花费很多运行时间和内存。\n通常我们只能集成五至十个神经网络，如{Szegedy-et-al-arxiv2014}集成了六个神经网络赢得ILSVRC，超过这个数量就会迅速变得难以处理。\nDropout提供了一种廉价的Bagging集成近似，能够训练和评估指数级数量的神经网络。\n\n具体而言，Dropout训练的集成包括所有从基础网络除去非输出单元后形成的子网络，如\\fig?所示。\n最先进的神经网络基于一系列仿射变换和非线性变换，我们只需将一些单元的输出乘零就能有效地删除一个单元。\n这个过程需要对模型（如径向基函数网络，单元的状态和参考值之间存在一定区别）进行一些修改。\n为了简单起见，我们在这里提出乘零的简单Dropout算法，但是它被简单修改后，可以与从网络中移除单元的其他操作结合使用。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/subnetworks}}\n\\fi\n\\caption{Dropout训练由所有子网络组成的集成，其中子网络通过从基本网络中删除非输出单元构建。\n我们从具有两个可见单元和两个隐藏单元的基本网络开始。\n这四个单元有十六个可能的子集。\n右图展示了从原始网络中丢弃不同的单元子集而形成的所有十六个子网络。\n在这个小例子中，所得到的大部分网络没有输入单元或没有从输入连接到输出的路径。\n当层较宽时，丢弃所有从输入到输出的可能路径的概率变小，所以这个问题不太可能在出现层较宽的网络中。}\n\\end{figure}\n\n<!-- % -- 251 -- -->\n\n回想一下Bagging学习，我们定义$k$个不同的模型，从训练集有放回采样构造$k$个不同的数据集，然后在训练集$i$上训练模型$i$。\nDropout的目标是在指数级数量的神经网络上近似这个过程。\n具体来说，在训练中使用Dropout时，我们会使用基于小批量产生较小步长的学习算法，如随机梯度下降等。\n我们每次在小批量中加载一个样本，然后随机抽样应用于网络中所有输入和隐藏单元的不同二值掩码。\n对于每个单元，掩码是独立采样的。\n掩码值为1的采样概率（导致包含一个单元）是训练开始前一个固定的超参数。\n它不是模型当前参数值或输入样本的函数。\n通常在每一个小批量训练的神经网络中，一个输入单元被包括的概率为$0.8$，一个隐藏单元被包括的概率为$0.5$。\n然后，我们运行和之前一样的前向传播、反向传播以及学习更新。\n\\fig?说明了在Dropout下的前向传播。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/dropout_fprop}}\n\\fi\n\\caption{在使用Dropout的前馈网络中前向传播的示例。\n(顶部)在此示例中，我们使用具有两个输入单元，具有两个隐藏单元的隐藏层以及一个输出单元的前馈网络。\n(底部)为了执行具有Dropout的前向传播，我们随机地对向量$\\Vmu$进行采样，其中网络中的每个输入或隐藏单元对应一项。\n$\\Vmu$中的每项都是二值的且独立于其他项采样。\n超参数的采样概率为$1$，隐藏层的采样概率通常为$0.5$，输入的采样概率通常为$0.8$。\n网络中的每个单元乘以相应的掩码，然后正常地继续沿着网络的其余部分前向传播。\n这相当于从\\fig?中随机选择一个子网络并沿着前向传播。\n}\n\\end{figure}\n<!-- % -- 252 -- -->\n\n更正式地说，假设一个掩码向量$\\Vmu$指定被包括的单元，$J(\\Vtheta, \\Vmu)$是由参数$\\Vtheta$和掩码 $\\Vmu$定义的模型代价。\n那么Dropout训练的目标是最小化$\\SetE_{\\Vmu} J(\\Vtheta, \\Vmu)$。 \n这个期望包含多达指数级的项，但我们可以通过抽样$\\Vmu$获得梯度的无偏估计。\n\nDropout训练与Bagging训练不太一样。\n在Bagging的情况下，所有模型都是独立的。\n在Dropout的情况下，所有模型共享参数，其中每个模型继承父神经网络参数的不同子集。\n参数共享使得在有限可用的内存下表示指数级数量的模型变得可能。\n在Bagging的情况下，每一个模型在其相应训练集上训练到收敛。\n在Dropout的情况下，通常大部分模型都没有显式地被训练，因为通常父神经网络会很大，以致于到宇宙毁灭都不可能采样完所有的子网络。\n取而代之的是，在单个步骤中我们训练一小部分的子网络，参数共享会使得剩余的子网络也能有好的参数设定。\n这些是仅有的区别。\n除了这些，Dropout与Bagging算法一样。\n例如，每个子网络中遇到的训练集确实是有放回采样的原始训练集的一个子集。\n\nBagging集成必须根据所有成员的累积投票做一个预测。\n在这种背景下，我们将这个过程称为推断。\n目前为止，我们在介绍Bagging和Dropout时没有要求模型具有明确的概率。\n现在，我们假定该模型的作用是输出一个概率分布。\n在Bagging的情况下，每个模型$i$产生一个概率分布$p^{(i)}(y \\mid \\Vx)$。 \n集成的预测由这些分布的算术平均值给出，\n\\begin{align}\n \\frac{1}{k} \\sum_{i=1}^k p^{(i)}(y \\mid \\Vx).\n\\end{align}\n\n在Dropout的情况下，通过掩码 $\\Vmu$定义每个子模型的概率分布$p(y \\mid \\Vx, \\Vmu)$。\n所有掩码的算术平均值由下式给出\n\\begin{align}\n  \\sum_{\\Vmu} p(\\Vmu) p(y \\mid \\Vx, \\Vmu),\n\\end{align}\n其中$p(\\Vmu)$是训练时采样$\\Vmu$的概率分布。\n\n<!-- % -- 254 -- -->\n\n因为这个求和包含多达指数级的项，除非该模型的结构允许某种形式的简化，否则是不可能计算的。\n目前为止，无法得知深度神经网络是否允许某种可行的简化。\n相反，我们可以通过采样近似推断，即平均许多掩码的输出。\n即使是$10-20$个掩码就足以获得不错的表现。\n\n然而，一个更好的方法能不错地近似整个集成的预测，且只需一个前向传播的代价。\n要做到这一点，我们改用集成成员预测分布的几何平均而不是算术平均。\n{WardeFarley+al-ICLR2014}提出的论点和经验证据表明，在这个情况下几何平均与算术平均表现得差不多。\n\n多个概率分布的几何平均不能保证是一个概率分布。\n为了保证结果是一个概率分布，我们要求没有子模型给某一事件分配概率0，并重新标准化所得分布。\n通过几何平均直接定义的非标准化概率分布由下式给出\n\\begin{align}\n\\tilde{p}_{\\text{ensemble}}(y \\mid \\Vx) = \\sqrt[2^d]{\\prod_{\\Vmu} p(y \\mid \\Vx, \\Vmu)},\n\\end{align}\n其中$d$是可被丢弃的单元数。\n这里为简化介绍，我们使用均匀分布的$\\Vmu$，但非均匀分布也是可以的。\n为了作出预测，我们必须重新标准化集成：\n\\begin{align}\np_{\\text{ensemble}}(y \\mid \\Vx)  = \\frac{\\tilde{p}_{\\text{ensemble}}(y \\mid \\Vx)}\n {\\sum_{y'}\\tilde{p}_{\\text{ensemble}}(y' \\mid \\Vx) }.\n\\end{align}\n \n涉及Dropout的一个重要观点{cite?}是，我们可以通过评估模型中$p(y \\mid \\Vx)$来近似$ p_{\\text{ensemble}}$：\n该模型具有所有单元，但我们将单元$i$的输出的权重乘以单元$i$的被包含概率。\n这个修改的动机是得到从该单元输出的正确期望值。\n我们把这种方法称为权重比例推断规则。\n目前还没有在深度非线性网络上对这种近似推断规则的准确性作任何理论分析，但经验上表现得很好。\n\n % -- 255 --\n \n因为我们通常使用$\\frac{1}{2}$的包含概率，权重比例规则一般相当于在训练结束后将权重除$2$，然后像平常一样使用模型。\n实现相同结果的另一种方法是在训练期间将单元的状态乘$2$。\n无论哪种方式，我们的目标是确保在测试时一个单元的期望总输入与在训练时该单元的期望总输入是大致相同的（即使近半单位在训练时丢失）。\n\n对许多不具有非线性隐藏单元的模型族而言，权重比例推断规则是精确的。\n举个简单的例子，考虑softmax函数回归分类，其中由向量$\\RVv$表示$n$个输入变量：\n\\begin{align}\n P(\\RSy = \\Sy \\mid \\RVv) = \\text{softmax}\\big(\\MW^\\top\\RVv + \\Vb\\big)_y.\n\\end{align}\n我们可以根据二值向量$\\Vd$逐元素的乘法将一类子模型进行索引：\n\\begin{align}\nP(\\RSy = \\Sy \\mid \\RVv; \\Vd) = \\text{softmax}\\big(\\MW^\\top(\\Vd \\odot \\RVv) + \\Vb \\big)_y.\n\\end{align}\n集成预测器被定义为重新标准化所有集成成员预测的几何平均：\nP_{\\text{ensemble}}(\\RSy = \\Sy \\mid \\RVv)  = \\frac{\\tilde{P}_{\\text{ensemble}}(\\RSy = \\Sy \\mid \\RVv)}\n {\\sum_{y'}\\tilde{P}_{\\text{ensemble}}(\\RSy = \\Sy' \\mid \\RVv) },\n\\end{align}\n其中\n\\begin{align}\n\\tilde{P}_{\\text{ensemble}}(\\RSy=\\Sy \\mid \\RVv) =\n\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} P(\\RSy = \\Sy \\mid \\RVv; \\Vd)}.\n\\end{align}\n\n为了证明权重比例推断规则是精确的，我们简化$ \\tilde{P}_{\\text{ensemble}}$：\n\\begin{align}\n\\tilde{P}_{\\text{ensemble}}(\\RSy=\\Sy \\mid \\RVv) =\n\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} P(\\RSy = \\Sy \\mid \\RVv; \\Vd)} \\\\\n= \\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} \\text{softmax}(\\MW^\\top(\\Vd \\odot \\RVv) + \\Vb)_y} \\\\\n= \\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} \\frac{\\exp (\\MW_{y,:}^\\top(\\Vd \\odot \\RVv) + \\Vb_y)}\n{\\sum_{y'}\\exp (\\MW_{y',;}^\\top(\\Vd \\odot \\RVv) + \\Vb_{y'})}}\\\\\n=  \\frac{\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n}\\exp (\\MW_{y,:}^\\top(\\Vd \\odot \\RVv) + \\Vb_y)}}\n{ \\sqrt[2^n] \\prod_{\\Vd \\in \\{0,1\\}^n} \\sum_{y'}\\exp (\\MW_{y',:}^\\top(\\Vd \\odot \\RVv) + \\Vb_{y'})}\n\\end{align}\n由于$\\tilde P$将被标准化，我们可以放心地忽略那些相对$y$不变的乘法：\n\\begin{align}\n\\tilde{P}_{\\text{ensemble}}(\\RSy=\\Sy \\mid \\RVv) &\\propto \n\\sqrt[2^n]{\\prod_{\\Vd \\in \\{0,1\\}^n} \\exp (\\MW_{y,:}^\\top(\\Vd \\odot \\RVv) + \\Vb_y)} \\\\\n& = \\exp \\Bigg(\\frac{1}{2^n} \\sum_{\\Vd \\in \\{0,1\\}^n} \\MW_{y,;}^\\top(\\Vd \\odot \\RVv) + \\Vb_y \\Bigg) \\\\\n& = \\exp \\Big(\\frac{1}{2}\\MW_{y,:}^\\top \\RVv + \\Vb_y \\Big) .\n\\end{align}\n将其代入\\eqn?，我们得到了一个权重为$\\frac{1}{2}\\MW$的softmax函数分类器。\n\n<!-- % -- 256 -- -->\n\n权重比例推断规则在其他设定下也是精确的，包括条件正态输出的回归网络以及那些隐藏层不包含非线性的深度网络。\n然而，权重比例推断规则对具有非线性的深度模型仅仅是一个近似。\n虽然这个近似尚未有理论上的分析，但在实践中往往效果很好。\n{Goodfellow-et-al-ICML2013}实验发现，在对集成预测的近似方面，权重比例推断规则比蒙特卡罗近似更好（就分类精度而言）。\n即使允许蒙特卡罗近似采样多达1000子网络时也比不过权重比例推断规则。\n{gal2015bayesian}发现一些模型可以通过二十个样本和蒙特卡罗近似获得更好的分类精度。\n似乎推断近似的最佳选择是与问题相关的。\n\n{Srivastava14}显示，Dropout比其他标准的计算开销小的正则化方法（如权重衰减、过滤器范数约束和稀疏激活的正则化）更有效。\nDropout也可以与其他形式的正则化合并，得到进一步的提升。\n\n计算方便是Dropout的一个优点。\n训练过程中使用Dropout产生$n$个随机二进制数与状态相乘，每个样本每次更新只需$\\CalO(n)$的计算复杂度。\n根据实现，也可能需要$\\CalO(n)$的存储空间来持续保存这些二进制数（直到反向传播阶段）。\n使用训练好的模型推断时，计算每个样本的代价与不使用Dropout是一样的，尽管我们必须在开始运行推断前将权重除以2。\n\n<!-- % -- 257 -- -->\n\nDropout的另一个显著优点是不怎么限制适用的模型或训练过程。\n几乎在所有使用分布式表示且可以用随机梯度下降训练的模型上都表现很好。\n包括前馈神经网络、概率模型，如受限玻尔兹曼机{cite?}，以及循环神经网络{cite?}。\n许多效果差不多的其他正则化策略对模型结构的限制更严格。\n\n虽然Dropout在特定模型上每一步的代价是微不足道的，但在一个完整的系统上使用Dropout的代价可能非常显著。\n因为Dropout是一个正则化技术，它减少了模型的有效容量。\n为了抵消这种影响，我们必须增大模型规模。\n不出意外的话，使用Dropout时最佳验证集的误差会低很多，但这是以更大的模型和更多训练算法的迭代次数为代价换来的。\n对于非常大的数据集，正则化带来的泛化误差减少得很小。\n在这些情况下，使用Dropout和更大模型的计算代价可能超过正则化带来的好处。\n\n只有极少的训练样本可用时，Dropout不会很有效。\n在只有不到5000的样本的Alternative Splicing数据集上{cite?}，贝叶斯神经网络{cite?}比Dropout表现得更好{cite?}。\n当有其他未分类的数据可用时，无监督特征学习也比Dropout更有优势。\n\n\n{Wager+al-2013}表明，当Dropout作用于线性回归时，相当于每个输入特征具有不同权重衰减系数的$L^2$权重衰减。 每个特征的权重衰减系数的大小是由其方差来确定的。\n其他线性模型也有类似的结果。\n而对于深度模型而言，Dropout与权重衰减是不等同的。\n\n\n使用Dropout训练时的随机性不是这个方法成功的必要条件。\n它仅仅是近似所有子模型总和的一个方法。\n{WangManning-ICML2013-small}导出了近似这种边缘分布的解析解。\n他们的近似被称为快速Dropout，减小梯度计算中的随机性而获得更快的收敛速度。\n这种方法也可以在测试时应用，能够比权重比例推断规则更合理地（但计算也更昂贵）近似所有子网络的平均。\n快速Dropout在小神经网络上的性能几乎与标准的Dropout相当，但在大问题上尚未产生显著改善或尚未应用。\n\n<!-- % -- 258 -- -->\n\n随机性对实现Dropout的正则化效果不是必要的，同时也不是充分的。\n为了证明这一点，{WardeFarley+al-ICLR2014}使用一种被称为\\textbf{Dropout Boosting}的方法设计了一个对照实验，具有与传统Dropout方法完全相同的噪声掩码， 但缺乏正则化效果。\nDropout Boosting训练整个集成以最大化训练集上的似然。\n从传统Dropout类似于Bagging的角度来看，这种方式类似于Boosting。\n如预期一样，和单一模型训练整个网络相比，Dropout Boosting几乎没有正则化效果。\n这表明，使用Bagging解释Dropout比使用稳健性噪声解释Dropout更好。\n只有当随机抽样的集成成员相互独立地训练好后，才能达到Bagging集成的正则化效果。\n\nDropout启发其他以随机方法训练指数量级的共享权重的集成。\nDropConnect是\nDropout的一个特殊情况，其中一个标量权重和单个隐藏单元状态之间的每个乘积被认为是可以丢弃的一个单元{cite?}。\n随机池化是构造卷积神经网络集成的一种随机化池化的形式(见\\sec?)，其中每个卷积网络参与每个特征图的不同空间位置。\n目前为止，Dropout仍然是最广泛使用的隐式集成方法。\n\n一个关于Dropout的重要见解是，通过随机行为训练网络并平均多个随机决定进行预测，实现了一种参数共享的Bagging形式。\n早些时候，我们将Dropout描述为通过包括或排除单元形成模型集成的Bagging。\n然而，这种参数共享策略不一定要基于包括和排除。\n原则上，任何一种随机的修改都是可接受的。\n在实践中，我们必须选择让神经网络能够学习对抗的修改类型。\n在理想情况下，我们也应该使用可以快速近似推断的模型族。\n我们可以认为由向量$\\Vmu$参数化的任何形式的修改，是对$\\Vmu$所有可能的值训练$p(y \\mid \\Vx, \\Vmu)$的集成。\n注意，这里不要求$\\Vmu$具有有限数量的值。\n例如，$\\Vmu$可以是实值。\n{Srivastava14}表明，权重乘以$\\Vmu \\sim \\CalN(\\mathbf{1}, \\MI)$比基于二值掩码Dropout表现得更好。\n由于$\\SetE[\\Vmu] = 1$，标准网络自动实现集成的近似推断，而不需要权重比例推断规则。\n\n<!-- % -- 259 -- -->\n\n目前为止，我们将Dropout介绍为一种纯粹高效近似Bagging的方法。\n然而，还有比这更进一步的Dropout观点。\nDropout不仅仅是训练一个Bagging的集成模型，\n并且是共享隐藏单元的集成模型。\n这意味着无论其他隐藏单元是否在模型中，每个隐藏单元必须都能够表现良好。\n隐藏单元必须准备好进行模型之间的交换和互换。\n{Hinton-et-al-arxiv2012-small}由生物学的想法受到启发：有性繁殖涉及到两个不同生物体之间交换基因，进化产生的压力使得基因不仅是良好的而且要准备好不同有机体之间的交换。\n这样的基因和这些特点对环境的变化是非常稳健的，因为它们一定会正确适应任何一个有机体或模型不寻常的特性。\n因此Dropout正则化每个隐藏单元不仅是一个很好的特征，更要在许多情况下是良好的特征。\n{WardeFarley+al-ICLR2014}将Dropout与大集成的训练相比并得出结论：相比独立模型集成获得泛化误差改进，Dropout会带来额外的改进。\n\nDropout强大的大部分原因来自施加到隐藏单元的掩码噪声，了解这一事实是重要的。\n这可以看作是对输入内容的信息高度智能化、自适应破坏的一种形式，而不是对输入原始值的破坏。\n例如，如果模型学得通过鼻检测脸的隐藏单元 $h_i$，那么丢失$h_i$对应于擦除图像中有鼻子的信息。\n模型必须学习另一种$h_i$，要么是鼻子存在的冗余编码，要么是像嘴这样的脸部的另一特征。\n传统的噪声注入技术，在输入端加非结构化的噪声不能够随机地从脸部图像中抹去关于鼻子的信息，除非噪声的幅度大到几乎能抹去图像中所有的信息。\n破坏提取的特征而不是原始值，让破坏过程充分利用该模型迄今获得的关于输入分布的所有知识。\n\nDropout的另一个重要方面是噪声是乘性的。\n如果是固定规模的加性噪声，那么加了噪声$\\epsilon$的整流线性隐藏单元可以简单地学会使$h_i$变得很大（使增加的噪声$\\epsilon$变得不显著）。\n乘性噪声不允许这样病态地解决噪声鲁棒性问题。\n\n<!-- % -- 260 -- -->\n\n另一种深度学习算法——批标准化，在训练时向隐藏单元引入加性和乘性噪声重新参数化模型。\n批标准化的主要目的是改善优化，但噪声具有正则化的效果，有时没必要再使用Dropout。\n批标准化将会在\\sec?中被更详细地讨论。\n\n\n\n\n# 对抗训练\n\n在许多情况下，神经网络在独立同分布的测试集上进行评估已经达到了人类表现。\n因此，我们自然要怀疑这些模型在这些任务上是否获得了真正的人类层次的理解。\n为了探索网络对底层任务的理解层次，我们可以探索这个模型错误分类的例子。\n{Szegedy-ICLR2014}发现，在精度达到人类水平的神经网络上通过优化过程故意构造数据点，其上的误差率接近100\\%，模型在这个输入点$\\Vx'$的输出与附近的数据点$\\Vx$非常不同。\n在许多情况下，$\\Vx'$与$\\Vx$非常近似，人类观察者不会察觉原始样本和对抗样本之间的差异，但是网络会作出非常不同的预测。\n见\\fig?中的例子。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{tabular}{>{\\centering\\arraybackslash}m{.2\\figwidth}m{.5in}>{\\centering\\arraybackslash}m{.2\\figwidth}m{.1in}>{\\centering\\arraybackslash}m{.2\\figwidth}}\n    \\centering\\arraybackslash\n<!-- %abs max for panda was 138, eps was 1., so relative eps is approximately .007 -->\n    \\includegraphics[width=.2 \\figwidth]{Chapter7/figures/panda_577.png} &%\n    \\centering\\arraybackslash%\n$\\ +\\ .007\\ \\times$ &%\n    \\includegraphics[width=.2\\figwidth]{Chapter7/figures/nematode_082.png} &%\n    $=$ & %\n    \\includegraphics[width=.2\\figwidth]{Chapter7/figures/gibbon_993.png} \\\\\n    $\\centering \\Vx$     &%\n    & $\\text{sign} (\\nabla_{\\Vx} J(\\Vtheta, \\Vx, y) )$ & & $\\Vx + \\epsilon \\text{sign} (\\nabla_{\\Vx} J(\\Vtheta, \\Vx, y) )$ \\\\\n    $y=$\"panda\" &                & \"nematode\"     &   & \"gibbon\" \\\\\n    w/ 57.7\\% confidence &        &   w/ 8.2\\% confidence & & w/ 99.3 \\% confidence\n\\end{tabular}    \n\\fi\n\\caption[Fast adversarial sample generation]{\n在ImageNet上应用GoogLeNet~{cite?}的对抗样本生成的演示。\n通过添加一个不可察觉的小向量（其中元素等于代价函数相对于输入的梯度元素的符号），我们可以改变GoogLeNet对此图像的分类结果。\n经{Goodfellow-2015-adversarial}许可转载。\n}\n\\end{figure}\n\n<!-- % -- 261 -- -->\n\n对抗样本在很多领域有很多影响，例如计算机安全，这超出了本章的范围。\n然而，它们在正则化的背景下很有意思，因为我们可以通过对抗训练减少原有独立同分布的测试集的错误率——在对抗扰动的训练集样本上训练网络{cite?}。\n\n\n{Goodfellow-2015-adversarial}表明，这些对抗样本的主要原因之一是过度线性。\n神经网络主要是基于线性块构建的。\n因此在一些实验中，它们实现的整体函数被证明是高度线性的。\n这些线性函数很容易优化。\n不幸的是，如果一个线性函数具有许多输入，那么它的值可以非常迅速地改变。\n如果我们用$\\epsilon$改变每个输入，那么权重为$\\Vw$的线性函数可以改变$\\epsilon \\norm{\\Vw}_1$之多，如果$\\Vw$是高维的这会是一个非常大的数。\n对抗训练通过鼓励网络在训练数据附近的局部区域恒定来限制这一高度敏感的局部线性行为。\n这可以被看作是一种明确地向监督神经网络引入局部恒定先验的方法。\n\n对抗训练有助于体现积极正则化与大型函数族结合的力量。\n纯粹的线性模型，如逻辑回归，由于它们被限制为线性而无法抵抗对抗样本。\n神经网络能够将函数从接近线性转化为局部近似恒定，从而可以灵活地捕获到训练数据中的线性趋势同时学习抵抗局部扰动。\n\n对抗样本也提供了一种实现半监督学习的方法。\n在与数据集中的标签不相关联的点$\\Vx$处，模型本身为其分配一些标签$\\hat y$。\n模型的标记$\\hat y$未必是真正的标签，但如果模型是高品质的，那么$\\hat y$提供正确标签的可能性很大。\n我们可以搜索一个对抗样本 $\\Vx'$，导致分类器输出一个标签$y'$且$y' \\neq \\hat y$。\n不使用真正的标签，而是由训练好的模型提供标签产生的对抗样本被称为虚拟对抗样本{cite?}。\n我们可以训练分类器为$\\Vx$和$\\Vx'$分配相同的标签。\n这鼓励分类器学习一个沿着未标签数据所在流形上任意微小变化都很鲁棒的函数。\n驱动这种方法的假设是，不同的类通常位于分离的流形上，并且小扰动不会使数据点从一个类的流形跳到另一个类的流形上。\n\n<!-- % -- 262 --  -->\n\n<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->\n<!-- %       Hard to translate -->\n<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->\n\n# 切面距离、正切传播和流形正切分类器\n\n如\\sec?所述，许多机器学习通过假设数据位于低维流形附近来克服维数灾难。\n\n一个利用流形假设的早期尝试是切面距离算法{cite?}。\n它是一种非参数的最近邻算法，其中使用的度量不是通用的欧几里德距离，而是根据邻近流形关于聚集概率的知识导出的。\n这个算法假设我们尝试分类的样本和同一流形上的样本具有相同的类别。\n由于分类器应该对局部因素（对应于流形上的移动）的变化保持不变，一种合理的度量是将点$\\Vx_1$和$\\Vx_2$各自所在流形$M_1$和$M_2$的距离作为点$\\Vx_1$和$\\Vx_2$之间的最近邻距离。\n然而这可能在计算上是困难的（它需要解决一个寻找$M_1$和$M_2$最近点对的优化问题），一种局部合理的廉价替代是使用$\\Vx_i$点处切平面近似$M_i$，并测量两条切平面或一个切平面和点之间的距离。\n这可以通过求解一个低维线性系统（就流形的维数而言）来实现。\n当然，这种算法需要指定那些切向量。\n\n受相关启发，正切传播算法{cite?}（\\fig?）训练带有额外惩罚的神经网络分类器，使神经网络的每个输出$f(\\Vx)$对已知的变化因素是局部不变的。\n这些变化因素对应于沿着的相同样本聚集的流形的移动。\n这里实现局部不变性的方法是要求$\\nabla_{\\Vx} f(\\Vx)$与已知流形的切向$\\Vv^{(i)}$正交，或者等价地通过正则化惩罚$\\Omega$使$f$在$\\Vx$的$\\Vv^{(i)}$方向的导数较小：\n \\Omega(f) = \\sum_i \\Big((\\nabla_{\\Vx} f(\\Vx)^\\top \\Vv^{(i)}) \\Big)^2 .\n\\end{align}\n这个正则化项当然可以通过适当的超参数缩放，并且对于大多数神经网络，我们需要对许多输出求和(此处为描述简单，$f(\\Vx)$为唯一输出)。\n与切面距离算法一样，我们根据切向量推导先验，通常从变换（如平移、旋转和缩放图像）的效果获得形式知识。\n正切传播不仅用于监督学习{cite?}，还在强化学习{cite?}中有所应用。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter7/figures/mtc_color}}\n\\fi\n\\caption{正切传播算法{cite?}和流形正切分类器主要思想的示意图{cite?}，它们都正则化分类器的输出函数$f(\\Vx)$。\n每条曲线表示不同类别的流形，这里表示嵌入二维空间中的一维流形。\n在一条曲线上，我们选择单个点并绘制一个与类别流形（平行并接触流形）相切的向量以及与类别流形（与流形正交）垂直的向量。\n在多维情况下，可以存在许多切线方向和法线方向。\n我们希望分类函数在垂直于流形方向上快速改变，并且在类别流形的方向上保持不变。\n正切传播和流形正切分类器都会正则化 $f(\\Vx)$，使其不随$\\Vx$沿流形的移动而剧烈变化。\n正切传播需要用户手动指定正切方向的计算函数（例如指定小平移后的图像保留在相同类别的流形中），而流形正切分类器通过训练自编码器拟合训练数据来估计流形的正切方向 。\n我们将在\\chap?中讨论使用自编码器来估计流形。\n}\n\\end{figure}\n<!-- % -- 263 -- -->\n\n正切传播与数据集增强密切相关。\n在这两种情况下，该算法的用户通过指定一组应当不会改变网络输出的转换，将其先验知识编码至算法中。\n不同的是在数据集增强的情况下，网络显式地训练正确分类这些施加大量变换后产生的不同输入。\n正切传播不需要显式访问一个新的输入点。\n取而代之，它解析地对模型正则化从而在指定转换的方向抵抗扰动。\n虽然这种解析方法是聪明优雅的，但是它有两个主要的缺点。\n首先，模型的正则化只能抵抗无穷小的扰动。\n显式的数据集增强能抵抗较大的扰动。\n其次，我们很难在基于整流线性单元的模型上使用无限小的方法。\n这些模型只能通过关闭单元或缩小它们的权重才能缩小它们的导数。\n它们不能像sigmoid或tanh单元一样通过较大权重在高值处饱和以收缩导数。\n数据集增强在整流线性单元上工作得很好，因为不同的整流单元会在每一个原始输入的不同转换版本上被激活。\n\n<!-- % -- 264 -- -->\n\n正切传播也和双反向传播{cite?}以及对抗训练{cite?}有关联。\n双反向传播正则化使Jacobian矩阵偏小，而对抗训练找到原输入附近的点，训练模型在这些点上产生与原来输入相同的输出。\n正切传播和手动指定转换的数据集增强都要求模型在输入变化的某些特定的方向上保持不变。\n双反向传播和对抗训练都要求模型对输入所有方向中的变化（只要该变化较小）都应当保持不变。\n正如数据集增强是正切传播非无限小的版本，对抗训练是双反向传播非无限小的版本。\n\n流形正切分类器{cite?}无需知道切线向量的先验。\n我们将在\\chap?看到，自编码器可以估算流形的切向量。\n流形正切分类器使用这种技术来避免用户指定切向量。\n如\\fig?所示，这些估计的切向量不仅对图像经典几何变换（如转化、旋转和缩放）保持不变，还必须掌握对特定对象（如正在移动的身体某些部分）保持不变的因素。\n因此根据流形正切分类器提出的算法相当简单：\n（1）使用自编码器通过无监督学习来学习流形的结构，以及（2）如正切传播（\\eqn?）一样使用这些切面正则化神经网络分类器。\n\n在本章中，我们已经描述了大多数用于正则化神经网络的通用策略。\n正则化是机器学习的中心主题，因此我们将不时在其余各章中重新回顾。\n机器学习的另一个中心主题是优化，我们将在下一章描述。\n\n<!-- % -- 265 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-08-Chapter8_optimization_for_training_deep_models.md",
    "content": "---\ntitle: 深度模型中的优化\nlayout: post\nshare: false\n---\n<!-- % 267 head -->\n深度学习算法在许多情况下都涉及到优化。\n例如，模型中的进行推断（如\\,PCA）涉及到求解优化问题。\n我们经常使用解析优化去证明或设计算法。\n在深度学习涉及到的诸多优化问题中，最难的是神经网络训练。\n甚至是用几百台机器投入几天到几个月来解决单个神经网络训练问题，也是很常见的。\n因为这其中的优化问题很重要，代价也很高，因此研究者们开发了一组专门为此设计的优化技术。\n本章会介绍神经网络训练中的这些优化技术。\n\n<!-- % 267 mid -->\n如果你不熟悉基于梯度优化的基本原则，我们建议回顾\\chap?。\n该章简要概述了一般的数值优化。\n\n\n本章主要关注这一类特定的优化问题：寻找神经网络上的一组参数$\\Vtheta$，它能显著地降低代价函数 $J(\\Vtheta)$，该代价函数通常包括整个训练集上的性能评估和额外的正则化项。\n<!-- % 267 mid -->\n\n\n首先，我们会介绍在机器学习任务中作为训练算法使用的优化与纯优化有哪些不同。\n接下来，我们会介绍导致神经网络优化困难的几个具体挑战。\n然后，我们会介绍几个实用算法，包括优化算法本身和初始化参数的策略。\n更高级的算法能够在训练中自适应调整学习率，或者使用代价函数二阶导数包含的信息。\n最后，我们会介绍几个将简单优化算法结合成高级过程的优化策略，以此作为总结。\n<!-- % 268 head -->\n\n\n\n# 学习和纯优化有什么不同\n\n用于深度模型训练的优化算法与传统的优化算法在几个方面有所不同。\n机器学习通常是间接作用的。\n在大多数机器学习问题中，我们关注某些性能度量$P$，其定义于测试集上并且可能是不可解的。\n因此，我们只是间接地优化$P$。\n我们希望通过降低代价函数 $J(\\Vtheta)$来提高$P$。\n这一点与纯优化不同，纯优化最小化目标$J$本身。\n训练深度模型的优化算法通常也会包括一些针对机器学习目标函数的特定结构进行的特化。\n<!-- % 268 mid -->\n\n\n通常，代价函数可写为训练集上的平均，如\n\\begin{equation}\n    J(\\Vtheta) = \\SetE_{(\\RVx, \\RSy) \\sim\\hat{p}_\\text{data}} L(f(\\Vx ; \\Vtheta), y), % ??\n\\end{equation}\n其中$L$是每个样本的损失函数，$f(\\Vx;\\Vtheta)$是输入$\\Vx$时所预测的输出，$\\hat{p}_{\\text{data}}$是经验分布。\n监督学习中，$y$是目标输出。\n在本章中，我们会介绍不带正则化的监督学习，$L$的变量是$f(\\Vx;\\Vtheta)$和$y$。\n不难将这种监督学习扩展成其他形式，如包括$\\Vtheta$或者$\\Vx$作为参数，或是去掉参数$y$，以发展不同形式的正则化或是无监督学习。\n<!-- % 268 mid -->\n\n\n\\eqn?定义了训练集上的目标函数。\n通常，我们更希望最小化取自\\emph{数据生成分布}\\,$p_{\\text{data}}$的期望，而不仅仅是有限训练集上的对应目标函数：\n\\begin{equation}\n    J^*(\\Vtheta) = \\SetE_{(\\RVx, \\RSy) \\sim p_\\text{data}} L(f(\\Vx ;\\Vtheta),y). % ??\n\\end{equation}\n<!-- % 268 end -->\n\n\n\n## 经验风险最小化\n\n机器学习算法的目标是降低\\eqn?所示的期望泛化误差。\n这个数据量被称为风险。\n在这里，我们强调该期望取自真实的潜在分布$p_{\\text{data}}$。\n如果我们知道了真实分布$p_{\\text{data}}(\\Vx, y)$，那么最小化风险变成了一个可以被优化算法解决的优化问题。\n然而，我们遇到的机器学习问题，通常是不知道$p_\\text{data}(\\Vx, y)$，只知道训练集中的样本。\n<!-- % 269 head -->\n\n\n将机器学习问题转化回一个优化问题的最简单方法是最小化训练集上的期望损失。\n这意味着用训练集上的经验分布\\,$\\hat{p}(\\Vx,y)$替代真实分布$p(\\Vx,y)$。\n现在，我们将最小化经验风险：\n\\begin{equation}\n    \\SetE_{\\RVx, \\RSy \\sim \\hat{p}_\\text{data}} [L(f(\\Vx ; \\Vtheta), y)] % ?? \\RVx\n    = \\frac{1}{m} \\sum_{i=1}^m L( f(\\Vx^{(i)}; \\Vtheta), y^{(i)}) ,\n\\end{equation}\n其中$m$表示训练样本的数目。\n<!-- % 269 mid -->\n\n\n基于最小化这种平均训练误差的训练过程被称为经验风险最小化。\n在这种情况下，机器学习仍然和传统的直接优化很相似。\n我们并不直接最优化风险，而是最优化经验风险，希望也能够很大地降低风险。\n一系列不同的理论构造了一些条件，使得在这些条件下真实风险的期望可以下降不同的量。\n<!-- % 269 mid -->\n\n\n然而，经验风险最小化很容易导致过拟合。\n高容量的模型会简单地记住训练集。\n在很多情况下，经验风险最小化并非真的可行。\n最有效的现代优化算法是基于梯度下降的，但是很多有用的损失函数，如$0-1$损失，没有有效的导数（导数要么为零，要么处处未定义）。\n这两个问题说明，在深度学习中我们很少使用经验风险最小化。\n反之，我们会使用一个稍有不同的方法，我们真正优化的目标会更加不同于我们希望优化的目标。\n<!-- % 269 end -->\n\n\n\n## 代理损失函数和提前终止\n\n<!-- % 269 end -->\n有时，我们真正关心的损失函数（比如分类误差）并不能被高效地优化。\n例如，即使对于线性分类器而言，精确地最小化$0-1$损失通常是不可解的（复杂度是输入维数的指数级别）{cite?}。\n在这种情况下，我们通常会优化代理损失函数。\n代理损失函数作为原目标的代理，还具备一些优点。  \n例如，正确类别的负对数似然通常用作$0-1$损失的替代。\n负对数似然允许模型估计给定样本的类别的条件概率，如果该模型效果好，那么它能够输出期望最小分类误差所对应的类别。\n<!-- % 270 head -->\n\n\n在某些情况下，代理损失函数比原函数学到的更多。\n例如，使用对数似然替代函数时，在训练集上的$0-1$损失达到$0$之后，测试集上的$0-1$损失还能持续下降很长一段时间。\n这是因为即使$0-1$损失期望是零时，我们还能拉开不同类别的距离以改进分类器的鲁棒性，获得一个更强壮的、更值得信赖的分类器，从而，相对于简单地最小化训练集上的平均$0-1$损失，它能够从训练数据中抽取更多信息。\n<!-- % 270 head -->\n\n\n一般的优化和我们用于训练算法的优化有一个重要不同：训练算法通常不会停止在局部极小点。\n反之，机器学习通常优化代理损失函数，但是在基于提前终止（\\sec?）的收敛条件满足时停止。\n通常，提前终止使用真实潜在损失函数，如验证集上的$0-1$损失，并设计为在过拟合发生之前终止。\n与纯优化不同的是，提前终止时代理损失函数仍然有较大的导数，而纯优化终止时导数较小。\n<!-- % 270 mid -->\n\n\n\n## 批量算法和小批量算法\n\n机器学习算法和一般优化算法不同的一点是，机器学习算法的目标函数通常可以分解为训练样本上的求和。\n<!-- %机器学习优化算法通常使用整个代价函数中的一部分项去更新其参数。 -->\n机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。\n<!-- % 270 mid -->\n\n例如，最大似然估计问题可以在对数空间中分解成各个样本的总和：\n\\begin{equation}\n    \\Vtheta_{\\text{ML}} = \\underset{\\Vtheta}{\\argmax} \\sum_{i=1}^m\n    \\log p_{\\text{model}} (\\Vx^{(i)}, y^{(i)}; \\Vtheta) .\n\\end{equation}\n<!-- % 270 mid -->\n\n\n最大化这个总和等价于最大化训练集在经验分布上的期望：\n\\begin{equation}\n    J(\\Vtheta) = \\SetE_{\\RVx, \\RSy \\sim\\hat{p}_\\text{data}} \n    \\log p_{\\text{model}} (\\Vx,y ; \\Vtheta) .\n\\end{equation}\n<!-- %  270 end -->\n\n\n优化算法用到的目标函数$J$中的大多数属性也是训练集上的期望。\n例如，最常用的属性是梯度：\n\\begin{equation}\n    \\nabla_{\\Vtheta} J(\\Vtheta) = \\SetE_{\\RVx, \\RSy \\sim\\hat{p}_{\\text{data}}} \n    \\nabla_{\\Vtheta} \\log p_{\\text{model}} (\\Vx,y; \\Vtheta) .\n\\end{equation}\n<!-- %  271 head -->\n\n\n准确计算这个期望的计算代价非常大，因为我们需要在整个数据集上的每个样本上评估模型。\n在实践中，我们可以从数据集中随机采样少量的样本，然后计算这些样本上的平均值。\n<!-- %  271 head -->\n\n\n回想一下，$n$个样本均值的标准差（\\eqn?）是$\\sigma/\\sqrt{n}$，其中$\\sigma$是样本值真实的标准差。\n分母$\\sqrt{n}$表明使用更多样本来估计梯度的方法的回报是低于线性的。\n比较两个假想的梯度计算，一个基于$100$个样本，另一个基于$10,000$个样本。\n后者需要的计算量是前者的$100$倍，但却只降低了$10$倍的均值标准差。\n如果能够快速地计算出梯度估计值，而不是缓慢地计算准确值，那么大多数优化算法会收敛地更快（就总的计算量而言，而不是指更新次数）。\n<!-- %  271 mid -->\n\n\n另一个促使我们从小数目样本中获得梯度的统计估计的动机是训练集的冗余。\n在最坏的情况下，训练集中所有的$m$个样本都是彼此相同的拷贝。\n基于采样的梯度估计可以使用单个样本计算出正确的梯度，而比原来的做法少花了$m$倍时间。\n实践中，我们不太可能真的遇到这种最坏情况，但我们可能会发现大量样本都对梯度做出了非常相似的贡献。\n\n使用整个训练集的优化算法被称为批量或确定性梯度算法，因为它们会在一个大批量中同时处理所有样本。\n这个术语可能有点令人困惑，因为这个词\"批量\"也经常被用来描述小批量随机梯度下降算法中用到的小批量样本。\n通常，术语\"批量梯度下降\"指使用全部训练集，而术语\"批量\"单独出现时指一组样本。\n例如，我们普遍使用术语\"批量大小\"表示小批量的大小。\n<!-- %  271 mid -->\n\n\n每次只使用单个样本的优化算法有时被称为随机或者在线算法。\n术语\"在线\"通常是指从连续产生样本的数据流中抽取样本的情况，而不是从一个固定大小的训练集中遍历多次采样的情况。\n<!-- %  271 end -->\n\n\n<!-- % 272 head -->\n大多数用于深度学习的算法介于以上两者之间，使用一个以上，而又不是全部的训练样本。\n传统上，这些会被称为小批量或小批量随机, %小批方法 ，现在通常将它们简单地称为随机方法。\n\n\n随机方法的典型示例是随机梯度下降，这将在\\sec?中详细描述。\n<!-- % 272 mid -->\n\n小批量的大小通常由以下几个因素决定：\n\n+ 更大的批量会计算更精确的梯度估计，但是回报却是小于线性的。\n    \n+ 极小批量通常难以充分利用多核架构。\n    这促使我们使用一些绝对最小批量，低于这个值的小批量处理不会减少计算时间。\n    \n+ 如果批量处理中的所有样本可以并行地处理（通常确是如此），那么内存消耗和批量大小会正比。\n    对于很多硬件设施，这是批量大小的限制因素。\n    \n+ 在某些硬件上使用特定大小的数组时，运行时间会更少。\n    尤其是在使用\\,GPU\\,时，通常使用$2$的幂数作为批量大小可以获得更少的运行时间。\n    一般，$2$的幂数的取值范围是$32$到$256$，$16$有时在尝试大模型时使用。\n<!-- % 272 mid     -->\n+ \n    可能是由于小批量在学习过程中加入了噪声，它们会有一些正则化效果~{cite?}。\n    泛化误差通常在批量大小为$1$时最好。\n    因为梯度估计的高方差，小批量训练需要较小的学习率以保持稳定性。\n    因为降低的学习率和消耗更多步骤来遍历整个训练集都会产生更多的步骤，所以会导致总的运行时间非常大。\n\n<!-- % 272 mid -->\n\n\n不同的算法使用不同的方法从小批量中获取不同的信息。\n有些算法对采样误差比其他算法更敏感，这通常有两个可能原因。\n一个是它们使用了很难在少量样本上精确估计的信息，另一个是它们以放大采样误差的方式使用了信息。\n仅基于梯度$\\Vg$的更新方法通常相对鲁棒，并能使用较小的批量获得成功，如$100$。\n使用Hessian矩阵$\\MH$，计算如$\\MH^{-1}\\Vg$更新的二阶方法通常需要更大的批量，如$10,000$。\n这些大批量需要最小化估计$\\MH^{-1}\\Vg$的波动。\n假设$\\MH$被精确估计，但是有病态条件数。\n乘以$\\MH$或是其逆会放大之前存在的误差（这个示例中是指$\\Vg$的估计误差）。\n即使$\\MH$被精确估计，$\\Vg$中非常小的变化也会导致更新值$\\MH^{-1}\\Vg$中非常大的变化。\n当然，我们通常只会近似地估计$\\MH$，因此相对于我们使用具有较差条件的操作去估计$\\Vg$，更新$\\MH^{-1}\\Vg$会含有更多的误差。\n<!-- % 273 head -->\n\n<!-- % 273 head -->\n小批量是随机抽取的这点也很重要。\n从一组样本中计算出梯度期望的无偏估计要求这些样本是独立的。\n我们也希望两个连续的梯度估计是互相独立的，因此两个连续的小批量样本也应该是彼此独立的。\n很多现实的数据集自然排列，从而使得连续的样本之间具有高度相关性。\n例如，假设我们有一个很长的血液样本测试结果清单。\n清单上的数据有可能是这样获取的，头五个血液样本于不同时间段取自第一个病人，接下来三个血液样本取自第二个病人，再随后的血液样本取自第三个病人，等等。\n如果我们从这个清单上顺序抽取样本，那么我们的每个小批量数据的偏差都很大，因为这个小批量很可能只代表着数据集上众多患者中的某一个患者。\n在这种数据集中的顺序有很大影响的情况下，很有必要在抽取小批量样本前打乱样本顺序。\n对于非常大的数据集，如数据中心含有几十亿样本的数据集，我们每次构建小批量样本时都将样本完全均匀地抽取出来是不太现实的。\n幸运的是，实践中通常将样本顺序打乱一次，然后按照这个顺序存储起来就足够了。\n之后训练模型时会用到的一组组小批量连续样本是固定的，每个独立的模型每次遍历训练数据时都会重复使用这个顺序。\n然而，这种偏离真实随机采样的方法并没有很严重的有害影响。\n不以某种方式打乱样本顺序才会极大地降低算法的性能。\n<!-- % 273 mid -->\n\n\n很多机器学习上的优化问题都可以分解成并行地计算不同样本上单独的更新。\n换言之，我们在计算小批量样本$\\MX$上最小化$J(\\MX)$的更新时，同时可以计算其他小批量样本上的更新。\n这类异步并行分布式方法将在\\sec?中进一步讨论。\n<!-- % 273 end -->\n\n\n小批量随机梯度下降的一个有趣动机是，只要没有重复使用样本，\n它将遵循着真实\\emph{泛化误差}（\\eqn?）的梯度。\n很多小批量随机梯度下降方法的实现都会打乱数据顺序一次，然后多次遍历数据来更新参数。\n第一次遍历时，每个小批量样本都用来计算真实泛化误差的无偏估计。\n第二次遍历时，估计将会是有偏的，因为它重新抽取了已经用过的样本，而不是从和原先样本相同的数据生成分布中获取新的无偏的样本。\n<!-- %  274 head -->\n\n\n我们不难从在线学习的情况中看出随机梯度下降最小化泛化误差的原因。\n这时样本或者小批量都是从数据流中抽取出来的。\n换言之，学习器好像是一个每次看到新样本的人，\n每个样本$(\\Vx,y)$都来自数据生成分布~$p_{\\text{data}}(\\Vx,y)$，而不是使用大小固定的训练集。\n这种情况下，样本永远不会重复；每次更新的样本是从分布$p_\\text{data}$中采样获得的无偏样本。\n<!-- %  274 mid -->\n\n\n在$\\Vx$和$y$是离散时，以上的等价性很容易得到。\n在这种情况下，泛化误差（\\eqn?）可以表示为\n\\begin{equation}\n    J^*(\\Vtheta) = \\sum_{\\Vx} \\sum_y p_{\\text{data}}(\\Vx, y) L(f(\\Vx; \\Vtheta),y),\n\\end{equation}\n上式的准确梯度为\n\\begin{equation}\n    \\Vg = \\nabla_{\\Vtheta} J^*(\\Vtheta) = \\sum_{\\Vx} \\sum_y p_{\\text{data}}\n    (\\Vx, y) \\nabla_{\\Vtheta} L(f(\\Vx;\\Vtheta),y) .\n\\end{equation}\n在\\eqn?和\\eqn?中，我们已经在对数似然中看到了相同的结果；现在我们发现这一点在包括似然的其他函数$L$上也是成立的。\n在一些关于$p_\\text{data}$和$L$的温和假设下，在$\\Vx$和$y$是连续时也能得到类似的结果。\n<!-- %  274 mid -->\n\n\n因此，我们可以从数据生成分布~$p_\\text{data}$抽取小批量样本$\\{ \\Vx^{(1)}, \\dots,\\Vx^{(m)} \\}$以及对应的目标$y^{(i)}$，然后计算该小批量上损失函数关于对应参数的梯度\n\\begin{equation}\n    \\hat{\\Vg} = \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),y^{(i)} ).\n\\end{equation}\n以此获得泛化误差准确梯度的无偏估计。\n最后，在泛化误差上使用\\,SGD\\,方法在方向$\\hat{\\Vg}$上更新$\\Vtheta$。\n<!-- %  274 end -->\n\n\n当然，这个解释只能用于样本没有重复使用的情况。\n然而，除非训练集特别大，通常最好是多次遍历训练集。\n当多次遍历数据集更新时，只有第一遍满足泛化误差梯度的无偏估计。\n但是，额外的遍历更新当然会由于减小训练误差而得到足够的好处，以抵消其带来的训练误差和测试误差间差距的增加。\n<!-- % -- 275 head -->\n\n\n随着数据集的规模迅速增长，超越了计算能力的增速，\n机器学习应用每个样本只使用一次的情况变得越来越常见，甚至是不完整地使用训练集。\n在使用一个非常大的训练集时，过拟合不再是问题，而欠拟合和计算效率变成了主要的顾虑。\n读者也可以参考~{bottou-bousquet-2008}中关于训练样本数目增长时，泛化误差上计算瓶颈影响的讨论。\n<!-- % -- 275 mid -->\n\n\n\n# 神经网络优化中的挑战\n\n优化通常是一个极其困难的任务。\n传统的机器学习会小心设计目标函数和约束，以确保优化问题是凸的，\n从而避免一般优化问题的复杂度。\n在训练神经网络时，我们肯定会遇到一般的非凸情况。\n即使是凸优化，也并非没有任何问题。\n在这一节中，我们会总结几个训练深度模型时会涉及到的主要挑战。\n<!-- % -- 275 mid -->\n\n\n\n## 病态\n\n在优化凸函数时，会遇到一些挑战。\n这其中最突出的是\\,Hessian\\,矩阵$\\MH$的病态。\n这是数值优化、凸优化或其他形式的优化中普遍存在的问题，更多细节请回顾\\sec?。\n<!-- % -- 275 mid -->\n\n病态问题一般被认为存在于神经网络训练过程中。\n病态体现在随机梯度下降会\"卡\"在某些情况，此时即使很小的更新步长也会增加代价函数。\n<!-- % -- 275 mid -->\n\n回顾\\eqn?，代价函数的二阶泰勒级数展开预测梯度下降中的$-\\epsilon\\Vg$会增加\n\\begin{equation}\n    \\frac{1}{2} \\epsilon^2 \\Vg^\\top \\MH\\Vg - \\epsilon\\Vg^\\top\\Vg\n\\end{equation}\n到代价中。\n当$\\frac{1}{2} \\epsilon^2 \\Vg^\\top\\MH\\Vg$超过$\\epsilon\\Vg^\\top\\Vg$时，梯度的病态会成为问题。\n我们可以通过监测平方梯度范数$\\Vg^\\top\\Vg$和$\\Vg^\\top \\MH\\Vg$，来判断病态是否不利于神经网络训练任务。\n在很多情况中，梯度范数不会在训练过程中显著缩小，但是$\\Vg^\\top\\MH\\Vg$的增长会超过一个数量级。\n其结果是尽管梯度很强，学习会变得非常缓慢，因为学习率必须收缩以弥补更强的曲率。\n如\\fig?所示，成功训练的神经网络中，梯度显著增加。\n<!-- % -- 276 head -->\n\n<!-- % -- 276 end -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/grad_norm_increases_color}}\n\\fi\n\\caption{梯度下降通常不会到达任何类型的临界点。\n此示例中，在用于对象检测的卷积网络的整个训练期间， 梯度范数持续增加。\n\\emph{(左)}各个梯度计算的范数如何随时间分布的散点图。\n为了方便作图，每轮仅绘制一个梯度范数。 \n我们将所有梯度范数的移动平均绘制为实曲线。\n梯度范数明显随时间增加，而不是如我们所期望的那样随训练过程收敛到临界点而减小。\n\\emph{(右)}尽管梯度递增，训练过程却相当成功。 \n验证集上的分类误差可以降低到较低水平。\n}\n\\end{figure}\n<!-- % -- 276 end -->\n\n\n<!-- % -- 276 mid -->\n尽管病态还存在于除了神经网络训练的其他情况中，有些适用于其他情况的解决病态的技术并不适用于神经网络。\n例如，牛顿法在解决带有病态条件的\\,Hessian\\,矩阵的凸优化问题时，是一个非常优秀的工具，\n但是我们将会在以下小节中说明牛顿法运用到神经网络时需要很大的改动。\n\n\n<!-- % -- 276 mid -->\n\n## 局部极小值\n\n凸优化问题的一个突出特点是其可以简化为寻找一个局部极小点的问题。\n任何一个局部极小点都是全局最小点。\n有些凸函数的底部是一个平坦的区域，而不是单一的全局最小点，但该平坦区域中的任意点都是一个可以接受的解。\n优化一个凸问题时，若发现了任何形式的临界点，我们都会知道已经找到了一个不错的可行解。\n<!-- % -- 277 head -->\n\n\n对于非凸函数时，如神经网络，有可能会存在多个局部极小值。\n事实上，几乎所有的深度模型基本上都会有非常多的局部极小值。\n然而，我们会发现这并不是主要问题。\n<!-- % -- 277 mid -->\n\n\n由于模型可辨识性问题，神经网络和任意具有多个等效参数化潜变量的模型都会具有多个局部极小值。\n如果一个足够大的训练集可以唯一确定一组模型参数，那么该模型被称为可辨认的。\n带有潜变量的模型通常是不可辨认的，因为通过相互交换潜变量我们能得到等价的模型。\n例如，考虑神经网络的第一层，我们可以交换单元$i$和单元$j$的传入权重向量、传出权重向量而得到等价的模型。\n如果神经网络有$m$层，每层有$n$个单元，那么会有$n!^m$种排列隐藏单元的方式。\n这种不可辨认性被称为权重空间对称性。\n<!-- % -- 277 mid -->\n\n\n除了权重空间对称性，很多神经网络还有其他导致不可辨认的原因。\n例如，在任意整流线性网络或者~maxout~网络中，\n我们可以将传入权重和偏置放缩$\\alpha$倍，然后将传出权重放缩$\\frac{1}{\\alpha}$倍，而保持模型等价。\n这意味着，如果代价函数不包括如权重衰减这种直接依赖于权重而非模型输出的项，那么整流线性网络或者~maxout~网络的每一个局部极小点都在等价的局部极小值的$(m\\times n)$维双曲线上。\n<!-- % -- 277 mid -->\n\n\n这些模型可辨识性问题意味着神经网络代价函数具有非常多、甚至不可数无限多的局部极小值。\n然而，所有这些由于不可辨识性问题而产生的局部极小值都有相同的代价函数值。\n因此，这些局部极小值并非是非凸所带来的问题。\n<!-- % -- 277 mid -->\n\n\n如果局部极小值相比全局最小点拥有很大的代价，局部极小值会带来很大的隐患。\n我们可以构建没有隐藏单元的小规模神经网络，其局部极小值的代价比全局最小点的代价大很多~{cite?}。\n如果具有很大代价的局部极小值是常见的，那么这将给基于梯度的优化算法带来极大的问题。\n<!-- % -- 277 end -->\n\n\n对于实际中感兴趣的网络，是否存在大量代价很高的局部极小值，优化算法是否会碰到这些局部极小值，都是尚未解决的公开问题。\n多年来，大多数从业者认为局部极小值是困扰神经网络优化的常见问题。\n如今，情况有所变化。\n这个问题仍然是学术界的热点问题，但是学者们现在猜想，对于足够大的神经网络而言，\n大部分局部极小值都具有很小的代价函数，我们能不能找到真正的全局最小点并不重要，而是需要在参数空间中找到一个代价很小（但不是最小）的点~{cite?}。\n<!-- % 278 head -->\n\n很多从业者将神经网络优化中的所有困难都归结于局部极小值。\n我们鼓励从业者要仔细分析特定的问题。\n一种能够排除局部极小值是主要问题的检测方法是画出梯度范数随时间的变化。\n如果梯度范数没有缩小到一个微小的值，那么该问题既不是局部极小值，也不是其他形式的临界点。\n<!-- %这种消极的测试可以排除局部极小值是造成问题的原因。 -->\n在高维空间中，很难明确证明局部极小值是导致问题的原因。\n许多并非局部极小值的结构也具有很小的梯度。\n<!-- % 278 mid -->\n\n\n## 高原、鞍点和其他平坦区域\n\n对于很多高维非凸函数而言，局部极小值（以及极大值）事实上都远少于另一类梯度为零的点：鞍点。\n鞍点附近的某些点比鞍点有更大的代价，而其他点则有更小的代价。\n在鞍点处，Hessian\\,矩阵同时具有正负特征值。\n位于正特征值对应的特征向量方向的点比鞍点有更大的代价，反之，位于负特征值对应的特征向量方向的点有更小的代价。\n我们可以将鞍点视为代价函数某个横截面上的局部极小点，同时也可以视为代价函数某个横截面上的局部极大点。\n\\fig?\\,给了一个示例。\n<!-- % 278 mid -->\n\n\n多类随机函数表现出以下性质：低维空间中，局部极小值很普遍。\n在更高维空间中，局部极小值很罕见，而鞍点则很常见。\n对于这类函数$f:\\SetR^n \\to \\SetR$而言，鞍点和局部极小值的数目比率的期望随$n$指数级增长。\n我们可以从直觉上理解这种现象——Hessian\\,矩阵在局部极小点处只有正特征值。\n而在鞍点处，Hessian\\,矩阵则同时具有正负特征值。\n试想一下，每个特征值的正负号由抛硬币决定。\n在一维情况下，很容易抛硬币得到正面朝上一次而获取局部极小点。\n在$n$-维空间中，要抛掷$n$次硬币都正面朝上的难度是指数级的。 \n具体可以参考~{Dauphin-et-al-NIPS2014-small}，它回顾了相关的理论工作。\n<!-- % -- 278 end -->\n\n\n很多随机函数一个惊人性质是，当我们到达代价较低的区间时，Hessian\\,矩阵的特征值为正的可能性更大。\n和抛硬币类比，这意味着如果我们处于低代价的临界点时，抛掷硬币正面朝上$n$次的概率更大。\n这也意味着，局部极小值具有低代价的可能性比高代价要大得多。\n具有高代价的临界点更有可能是鞍点。\n具有极高代价的临界点就很可能是局部极大值了。\n<!-- % -- 279 head -->\n\n\n以上现象出现在许多种类的随机函数中。\n那么是否在神经网络中也有发生呢？\n{Baldi89}从理论上证明，不具非线性的浅层自编码器（\\chap?中将介绍的一种将输出训练为输入拷贝的前馈网络）只有全局极小值和鞍点，没有代价比全局极小值更大的局部极小值。\n他们还发现这些结果能够扩展到不具非线性的更深的网络上，不过没有证明。\n这类网络的输出是其输入的线性函数，但它们仍然有助于分析非线性神经网络模型，因为它们的损失函数是关于参数的非凸函数。\n这类网络本质上是多个矩阵组合在一起。\n{Saxe-et-al-ICLR13}精确解析了这类网络中完整的学习动态，表明这些模型的学习能够捕捉到许多在训练具有非线性激活函数的深度模型时观察到的定性特征。\n{Dauphin-et-al-NIPS2014-small}通过实验表明，真实的神经网络也存在包含很多高代价鞍点的损失函数。\n{Choromanska-et-al-AISTATS2015}提供了额外的理论论点，表明另一类和神经网络相关的高维随机函数也满足这种情况。\n\n<!-- % -- 279 mid -->\n\n鞍点激增对于训练算法来说有哪些影响呢？\n对于只使用梯度信息的一阶优化算法而言，目前情况还不清楚。\n鞍点附近的梯度通常会非常小。\n另一方面，实验中梯度下降似乎可以在许多情况下逃离鞍点。\n{GoodfellowOptimization15}可视化了最新神经网络的几个学习轨迹，\\fig?\\,给了一个例子。\n这些可视化显示，在突出的鞍点附近，代价函数都是平坦的，权重都为零。\n但是他们也展示了梯度下降轨迹能够迅速逸出该区间。\n{GoodfellowOptimization15}也主张，应该可以通过分析来表明连续时间的梯度下降会逃离而不是吸引到鞍点，但对梯度下降更现实的使用场景来说，情况或许会有所不同。\n\n<!-- % -- 279 mid -->\n\n<!-- % 280 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/plot_atmu_relu_5}}\n\\fi\n\\caption{神经网络代价函数的可视化。\n这些可视化对应用于真实对象识别和自然语言处理任务的前馈神经网络、卷积网络和循环网络而言是类似的。\n令人惊讶的是，这些可视化通常不会显示出很多明显的障碍。\n大约2012年，在随机梯度下降开始成功训练非常大的模型之前，相比这些投影所显示的神经网络代价函数的表面通常被认为有更多的非凸结构。\n该投影所显示的主要障碍是初始参数附近的高代价鞍点，但如由蓝色路径所示，SGD\\,训练轨迹能轻易地逃脱该鞍点。\n大多数训练时间花费在横穿代价函数中相对平坦的峡谷，可能由于梯度中的高噪声、或该区域中~Hessian~矩阵的病态条件，或者需要经过间接的弧路径绕过图中可见的高\"山\" 。\n图经~{GoodfellowOptimization15}许可改编。\n}\n\\end{figure}\n<!-- % 280 head -->\n\n\n<!-- % -- 279 end -->\n对于牛顿法而言，鞍点显然是一个问题。\n梯度下降旨在朝\"下坡\"移动，而非明确寻求临界点。\n而牛顿法的目标是寻求梯度为零的点。\n如果没有适当的修改，牛顿法就会跳进一个鞍点。\n高维空间中鞍点的激增或许解释了在神经网络训练中为什么二阶方法无法成功取代梯度下降。\n{Dauphin-et-al-NIPS2014-small}介绍了二阶优化的无鞍牛顿法，并表明和传统算法相比有显著改进。\n二阶方法仍然难以扩展到大型神经网络，但是如果这类无鞍算法能够扩展的话，还是很有希望的。\n<!-- % -- 280 mid -->\n\n\n除了极小值和鞍点，还存在其他梯度为零的点。\n例如从优化的角度看与鞍点很相似的极大值，很多算法不会被吸引到极大值，除了未经修改的牛顿法。\n和极小值一样，许多种类的随机函数的极大值在高维空间中也是指数级稀少。\n<!-- % -- 280 mid -->\n\n\n也可能存在恒值的、宽且平坦的区域。\n在这些区域，梯度和\\,Hessian\\,矩阵都是零。\n这种退化的情形是所有数值优化算法的主要问题。\n在凸问题中，一个宽而平坦的区间肯定包含全局极小值，但是对于一般的优化问题而言，\n这样的区域可能会对应着目标函数中一个较高的值。\n<!-- % -- 280 end -->\n\n\n\n## 悬崖和梯度爆炸\n\n<!-- % 281 head -->\n多层神经网络通常存在像悬崖一样的斜率较大区域，如\\fig?所示。\n这是由于几个较大的权重相乘导致的。\n遇到斜率极大的悬崖结构时，梯度更新会很大程度地改变参数值，通常会完全跳过这类悬崖结构。\n<!-- % 281 head -->\n\n\n<!-- % 281 end -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/cliff_color}}\n\\fi\n\\caption{高度非线性的深度神经网络或循环神经网络的目标函数通常包含由几个参数连乘而导致的参数空间中尖锐非线性。\n这些非线性在某些区域会产生非常大的导数。\n当参数接近这样的悬崖区域时，梯度下降更新可以使参数弹射得非常远，可能会使大量已完成的优化工作成为无用功。\n图经 {Pascanu+al-ICML2013-small}许可改编。}\n\\end{figure}\n<!-- % 281 end -->\n\n\n不管我们是从上还是从下接近悬崖，情况都很糟糕，但幸运的是我们可以用使用\\sec?介绍的启发式梯度截断来避免其严重的后果。\n其基本想法源自梯度并没有指明最佳步长，只说明了在无限小区域内的最佳方向。\n当传统的梯度下降算法提议更新很大一步时，启发式梯度截断会干涉来减小步长，从而使其不太可能走出梯度近似为最陡下降方向的悬崖区域。\n悬崖结构在循环神经网络的代价函数中很常见，因为这类模型会涉及到多个因子的相乘，其中每个因子对应一个时间步。\n因此，长期时间序列会产生大量相乘。\n<!-- % 281 mid -->\n\n\n<!-- % 281 end -->\n\n## 长期依赖\n\n当计算图变得极深时，神经网络优化算法会面临的另外一个难题就是长期依赖问题——由于变深的结构使模型丧失了学习到先前信息的能力，让优化变得极其困难。 \n深层的计算图不仅存在于前馈网络，还存在于之后介绍的循环网络中（在\\chap?中描述）。\n因为循环网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图，并且模型参数共享，这使问题更加凸显。\n\n<!-- % 282 head -->\n\n例如，假设某个计算图中包含一条反复与矩阵$\\MW$相乘的路径。\n那么$t$步后，相当于乘以$\\MW^t$。\n假设$\\MW$有特征值分解$\\MW = \\MV \\text{diag}(\\Vlambda) \\MV^{-1}$。\n在这种简单的情况下，很容易看出\n\\begin{equation}\n  \\MW^t = (\\MV \\text{diag}(\\Vlambda) \\MV^{-1})^t = \\MV\\text{diag}(\\Vlambda)^t  \\MV^{-1}.\n\\end{equation}\n当特征值$\\lambda_i$不在$1$附近时，若在量级上大于$1$则会爆炸；若小于$1$时则会消失。\n梯度消失与爆炸问题是指该计算图上的梯度也会因为$\\text{diag}(\\Vlambda)^t$大幅度变化。\n梯度消失使得我们难以知道参数朝哪个方向移动能够改进代价函数，而梯度爆炸会使得学习不稳定。\n之前描述的促使我们使用梯度截断的悬崖结构便是梯度爆炸现象的一个例子。\n\n<!-- % 282 mid -->\n\n此处描述的在各时间步重复与$\\MW$相乘非常类似于寻求矩阵$\\MW$的最大特征值及对应特征向量的幂方法。\n从这个观点来看，$\\Vx^\\top\\MW^t$最终会丢弃$\\Vx$中所有与$\\MW$的主特征向量正交的成分。\n\n<!-- % 282 mid -->\n\n循环网络在各时间步上使用相同的矩阵$\\MW$，而前馈网络并没有。\n所以即使使用非常深层的前馈网络，也能很大程度上有效地避免梯度消失与爆炸问题~{cite?}。\n\n<!-- % 282 mid -->\n\n在更详细地描述循环网络之后，我们将会在\\sec?进一步讨论循环网络训练中的挑战。\n\n<!-- % 282 mid -->\n\n\n## 非精确梯度\n\n大多数优化算法的先决条件都是我们知道精确的梯度或是\\,Hessian\\,矩阵。\n在实践中，通常这些量会有噪声，甚至是有偏的估计。\n几乎每一个深度学习算法都需要基于采样的估计，至少使用训练样本的小批量来计算梯度。\n\n<!-- % 282 end -->\n\n在其他情况，我们希望最小化的目标函数实际上是难以处理的。\n当目标函数不可解时，通常其梯度也是难以处理的。\n在这种情况下，我们只能近似梯度。\n这些问题主要出现在第三部分中更高级的模型中。\n例如，对比散度是用来近似玻尔兹曼机中难以处理的对数似然梯度的一种技术。\n\n<!-- % 283 head -->\n\n各种神经网络优化算法的设计都考虑到了梯度估计的缺陷。\n我们可以选择比真实损失函数更容易估计的代理损失函数来避免这个问题。\n\n<!-- % 283 mid -->\n\n\n## 局部和全局结构间的弱对应\n\n迄今为止，我们讨论的许多问题都是关于损失函数在单个点的性质——若$J(\\Vtheta)$是当前点$\\Vtheta$的病态条件，或者$\\Vtheta$在悬崖中，或者$\\Vtheta$是一个下降方向不明显的鞍点，那么会很难更新当前步。\n\n<!-- % 283 mid -->\n\n如果该方向在局部改进很大，但并没有指向代价低得多的遥远区域，那么我们有可能在单点处克服以上所有困难，但仍然表现不佳。\n\n<!-- % 283 mid -->\n\n{GoodfellowOptimization15}认为大部分训练的运行时间取决于到达解决方案的轨迹长度。 \n如\\fig?所示，学习轨迹将花费大量的时间探寻一个围绕山形结构的宽弧。\n\n<!-- % 283 mid -->\n\n大多数优化研究的难点集中于训练是否找到了全局最小点、局部极小点或是鞍点，但在实践中神经网络不会到达任何一种临界点。\n\\fig?表明神经网络通常不会到达梯度很小的区域。\n甚至，这些临界点不一定存在。\n例如，损失函数 $-\\log p(y\\mid\\Vx;\\Vtheta)$ 可以没有全局最小点，而是当随着训练模型逐渐稳定后，渐近地收敛于某个值。    \n对于具有离散的$y$和~softmax~分布$p(y\\mid\\Vx)$的分类器而言，若模型能够正确分类训练集上的每个样本，则负对数似然可以无限趋近但不会等于零。\n同样地，实值模型$p(y\\mid\\Vx) = \\mathcal{N}(y;f(\\Vtheta),\\beta^{-1})$的负对数似然会趋向于负无穷——如果$f(\\Vtheta)$能够正确预测所有训练集中的目标$y$，学习算法会无限制地增加$\\beta$。\n\\fig?给出了一个失败的例子，即使没有局部极小值和鞍点，该例还是不能从局部优化中找到一个良好的代价函数值。\n\n<!-- % 283 end -->\n\n<!-- % 284 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/bad_global_color}}\n\\fi\n\\caption{如果局部表面没有指向全局解，基于局部下坡移动的优化可能就会失败。\n这里我们提供一个例子，说明即使在没有鞍点或局部极小值的情况下，优化过程会如何失败。\n此例中的代价函数仅包含朝向低值而不是极小值的渐近线。\n在这种情况下，造成这种困难的主要原因是初始化在\"山\"的错误一侧，并且无法遍历。\n在高维空间中，学习算法通常可以环绕过这样的高山，但是相关的轨迹可能会很长，并且导致过长的训练时间，如\\fig?所示。\n}\n\\end{figure}\n\n<!-- % 284 head -->\n\n未来的研究需要进一步探索影响学习轨迹长度和更好地表征训练过程的结果。\n\n<!-- % 284 mid -->\n\n许多现有研究方法在求解具有困难全局结构的问题时，旨在寻求良好的初始点，而不是开发非局部范围更新的算法。\n\n<!-- % 284 mid -->\n\n梯度下降和基本上所有的可以有效训练神经网络的学习算法，都是基于局部较小更新。\n之前的小节主要集中于为何这些局部范围更新的正确方向难以计算。\n我们也许能计算目标函数的一些性质，如近似的有偏梯度或正确方向估计的方差。\n在这些情况下，难以确定局部下降能否定义通向有效解的足够短的路径，但我们并不能真的遵循局部下降的路径。\n目标函数可能有诸如病态条件或不连续梯度的问题，使得梯度为目标函数提供较好近似的区间非常小。\n在这些情况下，步长为$\\epsilon$的局部下降可能定义了到达解的合理的短路经，但是我们只能计算步长为$\\delta \\ll \\epsilon$的局部下降方向。\n在这些情况下，局部下降或许能定义通向解的路径，但是该路径包含很多次更新，因此遵循该路径会带来很高的计算代价。\n有时，比如说当目标函数有一个宽而平的区域，或是我们试图寻求精确的临界点（通常来说后一种情况只发生于显式求解临界点的方法，如牛顿法）时，局部信息不能为我们提供任何指导。\n在这些情况下，局部下降完全无法定义通向解的路径。\n在其他情况下，局部移动可能太过贪心，朝着下坡方向移动，却和所有可行解南辕北辙，如\\fig?所示，或者是用舍近求远的方法来求解问题，如\\fig?所示。\n目前，我们还不了解这些问题中的哪一个与神经网络优化中的难点最相关，这是研究领域的热点方向。\n\n<!-- % 285 head -->\n\n不管哪个问题最重要，如果存在一个区域，我们遵循局部下降便能合理地直接到达某个解，并且我们能够在该良好区域上初始化学习，那么这些问题都可以避免。\n最终的观点还是建议在传统优化算法上研究怎样选择更佳的初始化点，以此来实现目标更切实可行。\n\n<!-- % 285 mid -->\n\n\n## 优化的理论限制\n\n一些理论结果表明，我们为神经网络设计的任何优化算法都有性能限制{cite?}。\n通常这些结果不影响神经网络在实践中的应用。\n\n<!-- % 285 mid -->\n\n一些理论结果仅适用于神经网络的单元输出离散值的情况。\n然而，大多数神经网络单元输出光滑的连续值，使得局部搜索求解优化可行。\n一些理论结果表明，存在某类问题是不可解的，但很难判断一个特定问题是否属于该类。\n其他结果表明，寻找给定规模的网络的一个可行解是很困难的，\n但在实际情况中，我们通过设置更多参数，使用更大的网络，能轻松找到可接受的解。\n此外，在神经网络训练中，我们通常不关注某个函数的精确极小点，而只关注将其值下降到足够小以获得一个良好的泛化误差。\n对优化算法是否能完成此目标进行理论分析是非常困难的。\n因此，研究优化算法更现实的性能上界仍然是学术界的一个重要目标。\n\n<!-- % 285 end -->\n\n<!-- % 286 head -->\n\n\n# 基本算法\n\n之前我们已经介绍了梯度下降（\\sec?），即沿着整个训练集的梯度方向下降。\n这可以使用随机梯度下降很大程度地加速，沿着随机挑选的小批量数据的梯度下降方向，就像\\sec?和\\sec?中讨论的一样。\n\n<!-- % 286 head -->\n\n\n## 随机梯度下降\n\n随机梯度下降及其变种很可能是一般机器学习中应用最多的优化算法，特别是在深度学习中。\n如\\sec?中所讨论的，按照数据生成分布抽取$m$个小批量（独立同分布的）样本，通过计算它们梯度均值，我们可以得到梯度的无偏估计。\n\n<!-- % 286 mid -->\n\n\\alg?展示了如何沿着这个梯度的估计下降。\n\n<!-- % 286 mid -->\n\n<!-- % 286 end -->\n\n\\begin{algorithm}[ht]\n\\caption{随机梯度下降（SGD）在第$k$个训练迭代的更新}\n\\begin{algorithmic}\n\\REQUIRE 学习率 $\\epsilon_k$\n\\REQUIRE 初始参数$\\Vtheta$\n\\WHILE{停止准则未满足}\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，其中$\\Vx^{(i)}$对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度估计： $\\hat{\\Vg} \\leftarrow + \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta - \\epsilon \\hat{\\Vg}$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n<!-- % 286 end -->\n\n<!-- % 286 mid -->\n\nSGD\\,算法中的一个关键参数是学习率。\n之前，我们介绍的\\,SGD\\,使用固定的学习率。\n在实践中，有必要随着时间的推移逐渐降低学习率，因此我们将第$k$步迭代的学习率记作$\\epsilon_k$。\n\n<!-- % 286 mid -->\n\n这是因为\\,SGD\\,中梯度估计引入的噪声源（$m$个训练样本的随机采样）并不会在极小点处消失。\n相比之下，当我们使用批量梯度下降到达极小点时，整个代价函数的真实梯度会变得很小，之后为$\\mathbf{0}$，因此批量梯度下降可以使用固定的学习率。\n保证\\,SGD\\,收敛的一个充分条件是\n\\begin{equation}\n    \\sum_{k=1}^\\infty \\epsilon_k = \\infty,\n\\end{equation}\n且\n\\begin{equation}\n    \\sum_{k=1}^\\infty \\epsilon_k^2 < \\infty.\n\\end{equation}\n\n<!-- % 287 head -->\n\n实践中，一般会线性衰减学习率直到第$\\tau$次迭代：\n\\begin{equation}\n    \\epsilon_k = (1-\\alpha) \\epsilon_0 + \\alpha \\epsilon_\\tau\n\\end{equation}\n其中$\\alpha = \\frac{k}{\\tau}$。\n在$\\tau$步迭代之后，一般使$\\epsilon$保持常数。\n\n<!-- % 287 mid -->\n\n学习率可通过试验和误差来选取，通常最好的选择方法是监测目标函数值随时间变化的学习曲线。\n与其说是科学，这更像是一门艺术，我们应该谨慎地参考关于这个问题的大部分指导。\n使用线性策略时，需要选择的参数为$\\epsilon_0$，$\\epsilon_\\tau$，$\\tau$。  \n通常$\\tau$被设为需要反复遍历训练集几百次的迭代次数。\n通常$\\epsilon_\\tau$应设为大约$\\epsilon_0$的$1\\%$。\n主要问题是如何设置$\\epsilon_0$。\n若$\\epsilon_0$太大，学习曲线将会剧烈振荡，代价函数值通常会明显增加。\n温和的振荡是良好的，容易在训练随机代价函数（例如使用\\,Dropout\\,的代价函数）时出现。\n如果学习率太小，那么学习过程会很缓慢。\n如果初始学习率太低，那么学习可能会卡在一个相当高的代价值。\n通常，就总训练时间和最终代价值而言，最优初始学习率会高于大约迭代$100$次左右后达到最佳效果的学习率。\n因此，通常最好是检测最早的几轮迭代，选择一个比在效果上表现最佳的学习率更大的学习率，但又不能太大导致严重的震荡。  \n\n<!-- % 287 mid -->\n\nSGD\\,及相关的小批量亦或更广义的基于梯度优化的在线学习算法，一个重要的性质是每一步更新的计算时间不依赖训练样本数目的多寡。\n即使训练样本数目非常大时，它们也能收敛。\n对于足够大的数据集，SGD\\,可能会在处理整个训练集之前就收敛到最终测试集误差的某个固定容差范围内。\n\n<!-- % 287 mid -->\n\n<!-- % 287 end -->\n\n研究优化算法的收敛率，一般会衡量额外误差 $J(\\Vtheta) - \\min_{\\Vtheta} J(\\Vtheta)$，即当前代价函数超出最低可能代价的量。\nSGD\\,应用于凸问题时，$k$步迭代后的额外误差量级是$O(\\frac{1}{\\sqrt{k}})$，在强凸情况下是$O(\\frac{1}{k})$。\n除非假定额外的条件，否则这些界限不能进一步改进。\n批量梯度下降在理论上比随机梯度下降有更好的收敛率。\n然而，Cram\\'er-Rao界限~{cite?}指出，泛化误差的下降速度不会快于$O(\\frac{1}{k})$。\n{bottou-bousquet-2008-small}因此认为对于机器学习任务，不值得探寻收敛快于$O(\\frac{1}{k})$的优化算法——更快的收敛可能对应着过拟合。\n此外，渐近分析掩盖了随机梯度下降在少量更新步之后的很多优点。\n对于大数据集，SGD\\,只需非常少量样本计算梯度从而实现初始快速更新，远远超过了其缓慢的渐近收敛。\n本章剩余部分介绍的大多数算法在实践中都受益于这种性质，但是损失了常数倍$O(\\frac{1}{k})$的渐近分析。\n我们也可以在学习过程中逐渐增大小批量的大小，以此权衡批量梯度下降和随机梯度下降两者的优点。\n\n<!-- % 288 mid -->\n\n了解\\,SGD\\,更多的信息，请查看~{Bottou98}。\n\n<!-- % 288 mid -->\n\n\n## 动量\n\n虽然随机梯度下降仍然是非常受欢迎的优化方法，但其学习过程有时会很慢。\n动量方法~{cite?}旨在加速学习，特别是处理高曲率、小但一致的梯度，或是带噪声的梯度。\n动量算法积累了之前梯度指数级衰减的移动平均，并且继续沿该方向移动。\n动量的效果如\\fig?所示。\n\n<!-- % 288 mid -->\n\n<!-- % 289 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/momentum_color}}\n\\fi\n\\caption{动量的主要目的是解决两个问题：Hessian\\,矩阵的病态条件和随机梯度的方差。 \n我们通过此图说明动量如何克服这两个问题的第一个。\n等高线描绘了一个二次损失函数（具有病态条件的\\,Hessian\\,矩阵）。\n横跨轮廓的红色路径表示动量学习规则所遵循的路径，它使该函数最小化。\n我们在该路径的每个步骤画一个箭头，表示梯度下降将在该点采取的步骤。\n我们可以看到，一个病态条件的二次目标函数看起来像一个长而窄的山谷或具有陡峭边的峡谷。\n动量正确地纵向穿过峡谷，而普通的梯度步骤则会浪费时间在峡谷的窄轴上来回移动。\n比较\\fig?，它也显示了没有动量的梯度下降的行为。\n}\n\\end{figure}\n\n<!-- % 289 head -->\n\n从形式上看，动量算法引入了变量$\\Vv$充当速度角色——它代表参数在参数空间移动的方向和速率。\n速度被设为负梯度的指数衰减平均。\n名称动量来自物理类比，根据牛顿运动定律，负梯度是移动参数空间中粒子的力。\n动量在物理学上定义为质量乘以速度。\n在动量学习算法中，我们假设是单位质量，因此速度向量$\\Vv$也可以看作是粒子的动量。\n超参数$\\alpha\\in[0,1)$决定了之前梯度的贡献衰减得有多快。\n更新规则如下：\n\\begin{align}\n\\Vv & \\leftarrow \\alpha \\Vv - \\epsilon \\nabla_{\\Vtheta} \\left( \\frac{1}{m} \\sum_{i=1}^m  L(\\Vf(\\Vx^{(i)}; \\Vtheta), \\Vy^{(i)}   )  \\right), \\\\\n\\Vtheta & \\leftarrow \\Vtheta  + \\Vv .\n\\end{align}\n速度$\\Vv$累积了梯度元素$\\nabla_{\\Vtheta}( \\frac{1}{m} \\sum_{i=1}^m L( \\Vf(\\Vx^{(i)}; \\Vtheta), \\Vy^{(i)} )  )$。\n相对于$\\epsilon$，$\\alpha$越大，之前梯度对现在方向的影响也越大。\n带动量的\\,SGD\\,算法如\\alg?所示。\n\n<!-- % 289 end -->\n\n<!-- % 289 mid -->\n\n\\begin{algorithm}[ht]\n\\caption{使用动量的随机梯度下降（SGD）}\n\\begin{algorithmic}\n\\REQUIRE 学习率 $\\epsilon$， 动量参数 $\\alpha$\n\\REQUIRE 初始参数 $\\Vtheta$，初始速度 $\\Vv$\n\\WHILE{没有达到停止准则}\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度估计：$\\Vg \\leftarrow \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$\n    \\STATE  计算速度更新：$\\Vv \\leftarrow \\alpha \\Vv - \n    \\epsilon \\Vg$\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Vv$ \n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n<!-- % 289 mid -->\n\n<!-- % 289 end -->\n\n之前，步长只是梯度范数乘以学习率。\n现在，步长取决于梯度\\emph{序列}的大小和排列。\n当许多连续的梯度指向相同的方向时，步长最大。\n如果动量算法总是观测到梯度$\\Vg$，那么它会在方向$-g$上不停加速，直到达到最终速度，其中步长大小为\n\\begin{equation}\n    \\frac{\\epsilon \\norm{\\Vg}}{1-\\alpha} .\n\\end{equation}\n因此将动量的超参数视为$\\frac{1}{1-\\alpha}$有助于理解。\n例如，$\\alpha=0.9$对应着最大速度$10$倍于梯度下降算法。\n\n<!-- % 290 head -->\n\n在实践中，$\\alpha$的一般取值为$0.5$，$0.9$和$0.99$。\n和学习率一样，$\\alpha$也会随着时间不断调整。 \n一般初始值是一个较小的值，随后会慢慢变大。\n随着时间推移调整$\\alpha$没有收缩$\\epsilon$重要。\n\n<!-- % 290 mid -->\n\n我们可以将动量算法视为模拟连续时间下牛顿动力学下的粒子。\n这种物理类比有助于直觉上理解动量和梯度下降算法是如何表现的。\n\n<!-- % 290 mid -->\n\n粒子在任意时间点的位置由$\\Vtheta(t)$给定。\n粒子会受到净力$\\Vf(t)$。\n该力会导致粒子加速：\n\\begin{equation}\n    \\Vf(t) = \\frac{\\partial^2}{\\partial t^2} \\Vtheta(t) .\n\\end{equation}\n与其将其视为位置的二阶微分方程，我们不如引入表示粒子在时间$t$处速度的变量$\\Vv(t)$，将牛顿动力学重写为一阶微分方程：\n\\begin{align}\n    \\Vv(t) &= \\frac{\\partial}{\\partial t} \\Vtheta(t) , \\\\\n    \\Vf(t) &= \\frac{\\partial}{\\partial t} \\Vv(t) .\n\\end{align}\n由此，动量算法包括通过数值模拟求解微分方程。\n求解微分方程的一个简单数值方法是欧拉方法，通过在每个梯度方向上小且有限的步来简单模拟该等式定义的动力学。\n<!-- % 290 mid -->\n\n\n这解释了动量更新的基本形式，但具体什么是力呢？\n一个力正比于代价函数的负梯度$-\\nabla_{\\Vtheta} J(\\Vtheta)$。\n该力推动粒子沿着代价函数表面下坡的方向移动。\n梯度下降算法基于每个梯度简单地更新一步，而使用动量算法的牛顿方案则使用该力改变粒子的速度。\n我们可以将粒子视作在冰面上滑行的冰球。\n每当它沿着表面最陡的部分下降时，它会沿该方向加速滑行，直到开始向上滑动为止。\n<!-- % 291 head -->\n\n\n另一个力也是必要的。\n如果代价函数的梯度是唯一的力，那么粒子可能永远不会停下来。\n想象一下，假设理想情况下冰面没有摩擦，一个冰球从山谷的一端下滑，上升到另一端，永远来回振荡。\n要解决这个问题，我们添加另一个正比于$-\\Vv(t)$的力。\n在物理术语中，此力对应于粘性阻力，就像粒子必须通过一个抵抗介质，如糖浆。\n这会导致粒子随着时间推移逐渐失去能量，最终收敛到局部极小点。\n<!-- % 291 mid -->\n\n\n为什么要特别使用$-\\Vv(t)$和粘性阻力呢？\n部分原因是因为$-\\Vv(t)$在数学上的便利——速度的整数幂很容易处理。\n然而，其他物理系统具有基于速度的其他整数幂的其他类型的阻力。\n例如，颗粒通过空气时会受到正比于速度平方的湍流阻力，而颗粒沿着地面移动时会受到恒定大小的摩擦力。\n这些选择都不合适。\n湍流阻力，正比于速度的平方，在速度很小时会很弱。\n不够强到使粒子停下来。\n非零值初始速度的粒子仅受到湍流阻力，会从初始位置永远地移动下去，和初始位置的距离大概正比于$O(\\log t)$。\n因此我们必须使用速度较低幂次的力。\n如果幂次为零，相当于干摩擦，那么力太强了。\n当代价函数的梯度表示的力很小但非零时，由于摩擦导致的恒力会使得粒子在达到局部极小点之前就停下来。\n粘性阻力避免了这两个问题——它足够弱，可以使梯度引起的运动直到达到最小，但又足够强，使得坡度不够时可以阻止运动。\n<!-- % 291 end -->\n\n\n\n## Nesterov 动量\n\n受Nesterov加速梯度算法{cite?}启发，{sutskeverimportance}提出了动量算法的一个变种。\n这种情况的更新规则如下：\n\\begin{align}\n    \\Vv &\\leftarrow \\alpha\\Vv - \\epsilon \\nabla_{\\Vtheta} \\left[\n    \\frac{1}{m} \\sum_{i=1}^m L\\big( \\Vf(\\Vx^{(i)}; \\Vtheta + \\alpha \\Vv), \\Vy^{(i)} \\big)\n \\right], \\\\\n    \\Vtheta &\\leftarrow \\Vtheta + \\Vv ,\n\\end{align}\n其中参数$\\alpha$和$\\epsilon$发挥了和标准动量方法中类似的作用。 \nNesterov 动量和标准动量之间的区别体现在梯度计算上。\nNesterov 动量中，梯度计算在施加当前速度之后。\n因此，Nesterov 动量可以解释为往标准动量方法中添加了一个\\emph{校正因子}。\n完整的\\,Nesterov 动量算法如\\alg?所示。\n<!-- % 292 mid -->\n\n\n<!-- % 292 head -->\n\\begin{algorithm}[ht]\n\\caption{使用\\,Nesterov 动量的随机梯度下降（SGD）}\n\\begin{algorithmic}\n\\REQUIRE  学习率 $\\epsilon$， 动量参数 $\\alpha$\n\\REQUIRE 初始参数 $\\Vtheta$，初始速度 $\\Vv$\n\\WHILE{没有达到停止准则}\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，对应目标为$\\Vy^{(i)}$。\n    \\STATE 应用临时更新： $\\tilde{\\Vtheta} \\leftarrow \\Vtheta  + \\alpha \\Vv$\n         \\STATE 计算梯度（在临时点）：$\\Vg \\leftarrow \n         \\frac{1}{m} \\nabla_{\\tilde{\\Vtheta}} \\sum_i L(f(\\Vx^{(i)};\\tilde{\\Vtheta}),\\Vy^{(i)})$\n    \\STATE 计算速度更新：$\\Vv \\leftarrow \\alpha \\Vv - \n    \\epsilon \\Vg$\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Vv$ \n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n<!-- % 292 head -->\n\n<!-- % 292 mid -->\n\n在凸批量梯度的情况下，Nesterov 动量将额外误差收敛率从$O(1/k)$（$k$步后）改进到$O(1/k^2)$，如~{Nesterov83b}所示。\n可惜，在随机梯度的情况下，Nesterov 动量没有改进收敛率。\n\n<!-- % 292 mid -->\n\n\n# 参数初始化策略\n\n有些优化算法本质上是非迭代的，只是求解一个解点。\n有些其它优化算法本质上是迭代的，但是应用于这一类的优化问题时，能在可接受的时间内收敛到可接受的解，并且与初始值无关。\n深度学习训练算法通常没有这两种奢侈的性质。\n深度学习模型的训练算法通常是迭代的，因此要求使用者指定一些开始迭代的初始点。\n此外，训练深度模型是一个足够困难的问题，以致于大多数算法都很大程度地受到初始化选择的影响。\n初始点能够决定算法是否收敛，有些初始点十分不稳定，使得该算法会遭遇数值困难，并完全失败。\n当学习收敛时，初始点可以决定学习收敛得多快，以及是否收敛到一个代价高或低的点。\n此外，差不多代价的点可以具有区别极大的泛化误差，初始点也可以影响泛化。\n\n<!-- % 293 head -->\n\n现代的初始化策略是简单的、启发式的。\n设定改进的初始化策略是一项困难的任务，因为神经网络优化至今还未被很好地理解。\n大多数初始化策略基于在神经网络初始化时实现一些很好的性质。\n然而，我们并没有很好地理解这些性质中的哪些会在学习开始进行后的哪些情况下得以保持。\n进一步的难点是，有些初始点从优化的观点看或许是有利的，但是从泛化的观点看是不利的。\n我们对于初始点如何影响泛化的理解是相当原始的，几乎没有提供如何选择初始点的任何指导。\n\n<!-- % 293 mid -->\n\n也许完全确知的唯一特性是初始参数需要在不同单元间\"破坏对称性\"。\n如果具有相同激活函数的两个隐藏单元连接到相同的输入，那么这些单元必须具有不同的初始参数。\n如果它们具有相同的初始参数，然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。\n即使模型或训练算法能够使用随机性为不同的单元计算不同的更新（例如使用\\,Dropout的训练），通常来说，最好还是初始化每个单元使其和其他单元计算不同的函数。\n这或许有助于确保没有输入模式丢失在前向传播的零空间中，没有梯度模式丢失在反向传播的零空间中。\n每个单元计算不同函数的目标促使了参数的随机初始化。\n我们可以明确地搜索一大组彼此互不相同的基函数，但这经常会导致明显的计算代价。  \n例如，如果我们有和输出一样多的输入，我们可以使用Gram-Schmidt正交化于初始的权重矩阵，保证每个单元计算彼此非常不同的函数。\n在高维空间上使用高熵分布来随机初始化，计算代价小并且不太可能分配单元计算彼此相同的函数。\n\n<!-- % 293 mid -->\n\n通常情况下，我们可以为每个单元的偏置设置启发式挑选的常数，仅随机初始化权重。\n额外的参数（例如用于编码预测条件方差的参数）通常和偏置一样设置为启发式选择的常数。\n\n<!-- % 293 end -->\n\n我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。\n高斯或均匀分布的选择似乎不会有很大的差别，但也没有被详尽地研究。\n然而，初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。\n\n<!-- % 294 head -->\n\n更大的初始权重具有更强的破坏对称性的作用，有助于避免冗余的单元。\n它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。\n如果初始权重太大，那么会在前向传播或反向传播中产生爆炸的值。\n在循环网络中，很大的权重也可能导致混沌（对于输入中很小的扰动非常敏感，导致确定性前向传播过程表现随机）。\n在一定程度上，梯度爆炸问题可以通过梯度截断来缓解（执行梯度下降步骤之前设置梯度的阈值）。\n较大的权重也会产生使得激活函数饱和的值，导致饱和单元的梯度完全丢失。\n这些竞争因素决定了权重的理想初始大小。\n<!-- % 294 mid -->\n\n\n关于如何初始化网络，正则化和优化有着非常不同的观点。\n优化观点建议权重应该足够大以成功传播信息，但是正则化希望其小一点。\n诸如随机梯度下降这类对权重较小的增量更新，趋于停止在更靠近初始参数的区域（不管是由于卡在低梯度的区域，还是由于触发了基于过拟合 的提前终止准则）的优化算法倾向于最终参数应接近于初始参数。\n回顾\\sec?，在某些模型上，提前终止的梯度下降等价于权重衰减。\n在一般情况下，提前终止的梯度下降和权重衰减不同，但是提供了一个宽松的类比去考虑初始化的影响。\n我们可以将初始化参数$\\Vtheta$为$\\Vtheta_0$类比于强置均值为$\\Vtheta_0$的高斯先验$p(\\Vtheta)$。\n从这个角度来看，选择$\\Vtheta_0$接近$0$是有道理的。\n这个先验表明，单元间彼此互不交互比交互更有可能。\n只有在目标函数的似然项表达出对交互很强的偏好时，单元才会交互。\n另一方面，如果我们初始化$\\Vtheta_0$为很大的值，那么我们的先验指定了哪些单元应互相交互，以及它们应如何交互。\n<!-- % 294 end -->\n\n\n有些启发式方法可用于选择权重的初始大小。\n一种初始化$m$个输入和$n$输出的全连接层的权重的启发式方法是从分布$U(-\\frac{1}{\\sqrt{m}}, \\frac{1}{\\sqrt{m}})$中采样权重，\n而~{GlorotAISTATS2010-small}建议使用标准初始化, % ?\n\\begin{equation}\n    W_{i,j} \\sim U \\left(-\\sqrt{\\frac{6}{m+n}}, \\sqrt{\\frac{6}{m+n}}\\right) .\n\\end{equation}\n后一种启发式方法初始化所有的层，折衷于使其具有相同激活方差和使其具有相同梯度方差之间。\n这假设网络是不含非线性的链式矩阵乘法，据此推导得出。\n现实的神经网络显然会违反这个假设，但很多设计于线性模型的策略在其非线性对应中的效果也不错。\n<!-- % 295 head -->\n\n\n{Saxe-et-al-ICLR13}推荐初始化为随机正交矩阵，仔细挑选负责每一层非线性缩放或\\,\\textbf{增益}(gain)因子$g$。\n他们得到了用于不同类型的非线性激活函数的特定缩放因子。\n这种初始化方案也是启发于不含非线性的矩阵相乘序列的深度网络。\n在该模型下，这个初始化方案保证了达到收敛所需的训练迭代总数独立于深度。\n\n\n增加缩放因子$g$将网络推向网络前向传播时激活范数增加，反向传播时梯度范数增加的区域。\n{Sussillo14}表明，正确设置缩放因子足以训练深达$1000$层的网络，而不需要使用正交初始化。\n这种方法的一个重要观点是，在前馈网络中，激活和梯度会在每一步前向传播或反向传播中增加或缩小，遵循随机游走行为。\n这是因为前馈网络在每一层使用了不同的权重矩阵。\n如果该随机游走调整到保持范数，那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失与爆炸问题，如\\sec?所述。\n<!-- % 295 end -->\n\n\n可惜，这些初始权重的最佳准则往往不会带来最佳效果。\n这可能有三种不同的原因。\n首先，我们可能使用了错误的标准——它实际上并不利于保持整个网络信号的范数。\n其次，初始化时强加的性质可能在学习开始进行后不能保持。\n最后，该标准可能成功提高了优化速度，但意外地增大了泛化误差。\n在实践中，我们通常需要将权重范围视为超参数，其最优值大致接近，但并不完全等于理论预测。\n<!-- % 296 head -->\n\n\n数值范围准则的一个缺点是，设置所有的初始权重具有相同的标准差，例如$\\frac{1}{\\sqrt{m}}$，会使得层很大时每个单一权重会变得极其小。\n{martens2010hessian-small}提出了一种被称为稀疏初始化的替代方案，每个单元初始化为恰好有$k$个非零权重。\n这个想法保持该单元输入的总数量独立于输入数目$m$，而不使单一权重元素的大小随$m$缩小。\n稀疏初始化有助于实现单元之间在初始化时更具多样性。\n但是，获得较大取值的权重也同时被加了很强的先验。\n因为梯度下降需要很长时间缩小\"不正确\"的大值，这个初始化方案可能会导致某些单元出问题，例如\\,maxout\\,单元有几个过滤器，互相之间必须仔细调整。\n<!-- % 296 mid -->\n\n\n计算资源允许的话，将每层权重的初始数值范围设为超参数通常是个好主意，使用\\sec?介绍的超参数搜索算法，如随机搜索，挑选这些数值范围。\n是否选择使用密集或稀疏初始化也可以设为一个超参数。\n作为替代，我们可以手动搜索最优初始范围。\n一个好的挑选初始数值范围的经验法则是观测单个小批量数据上的激活或梯度的幅度或标准差。\n如果权重太小，那么当激活值在小批量上前向传播于网络时，激活值的幅度会缩小。\n通过重复识别具有小得不可接受的激活值的第一层，并提高其权重，最终有可能得到一个初始激活全部合理的网络。\n如果学习在这点上仍然很慢，观测梯度的幅度或标准差可能也会有所帮助。\n这个过程原则上是自动的，且通常计算量低于基于验证集误差的超参数优化，因为它是基于初始模型在单批数据上的行为反馈，而不是在验证集上训练模型的反馈。\n由于这个协议很长时间都被启发式使用，最近~{mishkin2015all}更正式地研究了该协议。\n<!-- % 296 mid -->\n\n\n目前为止，我们关注在权重的初始化上。\n幸运的是，其他参数的初始化通常更容易。\n<!-- % 296 end -->\n\n\n设置偏置的方法必须和设置权重的方法协调。\n设置偏置为零通常在大多数权重初始化方案中是可行的。\n存在一些我们可能设置偏置为非零值的情况：\n<!-- % 297 head -->\n\n\n+ 如果偏置是作为输出单元，那么初始化偏置以获取正确的输出边缘统计通常是有利的。\n要做到这一点，我们假设初始权重足够小，该单元的输出仅由偏置决定。\n这说明设置偏置为应用于训练集上输出边缘统计的激活函数的逆。\n例如，如果输出是类上的分布，且该分布是高度偏态分布，第$i$类的边缘概率由某个向量$\\Vc$的第$i$个元素给定，那么我们可以通过求解方程$\\text{softmax}(\\Vb)=\\Vc$来设置偏置向量$\\Vb$。\n这不仅适用于分类器，也适用于我们将在第三部分遇到的模型，例如自编码器和玻尔兹曼机。\n这些模型拥有输出类似于输入数据$\\Vx$的网络层，初始化这些层的偏置以匹配$\\Vx$上的边缘分布将有助于模型学习。\n<!-- % 297 mid -->\n\n\n+ 有时，我们可能想要选择偏置以避免初始化引起太大饱和。\n例如，我们可能会将ReLU的隐藏单元设为$0.1$而非$0$，以避免ReLU在初始化时饱和。\n尽管这种方法违背不希望偏置具有很强输入的权重初始化准则。\n例如，不建议使用随机游走初始化{cite?}。\n<!-- % 297 mid -->\n\n\n+ 有时，一个单元会控制其他单元能否参与到等式中。\n在这种情况下，我们有一个单元输出$u$，另一个单元$h\\in[0,1]$，那么我们可以将$h$视作门，以决定$uh\\approx 1$还是$uh\\approx 0$。\n在这种情形下，我们希望设置偏置 $h$，使得在初始化的大多数情况下$h\\approx 1$。\n否则，$u$没有机会学习。\n例如，{Jozefowicz-et-al-ICML2015}提议设置~LSTM~模型遗忘门的偏置为$1$，如\\sec?所述。\n\n<!-- % 297 end -->\n\n\n另一种常见类型的参数是方差或精确度参数。\n例如，我们用以下模型进行带条件方差估计的线性回归\n\\begin{equation}\n    p(y\\mid\\Vx) = \\mathcal{N} (y \\mid \\Vw^\\top \\Vx + b, 1/\\beta) ,\n\\end{equation}\n其中$\\beta$是精确度参数。\n通常我们能安全地初始化方差或精确度参数为$1$。\n另一种方法假设初始权重足够接近零，设置偏置可以忽略权重的影响，然后设定偏置以产生输出的正确边缘均值，并将方差参数设置为训练集输出的边缘方差。\n<!-- % 298 head -->\n\n\n除了这些初始化模型参数的简单常数或随机方法，还有可能使用机器学习初始化模型参数。\n在本书第三部分讨论的一个常用策略是使用相同的输入数据集，用无监督模型训练出来的参数来初始化监督模型。\n我们也可以在相关问题上使用监督训练。\n即使是在一个不相关的任务上运行监督训练，有时也能得到一个比随机初始化具有更快收敛率的初始值。\n这些初始化策略有些能够得到更快的收敛率和更好的泛化误差，因为它们编码了模型初始参数的分布信息。\n其他策略显然效果不错的原因主要在于它们设置参数为正确的数值范围，或是设置不同单元计算互相不同的函数。\n<!-- % 298 mid -->\n\n\n\n# 自适应学习率算法\n\n神经网络研究员早就意识到学习率肯定是难以设置的超参数之一，因为它对模型的性能有显著的影响。\n正如我们在\\sec?和\\sec?中所探讨的，损失通常高度敏感于参数空间中的某些方向，而不敏感于其他。\n动量算法可以在一定程度缓解这些问题，但这样做的代价是引入了另一个超参数。\n在这种情况下，自然会问有没有其他方法。\n如果我们相信方向敏感度在某种程度是轴对齐的，那么每个参数设置不同的学习率，在整个学习过程中自动适应这些学习率是有道理的。\n\n\n\n\\textbf{Delta-bar-delta}算法{cite?}是一个早期的在训练时适应模型参数各自学习率的启发式方法。\n该方法基于一个很简单的想法，如果损失对于某个给定模型参数的偏导保持相同的符号，那么学习率应该增加。如果对于该参数的偏导变化了符号，那么学习率应减小。\n当然，这种方法只能应用于全批量优化中。\n<!-- % 298 mid -->\n\n\n最近，提出了一些增量（或者基于小批量）的算法来自适应模型参数的学习率。\n这节将简要回顾其中一些算法。\n<!-- % 298 end -->\n\n\n<!-- % 299 head -->\n\n## AdaGrad\n\n\\textbf{AdaGrad}算法，如\\alg?所示，独立地适应所有模型参数的学习率，缩放每个参数反比于其所有梯度历史平方值总和的平方根{cite?}。\n具有损失最大偏导的参数相应地有一个快速下降的学习率，而具有小偏导的参数在学习率上有相对较小的下降。\n净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。\n<!-- % 299 head -->\n\n\n在凸优化背景中，AdaGrad 算法具有一些令人满意的理论性质。\n然而，经验上已经发现，对于训练深度神经网络模型而言，\\emph{从训练开始时}积累梯度平方会导致有效学习率过早和过量的减小。\nAdaGrad\\,在某些深度学习模型上效果不错，但不是全部。\n\n\n\\begin{algorithm}[ht]\n\\caption{AdaGrad算法}\n\\begin{algorithmic}\n\\REQUIRE 全局学习率 $\\epsilon$\n\\REQUIRE 初始参数$\\Vtheta$\n\\REQUIRE 小常数$\\delta$，为了数值稳定大约设为$10^{-7}$\n\\STATE 初始化梯度累积变量$\\Vr = 0$\n\\WHILE{没有达到停止准则}\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度： $\\Vg \\leftarrow  \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 累积平方梯度：$\\Vr \\leftarrow \\Vr + \\Vg \\odot \\Vg$\n    \\STATE 计算更新：$\\Delta \\Vtheta \\leftarrow -\n    \\frac{\\epsilon}{\\delta+ \\sqrt{\\Vr}} \\odot\\Vg$  \\ \\  （逐元素地应用除和求平方根）\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\n## RMSProp\n\n\\textbf{RMSProp}算法{cite?}修改AdaGrad以在非凸设定下效果更好，改变梯度积累为指数加权的移动平均。\nAdaGrad\\,旨在应用于凸问题时快速收敛。\n当应用于非凸函数训练神经网络时，学习轨迹可能穿过了很多不同的结构，最终到达一个局部是凸碗的区域。\nAdaGrad根据平方梯度的整个历史收缩学习率，可能使得学习率在达到这样的凸结构前就变得太小了。\nRMSProp使用指数衰减平均以丢弃遥远过去的历史，使其能够在找到凸碗状结构后快速收敛，\n它就像一个初始化于该碗状结构的AdaGrad算法实例。\n\n<!-- % -- 299 -- -->\n\nRMSProp的标准形式如\\alg?所示，结合Nesterov动量的形式如\\alg?所示。\n相比于AdaGrad，使用移动平均引入了一个新的超参数$\\rho$，用来控制移动平均的长度范围。\n\n<!-- % -- 300 -- -->\n\n经验上，RMSProp已被证明是一种有效且实用的深度神经网络优化算法。\n目前它是深度学习从业者经常采用的优化方法之一。\n\n\n\\begin{algorithm}[ht]\n\\caption{RMSProp算法}\n\\begin{algorithmic}\n\\REQUIRE 全局学习率 $\\epsilon$，衰减速率$\\rho$\n\\REQUIRE  初始参数$\\Vtheta$\n\\REQUIRE 小常数$\\delta$，通常设为$10^{-6}$（用于被小数除时的数值稳定）\n\\STATE 初始化累积变量 $\\Vr = 0$\n\\WHILE{没有达到停止准则}\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度：$\\Vg \\leftarrow  \n         \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 累积平方梯度：$\\Vr \\leftarrow \\rho\n    \\Vr + (1-\\rho) \\Vg \\odot \\Vg$\n    \\STATE 计算参数更新：$\\Delta \\Vtheta =\n    -\\frac{\\epsilon}{\\sqrt{\\delta + \\Vr}} \\odot \\Vg$  \\ \\  ($\\frac{1}{\\sqrt{\\delta + \\Vr}}$ 逐元素应用)\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\\begin{algorithm}[ht]\n\\caption{使用Nesterov\\,动量的RMSProp算法}\n\\begin{algorithmic}\n\\REQUIRE 全局学习率 $\\epsilon$，衰减速率$\\rho$， 动量系数$\\alpha$\n\\REQUIRE 初始参数$\\Vtheta$，初始参数$\\Vv$\n\\STATE 初始化累积变量 $\\Vr = 0$\n\\WHILE{没有达到停止准则} % NOTE: do not capitalize the condition\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算临时更新：$\\tilde{\\Vtheta} \\leftarrow \\Vtheta + \\alpha \\Vv$\n    \\STATE 计算梯度：$\\Vg \\leftarrow  \n         \\frac{1}{m} \\nabla_{\\tilde{\\Vtheta}} \\sum_i L(f(\\Vx^{(i)};\\tilde{\\Vtheta}),\\Vy^{(i)})$ \n    \\STATE  累积梯度：$\\Vr \\leftarrow \\rho\n    \\Vr + (1-\\rho) \\Vg \\odot \\Vg$\n    \\STATE  计算速度更新：$\\Vv \\leftarrow \\alpha \\Vv\n    -\\frac{\\epsilon}{\\sqrt{\\Vr}} \\odot \\Vg$ \\ \\  ($\\frac{1}{\\sqrt{\\Vr}}$ 逐元素应用)\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Vv$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\n## Adam\n\n\\textbf{Adam}~{cite?}是另一种学习率自适应的优化算法，如\\alg?所示。\n\"Adam\"这个名字派生自短语\"adaptive moments\"。\n早期算法背景下，它也许最好被看作结合RMSProp和具有一些重要区别的动量的变种。\n首先，在Adam中，动量直接并入了梯度一阶矩（指数加权）的估计。\n将动量加入RMSProp最直观的方法是将动量应用于缩放后的梯度。\n结合缩放的动量使用没有明确的理论动机。\n其次，Adam包括偏置修正，修正从原点初始化的一阶矩（动量项）和（非中心的）二阶矩的估计（\\alg?）。\nRMSProp也采用了（非中心的）二阶矩估计，然而缺失了修正因子。\n因此，不像Adam，RMSProp二阶矩估计可能在训练初期有很高的偏置。\nAdam通常被认为对超参数的选择相当鲁棒，尽管学习率有时需要从建议的默认修改。\n\n\\begin{algorithm}[ht]\n\\caption{Adam算法}\n\\begin{algorithmic}\n\\REQUIRE 步长 $\\epsilon$ （建议默认为： $0.001$）\n\\REQUIRE 矩估计的指数衰减速率， $\\rho_1$ 和 $\\rho_2$ 在区间 $[0, 1)$内。\n（建议默认为：分别为$0.9$ 和 $0.999$）\n\\REQUIRE 用于数值稳定的小常数 $\\delta$  （建议默认为： $10^{-8}$）\n\\REQUIRE 初始参数 $\\Vtheta$\n\\STATE 初始化一阶和二阶矩变量 $\\Vs = 0 $, $\\Vr = 0$\n\\STATE 初始化时间步 $t=0$ \n\\WHILE{没有达到停止准则}\n    \\STATE 从训练集中采包含$m$个样本$\\{ \\Vx^{(1)},\\dots, \\Vx^{(m)}\\}$ 的小批量，对应目标为$\\Vy^{(i)}$。\n    \\STATE 计算梯度：$\\Vg \\leftarrow \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE $t \\leftarrow t + 1$\n    \\STATE 更新有偏一阶矩估计： $\\Vs \\leftarrow \\rho_1 \\Vs + (1-\\rho_1) \\Vg$\n    \\STATE 更新有偏二阶矩估计：$\\Vr \\leftarrow \\rho_2 \\Vr + (1-\\rho_2) \\Vg \\odot \\Vg$\n    \\STATE 修正一阶矩的偏差：$\\hat{\\Vs} \\leftarrow \\frac{\\Vs}{1-\\rho_1^t}$\n    \\STATE 修正二阶矩的偏差：$\\hat{\\Vr} \\leftarrow \\frac{\\Vr}{1-\\rho_2^t}$\n    \\STATE 计算更新：$\\Delta \\Vtheta = - \\epsilon \\frac{\\hat{\\Vs}}{\\sqrt{\\hat{\\Vr}} + \\delta}$ \\ \\  （逐元素应用操作）\n    \\STATE 应用更新：$\\Vtheta \\leftarrow \\Vtheta + \\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n<!-- % -- 301 -- -->\n\n\n## 选择正确的优化算法\n\n在本节中，我们讨论了一系列算法，通过自适应每个模型参数的学习率以解决优化深度模型中的难题。\n此时，一个自然的问题是：该选择哪种算法呢？\n\n遗憾的是，目前在这一点上没有达成共识。\n{Schaul2014_unittests}展示了许多优化算法在大量学习任务上极具价值的比较。\n虽然结果表明，具有自适应学习率（以RMSProp和AdaDelta为代表）的算法族表现得相当鲁棒，不分伯仲，但没有哪个算法能脱颖而出。\n\n目前，最流行并且使用很高的优化算法包括SGD、具动量的SGD、RMSProp、具动量的RMSProp、AdaDelta和Adam。\n此时，选择哪一个算法似乎主要取决于使用者对算法的熟悉程度（以便调节超参数）。\n\n\n# 二阶近似方法\n\n在本节中，我们会讨论训练深度神经网络的二阶方法。\n参考{LeCun+98backprop}了解该问题的早期处理方法。\n为表述简单起见，我们只考察目标函数为经验风险：\n\\begin{equation}\n    J(\\Vtheta) = \\SetE_{\\RVx, \\RSy \\sim \\hat{p}_{\\text{data}}(\\Vx,y) } [ L(f(\\Vx; \\Vtheta), y) ] =\n\\frac{1}{m} \\sum_{i=1}^m L(f(\\Vx^{(i)}; \\Vtheta), y^{(i)}).\n\\end{equation}\n然而，我们在这里讨论的方法很容易扩展到更一般的目标函数，例如，\\chap?讨论的包括参数正则项的函数。\n\n<!-- % -- 302 -- -->\n\n\n## 牛顿法\n\n在\\sec?，我们介绍了二阶梯度方法。\n与一阶方法相比，二阶方法使用二阶导数改进了优化。\n最广泛使用的二阶方法是牛顿法。\n我们现在更详细地描述牛顿法，重点在其应用于神经网络的训练。\n\n牛顿法是基于二阶泰勒级数展开在某点$\\Vtheta_0$附近来近似$J(\\Vtheta)$的优化方法，其忽略了高阶导数：\n\\begin{equation}\n    J(\\Vtheta) \\approx J(\\Vtheta_0) + (\\Vtheta - \\Vtheta_0)^\\top \\nabla_{\\Vtheta}   \n    J(\\Vtheta_0) + \\frac{1}{2} (\\Vtheta - \\Vtheta_0)^\\top \\MH(\\Vtheta - \\Vtheta_0),\n\\end{equation}\n其中$\\MH$是$J$相对于$\\Vtheta$的\\,Hessian\\,矩阵在$\\Vtheta_0$处的估计。\n如果我们再求解这个函数的临界点，我们将得到牛顿参数更新规则：\n\\begin{equation}\n    \\Vtheta^* = \\Vtheta_0 - \\MH^{-1}\\nabla_{\\Vtheta} J(\\Vtheta_0).\n\\end{equation}\n因此，对于局部的二次函数（具有正定的$\\MH$\\,），用$\\MH^{-1}$重新调整梯度，牛顿法会直接跳到极小值。\n如果目标函数是凸的但非二次的（有高阶项），该更新将是迭代的，得到和牛顿法相关的算法，如\\alg?所示。\n\n对于非二次的表面，只要\\,Hessian\\,矩阵保持正定，牛顿法能够迭代地应用。\n这意味着一个两步迭代过程。\n首先，更新或计算\\,Hessian\\,逆（通过更新二阶近似）。\n其次，根据\\eqn?更新参数。\n\n<!-- % -- 303 -- -->\n\n在\\sec?，我们讨论了牛顿法只适用于\\,Hessian\\,矩阵是正定的情况。\n在深度学习中，目标函数的表面通常非凸（有很多特征），如鞍点。\n因此使用牛顿法是有问题的。\n如果\\,Hessian\\,矩阵的特征值并不都是正的，例如，靠近鞍点处，牛顿法实际上会导致更新朝错误的方向移动。\n这种情况可以通过正则化\\,Hessian\\,矩阵来避免。\n常用的正则化策略包括在\\,Hessian\\,矩阵对角线上增加常数$\\alpha$。\n正则化更新变为\n\\begin{equation}\n    \\Vtheta^* = \\Vtheta_0 - [ H( f(\\Vtheta_0)) + \\alpha \\MI  ]^{-1} \\nabla_{\\Vtheta} f(\\Vtheta_0).\n\\end{equation}\n这个正则化策略用于牛顿法的近似，例如Levenberg-Marquardt算法{cite?}，只要\\,Hessian\\,矩阵的负特征值仍然相对接近零，效果就会很好。\n在曲率方向更极端的情况下，$\\alpha$的值必须足够大，以抵消负特征值。\n然而，如果$\\alpha$持续增加，Hessian\\,矩阵会变得由对角矩阵$\\alpha \\MI$主导，通过牛顿法所选择的方向会收敛到普通梯度除以$\\alpha$。\n当很强的负曲率存在时，$\\alpha$可能需要特别大，以致于牛顿法比选择合适学习率的梯度下降的步长更小。\n\n\\begin{algorithm}[ht]\n\\caption{目标为$J(\\Vtheta)= \\frac{1}{m} \\sum_{i=1}^m L(f(\\Vx^{(i)};\\Vtheta), y^{(i)})$的牛顿法}\n\\begin{algorithmic}\n\\REQUIRE 初始参数$\\Vtheta_{0}$\n\\REQUIRE 包含 $m$个样本的训练集\n\\WHILE{没有达到停止准则} \n      \\STATE 计算梯度： $\\Vg \\leftarrow \n     \\frac{1}{m} \\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n      \\STATE 计算\\,Hessian\\,矩阵：$\\MH \\leftarrow  \n     \\frac{1}{m} \\nabla_{\\Vtheta}^2 \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 计算\\,Hessian\\,逆：$\\MH^{-1}$\n    \\STATE 计算更新： $\\Delta \\Vtheta = - \\MH^{-1} \\Vg$\n    \\STATE 应用更新：$\\Vtheta = \\Vtheta+\\Delta \\Vtheta$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n除了目标函数的某些特征带来的挑战，如鞍点，牛顿法用于训练大型神经网络还受限于其显著的计算负担。\nHessian\\,矩阵中元素数目是参数数量的平方，因此，如果参数数目为$k$（甚至是在非常小的神经网络中$k$也可能是百万级别），牛顿法需要计算$k\\times k$矩阵的逆，计算复杂度为$O(k^3)$。\n另外，由于参数将每次更新都会改变，\\emph{每次训练迭代}都需要计算\\,Hessian\\,矩阵的逆。\n其结果是，只有参数很少的网络才能在实际中用牛顿法训练。\n在本节的剩余部分，我们将讨论一些试图保持牛顿法优点，同时避免计算障碍的替代算法。\n\n\n## 共轭梯度法\n\n共轭梯度法是一种通过迭代下降的共轭方向以有效避免\\,Hessian\\,矩阵求逆计算的方法。\n这种方法的灵感来自于对最速下降方法弱点的仔细研究（详细信息请查看\\sec?），其中线搜索迭代地用于与梯度相关的方向上。\n\\fig?说明了该方法在二次碗型目标中如何表现的，是一个相当低效的来回往复，锯齿形模式。\n这是因为每一个由梯度给定的线搜索方向，都保证正交于上一个线搜索方向。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/steepest_descent_quadratic_color}}\n\\fi\n\\caption{将最速下降法应用于二次代价表面。\n在每个步骤，最速下降法沿着由初始点处的梯度定义的线跳到最低代价的点。\n这解决了\\fig?中使用固定学习率所遇到的一些问题，但即使使用最佳步长，算法仍然朝最优方向曲折前进。\n根据定义，在沿着给定方向的目标最小值处，最终点处的梯度与该方向正交。\n}\n\\end{figure}\n\n\n<!-- % -- 304 -- -->\n\n假设上一个搜索方向是$\\Vd_{t-1}$。   \n在极小值处，线搜索终止，方向$\\Vd_{t-1}$处的方向导数为零：$\\nabla_{\\Vtheta} J(\\Vtheta) \\cdot \\Vd_{t-1} = 0$。\n因为该点的梯度定义了当前的搜索方向，$\\Vd_t = \\nabla_{\\Vtheta} J(\\Vtheta)$将不会贡献于方向$\\Vd_{t-1}$。\n因此方向$\\Vd_t$正交于$\\Vd_{t-1}$。\n最速下降多次迭代中，方向$\\Vd_{t-1}$和$\\Vd_t$之间的关系如\\fig?所示。\n如图展示的，下降正交方向的选择不会保持前一搜索方向上的最小值。\n这产生了锯齿形的过程。\n在当前梯度方向下降到极小值，我们必须重新最小化之前梯度方向上的目标。\n因此，通过遵循每次线搜索结束时的梯度，我们在某种程度上撤销了在之前线搜索的方向上取得的进展。\n共轭梯度法试图解决这个问题。\n\n在共轭梯度法中，我们寻求一个和先前线搜索方向共轭的搜索方向，即它不会撤销该方向上的进展。\n在训练迭代$t$时，下一步的搜索方向$\\Vd_t$的形式如下：\n\\begin{equation}\n    \\Vd_t = \\nabla_{\\Vtheta} J(\\Vtheta) + \\beta_t \\Vd_{t-1},\n\\end{equation}\n其中，系数$\\beta_t$的大小控制我们应沿方向$\\Vd_{t-1}$加回多少到当前搜索方向上。\n\n<!-- % -- 305 -- -->\n\n如果$\\Vd_t^\\top \\MH \\Vd_{t-1} = 0$，其中$\\MH$是\\,Hessian\\,矩阵，则两个方向$\\Vd_t$和$\\Vd_{t-1}$被称为共轭的。\n\n适应共轭的直接方法会涉及到$\\MH$特征向量的计算以选择$\\beta_t$。\n这将无法满足我们的开发目标：寻找在大问题比牛顿法计算更加可行的方法。\n我们能否不进行这些计算而得到共轭方向？\n幸运的是这个问题的答案是肯定的。\n\n两种用于计算$\\beta_t$的流行方法是：\n\\begin{enumerate}\n+ Fletcher-Reeves:\n\\begin{equation}\n    \\beta_t = \\frac{ \\nabla_{\\Vtheta} J(\\Vtheta_t)^\\top \\nabla_{\\Vtheta} J(\\Vtheta_t) }\n{ \\nabla_{\\Vtheta} J(\\Vtheta_{t-1})^\\top \\nabla_{\\Vtheta} J(\\Vtheta_{t-1}) }\n\\end{equation}\n\n+ Polak-Ribi\\`{e}re:\n\\begin{equation}\n    \\beta_t = \\frac{ (\\nabla_{\\Vtheta} J(\\Vtheta_t) - \\nabla_{\\Vtheta} J(\\Vtheta_{t-1}))^\\top \\nabla_{\\Vtheta} J(\\Vtheta_t) }\n{ \\nabla_{\\Vtheta} J(\\Vtheta_{t-1})^\\top \\nabla_{\\Vtheta} J(\\Vtheta_{t-1}) }\n\\end{equation}\n\\end{enumerate}\n对于二次曲面而言，共轭方向确保梯度沿着前一方向大小不变。\n因此，我们在前一方向上仍然是极小值。\n其结果是，在$k$-维参数空间中，共轭梯度法只需要至多$k$次线搜索就能达到极小值。\n共轭梯度法如\\alg?所示。\n\n\\begin{algorithm}[ht]\n\\caption{共轭梯度法}\n\\begin{algorithmic}\n\\REQUIRE 初始参数 $\\Vtheta_{0}$\n\\REQUIRE 包含$m$个样本的训练集\n\\STATE 初始化 $\\Vrho_{0} = 0$\n\\STATE 初始化 $g_0 = 0$\n\\STATE 初始化 $t = 1$\n\\WHILE{没有达到停止准则}\n    \\STATE 初始化梯度 ${\\Vg}_{t} = 0$\n    \\STATE 计算梯度：$\\Vg_{t} \\leftarrow\n         \\frac{1}{m}\\nabla_{\\Vtheta} \\sum_i L(f(\\Vx^{(i)};\\Vtheta),\\Vy^{(i)})$ \n    \\STATE 计算 $\\beta_{t} = \\frac{(\\Vg_{t}-\\Vg_{t-1})^\\top \\Vg_{t}}{\\Vg_{t-1}^\\top \\Vg_{t-1}}$  (Polak-Ribi\\`{e}re)\n    \\STATE (非线性共轭梯度法：视情况可重置$\\beta_{t}$为零，\n           例如  $t$是常数$k$的倍数时，如 $k=5$)\n    \\STATE 计算搜索方向： $\\Vrho_{t} = -\\Vg_{t} + \\beta_{t} \\Vrho_{t-1}$ \n    \\STATE 执行线搜索寻找：$\\epsilon^{*} = \\arg\\!\\min_{\\epsilon}\n    \\frac{1}{m} \\sum_{i=1}^{m}L(f(\\Vx^{(i)};\\Vtheta_t + \\epsilon \\Vrho_t),\\Vy^{(i)})$ \n    \\STATE （对于真正二次的代价函数，存在$\\epsilon^*$的解析解，而无需显式地搜索）\n    \\STATE 应用更新：$\\Vtheta_{t+1} = \\Vtheta_{t}+ \\epsilon^{*} \\Vrho_{t}$\n    \\STATE $t \\leftarrow t + 1$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\\paragraph{非线性共轭梯度法：}\n目前，我们已经讨论了用于二次目标函数的共轭梯度法。\n当然，本章我们主要关注于探索训练神经网络和其他相关深度学习模型的优化方法，其对应的目标函数比二次函数复杂得多。\n或许令人惊讶，共轭梯度法在这种情况下仍然是适用的，尽管需要作一些修改。\n没有目标是二次的保证，共轭方向也不再保证在以前方向上的目标仍是极小值。\n其结果是，\\textbf{非线性共轭梯度法}\\,算法会包括一些偶尔的重设，共轭梯度法沿未修改的梯度重启线搜索。\n\n<!-- % -- 306 -- -->\n\n实践者报告在实践中使用非线性共轭梯度法训练神经网络是合理的，尽管在开始非线性共轭梯度法前使用随机梯度下降迭代若干步来初始化效果更好。\n另外，尽管（非线性）共轭梯度法传统上作为批方法，小批量版本已经成功用于训练神经网络~{cite?}。\n针对神经网路的共轭梯度法应用早已被提出，例如缩放的共轭梯度法{cite?}。\n\n\n## BFGS\n\n\\textbf{Broyden-Fletcher-Goldfarb-Shanno}（\\textbf{BFGS}）算法具有牛顿法的一些优点，但没有牛顿法的计算负担。\n在这方面，BFGS\\,和共轭梯度法很像。\n然而，BFGS\\,使用了一个更直接的方法近似牛顿更新。回顾牛顿更新由下式给出\n\\begin{equation}\n    \\Vtheta^* = \\Vtheta_0 - \\MH^{-1} \\nabla_{\\Vtheta} J(\\Vtheta_0),\n\\end{equation}\n其中，$\\MH$是$J$相对于$\\Vtheta$的\\,Hessian\\,矩阵在$\\Vtheta_0$处的估计。\n运用牛顿法的主要计算难点在于计算\\,Hessian\\,逆$\\MH^{-1}$。\n拟牛顿法所采用的方法（BFGS\\,是其中最突出的）是使用矩阵$\\MM_t$近似逆，迭代地低秩更新精度以更好地近似$\\MH^{-1}$。\n\n<!-- % -- 307 -- -->\n\nBFGS\\,近似的说明和推导出现在很多关于优化的教科书中，包括{Lue84}。\n\n当\\,Hessian\\,逆近似$\\MM_t$更新时，下降方向$\\Vrho_t$为$\\Vrho_t = \\MM_t \\Vg_t$。\n该方向上的线搜索用于决定该方向上的步长$\\epsilon^*$。\n参数的最后更新为：\n\\begin{equation}\n    \\Vtheta_{t+1} = \\Vtheta_t + \\epsilon^* \\Vrho_t.\n\\end{equation}\n\n和共轭梯度法相似，BFGS\\,算法迭代一系列线搜索，其方向含二阶信息。\n然而和共轭梯度法不同的是，该方法的成功并不严重依赖于线搜索寻找该方向上和真正极小值很近的一点。\n因此，相比于共轭梯度法，BFGS\\,的优点是其花费较少的时间改进每个线搜索。\n在另一方面，BFGS\\,算法必须存储\\,Hessian\\,逆矩阵$\\MM$，需要$O(n^2)$的存储空间，使\\,BFGS\\,不适用于大多数具有百万级参数的现代深度学习模型。\n\n\\paragraph{存储受限的\\,BFGS（或\\,L-BFGS）}\n通过避免存储完整的\\,Hessian\\,逆近似$\\MM$，BFGS\\,算法的存储代价可以显著降低。\nL-BFGS\\,算法使用和\\,BFGS\\,算法相同的方法计算$\\MM$的近似，但起始假设是$\\MM^{(t-1)}$是单位矩阵，而不是一步一步都要存储近似。\n如果使用精确的线搜索，L-BFGS\\,定义的方向会是相互共轭的。\n然而，不同于共轭梯度法，即使只是近似线搜索的极小值，该过程的效果仍然不错。\n这里描述的无存储的\\,L-BFGS\\,方法可以拓展为包含\\,Hessian\\,矩阵更多的信息，每步存储一些用于更新$\\MM$的向量，且每步的存储代价是$O(n)$。\n\n<!-- % -- 308 -- -->\n\n\n# 优化策略和元算法\n\n许多优化技术并非真正的算法，而是一般化的模板，可以特定地产生算法，或是并入到很多不同的算法中。\n\n\n## 批标准化\n\n批标准化~{cite?}是优化深度神经网络中最激动人心的最新创新之一。\n实际上它并不是一个优化算法，而是一个自适应的重参数化的方法，试图解决训练非常深的模型的困难。\n\n非常深的模型会涉及多个函数或层组合。\n在其他层不改变的假设下，梯度用于如何更新每一个参数。\n在实践中，我们同时更新所有层。\n当我们进行更新时，可能会发生一些意想不到的结果，这是因为许多组合在一起的函数同时改变时，计算更新的假设是其他函数保持不变。\n举一个简单的例子，假设我们有一个深度神经网络，每一层只有一个单元，并且在每个隐藏层不使用激活函数：$\\hat{y} = xw_1 w_2 w_3 \\dots w_l$。\n此处，$w_i$表示用于层$i$的权重。层$i$的输出是$h_i = h_{i-1} w_i$。\n输出$\\hat{y}$是输入$x$的线性函数，但是权重$w_i$的非线性函数。\n假设我们的代价函数 $\\hat{y}$上的梯度为$1$，所以我们希望稍稍降低$\\hat{y}$。\n然后反向传播算法可以计算梯度$\\Vg = \\nabla_{\\Vw} \\hat{y}$。\n想想我们在更新$\\Vw \\leftarrow \\Vw - \\epsilon \\Vg$时会发生什么。\n近似$\\hat{y}$的一阶泰勒级数会预测$\\hat{y}$的值下降$\\epsilon \\Vg^\\top \\Vg$。\n如果我们希望$\\hat{y}$下降$0.1$，那么梯度中的一阶信息表明我们应设置学习率$\\epsilon$为$\\frac{0.1}{\\Vg^\\top \\Vg}$。\n然而，实际的更新将包括二阶，三阶，直到$l$阶的影响。\n$\\hat{y}$的更新值为\n\\begin{equation}\n    x(w_1-\\epsilon g_1)(w_2-\\epsilon g_2)\\dots(w_l-\\epsilon g_l),\n\\end{equation}\n这个更新中所产生的一个二阶项示例是$\\epsilon^2 g_1 g_2 \\prod_{i=3}^l w_i$ 。\n如果 $\\prod_{i=3}^l w_i$很小，那么该项可以忽略不计。而如果层$3$到层$l$的权重都比$1$大时，该项可能会指数级大。\n这使得我们很难选择一个合适的学习率，因为某一层中参数更新的效果很大程度上取决于其他所有层。\n二阶优化算法通过考虑二阶相互影响来解决这个问题，但我们可以看到，在非常深的网络中，更高阶的相互影响会很显著。\n即使是二阶优化算法，计算代价也很高，并且通常需要大量近似，以免真正计算所有的重要二阶相互作用。\n因此对于$n>2$的情况，建立$n$阶优化算法似乎是无望的。\n那么我们可以做些什么呢？\n\n<!-- % -- 309 -- -->\n\n批标准化提出了一种几乎可以重参数化所有深度网络的优雅方法。\n重参数化显著减少了多层之间协调更新的问题。\n批标准化可应用于网络的任何输入层或隐藏层。\n设$\\MH$是需要标准化的某层的小批量激活函数，排布为设计矩阵，每个样本的激活出现在矩阵的每一行中。\n为了标准化$\\MH$，我们将其替换为\n\\begin{equation}\n\\MH' = \\frac{\\MH - \\Vmu}{\\Vsigma},\n\\end{equation}\n其中$\\Vmu$是包含每个单元均值的向量，$\\Vsigma$是包含每个单元标准差的向量。\n此处的算术是基于广播向量$\\Vmu$和向量$\\Vsigma$应用于矩阵$\\MH$的每一行。\n在每一行内，运算是逐元素的，因此$H_{i,j}$标准化为减去$\\mu_j$再除以$\\sigma_j$。\n网络的其余部分操作$\\MH'$的方式和原网络操作$\\MH$的方式一样。\n\n在训练阶段，\n\\begin{equation}\n    \\Vmu = \\frac{1}{m} \\sum_i \\MH_{i,:}\n\\end{equation}\n和\n\\begin{equation}\n    \\Vsigma = \\sqrt{ \\delta + \\frac{1}{m} \\sum_i (\\MH - \\Vmu)_i^2 },\n\\end{equation}\n其中$\\delta$是个很小的正值，比如$10^{-8}$，以强制避免遇到$\\sqrt{z}$的梯度在$z=0$处未定义的问题。\n至关重要的是，\\emph{我们反向传播这些操作}，来计算均值和标准差，并应用它们于标准化$\\MH$。\n这意味着，梯度不会再简单地增加$h_i$的标准差或均值；标准化操作会除掉这一操作的影响，归零其在梯度中的元素。\n这是批标准化方法的一个重大创新。\n以前的方法添加代价函数的惩罚，以鼓励单元标准化激活统计量，或是在每个梯度下降步骤之后重新标准化单元统计量。\n前者通常会导致不完全的标准化，而后者通常会显著地消耗时间，因为学习算法会反复改变均值和方差而标准化步骤会反复抵消这种变化。\n批标准化重参数化模型，以使一些单元总是被定义标准化，巧妙地回避了这两个问题。\n\n<!-- % -- 310 -- -->\n\n在测试阶段，$\\Vmu$和$\\Vsigma$可以被替换为训练阶段收集的运行均值。\n这使得模型可以对单一样本评估，而无需使用定义于整个小批量的$\\Vmu$和$\\Vsigma$。\n\n回顾例子$\\hat{y} = x w_1 w_2 \\dots w_l$，我们看到，我们可以通过标准化$h_{l-1}$很大程度地解决了学习这个模型的问题。\n假设$x$采样自一个单位高斯。\n那么$h_{l-1}$也是来自高斯，因为从$x$到$h_l$的变换是线性的。\n然而，$h_{l-1}$不再有零均值和单位方差。\n使用批标准化后，我们得到的归一化$\\hat{h}_{l-1}$恢复了零均值和单位方差的特性。\n对于底层的几乎任意更新而言，$\\hat{h}_{l-1}$仍然保持着单位高斯。\n然后输出$\\hat{y}$可以学习为一个简单的线性函数$\\hat{y} = w_l \\hat{h}_{l-1}$。\n现在学习这个模型非常简单，因为低层的参数在大多数情况下没有什么影响；它们的输出总是重新标准化为单位高斯。\n只在少数个例中，低层会有影响。\n改变某个低层权重为$0$，可能使输出退化；改变低层权重的符号可能反转$\\hat{h}_{l-1}$和$y$之间的关系。\n这些情况都是非常罕见的。\n没有标准化，几乎每一个更新都会对$h_{l-1}$的统计量有着极端的影响。\n因此，批标准化显著地使得模型更易学习。\n在这个示例中，容易学习的代价是使得底层网络没有用。\n在我们的线性示例中，较低层不再有任何有害的影响，但它们也不再有任何有益的影响。\n这是因为我们已经标准化了一阶和二阶统计量，这是线性网络可以影响的所有因素。\n在具有非线性激活函数的深度神经网络中，较低层可以进行数据的非线性变换，所以它们仍然是有用的。\n批标准化仅标准化每个单元的均值和方差，以稳定化学习，但允许单元和单个单元的非线性统计量之间的关系发生变化。\n\n由于网络的最后一层能够学习线性变换，实际上我们可能希望移除一层内单元之间的所有线性关系。\n事实上，这是~{Desjardins2015}中采用的方法，为批标准化提供了灵感。\n令人遗憾的是，消除所有的线性关联比标准化各个独立单元的均值和标准差代价更高，因此批标准化仍是迄今最实用的方法。\n\n<!-- % -- 311 -- -->\n\n标准化一个单元的均值和标准差会降低包含该单元的神经网络的表达能力。\n为了保持网络的表现力，通常会将批量隐藏单元激活$\\MH$替换为$\\gamma \\MH' + \\Vbeta$，而不是简单地使用标准化的$\\MH'$。\n变量$\\Vgamma$和$\\Vbeta$是允许新变量有任意均值和标准差的学习参数。\n乍一看，这似乎是无用的——为什么我们将均值设为$0$，然后又引入参数允许它被重设为任意值$\\Vbeta$？\n答案是新的参数可以表示旧参数作为输入的同一族函数，但是新参数有不同的学习动态。\n在旧参数中，$\\MH$的均值取决于$\\MH$下层中参数的复杂关联。\n在新参数中，$\\Vgamma \\MH' + \\Vbeta$的均值仅由$\\Vbeta$确定。\n新参数很容易通过梯度下降来学习。\n\n大多数神经网络层会采取$\\phi(\\MX\\MW+ \\Vb)$的形式，其中$\\phi$是某个固定的非线性激活函数，如整流线性变换。\n自然想到我们应该将批标准化应用于输入$\\MX$还是变换后的值$\\MX\\MW+\\Vb$。\n{Ioffe+Szegedy-2015}推荐后者。\n更具体地，$\\MX\\MW+\\Vb$应替换为$\\MX\\MW$的标准化形式。\n偏置项应被忽略，因为参数$\\Vbeta$会加入批标准化重参数化，它是冗余的。\n一层的输入通常是前一层的非线性激活函数（如整流线性函数）的输出。\n因此，输入的统计量更符合非高斯，而更不服从线性操作的标准化。\n\n\\chap?所述的卷积网络，在特征映射中每个空间位置同样地标准化$\\Vmu$和$\\Vsigma$是很重要的，能使特征映射的统计量在不同的空间位置，仍然保持相同。\n\n\n## 坐标下降\n\n在某些情况下，将一个优化问题分解成几个部分，可以更快地解决原问题。\n如果我们相对于某个单一变量$x_i$最小化$f(\\Vx)$，然后相对于另一个变量$x_j$等等，反复循环所有的变量，我们会保证到达（局部）极小值。\n这种做法被称为坐标下降，因为我们一次优化一个坐标。\n更一般地，块坐标下降是指对于某个子集的变量同时最小化。\n术语\"坐标下降\"通常既指块坐标下降，也指严格的单个坐标下降。\n\n<!-- % -- 312 -- -->\n\n当优化问题中的不同变量能够清楚地分成相对独立的组，或是当优化一组变量明显比优化所有变量效率更高时，坐标下降最有意义。\n例如，考虑代价函数\n\\begin{equation}\n    J(\\MH, \\MW) = \\sum_{i,j} |H_{i,j}| + \\sum_{i,j} \\left( \\MX - \\MW^\\top \\MH \\right)_{i,j}^2 .\n\\end{equation}\n该函数描述了一种被称为稀疏编码的学习问题，其目标是寻求一个权重矩阵$\\MW$，可以线性解码激活值矩阵$\\MH$以重构训练集$\\MX$。\n稀疏编码的大多数应用还涉及到权重衰减或$\\MW$列范数的约束，以避免极小$\\MH$和极大$\\MW$的病态解。\n\n函数$J$不是凸的。\n然而，我们可以将训练算法的输入分成两个集合：字典参数$\\MW$和编码表示$\\MH$。\n最小化关于这两者之一的任意一组变量的目标函数都是凸问题。\n因此，块坐标下降允许我们使用高效的凸优化算法，交替固定$\\MH$优化$\\MW$和固定$\\MW$优化$\\MH$。\n\n当一个变量的值很大程度地影响另一个变量的最优值时，坐标下降不是一个很好的方法，如函数$f(\\Vx)=(x_1 - x_2)^2+\\alpha(x_1^2 + x_2^2)$，其中$\\alpha$是正值常数。\n第一项鼓励两个变量具有相似的值，而第二项鼓励它们接近零。\n解是两者都为零。\n牛顿法可以一步解决这个问题，因为它是一个正定二次问题。\n但是，对于小值$\\alpha$而言，坐标下降会使进展非常缓慢，因为第一项不允许单个变量变为和其他变量当前值显著不同的值。\n\n\n\n## Polyak平均\n\nPolyak平均{cite?}会平均优化算法在参数空间访问轨迹中的几个点。\n如果$t$次迭代梯度下降访问了点$\\Vtheta^{(1)},\\dots,\\Vtheta^{(t)}$，那么Polyak平均算法的输出是$\\hat{\\Vtheta}^{(t)} = \\frac{1}{t} \\sum_i \\Vtheta^{(i)}$。\n在某些问题中，如梯度下降应用于凸问题时，这种方法具有较强的收敛保证。\n当应用于神经网络时，其验证更多是启发式的，但在实践中表现良好。\n基本想法是，优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。\n尽管两边所有位置的均值应比较接近谷底。\n\n<!-- % -- 313 -- -->\n\n在非凸问题中，优化轨迹的路径可以非常复杂，并且经过了许多不同的区域。\n包括参数空间中遥远过去的点，可能与当前点在代价函数上相隔很大的障碍，看上去不像一个有用的行为。\n其结果是，当应用Polyak平均于非凸问题时，通常会使用指数衰减计算平均值：\n\\begin{equation}\n    \\hat{\\Vtheta}^{(t)} = \\alpha \\hat{\\Vtheta}^{(t-1)} + (1-\\alpha) \\Vtheta^{(t)} .\n\\end{equation}\n\n这个计算平均值的方法被用于大量数值应用中。最近的例子请查看{Szegedy-et-al-2015}。\n\n\n## 监督预训练\n\n有时，如果模型太复杂难以优化，或是如果任务非常困难，直接训练模型来解决特定任务的挑战可能太大。\n有时训练一个较简单的模型来求解问题，然后使模型更复杂会更有效。\n训练模型来求解一个简化的问题，然后转移到最后的问题，有时也会更有效些。\n这些在直接训练目标模型求解目标问题之前，训练简单模型求解简化问题的方法统称为预训练。\n\n\n贪心算法将问题分解成许多部分，然后独立地在每个部分求解最优值。\n令人遗憾的是，结合各个最佳的部分不能保证得到一个最佳的完整解。\n然而，贪心算法计算上比求解最优联合解的算法高效得多，并且贪心算法的解在不是最优的情况下，往往也是可以接受的。\n贪心算法也可以紧接一个精调阶段，联合优化算法搜索全问题的最优解。\n使用贪心解初始化联合优化算法，可以极大地加速算法，并提高寻找到的解的质量。\n\n预训练算法，特别是贪心预训练，在深度学习中是普遍存在的。\n在本节中，我们会具体描述这些将监督学习问题分解成其他简化的监督学习问题的预训练算法。\n这种方法被称为贪心监督预训练。\n\n<!-- % -- 314 -- -->\n\n在贪心监督预训练的原始版本{cite?}中，每个阶段包括一个仅涉及最终神经网络的子集层的监督学习训练任务。\n贪心监督预训练的一个例子如\\fig?所示，其中每个附加的隐藏层作为浅层监督多层感知机的一部分预训练，以先前训练的隐藏层输出作为输入。\n{Simonyan2015}~预训练深度卷积网络（11层权重），然后使用该网络前四层和最后三层初始化更深的网络（多达19层权重），并非一次预训练一层。\n非常深的新网络的中间层是随机初始化的。\n然后联合训练新网络。\n还有一种选择，由{Yu+al-2010}提出，将先前训练多层感知机的\\emph{输出}，以及原始输入，作为每个附加阶段的输入。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter8/figures/deep_sup}}\n\\fi\n\\caption{一种形式的贪心监督预训练的示意图~{cite?}。\n(a)我们从训练一个足够浅的架构开始。\n(b)同一个架构的另一描绘。\n(c)我们只保留原始网络的输入到隐藏层，并丢弃隐藏到输出层。 \n我们将第一层隐藏层的输出作为输入发送到另一监督单隐层\\,MLP（使用与第一个网络相同的目标训练），从而可以添加第二层隐藏层。 \n这可以根据需要重复多层。\n(d)所得架构的另一种描绘，可视为前馈网络。 \n为了进一步改进优化，我们可以联合地精调所有层（仅在该过程的结束或者该过程的每个阶段）。\n}\n\\end{figure}\n\n\n为什么贪心监督预训练会有帮助呢？\n最初由~{Bengio-nips-2006}提出的假说是，其有助于更好地指导深层结构的中间层的学习。\n一般情况下，预训练对于优化和泛化都是有帮助的。\n\n另一个与监督预训练有关的方法扩展了迁移学习的想法：{yosinski-nips2014}在一组任务上预训练了$8$层权重的深度卷积网络（1000个ImageNet对象类的子集），然而用该网络的前$k$层初始化同样规模的网络。\n然后第二个网络的所有层（上层随机初始化）联合训练以执行不同的任务（1000个ImageNet对象类的另一个子集），但训练样本少于第一个任务。\n神经网络中另一个和迁移学习相关的方法将在\\sec?讨论。\n\n另一条相关的工作线是\\textbf{FitNets}~{cite?}方法。\n这种方法始于训练深度足够低和宽度足够大（每层单元数），容易训练的网络。\n然后，这个网络成为第二个网络（被指定为\\,\\textbf{学生}）的\\,\\textbf{老师}。\n学生网络更深更窄（11至19层），且在正常情况下很难用SGD训练。\n训练学生网络不仅需要预测原任务的输出，还需要预测教师网络中间层的值，这样使得训练学生网络变得更容易。\n这个额外的任务说明了隐藏层应如何使用，并且能够简化优化问题。\n附加参数被引入来从更深的学生网络中间层去回归$5$层教师网络的中间层。\n然而，该目标是预测教师网络的中间隐藏层，并非预测最终分类目标。\n学生网络的低层因而具有两个目标：帮助学生网络的输出完成其目标和预测教师网络的中间层。\n尽管一个窄而深的网络似乎比宽而浅的网络更难训练，但窄而深网络的泛化能力可能更好，\n并且如果其足够窄，参数足够少，那么其计算代价更小。\n没有隐藏层的提示，学生网络在训练集和测试集上的实验表现都很差。\n因而中间层的提示是有助于训练很难训练的网络的方法之一，但是其他优化技术或是架构上的变化也可能解决这个问题。\n\n<!-- % -- 316 -- -->\n\n\n## 设计有助于优化的模型\n\n改进优化的最好方法并不总是改进优化算法。\n相反，深度模型中优化的许多改进来自于设计易于优化的模型。\n\n原则上，我们可以使用呈锯齿非单调模式上上下下的激活函数，但是，这将使优化极为困难。\n在实践中，\\emph{选择一族容易优化的模型比使用一个强大的优化算法更重要}。\n神经网络学习在过去30年的大多数进步主要来自于改变模型族，而非改变优化过程。\n1980年代用于训练神经网络的带动量的随机梯度下降，仍然是现代神经网络应用中的前沿算法。\n\n具体来说，现代神经网络的\\emph{设计选择}体现在层之间的线性变换，几乎处处可导的激活函数，和大部分定义域都有明显的梯度。\n特别地，创新的模型，如\\,LSTM，整流线性单元和\\,maxout\\,单元都比先前的模型（如基于\\,sigmoid\\,单元的深度网络）使用更多的线性函数。\n这些模型都具有简化优化的性质。\n如果线性变换的\\,Jacobian\\,具有相对合理的奇异值，那么梯度能够流经很多层。\n此外，线性函数在一个方向上一致增加，所以即使模型的输出远离正确值，也可以简单清晰地计算梯度，使其输出方向朝降低损失函数的方向移动。\n换言之，现代神经网络的设计方案旨在使其\\emph{局部}梯度信息合理地对应着移向一个遥远的解。\n\n其他的模型设计策略有助于使优化更简单。\n例如，层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度，因而缓解了梯度消失的问题{cite?}。\n一个和跳跃连接相关的想法是添加和网络中间隐藏层相连的输出的额外副本，如GoogLeNet~{cite?}和深度监督网络{cite?}。\n这些\"辅助头\"被训练来执行和网络顶层主要输出相同的任务，以确保底层网络能够接受较大的梯度。\n当训练完成时，辅助头可能被丢弃。\n这是之前小节介绍到的预训练策略的替代方法。\n以这种方式，我们可以在一个阶段联合训练所有层，而不改变架构，使得中间层（特别是低层）能够通过更短的路径得到一些如何更新的有用信息。\n这些信息为底层提供了误差信号。\n\n<!-- % -- 317 -- -->\n\n\n## 延拓法和课程学习\n\n正如\\sec?探讨的，许多优化挑战都来自于代价函数的全局结构，不能仅通过局部更新方向上更好的估计来解决。\n解决这个问题的主要方法是尝试初始化参数到某种区域内，该区域可以通过局部下降很快连接到参数空间中的解。\n\n\n延拓法是一族通过挑选初始点使优化更容易的方法，以确保局部优化花费大部分时间在表现良好的空间。\n延拓法的背后想法是构造一系列具有相同参数的目标函数。\n为了最小化代价函数 $J(\\Vtheta)$，我们构建新的代价函数 $\\{J^{(0)},\\dots,J^{(n)}\\}$。\n这些代价函数的难度逐步提高，其中$J^{(0)}$是最容易最小化的，$J^{(n)}$是最难的，真正的代价函数驱动整个过程。\n当我们说$J^{(i)}$比$J^{(i+1)}$更容易时，是指其在更多的$\\Vtheta$空间上表现良好。\n随机初始化更有可能落入局部下降可以成功最小化代价函数的区域，因为其良好区域更大。\n这系列代价函数设计为前一个解是下一个的良好初始点。\n因此，我们首先解决一个简单的问题，然后改进解以解决逐步变难的问题，直到我们求解真正问题的解。\n\n传统的延拓法（用于神经网络训练之前的延拓法）通常基于平滑目标函数。\n读者可以查看~{Wu-97}了解这类方法的示例，以及一些相关方法的综述。\n延拓法也和参数中加入噪声的模拟退火紧密相关{cite?}。\n延拓法在最近几年非常成功。\n参考~{Mobahi+Fisher-AAAI2015}了解近期文献的概述，特别是在~AI~方面的应用。\n\n<!-- % -- 318 -- -->\n\n传统上，延拓法主要用来克服局部极小值的问题。\n具体地，它被设计来在有很多局部极小值的情况下，求解一个全局最小点。\n这些连续方法会通过\"模糊\"原来的代价函数来构建更容易的代价函数。\n这些模糊操作可以是用采样来近似\n\\begin{equation}\n    J^{(i)}(\\Vtheta) = \\SetE_{\\theta' \\sim \\mathcal{N}(\\Vtheta'; \\Vtheta, \\sigma^{(i)2})} J(\\Vtheta')\n\\end{equation}\n这个方法的直觉是有些非凸函数在模糊后会近似凸的。\n在许多情况下，这种模糊保留了关于全局极小值的足够信息，我们可以通过逐步求解模糊更少的问题来求解全局极小值。\n这种方法有三种可能失败的方式。\n首先，它可能成功地定义了一连串代价函数，并从开始的一个凸函数起（逐一地）沿着函数链最佳轨迹逼近全局最小值，但可能需要非常多的逐步代价函数，整个过程的成本仍然很高。\n另外，即使延拓法可以适用，NP-hard的优化问题仍然是NP-hard。\n其他两种延拓法失败的原因是不实用。\n其一，不管如何模糊，函数都没法变成凸的，比如函数$J(\\Vtheta) = -\\Vtheta^\\top \\Vtheta$。\n其二，函数可能在模糊后是凸的，但模糊函数的最小值可能会追踪到一个局部最小值，而非原始代价函数的全局最小值。\n\n\n尽管延拓法最初用来解决局部最小值的问题，而局部最小值已不再认为是神经网络优化中的主要问题了。\n幸运的是，延拓法仍然有所帮助。\n延拓法引入的简化目标函数能够消除平坦区域，减少梯度估计的方差，提高\\,Hessian\\,矩阵的条件数，使局部更新更容易计算，或是改进局部更新方向与朝向全局解方向之间的对应关系。\n\n{Bengio+al-2009}指出被称为课程学习或者塑造, % ？ 整的方法可以被解释为延拓法。\n课程学习基于规划学习过程的想法，首先学习简单的概念，然后逐步学习依赖于这些简化概念的复杂概念。\n之前这一基本策略被用来加速动物训练过程{cite?}和机器学习过程{cite?}。\n{Bengio+al-2009}验证这一策略为延拓法，通过增加简单样本的影响（通过分配它们较大的系数到代价函数，或者更频繁地采样），先前的$J^{(i)}$会变得更容易。\n实验证明，在大规模的神经语言模型任务上使用课程学习，可以获得更好的结果。\n课程学习已经成功应用于大量的自然语言{cite?}和计算机视觉{cite?}任务上。\n课程学习被证实为与人类教学方式一致{cite?}：\n教师刚开始会展示更容易、更典型的示例，然后帮助学习者在不太显然的情况下提炼决策面。\n在人类教学上，基于课程学习的策略比基于样本均匀采样的策略\\emph{更有效}，也能提高其他学习策略的效率{cite?}。\n\n<!-- % -- 319 -- -->\n\n课程学习研究的另一个重要贡献体现在训练循环神经网络捕获长期依赖：\n{Zaremba+Sutskever-arxiv2014}发现使用\\emph{随机课程}获得了更好的结果，其中容易和困难的示例混合在一起，随机提供给学习者，更难示例（这些具有长期依赖）的平均比例在逐渐上升。\n而使用确定性课程，并没有发现超过基线（完整训练集的普通训练）的改进。\n\n现在我们已经介绍了一些基本的神经网络模型，以及如何进行正则化和优化。\n在接下来的章节中，我们转向特化的神经网络家族，允许其扩展到能够处理很大规模的数据和具有特殊结构的数据。\n在本章中讨论的优化算法在较少改动后或者无需改动，通常就可以直接用于这些特化的架构。\n\n<!-- % -- 320 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-09-Chapter9_convolutional_networks.md",
    "content": "---\ntitle: 卷积网络\nlayout: post\nshare: false\n---\n\n卷积网络{cite?}，也叫做卷积神经网络，是一种专门用来处理具有类似网格结构的数据的神经网络。\n例如时间序列数据（可以认为是在时间轴上有规律地采样形成的一维网格）和图像数据（可以看作是二维的像素网格）。\n卷积网络在诸多应用领域都表现优异。\n\"卷积神经网络\"一词表明该网络使用了卷积这种数学运算。\n卷积是一种特殊的线性运算。\n\\emph{卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。}\n\n本章，我们首先说明什么是卷积运算。\n接着，我们会解释在神经网络中使用卷积运算的动机。\n然后我们会介绍池化，这是一种几乎所有的卷积网络都会用到的操作。\n通常来说，卷积神经网络中用到的卷积运算和其他领域（例如工程领域以及纯数学领域）中的定义并不完全一致。\n我们会对神经网络实践中广泛应用的几种卷积函数的变体进行说明。\n我们也会说明如何在多种不同维数的数据上使用卷积运算。\n之后我们讨论使得卷积运算更加高效的一些方法。\n卷积网络是神经科学原理影响深度学习的典型代表。\n我们之后也会讨论这些神经科学的原理，并对卷积网络在深度学习发展史中的作用作出评价。\n本章没有涉及如何为你的卷积网络选择合适的结构，因为本章的目标是说明卷积网络提供的各种工具。\n\\chap?将会对如何在具体环境中选择使用相应的工具给出通用的准则。\n对于卷积网络结构的研究进展得如此迅速，以至于针对特定基准(benchmark)，数月甚至几周就会公开一个新的最优的网络结构，甚至在写这本书时也不好描述究竟哪种结构是最好的。\n然而，最好的结构也是由本章所描述的基本部件逐步搭建起来的。\n\n<!-- % -- 321 -- -->\n \n\n# 卷积运算\n\n\n在通常形式中，卷积是对两个实变函数的一种数学运算\\footnote{译者注：本书中operation视语境有时翻译成\"运算\"，有时翻译成\"操作\"。}。\n为了给出卷积的定义，我们从两个可能会用到的函数的例子出发。\n\n假设我们正在用激光传感器追踪一艘宇宙飞船的位置。\n我们的激光传感器给出一个单独的输出$x(t)$，表示宇宙飞船在时刻$t$ 的位置。\n$x$和$t$都是实值的，这意味着我们可以在任意时刻从传感器中读出飞船的位置。\n\n现在假设我们的传感器受到一定程度的噪声干扰。\n为了得到飞船位置的低噪声估计，我们对得到的测量结果进行平均。\n显然，时间上越近的测量结果越相关，所以我们采用一种加权平均的方法，对于最近的测量结果赋予更高的权重。\n我们可以采用一个加权函数$w(a)$ 来实现，其中$a$表示测量结果距当前时刻的时间间隔。\n如果我们对任意时刻都采用这种加权平均的操作，就得到了一个新的对于飞船位置的平滑估计函数$s$：\n\\begin{equation}\ns(t) = \\int x(a)w(t-a)da.\n\\end{equation}\n\n这种运算就叫做卷积。\n卷积运算通常用星号表示：\n\\begin{equation}\ns(t) = (x*w)(t).\n\\end{equation}\n\n在我们的例子中，$w$必须是一个有效的概率密度函数，否则输出就不再是一个加权平均。\n另外，在参数为负值时，$w$的取值必须为0，否则它会预测到未来，这不是我们能够推测得了的。\n但这些限制仅仅是对我们这个例子来说。\n通常，卷积被定义在满足上述积分式的任意函数上，并且也可能被用于加权平均以外的目的。\n\n在卷积网络的术语中，卷积的第一个参数（在这个例子中，函数$x$）通常叫做输入，第二个参数（函数$w$）叫做核函数。\n输出有时被称作特征映射。\n\n<!-- % -- 322 -- -->\n \n在本例中，激光传感器在每个瞬间反馈测量结果的想法是不切实际的。\n一般地，当我们用计算机处理数据时，时间会被离散化，传感器会定期地反馈数据。\n所以在我们的例子中，假设传感器每秒反馈一次测量结果是比较现实的。\n这样，时刻$t$只能取整数值。\n如果我们假设$x$和$w$都定义在整数时刻$t$上，就可以定义离散形式的卷积：\n\\begin{equation}\ns(t) = (x*w)(t) = \\sum_{a = -\\infty}^{\\infty} x(a)w(t-a).\n\\end{equation}\n\n在机器学习的应用中，输入通常是多维数组的数据，而核通常是由学习算法优化得到的多维数组的参数。\n我们把这些多维数组叫做张量。\n因为在输入与核中的每一个元素都必须明确地分开存储，我们通常假设在存储了数值的有限点集以外，这些函数的值都为零。\n这意味着在实际操作中，我们可以通过对有限个数组元素的求和来实现无限求和。\n\n最后，我们经常一次在多个维度上进行卷积运算。\n例如，如果把一张二维的图像$I$作为输入，我们也许也想要使用一个二维的核$K$：\n\\begin{equation}\nS(i,j) = (I*K)(i,j) = \\sum_m \\sum_n I(m,n) K(i-m, j-n).\n\\end{equation}\n\n卷积是可交换的(commutative)，我们可以等价地写作：\n\\begin{equation}\nS(i, j) = (K*I)(i,j) = \\sum_m \\sum_n I(i-m, j-n) K(m, n).\n\\end{equation}\n\n通常，下面的公式在机器学习库中实现更为简单，因为$m$和$n$的有效取值范围相对较小。\n\n<!-- % -- 323 -- -->\n \n卷积运算可交换性的出现是因为我们将核相对输入进行了翻转，从$m$增大的角度来看，输入的索引在增大，但是核的索引在减小。\n我们将核翻转的唯一目的是实现可交换性。\n尽管可交换性在证明时很有用，但在神经网络的应用中却不是一个重要的性质。\n与之不同的是，许多神经网络库会实现一个相关的函数，称为互相关函数，和卷积运算几乎一样但是并没有对核进行翻转：\n\\begin{equation}\nS(i, j) = (I*K)(i, j) = \\sum_m \\sum_n I(i+m, j+n) K(m, n).\n\\end{equation}\n许多机器学习的库实现的是互相关函数但是称之为卷积。\n在这本书中我们遵循把两种运算都叫做卷积的这个传统，在与核翻转有关的上下文中，我们会特别指明是否对核进行了翻转。\n在机器学习中，学习算法会在核合适的位置学得恰当的值， 所以一个基于核翻转的卷积运算的学习算法所学得的核，是对未进行翻转的算法学得的核的翻转。\n单独使用卷积运算在机器学习中是很少见的，卷积经常与其他的函数一起使用，无论卷积运算是否对它的核进行了翻转，这些函数的组合通常是不可交换的。\n\n\\fig?演示了一个在2维张量上的卷积运算（没有对核进行翻转）的例子。\n<!-- % fig 9.1 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/conv_2d}}\n\\fi\n\\caption{一个2维卷积的例子（没有对核进行翻转）。\n我们限制只对核完全处在图像中的位置进行输出，在一些上下文中称为\"有效\"卷积。\n我们用画有箭头的盒子来说明输出张量的左上角元素是如何通过对输入张量相应的左上角区域应用核进行卷积得到的。}\n\\end{figure}\n\n离散卷积可以看作矩阵的乘法，然而，这个矩阵的一些元素被限制为必须和另外一些元素相等。\n例如对于单变量的离散卷积，矩阵每一行中的元素都与上一行对应位置平移一个单位的元素相同。\n这种矩阵叫做Toeplitz矩阵。\n对于二维情况，卷积对应着一个双重分块循环矩阵。\n<!-- %这里不是很理解双重分块循环矩阵 -->\n除了这些元素相等的限制以外，卷积通常对应着一个非常稀疏的矩阵（一个几乎所有元素都为零的矩阵）。\n这是因为核的大小通常要远小于输入图像的大小。任何一个使用矩阵乘法但是并不依赖矩阵结构的特殊性质的神经网络算法，都适用于卷积运算，并且不需要对神经网络做出大的修改。\n典型的卷积神经网络为了更有效地处理大规模输入，确实使用了一些专门化的技巧，但这些在理论分析方面并不是严格必要的。\n\n<!-- % -- 324 -- -->\n \n\n# 动机\n\n\n卷积运算通过三个重要的思想来帮助改进机器学习系统：稀疏交互、参数共享、等变表示。\n另外，卷积提供了一种处理大小可变的输入的方法。\n我们下面依次介绍这些思想。\n\n传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。%\\footnote{译者注：这里可以粗略地理解为输入$\\times$参数矩阵=输出。}\n其中，参数矩阵中每一个单独的参数都描述了一个输入单元与一个输出单元间的交互。\n这意味着每一个输出单元与每一个输入单元都产生交互。\n然而，卷积网络具有稀疏交互（也叫做稀疏连接或者稀疏权重）的特征。\n这是使核的大小远小于输入的大小来达到的。\n举个例子，当处理一张图像时，输入的图像可能包含成千上万个像素点，但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征，例如图像的边缘。\n这意味着我们需要存储的参数更少，不仅减少了模型的存储需求，而且提高了它的统计效率。\n这也意味着为了得到输出我们只需要更少的计算量。\n这些效率上的提高往往是很显著的。\n如果有$m$个输入和$n$个输出，那么矩阵乘法需要$m \\times n$个参数并且相应算法的时间复杂度为$O(m\\times n)$（对于每一个例子）。\n如果我们限制每一个输出拥有的连接数为$k$，那么稀疏的连接方法只需要$k\\times n$个参数以及$O(k\\times n)$的运行时间。\n在很多实际应用中，只需保持$k$比$m$小几个数量级，就能在机器学习的任务中取得好的表现。\n稀疏连接的图形化解释如\\fig?和\\fig?所示。\n在深度卷积网络中，处在网络深层的单元可能与绝大部分输入是\\emph{间接}交互的，如\\fig?所示。\n这允许网络可以通过只描述稀疏交互的基石来高效地描述多个变量的复杂交互。\n<!-- % fig 9.2 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/area_of_effect}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[Caption for LOF]{稀疏连接，对每幅图从下往上看。\n我们强调了一个输入单元$x_3$以及在$\\Vs$中受该单元影响的输出单元。\n\\emph{(上)}当$\\Vs$是由核宽度为3的卷积产生时，只有三个输出受到$\\Vx$的影响\\protect\\footnotemark。\n\\emph{(下)}当$\\Vs$是由矩阵乘法产生时，连接不再是稀疏的，所以所有的输出都会受到$x_3$的影响。}\n\\end{figure}\n<!-- % \\footnotetext{译者注：译者认为此处应当是$x_3$。} -->\n\n<!-- % fig 9.3 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/receptive_field}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[Caption for LOF]{稀疏连接，对每幅图从上往下看。\n我们强调了一个输出单元$s_3$以及$\\Vx$中影响该单元的输入单元。\n这些单元被称为$s_3$的接受域\\protect\\footnotemark。\n\\emph{(上)}当$\\Vs$是由核宽度为3的卷积产生时，只有三个输入影响$s_3$。\n\\emph{(下)}当$\\Vs$是由矩阵乘法产生时，连接不再是稀疏的，所以所有的输入都会影响$s_3$。}\n\\end{figure}\n<!-- %\\footnotetext{译者注：在生物中称之为\"感受野\"。} -->\n\n<!-- % fig 9.4 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/deep_receptive_field}}\n\\fi\n\\caption{处于卷积网络更深的层中的单元，它们的接受域要比处在浅层的单元的接受域更大。\n如果网络还包含类似步幅卷积（\\fig?）或者池化（\\sec?）之类的结构特征，这种效应会加强。\n这意味着在卷积网络中尽管\\emph{直接}连接都是很稀疏的，但处在更深的层中的单元可以\\emph{间接地}连接到全部或者大部分输入图像。}\n\\end{figure}\n\n<!-- % -- 325 -- -->\n \n参数共享是指在一个模型的多个函数中使用相同的参数。\n在传统的神经网络中，当计算一层的输出时，权重矩阵的每一个元素只使用一次，当它乘以输入的一个元素后就再也不会用到了。\n作为参数共享的同义词，我们可以说一个网络含有绑定的权重，因为用于一个输入的权重也会被绑定在其他的权重上。\n在卷积神经网络中，核的每一个元素都作用在输入的每一位置上（是否考虑边界像素取决于对边界决策的设计）。\n卷积运算中的参数共享保证了我们只需要学习一个参数集合，而不是对于每一位置都需要学习一个单独的参数集合。\n这虽然没有改变前向传播的运行时间（仍然是$O(k\\times n)$），但它显著地把模型的存储需求降低至$k$个参数，并且$k$通常要比$m$小很多个数量级。\n因为$m$ 和$n$通常有着大致相同的大小，$k$在实际中相对于$m\\times n$是很小的。\n因此，卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。\n\\fig?演示了参数共享是如何实现的。\n<!-- % fig 9.5 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/parameter_sharing}}\n\\fi\n\\caption{参数共享。\n黑色箭头表示在两个不同的模型中使用了特殊参数的连接。\n\\emph{(上)}黑色箭头表示在卷积模型中对3元素核的中间元素的使用。\n因为参数共享，这个单独的参数被用于所有的输入位置。\n\\emph{(下)}这个单独的黑色箭头表示在全连接模型中对权重矩阵的中间元素的使用。\n这个模型没有使用参数共享，所以参数只使用了一次。}\n\\end{figure}\n<!-- % -- 326 -- -->\n \n<!-- % -- 327 -- -->\n \n作为前两条原则的一个实际例子，\\fig?说明了稀疏连接和参数共享是如何显著提高线性函数在一张图像上进行边缘检测的效率的。\n<!-- % fig 9.6 -->\n\\begin{figure}\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering    \n\\includegraphics[width=0.35\\textwidth]{Chapter9/figures/sundance.png}}     \n\\includegraphics[width=0.35\\textwidth]{Chapter9/figures/edges.png}}     \n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{边缘检测的效率。\n右边的图像是通过先获得原始图像中的每个像素，然后减去左边相邻像素的值而形成的。\n这个操作给出了输入图像中所有垂直方向上的边缘的强度，对目标检测来说是有用的。\n两个图像的高度均为280个像素。\n输入图像的宽度为320个像素，而输出图像的宽度为319个像素。\n这个变换可以通过包含两个元素的卷积核来描述，使用卷积需要$319\\times 280\\times 3 = 267,960$次浮点运算（每个输出像素需要两次乘法和一次加法）。\n为了用矩阵乘法描述相同的变换，需要一个包含$320\\times 280\\times 319\\times 280$个或者说超过80亿个元素的矩阵，这使得卷积对于表示这种变换更有效40亿倍。\n直接运行矩阵乘法的算法将执行超过160亿次浮点运算，这使得卷积在计算上大约有60,000倍的效率。\n当然，矩阵的大多数元素将为零。\n如果我们只存储矩阵的非零元，则矩阵乘法和卷积都需要相同数量的浮点运算来计算。\n矩阵仍然需要包含$2\\times 319\\times 280=178,640$个元素。\n将小的局部区域上的相同线性变换应用到整个输入上，卷积是描述这种变换的极其有效的方法。\n照片来源：Paula Goodfellow。}   \n\\end{figure}\n<!-- % -- 328 -- -->\n \n对于卷积，参数共享的特殊形式使得神经网络层具有对平移等变的性质。\n如果一个函数满足输入改变，输出也以同样的方式改变这一性质，我们就说它是等变(equivariant)的。\n特别地，如果函数$f(x)$与$g(x)$满足$f(g(x))= g(f(x))$，我们就说$f(x)$对于变换$g$具有等变性。\n对于卷积来说，如果令$g$是输入的任意平移函数，那么卷积函数对于$g$具有等变性。\n举个例子，令$I$表示图像在整数坐标上的亮度函数，$g$表示图像函数的变换函数（把一个图像函数映射到另一个图像函数的函数）使得$I' = g(I)$，其中图像函数$I'$满足$I'(x,y) = I(x-1, y)$。\n这个函数把$I$中的每个像素向右移动一个单位。\n如果我们先对$I$进行这种变换然后进行卷积操作所得到的结果，与先对$I$进行卷积然后再对输出使用平移函数$g$得到的结果是一样的\\footnote{译者注：原文将此处误写成了$I'$。} 。%译者注\n当处理时间序列数据时，这意味着通过卷积可以得到一个由输入中出现不同特征的时刻所组成的时间轴。\n如果我们把输入中的一个事件向后延时，在输出中仍然会有完全相同的表示，只是时间延后了。\n图像与之类似，卷积产生了一个2维映射来表明某些特征在输入中出现的位置。\n如果我们移动输入中的对象，它的表示也会在输出中移动同样的量。\n当处理多个输入位置时，一些作用在邻居像素的函数是很有用的。\n例如在处理图像时，在卷积网络的第一层进行图像的边缘检测是很有用的。\n相同的边缘或多或少地散落在图像的各处，所以应当对整个图像进行参数共享。\n但在某些情况下，我们并不希望对整幅图进行参数共享。\n例如，在处理已经通过剪裁而使其居中的人脸图像时，我们可能想要提取不同位置上的不同特征（处理人脸上部的部分网络需要去搜寻眉毛，处理人脸下部的部分网络就需要去搜寻下巴了）。\n\n<!-- % -- 329 -- -->\n \n卷积对其他的一些变换并不是天然等变的，例如对于图像的放缩或者旋转变换，需要其他的一些机制来处理这些变换。\n\n最后，一些不能被传统的由（固定大小的）矩阵乘法定义的神经网络处理的特殊数据，可能通过卷积神经网络来处理，我们将在\\sec?中进行讨论。\n\n\n# 池化\n\n\n卷积网络中一个典型层包含三级（如\\fig?所示）。\n在第一级中，这一层并行地计算多个卷积产生一组线性激活响应。\n在第二级中，每一个线性激活响应将会通过一个非线性的激活函数，例如整流线性激活函数。\n这一级有时也被称为探测级。\n在第三级中，我们使用池化函数来进一步调整这一层的输出。\n<!-- % fig 9.7 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/conv_layer}}\n\\fi\n\\caption{一个典型卷积神经网络层的组件。\n有两组常用的术语用于描述这些层。\n\\emph{(左)}在这组术语中，卷积网络被视为少量相对复杂的层，每层具有许多\"级\"。\n在这组术语中，核张量与网络层之间存在一一对应关系。\n在本书中，我们通常使用这组术语。\n\\emph{(右)}在这组术语中，卷积网络被视为更多数量的简单层；每一个处理步骤都被认为是一个独立的层。\n这意味着不是每一\"层\"都有参数。}\n\\end{figure}\n\n池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。\n例如，最大池化函数{cite?}给出相邻矩形区域内的最大值。\n其他常用的池化函数包括相邻矩形区域内的平均值、$L^2$范数以及基于据中心像素距离的加权平均函数。\n\n<!-- % -- 330 -- -->\n \n不管采用什么样的池化函数，当输入作出少量平移时，池化能够帮助输入的表示近似不变。\n对于平移的不变性是指当我们对输入进行少量平移时，经过池化函数后的大多数输出并不会发生改变。\n\\fig?用了一个例子来说明这是如何实现的。\n\\emph{局部平移不变性是一个很有用的性质，尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时}。\n例如，当判定一张图像中是否包含人脸时，我们并不需要知道眼睛的精确像素位置，我们只需要知道有一只眼睛在脸的左边，有一只在右边就行了。\n但在一些其他领域，保存特征的具体位置却很重要。\n例如当我们想要寻找一个由两条边相交而成的拐角时，我们就需要很好地保存边的位置来判定它们是否相交。\n<!-- % fig 9.8 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/max_pool_invariance}}\n\\fi\n\\caption{最大池化引入了不变性。\n\\emph{(上)}卷积层中间输出的视图。\n下面一行显示非线性的输出。\n上面一行显示最大池化的输出，每个池的宽度为三个像素并且池化区域的步幅为一个像素。\n\\emph{(下)}相同网络的视图，不过对输入右移了一个像素。\n下面一行的所有值都发生了改变，但上面一行只有一半的值发生了改变，这是因为最大池化单元只对周围的最大值比较敏感，而不是对精确的位置。}\n\\end{figure}\n\n<!-- % -- 331 -- -->\n \n使用池化可以看作是增加了一个无限强的先验：这一层学得的函数必须具有对少量平移的不变性。\n当这个假设成立时，池化可以极大地提高网络的统计效率。\n\n对空间区域进行池化产生了平移不变性，但当我们对分离参数的卷积的输出进行池化时，特征能够学得应该对于哪种变换具有不变性（如\\fig?所示）。\n<!-- % fig 9.9 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/learned_rotation}}\n\\fi\n\\caption{学习不变性的示例。\n使用分离的参数学得多个特征，再使用池化单元进行池化，可以学得对输入的某些变换的不变性。\n这里我们展示了用三个学得的过滤器和一个最大池化单元可以学得对旋转变换的不变性。\n这三个过滤器都旨在检测手写的数字5。\n每个过滤器尝试匹配稍微不同方向的5。\n当输入中出现5时，相应的过滤器会匹配它并且在探测单元中引起大的激活。\n然后，无论哪个探测单元被激活，最大池化单元都具有大的激活。\n我们在这里演示了网络如何处理两个不同的输入，这导致两个不同的探测单元被激活，然而对池化单元的影响大致相同。\n这个原则在\\,maxout\\,网络{cite?}和其他卷积网络中更有影响。\n空间位置上的最大池化对于平移是天然不变的；这种多通道方法只在学习其他变换时是必要的。}\n\\end{figure}\n\n<!-- % -- 332 -- -->\n \n因为池化综合了全部邻居的反馈，这使得池化单元少于探测单元成为可能，我们可以通过综合池化区域的$k$个像素的统计特征而不是单个像素来实现。\n\\fig?给出了一个例子。\n这种方法提高了网络的计算效率，因为下一层少了约$k$ 倍的输入。\n当下一层的参数数目是关于那一层输入大小的函数时（例如当下一层是全连接的基于矩阵乘法的网络层时），这种对于输入规模的减小也可以提高统计效率并且减少对于参数的存储需求。\n<!-- % fig 9.10 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/pool_downsample}}\n\\fi\n\\caption{带有降采样的池化。\n这里我们使用最大池化，池的宽度为三并且池之间的步幅为二。\n这使得表示的大小减少了一半，减轻了下一层的计算和统计负担。\n注意到最右边的池化区域尺寸较小，但如果我们不想忽略一些探测单元的话就必须包含这个区域。}\n\\end{figure}\n\n<!-- % -- 333 -- -->\n \n在很多任务中，池化对于处理不同大小的输入具有重要作用。\n例如我们想对不同大小的图像进行分类时，分类层的输入必须是固定的大小，而这通常通过调整池化区域的偏置大小来实现，这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。\n例如，最终的池化层可能会输出四组综合统计特征，每组对应着图像的一个象限，而与图像的大小无关。\n\n一些理论工作对于在不同情况下应当使用哪种池化函数给出了一些指导{cite?}。\n将特征一起动态地池化也是可行的，例如，对于感兴趣特征的位置运行聚类算法{cite?}。\n这种方法对于每幅图像产生一个不同的池化区域集合。\n另一种方法是先\\emph{学习}一个单独的池化结构，再应用到全部的图像中{cite?}。\n\n池化可能会使得一些利用自顶向下信息的神经网络结构变得复杂，例如玻尔兹曼机和自编码器。\n这些问题将在\\chap?中当我们遇到这些类型的网络时进一步讨论。\n卷积玻尔兹曼机中的池化出现在\\sec?。\n一些可微网络中需要的在池化单元上进行的类逆运算将在\\sec?中讨论。\n\n\\fig?给出了一些使用卷积和池化操作的用于分类的完整卷积网络结构的例子。\n<!-- % fig 9.11 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/cnn_classifier}}\n\\fi\n\\caption{卷积网络用于分类的结构示例。\n本图中使用的具体步幅和深度并不建议实际使用；它们被设计得非常浅以适合页面。\n实际的卷积网络还常常涉及大量的分支，不同于这里为简单起见所使用的链式结构。\n\\emph{(左)}处理固定大小的图像的卷积网络。\n在卷积层和池化层几层交替之后，卷积特征映射的张量被重新变形以展平空间维度。\n网络的其余部分是一个普通的前馈网络分类器，如\\chap?所述。\n\\emph{(中)}处理大小可变的图像的卷积网络，但仍保持全连接的部分。\n该网络使用具有可变大小但是数量固定的池的池化操作，以便向网络的全连接部分提供固定576个单位大小的向量。 \n\\emph{(右)}没有任何全连接权重层的卷积网络。\n相对的，最后的卷积层为每个类输出一个特征映射。\n该模型可能会用来学习每个类出现在每个空间位置的可能性的映射。\n将特征映射进行平均得到的单个值，提供了顶部softmax分类器的变量。}\n\\end{figure}\n\n\n# 卷积与池化作为一种无限强的先验\n\n\n回忆一下\\sec?中先验概率分布的概念。\n这是一个模型参数的概率分布，它刻画了在我们看到数据之前我们认为什么样的模型是合理的信念。\n\n<!-- % -- 334 -- -->\n \n先验被认为是强或者弱取决于先验中概率密度的集中程度。\n弱先验具有较高的熵值，例如方差很大的高斯分布。这样的先验允许数据对于参数的改变具有或多或少的自由性。\n强先验具有较低的熵值，例如方差很小的高斯分布。这样的先验在决定参数最终取值时起着更加积极的作用。\n\n一个无限强的先验需要对一些参数的概率置零并且完全禁止对这些参数赋值，无论数据对于这些参数的值给出了多大的支持。\n\n我们可以把卷积网络类比成全连接网络，但对于这个全连接网络的权重有一个无限强的先验。\n这个无限强的先验是说一个隐藏单元的权重必须和它邻居的权重相同，但可以在空间上移动。\n这个先验也要求除了那些处在隐藏单元的小的空间连续的接受域内的权重以外，其余的权重都为零。\n<!-- %这样翻译对吗？其实这里加个图更好 -->\n总之，我们可以把卷积的使用当作是对网络中一层的参数引入了一个无限强的先验概率分布。\n这个先验说明了该层应该学得的函数只包含局部连接关系并且对平移具有等变性。\n类似的，使用池化也是一个无限强的先验：每一个单元都具有对少量平移的不变性。\n\n当然，把卷积神经网络当作一个具有无限强先验的全连接网络来实现会导致极大的计算浪费。\n但把卷积神经网络想成具有无限强先验的全连接网络可以帮助我们更好地洞察卷积神经网络是如何工作的。\n\n其中一个关键的洞察是卷积和池化可能导致欠拟合。\n与任何其他先验类似，卷积和池化只有当先验的假设合理且正确时才有用。\n如果一项任务依赖于保存精确的空间信息，那么在所有的特征上使用池化将会增大训练误差。\n一些卷积网络结构~{cite?}为了既获得具有较高不变性的特征又获得当平移不变性不合理时不会导致欠拟合的特征，被设计成在一些通道上使用池化而在另一些通道上不使用。\n当一项任务涉及到要对输入中相隔较远的信息进行合并时，那么卷积所利用的先验可能就不正确了。\n\n另一个关键洞察是当我们比较卷积模型的统计学习表现时，只能以基准中的其他卷积模型作为比较的对象。\n其他不使用卷积的模型即使我们把图像中的所有像素点都置换后依然有可能进行学习。\n对于许多图像数据集，还有一些分别的基准，有些是针对那些具有置换不变性并且必须通过学习发现拓扑结构的模型，还有一些是针对模型设计者将空间关系的知识植入了它们的模型。\n\n<!-- % -- 336 -- -->\n\n\n# 基本卷积函数的变体\n\n\n当在神经网络的上下文中讨论卷积时，我们通常不是特指数学文献中使用的那种标准的离散卷积运算。\n实际应用中的函数略有不同。\n这里我们详细讨论一下这些差异，并且对神经网络中用到的函数的一些重要性质进行重点说明。\n\n首先，当我们提到神经网络中的卷积时，我们通常是指由多个并行卷积组成的运算。\n这是因为具有单个核的卷积只能提取一种类型的特征，尽管它作用在多个空间位置上。\n我们通常希望网络的每一层能够在多个位置提取多种类型的特征。\n\n另外，输入通常也不仅仅是实值的网格，而是由一系列观测数据的向量构成的网格。\n例如，一幅彩色图像在每一个像素点都会有红绿蓝三种颜色的亮度。\n在多层的卷积网络中，第二层的输入是第一层的输出，通常在每个位置包含多个不同卷积的输出。\n当处理图像时，我们通常把卷积的输入输出都看作是3维的张量，其中一个索引用于标明不同的通道（例如红绿蓝），另外两个索引标明在每个通道上的空间坐标。\n软件实现通常使用批处理模式，所以实际上会使用4维的张量，第四维索引用于标明批处理中不同的实例，但我们为简明起见这里忽略批处理索引。\n\n因为卷积网络通常使用多通道的卷积，所以即使使用了核翻转， 也不一定保证网络的线性运算是可交换的。\n只有当其中的每个运算的输出和输入具有相同的通道数时，这些多通道的运算才是可交换的。\n\n假定我们有一个4维的核张量$\\TSK$，它的每一个元素是$\\TEK_{i,j,k,l}$，表示输出中处于通道$i$的一个单元和输入中处于通道$j$中的一个单元的连接强度，并且在输出单元和输入单元之间有$k$行$l$列的偏置。\n假定我们的输入由观测数据$\\TSV$组成，它的每一个元素是$\\TEV_{i,j,k}$，表示处在通道$i$中第$j$行第$k$列的值。\n假定我们的输出$\\TSZ$和输入$\\TSV$具有相同的形式。\n如果输出$\\TSZ$是通过对$\\TSK$和$\\TSV$进行卷积而不涉及翻转$\\TSK$得到的，那么\n\\begin{equation}\n\\TEZ_{i,j,k} = \\sum_{l,m,n} \\TEV_{l, j+m-1, k+n-1} \\TEK_{i,l,m,n},\n\\end{equation}\n这里对所有的$l$，$m$和$n$进行求和是对所有（在求和式中）有效的张量索引的值进行求和。\n在线性代数中，向量的索引通常从1开始，这就是上述公式中$-1$的由来。\n但是像C或Python这类编程语言索引通常从0开始，这使得上述公式可以更加简洁。\n\n<!-- % -- 337 -- -->\n \n我们有时会希望跳过核中的一些位置来降低计算的开销（相应的代价是提取特征没有先前那么好了）。\n我们可以把这一过程看作是对全卷积函数输出的下采样(downsampling)。\n如果我们只想在输出的每个方向上每间隔$s$个像素进行采样，那么我们可以定义一个下采样卷积函数$c$使得\n\\begin{equation}\n\\TEZ_{i,j,k} = c(\\TSK, \\TSV, s)_{i,j,k} = \\sum_{l,m,n} [\\TEV_{l,(j-1)\\times s+m, (k-1)\\times s +n,}\n \\TEK_{i,l,m,n}].\n\\end{equation}\n我们把$s$称为下采样卷积的步幅。\n当然也可以对每个移动方向定义不同的步幅。\n\\fig?演示了一个实例。\n<!-- % fig 9.12 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/stride_conv}}\n\\fi\n\\caption{带有步幅的卷积。\n在这个例子中，我们的步幅为二。\n\\emph{(上)}\\,在单个操作中实现的步幅为二的卷积。\n\\emph{(下)}\\,步幅大于一个像素的卷积在数学上等价于单位步幅的卷积随后降采样。\n显然，涉及降采样的两步法在计算上是浪费的，因为它计算了许多将被丢弃的值。}\n\\end{figure}\n\n在任何卷积网络的实现中都有一个重要性质，那就是能够隐含地对输入$\\TSV$用零进行填充(pad)使得它加宽。\n如果没有这个性质，表示的宽度在每一层就会缩减，缩减的幅度是比核少一个像素这么多。\n对输入进行零填充允许我们对核的宽度和输出的大小进行独立的控制。\n如果没有零填充，我们就被迫面临二选一的局面，要么选择网络空间宽度的快速缩减，要么选择一个小型的核——这两种情境都会极大得限制网络的表示能力。\n\\fig?给出了一个例子。\n<!-- % fig 9.13 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/zero_pad_shrink}}\n\\fi\n\\caption{零填充对网络大小的影响。\n考虑一个卷积网络，每层有一个宽度为六的核。 \n在这个例子中，我们不使用任何池化，所以只有卷积操作本身缩小网络的大小。\n\\emph{(上)}在这个卷积网络中，我们不使用任何隐含的零填充。\n这使得表示在每层缩小五个像素。\n从十六个像素的输入开始，我们只能有三个卷积层，并且最后一层不能移动核，所以可以说只有两层是真正的卷积层。\n可以通过使用较小的核来减缓收缩速率，但是较小的核表示能力不足，并且在这种结构中一些收缩是不可避免的。\n\\emph{(下)}通过向每层添加五个隐含的零，我们防止了表示随深度收缩。\n这允许我们设计一个任意深的卷积网络。}\n\\end{figure}\n\n有三种零填充设定的情况值得注意。\n第一种是无论怎样都不使用零填充的极端情况，并且卷积核只允许访问那些图像中能够完全包含整个核的位置。\n在MATLAB的术语中，这称为有效卷积。\n在这种情况下，输出的所有像素都是输入中相同数量像素的函数，这使得输出像素的表示更加规范。\n然而，输出的大小在每一层都会缩减。\n如果输入的图像宽度是$m$，核的宽度是$k$，那么输出的宽度就会变成$m-k+1$。\n如果卷积核非常大的话缩减率会非常显著。\n因为缩减数大于0，这限制了网络中能够包含的卷积层的层数。\n当层数增加时，网络的空间维度最终会缩减到$1\\times 1$，这种情况下增加的层就不可能进行有意义的卷积了。\n第二种特殊的情况是只进行足够的零填充来保持输出和输入具有相同的大小。\n在MATLAB的术语中，这称为相同卷积。\n在这种情况下，只要硬件支持，网络就能包含任意多的卷积层，这是因为卷积运算不改变下一层的结构。。\n然而，输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。\n这可能会导致边界像素存在一定程度的欠表示。\n这使得第三种极端情况产生了，在MATLAB中称为全卷积。\n它进行了足够多的零填充使得每个像素在每个方向上恰好被访问了$k$次，最终输出图像的宽度为$m+k-1$。%\\footnote{译者注：图\\?给出了有效卷积和相同卷积的例子，这里对全卷积略作说明：我们可以认为全卷积是在输入的两端各填充$k-1$个零，使得输入的每个像素都恰好被核访问$k$次，最终得到的输出的宽度为$[m+2(k-1)]-k+1=m+k-1$}\n在这种情况下，输出像素中靠近边界的部分相比于中间部分是更少像素的函数。\n这将导致学得一个在卷积特征映射的所有位置都表现不错的单核更为困难。\n通常零填充的最优数量（对于测试集的分类正确率）处于\"有效卷积\"和\"相同卷积\"之间的某个位置。\n\n<!-- % -- 338 -- -->\n \n<!-- % -- 339 -- -->\n\n在一些情况下，我们并不是真的想使用卷积，而是想用一些局部连接的网络层{cite?}。\n在这种情况下，我们的多层感知机对应的邻接矩阵是相同的，但每一个连接都有它自己的权重，用一个6维的张量$\\TSW$来表示。\n$\\TSW$的索引分别是：输出的通道$i$，输出的行$j$和列$k$，输入的通道$l$，输入的行偏置$m$和列偏置$n$。\n局部连接层的线性部分可以表示为\n\\begin{equation}\n\\TEZ_{i,j,k} = \\sum_{l,m,n} [\\TEV_{l, j+m-1, k+n-1} w_{i, j, k, l, m, n}]. %这里应该是$\\TEW$?\n\\end{equation}\n这有时也被称为非共享卷积，因为它和具有一个小核的离散卷积运算很像，但并不横跨位置来共享参数。\n图\\?比较了局部连接、卷积和全连接的区别。\n<!-- % fig 9.14 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/local}}\n\\fi\n\\caption{局部连接，卷积和全连接的比较。\n\\emph{(上)}每一小片（接受域）有两个像素的局部连接层。\n每条边用唯一的字母标记，来显示每条边都有自身的权重参数。\n\\emph{(中)}核宽度为两个像素的卷积层。\n该模型与局部连接层具有完全相同的连接。\n区别不在于哪些单元相互交互，而在于如何共享参数。\n局部连接层没有参数共享。\n正如用于标记每条边的字母重复出现所指示的，卷积层在整个输入上重复使用相同的两个权重。\n\\emph{(下)}全连接层类似于局部连接层，它的每条边都有其自身的参数（在该图中用字母明确标记的话就太多了）。 然而，它不具有局部连接层的连接受限的特征。}\n\\end{figure}\n \n<!-- % -- 340 -- -->\n \n当我们知道每一个特征都是一小块空间的函数并且相同的特征不会出现在所有的空间上时，局部连接层是很有用的。\n例如，如果我们想要辨别一张图片是否是人脸图像时，我们只需要去寻找嘴是否在图像下半部分即可。\n\n使用那些连接被更进一步限制的卷积或者局部连接层也是有用的，例如，限制每一个输出的通道$i$仅仅是输入通道$l$的一部分的函数时。\n实现这种情况的一种通用方法是使输出的前$m$个通道仅仅连接到输入的前$n$个通道，输出的接下来的$m$个通道仅仅连接到输入的接下来的$n$个通道，以此类推。\n\\fig?给出了一个例子。\n对少量通道间的连接进行建模允许网络使用更少的参数，这降低了存储的消耗以及提高了统计效率，并且减少了前向和反向传播所需要的计算量。\n这些目标的实现并没有减少隐藏单元的数目。\n<!-- % fig 9.15 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/conv_groups}}\n\\fi\n\\caption{卷积网络的前两个输出通道只和前两个输入通道相连，随后的两个输出通道只和随后的两个输入通道相连。}\n\\end{figure}\n\n平铺卷积{cite?}对卷积层和局部连接层进行了折衷。\n这里并不是对\\emph{每一个}空间位置的权重集合进行学习，我们学习一组核使得当我们在空间移动时它们可以循环利用。\n这意味着在近邻的位置上拥有不同的过滤器，就像局部连接层一样，但是对于这些参数的存储需求仅仅会增长常数倍，这个常数就是核的集合的大小，而不是整个输出的特征映射的大小。\n\\fig?对局部连接层、平铺卷积和标准卷积进行了比较。\n<!-- % fig 9.16 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/tiled}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{局部连接层、平铺卷积和标准卷积的比较。\n当使用相同大小的核时，这三种方法在单元之间具有相同的连接。\n此图是对使用两个像素宽的核的说明。\n这三种方法之间的区别在于它们如何共享参数。\n\\emph{(上)}局部连接层根本没有共享参数。\n我们对每个连接使用唯一的字母标记，来表明每个连接都有它自身的权重。\n\\emph{(中)}平铺卷积有$t$个不同的核。\n这里我们说明$t=2$的情况。\n其中一个核具有标记为\"a\"和\"b\"的边，而另一个具有标记为\"c\"和\"d\"的边。\n每当我们在输出中右移一个像素后，我们使用一个不同的核。\n这意味着，与局部连接层类似，输出中的相邻单元具有不同的参数。\n与局部连接层不同的是，在我们遍历所有可用的$t$个核之后，我们循环回到了第一个核。\n如果两个输出单元间隔$t$个步长的倍数，则它们共享参数。\n\\emph{(下)}传统卷积等效于$t=1$的平铺卷积。\n它只有一个核，并且被应用到各个地方，我们在图中表示为在各处使用具有标记为\"a\"和\"b\"的边的核。}\n\\end{figure}\n \n<!-- % -- 341 -- -->\n \n为了用代数的方法定义平铺卷积，令$\\TSK$是一个6维的张量\\footnote{译者注：原文将$\\TSK$误写成了$k$。}，其中的两维对应着输出映射中的不同位置。\n$\\TSK$在这里并没有对输出映射中的每一个位置使用单独的索引，输出的位置在每个方向上在$t$个不同的核组成的集合中进行循环。\n如果$t$等于输出的宽度，这就是局部连接层了。\n\\begin{equation}\n\\TEZ_{i, j, k} = \\sum_{l, m, n} \\TEV_{l, j+m-1, k+n-1} \\TEK_{i, l, m, n, j\\% t +1, k\\% t+1},\n\\end{equation}\n这里百分号是取模运算，它的性质包括$t\\% t =0, (t+1)\\% t = 1$等等。\n在每一维上使用不同的$t$可以很容易对这个方程进行扩展。\n \n<!-- % -- 342 -- -->\n  \n<!-- % -- 343 -- -->\n \n局部连接层与平铺卷积层都和最大池化有一些有趣的关联：这些层的探测单元都是由不同的过滤器驱动的。\n如果这些过滤器能够学会探测相同隐含特征的不同变换形式，那么最大池化的单元对于学得的变换就具有不变性（如\\fig?所示）。\n卷积层对于平移具有内置的不变性。\n \n<!-- % -- 344 -- -->\n \n实现卷积网络时，通常也需要除卷积以外的其他运算。\n为了实现学习，必须在给定输出的梯度时能够计算核的梯度。\n在一些简单情况下，这种运算可以通过卷积来实现，但在很多我们感兴趣的情况下，包括步幅大于1的情况，并不具有这样的性质。\n\n回忆一下卷积是一种线性运算，所以可以表示成矩阵乘法的形式（如果我们首先把输入张量变形为一个扁平的向量）。\n其中包含的矩阵是关于卷积核的函数。\n这个矩阵是稀疏的并且核的每个元素都复制给矩阵的多个元素。\n这种观点能够帮助我们导出实现一个卷积网络所需的很多其他运算。\n\n通过卷积定义的矩阵转置的乘法就是这样一种运算。\n这种运算用于在卷积层反向传播误差的导数，所以它在训练多于一个隐藏层的卷积网络时是必要的。\n如果我们想要从隐藏层单元重构可视化单元时，同样的运算也是需要的{cite?}。\n重构可视化单元是本书第\\?部分的模型广泛用到的一种运算，这些模型包括自编码器、RBM和稀疏编码等等。\n构建这些模型的卷积化的版本都要用到转置化卷积。\n类似核梯度运算，这种输入梯度运算在某些情况下可以用卷积来实现，但在一般情况下需要用到第三种运算来实现。%这里不是很懂\n必须非常小心地来使这种转置运算和前向传播过程相协调。\n转置运算返回的输出的大小取决于三个方面：零填充的策略、前向传播运算的步幅以及前向传播的输出映射的大小。\n在一些情况下，不同大小的输入通过前向传播过程能够得到相同大小的输出映射，所以必须明确地告知转置运算原始输入的大小。\n\n这三种运算——卷积、从输出到权重的反向传播和从输出到输入的反向传播——对于训练任意深度的前馈卷积网络，以及训练带有（基于卷积的转置的）重构函数的卷积网络，这三种运算都足以计算它们所需的所有梯度。\n对于完全一般的多维、多样例情况下的公式，完整的推导可以参考~{Goodfellow-TR2010}。 \n为了直观说明这些公式是如何起作用的，我们这里给出一个二维单个样例的版本。\n \n<!-- % -- 345 -- -->\n \n假设我们想要训练这样一个卷积网络，它包含步幅为$s$的步幅卷积，该卷积的核为$\\TSK$，作用于多通道的图像$\\TSV$，定义为$c(\\TSK, \\TSV, s)$，就像\\eqn?中一样。\n假设我们想要最小化某个损失函数$J(\\TSV, \\TSK)$。\n在前向传播过程中，我们需要用$c$本身来输出$\\TSZ$，然后$\\TSZ$传递到网络的其余部分并且被用来计算损失函数$J$。\n在反向传播过程中，我们会得到一个张量$\\TSG$满足$\\TEG_{i, j, k} = \\frac{\\partial}{\\partial \\TEZ_{i, j, k}} J(\\TSV, \\TSK)$。\n\n为了训练网络，我们需要对核中的权重求导。\n为了实现这个目的，我们可以使用一个函数\n\\begin{equation}\ng(\\TSG, \\TSV, s)_{i, j, k, l} = \\frac{\\partial}{\\partial \\TEK_{i, j, k, l}} J(\\TSV, \\TSK) = \\sum_{m, n} \\TEG_{i, m, n} \\TEV_{j, (m-1)\\times s+k, (n-1)\\times s+l}.\n\\end{equation}\n\n如果这一层不是网络的底层，我们需要对$\\TSV$求梯度来使得误差进一步反向传播。\n我们可以使用如下的函数\n\\begin{eqnarray}\nh(\\TSK, \\TSG, s)_{i, j, k} &=& \\frac{\\partial }{\\partial \\TEV_{i, j, k}} J(\\TSV, \\TSK)\\\\\n&=& \\sum_{\\substack{l, m\\\\\n                  \\text{s.t.}\\\\\n                  (l-1)\\times s+m = j}} \\sum_{\\substack{n, p\\\\\n                                                            \\text{s.t.}\\\\\n                                                            (n-1)\\times s +p = k}}\n            \\sum_q \\TEK_{q,i,m,p} \\TEG_{q, l, n}.\n\\end{eqnarray}\n\n\\chap?描述的自编码器网络，是一些被训练成把输入拷贝到输出的前馈网络。\n一个简单的例子是\\,PCA\\,算法，将输入$\\Vx$拷贝到一个近似的重构值$\\Vr$，通过函数${\\MW}^\\top \\MW \\Vx$来实现。\n使用权重矩阵转置的乘法，就像\\,PCA\\,算法这种，在一般的自编码器中是很常见的。\n为了使这些模型卷积化，我们可以用函数$h$来实现卷积运算的转置。\n假定我们有和$\\TSZ$相同形式的隐藏单元$\\TSH$，并且我们定义一种重构运算\n\\begin{equation}\n\\TSR = h(\\TSK, \\TSH, s).\n\\end{equation}\n\n为了训练自编码器，我们会得到关于$\\TSR$的梯度，表示为一个张量$\\TSE$。\n为了训练解码器，我们需要获得对于$\\TSK$的梯度，这通过$g(\\TSH, \\TSE, s)$来得到。\n为了训练编码器，我们需要获得对于$\\TSH$的梯度，这通过$c(\\TSK, \\TSE, s)$来得到。\n通过用$c$和$h$对$g$求微分也是可行的，但这些运算对于任何标准神经网络上的反向传播算法来说都是不需要的。\n \n<!-- % -- 346 -- -->\n \n一般来说，在卷积层从输入到输出的变换中我们不仅仅只用线性运算。\n我们一般也会在进行非线性运算前，对每个输出加入一些偏置项。\n这样就产生了如何在偏置项中共享参数的问题。\n对于局部连接层，很自然地对每个单元都给定它特有的偏置，对于平铺卷积，也很自然地用与核一样的平铺模式来共享参数。\n对于卷积层来说，通常的做法是在输出的每一个通道上都设置一个偏置，这个偏置在每个卷积映射的所有位置上共享。\n然而，如果输入是已知的固定大小，也可以在输出映射的每个位置学习一个单独的偏置。\n分离这些偏置可能会稍稍降低模型的统计效率，但同时也允许模型来校正图像中不同位置的统计差异。\n例如，当使用隐含的零填充时，图像边缘的探测单元接收到较少的输入，因此需要较大的偏置。\n\n\n# 结构化输出\n\n\n卷积神经网络可以用于输出高维的结构化对象，而不仅仅是预测分类任务的类标签或回归任务的实数值。\n通常这个对象只是一个张量，由标准卷积层产生。\n例如，模型可以产生张量$\\TSS$，其中$\\TES_{i,j,k}$是网络的输入像素$(j, k)$属于类$i$的概率。\n这允许模型标记图像中的每个像素，并绘制沿着单个对象轮廓的精确掩模。\n\n经常出现的一个问题是输出平面可能比输入平面要小，如\\fig?所示。\n用于对图像中单个对象分类的常用结构中，网络空间维数的最大减少来源于使用大步幅的池化层。\n为了产生与输入大小相似的输出映射，我们可以避免把池化放在一起{cite?}。\n另一种策略是单纯地产生一张低分辨率的标签网格{cite?}。\n最后，原则上可以使用具有单位步幅的池化操作。\n\n对图像逐个像素标记的一种策略是先产生图像标签的原始猜测，然后使用相邻像素之间的交互来修正该原始猜测。\n重复这个修正步骤数次对应于在每一步使用相同的卷积，该卷积在深层网络的最后几层之间共享权重{cite?}。\n这使得在层之间共享参数的连续的卷积层所执行的一系列运算，形成了一种特殊的循环神经网络~{cite?}。\n\\fig?给出了这样一个循环卷积网络的结构。\n<!-- % fig 9.17 -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter9/figures/iterative}}\n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption[.]{用于像素标记的循环卷积网络的示例。\n输入是图像张量$\\TSX$，它的轴对应图像的行、列和通道（红，绿，蓝）。\n目标是输出标签张量$\\hat{Y}$，它遵循每个像素的标签的概率分布。\n该张量的轴对应图像的行、列和不同类别。\n循环网络通过使用$\\hat{Y}$的先前估计作为创建新估计的输入，来迭代地改善其估计，而不是单次输出$\\hat{Y}$，。\n每个更新的估计使用相同的参数，并且估计可以如我们所愿地被改善任意多次。\n每一步使用的卷积核张量$\\TSU$，是用来计算给定输入图像的隐藏表示的。\n核张量$\\TSV$用于产生给定隐藏值时标签的估计。\n除了第一步之外，核$\\TSW$都对$\\hat{Y}$进行卷积来提供隐藏层的输入。\n在第一步中，此项由零代替。\n因为每一步使用相同的参数，所以这是一个循环网络的例子，如\\chap?所述。}\n\\end{figure}\n\n<!-- % -- 347 -- -->\n \n一旦对每个像素都进行了预测，我们就可以使用各种方法来进一步处理这些预测，以便获得图像在区域上的分割{cite?}。\n一般的想法是假设大片相连的像素倾向于对应着相同的标签。\n图模型可以描述相邻像素间的概率关系。\n或者，卷积网络可以被训练来最大化地近似图模型的训练目标{cite?}。\n\n\n# 数据类型\n\n\n卷积网络使用的数据通常包含多个通道，每个通道是时间上或空间中某一点的不同观测量。\n参考表\\,\\?\\,来了解具有不同维数和通道数的数据类型的例子。\n \n<!-- % -- 348 -- -->\n\\begin{table}[htbp!]\n\\centering\n \\begin{tabular}[t]{l|p{0.4\\textwidth}|p{0.4\\textwidth}}\n& 单通道 & 多通道\\\\ \\hline\n1维 & \n音频波形：卷积的轴对应于时间。我们将时间离散化并且在每个时间点测量一次波形的振幅。 &  \n骨架动画(skeleton animation)数据：计算机渲染的3D角色动画是通过随时间调整\"骨架\"的姿势而生成的。 在每个时间点，角色的姿势通过骨架中的每个关节的角度来描述。我们输入到卷积模型的数据的每个通道，表示一个关节关于一个轴的角度。\\\\ \\hline\n2维 & \n已经使用傅立叶变换预处理过的音频数据：我们可以将音频波形变换成2维张量，不同的行对应不同的频率，不同的列对应不同的时间点。在时间轴上使用卷积使模型等效于在时间上移动。在频率轴上使用卷积使得模型等效于在频率上移动，这使得在不同八度音阶中播放的相同旋律产生相同的表示，但处于网络输出中的不同高度。 & %Fourier transform这里不是很清楚，在频率上使用卷积是做什么的？\n彩色图像数据：其中一个通道包含红色像素，另一个包含绿色像素，最后一个包含蓝色像素。在图像的水平轴和竖直轴上移动卷积核，赋予了两个方向上平移等变性。\\\\ \\hline\n3维 &\n体积数据：这种数据一般来源于医学成像技术，例如CT扫描等。 & \n彩色视频数据：其中一个轴对应着时间，另一个轴对应着视频帧的高度，最后一个对应着视频帧的宽度。\\\\\n\\end{tabular}\n\\caption{用于卷积网络的不同数据格式的示例。}\n\\end{table}\n<!-- % -- 349 -- -->\n \n卷积网络用于视频的例子，可以参考~{Chen-Ting-2010}。\n\n到目前为止，我们仅讨论了训练和测试数据中的每个样例都有相同的空间维度的情况。\n卷积网络的一个优点是它们还可以处理具有可变的空间尺度的输入。\n这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。\n这为卷积网络的使用提供了令人信服的理由，即使当计算开销和过拟合都不是主要问题时。\n<!-- %\\footnote{译者注：传统的基于矩阵乘法的神经网络会面对计算开销和过拟合的问题，即使当计算开销和过拟合都不是主要问题时，我们也有充分的理由来使用卷积网络而不是传统的神经网络，因为卷积网络可以处理可变大小的输入。} -->\n\n例如，考虑一组图像的集合，其中每个图像具有不同的高度和宽度。\n目前还不清楚如何用固定大小的权重矩阵对这样的输入进行建模。\n卷积就可以很直接地应用；核依据输入的大小简单地被使用不同次，并且卷积运算的输出也相应地放缩。\n卷积可以被视为矩阵乘法；相同的卷积核为每种大小的输入引入了一个不同大小的双重分块循环矩阵。\n有时，网络的输出允许和输入一样具有可变的大小，例如如果我们想要为输入的每个像素分配一个类标签。\n在这种情况下，不需要进一步的设计工作。\n在其他情况下，网络必须产生一些固定大小的输出，例如，如果我们想要为整个图像指定单个类标签。\n在这种情况下，我们必须进行一些额外的设计步骤，例如插入一个池化层，池化区域的大小要与输入的大小成比例，以便保持固定数量的池化输出。\n这种策略的一些例子可以参考\\fig?。\n\n注意，使用卷积处理可变尺寸的输入，仅对输入是因为包含对同种事物的不同量的观察(时间上不同长度的记录，空间上不同宽度的观察等)而导致的尺寸变化这种情况才有意义。\n如果输入是因为它可以选择性地包括不同种类的观察而具有可变尺寸，使用卷积是不合理的。\n例如，如果我们正在处理大学申请，并且我们的特征包括成绩等级和标准化测试分数，但不是每个申请人都进行了标准化测试，则使用相同的权重来对成绩特征和测试分数特征进行卷积是没有意义的。\n\n\n# 高效的卷积算法\n\n\n现代卷积网络的应用通常需要包含超过百万个单元的网络。\n利用并行计算资源的强大实现是很关键的，如\\sec?中所描述的。\n然而，在很多情况下，也可以通过选择适当的卷积算法来加速卷积。\n \n<!-- % -- 350 -- -->\n \n卷积等效于使用傅立叶变换将输入与核都转换到频域、执行两个信号的逐点相乘，再使用傅立叶逆变换转换回时域。\n对于某些问题的规模，这种算法可能比离散卷积的朴素实现更快。\n\n当一个$d$维的核可以表示成$d$个向量（每一维一个向量）的外积时，该核被称为可分离的。\n当核可分离时，朴素的卷积是低效的。\n它等价于组合$d$个一维卷积，每个卷积使用这些向量中的一个。\n组合方法显著快于使用它们的外积来执行一个$d$维的卷积。\n并且核也只要更少的参数来表示成向量。\n如果核在每一维都是$w$个元素宽，那么朴素的多维卷积需要$O(w^d)$的运行时间和参数存储空间，而可分离卷积只需要$O(w\\times d)$的运行时间和参数存储空间。\n当然，并不是每个卷积都可以表示成这种形式。\n\n设计更快的执行卷积或近似卷积，而不损害模型准确性的方法，是一个活跃的研究领域。 \n甚至仅提高前向传播效率的技术也是有用的，因为在商业环境中，通常部署网络比训练网络还要耗资源。\n\n\n# 随机或无监督的特征\n\n\n通常，卷积网络训练中最昂贵的部分是学习特征。 \n输出层的计算代价通常相对不高，因为在通过若干层池化之后作为该层输入的特征的数量较少。\n当使用梯度下降执行监督训练时，每步梯度计算需要完整地运行整个网络的前向传播和反向传播。\n减少卷积网络训练成本的一种方式是使用那些不是由监督方式训练得到的特征。\n\n有三种基本策略可以不通过监督训练而得到卷积核。\n其中一种是简单地随机初始化它们。\n另一种是手动设计它们，例如设置每个核在一个特定的方向或尺度来检测边缘。\n最后，可以使用无监督的标准来学习核。\n例如，{Coates2011}将$k$均值聚类算法应用于小图像块，然后使用每个学得的中心作为卷积核。\n第\\?部分描述了更多的无监督学习方法。\n使用无监督的标准来学习特征，允许这些特征的确定与位于网络结构顶层的分类层相分离。\n然后只需提取一次全部训练集的特征，构造用于最后一层的新训练集。\n假设最后一层类似逻辑回归或者\\,SVM，那么学习最后一层通常是凸优化问题。\n\n \n<!-- % -- 351 -- -->\n \n随机过滤器经常在卷积网络中表现得出乎意料得好~{Jarrett-ICCV2009-small,Saxe-ICML2011,pinto2011scaling,cox2011beyond}。\n{Saxe-ICML2011}~说明，由卷积和随后的池化组成的层，当赋予随机权重时，自然地变得具有频率选择性和平移不变性。\n他们认为这提供了一种廉价的方法来选择卷积网络的结构：首先通过仅训练最后一层来评估几个卷积网络结构的性能，然后选择最好的结构并使用更昂贵的方法来训练整个网络。\n\n一个中间方法是学习特征，但是使用那种不需要在每个梯度计算步骤中都进行完整的前向和反向传播的方法。\n与多层感知机一样，我们使用贪心逐层预训练，单独训练第一层，然后一次性地从第一层提取所有特征，之后用那些特征单独训练第二层，以此类推。\n\\chap?描述了如何实现监督的贪心逐层预训练，第\\?部分将此扩展到了无监督的范畴。\n卷积模型的贪心逐层预训练的经典模型是卷积深度信念网络{cite?}。\n卷积网络为我们提供了相对于多层感知机更进一步采用预训练策略的机会。\n并非一次训练整个卷积层，我们可以训练一小块模型，就像~{Coates2011}使用$k$均值做的那样。\n然后，我们可以用来自这个小块模型的参数来定义卷积层的核。\n这意味着使用无监督学习来训练卷积网络\\emph{并且在训练的过程中完全不使用卷积}是可能的。\n使用这种方法，我们可以训练非常大的模型，并且只在推断期间产生高计算成本{cite?}。\n这种方法大约在2007到2013年间流行，当时标记的数据集很小，并且计算能力有限。\n如今，大多数卷积网络以纯粹监督的方式训练，在每次训练迭代中使用通过整个网络的完整的前向和反向传播。\n \n<!-- % -- 352 -- -->\n \n与其他无监督预训练的方法一样，使用这种方法的一些好处仍然难以说清。\n无监督预训练可以提供一些相对于监督训练的正则化，或者它可以简单地允许我们训练更大的结构，因为它的学习规则降低了计算成本。\n\n\n# 卷积网络的神经科学基础\n\n\n卷积网络也许是生物学启发人工智能的最为成功的案例。\n虽然卷积网络也经过许多其他领域的指导，但是神经网络的一些关键设计原则来自于神经科学。\n\n卷积网络的历史始于神经科学实验，远早于相关计算模型的发展。\n为了确定关于哺乳动物视觉系统如何工作的许多最基本的事实，神经生理学家David Hubel和Torsten Wiesel合作多年{cite?}。\n他们的成就最终获得了诺贝尔奖。\n他们的发现对当代深度学习模型有最大影响的是基于记录猫的单个神经元的活动。\n他们观察了猫的脑内神经元如何响应投影在猫前面屏幕上精确位置的图像。\n他们的伟大发现是，处于视觉系统较为前面的神经元对非常特定的光模式（例如精确定向的条纹）反应最强烈，但对其他模式几乎完全没有反应。\n\n他们的工作有助于表征大脑功能的许多方面，这些方面超出了本书的范围。\n从深度学习的角度来看，我们可以专注于简化的、草图形式的大脑功能视图。\n\n在这个简化的视图中，我们关注被称为V1的大脑的一部分，也称为初级视觉皮层。\nV1是大脑对视觉输入开始执行显著高级处理的第一个区域。\n在该草图视图中，图像是由光到达眼睛并刺激视网膜（眼睛后部的光敏组织）形成的。\n视网膜中的神经元对图像执行一些简单的预处理，但是基本不改变它被表示的方式。\n然后图像通过视神经和称为\\emph{外侧膝状核}的脑部区域。 \n这些解剖区域的主要作用是仅仅将信号从眼睛传递到位于头后部的V1。\n \n<!-- % -- 353 -- -->\n \n卷积网络层被设计为描述V1的三个性质：\n\\begin{enumerate}\n+ V1可以进行空间映射。\n  %这里翻译不好\n  它实际上具有二维结构来反映视网膜中的图像结构。\n  例如，到达视网膜下半部的光仅影响V1相应的一半。 \n  卷积网络通过用二维映射定义特征的方式来描述该特性。\n\n+ V1包含许多简单细胞。\n  简单细胞的活动在某种程度上可以概括为在一个小的空间位置感受野内的图像的线性函数。\n  卷积网络的检测器单元被设计为模拟简单细胞的这些性质。\n\n+ V1还包括许多复杂细胞。\n  这些细胞响应类似于由简单细胞检测的那些特征，但是复杂细胞对于特征的位置微小偏移具有不变性。 \n  这启发了卷积网络的池化单元。\n  复杂细胞对于照明中的一些变化也是不变的，不能简单地通过在空间位置上池化来刻画。 \n  这些不变性激发了卷积网络中的一些跨通道池化策略，例如maxout单元{cite?}。\n\\end{enumerate}\n\n虽然我们最了解V1，但是一般认为相同的基本原理也适用于视觉系统的其他区域。\n在我们视觉系统的草图视图中，当我们逐渐深入大脑时，遵循池化的基本探测策略被反复执行。\n当我们穿过大脑的多个解剖层时，我们最终找到了响应一些特定概念的细胞，并且这些细胞对输入的很多种变换都具有不变性。\n这些细胞被昵称为\"祖母细胞\"——这个想法是一个人可能有一个神经元，当看到他祖母的照片时该神经元被激活，无论祖母是出现在照片的左边或右边，无论照片是她的脸部的特写镜头还是她的全身照，也无论她处在光亮还是黑暗中，等等。\n\n这些祖母细胞已经被证明确实存在于人脑中，在一个被称为\\emph{内侧颞叶}的区域{cite?}。\n研究人员测试了单个神经元是否会响应名人的照片。\n他们发现了后来被称为\"Halle Berry神经元\"的神经元：由Halle Berry的概念激活的单个神经元。\n当一个人看到Halle Berry的照片，Halle Berry的图画，甚至包含单词\"Halle Berry\"的文本时，这个神经元会触发。\n当然，这与Halle Berry本人无关；其他神经元会对Bill Clinton，Jennifer Aniston等的出现做出响应。\n \n<!-- % -- 354 -- -->\n \n这些内侧颞叶神经元比现代卷积网络更通用一些，这些网络在读取名称时不会自动联想到识别人或对象。\n与卷积网络的最后一层在特征上最接近的类比是称为\\emph{颞下皮质}（IT）的脑区。\n当查看一个对象时，信息从视网膜经LGN流到V1，然后到V2，V4，之后是IT。\n这发生在瞥见对象的前100ms内。\n如果允许一个人继续观察对象更多的时间，那么信息将开始回流，因为大脑使用自上而下的反馈来更新较低级脑区中的激活。\n然而，如果我们打断人的注视，并且只观察前100ms内的大多数前向激活导致的放电率，那么IT被证明与卷积网络非常相似。\n卷积网络可以预测IT放电率，并且在执行对象识别任务时与人类（时间有限的情况）非常类似{cite?}。\n\n话虽如此，卷积网络和哺乳动物的视觉系统之间还是有许多区别。\n这些区别有一些是计算神经科学家所熟知的，但超出了本书的范围。\n还有一些区别尚未知晓，因为关于哺乳动物视觉系统如何工作的许多基本问题仍未得到回答。\n简要列表如下：\n\n+ 人眼大部分是非常低的分辨率，除了一个被称为中央凹的小块。\n  中央凹仅观察在手臂长度距离内一块拇指大小的区域。\n  虽然我们觉得我们可以看到高分辨率的整个场景，但这是由我们的大脑的潜意识部分创建的错觉，因为它缝合了我们瞥见的若干个小区域。\n  大多数卷积网络实际上接收大的全分辨率的照片作为输入。\n  人类大脑控制几次眼动，称为扫视，以瞥见场景中最显眼的或任务相关的部分。\n  将类似的注意力机制融入深度学习模型是一个活跃的研究方向。\n  在深度学习的背景下，注意力机制对于自然语言处理是最成功的，参考\\sec?。\n  研究者已经研发了几种具有视觉机制的视觉模型，但到目前为止还没有成为主导方法{cite?}。\n  \n+ 人类视觉系统集成了许多其他感觉，例如听觉，以及像我们的心情和想法一样的因素。\n  卷积网络迄今为止纯粹是视觉的。\n  \n+ 人类视觉系统不仅仅用于识别对象。\n  它能够理解整个场景，包括许多对象和对象之间的关系，以及处理我们的身体与世界交互所需的丰富的三维几何信息。\n  卷积网络已经应用于这些问题中的一些，但是这些应用还处于起步阶段。\n  \n+ 即使像V1这样简单的大脑区域也受到来自较高级别的反馈的严重影响。\n  反馈已经在神经网络模型中被广泛地探索，但还没有被证明提供了引人注目的改进。\n  \n+ 虽然前馈IT放电频率刻画了与卷积网络特征很多相同的信息，但是仍不清楚中间计算的相似程度。\n  大脑可能使用非常不同的激活和池化函数。\n  单个神经元的激活可能不能用单个线性过滤器的响应来很好地表征。\n  最近的V1模型涉及对每个神经元的多个二次过滤器{cite?}。\n  事实上，我们的\"简单细胞\"和\"复杂细胞\"的草图图片可能并没有区别；简单细胞和复杂细胞可能是相同种类的细胞，但是它们的\"参数\"使得它们能够实现从我们所说的\"简单\"到\"复杂\"的连续的行为。\n\n \n<!-- % -- 355 -- -->\n \n还值得一提的是，神经科学很少告诉我们该如何\\emph{训练}卷积网络。\n具有跨多个空间位置的参数共享的模型结构，可以追溯到早期关于视觉的联结主义模型{cite?}，但是这些模型没有使用现代的反向传播算法和梯度下降。\n例如，{cite?}结合了现代卷积网络的大多数模型结构设计元素，但依赖于层次化的无监督聚类算法。\n\n{Lang+Hinton88}引入反向传播来训练时延神经网络。\n使用当代术语来说，TDNN是用于时间序列的一维卷积网络。\n用于这些模型的反向传播不受任何神经科学观察的启发，并且被一些人认为是生物不可信的。\n在基于使用反向传播训练的TDNN成功之后，{LeCun89d}通过将相同的训练算法应用于图像的2维卷积来发展现代卷积网络。\n\n到目前为止，我们已经描述了简单细胞对于某些特征是如何呈现粗略的线性和选择性，复杂细胞是如何更加的非线性，并且对于这些简单细胞特征的某些变换具有不变性，以及在选择性和不变性之间交替放置的层可以产生对非常特定现象的祖母细胞。\n我们还没有精确描述这些单个细胞检测到了什么。\n在深度非线性网络中，可能难以理解单个细胞的功能。\n第一层中的简单细胞相对更容易分析，因为它们的响应由线性函数驱动。\n在人工神经网络中，我们可以直接显示卷积核的图像，来查看卷积层的相应通道是如何响应的。\n在生物神经网络中，我们不能访问权重本身。\n相反，我们在神经元自身中放置一个电极，在动物视网膜前显示几个白噪声图像样本，并记录这些样本中的每一个是如何导致神经元激活的。\n然后，我们可以对这些响应拟合线性模型，以获得近似的神经元权重。\n这种方法被称为反向相关{cite?}。\n \n<!-- % -- 356 -- -->\n \n反向相关向我们表明，大多数的V1细胞具有由Gabor函数所描述的权重。\nGabor函数描述在图像中的2维点处的权重。我们可以认为图像是2维坐标$I(x,y)$的函数。\n类似地，我们可以认为简单细胞是在图像中的一组位置采样，这组位置由一组$x$坐标$\\SetX$和一组$y$坐标$\\SetY$来定义，并且使用的权重$w(x,y)$也是位置的函数。\n从这个观点来看，简单细胞对于图像的响应由下式给出\n\\begin{equation}\n  s(I)=\\sum_{x\\in \\SetX} \\sum_{y\\in \\SetY} w(x, y)I(x,y).\n\\end{equation}\n特别地，$w(x,y)$采用Gabor函数的形式：\n\\begin{equation}\n  w(x, y; \\alpha, \\beta_x, \\beta_y, f, \\phi, x_0, y_0, \\tau) = \\alpha \\exp(-\\beta_x x'^2 - \\beta_y y'^2) \\cos (fx' + \\phi),\n\\end{equation}\n其中\n\\begin{equation}\n  x' = (x-x_0)\\cos(\\tau) + (y-y_0)\\sin(\\tau)\n\\end{equation}\n以及\n\\begin{equation}\n  y' = -(x-x_0) \\sin(\\tau) + (y-y_0)\\cos(\\tau).\n\\end{equation}\n\n这里$\\alpha, \\beta_x, \\beta_y, f, \\phi, x_0, y_0, \\tau$都是控制~Gabor函数性质的参数。\n\\fig?给出了Gabor函数在不同参数集上的一些例子。\n<!-- % fig 9.18 -->\n\\begin{figure}\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering    \n\\includegraphics[width=0.3\\textwidth]{Chapter9/figures/gabor_coordinate_system.png}}     \n\\includegraphics[width=0.3\\textwidth]{Chapter9/figures/gabor_scale.png}}\n\\includegraphics[width=0.3\\textwidth]{Chapter9/figures/gabor_sinusoid.png}}     \n\\fi\n\\captionsetup{singlelinecheck=off}\n\\caption{具有各种参数设置的Gabor函数。\n白色表示绝对值大的正权重，黑色表示绝对值大的负权重，背景灰色对应于零权重。\n\\emph{(左)}控制坐标系的参数具有不同值的Gabor函数，这些参数包括：$x_0$、$y_0$和$\\gamma$。\n在该网格中的每个Gabor函数被赋予和它在网格中的位置成比例的$x_0$和$y_0$的值，并且$\\tau$被选择为使得每个Gabor过滤器对从网格中心辐射出的方向非常敏感。\n对于其他两幅图，$x_0$、$y_0$和$\\gamma$固定为零。\n\\emph{(中)}具有不同高斯比例参数$\\beta_x$和$\\beta_y$的Gabor函数。\n当我们从左到右通过网格时，Gabor函数被设置为增加宽度（减少$\\beta_x$）；当我们从上到下通过网格时，Gabor函数被设置为为增加高度（减少$\\beta_y$）。\n对于其他两幅图，$\\beta$值固定为图像宽度的1.5倍。\n\\emph{(右)}具有不同的正弦参数$f$和$\\phi$的Gabor函数。\n当我们从上到下移动时，$f$增加；当我们从左到右移动时，$\\phi$增加。对于其他两幅图，$\\phi$固定为0，$f$固定为图像宽度的5倍。}     \n\\end{figure}\n\n参数$x_0,y_0$和$\\tau$定义坐标系。\n我们平移和旋转$x$和$y$来得到$x'$和$y'$。\n具体地，简单细胞会响应以点$(x_0, y_0)$为中心的图像特征，并且当我们沿着从水平方向旋转$\\tau$弧度的线移动时，简单细胞将响应亮度的变化。\n \n<!-- % -- 357 -- -->\n \n作为$x'$和$y'$的函数，函数$w$会响应当我们沿着$x'$移动时的亮度变化。\n它有两个重要的因子：一个是高斯函数，另一个是余弦函数。\n\n高斯因子$ \\alpha \\exp(-\\beta_x x'^2 - \\beta_y y'^2)$可以被视为阈值项，用于保证简单细胞仅对接近$x'$和$y'$都为零点处的值响应，换句话说，接近细胞接受域的中心。\n尺度因子$\\alpha$调整简单细胞响应的总的量级，而$\\beta_x$和$\\beta_y$控制接受域消退的速度。\n\n余弦因子$ \\cos (fx' + \\phi)$控制简单细胞如何响应延$x‘$轴的亮度改变。\n参数$f$控制余弦的频率，$\\phi$控制它的相位偏移。\n\n合在一起，简单细胞的这个草图视图意味着，简单细胞对在特定位置处、特定方向上、特定空间频率的亮度进行响应。\n当图像中的光波与细胞的权重具有相同的相位时，简单细胞是最兴奋的。\n这种情况发生在当图像亮时，它的权重为正，而图像暗时，它的权重为负。\n当光波与权重完全异相时，简单细胞被抑制——当图像较暗时，它的权重为正；较亮时，它的权重为负。\n \n<!-- % -- 358 -- -->\n \n复杂细胞的草图视图是它计算包含两个简单细胞响应的2维向量的$L^2$范数：$c(I)=\\sqrt{s_0(I)^2 + s_1(I)^2}$。\n一个重要的特殊情况是当$s_1$和$s_0$具有除$\\phi$ 以外都相同的参数，并且$\\phi$被设置为使得$s_1$与$s_0$相位相差四分之一周期时。\n在这种情况下，$s_0$和$s_1$形成象限对。\n当高斯重新加权的图像$I(x,y)\\exp(-\\beta_x x'^2 -\\beta_y y^2)$包含具有频率$f$、在方向$\\tau$上、接近$(x_0, y_0)$的高振幅正弦波时，用先前方法定义的复杂细胞会响应，并且\\emph{不管该波的相位偏移}。\n换句话说，复杂细胞对于图像在方向$\\tau$上的微小变换或者翻转图像（用白色代替黑色，反之亦然）具有不变性。\n\n神经科学和机器学习之间最显著的对应关系，是从视觉上比较机器学习模型学得的特征与使用V1得到的特征。\n{Olshausen+Field-1996}说明，一个简单的无监督学习算法，稀疏编码，学习的特征具有与简单细胞类似的感受野。\n从那时起，我们发现，当应用于自然图像时，极其多样的统计学习算法学习类Gabor函数的特征。这包括大多数深度学习算法，它们在其第一层中学习这些特征。\n\\fig?给出了一些例子。\n因为如此众多不同的学习算法学习边缘检测器，所以很难仅基于学习算法学得的特征，来断定哪一个特定的学习算法是\"正确\"的大脑模型（虽然，当应用于自然图像时，如果一个算法\\emph{不能}学得某种检测器时，它能够作为一种否定标志）。\n这些特征是自然图像的统计结构的重要部分，并且可以通过许多不同的统计建模方法来重新获得。\n读者可以参考{cite?}来获得自然图像统计领域的综述。\n<!-- % fig 9.19 -->\n\\begin{figure}\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering    \n\\includegraphics[width=0.4\\textwidth]{Chapter9/figures/s3c_filters.png}}    \n\\includegraphics[width=0.4\\textwidth]{Chapter9/figures/maxout_kernels.png}}  \n\\fi\n\\caption{许多机器学习算法在应用于自然图像时，会学习那些用来检测边缘或边缘的特定颜色的特征。 \n这些特征检测器使人联想到已知存在于初级视觉皮层中的~Gabor函数。   \n\\emph{(左)}通过应用于小图像块的无监督学习算法（尖峰和平板稀疏编码）学得的权重。%这里不是很懂\n\\emph{(右)}由完全监督的卷积~maxout~网络的第一层学得的卷积核。 相邻的一对过滤器驱动相同的~maxout单元。}     \n\\end{figure}\n\n\n# 卷积网络与深度学习的历史\n\n \n<!-- % -- 359 -- -->\n \n卷积网络在深度学习的历史中发挥了重要作用。\n它们是将研究大脑获得的深刻理解成功用于机器学习应用的关键例子。\n它们也是首批表现良好的深度模型之一，远远早于任意深度模型被认为是可行之前。\n卷积网络也是第一个解决重要商业应用的神经网络，并且仍然处于当今深度学习商业应用的前沿。\n例如，在20世纪90年代，AT\\&T的神经网络研究小组开发了一个用于读取支票的卷积网络{cite?}。\n到90年代末，NEC部署的这个系统已经被用于读取美国10％以上的支票。\n后来，微软部署了若干个基于卷积网络的OCR和手写识别系统{cite?}。 \n关于卷积网络的这种应用和更现代应用的更多细节，参考\\chap?。\n读者可以参考{cite?}了解2010年之前的更为深入的卷积网络历史。\n\n卷积网络也被用作在许多比赛中的取胜手段。\n当前对深度学习的商业兴趣的热度始于{Krizhevsky-2012-small}赢得了ImageNet对象识别挑战，但是在那之前，卷积网络也已经被用于赢得前些年影响较小的其他机器学习和计算机视觉竞赛了。\n \n<!-- % -- 360 -- -->\n \n卷积网络是第一批能使用反向传播有效训练的深度网络之一。\n现在仍不完全清楚为什么卷积网络在一般的反向传播网络被认为已经失败时反而成功了。\n这可能可以简单地归结为卷积网络比全连接网络计算效率更高，因此使用它们运行多个实验并调整它们的实现和超参数更容易。\n更大的网络也似乎更容易训练。\n利用现代硬件，大型全连接的网络在许多任务上也表现得很合理，即使使用过去那些全连接网络被认为不能工作得很好的数据集和当时流行的激活函数时，现在也能执行得很好。\n心理可能是神经网络成功的主要阻碍（实践者没有期望神经网络有效，所以他们没有认真努力地使用神经网络）。\n无论如何，幸运的是卷积网络在几十年前就表现良好。\n在许多方面，它们为余下的深度学习传递火炬，并为一般的神经网络被接受铺平了道路。\n\n卷积网络提供了一种方法来特化神经网络，使其能够处理具有清楚的网格结构拓扑的数据，以及将这样的模型扩展到非常大的规模。 \n这种方法在二维图像拓扑上是最成功的。\n为了处理一维序列数据，我们接下来转向神经网络框架的另一种强大的特化：循环神经网络。\n\n \n<!-- % -- 361 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-10-Chapter10_sequence_modeling_rnn.md",
    "content": "---\ntitle: 序列建模：循环和递归网络\nlayout: post\nshare: false\n---\n循环神经网络或~RNN~{cite?}是一类用于处理序列数据的神经网络。\n就像卷积网络是专门用于处理网格化数据$\\TSX$（如一个图像）的神经网络，循环神经网络是专门用于处理序列$\\Vx^{(1)}, \\dots, \\Vx^{(\\tau)}$的神经网络。\n正如卷积网络可以很容易地扩展到具有很大宽度和高度的图像，以及处理大小可变的图像，循环网络可以扩展到更长的序列（比不基于序列的特化网络长得多）。\n大多数循环网络也能处理可变长度的序列。 \n\n从多层网络出发到循环网络，我们需要利用上世纪80年代机器学习和统计模型早期思想的优点：在模型的不同部分共享参数。\n参数共享使得模型能够扩展到不同形式的样本（这里指不同长度的样本）并进行泛化。\n如果我们在每个时间点都有一个单独的参数，我们不但不能泛化到训练时没有见过序列长度，也不能在时间上共享不同序列长度和不同位置的统计强度。\n当信息的特定部分会在序列内多个位置出现时，这样的共享尤为重要。\n例如，考虑这两句话：\"I went to Nepal in 2009\"和\"In 2009, I went to Nepal.\" \n如果我们让一个机器学习模型读取这两个句子，并提取叙述者去Nepal的年份，无论\"2009年\"是作为句子的第六个单词还是第二个单词出现，我们都希望模型能认出\"2009年\"作为相关资料片段。\n假设我们要训练一个处理固定长度句子的前馈网络。\n传统的全连接前馈网络会给每个输入特征分配一个单独的参数，所以需要分别学习句子每个位置的所有语言规则。\n相比之下，循环神经网络在几个时间步内共享相同的权重，不需要分别学习句子每个位置的所有语言规则。\n\n<!-- % -- 363 -- -->\n\n一个相关的想法是在1维时间序列上使用卷积。\n这种卷积方法是时延神经网络的基础{cite?}。\n卷积操作允许网络跨时间共享参数，但是浅层的。\n卷积的输出是一个序列，其中输出中的每一项是相邻几项输入的函数。\n参数共享的概念体现在每个时间步中使用的相同卷积核。\n循环神经网络以不同的方式共享参数。\n输出的每一项是前一项的函数。\n输出的每一项对先前的输出应用相同的更新规则而产生。\n这种循环方式导致参数通过很深的计算图共享。\n\n为简单起见，我们说的~RNN~是指在序列上的操作，并且该序列在时刻$t$（从1到$\\tau$）包含向量$\\Vx^{(t)}$。\n在实际情况中，循环网络通常在序列的小批量上操作，并且小批量的每项具有不同序列长度$\\tau$。\n我们省略了小批量索引来简化记号。\n此外，时间步索引不必是字面上现实世界中流逝的时间。\n有时，它仅表示序列中的位置。\nRNN~也可以应用于跨越两个维度的空间数据（如图像）。\n当应用于涉及时间的数据，并且将整个序列提供给网络之前就能观察到整个序列时，该网络可具有关于时间向后的连接。\n\n\n本章将计算图的思想扩展到包括循环。\n这些周期代表变量自身的值在未来某一时间步对自身值的影响。\n这样的计算图允许我们定义循环神经网络。\n然后，我们描述许多构建、训练和使用循环神经网络的不同方式。\n\n本章将简要介绍循环神经网络，为获取更多详细信息，我们建议读者参考~{Graves-book2012}的著作。\n\n<!-- % -- 364 -- -->\n\n\n# 展开计算图\n\n计算图是形式化一组计算结构的方式，如那些涉及将输入和参数映射到输出和损失的计算。\n综合的介绍请参考\\sec?。\n本节，我们对展开递归或循环计算得到的重复结构进行解释，这些重复结构通常对应于一个事件链。\n展开这个计算图将导致深度网络结构中的参数共享。\n\n例如，考虑动态系统的经典形式：\n\\begin{align}\n\\Vs^{(t)} = f(\\Vs^{(t-1)}; \\Vtheta),\n\\end{align}\n其中$ \\Vs^{(t)}$称为系统的状态。\n\n$\\Vs$在时刻$t$的定义需要参考时刻$t-1$时同样的定义，因此\\eqn?是循环的。\n\n对有限时间步~$\\tau$， $\\tau-1$次应用这个定义可以展开这个图。\n例如$\\tau = 3$，我们对\\eqn?展开，可以得到：\n\\begin{align}\n \\Vs^{(3)} &= f(\\Vs^{(2)}; \\Vtheta) \\\\\n & = f(f(\\Vs^{(1)}; \\Vtheta) ; \\Vtheta).\n\\end{align}\n\n以这种方式重复应用定义，展开等式，就能得到不涉及循环的表达。\n现在我们可以使用传统的有向无环计算图呈现这样的表达。\n\n\\eqn?和\\eqn?的展开计算图如\\fig?所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/unfolded_dynsys}}\n\\fi\n\\caption{将\\eqn?描述的经典动态系统表示为展开的计算图。\n每个节点表示在某个时刻$t$的状态，并且函数$f$将$t$处的状态映射到$t+1$处的状态。\n所有时间步都使用相同的参数（用于参数化$f$的相同$\\Vtheta$值）。\n}\n\\end{figure}\n\n<!-- % -- 365 -- -->\n\n作为另一个例子，让我们考虑由外部信号$\\Vx^{(t)}$驱动的动态系统，\n\\begin{align}\n \\Vs^{(t)} = f(\\Vs^{(t-1)}, \\Vx^{(t)} ; \\Vtheta),\n\\end{align}\n我们可以看到，当前状态包含了整个过去序列的信息。\n\n循环神经网络可以通过许多不同的方式建立。\n就像几乎所有函数都可以被认为是前馈网络，本质上任何涉及循环的函数都可以被认为是一个循环神经网络。\n\n很多循环神经网络使用\\eqn?或类似的公式定义隐藏单元的值。\n为了表明状态是网络的隐藏单元，我们使用变量$\\Vh$代表状态重写\\eqn?：\n\\begin{align}\n \\Vh^{(t)} = f(\\Vh^{(t-1)}, \\Vx^{(t)} ; \\Vtheta),\n\\end{align}\n如\\fig?所示，典型~RNN~会增加额外的架构特性，如读取状态信息$\\Vh$进行预测的输出层。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/rnn_circuit_unfolded}}\n\\fi\n\\caption{没有输出的循环网络。\n此循环网络只处理来自输入$\\Vx$的信息，将其合并到经过时间向前传播的状态$\\Vh$。\n\\emph{(左)}回路原理图。 黑色方块表示单个时间步的延迟。\n\\emph{(右)}同一网络被视为展开的计算图，其中每个节点现在与一个特定的时间实例相关联。\n}\n\\end{figure}\n\n当训练循环网络根据过去预测未来时，网络通常要学会使用$\\Vh^{(t)}$作为过去序列（直到$t$）与任务相关方面的有损摘要。\n此摘要一般而言一定是有损的，因为其映射任意长度的序列$(\\Vx^{(t)},\\Vx^{(t-1)}, \\Vx^{(t-2)},\\dots,\\Vx^{(2)}, \\Vx^{(1)})$到一固定长度的向量$\\Vh^{(t)}$。\n根据不同的训练准则，摘要可能选择性地精确保留过去序列的某些方面。\n例如，如果在统计语言建模中使用的~RNN，通常给定前一个词预测下一个词，可能没有必要存储时刻$t$前输入序列中的所有信息；而仅仅存储足够预测句子其余部分的信息。\n最苛刻的情况是我们要求$\\Vh^{(t)}$足够丰富，并能大致恢复输入序列，如自编码器框架（\\chap?）。\n\n<!-- % -- 366 -- -->\n\n\\eqn?可以用两种不同的方式来绘制。\n一种绘制~RNN~的方式是用循环图，对于可能存在于模型的物理实现中的每个组件，都在图中包含其对应的节点。这种方式的一个示例是生物神经网络。\n在这种视角下，网络定义了实时操作的回路，如\\fig?的左侧，其当前状态可以影响其未来的状态。\n在本章中，我们使用回路图中的黑色方块表示单个时间步延时所发生的交互，即从时刻$t$的状态到时刻$t+1$的状态的变化。\n另一种绘制~RNN~的方式是用展开的计算图，其中每一个组件由许多不同的变量表示，每个时间步一个变量，用来表示组件在该时间点的状态。\n每个时间步的每个变量绘制为计算图的一个独立节点，如\\fig?的右侧。\n我们所说的展开是将左图中的回路映射为右图中包含重复组件的计算图的操作。\n这样，展开图的大小取决于序列长度。\n\n我们可以用一个函数$g^{(t)}$代表经$t$步展开后的循环：\n\\begin{align}\n  \\Vh^{(t)} &=g^{(t)}(\\Vx^{(t)},\\Vx^{(t-1)}, \\Vx^{(t-2)},\\dots,\\Vx^{(2)}, \\Vx^{(1)}) \\\\\n  & =  f(\\Vh^{(t-1)}, \\Vx^{(t)} ; \\Vtheta) .\n\\end{align}\n函数$g^{(t)}$将全部的过去序列$(\\Vx^{(t)},\\Vx^{(t-1)}, \\Vx^{(t-2)},\\dots,\\Vx^{(2)}, \\Vx^{(1)})$作为输入来生成当前状态，但是展开的循环架构允许我们将$g^{(t)}$分解为函数$f$的重复应用。\n因此，展开过程引入两个主要优点：\n\\begin{enumerate}\n+ 无论序列的长度，学成的模型始终具有相同的输入大小，因为它指定的是从一种状态到另一种状态的转移， 而不是在可变长度的历史状态上操作。\n+ 我们可以在每个时间步使用相同参数的\\emph{相同}转移函数$f$。\n\\end{enumerate}\n这两个因素使得学习在所有时间步和所有序列长度上操作单一的模型$f$是可能的，而不需要在所有可能时间步学习独立的模型$g^{(t)}$。\n学习单一的共享模型允许泛化到没有见过的序列长度（没有出现在训练集中），并且估计模型所需的训练样本远远少于不带参数共享的模型。\n\n<!-- % -- 367 -- -->\n\n无论是循环图和展开图都有其用途。\n循环图简洁。\n展开图能够明确描述其中的计算流程。\n展开图还通过显式的信息流动路径帮助说明信息在时间上向前（计算输出和损失）和向后（计算梯度）的思想。\n\n\n# 循环神经网络\n\n基于\\sec?中的图展开和参数共享的思想，我们可以设计各种循环神经网络。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/hidden_recurrence_rnn}}\n\\fi\n\\caption{计算循环网络(将$\\Vx$值的输入序列映射到输出值$\\Vo$的对应序列)训练损失的计算图。\n损失$L$衡量每个$\\Vo$与相应的训练目标$\\Vy$的距离。\n当使用softmax输出时，我们假设$\\Vo$是未归一化的对数概率。\n损失$L$内部计算$\\hat{\\Vy} = \\text{softmax}(\\Vo)$，并将其与目标$\\Vy$比较。\nRNN输入到隐藏的连接由权重矩阵$\\MU$参数化，隐藏到隐藏的循环连接由权重矩阵$\\MW$参数化以及隐藏到输出的连接由权重矩阵$\\MV$参数化。\n\\eqn?定义了该模型中的前向传播。\n\\emph{(左)}使用循环连接绘制的~RNN~和它的损失。\n\\emph{(右)}同一网络被视为展开的计算图，其中每个节点现在与一个特定的时间实例相关联。\n}\n\\end{figure}\n\n循环神经网络中一些重要的设计模式包括以下几种：\n\\begin{enumerate}\n+ 每个时间步都有输出，并且隐藏单元之间有循环连接的循环网络，如\\fig?所示。\n+ 每个时间步都产生一个输出，只有当前时刻的输出到下个时刻的隐藏单元之间有循环连接的循环网络，如\\fig?所示。\n+ 隐藏单元之间存在循环连接，但读取整个序列后产生单个输出的循环网络，如\\fig?所示。\n\\end{enumerate}\n\\fig?是非常具有代表性的例子，我们将会在本章大部分涉及这个例子。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/output_recurrence_rnn}}\n\\fi\n\\caption{此类~RNN~的唯一循环是从输出到隐藏层的反馈连接。\n在每个时间步~$t$，输入为$\\Vx_t$，隐藏层激活为$\\Vh^{(t)}$，输出为$\\Vo^{(t)}$，目标为$\\Vy^{(t)}$，损失为$L^{(t)}$。\n\\emph{(左)}回路原理图。\n\\emph{(右)}展开的计算图。\n这样的~RNN~没有\\fig?表示的RNN那样强大（只能表示更小的函数集合）。\n\\fig?中的~RNN~可以选择将其想要的关于过去的任何信息放入隐藏表示$\\Vh$中并且将$\\Vh$传播到未来。\n该图中的~RNN~被训练为将特定输出值放入$\\Vo$中，并且$\\Vo$是允许传播到未来的唯一信息。\n此处没有从$\\Vh$前向传播的直接连接。\n之前的$\\Vh$仅通过产生的预测间接地连接到当前。\n$\\Vo$通常缺乏过去的重要信息，除非它非常高维且内容丰富。\n这使得该图中的~RNN~不那么强大，但是它更容易训练，因为每个时间步可以与其他时间步分离训练，允许训练期间更多的并行化，如\\sec?所述。\n}\n\\end{figure}\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/single_output_rnn}}\n\\fi\n\\caption{关于时间展开的循环神经网络，在序列结束时具有单个输出。\n这样的网络可以用于概括序列并产生用于进一步处理的固定大小的表示。\n在结束处可能存在目标（如此处所示），或者通过更下游模块的反向传播来获得输出$\\Vo^{(t)}$上的梯度。\n}\n\\end{figure}\n\n任何图灵可计算的函数都可以通过这样一个有限维的循环网络计算，在这个意义上\\fig?和\\eqn?的循环神经网络是万能的。\nRNN~经过若干时间步后读取输出，这与由图灵机所用的时间步是渐近线性的，与输入长度也是渐近线性的{cite?}。\n由图灵机计算的函数是离散的，所以这些结果都是函数的具体实现，而不是近似。\nRNN~作为图灵机使用时，需要一个二进制序列作为输入，其输出必须离散化以提供二进制输出。\n利用单个有限大小的特定~RNN~计算在此设置下的所有函数是可能的（~{Siegelmann+Sontag-1995}用了886个单元）。\n图灵机的\"输入\"是要计算函数的详细说明(specification)，所以模拟此图灵机的相同网络足以应付所有问题。\n用于证明的理论~RNN~可以通过激活和权重（由无限精度的有理数表示）来模拟无限堆栈。\n\n<!-- % -- 368 -- -->\n\n现在我们研究\\fig?中~RNN~的前向传播公式。\n这个图没有指定隐藏单元的激活函数。\n我们假设使用双曲正切激活函数。\n此外，图中没有明确指定何种形式的输出和损失函数。\n我们假定输出是离散的，如用于预测词或字符的~RNN。\n表示离散变量的常规方式是把输出$\\Vo$作为每个离散变量可能值的非标准化对数概率。\n然后，我们可以应用~softmax函数~后续处理后，获得标准化后概率的输出向量$\\hat \\Vy$。\nRNN~从特定的初始状态$\\Vh^{(0)}$开始前向传播。\n从$t= 1$到$t = \\tau$的每个时间步，我们应用以下更新方程：\n\\begin{align}\n \\Va^{(t)} &= \\Vb + \\MW \\Vh^{(t-1)} + \\MU \\Vx^{(t)}, \\\\\n  \\Vh^{(t)} &= \\tanh(\\Va^{(t)} ), \\\\\n  \\Vo^{(t)} &= \\Vc + \\MV \\Vh^{(t)}, \\\\\n  \\hat \\Vy^{(t)} &= \\text{softmax}(\\Vo^{(t)}),\n\\end{align}\n其中的参数的偏置向量$\\Vb$和$\\Vc$连同权重矩阵$\\MU$、$\\MV$和$\\MW$，分别对应于输入到隐藏、隐藏到输出和隐藏到隐藏的连接。\n这个循环网络将一个输入序列映射到相同长度的输出序列。\n与$\\Vx$序列配对的$\\Vy$的总损失就是所有时间步的损失之和。\n例如，$L^{(t)}$为给定的$\\Vx^{(1)}, \\dots, \\Vx^{(t)}$后$\\Vy^{(t)}$的负对数似然，则\n & L\\big( \\{ \\Vx^{(1)}, \\dots, \\Vx^{(\\tau)} \\}, \\{ \\Vy^{(1)}, \\dots, \\Vy^{(\\tau)}  \\} \\big) \\\\\n & = \\sum_t L^{(t)} \\\\\n & = - \\sum_t \\log p_{\\text{model}} \\big(  y^{(t)} \\mid  \\{ \\Vx^{(1)}, \\dots, \\Vx^{(t)} \\} \\big) ,\n\\end{align}\n其中$p_{\\text{model}} \\big(  y^{(t)} \\mid  \\{ \\Vx^{(1)}, \\dots, \\Vx^{(t)} \\} \\big) $需要读取模型输出向量$\\hat \\Vy^{(t)}$中对应于$y^{(t)}$的项。\n关于各个参数计算这个损失函数的梯度是计算成本很高的操作。\n梯度计算涉及执行一次前向传播（如在\\fig?展开图中从左到右的传播），接着是由右到左的反向传播。\n运行时间是$\\CalO(\\tau)$，并且不能通过并行化来降低，因为前向传播图是固有循序的;每个时间步只能一前一后地计算。\n前向传播中的各个状态必须保存，直到它们反向传播中被再次使用，因此内存代价也是$\\CalO(\\tau)$。\n应用于展开图且代价为$\\CalO(\\tau)$的反向传播算法称为通过时间反向传播，将在\\sec?进一步讨论。\n因此隐藏单元之间存在循环的网络非常强大但训练代价也很大。\n我们是否有其他选择呢？\n\n<!-- % -- 371 -- -->\n\n\n## 导师驱动过程和输出循环网络\n\n仅在一个时间步的输出和下一个时间步的隐藏单元间存在循环连接的网络（示于\\fig?）确实没有那么强大（因为缺乏隐藏到隐藏的循环连接）。\n例如，它不能模拟通用图灵机。\n因为这个网络缺少隐藏到隐藏的循环，它要求输出单元捕捉用于预测未来的关于过去的所有信息。\n因为输出单元明确地训练成匹配训练集的目标，它们不太能捕获关于过去输入历史的必要信息，除非用户知道如何描述系统的全部状态，并将它作为训练目标的一部分。\n消除隐藏到隐藏循环的优点在于，任何基于比较时刻$t$的预测和时刻$t$的训练目标的损失函数中的所有时间步都解耦了。\n因此训练可以并行化，即在各时刻$t$分别计算梯度。\n因为训练集提供输出的理想值，所以没有必要先计算前一时刻的输出。\n\n由输出反馈到模型而产生循环连接的模型可用导师驱动过程进行训练。\n训练模型时，导师驱动过程不再使用最大似然准则，而在时刻$t+1$接收真实值$y^{(t)}$作为输入。\n我们可以通过检查两个时间步的序列得知这一点。\n条件最大似然准则是\n\\begin{align}\n &\\log p(\\Vy^{(1)},\\Vy^{(2)} \\mid \\Vx^{(1)}, \\Vx^{(2)} ) \\\\\n &= \\log  p(\\Vy^{(2)} \\mid \\Vy^{(1)}, \\Vx^{(1)}, \\Vx^{(2)} )  + \\log p(\\Vy^{(1)} \\mid \\Vx^{(1)}, \\Vx^{(2)}) .\n\\end{align}\n\n<!-- % -- 372 -- -->\n\n在这个例子中，\\emph{同时}给定迄今为止的$\\Vx$序列和来自训练集的前一$\\Vy$值，我们可以看到在时刻$t=2$时，模型被训练为最大化$\\Vy^{(2)}$的条件概率。\n因此最大似然在训练时指定正确反馈，而不是将自己的输出反馈到模型。\n如\\fig?所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/teacher_forcing}}\n\\fi\n\\caption{导师驱动过程的示意图。\n导师驱动过程是一种训练技术，适用于输出与下一时间步的隐藏状态存在连接的~RNN。\n\\emph{(左)}训练时，我们将训练集中\\emph{正确}的输出$\\Vy^{(t)}$反馈到$\\Vh^{(t+1)}$。\n\\emph{(右)}当模型部署后，真正的输出通常是未知的。\n在这种情况下，我们用模型的输出$\\Vo^{(t)}$近似正确的输出$\\Vy^{(t)}$，并反馈回模型。\n}\n\\end{figure}\n\n我们使用导师驱动过程的最初动机是为了在缺乏隐藏到隐藏连接的模型中避免通过时间反向传播。\n只要模型一个时间步的输出与下一时间步计算的值存在连接，导师驱动过程仍然可以应用到这些存在隐藏到隐藏连接的模型。\n然而，只要隐藏单元成为较早时间步的函数，BPTT~算法是必要的。\n因此训练某些模型时要同时使用导师驱动过程和~BPTT。\n\n<!-- % -- 373 -- -->\n\n如果之后网络在\\textbf{开环}(open-loop)模式下使用，即网络输出（或输出分布的样本）反馈作为输入，那么完全使用导师驱动过程进行训练的缺点就会出现。\n在这种情况下，训练期间该网络看到的输入与测试时看到的会有很大的不同。\n减轻此问题的一种方法是同时使用导师驱动过程和自由运行的输入进行训练，例如在展开循环的输出到输入路径上预测几个步骤的正确目标值。\n通过这种方式，网络可以学会考虑在训练时没有接触到的输入条件（如自由运行模式下，自身生成自身），以及将状态映射回使网络几步之后生成正确输出的状态。\n另外一种方式{cite?}是通过随意选择生成值或真实的数据值作为输入以减小训练时和测试时看到的输入之间的差别。\n这种方法利用了课程学习策略，逐步使用更多生成值作为输入。\n\n\n## 计算循环神经网络的梯度\n\n计算循环神经网络的梯度是容易的。\n我们可以简单地将\\sec?中的推广反向传播算法应用于展开的计算图，而不需要特殊化的算法。\n由反向传播计算得到的梯度，并结合任何通用的基于梯度的技术就可以训练~RNN。\n\n为了获得~BPTT~算法行为的一些直观理解，我们举例说明如何通过~BPTT~计算上述RNN公式（\\eqn?和\\eqn?）的梯度。\n计算图的节点包括参数$\\MU,\\MV,\\MW, \\Vb$和$\\Vc$，以及以$t$为索引的节点序列$\\Vx^{(t)}, \\Vh^{(t)},\\Vo^{(t)}$和$L^{(t)}$。\n对于每一个节点$\\TSN$，我们需要基于$\\TSN$后面的节点的梯度，递归地计算梯度~$\\nabla_{\\TSN} L$。\n我们从紧接着最终损失的节点开始递归：\n\\begin{align}\n \\frac{\\partial L}{\\partial L^{(t)}} = 1.\n\\end{align}\n在这个导数中，我们假设输出$\\Vo^{(t)}$作为~softmax函数~的参数，我们可以从~softmax函数可以获得关于输出概率的向量$\\hat{\\Vy}$。\n我们也假设损失是迄今为止给定了输入后的真实目标$y^{(t)}$的负对数似然。\n对于所有$i,t$，关于时间步~$t$输出的梯度~$\\nabla_{\\Vo^{(t)}} L$如下：\n\\begin{align}\n (\\nabla_{\\Vo^{(t)}} L)_i =  \\frac{\\partial L}{\\partial o_i^{(t)}} \n =  \\frac{\\partial L}{\\partial L^{(t)}}  \\frac{\\partial L^{(t)}}{\\partial o_i^{(t)}}  \n = \\hat y_i^{(t)} - \\mathbf{1}_{i,y^{(t)}}.\n\\end{align}\n我们从序列的末尾开始，反向进行计算。\n在最后的时间步~$\\tau$, $\\Vh^{(\\tau)}$只有$\\Vo^{(\\tau)}$作为后续节点，因此这个梯度很简单：\n\\begin{align}\n \\nabla_{\\Vh^{(\\tau)}} L = \\MV^\\top \\nabla_{\\Vo^{(\\tau)}} L.\n\\end{align}\n然后，我们可以从时刻$t=\\tau-1$到$t=1$反向迭代， 通过时间反向传播梯度，注意$\\Vh^{(t)}(t < \\tau)$同时具有$\\Vo^{(t)}$和$\\Vh^{(t+1)}$两个后续节点。\n因此，它的梯度由下式计算\n\\begin{align}\n  \\nabla_{\\Vh^{(t)}} L = \\Big( \\frac{\\partial \\Vh^{(t+1)}}{ \\partial \\Vh^{(t)}}  \\Big)^\\top(\\nabla_{\\Vh^{(t+1)}} L) \n  + \\Big( \\frac{\\partial \\Vo^{(t)}}{ \\partial \\Vh^{(t)}}  \\Big)^\\top (\\nabla_{\\Vo^{(t)}} L) \\\\\n  = \\MW^\\top (\\nabla_{\\Vh^{(t+1)}} L) \\text{diag} \\Big( 1 - (\\Vh^{(t+1)})^2 \\Big) \n    + \\MV^\\top ( \\nabla_{\\Vo^{(t)}} L ),\n\\end{align}\n其中$\\text{diag} \\Big( 1 - (\\Vh^{(t+1)})^2 \\Big) $ 表示包含元素$1 - (h_i^{(t+1)})^2$的对角矩阵。\n这是关于时刻$t+1$与隐藏单元~$i$关联的双曲正切的Jacobian。\n\n<!-- % -- 374 -- -->\n\n一旦获得了计算图内部节点的梯度，我们就可以得到关于参数节点的梯度。\n因为参数在许多时间步共享，我们必须在表示这些变量的微积分操作时谨慎对待。\n我们希望实现的等式使用\\sec?中的{\\tt bprop}方法计算计算图中单一边对梯度的贡献。\n然而微积分中的$\\nabla_{\\MW} f$算子，计算$\\MW$对于$f$的贡献时将计算图中的\\emph{所有}边都考虑进去了。\n为了消除这种歧义，我们定义只在$t$时刻使用的虚拟变量$\\MW^{(t)}$作为$\\MW$的副本。\n然后，我们可以使用$\\nabla_{\\MW^{(t)}}$表示权重在时间步~$t$对梯度的贡献。\n\n使用这个表示，关于剩下参数的梯度可以由下式给出：\n\\begin{align}\n \\nabla_{\\Vc} L &=  \\sum_t \\Big( \\frac{\\partial \\Vo^{(t)}}{\\partial \\Vc} \\Big)^\\top \\nabla_{\\Vo^{(t)}} L \n = \\sum_t \\nabla_{\\Vo^{(t)}} L ,\\\\\n \\nabla_{\\Vb} L &= \\sum_t \\Big( \\frac{\\partial \\Vh^{(t)}}{\\partial \\Vb^{(t)}} \\Big)^\\top \\nabla_{\\Vh^{(t)}} L \n = \\sum_t \\text{diag} \\Big( 1 - \\big( \\Vh^{(t)} \\big)^2 \\Big)  \\nabla_{\\Vh^{(t)}} L  ,\\\\\n \\nabla_{\\MV} L &= \\sum_t \\sum_i \\Big( \\frac{\\partial L} {\\partial o_i^{(t)}}\\Big) \\nabla_{\\MV} o_i^{(t)} \n = \\sum_t (\\nabla_{\\Vo^{(t)}} L) \\Vh^{(t)^\\top},\\\\\n \\nabla_{\\MW} L &= \\sum_t \\sum_i \\Big( \\frac{\\partial L} {\\partial h_i^{(t)}}\\Big) \n \\nabla_{\\MW^{(t)}} h_i^{(t)} \\\\\n&= \\sum_t \\text{diag} \\Big( 1 - \\big( \\Vh^{(t)} \\big)^2 \\Big) ( \\nabla_{\\Vh^{(t)}} L) \\Vh^{(t-1)^\\top} ,\\\\\n \\nabla_{\\MU} L &= \\sum_t \\sum_i \\Big( \\frac{\\partial L} {\\partial h_i^{(t)}}\\Big) \n \\nabla_{\\MU^{(t)}} h_i^{(t)} \\\\\n&= \\sum_t \\text{diag} \\Big( 1 - \\big( \\Vh^{(t)} \\big)^2 \\Big) ( \\nabla_{\\Vh^{(t)}} L) \\Vx^{(t)^\\top} ,\n\\end{align}\n因为计算图中定义的损失的任何参数都不是训练数据$\\Vx^{(t)}$的父节点，所以我们不需要计算关于它的梯度。\n\n<!-- % -- 375 -- -->\n\n\n## 作为有向图模型的循环网络\n\n目前为止，我们接触的循环网络例子中损失$L^{(t)}$是训练目标$\\Vy^{(t)}$和输出$\\Vo^{(t)}$之间的交叉熵。\n与前馈网络类似，原则上循环网络几乎可以使用任何损失。\n但必须根据任务来选择损失。\n如前馈网络，我们通常希望将~RNN~的输出解释为一个概率分布，并且我们通常使用与分布相关联的交叉熵来定义损失。\n均方误差是与单位高斯分布的输出相关联的交叉熵损失，例如前馈网络中所使用的。\n\n当我们使用一个预测性对数似然的训练目标，如\\eqn?，我们将~RNN~训练为能够根据之前的输入估计下一个序列元素$\\Vy^{(t)}$的条件分布。\n这可能意味着，我们最大化对数似然\n\\begin{align}\n \\log p(\\Vy^{(t)} \\mid \\Vx^{(1)},\\dots, \\Vx^{(t)}),\n\\end{align}\n或者，如果模型包括来自一个时间步的输出到下一个时间步的连接，\n\\begin{align}\n \\log p(\\Vy^{(t)} \\mid \\Vx^{(1)},\\dots, \\Vx^{(t)},\\Vy^{(1)},\\dots, \\Vy^{(t-1)} ).\n\\end{align}\n将整个序列$\\Vy$的联合分布分解为一系列单步的概率预测是捕获关于整个序列完整联合分布的一种方法。\n当我们不把过去的$\\Vy$值反馈给下一步作为预测的条件时，那么有向图模型不包含任何从过去$\\Vy^{(i)}$到当前$\\Vy^{(t)}$的边。\n在这种情况下，输出$\\Vy$与给定的$\\Vx$序列是条件独立的。\n当我们反馈真实的$\\Vy$值（不是它们的预测值，而是真正观测到或生成的值）给网络时，那么有向图模型包含所有从过去$\\Vy^{(i)}$到当前$\\Vy^{(t)}$的边。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/fully_connected_chain}}\n\\fi\n\\caption{序列$y^{(1)},y^{(2)},\\dots,y^{(t)},\\dots$的全连接图模型。\n给定先前的值，每个过去的观察值$y^{(i)}$可以影响一些$y^{(t)}$($t>i$)的条件分布。\n当序列中每个元素的输入和参数的数目越来越多，根据此图直接参数化图模型（如\\eqn?中）可能是非常低效的。\nRNN~可以通过高效的参数化获得相同的全连接，如\\fig?所示。\n}\n\\end{figure}\n\n<!-- % -- 376 -- -->\n\n举一个简单的例子，让我们考虑对标量随机变量序列$ \\SetY = \\{\\RSy^{(1)},\\dots,\\RSy^{(\\tau)}\\}$建模的~RNN，也没有额外的输入$\\RSx$。\n在时间步~$t$的输入仅仅是时间步~$t-1$的输出。\n该~RNN~定义了关于$\\RSy$变量的有向图模型。\n我们使用链式法则（用于条件概率的\\eqn?）参数化这些观察值的联合分布：\n\\begin{align}\n P(\\SetY) = P(\\RVy^{(1)},\\dots,\\RVy^{(\\tau)}) = \\prod_{t=1}^{\\tau}P(\\RVy^{(t)} \\mid \\RVy^{(t-1)},\\RVy^{(t-2)},\n \\dots,\\RVy^{(1)}),\n\\end{align}\n其中当$t=1$时竖杠右侧显然为空。\n因此，根据这样一个模型，一组值$\\{y^{(1)},\\dots,y^{(\\tau)} \\}$的负对数似然为\n\\begin{align}\n L = \\sum_{t} L^{(t)},\n\\end{align}\n其中\n\\begin{align}\n L^{(t)} = -\\log P(\\RSy^{(t)} = y^{(t)} \\mid y^{(t-1)},y^{(t-2)}, \\dots, y^{(1)}).\n\\end{align}\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/rnn_graphical_model_with_state}}\n\\fi\n\\caption{在~RNN~图模型中引入状态变量，尽管它是输入的确定性函数，但它有助于我们根据\\eqn?获得非常高效的参数化。\n序列中的每个阶段（对于$\\Vh^{(t)}$和$\\Vy^{(t)}$）使用相同的结构（每个节点具有相同数量的输入），并且可以与其他阶段共享相同的参数。\n}\n\\end{figure}\n\n图模型中的边表示哪些变量直接依赖于其他变量。\n许多图模型的目标是省略不存在强相互作用的边以实现统计和计算的效率。\n例如，我们通常可以作Markov假设，即图模型应该只包含从$\\{ \\RSy^{(t-k)}, \\dots, \\RSy^{(t-1)}\\}$到$\\RSy^{(t)}$的边，而不是包含整个过去历史的边。\n然而，在一些情况下，我们认为整个过去的输入会对序列的下一个元素有一定影响。\n当我们认为$\\RSy^{(t)}$的分布可能取决于遥远过去(在某种程度)的$\\RSy^{(i)}$的值，且无法通过$\\RSy^{(t-1)}$捕获$\\RSy^{(i)}$的影响时，RNN~将会很有用。\n\n解释~RNN~作为图模型的一种方法是将RNN视为定义一个结构为完全图的图模型，且能够表示任何一对$\\RSy$值之间的直接联系。\n\\fig?是关于$\\RSy$值且具有完全图结构的图模型。\n该~RNN~完全图的解释基于排除并忽略模型中的隐藏单元~$\\Vh^{(t)}$。\n\n<!-- % -- 377 -- -->\n\n更有趣的是，将隐藏单元~$\\Vh^{(t)}$视为随机变量，从而产生~RNN~的图模型结构\\footnote{给定这些变量的父变量，其条件分布是确定性的。\n尽管设计具有这样确定性的隐藏单元的图模型是很少见的，但这是完全合理的。}。\n在图模型中包括隐藏单元预示~RNN~能对观测的联合分布提供非常有效的参数化。\n假设我们用表格表示法来表示离散值上任意的联合分布，即对每个值可能的赋值分配一个单独条目的数组，该条目表示发生该赋值的概率。\n如果$y$可以取$k$个不同的值，表格表示法将有$\\CalO(k^\\tau)$个参数。\n对比~RNN，由于参数共享，RNN~的参数数目为$\\CalO(1)$且是序列长度的函数。 % ??\n我们可以调节~RNN~的参数数量来控制模型容量，但不用被迫与序列长度成比例。\n\\eqn?展示了所述~RNN~通过循环应用相同的函数$f$以及在每个时间步的相同参数$\\Vtheta$，有效地参数化的变量之间的长期联系。\n\\fig?说明了这个图模型的解释。\n在图模型中结合$\\Vh^{(t)}$节点可以用作过去和未来之间的中间量，从而将它们解耦。\n遥远过去的变量$y^{(i)}$可以通过其对$\\Vh$的影响来影响变量$y^{(t)}$。\n该图的结构表明可以在时间步使用相同的条件概率分布有效地参数化模型，并且当观察到全部变量时，可以高效地评估联合分配给所有变量的概率。\n\n<!-- % -- 378 -- -->\n\n即便使用高效参数化的图模型，某些操作在计算上仍然具有挑战性。\n例如，难以预测序列中缺少的值。\n\n循环网络为减少的参数数目付出的代价是\\emph{优化}参数可能变得困难。\n\n在循环网络中使用的参数共享的前提是相同参数可用于不同时间步的假设。\n也就是说，假设给定时刻$t$的变量后，时刻$t +1$变量的条件概率分布是平稳的，这意味着之前的时间步与下个时间步之间的关系并不依赖于$t$。\n原则上，可以使用$t$作为每个时间步的额外输入，并让学习器在发现任何时间依赖性的同时，在不同时间步之间尽可能多地共享。\n相比在每个$t$使用不同的条件概率分布已经好很多了，但网络将必须在面对新$t$时进行推断。\n\n为了完整描述将~RNN~作为图模型的观点，我们必须描述如何从模型采样。\n我们需要执行的主要操作是简单地从每一时间步的条件分布采样。\n然而，这会导致额外的复杂性。\nRNN~必须有某种机制来确定序列的长度。\n这可以通过多种方式实现。\n\n在当输出是从词汇表获取的符号的情况下，我们可以添加一个对应于序列末端的特殊符号{cite?}。\n当产生该符号时，采样过程停止。\n在训练集中，我们将该符号作为序列的一个额外成员，即紧跟每个训练样本$\\Vx^{(\\tau)}$之后。\n\n<!-- % -- 379 -- -->\n\n另一种选择是在模型中引入一个额外的~Bernoulli~输出，表示在每个时间步决定继续生成或停止生成。\n相比向词汇表增加一个额外符号，这种方法更普遍，因为它适用于任何~RNN，而不仅仅是输出符号序列的~RNN。\n例如，它可以应用于一个产生实数序列的~RNN。\n新的输出单元通常使用~sigmoid~单元，并通过交叉熵训练。\n在这种方法中，sigmoid~被训练为最大化正确预测的对数似然，即在每个时间步序列决定结束或继续。\n\n确定序列长度$\\tau$的另一种方法是将一个额外的输出添加到模型并预测整数$\\tau$本身。\n模型可以采出$\\tau$的值，然后采$\\tau$步有价值的数据。\n这种方法需要在每个时间步的循环更新中增加一个额外输入，使得循环更新知道它是否是靠近所产生序列的末尾。\n这种额外的输入可以是$\\tau$的值，也可以是$\\tau - t$即剩下时间步的数量。\n如果没有这个额外的输入，RNN~可能会产生突然结束序列，如一个句子在最终完整前结束。\n此方法基于分解\n\\begin{align}\n P(\\Vx^{(1)},\\dots, \\Vx^{(\\tau)}) = P(\\tau) P(\\Vx^{(1)},\\dots,\\Vx^{(\\tau)} \\mid \\tau) .\n\\end{align}\n直接预测$\\tau$的例子见{Goodfellow+et+al-ICLR2014a}。\n\n\n## 基于上下文的~RNN~序列建模\n\n上一节描述了没有输入$\\Vx$时，关于随机变量序列$y^{(t)}$的RNN如何对应于有向图模型。\n当然，如\\eqn?所示的RNN包含一个输入序列$\\Vx^{(1)},\\Vx^{(2)},\\dots,\\Vx^{(\\tau)}$。\n一般情况下，RNN~允许将图模型的观点扩展到不仅代表$y$变量的联合分布也能表示给定$\\Vx$后$y$条件分布。\n如在\\sec?的前馈网络情形中所讨论的，任何代表变量$P(\\Vy;\\Vtheta)$的模型都能被解释为代表条件分布$P(\\Vy \\mid \\Vomega)$的模型，其中$\\Vomega=\\Vtheta$。\n我们能像之前一样使用$P(\\Vy \\mid \\Vomega)$代表分布$P(\\Vy \\mid \\Vx)$来扩展这样的模型，但要令$\\Vomega$是关于$\\Vx$的函数。\n在~RNN~的情况，这可以通过不同的方式来实现。\n此处，我们回顾最常见和最明显的选择。\n\n<!-- % -- 380 -- -->\n\n之前，我们已经讨论了将$t =1, \\dots, \\tau$的向量$\\Vx^{(t)}$序列作为输入的~RNN。\n另一种选择是只使用单个向量$\\Vx$作为输入。\n当$\\Vx$是一个固定大小的向量时，我们可以简单地将其看作产生$\\Vy$序列~RNN~的额外输入。\n将额外输入提供到~RNN~的一些常见方法是：\n\\begin{enumerate}\n+ 在每个时刻作为一个额外输入，或\n+ 作为初始状态$\\Vh^{(0)}$，或\n+ 结合两种方式。\n\\end{enumerate}\n\n第一个也是最常用的方法如\\fig?所示。\n输入$\\Vx$和每个隐藏单元向量$\\Vh^{(t)}$之间的相互作用是通过新引入的权重矩阵$\\MR$参数化的，这是只包含$y$序列的模型所没有的。\n同样的乘积$\\Vx^\\top\\MR$在每个时间步作为隐藏单元的一个额外输入。\n我们可以认为$\\Vx$的选择（确定$\\Vx^\\top\\MR$值），是有效地用于每个隐藏单元的一个新偏置参数。\n权重与输入保持独立。\n我们可以认为这种模型采用了非条件模型的$\\Vtheta$，并将$\\Vomega$代入$\\Vtheta$，其中$\\Vomega$内的偏置参数现在是输入的函数。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/conditional_rnn}}\n\\fi\n\\caption{将固定长度的向量$\\Vx$映射到序列$\\MY$上分布的~RNN。\n这类~RNN~适用于很多任务如图注，其中单个图像作为模型的输入，然后产生描述图像的词序列。\n观察到的输出序列的每个元素$\\Vy^{(t)}$同时用作输入（对于当前时间步）和训练期间的目标（对于前一时间步）。\n}\n\\end{figure}\n\n<!-- % -- 381 -- -->\n\nRNN~可以接收向量序列$\\Vx^{(t)}$作为输入，而不是仅接收单个向量$\\Vx$作为输入。\n\\eqn?描述的~RNN~对应条件分布$P(\\Vy^{(1)}, \\dots, \\Vy^{(\\tau)} \\mid \\Vx^{(1)}, \\dots, \\Vx^{(\\tau)})$，并在条件独立的假设下这个分布分解为\n\\begin{align}\n \\prod_t P(\\Vy^{(t)} \\mid \\Vx^{(1)}, \\dots, \\Vx^{(t)}).\n\\end{align}\n为去掉条件独立的假设，我们可以在时刻$t$的输出到时刻$t+1$的隐藏单元添加连接，如\\fig?所示。\n该模型就可以代表关于$\\Vy$序列的任意概率分布。\n这种给定一个序列表示另一个序列分布的模型的还是有一个限制，就是这两个序列的长度必须是相同的。\n我们将在\\sec?描述如何消除这种限制。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/causal_rnn}}\n\\fi\n\\caption{将可变长度的$\\Vx$值序列映射到相同长度的$\\Vy$值序列上分布的条件循环神经网络。\n对比\\fig?，此~RNN~包含从前一个输出到当前状态的连接。\n这些连接允许此RNN对给定$\\Vx$的序列后相同长度的$\\Vy$序列上的任意分布建模。\n\\fig?的~RNN~仅能表示在给定$\\Vx$值的情况下，$\\Vy$值彼此条件独立的分布。\n}\n\\end{figure}\n\n\n<!-- % -- 382 -- -->\n\n\n# 双向~RNN\n\n目前为止我们考虑的所有循环神经网络有一个\"因果\"结构，意味着在时刻$t$的状态只能从过去的序列$\\Vx^{(1)},\\dots,\\Vx^{(t-1)}$以及当前的输入$\\Vx^{(t)}$捕获信息。\n我们还讨论了某些在$\\Vy$可用时，允许过去的$\\Vy$值信息影响当前状态的模型。\n\n然而，在许多应用中，我们要输出的$\\Vy^{(t)}$的预测可能依赖于整个输入序列。\n例如，在语音识别中，由于协同发音，当前声音作为音素的正确解释可能取决于未来几个音素，甚至潜在的可能取决于未来的几个词，因为词与附近的词之间的存在语义依赖：如果当前的词有两种声学上合理的解释，我们可能要在更远的未来（和过去）寻找信息区分它们。\n这在手写识别和许多其他序列到序列学习的任务中也是如此，将会在下一节中描述。\n\n双向循环神经网络（或双向~RNN）为满足这种需要而被发明{cite?}。\n他们在需要双向信息的应用中非常成功{cite?}，如手写识别{cite?}，语音识别{cite?}以及生物信息学{cite?}。\n\n顾名思义，双向~RNN~结合时间上从序列起点开始移动的~RNN~和另一个时间上从序列末尾开始移动的~RNN。\n\\fig?展示了典型的双向~RNN，其中$\\Vh^{(t)}$代表通过时间向前移动的子~RNN~的状态，$\\Vg^{(t)}$代表通过时间向后移动的子~RNN~的状态。\n这允许输出单元$\\Vo^{(t)}$能够计算同时依赖于过去和未来且对时刻$t$的输入值最敏感的表示，而不必指定$t$周围固定大小的窗口（这是前馈网络、卷积网络或具有固定大小的先行缓存器的常规~RNN~所必须要做的）。\n\n<!-- % -- 383 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/bidirectional_rnn}}\n\\fi\n\\caption{典型的双向循环神经网络中的计算，意图学习将输入序列$\\Vx$映射到目标序列$\\Vy$（在每个步骤$t$具有损失$L^{(t)}$）。\n循环性$\\Vh$在时间上向前传播信息（向右），而循环性$\\Vg$在时间上向后传播信息（向左）。\n因此在每个点$t$，输出单元$\\Vo^{(t)}$可以受益于输入$\\Vh^{(t)}$中关于过去的相关概要以及输入$\\Vg^{(t)}$中关于未来的相关概要。\n}\n\\end{figure}\n\n这个想法可以自然地扩展到2维输入，如图像，由\\emph{四个}~RNN~组成，每一个沿着四个方向中的一个计算：上、下、左、右。\n如果~RNN~能够学习到承载长期信息，那在2维网格每个点$(i, j)$的输出$O_{i,j}$就能计算一个能捕捉到大多局部信息但仍依赖于长期输入的表示。\n相比卷积网络，应用于图像的~RNN~计算成本通常更高，但允许同一特征图的特征之间存在长期横向的相互作用{cite?}。\n实际上，对于这样的~RNN，前向传播公式可以写成表示使用卷积的形式，计算自底向上到每一层的输入（在整合横向相互作用的特征图的循环传播之前）。\n\n<!-- % -- 384 -- -->\n\n\n# 基于编码-解码的序列到序列架构\n\n我们已经在\\fig?看到RNN如何将输入序列映射成固定大小的向量，在\\fig?中看到RNN如何将固定大小的向量映射成一个序列，在\\fig?、\\fig?、\\fig?和\\fig?中看到RNN如何将一个输入序列映射到等长的输出序列。\n\n本节我们讨论如何训练RNN，使其将输入序列映射到不一定等长的输出序列。\n这在许多场景中都有应用，如语音识别、机器翻译或问答，其中训练集的输入和输出序列的长度通常不相同（虽然它们的长度可能相关）。\n\n我们经常将RNN的输入称为\"上下文\"。\n我们希望产生此上下文的表示，$C$。\n这个上下文$C$可能是一个概括输入序列$\\MX=(\\Vx^{(1)},\\dots,\\Vx^{(n_x)})$的向量或者向量序列。\n\n用于映射可变长度序列到另一可变长度序列最简单的RNN架构最初由{cho-al-emnlp14}提出，之后不久由{Sutskever-et-al-NIPS2014}独立开发，并且第一个使用这种方法获得翻译的最好结果。\n前一系统是对另一个机器翻译系统产生的建议进行评分，而后者使用独立的循环网络生成翻译。\n这些作者分别将该架构称为编码-解码或序列到序列架构，如\\fig?所示。\n这个想法非常简单：（1）编码器或\\,\\textbf{读取器}\\,(reader)或\\,\\textbf{输入}(input)~RNN~处理输入序列。\n编码器输出上下文$C$（通常是最终隐藏状态的简单函数）。\n(2)解码器或\\,\\textbf{写入器}(writer)或\\,\\textbf{输出}(output)~RNN~则以固定长度的向量（如\\fig?）为条件产生输出序列$\\MY=(\\Vy^{(1)}, \\dots, \\Vy^{(n_y)})$。\n这种架构对比本章前几节提出的架构的创新之处在于长度$n_x$和$n_y$可以彼此不同，而之前的架构约束$n_x = n_y = \\tau$。\n在序列到序列的架构中，两个~RNN~共同训练以最大化$\\log P( \\Vy^{(1)}, \\dots, \\Vy^{(n_y)} \\mid \\Vx^{(1)},\\dots,\\Vx^{(n_x)} )$(关于训练集中所有$\\Vx$和$\\Vy$对的平均)。\n编码器~RNN~的最后一个状态$\\Vh_{n_x}$通常被当作输入的表示$C$并作为解码器~RNN~的输入。\n\n<!-- % -- 385 -- -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/rnn_encdec}}\n\\fi\n\\caption{在给定输入序列$(\\RVx^{(1)},\\RVx^{(2)},\\dots,\\RVx^{(n_x)})$的情况下学习生成输出序列$(\\RVy^{(1)},\\RVy^{(2)},\\dots,\\RVy^{(n_y)})$的编码器-解码器或序列到序列的~RNN~架构的示例。 \n它由读取输入序列的编码器~RNN~以及生成输出序列（或计算给定输出序列的概率）的解码器~RNN~组成。\n编码器~RNN~的最终隐藏状态用于计算一般为固定大小的上下文变量$C$，$C$表示输入序列的语义概要并且作为解码器~RNN~的输入。\n}\n\\end{figure}\n\n如果上下文$C$是一个向量，则解码器~RNN~只是在\\sec?描述的向量到序列~RNN。\n正如我们所见，向量到序列~RNN~至少有两种接受输入的方法。\n输入可以被提供为~RNN~的初始状态，或连接到每个时间步中的隐藏单元。\n这两种方式也可以结合。\n\n这里并不强制要求编码器与解码器的隐藏层具有相同的大小。\n\n此架构的一个明显不足是，编码器~RNN~输出的上下文$C$的维度太小而难以适当地概括一个长序列。\n这种现象由{Bahdanau-et-al-ICLR2015-small}在机器翻译中观察到。\n他们提出让$C$成为可变长度的序列，而不是一个固定大小的向量。\n此外，他们还引入了将序列$C$的元素和输出序列的元素相关联的注意力机制。\n读者可在\\sec?了解更多细节。\n\n<!-- % -- 386 -- -->\n\n\n# 深度循环网络\n\n大多数~RNN~中的计算可以分解成三块参数及其相关的变换：\n\\begin{enumerate}\n+ 从输入到隐藏状态，\n+ 从前一隐藏状态到下一隐藏状态，以及\n+ 从隐藏状态到输出。\n\\end{enumerate}\n根据\\fig?中的~RNN~架构，这三个块都与单个权重矩阵相关联。\n换句话说，当网络被展开时，每个块对应一个浅的变换。\n能通过深度~MLP~内单个层来表示的变换称为浅变换。\n通常，这是由学成的仿射变换和一个固定非线性表示组成的变换。\n\n在这些操作中引入深度会有利的吗？\n实验证据{cite?}强烈暗示理应如此。\n实验证据与我们需要足够的深度以执行所需映射的想法一致。\n读者可以参考~{Schmidhuber92,ElHihi+Bengio-nips8}或~{Jaeger2007}了解更早的关于深度~RNN~的研究。\n\n{Graves-et-al-ICASSP2013}第一个展示了将~RNN~的状态分为多层的显著好处，如\\fig?~\\emph{(左)}。\n我们可以认为，在\\fig?(a)所示层次结构中较低的层起到了将原始输入转化为对更高层的隐藏状态更合适表示的作用。\n{Pascanu-et-al-ICLR2014}更进一步提出在上述三个块中各使用一个单独的~MLP（可能是深度的），如\\fig?(b)所示。\n考虑表示容量，我们建议在这三个步中都分配足够的容量，但增加深度可能会因为优化困难而损害学习效果。\n在一般情况下，更容易优化较浅的架构，加入\\fig?(b)的额外深度导致从时间步~$t$的变量到时间步~$t+1$的最短路径变得更长。\n例如，如果具有单个隐藏层的~MLP~被用于状态到状态的转换，那么与\\fig?相比，我们就会加倍任何两个不同时间步变量之间最短路径的长度。\n然而{Pascanu-et-al-ICLR2014}认为，在隐藏到隐藏的路径中引入跳跃连接可以缓和这个问题，如\\fig?(c)所示。\n\n<!-- % -- 387 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/deep}}\n\\fi\n\\caption{循环神经网络可以通过许多方式变得更深{cite?}。\n(a)隐藏循环状态可以被分解为具有层次的组。\n(b)可以向输入到隐藏，隐藏到隐藏以及隐藏到输出的部分引入更深的计算(如~MLP)。\n这可以延长链接不同时间步的最短路径。\n(c)可以引入跳跃连接来缓解路径延长的效应。\n}\n\\end{figure}\n\n\n# 递归神经网络\n\n递归神经网络\\footnote{我们建议不要将\"递归神经网络\"缩写为\"RNN\"，以免与\"循环神经网络\"混淆。}代表循环网络的另一个扩展，它被构造为深的树状结构而不是~RNN~的链状结构，因此是不同类型的计算图。\n递归网络的典型计算图如\\fig?所示。\n递归神经网络由~{Pollack90}引入，而~{tr-bottou-2011}描述了这类网络的潜在用途——学习推论。\n递归网络已成功地应用于输入是\\emph{数据结构}的神经网络~{cite?}，如自然语言处理{cite?}和计算机视觉{cite?}。\n\n<!-- % -- 388 -- -->\n\n递归网络的一个明显优势是，对于具有相同长度$\\tau$的序列，深度（通过非线性操作的组合数量来衡量）可以急剧地从$\\tau$减小为$\\CalO(\\log \\tau)$，这可能有助于解决长期依赖。\n一个悬而未决的问题是如何以最佳的方式构造树。\n一种选择是使用不依赖于数据的树结构，如平衡二叉树。\n在某些应用领域，外部方法可以为选择适当的树结构提供借鉴。\n例如，处理自然语言的句子时，用于递归网络的树结构可以被固定为句子语法分析树的结构（可以由自然语言语法分析程序提供）{cite?}。\n理想的情况下，人们希望学习器自行发现和推断适合于任意给定输入的树结构，如{cite?}所建议。\n\n<!-- % -- 389 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/recursive_net}}\n\\fi\n\\caption{递归网络将循环网络的链状计算图推广到树状计算图。\n可变大小的序列$\\Vx^{(1)},\\Vx^{(2)},\\dots,\\Vx^{(t)}$可以通过固定的参数集合（权重矩阵$\\MU,\\MV,\\MW$）映射到固定大小的表示（输出$\\Vo$）。\n该图展示了监督学习的情况，其中提供了一些与整个序列相关的目标$\\Vy$。\n}\n\\end{figure}\n\n递归网络想法的变种存在很多。\n例如，{Frasconi97}和~{Frasconi-1998}将数据与树结构相关联，并将输入和目标与树的单独节点相关联。\n由每个节点执行的计算无须是传统的人工神经计算（所有输入的仿射变换后跟一个单调非线性）。\n例如，{Socher-et-al-EMNLP2013}提出用张量运算和双线性形式，在这之前人们已经发现当概念是由连续向量（嵌入）表示时，这种方式有利于建模概念之间的联系{cite?}。\n\n\n# 长期依赖的挑战\n\n学习循环网络长期依赖的数学挑战在\\sec?中引入。\n根本问题是，经过许多阶段传播后的梯度倾向于消失（大部分情况）或爆炸（很少，但对优化过程影响很大）。\n即使我们假设循环网络是参数稳定的（可存储记忆，且梯度不爆炸），但长期依赖的困难来自比短期相互作用指数小的权重（涉及许多~Jacobian~相乘）。\n许多资料提供了更深层次的讨论{cite?}。\n在这一节中，我们会更详细地描述该问题。\n其余几节介绍克服这个问题的方法。\n\n<!-- % -- 390 -- -->\n\n循环网络涉及相同函数的多次组合，每个时间步一次。\n这些组合可以导致极端非线性行为，如\\fig?所示。\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/composition_color}}\n\\fi\n\\caption{重复组合函数。\n当组合许多非线性函数（如这里所示的线性tanh层）时，结果是高度非线性的，通常大多数值与微小的导数相关联，也有一些具有大导数的值，以及在增加和减小之间的多次交替。% ??\n此处，我们绘制从100维隐藏状态降到单个维度的线性投影，绘制于$y$轴上。\n$x$轴是100维空间中沿着随机方向的初始状态的坐标。\n因此，我们可以将该图视为高维函数的线性截面。\n曲线显示每个时间步之后的函数，或者等价地，转换函数被组合一定次数之后。\n}\n\\end{figure}\n\n特别地，循环神经网络所使用的函数组合有点像矩阵乘法。\n我们可以认为，循环联系\n\\begin{align}\n \\Vh^{(t)} = \\MW^\\top \\Vh^{(t-1)}\n\\end{align}\n是一个非常简单的、缺少非线性激活函数和输入$\\Vx$的循环神经网络。\n如\\sec?描述，这种递推关系本质上描述了幂法。\n它可以被简化为\n\\begin{align}\n \\Vh^{(t)} = (\\MW^t)^\\top \\Vh^{(0)},\n\\end{align}\n而当$\\MW$符合下列形式的特征分解\n\\begin{align}\n \\MW = \\MQ \\VLambda \\MQ^\\top,\n\\end{align}\n其中$\\MQ$正交，循环性可进一步简化为\n\\begin{align}\n \\Vh^{(t)} = \\MQ^\\top \\VLambda^t \\MQ \\Vh^{(0)}.\n\\end{align}\n特征值提升到$t$次后，导致幅值不到一的特征值衰减到零，而幅值大于一的就会激增。\n任何不与最大特征向量对齐的$\\Vh^{(0)}$的部分将最终被丢弃。\n\n\n这个问题是针对循环网络的。\n在标量情况下，想象多次乘一个权重$w$。\n该乘积$w^t$消失还是爆炸取决于$w$的幅值。\n然而，如果每个时刻使用不同权重$w^{(t)}$的非循环网络，情况就不同了。\n如果初始状态给定为$1$，那么时刻$t$的状态可以由$\\prod_t w^{(t)}$给出。\n假设$w^{(t)}$的值是随机生成的，各自独立，且有$0$均值$v$方差。\n乘积的方差就为$\\CalO(v^n)$。\n为了获得某些期望的方差$v^*$，我们可以选择单个方差为$v=\\sqrt[n]{v^*}$权重。\n因此，非常深的前馈网络通过精心设计的比例可以避免梯度消失和爆炸问题，如~{Sussillo14}所主张的。\n\n<!-- % -- 391 -- -->\n\nRNN~梯度消失和爆炸问题是由不同研究人员独立发现{cite?}。\n有人可能会希望通过简单地停留在梯度不消失或爆炸的参数空间来避免这个问题。\n不幸的是，为了储存记忆并对小扰动具有鲁棒性，RNN~必须进入参数空间中的梯度消失区域{cite?}。\n具体来说，每当模型能够表示长期依赖时，长期相互作用的梯度幅值就会变得指数小（相比短期相互作用的梯度幅值）。\n这并不意味着这是不可能学习的，由于长期依赖关系的信号很容易被短期相关性产生的最小波动隐藏，因而学习长期依赖可能需要很长的时间。\n实践中，{Bengio1994ITNN}的实验表明，当我们增加了需要捕获的依赖关系的跨度，基于梯度的优化变得越来越困难，SGD~在长度仅为10或20的序列上成功训练传统~RNN~的概率迅速变为0。\n\n将循环网络作为动力系统更深入探讨的资料见~{Doya93,Bengio1994ITNN,Siegelmann+Sontag-1995}及~\n{Pascanu-et-al-ICML2013}的回顾。\n本章的其余部分将讨论目前已经提出的降低学习长期依赖（在某些情况下，允许一个~RNN~学习横跨数百步的依赖）难度的不同方法，但学习长期依赖的问题仍是深度学习中的一个主要挑战。\n\n\n\n# 回声状态网络\n\n从$\\Vh^{(t-1)}$到$\\Vh^{(t)}$的循环权重映射以及从$\\Vx^{(t)}$到$\\Vh^{(t)}$的输入权重映射是循环网络中最难学习的参数。\n研究者{cite?}提出避免这种困难的方法是设定循环隐藏单元，使其能很好地捕捉过去输入历史，并且\\emph{只学习输出权重}。\n回声状态网络或~ESN~{cite?}，以及流体状态机{cite?}分别独立地提出了这种想法。\n后者是类似的，只不过它使用脉冲神经元（二值输出）而不是~ESN~中的连续隐藏单元。\nESN~和流体状态机都被称为储层计算{cite?}，因为隐藏单元形成了可能捕获输入历史不同方面的临时特征池。\n\n<!-- % -- 392 -- -->\n\n储层计算循环网络类似于核机器，这是思考它们的一种方式：它们将任意长度的序列（到时刻$t$的输入历史）映射为一个长度固定的向量（循环状态$\\Vh^{(t)}$），之后可以施加一个线性预测算子（通常是一个线性回归）以解决感兴趣的问题。\n训练准则就可以很容易地设计为输出权重的凸函数。\n例如，如果输出是从隐藏单元到输出目标的线性回归，训练准则就是均方误差，由于是凸的就可以用简单的学习算法可靠地解决{cite?}。\n\n因此，重要的问题是：我们如何设置输入和循环权重才能让一组丰富的历史可以在循环神经网络的状态中表示？\n储层计算研究给出的答案是将循环网络视为动态系统，并设定让动态系统接近稳定边缘的输入和循环权重。\n\n最初的想法是使状态到状态转换函数的~Jacobian~矩阵的特征值接近1。\n如\\sec?解释，循环网络的一个重要特征就是~Jacobian~矩阵的特征值谱$\\MJ^{(t)} = \\frac{\\partial s^{(t)}}{\\partial s^{(t-1)}}$。\n特别重要的是$\\MJ^{(t)}$的谱半径，定义为特征值的最大绝对值。\n\n为了解谱半径的影响，可以考虑反向传播中~Jacobian~矩阵$\\MJ$不随$t$改变的简单情况。\n例如当网络是纯线性时，会发生这种情况。\n假设$\\MJ$特征值$\\lambda$对应的特征向量为$\\Vv$。\n考虑当我们通过时间向后传播梯度向量时会发生什么。\n如果刚开始的梯度向量为$\\Vg$，然后经过反向传播的一个步骤后，我们将得到$\\MJ \\Vg$，$n$步之后我们会得到$\\MJ^n \\Vg$。\n现在考虑如果我们向后传播扰动版本的$\\Vg$会发生什么。\n如果我们刚开始是$\\Vg + \\delta \\Vv$，一步之后，我们会得到$\\MJ(\\Vg + \\delta \\Vv)$。\n$n$步之后，我们将得到$\\MJ^n(\\Vg + \\delta \\Vv)$。\n由此我们可以看出，由$\\Vg$开始的反向传播和由$\\Vg+\\delta \\Vv$开始的反向传播，$n$步之后偏离$\\delta \\MJ^n \\Vv$。\n如果$\\Vv$选择为$\\MJ$特征值$\\lambda$对应的一个单位特征向量，那么在每一步乘~Jacobian~矩阵只是简单地缩放。\n反向传播的两次执行分离的距离为$\\delta | \\lambda |^n$。\n当$\\Vv$对应于最大特征值$|\\lambda|$，初始扰动为$\\delta$时这个扰动达到可能的最宽分离。\n\n当$ | \\lambda | > 1$，偏差$\\delta | \\lambda |^n$就会指数增长。\n当$ | \\lambda | < 1$，偏差就会变得指数小。\n\n<!-- % -- 393 -- -->\n\n当然，这个例子假定~Jacobian~矩阵在每个时间步是相同的，即对应于没有非线性循环网络。\n当非线性存在时，非线性的导数将在许多时间步后接近零，并有助于防止因过大的谱半径而导致的爆炸。\n事实上，关于回声状态网络的最近工作提倡使用远大于1的谱半径~{cite?}。\n\n我们已经说过多次，通过反复矩阵乘法的反向传播同样适用于没有非线性的正向传播的网络，其状态为$\\Vh^{(t+1)} = \\Vh^{(t)\\top} \\MW $。\n\n如果线性映射$\\MW^\\top$在$L^2$范数的测度下总是缩小$\\Vh$，那么我们说这个映射是收缩的。\n当谱半径小于一，则从$\\Vh^{(t)}$到$\\Vh^{(t+1)}$的映射是收缩的，因此小变化在每个时间步后变得更小。\n当我们使用有限精度（如32位整数）来存储状态向量时，必然会使得网络忘掉过去的信息。\n\nJacobian~矩阵告诉我们$\\Vh^{(t)}$一个微小的变化如何向前一步传播，或等价的，$\\Vh^{(t+1)}$的梯度如何向后一步传播。\n需要注意的是，$\\MW$和$\\MJ$都不需要是对称的（尽管它们是实方阵），因此它们可能有复的特征值和特征向量，其中虚数分量对应于潜在的振荡行为（如果迭代地应用同一~Jacobian）。\n即使$\\Vh^{(t)}$或$\\Vh^{(t)}$中有趣的小变化在反向传播中是实值的，它们仍可以用这样的复数基表示。\n重要的是，当向量乘以矩阵时，这些复数基的系数幅值（复数的绝对值）会发生什么变化。\n幅值大于1的特征值对应于放大（如果反复应用则指数增长）或收缩（如果反复应用则指数减小）。\n\n非线性映射情况时，Jacobian~会在每一步任意变化。\n因此，动态量变得更加复杂。\n然而，一个小的初始变化多步之后仍然会变成一个大的变化。\n纯线性和非线性情况的一个不同之处在于使用压缩非线性（如$\\tanh$）可以使循环动态量有界。\n注意，即使前向传播动态量有界，反向传播的动态量仍然可能无界，例如，当$\\tanh$序列都在它们状态中间的线性部分，并且由谱半径大于1的权重矩阵连接。\n然而，所有$\\tanh$单元同时位于它们的线性激活点是非常罕见的。\n\n<!-- % -- 394 -- -->\n\n回声状态网络的策略是简单地固定权重使其具有一定的谱半径如3，其中信息通过时间前向传播，但会由于饱和非线性单元（如$\\tanh$）的稳定作用而不会爆炸。\n\n最近，已经有研究表明，用于设置~ESN~权重的技术可以用来\\emph{初始化}完全可训练的循环网络的权重（通过时间反向传播来训练隐藏到隐藏的循环权重），帮助学习长期依赖~{cite?}。\n在这种设定下，结合\\sec?中稀疏初始化的方案，设置$1.2$的初始谱半径表现不错。\n\n\n# 渗漏单元和其他多时间尺度的策略\n\n处理长期依赖的一种方法是设计工作在多个时间尺度的模型，使模型的某些部分在细粒度时间尺度上操作并能处理小细节，而其他部分在粗时间尺度上操作并能把遥远过去的信息更有效地传递过来。\n存在多种同时构建粗细时间尺度的策略。\n这些策略包括在时间轴增加跳跃连接，\"渗漏单元\"使用不同时间常数整合信号，并去除一些用于建模细粒度时间尺度的连接。\n\n\n## 时间维度的跳跃连接\n\n增加从遥远过去的变量到目前变量的直接连接是得到粗时间尺度的一种方法。\n使用这样跳跃连接的想法可以追溯到{Lin-ieeetnn96}，紧接是向前馈网络引入延迟的想法{cite?}。\n在普通的循环网络中，循环从时刻$t$的单元连接到时刻$t+1$单元。\n构造较长的延迟循环网络是可能的{cite?}。\n\n正如我们在\\sec?看到，梯度可能\\emph{关于时间步数}呈指数消失或爆炸。\n{cite?}引入了$d$延时的循环连接以减轻这个问题。\n现在导数指数减小的速度与$\\frac{\\tau}{d}$相关而不是$\\tau$。\n既然同时存在延迟和单步连接，梯度仍可能成$t$指数爆炸。\n这允许学习算法捕获更长的依赖性，但不是所有的长期依赖都能在这种方式下良好地表示。\n\n<!-- % -- 395 -- -->\n\n\n## 渗漏单元和一系列不同时间尺度\n\n获得导数乘积接近1的另一方式是设置\\emph{线性}自连接单元，并且这些连接的权重接近1。\n\n我们对某些$v$值应用更新$\\mu^{(t)} \\gets \\alpha \\mu^{(t-1)} + (1-\\alpha) v^{(t)}$累积一个滑动平均值$\\mu^{(t)}$，其中$\\alpha$是一个从$ \\mu^{(t-1)}$到$ \\mu^{(t)}$线性自连接的例子。\n当$\\alpha$接近1时，滑动平均值能记住过去很长一段时间的信息，而当$\\alpha$接近0，关于过去的信息被迅速丢弃。\n线性自连接的隐藏单元可以模拟滑动平均的行为。\n这种隐藏单元称为渗漏单元。\n\n$d$~时间步的跳跃连接可以确保单元总能被$d$个时间步前的那个值影响。\n使用权重接近1的线性自连接是确保该单元可以访问过去值的不同方式。\n线性自连接通过调节实值$\\alpha$更平滑灵活地调整这种效果，而不是调整整数值的跳跃长度。\n\n这个想法由~{Mozer-nips92}和~{ElHihi+Bengio-nips8}提出。\n在回声状态网络中，渗漏单元也被发现很有用{cite?}。\n\n我们可以通过两种基本策略设置渗漏单元使用的时间常数。\n一种策略是手动将其固定为常数，例如在初始化时从某些分布采样它们的值。\n另一种策略是使时间常数成为自由变量，并学习出来。\n在不同时间尺度使用这样的渗漏单元似乎能帮助学习长期依赖~{cite?}。\n\n\n## 删除连接\n\n处理长期依赖另一种方法是在多个时间尺度组织~RNN~状态的想法{cite?}，信息在较慢的时间尺度上更容易长距离流动。\n\n这个想法与之前讨论的时间维度上的跳跃连接不同，因为它涉及主动\\emph{删除}长度为一的连接并用更长的连接替换它们。\n以这种方式修改的单元被迫在长时间尺度上运作。\n而通过时间跳跃连接是\\emph{添加}边。\n收到这种新连接的单元，可以学习在长时间尺度上运作，但也可以选择专注于自己其他的短期连接。\n\n<!-- % -- 396 -- -->\n\n强制一组循环单元在不同时间尺度上运作有不同的方式。\n一种选择是使循环单元变成渗漏单元，但不同的单元组关联不同的固定时间尺度。\n这由~{Mozer-nips92}提出，并被成功应用于~{Pascanu+al-ICML2013-small}。\n另一种选择是使显式且离散的更新发生在不同的时间，不同的单元组有不同的频率。\n这是~{ElHihi+Bengio-nips8}和~{Koutnik-et-al-ICML2014}的方法。\n它在一些基准数据集上表现不错。\n\n\n# 长短期记忆和其他门控RNN\n\n本文撰写之时，实际应用中最有效的序列模型称为门控RNN。\n包括基于长短期记忆和基于门控循环单元的网络。\n\n像渗漏单元一样，门控RNN~想法也是基于生成通过时间的路径，其中导数既不消失也不发生爆炸。\n渗漏单元通过手动选择常量的连接权重或参数化的连接权重来达到这一目的。\n门控RNN~将其推广为在每个时间步都可能改变的连接权重。\n\n渗漏单元允许网络在较长持续时间内\\emph{积累}信息（诸如用于特定特征或类的线索）。\n然而，一旦该信息被使用，让神经网络\\emph{遗忘}旧的状态可能是有用的。\n例如，如果一个序列是由子序列组成，我们希望渗漏单元能在各子序列内积累线索，我们需要将状态设置为0以忘记旧状态的机制。\n我们希望神经网络学会决定何时清除状态，而不是手动决定。\n这就是门控RNN~要做的事。\n\n\n## LSTM\n\n引入自循环的巧妙构思，以产生梯度长时间持续流动的路径是初始长短期记忆模型的核心贡献{cite?}。\n其中一个关键扩展是使自循环的权重视上下文而定，而不是固定的{cite?}。\n门控此自循环（由另一个隐藏单元控制）的权重，累积的时间尺度可以动态地改变。\n在这种情况下，即使是具有固定参数的~LSTM，累积的时间尺度也可以因输入序列而改变，因为时间常数是模型本身的输出。\nLSTM~已经在许多应用中取得重大成功，如无约束手写识别{cite?}、语音识别{cite?}、手写生成{cite?}、机器翻译{cite?}、为图像生成标题{cite?}和解析{cite?}。\n\n<!-- % -- 397 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/lstm}}\n\\fi\n\\caption{LSTM~循环网络\"细胞\"的框图。\n细胞彼此循环连接，代替一般循环网络中普通的隐藏单元。\n这里使用常规的人工神经元计算输入特征。\n如果sigmoid输入门允许，它的值可以累加到状态。\n状态单元具有线性自循环，其权重由遗忘门控制。\n细胞的输出可以被输出门关闭。\n所有门控单元都具有sigmoid非线性，而输入单元可具有任意的压缩非线性。\n状态单元也可以用作门控单元的额外输入。\n黑色方块表示单个时间步的延迟。\n}\n\\end{figure}\n\nLSTM~块如\\fig?所示。\n在浅循环网络的架构下，相应的前向传播公式如下。\n更深的架构也被成功应用{cite?}。\nLSTM~循环网络除了外部的~RNN~循环外，还具有内部的\"LSTM~细胞\"循环（自环），因此~LSTM~不是简单地向输入和循环单元的仿射变换之后施加一个逐元素的非线性。\n与普通的循环网络类似，每个单元有相同的输入和输出，但也有更多的参数和控制信息流动的门控单元系统。\n最重要的组成部分是状态单元$s_i^{(t)}$，与前一节讨论的渗漏单元有类似的线性自环。\n然而，此处自环的权重（或相关联的时间常数）由遗忘门~$f_i^{(t)}$控制（时刻$t$和细胞$i$），由~sigmoid~单元将权重设置为0和1之间的值：\n\\begin{align}\n 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),\n\\end{align}\n其中$\\Vx^{(t)}$是当前输入向量，$\\Vh^{t}$是当前隐藏层向量，$\\Vh^{t}$包含所有~LSTM~细胞的输出。 \n$\\Vb^f, \\MU^f, \\MW^f$分别是偏置、输入权重和遗忘门的循环权重。\n因此~LSTM~细胞内部状态以如下方式更新，其中有一个条件的自环权重$f_i^{(t)}$：\n\\begin{align}\n s_i^{(t)} = f_i^{(t)}  s_i^{(t-1)} +  g_i^{(t)}\n \\sigma \\Big( b_i + \\sum_j U_{i,j} x_j^{(t)} + \\sum_j W_{i,j} h_j^{(t-1)} \\Big),\n\\end{align}\n其中$\\Vb, \\MU, \\MW$分别是~LSTM~细胞中的偏置、输入权重和遗忘门的循环权重。\n\\textbf{外部输入门}(external input gate)单元$g_i^{(t)}$以类似遗忘门（使用sigmoid获得一个0和1之间的值）的方式更新，但有自身的参数：\n\\begin{align}\n 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).\n\\end{align}\nLSTM~细胞的输出$h_i^{(t)}$也可以由\\textbf{输出门}(output gate)~$q_i^{(t)}$关闭（使用sigmoid单元作为门控）：\n\\begin{align}\n h_i^{(t)} &= \\text{tanh}\\big( s_i^{(t)} \\big) q_i^{(t)}, \\\\\n 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),\n\\end{align}\n其中$\\Vb^o, \\MU^o, \\MW^o$分别是偏置、输入权重和遗忘门的循环权重。\n在这些变体中，可以选择使用细胞状态$s_i^{(t)}$作为额外的输入（及其权重），输入到第$i$个单元的三个门，如\\fig?所示。\n这将需要三个额外的参数。\n\n<!-- % -- 399 -- -->\n\nLSTM~网络比简单的循环架构更易于学习长期依赖，先是用于测试长期依赖学习能力的人工数据集{cite?}，然后是在具有挑战性的序列处理任务上获得最先进的表现{cite?}。\nLSTM~的变体和替代也已经被研究和使用，这将在下文进行讨论。\n\n\n## 其他门控RNN\n\nLSTM~架构中哪些部分是真正必须的？\n还可以设计哪些其他成功架构允许网络动态地控制时间尺度和不同单元的遗忘行为？\n\n最近关于门控RNN~的工作给出了这些问题的某些答案，其单元也被称为门控循环单元或~GRU~{cite?}。\n与~LSTM~的主要区别是，单个门控单元同时控制遗忘因子和更新状态单元的决定。\n更新公式如下：\n\\begin{align}\n h_i^{(t)} = u_i^{(t-1)} h_i^{(t-1)} + (1 - u_i^{(t-1)}) \\sigma \n \\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),\n\\end{align}\n其中$\\Vu$代表\"更新\"门，$\\Vr$表示\"复位\"门。\n它们的值就如通常所定义的：\n\\begin{align}\n 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),\n\\end{align}\n和\n\\begin{align}\n 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).\n\\end{align}\n复位和更新门能独立地\"忽略\"状态向量的一部分。\n更新门像条件渗漏累积器一样可以线性门控任意维度，从而选择将它复制（在~sigmoid~的一个极端）或完全由新的\"目标状态\"值（朝向渗漏累积器的收敛方向）替换并完全忽略它（在另一个极端）。\n复位门控制当前状态中哪些部分用于计算下一个目标状态，在过去状态和未来状态之间引入了附加的非线性效应。\n\n<!-- % -- 400 -- -->\n\n围绕这一主题可以设计更多的变种。\n例如复位门（或遗忘门）的输出可以在多个隐藏单元间共享。\n或者，全局门的乘积（覆盖一整组的单元，例如整一层）和一个局部门（每单元）可用于结合全局控制和局部控制。\n然而，一些调查发现这些~LSTM~和GRU架构的变种，在广泛的任务中难以明显地同时击败这两个原始架构{cite?}。\n{Greff-et-al-arxiv2015}发现其中的关键因素是遗忘门，而~{Jozefowicz-et-al-ICML2015}发现向~LSTM~遗忘门加入1的偏置(由~{Gers-et-al-2000}提倡)能让~LSTM~变得与已探索的最佳变种一样健壮。\n\n\n# 优化长期依赖\n\n我们已经在\\sec?和\\sec?中描述过在许多时间步上优化~RNN~时发生的梯度消失和爆炸的问题。\n\n由~{Martens+Sutskever-ICML2011}提出了一个有趣的想法是，二阶导数可能在一阶导数消失的同时消失。\n二阶优化算法可以大致被理解为将一阶导数除以二阶导数（在更高维数，由梯度乘以~Hessian~的逆）。\n如果二阶导数与一阶导数以类似的速率收缩，那么一阶和二阶导数的比率可保持相对恒定。\n不幸的是，二阶方法有许多缺点，包括高的计算成本、需要一个大的小批量、并且倾向于被吸引到鞍点。\n{Martens+Sutskever-ICML2011}发现采用二阶方法的不错结果。\n之后，{sutskeverimportance}发现使用较简单的方法可以达到类似的结果，例如经过谨慎初始化的~Nesterov~动量法。\n更详细的内容参考~{Sutskever-thesis2012}。\n应用于~LSTM~时，这两种方法在很大程度上会被单纯的~SGD（甚至没有动量）取代。\n这是机器学习中一个延续的主题，设计一个易于优化模型通常比设计出更加强大的优化算法更容易。\n\n<!-- % -- 401 -- -->\n\n\n## 截断梯度\n\n如\\sec?讨论，强非线性函数（如由许多时间步计算的循环网络）往往倾向于非常大或非常小幅度的梯度。\n如\\fig?和\\fig?所示，我们可以看到，目标函数（作为参数的函数）存在一个伴随\"悬崖\"的\"地形\"：宽且相当平坦区域被目标函数变化快的小区域隔开，形成了一种悬崖。\n\n这导致的困难是，当参数梯度非常大时，梯度下降的参数更新可以将参数抛出很远，进入目标函数较大的区域，到达当前解所作的努力变成了无用功。\n梯度告诉我们，围绕当前参数的无穷小区域内最速下降的方向。\n这个无穷小区域之外，代价函数可能开始沿曲线背面而上。\n更新必须被选择为足够小，以避免过分穿越向上的曲面。\n我们通常使用衰减速度足够慢的学习率，使连续的步骤具有大致相同的学习率。\n适合于一个相对线性的地形部分的步长经常在下一步进入地形中更加弯曲的部分时变得不适合，会导致上坡运动。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/cliff_clipping_color}}\n\\fi\n\\caption{梯度截断在有两个参数$\\Vw$和$\\Vb$的循环网络中的效果示例。\n梯度截断可以使梯度下降在极陡峭的悬崖附近更合理地执行。\n这些陡峭的悬崖通常发生在循环网络中，位于循环网络近似线性的附近。\n悬崖在时间步的数量上呈指数地陡峭，因为对于每个时间步，权重矩阵都自乘一次。\n\\emph{(左)}没有梯度截断的梯度下降越过这个小峡谷的底部，然后从悬崖面接收非常大的梯度。\n大梯度灾难性地将参数推到图的轴外。\n\\emph{(右)}使用梯度截断的梯度下降对悬崖的反应更温和。\n当它上升到悬崖面时，步长受到限制，使得它不会被推出靠近解的陡峭区域。\n经~{Pascanu+al-ICML2013-small}许可改编此图。\n}\n\\end{figure}\n\n<!-- % -- 402 -- -->\n\n一个简单的解决方案已被从业者使用多年：截断梯度。\n此想法有不同实例{cite?}。\n一种选择是在参数更新之前，\\emph{逐元素}地截断小批量产生的参数梯度~{cite?}。\n另一种是在参数更新之前\\emph{截断梯度~$\\Vg$的范数$\\norm{ \\Vg }$}~{cite?}：\n\\begin{align}\n \\text{if}~ \\norm{\\Vg} &> v \\\\\n \\Vg &\\gets \\frac{\\Vg v}{\\norm{g}},\n\\end{align}\n其中$v$是范数上界，$\\Vg$用来更新参数。\n因为所有参数（包括不同的参数组，如权重和偏置）的梯度被单个缩放因子联合重整化，所以后一方法具有的优点是保证了每个步骤仍然是在梯度方向上的，但实验表明两种形式类似。\n虽然参数更新与真实梯度具有相同的方向梯度，经过梯度范数截断，参数更新的向量范数现在变得有界。\n这种有界梯度能避免执行梯度爆炸时的有害一步。\n事实上，当梯度大小高于阈值时，即使是采取简单的\\emph{随机步骤}往往工作得几乎一样好。\n如果爆炸非常严重，梯度数值上为{\\tt Inf}或{\\tt Nan}（无穷大或不是一个数字），则可以采取大小为$v$的随机一步，通常会离开数值不稳定的状态。\n截断每小批量梯度范数不会改变单个小批量的梯度方向。\n然而，许多小批量使用范数截断梯度后的平均值不等同于截断真实梯度（使用所有的实例所形成的梯度）的范数。\n大导数范数的样本，和像这样的出现在同一小批量的样本，其对最终方向的贡献将消失。\n不像传统小批量梯度下降，其中真实梯度的方向是等于所有小批量梯度的平均。\n换句话说，传统的随机梯度下降使用梯度的无偏估计，而与使用范数截断的梯度下降引入了经验上是有用的启发式偏置。\n通过逐元素截断，更新的方向与真实梯度或小批量的梯度不再对齐，但是它仍然是一个下降方向。\n还有学者提出{cite?}（相对于隐藏单元）截断反向传播梯度，但没有公布与这些变种之间的比较; 我们推测，所有这些方法表现类似。\n\n<!-- % -- 403 -- -->\n\n\n## 引导信息流的正则化\n\n梯度截断有助于处理爆炸的梯度，但它无助于消失的梯度。\n为了解决消失的梯度问题并更好地捕获长期依赖，我们讨论了如下想法：在展开循环架构的计算图中，沿着与弧边相关联的梯度乘积接近1的部分创建路径。\n在\\sec?中已经讨论过，实现这一点的一种方法是使用~LSTM~以及其他自循环和门控机制。\n另一个想法是正则化或约束参数，以引导\"信息流\"。\n特别是即使损失函数只对序列尾部的输出作惩罚，我们也希望梯度向量$\\nabla_{\\Vh^{(t)}} L$在反向传播时能维持其幅度。\n形式上，我们要使\n\\begin{align}\n (\\nabla_{\\Vh^{(t)}} L) \\frac{\\partial \\Vh^{(t)}}{\\partial \\Vh^{(t-1)}}\n\\end{align}\n与\n\\begin{align}\n\\nabla_{\\Vh^{(t)}} L \n\\end{align}\n一样大。\n在这个目标下，{Pascanu+al-ICML2013-small}提出以下正则项：\n\\begin{align}\n \\Omega = \\sum_t \\Bigg(  \\frac{\n \\norm{ (\\nabla_{\\Vh^{(t)}} L) \\frac{\\partial \\Vh^{(t)}}{\\partial \\Vh^{(t-1)}}}}\n {\\norm{\\nabla_{\\Vh^{(t)}} L}} -1 \\Bigg)^2.\n\\end{align}\n计算这一梯度的正则项可能会出现困难，但~{Pascanu+al-ICML2013-small}提出可以将后向传播向量$\\nabla_{\\Vh^{(t)}} L$考虑为恒值作为近似（为了计算正则化的目的，没有必要通过它们向后传播）。\n使用该正则项的实验表明，如果与标准的启发式截断（处理梯度爆炸）相结合，该正则项可以显著地增加~RNN~可以学习的依赖跨度。\n梯度截断特别重要，因为它保持了爆炸梯度边缘的~RNN~动态。\n如果没有梯度截断，梯度爆炸将阻碍学习的成功。\n\n这种方法的一个主要弱点是，在处理数据冗余的任务时如语言模型，它并不像~LSTM~一样有效。\n\n<!-- % -- 404 -- -->\n\n\n# 外显记忆\n\n智能需要知识并且可以通过学习获取知识，这已促使大型深度架构的发展。\n然而，知识是不同的并且种类繁多。\n有些知识是隐含的、潜意识的并且难以用语言表达——比如怎么行走或狗与猫的样子有什么不同。\n其他知识可以是明确的、可陈述的以及可以相对简单地使用词语表达——每天常识性的知识，如\"猫是一种动物\"，或者为实现自己当前目标所需知道的非常具体的事实，如\"与销售团队会议在141室于下午3:00开始\"。\n\n\n神经网络擅长存储隐性知识，但是他们很难记住事实。\n被存储在神经网络参数中之前，随机梯度下降需要多次提供相同的输入，即使如此，该输入也不会被特别精确地存储。\n{Graves-et-al-arxiv2014}推测这是因为神经网络缺乏\\textbf{工作存储}(working memory)系统，即类似人类为实现一些目标而明确保存和操作相关信息片段的系统。\n这种外显记忆组件将使我们的系统不仅能够快速\"故意\"地存储和检索具体的事实，也能利用他们循序推论。\n神经网络处理序列信息的需要，改变了每个步骤向网络注入输入的方式，长期以来推理能力被认为是重要的，而不是对输入做出自动的、直观的反应{cite?} 。\n\n\n为了解决这一难题，{Weston2014}引入了记忆网络，其中包括一组可以通过寻址机制来访问的记忆单元。\n记忆网络原本需要监督信号指示他们如何使用自己的记忆单元。\n{Graves-et-al-arxiv2014}引入的神经网络图灵机，不需要明确的监督指示采取哪些行动而能学习从记忆单元读写任意内容，并通过使用基于内容的软注意机制（~见{Bahdanau-et-al-ICLR2015-small}和\\sec?），允许端到端的训练。\n这种软寻址机制已成为其他允许基于梯度优化的模拟算法机制的相关架构的标准{cite?}。\n\n每个记忆单元可以被认为是~LSTM~和GRU中记忆单元的扩展。\n不同的是，网络输出一个内部状态来选择从哪个单元读取或写入，正如数字计算机读取或写入到特定地址的内存访问。\n\n<!-- % -- 405 -- -->\n\n产生确切整数地址的函数很难优化。\n为了缓解这一问题，NTM~实际同时从多个记忆单元写入或读取。\n读取时，它们采取许多单元的加权平均值。\n写入时，他们对多个单元修改不同的数值。\n用于这些操作的系数被选择为集中在一个小数目的单元，如通过~softmax~函数产生它们。\n使用这些具有非零导数的权重允许函数控制访问存储器，从而能使用梯度下降法优化。\n关于这些系数的梯度指示着其中每个参数是应该增加还是减少，但梯度通常只在接收大系数的存储器地址上变大。\n\n这些记忆单元通常扩充为包含向量，而不是由~LSTM~或GRU存储单元所存储的单个标量。\n增加记忆单元大小的原因有两个。\n原因之一是，我们已经增加了访问记忆单元的成本。\n我们为产生用于许多单元的系数付出计算成本，但我们预期这些系数聚集在周围小数目的单元。\n通过读取向量值，而不是一个标量，我们可以抵消部分成本。 \n使用向量值的记忆单元的另一个原因是，它们允许\\textbf{基于内容的寻址}(content-based addressing)，其中从一个单元读或写的权重是该单元的函数。\n如果我们能够生产符合某些但并非所有元素的模式，向量值单元允许我们检索一个完整向量值的记忆。\n这类似于人们能够通过几个歌词回忆起一首歌曲的方式。\n我们可以认为基于内容的读取指令是说，\"检索一首副歌歌词中带有'我们都住在黄色潜水艇'的歌\"。\n当我们要检索的对象很大时，基于内容的寻址更为有用——如果歌曲的每一个字母被存储在单独的记忆单元中，我们将无法通过这种方式找到他们。\n通过比较，\\textbf{基于位置的寻址}(location-based addressing)不允许引用存储器的内容。\n我们可以认为基于位置的读取指令是说\"检索347档的歌的歌词\"。\n即使当存储单元很小时，基于位置的寻址通常也是完全合理的机制。\n\n如果一个存储单元的内容在大多数时间步上会被复制（不被忘记），则它包含的信息可以在时间上向前传播，随时间向后传播的梯度也不会消失或爆炸。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter10/figures/memory_network}}\n\\fi\n\\caption{具有外显记忆网络的示意图，具备神经网络图灵机的一些关键设计元素。\n在此图中，我们将模型的\"表示\"部分（\"任务网络\"，这里是底部的循环网络）与存储事实的模型（记忆单元的集合）的\"存储器\"部分区分开。\n任务网络学习\"控制\"存储器，决定从哪读取以及在哪写入（通过读取和写入机制，由指向读取和写入地址的粗箭头指示）。\n}\n\\end{figure}\n\n外显记忆的方法在\\fig?说明，其中我们可以看到与存储器耦接的\"任务神经网络\"。\n虽然这一任务神经网络可以是前馈或循环的，但整个系统是一个循环网络。\n任务网络可以选择读取或写入的特定内存地址。\n外显记忆似乎允许模型学习普通~RNN~或~LSTM RNN~不能学习的任务。\n这种优点的一个原因可能是因为信息和梯度可以在非常长的持续时间内传播（分别在时间上向前或向后）。\n\n<!-- % -- 406 -- -->\n\n作为存储器单元的加权平均值反向传播的替代，我们可以将存储器寻址系数解释为概率，并随机从一个单元读取{cite?}。\n优化离散决策的模型需要专门的优化算法，这将在\\sec?中描述。\n目前为止，训练这些做离散决策的随机架构，仍比训练进行软判决的确定性算法更难。\n\n无论是软（允许反向传播）或随机硬性的，用于选择一个地址的机制与先前在机器翻译的背景下引入的注意力机制形式相同{cite?}，这在\\sec?中也有讨论。\n甚至更早之前，注意力机制的想法就被引入了神经网络，在手写生成的情况下{cite?}，有一个被约束为通过序列只向前移动的注意力机制。\n在机器翻译和记忆网络的情况下，每个步骤中关注的焦点可以移动到一个完全不同的地方(相比之前的步骤)。\n\n循环神经网络提供了将深度学习扩展到序列数据的一种方法。\n它们是我们的深度学习工具箱中最后一个主要的工具。\n现在我们的讨论将转移到如何选择和使用这些工具，以及如何在真实世界的任务中应用这些工具。\n\n"
  },
  {
    "path": "docs/_posts/2016-12-11-Chapter11_practical_methodology.md",
    "content": "---\ntitle: 实践方法论\nlayout: post\nshare: false\n---\n要成功地使用深度学习技术，仅仅知道存在哪些算法和解释他们为何有效的原理是不够的。\n一个优秀的机器学习实践者还需要知道如何针对具体应用挑选一个合适的算法以及如何监控，并根据实验反馈改进机器学习系统。\n在机器学习系统的日常开发中，实践者需要决定是否收集更多的数据、增加或减少模型容量、添加或删除正则化项、改进模型的优化、改进模型的近似推断或调试模型的软件实现。\n尝试这些操作都需要大量时间，因此确定正确做法，而不盲目猜测尤为重要的。\n\n\n本书的大部分内容都是关于不同的机器学习模型、训练算法和目标函数。\n这可能给人一种印象——成为机器学习专家的最重要因素是了解各种各样的机器学习技术，并熟悉各种不同的数学。\n在实践中，正确使用一个普通算法通常比草率地使用一个不清楚的算法效果更好。\n正确应用一个算法需要掌握一些相当简单的方法论。\n本章的许多建议都来自~{ng-lecture-advice}。\n\n\n我们建议参考以下几个实践设计流程：\n\n+ 确定目标——使用什么样的误差度量，并为此误差度量指定目标值。\n这些目标和误差度量取决于该应用旨在解决的问题。\n<!-- % -- 409 end -->\n\n\n+ 尽快建立一个端到端的工作流程，包括估计合适的性能度量。\n<!-- % 410 head -->\n\n+ 搭建系统，并确定性能瓶颈。\n检查哪个部分的性能差于预期，以及是否是因为过拟合、欠拟合，或者数据或软件缺陷造成的。\n\n+ 根据具体观察反复地进行增量式的改动，如收集新数据、调整超参数或改进算法。\n\n\n\n我们将使用街景地址号码转录系统~{cite?}作为一个运行示例。\n该应用的目标是将建筑物添加到谷歌地图。\n街景车拍摄建筑物，并记录与每张建筑照片相关的GPS坐标。\n卷积网络识别每张照片上的地址号码，由谷歌地图数据库在正确的位置添加该地址。\n这个商业应用是一个很好的示例，它的开发流程遵循我们倡导的设计方法。\n\n<!-- % 410 mid -->\n我们现在描述这个过程中的每一个步骤。\n\n\n\n\n# 性能度量\n\n确定目标，即使用什么误差度量，是必要的第一步，因为误差度量将指导接下来的所有工作。\n同时我们也应该了解大概能得到什么级别的目标性能。\n<!-- % 410 mid -->\n\n\n值得注意的是对于大多数应用而言，不可能实现绝对零误差。\n即使你有无限的训练数据，并且恢复了真正的概率分布，贝叶斯误差仍定义了能达到的最小错误率。\n这是因为输入特征可能无法包含输出变量的完整信息，或是因为系统可能本质上是随机的。\n当然我们还会受限于有限的训练数据。\n\n<!-- % 410 end -->\n训练数据的数量会因为各种原因受到限制。\n当目标是打造现实世界中最好的产品或服务时，我们通常需要收集更多的数据，但必须确定进一步减少误差的价值，并与收集更多数据的成本做权衡。\n数据收集会耗费时间、金钱，或带来人体痛苦（例如，收集人体医疗测试数据）。\n科研中，目标通常是在某个确定基准下探讨哪个算法更好，一般会固定训练集，不允许收集更多的数据。\n<!-- % 411 head -->\n\n\n如何确定合理的性能期望？\n在学术界，通常我们可以根据先前公布的基准结果来估计预期错误率。\n在现实世界中，一个应用的错误率有必要是安全的、具有成本效益的或吸引消费者的。\n一旦你确定了想要达到的错误率，那么你的设计将由如何达到这个错误率来指导。\n<!-- % 411 mid -->\n\n\n除了需要考虑性能度量之外，另一个需要考虑的是度量的选择。\n我们有几种不同的性能度量，可以用来度量一个含有机器学习组件的完整应用的有效性。\n这些性能度量通常不同于训练模型的代价函数。 \n如\\sec?所述，我们通常会度量一个系统的准确率，或等价地，错误率。\n\n\n然而，许多应用需要更高级的度量。\n<!-- % 411 mid -->\n\n有时，一种错误可能会比另一种错误更严重。\n例如，垃圾邮件检测系统会有两种错误：将正常邮件错误地归为垃圾邮件，将垃圾邮件错误地归为正常邮件。\n阻止正常消息比允许可疑消息通过糟糕得多。\n我们希望度量某种形式的总代价，其中拦截正常邮件比允许垃圾邮件通过的代价更高，而不是度量垃圾邮件分类的错误率。\n<!-- % 411 mid -->\n\n\n有时，我们需要训练检测某些罕见事件的二元分类器。\n例如，我们可能会为一种罕见疾病设计医疗测试。\n假设每一百万人中只有一人患病。\n我们只需要让分类器一直报告没有患者，就能轻易地在检测任务上实现$99.9999\\%$的正确率。\n显然，正确率很难描述这种系统的性能。\n解决这个问题的方法是度量精度和召回率。\n精度是模型报告的检测是正确的比率，而召回率则是真实事件被检测到的比率。\n检测器永远报告没有患者，会得到一个完美的精度，但召回率为零。\n而报告每个人都是患者的检测器会得到一个完美的召回率，但是精度会等于人群中患有该病的比例（在我们的例子是$0.0001\\%$，每一百万人只有一人患病）。\n当使用精度和召回率时，我们通常会画PR曲线，$y$轴表示精度，$x$轴表示召回率。\n如果检测到的事件发生了，那么分类器会返回一个较高的得分。\n例如，我们将前馈网络设计为检测一种疾病，估计一个医疗结果由特征$\\Vx$表示的人患病的概率为$\\hat{y} = P(y=1\\mid\\Vx)$。\n每当这个得分超过某个阈值时，我们报告检测结果。\n通过调整阈值，我们能权衡精度和召回率。\n在很多情况下，我们希望用一个数而不是曲线来概括分类器的性能。\n要做到这一点，我们可以将精度 $p$和召回率 $r$转换为F分数\n\\begin{equation}\n\tF = \\frac{2pr}{p+r}.\n\\end{equation}\n另一种方法是报告\\,PR曲线下方的总面积。\n<!-- % -- 412 head -->\n\n\n在一些应用中，机器学习系统可能会拒绝做出判断。\n如果机器学习算法能够估计所作判断的置信度，这将会非常有用，特别是在错误判断会导致严重危害，而人工操作员能够偶尔接管的情况下。\n街景转录系统可以作为这种情况的一个示例。\n这个任务是识别照片上的地址号码，将照片拍摄地点对应到地图上的地址。%??  翻译的很有问题\n如果地图是不精确的，那么地图的价值会严重下降。\n因此只在转录正确的情况下添加地址十分重要。\n如果机器学习系统认为它不太能像人一样正确地转录，那么最好办法当然是让人来转录照片。\n当然，只有当机器学习系统能够大量降低需要人工操作处理的图片时，它才是有用的。\n在这种情况下，一种自然的性能度量是覆盖。\n覆盖是机器学习系统能够产生响应的样本所占的比率。\n我们权衡覆盖和精度。\n一个系统可以通过拒绝处理任意样本的方式来达到$100\\%$的精度，但是覆盖降到了$0\\%$。\n对于街景任务，该项目的目标是达到人类级别的转录精度，同时保持$95\\%$的覆盖。\n在这项任务中，人类级别的性能是$98\\%$的精度。\n<!-- % 412 end -->\n\n还有许多其他的性能度量。\n例如，我们可以度量点击率、收集用户满意度调查等等。\n许多专业的应用领域也有特定的标准。\n<!-- % 412 end -->\n\n最重要的是首先要确定改进哪个性能度量，然后专心提高性能度量。\n如果没有明确的目标，那么我们很难判断机器学习系统上的改动是否有所改进。\n\n<!-- % -- 412 end -->\n\n\n# 默认的基准模型\n\n确定性能度量和目标后，任何实际应用的下一步是尽快建立一个合理的端到端的系统。\n本节给出了一些关于在不同情况下使用哪种算法作为第一个基准方法推荐。\n在本节中，我们提供了关于不同情况下使用哪种算法作为第一基准方法的推荐。\n值得注意的是，深度学习研究进展迅速，所以本书出版后很快可能会有更好的默认算法。\n<!-- % 413 head  -->\n\n根据问题的复杂性，项目开始时可能无需使用深度学习。\n如果只需正确地选择几个线性权重就可能解决问题，那么项目可以开始于一个简单的统计模型，如逻辑回归。\n\n\n如果问题属于\"AI-完全\"类的，如对象识别、语音识别、机器翻译等等，那么项目开始于一个合适的深度学习模型，效果会比较好。\n<!-- % 413 mid  -->\n\n\n首先，根据数据的结构选择一类合适的模型。\n如果项目是以固定大小的向量作为输入的监督学习，那么可以使用全连接的前馈网络。\n如果输入有已知的拓扑结构（例如，输入是图像），那么可以使用卷积网络。\n在这些情况下，刚开始可以使用某些分段线性单元（ReLU\\,或者其扩展，如\\,Leaky ReLU、PReLU\\,和\\,maxout）。\n如果输入或输出是一个序列，可以使用门控循环网络（LSTM\\,或\\,GRU）。\n<!-- % 413 mid  -->\n\n具有衰减学习率以及动量的\\,SGD\\,是优化算法一个合理的选择\n（流行的衰减方法有，衰减到固定最低学习率的线性衰减、指数衰减，或每次发生验证错误停滞时将学习率降低$2-10$倍，这些衰减方法在不同问题上好坏不一）。\n另一个非常合理的选择是Adam算法。\n批标准化对优化性能有着显著的影响，特别是对卷积网络和具有~sigmoid~非线性函数的网络而言。\n虽然在最初的基准中忽略批标准化是合理的，然而当优化似乎出现问题时，应该立刻使用批标准化。\n<!-- % 413 mid  -->\n\n\n除非训练集包含数千万以及更多的样本，否则项目应该在一开始就包含一些温和的正则化。 \n提前终止也被普遍采用。\nDropout~也是一个很容易实现，且兼容很多模型和训练算法的出色正则化项。\n批标准化有时也能降低泛化误差，此时可以省略~Dropout~步骤，因为用于标准化变量的统计量估计本身就存在噪声。 %?? 还是有问题\n<!-- % -- 413 --  end -->\n\n\n如果我们的任务和另一个被广泛研究的任务相似，那么通过复制先前研究中已知性能良好的模型和算法，可能会得到很好的效果。\n甚至可以从该任务中复制一个训练好的模型。\n例如，通常会使用在ImageNet上训练好的卷积网络的特征来解决其他计算机视觉任务{cite?}。\n<!-- % 414 head -->\n\n\n一个常见问题是项目开始时是否使用无监督学习，我们将在第三部分进一步探讨这个问题。\n 这个问题和特定领域有关。\n在某些领域，比如自然语言处理，能够大大受益于无监督学习技术，如学习无监督词嵌入。\n在其他领域，如计算机视觉，除非是在半监督的设定下（标注样本数量很少）{cite?}，目前无监督学习并没有带来益处。\n如果应用所在环境中，无监督学习被认为是很重要的，那么将其包含在第一个端到端的基准中。\n否则，只有在解决无监督问题时，才会第一次尝试时使用无监督学习。\n在发现初始基准过拟合的时候，我们可以尝试加入无监督学习。\n<!-- % 414 mid -->\n\n\n\n# 决定是否收集更多数据\n\n\n在建立第一个端到端的系统后，就可以度量算法性能并决定如何改进算法。\n许多机器学习新手都忍不住尝试很多不同的算法来进行改进。\n然而，收集更多的数据往往比改进学习算法要有用得多。\n<!-- % 414 mid -->\n\n\n怎样判断是否要收集更多的数据？\n首先，确定训练集上的性能是否可接受。\n如果模型在训练集上的性能就很差，学习算法都不能在训练集上学习出良好的模型，那么就没必要收集更多的数据。\n反之，可以尝试增加更多的网络层或每层增加更多的隐藏单元，以增加模型的规模。\n此外，也可以尝试调整学习率等超参数的措施来改进学习算法。\n如果更大的模型和仔细调试的优化算法效果不佳，那么问题可能源自训练数据的\\emph{质量}。\n数据可能含太多噪声，或是可能不包含预测输出所需的正确输入。\n这意味着我们需要重新开始，收集更干净的数据或是收集特征更丰富的数据集。\n<!-- % -- 414 end -->\n\n\n如果训练集上的性能是可接受的，那么我们开始度量测试集上的性能。\n如果测试集上的性能也是可以接受的，那么就顺利完成了。\n如果测试集上的性能比训练集的要差得多，那么收集更多的数据是最有效的解决方案之一。\n这时主要的考虑是收集更多数据的代价和可行性，其他方法降低测试误差的代价和可行性，和增加数据数量能否显著提升测试集性能。\n在拥有百万甚至上亿用户的大型网络公司，收集大型数据集是可行的，并且这样做的成本可能比其他方法要少很多，所以答案几乎总是收集更多的训练数据。\n例如，收集大型标注数据集是解决对象识别问题的主要因素之一。\n在其他情况下，如医疗应用，收集更多的数据可能代价很高或者不可行。\n一个可以替代的简单方法是降低模型大小或是改进正则化（调整超参数，如权重衰减系数，或是加入正则化策略，如\\,Dropout）。\n如果调整正则化超参数后，训练集性能和测试集性能之间的差距还是不可接受，那么收集更多的数据是可取的。\n<!-- % 415 mid -->\n\n\n在决定是否收集更多的数据时，也需要确定收集多少数据。\n如\\fig?所示，绘制曲线显示训练集规模和泛化误差之间的关系是很有帮助的。\n根据走势延伸曲线，可以预测还需要多少训练数据来达到一定的性能。\n通常，加入总数目一小部分的样本不会对泛化误差产生显著的影响。\n因此，建议在对数尺度上考虑训练集的大小，例如在后续的实验中倍增样本数目。\n<!-- % 415 mid -->\n\n\n如果收集更多的数据是不可行的，那么改进泛化误差的唯一方法是改进学习算法本身。\n这属于研究领域，并非对应用实践者的建议。\n\n\n# 选择超参数\n\n大部分深度学习算法都有许多超参数来控制不同方面的算法表现。\n有些超参数会影响算法运行的时间和存储成本。\n有些超参数会影响学习到的模型质量，以及在新输入上推断正确结果的能力。\n<!-- % -- 415 -end -->\n\n\n有两种选择超参数的基本方法：手动选择和自动选择。\n手动选择超参数需要了解超参数做了些什么，以及机器学习模型如何才能取得良好的泛化。\n自动选择超参数算法大大减少了解这些想法的需要，但它们往往需要更高的计算成本。\n<!-- % 416 head -->\n\n\n\n## 手动调整超参数\n\n手动设置超参数，我们必须了解超参数、训练误差、泛化误差和计算资源（内存和运行时间）之间的关系。\n这需要切实了解一个学习算法有效容量的基础概念，如\\chap?所描述的。\n<!-- % 416 mid -->\n\n\n手动搜索超参数的目标通常是最小化受限于运行时间和内存预算的泛化误差。\n我们不去探讨如何确定各种超参数对运行时间和内存的影响，因为这高度依赖于平台。\n\n\n手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性。\n有效容量受限于三个因素：模型的表示容量、学习算法成功最小化训练模型代价函数的能力以及代价函数和训练过程正则化模型的程度。\n具有更多网络层，每层有更多隐藏单元的模型具有较高的表示能力——能够表示更复杂的函数。\n然而，如果训练算法不能找到某个合适的函数来最小化训练代价，或是正则化项（如权重衰减）排除了这些合适的函数，那么即使模型的表达能力较高，也不能学习出合适的函数。%??  还是太乱\n\n<!-- % 416 mid -->\n\n\n当泛化误差以某个超参数为变量，作为函数绘制出来时，通常会表现为U形曲线，如\\fig?所示。\n在某个极端情况下，超参数对应着低容量，并且泛化误差由于训练误差较大而很高。\n这便是欠拟合的情况。\n另一种极端情况，超参数对应着高容量，并且泛化误差由于训练误差和测试误差之间的差距较大而很高。\n最优的模型容量位于曲线中间的某个位置，能够达到最低可能的泛化误差，由某个中等的泛化误差和某个中等的训练误差相加构成。\n<!-- % -- 416 end -->\n\n\n\n对于某些超参数，当超参数数值太大时，会发生过拟合。\n例如中间层隐藏单元的数量，增加数量能提高模型的容量，容易发生过拟合。%??  原文不符 \n对于某些超参数，当超参数数值太小时，也会发生过拟合。\n例如，最小的权重衰减系数允许为零，此时学习算法具有最大的有效容量，反而容易过拟合。%??  原文不符   这一段好像偏差较大 \n<!-- % 417 head -->\n\n\n并非每个超参数都能对应着完整的U形曲线。\n很多超参数是离散的，如中间层单元数目或是~maxout单元中线性元件的数目，这种情况只能沿曲线探索一些点。\n有些超参数是二值的。\n通常这些超参数用来指定是否使用学习算法中的一些可选部分，如预处理步骤减去均值并除以标准差来标准化输入特征。\n这些超参数只能探索曲线上的两点。\n其他一些超参数可能会有最小值或最大值，限制其探索曲线的某些部分。%??    \n例如，权重衰减系数最小是零。\n这意味着，如果权重衰减系数为零时模型欠拟合，那么我们将无法通过修改权重衰减系数探索过拟合区域。\n换言之，有些超参数只能减少模型容量。\n<!-- % 417 mid -->\n\n\n学习率可能是最重要的超参数。\n如果你只有时间调整一个超参数，那就调整学习率。\n相比其他超参数，它以一种更复杂的方式控制模型的有效容量——当学习率适合优化问题时，模型的有效容量最高，此时学习率是\\emph{正确}的，既不是特别大也不是特别小。\n学习率关于\\emph{训练误差}具有U形曲线，如\\fig?所示。\n当学习率过大时，梯度下降可能会不经意地增加而非减少训练误差。\n在理想化的二次情况下，如果学习率是最佳值的两倍大时，会发生这种情况{cite?}。\n当学习率太小，训练不仅慢，还有可能永久停留在一个很高的训练误差。\n关于这种效应，我们知之甚少（不会发生于一个凸损失函数中）。\n<!-- % 417 end -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter11/figures/lr_color}}\n\\fi\n\\caption{训练误差和学习率之间的典型关系。\n注意当学习率大于最优值时误差会有显著的提升。\n此图针对固定的训练时间，越小的学习率有时候可以以一个正比于学习率减小量的因素来减慢训练过程。\n泛化误差也会得到类似的曲线，由于正则项作用在学习率过大或过小处比较复杂。\n由于一个糟糕的优化从某种程度上说可以避免过拟合，即使是训练误差相同的点也会拥有完全不同的泛化误差。}\n\\end{figure}\n\n<!-- % 417 end -->\n调整学习率外的其他参数时，需要同时监测训练误差和测试误差，以判断模型是否过拟合或欠拟合，然后适当调整其容量。\n\n\n如果训练集错误率大于目标错误率，那么只能增加模型容量以改进模型。\n如果没有使用正则化，并且确信优化算法正确运行，那么有必要添加更多的网络层或隐藏单元。\n然而，令人遗憾的是，这增加了模型的计算代价。\n<!-- % 418 head -->\n\n\n如果测试集错误率大于目标错误率，那么可以采取两个方法。\n测试误差是训练误差和测试误差之间差距与训练误差的总和。\n寻找最佳的测试误差需要权衡这些数值。\n当训练误差较小（因此容量较大），测试误差主要取决于训练误差和测试误差之间的差距时，通常神经网络效果最好。\n此时目标是缩小这一差距，使训练误差的增长速率不快于差距减小的速率。\n要减少这个差距，我们可以改变正则化超参数，以减少有效的模型容量，如添加~Dropout~或权重衰减策略。\n通常，最佳性能来自正则化得很好的大规模模型，比如使用~Dropout~的神经网络。\n<!-- % 418 mid -->\n\n\n大部分超参数可以通过推理其是否增加或减少模型容量来设置。\n部分示例如表\\?所示。\n\n\n<!-- % 418 end -->\n手动调整超参数时，不要忘记最终目标：提升测试集性能。\n加入正则化只是实现这个目标的一种方法。\n只要训练误差低，随时都可以通过收集更多的训练数据来减少泛化误差。\n实践中能够确保学习有效的暴力方法就是不断提高模型容量和训练集的大小，直到解决问题。\n这种做法增加了训练和推断的计算代价，所以只有在拥有足够资源时才是可行的。\n原则上，这种做法可能会因为优化难度提高而失败，但对于许多问题而言，优化似乎并没有成为一个显著的障碍，当然，前提是选择了合适的模型。\n<!-- % 419 end -->\n\n\n<!-- % -- 419 -->\n\\begin{table}\n\\centering\n\\small\n\\begin{tabular}{p{2.5cm}|p{1.5cm}|p{4.0cm}|p{4.0cm}}\n超参数 & 容量何时增加 & 原因  & 注意事项 \\\\\n\\hline\n隐藏单元数量 &  增加          & 增加隐藏单元数量会增加模型的表示能力。 & 几乎模型每个操作所需的时间和内存代价都会随隐藏单元数量的增加而增加。\\\\\n\\hline\n学习率 & 调至最优 & 不正确的学习速率，不管是太高还是太低都会由于优化失败而导致低有效容量的模型。\n & \\\\\n\\hline\n卷积核宽度 & 增加 & 增加卷积核宽度会增加模型的参数数量。&\n较宽的卷积核导致较窄的输出尺寸，除非使用隐式零填充减少此影响，否则会降低模型容量。 \n较宽的卷积核需要更多的内存存储参数，并会增加运行时间，但较窄的输出会降低内存代价。\n\\\\\n\\hline\n隐式零填充 & 增加 & 在卷积之前隐式添加零能保持较大尺寸的表示。&\n大多数操作的时间和内存代价会增加。\\\\\n\\hline\n权重衰减系数 & 降低 & 降低权重衰减系数使得模型参数可以自由地变大。\n & \\\\\n\\hline\nDropout\\,比率 & 降低 & 较少地丢弃单元可以更多地让单元彼此\"协力\"来适应训练集。\n & \\\\\n\\end{tabular}\n\\caption{各种超参数对模型容量的影响。}\n\\index{Dropout}\n\\index{Weight decay}\n\\end{table}\n<!-- % -- 419 -->\n\n\n\n\n\n## 自动超参数优化算法\n\n理想的学习算法应该是只需要输入一个数据集，就可以输出学习的函数，而不需要手动调整超参数。\n一些流行的学习算法，如逻辑回归和支持向量机，流行的部分原因是这类算法只有一到两个超参数需要调整，它们也能表现出不错的性能。\n有些情况下，所需调整的超参数数量较少时，神经网络可以表现出不错的性能；但超参数数量有几十甚至更多时，效果会提升得更加明显。\n当使用者有一个很好的初始值，例如由在相同类型的应用和架构上具有经验的人确定初始值，或者使用者在相似问题上具有几个月甚至几年的神经网络超参数调整经验，那么手动调整超参数能有很好的效果。%??  由在相同类型的应用和架构上具有经验的人确定初始  这句话好像不对吧？ --没觉得有问题，你觉得是什么了\n然而，对于很多应用而言，这些起点都不可用。\n在这些情况下，自动算法可以找到合适的超参数。\n<!-- % 420 head -->\n\n\n如果我们仔细想想使用者搜索学习算法合适超参数的方式，我们会意识到这其实是一种优化：\n我们在试图寻找超参数来优化目标函数，例如验证误差，有时还会有一些约束（如训练时间，内存或识别时间的预算）。\n因此，原则上有可能开发出封装学习算法的超参数优化算法，并选择其超参数，从而使用者不需要指定学习算法的超参数。\n令人遗憾的是，超参数优化算法往往有自己的超参数，如学习算法的每个超参数应该被探索的值的范围。\n然而，这些次级超参数通常很容易选择，这是说，相同的次级超参数能够很多不同的问题上具有良好的性能。\n<!-- % 420 mid -->\n\n\n\n## 网格搜索\n\n当有三个或更少的超参数时，常见的超参数搜索方法是网格搜索。\n对于每个超参数，使用者选择一个较小的有限值集去探索。\n然后，这些超参数笛卡尔乘积得到一组组超参数，网格搜索使用每组超参数训练模型。\n挑选验证集误差最小的超参数作为最好的超参数。\n如\\fig?所示超参数值的网络。\n<!-- % -- 420 end -->\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{cc}\n\\includegraphics[width=0.35\\textwidth]{Chapter11/figures/grid} &\n\\includegraphics[width=0.35\\textwidth]{Chapter11/figures/random}\n\\end{tabular}\n\\fi\n\\caption{网格搜索和随机搜索的比较。\n为了方便地说明，我们只展示两个超参数的例子，但是我们关注的问题中超参数个数通常会更多。\n\\emph{(左)}为了实现网格搜索，我们为每个超参数提供了一个值的集合。\n搜索算法对每一种在这些集合的交叉积中的超参数组合进行训练。\n\\emph{(右)}为了实现随机搜索，我们给联合超参数赋予了一个概率分布。\n通常超参数之间是相互独立的。\n常见的这种分布的选择是均匀分布或者是对数均匀（从对数均匀分布中抽样，就是对从均匀分布中抽取的样本进行指数运算）的。\n然后这些搜索算法从联合的超参数空间中采样，然后运行每一个样本。\n网格搜索和随机搜索都运行了验证集上的误差并返回了最优的解。\n这个图说明了通常只有一个超参数对结果有着重要的影响。\n在这个例子中，只有水平轴上的超参数对结果有重要的作用。\n网格搜索将大量的计算浪费在了指数量级的对结果无影响的超参数中，相比之下随机搜索几乎每次测试都测试了对结果有影响的每个超参数的独一无二的值。\n此图经~{Bergstra+Bengio-LW2011}允许转载。}\n\\end{figure}\n\n\n应该如何选择搜索集合的范围呢？\n在超参数是数值（有序）的情况下，每个列表的最小和最大的元素可以基于先前相似实验的经验保守地挑选出来，以确保最优解非常可能在所选范围内。\n通常，网格搜索大约会在对数尺度下挑选合适的值，例如，一个学习率的取值集合是$\\{0.1,0.01,10^{-3},10^{-4},10^{-5}\\}$，或者隐藏单元数目的取值集合$\\{50,100,200,500,1000,2000\\}$。\n<!-- % 421 head -->\n\n\n通常重复进行网格搜索时，效果会最好。\n例如，假设我们在集合$\\{-1,0,1\\}$上网格搜索超参数 $\\alpha$。\n如果找到的最佳值是$1$，那么说明我们低估了最优值$\\alpha$所在的范围，应该改变搜索格点，例如在集合$\\{1,2,3\\}$中搜索。\n如果最佳值是$0$，那么我们不妨通过细化搜索范围以改进估计，在集合$\\{-0.1,0,0.1\\}$上进行网格搜索。\n<!-- % -- 422 head -->\n\n\n网格搜索带来的一个明显问题是，计算代价会随着超参数数量呈指数级增长。\n如果有$m$个超参数，每个最多取$n$个值，那么训练和估计所需的试验数将是$O(n^m)$。\n我们可以并行地进行实验，并且并行要求十分宽松（进行不同搜索的机器之间几乎没有必要进行通信）。\n令人遗憾的是，由于网格搜索指数级增长计算代价，即使是并行，我们也无法提供令人满意的搜索规模。\n\n\n\n## 随机搜索\n\n幸运的是，有一个替代网格搜索的方法，并且编程简单，使用更方便，能更快地收敛到超参数的良好取值：随机搜索~{cite?}。\n<!-- % 422 -->\n\n\n随机搜索过程如下。\n首先，我们为每个超参数定义一个边缘分布，例如，Bernoulli分布或范畴分布（分别对应着二元超参数或离散超参数），或者对数尺度上的均匀分布（对应着正实值超参数）。\n例如，\n\\begin{align}\n\t\\texttt{log\\_learning\\_rate} &\\sim u(-1, -5), \\\\\n\t\\texttt{learning\\_rate} &= 10^{\\texttt{log\\_learning\\_rate}},\n\\end{align}\n其中，$u(a,b)$表示区间$(a,b)$上均匀采样的样本。\n类似地，$\\texttt{log\\_number\\_of\\_hidden\\_units}$可以从$u(\\log(50), \\log(2000))$上采样。\n<!-- % 422 mid -->\n\n\n与网格搜索不同，我们\\emph{不需要离散化}超参数的值。这允许我们在一个更大的集合上进行搜索，而不产生额外的计算代价。%?? bin 不知道如何翻译bin，你有什么好的翻译没 \n实际上，如\\fig?所示，当有几个超参数对性能度量没有显著影响时，随机搜索相比于网格搜索指数级地高效。\n{Bergstra+Bengio-2012-small}进行了详细的研究并发现相比于网格搜索， 随机搜索能够更快地减小验证集误差（就每个模型运行的试验数而言）。\n<!-- % 422 end -->\n\n与网格搜索一样，我们通常会重复运行不同版本的随机搜索，以基于前一次运行的结果改进下一次搜索。\n<!-- % 422 end -->\n\n\n随机搜索能比网格搜索更快地找到良好超参数的原因是，没有浪费的实验，不像网格搜索有时会对一个超参数的两个不同值（给定其他超参数值不变）给出相同结果。\n在网格搜索中，其他超参数将在这两次实验中拥有相同的值，而在随机搜索中，它们通常会具有不同的值。\n因此，如果这两个值的变化所对应的验证集误差没有明显区别的话，网格搜索没有必要重复两个等价的实验，而随机搜索仍然会对其他超参数进行两次独立地探索。\n\n<!-- % 423 head -->\n\n\n## 基于模型的超参数优化\n\n超参数搜索问题可以转化为一个优化问题。\n决策变量是超参数。\n优化的代价是超参数训练出来的模型在验证集上的误差。\n在简化的设定下，可以计算验证集上可导误差函数关于超参数的梯度，然后我们遵循这个梯度更新{cite?}。\n令人遗憾的是，在大多数实际设定中，这个梯度是不可用的。\n这可能是因为其高额的计算代价和存储成本，也可能是因为验证集误差在超参数上本质上不可导，例如超参数是离散值的情况。\n<!-- % 423 mid -->\n\n\n为了弥补梯度的缺失，我们可以对验证集误差建模，然后通过优化该模型来提出新的超参数猜想。\n大部分基于模型的超参数搜索算法，都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。\n因此，优化涉及到探索（探索高度不确定的超参数，可能带来显著的效果提升，也可能效果很差）和使用（使用已经确信效果不错的超参数——通常是先前见过的非常熟悉的超参数）之间的权衡。\n关于超参数优化的最前沿方法还包括Spearmint~{cite?}，TPE~{cite?}和SMAC~{cite?}。\n\n\n<!-- % 423 end -->\n目前，我们无法明确确定，贝叶斯超参数优化是否是一个能够实现更好深度学习结果或是能够事半功倍的成熟工具。\n贝叶斯超参数优化有时表现得像人类专家，能够在有些问题上取得很好的效果，但有时又会在某些问题上发生灾难性的失误。\n看看它是否适用于一个特定的问题是值得尝试的，但目前该方法还不够成熟或可靠。\n就像所说的那样，超参数优化是一个重要的研究领域，通常主要受深度学习所需驱动，但是它不仅能贡献于整个机器学习领域，还能贡献于一般的工程学。\n<!-- % 424 head -->\n\n\n大部分超参数优化算法比随机搜索更复杂，并且具有一个共同的缺点，在它们能够从实验中提取任何信息之前，它们需要运行完整的训练实验。\n相比于人类实践者手动搜索，考虑实验早期可以收集的信息量，这种方法是相当低效的，因为手动搜索通常可以很早判断出某组超参数是否是完全病态的。\n{swersky2014freeze}提出了一个可以维护多个实验的早期版本算法。\n在不同的时间点，超参数优化算法可以选择开启一个新实验，\"冻结\"正在运行但希望不大的实验，或是\"解冻\"并恢复早期被冻结的，但现在根据更多信息后又有希望的实验。\n\n\n<!-- % 424 -->\n\n# 调试策略\n\n当一个机器学习系统效果不好时，通常很难判断效果不好的原因是算法本身，还是算法实现错误。\n由于各种原因，机器学习系统很难调试。\n\n\n<!-- % 424 -->\n在大多数情况下，我们不能提前知道算法的行为。\n事实上，使用机器学习的整个出发点是，它会发现一些我们自己无法发现的有用行为。\n如果我们在一个\\emph{新}的分类任务上训练一个神经网络，它达到$5\\%$的测试误差，我们没法直接知道这是期望的结果，还是次优的结果。\n\n\n另一个难点是，大部分机器学习模型有多个自适应的部分。\n如果一个部分失效了，其他部分仍然可以自适应，并获得大致可接受的性能。\n例如，假设我们正在训练多层神经网络，其中参数为权重$\\MW$和偏置 $\\Vb$。\n进一步假设，我们单独手动实现了每个参数的梯度下降规则。\n而我们在偏置更新时犯了一个错误：\n\\begin{equation}\n\t\\Vb \\leftarrow \\Vb - \\alpha,\n\\end{equation}\n其中$\\alpha$是学习率。\n这个错误更新没有使用梯度。\n它会导致偏置在整个学习中不断变为负值，对于一个学习算法来说这显然是错误的。 \n然而只是检查模型输出的话，该错误可能并不是显而易见的。\n根据输入的分布，权重可能可以自适应地补偿负的偏置。\n<!-- % -- 425 head -->\n\n\n大部分神经网络的调试策略都是解决这两个难题的一个或两个。\n我们可以设计一种足够简单的情况，能够提前得到正确结果，判断模型预测是否与之相符；我们也可以设计一个测试，独立检查神经网络实现的各个部分。\n\n\n一些重要的调试检测如下所列。\n\n\\emph{可视化计算中模型的行为}：%??  in action \n当训练模型检测图像中的对象时，查看一些模型检测到部分重叠的图像。\n在训练语音生成模型时，试听一些生成的语音样本。\n这似乎是显而易见的，但在实际中很容易只注意量化性能度量，如准确率或对数似然。\n直接观察机器学习模型运行其任务，有助于确定其达到的量化性能数据是否看上去合理。\n错误评估模型性能可能是最具破坏性的错误之一，因为它们会使你在系统出问题时误以为系统运行良好。\n<!-- % 425 mid -->\n\n\n\\emph{可视化最严重的错误}：\n大多数模型能够输出运行任务时的某种置信度量。\n例如，基于\\,softmax函数\\,输出层的分类器给每个类分配一个概率。\n因此，分配给最有可能的类的概率给出了模型在其分类决定上的置信估计值。\n通常，相比于正确预测的概率最大似然训练会略有高估。\n但是由于实际上模型的较小概率不太可能对应着正确的标签，因此它们在一定意义上还是有些用的。\n通过查看训练集中很难正确建模的样本，通常可以发现该数据预处理或者标记方式的问题。\n例如，街景转录系统原本有个问题是，地址号码检测系统会将图像裁剪得过于紧密，而省略掉了一些数字。\n然后转录网络会给这些图像的正确答案分配非常低的概率。\n将图像排序，确定置信度最高的错误，显示系统的裁剪有问题。\n修改检测系统裁剪更宽的图像，从而使整个系统获得更好的性能，但是转录网络需要能够处理地址号码中位置和范围更大变化的情况。\n<!-- % 425 end -->\n\n\n\\emph{根据训练和测试误差检测软件}：\n我们往往很难确定底层软件是否是正确实现。\n训练和测试误差能够提供一些线索。\n如果训练误差较低，但是测试误差较高，那么很有可能训练过程是在正常运行，但模型由于算法原因过拟合了。\n另一种可能是，测试误差没有被正确地度量，可能是由于训练后保存模型再重载去度量测试集时出现问题，或者是因为测试数据和训练数据预处理的方式不同。\n如果训练和测试误差都很高，那么很难确定是软件错误，还是由于算法原因模型欠拟合。\n这种情况需要进一步的测试，如下面所述。\n\n<!-- % -- 426 head -->\n\n\\emph{拟合极小的数据集}：\n当训练集上有很大的误差时，我们需要确定问题是真正的欠拟合，还是软件错误。\n通常，即使是小模型也可以保证很好地拟合一个足够小的数据集。\n例如，只有一个样本的分类数据可以通过正确设置输出层的偏置来拟合。\n通常，如果不能训练一个分类器来正确标注一个单独的样本，或不能训练一个自编码器来成功地精准再现一个单独的样本，或不能训练一个生成模型来一致地生成一个单独的样本，那么很有可能是由于软件错误阻止训练集上的成功优化。\n此测试可以扩展到只有少量样本的小数据集上。\n\n<!-- % 426 mid -->\n\n\\emph{比较反向传播导数和数值导数}：\n如果读者正在使用一个需要实现梯度计算的软件框架，或者在添加一个新操作到求导库中，必须定义它的\\texttt{bprop}方法，那么常见的错误原因是没能正确地实现梯度表达。\n验证这些求导正确性的一种方法是比较实现的自动求导和通过有限差分计算的导数。\n因为\n\\begin{equation}\n\tf'(x) = \\lim_{\\epsilon \\to 0} \\frac{f(x+\\epsilon) - f(x)}{\\epsilon},\n\\end{equation}\n我们可以使用小的、有限的$\\epsilon$近似导数：\n\\begin{equation}\n\tf'(x) \\approx \\frac{f(x+\\epsilon) - f(x)}{\\epsilon}.\n\\end{equation}\n我们可以使用中心差分提高近似的准确率：\n\\begin{equation}\n\tf'(x) \\approx \\frac{ f(x+\\frac{1}{2}\\epsilon) - f(x-\\frac{1}{2}\\epsilon) }{\\epsilon}.\n\\end{equation}\n扰动大小$\\epsilon$必须足够大，以确保该扰动不会由于数值计算的有限精度问题产生舍入误差。\n\n<!-- % 426 end -->\n\n通常，我们会测试向量值函数$g:\\SetR^m \\to \\SetR^n$的梯度或\\,Jacobian\\,矩阵。\n令人遗憾的是，有限差分只允许我们每次计算一个导数。\n我们可以使用有限差分 $mn$次评估$g$的所有偏导数，也可以将该测试应用于一个新函数（在函数$g$的输入输出都加上随机投影）。%??  后面这句好像不对？  g的输入输出都使用随机投影的\n例如，我们可以将导数实现的测试用于函数$f(x) = \\Vu^T g(\\Vv x)$，其中$\\Vu$和$\\Vv$是随机向量。%??  这句也不对\n正确计算$f'(x)$要求能够正确地通过$g$反向传播，但是使用有限差分能够高效地计算，因为$f$只有一个输入和一个输出。\n通常，一个好的方法是在多个$\\Vu$值和$\\Vv$值上重复这个测试，可以减少测试忽略了垂直于随机投影的错误的几率。%??  很难\n\n<!-- % 427 head -->\n\n如果我们可以在复数上进行数值计算，那么使用复数作为函数的输入会有非常高效的数值方法估算梯度{cite?}。\n该方法基于如下观察\n\\begin{align}\n\tf(x + i\\epsilon) &= f(x) + i\\epsilon f'(x) + O(\\epsilon^2) ,\\\\\n\t\\text{real}( f(x+i\\epsilon) ) &= f(x) + O(\\epsilon^2), \\quad \\text{image}( \\frac{f(x+i\\epsilon)}{ \\epsilon } ) = f'(x) + O(\\epsilon^2),\n\\end{align}\n其中$i=\\sqrt{-1}$。\n和上面的实值情况不同，这里不存在消除影响，因为我们对$f$在不同点上计算差分。\n因此我们可以使用很小的$\\epsilon$，比如$\\epsilon = 10^{-150}$，其中误差$O(\\epsilon^2)$对所有实用目标都是微不足道的。\n\n<!-- % 427 mid -->\n\n\\emph{监控激活函数值和梯度的直方图}：\n可视化神经网络在大量训练迭代后（也许是一个轮）收集到的激活函数值和梯度的统计量往往是有用的。\n隐藏单元的预激活值可以告诉我们该单元是否饱和，或者它们饱和的频率如何。\n例如，对于整流器，它们多久关一次？是否有单元一直关闭？\n对于双曲正切单元而言，预激活绝对值的平均值可以告诉我们该单元的饱和程度。\n在深度网络中，传播梯度的快速增长或快速消失，可能会阻碍优化过程。\n最后，比较参数梯度和参数的量级也是有帮助的。\n正如{cite?}所建议的，我们希望参数在一个小批量更新中变化的幅度是参数量值$1\\%$这样的级别，而不是$50\\%$或者$0.001\\%$（这会导致参数移动得太慢）。\n也有可能是某些参数以良好的步长移动，而另一些停滞。\n如果数据是稀疏的（比如自然语言），有些参数可能很少更新，检测它们变化时应该记住这一点。\n\n<!-- % 428 head -->\n\n最后，许多深度学习算法为每一步产生的结果提供了某种保证。\n例如，在第三部分，我们将看到一些使用代数解决优化问题的近似推断算法。\n通常，这些可以通过测试它们的每个保证来调试。\n某些优化算法提供的保证包括，目标函数值在算法的迭代步中不会增加，某些变量的导数在算法的每一步中都是零，所有变量的梯度在收敛时会变为零。\n通常，由于舍入误差，这些条件不会在数字计算机上完全成立，因此调试测试应该包含一些容差参数。\n\n<!-- % 428 mid -->\n\n\n# 示例：多位数字识别\n\n为了端到端的说明如何在实践中应用我们的设计方法论，我们从设计深度学习组件出发，简单地介绍下街景转录系统。\n显然，整个系统的许多其他组件，如街景车、数据库设施等等，也是极其重要的。\n\n<!-- % 428 mid -->\n\n从机器学习任务的视角出发，首先这个过程要采集数据。\n街景车收集原始数据，然后操作员手动提供标签。\n转录任务开始前有大量的数据处理工作，包括在转录前使用其他机器学习技术\\emph{探测}房屋号码。\n\n<!-- % 428 mid -->\n\n转录项目开始于性能度量的选择和对这些度量的期望值。\n一个重要的总原则是度量的选择要符合项目的业务目标。\n因为地图只有是高准确率时才有用，所以为这个项目设置高准确率的要求非常重要。\n具体地，目标是达到人类水平，$98\\%$的准确率。\n这种程度的准确率并不是总能达到。\n为了达到这个级别的准确率，街景转录系统牺牲了覆盖。\n因此在保持准确率 $98\\%$的情况下，覆盖成了这个项目优化的主要性能度量。\n随着卷积网络的改进，我们能够降低网络拒绝转录输入的置信度阈值，最终超出了覆盖 $95\\%$的目标。\n\n<!-- % -- 428 end -->\n\n在选择量化目标后，我们推荐方法的下一步是要快速建立一个合理的基准系统。\n对于视觉任务而言，基准系统是带有整流线性单元的卷积网络。\n转录项目开始于一个这样的模型。\n当时，使用卷积网络输出预测序列并不常见。\n开始时，我们使用一个尽可能简单的基准模型，该模型输出层的第一个实现包含$n$个不同的~softmax单元来预测$n$个字符的序列。\n我们使用与训练分类任务相同的方式来训练这些~softmax单元，独立地训练每个~softmax单元。\n\n<!-- % 429 head -->\n\n我们建议反复细化这些基准，并测试每个变化是否都有改进。\n街景转录系统的第一个变化受激励于覆盖指标的理论理解和数据结构。\n具体地，当输出序列的概率低于某个值$t$即$p(\\Vy\\mid\\Vx) < t$时，网络拒绝为输入$\\Vx$分类。\n最初，$p(\\Vy\\mid\\Vx)$的定义是临时的，简单地将所有~softmax函数输出乘在一起。\n这促使我们发展能够真正计算出合理对数似然的特定输出层和代价函数。%??  后来是否该去掉？\n这种方法使得样本拒绝机制更有效。\n\n\n此时，覆盖仍低于$90\\%$，但该方法没有明显的理论问题了。\n因此，我们的方法论建议综合训练集和测试集性能，以确定问题是否是欠拟合或过拟合。\n在这种情况下，训练和测试集误差几乎是一样的。\n事实上，这个项目进行得如此顺利的主要原因是有数以千万计的标注样本数据集可用。\n因为训练和测试集的误差是如此相似，这表明要么是这个问题欠拟合，要么是训练数据的问题。\n我们推荐的调试策略之一是可视化模型最糟糕的错误。\n在这种情况下，这意味着可视化 不正确而模型给了最高置信度的训练集转录结果。\n结果显示，主要是输入图像裁剪得太紧，有些和地址相关的数字被裁剪操作除去了。\n例如，地址\"1849\"的图片可能裁切得太紧，只剩下\"849\"是可见的。\n如果我们花费几周时间改进确定裁剪区域的地址号码检测系统的准确率，或许也可以解决这个问题。%??  \n与之不同，项目团队采取了更实际的办法，简单地系统性扩大裁剪区域的宽度，使其大于地址号码检测系统预测的区域宽度。%??    ’大于‘ 不对吧， 加个 使其\n这种单一改变将转录系统的覆盖提高了$10$个百分点。\n\n<!-- % -- 429 end -->\n\n最后，性能提升的最后几个百分点来自调整超参数。\n这主要包括在保持一些计算代价限制的同时加大模型的规模。\n因为训练误差和测试误差保持几乎相等，所以明确表明性能不足是由欠拟合造成的，数据集本身也存在一些问题。\n\n\n总体来说，转录项目是非常成功的，可以比人工速度更快、代价更低地转录数以亿计的地址。\n\n我们希望本章中介绍的设计原则能带来其他更多类似的成功。\n\n<!-- % -- 430 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-12-Chapter12_applications.md",
    "content": "---\ntitle: 应用\nlayout: post\nshare: false\n---\n\n在本章中，我们将介绍如何使用深度学习来解决计算机视觉、语音识别、自然语言处理以及其他商业领域中的应用。\n首先我们将讨论在许多最重要的~AI~应用中所需的大规模神经网络的实现。\n接着，我们将回顾深度学习已经成功应用的几个特定领域。\n尽管深度学习的一个目标是设计能够处理各种任务的算法，然而截止目前深度学习的应用仍然需要一定程度的特化。\n例如，计算机视觉中的任务对每一个样本都需要处理大量的输入特征（像素）。\n自然语言处理任务的每一个输入特征都需要对大量的可能值（词汇表中的词）建模。\n<!-- % 431 -->\n\n\n# 大规模深度学习\n\n<!-- % 431  -->\n\n深度学习的基本思想基于联结主义：尽管机器学习模型中单个生物性的神经元或者说是单个特征不是智能的，但是大量的神经元或者特征作用在一起往往能够表现出智能。\n我们必须着重强调神经元数量必须\\emph{很大}这个事实。\n相比20世纪80年代，如今神经网络的精度以及处理任务的复杂度都有一定提升，其中一个关键的因素就是网络规模的巨大提升\n。\n正如我们在\\sec?中看到的一样，在过去的三十年内，网络规模是以指数级的速度递增的。\n然而如今的人工神经网络的规模也仅仅和昆虫的神经系统差不多。\n\n由于规模的大小对于神经网络来说至关重要，因此深度学习需要高性能的硬件设施和软件实现。\n<!-- %大规模神经网络的必要性，所以深度学习需要高性能的硬件设施和软件实现。 -->\n<!-- % 431 -->\n\n\n## 快速的CPU实现\n\n\n传统的神经网络是用单台机器的CPU来训练的。\n如今，这种做法通常被视为是不可取的。\n现在，我们通常使用~GPU~或者许多台机器的CPU连接在一起进行计算。\n在使用这种昂贵配置之前，为论证CPU无法承担神经网络所需的巨大计算量，研究者们付出了巨大的努力。\n<!-- % 432 head -->\n\n\n描述如何实现高效的数值CPU代码已经超出了本书的讨论范围，但是我们在这里还是要强调通过设计一些特定的CPU上的操作可以大大提升效率。\n例如，在2011年，最好的CPU在训练神经网络时使用定点运算能够比浮点运算跑得更快。\n通过调整定点运算的实现方式，{Vanhoucke-et-al-2011}获得了3倍于一个强浮点运算系统的速度。\n<!-- % 相对一个很强的浮点运算系统3倍的加速 -->\n因为各个新型CPU都有各自不同的特性，所以有时候采用浮点运算实现会更快。\n<!-- % 一条重要的准则就是通过特殊设计的数值运算可以获得巨大的回报。 -->\n一条重要的准则就是，通过特殊设计的数值运算，我们可以获得巨大的回报。\n除了选择定点运算或者浮点运算以外，其他的策略还包括了如通过优化数据结构避免高速缓存缺失、使用向量指令等。\n<!-- %还包括其他的策略，如通过优化数据结构避免高速缓存缺失、使用向量指令等。 -->\n如果模型规模不会限制模型表现（不会影响模型精度）时，机器学习的研究者们一般忽略这些实现的细节。\n<!-- % 432 -->\n\n\n## GPU 实现\n\n\n许多现代神经网络的实现基于图形处理器。\n图形处理器最初是为图形应用而开发的专用硬件组件。\n<!-- %是一种特殊设计的硬件，设计的原始目的是为了处理图形应用。 -->\n视频游戏系统的消费市场刺激了图形处理硬件的发展。\n它为视频游戏所设计的特性也可以使神经网络的计算受益。\n<!-- % 432   -->\n\n视频游戏的渲染要求许多操作能够快速并行地执行。\n环境和角色模型通过一系列顶点的3D坐标确定。\n为了将大量的3D坐标转化为2D显示器上的坐标，显卡必须并行地对许多顶点执行矩阵乘法与除法。\n<!-- %显卡必须快速实现矩阵乘法或者除法。 -->\n之后，显卡必须并行地在每个像素上执行诸多计算，来确定每个像素点的颜色。\n在这两种情况下，计算都是非常简单的，并且不涉及CPU通常遇到的复杂的分支运算。\n例如，同一个刚体内的每个顶点都会乘上相同的矩阵；也就是说，不需要通过{\\tt if}语句来判断确定每个顶点需要乘哪个矩阵。\n各个计算过程之间也是完全相互独立的，因此能够实现并行操作。\n计算过程还涉及处理大量内存缓冲以及描述每一个需要被渲染的对象的纹理（颜色模式）的位图信息。\n总的来说，这使显卡设计为拥有高度并行特性以及很高的内存带宽，同时也付出了一些代价，如相比传统的CPU更慢的时钟速度以及更弱的处理分支运算的能力。\n<!-- % p 433 -->\n\n\n与上述的实时图形算法相比，神经网络算法所需要的性能特性是相同的。\n神经网络算法通常涉及大量参数、激活值、梯度值的缓冲区，其中每个值在每一次训练迭代中都要被完全更新。\n这些缓冲太大，会超出传统的桌面计算机的高速缓存(cache)，所以内存带宽通常会成为主要瓶颈。\n相比CPU，GPU~一个显著的优势是其极高的内存带宽。\n神经网络的训练算法通常并不涉及大量的分支运算与复杂的控制指令，所以更适合在~GPU~硬件上训练。\n由于神经网络能够被分为多个单独的\"神经元\"，并且独立于同一层内其他神经元进行处理，所以神经网络可以从~GPU~的并行特性中受益匪浅。\n<!-- % 433 -->\n\n\nGPU~硬件最初专为图形任务而设计。\n随着时间的推移，GPU~也变得更灵活，允许定制的子程序处理转化顶点坐标或者计算像素颜色的任务。\n原则上，GPU~不要求这些像素值实际基于渲染任务。\n只要将计算的输出值作为像素值写入缓冲区，GPU~就可以用于科学计算。\n{Steinkrau2005}在GPU上实现了一个两层全连接的神经网络，并获得了相对基于CPU的基准方法三倍的加速。\n不久以后，{chellapilla:inria-00112631}也论证了相同的技术可以用来加速监督卷积网络的训练。\n<!-- % 433 -->\n\n\n在通用GPU~发布以后，使用显卡训练神经网络的热度开始爆炸性地增长。\n这种通用GPU~可以执行任意的代码，而并非仅仅渲染子程序。\nNVIDIA的CUDA编程语言使得我们可以用一种像C一样的语言实现任意代码。\n由于相对简便的编程模型，强大的并行能力以及巨大的内存带宽，通用GPU~为我们提供了训练神经网络的理想平台。\n在它发布以后不久，这个平台就迅速被深度学习的研究者们所采纳~{cite?}。\n\n\n\n如何在通用GPU~上写高效的代码依然是一个难题。\n在~GPU~上获得良好表现所需的技术与CPU上的技术非常不同。\n比如说，基于CPU的良好代码通常被设计为尽可能从高速缓存中读取更多的信息。\n然而在~GPU~中，大多数可写内存位置并不会被高速缓存，所以计算某个值两次往往会比计算一次然后从内存中读取更快。\nGPU~代码是天生多线程的，不同线程之间必须仔细协调好。\n例如，如果能够把数据级联起来，那么涉及内存的操作一般会更快。\n当几个线程同时需要读/写一个值时，像这样的级联会作为一次内存操作出现。\n不同的~GPU~可能采用不同的级联读/写数据的方式。\n通常来说，如果在$n$个线程中，线程$i$访问的是第$i+j$处的内存，其中$j$是$2$的某个幂的倍数，那么内存操作就易于级联。\n具体的设定在不同的~GPU~型号中有所区别。\nGPU~另一个常见的设定是使一个组中的所有线程都同时执行同一指令。\n这意味着~GPU~难以执行分支操作。\n线程被分为一个个称作~\\textbf{warp}~的小组。\n在一个~warp~中的每一个线程在每一个循环中执行同一指令，所以当同一个~warp~中的不同线程需要执行不同的指令时，需要使用串行而非并行的方式。\n<!-- % 434  -->\n\n\n由于实现高效~GPU~代码的困难性，研究人员应该组织好他们的工作流程，避免对每一个新的模型或算法都编写新的~GPU~代码。\n通常来讲，人们会选择建立一个包含高效操作（如卷积和矩阵乘法）的软件库解决这个问题，然后再从库中调用所需要的操作确定模型。\n<!-- %例如，机器学习库Pylearn2 {cite?}通过调用Theano {cite?}和cuda-convnet {cite?}提供的高性能操作，囊括了许多机器学习算法。 -->\n例如，机器学习库Pylearn2 {cite?}将其所有的机器学习算法都通过调用Theano~{cite?}和cuda-convnet~{cite?} 所提供的高性能操作来指定。\n这种分解方法还可以简化对多种硬件的支持。\n例如，同一个Theano程序可以在CPU或者~GPU~上运行，而不需要改变调用Theano的方式。\n其他库如Tensorflow~{cite?}和Torch~{cite?}也提供了类似的功能。\n<!-- % 434 end -->\n\n\n\n## 大规模的分布式实现\n\n\n在许多情况下，单个机器的计算资源是有限的。\n因此，我们希望把训练或者推断的任务分摊到多个机器上进行。\n<!-- % 434 end -->\n\n分布式的推断是容易实现的，因为每一个输入的样本都可以在单独的机器上运行。\n这也被称为数据并行。\n\n同样地，模型并行也是可行的，其中多个机器共同运行一个数据点，每一个机器负责模型的一个部分。\n对于推断和训练，这都是可行的。\n<!-- % 435 -->\n\n\n\n在训练过程中，数据并行某种程度上来说更加困难。\n对于随机梯度下降的单步来说，我们可以增加小批量的大小，但是从优化性能的角度来说，我们得到的回报通常并不会线性增长。\n使用多个机器并行地计算多个梯度下降步骤是一个更好的选择。\n不幸的是，梯度下降的标准定义完全是一个串行的过程：\n第$t$步的梯度是第$t-1$步所得参数的函数。\n<!-- % 435 -->\n\n\n这个问题可以使用异步随机梯度下降{cite?}解决。\n在这个方法中，几个处理器的核共用存有参数的内存。\n每一个核在无锁情况下读取这些参数并计算对应的梯度，然后在无锁状态下更新这些参数。\n<!-- %这种方法减少了每一个梯度下降所获得的平均提升，因为一些核把其他的核所更新的参数（写）覆盖了。 -->\n由于一些核把其他的核所更新的参数覆盖了，因此这种方法减少了每一步梯度下降所获得的平均提升。\n但因为更新步数的速率增加，总体上还是加快了学习过程。\n{Dean-et-al-NIPS2012}率先提出了多机器无锁的梯度下降方法，其中参数是由参数服务器管理而非存储在共用的内存中。\n分布式的异步梯度下降方法保留了训练深度神经网络的基本策略，并被工业界很多机器学习组所使用{cite?}。\n学术界的深度学习研究者们通常无法负担那么大规模的分布式学习系统，但是一些研究仍关注于如何在校园环境中使用相对廉价的硬件系统构造分布式网络~{cite?}。\n<!-- % 435 -->\n\n\n\n## 模型压缩\n\n<!-- % 435  -->\n\n在许多商业应用的机器学习模型中，一个时间和内存开销较小的推断算法比一个时间和内存开销较小的训练算法要更为重要。\n对于那些不需要个性化设计的应用来说，我们只需要一次性的训练模型，然后它就可以被成千上万的用户使用。\n在许多情况下，相比开发者，终端用户的可用资源往往更有限。\n例如，开发者们可以使用巨大的计算机集群训练一个语音识别的网络，然后将其部署到移动手机上。\n\n\n减少推断所需开销的一个关键策略是模型压缩~{cite?}。\n模型压缩的基本思想是用一个更小的模型取代原始耗时的模型，从而使得用来存储与评估所需的内存与运行时间更少。\n\n\n\n当原始模型的规模很大，且我们需要防止过拟合时，模型压缩就可以起到作用。\n在许多情况下，拥有最小泛化误差的模型往往是多个独立训练而成的模型的集成。\n评估所有$n$个集成成员的成本很高。\n有时候，当单个模型很大（例如，如果它使用~Dropout~正则化）时，其泛化能力也会很好。\n<!-- % 436  -->\n\n这些巨大的模型能够学习到某个函数$f(\\Vx)$，但选用的参数数量超过了任务所需的参数数量。\n<!-- %仅仅训练样本数是有限的，所以网络的规模是受限的。 -->\n只是因为训练样本数是有限的，所以模型的规模才变得必要。\n只要我们拟合了这个函数$f(\\Vx)$，我们就可以通过将$f$作用于随机采样点$x$来生成有无穷多训练样本的训练集。\n<!-- %我们就可以生成一个拥有了无穷多训练样本的训练集，只需将$f$作用于任意生成的$\\Vx$。 -->\n然后，我们使用这些样本训练一个新的更小的模型，使其能够在这些点上拟合$f(\\Vx)$。\n为了更加充分地利用了这个新的小模型的容量，最好从类似于真实测试数据（之后将提供给模型）的分布中采样$\\Vx$。\n这个过程可以通过损坏训练样本或者从原始训练数据训练的生成模型中采样完成。\n\n此外，我们还可以仅在原始训练数据上训练一个更小的模型，但只是为了复制模型的其他特征，比如在不正确的类上的后验分布{cite?}。\n<!-- % 436  -->\n\n\n## 动态结构\n\n\n一般来说，加速数据处理系统的一种策略是构造一个系统，这个系统用动态结构描述图中处理输入的所需计算过程。\n在给定一个输入的情况中，数据处理系统可以动态地决定运行神经网络系统的哪一部分。\n单个神经网络内部同样也存在动态结构，给定输入信息，决定特征（隐藏单元）哪一部分用于计算。\n这种神经网络中的动态结构有时被称为条件计算{cite?}。\n由于模型结构许多部分可能只跟输入的一小部分有关，只计算那些需要的特征可以起到加速的目的。\n<!-- % 436  -->\n\n动态结构计算是一种基础的计算机科学方法，广泛应用于软件工程项目。\n应用于神经网络的最简单的动态结构基于决定神经网络（或者其他机器学习模型）中的哪些子集需要应用于特定的输入。\n<!-- % 437  -->\n\n在分类器中加速推断的可行策略是使用级联的分类器。\n当目标是检测罕见对象（或事件）是否存在时，可以应用级联策略。\n要确定对象是否存在，我们必须使用具有高容量、运行成本高的复杂分类器。 \n然而，因为对象是罕见的，我们通常可以使用更少的计算拒绝不包含对象的输入。\n在这些情况下，我们可以训练一序列分类器。\n序列中的第一个分类器具有低容量，训练为具有高召回率。\n换句话说，他们被训练为确保对象存在时，我们不会错误地拒绝输入。\n最后一个分类器被训练为具有高精度。\n在测试时，我们按照顺序运行分类器进行推断，一旦级联中的任何一个拒绝它，就选择抛弃。\n总的来说，这允许我们使用高容量模型以较高的置信度验证对象的存在，而不是强制我们为每个样本付出完全推断的成本。\n有两种不同的方式可以使得级联实现高容量。\n一种方法是使级联中靠后的成员单独具有高容量。\n在这种情况下，由于系统中的一些个体成员具有高容量，因此系统作为一个整体显然也具有高容量。\n还可以使用另一种级联，其中每个单独的模型具有低容量，但是由于许多小型模型的组合，整个系统具有高容量。\n{Viola01}使用级联的增强决策树实现了适合在手持数字相机中使用的快速并且鲁棒的面部检测器。\n本质上，它们的分类器使用滑动窗口方法来定位面部。\n分类器会检查许多的窗口，如果这些窗口内不包含面部则被拒绝。\n级联的另一个版本使用早期模型来实现一种硬注意力机制：级联的先遣成员定位对象，并且级联的后续成员在给定对象位置的情况下执行进一步处理。\n例如，Google使用两步级联从街景视图图像中转换地址编号：首先使用一个机器学习模型查找地址编号，然后使用另一个机器学习模型将其转录{cite?}。\n<!-- % 437  -->\n\n决策树本身是动态结构的一个例子，因为树中的每个节点决定应该使用哪个子树来评估输入。\n一个结合深度学习和动态结构的简单方法是训练一个决策树，其中每个节点使用神经网络做出决策{cite?}，虽然这种方法没有实现加速推断计算的目标。\n<!-- % 437 end -->\n\n\n\n类似的，我们可以使用称为选通器的神经网络来选择在给定当前输入的情况下将使用几个专家网络中的哪一个来计算输出。\n这个想法的第一个版本被称为专家混合体{cite?}，其中选通器为每个专家输出一个概率或权重（通过非线性的softmax函数获得），并且最终输出由各个专家输出的加权组合获得。\n在这种情况下，使用选通器不会降低计算成本，但如果每个样本的选通器选择单个专家，我们就会获得一个特殊的硬专家混合体\\,{cite?}，这可以加速推断和训练。\n当选通器决策的数量很小时，这个策略效果会很好，因为它不是组合的。\n但是当我们想要选择不同的单元或参数子集时，不可能使用\"软开关\"，因为它需要枚举（和计算输出）所有的选通器配置。\n为了解决这个问题，许多工作探索了几种方法来训练组合的选通器。\n{bengio2013estimating}提出使用选通器概率梯度的若干估计器，而~{Bacon-et-al-RLDM2015,BengioE-et-al-arXiv2015}使用强化学习技术（策略梯度）来学习一种条件的~Dropout~形式（作用于隐藏单元块），减少了实际的计算成本，而不会对近似的质量产生负面影响。\n<!-- % 438 -->\n\n\n另一种动态结构是开关，其中隐藏单元可以根据具体情况从不同单元接收输入。\n这种动态路由方法可以理解为注意力机制 {cite?}。\n目前为止，硬性开关的使用在大规模应用中还没有被证明是有效的。\n较为先进的方法一般采用对许多可能的输入使用加权平均，因此不能完全得到动态结构所带来的计算益处。\n先进的注意力机制将在\\sec?中描述。\n<!-- % 438 -->\n\n\n\n使用动态结构化系统的主要障碍是由于系统针对不同输入的不同代码分支导致的并行度降低。\n这意味着网络中只有很少的操作可以被描述为对样本小批量的矩阵乘法或批量卷积。\n我们可以写更多的专用子程序，用不同的核对样本做卷积，或者通过不同的权重列来乘以设计矩阵的每一行。\n不幸的是，这些专用的子程序难以高效地实现。\n由于缺乏高速缓存的一致性，CPU实现会十分缓慢。\n此外，由于缺乏级联的内存操作以及~warp~成员使用不同分支时需要串行化操作，GPU~的实现也会很慢。\n在一些情况下，我们可以通过将样本分成组，并且都采用相同的分支并且同时处理这些样本组的方式来缓解这些问题。\n在离线环境中，这是最小化处理固定量样本所需时间的一项可接受的策略。\n然而在实时系统中，样本必须连续处理，对工作负载进行分区可能会导致负载均衡问题。\n例如，如果我们分配一台机器处理级联中的第一步，另一台机器处理级联中的最后一步，那么第一台机器将倾向于过载，最后一个机器倾向于欠载。\n如果每个机器被分配以实现神经决策树的不同节点，也会出现类似的问题。\n<!-- % 439 -->\n\n\n\n## 深度网络的专用硬件实现\n\n<!-- %439 -->\n\n自从早期的神经网络研究以来，硬件设计者已经致力于可以加速神经网络算法的训练和/或推断的专用硬件实现。\n读者可以查看早期和更近的专用硬件深度网络的评论{cite?}。\n<!-- %439 -->\n\n\n不同形式的专用硬件{cite?}的研究已经持续了好几十年，比如专用集成电路的数字（基于数字的二进制表示），模拟{cite?}（基于以电压或电流表示连续值的物理实现）和混合实现（组合数字和模拟组件）。\n近年来更灵活的现场可编程门阵列实现（其中电路的具体细节可以在制造完成后写入芯片）也得到了长足发展。\n<!-- % 439 mid -->\n\n\n\n虽然CPU和~GPU~上的软件实现通常使用32或64位的精度来表示浮点数，但是长期以来使用较低的精度在更短的时间内完成推断也是可行的{cite?}。\n这已成为近年来更迫切的问题，因为深度学习在工业产品中越来越受欢迎，并且由于更快的硬件产生的巨大影响已经通过~GPU~的使用得到了证明。\n激励当前对深度网络专用硬件研究的另一个因素是单个CPU或~GPU~核心的进展速度已经减慢，并且最近计算速度的改进来自于核心的并行化（无论CPU还是~GPU）。\n这与20世纪90年代的情况（上一个神经网络时代）的不同之处在于，神经网络的硬件实现（从开始到芯片可用可能需要两年）跟不上快速进展和价格低廉的通用CPU的脚步。\n因此，在针对诸如手机等低功率设备开发新的硬件设计，并且想要用于深度学习的一般公众应用（例如，具有语音、计算机视觉或自然语言功能的设施）等时，研究专用硬件能够进一步推动其发展。\n<!-- % 440 head -->\n\n\n最近对基于反向传播神经网络的低精度实现的工作{cite?}表明，8和16位之间的精度足以满足使用或训练基于反向传播的深度神经网络的要求。\n显而易见的是，在训练期间需要比在推断时更高的精度，并且数字某些形式的动态定点表示能够减少每个数需要的存储空间。\n传统的定点数被限制在了一个固定范围之内（其对应于浮点表示中的给定指数）。\n而动态定点表示在一组数字 （例如一个层中的所有权重） 之间共享该范围。\n使用定点代替浮点表示并且每个数使用较少的比特能够减少执行乘法所需的硬件表面积、功率需求和计算时间。\n而乘法已经是使用或训练反向传播的现代深度网络中要求最高的操作。\n\n\n\n<!-- % 440 new -->\n\n# 计算机视觉\n\n\n一直以来，计算机视觉就是深度学习应用中几个最活跃的研究方向之一。\n因为视觉是一个对人类以及许多动物毫不费力，但对计算机却充满挑战的任务{cite?}。\n深度学习中许多流行的标准基准任务包括对象识别以及光学字符识别。\n<!-- % 440   -->\n\n\n计算机视觉是一个非常广阔的发展领域，其中包括多种多样的处理图片的方式以及应用方向。\n计算机视觉的应用广泛：从复现人类视觉能力（比如识别人脸）到创造全新的视觉能力。\n举个后者的例子，近期一个新的计算机视觉应用是从视频中可视物体的振动中识别相应的声波{cite?}。\n大多数计算机视觉领域的深度学习研究未曾关注过这样一个奇异的应用，它扩展了图像的范围，而不是仅仅关注于人工智能中较小的核心目标——复制人类的能力。\n无论是报告图像中存在哪个物体，还是给图像中每个对象周围添加注释性的边框，\n或从图像中转录符号序列，或给图像中的每个像素标记它所属对象的标识，\n大多数计算机视觉中的深度学习往往用于对象识别或者某种形式的检测。\n由于生成模型已经是深度学习研究的指导原则，因此还有大量图像合成工作使用了深度模型。\n尽管图像合成（\"\\emph{无中生有}\"）通常不包括在计算机视觉内，但是能够进行图像合成的模型通常用于图像恢复，即修复图像中的缺陷或从图像中移除对象这样的计算机视觉任务。\n<!-- % 441  -->\n\n\n## 预处理\n\n<!-- % 441  -->\n\n由于原始输入往往以深度学习架构难以表示的形式出现，许多应用领域需要复杂精细的预处理。\n计算机视觉通常只需要相对少的这种预处理。\n图像应该被标准化，从而使得它们的像素都在相同并且合理的范围内，比如$[0,1]$或者$[-1,1]$。\n将$[0,1]$中的图像与$[0,255]$中的图像混合通常会导致失败。\n将图像格式化为具有相同的比例严格上说是唯一一种必要的预处理。\n许多计算机视觉架构需要标准尺寸的图像，因此必须裁剪或缩放图像以适应该尺寸。\n然而，严格地说即使是这种重新调整比例的操作并不总是必要的。\n一些卷积模型接受可变大小的输入并动态地调整它们的池化区域大小以保持输出大小恒定{cite?}。\n其他卷积模型具有可变大小的输出，其尺寸随输入自动缩放，例如对图像中的每个像素进行去噪或标注的模型{cite?}。\n<!-- % 441  -->\n\n数据集增强可以被看作是一种只对训练集做预处理的方式。\n数据集增强是减少大多数计算机视觉模型泛化误差的一种极好方法。\n在测试时可用的一个相关想法是将同一输入的许多不同版本传给模型（例如，在稍微不同的位置处裁剪的相同图像），并且在模型的不同实例上决定模型的输出。\n后一个想法可以被理解为集成方法，并且有助于减少泛化误差。\n<!-- % 441  -->\n\n其他种类的预处理需要同时应用于训练集和测试集，其目的是将每个样本置于更规范的形式，以便减少模型需要考虑的变化量。\n减少数据中的变化量既能够减少泛化误差，也能够减小拟合训练集所需模型的大小。\n更简单的任务可以通过更小的模型来解决，而更简单的解决方案泛化能力一般更好。\n这种类型的预处理通常被设计为去除输入数据中的某种可变性，这对于人工设计者来说是容易描述的，并且人工设计者能够保证不受到任务影响。\n当使用大型数据集和大型模型训练时，这种预处理通常是不必要的，并且最好只是让模型学习哪些变化性应该保留。\n例如，用于分类ImageNet的AlexNet系统仅具有一个预处理步骤：对每个像素减去训练样本的平均值{cite?}。\n<!-- % 442  -->\n\n\\subsubsection{对比度归一化}\n<!-- % 442  -->\n\n\n在许多任务中，对比度是能够安全移除的最为明显的变化源之一。\n简单地说，对比度指的是图像中亮像素和暗像素之间差异的大小。\n量化图像对比度有许多方式。\n在深度学习中，对比度通常指的是图像或图像区域中像素的标准差。\n假设我们有一个张量表示的图像$\\TSX \\in\\SetR^{r\\times c\\times 3}$，其中$\\TEX_{i,j,1}$表示第$i$行第$j$列红色的强度，$\\TEX_{i,j,2}$对应的是绿色的强度，$\\TEX_{i,j,3}$对应的是蓝色的强度。\n然后整个图像的对比度可以表示如下：\n\\begin{align}\n\\sqrt{\\frac{1}{3rc}\\sum_{i=1}^{r} \\sum_{j=1}^{c}\\sum_{k=1}^{3} (\\TEX_{i,j,k} - \\bar{\\TSX} )^2},\n\\end{align}\n其中$\\bar{\\TSX}$是整个图片的平均强度，满足\n\\begin{align}\n \\bar{\\TSX} =  \\frac{1}{3rc}\\sum_{i=1}^{r} \\sum_{j=1}^{c}\\sum_{k=1}^{3}\\TEX_{i,j,k}.\n\\end{align}\n\n\n全局对比度归一化旨在通过从每个图像中减去其平均值，然后重新缩放其使得其像素上的标准差等于某个常数$s$来防止图像具有变化的对比度。\n这种方法非常复杂，因为没有缩放因子可以改变零对比度图像（所有像素都具有相等强度的图像）的对比度。\n具有非常低但非零对比度的图像通常几乎没有信息内容。\n在这种情况下除以真实标准差通常仅能放大传感器噪声或压缩伪像。\n这种现象启发我们引入一个小的正的正则化参数$\\lambda$来平衡估计的标准差。\n或者，我们至少可以约束分母使其大于等于$\\epsilon$。\n给定一个输入图像$\\TSX$，全局对比度归一化产生输出图像$\\TSX'$，定义为\n\\begin{align}\n\\TEX'_{i,j,k} = s\\frac{\\TEX_{i,j,k} - \\bar{\\TEX}}{\\max\\{ \\epsilon, \\sqrt{ \\lambda + {\\frac{1}{3rc}\\sum_{i=1}^{r}\\sum_{j=1}^{c}\\sum_{k=1}^{3}} (\\TEX_{i,j,k} - \\bar{\\TEX} )^2} \\}}.\n\\end{align}\n<!-- % 442 end -->\n\n\n从大图像中剪切感兴趣的对象所组成的数据集不可能包含任何强度几乎恒定的图像。\n在这些情况下，通过设置$\\lambda = 0$来忽略小分母问题是安全的，并且在非常罕见的情况下为了避免除以$0$，通过将$\\epsilon$设置为一个非常小的值比如说$10^{-8}$。\n这也是~{Goodfellow+al-arxiv-2013}在CIFAR-10数据集上所使用的方法。\n随机剪裁的小图像更可能具有几乎恒定的强度，使得激进的正则化更有用。\n在处理从CIFAR-10数据中随机选择的小区域时，{Coates2011}使用$\\epsilon = 0, \\lambda = 10$。\n<!-- % 443 -->\n\n尺度参数$s$通常可以设置为$1$（如~{Coates2011}所采用的），或选择使所有样本上每个像素的标准差接近$1$（如{Goodfellow+al-arxiv-2013}所采用的）。\n<!-- % 443 mid -->\n\n\n\\eqn?中的标准差仅仅是对图片$L^2$范数的重新缩放（假设图像的平均值已经被移除）。\n我们更偏向于根据标准差而不是$L^2$范数来定义~GCN，因为标准差包括除以像素数量这一步，从而基于标准差的~GCN~能够使用与图像大小无关的固定的$s$。\n然而，观察到$L^2$范数与标准差成比例，这符合我们的直觉。\n我们可以把~GCN~理解成到球壳的一种映射。\n\\fig?对此有所说明。\n这可能是一个有用的属性，因为神经网络往往更好地响应空间方向，而不是精确的位置。\n响应相同方向上的多个距离需要具有共线权重向量但具有不同偏置的隐藏单元。\n这样的情况对于学习算法来说可能是困难的。\n此外，许多浅层的图模型把多个分离的模式表示在一条线上会出现问题。\nGCN~采用一个样本一个方向\\footnote{译者：所有样本相似的距离}而不是不同的方向和距离来避免这些问题。\n<!-- % 444 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter12/figures/gcn_sphere_color}}\n\\fi\n\t\\caption{GCN~将样本投影到一个球上。\n\\emph{(左)}原始的输入数据可能拥有任意的范数。\n\\emph{(中)}$\\lambda=0$时候的~GCN~可以完美地将所有的非零样本投影到球上。\n这里我们令$s=1$，$\\epsilon = 10^{-8}$。\n由于我们使用的~GCN~是基于归一化标准差而不是$L^2$范数，所得到的球并不是单位球。\n\\emph{(右)}$\\lambda>0$的正则化~GCN~将样本投影到球上，但是并没有完全地丢弃其范数中变化。\n$s$和$\\epsilon$的取值与之前一样。}\n\\end{figure}\n<!-- % 443 tail -->\n\n\n<!-- % 444 head -->\n与直觉相反的是，存在被称为~\\textbf{sphering}~的预处理操作，并且它不同于~GCN。\nsphering~并不会使数据位于球形壳上，而是将主成分重新缩放以具有相等方差，使得~PCA~使用的多变量正态分布具有球形等高线。 \nsphering~通常被称为白化。\n<!-- % 444 head -->\n\n\n全局对比度归一化常常不能突出我们想要突出的图像特征，例如边缘和角。\n如果我们有一个场景，包含了一个大的黑暗区域和一个大的明亮的区域（例如一个城市广场有一半的区域处于建筑物的阴影之中），\n则全局对比度归一化将确保暗区域的亮度与亮区域的亮度之间存在大的差异。\n然而，它不能确保暗区内的边缘突出。\n<!-- % 444 -->\n\n这催生了局部对比度归一化 。\n局部对比度归一化确保对比度在每个小窗口上被归一化，而不是作为整体在图像上被归一化。\n关于局部对比度归一化和全局对比度归一化的比较可以参考\\fig?。\n<!-- % 444 -->\n<!-- % src0    gray0, gcn0?   lcn0   -->\n<!-- %    src1?  gcn1?  gray1?     lcn1   -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n    \\centering\n    \\begin{tabular}{ccc}\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gray0.jpg} &\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gcn0.jpg} &\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/lcn0.jpg} \\\\\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gray1.jpg} &   % ?? may be problem\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/gcn1.jpg} &\n        \\includegraphics[width=.3\\figwidth]{Chapter12/figures/lcn1.jpg}\\\\\n        Input image & GCN & LCN\n    \\end{tabular}\n\\fi\n\t\\caption{全局对比度归一化和局部对比度归一化的比较。直观上说，全局对比度归一化的效果很巧妙。它使得所有的图片的尺度都差不多，这减轻了学习算法处理多个尺度的负担。局部对比度归一化更多地改变了图像，丢弃了所有相同强度的区域。这使得模型能够只关注于边缘。较好的纹理区域，如第二行的屋子，可能会由于归一化核的过高带宽而丢失一些细节。}\n\\end{figure}\n\n局部对比度归一化的各种定义都是可行的。\n在所有情况下，我们可以通过减去邻近像素的平均值并除以邻近像素的标准差来修改每个像素。\n在一些情况下，要计算以当前要修改的像素为中心的矩形窗口中所有像素的平均值和标准差~{cite?}。\n在其他情况下，使用的则是以要修改的像素为中心的高斯权重的加权平均和加权标准差。\n在彩色图像的情况下，一些策略单独处理不同的颜色通道，而其他策略组合来自不同通道的信息以使每个像素归一化{cite?}。\n<!-- % 444 -->\n\n局部对比度归一化通常可以通过使用可分离卷积（参考\\sec?）来计算特征映射的局部平均值和局部标准差，然后在不同的特征映射上使用逐元素的减法和除法。\n<!-- % 444 -->\n\n局部对比度归一化是可微分的操作，并且还可以作为一种非线性作用应用于网络隐藏层，以及应用于输入的预处理操作。\n<!-- % 444 -->\n\n与全局对比度归一化一样，我们通常需要正则化局部对比度归一化来避免出现除以零的情况。\n事实上，因为局部对比度归一化通常作用于较小的窗口，所以正则化更加重要。\n较小的窗口更可能包含彼此几乎相同的值，因此更可能具有零标准差。\n<!-- % 445 -->\n\n\n\n## 数据集增强\n\n如\\sec?中讲到的一样，我们很容易通过增加训练集的额外副本来增加训练集的大小，进而改进分类器的泛化能力。\n这些额外副本可以通过对原始图像进行一些变化来生成，但是并不改变其类别。\n对象识别这个分类任务特别适合于这种形式的数据集增强，因为类别信息对于许多变换是不变的，而我们可以简单地对输入应用诸多几何变换。\n如前所述，分类器可以受益于随机转换或者旋转，某些情况下输入的翻转可以增强数据集。\n在专门的计算机视觉应用中，存在很多更高级的用以数据集增强的变换。\n这些方案包括图像中颜色的随机扰动~{cite?}，以及对输入的非线性几何变形~{cite?}。\n<!-- % 445 -->\n\n\n\n\n\n# 语音识别\n\n<!-- % 446 -->\n\n语音识别任务在于将一段包括了自然语言发音的声学信号投影到对应说话人的词序列上。\n令$\\MX=(\\Vx^{(1)},\\Vx^{(2)},\\ldots,\\Vx^{(T)})$表示语音的输入向量（传统做法以$20$ms为一帧分割信号）。\n许多语音识别的系统通过特殊的手工设计方法预处理输入信号，从而提取特征，但是某些深度学习系统{cite?}直接从原始输入中学习特征。\n令$\\Vy=(y_{1},y_{2},\\ldots,y_{N})$表示目标的输出序列（通常是一个词或者字符的序列）。\n自动语音识别任务指的是构造一个函数$f^*_{\\text{ASR}}$，使得它能够在给定声学序列$\\MX$的情况下计算最有可能的语言序列$\\Vy$：\n\\begin{align}\nf^*_{\\text{ASR}}(\\MX) =  \\underset{\\Vy}{\\arg\\max}  P^*(\\RVy \\mid \\RMX = \\MX),\n\\end{align}\n其中$P^*$是给定输入值$\\MX$时对应目标$\\Vy$的真实条件分布。\n<!-- % 446 -->\n\n从20世纪80年代直到约2009-2012年，最先进的语音识别系统是隐马尔可夫模型和高斯混合模型的结合。\nGMM~对声学特征和音素之间的关系建模{cite?}，HMM~对音素序列建模。\nGMM-HMM~模型将语音信号视作由如下过程生成：首先，一个~HMM~生成了一个音素的序列以及离散的子音素状态（比如每一个音素的开始，中间，结尾），然后~GMM~把每一个离散的状态转化为一个简短的声音信号。\n尽管直到最近~GMM-HMM~一直在~ASR~中占据主导地位，语音识别仍然是神经网络所成功应用的第一个领域。\n从20世纪80年代末期到90年代初期，大量语音识别系统使用了神经网络~{cite?}。\n当时，基于神经网络的~ASR~的表现和~GMM-HMM~系统的表现差不多。\n比如说，{Robinson+Fallside91}在TIMIT数据集{cite?}（有$39$个区分的音素% ?? error\n）上达到了$26$\\%的音素错误率，这个结果优于或者说是可以与基于~HMM~的结果相比。\n从那时起，TIMIT成为了音素识别的一个基准数据集，在语音识别中的作用就和MNIST在对象识别中的作用差不多。\n然而，由于语音识别软件系统中复杂的工程因素以及在基于~GMM-HMM~的系统中已经付出的巨大努力，工业界并没有迫切转向神经网络的需求。\n结果，直到21世纪00年代末期，学术界和工业界的研究者们更多的是用神经网络为~GMM-HMM~系统学习一些额外的特征。\n<!-- % 447 -->\n\n\n之后，随着\\emph{更大更深}的模型以及更大的数据集的出现，通过使用神经网络代替~GMM~来实现将声学特征转化为音素（或者子音素状态）的过程可以大大地提高识别的精度。\n从2009年开始，语音识别的研究者们将一种无监督学习的深度学习方法应用于语音识别。\n这种深度学习方法基于训练一个被称作是受限玻尔兹曼机的无向概率模型，从而对输入数据建模。\n 受限玻尔兹曼机将会在第三部分中描述。\n 为了完成语音识别任务，无监督的预训练被用来构造一个深度前馈网络，这个神经网络每一层都是通过训练受限玻尔兹曼机来初始化的。\n 这些网络的输入是从一个固定规格的输入窗（以当前帧为中心）的谱声学表示抽取，预测了当前帧所对应的~HMM~状态的条件概率。\n 训练一个这样的神经网络能够可以显著提高在TIMIT数据集上的识别率~{cite?}，并将音素级别的错误率从大约$26$\\%降到了$20.7$\\%。\n关于这个模型成功原因的详细分析可以参考{mohamed2012understanding}。\n对于基本的电话识别工作流程的一个扩展工作是添加说话人自适应相关特征{cite?}的方法，这可以进一步地降低错误率。\n紧接着的工作则将结构从音素识别（TIMIT所主要关注的）转向了大规模词汇语音识别{cite?}，这不仅包含了识别音素，还包括了识别大规模词汇的序列。\n语音识别上的深度网络从最初的使用受限玻尔兹曼机进行预训练发展到了使用诸如整流线性单元和~Dropout~这样的技术~{cite?}。\n从那时开始，工业界的几个语音研究组开始寻求与学术圈的研究者之间的合作。\n{Hinton-et-al-2012}描述了这些合作所带来的突破性进展，这些技术现在被广泛应用在产品中，比如移动手机端。\n<!-- % 447 -->\n\n随后，当研究组使用了越来越大的带标签的数据集，加入了各种初始化，训练方法以及调试深度神经网络的结构之后，\n他们发现这种无监督的预训练方式是没有必要的，或者说不能带来任何显著的改进。\n<!-- % 447 -->\n\n用语音识别中词错误率来衡量，在语音识别性能上的这些突破是史无前例的（大约$30$\\%的提高）。\n在这之前的长达十年左右的时间内，尽管数据集的规模是随时间增长的（见~{Deng+Yu-2014}的图2.4），但基于~GMM-HMM~的系统的传统技术已经停滞不前了。\n这也导致了语音识别领域快速地转向深度学习的研究。\n在大约的两年时间内，工业界的大多数的语音识别产品都包含了深度神经网络，这种成功也激发了~ASR领~域对深度学习算法和结构的一波新的研究浪潮，并且影响至今。\n<!-- % 448 -->\n\n其中的一个创新点是卷积网络的应用~{cite?}。\n卷积网络在时域与频域上复用了权重，改进了之前的仅在时域上使用重复权值的时延神经网络。\n这种新的二维的卷积模型并不是将输入的频谱当作一个长的向量，而是当成是一个图像，其中一个轴对应着时间，另一个轴对应的是谱分量的频率。\n<!-- % 448 -->\n\n完全抛弃~HMM~并转向研究端到端的深度学习语音识别系统是至今仍然活跃的另一个重要推动。\n这个领域第一个主要的突破是~{Graves-et-al-ICASSP2013}，其中训练了一个深度的长短期记忆循环神经网络（见\\sec?），使用了帧－音素排列的~MAP~推断，就像~{LeCun98-small}以及CTC框架~{cite?}中一样。\n一个深度循环神经网络~{cite?}每个时间步的各层都有状态变量，两种展开图的方式导致两种不同深度：一种是普通的根据层的堆叠衡量的深度，另一种根据时间展开衡量的深度。\n这个工作把TIMIT数据集上音素的错误率记录降到了的新低$17.7$\\%。\n关于应用于其他领域的深度循环神经网络的变种可以参考~{Pascanu-et-al-ICLR2014,Chung-et-al-NIPSDL2014-small}。\n<!-- % 448 -->\n\n另一个端到端的深度学习语音识别方向的最新方法是让系统学习如何利用语音层级的信息\"排列\"声学层级的信息~{cite?}。\n<!-- % 448 -->\n\n\n\n# 自然语言处理\n\n\n自然语言处理让计算机能够使用人类语言，例如英语或法语。\n为了让简单的程序能够高效明确地解析，计算机程序通常读取和发出特殊化的语言。\n而自然的语言通常是模糊的，并且可能不遵循形式的描述。\n自然语言处理中的应用如机器翻译，学习者需要读取一种人类语言的句子，并用另一种人类语言发出等同的句子。\n许多~NLP~应用程序基于语言模型，语言模型定义了关于自然语言中的字、字符或字节序列的概率分布。\n\n<!-- % -- 448 -- -->\n\n与本章讨论的其他应用一样，非常通用的神经网络技术可以成功地应用于自然语言处理。\n然而，为了实现卓越的性能并扩展到大型应用程序，一些领域特定的策略也很重要。\n为了构建自然语言的有效模型，通常必须使用专门处理序列数据的技术。\n在很多情况下，我们将自然语言视为一系列词，而不是单个字符或字节序列。\n因为可能的词总数非常大，基于词的语言模型必须在极高维度和稀疏的离散空间上操作。\n为使这种空间上的模型在计算和统计意义上都高效，研究者已经开发了几种策略。\n\n\n## $n$-gram\n\n\n语言模型定义了自然语言中标记序列的概率分布。\n根据模型的设计，标记可以是词、字符、甚至是字节。\n标记总是离散的实体。\n最早成功的语言模型基于固定长度序列的标记模型，称为~$n$-gram。\n一个~$n$-gram~是一个包含$n$个标记的序列。\n\n\n基于~$n$-gram~的模型定义一个条件概率——给定前$n-1$个标记后的第$n$个标记的条件概率。\n该模型使用这些条件分布的乘积定义较长序列的概率分布：\n\\begin{align}\nP(x_1, \\dots, x_\\tau) = P(x_1, \\dots, x_{n-1}) \\prod_{t=n}^\\tau P(x_t \\mid x_{t-n+1}, \\dots, x_{t-1} ).\n\\end{align}\n这个分解可以由概率的链式法则证明。\n初始序列 $P(x_1, \\dots, x_{n-1})$的概率分布可以通过带有较小$n$值的不同模型建模。\n\n训练~$n$-gram~模型是简单的，因为最大似然估计可以通过简单地统计每个可能的~$n$-gram~在训练集中出现的次数来获得。                                   \n几十年来，基于~$n$-gram~的模型都是统计语言模型的核心模块~{cite?}。\n\n对于小的$n$值，模型有特定的名称：$n=1$称为一元语法，$n=2$称为二元语法及$n=3$称为三元语法。\n这些名称源于相应数字的拉丁前缀和希腊后缀\"-gram\"，分别表示所写之物。\n\n<!-- % -- 449 -- -->\n\n通常我们同时训练~$n$-gram~模型和$n-1$ gram模型。 \n这使得下式可以简单地通过查找两个存储的概率来计算。\n\\begin{align}\nP(x_t \\mid x_{t-n+1}, \\dots, x_{t-1}) = \\frac{P_n(x_{t-n+1}, \\dots, x_t)} { P_{n-1}( x_{t-n+1}, \\dots, x_{t-1}) }\n\\end{align}\n为了在$P_n$中精确地再现推断，我们训练$P_{n-1}$时必须省略每个序列最后一个字符。\n\n举个例子，我们演示三元模型如何计算句子\"{\\tt THE DOG RAN AWAY}.\"的概率。\n句子的第一个词不能通过上述条件概率的公式计算，因为句子的开头没有上下文。\n取而代之，在句子的开头我们必须使用词的边缘概率。\n因此我们计算$P_3({\\tt THE\\ DOG\\ RAN})$。\n最后，可以使用条件分布$P({\\tt AWAY} \\mid {\\tt DOG\\ RAN})$（典型情况）来预测最后一个词。\n将这与\\eqn?放在一起，我们得到：\n\\begin{align}\nP({\\tt THE\\ DOG\\ RAN\\ AWAY}) = P_3({\\tt THE\\ DOG\\ RAN}) P_3({\\tt DOG\\ RAN\\ AWAY}) / P_2({\\tt DOG\\ RAN}).\n\\end{align}\n\n$n$-gram~模型最大似然的基本限制是，在许多情况下从训练集计数估计得到的$P_n$很可能为零（即使元组$(x_{t-n+1},  \\dots, x_{t})$可能出现在测试集中）。\n这可能会导致两种不同的灾难性后果。\n当$P_{n-1}$为零时，该比率是未定义的，因此模型甚至不能产生有意义的输出。\n当$P_{n-1}$非零而$P_n$为零时，测试样本的对数似然为 $-\\infty$。\n为避免这种灾难性的后果，大多数~$n$-gram~模型采用某种形式的平滑。\n平滑技术将概率质量从观察到的元组转移到类似的未观察到的元组。\n见~{Chen+Goodman99}的综述和实验对比。\n其中一种基本技术基于向所有可能的下一个符号值添加非零概率质量。\n这个方法可以被证明是，计数参数具有均匀或~Dirichlet~先验的贝叶斯推断。\n另一个非常流行的想法是包含高阶和低阶~$n$-gram~模型的混合模型，其中高阶模型提供更多的容量，而低阶模型尽可能地避免零计数。\n如果上下文$x_{t-n+k}, \\ldots, x_{t-1}$的频率太小而不能使用高阶模型，\\textbf{回退方法}(back-off methods)就查找低阶~$n$-gram 。\n更正式地说，它们通过上下文$x_{t-n+k}, \\ldots, x_{t-1}$估计$x_t$上的分布，并增加$k$直到找到足够可靠的估计。\n\n<!-- % -- \\450 -- -->\n\n经典的~$n$-gram~模型特别容易引起维数灾难。\n因为存在$|\\SetV|^n$可能的~$n$-gram，而且 $|\\SetV|$ 通常很大。\n即使有大量训练数据和适当的$n$，大多数~$n$-gram~也不会出现在训练集中。\n经典~$n$-gram~模型的一种观点是执行最近邻查询。\n换句话说，它可以被视为局部非参数预测器，类似于$k$-最近邻。\n这些极端局部预测器面临的统计问题已经在\\sec?中描述过。\n语言模型的问题甚至比普通模型更严重，因为任何两个不同的词在one-hot向量空间中的距离彼此相同。\n因此，难以大量利用来自任意\"邻居\"的信息 —— 只有重复相同上下文的训练样本对局部泛化有用。\n为了克服这些问题，语言模型必须能够在一个词和其他语义相似的词之间共享知识。\n\n为了提高~$n$-gram~模型的统计效率，\\textbf{基于类的语言模型}(class-based language model)~{cite?}引入词类别的概念，然后属于同一类别的词共享词之间的统计强度。\n这个想法使用了聚类算法，基于它们与其他词同时出现的频率，将该组词分成集群或类。\n随后，模型可以在条件竖杠的右侧使用词类ID而不是单个词ID。\n混合（或回退）词模型和类模型的复合模型也是可能的。\n尽管词类提供了在序列之间泛化的方式，但其中一些词被相同类的另一个替换，导致该表示丢失了很多信息。\n\n\n## 神经语言模型\n\n\n神经语言模型是一类用来克服维数灾难的语言模型，它使用词的分布式表示对自然语言序列建模~{cite?}。\n不同于基于类的~$n$-gram~模型，神经语言模型在能够识别两个相似的词，并且不丧失将每个词编码为彼此不同的能力。\n神经语言模型共享一个词（及其上下文）和其他类似词（和上下文之间）的统计强度。\n模型为每个词学习的分布式表示，允许模型处理具有类似共同特征的词来实现这种共享。\n例如，如果词{\\tt dog}和词{\\tt cat}映射到具有许多属性的表示，则包含词{\\tt cat}的句子可以告知模型对包含词{\\tt dog}的句子做出预测，反之亦然。\n因为这样的属性很多，所以存在许多泛化的方式，可以将信息从每个训练语句传递到指数数量的语义相关语句。\n维数灾难需要模型泛化到指数多的句子（指数相对句子长度而言）。\n该模型通过将每个训练句子与指数数量的类似句子相关联克服这个问题。\n\n<!-- % -- 451 -- -->\n\n我们有时将这些词表示称为词嵌入。\n在这个解释下，我们将原始符号视为维度等于词表大小的空间中的点。\n词表示将这些点嵌入到较低维的特征空间中。\n在原始空间中，每个词由一个one-hot向量表示，因此每对词彼此之间的欧氏距离都是$\\sqrt{2}$。\n在嵌入空间中，经常出现在类似上下文（或共享由模型学习的一些\"特征\"的任何词对）中的词彼此接近。\n这通常导致具有相似含义的词变得邻近。\n\\fig?放大了学到的词嵌入空间的特定区域，我们可以看到语义上相似的词如何映射到彼此接近的表示。\n\n\\begin{figure}[htp]\n\\centering\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\includegraphics{Chapter12/figures/word_embeddings_color.pdf}\n\\fi\n\\caption{从神经机器翻译模型获得的词嵌入的二维可视化{cite?}。\n此图在语义相关词的特定区域放大，它们具有彼此接近的嵌入向量。\n国家在左图，数字在右图。\n注意，这些嵌入是为了可视化才表示为2维。\n在实际应用中，嵌入通常具有更高的维度并且可以同时捕获词之间多种相似性。\n}\n\\end{figure}\n\n其他领域的神经网络也可以定义嵌入。\n例如，卷积网络的隐藏层提供\"图像嵌入\"。\n因为自然语言最初不在实值向量空间上，所以~NLP~从业者通常对嵌入的这个想法更感兴趣。\n隐藏层在表示数据的方式上提供了更质变的戏剧性变化。\n\n<!-- % -- 452 -- -->\n\n使用分布式表示来改进自然语言处理模型的基本思想不必局限于神经网络。\n它还可以用于图模型，其中分布式表示是多个潜变量的形式{cite?}。\n\n\n## 高维输出\n\n\n在许多自然语言应用中，我们通常希望我们的模型产生词（而不是字符）作为输出的基本单位。\n对于大词汇表，由于词汇量很大，在词的选择上表示输出分布的计算成本可能非常高。\n在许多应用中，$\\SetV$包含数十万词。\n表示这种分布的朴素方法是应用一个仿射变换，将隐藏表示转换到输出空间，然后应用~softmax~函数。\n假设我们的词汇表$\\SetV$大小为$| \\SetV |$。\n因为其输出维数为$| \\SetV |$，描述该仿射变换线性分量的权重矩阵非常大。\n这造成了表示该矩阵的高存储成本，以及与之相乘的高计算成本。\n因为~softmax~要在所有$| \\SetV |$输出之间归一化，所以在训练时以及测试时执行全矩阵乘法是必要的 ——我们不能仅计算与正确输出的权重向量的点积。\n因此，输出层的高计算成本在训练期间（计算似然性及其梯度）和测试期间（计算所有或所选词的概率）都有出现。\n对于专门的损失函数，可以有效地计算梯度 {cite?}，但是应用于传统~softmax~输出层的标准交叉熵损失时会出现许多困难。\n\n假设$\\Vh$是用于预测输出概率$\\hat \\Vy$的顶部隐藏层。\n如果我们使用学到的权重$\\MW$和学到的偏置 $\\Vb$参数化从$\\Vh$到$\\hat \\Vy$的变换，则仿射~softmax~输出层执行以下计算：\n\\begin{align}\n  a_i &= b_i + \\sum_j  W_{ij} h_j \\;\\;\\; \\forall i \\in \\{1,\\ldots,|\\SetV|\\}, \\\\\n  \\hat{y}_i &= \\frac{e^{a_i}}{\\sum_{i'=1}^{|\\SetV|} e^{a_{i'}}}.\n\\end{align}\n如果$\\Vh$包含$n_h$个元素，则上述操作复杂度是 $O(|\\SetV| n_h)$。\n在$n_h$为数千和$| \\SetV |$数十万的情况下，这个操作占据了神经语言模型的大多数计算。\n\n<!-- % -- 453 -- -->\n\n\\subsubsection{使用短列表}\n第一个神经语言模型~{cite?}通过将词汇量限制为10,000或20,000来减轻大词汇表上~softmax~的高成本。\n{Schwenk+Gauvain2002}和 {Schwenk-2007}在这种方法的基础上建立新的方式，将词汇表$\\SetV$分为最常见词汇（由神经网络处理）的短列表~$\\SetL$和较稀有词汇的尾列表$\\SetT = \\SetV \\backslash \\SetL$（由$n$-gram模型处理）。\n为了组合这两个预测，神经网络还必须预测在上下文$C$之后出现的词位于尾列表的概率。\n我们可以添加额外的~sigmoid~输出单元估计 $P(i \\in \\SetT \\mid C)$实现这个预测。\n额外输出则可以用来估计$\\SetV$中所有词的概率分布，如下：\n\\begin{align}\n P(y=i\\mid C)  =& 1_{i \\in \\SetL} P(y=i\\mid C, i \\in \\SetL) (1 - P(i \\in \\SetT\\mid C)) \\nonumber \\\\\n     & + 1_{i \\in \\SetT} P(y=i\\mid C, i \\in \\SetT) P(i \\in \\SetT\\mid C),\n\\end{align}\n其中$P(y=i\\mid C, i \\in \\SetL)$由神经语言模型提供$P(y=i\\mid C, i \\in \\SetT)$由~$n$-gram~模型提供。\n稍作修改，这种方法也可以在神经语言模型的~softmax~层中使用额外的输出值，而不是单独的~sigmoid~单元。\n\n短列表方法的一个明显缺点是，神经语言模型的潜在泛化优势仅限于最常用的词，这大概是最没用的。\n这个缺点引发了处理高维输出替代方法的探索，如下所述。\n\n\\subsubsection{分层Softmax}\n减少大词汇表$\\SetV$上高维输出层计算负担的经典方法~{cite?}是分层地分解概率。\n$|\\SetV|$因子可以降低到$\\log |\\SetV|$一样低，而无需执行与$|\\SetV|$成比例数量（并且也与隐藏单元数量$n_h$成比例）的计算。\n{BengioTR1215}和~{Morin+Bengio-2005-small} 将这种因子分解方法引入神经语言模型中。\n\n<!-- % -- 454 -- -->\n\n我们可以认为这种层次结构是先建立词的类别，然后是词类别的类别，然后是词类别的类别的类别等等。\n这些嵌套类别构成一棵树，其叶子为词。\n在平衡树中，树的深度为$\\log |\\SetV|$。\n选择一个词的概率是由路径（从树根到包含该词叶子的路径）上的每个节点通向该词分支概率的乘积给出。\n\\fig?是一个简单的例子。\n{Mnih+Hinton-2009}也描述了使用多个路径来识别单个词的方法，以便更好地建模具有多个含义的词。\n计算词的概率则涉及在导向该词所有路径上的求和。\n\\begin{figure}[htp]\n\\centering\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\includegraphics{Chapter12/figures/word_hierarchy.pdf}\n\\fi\n<!-- % Magic incantation to allow math in caption -->\n\\captionsetup{singlelinecheck=off}\n<!-- % Part of the incantation is that we must define the [] argument -->\n\\caption[.]{词类别简单层次结构的示意图，其中8个词$w_0,\\dots,w_7$组织成三级层次结构。\n树的叶子表示实际特定的词。\n内部节点表示词的组别。\n任何节点都可以通过二值决策序列（$0$=左，$1$=右）索引，从根到达节点。\n超类$(0)$包含类$(0,0)$和$(0,1)$，其中分别包含词$\\{w_0,w_1\\}$和$\\{w_2,w_3\\}$的集合，类似地超类$(1)$包含类$(1,0)$和$(1,1)$，分别包含词$\\{w_4,w_5\\}$和$\\{w_6,w_7\\}$。\n如果树充分平衡，则最大深度（二值决策的数量）与词数$| \\SetV |$的对数同阶：从$| \\SetV |$个词中选一个词只需执行$\\CalO(\\log |\\SetV|)$次操作（从根开始的路径上的每个节点一次操作）。\n在该示例中，我们乘三次概率就能计算词$y$的概率，这三次概率与从根到节点$y$的路径上每个节点向左或向右的二值决策相关联。\n令$b_i(y)$为遍历树移向$y$时的第$i$个二值决策。\n对输出$\\RSy$进行采样的概率可以通过条件概率的链式法则分解为条件概率的乘积，其中每个节点由这些位的前缀索引。\n例如，节点$(1,0)$对应于前缀$(b_0(w_4)=1, b_1(w_4)=0)$，并且$w_4$的概率可以如下分解：\n\\begin{align}\n  P(\\RSy = w_4) &= P(\\RSb_0 = 1, \\RSb_1 = 0, \\RSb_2 = 0) \\\\\n    &= P(\\RSb_0 = 1) P(\\RSb_1 = 0 \\mid \\RSb_0 = 1) P(\\RSb_2 = 0 \\mid \\RSb_0 = 1, \\RSb_1 = 0). \n\\end{align}\n}\n\\end{figure}\n\n为了预测树的每个节点所需的条件概率，我们通常在树的每个节点处使用逻辑回归模型，并且为所有这些模型提供与输入相同的上下文$C$。\n因为正确的输出编码在训练集中，我们可以使用监督学习训练逻辑回归模型。\n我们通常使用标准交叉熵损失，对应于最大化正确判断序列的对数似然。\n\n因为可以高效地计算输出对数似然（低至$\\log |\\SetV|$而不是$ |\\SetV|$），所以也可以高效地计算梯度。\n这不仅包括关于输出参数的梯度，而且还包括关于隐藏层激活的梯度。\n\n优化树结构最小化期望的计算数量是可能的，但通常不切实际。\n给定词的相对频率，信息理论的工具可以指定如何选择最佳的二进制编码。\n为此，我们可以构造树，使得与词相关联的位数量近似等于该词频率的对数。\n然而在实践中，节省计算通常事倍功半，因为输出概率的计算仅是神经语言模型中总计算的一部分。\n例如，假设有$l$个全连接的宽度为$n_h$的隐藏层。\n令$n_b$是识别一个词所需比特数的加权平均值，其加权由这些词的频率给出。\n在这个例子中，计算隐藏激活所需的操作数增长为$O(ln_h^2)$，而输出计算增长为$O(n_h n_b)$。\n只要$ n_b \\leq l n_h$，我们可以通过收缩$n_h$比收缩$n_b$减少更多的计算量。\n事实上，$n_b$通常很小。\n因为词汇表的大小很少超过一百万而$\\log_ 2(10^6) \\approx 20$，所以可以将$n_b$减小到大约20，但$n_h$通常大得多，大约为$10^3$或更大。\n我们可以定义深度为2和分支因子为$\\sqrt{|\\SetT|}$的树，而不用仔细优化分支因子为$2$的树。\n这样的树对应于简单定义一组互斥的词类。\n基于深度为$2$的树的简单方法可以获得层级策略大部分的计算益处。\n\n<!-- % -- 455 -- -->\n\n一个仍然有点开放的问题是如何最好地定义这些词类，或者如何定义一般的词层次结构。\n早期工作使用现有的层次结构{cite?} ，但也可以理想地与神经语言模型联合学习层次结构。\n学习层次结构很困难。\n对数似然的精确优化似乎难以解决，因为词层次的选择是离散的，不适于基于梯度的优化。\n然而，我们可以使用离散优化来近似地最优化词类的分割。\n\n分层~softmax~的一个重要优点是，它在训练期间和测试期间（如果在测试时我们想计算特定词的概率）都带来了计算上的好处。\n\n当然即使使用分层~softmax，计算所有$|\\SetV|$个词概率的成本仍是很高的。\n另一个重要的操作是在给定上下文中选择最可能的词。\n不幸的是，树结构不能为这个问题提供高效精确的解决方案。\n\n缺点是在实践中，分层~softmax~倾向于更差的测试结果（相对基于采样的方法），我们将在下文描述。\n这可能是因为词类选择得不好。\n\n\\subsubsection{重要采样}\n加速神经语言模型训练的一种方式是，避免明确地计算所有未出现在下一位置的词对梯度的贡献。\n每个不正确的词在此模型下具有低概率。\n枚举所有这些词的计算成本可能会很高。\n相反，我们可以仅采样词的子集。\n使用\\eqn?中引入的符号，梯度可以写成如下形式：\n\\begin{align}\n \\frac{\\partial \\log P(y \\mid C)}{\\partial \\theta} &= \\frac{\\partial \\log {\\rm softmax}_y(\\Va)}{\\partial \\theta} \\\\ \n  &= \\frac{\\partial}{\\partial \\theta} \\log \\frac{e^{a_y}}{\\sum_i e^{a_i}} \\\\ \n &= \\frac{\\partial}{\\partial \\theta} (a_y - \\log \\sum_i e^{a_i}) \\\\ \n &= \\frac{\\partial a_y}{\\partial \\theta}  - \\sum_i P(y = i \\mid C) \\frac{\\partial a_i}{\\partial \\theta},\n\\end{align}\n其中$\\Va$是~presoftmax~激活（或得分）向量，每个词对应一个元素。\n第一项是\\textbf{正相}(positive phase)项，推动$a_y$向上；而第二项是\\textbf{负相}(negative phase)项，对于所有$i$以权重$P(i \\mid C)$推动$a_i$向下。\n由于负相项是期望值，我们可以通过蒙特卡罗采样估计。\n然而，这将需要从模型本身采样。\n从模型中采样需要对词汇表中所有的$i$计算$P(i \\mid C)$，这正是我们试图避免的。\n\n我们可以从另一个分布中采样，而不是从模型中采样，这个分布称为提议分布（记为$q$），并通过适当的权重校正从错误分布采样引入的偏差 {cite?}。\n这是一种称为重要采样的更通用技术的应用，我们将在\\sec?中更详细地描述。\n不幸的是，即使精确重要采样也不一定有效，因为我们需要计算权重$p_i / q_i$，其中的$p_i = P(i \\mid C)$只能在计算所有得分$a_i$后才能计算。\n这个应用采取的解决方案称为有偏重要采样，其中重要性权重被归一化加和为1。\n当对负词$n_i$进行采样时，相关联的梯度被加权为：\n\\begin{align}\n  w_i = \\frac{p_{n_i} / q_{n_i}}{\\sum_{j=1}^N p_{n_j} / q_{n_j}}.\n\\end{align}\n这些权重用于对来自$q$的$m$个负样本给出适当的重要性，以形成负相估计对梯度的贡献：\n\\begin{align}\n  \\sum_{i=1}^{|\\SetV|} P(i \\mid C) \\frac{\\partial a_i}{\\partial \\theta}  \\approx \\frac{1}{m} \\sum_{i=1}^m w_i \\frac{\\partial a_{n_i}}{\\partial \\theta}.\n  \\end{align}\n  一元语法或二元语法分布与提议分布 $q$工作得一样好。\n从数据估计这种分布的参数是很容易。\n在估计参数之后，也可以非常高效地从这样的分布采样。\n\n重要采样不仅可以加速具有较大~softmax~输出的模型。\n更一般地，它可以加速具有大稀疏输出层的训练，其中输出是稀疏向量而不是$n$选$1$。\n其中一个例子是词袋。\n词袋具有稀疏向量$\\Vv$，其中$v_i$表示词汇表中的词$i$存不存在文档中。\n或者，$v_i$可以指示词$i$出现的次数。\n由于各种原因，训练产生这种稀疏向量的机器学习模型的成本可能很高。\n在学习的早期，模型可能不会真的使输出真正稀疏。\n此外，将输出的每个元素与目标的每个元素进行比较，可能是描述训练的损失函数最自然的方式。\n这意味着稀疏输出并不一定能带来计算上的好处，因为模型可以选择使大多数输出非零，并且所有这些非零值需要与相应的训练目标进行比较（ 即使训练目标是零）。\n{Dauphin2011-small} 证明可以使用重要采样加速这种模型。\n高效算法最小化\"正词\"（在目标中非零的那些词）和相等数量的\"负词\"的重构损失。\n负词是被随机选取的，如使用启发式采样更可能被误解的词。\n该启发式过采样引入的偏差则可以使用重要性权重校正。\n\n<!-- % -- 458 -- -->\n\n在所有这些情况下，输出层梯度估计的计算复杂度被减少为与负样本数量成比例，而不是与输出向量的大小成比例。\n\n\n\\subsubsection{噪声对比估计和排名损失}\n\n\n为减少训练大词汇表的神经语言模型的计算成本，研究者也提出了其他基于采样的方法。\n早期的例子是 {Collobert+Weston-ICML2008}提出的排名损失，将神经语言模型每个词的输出视为一个得分，并试图使正确词的得分$a_y$比其他词$a_i$排名更高。提出的排名损失则是\n\\begin{align} \n L = \\sum_i \\max(0,1-a_y+a_i).\n\\end{align} \n如果观察到词的得分$a_y$远超过负词的得分$a_i$（相差大于1），则第$i$项梯度为零。\n这个准则的一个问题是它不提供估计的条件概率，条件概率在很多应用中是有用的，包括语音识别和文本生成（包括诸如翻译的条件文本生成任务）。\n\n最近用于神经语言模型的训练目标是噪声对比估计，将在\\sec?中介绍。\n这种方法已成功应用于神经语言模型~{cite?}。\n\n<!-- % -- 459 -- -->\n\n\n## 结合$n$-gram和神经语言模型\n\n$n$-gram~模型相对神经网络的主要优点是~$n$-gram~模型具有更高的模型容量（通过存储非常多的元组的频率），并且处理样本只需非常少的计算量（通过查找只匹配当前上下文的几个元组）。\n如果我们使用哈希表或树来访问计数，那么用于~$n$-gram~的计算量几乎与容量无关。\n相比之下，将神经网络的参数数目加倍通常也大致加倍计算时间。\n当然，避免每次计算时使用所有参数的模型是一个例外。\n嵌入层每次只索引单个嵌入，所以我们可以增加词汇量，而不会增加每个样本的计算时间。\n一些其他模型，例如平铺卷积网络，可以在减少参数共享程度的同时添加参数以保持相同的计算量。然而，基于矩阵乘法的典型神经网络层需要与参数数量成比例的计算量。\n\n因此，增加容量的一种简单方法是将两种方法结合，由神经语言模型和~$n$-gram~语言模型组成集成~{cite?}。\n\n对于任何集成，如果集成成员产生独立的错误，这种技术可以减少测试误差。\n集成学习领域提供了许多方法来组合集成成员的预测，包括统一加权和在验证集上选择权重。\n{Mikolov-Interspeech-2011} 扩展了集成，不是仅包括两个模型，而是包括大量模型。\n我们也可以将神经网络与最大熵模型配对并联合训练{cite?}。\n该方法可以被视为训练具有一组额外输入的神经网络，额外输入直接连接到输出并且不连接到模型的任何其他部分。\n额外输入是输入上下文中特定~$n$-gram~是否存在的指示器，因此这些变量是非常高维且非常稀疏的。\n\n模型容量的增加是巨大的 （架构的新部分包含高达$| sV |^n$个参数 ），但是处理输入所需的额外计算量是很小的（因为额外输入非常稀疏）。\n\n\n## 神经机器翻译\n\n\n机器翻译以一种自然语言读取句子并产生等同含义的另一种语言的句子。\n机器翻译系统通常涉及许多组件。\n在高层次，一个组件通常会提出许多候选翻译。\n由于语言之间的差异，这些翻译中的许多翻译是不符合语法的。\n例如，许多语言在名词后放置形容词，因此直接翻译成英语时，它们会产生诸如\"apple red\"的短语。\n提议机制提出建议翻译的许多变体，理想情况下应包括\"red apple\"。\n翻译系统的第二个组成部分（语言模型）评估提议的翻译，并可以评估\"red apple\"比\"apple red\"更好。\n\n<!-- % -- 460 -- -->\n\n最早的机器翻译神经网络探索中已经纳入了编码器和解码器的想法(Allen 1987; Chrisman 1991; Forcada\nand Ñeco 1997)，而翻译中神经网络的第一个大规模有竞争力的用途是通过神经语言模型升级翻译系统的语言模型~{cite?}。\n之前，大多数机器翻译系统在该组件使用~$n$-gram~模型。\n机器翻译中基于~$n$-gram~的模型不仅包括传统的回退~$n$-gram~模型~{cite?}，而且包括\\textbf{最大熵语言模型}(maximum entropy language models)~{cite?}，其中给定上下文中常见的词，affine-softmax层预测下一个词。\n\n传统语言模型仅仅报告自然语言句子的概率。\n因为机器翻译涉及给定输入句子产生输出句子，所以将自然语言模型扩展为条件的是有意义的。\n如\\sec?所述可以直接地扩展一个模型，该模型定义某些变量的边缘分布，以便在给定上下文$C$（$C$可以是单个变量或变量列表）的情况下定义该变量的条件分布。\n{Devlin-et-al-ACL2014}在一些统计机器翻译的基准中击败了最先进的技术，他给定源语言中的短语$\\RSs_1, \\RSs_2,\\ldots, \\RSs_k$后使用~MLP~对目标语言的短语$\\RSt_1, \\RSt_2,\\ldots, \\RSt_k$进行评分。\n这个~MLP~估计$P(\\RSt_1, \\RSt_2,\\ldots, \\RSt_k \\mid \\RSs_1, \\RSs_2,\\ldots, \\RSs_k)$。\n这个~MLP~的估计替代了条件~$n$-gram~模型提供的估计。\n\n基于~MLP~方法的缺点是需要将序列预处理为固定长度。\n为了使翻译更加灵活，我们希望模型允许可变的输入长度和输出长度。\nRNN~具备这种能力。\n\\sec?描述了给定某些输入后，关于序列条件分布~RNN~的几种构造方法，并且\\sec?描述了当输入是序列时如何实现这种条件分布。\n在所有情况下，一个模型首先读取输入序列并产生概括输入序列的数据结构。我们称这个概括为\"上下文\"~$C$。\n上下文$C$可以是向量列表，或者向量或张量。\n读取输入以产生$C$的模型可以是~RNN~{cite?}或卷积网络~{cite?}。\n另一个模型（通常是RNN），则读取上下文$C$并且生成目标语言的句子。\n在\\fig?中展示了这种用于机器翻译的编码器-解码器框架的总体思想。\n\n<!-- % -- 461 -- -->\n\n\\begin{figure}[htp]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter12/figures/encoder_decoder_architecture.pdf}}\n\\fi\n\\caption{编码器-解码器架构在直观表示（例如词序列或图像）和语义表示之间来回映射。\n使用来自一种模态数据的编码器输出（例如从法语句子到捕获句子含义的隐藏表示的编码器映射）作为用于另一模态的解码器输入（如解码器将捕获句子含义的隐藏表示映射到英语），我们可以训练将一种模态转换到另一种模态的系统。\n这个想法已经成功应用于很多领域，不仅仅是机器翻译，还包括为图像生成标题。\n}\n\\end{figure}\n\n为生成以源句为条件的整句，模型必须具有表示整个源句的方式。 \n早期模型只能表示单个词或短语。\n从表示学习的观点来看，具有相同含义的句子具有类似表示是有用的，无论它们是以源语言还是以目标语言书写。\n研究者首先使用卷积和~RNN~的组合探索该策略~{cite?}。\n后来的工作介绍了使用~RNN~对所提议的翻译进行打分{cite?}或生成翻译句子{cite?}。\n{Jean-et-al-arxiv2014}将这些模型扩展到更大的词汇表。\n\n<!-- % -- 462 -- -->\n\n\\subsubsection{使用注意力机制并对齐数据片段}\n使用固定大小的表示概括非常长的句子（例如60个词）的所有语义细节是非常困难的。 \n这需要使用足够大的RNN，并且用足够长时间训练得很好才能实现，如 {Cho-et-al-EMNLP2014}和{Sutskever-et-al-NIPS2014}所表明的。\n然而，更高效的方法是先读取整个句子或段落（以获得正在表达的上下文和焦点），然后一次翻译一个词，每次聚焦于输入句子的不同部分来收集产生下一个输出词所需的语义细节。\n这正是~{Bahdanau-et-al-ICLR2015-small}第一次引入的想法。\n\\fig?中展示了注意力机制，其中每个时间步关注输入序列的特定部分。\n\n \\begin{figure}[htp]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter12/figures/attention.pdf}}\n\\fi\n\\caption{由~{Bahdanau-et-al-ICLR2015-small}引入的现代注意力机制，本质上是加权平均。\n注意力机制对具有权重$\\alpha^{(t)}$的特征向量$\\Vh^{(t)}$进行加权平均形成上下文向量$\\Vc$。\n在一些应用中，特征向量$\\Vh$是神经网络的隐藏单元，但它们也可以是模型的原始输入。\n权重$\\alpha^{(t)}$由模型本身产生。\n它们通常是区间$[0,1]$中的值，并且旨在仅仅集中在单个$\\Vh^{(t)}$周围，使得加权平均精确地读取接近一个特定时间步的特征向量。\n权重$\\alpha^{(t)}$通常由模型另一部分发出的相关性得分应用softmax函数后产生。\n注意力机制在计算上需要比直接索引期望的$\\Vh^{(t)}$付出更高的代价，但直接索引不能使用梯度下降训练。\n基于加权平均的注意力机制是平滑、可微的近似，可以使用现有优化算法训练。\n}\n\\end{figure}\n\n我们可以认为基于注意力机制的系统有三个组件：\n\n+   读取器\\emph{读取}原始数据（例如源语句中的源词）并将其转换为分布式表示，其中一个特征向量与每个词的位置相关联。\n+ 存储器存储读取器输出的特征向量列表。这可以被理解为包含事实序列的\\emph{存储器}，而之后不必以相同的顺序从中检索，也不必访问全部。\n+ 最后一个程序\\emph{利用}存储器的内容顺序地执行任务，每个时间步聚焦于某个存储器元素的内容（或几个，具有不同权重）。\n\n第三组件可以生成翻译语句。\n\n<!-- % -- 463 -- -->\n\n当用一种语言书写的句子中的词与另一种语言的翻译语句中的相应词对齐时，可以使对应的词嵌入相关联。\n早期的工作表明，我们可以学习将一种语言中的词嵌入与另一种语言中的词嵌入相关联的翻译矩阵{cite?}，与传统的基于短语表中频率计数的方法相比，可以产生较低的对齐错误率。\n更早的工作{cite?}也对跨语言词向量进行了研究。 \n这种方法存在很多的扩展。\n例如，允许在更大数据集上训练的更高效的跨语言对齐~{cite?} 。\n\n\n## 历史展望\n\n\n在对反向传播的第一次探索中，{Rumelhart86b-small}等人提出了分布式表示符号的思想，其中符号对应于族成员的身份，而神经网络捕获族成员之间的关系，训练样本形成三元组如（Colin，Mother，Victoria）。\n神经网络的第一层学习每个族成员的表示。例如，Colin的特征可能代表Colin所在的族树，他所在树的分支，他来自哪一代等等。\n我们可以将神经网络认为是将这些属性关联在一起的计算学习规则，可以获得期望预测。\n模型则可以进行预测，例如推断谁是Colin的母亲。\n\n{Deerwester90}将符号嵌入的想法扩展到对词的嵌入。\n这些嵌入使用SVD学习。 \n之后，嵌入将通过神经网络学习。\n\n自然语言处理的历史是由流行表示（对模型输入不同方式的表示）的变化为标志的。\n在早期对符号和词建模的工作之后，神经网络在NLP上一些最早的应用{cite?}将输入表示为字符序列。\n\n{BenDucVin01-small} 将焦点重新引到对词建模并引入神经语言模型，能产生可解释的词嵌入。\n这些神经模型已经从在一小组符号上的定义表示（20世纪80年代）扩展到现代应用中的数百万字（包括专有名词和拼写错误）。\n这种计算扩展的努力导致了\\sec?中描述的技术发明。\n\n<!-- % -- 464 -- -->\n\n最初，使用词作为语言模型的基本单元可以改进语言建模的性能 {cite?}。\n而今，新技术不断推动基于字符 {cite?}）和基于词的模型向前发展，最近的工作 {cite?}甚至建模Unicode字符的单个字节。\n\n神经语言模型背后的思想已经扩展到多个自然语言处理应用，如解析{cite?}、词性标注、语义角色标注、分块等，有时使用共享词嵌入的单一多任务学习架构{cite?}。\n\n随着t-SNE~降维算法的发展{cite?}以及Joseph Turian在2009年引入的专用于可视化词嵌入的应用，用于分析语言模型嵌入的二维可视化成为一种流行的工具。\n\n\n# 其他应用\n\n\n在本节中，我们介绍深度学习一些其他类型的应用，它们与上面讨论的标准对象识别、语音识别和自然语言处理任务不同。\n本书的第三部分将扩大这个范围，甚至进一步扩展到仍是目前主要研究领域的任务。\n\n\n\n## 推荐系统\n\n信息技术部门中机器学习的主要应用之一是向潜在用户或客户推荐项目。\n这可以分为两种主要的应用：在线广告和项目建议（通常这些建议的目的仍然是为了销售产品）。\n两者都依赖于预测用户和项目之间的关联， 一旦向该用户展示了广告或推荐了该产品，推荐系统要么预测一些行为的概率（用户购买产品或该行为的一些代替）或预期增益（其可取决于产品的价值）。\n目前，互联网的资金主要来自于各种形式的在线广告。\n经济的主要部分依靠网上购物。 \n包括Amazon和eBay在内的公司都使用了机器学习（包括深度学习）推荐他们的产品。\n有时，项目不是实际出售的产品。\n如选择在社交网络新闻信息流上显示的帖子、推荐观看的电影、推荐笑话、推荐专家建议、匹配视频游戏的玩家或匹配约会的人。\n\n<!-- % -- 465 -- -->\n通常，这种关联问题可以作为监督学习问题来处理：给出一些关于项目和关于用户的信息，预测感兴趣的行为（用户点击广告、输入评级、点击\"喜欢\"按钮、 购买产品，在产品上花钱、花时间访问产品页面等）。\n通常这最终会归结到回归问题（预测一些条件期望值）或概率分类问题（预测一些离散事件的条件概率）。\n\n早期推荐系统的工作依赖于这些预测输入的最小信息：用户ID和项目ID。\n在这种情况下，唯一的泛化方式依赖于不同用户或不同项目的目标变量值之间的模式相似性。\n假设用户1和用户2都喜欢项目A，B和C.\n由此，我们可以推断出用户1和用户2具有类似的口味。\n如果用户1喜欢项目D，那么这可以强烈提示用户2也喜欢D。\n基于此原理的算法称为协同过滤。\n非参数方法（例如基于估计偏好模式之间相似性的最近邻方法）和参数方法都可能用来解决这个问题。\n参数方法通常依赖于为每个用户和每个项目学习分布式表示（也称为嵌入）。\n目标变量的双线性预测（例如评级）是一种简单的参数方法，这种方法非常成功，通常被认为是最先进系统的组成部分。\n通过用户嵌入和项目嵌入之间的点积（可能需要使用仅依赖于用户ID或项目ID的常数来校正）获得预测。\n令$\\hat{\\MR}$是包含我们预测的矩阵，$\\MA$矩阵行中是用户嵌入，$\\MB$矩阵列中具有项目嵌入。\n令$\\Vb$和$\\Vc$是分别包含针对每个用户（表示用户平常坏脾气或积极的程度）以及每个项目（表示其大体受欢迎程度）的偏置向量。\n因此，双线性预测如下获得：\n\\begin{equation}\n \\hat{R}_{u,i} = b_u + c_i + \\sum_j A_{u,j} B_{j,i}.\n\\end{equation}\n通常，人们希望最小化预测评级$\\hat{R}_{u,i}$ 和实际评级${R}_{u,i}$ 之间的平方误差。\n当用户嵌入和项目嵌入首次缩小到低维度（两个或三个）时，它们就可以方便地可视化，或者可以将用户或项目彼此进行比较（就像词嵌入）。\n获得这些嵌入的一种方式是对实际目标（例如评级）的矩阵$\\MR$进行奇异值分解。\n这对应于将$\\MR = \\MU \\MD \\MV'$（或归一化的变体）分解为两个因子的乘积，低秩矩阵 $\\MA=\\MU \\MD$ 和 $\\MB = \\MV'$。\nSVD的一个问题是它以任意方式处理缺失条目，如同它们对应于目标值0。\n相反，我们希望避免为缺失条目做出的预测付出任何代价。\n幸运的是，观察到的评级的平方误差总和也可以使用基于梯度的优化最小化。\nSVD~和\\eqn?中的双线性预测在~Netflix~奖竞赛中（目的是仅基于大量匿名用户的之前评级预测电影的评级）表现得非常好{cite?}。\n许多机器学习专家参加了2006年和2009年之间的这场比赛。\n它提高了使用先进机器学习的推荐系统的研究水平，并改进了推荐系统。\n即使简单的双线性预测或~SVD~本身并没有赢得比赛，但它是大多数竞争对手提出的整体模型中一个组成部分，包括胜者{cite?}。\n\n<!-- % -- 466 -- -->\n\n除了这些具有分布式表示的双线性模型之外，第一次用于协同过滤的神经网络之一是基于~RBM~的无向概率模型~{cite?}。\nRBM~是~Netflix~比赛获胜方法的一个重要组成部分{cite?}。\n神经网络社群中也已经探索了对评级矩阵进行因子分解的更高级变体{cite?}。\n\n然而，协同过滤系统有一个基本限制：当引入新项目或新用户时，缺乏评级历史意味着无法评估其与其他项目或用户的相似性，或者说无法评估新的用户和现有项目的联系。\n这被称为冷启动推荐问题。\n解决冷启动推荐问题的一般方式是引入单个用户和项目的额外信息。\n例如，该额外信息可以是用户简要信息或每个项目的特征。\n使用这种信息的系统被称为\\,\\textbf{基于内容的推荐系统}(content-based recommender system)。\n从丰富的用户特征或项目特征集到嵌入的映射可以通过深度学习架构学习{cite?}。\n\n专用的深度学习架构，如卷积网络已经应用于从丰富内容中提取特征，如提取用于音乐推荐的音乐音轨{cite?}。\n在该工作中，卷积网络将声学特征作为输入并计算相关歌曲的嵌入。\n该歌曲嵌入和用户嵌入之间的点积则可以预测用户是否将收听该歌曲。\n\n<!-- % -- 467 -- -->\n\n\\subsubsection{探索与利用}\n当向用户推荐时，会产生超出普通监督学习范围的问题，并进入强化学习的领域。\n理论上，许多推荐问题最准确的描述是contextual bandit {cite?}。\n问题是，当我们使用推荐系统收集数据时，我们得到是一个有偏且不完整的用户偏好观：我们只能看到用户对推荐给他们项目的反应，而不是其他项目。\n此外，在某些情况下，我们可能无法获得未向其进行推荐的用户的任何信息（例如，在广告竞价中，可能是广告的建议价格低于最低价格阈值，或者没有赢得竞价，因此广告不会显示）。\n更重要的是，我们不知道推荐任何其他项目会产生什么结果。\n这就像训练一个分类器，为每个训练样本$\\Vx$挑选一个类别$\\hat y$（通常是基于模型最高概率的类别），然后只能获得该类别正确与否的反馈。\n显然，每个样本传达的信息少于监督的情况（其中真实标签$y$是可直接访问的），因此需要更多的样本。\n更糟糕的是，如果我们不够小心，即使收集越来越多的数据，我们得到的系统可能会继续选择错误的决定，因为正确的决定最初只有很低的概率：直到学习者选择正确的决定之前，该系统都无法学习正确的决定。\n这类似于强化学习的情况，其中仅观察到所选动作的奖励。\n一般来说，强化学习会涉及许多动作和许多奖励的序列。\nbandit ~情景是强化学习的特殊情况，其中学习者仅采取单一动作并接收单个奖励。\nbandit ~问题在学习者知道哪个奖励与哪个动作相关联的时候，是更容易的。\n在一般的强化学习场景中，高奖励或低奖励可能是由最近的动作或很久以前的动作引起的。\n术语contextual bandit 指的是在一些输入变量可以通知决定的上下文中采取动作的情况。\n例如，我们至少知道用户身份，并且我们要选择一个项目。\n从上下文到动作的映射也称为策略。\n学习者和数据分布（现在取决于学习者的动作）之间的反馈循环是强化学习和bandit 研究的中心问题。\n\n<!-- % -- 468 -- -->\n\n强化学习需要权衡探索与利用。\n利用指的是从目前学到的最好策略采取动作，也就是我们所知的将获得高奖励的动作。\n探索是指采取行动以获得更多的训练数据。\n如果我们知道给定上下文$\\Vx$，动作$a$给予我们1的奖励，但我们不知道这是否是最好的奖励。\n我们可能想利用我们目前的策略，并继续采取行动$a$相对肯定地获得1的奖励。\n然而，我们也可能想通过尝试动作$a'$来探索。\n我们不知道尝试动作$a'$会发生什么。\n我们希望得到2的奖励，但有获得0奖励的风险。\n无论如何，我们至少获得了一些知识。\n\n探索可以以许多方式实现，从覆盖可能动作的整个空间的随机动作到基于模型的方法（基于预期回报和模型对该回报不确定性的量来计算动作的选择）。\n\n许多因素决定了我们喜欢探索或利用的程度。\n最突出的因素之一是我们感兴趣的时间尺度。\n如果代理只有短暂的时间积累奖励，那么我们喜欢更多的利用。\n如果代理有很长时间积累奖励，那么我们开始更多的探索，以便使用更多的知识更有效地规划未来的动作。\n\n监督学习在探索或利用之间没有权衡，因为监督信号总是指定哪个输出对于每个输入是正确的。\n我们总是知道标签是最好的输出，没有必要尝试不同的输出来确定是否优于模型当前的输出 。\n\n除了权衡探索和利用之外，强化学习背景下出现的另一个困难是难以评估和比较不同的策略。\n强化学习包括学习者和环境之间的相互作用。\n这个反馈回路意味着使用固定的测试集输入评估学习者的表现不是直接的。\n策略本身确定将看到哪些输入。\n{Dudik-2011} 提出了评估contextual bandit 的技术。\n\n<!-- % -- 469 -- -->\n\n\n## 知识表示、推理和回答\n\n因为使用符号{cite?}和词嵌入{cite?}，深度学习方法在语言模型、机器翻译和自然语言处理方面非常成功。\n这些嵌入表示关于单个词或概念的语义知识。\n研究前沿是为短语或词和事实之间的关系开发嵌入。\n搜索引擎已经使用机器学习来实现这一目的，但是要改进这些更高级的表示还有许多工作要做。\n\n\\subsubsection{知识、联系和回答}\n一个有趣的研究方向是确定如何训练分布式表示才能捕获两个实体之间的关系。\n\n数学中，二元关系是一组有序的对象对。\n集合中的对具有这种关系，而那些不在集合中的对则没有。\n例如，我们可以在实体集$\\{ 1, 2, 3 \\}$上定义关系\"小于\"来定义有序对的集合$\\SetS = \\{ (1, 2), (1, 3), (2, 3) \\}$。\n一旦这个关系被定义，我们可以像动词一样使用它。\n因为$(1, 2) \\in \\SetS$，我们说1小于2。\n因为$(2, 1) \\not \\in \\SetS$，我们不能说2小于1。\n当然，彼此相关的实体不必是数字。\n我们可以定义关系{\\tt is\\_a\\_type\\_of}包含如{\\tt（狗，哺乳动物）}的元组。\n\n在~AI~的背景下，我们将关系看作句法上简单且高度结构化的语言。\n关系起到动词的作用，而关系的两个参数发挥着主体和客体的作用。\n这些句子是一个三元组标记的形式：\n\\begin{align}\n({\\rm subject}, {\\rm verb}, {\\rm object})\n\\end{align}\n其值是\n\\begin{align}\n  ({\\rm entity}_i, {\\rm relation}_j, {\\rm entity}_k).\n\\end{align}\n\n我们还可以定义属性，类似于关系的概念，但只需要一个参数：\n\\begin{align}\n  ( {\\rm entity}_i, {\\rm attribute}_j ).\n\\end{align}\n例如，我们可以定义{\\tt has\\_fur} 属性，并将其应用于像{\\tt 狗}这样的实体。\n\n许多应用中需要表示关系和推理。\n我们如何在神经网络中做到这一点？\n\n机器学习模型当然需要训练数据。\n我们可以推断非结构化自然语言组成的训练数据集中实体之间的关系，也可以使用明确定义关系的结构化数据库。 \n这些数据库的共同结构是关系型数据库，它存储这种相同类型的信息，虽然没有格式化为三元标记的句子。\n当数据库旨在将日常生活中常识或关于应用领域的专业知识传达给人工智能系统时，我们将这种数据库称为知识库。\n知识库包括一般的像{\\tt Freebase}、{\\tt OpenCyc}、 {\\tt WordNet}、 {\\tt Wikibase}\\footnote{分别可以在如下网址获取: \\url{freebase.com}, \\url{cyc.com/opencyc},\n\\url{wordnet.princeton.edu}, \\url{wikiba.se}}~等等，和专业的知识库，如GeneOntology\\footnote{\\url{geneontology.org}}。\n实体和关系的表示可以将知识库中的每个三元组作为训练样本来学习，并且以最大化捕获它们的联合分布为训练目标{cite?}。\n\n除了训练数据，我们还需定义训练的模型族。\n一种常见的方法是将神经语言模型扩展到模型实体和关系。\n神经语言模型学习提供每个词分布式表示的向量。\n他们还通过学习这些向量的函数来学习词之间的相互作用，例如哪些词可能出现在词序列之后。\n我们可以学习每个关系的嵌入向量将这种方法扩展到实体和关系。\n事实上，建模语言和通过关系编码建模知识的联系非常接近，研究人员可以\\emph{同时}使用知识库\\emph{和}自然语言句子训练这样的实体表示{cite?}，或组合来自多个关系型数据库的数据~{cite?}。\n可能与这种模型相关联的特定参数化有许多种。\n早期关于学习实体间关系的工作~{cite?}假定高度受限的参数形式（\"线性关系嵌入\"），通常对关系使用与实体形式不同的表示。\n例如，{Paccanaro2000}和~{bordes-aaai-2011} 用向量表示实体而矩阵表示关系，其思想是关系在实体上相当于运算符。\n或者，关系可以被认为是任何其他实体{cite?}，允许我们关于关系作声明，但是更灵活的是将它们结合在一起并建模联合分布的机制。\n\n这种模型的实际短期应用是链接预测：预测知识图谱中缺失的弧。\n这是基于旧事实推广新事实的一种形式。\n目前存在的大多数知识库都是通过人力劳动构建的，这往往使知识库缺失许多并且可能是大多数真正的关系。\n请查看~{Wang-et-al-AAAI2014}、{Lin-et-al-AAAI2015}和~{Garcia-Duran-et-al-arxiv2015}中这样应用的例子。\n\n我们很难评估链接预测任务上模型的性能，因为我们的数据集只有正样本（已知是真实的事实）。\n如果模型提出了不在数据集中的事实，我们不确定模型是犯了错误还是发现了一个新的以前未知的事实。\n度量基于测试模型如何将已知真实事实的留存集合与不太可能为真的其他事实相比较，因此有些不精确。\n构造感兴趣的负样本（可能为假的事实）的常见方式是从真实事实开始，并创建该事实的损坏版本，例如用随机选择的不同实体替换关系中的一个实体 。\n通用的测试精度（10$\\%$度量）计算模型在该事实的所有损坏版本的前10$\\%$中选择\"正确\"事实的次数。\n\n知识库和分布式表示的另一个应用是词义消歧 {cite?}，这个任务决定在某些语境中哪个词的意义是恰当。\n\n最后，知识的关系结合一个推理过程和对自然语言的理解可以让我们建立一个一般的问答系统。\n一般的问答系统必须能处理输入信息并记住重要的事实，并以之后能检索和推理的方式组织。\n这仍然是一个困难的开放性问题，只能在受限的\"玩具\"环境下解决。\n目前，记住和检索特定声明性事实的最佳方法是使用显式记忆机制，如\\sec?所述。\n记忆网络最开始是被用来解决一个玩具问答任务{cite?}。\n{Kumar-et-al-arxiv2015} 提出了一种扩展，使用GRU~循环网络将输入读入存储器并且在给定存储器的内容后产生回答。\n\n深度学习已经应用于其他许多应用（除了这里描述的应用以外），并且肯定会在此之后应用于更多的场景。\n我们不可能全面描述与此主题相关的所有应用 。\n本项调查尽可能地提供了在本文写作之时的代表性样本\n\n第二部分介绍了涉及深度学习的现代实践，包括了所有非常成功的方法。\n一般而言，这些方法使用代价函数的梯度寻找模型（近似于某些所期望的函数）的参数。\n当具有足够的训练数据时，这种方法是非常强大的。\n我们现在转到第三部分，开始进入研究领域，旨在使用较少的训练数据或执行更多样的任务。\n而且相比目前为止所描述的情况，其中的挑战更困难并且远远没有解决。\n\n"
  },
  {
    "path": "docs/_posts/2016-12-13-Chapter13_linear_factor_models.md",
    "content": "---\ntitle: 线性因子模型\nlayout: post\nshare: false\n---\n\n\n\n\n许多深度学习的研究前沿均涉及构建输入的概率模型$p_{\\text{model}}(\\Vx)$。\n原则上说，给定任何其他变量的情况下，这样的模型可以使用概率推断来预测其环境中的任何变量。\n许多这样的模型还具有潜变量 $\\Vh$，其中$p_{\\text{model}}(\\Vx) = \\SetE_{\\Vh}\\, p_{\\text{model}}(\\Vx\\mid\\Vh)$。\n这些潜变量提供了表示数据的另一种方式。\n我们在深度前馈网络和循环网络中已经发现，基于潜变量的分布式表示继承了表示学习的所有优点。\n<!-- % 479 -->\n\n\n在本章中，我们描述了一些基于潜变量的最简单的概率模型：线性因子模型。\n这些模型有时被用来作为混合模型的组成模块~{cite?}或者更大的深度概率模型~{cite?}。\n同时，也介绍了构建生成模型所需的许多基本方法，在此基础上更先进的深度模型也将得到进一步扩展。\n<!-- % 479 -->\n\n\n线性因子模型通过随机线性解码器函数来定义，该函数通过对$\\Vh$的线性变换以及添加噪声来生成$\\Vx$。\n<!-- % 479 -->\n\n\n有趣的是，通过这些模型我们能够发现一些符合简单联合分布的解释性因子。\n<!-- %这些模型很有趣，因为它们使得我们能够发现一些拥有简单联合分布的解释性因子。  -->\n线性解码器的简单性使得它们成为了最早被广泛研究的潜变量模型。\n<!-- % 479 -->\n\n\n线性因子模型描述如下的数据生成过程。 \n首先，我们从一个分布中抽取解释性因子$\\Vh$\n\\begin{align}\n\\RVh \\sim p(\\Vh),\n\\end{align}\n其中$p(\\Vh)$是一个因子分布，满足$p(\\Vh) = \\prod_{i}^{}p(h_i)$，所以易于从中采样。\n接下来，在给定因子的情况下，我们对实值的可观察变量进行采样\n\\begin{align}\n\\Vx = \\MW \\Vh + \\Vb + \\text{noise},\n\\end{align}\n其中噪声通常是对角化的（在维度上是独立的）且服从高斯分布。\n这在\\fig?有具体说明。\n<!-- % 480 -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter13/figures/linear_factors}}\n\\fi\n\\caption{描述线性因子模型族的有向图模型，其中我们假设观察到的数据向量$\\Vx$是通过独立的潜在因子$\\Vh$的线性组合再加上一定噪声获得的。\n不同的模型，比如概率PCA，因子分析或者是~ICA，都是选择了不同形式的噪声以及先验$p(\\Vh)$。}\n\\end{figure}\n\n\n\n# 概率PCA和因子分析\n\n<!-- % 480 -->\n\n概率PCA、因子分析和其他线性因子模型是上述等式（\\eqn?和\\eqn?）的特殊情况，并且仅在对观测到$\\Vx$之前的噪声分布和潜变量 $\\Vh$先验的选择上有所不同。\n<!-- % 480 -->\n\n在因子分析~{cite?}中，潜变量的先验是一个方差为单位矩阵的高斯分布\n\\begin{align}\n\\RVh \\sim \\CalN(\\Vh; \\mathbf{0},\\MI),\n\\end{align}\n同时，假定在给定$\\Vh$的条件下观察值$x_i$是条件独立的。\n具体来说，我们可以假设噪声是从对角协方差矩阵的高斯分布中抽出的，协方差矩阵为$\\Vpsi = \\text{diag}(\\Vsigma^2)$，其中$\\Vsigma^2 = [\\sigma_1^2,\\sigma_2^2,\\ldots,\\sigma_n^2]^{\\top}$表示一个向量，每个元素表示一个变量的方差。\n<!-- % 480 -->\n\n\n因此，潜变量的作用是\\emph{捕获}不同观测变量$x_i$之间的\\emph{依赖关系}。\n实际上，可以容易地看出$\\Vx$服从多维正态分布，并满足\n\\begin{align}\n\\RVx \\sim \\CalN(\\Vx; \\Vb, \\MW\\MW^{\\top}+\\Vpsi).\n\\end{align}\n<!-- % 480 end -->\n\n\n\n<!-- % 481 head -->\n为了将~PCA~引入到概率框架中，我们可以对因子分析模型作轻微修改，使条件方差$\\sigma_i^2$等于同一个值。\n在这种情况下，$\\Vx$的协方差简化为$\\MW\\MW^{\\top}+\\sigma^2\\MI$，这里的$\\sigma^2$是一个标量。\n由此可以得到条件分布，如下：\n\\begin{align}\n\\RVx \\sim \\CalN(\\Vx; \\Vb, \\MW\\MW^{\\top} + \\sigma^2\\MI ),\n\\end{align}\n或者等价地\n\\begin{align}\n\\RVx = \\MW\\RVh + \\Vb + \\sigma\\RVz,\n\\end{align}\n其中$\\RVz \\sim \\CalN(\\Vz;\\mathbf{0},\\MI)$是高斯噪声。\n之后~{Tipping99}提出了一种迭代的~EM~算法来估计参数$\\MW$和$\\sigma^2$。\n<!-- % 481 -->\n\n\n这个概率PCA模型利用了这样一种观察现象：除了一些微小残余的重构误差（至多为$\\sigma^2$），数据中的大多数变化可以由潜变量 $\\Vh$描述。\n通过{Tipping99}的研究我们可以发现，当$\\sigma \\xrightarrow{} 0$时，概率PCA~退化为~PCA。\n在这种情况下，给定$\\Vx$情况下$\\Vh$的条件期望等于将$\\Vx - \\Vb$投影到$\\MW$的$d$列所生成的空间上，与~PCA~一样。\n<!-- % 481 -->\n\n当$\\sigma\\xrightarrow{} 0$时， 概率PCA~所定义的密度函数在$d$维的$\\MW$的列生成空间周围非常尖锐。\n这导致模型会为没有在一个超平面附近聚集的数据分配非常低的概率。\n<!-- %如果某些数据实际上没有集中在超平面附近，这会导致模型为数据分配非常低的可能性。 -->\n<!-- % 481 -->\n<!-- %导致模型会为没有在一个超空间附近聚集的数据分配非常低的概率” -->\n\n\n# 独立成分分析\n\n<!-- % 481 -->\n\n\n独立成分分析是最古老的表示学习算法之一~{cite?}。\n它是一种建模线性因子的方法，旨在将观察到的信号分离成许多潜在信号，这些潜在信号通过缩放和叠加可以恢复成观察数据。\n这些信号是完全独立的，而不是仅仅彼此不相关\\footnote{\\sec?讨论了不相关变量和独立变量之间的差异。}。\n<!-- % 481 -->\n\n\n许多不同的具体方法被称为~ICA。\n与我们本书中描述的其他生成模型最相似的~ICA~变种~{cite?}训练了完全参数化的生成模型。\n潜在因子$\\Vh$的先验$p(\\Vh)$，必须由用户提前给出并固定。\n接着模型确定性地生成$\\Vx = \\MW \\Vh$。\n我们可以通过非线性变化（使用\\eqn?）来确定$p(\\Vx)$。\n然后通过一般的方法比如最大化似然进行学习。\n<!-- % 482 head -->\n\n\n这种方法的动机是，通过选择一个独立的$p(\\Vh)$，我们可以尽可能恢复接近独立的潜在因子。\n这是一种常用的方法，它并不是用来捕捉高级别的抽象因果因子，而是恢复已经混合在一起的低级别信号。\n在该设置中，每个训练样本对应一个时刻，每个$x_i$是一个传感器对混合信号的观察值，并且每个$h_i$是单个原始信号的一个估计。\n例如，我们可能有$n$个人同时说话。 \n如果我们在不同位置放置$n$个不同的麦克风，则~ICA~可以检测每个麦克风的音量变化，并且分离信号，使得每个$h_i$仅包含一个人清楚地说话。\n这通常用于脑电图的神经科学，这种技术可用于记录源自大脑的电信号。\n放置在受试者头部上的许多电极传感器用于测量来自身体的多种电信号。\n实验者通常仅对来自大脑的信号感兴趣，但是来自受试者心脏和眼睛的信号强到足以混淆在受试者头皮处的测量结果。\n信号到达电极，并且混合在一起，因此为了分离源于心脏与源于大脑的信号，并且将不同脑区域中的信号彼此分离，ICA~是必要的。\n<!-- % 482 mid  -->\n\n\n如前所述，ICA~存在许多变种。\n一些版本在$\\Vx$的生成中添加一些噪声，而不是使用确定性的解码器。\n大多数方法不使用最大似然准则，而是旨在使$\\Vh = \\MW^{-1}\\Vx$的元素彼此独立。\n许多准则能够达成这个目标。\n\\eqn?需要用到$\\MW$的行列式，这可能是代价很高且数值不稳定的操作。\nICA~的一些变种通过将$\\MW$约束为正交来避免这个有问题的操作。\n<!-- % 482 mid -->\n\n\nICA~的所有变种均要求$p(\\Vh)$是非高斯的。\n这是因为如果$p(\\Vh)$是具有高斯分量的独立先验，则$\\MW$是不可识别的。\n对于许多$\\MW$值，我们可以在$p(\\Vx)$上获得相同的分布。 \n这与其他线性因子模型有很大的区别，例如概率PCA~和因子分析通常要求$p(\\Vh)$是高斯的，以便使模型上的许多操作具有闭式解。\n在用户明确指定分布的最大似然方法中，一个典型的选择是使用$p(h_i) = \\frac{d}{dh_i}\\sigma(h_i)$。\n这些非高斯分布的典型选择在$0$附近具有比高斯分布更高的峰值，因此我们也可以看到独立成分分析经常用于学习稀疏特征。\n<!-- % 483 head -->\n\n\n\n\n按照我们对生成模型这个术语的定义，ICA~的许多变种不是生成模型。\n在本书中，生成模型可以直接表示$p(\\Vx)$，也可以认为是从$p(\\Vx)$中抽取样本。\nICA~的许多变种仅知道如何在$\\Vx$和$\\Vh$之间变换，而没有任何表示$p(\\Vh)$的方式，因此也无法在$p(\\Vx)$上施加分布。\n例如，许多~ICA~变量旨在增加$\\Vh = \\MW^{-1}\\Vx$的样本峰度，因为高峰度说明了$p(\\Vh)$是非高斯的，但这是在没有显式表示$p(\\Vh)$的情况下完成的。\n这就是为什么~ICA~多被用作分离信号的分析工具，而不是用于生成数据或估计其密度。\n<!-- % 483 head -->\n\n\n正如~PCA~可以推广到\\chap?中描述的非线性自编码器，ICA~也可以推广到非线性生成模型，其中我们使用非线性函数$f$来生成观测数据。\n关于非线性~ICA~最初的工作可以参考~{hyvarinen1999nonlinear}，它和集成学习的成功结合可以参见~{roberts2001independent,lappalainen2000nonlinear}。\nICA~的另一个非线性扩展是非线性独立成分估计方法~{cite?}，这个方法堆叠了一系列可逆变换（在编码器阶段），其特性是能高效地计算每个变换的~Jacobian~行列式。\n这使得我们能够精确地计算似然，并且像~ICA~一样，NICE~尝试将数据变换到具有因子的边缘分布的空间。\n由于非线性编码器的使用，这种方法更可能成功。%\\footnote{译者注：相比于~ICA}\n因为编码器和一个能进行完美逆变换的解码器相关联，所以可以直接从模型生成样本（首先从$p(\\Vh)$采样，然后使用解码器）。\n<!-- % 483 -->\n\n\nICA~的另一个推广是通过鼓励组内统计依赖关系、抑制组间依赖关系来学习特征组{cite?}。\n当相关单元的组被选为不重叠时，这被称为独立子空间分析。\n我们还可以向每个隐藏单元分配空间坐标，并且空间上相邻的单元组形成一定程度的重叠。\n这能够鼓励相邻的单元学习类似的特征。\n当应用于自然图像时，这种地质ICA方法可以学习Gabor滤波器，从而使得相邻特征具有相似的方向、位置或频率。\n在每个区域内出现类似Gabor函数的许多不同相位存在抵消作用，使得在小区域上的池化产生了平移不变性。\n<!-- % 483 end -->\n\n\n\n# 慢特征分析\n\n<!-- % 484 head -->\n\n\n慢特征分析是使用来自时间信号的信息学习不变特征的线性因子模型~{cite?}。\n<!-- % 484 -->\n\n\n慢特征分析的想法源于所谓的慢性原则。\n其基本思想是，与场景中起描述作用的单个量度相比，场景的重要特性通常变化得非常缓慢。\n例如，在计算机视觉中，单个像素值可以非常快速地改变。\n如果斑马从左到右移动穿过图像并且它的条纹穿过对应的像素时，该像素将迅速从黑色变为白色，并再次恢复成黑色。\n通过比较，指示斑马是否在图像中的特征将不发生改变，并且描述斑马位置的特征将缓慢地改变。\n因此，我们可能希望将模型正则化，从而能够学习到那些随时间变化较为缓慢的特征。\n<!-- % 484 -->\n\n\n慢性原则早于慢特征分析，并已被应用于各种模型~{cite?}。\n一般来说，我们可以将慢性原则应用于可以使用梯度下降训练的任何可微分模型。 \n为了引入慢性原则，我们可以向代价函数添加以下项\n\\begin{align}\n\\lambda \\sum_t L(f(\\Vx^{(t+1)}),f(\\Vx^{(t)})),\n\\end{align}\n其中$\\lambda$是确定慢度正则化强度的超参数项，$t$是样本时间序列的索引，$f$是需要正则化的特征提取器，$L$是测量$f(\\Vx^{(t)})$和$f(\\Vx^{(t+1)})$之间的距离的损失函数。\n$L$的一个常见选择是均方误差。\n<!-- % 484 -->\n\n\n慢特征分析是慢性原则中一个特别高效的应用。\n由于它被应用于线性特征提取器，并且可以通过闭式解训练，所以它是高效的。\n像~ICA~的一些变种一样，SFA~本身并不是生成模型，只是在输入空间和特征空间之间定义了一个线性映射，但是没有定义特征空间的先验，因此没有在输入空间上施加分布$p(\\Vx)$。\n<!-- % 484 -->\n\n\n\nSFA~算法~{cite?}先将$f(\\Vx;\\theta)$定义为线性变换，然后求解如下优化问题\n\\begin{align}\n\t\\min_{\\Vtheta} \\SetE_t  (f(\\Vx^{(t+1)})_i - f(\\Vx^{(t)})_i  )^2\n\\end{align}\n并且满足下面的约束：\n\\begin{align}\n\t\\SetE_t  f(\\Vx^{(t)})_i = 0 \n\\end{align}\n以及\n\\begin{align}\n\t\\SetE_t [ f(\\Vx^{(t)})_i^2 ] =1. \n\\end{align} % 485\n学习特征具有零均值的约束对于使问题具有唯一解是必要的; \n否则我们可以向所有特征值添加一个常数，\n并获得具有相等慢度目标值的不同解。\n特征具有单位方差的约束对于防止所有特征趋近于$0$的病态解是必要的。\n与~PCA~类似，SFA~特征是有序的，其中学习第一特征是最慢的。\n要学习多个特征，我们还必须添加约束\n\\begin{align}\n\\forall i<j,\\ \\  \\SetE_t [f(\\Vx^{(t)})_i  f(\\Vx^{(t)})_j] = 0.\n\\end{align}\n这要求学习的特征必须彼此线性去相关。 \n没有这个约束，所有学习到的特征将简单地捕获一个最慢的信号。\n可以想象使用其他机制，如最小化重构误差，也可以迫使特征多样化。\n但是由于~SFA~特征的线性，这种去相关机制只能得到一种简单的解。 \nSFA~问题可以通过线性代数软件获得闭式解。\n<!-- % 485 -->\n\n\n\n在运行~SFA~之前，SFA~通常通过对$\\Vx$使用非线性的基扩充来学习非线性特征。\n例如，通常用$\\Vx$的二次基扩充来代替原来的$\\Vx$，得到一个包含所有$x_ix_j$的向量。\n由此，我们可以通过反复地学习一个线性~SFA~特征提取器，对其输出应用非线性基扩展，然后在该扩展之上学习另一个线性~SFA~特征提取器的方式来组合线性~SFA~模块从而学习深度非线性慢特征提取器。\n\n<!-- % 485 -->\n\n\n当在自然场景视频的小块空间部分上训练时，使用二次基扩展的~SFA~所学习到的特征与V1皮层中那些复杂细胞的特征有许多共同特性~{cite?}。\n当在计算机渲染的3D环境内随机运动的视频上训练时，深度~SFA~模型能够学习的特征与大鼠脑中用于导航的神经元学到的特征有许多共同特性~{cite?}。\n因此从生物学角度上来说~SFA~是一个合理的有依据的模型。\n<!-- % 485 -->\n\n\n\nSFA~的一个主要优点是，即使在深度非线性条件下，它依然能够在理论上预测~SFA~能够学习哪些特征。\n为了做出这样的理论预测，必须知道关于配置空间的环境动力（例如，在3D渲染环境中随机运动的例子中，理论分析是从相机位置、速度的概率分布中入手的）。\n已知潜在因子如何改变的情况下，我们能够通过理论分析解出表达这些因子的最佳函数。\n在实践中，基于模拟数据的实验上，使用深度~SFA~似乎能够恢复理论预测的函数。\n相比之下，在其他学习算法中，代价函数高度依赖于特定像素值，使得难以确定模型将学习到什么特征。\n<!-- % 486 -->\n\n\n深度~SFA~也已经被用于学习用在对象识别和姿态估计的特征~{cite?}。\n到目前为止，慢性原则尚未成为任何最先进应用的基础。\n究竟是什么因素限制了其性能仍有待研究。\n我们推测，或许慢度先验太过强势，并且，最好添加这样一个先验使得当前时间步到下一个时间步的预测更加容易，而不是加一个先验使得特征近似为一个常数。\n对象的位置是一个有用的特征，无论对象的速度是高还是低。 \n但慢性原则鼓励模型忽略具有高速度的对象的位置。\n<!-- % 486 -->\n\n\n\n# 稀疏编码\n\n<!-- % 486 -->\n\n\n稀疏编码~{cite?}是一个线性因子模型，已作为一种无监督特征学习和特征提取机制得到了广泛研究。\n严格来说，术语\"稀疏编码\"是指在该模型中推断$\\Vh$值的过程，而\"稀疏建模\"是指设计和学习模型的过程，但是通常这两个概念都可以用术语\"稀疏编码\"描述。\n<!-- % 486 -->\n\n像大多数其他线性因子模型一样，它使用了线性的解码器加上噪声的方式获得一个$\\Vx$的重构，就像\\eqn?描述的一样。\n更具体地说，稀疏编码模型通常假设线性因子有一个各向同性精度为$\\beta$的高斯噪声：\n\\begin{align}\np(\\Vx\\mid \\Vh) = \\CalN\n(\\Vx;\\MW\\Vh + \\Vb ,\\frac{1}{\\beta}\\MI).\n\\end{align}\n<!-- % 486 -->\n\n\n分布$p(\\Vh)$通常选取为一个峰值很尖锐且接近$0$的分布~{cite?}。\n常见的选择包括可分解的Laplace、Cauchy或者可分解的Student-t分布。\n例如，以稀疏惩罚系数$\\lambda$为参数的Laplace先验可以表示为\n\\begin{align}\np(h_i) = \\text{Laplace}(h_i;0,\\frac{2}{\\lambda}) = \\frac{\\lambda}{4} \\text{e}^{ -\\frac{1}{2}\\lambda \\vert h_i\\vert},\n\\end{align}\n相应的，Student-t先验分布可以表示为\n\\begin{align}\np(h_i)\\propto \\frac{1}{(1+\\frac{h_i^2}{\\nu})^{\\frac{\\nu+1}{2}}}.\n\\end{align}\n<!-- % 487 head -->\n\n使用最大似然的方法来训练稀疏编码模型是不可行的。\n相反，为了在给定编码的情况下更好地重构数据，训练过程在编码数据和训练解码器之间交替进行。\n稍后在\\sec?中，这种方法将被进一步证明为是解决最大似然问题的一种通用的近似方法。\n<!-- % 487 -->\n\n对于诸如~PCA~的模型，我们已经看到使用了预测$\\Vh$的参数化的编码器函数，并且该函数仅包括乘以权重矩阵。\n稀疏编码中的编码器不是参数化的编码器。\n相反，编码器是一个优化算法，在这个优化问题中，我们寻找单个最可能的编码值：\n\\begin{align}\n\\Vh^* = f(\\Vx) = \\underset{\\Vh}{\\arg\\max}\\  p(\\Vh\\mid\\Vx).\n\\end{align} % 487\n结合\\eqn?和\\eqn?，我们得到如下的优化问题：\n\\begin{align}\n& \\underset{\\Vh}{\\arg\\max}\\  p(\\Vh\\mid\\Vx) \\\\\n= ~& \\underset{\\Vh}{\\arg\\max}\\ \\log  p(\\Vh\\mid\\Vx)\\\\\n= ~& \\underset{\\Vh}{\\arg\\min}\\ \\lambda \\Vert \\Vh\\Vert_1 + \\beta  \\Vert \\Vx - \\MW \\Vh\\Vert_2^2,\n\\end{align}\n其中，我们扔掉了与$\\Vh$无关的项，并除以一个正的缩放因子来简化表达。\n<!-- % 487 -->\n\n由于在$\\Vh$上施加$L^1$范数，这个过程将产生稀疏的$\\Vh^*$（详见\\sec?）。\n<!-- % 487 -->\n\n\n为了训练模型而不仅仅是进行推断，我们交替迭代关于$\\Vh$和$\\MW$的最小化过程。\n在本文中，我们将$\\beta$视为超参数。\n我们通常将其设置为$1$，因为它在此优化问题的作用与$\\lambda$类似，没有必要使用两个超参数。 \n原则上，我们还可以将$\\beta$作为模型的参数，并学习它。\n我们在这里已经放弃了一些不依赖于$\\Vh$但依赖于$\\beta$的项。\n要学习$\\beta$，必须包含这些项，否则$\\beta$将退化为$0$。\n<!-- % 487 -->\n\n\n不是所有的稀疏编码方法都显式地构建了一个$p(\\Vh)$和一个$p(\\Vx\\mid\\Vh)$。 \n通常我们只是对学习一个带有激活值的特征的字典感兴趣，当特征是由这个推断过程提取时，这个激活值通常为$0$。\n<!-- % 487 end -->\n\n如果我们从Laplace先验中采样$\\Vh$，$\\Vh$的元素实际上为$0$是一个零概率事件。\n生成模型本身并不稀疏，只有特征提取器是稀疏的。\n{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}描述了不同模型族中的近似推断，如尖峰和平板稀疏编码模型，其中先验的样本通常包含许多真正的$0$。\n<!-- % 488 head -->\n\n与非参数编码器结合的稀疏编码方法原则上可以比任何特定的参数化编码器更好地最小化重构误差和对数先验的组合。\n另一个优点是编码器没有泛化误差。\n参数化的编码器必须泛化地学习如何将$\\Vx$映射到$\\Vh$。\n对于与训练数据差异很大的异常$\\Vx$，所学习的参数化编码器可能无法找到对应精确重构或稀疏的编码$\\Vh$。\n对于稀疏编码模型的绝大多数形式，推断问题是凸的，优化过程总能找到最优编码（除非出现退化的情况，例如重复的权重向量）。\n显然，稀疏和重构成本仍然可以在不熟悉的点上升，但这归因于解码器权重中的泛化误差，而不是编码器中的泛化误差。\n当稀疏编码用作分类器的特征提取器，而不是使用参数化的函数来预测编码值时，基于优化的稀疏编码模型的编码过程中较小的泛化误差可以得到更好的泛化能力。\n{Coates2011b}证明了在对象识别任务中稀疏编码特征比基于参数化的编码器（线性-sigmoid~自编码器）的特征拥有更好的泛化能力。\n受他们的工作启发，{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}表明一种稀疏编码的变体在标签极少（每类20个或更少标签）的情况中比相同情况下的其他特征提取器拥有更好的泛化能力。\n<!-- % 488  -->\n\n\n\n非参数编码器的主要缺点是在给定$\\Vx$的情况下需要大量的时间来计算$\\Vh$，因为非参数方法需要运行迭代算法。\n在\\chap?中讲到的参数化自编码器方法仅使用固定数量的层，通常只有一层。\n另一个缺点是它不直接通过非参数编码器进行反向传播，这使得我们很难采用先使用无监督方式预训练稀疏编码模型然后使用监督方式对其进行精调的方法。\n允许近似导数的稀疏编码模型的修改版本确实存在但未被广泛使用~{cite?}。\n<!-- % 488  end -->\n\n像其他线性因子模型一样，稀疏编码经常产生糟糕的样本，如\\fig?所示。\n即使当模型能够很好地重构数据并为分类器提供有用的特征时，也会发生这种情况。\n这种现象发生的原因是每个单独的特征可以很好地被学习到，但是隐藏编码值的因子先验会导致模型包括每个生成样本中所有特征的随机子集。\n这促使人们开发更深的模型，可以在其中最深的编码层施加一个非因子分布， 与此同时也在开发一些复杂的浅度模型。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n    \\centerline{\\includegraphics[width=\\figwidth]{Chapter13/figures/s3c_samples}}\n\\fi\n\\caption{尖峰和平板稀疏编码模型上在MNIST数据集训练的样例和权重。\n\\emph{(左)}这个模型中的样本和训练样本相差很大。\n第一眼看来，我们可能认为模型拟合得很差。\n\\emph{(右)}这个模型的权重向量已经学习到了如何表示笔迹，有时候还能写完整的数字。\n因此这个模型也学习到了有用的特征。\n问题在于特征的因子先验会导致特征子集合随机的组合。\n一些这样的子集能够合成可识别的MNIST集上的数字。\n这也促进了拥有更强大潜在编码分布的生成模型的发展。\n此图经~{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}允许转载。}\n\\end{figure}\n\n<!-- %这促进了更深层模型的发展，可以在最深层上施加non-factorial分布，以及开发更复杂的浅层模型。 -->\n<!-- % 489 head -->\n\n\n\n# PCA的流形解释\n\n<!-- % 489 au -->\n\n\n线性因子模型，包括~PCA~和因子分析，可以理解为学习一个流形~{cite?}。\n我们可以将概率PCA~定义为高概率的薄饼状区域，即一个高斯分布，沿着某些轴非常窄，就像薄饼沿着其垂直轴非常平坦，但沿着其他轴是细长的，正如薄饼在其水平轴方向是很宽的一样。\n\\fig?解释了这种现象。\nPCA~可以理解为将该薄饼与更高维空间中的线性流形对准。\n这种解释不仅适用于传统~PCA，而且适用于学习矩阵$\\MW$和$\\MV$的任何线性自编码器，其目的是使重构的$\\Vx$尽可能接近于原始的$\\Vx$。\n<!-- % 489 end -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter13/figures/PPCA_pancake_color}}\n\\fi\n\\caption{平坦的高斯能够描述一个低维流形附近的概率密度。\n此图表示了\"流形平面\"上\"馅饼\"的上半部分，并且这个平面穿过了馅饼的中心。\n正交于流形方向（指向平面外的箭头方向）的方差非常小，可以被视作是\"噪声\"，其他方向（平面内的箭头）的方差则很大，对应了\"信号\"以及降维数据的坐标系统。}\n\\end{figure}\n\n\n编码器表示为\n\\begin{align}\n\\Vh  = f(\\Vx) = \\MW^{\\top} (\\Vx - \\Vmu).\n\\end{align}% 490 head\n编码器计算$h$的低维表示。\n从自编码器的角度来看，解码器负责计算重构：\n\\begin{align}\n\\hat{\\Vx} = g(\\Vh) = \\Vb + \\MV \\Vh.\n\\end{align}\n<!-- % 490 -->\n\n\n能够最小化重构误差\n\\begin{align}\n\\SetE[\\Vert\\Vx - \\hat{\\Vx}\\Vert^2]\n\\end{align}\n的线性编码器和解码器的选择对应着$\\MV = \\MW$，${\\Vmu} = \\Vb = \\SetE[\\Vx]$， $\\MW$的列 形成一组标准正交基，这组基生成的子空间与协方差矩阵$\\MC$\n\\begin{align}\n\\MC = \\SetE[(\\Vx - {\\Vmu})(\\Vx - {\\Vmu})^{\\top}]\n\\end{align}\n的主特征向量所生成的子空间相同。\n在~PCA~中，$\\MW$的列是按照对应特征值（其全部是实数和非负数）幅度大小排序所对应的特征向量。\n<!-- % 490 end -->\n\n我们还可以发现$\\MC$的特征值$\\lambda_i$对应了$\\Vx$在特征向量$\\Vv^{(i)}$方向上的方差。\n如果$\\Vx\\in \\SetR^D$，$\\Vh\\in\\SetR^d$并且满足$d<D$，则（给定上述的${\\Vmu},\\Vb,\\MV,\\MW$的情况下）最佳的重构误差是\n\\begin{align}\n\\min \\SetE[\\Vert \\Vx - \\hat{\\Vx} \\Vert^2] = \\sum_{i=d+1}^{D}\\lambda_i.\n\\end{align}\n因此，如果协方差矩阵的秩为$d$，则特征值$\\lambda_{d+1}$到$\\lambda_{D}$都为$0$，并且重构误差为$0$。\n<!-- % 491 head  -->\n\n此外，我们还可以证明上述解可以通过在给定正交矩阵$\\MW$的情况下最大化$\\Vh$元素的方差而不是最小化重构误差来获得。\n<!-- % 491  -->\n\n\n某种程度上说，线性因子模型是最简单的生成模型和学习数据表示的最简单模型。\n许多模型如线性分类器和线性回归模型可以扩展到深度前馈网络，而这些线性因子模型可以扩展到自编码器网络和深度概率模型，它们可以执行相同任务但具有更强大和更灵活的模型族。\n<!-- % 491    -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-14-Chapter14_autoencoders.md",
    "content": "---\ntitle: 自编码器\nlayout: post\nshare: false\n---\n自编码器是神经网络的一种，经过训练后能尝试将输入复制到输出。\n自编码器内部有一个隐藏层 $\\Vh$，可以产生编码表示输入。\n该网络可以看作由两部分组成：一个由函数$ \\Vh = f(\\Vx)$表示的编码器和一个生成重构的解码器 $\\Vr=g(\\Vh)$。\n\\fig?展示了这种架构。\n如果一个自编码器只是简单地学会将处处设置为$g(f(\\Vx)) =\\Vx$，那么这个自编码器就没什么特别的用处。\n相反，我们不应该将自编码器设计成输入到输出完全相等。\n这通常需要向自编码器强加一些约束，使它只能近似地复制，并只能复制与训练数据相似的输入。\n这些约束强制模型考虑输入数据的哪些部分需要被优先复制，因此它往往能学习到数据的有用特性。\n\n\n现代自编码器将编码器和解码器的概念推而广之，将其中的确定函数推广为随机映射$p_{\\text{encoder}} (\\Vh \\mid \\Vx)$和$p_{\\text{decoder}}(\\Vx \\mid \\Vh)$。\n\n\n数十年间，自编码器的想法一直是神经网络历史景象的一部分~{cite?}。\n传统自编码器被用于降维或特征学习。\n近年来，自编码器与潜变量模型理论的联系将自编码器带到了生成式建模的前沿，我们将在\\chap?揭示更多细节。\n自编码器可以被看作是前馈网络的一个特例，并且可以使用完全相同的技术进行训练，通常使用小批量梯度下降法（其中梯度基于反向传播计算）。\n不同于一般的前馈网络，自编码器也可以使用再循环训练{cite?}，这种学习算法基于比较原始输入的激活和重构输入的激活。\n相比反向传播算法，再循环算法更具生物学意义，但很少用于机器学习应用。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/autoencoder}}\n\\fi\n\\caption{自编码器的一般结构，通过内部表示或编码 $\\Vh$将输入$\\Vx$映射到输出（称为重构）$\\Vr$。\n自编码器具有两个组件：编码器~$f$（将$\\Vx$映射到$\\Vh$）和解码器~$g$（将$\\Vh$映射到$\\Vr$）。\n}\n\\end{figure}\n\n<!-- % -- 493 -- -->\n\n\n# 欠完备自编码器\n\n将输入复制到输出听起来没什么用，但我们通常不关心解码器的输出。\n相反，我们希望通过训练自编码器对输入进行复制而使$\\Vh$获得有用的特性。\n\n\n从自编码器获得有用特征的一种方法是限制$\\Vh$的维度比$\\Vx$小，这种编码维度小于输入维度的自编码器称为欠完备自编码器。\n学习欠完备的表示将强制自编码器捕捉训练数据中最显著的特征。\n\n\n学习过程可以简单地描述为最小化一个损失函数 \n\\begin{align}\n    L(\\Vx, g(f(\\Vx))),\n\\end{align}\n其中$L$是一个损失函数，惩罚$g(f(\\Vx))$与$\\Vx$的差异，如均方误差。\n\n\n当解码器是线性的且$L$是均方误差，欠完备的自编码器会学习出与~PCA~相同的生成子空间。\n这种情况下，自编码器在训练来执行复制任务的同时学到了训练数据的主元子空间。\n\n\n因此，拥有非线性编码器函数$f$和非线性解码器函数$g$的自编码器能够学习出更强大的~PCA~非线性推广。\n不幸的是，如果编码器和解码器被赋予过大的容量，自编码器会执行复制任务而捕捉不到任何有关数据分布的有用信息。\n从理论上说，我们可以设想这样一个自编码器，它只有一维编码，但它具有一个非常强大的非线性编码器，能够将每个训练数据$\\Vx^{(i)}$表示为编码~$i$。\n而解码器可以学习将这些整数索引映射回特定训练样本的值。\n这种特定情形不会在实际情况中发生，但它清楚地说明，如果自编码器的容量太大，那训练来执行复制任务的自编码器可能无法学习到数据集的任何有用信息。\n\n<!-- % -- 494 -- -->\n\n\n# 正则自编码器\n\n编码维数小于输入维数的欠完备自编码器可以学习数据分布最显著的特征。\n我们已经知道，如果赋予这类自编码器过大的容量，它就不能学到任何有用的信息。\n\n\n如果隐藏编码的维数允许与输入相等，或隐藏编码维数大于输入的过完备情况下，会发生类似的问题。\n在这些情况下，即使是线性编码器和线性解码器也可以学会将输入复制到输出，而学不到任何有关数据分布的有用信息。\n\n\n理想情况下，根据要建模的数据分布的复杂性，选择合适的编码维数和编码器、解码器容量，就可以成功训练任意架构的自编码器。\n正则自编码器提供这样的能力。\n正则自编码器使用的损失函数可以鼓励模型学习其他特性（除了将输入复制到输出），而不必限制使用浅层的编码器和解码器以及小的编码维数来限制模型的容量。\n这些特性包括稀疏表示、表示的小导数、以及对噪声或输入缺失的鲁棒性。\n即使模型容量大到足以学习一个无意义的恒等函数，非线性且过完备的正则自编码器仍然能够从数据中学到一些关于数据分布的有用信息。\n\n\n除了这里所描述的方法（正则化自编码器最自然的解释），几乎任何带有潜变量并配有一个推断过程（计算给定输入的潜在表示）的生成模型，都可以看作是自编码器的一种特殊形式。\n强调与自编码器联系的两个生成式建模方法是~Helmholtz机~{cite?}的衍生模型，如变分自编码器（\\sec?）和生成随机网络（\\sec?）。\n这些变种（或衍生）自编码器能够学习出高容量且过完备的模型，进而发现输入数据中有用的结构信息，并且也无需对模型进行正则化。\n这些编码显然是有用的，因为这些模型被训练为近似训练数据的概率分布而不是将输入复制到输出。 % confusing\n\n<!-- % -- 495 -- -->\n\n\n## 稀疏自编码器\n\n稀疏自编码器简单地在训练时结合编码层的稀疏惩罚$\\Omega(\\Vh)$和重构误差：\n\\begin{align}\n    L(\\Vx, g(f(\\Vx))) + \\Omega(\\Vh),\n\\end{align}\n其中$g(\\Vh)$是解码器的输出，通常$\\Vh$是编码器的输出，即$\\Vh = f(\\Vx)$。\n\n\n稀疏自编码器一般用来学习特征，以便用于像分类这样的任务。\n稀疏正则化的自编码器必须反映训练数据集的独特统计特征，而不是简单地充当恒等函数。\n以这种方式训练，执行附带稀疏惩罚的复制任务可以得到能学习有用特征的模型。\n\n\n我们可以简单地将惩罚项$\\Omega(\\Vh)$视为加到前馈网络的正则项，这个前馈网络的主要任务是将输入复制到输出（无监督学习的目标），并尽可能地根据这些稀疏特征执行一些监督学习任务（根据监督学习的目标）。\n不像其它正则项如权重衰减——没有直观的贝叶斯解释。\n如\\sec?描述，权重衰减和其他正则惩罚可以被解释为一个~MAP~近似贝叶斯推断，正则化的惩罚对应于模型参数的先验概率分布。\n这种观点认为，正则化的最大似然对应最大化$p(\\Vtheta \\mid \\Vx)$， 相当于最大化$\\log p(\\Vx \\mid \\Vtheta) + \\log p(\\Vtheta)$。 $\\log p(\\Vx \\mid \\Vtheta)$即通常的数据似然项，参数的对数先验项$\\log p(\\Vtheta)$则包含了对$\\Vtheta$特定值的偏好。\n这种观点在\\sec?有所描述。\n正则自编码器不适用这样的解释是因为正则项取决于数据，因此根据定义上（从文字的正式意义）来说，它不是一个先验。\n虽然如此，我们仍可以认为这些正则项隐式地表达了对函数的偏好。\n\n<!-- % -- 496 -- -->\n\n我们可以认为整个稀疏自编码器框架是对带有潜变量的生成模型的近似最大似然训练，而不将稀疏惩罚视为复制任务的正则化。\n假如我们有一个带有可见变量$\\Vx$和潜变量 $\\Vh$的模型，且具有明确的联合分布$p_{\\text{model}}(\\Vx,\\Vh)=p_{\\text{model}}(\\Vh)p_{\\text{model}} (\\Vx \\mid \\Vh)$。\n我们将$p_{\\text{model}}(\\Vh)$视为模型关于潜变量的先验分布，表示模型看到$\\Vx$的信念先验。\n这与我们之前使用\"先验\"的方式不同，之前指分布$p(\\Vtheta)$在我们看到数据前就对模型参数的先验进行编码。\n对数似然函数可分解为\n\\begin{align}\n\\log p_{\\text{model}}(\\Vx)=\\log \\sum_{\\Vh} p_{\\text{model}}(\\Vh, \\Vx) .\n\\end{align}\n我们可以认为自编码器使用一个高似然值$\\Vh$的点估计近似这个总和。\n这类似于稀疏编码生成模型（\\sec?），但$\\Vh$是参数编码器的输出，而不是从优化结果推断出的最可能的$\\Vh$。\n从这个角度看，我们根据这个选择的$\\Vh$，最大化如下\n\\begin{align}\n\\log p_{\\text{model}}(\\Vh, \\Vx)=\\log p_{\\text{model}}(\\Vh) + \\log p_{\\text{model}}(\\Vx \\mid \\Vh) .\n\\end{align}\n$\\log p_{\\text{model}}(\\Vh) $ 项能被稀疏诱导。\n如Laplace先验，\n\\begin{align}\np_{\\text{model}}(h_i) = \\frac{\\lambda}{2} e^{-\\lambda | h_i |},\n\\end{align}\n对应于绝对值稀疏惩罚。\n将对数先验表示为绝对值惩罚，我们得到\n\\begin{align}\n\\Omega(\\Vh) &= \\lambda \\sum_{i} | h_i  |,\\\\ \n-\\log p_{\\text{model}}(\\Vh) &= \n\\sum_i (\\lambda | h_i | - \\log \\frac{\\lambda}{2}) = \\Omega(\\Vh) + \\text{const},\n\\end{align}\n这里的常数项只跟$\\lambda$有关。\n通常我们将$\\lambda$视为超参数，因此可以丢弃不影响参数学习的常数项。\n其他如~Student-t~先验也能诱导稀疏性。\n从稀疏性导致$p_{\\text{model}}(\\Vh)$学习成近似最大似然的结果看，稀疏惩罚完全不是一个正则项。\n这仅仅影响模型关于潜变量的分布。\n这个观点提供了训练自编码器的另一个动机：这是近似训练生成模型的一种途径。\n这也给出了为什么自编码器学到的特征是有用的另一个解释：它们描述的潜变量可以解释输入。\n\n<!-- % -- 497 -- -->\n\n稀疏自编码器的早期工作~{cite?}探讨了各种形式的稀疏性，并提出了稀疏惩罚和$\\log  Z$项（将最大似然应用到无向概率模型$p(\\Vx)=\\frac{1}{Z}\\tilde{p}(\\Vx)$时产生）之间的联系。\n这个想法是最小化$\\log Z$防止概率模型处处具有高概率，同理强制稀疏可以防止自编码器处处具有低的重构误差 。\n这种情况下，这种联系是对通用机制的直观理解而不是数学上的对应。\n在数学上更容易解释稀疏惩罚对应于有向模型$p_{\\text{model}}(\\Vh)p_{\\text{model}}(\\Vx \\mid \\Vh) $中的$\\log p_{\\text{model}}(\\Vh)$。\n\n\n{Glorot+al-ICML-2011-small}提出了一种在稀疏（和去噪）自编码器的$\\Vh$中实现\\emph{真正为零}的方式。\n该想法是使用整流线性单元产生编码层。\n基于将表示真正推向零（如绝对值惩罚）的先验，可以间接控制表示中零的平均数量。\n\n\n\n\n## 去噪自编码器\n\n除了向代价函数增加一个惩罚项，我们也可以通过改变重构误差项来获得一个能学到有用信息的自编码器。\n\n\n传统的自编码器最小化以下目标\n\\begin{align}\n    L(\\Vx, g(f(\\Vx))),\n\\end{align}\n其中$L$是一个损失函数，惩罚$g(f(\\Vx))$与$\\Vx$的差异，如它们彼此差异的$L^2$范数。\n如果模型被赋予过大的容量，$L$仅仅使得$g \\circ  f$学成一个恒等函数。\n\n\n相反，去噪自编码器最小化 \n\\begin{align}\n    L(\\Vx, g(f(\\tilde \\Vx))),\n\\end{align}\n其中 $\\tilde \\Vx$是被某种噪声损坏的$\\Vx$的副本。\n因此去噪自编码器必须撤消这些损坏，而不是简单地复制输入。\n\n{Alain+Bengio-ICLR2013-small}和~{Bengio-et-al-NIPS2013-small}指出去噪训练过程强制$f$和$g$隐式地学习$p_{\\text{data}} (\\Vx)$的结构。\n因此去噪自编码器也是一个通过最小化重构误差获取有用特性的例子。\n这也是将过完备、高容量的模型用作自编码器的一个例子——只要小心防止这些模型仅仅学习一个恒等函数。\n去噪自编码器将在\\sec?给出更多细节。\n\n<!-- % -- 498 -- -->\n\n\n## 惩罚导数作为正则\n\n另一正则化自编码器的策略是使用一个类似稀疏自编码器中的惩罚项$\\Omega$，\n\\begin{align}\n    L(\\Vx, g(f(\\Vx))) + \\Omega(\\Vh, \\Vx),\n\\end{align}\n但$\\Omega$的形式不同：\n\\begin{align}\n\\Omega(\\Vh, \\Vx) = \\lambda \\sum_i \\| \\nabla_{\\Vx}h_i \\|^2.\n\\end{align}\n\n\n这迫使模型学习一个在$\\Vx$变化小时目标也没有太大变化的函数。\n因为这个惩罚只对训练数据适用，它迫使自编码器学习可以反映训练数据分布信息的特征。\n\n\n这样正则化的自编码器被称为收缩自编码器。\n这种方法与去噪自编码器、流形学习和概率模型存在一定理论联系。\n收缩自编码器将在\\sec?更详细地描述。\n\n\n\n# 表示能力、层的大小和深度\n\n自编码器通常只有单层的编码器和解码器，但这不是必然的。\n实际上深度编码器和解码器能提供更多优势。\n\n\n回忆\\sec?，其中提到加深前馈网络有很多优势。\n这些优势也同样适用于自编码器，因为它也属于前馈网络。\n此外，编码器和解码器各自都是一个前馈网络，因此这两个部分也能各自从深度结构中获得好处。\n\n\n万能近似定理, %万能逼近定理保证至少有一层隐藏层且隐藏单元足够多的前馈神经网络能以任意精度近似任意函数（在很大范围里），这是非平凡深度（至少有一层隐藏层）的一个主要优点。\n这意味着具有单隐藏层的自编码器在数据域内能表示任意近似数据的恒等函数。\n但是，从输入到编码的映射是浅层的。\n这意味这我们不能任意添加约束，比如约束编码稀疏。\n深度自编码器（编码器至少包含一层额外隐藏层）在给定足够多的隐藏单元的情况下，能以任意精度近似任何从输入到编码的映射。\n\n<!-- % -- 499 -- -->\n\n深度可以指数地降低表示某些函数的计算成本。\n深度也能指数地减少学习一些函数所需的训练数据量。\n读者可以参考\\sec?巩固深度在前馈网络中的优势。\n\n\n实验中，深度自编码器能比相应的浅层或线性自编码器产生更好的压缩效率{cite?}。\n\n训练深度自编码器的普遍策略是训练一堆浅层的自编码器来贪心地预训练相应的深度架构。\n所以即使最终目标是训练深度自编码器，我们也经常会遇到浅层自编码器。\n\n\n\n# 随机编码器和解码器\n\n自编码器本质上是一个前馈网络，可以使用与传统前馈网络相同的损失函数和输出单元。\n\n\n如\\sec?中描述，设计前馈网络的输出单元和损失函数普遍策略是定义一个输出分布$p(\\Vy \\mid \\Vx) $并最小化负对数似然$-\\log p(\\Vy \\mid \\Vx)$。\n在这种情况下，$\\Vy$是关于目标的向量（如类标）。\n\n\n在自编码器中，$\\Vx$既是输入也是目标。\n然而，我们仍然可以使用与之前相同的架构。\n给定一个隐藏编码 $\\Vh$，我们可以认为解码器提供了一个条件分布$p_{\\text{model}}(\\Vx \\mid \\Vh)$。\n接着我们根据最小化$-\\log p_{\\text{decoder}}(\\Vx \\mid \\Vh)$来训练自编码器。\n损失函数的具体形式视$p_{\\text{decoder}}$的形式而定。\n就传统的前馈网络来说，如果$\\Vx$是实值的，那么我们通常使用线性输出单元参数化高斯分布的均值。\n在这种情况下，负对数似然对应均方误差准则。\n类似地，二值$\\Vx$对应于一个~Bernoulli分布，其参数由~sigmoid~输出单元确定的。\n而离散的$\\Vx$对应~softmax~分布，以此类推。\n在给定$\\Vh$的情况下，为了便于计算概率分布，输出变量通常被视为是条件独立的，但一些技术（如混合密度输出）可以解决输出相关的建模。\n\n<!-- % -- 500 -- -->\n\n为了更彻底地与我们之前了解到的前馈网络相区别，我们也可以将\\textbf{编码函数}(encoding function)~$f(\\Vx)$的概念推广为\\textbf{编码分布}(encoding distribution)~$ p_{\\text{encoder}}(\\Vh \\mid \\Vx)$， 如\\fig?中所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/stochastic-autoencoder}}\n\\fi\n\\caption{随机自编码器的结构，其中编码器和解码器包括一些噪声注入，而不是简单的函数。\n这意味着可以将它们的输出视为来自分布的采样（对于编码器是$p_{\\text{encoder}}(\\Vh \\mid \\Vx)$，对于解码器是$p_{\\text{decoder}}(\\Vx\\mid \\Vh)$）。}\n\\end{figure}\n\n任何潜变量模型$p_{\\text{model}}(\\Vh, \\Vx)$定义一个随机编码器\n\\begin{align}\np_{\\text{encoder}}(\\Vh \\mid \\Vx) = p_{\\text{model}}(\\Vh\\mid\\Vx)\n\\end{align}\n以及一个随机解码器\n\\begin{align}\np_{\\text{decoder}}(\\Vx \\mid \\Vh) = p_{\\text{model}}(\\Vx\\mid\\Vh).\n\\end{align}\n通常情况下，编码器和解码器的分布没有必要是与唯一一个联合分布$p_{\\text{model}}(\\Vx, \\Vh)$相容的条件分布。\n{Alain-et-al-arxiv2015}指出，在保证足够的容量和样本的情况下，将编码器和解码器作为去噪自编码器训练，能使它们渐近地相容。\n\n\n\n\n# 去噪自编码器\n\n去噪自编码器是一类接受损坏数据作为输入，并训练来预测原始未被损坏数据作为输出的自编码器。\n\n<!-- % -- 501 -- -->\n\nDAE~的训练过程如\\fig?中所示。\n我们引入一个损坏过程$C(\\tilde{\\RVx} \\mid \\RVx)$，这个条件分布代表给定数据样本$\\RVx$产生损坏样本$\\tilde \\RVx$的概率。\n自编码器则根据以下过程，从训练数据对$(\\Vx, \\tilde \\Vx)$中学习\\textbf{重构分布}(reconstruction distribution)~$p_{\\text{reconstruct}} (\\RVx \\mid \\tilde \\RVx)$：\n\\begin{enumerate}\n+ 从训练数据中采一个训练样本$\\Vx$。\n+ 从$C(\\tilde{\\RVx} \\mid \\RVx=\\Vx)$采一个损坏样本$\\tilde \\Vx$。\n+ 将$(\\Vx, \\tilde \\Vx)$作为训练样本来估计自编码器的重构分布 \n$p_{\\text{reconstruct}} (\\Vx \\mid \\tilde \\Vx) = p_{\\text{decoder}}(\\Vx \\mid\\Vh)$，其中$\\Vh$是编码器 $f(\\tilde \\Vx)$的输出，$p_{\\text{decoder}}$根据解码函数$g(\\Vh)$定义。\n\\end{enumerate}\n通常我们可以简单地对负对数似然$-\\log p_{\\text{decoder}} (\\Vx \\mid \\Vh)$进行基于梯度法（如小批量梯度下降）的近似最小化。\n只要编码器是确定性的，去噪自编码器就是一个前馈网络，并且可以使用与其他前馈网络完全相同的方式进行训练。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/DAE}}\n\\fi\n\\caption{去噪自编码器代价函数的计算图。去噪自编码器被训练为从损坏的版本$\\tilde \\Vx$~重构干净数据点$\\Vx$。\n这可以通过最小化损失$L = - \\log p_{\\text{decoder}} (\\Vx \\mid \\Vh = f(\\tilde \\Vx))$实现，其中$\\tilde \\Vx$是样本$\\Vx$经过损坏过程$C (\\tilde \\Vx \\mid \\Vx)$后得到的损坏版本。\n通常， 分布$p_{\\text{decoder}}$是因子的分布（平均参数由前馈网络$g$给出）。\n}\n\\end{figure}\n\n因此我们可以认为~DAE~是在以下期望下进行随机梯度下降：\n\\begin{align}\n   - \\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})),\n\\end{align}\n其中$\\hat{p}_{\\text{data}}(\\Vx)$是训练数据的分布。\n\n<!-- % -- 502 -- -->\n\n\n## 得分估计\n\n得分匹配~{cite?}是最大似然的代替。\n它提供了概率分布的一致估计，促使模型在各个数据点$\\Vx$上获得与数据分布相同的得分。\n在这种情况下，得分是一个特定的梯度场：\n\\begin{align}\n \\nabla_{\\Vx} \\log p(\\Vx) .\n\\end{align}\n\n我们将在\\sec?中更详细地讨论得分匹配。\n对于现在讨论的自编码器，理解学习$\\log p_{\\text{data}}$的梯度场是学习$p_{\\text{data}}$结构的一种方式就足够了。\n\n\nDAE~的训练准则（条件高斯$p(\\Vx \\mid \\Vh)$）能让自编码器学到能估计数据分布得分的向量场$(g(f(\\Vx))-\\Vx)$ ，这是~DAE~的一个重要特性。\n具体如\\fig?所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/denoising_task}}\n\\fi\n\\caption{去噪自编码器被训练为将损坏的数据点$\\tilde \\Vx$映射回原始数据点$\\Vx$。\n我们将训练样本$\\Vx$表示为位于低维流形（粗黑线）附近的红叉。\n我们用灰色圆圈表示等概率的损坏过程$C(\\tilde \\Vx \\mid \\Vx)$。\n灰色箭头演示了如何将一个训练样本转换为经过此损坏过程的样本。\n当训练去噪自编码器最小化平方误差$\\| g(f(\\tilde \\Vx)) - \\Vx \\|^2$的平均值时，重构 $g(f(\\tilde \\Vx))$估计$\\SetE_{\\RVx, \\tilde{\\RVx} \\sim p_{\\text{data}}(\\RVx) C(\\tilde{\\RVx} \\mid \\RVx)}[\\RVx \\mid \\tilde{\\Vx}]$。\n$g(f(\\tilde \\Vx))$对可能产生$\\tilde \\Vx$的原始点$\\Vx$的质心进行估计，所以向量$ g(f(\\tilde \\Vx)) - \\tilde \\Vx $近似指向流形上最近的点。\n因此自编码器可以学习由绿色箭头表示的向量场$ g(f( \\Vx)) -  \\Vx $。\n该向量场将得分$\\nabla_{\\Vx} \\log p_{\\text{data}}(\\Vx)$估计为一个乘性因子，即重构误差均方根的平均。\n}\n\\end{figure}\n\n对一类采用高斯噪声和均方误差作为重构误差的特定去噪自编码器（具有sigmoid~隐藏单元和线性重构单元）的去噪训练过程，与训练一类特定的被称为~RBM~的无向概率模型是等价的{cite?}。\n这类模型将在\\sec?给出更详细的介绍；对于现在的讨论，我们只需知道这个模型能显式的给出$p_{\\text{model}}(\\Vx; \\Vtheta)$。\n当~RBM~使用去噪得分匹配算法~{cite?}训练时，它的学习算法与训练对应的去噪自编码器是等价的。\n在一个确定的噪声水平下，正则化的得分匹配不是一致估计量；相反它会恢复分布的一个模糊版本。\n然而，当噪声水平趋向于0且训练样本数趋向于无穷时，一致性就会恢复。\n我们将会在\\sec?更详细地讨论去噪得分匹配。\n\n\n自编码器和~RBM~还存在其他联系。\n在~RBM~上应用得分匹配后，其代价函数将等价于重构误差结合类似~CAE~惩罚的正则项 {cite?}。\n{Bengio+Delalleau-2009}指出自编码器的梯度是对~RBM~对比散度训练的近似。\n\n\n对于连续的$\\Vx$，高斯损坏和重构分布的去噪准则得到的得分估计适用于一般编码器和解码器的参数化{cite?}。\n这意味着一个使用平方误差准则\n\\begin{align}\n \\| g(f(\\tilde \\Vx)) - \\Vx \\|^2\n\\end{align}\n和噪声方差为$\\sigma^2 $的损坏\n\\begin{align}\n C(\\tilde x = \\tilde \\Vx \\mid \\Vx) = N(\\tilde \\Vx; \\mu=\\Vx, \\Sigma = \\sigma^2 I)\n\\end{align}\n的通用编码器-解码器架构可以用来训练估计得分。\n\\fig?展示其中的工作原理。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter14/figures/vector_field_color}}\n\\fi\n\\caption{由去噪自编码器围绕$1$维弯曲流形学习的向量场，其中数据集中在$2$维空间中。\n每个箭头与重构向量减去自编码器的输入向量后的向量成比例，并且根据隐式估计的概率分布指向较高的概率。\n向量场在估计的密度函数的最大值处（在数据流形上）和密度函数的最小值处都为零。\n例如，螺旋臂形成局部最大值彼此连接的$1$维流形。\n局部最小值出现在两个臂间隙的中间附近。\n当重构误差的范数（由箭头的长度示出）很大时，在箭头的方向上移动可以显著增加概率，并且在低概率的地方大多也是如此。\n自编码器将这些低概率点映射到较高的概率重构。\n在概率最大的情况下，重构变得更准确，因此箭头会收缩。\n经~{Alain+Bengio-ICLR2013-small}许可转载此图。\n}\n\\end{figure}\n\n一般情况下，不能保证重构函数$g(f(\\Vx))$减去输入$\\Vx$后对应于某个函数的梯度，更不用说得分 。\n这是早期工作~{cite?}专用于特定参数化的原因（其中$g(f(\\Vx)) - \\Vx$能通过另一个函数的导数获得）。\n{Kamyshanska+Memisevic-2015}通过标识一类特殊的浅层自编码器家族，使$g(f(\\Vx)) - \\Vx$对应于这个家族所有成员的一个得分，以此推广~{Vincent-NC-2011-small}的结果。\n\n<!-- % -- 504 -- -->\n\n目前为止我们所讨论的仅限于去噪自编码器如何学习表示一个概率分布。\n更一般的，我们可能希望使用自编码器作为生成模型，并从其分布中进行采样。\n这将在\\sec?中讨论。\n\n<!-- % -- 505 -- -->\n\n\n## 历史展望\n\n采用~MLP~去噪的想法可以追溯到~{Lecun-these87}和~{Gallinari87}的工作。\n{Behnke-2001}也曾使用循环网络对图像去噪。\n在某种意义上，去噪自编码器仅仅是被训练去噪的~MLP。\n然而，\"去噪自编码器\"的命名指的不仅仅是学习去噪，而且可以学到一个好的内部表示（作为学习去噪的副效用）。\n这个想法提出较晚{cite?}。\n学习到的表示可以被用来预训练更深的无监督网络或监督网络。\n与稀疏自编码器、稀疏编码、收缩自编码器等正则化的自编码器类似， DAE~的动机是允许学习容量很高的编码器，同时防止在编码器和解码器学习一个无用的恒等函数 。\n\n\n在引入现代~DAE~之前，{Inayoshi-and-Kurita-2005}探索了其中一些相同的方法和目标。\n他们除了在监督目标的情况下最小化重构误差之外，还在监督~MLP~的隐藏层注入噪声，通过引入重构误差和注入噪声提升泛化能力。\n然而，他们的方法基于线性编码器，因此无法学习到现代~DAE~能学习的强大函数族。\n\n\n\n\n# 使用自编码器学习流形\n\n\n如\\sec?描述，自编码器跟其他很多机器学习算法一样，也利用了数据集中在一个低维流形或者一小组这样的流形的思想。\n其中一些机器学习算法仅能学习到在流形上表现良好但给定不在流形上的输入会导致异常的函数。\n自编码器进一步借此想法，旨在学习流形的结构。\n\n\n要了解自编码器如何做到这一点，我们必须介绍流形的一些重要特性。\n\n\n流形的一个重要特征是切平面的集合。\n$d$维流形上的一点$\\Vx$，切平面由能张成流形上允许变动的局部方向的$d$维基向量给出。\n如\\fig?所示，这些局部方向决定了我们能如何微小地变动$\\Vx$而保持于流形上。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/tangent_plane_color}}\n\\fi\n\\caption{正切超平面概念的图示。\n我们在$784$维空间中创建了$1$维流形。\n我们使用一张784像素的MNIST图像，并通过垂直平移来转换它。\n垂直平移的量定义沿着1维流形的坐标，轨迹为通过图像空间的弯曲路径。\n该图显示了沿着该流形的几个点。\n为了可视化，我们使用~PCA~将流形投影到$2$维空间中。\n$n$维流形在每个点处都具有$n$维切平面。\n该切平面恰好在该点接触流形，并且在该点处平行于流形表面。\n它定义了为保持在流形上可以移动的方向空间。\n该$1$维流形具有单个切线。\n我们在图中示出了一个点处的示例切线，其中图像表示该切线方向在图像空间中是怎样的。\n灰色像素表示沿着切线移动时不改变的像素，白色像素表示变亮的像素，黑色像素表示变暗的像素。\n}\n\\end{figure}\n\n<!-- % -- 506 -- -->\n\n所有自编码器的训练过程涉及两种推动力的折衷：\n\\begin{enumerate}\n+ 学习训练样本$\\Vx$的表示 $\\Vh$使得$\\Vx$能通过解码器近似地从$\\Vh$中恢复。\n$\\Vx$是从训练数据挑出的这一事实很关键，因为这意味着自编码器不需要成功重构不属于数据生成分布下的输入。\n+ 满足约束或正则惩罚。\n这可以是限制自编码器容量的架构约束，也可以是加入到重构代价的一个正则项。\n这些技术一般倾向那些对输入较不敏感的解。\n\\end{enumerate}\n\n<!-- % -- 507 -- -->\n\n显然，单一的推动力是无用的——从它本身将输入复制到输出是无用的，同样忽略输入也是没用的。\n相反，两种推动力结合是有用的，因为它们驱使隐藏的表示能捕获有关数据分布结构的信息。\n重要的原则是，自编码器必须有能力表示\\emph{重构训练实例所需的变化}。\n如果该数据生成分布集中靠近一个低维流形，自编码器能隐式产生捕捉这个流形局部坐标系的表示：仅在$\\Vx$周围关于流形的相切变化需要对应于$\\Vh=f(\\Vx)$中的变化。\n因此，编码器学习从输入空间$\\Vx$到表示空间的映射，映射仅对沿着流形方向的变化敏感，并且对流形正交方向的变化不敏感。\n\n\n\\fig?中一维的例子说明，我们可以通过构建对数据点周围的输入扰动不敏感的重构函数，使得自编码器恢复流形结构。\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/1d_autoencoder_color}}\n\\fi\n\\caption{如果自编码器学习到对数据点附近的小扰动不变的重构函数，它就能捕获数据的流形结构。\n这里，流形结构是0维流形的集合。\n虚线对角线表示重构的恒等函数目标。 \n最佳重构函数会在存在数据点的任意处穿过恒等函数。\n图底部的水平箭头表示在输入空间中基于箭头的$r(\\Vx)-\\Vx$重建方向向量，总是指向最近的\"流形\"（1维情况下的单个数据点 ）。\n在数据点周围，去噪自编码器明确地尝试将重构函数$r(\\Vx)$的导数限制为很小。\n收缩自编码器的编码器执行相同操作。\n虽然在数据点周围，$r(\\Vx)$的导数被要求很小，但在数据点之间它可能会很大。\n数据点之间的空间对应于流形之间的区域，为将损坏点映射回流形，重构函数必须具有大的导数。\n\\end{figure}\n\n<!-- % -- 508 -- -->\n\n为了理解自编码器可用于流形学习的原因，我们可以将自编码器和其他方法进行对比。\n学习表征流形最常见的是流形上（或附近）数据点的表示。\n对于特定的实例，这样的表示也被称为嵌入。\n它通常由一个低维向量给出，具有比这个流形的\"外围\"空间更少的维数。\n有些算法（下面讨论的非参数流形学习算法）直接学习每个训练样例的嵌入，而其他算法学习更一般的映射（有时被称为编码器或表示函数），将周围空间（输入空间）的任意点映射到它的嵌入。\n\n\n流形学习大多专注于试图捕捉到这些流形的无监督学习过程。\n最初始的学习非线性流形的机器学习研究专注基于最近邻图的非参数方法。\n该图中每个训练样例对应一个节点，它的边连接近邻点对。\n如\\fig?所示，这些方法{cite?}将每个节点与张成实例和近邻之间的差向量变化方向的切平面相关联。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter14/figures/faces_graph_manifold}}\n\\fi\n\\caption{非参数流形学习过程构建的最近邻图，其中节点表示训练样本，有向边指示最近邻关系。\n因此，各种过程可以获得与图的邻域相关联的切平面以及将每个训练样本与实值向量位置或嵌入相关联的坐标系。\n我们可以通过插值将这种表示概括为新的样本。\n只要样本的数量大到足以覆盖流形的弯曲和扭转，这些方法工作良好。 \n图片来自QMUL 多角度人脸数据集{cite?}。\n}\n\\end{figure}\n\n全局坐标系则可以通过优化或求解线性系统获得。\n\\fig?展示了如何通过大量局部线性的类高斯样平铺（或\"薄煎饼\"，因为高斯块在切平面方向是扁平的）得到一个流形。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter14/figures/tiling-a-manifold}}\n\\fi\n\\caption{如果每个位置处的切平面（见\\fig?）是已知的，则它们可以平铺后形成全局坐标系或密度函数。\n每个局部块可以被认为是局部欧几里德坐标系或者是局部平面高斯或\"薄饼\"，在与薄饼正交的方向上具有非常小的方差而在定义坐标系的方向上具有非常大的方差。\n这些高斯的混合提供了估计的密度函数，如流形中的~Parzen~窗口算法{cite?} 或其非局部的基于神经网络的变体{cite?}。\n}\n\\end{figure}\n\n然而，{Bengio+Monperrus-2005}指出了这些局部非参数方法应用于流形学习的根本困难：如果流形不是很光滑（它们有许多波峰、波谷和曲折），为覆盖其中的每一个变化，我们可能需要非常多的训练样本，导致没有能力泛化到没见过的变化。\n实际上，这些方法只能通过内插，概括相邻实例之间流形的形状。\n不幸的是，AI~问题中涉及的流形可能具有非常复杂的结构，难以仅从局部插值捕获特征。\n考虑\\fig?转换所得的流形样例。\n如果我们只观察输入向量内的一个坐标$x_i$，当平移图像，我们可以观察到当这个坐标遇到波峰或波谷时，图像的亮度也会经历一个波峰或波谷。\n换句话说，底层图像模板亮度的模式复杂性决定执行简单的图像变换所产生的流形的复杂性。\n这是采用分布式表示和深度学习捕获流形结构的动机。\n\n<!-- % -- 509 -- -->\n\n\n# 收缩自编码器\n\n收缩自编码器~{cite?}在编码 $\\Vh = f(\\Vx)$的基础上添加了显式的正则项，鼓励$f$的导数尽可能小：\n\\begin{align}\n \\Omega(\\Vh) = \\lambda \\Bigg\\| \\frac{\\partial f(\\Vx)}{\\partial \\Vx} \\Bigg\\|_F^2 .\n\\end{align}\n惩罚项$\\Omega(\\Vh)$为平方~Frobenius~范数（元素平方之和），作用于与编码器的函数相关偏导数的~Jacobian~矩阵。\n\n\n去噪自编码器和收缩自编码器之间存在一定联系：{Alain+Bengio-ICLR2013-small}指出在小高斯噪声的限制下，当重构函数将$\\Vx$映射到$\\Vr = g(f(\\Vx))$时，去噪重构误差与收缩惩罚项是等价的。\n换句话说，去噪自编码器能抵抗小且有限的输入扰动，而收缩自编码器使特征提取函数能抵抗极小的输入扰动。\n\n分类任务中，基于~Jacobian~的收缩惩罚预训练特征函数$f(\\Vx)$，将收缩惩罚应用在$f(\\Vx)$而不是$g(f(\\Vx))$可以产生最好的分类精度。\n如\\sec?所讨论，应用于$f(\\Vx)$的收缩惩罚与得分匹配也有紧密的联系。\n\n收缩源于~CAE~弯曲空间的方式。\n具体来说，由于~CAE~训练为抵抗输入扰动，鼓励将输入点邻域映射到输出点处更小的邻域。\n我们能认为这是将输入的邻域收缩到更小的输出邻域。\n\n\n说得更清楚一点，CAE~只在局部收缩——一个训练样本$\\Vx$的所有扰动都映射到$f(\\Vx)$的附近。\n全局来看，两个不同的点$\\Vx$和$\\Vx'$会分别被映射到远离原点的两个点$f(\\Vx)$和$f(\\Vx')$。\n$f$扩展到数据流形的中间或远处是合理的（见\\fig?中小例子的情况）。\n当$\\Omega(\\Vh)$惩罚应用于~sigmoid~单元时，收缩~Jacobian~的简单方式是令~sigmoid~趋向饱和的0或1。\n这鼓励~CAE~使用~sigmoid~的极值编码输入点，或许可以解释为二进制编码。\n它也保证了~CAE~可以穿过大部分~sigmoid~隐藏单元能张成的超立方体，进而扩散其编码值。\n\n我们可以认为点$\\Vx$处的~Jacobian~矩阵$\\MJ$能将非线性编码器近似为线性算子。\n这允许我们更形式地使用\"收缩\"这个词。\n在线性理论中，当$\\MJ\\Vx$的范数对于所有单位$\\Vx$都小于等于1时，$\\MJ$被称为收缩的。\n换句话说，如果$\\MJ$收缩了单位球，他就是收缩的。\n我们可以认为~CAE~为鼓励每个局部线性算子具有收缩性，而在每个训练数据点处将~Frobenius~范数作为$f(\\Vx)$的局部线性近似的惩罚。\n\n\n如\\sec?中描述，正则自编码器基于两种相反的推动力学习流形。\n在~CAE~的情况下，这两种推动力是重构误差和收缩惩罚$\\Omega(\\Vh)$。\n单独的重构误差鼓励~CAE~学习一个恒等函数。\n单独的收缩惩罚将鼓励~CAE~学习关于$\\Vx$是恒定的特征。\n这两种推动力的折衷产生导数$\\frac{\\partial f(\\Vx)}{\\partial \\Vx}$大多是微小的自编码器。\n只有少数隐藏单元，对应于一小部分输入数据的方向，可能有显著的导数。\n\n\nCAE~的目标是学习数据的流形结构。\n使$\\MJ\\Vx$很大的方向$\\Vx$，会快速改变$\\Vh$，因此很可能是近似流形切平面的方向。\n{Rifai+al-2011-small,Salah+al-2011-small}的实验显示训练~CAE~会导致$\\MJ$中大部分奇异值（幅值）比1小，因此是收缩的。\n然而，有些奇异值仍然比1大，因为重构误差的惩罚鼓励~CAE~对最大局部变化的方向进行编码。\n对应于最大奇异值的方向被解释为收缩自编码器学到的切方向。\n理想情况下，这些切方向应对应于数据的真实变化。\n比如，一个应用于图像的~CAE~应该能学到显示图像改变的切向量，如\\fig?图中物体渐渐改变状态。\n如\\fig?所示，实验获得的奇异向量的可视化似乎真的对应于输入图象有意义的变换。\n\n<!-- % -- 512 -- -->\n\n\\begin{figure}[ht]\n\\centering\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n<!-- % ?? I do NOT which is correct ... -->\n\\begin{tabular}{p{.1\\figwidth}|p{.86\\figwidth}}\nInput point & Tangent vectors\\\\\n\\hline \n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_tangent_input.png} & \n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_local_pca.png}\\\\\n & Local PCA (no sharing across regions)\\\\\n \\hline\n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_tangent_input.png} & \n\\includegraphics[width=\\linewidth]{Chapter14/figures/cifar_cae.png}\\\\\n & Contractive autoencoder\\\\\n\\end{tabular}\n\\fi\n\\caption{通过局部~PCA~和收缩自编码器估计的流形切向量的图示。\n流形的位置由来自CIFAR-10数据集中狗的输入图像定义。\n切向量通过输入到代码映射的~Jacobian~矩阵$\\frac{\\partial \\Vh}{\\partial \\Vx}$ 的前导奇异向量估计。\n虽然局部~PCA~和~CAE~都可以捕获局部切方向，但~CAE~能够从有限训练数据形成更准确的估计，因为它利用了不同位置的参数共享（共享激活的隐藏单元子集）。\nCAE切方向通常对应于物体的移动或改变部分（例如头或腿）。\n经~{Dauphin-et-al-NIPS2011-small}许可转载此图。\n}\n\\end{figure}\n\n\n收缩自编码器正则化准则的一个实际问题是，尽管它在单一隐藏层的自编码器情况下是容易计算的，但在更深的自编码器情况下会变的难以计算。\n根据~{Rifai+al-2011-small}的策略，分别训练一系列单层的自编码器，并且每个被训练为重构前一个自编码器的隐藏层。\n这些自编码器的组合就组成了一个深度自编码器。\n因为每个层分别训练成局部收缩，深度自编码器自然也是收缩的。\n这个结果与联合训练深度模型完整架构（带有关于Jacobian的惩罚项）获得的结果是不同的，但它抓住了许多理想的定性特征。\n\n\n另一个实际问题是，如果我们不对解码器强加一些约束，收缩惩罚可能导致无用的结果。\n例如，编码器将输入乘一个小常数$\\epsilon$，解码器将编码除以一个小常数$\\epsilon$。\n随着$\\epsilon$趋向于0，编码器会使收缩惩罚项$\\Omega(\\Vh)$趋向于0而学不到任何关于分布的信息。\n同时，解码器保持完美的重构。\n{Rifai+al-2011-small}通过绑定$f$和$g$的权重来防止这种情况。\n$f$和$g$都是由线性仿射变换后进行逐元素非线性变换的标准神经网络层组成，因此将$g$的权重矩阵设成$f$权重矩阵的转置是很直观的。\n\n<!-- % -- 513 -- -->\n\n\n# 预测稀疏分解\n\n\n预测稀疏分解是稀疏编码和参数化自编码器~{cite?}的混合模型。\n参数化编码器被训练为能预测迭代推断的输出。\nPSD~被应用于图片和视频中对象识别的无监督特征学习{cite?}，在音频中也有所应用{cite?}。\n这个模型由一个编码器 $f(\\Vx)$和一个解码器 $g(\\Vh)$组成，并且都是参数化的。\n在训练过程中，$\\Vh$由优化算法控制。\n优化过程是最小化\n\\begin{align}\n \\| \\Vx - g(\\Vh) \\| ^2 + \\lambda | \\Vh |_1 + \\gamma \\| \\Vh - f(\\Vx) \\|^2.\n\\end{align}\n就像稀疏编码，训练算法交替地相对$\\Vh$和模型的参数最小化上述目标。\n相对$\\Vh$最小化较快，因为$f(\\Vx)$提供$\\Vh$的良好初始值以及损失函数将$\\Vh$约束在$f(\\Vx)$附近。\n简单的梯度下降算法只需10步左右就能获得理想的$\\Vh$。\n\n\nPSD~所使用的训练程序不是先训练稀疏编码模型，然后训练$f(\\Vx)$来预测稀疏编码的特征。\nPSD~训练过程正则化解码器，使用$f(\\Vx)$可以推断出良好编码的参数。\n\n\n预测稀疏分解是学习近似推断的一个例子。\n在\\sec?中，这个话题将会进一步展开。\n\\chap?中展示的工具能让我们了解到，PSD~能够被解释为通过最大化模型的对数似然下界训练有向稀疏编码的概率模型。\n\n\n在~PSD~的实际应用中，迭代优化仅在训练过程中使用。\n模型被部署后，参数编码器 $f$用于计算已经习得的特征。\n相比通过梯度下降推断$\\Vh$，计算$f$是很容易的。\n因为$f$是一个可微带参函数，PSD~模型可堆叠，并用于初始化其他训练准则的深度网络。\n\n<!-- % -- 514 -- -->\n\n\n# 自编码器的应用\n\n\n自编码器已成功应用于降维和信息检索任务。\n降维是表示学习和深度学习的第一批应用之一。\n它是研究自编码器早期驱动力之一。\n例如， {Hinton-Science2006}训练了一个栈式~RBM，然后利用它们的权重初始化一个隐藏层逐渐减小的深度自编码器，终结于30个单元的瓶颈。\n生成的编码比30维的~PCA~产生更少的重构误差，所学到的表示更容易定性解释，并能联系基础类别，这些类别表现为分离良好的集群。\n\n\n低维表示可以提高许多任务的性能，例如分类。\n小空间的模型消耗更少的内存和运行时间。\n据~{Salakhutdinov+Hinton2007-small}和~{Torralba+Fergus+Weiss-2008}观察，许多降维的形式会将语义上相关的样本置于彼此邻近的位置。\n映射到低维空间所提供的线索有助于泛化。\n\n\n相比普通任务，信息检索从降维中获益更多，此任务需要找到数据库中类似查询的条目。\n此任务不仅和其他任务一样从降维中获得一般益处，还使某些低维空间中的搜索变得极为高效。\n特别的，如果我们训练降维算法生成一个低维且\\emph{二值}的编码，那么我们就可以将所有数据库条目在哈希表映射为二值编码向量。\n这个哈希表允许我们返回具有相同二值编码的数据库条目作为查询结果进行信息检索。\n我们也可以非常高效地搜索稍有不同条目，只需反转查询编码的各个位。\n这种通过降维和二值化的信息检索方法被称为语义哈希{cite?}，已经被用于文本输入{cite?}和图像{cite?}。\n\n\n通常在最终层上使用~sigmoid~编码函数产生语义哈希的二值编码。\nsigmoid~单元必须被训练为到达饱和，对所有输入值都接近0或接近1。\n能做到这一点的窍门就是训练时在~sigmoid~非线性单元前简单地注入加性噪声。\n噪声的大小应该随时间增加。\n要对抗这种噪音并且保存尽可能多的信息，网络必须加大输入到~sigmoid~函数的幅度，直到饱和。\n\n<!-- % -- 515 -- -->\n\n学习哈希函数的思想已在其他多个方向进一步探讨，包括改变损失训练表示的想法，其中所需优化的损失与哈希表中查找附近样本的任务有更直接的联系{cite?}。\n\n"
  },
  {
    "path": "docs/_posts/2016-12-15-Chapter15_representation_learning.md",
    "content": "---\ntitle: 表示学习\nlayout: post\nshare: false\n---\n\n<!-- % 517 head -->\n\n在本章中，首先我们会讨论学习表示是什么意思，以及表示的概念如何有助于深度框架的设计。\n我们探讨学习算法如何在不同任务中共享统计信息，包括使用无监督任务中的信息来完成监督任务。\n共享表示有助于处理多模式或多领域，或是将已学到的知识迁移到样本很少或没有、但任务表示依然存在的任务上。\n最后，我们回过头探讨表示学习成功的原因，从分布式表示~{cite?}和深度表示的理论优势，最后会讲到数据生成过程潜在假设的更一般概念，特别是观测数据的基本成因。\n\n\n很多信息处理任务可能非常容易，也可能非常困难，这取决于信息是如何表示的。\n这是一个广泛适用于日常生活、计算机科学及机器学习的基本原则。\n例如，对于人而言，可以直接使用长除法计算$210$除以$6$。\n但如果使用罗马数字表示，这个问题就没那么直接了。\n大部分现代人在使用罗马数字计算~CCX~除以~VI~时，都会将其转化成阿拉伯数字，从而使用位值系统的长除法。\n更具体地，我们可以使用合适或不合适的表示来量化不同操作的渐近运行时间。\n例如，插入一个数字到有序表中的正确位置，如果该数列表示为链表，那么所需时间是$O(n)$；如果该列表表示为红黑树，那么只需要$O(\\log n)$的时间。\n\n<!-- % -- 517 -- -->\n\n在机器学习中，到底是什么因素决定了一种表示比另一种表示更好呢？\n一般而言，一个好的表示可以使后续的学习任务更容易。\n选择什么表示通常取决于后续的学习任务。\n\n<!-- % 518 head  -->\n\n\n我们可以将监督学习训练的前馈网络视为表示学习的一种形式。\n具体地，网络的最后一层通常是线性分类器，如~softmax~回归分类器。\n网络的其余部分学习出该分类器的表示。\n监督学习训练模型，一般会使得模型的各个隐藏层（特别是接近顶层的隐藏层）的表示能够更加容易地完成训练任务。\n例如，输入特征线性不可分的类别可能在最后一个隐藏层变成线性可分离的。\n原则上，最后一层可以是另一种模型，如最近邻分类器~{cite?}。\n倒数第二层的特征应该根据最后一层的类型学习不同的性质。\n<!-- % 518 mid -->\n\n\n前馈网络的监督训练并没有给学成的中间特征明确强加任何条件。\n其他的表示学习算法往往会以某种特定的方式明确设计表示。\n例如，我们想要学习一种使得密度估计更容易的表示。\n具有更多独立性的分布会更容易建模，因此，我们可以设计鼓励表示向量$\\Vh$中元素之间相互独立的目标函数。\n就像监督网络，无监督深度学习算法有一个主要的训练目标，但也额外地学习出了表示。\n不论该表示是如何得到的，它都可以用于其他任务。\n或者，多个任务（有些是监督的，有些是无监督的）可以通过共享的内部表示一起学习。\n\n\n<!-- % 518 mid  -->\n\n大多数表示学习算法都会在尽可能多地保留与输入相关的信息和追求良好的性质（如独立性）之间作出权衡。\n\n\n<!-- % 518 mid  -->\n表示学习特别有趣，因为它提供了进行无监督学习和半监督学习的一种方法。\n我们通常会有巨量的未标注训练数据和相对较少的标注训练数据。\n在非常有限的标注数据集上监督学习通常会导致严重的过拟合。\n半监督学习通过进一步学习未标注数据，来解决过拟合的问题。\n具体地，我们可以从未标注数据上学习出很好的表示，然后用这些表示来解决监督学习问题。\n<!-- % 518 end -->\n\n\n人类和动物能够从非常少的标注样本中学习。\n我们至今仍不知道这是如何做到的。\n有许多假说解释人类的卓越学习能力——例如，大脑可能使用了大量的分类器或者贝叶斯推断技术的集成。\n一种流行的假说是，大脑能够利用无监督学习和半监督学习。\n利用未标注数据有多种方式。\n在本章中，我们主要使用的假说是未标注数据可以学习出良好的表示。\n\n<!-- % -- 519 head -->\n\n\n\n# 贪心逐层无监督预训练\n\n无监督学习在深度神经网络的复兴上起到了关键的、历史性的作用，它使研究者首次可以训练不含诸如卷积或者循环这类特殊结构的深度监督网络。\n我们将这一过程称为无监督预训练，或者更精确地，贪心逐层无监督预训练。\n此过程是一个任务（无监督学习，尝试获取输入分布的形状）的表示如何有助于另一个任务（具有相同输入域的监督学习）的典型示例。\n<!-- % 519 mid -->\n\n\n贪心逐层无监督预训练依赖于单层表示学习算法，例如~RBM、单层自编码器、稀疏编码模型或其他学习潜在表示的模型。\n每一层使用无监督学习预训练，将前一层的输出作为输入，输出数据的新的表示。\n这个新的表示的分布（或者是和其他变量比如要预测类别的关系）有可能是更简单的。\n如\\alg?所示的正式表述。\n\n\\begin{algorithm}\n\\caption{ {\\em 贪心逐层无监督预训练的协定}\\\\\n给定如下：无监督特征学习算法$\\CalL$，$\\CalL$使用训练集样本并返回编码器或特征函数$f$。\n原始输入数据是$\\MX$，每行一个样本，并且$f^{(1)}(\\MX)$是第一阶段编码器关于$\\MX$的输出。\n在执行精调的情况下，我们使用学习者$\\CalT$，并使用初始函数$f$，输入样本$\\MX$（以及在监督精调情况下关联的目标$\\MY$），并返回细调好函数。 阶段数为$m$。\n}\n\\begin{algorithmic}\n\\STATE $f \\leftarrow$ 恒等函数\n\\STATE $\\tilde{\\MX} = \\MX$\n\\FOR {$k=1, \\ldots, m$}\n  \\STATE $f^{(k)} = {\\CalL}(\\tilde{\\MX})$\n  \\STATE $f \\leftarrow f^{(k)} \\circ f$\n  \\STATE $\\tilde{\\MX} \\leftarrow f^{(k)}(\\tilde{\\MX})$\n\\ENDFOR\n\\IF {\\em fine-tuning}\n  \\STATE $f \\leftarrow {\\CalT}(f,\\MX,\\MY)$\n\\ENDIF\n\\STATE {\\bf Return} $f$\n\\end{algorithmic}\n\\end{algorithm}\n<!-- % 521 head -->\n\n\n基于无监督标准的贪心逐层训练过程，早已被用来规避监督问题中深度神经网络难以联合训练多层的问题。\n这种方法至少可以追溯神经认知机~{cite?}。\n深度学习的复兴始于2006年，源于发现这种贪心学习过程能够为多层联合训练过程找到一个好的初始值，甚至可以成功训练全连接的结构~{cite?}。\n在此发现之前，只有深度卷积网络或深度循环网络这类特殊结构的深度网络被认为是有可能训练的。\n现在我们知道训练具有全连接的深度结构时，不再需要使用贪心逐层无监督预训练，但无监督预训练是第一个成功的方法。\n\n<!-- % 519 end -->\n\n贪心逐层无监督预训练被称为贪心的，是因为它是一个贪心算法，\n这意味着它独立地优化解决方案的每一个部分，每一步解决一个部分，而不是联合优化所有部分。\n它被称为逐层的，是因为这些独立的解决方案是网络层。\n具体地，贪心逐层无监督预训练每次处理一层网络，训练第$k$层时保持前面的网络层不变。\n特别地，低层网络（最先训练的）不会在引入高层网络后进行调整。\n它被称为无监督的，是因为每一层用无监督表示学习算法训练。\n然而，它也被称为预训练，是因为它只是在联合训练算法精调所有层之前的第一步。\n在监督学习任务中，它可以被看作是正则化项（在一些实验中，预训练不能降低训练误差，但能降低测试误差）和参数初始化的一种形式。\n\n<!-- % 520 head -->\n\n通常而言，\"预训练\"不仅单指预训练阶段，也指结合预训练和监督学习的两阶段学习过程。\n监督学习阶段可能会使用预训练阶段得到的顶层特征训练一个简单分类器，或者可能会对预训练阶段得到的整个网络进行监督精调。\n不管采用什么类型的监督学习算法和模型，在大多数情况下，整个训练过程几乎是相同的。\n虽然无监督学习算法的选择将明显影响到细节，但是大多数无监督预训练应用都遵循这一基本方法。\n<!-- % 520 mid -->\n\n\n贪心逐层无监督预训练也能用作其他无监督学习算法的初始化，比如深度自编码器~{cite?}和具有很多潜变量层的概率模型。\n这些模型包括深度信念网络~{cite?}和深度玻尔兹曼机~{cite?}。\n这些深度生成模型会在\\chap?中讨论。\n<!-- % 520 mid -->\n\n\n正如\\sec?所探讨的，我们也可以进行贪心逐层\\emph{监督}预训练。\n这是建立在训练浅层模型比深度模型更容易的前提下，而该前提似乎在一些情况下已被证实~{cite?}。\n\n<!-- % 520 end -->\n\n\n## 何时以及为何无监督预训练有效？\n\n\n<!-- % 520 end -->\n\n在很多分类任务中，贪心逐层无监督预训练能够在测试误差上获得重大提升。\n这一观察结果始于2006年对深度神经网络的重新关注~{cite?}。\n然而，在很多其他问题上，无监督预训练不能带来改善，甚至还会带来明显的负面影响。\n{Ma-et-al-2015}研究了预训练对机器学习模型在化学活性预测上的影响。\n结果发现，平均而言预训练是有轻微负面影响的，但在有些问题上会有显著帮助。\n由于无监督预训练有时有效，但经常也会带来负面效果，因此很有必要了解它何时有效以及有效的原因，以确定它是否适合用于特定的任务。\n\n<!-- % 521 mid -->\n\n\n首先，要注意的是这个讨论大部分都是针对贪心无监督预训练而言。\n还有很多其他完全不同的方法使用半监督学习来训练神经网络，比如\\sec?介绍的虚拟对抗训练。\n我们还可以在训练监督模型的同时训练自编码器或生成模型。\n这种单阶段方法的例子包括判别RBM~{cite?}和梯形网络~{cite?}，其中整体目标是两项之和（一个使用标签，另一个仅仅使用输入）。\n\n<!-- % 521 end -->\n\n无监督预训练结合了两种不同的想法。\n第一，它利用了深度神经网络对初始参数的选择，可以对模型有着显著的正则化效果（在较小程度上，可以改进优化）的想法。\n第二，它利用了更一般的想法——学习输入分布有助于学习从输入到输出的映射。\n\n<!-- % 522 head -->\n\n这两个想法都涉及到机器学习算法中多个未能完全理解的部分之间复杂的相互作用。\n\n<!-- % 522 mid -->\n第一个想法，即深度神经网络初始参数的选择对其性能具有很强的正则化效果，很少有关于这个想法的理解。\n在预训练变得流行时，在一个位置初始化模型被认为会使其接近某一个局部极小点，而不是另一个局部极小点。%?? 难以理解\n如今，局部极小值不再被认为是神经网络优化中的严重问题。\n现在我们知道标准的神经网络训练过程通常不会到达任何形式的临界点。\n仍然可能的是，预训练会初始化模型到一个可能不会到达的位置——例如，某种区域，其中代价函数从一个样本点到另一个样本点变化很大，而小批量只能提供噪声严重的梯度估计，或是某种区域中的~Hessian~矩阵条件数是病态的，梯度下降必须使用非常小的步长。\n然而，我们很难准确判断监督学习期间预训练参数的哪些部分应该保留。\n这是现代方法通常同时使用无监督学习和监督学习，而不是依序使用两个学习阶段的原因之一。\n除了这些复杂的方法可以让监督学习阶段保持无监督学习阶段提取的信息之外，还有一种简单的方法，固定特征提取器的参数，仅仅将监督学习作为顶层学成特征的分类器。\n\n<!-- % 522 mid -->\n\n另一个想法有更好的理解，即学习算法可以使用无监督阶段学习的信息，在监督学习的阶段表现得更好。\n其基本想法是对于无监督任务有用的一些特征对于监督学习任务也可能是有用的。\n例如，如果我们训练汽车和摩托车图像的生成模型，它需要知道轮子的概念，以及一张图中应该有多少个轮子。\n如果我们幸运的话，无监督阶段学习的轮子表示会适合于监督学习。\n然而我们还未能从数学、理论层面上证明，因此并不总是能够预测哪种任务能以这种形式从无监督学习中受益。\n这种方法的许多方面高度依赖于具体使用的模型。\n例如，如果我们希望在预训练特征的顶层添加线性分类器，那么（学习到的）特征必须使潜在的类别是线性可分离的。%??    学习到的， 译者加， 便于理解\n这些性质通常会在无监督学习阶段自然发生，但也并非总是如此。\n这是另一个监督和无监督学习同时训练更可取的原因——输出层施加的约束很自然地从一开始就包括在内。\n\n<!-- % 523 head -->\n\n从无监督预训练作为学习一个表示的角度来看，我们可以期望无监督预训练在初始表示较差的情况下更有效。\n一个重要的例子是词嵌入。\n使用~one-hot~向量表示的词并不具有很多信息，因为任意两个不同的~one-hot~向量之间的距离（平方$L^2$距离都是$2$ )都是相同的。\n学成的词嵌入自然会用它们彼此之间的距离来编码词之间的相似性。\n因此，无监督预训练在处理单词时特别有用。\n然而在处理图像时是不太有用的，可能是因为图像已经在一个很丰富的向量空间中，其中的距离只能提供低质量的相似性度量。\n\n<!-- % 523 mid -->\n\n从无监督预训练作为正则化项的角度来看，我们可以期望无监督预训练在标注样本数量非常小时很有帮助。\n因为无监督预训练添加的信息来源于未标注数据，所以当未标注样本的数量非常大时，我们也可以期望无监督预训练的效果最好。\n无监督预训练的大量未标注样本和少量标注样本构成的半监督学习的优势特别明显。\n在2011年，无监督预训练赢得了两个国际迁移学习比赛~{cite?}。\n在该情景中，目标任务中标注样本的数目很少（每类几个到几十个）。\n这些效果也出现在被~{paine2014analysis}严格控制的实验中。\n\n<!-- % 523 mid -->\n\n还可能涉及到一些其他的因素。\n例如，当我们要学习的函数非常复杂时，无监督预训练可能会非常有用。\n无监督学习不同于权重衰减这样的正则化项，它不偏向于学习一个简单的函数，而是学习对无监督学习任务有用的特征函数。\n如果真实的潜在函数是复杂的，并且由输入分布的规律塑造，那么无监督学习更适合作为正则化项。\n\n<!-- % 523 end -->\n\n除了这些注意事项外，我们现在分析一些无监督预训练改善性能的成功示例，并解释这种改进发生的已知原因。\n无监督预训练通常用来改进分类器，并且从减少测试集误差的观点来看是很有意思的。\n然而，无监督预训练还有助于分类以外的任务，并且可以用于改进优化，而不仅仅只是作为正则化项。\n例如，它可以提高去噪自编码器的训练和测试重构误差~{cite?}。\n\n<!-- % 524 head -->\n\n{Erhan+al-2010-small}进行了许多实验来解释无监督预训练的几个成功原因。\n对训练误差和测试误差的改进都可以解释为，无监督预训练将参数引入到了其他方法可能探索不到的区域。\n神经网络训练是非确定性的，并且每次运行都会收敛到不同的函数。\n训练可以停止在梯度很小的点；也可以提前终止结束训练，以防过拟合；\n还可以停止在梯度很大，但由于诸如随机性或~Hessian~矩阵病态条件等问题难以找到合适下降方向的点。\n经过无监督预训练的神经网络会一致地停止在一片相同的函数空间区域，但未经过预训练的神经网络会一致地停在另一个区域。\n\\fig?可视化了这种现象。\n经过预训练的网络到达的区域是较小的，这表明预训练减少了估计过程的方差，这进而又可以降低严重过拟合的风险。\n换言之，无监督预训练将神经网络参数初始化到它们不易逃逸的区域，并且遵循这种初始化的结果更加一致，和没有这种初始化相比，结果很差的可能性更低。\n\n<!-- % 524 mid -->\n\n{Erhan+al-2010-small}也回答了\\emph{何时}预训练效果最好——预训练的网络越深，测试误差的均值和方差下降得越多。\n值得注意的是，这些实验是在训练非常深层网络的现代方法发明和流行（整流线性单元，Dropout~和批标准化）之前进行的，因此对于无监督预训练与当前方法的结合，我们所知甚少。\n\n<!-- % 524 mid -->\n\n\n一个重要的问题是无监督预训练是如何起到正则化项作用的。\n一个假设是，预训练鼓励学习算法发现那些与生成观察数据的潜在原因相关的特征。\n这也是启发除无监督预训练之外许多其他算法的重要思想，将会在\\sec?中进一步讨论。\n\n<!-- % 524 mid   -->\n\n\n与无监督学习的其他形式相比，无监督预训练的缺点是其使用了两个单独的训练阶段。\n很多正则化技术都具有一个优点，允许用户通过调整单一超参数的值来控制正则化的强度。\n无监督预训练没有一种明确的方法来调整无监督阶段正则化的强度。\n相反，无监督预训练有许多超参数，但其效果只能之后度量，通常难以提前预测。\n当我们同时执行无监督和监督学习而不使用预训练策略时，会有单个超参数（通常是附加到无监督代价的系数）控制无监督目标正则化监督模型的强度。\n减少该系数，总是能够可预测地获得较少正则化强度。\n在无监督预训练的情况下，没有一种灵活调整正则化强度的方式——要么监督模型初始化为预训练的参数，要么不是。\n\n<!-- % 525 end -->\n\n<!-- % 525 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/isomap_color}}\n\\fi\n\\caption{在\\emph{函数空间}（并非参数空间，避免从参数向量到函数的多对一映射）不同神经网络的学习轨迹的非线性映射的可视化。\n不同网络采用不同的随机初始化，并且有的使用了无监督预训练，有的没有。\n每个点对应着训练过程中一个特定时间的神经网络。\n经{Erhan+al-2010-small}许可改编此图。\n函数空间中的坐标是关于每组输入$\\Vx$和它的一个输出$\\Vy$的无限维向量。\n{Erhan+al-2010-small}将很多特定$\\Vx$的$\\Vy$连接起来，线性投影到高维空间中。\n然后他们使用~Isomap~{cite?}进行进一步的非线性投影并投到二维空间。\n颜色表示时间。\n所有的网络初始化在上图的中心点附近（对应的函数区域在不多数输入上具有近似均匀分布的类别$y$）。\n随着时间推移，学习将函数向外移动到预测得更好的点。\n当使用预训练时，训练会一致地收敛到同一个区域；\n而不使用预训练时，训练会收敛到另一个不重叠的区域。\nIsomap~试图维持全局相对距离（体积因此也保持不变），因此使用预训练的模型对应的较小区域意味着，基于预训练的估计具有较小的方差。\n}\n\\end{figure}\n\n<!-- % 525 head -->\n\n<!-- % 525 end  -->\n\n具有两个单独的训练阶段的另一个缺点是每个阶段都具有各自的超参数。\n第二阶段的性能通常不能在第一阶段期间预测，因此在第一阶段提出超参数和第二阶段根据反馈来更新之间存在较长的延迟。\n最通用的方法是在监督阶段使用验证集上的误差来挑选预训练阶段的超参数，如~{Larochelle-jmlr-2009}中讨论的。\n在实际中，有些超参数，如预训练迭代的次数，很方便在预训练阶段设定，通过无监督目标上使用提前终止策略完成。\n这个策略并不理想，但是在计算上比使用监督目标代价小得多。\n\n<!-- % 526 head -->\n\n如今，大部分算法已经不使用无监督预训练了，除了在自然语言处理领域中单词作为~one-hot~向量的自然表示不能传达相似性信息，并且有非常多的未标注数据集可用。\n在这种情况下，预训练的优点是可以对一个巨大的未标注集合（例如用包含数十亿单词的语料库）进行预训练，学习良好的表示（通常是单词，但也可以是句子），然后使用该表示或精调它，使其适合于训练集样本大幅减少的监督任务。\n这种方法由~{CollobertR2008-small}、{Turian+Ratinov+Bengio-2010-small}和~{collobert2011natural}开创，至今仍在使用。\n\n<!-- % 526 mid -->\n\n\n基于监督学习的深度学习技术，通过~Dropout~或批标准化来正则化，能够在很多任务上达到人类级别的性能，但仅仅是在极大的标注数据集上。\n在中等大小的数据集（例如~CIFAR-10和~MNIST，每个类大约有5,000个标注样本）上，这些技术的效果比无监督预训练更好。\n在极小的数据集，例如选择性剪接数据集，贝叶斯方法要优于基于无监督预训练的方法~{cite?}。\n由于这些原因，无监督预训练已经不如以前流行。\n然而，无监督预训练仍然是深度学习研究历史上的一个重要里程碑，并将继续影响当代方法。\n预训练的想法已经推广到监督预训练，这将在\\sec?中讨论，在迁移学习中这是非常常用的方法。\n迁移学习中的监督预训练流行~{cite?}于在~ImageNet~数据集上使用卷积网络预训练。\n由于这个原因，实践者们公布了这些网络训练出的参数，就像自然语言任务公布预训练的单词向量一样~{cite?}。\n\n<!-- % 526 end -->\n\n\n# 迁移学习和领域自适应\n\n迁移学习和领域自适应指的是利用一个情景（例如，分布$P_1$）中已经学到的内容去改善另一个情景（比如分布$P_2$）中的泛化情况。\n这点概括了上一节提出的想法，即在无监督学习任务和监督学习任务之间转移表示。\n\n<!-- %527 head -->\n\n在迁移学习中，学习器必须执行两个或更多个不同的任务，但是我们假设能够解释$P_1$变化的许多因素和学习$P_2$需要抓住的变化相关。\n这通常能够在监督学习中解释，输入是相同的，但是输出不同的性质。\n例如，我们可能在第一种情景中学习了一组视觉类别，比如猫和狗，然后在第二种情景中学习一组不同的视觉类别，比如蚂蚁和黄蜂。\n如果第一种情景（从$P_1$采样）中具有非常多的数据，那么这有助于学习到能够使得从$P_2$抽取的非常少样本中快速泛化的表示。%??\n许多视觉类别\\emph{共享}一些低级概念，比如边缘、视觉形状、几何变化、光照变化的影响等等。\n一般而言，当存在对不同情景或任务有用特征时，并且这些特征对应多个情景出现的潜在因素，迁移学习、多任务学习（\\sec?）和领域自适应可以使用表示学习来实现。\n如\\fig?所示，这是具有共享底层和任务相关上层的学习框架。\n\n<!-- % 527 mid -->\n\n然而，有时不同任务之间共享的不是输入的语义，而是输出的语义。\n例如，语音识别系统需要在输出层产生有效的句子，但是输入附近的较低层可能需要识别相同音素或子音素发音的非常不同的版本（这取决于说话人）。\n在这样的情况下，共享神经网络的上层（输出附近）和进行任务特定的预处理是有意义的，如\\fig?所示。\n\n<!-- % 527 mid -->\n\n<!-- % 528 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/multi_task_input}}\n\\fi\n\\caption{多任务学习或者迁移学习的架构示例。\n输出变量$\\RVy$在所有的任务上具有相同的语义；输入变量$\\RVx$在每个任务（或者，比如每个用户）上具有不同的意义（甚至可能具有不同的维度），图上三个任务为$\\RVx^{(1)}$，$\\RVx^{(2)}$，$\\RVx^{(3)}$。\n底层结构（决定了选择方向）是面向任务的，上层结构是共享的。\n底层结构学习将面向特定任务的输入转化为通用特征。\n}\n\\end{figure}\n\n<!-- % 528 head -->\n\n在领域自适应的相关情况下，在每个情景之间任务（和最优的输入到输出的映射）都是相同的，但是输入分布稍有不同。 \n例如，考虑情感分析的任务，如判断一条评论是表达积极的还是消极的情绪。 \n网上的评论有许多类别。\n在书、视频和音乐等媒体内容上训练的顾客评论情感预测器，被用于分析诸如电视机或智能电话的消费电子产品的评论时，领域自适应情景可能会出现。%?? \n可以想象，存在一个潜在的函数可以判断任何语句是正面的、中性的还是负面的，但是词汇和风格可能会因领域而有差异，使得跨域的泛化训练变得更加困难。\n简单的无监督预训练（去噪自编码器）已经能够非常成功地用于领域自适应的情感分析{cite?}。\n<!-- % 527 end  -->\n\n<!-- % 528 head -->\n\n一个相关的问题是概念漂移，我们可以将其视为一种迁移学习，因为数据分布随时间而逐渐变化。\n概念漂移和迁移学习都可以被视为多任务学习的特定形式。\n\"多任务学习\"这个术语通常指监督学习任务，而更广义的迁移学习的概念也适用于无监督学习和强化学习。\n\n<!-- % 528 mid -->\n\n在所有这些情况下，我们的目标是利用第一个情景下的数据，提取那些在第二种情景中学习时或直接进行预测时可能有用的信息。\n表示学习的核心思想是相同的表示可能在两种情景中都是有用的。\n两个情景使用相同的表示，使得表示可以受益于两个任务的训练数据。\n\n<!-- % 528 end -->\n\n如前所述，迁移学习中无监督深度学习已经在一些机器学习比赛中取得了成功~{cite?}。\n这些比赛中的某一个实验配置如下。\n首先每个参与者获得一个第一种情景（来自分布$P_1$）的数据集，其中含有一些类别的样本。\n参与者必须使用这个来学习一个良好的特征空间（将原始输入映射到某种表示），使得当我们将这个学成变换用于来自迁移情景（分布$P_2$）的输入时，线性分类器可以在很少标注样本上训练、并泛化得很好。\n这个比赛中最引人注目的结果之一是，学习表示的网络架构越深（在第一个情景$P_1$中的数据使用纯无监督方式学习），在第二个情景（迁移）$P_2$的新类别上学习到的曲线就越好。\n对于深度表示而言，迁移任务只需要少量标注样本就能显著地提升泛化性能。\n\n<!-- % 529 head -->\n\n迁移学习的两种极端形式是一次学习和零次学习，有时也被称为零数据学习。\n只有一个标注样本的迁移任务被称为一次学习；没有标注样本的迁移任务被称为零次学习。\n\n<!-- % 529 mid -->\n\n因为第一阶段学习出的表示就可以清楚地分离出潜在的类别，所以一次学习~{cite?}是可能的。\n在迁移学习阶段，仅需要一个标注样本来推断表示空间中聚集在相同点周围许多可能测试样本的标签。\n这使得在学成的表示空间中，对应于不变性的变化因子已经与其他因子完全分离，在区分某些类别的对象时，我们可以学习到哪些因素具有决定意义。\n\n<!-- % 529 mid -->\n\n考虑一个零次学习情景的例子，学习器已经读取了大量文本，然后要解决对象识别的问题。\n如果文本足够好地描述了对象，那么即使没有看到某对象的图像，也能识别出该对象的类别。\n例如，已知猫有四条腿和尖尖的耳朵，那么学习器可以在没有见过猫的情况下猜测该图像中是猫。\n\n<!-- % 529 end -->\n\n\n只有在训练时使用了额外信息，零数据学习~{cite?}和零次学习~{cite?}才是有可能的。\n我们可以认为零数据学习场景包含三个随机变量：传统输入$\\Vx$，传统输出或目标$\\Vy$，以及描述任务的附加随机变量$T$。\n该模型被训练来估计条件分布$p(\\Vy \\mid \\Vx, T)$，其中$T$是我们希望执行的任务的描述。\n在我们的例子中，读取猫的文本信息然后识别猫，输出是二元变量$y$，$y=1$表示\"是\"，$y=0$表示\"不是\"。\n任务变量$T$表示要回答的问题，例如\"这个图像中是否有猫？\"\n如果训练集包含和$T$在相同空间的无监督对象样本，我们也许能够推断未知的$T$实例的含义。\n在我们的例子中，没有提前看到猫的图像而去识别猫，所以拥有一些未标注文本数据包含句子诸如\"猫有四条腿\"或\"猫有尖耳朵\"，对于学习非常有帮助。\n\n<!-- % 530  head -->\n\n零次学习要求$T$被表示为某种形式的泛化。\n例如，$T$不能仅是指示对象类别的one-hot编码。\n通过使用每个类别词的词嵌入表示，{Socher-2013}提出了对象类别的分布式表示。\n\n<!-- % 530 mid -->\n\n我们还可以在机器翻译中发现一种类似的现象~{cite?}：我们已经知道一种语言中的单词，还可以学到单一语言语料库中词与词之间的关系；另一方面，我们已经翻译了一种语言中的单词与另一种语言中的单词相关的句子。\n即使我们可能没有将语言$X$中的单词$A$翻译成语言$Y$中的单词$B$的标注样本，我们也可以泛化并猜出单词$A$的翻译，这是由于我们已经学习了语言$X$和$Y$单词的分布式表示，并且通过两种语言句子的匹配对组成的训练样本，产生了关联于两个空间的链接（可能是双向的）。\n如果联合学习三种成分（两种表示形式和它们之间的关系），那么这种迁移将会非常成功。\n\n<!-- % 530 mid -->\n\n零次学习是迁移学习的一种特殊形式。\n同样的原理可以解释如何能执行多模态学习，学习两种模态的表示，和一种模态中的观察结果$\\Vx$与另一种模态中的观察结果$\\Vy$组成的对$(\\Vx, \\Vy)$之间的关系（通常是一个联合分布）{cite?}。\n通过学习所有的三组参数（从$\\Vx$到它的表示、从$\\Vy$到它的表示，以及两个表示之间的关系），一个表示中的概念被锚定在另一个表示中，反之亦然，从而可以有效地推广到新的对组。 %?? allowing one \n这个过程如\\fig?所示。\n\n<!-- % 530 end -->\n\n<!-- % 531 -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/maps_between_representations}}\n\\fi\n\\caption{两个域$\\Vx$和$\\Vy$之间的迁移学习能够进行零次学习。\n标注或未标注样本$\\Vx$可以学习表示函数$f_{\\Vx}$。\n同样地，样本$\\Vy$也可以学习表示函数$f_{\\Vy}$。\n上图中$f_{\\Vx}$和$f_{\\Vy}$旁都有一个向上的箭头，不同的箭头表示不同的作用函数。\n并且箭头的类型表示使用了哪一种函数。\n$\\Vh_{\\Vx}$空间中的相似性度量表示$\\Vx$空间中任意点对之间的距离，这种度量方式比直接度量$\\Vx$空间的距离更好。\n同样地，$\\Vh_{\\Vy}$空间中的相似性度量表示$\\Vy$空间中任意点对之间的距离。\n这两种相似函数都使用带点的双向箭头表示。\n标注样本（水平虚线）$(\\Vx, \\Vy)$能够学习表示$f_{\\Vx}(\\Vx)$和表示$f_{\\Vy}(\\Vy)$之间的单向或双向映射（实双向箭头），以及这些表示之间如何锚定。\n零数据学习可以通过以下方法实现。\n像$\\Vx_{\\text{test}}$可以和单词$\\Vy_{\\text{test}}$关联起来，即使该单词没有像，仅仅是因为单词表示$f_{\\Vy}(\\Vy_{\\text{test}})$和像表示$f_{\\Vx}(\\Vx_{\\text{test}})$可以通过表示空间的映射彼此关联。\n这种方法有效的原因是，尽管像和单词没有匹配成队，但是它们各自的特征向量$f_{\\Vx}(\\Vx_{\\text{test}})$和$f_{\\Vy}(\\Vy_{\\text{test}})$互相关联。\n上图受~Hrant Khachatrian~的建议启发。\n}\n\\end{figure}\n\n<!-- % 531 -->\n\n\n# 半监督解释因果关系\n\n\n<!-- % 532 head -->\n\n表示学习的一个重要问题是\"什么原因能够使一个表示比另一个表示更好？\"\n一种假设是，理想表示中的特征对应到观测数据的潜在成因，特征空间中不同的特征或方向对应着不同的原因，从而表示能够区分这些原因。\n这个假设促使我们去寻找表示$p(\\Vx)$的更好方法。\n如果$\\Vy$是$\\Vx$的重要成因之一，那么这种表示也可能是计算$p(\\Vy \\mid \\Vx)$的一种良好表示。\n从20世纪90年代以来，这个想法已经指导了大量的深度学习研究工作~{cite?}。\n关于半监督学习可以超过纯监督学习的其他论点，请读者参考{Chapelle-2006}的第1.2节。\n\n<!-- % 532 head -->\n\n在表示学习的其他方法中，我们大多关注易于建模的表示——例如，数据稀疏或是各项之间相互独立的情况。\n能够清楚地分离出潜在因素的表示可能并不一定易于建模。\n然而，该假设促使半监督学习使用无监督表示学习的一个更深层原因是，对于很多人工智能任务而言，有两个相随的特点：一旦我们能够获得观察结果基本成因的解释，那么将会很容易分离出个体属性。\n具体来说，如果表示向量$\\Vh$表示观察值$\\Vx$的很多潜在因素，并且输出向量$\\Vy$是最为重要的原因之一，那么从$\\Vh$预测$\\Vy$会很容易。\n\n<!-- % 532 mid  -->\n\n首先，让我们看看$p(\\RVx)$的无监督学习无助于学习$p(\\RVy\\mid\\RVx)$时，半监督学习为何失败。\n例如，考虑一种情况，$p(\\RVx)$是均匀分布的，我们希望学习$f(\\Vx) = \\SetE[\\RVy \\mid \\Vx]$。\n显然，仅仅观察训练集的值$\\Vx$不能给我们关于$p(\\RVy \\mid \\RVx)$的任何信息。\n\n<!-- % 532 mid  -->\n\n接下来，让我们看看半监督学习成功的一个简单例子。\n考虑这样的情况，$\\RVx$来自一个混合分布，每个$\\RVy$值具有一个混合分量，如\\fig?所示。\n如果混合分量很好地分出来了，那么建模$p(\\RVx)$可以精确地指出每个分量的位置，每个类一个标注样本的训练集足以精确学习$p(\\RVy \\mid \\RVx)$。\n但是更一般地，什么能将$p(\\RVy \\mid \\RVx)$和$p(\\RVx)$关联在一起呢？\n\n<!-- % 532 mid-end -->\n\n<!-- % 533 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/mixture_model_color}}\n\\fi\n\\caption{混合模型。具有三个混合分量的$x$上混合密度示例。\n混合分量的内在本质是潜在解释因子$y$。\n因为混合分量（例如，图像数据中的自然对象类别）在统计学上是显著的，所以仅仅使用未标注样本无监督建模$p(x)$也能揭示解释因子$y$。\n}\n\\end{figure}\n\n<!-- % 533 head -->\n\n\n如果$\\RVy$与$\\RVx$的成因之一非常相关，那么$p(\\RVx)$和$p(\\RVy \\mid \\RVx)$也会紧密关联，试图找到变化潜在因素的无监督表示学习可能像半监督学习一样有用。\n\n<!-- % -- 532 end -->\n\n<!-- % 533 mid -->\n\n假设$\\RVy$是$\\RVx$的成因之一，让$\\RVh$代表所有这些成因。\n真实的生成过程可以被认为是根据这个有向图模型结构化出来的，其中$\\RVh$是$\\RVx$的父节点：\n\\begin{equation}\n\tp(\\RVh, \\RVx) = p(\\RVx \\mid \\RVh) p(\\RVh).\n\\end{equation} % 533 mid\n因此，数据的边缘概率是\n\\begin{equation}\n\tp(\\Vx) = \\SetE_{\\RVh} p(\\Vx \\mid \\Vh).\n\\end{equation}\n从这个直观的观察中，我们得出结论，$\\RVx$最好可能的模型（从广义的观点）是会表示上述\"真实\"结构的，其中$\\Vh$作为潜变量解释$\\Vx$中可观察的变化。\n上文讨论的\"理想\"的表示学习应该能够反映出这些潜在因子。\n如果$\\RVy$是其中之一（或是紧密关联于其中之一），那么将很容易从这种表示中预测$\\RVy$。\n我们会看到给定$\\RVx$下$\\RVy$的条件分布通过贝叶斯规则关联到上式中的分量：\n\\begin{equation}\n\tp(\\RVy \\mid \\RVx) = \\frac{ p(\\RVx \\mid \\RVy) p(\\RVy) }{p(\\RVx)}.\n\\end{equation}\n因此边缘概率$p(\\RVx)$和条件概率$p(\\RVy \\mid \\RVx)$密切相关，前者的结构信息应该有助于学习后者。\n因此，在这些假设情况下，半监督学习应该能提高性能。\n\n<!-- % 533 end -->\n\n关于这个事实的一个重要的研究问题是，大多数观察是由极其大量的潜在成因形成的。\n假设$\\RVy = \\RSh_i$，但是无监督学习器并不知道是哪一个$\\RSh_i$。\n对于一个无监督学习器暴力求解就是学习一种表示，这种表示能够捕获\\emph{所有}合理的重要生成因子$\\RSh_j$，并将它们彼此区分开来，因此不管$\\RSh_i$是否关联于$\\RVy$，从$\\RVh$预测$\\RVy$都是容易的。\n\n<!-- % -- 534 head -->\n\n在实践中，暴力求解是不可行的，因为不可能捕获影响观察的所有或大多数变化因素。\n例如，在视觉场景中，表示是否应该对背景中的所有最小对象进行编码？\n根据一个有据可查的心理学现象，人们不会察觉到环境中和他们所在进行的任务并不立刻相关的变化，具体例子可以参考~{simons1998failure}。\n半监督学习的一个重要研究前沿是确定每种情况下要编码\\emph{什么}。\n目前，处理大量潜在原因的两个主要策略是，同时使用无监督学习和监督学习信号，从而使得模型捕获最相关的变动因素，或是使用纯无监督学习学习更大规模的表示。\n\n<!-- % 534 mid -->\n\n无监督学习的另一个思路是选择一个更好的确定哪些潜在因素最为关键的定义。\n之前，自编码器和生成模型被训练来优化一个类似于均方误差的固定标准。\n这些固定标准确定了哪些因素是重要的。\n例如，图像像素的均方误差隐式地指定，一个潜在因素只有在其显著地改变大量像素的亮度时，才是重要影响因素。\n如果我们希望解决的问题涉及到小对象之间的相互作用，那么这将有可能遇到问题。\n如\\fig?所示，在机器人任务中，自编码器未能学习到编码小乒乓球。\n同样是这个机器人，它可以成功地与更大的对象进行交互（例如棒球，均方误差在这种情况下很显著）。\n\n<!-- % 534 mid -->\n\n<!-- % 535 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{cc}\n输入 & 重构 \\\\\n\\includegraphics[width=0.4\\textwidth]{Chapter15/figures/ping_pong_input} &\n\\includegraphics[width=0.4\\textwidth]{Chapter15/figures/ping_pong_reconstruction}\n\\end{tabular}\n\\fi\n\\caption{机器人任务上，基于均方误差训练的自编码器不能重构乒乓球。\n乒乓球的存在及其所有空间坐标，是生成图像且与机器人任务相关的重要潜在因素。\n不幸的是，自编码器具有有限的容量，基于均方误差的训练没能将乒乓球作为显著物体识别出来编码。\n以上图像由Chelsea Finn提供。\n}\n\\end{figure}\n\n<!-- % 535 head -->\n\n<!-- % 534 end -->\n\n还有一些其他的显著性的定义。\n例如，如果一组像素具有高度可识别的模式，那么即使该模式不涉及到极端的亮度或暗度，该模式还是会被认为非常显著。\n实现这样一种定义显著的方法是使用最近提出的生成式对抗网络{cite?}。\n在这种方法中，生成模型被训练来愚弄前馈分类器。\n前馈分类器尝试将来自生成模型的所有样本识别为假的，并将来自训练集的所有样本识别为真的。\n在这个框架中，前馈网络能够识别出的任何结构化模式都是非常显著的。\n生成式对抗网络会在\\sec?中更详细地介绍。\n为了叙述方便，知道它能\\emph{学习}出如何决定什么是显著的就可以了。\n{lotter2015unsupervised}表明，生成人类头部头像的模型在使用均方误差训练时往往会忽视耳朵，但是对抗式框架学习能够成功地生成耳朵。\n因为耳朵与周围的皮肤相比不是非常明亮或黑暗，所以根据均方误差损失它们不是特别突出，但是它们高度可识别的形状和一致的位置意味着前馈网络能够轻易地学习出如何检测它们，从而使得它们在生成式对抗框架下是高度突出的。\n\\fig?给了一些样例图片。\n生成式对抗网络只是确定应该表示哪些因素的一小步。\n我们期望未来的研究能够发现更好的方式来确定表示哪些因素，并且根据任务来开发表示不同因素的机制。\n\n<!-- % -- 535 mid -->\n\n\n<!-- % 536 head -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{ccc}\n真实图 & MSE & 对抗学习 \\\\\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/PGN_face1_GT} &\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/PGN_face1_MSE} &\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/PGN_face1_AL}\n\\end{tabular}\n\\fi\n\\caption{\n预测生成网络是一个学习哪些特征显著的例子。\n在这个例子中，预测生成网络已被训练成在特定视角预测人头的3D模型。\n\\emph{(左)}真实情况。\n这是一张网络应该生成的正确图片。\n\\emph{(中)}由具有均方误差的预测生成网络生成的图片。\n因为与相邻皮肤相比，耳朵不会引起亮度的极大差异，所以它们的显著性不足以让模型学习表示它们。\n\\emph{(右)}由具有均方误差和对抗损失的模型生成的图片。\n使用这个学成的代价函数，由于耳朵遵循可预测的模式，因此耳朵是显著重要的。\n学习哪些原因对于模型而言是足够重要和相关的，是一个重要的活跃研究领域。\n以上图片由~{lotter2015unsupervised}提供。\n}\n\\end{figure}\n<!-- % 536 head -->\n\n\n<!-- % 535 head -->\n\n正如~{Janzing-et-al-ICML2012}指出，学习潜在因素的好处是，如果真实的生成过程中$\\RVx$是结果，$\\RVy$是原因，那么建模$p(\\RVx \\mid \\RVy)$对于$p(\\RVy)$的变化是鲁棒的。\n如果因果关系被逆转，这是不对的，因为根据贝叶斯规则，$p(\\RVx \\mid \\RVy)$将会对$p(\\RVy)$的变化十分敏感。\n很多时候，我们考虑分布的变化（由于不同领域、时间不稳定性或任务性质的变化）时，\\emph{因果机制是保持不变的}（\"宇宙定律不变\"），而潜在因素的边缘分布是会变化的。\n因此，通过学习试图恢复成因向量$\\RVh$和$p(\\RVx \\mid \\RVh)$的生成模型，我们可以期望最后的模型对所有种类的变化有更好的泛化和鲁棒性。\n\n<!-- % 536 mid -->\n\n\n# 分布式表示\n\n<!-- % 536 end -->\n\n分布式表示的概念（由很多元素组合的表示，这些元素之间可以设置成可分离的）是表示学习最重要的工具之一。\n分布式表示非常强大，因为他们能用具有$k$个值的$n$个特征去描述$k^n$个不同的概念。\n正如我们在本书中看到的，具有多个隐藏单元的神经网络和具有多个潜变量的概率模型都利用了分布式表示的策略。\n我们现在再介绍一个观察结果。\n许多深度学习算法基于的假设是，隐藏单元能够学习表示出解释数据的潜在因果因子，就像\\sec?中讨论的一样。\n这种方法在分布式表示上是自然的，因为表示空间中的每个方向都对应着一个不同的潜在配置变量的值。\n\n<!-- %  537 head -->\n\n$n$维二元向量是一个分布式表示的示例，有$2^n$种配置，每一种都对应输入空间中的一个不同区域，如\\fig?所示。\n这可以与\\emph{符号表示}相比较，其中输入关联到单一符号或类别。\n如果字典中有$n$个符号，那么可以想象有$n$个特征监测器，每个特征探测器监测相关类别的存在。\n在这种情况下，只有表示空间中$n$个不同配置才有可能在输入空间中刻画$n$个不同的区域，如\\fig?所示。\n这样的符号表示也被称为~one-hot~表示，因为它可以表示成相互排斥的$n$维二元向量（其中只有一位是激活的）。\n符号表示是更广泛的非分布式表示类中的一个具体示例，它可以包含很多条目，但是每个条目没有显著意义的单独控制作用。\n\n<!-- % 537 mid -->\n\n<!-- % 538 1 page -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/distributed}}\n\\fi\n\\caption{基于分布式表示的学习算法如何将输入空间分割成多个区域的图示。\n这个例子具有二元变量$h_1$，$h_2$，$h_3$。\n每个特征通过为学成的线性变换设定输出阈值而定义。\n每个特征将$\\SetR^2$分成两个半平面。\n令$h_i^+$表示输入点$h_i=1$的集合；$h_i^-$表示输入点$h_i=0$的集合。\n在这个图示中，每条线代表着一个$h_i$的决策边界，对应的箭头指向边界的$h_i^+$区域。\n整个表示在这些半平面的每个相交区域都指定一个唯一值。\n例如，表示值为$[1,1,1]^\\top$对应着区域$h_1^+ \\cap h_2^+ \\cap h_3^+$。\n可以将以上表示和\\fig?中的非分布式表示进行比较。\n在输入维度是$d$的一般情况下，分布式表示通过半空间（而不是半平面）的交叉分割$\\SetR^d$。\n具有$n$个特征的分布式表示给$O(n^d)$个不同区域分配唯一的编码，而具有$n$个样本的最近邻算法只能给$n$个不同区域分配唯一的编码。\n因此，分布式表示能够比非分布式表示多分配指数级的区域。\n注意并非所有的$\\Vh$值都是可取的（这个例子中没有$\\Vh=\\mathbf{0}$），在分布式表示上的线性分类器不能向每个相邻区域分配不同的类别标识；\n甚至深度线性阈值网络的~VC~维只有$O(w\\log w)$（其中$w$是权重数目）{cite?}。\n强表示层和弱分类器层的组合是一个强正则化项。\n试图学习\"人\"和\"非人\"概念的分类器不需要给表示为\"戴眼镜的女人\"和\"没有戴眼镜的男人\"的输入分配不同的类别。\n容量限制鼓励每个分类器关注少数几个$h_i$，鼓励$\\Vh$以线性可分的方式学习表示这些类别。\n}\n\\end{figure}\n\n<!-- % 538 1 page -->\n\n<!-- % 539 head -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter15/figures/non_distributed}}\n\\fi\n\\caption{最近邻算法如何将输入空间分成不同区域的图示。\n最近邻算法是一个基于非分布式表示的学习算法的示例。\n不同的非分布式算法可以具有不同的几何形状，但是它们通常将输入空间分成区域，\\emph{每个区域具有不同的参数}。\n非分布式方法的优点是，给定足够的参数，它能够拟合一个训练集，而不需要复杂的优化算法。\n因为它直接为每个区域\\emph{独立地}设置不同的参数。\n缺点是，非分布式表示的模型只能通过平滑先验来局部地泛化，因此学习波峰波谷多于样本的复杂函数时，该方法是不可行的。\n和分布式表示的对比，可以参照\\fig?。\n}\n\\end{figure}\n\n<!-- % 539 head -->\n\n\n<!-- % 537 mid -->\n\n以下是基于非分布式表示的学习算法的示例：\n\n+ 聚类算法，包含$k$-means算法：每个输入点恰好分配到一个类别。\n\n+ $k$-最近邻算法：给定一个输入，一个或几个模板或原型样本与之关联。\n\t在$k >  1$ 的情况下，每个输入都使用多个值来描述，但是它们不能彼此分开控制，因此这不能算真正的分布式表示。\n\n+ 决策树：给定输入时，只有一个叶节点（和从根到该叶节点路径上的点）是被激活的。\n\n+ 高斯混合体和专家混合体：模板（聚类中心）或专家关联一个激活的\\emph{程度}。\n\t和$k$-最近邻算法一样，每个输入用多个值表示，但是这些值不能轻易地彼此分开控制。\n\n+ 具有高斯核 （或其他类似的局部核）的核机器： 尽管每个\"支持向量\"或模板样本的激活程度是连续值，但仍然会出现和高斯混合体相同的问题。\n\n<!-- % 537 end -->\n\n+ 基于~$n$-gram~的语言或翻译模型：根据后缀的树结构划分上下文集合（符号序列）。\n\t例如，一个叶节点可能对应于最后两个单词$w_1$和$w_2$。\n\t树上的每个叶节点分别估计单独的参数（有些共享也是可能的）。\n\n\n<!-- % -- 539 mid   -->\n\n\n\n对于部分非分布式算法而言，有些输出并非是恒定的，而是在相邻区域之间内插。\n参数（或样本）的数量和它们能够定义区域的数量之间仍保持线性关系。\n\n<!-- % -- 539 mid   -->\n\n将分布式表示和符号表示区分开来的一个重要概念是，由不同概念之间的\\emph{共享属性而产生的泛化}。\n作为纯符号，\"猫\"和\"狗\"之间的距离和任意其他两种符号的距离一样。\n然而，如果将它们与有意义的分布式表示相关联，那么关于猫的很多特点可以推广到狗，反之亦然。\n例如，我们的分布式表示可能会包含诸如\"具有皮毛\"或\"腿的数目\"这类在\"猫\"和\"狗\"的嵌入上具有相同值的项。\n正如\\sec?所讨论的，作用于单词分布式表示的神经语言模型比其他直接对单词~one-hot~表示进行操作的模型泛化得更好。\n分布式表示具有丰富的\\emph{相似性空间}，语义上相近的概念（或输入）在距离上接近，这是纯粹的符号表示所缺少的特点。\n\n<!-- % -- 540 head -->\n\n在学习算法中使用分布式表示何时以及为什么具有统计优势？\n当一个明显复杂的结构可以用较少参数紧致地表示时，分布式表示具有统计上的优点。\n一些传统的非分布式学习算法仅仅在平滑假设的情况下能够泛化，也就是说如果$u\\approx v$，那么学习到的目标函数$f$通常具有$f(u) \\approx f(v)$的性质。\n有许多方法来形式化这样一个假设，但其结果是如果我们有一个样本$(x,y)$，并且我们知道$f(x) \\approx y$，那么我们可以选取一个估计$\\hat{f}$近似地满足这些限制，并且当我们移动到附近的输入$x + \\epsilon$时，$\\hat{f}$尽可能少地发生改变。\n显然这个假设是非常有用的，但是它会遭受维数灾难：\n学习出一个能够在很多不同区域上增加或减少很多次的目标函数\n\\footnote{一般来说，我们可能会想要学习一个函数，这个函数在指数级数量区域的表现都是不同的：在$d$-维空间中，为了区分每一维，至少有两个不同的值。\n我们想要函数$f$区分这$2^d$个不同的区域，需要$O(2^d)$量级的训练样本}，\n我们可能需要至少和可区分区域数量一样多的样本。\n我们可以将每一个区域视为一个类别或符号：通过让每个符号（或区域）具有单独的自由度，我们可以学习出从符号映射到值的任意解码器。\n然而，这不能推广到新区域的新符号上。\n\n<!-- % -- 540 mid -->\n\n如果我们幸运的话，除了平滑之外，目标函数可能还有一些其他规律。\n例如，具有最大池化的卷积网络可以在不考虑对象在图像中位置（即使对象的空间变换不对应输入空间的平滑变换）的情况下识别出对象。\n\n<!-- % -- 540 mid -->\n\n让我们检查分布式表示学习算法的一个特殊情况，它通过对输入的线性函数进行阈值处理来提取二元特征。\n该表示中的每个二元特征将$\\SetR^d$分成一对半空间，如\\fig?所示。\n$n$个相应半空间的指数级数量的交集确定了该分布式表示学习器能够区分多少区域。\n空间$\\SetR^d$中的$n$个超平面的排列组合能够生成多少区间？\n通过应用关于超平面交集的一般结果~{cite?}，我们发现~{cite?}这个二元特征表示能够区分的空间数量是\n\\begin{equation}\n\t\\sum_{j=0}^d \\binom{n}{j} = O(n^d).\n\\end{equation}\n因此，我们会发现关于输入大小呈指数级增长，关于隐藏单元的数量呈多项式级增长。\n\n<!-- % -- 541 head -->\n\n这提供了分布式表示泛化能力的一种几何解释：$O(nd)$个参数（空间$\\SetR^d$中的$n$个线性阈值特征）能够明确表示输入空间中$O(n^d)$个不同区域。\n如果我们没有对数据做任何假设，并且每个区域使用唯一的符号来表示，每个符号使用单独的参数去识别$\\SetR^d$中的对应区域，那么指定$O(n^d)$个区域需要$O(n^d)$个样本。\n更一般地，分布式表示的优势还可以体现在我们对分布式表示中的每个特征使用非线性的、可能连续的特征提取器，而不是线性阈值单元的情况。\n在这种情况下，如果具有$k$个参数的参数变换可以学习输入空间中的$r$个区域（$k\\ll r$），并且如果学习这样的表示有助于关注的任务，那么这种方式会比非分布式情景（我们需要$O(r)$个样本来获得相同的特征，将输入空间相关联地划分成$r$个区域。）泛化得更好。\n使用较少的参数来表示模型意味着我们只需拟合较少的参数，因此只需要更少的训练样本去获得良好的泛化。\n\n<!-- % -- 541 mid -->\n\n另一个解释基于分布式表示的模型泛化能力更好的说法是，尽管能够明确地编码这么多不同的区域，但它们的容量仍然是很有限的。\n例如，线性阈值单元神经网络的~VC~维仅为$O(w\\log w)$， 其中$w$是权重的数目~{cite?}。\n这种限制出现的原因是，虽然我们可以为表示空间分配非常多的唯一码，但是我们不能完全使用所有的码空间，也不能使用线性分类器学习出从表示空间$\\Vh$到输出$\\Vy$的任意函数映射。\n因此使用与线性分类器相结合的分布式表示传达了一种先验信念，待识别的类在$\\Vh$代表的潜在因果因子的函数下是线性可分的。\n我们通常想要学习类别，例如所有绿色对象的图像集合，或是所有汽车图像集合，但不会是需要非线性~XOR~逻辑的类别。\n例如，我们通常不会将数据划分成所有红色汽车和绿色卡车作为一个集合，所有绿色汽车和红色卡车作为另一个集合。\n\n<!-- % -- 542 head -->\n\n到目前为止讨论的想法都是抽象的，但是它们可以通过实验验证。\n{Zhou-et-al-ICLR2015}发现，在~ImageNet~和~Places~基准数据集上训练的深度卷积网络中的隐藏单元学成的特征通常是可以解释的，对应人类自然分配的标签。\n在实践中，隐藏单元并不能总是学习出具有简单语言学名称的事物，但有趣的是，这些事物会在那些最好的计算机视觉深度网络的顶层附近出现。\n这些特征的共同之处在于，我们可以设想\\emph{学习其中的每个特征不需要知道所有其他特征的所有配置}。\n{radford2015unsupervised}发现生成模型可以学习人脸图像的表示，在表示空间中的不同方向捕获不同的潜在变差因素。\n\\fig?展示表示空间中的一个方向对应着该人是男性还是女性，而另一个方向对应着该人是否戴着眼镜。\n这些特征都是自动发现的，而非先验固定的。\n我们没有必要为隐藏单元分类器提供标签：只要该任务需要这样的特征，梯度下降就能在感兴趣的目标函数上自然地学习出语义上有趣的特征。\n我们可以学习出男性和女性之间的区别，或者是眼镜的存在与否，而不必通过涵盖所有这些值组合的样本来表征其他$n-1$个特征的所有配置。\n这种形式的统计可分离性质能够泛化到训练期间从未见过的新特征上。\n\n<!-- % 543 head -->\n\n<!-- % 542 end -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\begin{tabular}{ccccccc}\n\\includegraphics[width=0.1\\textwidth]{Chapter15/figures/man_with_glasses} &\n- &\n\\includegraphics[width=0.1\\textwidth]{Chapter15/figures/man_without_glasses} &\n+ &\n\\includegraphics[width=0.1\\textwidth]{Chapter15/figures/woman_without_glasses} &\n= &\n\\includegraphics[width=0.3\\textwidth]{Chapter15/figures/woman_with_glasses}\n\\end{tabular}\n\\fi\n\\caption{生成模型学到了分布式表示，能够从戴眼镜的概念中区分性别的概念。\n如果我们从一个戴眼镜的男人的概念表示向量开始，然后减去一个没戴眼镜的男人的概念表示向量，最后加上一个没戴眼镜的女人的概念表示向量，那么我们会得到一个戴眼镜的女人的概念表示向量。\n生成模型将所有这些表示向量正确地解码为可被识别为正确类别的图像。\n图片转载许可自~{radford2015unsupervised}。\n}\n\\end{figure}\n\n<!-- % 542 end -->\n\n\n# 得益于深度的指数增益\n\n我们已经在\\sec?中看到，多层感知机是万能近似器，相比于浅层网络，一些函数能够用指数级小的深度网络表示。\n缩小模型规模能够提高统计效率。\n在本节中，我们描述如何将类似结果更一般地应用于其他具有分布式隐藏表示的模型。\n\n<!-- % 543 mid -->\n\n在\\sec?中，我们看到了一个生成模型的示例，能够学习人脸图像的潜在解释因子，包括性别以及是否佩戴眼镜。\n完成这个任务的生成模型是基于一个深度神经网络的。\n浅层网络例如线性网络不能学习出这些抽象解释因子和图像像素之间的复杂关系。\n在这个任务和其他~AI~任务中，这些因子几乎彼此独立地被抽取，但仍然对应到有意义输入的因素，很有可能是高度抽象的，并且和输入呈高度非线性的关系。\n我们认为这需要\\emph{深度}分布式表示，需要许多非线性组合来获得较高级的特征（被视为输入的函数）或因子（被视为生成原因）。\n\n<!-- % 543 mid -->\n\n在许多不同情景中已经证明，\n非线性和重用特征层次结构的组合来组织计算，可以使分布式表示获得指数级加速之外，还可以获得统计效率的指数级提升。\n许多种类的只有一个隐藏层的网络（例如，具有饱和非线性，布尔门，和/积，或~RBF~单元的网络）都可以被视为万能近似器。\n在给定足够多隐藏单元的情况下，这个模型族是一个万能近似器，可以在任意非零允错级别近似一大类函数（包括所有连续函数）。\n然而，隐藏单元所需的数量可能会非常大。\n关于深层架构表达能力的理论结果表明，有些函数族可以高效地通过深度$k$层的网络架构表示，但是深度不够（深度为2或$k-1$）时会需要指数级（相对于输入大小而言）的隐藏单元。\n\n<!-- % -- 543 end -->\n\n<!-- % 544 head -->\n\n在\\sec?中，我们看到确定性前馈网络是函数的万能近似器。\n许多具有单个隐藏层（潜变量）的结构化概率模型（包括受限玻尔兹曼机，深度信念网络）是概率分布的万能近似器~{cite?}。\n\n<!-- % 544 mid -->\n\n在\\sec?中，我们看到足够深的前馈网络会比深度不够的网络具有指数级优势。\n这样的结果也能从诸如概率模型的其他模型中获得。\n和-积网络%，SPN\n~{cite?}是这样的一种概率模型。\n这些模型使用多项式回路来计算一组随机变量的概率分布。\n{Delalleau+Bengio-2011-small}表明存在一种概率分布，对~SPN~的最小深度有要求，以避免模型规模呈指数级增长。\n后来，{Martens+Medabalimi-arxiv2014}表明，任意两个有限深度的~SPN~之间都会存在显著差异，并且一些使~SPN~易于处理的约束可能会限制其表示能力。\n\n<!-- % 544 mid -->\n\n另一个有趣的进展是，一系列和卷积网络相关的深度回路族表达能力的理论结果，即使让浅度回路只去近似深度回路计算的函数，也能突出反映深度回路的指数级优势~{cite?}。\n相比之下，以前的理论工作只研究了浅度回路必须精确复制特定函数的情况。\n\n<!-- % 544 mid -->\n\n\n# 提供发现潜在原因的线索\n\n\n<!-- % 544 end -->\n\n我们回到最初的问题之一来结束本章：什么原因能够使一个表示比另一个表示更好？\n首先在\\sec?中介绍的一个答案是，一个理想的表示能够区分生成数据变化的潜在因果因子，特别是那些与我们的应用相关的因素。\n表示学习的大多数策略都会引入一些有助于学习潜在变差因素的线索。\n这些线索可以帮助学习器将这些观察到的因素与其他因素分开。\n监督学习提供了非常强的线索：每个观察向量$\\Vx$的标签$\\Vy$，它通常直接指定了至少一个变差因素。\n更一般地，为了利用丰富的未标注数据，表示学习会使用关于潜在因素的其他不太直接的提示。\n这些提示包含一些我们（学习算法的设计者）为了引导学习器而强加的隐式先验信息。\n诸如没有免费午餐定理的这些结果表明，正则化策略对于获得良好泛化是很有必要的。\n当不可能找到一个普遍良好的正则化策略时，深度学习的一个目标是找到一套相当通用的正则化策略，使其能够适用于各种各样的~AI~任务（类似于人和动物能够解决的任务）。\n\n<!-- % 545 head -->\n\n在此，我们提供了一些通用正则化策略的列表。\n该列表显然是不详尽的，但是给出了一些学习算法是如何发现对应潜在因素的特征的具体示例。\n该列表在~{Bengio-Courville-Vincent-TPAMI-2012}的第3.1节中提出，这里进行了部分拓展。\n\n+ \\emph{平滑}：假设对于单位$\\Vd$和小量$\\epsilon$有$f(\\Vx + \\epsilon \\Vd) \\approx f(\\Vx)$。\n\t这个假设允许学习器从训练样本泛化到输入空间中附近的点。\n\t许多机器学习算法都利用了这个想法，但它不能克服维数灾难难题。\n\n\n+ \\emph{线性}：很多学习算法假定一些变量之间的关系是线性的。\n\t这使得算法能够预测远离观测数据的点，但有时可能会导致一些极端的预测。\n\t大多数简单的学习算法不会做平滑假设，而会做线性假设。\n\t这些假设实际上是不同的，具有很大权重的线性函数在高维空间中可能不是非常平滑的。\n\t参看~{Goodfellow-2015-adversarial}了解关于线性假设局限性的进一步讨论。\n\n<!-- % 545 mid -->\n\n+ \\emph{多个解释因子}：许多表示学习算法受以下假设的启发，数据是由多个潜在解释因子生成的，并且给定每一个因子的状态，大多数任务都能轻易解决。\n\t\\sec?描述了这种观点如何通过表示学习来启发半监督学习的。\n\t学习$p(\\Vx)$的结构要求学习出一些对建模$p(\\Vy\\mid\\Vx)$同样有用的特征，因为它们都涉及到相同的潜在解释因子。\n\t\\sec?介绍了这种观点如何启发分布式表示的使用，表示空间中分离的方向对应着分离的变差因素。\n\n\n+ \\emph{因果因子}：该模型认为学成表示所描述的变差因素是观察数据$\\Vx$的成因，而并非反过来。\n\t正如\\sec?中讨论的，这对于半监督学习是有利的，当潜在成因上的分布发生改变，或者我们应用模型到一个新的任务上时，学成的模型都会更加鲁棒。\n\n<!-- % -- 546 head -->\n\n+ \\emph{深度，或者解释因子的层次组织}：高级抽象概念能够通过将简单概念层次化来定义。\n\t从另一个角度来看，深度架构表达了我们认为任务应该由多个程序步骤完成的观念，其中每一个步骤回溯到先前步骤处理之后的输出。\n\n\n+ \\emph{任务间共享因素}：\n\t当多个对应到不同变量$\\RSy_i$的任务共享相同的输入$\\RVx$时，或者当每个任务关联到全局输入$\\RVx$的子集或者函数$f^{(i)}(\\RVx)$时，我们会假设每个变量$\\RSy_i$关联到来自相关因素$\\RVh$公共池的不同子集。\n\t因为这些子集有重叠，所以通过共享的中间表示$ P(\\RVh \\mid \\RVx)$来学习所有的$P(\\RSy_i \\mid \\RVx)$能够使任务间共享统计强度。\n\n<!-- % -- 546 mid -->\n\n+ \\emph{流形}：概率质量集中，并且集中区域是局部连通的，且占据很小的体积。\n\t在连续情况下，这些区域可以用比数据所在原始空间低很多维的低维流形来近似。\n\t很多机器学习算法只在这些流形上有效{cite?}。\n\t一些机器学习算法，特别是自编码器，会试图显式地学习流形的结构。\n\n\n+ \\emph{自然聚类}：很多机器学习算法假设输入空间中每个连通流形可以被分配一个单独的类。\n\t数据分布在许多个不连通的流形上，但相同流形上数据的类别是相同的。\n\t这个假设激励了各种学习算法，包括正切传播、双反向传播、流形正切分类器和对抗训练。\n\n\n+ \\emph{时间和空间相干性}：慢特征分析和相关的算法假设，最重要的解释因子随时间变化很缓慢，或者至少假设预测真实的潜在解释因子比预测诸如像素值这类原始观察会更容易些。\n\t读者可以参考\\sec?，进一步了解这个方法。\n\n\n+ \\emph{稀疏性}：假设大部分特征和大部分输入不相关，如在表示猫的图像时，没有必要使用象鼻的特征。\n\t因此，我们可以强加一个先验，任何可以解释为\"存在\"或\"不存在\"的特征在大多数时间都是不存在的。\n\n<!-- % -- 547 head -- -->\n\n+ \\emph{简化因子依赖}：在良好的高级表示中，因子会通过简单的依赖相互关联。\n\t最简单的可能是边缘独立，即$P(\\RVh) = \\prod_i P(\\RVh_i)$。\n\t但是线性依赖或浅层自编码器所能表示的依赖关系也是合理的假设。\n\t这可以从许多物理定律中看出来，并且假设在学成表示的顶层插入线性预测器或分解的先验。\n\n\n\n表示学习的概念将许多深度学习形式联系在了一起。\n前馈网络和循环网络，自编码器和深度概率模型都在学习和使用表示。\n学习最佳表示仍然是一个令人兴奋的研究方向。\n\n<!-- % -- 547 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-16-Chapter16_structured_probabilistic_modelling.md",
    "content": "---\ntitle: 深度学习中的结构化概率模型\nlayout: post\nshare: false\n---\n<!-- % 549 -->\n\n\n<!-- %深度学习为研究者们提供了许多指导性的建模和设计算法的思路。%?? -->\n深度学习为研究者们提供了许多建模方式，用以设计以及描述算法。\n其中一种形式是结构化概率模型的思想。\n我们曾经在\\sec?中简要讨论过结构化概率模型。\n此前简要的介绍已经足够使我们充分了解如何使用结构化概率模型作为描述第二部分中某些算法的语言。\n现在在第三部分，我们可以看到结构化概率模型是许多深度学习重要研究方向的关键组成部分。\n作为讨论这些研究方向的预备知识，本章将更加详细地描述结构化概率模型。\n本章内容是自洽的，所以在阅读本章之前读者不需要回顾之前的介绍。\n<!-- % 549 -->\n\n\n结构化概率模型使用图来描述概率分布中随机变量之间的直接相互作用，从而描述一个概率分布。\n在这里我们使用了图论（一系列结点通过一系列边来连接）中\"图\"的概念，由于模型结构是由图定义的，所以这些模型也通常被称为图模型。\n<!-- % 549 -->\n\n\n图模型的研究社群是巨大的，并提出过大量的模型、训练算法和推断算法。\n在本章中，我们将介绍图模型中几个核心方法的基本背景，并且重点描述已被证明对深度学习社群最有用的观点。\n如果你已经熟知图模型，那么你可以跳过本章的绝大部分。\n然而，我们相信即使是资深的图模型方向的研究者也会从本章的最后一节中获益匪浅，详见\\sec?，其中我们强调了在深度学习算法中使用图模型的独特方式。\n相比于其他图模型研究领域的是，深度学习的研究者们通常会使用完全不同的模型结构、学习算法和推断过程。\n在本章中，我们将指明这种区别并解释其中的原因。\n<!-- % 550 head -->\n\n\n我们首先介绍了构建大规模概率模型时面临的挑战。\n之后，我们介绍如何使用一个图来描述概率分布的结构。\n尽管这个方法能够帮助我们解决许多挑战和问题，它本身仍有很多缺陷。\n图模型中的一个主要难点就是判断哪些变量之间存在直接的相互作用关系，也就是对于给定的问题哪一种图结构是最适合的。\n在\\sec?中，我们通过了解依赖，简要概括了解决这个难点的两种方法。\n<!-- %最后，在\\sec?中，我们讨论并强调了图模型在深度学习中的一些独特之处和一些特有的方法，作为本章的收尾。 -->\n最后，作为本章的收尾，我们在\\sec?中讨论深度学习研究者使用图模型特定方式的独特之处。\n<!-- % 550  ok -->\n\n\n\n\n# 非结构化建模的挑战\n\n<!-- % 16.1   p 550  -->\n\n\n深度学习的目标是使得机器学习能够解决许多人工智能中亟需解决的挑战。\n这也意味着它们能够理解具有丰富结构的高维数据。\n举个例子，我们希望AI的算法能够理解自然图片\\footnote{自然图片指的是能够在正常的环境下被照相机拍摄的图片，不同于合成的图片，或者一个网页的截图等等。}，表示语音的声音信号和包含许多词和标点的文档。\n<!-- % 550  ok -->\n\n\n分类问题可以把这样一个来自高维分布的数据作为输入，然后使用一个类别的标签来概括它——这个标签可以是照片中是什么物品，一段语音中说的是哪个单词，也可以是一段文档描述的是哪个话题。\n这个分类过程丢弃了输入数据中的大部分信息，然后产生单个值的输出（或者是关于单个输出值的概率分布）。\n这个分类器通常可以忽略输入数据的很多部分。\n例如，当我们识别一张照片中的一个物体时，我们通常可以忽略图片的背景。\n<!-- % 550  ok -->\n\n\n我们也可以使用概率模型完成许多其他的任务。\n这些任务通常相比于分类成本更高。\n其中的一些任务需要产生多个输出。\n大部分任务需要对输入数据整个结构的完整理解，所以并不能舍弃数据的一部分。\n这些任务包括以下几个：\n\n+ \\textbf{估计密度函数}：给定一个输入$\\Vx$，机器学习系统返回一个对数据生成分布的真实密度函数$p(\\Vx)$的估计。\n这只需要一个输出，但它需要完全理解整个输入。\n即使向量中只有一个元素不太正常，系统也会给它赋予很低的概率。\n<!-- % 551  ok -->\n\t\n\t\n+\n\\textbf{去噪}：给定一个受损的或者观察有误的输入数据$\\tilde{\\Vx}$，机器学习系统返回一个对原始的真实$\\Vx$的估计。\n举个例子，有时候机器学习系统需要从一张老相片中去除灰尘或者抓痕。\n这个系统会产生多个输出值（对应着估计的干净样本$\\Vx$的每一个元素），并且需要我们有一个对输入的整体理解（因为即使只有一个损坏的区域，仍然会显示最终估计被损坏）。%??\n\t% 551 ok\n\t\n+\n\\textbf{缺失值的填补}：给定$\\Vx$的某些元素作为观察值，模型被要求返回一个$\\Vx$\n一些或者全部未观察值的估计或者概率分布。\n这个模型返回的也是多个输出。\n由于这个模型需要恢复$\\Vx$的每一个元素，所以它必须理解整个输入。\n<!-- % 551 ok -->\n\t\n\t\n+ \\textbf{采样}： 模型从分布$p(\\Vx)$中抽取新的样本。\n其应用包括语音合成，即产生一个听起来很像人说话的声音。\n这个模型也需要多个输出以及对输入整体的良好建模。\n即使样本只有一个从错误分布中产生的元素，那么采样的过程也是错误的。 \n<!-- % 551 -->\n\n\n\\fig?中描述了一个使用较小的自然图片的采样任务。\n<!-- % 551 ok  -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics[width=0.9\\textwidth]{Chapter16/figures/fig-ssrbm_nearest_train}}\\ \\\\\n     \\centerline{\\includegraphics[width=0.9\\textwidth]{Chapter16/figures/fig-ssrbm_samples}}\n\\fi\n\t\\caption{自然图片的概率建模。\n\\emph{(上)}~CIFAR-10数据集{cite?}中的$32\\times 32$像素的样例图片。\n\\emph{(下)}从这个数据集上训练的结构化概率模型中抽出的样本。\n每一个样本都出现在与其欧氏距离最近的训练样本的格点中。\n这种比较使得我们发现这个模型确实能够生成新的图片，而不是记住训练样本。\n为了方便展示，两个集合的图片都经过了微调。\n图片经~{Courville+al-2011-small}许可转载。}\n\\end{figure}\n\n对上千甚至是上百万随机变量的分布建模，无论从计算上还是从统计意义上说，都是一个极具挑战性的任务。\n假设我们只想对二值的随机变量建模。\n这是一个最简单的例子，但是我们仍然无能为力。\n对一个只有$32\\times 32$像素的彩色（RGB）图片来说，存在$2^{3072}$种可能的二值图片。\n这个数量已经超过了$10^{800}$，比宇宙中的原子总数还要多。\n<!-- % 551  -->\n\n通常意义上讲，如果我们希望对一个包含$n$个离散变量并且每个变量都能取$k$个值的$\\Vx$的分布建模，那么最简单的表示$P(\\Vx)$的方法需要存储一个可以查询的表格。\n这个表格记录了每一种可能值的概率，则需要$k^n$个参数。\n<!-- % 551  -->\n\n基于下述几个原因，这种方式是不可行的：\n\n+ \\emph{内存： 存储参数的开销。}\n除了极小的$n$和$k$的值，用表格的形式来表示这样一个分布需要太多的存储空间。\n<!-- % 551  -->\n\t\n+  \\emph{统计的高效性}： \n当模型中的参数个数增加时，使用统计估计器估计这些参数所需要的训练数据数量也需要相应地增加。\n因为基于查表的模型拥有天文数字级别的参数，为了准确地拟合，相应的训练集的大小也是相同级别的。\n任何这样的模型都会导致严重的过拟合，除非我们添加一些额外的假设来联系表格中的不同元素（正如\\sec?中所举的回退或者平滑~$n$-gram~模型）。\n<!-- % 552  end -->\n\t\n+ \\emph{运行时间：推断的开销。}\n假设我们需要完成这样一个推断的任务，其中我们需要使用联合分布$P(\\RVx)$来计算某些其他的分布，比如说边缘分布$P(\\RSx_1)$或者是条件分布$P(\\RSx_2\\mid \\RSx_1)$。\n计算这样的分布需要对整个表格的某些项进行求和操作，因此这样的操作的运行时间和上述高昂的内存开销是一个级别的。\n<!-- % 553 head -->\n\t\n\t\n+ \\emph{运行时间： 采样的开销。}\n类似的，假设我们想要从这样的模型中采样。\n最简单的方法就是从均匀分布中采样，$u\\sim \\text{U}(0,1)$，然后把表格中的元素累加起来，直到和大于$u$，然后返回最后一个加上的元素。\n最差情况下，这个操作需要读取整个表格，所以和其他操作一样，它也需要指数级别的时间。\n\n<!-- % 553  -->\n\n\n\n基于表格操作的方法的主要问题是我们显式地对每一种可能的变量子集所产生的每一种可能类型的相互作用建模。\n在实际问题中我们遇到的概率分布远比这个简单。\n通常，许多变量只是间接地相互作用。\n<!-- % 553 -->\n\n\n例如，我们想要对接力跑步比赛中一个队伍完成比赛的时间进行建模。\n假设这个队伍有三名成员：Alice， Bob和Carol。\n在比赛开始时，Alice拿着接力棒，开始跑第一段距离。\n在跑完她的路程以后，她把棒递给了Bob。\n然后Bob开始跑，再把棒给Carol，Carol跑最后一棒。\n我们可以用连续变量来建模他们每个人完成的时间。\n因为Alice第一个跑，所以她的完成时间并不依赖于其他的人。\nBob的完成时间依赖于Alice的完成时间，因为Bob只能在Alice跑完以后才能开始跑。\n如果Alice跑得更快，那么Bob也会完成得更快。\n所有其他关系都可以被类似地推出。\n最后，Carol的完成时间依赖于她的两个队友。\n如果Alice跑得很慢，那么Bob也会完成得更慢。\n结果，Carol将会更晚开始跑步，因此她的完成时间也更有可能要晚。\n然而，在给定Bob完成时间的情况下，Carol的完成时间只是\\emph{间接地}依赖于Alice的完成时间。\n如果我们已经知道了Bob的完成时间，知道Alice的完成时间对估计Carol的完成时间并无任何帮助。\n这意味着我们可以通过仅仅两个相互作用来建模这个接力赛。\n这两个相互作用分别是Alice的完成时间对Bob的完成时间的影响和Bob的完成时间对Carol的完成时间的影响。\n在这个模型中，我们可以忽略第三种间接的相互作用，即Alice的完成时间对Carol的完成时间的影响。\n<!-- % 553 -->\n\n\n结构化概率模型为随机变量之间的直接作用提供了一个正式的建模框架。\n这种方式大大减少了模型的参数个数以致于模型只需要更少的数据来进行有效的估计。\n<!-- %这些更轻便的模型在模型存储，模型推断以及从模型中采样时有着更小的计算开销。 -->\n这些更小的模型大大减小了在模型存储、模型推断以及从模型中采样时的计算开销。\n<!-- % 554 head   -->\n\n\n\n# 使用图描述模型结构\n\n<!-- % 554 -->\n\n\n结构化概率模型使用图（在图论中\"结点\"是通过\"边\"来连接的）来表示随机变量之间的相互作用。\n每一个结点代表一个随机变量。\n每一条边代表一个直接相互作用。\n这些直接相互作用隐含着其他的间接相互作用，但是只有直接的相互作用会被显式地建模。\n<!-- % 554 -->\n\n\n使用图来描述概率分布中相互作用的方法不止一种。\n在下文中我们会介绍几种最为流行和有用的方法。\n图模型可以被大致分为两类：基于有向无环图的模型和基于无向图的模型。\n<!-- % 554 -->\n\n\n\n## 有向模型\n\n<!-- % 554 -->\n\n\n有向图模型是一种结构化概率模型，也被称为信念网络或者贝叶斯网络\\footnote{当我们希望\"强调\"从网络中计算出的值的\"推断\"本质，即强调这些值代表的是置信程度大小而不是事件的频率时，Judea Pearl建议使用\"贝叶斯网络\"这个术语。}%??\n {cite?}。\n<!-- % 554 -->\n\n\n之所以命名为有向图模型是因为所有的边都是有方向的，即从一个结点指向另一个结点。\n这个方向可以通过画一个箭头来表示。\n箭头所指的方向表示了这个随机变量的概率分布是由其他变量的概率分布所定义的。\n画一个从结点$\\RSa$到结点$\\RSb$的箭头表示了我们用一个条件分布来定义$\\RSb$，而$\\RSa$是作为这个条件分布符号右边的一个变量。\n换句话说，$\\RSb$的概率分布依赖于$\\RSa$的取值。\n<!-- % 554 -->\n\n\n我们继续\\sec?所讲的接力赛的例子，我们假设Alice的完成时间为$\\RSt_0$，Bob的完成时间为$\\RSt_1$，Carol的完成时间为$\\RSt_2$。\n就像我们之前看到的一样，$\\RSt_1$的估计是依赖于$\\RSt_0$的，$\\RSt_2$的估计是直接依赖于$\\RSt_1$的，但是仅仅间接地依赖于$\\RSt_0$。\n我们用一个有向图模型来建模这种关系，如\\fig?所示。\n<!-- % 554 end -->\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter16/figures/relay_race_graph}}\t\n\\fi\n\\caption{描述接力赛例子的有向图模型。\nAlice的完成时间$\\RSt_0$影响了Bob的完成时间$\\RSt_1$，因为Bob只能在Alice完成比赛后才开始。\n类似的，Carol也只会在Bob完成之后才开始，\n所以Bob的完成时间$\\RSt_1$直接影响了Carol的完成时间$\\RSt_2$。}\n\\end{figure}\n\n\n<!-- % 555 head  -->\n正式地说，变量$\\RVx$的有向概率模型是通过有向无环图$\\CalG$ （每个结点都是模型中的随机变量）\n和一系列局部条件概率分布 $p(\\RSx_i\\mid Pa_{\\CalG}(\\RSx_i))$来定义的，其中$Pa_{\\CalG}(\\RSx_i)$表示结点$\\RSx_i$的所有父结点。\n$\\RVx$的概率分布可以表示为\n\\begin{align}\np(\\RVx) = \\prod_{i} p(\\RSx_i\\mid Pa_{\\CalG}(\\RSx_i)).\n\\end{align}\n<!-- % 555  -->\n\n\n在之前所述的接力赛的例子中，参考\\fig?，这意味着概率分布可以被表示为\n\\begin{align}\np(\\RSt_0,\\RSt_1,\\RSt_2) = p(\\RSt_0)p(\\RSt_1\\mid \\RSt_0)p(\\RSt_2\\mid \\RSt_1).\n\\end{align}\n<!-- % 555  -->\n\n\n这是我们看到的第一个结构化概率模型的实际例子。\n我们能够检查这样建模的计算开销，为了验证相比于非结构化建模，结构化建模为什么有那么多的优势。\n<!-- % 555  -->\n\n\n假设我们采用从第$0$分钟到第$10$分钟每$6$秒一块的方式离散化地表示时间。\n这使得$\\RSt_0$，$\\RSt_1$和$\\RSt_2$都是一个有$100$个取值可能的离散变量。\n如果我们尝试着用一个表来表示$p(\\RSt_0, \\RSt_1, \\RSt_2)$，那么我们需要存储$999,999$个值\n（100个$\\RSt_0$的可能取值 $\\times$ 100个$\\RSt_1$的可能取值 $\\times$ 100个$\\RSt_2$的可能取值 减去1，由于存在所有的概率之和为$1$的限制，所以其中有$1$个值的存储是多余的）。\n反之，如果我们用一个表来记录每一种条件概率分布，那么表中记录$\\RSt_0$的分布需要存储$99$个值，给定$\\RSt_0$情况下$\\RSt_1$的分布需要存储9900个值，给定$\\RSt_1$情况下$\\RSt_2$的分布也需要存储$9900$个值。\n加起来总共需要存储$19, 899$个值。\n这意味着使用有向图模型将参数的个数减少了超过$50$倍！\n<!-- % 555  -->\n\n\n通常意义上说，对每个变量都能取$k$个值的$n$个变量建模，基于建表的方法需要的复杂度是$O(k^n)$，就像我们之前观察到的一样。\n现在假设我们用一个有向图模型来对这些变量建模。\n如果$m$代表图模型的单个条件概率分布中最大的变量数目（在条件符号的左右皆可），那么对这个有向模型建表的复杂度大致为$O(k^m)$。\n只要我们在设计模型时使其满足$m\\ll n$，那么复杂度就会被大大地减小。\n<!-- % 555  -->\n\n\n换一句话说，只要图中的每个变量都只有少量的父结点，那么这个分布就可以用较少的参数来表示。\n图结构上的一些限制条件，比如说要求这个图为一棵树，也可以保证一些操作（例如求一小部分变量的边缘或者条件分布）更加地高效。\n<!-- % 556 head   16.2 to here  -->\n\n\n\n决定哪些信息需要被包含在图中而哪些不需要是很重要的。\n如果变量之间可以被假设为是条件独立的，那么这个图可以包含这种简化假设。\n当然也存在其他类型的简化图模型的假设。\n例如，我们可以假设无论Alice的表现如何，Bob总是跑得一样快\n（实际上，Alice的表现很大概率会影响Bob的表现，这取决于Bob的性格，\n如果在之前的比赛中Alice跑得特别快，这有可能鼓励Bob更加努力并取得更好的成绩，当然这也有可能使得Bob过分自信或者变得懒惰）。\n那么Alice对Bob的唯一影响就是在计算Bob的完成时间时需要加上Alice的时间。\n这个假设使得我们所需要的参数量从$O(k^2)$降到了$O(k)$。\n然而，值得注意的是在这个假设下$\\RSt_0$和$\\RSt_1$仍然是直接相关的，因为$\\RSt_1$表示的是Bob完成时的时间，并不是他跑的总时间。\n这也意味着图中会有一个从$\\RSt_0$指向$\\RSt_1$的箭头。\n\"Bob的个人跑步时间相对于其他因素是独立的\"这个假设无法在$\\RSt_0$，$\\RSt_1$，$\\RSt_2$的图中被表示出来。\n反之，我们只能将这个关系表示在条件分布的定义中。\n这个条件分布不再是一个大小为$k\\times k-1$的分别对应着$\\RSt_0$，  $\\RSt_1$的表格，而是一个包含了$k-1$个参数的略微复杂的公式。\n有向图模型的语法并不能对我们如何定义条件分布作出任何限制。\n它只定义了哪些变量可以作为其中的参数。\n<!-- % 556  16.2 to  -->\n\n\n\n\n## 无向模型\n\n<!-- % 556 -->\n\n\n有向图模型为我们提供了一种描述结构化概率模型的语言。\n而另一种常见的语言则是无向模型，也被称为马尔可夫随机场或者是马尔可夫网络 {cite?}。\n就像它们的名字所说的那样，无向模型中所有的边都是没有方向的。\n<!-- % 556 end -->\n\n\n<!-- %有向模型显然适用于当存在一个很明显的理由来描述每一个箭头时。 -->\n当存在很明显的理由画出每一个指向特定方向的箭头时，有向模型显然最适用。\n有向模型中，经常存在我们理解的具有因果关系以及因果关系有明确方向的情况。\n接力赛的例子就是一个这样的情况。\n之前运动员的表现会影响后面运动员的完成时间，而后面运动员却不会影响前面运动员的完成时间。\n<!-- % 557 head  -->\n\n\n然而并不是所有情况的相互作用都有一个明确的方向关系。\n当相互的作用并没有本质性的指向，或者是明确的双向相互作用时，使用无向模型更加合适。\n<!-- % 557  -->\n\n\n作为一个这种情况的例子，假设我们希望对三个二值随机变量建模：你是否生病，你的同事是否生病以及你的室友是否生病。\n就像在接力赛的例子中所作的简化假设一样，我们可以在这里做一些关于相互作用的简化假设。\n假设你的室友和同事并不认识，所以他们不太可能直接相互传染一些疾病，比如说感冒。\n这个事件太过罕见，所以我们不对此事件建模。\n然而，很有可能其中之一将感冒传染给你，然后通过你再传染给了另一个人。\n我们通过对你的同事传染给你以及你传染给你的室友建模来对这种间接的从你的同事到你的室友的感冒传染建模。\n<!-- % 557  -->\n\n\n在这种情况下，你传染给你的室友和你的室友传染给你都是非常容易的，所以模型不存在一个明确的单向箭头。\n这启发我们使用无向模型。\n其中随机变量对应着图中的相互作用的结点。\n与有向模型相同的是，如果在无向模型中的两个结点通过一条边相连接，那么对应这些结点的随机变量相互之间是直接作用的。\n不同于有向模型，在无向模型中的边是没有方向的，并不与一个条件分布相关联。\n<!-- % 557  -->\n\n\n我们把对应你健康状况的随机变量记作$\\RSh_y$，对应你的室友健康状况的随机变量记作$\\RSh_r$，你的同事健康的变量记作$\\RSh_c$。\n\\fig?表示这种关系。\n<!-- % 557 end -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/cold_undirected_graph}}\t\n\\fi\n\\caption{表示你室友健康状况的$\\RSh_r$、你健康状况的$\\RSh_y$和你同事健康状况的$\\RSh_c$之间如何相互影响的一个无向图。\n你和你的室友可能会相互传染感冒，你和你的同事之间也是如此，\n但是假设你室友和同事之间相互不认识，他们只能通过你来间接传染。}\n\\end{figure}\n\n正式地说，一个无向模型是一个定义在无向模型 $\\CalG$上的结构化概率模型。\n对于图中的每一个团\\footnote{图的一个团是图中结点的一个子集，并且其中的点是全连接的}$~\\CalC$，\n一个因子 $\\phi(\\CalC)$(也称为团势能)，衡量了团中变量每一种可能的联合状态所对应的密切程度。\n这些因子都被限制为是非负的。\n它们一起定义了未归一化概率函数：\n\\begin{align}\n\\tilde{p}(\\RVx) = \\prod_{\\CalC\\in\\CalG} \\phi(\\CalC).\n\\end{align}\n<!-- % 558 head -->\n\n\n只要所有团中的结点数都不大，那么我们就能够高效地处理这些未归一化概率函数。\n它包含了这样的思想，密切度越高的状态有越大的概率。\n然而，不像贝叶斯网络，几乎不存在团定义的结构，所以不能保证把它们乘在一起能够得到一个有效的概率分布。\n\\fig?展示了一个从无向模型中读取分解信息的例子。\n<!-- % 558 -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/example_undirected}}\n\\fi\n\t\\caption{这个图说明通过选择适当的$\\phi$，函数\n\t\t$p(\\RSa,\\RSb,\\RSc,\\RSd,\\RSe,\\RSf)$可以写作\n\t\t$\\frac{1}{Z}\\phi_{\\RSa,\\RSb}(\\RSa,\\RSb)\\phi_{\\RSb,\\RSc}(\\RSb,\\RSc)\\phi_{\\RSa,\\RSd}(\\RSa,\\RSd)\\phi_{\\RSb,\\RSe}(\\RSb,\\RSe)\\phi_{\\RSe,\\RSf}(\\RSe,\\RSf)$。}\n\\end{figure}\n\n\n\n在你、你的室友和同事之间感冒传染的例子中包含了两个团。\n一个团包含了$\\RSh_y$和$\\RSh_c$。\n这个团的因子可以通过一个表来定义，可能取到下面的值：\n<!-- % \\begin{table*}[!hbp] -->\n\t% \\centering\n\\begin{table}\n\t\\centering\n\\begin{tabular}{c|cc}\n\t\t& $\\RSh_y = 0$ & $\\RSh_y = 1$ \\\\ \\hline\n\t\t$\\RSh_c = 0$ & 2 & 1 \\\\\n\t\t$\\RSh_c = 1$  & 1 & 10 \\\\\n\\end{tabular}\n\\end{table}\n<!-- % \\end{table*} -->\n<!-- % 558 -->\n\n\n状态为$1$代表了健康的状态，相对的状态为$0$则表示不好的健康状态（即感染了感冒）。\n你们两个通常都是健康的，所以对应的状态拥有最高的密切程度。\n两个人中只有一个人是生病的密切程度是最低的，因为这是一个很罕见的状态。\n两个人都生病的状态（通过一个人来传染给了另一个人）有一个稍高的密切程度，尽管仍然不及两个人都健康的密切程度。\n<!-- % 559 head   -->\n\n\n为了完整地定义这个模型，我们需要对包含$\\RSh_y$和$\\RSh_r$的团定义类似的因子。\n<!-- % 559 head -->\n\n\n\n## 配分函数\n\n<!-- %  16.2.3   p 559 -->\n\n\n\n尽管这个未归一化概率函数处处不为零，我们仍然无法保证它的概率之和或者积分为$1$。\n为了得到一个有效的概率分布，我们需要使用对应的归一化的概率分布\n\\footnote{一个通过归一化团势能乘积定义的分布也被称作是吉布斯分布}：\n\\begin{align}\np(\\RVx) = \\frac{1}{Z}\\tilde{p}(\\RVx),\n\\end{align}\n其中，$Z$是使得所有的概率之和或者积分为$1$的常数，并且满足：\n\\begin{align}\nZ = \\int \\tilde{p}(\\RVx)d\\RVx.\n\\end{align}\n当函数$\\phi$固定时，我们可以把$Z$当成是一个常数。\n值得注意的是如果函数$\\phi$带有参数时，那么$Z$是这些参数的一个函数。\n在相关文献中为了节省空间忽略控制$Z$的变量而直接写$Z$是一个常用的方式。\n归一化常数$Z$被称作是配分函数，这是一个从统计物理学中借鉴的术语。\n<!-- % 559  -->\n\n\n由于$Z$通常是由对所有可能的$\\RVx$状态的联合分布空间求和或者求积分得到的，它通常是很难计算的。\n为了获得一个无向模型的归一化概率分布，模型的结构和函数$\\phi$的定义通常需要设计为有助于高效地计算$Z$。\n在深度学习中，$Z$通常是难以处理的。\n由于$Z$难以精确地计算出，我们只能使用一些近似的方法。\n这样的近似方法是\\chap?的主要内容。\n<!-- % 559  -->\n\n\n<!-- % 559 end -->\n<!-- %在设计无向模型时我们必须牢记在心的一个要点是设置一些因子使得$Z$不存在这样的方法也是有可能的。 -->\n在设计无向模型时，我们必须牢记在心的一个要点是设定一些使得$Z$不存在的因子也是有可能的。\n当模型中的一些变量是连续的，且$\\tilde{p}$在其定义域上的积分发散时这种情况就会发生。\n例如， 当我们需要对一个单独的标量变量$\\RSx\\in\\SetR$建模，并且单个团势能定义为$\\phi(x) = x^2$时。\n在这种情况下，\n\\begin{align}\nZ = \\int x^2 dx.\n\\end{align}\n由于这个积分是发散的，所以不存在一个对应着这个势能函数$\\phi(x)$的概率分布。\n有时候$\\phi$函数某些参数的选择可以决定相应的概率分布是否能够被定义。\n例如，对$\\phi$函数$\\phi(x;\\beta) = \\text{exp}(-\\beta x^2)$来说，参数$\\beta$决定了归一化常数$Z$是否存在。\n正的$\\beta$使得$\\phi$函数是一个关于$\\RSx$的高斯分布，但是非正的参数$\\beta$则使得$\\phi$不可能被归一化。\n\n\n<!-- % P560    -->\n有向建模和无向建模之间一个重要的区别就是有向模型是通过从起始点的概率分布直接定义的，\n反之无向模型的定义显得更加宽松，通过$\\phi$函数转化为概率分布而定义。\n这改变了我们处理这些建模问题的直觉。\n当我们处理无向模型时需要牢记一点，每一个变量的定义域对于一系列给定的$\\phi$函数所对应的概率分布有着重要的影响。\n举个例子，我们考虑一个$n$维向量的随机变量$\\RVx$以及一个由偏置向量$\\Vb$参数化的无向模型。\n假设$\\RVx$的每一个元素对应着一个团，并且满足$\\phi^{(i)}(\\RSx_i) = \\exp(b_i\\RSx_i)$。\n在这种情况下概率分布是怎样的呢？\n答案是我们无法确定，因为我们并没有指定$\\RVx$的定义域。\n如果$\\RVx$满足$\\RVx \\in \\SetR^n$，那么有关归一化常数$Z$的积分是发散的，这导致了对应的概率分布是不存在的。\n如果$\\RVx\\in\\{0,1\\}^n$，那么$p(\\RVx)$可以被分解成$n$个独立的分布，并且满足$p(\\RSx_i=1) = \\text{sigmoid}(b_i)$。\n如果$\\RVx$的定义域是基本单位向量 $(\\{[1,0,\\ldots,0],[0,1,\\ldots,0],\\ldots,[0,0,\\ldots,1]\\})$的集合，\n那么$p(\\RSx) = \\text{softmax}(\\Vb)$，因此对于$j\\neq i$，一个较大的$b_i$的值会降低所有$p(\\RSx_j = 1)$的概率。\n通常情况下，通过仔细选择变量的定义域，能够从一个相对简单的$\\phi$函数的集合可以获得一个相对复杂的表达。\n我们会在\\sec?中讨论这个想法的实际应用。\n<!-- % P560    -->\n\n\n\n## 基于能量的模型\n\n<!-- % 560 -->\n\n\n无向模型中许多有趣的理论结果都依赖于$\\forall \\Vx,\\ \\tilde{p}(\\Vx)>0$这个假设。\n使这个条件满足的一种简单方式是使用基于能量的模型，其中\n\\begin{align}\n\\tilde{p}(\\RVx) = \\exp(-E(\\RVx)),\n\\end{align}\n$E(\\RVx)$被称作是能量函数。\n对所有的$\\RSz$， $\\exp(\\RSz)$都是正的，这保证了没有一个能量函数会使得某一个状态$\\RVx$的概率为$0$。\n我们可以完全自由地选择那些能够简化学习过程的能量函数。\n如果我们直接学习各个团势能，我们需要利用约束优化方法来任意地指定一些特定的最小概率值。\n学习能量函数的过程中，我们可以采用无约束的优化方法\\footnote{对于某些模型，我们可以仍然使用约束优化方法来确保$Z$存在。}。\n基于能量的模型中的概率可以无限趋近于$0$但是永远达不到$0$。\n<!-- % p 561  head -->\n\n\n服从\\eqn?形式的任意分布都是玻尔兹曼分布的一个实例。\n正是基于这个原因，我们把许多基于能量的模型称为玻尔兹曼机~{cite?}。\n关于什么时候称之为基于能量的模型，什么时候称之为玻尔兹曼机不存在一个公认的判别标准。\n一开始玻尔兹曼机这个术语是用来描述一个只有二值变量的模型，但是如今许多模型，比如均值-协方差RBM，也涉及到了实值变量。\n虽然玻尔兹曼机最初的定义既可以包含潜变量也可以不包含潜变量，但是时至今日玻尔兹曼机这个术语通常用于指拥有潜变量的模型，而没有潜变量的玻尔兹曼机则经常被称为马尔可夫随机场或对数线性模型。\n<!-- % 561 -->\n\n\n\n无向模型中的团对应于未归一化概率函数中的因子。 \n通过$\\exp(a+b) = \\exp(a) \\exp(b)$，我们发现无向模型中的不同团对应于能量函数的不同项。\n换句话说，基于能量的模型只是一种特殊的马尔可夫网络：求幂使能量函数中的每个项对应于不同团的一个因子。\n关于如何从无向模型结构中获得能量函数形式的示例可以参考\\fig?。\n人们可以将能量函数中带有多个项的基于能量的模型视作是专家之积~{cite?}。\n能量函数中的每一项对应的是概率分布中的一个因子。\n能量函数中的每一项都可以看作决定一个特定的软约束是否能够满足的\"专家\"。\n<!-- %每个专家只执行仅涉及一个随机变量低维投影的约束，但是当其结合概率的乘法时，专家们合理构造了复杂的高维约束。 -->\n每个专家只执行一个约束，而这个约束仅仅涉及随机变量的一个低维投影，但是当其结合概率的乘法时，专家们一同构造了复杂的高维约束。\n<!-- % 561 -->\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/example_undirected}}\n\\fi\n\\caption{这个图说明通过为每个团选择适当的能量函数 $E(\\RSa,\\RSb,\\RSc,\\RSd,\\RSe,\\RSf)$可以写作$E_{\\RSa,\\RSb}(\\RSa,\\RSb) + E_{\\RSb,\\RSc}(\\RSb,\\RSc) + E_{\\RSa,\\RSd}(\\RSa,\\RSd)+  E_{\\RSb,\\RSe}(\\RSb,\\RSe) + E_{\\RSe,\\RSf}(\\RSe,\\RSf)$。\n值得注意的是，我们令$\\phi$等于对应负能量的指数，可以\n<!-- %我们可以通过令$\\phi$等于对应负能量的指数来 -->\n获得图\\?中的$\\phi$函数，比如，$\\phi_{\\RSa,\\RSb}(\\RSa,\\RSb) = \\exp(-E(\\RSa,\\RSb))$。}\n\\end{figure}\n<!-- %  562 head -->\n\n\n基于能量的模型定义的一部分无法用机器学习观点来解释：即\\eqn?中的\"-\"符号。\n这个\"-\"符号可以被包含在$E$的定义之中。\n对于很多$E$函数的选择来说，学习算法可以自由地决定能量的符号。\n这个负号的存在主要是为了保持机器学习文献和物理学文献之间的兼容性。\n概率建模的许多研究最初都是由统计物理学家做出的，其中$E$是指实际的、物理概念的能量，没有任何符号。\n诸如\"能量\"和\"配分函数\"这类术语仍然与这些技术相关联，尽管它们的数学适用性比在物理中更宽。\n一些机器学习研究者（例如，{Smolensky86}将负能量称为~\\textbf{harmony}）发出了不同的声音，但这些都不是标准惯例。\n<!-- % 562  head -->\n\n\n许多对概率模型进行操作的算法不需要计算$p_{\\text{model}}(\\Vx)$，而只需要计算$\\log \\tilde{p}_{\\text{model}}(\\Vx)$。\n对于具有潜变量 $\\Vh$的基于能量的模型， 这些算法有时会将该量的负数称为自由能：\n\\begin{align}\n\\CalF (\\Vx) = -\\log \\sum_{\\Vh} \\exp(-E(\\Vx,\\Vh)).\n\\end{align}\n在本书中，我们更倾向于更为通用的基于$\\log \\tilde{p}_{\\text{model}}(\\Vx)$的定义。\n<!-- % 562 -->\n\n\n\n## 分离和d-分离\n\n\n图模型中的边告诉我们哪些变量直接相互作用。\n我们经常需要知道哪些变量\\emph{间接}相互作用。 \n某些间接相互作用可以通过观察其他变量来启用或禁用。\n更正式地，我们想知道在给定其他变量子集的值时，哪些变量子集彼此条件独立。\n<!-- % 562 end  -->\n\n\n在无向模型中，识别图中的条件独立性是非常简单的。 \n在这种情况下，图中隐含的条件独立性称为分离。\n如果图结构显示给定变量集$\\SetS$的情况下变量集$\\SetA$与变量集$\\SetB$无关，\n那么我们声称给定变量集$\\SetS$时，变量集$\\SetA$与另一组变量集$\\SetB$是分离的。\n<!-- %如果两个变量$\\RSa$和$\\RSb$通过涉及未观察变量的路径连接，那么这些变量不是分离的。 -->\n如果连接两个变量$\\RSa$和$\\RSb$的连接路径仅涉及未观察变量，那么这些变量不是分离的。\n如果它们之间没有路径，或者所有路径都包含可观测的变量，那么它们是分离的。\n我们认为仅涉及未观察到的变量的路径是\"活跃\"的，而包括可观察变量的路径称为\"非活跃\"的。\n<!-- % 563  head -->\n\n\n当我们画图时，我们可以通过加阴影来表示观察到的变量。\n\\fig?用于描述当以这种方式绘图时无向模型中的活跃和非活跃路径的样子。\n\\fig?描述了一个从无向模型中读取分离信息的例子。\n<!-- % 563 -->\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{tabular}{cc}\n\\includegraphics{Chapter16/figures/undirected_paths_active.pdf} &%\n\\includegraphics{Chapter16/figures/undirected_paths_inactive.pdf} \\\\\n(a) & (b)\n\\end{tabular}\n\\fi\n\\caption{\\emph{(a)}随机变量$\\RSa$和随机变量$\\RSb$之间穿过$\\RSs$的路径是活跃的，因为$\\RSs$是观察不到的。\n这意味着$\\RSa$，$\\RSb$之间不是分离的。\n\\emph{(b)}图中$\\RSs$用阴影填充，表示它是可观察的。\n因为$\\RSa$和$\\RSb$之间的唯一路径通过$\\RSs$，并且这条路径是不活跃的，\n我们可以得出结论，在给定$\\RSs$的条件下$\\RSa$和$\\RSb$是分离的。}\n\\end{figure}\n<!-- % 563 mid -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/example_sep}}\n\\fi\n\\caption{从一个无向图中读取分离性质的一个例子。\n这里$\\RSb$用阴影填充，表示它是可观察的。\n由于$\\RSb$挡住了从$\\RSa$到$\\RSc$的唯一路径，我们说在给定$\\RSb$的情况下$\\RSa$和$\\RSc$是相互分离的。\n观察值$\\RSb$同样挡住了从$\\RSa$到$\\RSd$的一条路径，但是它们之间有另一条活跃路径。\n因此给定$\\RSb$的情况下$\\RSa$和$\\RSd$不是分离的。}\n\\end{figure}\n<!-- % 563 end -->\n\n\n\n类似的概念适用于有向模型，只是在有向模型中，这些概念被称为d-分离。\n\"d\"代表\"依赖\"的意思。\n有向图中\\,d-分离的定义与无向模型中分离的定义相同：\n如果图结构显示给定变量集$\\SetS$时 ，变量集$\\SetA$与变量集$\\SetB$无关， 那么我们认为给定变量集$\\SetS$时，变量集$\\SetA$~d-分离于变量集$\\SetB$。\n<!-- % 563 -->\n\n\n与无向模型一样，我们可以通过查看图中存在的活跃路径来检查图中隐含的独立性。\n如前所述，如果两个变量之间存在活跃路径，则两个变量是依赖的，如果没有活跃路径，则为d-分离。\n在有向网络中，确定路径是否活跃有点复杂。\n关于在有向模型中识别活跃路径的方法可以参考\\fig?。 \n\\fig?是从一个图中读取一些属性的例子。\n<!-- % 564  head  -->\n\n\n\n\n\n尤其重要的是要记住分离和d-分离只能告诉我们\\emph{图中隐含}的条件独立性。\n图并不需要表示所有存在的独立性。 \n进一步的，使用完全图（具有所有可能的边的图）来表示任何分布总是合法的。\n事实上，一些分布包含不可能用现有图形符号表示的独立性。\n特定环境下的独立指的是取决于网络中一些变量值的独立性。\n例如，考虑三个二值变量的模型：$\\RSa$，$\\RSb $和$\\RSc$。\n假设当$\\RSa$是0时，$\\RSb$和$\\RSc$是独立的， 但是当$\\RSa$是1时，$\\RSb$确定地等于$\\RSc$。\n当$\\RSa = 1$时图模型需要连接$\\RSb$和$\\RSc$的边。\n但是图不能说明当$\\RSa = 0$时$\\RSb$和$\\RSc$不是独立的。\n<!-- % 564 -->\n\n一般来说，当独立性不存在时，图不会显示独立性。 \n然而，图可能无法编码独立性。\n<!-- % 564 -->\n\n\n\n<!-- % 565  1 page -->\n\\begin{figure}[!htb]\n\t\\ifOpenSource\n\t\\centerline{\\includegraphics{figure.pdf}}\n\t\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/directed_paths.pdf}}\n\t\\fi\n\\caption{两个随机变量$\\RSa$，$\\RSb$之间存在的长度为$2$的所有种类的活跃路径。\n<!-- %存在的所有种类的长度为$2$的活跃路径。 -->\n\\emph{(a)}箭头方向从$\\RSa$指向$\\RSb$的任何路径，反过来也一样。\n如果$\\RSs$可以被观察到，这种路径就是阻塞的。\n在接力赛的例子中，我们已经看到过这种类型的路径。\n\\emph{(b)}变量$\\RSa$和$\\RSb$通过\\emph{共因} $\\RSs$相连。\n举个例子，假设$\\RSs$是一个表示是否存在飓风的变量，$\\RSa$和$\\RSb$表示两个相邻气象监控区域的风速。\n如果我们在$\\RSa$处观察到很高的风速，我们可以期望在$b$处也观察到高速的风。\n如果观察到$\\RSs$，那么这条路径就被阻塞了。\n如果我们已经知道存在飓风，那么无论$\\RSa$处观察到什么，我们都能期望$\\RSb$处有较高的风速。\n在$\\RSa$处观察到一个低于预期的风速（对飓风而言）并不会改变我们对$\\RSb$处风速的期望（已知有飓风的情况下）。\n然而，如果$\\RSs$不被观测到，那么$\\RSa$和$\\RSb$是依赖的，即路径是活跃的。\n\\emph{(c)}变量$\\RSa$和$\\RSb$都是$\\RSs$的父节点。\n这称为V-结构或者碰撞情况。\n根据相消解释作用，V-结构导致$\\RSa$和$\\RSb$是相关的。\n在这种情况下，当$\\RSs$被观测到时路径是活跃的。\n举个例子，假设$\\RSs$是一个表示你的同事不在工作的变量。\n变量$\\RSa$表示她生病了，而变量$\\RSb$表示她在休假。\n如果你观察到了她不在工作，你可以假设她很有可能是生病了或者是在度假，但是这两件事同时发生是不太可能的。\n如果你发现她在休假，那么这个事实足够\\emph{解释}她的缺席了。\n你可以推断她很可能没有生病。\n\\emph{(d)}即使$\\RSs$的任意后代都被观察到，相消解释作用也会起作用。\n举个例子，假设$\\RSc$是一个表示你是否收到你同事的报告的一个变量。\n如果你注意到你还没有收到这个报告，这会增加你估计的她今天不在工作的概率，这反过来又会增加她今天生病或者度假的概率。\n阻塞\\,V-结构中路径的唯一方法就是共享子节点的后代一个都观察不到。}\n\\end{figure}\n<!-- % 565  1 page -->\n\n\n<!-- % 566 head -->\n\\begin{figure}[!htb]\n\t\\centering\n\t\\ifOpenSource\n\t\\includegraphics{figure.pdf}\n\t\\else\n\t\\includegraphics{Chapter16/figures/example_dsep}\n\t\\fi\n\t\\captionsetup{singlelinecheck=off}\n\\caption[d-separation example]{从这张图中，我们可以发现一些\\,d-分离的性质。这包括了：\n\n+ 给定空集的情况下，$\\RSa$和$\\RSb$是\\,d-分离的。\n+ 给定$\\RSc$的情况下，$\\RSa$和$\\RSe$是\\,d-分离的。\n+ 给定$\\RSc$的情况下，$\\RSd$和$\\RSe$是\\,d-分离的。\n\n我们还可以发现当我们观察到一些变量时，一些变量不再是\\,d-分离的：\n\n+ 给定$\\RSc$的情况下，$\\RSa$和$\\RSb$不是\\,d-分离的。\n+ 给定$\\RSd$的情况下，$\\RSa$和$\\RSb$不是\\,d-分离的。\n\n}\n\\end{figure}\n<!-- % 566 head -->\n\n\n## 在有向模型和无向模型中转换\n\n\n我们经常将特定的机器学习模型称为无向模型或有向模型。\n例如，我们通常将受限玻尔兹曼机称为无向模型， 而稀疏编码则被称为有向模型。\n这种措辞的选择可能有点误导，因为没有概率模型本质上是有向或无向的。\n但是，一些模型很适合使用有向图\\emph{描述}，而另一些模型很适合使用无向模型描述。\n<!-- % 564 end -->\n\n有向模型和无向模型都有其优点和缺点。\n这两种方法都不是明显优越和普遍优选的。\n相反，我们根据具体的每个任务来决定使用哪一种模型。 \n这个选择部分取决于我们希望描述的概率分布。\n根据哪种方法可以最大程度地捕捉到概率分布中的独立性，或者哪种方法使用最少的边来描述分布，我们可以决定使用有向建模还是无向建模。\n还有其他因素可以影响我们决定使用哪种建模方式。 \n即使在使用单个概率分布时，我们有时也可以在不同的建模方式之间切换。\n有时，如果我们观察到变量的某个子集，或者如果我们希望执行不同的计算任务，换一种建模方式可能更合适。\n例如，有向模型通常提供了一种高效地从模型中抽取样本（在\\sec?中描述）的直接方法。\n而无向模型形式通常对于推导近似推断过程（我们将在\\chap?中看到，\\eqn?强调了无向模型的作用）是很有用的。\n<!-- % 566 -->\n\n\n每个概率分布可以由有向模型或由无向模型表示。\n在最坏的情况下，我们可以使用\"完全图\"来表示任何分布。\n在有向模型的情况下，完全图是任意有向无环图，其中我们对随机变量排序，并且每个变量在排序中位于其之前的所有其他变量作为其图中的祖先。\n对于无向模型，完全图只是包含所有变量的单个团。 \n\\fig?给出了一个实例。\n<!-- % 566 -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/complete}}\t\n\\fi\n\\caption{完全图的例子，完全图能够描述任何的概率分布。\n这里我们展示了一个带有四个随机变量的例子。\n\\emph{(左)}完全无向图。\n在无向图中，完全图是唯一的。\n\\emph{(右)}一个完全有向图。\n在有向图中，并不存在唯一的完全图。\n我们选择一种变量的排序，然后对每一个变量，从它本身开始，向每一个指向顺序在其后面的变量画一条弧。\n因此存在着关于变量数阶乘数量级的不同种完全图。\n在这个例子中，我们从左到右从上到下地排序变量。}\n\\end{figure}\n\n\n当然，图模型的优势在于图能够包含一些变量不直接相互作用的信息。 \n完全图并不是很有用，因为它并不隐含任何独立性。\n<!-- % 566 -->\n\n\n当我们用图表示概率分布时，我们想要选择一个包含尽可能多独立性的图，但是并不会假设任何实际上不存在的独立性。\n<!-- % 566 end -->\n\n\n从这个角度来看，一些分布可以使用有向模型更高效地表示，而其他分布可以使用无向模型更高效地表示。\n换句话说，有向模型可以编码一些无向模型所不能编码的独立性，反之亦然。\n<!-- % 567 head -->\n\n\n有向模型能够使用一种无向模型无法完美表示的特定类型的子结构。\n这个子结构被称为不道德。\n这种结构出现在当两个随机变量$\\RSa$和$\\RSb$都是第三个随机变量$\\RSc$的父结点，并且不存在任一方向上直接连接$\\RSa$和$\\RSb$的边时。\n（\"不道德\"的名字可能看起来很奇怪; 它在图模型文献中使用源于一个关于未婚父母的笑话。）\n为了将有向模型图$\\CalD$转换为无向模型，我们需要创建一个新图$\\CalU$。\n对于每对变量$\\RSx$和$\\RSy$，如果存在连接$\\CalD$中的$\\RSx$和$\\RSy$的有向边（在任一方向上），或者如果$\\RSx$和$\\RSy$都是图$\\CalD$中另一个变量$\\RSz$的父节点，则在$\\CalU$中添加连接$\\RSx$和$\\RSy$的无向边。 \n得到的图$\\CalU$被称为是道德图。\n关于一个通过道德化将有向图模型转化为无向模型的例子可以参考\\fig?。\n<!-- % 567 -->\n\n\n<!-- % 568 1 page -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/dm_to_um}}\t\n\\fi\n\\caption{通过构造道德图将有向模型（上一行）转化为无向模型（下一行）的例子。\n\\emph{(左)}只需要把有向边替换成无向边就可以把这个简单的链转化为一个道德图。\n得到的无向模型包含了完全相同的独立关系和条件独立关系。\n\\emph{(中)}这个图是在不丢失独立性的情况下是无法\n<!-- %不丢失独立性的情况下无法 -->\n转化为无向模型的最简单的有向模型。\n这个图包含了单个完整的不道德结构。\n因为$\\RSa$和$\\RSb$都是$\\RSc$的父节点，当$\\RSc$被观察到时，它们之间通过活跃路径相连。\n为了捕捉这个依赖，无向模型必须包含一个含有所有三个变量的团。\n这个团无法编码$\\RSa \\perp \\RSb$这个信息。\n\\emph{(右)}一般来说，道德化的过程会给图添加许多边，因此丢失了一些隐含的独立性。\n举个例子，这个稀疏编码图需要在每一对隐藏单元之间添加道德化的边，因此也引入了二次数量级的新的直接依赖。}\n\\end{figure}\n<!-- % 568 1 page -->\n\n\n\n同样的，无向模型可以包括有向模型不能完美表示的子结构。\n具体来说，如果$\\CalU$包含长度大于$3$的环，则有向图$\\CalD$不能捕获无向模型 $\\CalU$所包含的所有条件独立性，除非该环还包含弦。\n环指的是由无向边连接的变量序列，并且满足序列中的最后一个变量连接回序列中的第一个变量。\n弦是定义环序列中任意两个非连续变量之间的连接。\n如果$\\CalU$具有长度为$4$或更大的环，并且这些环没有弦，我们必须在将它们转换为有向模型之前添加弦。\n添加这些弦会丢弃在$\\CalU$中编码的一些独立信息。\n通过将弦添加到$\\CalU$形成的图被称为弦图或者三角形化图，\n因为我们现在可以用更小的、三角的环来描述所有的环。\n要从弦图构建有向图$\\CalD$，我们还需要为边指定方向。\n当这样做时，我们不能在$\\CalD$中创建有向循环，否则将无法定义有效的有向概率模型。\n为$\\CalD$中的边分配方向的一种方法是对随机变量排序，然后将每个边从排序较早的节点指向排序稍后的节点。\n一个简单的实例可以参考\\fig?。\n<!-- % 569 mid -->\n\n\n\n<!-- % 569 head -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/um_to_dm}}\t\n\\fi\n\\caption{将一个无向模型转化为一个有向模型。\n\\emph{(左)}这个无向模型无法转化为有向模型，因为它有一个长度为$4$且不带有弦的环。\n具体说来，这个无向模型包含了两种不同的独立性，并且不存在一个有向模型可以同时描述这两种性质：$\\RSa\\perp \\RSc \\mid \\{\\RSb,\\RSd\\}$和$\\RSb \\perp \\RSd \\mid \\{\\RSa,\\RSc\\}$。\n\\emph{(中)}为了将无向图转化为有向图，我们必须通过保证所有长度大于$3$的环都有弦来三角形化图。\n为了实现这个目标，我们可以加一条连接$\\RSa$和$\\RSc$或者连接$\\RSb$和$\\RSd$的边。\n在这个例子中，我们选择添加一条连接$\\RSa$和$\\RSc$的边。\n\\emph{(右)}为了完成转化的过程，我们必须给每条边分配一个方向。\n执行这个任务时，我们必须保证不产生任何有向环。\n避免出现有向环的一种方法是赋予节点一定的顺序，然后将每个边从排序较早的节点指向排序稍后的节点。\n在这个例子中，我们根据变量名的字母进行排序。}\n\\end{figure}\n<!-- % 569 head -->\n\n\n\n\n## 因子图\n\n<!-- % 569      16.2.7 -->\n\n\n\n因子图是从无向模型中抽样的另一种方法，它可以解决标准无向模型语法中图表达的模糊性。\n在无向模型中，每个$\\phi$函数的范围必须是图中某个团的\\emph{子集}。\n我们无法确定每一个团是否含有一个作用域包含整个团的因子——比如说一个包含三个结点的团可能对应的是一个有三个结点的因子，也可能对应的是三个因子并且每个因子包含了一对结点，这通常会导致模糊性。\n通过显式地表示每一个$\\phi$函数的作用域，因子图解决了这种模糊性。\n<!-- %然而，$\\phi$没有必要包含每个团的全部。 -->\n<!-- %因子图明确表示每个$\\phi$函数的范围。 -->\n具体来说，因子图是一个包含无向二分图的无向模型的图形化表示。\n一些节点被绘制为圆形。 \n就像在标准无向模型中一样，这些节点对应于随机变量。\n其余节点绘制为方块。\n这些节点对应于未归一化概率函数的因子 $\\phi$。\n变量和因子可以通过无向边连接。\n当且仅当变量包含在未归一化概率函数的因子中时，变量和因子在图中存在连接。\n没有因子可以连接到图中的另一个因子，也不能将变量连接到变量。\n\\fig?给出了一个例子来说明因子图如何解决无向网络中的模糊性。\n<!-- % 570   -->\n\n\n<!-- % 570 head -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/factor_graph}}\t\n\\fi\n\\caption{因子图如何解决无向网络中的模糊性的一个例子。\n\\emph{(左)}一个包含三个变量（$\\RSa$、$\\RSb$和$\\RSc$）的团组成的无向网络。\n\\emph{(中)}对应这个无向模型的因子图。\n这个因子图有一个包含三个变量的因子。\n\\emph{(右)}对应这个无向模型的另一种有效的因子图。\n这个因子图包含了三个因子，每个因子只对应两个变量。\n即使它们表示的是同一个无向模型，这个因子图上进行的表示、推断和学习相比于中图描述的因子图都要渐近地廉价。}\n\\end{figure}\n<!-- % 570 head -->\n\n\n\n# 从图模型中采样\n\n\n<!-- % 570   -->\n图模型同样简化了从模型中采样的过程。\n\n\n有向图模型的一个优点是，可以通过一个简单高效的过程从模型所表示的联合分布中产生样本，这个过程被称为原始采样。\n<!-- %可以通过一个简单高效的被称作是原始采样的过程从由模型表示的联合分布中抽取样本。 -->\n<!-- % 570   -->\n\n\n原始采样的基本思想是将图中的变量$\\RSx_i$使用拓扑排序，使得对于所有$i$和$j$，\n如果$\\RSx_i$是$\\RSx_j$的一个父亲结点，则$j$大于$i$。\n然后可以按此顺序对变量进行采样。\n换句话说，我们可以首先采$\\RSx_1\\sim P(\\RSx_1)$，然后采$\\RSx_2\\sim P(\\RSx_2\\mid Pa_{\\CalG}(\\RSx_2))$，以此类推，直到最后我们从$ P(\\RSx_n\\mid Pa_{\\CalG}(\\RSx_n))$中采样。\n只要不难从每个条件分布$\\RSx_i\\sim P(\\RSx_i\\mid Pa_{\\CalG}(\\RSx_i))$中采样，那么从整个模型中采样也是容易的。\n<!-- %那么很容易从整个模型中抽样。 -->\n拓扑排序操作保证我们可以按照\\eqn?中条件分布的顺序依次采样。\n如果没有拓扑排序，我们可能会在其父节点可用之前试图对该变量进行抽样。\n<!-- % 571   -->\n\n\n有些图可能存在多个拓扑排序。 \n原始采样可以使用这些拓扑排序中的任何一个。\n<!-- % 571 -->\n\n原始采样通常非常快（假设从每个条件分布中采样都是很容易的）并且非常简便。\n<!-- % 571   -->\n\n\n原始采样的一个缺点是其仅适用于有向图模型。 \n另一个缺点是它并不是每次采样都是条件采样操作。%??\n当我们希望从有向图模型中变量的子集中采样时，给定一些其他变量，我们经常要求所有给定的条件变量在顺序图中比要采样的变量的顺序要早。\n在这种情况下，我们可以从模型分布指定的局部条件概率分布中采样。 \n否则，我们需要采样的条件分布是给定观测变量的后验分布。\n这些后验分布在模型中通常没有明确指定和参数化。 \n推断这些后验分布的代价可能是很高的。 \n在这种情况下的模型中，原始采样不再有效。\n<!-- % 571    -->\n\n\n\n不幸的是，原始采样仅适用于有向模型。 \n我们可以通过将无向模型转换为有向模型来实现从无向模型中抽样，但是这通常需要解决棘手的推断问题（要确定新有向图的根节点上的边缘分布），或者需要引入许多边从而会使得到的有向模型变得难以处理。\n从无向模型采样，而不首先将其转换为有向模型的做法似乎需要解决循环依赖的问题。 \n每个变量与每个其他变量相互作用，因此对于采样过程没有明确的起点。\n不幸的是，从无向模型中抽取样本是一个成本很高的多次迭代的过程。\n理论上最简单的方法是Gibbs采样。\n假设我们在一个$n$维向量的随机变量$\\RVx$上有一个图模型。 \n我们迭代地访问每个变量$x_i$，在给定其他变量的条件下从$p(\\RSx_i \\mid \\RSx_{-i})$中抽样。\n由于图模型的分离性质，抽取$x_i$时我们可以等价地仅对$\\RSx_i$的邻居条件化。\n不幸的是，在我们遍历图模型一次并采样所有$n$个变量之后，我们仍然无法得到一个来自$p(\\RVx)$的客观样本。\n相反，我们必须重复该过程并使用它们邻居的更新值对所有$n$个变量重新取样。\n在多次重复之后，该过程渐近地收敛到正确的目标分布。\n我们很难确定样本何时达到所期望分布的足够精确的近似。\n无向模型的采样技术是一个高级的研究方向，\\chap?将对此进行更详细的讨论。\n<!-- % 572 head -->\n\n\n\n\n\n# 结构化建模的优势\n\n<!-- % 572 -->\n\n\n使用结构化概率模型的主要优点是它们能够显著降低表示概率分布、学习和推断的成本。\n有向模型中采样还可以被加速，但是对于无向模型情况则较为复杂。\n选择不对某些变量的相互作用进行建模是允许所有这些操作使用较少的运行时间和内存的主要机制。\n<!-- %允许所有这些操作使用较少的运行时间和内存的主要机制是选择不对某些变量的相互作用进行建模。 -->\n图模型通过省略某些边来传达信息。\n在没有边的情况下，模型假设不对变量间直接的相互作用建模。\n<!-- % 572 -->\n\n\n<!-- %使用结构化概率模型的一个更加不容易量化的益处是它们允许我们明确地将给定的现有的知识与知识的学习或者推断分开。 -->\n结构化概率模型允许我们明确地将给定的现有知识与知识的学习或者推断分开，这是一个不容易量化的益处。\n这使我们的模型更容易开发和调试。 \n我们可以设计、分析和评估适用于更广范围的图的学习算法和推断算法。\n同时，我们可以设计能够捕捉到我们认为数据中存在的重要关系的\n<!-- %认为重要的关系的 -->\n模型。\n然后，我们可以组合这些不同的算法和结构，并获得不同可能性的笛卡尔乘积。\n然而，为每种可能的情况设计端到端的算法会更加困难。\n<!-- % 572 -->\n\n\n\n\n# 学习依赖关系\n\n<!-- % 572 -->\n\n良好的生成模型需要准确地捕获所观察到的或\"可见\"变量$\\RVv$上的分布。\n通常$\\RVv$的不同元素彼此高度依赖。\n在深度学习中，最常用于建模这些依赖关系的方法是引入几个潜在或\"隐藏\"变量$\\RVh$。\n然后，该模型可以捕获任何对（变量$\\RSv_i$和$\\RSv_j$间接依赖可以通过$\\RSv_i$和$\\RVh$之间直接依赖和$\\RVh$和$\\RSv_j$直接依赖捕获)之间的依赖关系。%??\n<!-- % 572  end  -->\n\n\n如果一个良好的关于$\\RVv$的模型不包含任何潜变量，那么它在贝叶斯网络中的每个节点需要具有大量父节点或在马尔可夫网络中具有非常大的团。\n仅仅表示这些高阶相互作用的成本就很高了，首先从计算角度上考虑，存储在存储器中的参数数量是团中成员数量的指数级别，接着在统计学意义上，因为这些指数数量的参数需要大量的数据来准确估计。\n<!-- % 573  head   -->\n\n\n当模型旨在描述直接连接的可见变量之间的依赖关系时，通常不可能连接所有变量，因此设计图模型时需要连接那些紧密相关的变量，并忽略其他变量之间的作用。\n机器学习中有一个称为结构学习的领域专门讨论这个问题。\n{koller-book2009}是一个不错的结构学习参考资料。\n大多数结构学习技术基于一种贪婪搜索的形式。\n它们提出了一种结构，对具有该结构的模型进行训练，然后给出分数。 \n该分数奖励训练集上的高精度并对模型的复杂度进行惩罚。\n然后提出添加或移除少量边的候选结构作为搜索的下一步。\n搜索向一个预计会增加分数的新结构发展。 %??\n<!-- % 573 -->\n\n\n使用潜变量而不是自适应结构避免了离散搜索和多轮训练的需要。 \n可见变量和潜变量之间的固定结构可以使用可见单元和隐藏单元之间的直接作用，从而建模可见单元之间的间接作用。\n<!-- %从而使得可见单元之间间接作用。 -->\n使用简单的参数学习技术，我们可以学习到一个具有固定结构的模型，这个模型在边缘分布$p(\\Vv)$上拥有正确的结构。\n<!-- % 573  -->\n\n\n潜变量除了发挥本来的作用，即能够高效地描述$p(\\RVv)$以外，还具有另外的优势。%??\n新变量$\\RVh$还提供了$\\RVv$的替代表示。\n例如，如\\sec?所示，高斯混合模型学习了一个潜变量，这个潜变量对应于输入样本是从哪一个混合体中抽出。\n这意味着高斯混合模型中的潜变量可以用于做分类。\n我们可以看到\\chap?中简单的概率模型如稀疏编码，是如何学习可以用作分类器输入特征或者作为流形上坐标的潜变量的。\n其他模型也可以使用相同的方式，但是更深的模型和具有多种相互作用方式的模型可以获得更丰富的输入描述。\n许多方法通过学习潜变量来完成特征学习。\n通常，给定$\\RVv$和$\\RVh$，实验观察显示$\\SetE[\\RVh\\mid\\RVv]$或${\\arg\\max}_{\\Vh}\\ p(\\Vh,\\Vv)$都是$\\Vv$的良好特征映射。\n<!-- % 573 -->\n\n\n# 推断和近似推断\n\n<!-- % 573 end -->\n\n\n<!-- %我们可以使用概率模型的主要方法之一是提出关于变量如何相互关联的问题。  -->\n解决变量之间如何相互关联的问题是我们使用概率模型的一个主要方式。 \n给定一组医学测试，我们可以询问患者可能患有什么疾病。\n在一个潜变量模型中，我们可能需要提取能够描述可观察变量$\\RVv$的特征$\\SetE[\\RVh \\mid \\RVv]$。\n有时我们需要解决这些问题来执行其他任务。 \n我们经常使用最大似然的准则来训练我们的模型。\n由于\n\\begin{align}\n\\log p(\\Vv) = \\SetE_{\\RVh \\sim p(\\RVh\\mid \\Vv)} [\\log p(\\Vh,\\Vv) -  \\log p(\\Vh\\mid\\Vv)],\n\\end{align}\n学习过程中，%为了执行学习规则，\n我们经常需要计算$p(\\RVh\\mid\\Vv)$。\n所有这些都是推断问题的例子，其中我们必须预测给定其他变量的情况下一些变量的值，或者在给定其他变量值的情况下预测一些变量的概率分布。\n<!-- % 574 -->\n\n<!-- %不幸的是，对于大多数有趣的深度模型来说，这些推断问题都是难以处理的，即使我们使用结构化图模型来简化它们。 -->\n不幸的是，对于大多数有趣的深度模型来说，即使我们使用结构化图模型来简化这些推断问题，它们仍然是难以处理的。\n图结构允许我们用合理数量的参数来表示复杂的高维分布，但是用于深度学习的图并不满足这样的条件，从而难以实现高效地推断。\n<!-- % 574 -->\n\n\n我们可以直接看出，计算一般图模型的边缘概率是\\#P-hard的。\n复杂性类别\\#P是复杂性类别NP的泛化。\nNP中的问题只需确定其中一个问题是否有解决方案，并找到一个解决方案（如果存在）就可以解决。\n\\#P中的问题需要计算解决方案的数量。\n为了构建最坏情况的图模型，我们可以设想一下我们在3-SAT问题中定义二值变量的图模型。\n我们可以对这些变量施加均匀分布。\n然后我们可以为每个子句添加一个二值潜变量，来表示每个子句是否成立。\n然后，我们可以添加另一个潜变量，来表示所有子句是否成立。\n这可以通过构造一个潜变量的缩减树来完成，树中的每个结点表示其他两个变量是否成立，从而不需要构造一个大的团。\n该树的叶是每个子句的变量。\n树的根表示整个问题是否成立。\n由于子句的均匀分布，缩减树根结点的边缘分布表示子句有多少比例是成立的。\n虽然这是一个设计的最坏情况的例子，NP-hard图确实会频繁地出现在现实世界的场景中。\n<!-- % 574 -->\n\n\n这促使我们使用近似推断。\n在深度学习中，这通常涉及变分推断，其中通过寻求尽可能接近真实分布的近似分布$q(\\RVh\\mid\\RVv)$来逼近真实分布$p(\\RVh\\mid\\Vv)$。\n这个技术将在\\chap?中深入讨论。\n<!-- % 574 end -->\n\n\n\n\n# 结构化概率模型的深度学习方法\n\n<!-- % 575 head    16.7   -->\n\n<!-- %深度学习实践者通常使用与从事结构化概率模型研究的其它机器学习研究者相同的基本计算工具。 -->\n深度学习从业者通常与其他从事结构化概率模型研究的机器学习研究者使用相同的基本计算工具。\n然而，在深度学习中，我们通常对如何组合这些工具作出不同的设计决定，导致总体算法、模型与更传统的图模型具有非常不同的风格。\n<!-- % 575 head -->\n\n\n深度学习并不总是涉及特别深的图模型。\n在图模型中，我们可以根据图模型的图而不是计算图来定义模型的深度。\n如果从潜变量 $h_i$到可观察变量的最短路径是$j$步，我们可以认为潜变量 $h_j$处于深度$j$。\n我们通常将模型的深度描述为任何这样的$h_j$的最大深度。 \n这种深度不同于由计算图定义的深度。\n用于深度学习的许多生成模型没有潜变量或只有一层潜变量，但使用深度计算图来定义模型中的条件分布。\n<!-- % 575 -->\n\n\n深度学习基本上总是利用分布式表示的思想。\n即使是用于深度学习目的的浅层模型（例如预训练浅层模型，稍后将形成深层模型），也几乎总是具有单个大的潜变量层。\n深度学习模型通常具有比可观察变量更多的潜变量。\n变量之间复杂的非线性相互作用通过多个潜变量的间接连接来实现。\n<!-- % 575  ok -->\n\n\n相比之下，传统的图模型通常包含至少是偶尔观察到的变量，即使一些训练样本中的许多变量随机地丢失。\n传统模型大多使用高阶项和结构学习来捕获变量之间复杂的非线性相互作用。\n如果有潜变量，它们的数量通常很少。\n<!-- % 575 -->\n\n\n\n潜变量的设计方式在深度学习中也有所不同。\n深度学习从业者通常不希望潜变量提前包含了任何特定的含义——训练算法可以自由地开发对特定数据集建模所需要的概念。\n在事后解释潜变量通常是很困难的，但是可视化技术可以得到它们表示的一些粗略表征。\n当潜变量在传统图模型中使用时，它们通常被赋予一些特定含义——比如文档的主题、学生的智力、导致患者症状的疾病等。\n这些模型通常由研究者解释，并且通常具有更多的理论保证，但是不能扩展到复杂的问题，并且不能像深度模型一样在许多不同背景中重复使用。\n<!-- % 576  head -->\n\n\n另一个明显的区别是深度学习方法中经常使用的连接类型。\n深度图模型通常具有大的与其他单元组全连接的单元组，使得两个组之间的相互作用可以由单个矩阵描述。\n传统的图模型具有非常少的连接，并且每个变量的连接选择可以单独设计。\n模型结构的设计与推断算法的选择紧密相关。\n图模型的传统方法通常旨在保持精确推断的可解性。\n当这个约束太强时，我们可以采用一种流行的被称为环状信念传播的近似推断算法。\n这两种方法通常在稀疏连接图上都有很好的效果。\n相比之下，在深度学习中使用的模型倾向于将每个可见单元$\\RSv_i$连接到非常多的隐藏单元 $\\RSh_j$上，从而使得$\\RVh$可以获得一个$\\RSv_i$的分布式表示（也可能是其他几个可观察变量）。\n分布式表示具有许多优点，但是从图模型和计算复杂性的观点来看，\n分布式表示有一个缺点就是很难产生对于精确推断和环状信念传播等传统技术来说足够稀疏的图。\n结果，大规模图模型和深度图模型最大的区别之一就是深度学习中几乎从来不会使用环状信念传播。\n相反的，许多深度学习模型可以设计来加速~Gibbs采样或者变分推断。\n此外，深度学习模型包含了大量的潜变量，使得高效的数值计算代码显得格外重要。\n除了选择高级推断算法之外，这提供了另外的动机，用于将结点分组成层，相邻两层之间用一个矩阵来描述相互作用。\n这要求实现算法的单个步骤可以实现高效的矩阵乘积运算，或者专门适用于稀疏连接的操作，例如块对角矩阵乘积或卷积。\n<!-- % 576 -->\n\n\n\n最后，图模型的深度学习方法的一个主要特征在于对未知量的较高容忍度。\n与简化模型直到它的每一个量都可以被精确计算不同的是，我们仅仅直接使用数据运行或者是训练，以增强模型的能力。%让模型保持了较高的自由度\n我们一般使用边缘分布不能计算的模型，但可以从中简单地采近似样本。%但是可以简单从中采样的模型。\n我们经常训练具有难以处理的目标函数的模型，我们甚至不能在合理的时间内近似，但是如果我们能够高效地获得这样一个函数的梯度估计，我们仍然能够近似训练模型。\n深度学习方法通常是找出我们绝对需要的最小量信息，然后找出如何尽快得到该信息的合理近似。\n<!-- % 577 head -->\n\n\n\n\n## 实例：受限玻尔兹曼机\n\n受限玻尔兹曼机{cite?}或者簧风琴是图模型如何用于深度学习的典型例子。 \nRBM~本身不是一个深层模型。 \n相反，它有一层潜变量，可用于学习输入的表示。 \n在\\chap?中，我们将看到~RBM~如何被用来构建许多的深层模型。\n在这里，我们举例展示了~RBM~在许多深度图模型中使用的实践：\n它的单元被分成很大的组，这种组称作层，层之间的连接由矩阵描述，连通性相对密集。\n该模型被设计为能够进行高效的~Gibbs采样，并且模型设计的重点在于以很高的自由度来学习潜变量，而潜变量的含义并不是设计者指定的。\n之后在\\sec?，我们将更详细地再次讨论~RBM。\n<!-- % 577 -->\n\n\n标准的~RBM~是具有二值的可见和隐藏单元的基于能量的模型。 其能量函数为\n\\begin{align}\nE(\\Vv,\\Vh) = -\\Vb^{\\top}\\Vv - \\Vc^{\\top}\\Vh - \\Vv^{\\top}\\MW\\Vh,\n\\end{align}\n其中$\\Vb,\\Vc$和$\\MW$都是无约束、实值的可学习参数。\n我们可以看到，模型被分成两组单元：$\\Vv$和$\\Vh$，\n它们之间的相互作用由矩阵$\\MW$来描述。\n该模型在\\fig?中以图的形式描绘。\n<!-- %可以看到。 -->\n该图能够使我们更清楚地发现，该模型的一个重要方面是在任何两个可见单元之间或任何两个隐藏单元之间没有直接的相互作用（因此称为\"受限\"，一般的玻尔兹曼机可以具有任意连接）。\n<!-- % 577 -->\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter16/figures/rbm}}\t\n\\fi\n\t\\caption{一个画成马尔可夫网络形式的RBM。}\n\\end{figure}\n\n\n\n对~RBM~结构的限制产生了良好的属性\n\\begin{align}\np(\\RVh\\mid\\RVv) = \\prod_i p(\\RSh_i\\mid \\RVv)\n\\end{align}\n以及\n\\begin{align}\np(\\RVv\\mid\\RVh) = \\prod_i p(\\RSv_i\\mid \\RVh).\n\\end{align}\n<!-- % 578 head -->\n独立的条件分布很容易计算。\n对于二元的受限玻尔兹曼机，我们可以得到：\n\\begin{align}\np(\\RSh_i = 1\\mid\\RVv) &= \\sigma\\big(\\RVv^{\\top}\\MW_{:,i} + b_i\\big),\\\\\np(\\RSh_i = 0\\mid\\RVv) &= 1 - \\sigma\\big(\\RVv^{\\top}\\MW_{:,i} + b_i\\big).\n\\end{align}\n结合这些属性可以得到高效的块吉布斯采样，它在同时采样所有$\\Vh$和同时采样所有$\\Vv$之间交替。\nRBM~模型通过~Gibbs采样产生的样本展示在\\fig?中。\n<!-- % 578  -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics[width=0.9\\textwidth]{Chapter16/figures/rbm_samples}}\t\n\\fi\n\\caption{训练好的~RBM~的样本及其权重。\n\\emph{(左)}用MNIST训练模型，然后用~Gibbs采样进行采样。\n每一列是一个单独的~Gibbs采样过程。\n每一行表示另一个$1000$步后~Gibbs采样的输出。\n连续的样本之间彼此高度相关。\n\\emph{(右)}对应的权重向量。\n将本图结果与图\\?中描述的线性因子模型的样本和权重相比。\n由于~RBM~的先验$p(\\Vh)$没有限制为因子，这里的样本表现得好很多。\n采样时~RBM~能够学习到哪些特征需要一起出现。\n另一方面说，RBM~后验$p(\\Vh \\mid \\Vv)$是因子的，而稀疏编码的后验并不是，所以在特征提取上稀疏编码模型表现得更好。\n其他的模型可以使用非因子的$p(\\Vh)$和非因子的$p(\\Vh \\mid \\Vh)$。\n图片经~{lisa_tutorial_rbm}允许转载。}\n\\end{figure}\n\n\n由于能量函数本身只是参数的线性函数，很容易获取能量函数的导数。 例如，\n\\begin{align}\n\\frac{\\partial}{\\partial W_{i,j}} E(\\RVv,\\RVh) = - \\RSv_i \\RSh_j.\n\\end{align}\n\n\n<!-- % 579 head -->\n这两个属性，高效的~Gibbs采样和导数计算，使训练过程变得非常方便。\n在\\chap?中，我们将看到，可以通过计算应用于这种来自模型样本的导数来训练无向模型。\n<!-- % 579 -->\n\n训练模型可以得到数据$\\Vv$的表示$\\Vh$。\n我们经常使用$\\SetE_{\\RVh\\sim p(\\RVh\\mid\\Vv)}[\\Vh]$ 作为一组描述$\\Vv$的特征。\n<!-- % 579 -->\n\n\n\n总的来说，RBM~展示了典型的图模型深度学习方法：\n<!-- %结合由矩阵参数化的层之间的高效相互作用通过多层潜变量完成表示学习。 -->\n使用多层潜变量，并由矩阵参数化层之间的高效相互作用来完成表示学习。\n<!-- % 579 -->\n\n\n图模型为描述概率模型提供了一种优雅、灵活、清晰的语言。 \n在未来的章节中，我们将使用这种语言，以其他视角来描述各种各样的深度概率模型。\n<!-- % 579 -->\n\n\n\n\n\n"
  },
  {
    "path": "docs/_posts/2016-12-17-Chapter17_monte_carlo_methods.md",
    "content": "---\ntitle: 蒙特卡罗方法\nlayout: post\nshare: false\n---\n<!-- % 581 -->\n\n随机算法可以粗略地分为两类：Las Vegas\\,算法和蒙特卡罗算法。\nLas Vegas\\,算法总是精确地返回一个正确答案 （或者返回算法失败了）。   \n这类方法通常需要占用随机量的计算资源（一般指内存或运行时间）。    \n与此相对的，蒙特卡罗方法返回的答案具有随机大小的错误。 \n花费更多的计算资源（通常包括内存和运行时间）可以减少这种错误。\n在任意固定的计算资源下， 蒙特卡罗算法可以得到一个近似解。\n\n对于机器学习中的许多问题来说，我们很难得到精确的答案。\n这类问题很难用精确的确定性算法如\\,Las Vegas\\,算法解决。\n取而代之的是确定性的近似算法或蒙特卡罗近似方法。\n这两种方法在机器学习中都非常普遍。\n本章主要关注蒙特卡罗方法。\n<!-- % 581 -->\n\n\n# 采样和蒙特卡罗方法\n\n\n机器学习中的许多重要工具都基于从某种分布中采样以及用这些样本对目标量做一个蒙特卡罗估计。\n\n\n## 为什么需要采样？\n\n\n有许多原因使我们希望从某个分布中采样。  \n当我们需要以较小的代价近似许多项的和或某个积分时，采样是一种很灵活的选择。  \n有时候，我们使用它加速一些很费时却易于处理的求和估计，就像我们使用小批量对整个训练代价进行子采样一样。 \n在其他情况下，我们需要近似一个难以处理的求和或积分，例如估计一个无向模型中配分函数对数的梯度时。 \n在许多其他情况下，抽样实际上是我们的目标，例如我们想训练一个可以从训练分布采样的模型。  \n<!-- % 582  -->\n\n\n## 蒙特卡罗采样的基础\n\n\n当无法精确计算和或积分（例如，和具有指数数量个项，且无法被精确简化）时，通常可以使用蒙特卡罗采样来近似它。\n这种想法把和或者积分视作某分布下的期望，然后\\emph{通过估计对应的平均值来近似这个期望}。\n令\n\\begin{align}\ns = \\sum_{\\Vx} p(\\Vx)f(\\Vx) = E_p[f(\\RVx)]\n\\end{align}\n或者\n\\begin{align}\ns = \\int p(\\Vx)f(\\Vx)d\\Vx = E_p[f(\\RVx)]\n\\end{align}\n为我们所需要估计的和或者积分，写成期望的形式，$p$是一个关于随机变量$\\RVx$的概率分布（求和时）或者概率密度函数（求积分时）。\n<!-- % 582  -->\n\n我们可以通过从$p$中抽取$n$个样本$\\Vx^{(1)},\\ldots,\\Vx^{(n)}$来近似$s$并得到一个经验平均值   \n\\begin{align}\t\n\\hat{s}_n = \\frac{1}{n}\\sum_{i=1}^{n}f(\\Vx^{(i)}).\n\\end{align}\n下面几个性质表明了这种近似的合理性。\n首先很容易观察到$\\hat{s}$这个估计是无偏的，由于\n\\begin{align}\n\\SetE[\\hat{s}_n] = \\frac{1}{n}\\sum_{i=1}^{n}\\SetE[f(\\Vx^{(i)})] = \\frac{1}{n}\\sum_{i=1}^{n}s = s.\n\\end{align}\n<!-- % 582 -->\n此外，根据大数定理，如果样本$\\Vx^{(i)}$是独立同分布的，那么其平均值几乎必然收敛到期望值，即\n\\begin{align}\n\\lim_{n\\xrightarrow{}\\infty} \\hat{s}_n = s,\n\\end{align}\n只需要满足各个单项的方差$\\text{Var}[f(\\Vx^{(i)})]$有界。 \n详细地说，我们考虑当$n$增大时$\\hat{s}_n$的方差。\n只要满足$\\text{Var}[f(\\RVx^{(i)})]<\\infty$，方差$\\text{Var}[\\hat{s}_n]$就会减小并收敛到$0$：\n\\begin{align}\n\\text{Var}[\\hat{s}_n] & = \\frac{1}{n^2}\\sum_{i=1}^{n}\\text{Var}[f(\\RVx)]\\\\\n&  = \\frac{\\text{Var}[f(\\RVx)]}{n}.\n\\end{align}\n这个简单有用的结果启迪我们如何估计蒙特卡罗均值中的不确定性，或者等价地说是蒙特卡罗估计的期望误差。 \n我们计算了$f(\\Vx^{(i)})$的经验均值和方差\\footnote{通常我们会倾向于计算方差的无偏估计，它由偏差的平方和除以$n-1$而非$n$得到。}， \n然后将估计的方差除以样本数$n$来得到$\\text{Var}[\\hat{s}_n]$的估计。\n中心极限定理告诉我们$\\hat{s}_n$的分布收敛到以$s$为均值以$\\frac{\\text{Var}[f(\\RVx)]}{n}$为方差的正态分布。\n这使得我们可以利用正态分布的累积函数来估计$\\hat{s}_n$的置信区间。\n<!-- % 583 -->\n\n\n以上的所有结论都依赖于我们可以从基准分布$p(\\RVx)$中轻易地采样，但是这个假设并不是一直成立的。\n当我们无法从$p$中采样时，一个备选方案是用\\sec?讲到的重要采样。 \n一种更加通用的方式是构建一个收敛到目标分布的估计序列。 \n这就是马尔可夫链蒙特卡罗方法（见\\sec?）。\n<!-- % 583 -->\n\n\n# 重要采样\n\n\n如方程~\\eq?所示，在蒙特卡罗方法中，对积分（或者和）分解，确定积分中哪一部分作为概率分布$p(\\Vx)$以及哪一部分作为被积的函数$f(\\Vx)$（我们感兴趣的是估计$f(\\Vx)$在概率分布$p(\\Vx)$下的期望）是很关键的一步。  \n$p(\\Vx)f(\\Vx)$不存在唯一的分解，因为它总是可以被写成   \n\\begin{align}\np(\\Vx)f(\\Vx) = q(\\Vx) \\frac{p(\\Vx)f(\\Vx)}{q(\\Vx)},\n\\end{align}\n在这里，我们从$q$分布中采样，然后估计$\\frac{pf}{q}$在此分布下的均值。\n许多情况中，我们希望在给定$p$和$f$的情况下计算某个期望，这个问题既然是求期望，那么很自然地$p$和$f$是一种分解选择。 \n然而，如果考虑达到某给定精度所需要的样本数量，这个问题最初的分解选择不是最优的选择。\n幸运的是，最优的选择$q^*$可以被简单地推导出来。   \n这种最优的采样函数$q^*$对应所谓的最优重要采样。 \n<!-- % 584 -->\n\n\n从\\eqn?所示的关系中可以发现，任意蒙特卡罗估计   \n\\begin{align}\n\\hat{s}_p = \\frac{1}{n}\\sum_{i=1,\\Vx^{(i)}\\sim p}^{n}f(\\Vx^{(i)})\n\\end{align}\n可以被转化为一个重要采样的估计\n\\begin{align}\n\\hat{s}_q = \\frac{1}{n}\\sum_{i=1,\\Vx^{(i)}\\sim q}^{n}\\frac{p(\\Vx^{(i)})f(\\Vx^{(i)})}{q(\\Vx^{(i)})}.\n\\end{align}\n我们可以容易地发现估计的期望与$q$分布无关：   \n\\begin{align}\n\\SetE_q [\\hat{s}_q] = \\SetE_p [\\hat{s}_p] = s.      \n\\end{align}\n然而，重要采样的方差可能对$q$的选择非常敏感。 \n这个方差可以表示为\n\\begin{align}\n\\Var [\\hat{s}_q] = \\Var \\left[\\frac{p(\\RVx)f(\\RVx)}{q(\\RVx)}\\right]/n.\n\\end{align}\n方差想要取到最小值，$q$需要满足\n\\begin{align}\nq^*(\\Vx) = \\frac{p(\\Vx)\\vert f(\\Vx)\\vert}{Z},\n\\end{align}\n<!-- % 584 -->\n在这里$Z$表示归一化常数，选择适当的$Z$使得$q^*(\\Vx)$之和或者积分为$1$。\n一个更好的重要采样分布会把更多的权重放在被积函数较大的地方。 \n事实上，当$f(\\Vx)$的正负符号不变时，$\\Var[\\hat{s}_{q^*}]=0$， 这意味着当使用最优的$q$分布时，\\emph{只需要一个样本就足够了}。\n当然，这仅仅是因为计算$q^*$时已经解决了原问题。   \n所以在实践中这种只需要采样一个样本的方法往往是无法实现的。 \n<!-- % 584 -->\n\n\n对于重要采样来说任意$q$分布都是可行的（从得到一个期望上正确的值的角度来说），$q^*$指的是最优的$q$分布（从得到最小方差的角度上考虑）。\n从$q^*$中采样往往是不可行的，但是其他仍然能降低方差的$q$的选择还是可行的。 \n<!-- % 584  end -->\n\n\n另一种方法是采用有偏重要采样，这种方法有一个优势，即不需要归一化的$p$或$q$分布。\n在处理离散变量时，有偏重要采样估计可以表示为\n\\begin{align}\n\\hat{s}_{\\text{BIS}} & = \\frac{\\sum_{i=1}^{n} \\frac{p(\\Vx^{(i)})}{q(\\Vx^{(i)})} f(\\Vx^{(i)})}{\\sum_{i=1}^{n}\\frac{p(\\Vx^{(i)})}{q(\\Vx^{(i)})}} \\\\\n& = \\frac{\\sum_{i=1}^{n} \\frac{p(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})} f(\\Vx^{(i)})}{\\sum_{i=1}^{n}\\frac{p(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})}} \\\\\n& = \\frac{\\sum_{i=1}^{n} \\frac{\\tilde{p}(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})} f(\\Vx^{(i)})}{\\sum_{i=1}^{n}\\frac{\\tilde{p}(\\Vx^{(i)})}{\\tilde{q}(\\Vx^{(i)})}},\n\\end{align}\n其中$\\tilde{p}$和$\\tilde{q}$分别是分布${p}$和${q}$的未经归一化的形式，$\\Vx^{(i)}$是从分布${q}$中抽取的样本。\n这种估计是有偏的，因为$\\SetE[\\hat{s}_{\\text{BIS}}]\\neq s$，只有当$n \\to \\infty$且方程~\\eqn?的分母收敛到$1$时，等式才渐近地成立。\n所以这一估计也被称为渐近无偏的。   \n<!-- % 585 -->\n\n\n一个好的$q$分布的选择可以显著地提高蒙特卡罗估计的效率，而一个糟糕的$q$分布选择则会使效率更糟糕。\n我们回过头来看看方程~\\eqn?会发现，如果存在一个$q$使得$\\frac{p(\\Vx)f(\\Vx)}{q(\\Vx)}$很大，那么这个估计的方差也会很大。\n当$q(\\Vx)$很小，而$f(\\Vx)$和$p(\\Vx)$都较大并且无法抵消$q$时，这种情况会非常明显。\n$q$分布经常会取一些简单常用的分布使得我们能够从$q$分布中容易地采样。\n当$\\Vx$是高维数据时，$q$分布的简单性使得它很难与$p$或者$p\\vert f\\vert$相匹配。   \n当$q(\\Vx^{(i)})\\gg p(\\Vx^{(i)}) \\vert f(\\Vx^{(i)})\\vert $时，重要采样采到了很多无用的样本（很小的数或零相加）。\n另一种相对少见的情况是$q(\\Vx^{(i)})\\ll p(\\Vx^{(i)}) \\vert f(\\Vx^{(i)})\\vert $，相应的比值会非常大。\n正因为后一个事件是很少发生的，这种样本很难被采到，通常使得对$s$的估计出现了典型的欠估计，很难被整体的过估计抵消。\n这样的不均匀情况在高维数据屡见不鲜，因为在高维度分布中联合分布的动态域可能非常大。\n<!-- % 585 end -->\n\n\n<!-- % 585 end -->\n尽管存在上述的风险，但是重要采样及其变种在机器学习的应用中仍然扮演着重要的角色，包括深度学习算法。\n例如，重要采样被应用于加速训练具有大规模词表的神经网络语言模型的过程中（见\\sec?）或者其他有着大量输出结点的神经网络中。   \n此外，还可以看到重要采样应用于估计配分函数（一个概率分布的归一化常数），详见\\sec?，以及在深度有向图模型比如变分自编码器中估计对数似然（详见\\sec?）。\n采用随机梯度下降训练模型参数时重要采样可以用来改进对代价函数梯度的估计，尤其是分类器这样的模型，其中代价函数的大部分代价来自于少量错误分类的样本。    \n在这种情况下，更加频繁地抽取这些困难的样本可以减小梯度估计的方差~{cite?}。 \n<!-- % 586  -->\n\n\n\n# 马尔可夫链蒙特卡罗方法\n\n\n在许多实例中，我们希望采用蒙特卡罗方法，然而往往又不存在一种简单的方法可以直接从目标分布$p_{\\text{model}}(\\RVx)$中精确采样或者一个好的（方差较小的）重要采样分布$q(\\Vx)$。 \n在深度学习中，当分布$p_{\\text{model}}(\\RVx)$表示成无向模型时，这种情况往往会发生。\n在这种情况下，为了从分布$p_{\\text{model}}(\\RVx)$中近似采样，我们引入了一种称为马尔可夫链的数学工具。\n利用马尔可夫链来进行蒙特卡罗估计的这一类算法被称为马尔可夫链蒙特卡罗方法。\n{koller-book2009}花了大量篇幅来描述马尔可夫链蒙特卡罗算法在机器学习中的应用。\nMCMC~技术最标准、最一般的理论保证只适用于那些各状态概率均不为零的模型。\n因此，这些技术最方便的使用方法是用于从基于能量的模型即$p(\\Vx)\\propto \\exp(-E(\\Vx))$中采样，见\\sec?。\n在~EBM~的公式表述中，每一个状态所对应的概率都不为零。\n事实上，MCMC~方法可以被广泛地应用在包含$0$概率状态的许多概率分布中。\n然而，在这种情况下，关于~MCMC~方法性能的理论保证只能依据具体不同类型的分布具体分析证明。\n在深度学习中，我们通常依赖于那些一般的理论保证，其在所有基于能量的模型都能自然成立。\n\n<!-- % 586 end -->\n\n\n为了解释从基于能量的模型中采样困难的原因，我们考虑一个包含两个变量的~EBM~的例子，记$p(\\RSa,\\RSb)$为其分布。  \n为了采$\\RSa$，我们必须先从$p(\\RSa\\mid \\RSb)$中采样；为了采$\\RSb$，我们又必须从$p(\\RSb\\mid \\RSa)$中采样。   \n这似乎成了棘手的先有鸡还是先有蛋的问题。\n有向模型避免了这一问题因为它的图是有向无环的。\n为了完成原始采样，在给定每个变量的所有父结点的条件下，我们根据拓扑顺序采样每一个变量，这个变量是确定能够被采样的（详见\\sec?）。   \n原始采样定义了一种高效的、单遍的方法来抽取一个样本。   \n<!-- % 587 begin -->\n\n\n在~EBM~中，我们通过使用马尔可夫链来采样，从而避免了先有鸡还是先有蛋的问题。  \n马尔可夫链的核心思想是从某个可取任意值的状态$\\Vx$出发。\n随着时间的推移，我们随机地反复更新状态$\\Vx$。  \n最终$\\Vx$成为了一个从$p(\\Vx)$中抽出的（非常接近）比较一般的样本。  %?? 建议 比较公正 换成 标准\n在正式的定义中，马尔可夫链由一个随机状态$x$和一个转移分布$T(\\Vx'\\mid \\Vx)$定义而成，$T(\\Vx'\\mid \\Vx)$是一个概率分布，说明了给定状态$\\Vx$的情况下随机地转移到$\\Vx'$的概率。\n运行一个马尔可夫链意味着根据转移分布$T(\\RVx' \\mid \\Vx)$采出的值$\\Vx'$来更新状态$\\Vx$。  \n<!-- % 587  mid -->\n\n\n为了给出~MCMC~方法为何有效的一些理论解释，重参数化这个问题是很有用的。 \n首先我们关注一些简单的情况，其中随机变量$\\RVx$有可数个状态。\n我们将这种状态简单地记作正整数$x$。\n不同的整数$x$的大小对应着原始问题中$\\Vx$的不同状态。\n<!-- % 587   mid -->\n\n\n接下来我们考虑如果并行地运行无穷多个马尔可夫链的情况。  \n不同马尔可夫链的所有状态都采样自某一个分布$q^{(t)}(x)$，在这里$t$表示消耗的时间数。\n开始时，对每个马尔可夫链，我们采用一个分布$q^{{0}}$来任意地初始化$x$。  \n之后，$q^{(t)}$与所有之前运行的马尔可夫链有关。\n我们的目标是$q^{(t)}(x)$收敛到$p(x)$。 \n<!-- % 587 mid  -->\n\n\n因为我们已经用正整数$x$重参数化了这个问题，我们可以用一个向量$\\Vv$来描述这个概率分布$q$，  \n\\begin{align}\nq(\\RSx = i) = v_i.\n\\end{align}\n<!-- % 587 -->\n\n\n然后我们考虑更新单一的马尔可夫链，从状态$x$到新状态$x'$。\n单一状态转移到$x'$的概率可以表示为\n\\begin{align}\nq^{(t+1)}(x') = \\sum_{x} q^{(t)}(x) T(x'\\mid x).\n\\end{align}\n<!-- % 587 end -->\n\n\n根据状态为整数的参数化设定，我们可以将转移算子$T$表示成一个矩阵$\\MA$。\n矩阵$\\MA$的定义如下：\n\\begin{align}\n\\MA_{i,j} = T(\\RVx' = i\\mid \\RVx = j).\n\\end{align}\n使用这一定义，我们可以改写\\eqn?。\n不同于之前使用$q$和$T$来理解单个状态的更新，我们现在可以使用$\\Vv$和$\\MA$来描述当我们更新时（并行运行的）不同马尔可夫链上整个分布是如何变化的： \n\\begin{align}\n\\Vv^{(t)} = \\MA \\Vv^{(t-1)}.\n\\end{align}\n<!-- % 588   head -->\n重复地使用马尔可夫链更新相当于重复地与矩阵$\\MA$相乘。  \n换言之，我们可以认为这一过程就是关于$\\MA$的幂乘：  \n\\begin{align}\n\\Vv^{(t)} = \\MA^{t} \\Vv^{(0)}.\n\\end{align}\n<!-- % 588 -->\n\n\n矩阵$\\MA$有一种特殊的结构，因为它的每一列都代表一个概率分布。\n这样的矩阵被称为随机矩阵。\n如果对于任意状态$x$到任意其他状态$x'$存在一个$t$使得转移概率不为$0$，那么Perron-Frobenius定理~{cite?}可以保证这个矩阵的最大特征值是实数且大小为$1$。\n我们可以看到所有的特征值随着时间呈现指数变化： \n\\begin{align}\n\\Vv^{(t)} = (\\MV \\text{diag}(\\Vlambda)\\MV^{-1})^{t} \\Vv^{(0)} = \\MV \\text{diag}(\\Vlambda)^t \\MV^{-1} \\Vv^{(0)}.\n\\end{align}\n这个过程导致了所有不等于$1$的特征值都衰减到$0$。  \n在一些额外的较为宽松的假设下，我们可以保证矩阵$\\MA$只有一个对应特征值为$1$的特征向量。  \n所以这个过程收敛到平稳分布，有时也被称为均衡分布。 \n收敛时，我们得到 \n\\begin{align}\n\\Vv ' = \\MA \\Vv = \\Vv,\n\\end{align}\n这个条件也适用于收敛之后的每一步。\n这就是特征向量方程。\n作为收敛的稳定点，$\\Vv$一定是特征值为$1$所对应的特征向量。 \n这个条件保证收敛到了平稳分布以后，再重复转移采样过程不会改变所有不同马尔可夫链上状态的\\emph{分布}（尽管转移算子自然而然地会改变每个单独的状态）。  \n<!-- % 588 -->\n\n\n如果我们正确地选择了转移算子$T$，那么最终的平稳分布$q$将会等于我们所希望采样的分布$p$。  \n我们会将\\sec?介绍如何选择$T$。 \n<!-- % 588 -->\n\n\n可数状态马尔可夫链的大多数性质可以被推广到连续状态的马尔可夫链中。 \n在这种情况下，一些研究者把这种马尔可夫链称为哈里斯链，但是我们将这两种情况都称为马尔可夫链。\n通常在一些宽松的条件下，一个带有转移算子$T$的马尔可夫链都会收敛到一个不动点，这个不动点可以写成如下形式：\n\\begin{align}\nq' (\\RVx') = \\SetE_{\\RVx\\sim q}T(\\RVx'\\mid \\RVx),\n\\end{align}\n这个方程的离散版本就相当于重新改写方程~\\eqn?。\n当$\\RVx$是离散值时，这个期望对应着求和，而当$\\RVx$是连续值时，这个期望对应的是积分。 \n<!-- % 589 head -->\n\n\n无论状态是连续的还是离散的，所有的马尔可夫链方法都包括了重复、随机地更新直到最后状态开始从均衡分布中采样。 \n运行马尔可夫链直到它达到均衡分布的过程通常被称为马尔可夫链的磨合过程。\n在马尔可夫链达到均衡分布之后，我们可以从均衡分布中抽取一个无限多数量的样本序列。 \n这些样本服从同一分布，但是两个连续的样本之间会高度相关。 \n所以一个有限的序列无法完全表达均衡分布。\n一种解决这个问题的方法是每隔$n$个样本返回一个样本，从而使得我们对于均衡分布的统计量的估计不会被\\,MCMC\\,方法的样本之间的相关性所干扰。\n所以马尔可夫链的计算代价很高，主要源于达到均衡分布前需要磨合的时间以及在达到均衡分布之后从一个样本转移到另一个足够无关的样本所需要的时间。\n如果我们想要得到完全独立的样本，那么我们可以同时并行地运行多个马尔可夫链。  \n这种方法使用了额外的并行计算来减少时延。 \n使用一条马尔可夫链来生成所有样本的策略和（使用多条马尔可夫链）每条马尔可夫链只产生一个样本的策略是两种极端。\n深度学习的从业者们通常选取的马尔可夫链的数目和小批量中的样本数相近，然后从这些固定的马尔可夫链集合中抽取所需要的样本。 \n马尔可夫链的数目通常选为$100$。\n<!-- % 589 -->\n\n另一个难点是我们无法预先知道马尔可夫链需要运行多少步才能到达均衡分布。 \n这段时间通常被称为混合时间。\n检测一个马尔可夫链是否达到平衡是很困难的。\n我们并没有足够完善的理论来解决这个问题。\n理论只能保证马尔可夫链会最终收敛，但是无法保证其他。\n如果我们从矩阵$\\MA$作用在概率向量$\\Vv$上的角度来分析马尔可夫链，那么我们可以发现当$\\MA^t$除了单个$1$以外的特征值都趋于$0$时，马尔可夫链混合成功（收敛到了均衡分布）。\n这也意味着矩阵$\\MA$的第二大特征值决定了马尔可夫链的混合时间。\n然而，在实践中，我们通常不能真的将马尔可夫链表示成矩阵的形式。 \n我们的概率模型所能够达到的状态是变量数的指数级别，所以表达$\\Vv$，$\\MA$或者$\\MA$的特征值是不现实的。 \n由于以上在内的诸多阻碍，我们通常无法知道马尔可夫链是否已经混合成功。\n作为替代，我们只能运行一定量时间马尔可夫链直到我们粗略估计这段时间是足够的，然后使用启发式的方法来判断马尔可夫链是否混合成功。\n这些启发性的算法包括了手动检查样本或者衡量前后样本之间的相关性。\n<!-- % 590 head -->\n\n\n\n\n# Gibbs采样\n\n\n目前为止我们已经了解了如何通过反复更新$\\Vx \\xleftarrow{} \\Vx'\\sim T(\\Vx'\\mid\\Vx)$从一个分布$q(\\Vx)$中采样。 \n然而我们还没有介绍过如何确定$q(\\Vx)$是否是一个有效的分布。\n本书中将会描述两种基本的方法。  \n第一种方法是从已经学习到的分布$p_{\\text{model}}$中推导出$T$，下文描述了如何从基于能量的模型中采样。\n第二种方法是直接用参数描述$T$，然后学习这些参数，其平稳分布隐式地定义了我们所感兴趣的模型$p_{\\text{model}}$。\n我们将在\\sec?和\\sec?中讨论第二种方法的例子。  \n<!-- % 590  mid -->\n\n\n在深度学习中，我们通常使用马尔可夫链从定义为基于能量的模型的分布$p_{\\text{model}}(\\Vx)$中采样。\n在这种情况下，我们希望马尔可夫链的$q(\\Vx)$分布就是$p_{\\text{model}}(\\Vx)$。\n为了得到所期望的$q(\\Vx)$分布，我们必须选取合适的$T(\\Vx'\\mid \\Vx)$。\n<!-- % 590 -->\n\n\nGibbs采样是一种概念简单而又有效的方法。\n它构造一个从$p_{\\text{model}}(\\Vx)$中采样的马尔可夫链，其中在基于能量的模型中从$T(\\RVx'\\mid \\RVx)$采样是通过选择一个变量$\\RSx_i$，然后从$p_{\\text{model}}$中该点关于在无向图$\\CalG$（定义了基于能量的模型结构）中邻接点的条件分布中采样。\n只要一些变量在给定相邻变量时是条件独立的，那么这些变量就可以被同时采样。\n正如在\\sec?中看到的~RBM~示例一样，RBM~中所有的隐藏单元可以被同时采样，因为在给定所有可见单元的条件下它们相互条件独立。\n同样地，所有的可见单元也可以被同时采样，因为在给定所有隐藏单元的情况下它们相互条件独立。 \n以这种方式同时更新许多变量的\\,Gibbs采样通常被称为块吉布斯采样。   \n<!-- % 590 mid -->\n\n设计从$p_{\\text{model}}$中采样的马尔可夫链还存在其他备选方法。  \n比如说，Metropolis-Hastings算法在其他领域中广泛使用。\n不过在深度学习的无向模型中，我们主要使用\\,Gibbs采样，很少使用其他方法。 \n改进采样技巧也是一个潜在的研究热点。\n<!-- % 590 end -->\n\n\n\n# 不同的峰值之间的混合挑战\n\n<!-- % 591  head  -->\n\n使用\\,MCMC\\,方法的主要难点在于马尔可夫链的混合通常不理想。\n在理想情况下，从设计好的马尔可夫链中采出的连续样本之间是完全独立的，而且在$\\Vx$空间中，马尔可夫链会按概率大小访问许多不同区域。\n\n然而，\\,MCMC\\,方法采出的样本可能会具有很强的相关性，尤其是在高维的情况下。\n我们把这种现象称为慢混合甚至混合失败。\n具有缓慢混合的\\,MCMC\\,方法可以被视为对能量函数无意地执行类似于带噪声的梯度下降的操作，或者说等价于相对于链的状态（被采样的随机变量）依据概率进行噪声爬坡。\n（在马尔可夫链的状态空间中）从$\\Vx^{(t-1)}$到$\\Vx^{(t)}$该链倾向于选取很小的步长，其中能量$E(\\Vx^{(t)})$通常低于或者近似等于能量$E(\\Vx^{(t-1)})$，\n倾向于向较低能量的区域移动。\n当从可能性较小的状态（比来自$p(\\Vx)$的典型样本拥有更高的能量）开始时，链趋向于逐渐减少状态的能量，并且仅仅偶尔移动到另一个峰值。 \n一旦该链已经找到低能量的区域（例如，如果变量是图像中的像素，则低能量的区域可以是同一对象所对应图像的一个连通的流形），我们称之为峰值，链将倾向于围绕着这个峰值游走（按某一种形式随机游走）。\n它时不时会走出该峰值，但是结果通常会返回该峰值或者（如果找到一条离开的路线）移向另一个峰值。\n问题是对于很多有趣的分布来说成功的离开路线很少，所以马尔可夫链将在一个峰值附近抽取远超过需求的样本。\n<!-- % 591  -->\n\n\n当我们考虑~Gibbs采样算法（见\\sec?）时，这种现象格外明显。\n在这种情况下，我们考虑在一定步数内从一个峰值移动到一个临近峰值的概率。\n决定这个概率的是两个峰值之间的\"能量障碍\"的形状。\n隔着一个巨大\"能量障碍\" （低概率的区域）的两个峰值之间的转移概率是（随着能量障碍的高度）指数下降的，如\\fig?所示。\n当目标分布有多个高概率峰值并且被低概率区域所分割，尤其当\\,Gibbs采样的每一步都只是更新变量的一小部分而这一小部分变量又严重依赖其他的变量时，就会产生问题。 \n<!-- % 591 -->\n\n\n<!-- % 592 head  -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter17/figures/good_bad_really_bad_mixing_color}}\n\\fi\n\\caption{对于三种分布使用~Gibbs采样所产生的路径，所有的分布马尔可夫链初始值都设为峰值。\n\\emph{(左)}一个带有两个独立变量的多维正态分布。\n由于变量之间是相互独立的，Gibbs采样混合得很好。\n\\emph{(中)}变量之间存在高度相关性的一个多维正态分布。\n变量之间的相关性使得马尔可夫链很难混合。\n因为每一个变量的更新需要相对其他变量求条件分布，相关性减慢了马尔可夫链远离初始点的速度。\n\\emph{(右)}\\,峰值之间间距很大且不在轴上对齐的混合高斯分布。\nGibbs采样混合得很慢，因为每次更新仅仅一个变量很难跨越不同的峰值。}\n\\end{figure}\n\n\n<!-- %  592 -->\n举一个简单的例子，考虑两个变量$\\RSa$，$\\RSb$的基于能量的模型，这两个变量都是二值的，取值$+1$或者$-1$。   %??  \n如果对某个较大的正数$w$，$E(\\RSa,\\RSb) = - w \\RSa \\RSb$，那么这个模型传达了一个强烈的信息，$\\RSa$和$\\RSb$有相同的符号。\n当$\\RSa=1$时用~Gibbs采样更新$\\RSb$。\n给定$\\RSb$时的条件分布满足$p(\\RSb=1\\mid \\RSa=1) = \\sigma(w)$。\n如果$w$的值很大，sigmoid~函数趋近于饱和，那么$b$也取到$1$的概率趋近于$1$。\n同理，如果$\\RSa=-1$，那么$\\RSb$取到$-1$的概率也趋于$1$。 \n根据模型$p_{\\text{model}}(\\RSa,\\RSb)$，两个变量取一样的符号的概率几乎相等。\n根据$p_{\\text{model}}(\\RSa\\mid \\RSb)$，两个变量应该有相同的符号。\n这也意味着~Gibbs采样很难会改变这些变量的符号。\n<!-- % 592 -->\n\n在更实际的问题中，这种挑战更加艰巨因为在实际问题中我们不能仅仅关注在两个峰值之间的转移，更要关注在多个峰值之间的转移。 \n如果由于峰值之间混合困难，而导致某几个这样的转移难以完成，那么得到一些可靠的覆盖大部分峰值的样本集合的计算代价是很高的，同时马尔可夫链收敛到它的平稳分布的过程也会非常缓慢。\n<!-- % 592 -->\n\n通过寻找一些高度依赖变量的组以及分块同时更新块（组）中的变量，这个问题有时候是可以被解决的。\n然而不幸的是，当依赖关系很复杂时，从这些组中采样的过程从计算角度上说是难以处理的。\n归根结底，马尔可夫链最初就是被提出来解决这个问题，即从大量变量中采样的问题。\n<!-- % 592 -->\n\n\n<!-- % 593 head -->\n在定义了一个联合分布$p_{\\text{model}}(\\Vx,\\Vh)$的潜变量模型中，我们经常通过交替地从$p_{\\text{model}}(\\Vx\\mid \\Vh)$和$p_{\\text{model}}(\\Vh\\mid \\Vx)$中采样来达到抽$\\Vx$的目的。  \n从快速混合的角度上说，我们更希望$p_{\\text{model}}(\\Vh\\mid \\Vx)$有很大的熵。\n然而，从学习一个$\\Vh$的有用表示的角度上考虑，我们还是希望$\\Vh$能够包含$\\Vx$的足够信息从而能够较完整地重构它，这意味$\\Vh$和$\\Vx$要有非常高的互信息。\n这两个目标是相互矛盾的。\n我们经常学习到能够将$\\Vx$精确地编码为$\\Vh$的生成模型，但是无法很好混合。\n这种情况在玻尔兹曼机中经常出现，一个玻尔兹曼机学到的分布越尖锐，该分布的马尔可夫链采样越难混合得好。\n这个问题在\\fig?中有所描述。\n<!-- % 593 -->\n\n\n<!-- % 593 end -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n    \\centering\n    \\begin{tabular}{cc}\n    \\includegraphics[width=0.45\\figwidth]{Chapter17/figures/fig-dbm-bad-mixing}\n    \\includegraphics[width=0.45\\figwidth]{Chapter17/figures/fig-adversarial}    \n    \\end{tabular}\n\\fi\n\\caption{深度概率模型中一个混合缓慢问题的例证。\n每张图都是按照从左到右从上到下的顺序的。\n\\emph{(左)}~Gibbs采样从MNIST数据集训练成的深度玻尔兹曼机中采出的连续样本。\n这些连续的样本之间非常相似。\n由于\\,Gibbs采样作用于一个深度图模型，相似度更多地是基于语义而非原始视觉特征。\n但是对于吉布斯链来说从分布的一个峰值转移到另一个仍然是很困难的，比如说改变数字。\n\\emph{(右)}从生成式对抗网络中抽出的连续原始样本。\n因为原始采样生成的样本之间互相独立，所以不存在混合问题。}\n\\end{figure}\n<!-- % 593 end -->\n\n\n<!-- % 593 mid -->\n当感兴趣的分布对于每个类具有单独的流形结构时，所有这些问题都使\\,MCMC\\,方法变得不那么有用：分布集中在许多峰值周围，并且这些峰值由大量高能量区域分割。\n我们在许多分类问题中遇到的是这种类型的分布，由于峰值之间混合缓慢，它将使得MCMC方法非常缓慢地收敛。\n<!-- % 593 -->\n\n\n\n\n## 不同峰值之间通过回火来混合\n\n<!-- % 594 -->\n\n当一个分布有一些陡峭的峰并且被低概率区域包围时，很难在分布的不同峰值之间混合。   %?? 峰值\n一些加速混合的方法是基于构造一个概率分布替代目标分布，这个概率分布的峰值没有那么高，峰值周围的低谷也没有那么低。\n基于能量的模型为这个想法提供一种简单的做法。\n目前为止，我们一直将基于能量的模型描述为定义一个概率分布：   \n\\begin{align}\np(\\Vx) \\propto \\exp(-E(\\Vx)).\n\\end{align}\n基于能量的模型可以通过添加一个额外的控制峰值尖锐程度的参数$\\beta$来加强：\n\\begin{align}\np_{\\beta}(\\Vx) \\propto \\exp(-\\beta E(\\Vx)).\n\\end{align}\n$\\beta$参数可以被理解为温度的倒数，反映了基于能量的模型的统计物理学起源。\n当温度趋近于0时，$\\beta$趋近于无穷大，此时的基于能量的模型是确定性的。\n当温度趋近于无穷大时，$\\beta$趋近于零，基于能量的模型（对离散的$\\Vx$）成了均匀分布。\n<!-- % 594 -->\n\n通常情况下，在$\\beta = 1$时训练一个模型。\n但我们也可以利用其他温度，尤其是$\\beta < 1$的情况。\n回火作为一种通用的策略，它通过从$\\beta<1$模型中采样来实现在$p_1$的不同峰值之间快速混合。\n<!-- % 594 -->\n\n基于回火转移~{cite?}的马尔可夫链临时从高温度的分布中采样使其在不同峰值之间混合，然后继续从单位温度的分布中采样。\n这些技巧被应用在一些模型比如\\,RBM中~{cite?}。\n另一种方法是利用并行回火~{cite?}。\n其中马尔可夫链并行地模拟许多不同温度的不同状态。\n最高温度的状态混合较慢，相比之下最低温度的状态，即温度为$1$时，采出了精确的样本。\n转移算子包括了两个温度之间的随机跳转，所以一个高温度状态分布槽中的样本有足够大的概率跳转到低温度分布的槽中。\n这个方法也被应用到了\\,RBM中~{cite?}。\n尽管回火这种方法前景可期，现今它仍然无法让我们在采样复杂的基于能量的模型中更进一步。\n一个可能的原因是在临界温度时温度转移算子必须设置得非常慢（因为温度需要逐渐下降）来确保回火的有效性。\n<!-- % 594 -->\n\n\n<!-- % 595 -->\n\n## 深度也许会有助于混合\n\n\n当我们从潜变量模型$p(\\Vh,\\Vx)$中采样时，我们可以发现如果$p(\\Vh\\mid \\Vx)$将$\\Vx$编码得非常好，那么从$p(\\Vx \\mid \\Vh)$中采样时，并不会太大地改变$\\Vx$，那么混合结果会很糟糕。\n解决这个问题的一种方法是使得$\\Vh$成为一种将$\\Vx$编码为$\\Vh$的深度表示，从而使得马尔可夫链在$\\Vh$空间中更容易混合。\n在许多表示学习算法如自编码器和\\,RBM\\,中，$\\Vh$的边缘分布相比于$\\Vx$上的原始数据分布，通常表现为更加均匀、更趋近于单峰值。\n或许可以说，这是因为利用了所有可用的表示空间并尽量减小重构误差。\n因为当训练集上的不同样本之间在$\\Vh$空间能够被非常容易地区分时，我们也会很容易地最小化重构误差。\n{Bengio-et-al-ICML2013-small}观察到这样的现象，堆叠越深的正则化自编码器或者\\,RBM，顶端$\\Vh$空间的边缘分布越趋向于均匀和发散，而且不同峰值（比如说实验中的类别）所对应区域之间的间距也会越小。\n在高层空间中训练\\,RBM\\,会使得~Gibbs采样在峰值间混合得更快。\n然而，如何利用这种观察到的现象来辅助训练深度生成模型或者从中采样仍然有待探索。\n<!-- % 595 -->\n\n尽管存在混合的难点，蒙特卡罗技术仍然是一个有用的工具，通常也是最好的可用工具。  \n事实上，在遇到难以处理的无向模型中的配分函数时，蒙特卡罗方法仍然是最主要的工具，这将在下一章详细阐述。\n<!-- % 595 -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-18-Chapter18_confronting_the_partition_function.md",
    "content": "---\ntitle: 直面配分函数\nlayout: post\nshare: false\n---\n<!-- % 597 -->\n在\\sec?中，我们看到许多概率模型（通常是无向图模型）由一个未归一化的概率分布 $\\tilde{p}(\\RVx, \\theta)$定义。\n我们必须通过除以配分函数 $Z(\\Vtheta)$来归一化$\\tilde{p}$，以获得一个有效的概率分布：\n\\begin{equation}\n\tp(\\RVx; \\Vtheta) = \\frac{1}{Z(\\Vtheta)} \\tilde{p}(\\RVx; \\Vtheta).\n\\end{equation}\n配分函数是未归一化概率所有状态的积分（对于连续变量）或求和（对于离散变量）：\n\\begin{equation}\n\t\\int \\tilde{p}(\\Vx) d \\Vx\n\\end{equation}\n或者\n\\begin{equation}\n\t\\sum_{\\Vx} \\tilde{p} (\\Vx).\n\\end{equation}\n\n\n对于很多有趣的模型而言，以上积分或求和难以计算。\n\n\n正如我们将在\\chap?看到的，有些深度学习模型被设计成具有一个易于处理的归一化常数，或被设计成能够在不涉及计算$p(\\RVx)$的情况下使用。\n然而，其他一些模型会直接面对难以计算的配分函数的挑战。\n在本章中，我们会介绍用于训练和评估那些具有难以处理的配分函数的模型的技术。\n<!-- % -- 597 end -->\n\n\n\n# 对数似然梯度\n\n通过最大似然学习无向模型特别困难的原因在于配分函数依赖于参数。\n对数似然相对于参数的梯度具有一项对应于配分函数的梯度：\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\log p(\\RVx; \\Vtheta) = \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx; \\Vtheta) -\n\\nabla_{\\Vtheta} \\log Z(\\Vtheta).\n\\end{equation}\n<!-- % 598 head -->\n\n这是机器学习中非常著名的正相和负相的分解。\n\n\n对于大多数感兴趣的无向模型而言，负相是困难的。\n没有潜变量或潜变量之间很少相互作用的模型通常会有一个易于计算的正相。\nRBM\\,的隐藏单元在给定可见单元的情况下彼此条件独立，是一个典型的具有简单正相和困难负相的模型。\n正相计算困难，潜变量之间具有复杂相互作用的情况将主要在\\chap?中讨论。本章主要探讨负相计算中的难点。\n\n\n让我们进一步分析$\\log Z$的梯度：\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\log Z\n\\end{equation}\n\\begin{equation}\n\t= \\frac{ \\nabla_{\\Vtheta} Z }{Z}\n\\end{equation}\n\\begin{equation}\n\t= \\frac{ \\nabla_{\\Vtheta} \\sum_{\\RVx} \\tilde{p}(\\RVx) }{Z}\n\\end{equation}\n\\begin{equation}\n\t= \\frac{ \\sum_{\\RVx} \\nabla_{\\Vtheta} \\tilde{p}(\\RVx) }{Z}.\n\\end{equation}\n\n\n对于保证所有的$\\RVx$都有$p(\\RVx) > 0$的模型，我们可以用$\\exp(\\log \\tilde{p}(\\RVx))$代替$\\tilde{p}(\\RVx)$：\n\\begin{equation}\n\t\\frac{ \\sum_{\\RVx} \\nabla_{\\Vtheta} \\exp (\\log \\tilde{p} (\\RVx)) }{ Z }\n\\end{equation}\n\\begin{equation}\n\t= \\frac{  \\sum_{\\RVx}  \\exp (\\log \\tilde{p} (\\RVx)) \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx)  }{Z}\n\\end{equation}\n\\begin{equation}\n\t=\\frac{  \\sum_{\\RVx} \\tilde{p} (\\RVx)  \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx)  }{ Z}\n\\end{equation}\n\\begin{equation}\n\t=\\sum_{\\RVx} p(\\RVx) \\nabla_{\\Vtheta} \\log \\tilde{p} ( \\RVx )\n \\end{equation}\n\\begin{equation}\n\t=\\SetE_{\\RVx \\sim p(\\RVx)} \\nabla_{\\Vtheta} \\log \\tilde{p} (\\RVx).\n\\end{equation}\n<!-- % -- 598 end -->\n\n\n上述推导对离散的$\\Vx$进行求和，对连续的$\\Vx$进行积分也可以得到类似结果。\n在连续版本的推导中，使用在积分符号内取微分的莱布尼兹法则可以得到等式\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\int \\tilde{p} (\\RVx) d \\Vx  = \\int \\nabla_{\\Vtheta} \n\\tilde{p} (\\RVx) d \\Vx.\n\\end{equation}\n该等式只适用于$\\tilde{p}$和$\\nabla_{\\Vtheta} \\tilde{p} (\\RVx)$上的一些特定规范条件。\n在测度论术语中，这些条件是：\n(1) 对每一个$\\Vtheta$而言，未归一化分布$\\tilde{p}$必须是$\\Vx$的勒贝格可积函数。\n(2) 对于所有的$\\Vtheta$和几乎所有$\\Vx$，梯度$\\nabla_{\\Vtheta} \\tilde{p}(\\RVx)$必须存在。\n(3) 对于所有的$\\Vtheta$和几乎所有的$\\Vx$，必须存在一个可积函数$R(\\Vx)$使得$\\max_i | \\frac{\\partial}{\\partial \\theta_i } \\tilde{p} (\\RVx) | \\leq R(\\Vx)$。\n幸运的是，大多数感兴趣的机器学习模型都具有这些性质。\n<!-- % 599 mid -->\n\n等式\n\\begin{equation}\n\t\\nabla_{\\Vtheta} \\log Z = \\SetE_{\\RVx \\sim p(\\RVx)} \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx)\n\\end{equation}\n是使用各种蒙特卡罗方法近似最大化（具有难计算配分函数模型的）似然的基础。\n<!-- % 599 mid -->\n\n蒙特卡罗方法为学习无向模型提供了直观的框架，我们能够在其中考虑正相和负相。\n在正相中，我们增大从数据中采样得到的$\\log \\tilde{p}(\\RVx)$。\n在负相中，我们通过降低从模型分布中采样的$\\log \\tilde{p}(\\RVx)$来降低配分函数。\n<!-- % 599 mid -->\n\n在深度学习文献中，经常会看到用能量函数（\\eqn?）来参数化$\\log \\tilde{p}$。\n在这种情况下，正相可以解释为压低训练样本的能量，负相可以解释为提高模型抽出的样本的能量，如\\fig?所示。\n<!-- % 599 mid -->\n\n\n# 随机最大似然和对比散度\n\n<!-- % 599 end -->\n实现\\eqn?的一个朴素方法是，每次需要计算梯度时，磨合随机初始化的一组马尔可夫链。\n当使用随机梯度下降进行学习时，这意味着马尔可夫链必须在每次梯度步骤中磨合。\n这种方法引导下的训练过程如\\alg?所示。\n内循环中磨合马尔可夫链的计算代价过高，导致这个过程在实际中是不可行的，\n但是这个过程是其他更加实际的近似算法的基础。\n<!-- %不过该过程启发了其他计算代价较低的近似算法。 -->\n\n<!-- % -- 599 -- -->\n\\begin{algorithm}[ht]\n\\caption{一种朴素的\\,MCMC\\,算法，使用梯度上升最大化具有难以计算配分函数的对数似然。}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数。\n\\STATE 设吉布斯步数 $k$ 大到足以允许磨合。在小图像集上训练一个~RBM~大致设为100。\n\\WHILE{不收敛}\n\\STATE 从训练集中采包含 $m$ 个样本$\\{ \\RVx^{(1)}, \\dots, \\RVx^{(m)}\\}$的小批量。\n\\STATE $\\RVg \\leftarrow \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx^{(i)}; \\Vtheta)$.\n\\STATE 初始化$m$ 个样本 $\\{ \\tilde{\\RVx}^{(1)}, \\dots, \\tilde{\\RVx}^{(m)} \\}$ 为随机值（例如，从均匀或正态分布中采，或大致与模型边缘分布匹配的分布）。\n\\FOR{$i=1$ to $k$}\n    \\FOR{$j=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(j)} \\leftarrow \\text{gibbs\\_update}(\\tilde{\\RVx}^{(j)}).$\n    \\ENDFOR\n\\ENDFOR\n\\STATE $\\RVg \\leftarrow \\RVg - \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}( \\tilde{\\RVx}^{(i)} ; \\Vtheta ).$\n\\STATE $\\Vtheta \\leftarrow \\Vtheta + \\epsilon \\RVg.$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n我们可以将最大化似然的\\,MCMC\\,方法视为在两种力之间平衡，一种力拉高数据出现时的模型分布，一种拉低模型采样出现时的模型分布。%??   从而最大化似然     还是  将最大似然提前？\n\\fig?展示了这个过程。\n这两种力分别对应最大化$\\log \\tilde{p}$和最小化$\\log Z$。\n对于负相会有一些近似方法。\n这些近似都可以被理解为使负相更容易计算，但是也可能将其推向错误的位置。%??  push down  翻成 拉低/压低  ？推向 不对吧？  push 翻成 推 可以啊\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter18/figures/pos_and_neg_phase_color}}\n\\fi\n\\caption{\\alg?角度的\"正相\"和\"负相\"。\n\\emph{(左)}在正相中，我们从数据分布中采样，然后推高它们未归一化的概率。这意味着概率越高的数据点未归一化的概率被推高得越多。\n\\emph{(右)}在负相中，我们从模型分布中采样，然后压低它们未归一化的概率。\n这与正相的倾向相反，给未归一化的概率处处添加了一个大常数。\n当数据分布和模型分布相等时，正相推高数据点和负相压低数据点的机会相等。\n此时，不再有任何的梯度（期望上说），训练也必须停止。}\n\\end{figure}\n\n\n<!-- % -- 600 end -->\n因为负相涉及到从模型分布中抽样，所以我们可以认为它在找模型信任度很高的点。\n因为负相减少了这些点的概率，它们一般被认为代表了模型不正确的信念。\n在文献中，它们经常被称为\"幻觉\"或\"幻想粒子\"。\n事实上，负相已经被作为人类和其他动物做梦的一种可能解释~{cite?}。\n这个想法是说，大脑维持着世界的概率模型，并且在醒着经历真实事件时会遵循$\\log \\tilde{p}$的梯度，在睡觉时会遵循$\\log \\tilde{p}$的负梯度最小化$\\log Z$，其经历的样本采样自当前的模型。\n这个视角解释了具有正相和负相的大多数算法，但是它还没有被神经科学实验证明是正确的。\n在机器学习模型中，通常有必要同时使用正相和负相，而不是按不同时间阶段分为清醒和REM睡眠时期。\n正如我们将在\\sec?中看到的，一些其他机器学习算法出于其他原因从模型分布中采样，这些算法也能提供睡觉做梦的解释。\n<!-- % 601 mid -->\n\n这样理解学习正相和负相的作用之后，我们设计了一个比\\alg?计算代价更低的替代算法。\n简单的\\,MCMC\\,算法的计算成本主要来自每一步的随机初始化磨合马尔可夫链。\n一个自然的解决方法是初始化马尔可夫链为一个非常接近模型分布的分布，从而大大减少磨合步骤。\n\n<!-- % -- 601 -- -->\n\\begin{algorithm}[ht]\n\\caption{对比散度算法，使用梯度上升作为优化过程。}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数。\n\\STATE 设吉布斯步数 $k$ 大到足以让从 $p_\\text{data}$初始化并从 $p(\\RVx; \\Vtheta)$采样的马尔可夫链混合 。在小图像集上训练一个~RBM~大致设为1-20。\n\\WHILE{不收敛}\n\\STATE 从训练集中采包含 $m$ 个样本 $\\{ \\RVx^{(1)}, \\dots, \\RVx^{(m)}\\}$ 的小批量。\n\\STATE $\\RVg \\leftarrow \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx^{(i)}; \\Vtheta).$\n    \\FOR{$i=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(i)} \\leftarrow \\RVx^{(i)}.$\n    \\ENDFOR\n\\FOR{$i=1$ to $k$}\n    \\FOR{$j=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(j)} \\leftarrow \\text{gibbs\\_update}(\\tilde{\\RVx}^{(j)}).$\n    \\ENDFOR\n\\ENDFOR\n\\STATE $\\RVg \\leftarrow \\RVg - \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}( \\tilde{\\RVx}^{(i)} ; \\Vtheta ) .$\n\\STATE $\\Vtheta \\leftarrow \\Vtheta + \\epsilon \\RVg.$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n<!-- % 601 end -->\n\\textbf{对比散度}（CD，或者是具有$k$个Gibbs步骤的~CD-$k$）算法在每个步骤中初始化马尔可夫链为采样自数据分布中的样本~{cite?}，如\\alg?所示。\n从数据分布中获取样本是计算代价最小的，因为它们已经在数据集中了。\n初始时，数据分布并不接近模型分布，因此负相不是非常准确。\n幸运的是，正相仍然可以准确地增加数据的模型概率。\n进行正相阶段一段时间之后，模型分布会更接近于数据分布，并且负相开始变得准确。\n<!-- % 602 mid -->\n\n当然，CD\\,仍然是真实负相的一个近似。\nCD\\,未能定性地实现真实负相的主要原因是，它不能抑制远离真实训练样本的高概率区域。\n这些区域在模型上具有高概率，但是在数据生成区域上具有低概率，被称为虚假模态。\n\\fig?解释了这种现象发生的原因。\n基本上，除非$k$非常大，模型分布中远离数据分布的峰值不会被使用训练数据初始化的马尔可夫链访问到。\n<!-- % -- 602 end -->\n\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter18/figures/spurious_mode_color}}\n\\fi\n\\caption{一个虚假模态。\n说明对比散度（\\alg?）的负相为何无法抑制虚假模态的例子。\n一个虚假模态指的是一个在模型分布中出现数据分布中却不存在的模式。\n由于对比散度从数据点中初始化它的马尔可夫链然后仅仅运行了几步马尔可夫链，不太可能到达模型中离数据点较远的模式。\n这意味着从模型中采样时，我们有时候会得到一些与数据并不相似的样本。\n这也意味着由于在这些模式上浪费了一些概率质量，模型很难把较高的概率质量集中于正确的模式上。\n出于可视化的目的，这个图使用了某种程度上说更加简单的距离的概念——在$\\SetR$的数轴上虚假模态与正确的模式有很大的距离。\n这对应着基于局部移动$\\SetR$上的单个变量$x$的马尔可夫链。\n对于大部分深度概率模型来说，马尔可夫链是基于\\,Gibbs采样的，并且对于单个变量产生非局部的移动但是无法同时移动所有的变量。\n对于这些问题来说，考虑编辑距离比欧式距离通常更好。\n然而，高维空间的编辑距离很难在二维空间作图展示。}\n\\end{figure}\n\n\n{Perpinan+Hinton-2005-small}实验上证明\\,CD\\,估计偏向于~RBM~和完全可见的玻尔兹曼机，因为它会收敛到与最大似然估计不同的点。\n他们认为，由于偏差较小，CD\\,可以作为一种计算代价低的方式来初始化模型，之后可以通过计算代价高的\\,MCMC\\,方法进行精调。\n{Bengio+Delalleau-2009}表明，CD\\,可以被理解为去掉了正确\\,MCMC\\,梯度更新中的最小项，这解释了偏差的由来。\n\n\n在训练诸如\\,RBM\\,的浅层网络时\\,CD\\,是很有用的。\n反过来，这些可以堆叠起来初始化更深的模型，如\\,DBN\\,或\\,DBM。\n但是\\,CD\\,并不直接有助于训练更深的模型。\n这是因为在给定可见单元样本的情况下，很难获得隐藏单元的样本。\n由于隐藏单元不包括在数据中，所以使用训练点初始化无法解决这个问题。\n即使我们使用数据初始化可见单元，我们仍然需要磨合在给定这些可见单元的隐藏单元条件分布上采样的马尔可夫链。\n\n<!-- % -- 603 end -->\n\nCD\\,算法可以被理解为惩罚某类模型，这类模型的马尔可夫链会快速改变来自数据的输入。 %??   这句话总是读不通\n这意味着使用\\,CD\\,训练从某种程度上说类似于训练自编码器。\n即使\\,CD\\,估计比一些其他训练方法具有更大偏差，但是它有助于预训练之后会堆叠起来的浅层模型。\n这是因为堆栈中最早的模型会受激励复制更多的信息到其潜变量，使其可用于随后的模型。\n这应该更多地被认为是\\,CD\\,训练中经常可利用的副产品，而不是主要的设计优势。\n\n\n{sutskever2010convergence-small}表明，CD\\,的更新方向不是任何函数的梯度。\n这使得\\,CD\\,可能存在永久循环的情况，但在实践中这并不是一个严重的问题。\n\n\n另一个解决\\,CD\\,中许多问题的不同策略是，在每个梯度步骤中初始化马尔可夫链为先前梯度步骤的状态值。\n这个方法首先被应用数学和统计学社群发现，命名为\\textbf{随机最大似然}（SML）{cite?}，后来又在深度学习社群中以名称\\textbf{持续性对比散度}（PCD，或者每个更新中具有$k$个Gibbs步骤的\\,PCD-k）独立地被重新发现~{cite?}。\n具体可以参考\\alg?。\n这种方法的基本思想是，只要随机梯度算法得到的步长很小，那么前一步骤的模型将类似于当前步骤的模型。\n因此，来自先前模型分布的样本将非常接近来自当前模型分布的客观样本，用这些样本初始化的马尔可夫链将不需要花费很多时间来完成混合。\n\n\n因为每个马尔可夫链在整个学习过程中不断更新，而不是在每个梯度步骤中重新开始，马尔可夫链可以自由探索很远，以找到模型的所有峰值。 \n因此，SML\\,比\\,CD\\,更不容易形成具有虚假模态的模型。\n此外，因为可以存储所有采样变量的状态，无论是可见的还是潜在的，SML\\,为隐藏单元和可见单元都提供了初始值。\nCD\\,只能为可见单元提供初始化，因此深度模型需要进行磨合步骤。\nSML\\,能够高效地训练深度模型。\n{Marlin10Inductive-small}将\\,SML\\,与本章中提出的许多其他标准方法进行比较。\n他们发现，SML\\,在\\,RBM\\,上得到了最佳的测试集对数似然，并且如果\\,RBM\\,的隐藏单元被用作\\,SVM\\,分类器的特征，那么\\,SML\\,会得到最好的分类精度。\n<!-- % -- 604 end -->\n\n\\begin{algorithm}[ht]\n\\caption{随机最大似然/持续性对比散度算法，使用梯度上升作为优化过程。}\n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数。\n\\STATE 设吉布斯步数 $k$ 大到足以让从 $p(\\RVx; \\Vtheta + \\epsilon \\RVg)$ 采样的马尔可夫链磨合（从采自$p(\\RVx; \\Vtheta)$的样本开始）。\n在小图像集上训练一个RBM大致设为1，对于更复杂的模型如深度玻尔兹曼机可能要设为5到50。\n\\STATE  初始化$m$ 个样本 $\\{ \\tilde{\\RVx}^{(1)}, \\dots, \\tilde{\\RVx}^{(m)} \\}$ 为随机值（例如，从均匀或正态分布中采，或大致与模型边缘分布匹配的分布）。\n\\WHILE{不收敛}\n\\STATE 从训练集中采包含 $m$ 个样本 $\\{ \\RVx^{(1)}, \\dots, \\RVx^{(m)}\\}$ 的小批量。\n\\STATE $\\RVg \\leftarrow \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}(\\RVx^{(i)}; \\Vtheta).$\n\\FOR{$i=1$ to $k$}\n    \\FOR{$j=1$ to $m$}\n        \\STATE $\\tilde{\\RVx}^{(j)} \\leftarrow \\text{gibbs\\_update}(\\tilde{\\RVx}^{(j)}).$\n    \\ENDFOR\n\\ENDFOR\n\\STATE $\\RVg \\leftarrow \\RVg - \\frac{1}{m} \\sum_{i=1}^m \\nabla_{\\Vtheta} \\log \\tilde{p}( \\tilde{\\RVx}^{(i)} ; \\Vtheta ).$\n\\STATE $\\Vtheta \\leftarrow \\Vtheta + \\epsilon \\RVg.$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n<!-- % 605 mid -->\n在$k$太小或$\\epsilon$太大时，随机梯度算法移动模型的速率比马尔可夫链在迭代步中混合更快，此时\\,SML\\,容易变得不准确。\n不幸的是，这些值的容许范围高度依赖于具体问题。\n现在还没有方法能够正式地测试马尔可夫链是否能够在迭代步骤之间成功混合。\n主观地，如果对于Gibbs步骤数目而言学习率太大的话，那么\n梯度步骤中负相采样的方差会比不同马尔可夫链中负相采样的方差更大。\n例如，一个MNIST模型在一个步骤中只采样得到了$7$。\n然后学习过程将会极大降低$7$对应的峰值，在下一个步骤中，模型可能会只采样得到$9$。\n\n<!-- % 605 end -->\n从使用\\,SML\\,训练的模型中评估采样必须非常小心。\n在模型训练完之后，有必要从一个随机起点初始化的新马尔可夫链抽取样本。\n用于训练的连续负相链中的样本受到了模型最近几个版本的影响，会使模型看起来具有比其实际更大的容量。\n\n<!-- % -- 605 -- -->\n\n\n{BerglundR13}进行了实验来检验由\\,CD\\,和\\,SML\\,进行梯度估计带来的偏差和方差。\n结果证明\\,CD\\,比基于精确采样的估计具有更低的方差。\n而\\,SML\\,有更高的方差。\nCD\\,方差低的原因是，其在正相和负相中使用了相同的训练点。\n如果从不同的训练点来初始化负相，那么方差会比基于精确采样的估计的方差更大。\n\n\n所有基于\\,MCMC\\,从模型中抽取样本的方法在原则上几乎可以与\\,MCMC\\,的任何变体一起使用。\n这意味着诸如\\,SML\\,这样的技术可以使用\\chap?中描述的任何增强\\,MCMC\\,的技术（例如并行回火）来加以改进~{cite?}。\n<!-- % 606 mid -->\n\n一种在学习期间加速混合的方法是，不改变蒙特卡罗采样技术，而是改变模型的参数化和代价函数。\n快速持续性对比散度，或者\\,FPCD~{cite?}使用如下表达式去替换传统模型的参数$\\Vtheta$\n\n\\begin{equation}\n\t\\Vtheta = \\Vtheta^{\\text{(slow)}} + \\Vtheta^{\\text{(fast)}}.\n\\end{equation}\n现在的参数是以前的两倍多，将其逐个相加以定义原始模型的参数。\n快速复制参数可以使用更大的学习率来训练，从而使其快速响应学习的负相，并促使马尔可夫链探索新的区域。\n这能够使马尔可夫链快速混合，尽管这种效应只会发生在学习期间快速权重可以自由改变的时候。\n通常，在短时间地将快速权重设为大值并保持足够长时间，使马尔可夫链改变峰值之后，我们会对快速权重使用显著的权重衰减，促使它们收敛到较小的值。\n\n\n本节介绍的基于\\,MCMC\\,的方法的一个关键优点是它们提供了$\\log Z$梯度的估计，因此我们可以从本质上将问题分解为$\\log \\tilde{p}$和$\\log Z$两块。\n然后我们可以使用任何其他的方法来处理$\\log \\tilde{p}(\\RVx)$，只需将我们的负相梯度加到其他方法的梯度中。\n特别地，这意味着正相可以使用那些仅提供$\\tilde{p}$下限的方法。\n然而，本章介绍处理$\\log Z$的大多数其他方法都和基于边界的正相方法是不兼容的。\n\n<!-- % -- 606 end -->\n\n\n# 伪似然\n\n蒙特卡罗近似配分函数及其梯度需要直接处理配分函数。\n有些其他方法通过训练不需要计算配分函数的模型来绕开这个问题。\n这些方法大多数都基于以下观察：无向概率模型中很容易计算概率的比率。\n这是因为配分函数同时出现在比率的分子和分母中，互相抵消：\n\\begin{equation}\n\t\\frac{p(\\RVx)}{ p(\\RVy) } = \\frac{ \\frac{1}{Z} \\tilde{p}(\\RVx) }{ \\frac{1}{Z} \\tilde{p}(\\RVy) } =\n\\frac{ \\tilde{p}(\\RVx) }{ \\tilde{p}(\\RVy) }.\n\\end{equation}\n\n\n伪似然正是基于条件概率可以采用这种基于比率的形式，因此可以在没有配分函数的情况下进行计算。\n假设我们将$\\RVx$分为$\\RVa$，$\\RVb$和$\\RVc$，其中$\\RVa$包含我们想要的条件分布的变量，$\\RVb$包含我们想要条件化的变量，$\\RVc$包含除此之外的变量：\n\\begin{equation}\n\tp(\\RVa \\mid \\RVb) = \\frac{ p(\\RVa, \\RVb) }{ p(\\RVb) } = \\frac{p(\\RVa, \\RVb)}{ \\sum_{\\RVa, \\RVc} p(\\RVa, \\RVb, \\RVc) } = \\frac{ \\tilde{p}(\\RVa, \\RVb) }{ \\sum_{\\RVa, \\RVc} \\tilde{p}(\\RVa, \\RVb, \\RVc) }.\n\\end{equation}\n以上计算需要边缘化$\\RVa$，假设$\\RVa$和$\\RVc$包含的变量并不多，那么这将是非常高效的操作。\n在极端情况下，$\\RVa$可以是单个变量，$\\RVc$可以为空，那么该计算仅需要估计与单个随机变量值一样多的$\\tilde{p}$。\n\n\n不幸的是，为了计算对数似然，我们需要边缘化很多变量。\n如果总共有$n$个变量，那么我们必须边缘化$n-1$个变量。\n根据概率的链式法则，我们有\n\\begin{equation}\n\t\\log p(\\RVx) = \\log p(x_1) + \\log p(x_2 \\mid x_1) + \\dots + \\log p(x_n \\mid \\RVx_{1:n−1}).\n\\end{equation}\n在这种情况下，我们已经使$\\RVa$尽可能小，但是$\\RVc$可以大到$\\RVx_{2:n}$。\n如果我们简单地将$\\RVc$移到$\\RVb$中以减少计算代价，那么会发生什么呢？\n这便产生了伪似然~{cite?}目标函数，给定所有其他特征$\\Vx_{-i}$，预测特征$x_i$的值：\n\\begin{equation}\n\t\\sum_{i=1}^n \\log p(x_i \\mid \\Vx_{-i}).\n\\end{equation}\n\n\n如果每个随机变量有$k$个不同的值，那么计算$\\tilde{p}$需要$k\\times n$次估计，而计算配分函数需要$k^n$次估计。\n\n<!-- % -- 607 -- -->\n\n这看起来似乎是一个没有道理的策略，但可以证明最大化伪似然的估计是渐近一致的~{cite?}。\n当然，在数据集不趋近于大采样极限的情况下，伪似然可能表现出与最大似然估计不同的结果。\n<!-- % 608 head -->\n\n我们可以使用广义伪似然估计来权衡计算复杂度和最大似然表现的偏差~{cite?}。\n广义伪似然估计使用$m$个不同的集合$\\SetS^{(i)}$，$i=1, \\dots, m$作为变量的指标出现在条件棒的左侧。\n在$m = 1$和$\\SetS^{(1)}= 1, \\dots, n$的极端情况下，广义伪似然估计会变为对数似然。\n在$m = n$和$\\SetS^{(i)} = \\{i\\}$的极端情况下，广义伪似然会恢复为伪似然。%??   recover the pseudolikeli\n广义伪似然估计目标函数如下所示\n\\begin{equation}\n\t\\sum_{i=1}^m \\log p(\\RVx_{\\SetS^{(i)}} \\mid \\RVx_{- \\SetS^{(i)} }).\n\\end{equation}\n\n\n基于伪似然的方法的性能在很大程度上取决于模型是如何使用的。\n对于完全联合分布$p(\\RVx)$模型的任务（例如密度估计和采样），伪似然通常效果不好。\n对于在训练期间只需要使用条件分布的任务而言，它的效果比最大似然更好，例如填充少量的缺失值。\n如果数据具有规则结构，使得$\\SetS$索引集可以被设计为表现最重要的相关性质，同时略去相关性可忽略的变量，那么广义伪似然策略将会非常有效。\n例如，在自然图像中，空间中相隔很远的像素也具有弱相关性，因此广义伪似然可以应用于每个$\\SetS$集是小的局部空间窗口的情况。\n<!-- % 608 mid -->\n\n伪似然估计的一个弱点是它不能与仅在$\\tilde{p}(\\RVx)$上提供下界的其他近似一起使用，例如\\chap?中介绍的变分推断。这是因为$\\tilde{p}$出现在了分母中。\n分母的下界仅提供了整个表达式的上界，然而最大化上界没有什么意义。\n这使得我们难以将伪似然方法应用于诸如深度玻尔兹曼机的深度模型，因为变分方法是近似边缘化互相作用的多层隐藏变量的主要方法之一。\n尽管如此，伪似然仍然可以用在深度学习中，它可以用于单层模型，或使用不基于下界的近似推断方法的深度模型中。\n\n<!-- % -- 608 end -->\n\n伪似然比\\,SML\\,在每个梯度步骤中的计算代价要大得多，这是由于其对所有条件进行显式计算。\n但是，如果每个样本只计算一个随机选择的条件，那么广义伪似然和类似标准仍然可以很好地运行，从而使计算代价降低到和\\,SML\\,差不多的程度~{cite?}。\n\n\n虽然伪似然估计没有显式地最小化$\\log Z$，但是我们仍然认为它具有类似负相的效果。\n每个条件分布的分母会使得学习算法降低所有仅具有一个变量不同于训练样本的状态的概率。\n\n\n读者可以参考~{Marlin11-small}了解伪似然渐近效率的理论分析，。\n\n<!-- % 609 mid -->\n\n# 得分匹配和比率匹配\n\n得分匹配~{cite?}提供了另一种训练模型而不需要估计$Z$或其导数的一致性方法。\n对数密度关于参数的导数$\\nabla_{\\Vx} \\log p(\\Vx)$，被称为其得分，\\emph{得分匹配}这个名称正是来自这样的术语。\n得分匹配采用的策略是，最小化模型对数密度和数据对数密度关于输入的导数之间的平方差期望：\n\\begin{align}\n\tL(\\Vx, \\Vtheta) & = \\frac{1}{2} \\norm{  \\nabla_{\\Vx} \\log p_{\\text{model}}(\\Vx; \\Vtheta) - \\nabla_{\\Vx} \\log p_{\\text{data}} (\\Vx)  }_2^2, \\\\\n<!-- %\\end{equation} -->\n<!-- %\\begin{equation} -->\n\tJ(\\Vtheta) & = \\frac{1}{2} \\SetE_{p_{\\text{data}}(\\Vx)}  L(\\Vx, \\Vtheta), \\\\\n<!-- %\\end{equation} -->\n<!-- %\\begin{equation} -->\n\t\\Vtheta^* & = \\min_{\\Vtheta} J(\\Vtheta) .\n\\end{align}\n\n\n该目标函数避免了微分配分函数 $Z$带来的难题，因为$Z$不是$x$的函数，所以$\\nabla_{\\RVx} Z = 0$。\n最初，得分匹配似乎有一个新的困难：计算数据分布的得分需要知道生成训练数据的真实分布$p_{\\text{data}}$。\n幸运的是，最小化$L(\\Vx, \\Vtheta)$的期望等价于最小化下式的期望\n\\begin{equation}\n\t\\tilde{L} (\\Vx, \\Vtheta) = \\sum_{j=1}^n \\left( \\frac{\\partial^2}{ \\partial x_j^2 } \n\t\\log p_{\\text{model}} (\\Vx; \\Vtheta) + \\frac{1}{2} \\left( \\frac{\\partial}{ \\partial x_j }\n\t\\log p_{\\text{model}} (\\Vx; \\Vtheta)\n  \\right)^2\n\\right),\n\\end{equation}\n其中$n$是$\\Vx$的维度。\n\n<!-- % -- 609 end -->\n\n因为得分匹配需要关于$\\RVx$的导数，所以它不适用于具有离散数据的模型，但是模型中的潜变量可以是离散的。\n\n\n类似于伪似然，得分匹配只有在我们能够直接估计$\\log \\tilde{p}(\\RVx)$及其导数的时候才有效。\n它与对$\\log \\tilde{p}(\\RVx)$仅提供下界的方法不兼容，因为得分匹配需要$\\log \\tilde{p}(\\RVx)$的导数和二阶导数，而下限不能传达关于导数的任何信息。\n这意味着得分匹配不能应用于隐藏单元之间具有复杂相互作用的模型估计，例如稀疏编码模型或深度玻尔兹曼机。\n虽然得分匹配可以用于预训练较大模型的第一个隐藏层，但是它没有被用于预训练较大模型的较深层网络。\n这可能是因为这些模型的隐藏层通常包含一些离散变量。\n\n\n虽然得分匹配没有明确显示具有负相信息，但是它可以被视为使用特定类型马尔可夫链的对比散度的变种~{cite?}。\n在这种情况下，马尔可夫链并没有采用\\,Gibbs采样，而是采用一种由梯度引导局部更新的不同方法。\n当局部更新的大小接近于零时，得分匹配等价于具有这种马尔可夫链的对比散度。\n<!-- % 610 mid -->\n\n{Lyu09}将得分匹配推广到离散的情况（但是推导有误，后由~{Marlin10Inductive-small}修正）。\n{Marlin10Inductive-small}发现，\\textbf{广义得分匹配}（\\textbf{generalized score matching}， GSM）在许多样本观测概率为$0$的高维离散空间中不起作用。\n\n\n一种更成功地将得分匹配的基本想法扩展到离散数据的方法是比率匹配~{cite?}。\n比率匹配特别适用于二值数据。\n比率匹配最小化以下目标函数在样本上的均值：\n\\begin{equation}\n\tL^{(\\text{RM})} (\\Vx, \\Vtheta) = \\sum_{j=1}^n \\left( \n\t\\frac{1}{ 1 + \\frac{ p_{\\text{model}}(\\Vx; \\Vtheta) }{ p_{\\text{model}}(f(\\Vx), j; \\Vtheta) } } \n\\right)^2.\n\\end{equation}\n其中$f(\\Vx, j)$返回$j$处位值取反的$\\RVx$。\n比率匹配使用了与伪似然估计相同的策略来绕开配分函数：配分函数会在两个概率的比率中抵消掉。\n{Marlin10Inductive-small}发现，\n训练模型给测试集图像去噪时，比率匹配的效果要优于\\,SML、伪似然和\\,GSM。\n\n\n<!-- % -- 610 end -->\n\n类似于伪似然估计，比率匹配对每个数据点都需要$n$个$\\tilde{p}$的估计，因此每次更新的计算代价大约比~SML~的计算代价高出$n$倍。\n\n\n与伪似然估计一样，我们可以认为比率匹配减小了所有只有一个变量不同于训练样本的状态的概率。\n由于比率匹配特别适用于二值数据，这意味着在与数据的汉明距离为$1$内的所有状态上，比率匹配都是有效的。\n\n\n比率匹配还可以作为处理高维稀疏数据（例如词计数向量）的基础。\n这类稀疏数据对基于\\,MCMC\\,的方法提出了挑战，因为以密集格式表示数据是非常消耗计算资源的，而只有在模型学会表示数据分布的稀疏性之后，MCMC\\,采样才会产生稀疏值。\n{Dauphin+Bengio-NIPS2013}设计了比率匹配的无偏随机近似来解决这个问题。\n该近似只估计随机选择的目标子集，不需要模型生成完整的样本。\n\n\n读者可以参考~{Marlin11-small}了解比率匹配渐近效率的理论分析，。\n<!-- % 611 mid -->\n\n\n# 去噪得分匹配\n\n某些情况下，我们希望拟合以下分布来正则化得分匹配\n\\begin{equation}\n\tp_{\\text{smoothed}}(\\Vx) = \\int p_{\\text{data}} (\\Vy) q( \\Vx \\mid \\Vy) d \\Vy\n\\end{equation}\n而不是拟合真实分布$p_{\\text{data}}$。\n分布$q(\\Vx \\mid \\Vy)$是一个损坏过程，通常在形成$\\Vx$的过程中会向$\\Vy$中添加少量噪声。\n\n\n去噪得分匹配非常有用，因为在实践中，通常我们不能获取真实的$p_{\\text{data}}$，而只能得到其样本确定的经验分布。\n给定足够容量，任何一致估计都会使$p_{\\text{model}}$成为一组以训练点为中心的\\,Dirac分布。\n考虑在\\sec?介绍的渐近一致性上的损失，通过$q$来平滑有助于缓解这个问题。\n{Kingma+LeCun-2010}介绍了平滑分布$q$为正态分布噪声的正则化得分匹配。\n\n\n回顾\\sec?，有一些自编码器训练算法等价于得分匹配或去噪得分匹配。\n因此，这些自编码器训练算法也是解决配分函数问题的一种方式。\n\n<!-- % -- 611 -- -->\n\n\n# 噪声对比估计\n\n具有难求解的配分函数的大多数模型估计都没有估计配分函数。\nSML\\,和\\,CD\\,只估计对数配分函数的梯度，而不是估计配分函数本身。\n得分匹配和伪似然避免了和配分函数相关的计算。 \n\n\n\\textbf{噪声对比估计}\\,（\\textbf{noise-contrastive estimation}，NCE）{cite?}采取了一种不同的策略。\n 在这种方法中，模型估计的概率分布被明确表示为\n\\begin{equation}\n\t\\log p_{\\text{model}} (\\RVx) = \\log \\tilde{p}_{\\text{model}} (\\RVx; \\Vtheta) + c,\n\\end{equation}\n其中$c$是$-\\log Z(\\Vtheta)$的近似。\n噪声对比估计过程将$c$视为另一参数，使用相同的算法同时估计$\\Vtheta$和$c$，而不是仅仅估计$\\Vtheta$，。\n因此，所得到的$\\log p_{\\text{model}}(\\RVx)$可能并不完全对应有效的概率分布，但随着$c$估计的改进，它将变得越来越接近有效值\\footnote{NCE~也适用于具有易于处理的，不需要引入额外参数$c$的配分函数的问题。它已经是最令人感兴趣的，估计具有复杂配分函数模型的方法。}。\n\n\n这种方法不可能使用最大似然作为估计的标准。\n最大似然标准可以设置$c$为任意大的值，而不是设置$c$以创建一个有效的概率分布。\n\n\nNCE~将估计$p(\\RVx)$的无监督学习问题转化为学习一个概率二元分类器，其中一个类别对应模型生成的数据。\n该监督学习问题中的最大似然估计定义了原始问题的渐近一致估计。\n\n\n具体地说，我们引入第二个分布，噪声分布 $p_{\\text{noise}}(\\RVx)$。\n噪声分布应该易于估计和从中采样。\n我们现在可以构造一个联合$\\RVx$和新二值变量$y$的模型。\n在新的联合模型中，我们指定\n\\begin{equation}\n\tp_{\\text{joint}} (y = 1) = \\frac{1}{2},\n\\end{equation}\n\\begin{equation}\n\tp_{\\text{joint}} (\\RVx \\mid y = 1) = p_{\\text{model}} (\\RVx),\n\\end{equation}\n和\n\\begin{equation}\n\tp_{\\text{joint}} (\\RVx \\mid y = 0) = p_{\\text{noise}}(\\RVx).\n\\end{equation}\n换言之，$y$是一个决定我们从模型还是从噪声分布中生成$\\RVx$的开关变量。\n\n<!-- % -- 612 -- -->\n\n我们可以在训练数据上构造一个类似的联合模型。\n在这种情况下，开关变量决定是从\\,\\textbf{数据}\\,还是从噪声分布中抽取$\\RVx$。\n正式地，$p_{\\text{train}}(y = 1) = \\frac{1}{2}$，$p_{\\text{train}}( \\RVx \\mid y = 1) = p_{\\text{data}}( \\RVx)$，和\n$p_{\\text{train}}(\\RVx \\mid y = 0) = p_{\\text{noise}}(\\RVx)$。\n\n\n现在我们可以应用标准的最大似然学习拟合$p_{\\text{joint}}$到$p_{\\text{train}}$的\\,\\textbf{监督}\\,学习问题：\n\\begin{equation}\n\t\\Vtheta, c = \\underset{ \\Vtheta, c}{\\arg\\max} \\SetE_{\\RVx, \\RSy \\sim p_{\\text{train}}} \\log \n\tp_{\\text{joint}} (y \\mid \\RVx).\n\\end{equation}\n\n\n分布$p_{\\text{joint}}$本质上是将逻辑回归模型应用于模型和噪声分布之间的对数概率之差：\n\\begin{equation}\n\tp_{\\text{joint}} (y = 1 \\mid \\RVx) = \\frac{ p_{\\text{model}}(\\RVx) }{ p_{\\text{model}}(\\RVx) + p_{\\text{noise}}(\\RVx) }\n\\end{equation}\n\\begin{equation}\n = \\frac{1}{1 + \\frac{ p_{\\text{noise}}(\\RVx) }{ p_{\\text{model}}(\\RVx) }}\n\\end{equation}\n\\begin{equation}\n= \\frac{1}{1 + \\exp \\left( \\log \\frac{ p_{\\text{noise}}(\\RVx) }{ p_{\\text{model}}(\\RVx) } \\right)}\n\\end{equation}\n\\begin{equation}\n\t= \\sigma \\left( - \\log \\frac{ p_{\\text{noise}} (\\RVx) }{ p_{\\text{model}} (\\RVx) } \\right)\n\\end{equation}\n\\begin{equation}\n\t= \\sigma ( \\log p_{\\text{model}} (\\RVx) - \\log p_{\\text{noise}} (\\RVx)  ) .\n\\end{equation}\n\n\n因此，只要$\\log \\tilde{p}_{\\text{model}}$易于反向传播，\n并且如上所述，$p_{\\text{noise}}$应易于估计（以便评估$p_{\\text{joint}}$）和采样（以生成训练数据），那么\\,NCE\\,就易于使用。\n\n\nNCE\\,能够非常成功地应用于随机变量较少的问题，但即使随机变量有很多可以取的值时，它也很有效。\n例如，它已经成功地应用于给定单词上下文建模单词的条件分布~{cite?}。\n虽然单词可以采样自一个很大的词汇表，但是只能采样一个单词。\n\n<!-- % -- 613 -- -->\n\n当\\,NCE\\,应用于具有许多随机变量的问题时，其效率会变得较低。\n当逻辑回归分类器发现某个变量的取值不大可能时，它会拒绝这个噪声样本。\n这意味着在$p_{\\text{model}}$学习了基本的边缘统计之后，学习进程会大大减慢。\n想象一个使用非结构化高斯噪声作为$p_{\\text{noise}}$来学习面部图像的模型。\n如果$p_{\\text{model}}$学会了眼睛，就算没有学习任何其他面部特征，比如嘴， 它也会拒绝几乎所有的非结构化噪声样本。\n<!-- % 614 head -->\n\n噪声分布~$p_{\\text{noise}}$必须是易于估计和采样的约束可能是过于严格的限制。\n当$p_{\\text{noise}}$比较简单时，大多数采样可能与数据有着明显不同，而不会迫使$p_{\\text{model}}$进行显著改进。\n\n\n类似于得分匹配和伪似然，如果$\\tilde{p}$只有下界，那么\\,NCE\\,不会有效。\n这样的下界能够用于构建$p_{\\text{joint}}( y = 1 \\mid \\RVx)$的下界，但是它只能用于构建$p_{\\text{joint}}(y = 0 \\mid \\RVx)$（出现在一半的\\,NCE\\,对象中）的上界。\n同样地，$p_{\\text{noise}}$的下界也没有用，因为它只提供了$p_{\\text{joint}}( y = 1 \\mid \\RVx)$的上界。\n\n\n在每个梯度步骤之前，模型分布被复制来定义新的噪声分布时，NCE\\,定义了一个被称为自对比估计的过程，其梯度期望等价于最大似然的梯度期望~{cite?}。\n特殊情况的\\,NCE（噪声采样由模型生成）表明最大似然可以被解释为使模型不断学习以将现实与自身发展的信念区分的过程，而噪声对比估计通过让模型区分现实和固定的基准（噪声模型），我们降低了计算成本。%??  以  是不是多余的？\n\n\n在训练样本和生成样本（使用模型能量函数定义分类器）之间进行分类以得到模型的梯度的方法，已经在更早的时候以各种形式提出来~{cite?}。\n\n\n噪声对比估计是基于良好生成模型应该能够区分数据和噪声的想法。\n一个密切相关的想法是，良好的生成模型能够生成分类器无法将其与数据区分的样本。\n这个想法诞生了生成式对抗网络（\\sec?）。\n\n\n\n# 估计配分函数\n\n尽管本章中的大部分内容都在避免计算与无向图模型相关的难以计算的配分函数 $Z(\\Vtheta)$，但在本节中我们将会讨论几种直接估计配分函数的方法。\n\n<!-- % -- 614 -- -->\n\n估计配分函数可能会很重要，当我们希望计算数据的归一化似然时，我们会需要它。\n在\\emph{评估}模型，监控训练性能，和比较模型时，这通常是很重要的。\n\n\n例如，假设我们有两个模型：概率分布为$p_A(\\RVx; \\Vtheta_A)= \\frac{1}{Z_A} \\tilde{p}_A(\\RVx; \\Vtheta_A)$的模型$\\CalM_A$和概率分布为$p_B(\\RVx; \\Vtheta_B)= \\frac{1}{Z_B} \\tilde{p}_B(\\RVx; \\Vtheta_B)$的模型$\\CalM_B$。\n比较模型的常用方法是评估和比较两个模型分配给独立同分布测试数据集的似然。\n假设测试集含$m$个样本$\\{ \\Vx^{(1)}, \\dots, \\Vx^{(m)} \\}$。\n如果 $\\prod_i p_A ( \\RSx^{(i)}; \\Vtheta_A) > \\prod_i p_B( \\RSx^{(i)}; \\Vtheta_B)$，或等价地，如果\n\\begin{equation}\n\t\\sum_i \\log p_A (\\RSx^{(i)}; \\Vtheta_A) - \\sum_i \\log p_B(\\RSx^{(i)}; \\Vtheta_B) > 0,\n\\end{equation}\n那么我们说$\\CalM_A$是一个比$\\CalM_B$更好的模型（或者，至少可以说，它在测试集上是一个更好的模型），这是指它有一个更好的测试对数似然。\n不幸的是，测试这个条件是否成立需要知道配分函数。\n\\eqn?看起来需要估计模型分配给每个点的对数概率，因而需要估计配分函数。\n我们可以通过将\\eqn?重新转化为另一种形式来简化情况，在该形式中我们只需要知道两个模型的配分函数的\\textbf{比率}：\n\\begin{equation}\n\t\\sum_i \\log p_A(\\RVx^{(i)}; \\Vtheta_A) - \\sum_i \\log p_B(\\RVx^{(i)}; \\Vtheta_B) =\n\t\\sum_i \\left(  \\log \\frac{ \\tilde{p}_A(\\RVx^{(i)}; \\Vtheta_A) }{ \\tilde{p}_B(\\RVx^{(i)}; \\Vtheta_B) } \\right)  - m\\log \\frac{Z(\\Vtheta_A)}{ Z(\\Vtheta_B) }.\n\\end{equation}\n因此，我们可以在不知道任一模型的配分函数，而只知道它们比率的情况下，判断模型$\\CalM_A$是否比模型$\\CalM_B$更优。\n正如我们将很快看到的，在两个模型相似的情况下，我们可以使用重要采样来估计比率。\n\n\n然而，如果我们想要计算测试数据在$\\CalM_A$或$\\CalM_B$上的真实概率，我们需要计算配分函数的真实值。\n如果我们知道两个配分函数的比率，$r = \\frac{Z(\\Vtheta_B)}{ Z(\\Vtheta_A) }$，并且我们知道两者中一个的实际值，比如说$Z(\\Vtheta_A)$，那么我们可以计算另一个的值：\n\\begin{equation}\n\tZ(\\Vtheta_B) = r Z(\\Vtheta_A) = \\frac{ Z(\\Vtheta_B) }{ Z(\\Vtheta_A) } Z(\\Vtheta_A).\n\\end{equation}\n\n\n一种估计配分函数的简单方法是使用蒙特卡罗方法，例如简单重要采样。\n以下用连续变量积分来表示该方法，也可以替换积分为求和，很容易将其应用到离散变量的情况。\n我们使用提议分布 $p_0(\\RVx) = \\frac{1}{Z_0} \\tilde{p}_0( \\RVx)$，其在配分函数 $Z_0$和未归一化分布$\\tilde{p}_0(\\RVx)$上易于采样和估计。\n\n<!-- % -- 615 -- -->\n\n\\begin{align}\n\tZ_1 &= \\int \\tilde{p}_1 (\\RVx) d \\RVx \\\\\n\t&= \\int  \\frac{ p_0(\\RVx) }{ p_0(\\RVx) }   \\tilde{p}_1 (\\RVx) d \\RVx \\\\\n\t&= Z_0 \\int  p_0(\\RVx)   \\frac{ \\tilde{p}_1 (\\RVx) }{ \\tilde{p}_0 (\\RVx) } d \\RVx \\\\\n\\end{align}\n\n在最后一行，我们使用蒙特卡罗估计，使用从$p_0(\\RVx)$中抽取的采样计算积分$\\hat{Z}_1$，然后用未归一化的$\\tilde{p}_1$和提议分布 $p_0$的比率对每个采样加权。\n\n\n这种方法使得我们可以估计配分函数之间的比率：\n\\begin{equation}\n\t\\frac{1}{K} \\sum_{k=1}^K \\frac{ \\tilde{p}_1 (\\RVx^{(k)}) }{ \\tilde{p}_0 (\\RVx^{(k)}) }\n\t\\quad\\quad \\text{s.t.}: \\RVx^{(k)} \\sim p_0.\n\\end{equation}\n然后该值可以直接比较\\eqn?中的两个模型。\n\n\n如果分布$p_0$接近$p_1$，那么\\eqn?能够有效地估计配分函数~{cite?}。\n不幸的是，大多数时候$p_1$都很复杂（通常是多峰值的），并且定义在高维空间中。\n很难找到一个易求解的$p_0$，既能易于评估，又能充分接近$p_1$以保持高质量的近似。\n如果$p_0$和$p_1$不接近，那么$p_0$的大多数采样将在$p_1$中具有较低的概率，从而在\\eqn?的求和中产生（相对的）可忽略的贡献。\n\n\n如果求和中只有少数几个具有显著权重的样本，那么将会由于高方差而导致估计的效果很差。\n这可以通过估计$\\hat{Z}_1$的方差来定量地理解：\n\\begin{equation}\n\t\\hat{\\text{Var}} \\left( \\hat{Z}_1 \\right)  = \\frac{Z_0 }{K^2} \\sum_{k=1}^K\n\\left(  \\frac{ \\tilde{p}_1(\\RVx^{(k)}) }{  \\tilde{p}_0(\\RVx^{(k)}) } - \\hat{Z}_1  \\right)^2.\n\\end{equation}\n当重要性权重$\\frac{ \\tilde{p}_1(\\RVx^{(k)}) }{ \\tilde{p}_0(\\RVx^{(k)}) } $存在显著偏差时，上式的值是最大的。\n\n<!-- % -- 616 -- -->\n\n我们现在关注两个解决高维空间复杂分布上估计配分函数的方法：\n退火重要采样和桥式采样。\n两者都始于上面介绍的简单重要采样方法，并且都试图通过引入\\emph{缩小}$p_0$和$p_1$之间\\emph{差距}的中间分布，来解决$p_0$远离$p_1$的问题。\n\n\n\n## 退火重要采样\n\n在$D_{KL}(p_0 \\| p_1)$很大的情况下（即$p_0$和$p_1$之间几乎没有重叠），一种称为\\textbf{退火重要采样}（\\textbf{annealed importance sampling}，AIS）的方法试图通过引入中间分布来缩小这种差距~{cite?}。\n考虑分布序列$p_{\\eta_0},\\dots,p_{\\eta_n}$，其中$0=\\eta_0 < \\eta_1 < \\dots < \\eta_{n-1} < \\eta_n = 1$，分布序列中的第一个和最后一个分别是$p_0$和$p_1$。\n\n\n这种方法使我们能够估计定义在高维空间多峰分布（例如训练~RBM~时定义的分布）上的配分函数。\n我们从一个已知配分函数的简单模型（例如，权重为零的\\,RBM）开始，估计两个模型配分函数之间的比率。\n该比率的估计基于许多个相似分布的比率估计，例如在零和学习到的权重之间插值一组权重不同的\\,RBM。\n\n\n现在我们可以将比率$\\frac{Z_1}{Z_0}$写作\n\\begin{align}\n\\frac{Z_1}{Z_0} &= \\frac{Z_1}{Z_0} \\frac{Z_{\\eta_1}}{Z_{\\eta_1}} \\dots \\frac{Z_{\\eta_{n-1}}}{Z_{\\eta_{n-1}}} \\\\\n&= \\frac{Z_{\\eta_1}}{Z_{0}}  \\frac{Z_{\\eta_2}}{Z_{\\eta_1}}  \\dots \\frac{Z_{\\eta_{n-1}}}{Z_{\\eta_{n-2}}} \\frac{Z_{1}}{Z_{\\eta_{n-1}}} \\\\\n\\end{align}\n如果对于所有的$0 \\leq j \\leq n-1$，分布$p_{\\eta_j}$和$p_{\\eta_{j+1}}$足够接近，那么我们能够使用简单的重要采样来估计每个因子$\\frac{Z_{\\eta_{j+1}}}{ Z_{\\eta_j}}$，然后使用这些得到$\\frac{Z_1}{Z_0}$的估计。\n\n<!-- % -- 617 -- -->\n\n这些中间分布是从哪里来的呢？\n正如最先的提议分布 $p_0$是一种设计选择，分布序列$p_{\\eta_1} \\dots p_{\\eta_{n-1}}$也是如此。\n也就是说，它们可以被特别设计为特定的问题领域。\n中间分布的一个通用和流行选择是使用目标分布$p_1$的加权几何平均，起始分布（其配分函数是已知的）为$p_0$：\n\\begin{equation}\n\tp_{\\eta_j} \\propto p_1^{\\eta_j} p_0^{1-\\eta_j}.\n\\end{equation}\n\n\n为了从这些中间分布中采样，我们定义了一组马尔可夫链转移函数$T_{\\eta_j}(\\Vx' \\mid \\Vx)$，定义了给定$\\Vx$转移到$\\Vx'$的条件概率分布。\n转移算子$T_{\\eta_j}(\\Vx' \\mid \\Vx)$定义如下，保持$p_{\\eta_j}(\\Vx)$不变：\n\\begin{equation}\n\tp_{\\eta_j}(\\Vx) = \\int p_{\\eta_j} (\\Vx') T_{\\eta_j} (\\Vx \\mid \\Vx') d\\Vx'.\n\\end{equation}\n这些转移可以被构造为任何马尔可夫链蒙特卡罗方法（例如，Metropolis-Hastings，Gibbs），包括涉及多次遍历所有随机变量或其他迭代的方法。\n\n\n然后，AIS\\,采样方法从$p_0$开始生成样本，并使用转移算子从中间分布顺序地生成采样，直到我们得到目标分布$p_1$的采样：\n\n+ 对于 $k=1 \\dots K$ \n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_1}^{(k)} \\sim p_0(\\RVx) $\n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_2}^{(k)} \\sim T_{\\eta_1}(\\RVx_{\\eta_2}^{(k)} \\mid \\Vx_{\\eta_1}^{(k)} ) $\n\t\t\\newline\n\t\t\\quad\\quad -- $\\dots$\n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_{n-1}}^{(k)} \\sim T_{\\eta_{n-2}}(\\RVx_{\\eta_{n-1}}^{(k)} \\mid \\Vx_{\\eta_{n-2}}^{(k)} ) $\n\t\t\\newline\n\t\t\\quad\\quad -- 采样 $ \\Vx_{\\eta_n}^{(k)} \\sim T_{\\eta_{n-1}}(\\RVx_{\\eta_n}^{(k)} \\mid \\Vx_{\\eta_{n-1}}^{(k)} ) $\n+ 结束\n\n\n\n对于采样$k$，通过连接\\eqn?给出的中间分布之间的重要性权重，我们可以导出目标重要性权重：\n\\begin{equation}\n\tw^{(k)} = \\frac{ \\tilde{p}_{\\eta_1} ( \\Vx_{\\eta_1}^{(k)} )  }{  \\tilde{p}_{0} ( \\Vx_{\\eta_1}^{(k)} )  }\n\\frac{ \\tilde{p}_{\\eta_2} ( \\Vx_{\\eta_2}^{(k)} )  }{  \\tilde{p}_{\\eta_1} ( \\Vx_{\\eta_2}^{(k)} )  }\n\\dots\n\\frac{ \\tilde{p}_{1} ( \\Vx_{1}^{(k)} )  }{  \\tilde{p}_{\\eta_{n-1}} ( \\Vx_{\\eta_n}^{(k)} )  } .\n\\end{equation}\n为了避免诸如上溢的数值问题，最佳方法可能是通过加法或减法计算$\\log w^{(k)}$，而不是通过概率乘法和除法计算$w^{(k)}$。\n\n<!-- % -- 618 -- -->\n\n利用由此定义的采样过程和\\eqn?中给出的重要性权重，配分函数的比率估计如下所示：\n\\begin{equation}\n\t\\frac{Z_1}{Z_0} \\approx \\frac{1}{K} \\sum_{k=1}^K w^{(k)}\n\\end{equation}\n\n\n为了验证该过程定义的重要采样方案是否有效，我们可以展示{cite?}~AIS~过程对应着扩展状态空间上的简单重要采样，其中数据点采样自乘积空间$[\\Vx_{\\eta_1},\\dots,\\Vx_{\\eta_{n-1}},\\Vx_1]$。\n为此，我们将扩展空间上的分布定义为\n\\begin{align}\n&\\tilde{p} (\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1) \\\\\n= &\\tilde{p}_1 (\\Vx_1) \\tilde{T}_{\\eta_{n-1}} (\\Vx_{\\eta_{n-1}} \\mid \\Vx_1)\n \t\\tilde{T}_{\\eta_{n-2}}  (\\Vx_{\\eta_{n-2}} \\mid \\Vx_{\\eta_{n-1}}) \\dots\n\\end{align}\n其中$\\tilde{T}_a$是由$T_a$定义的转移算子的逆（应用贝叶斯规则）：\n\\begin{equation}\n\t\\tilde{T}_a (\\Vx' \\mid \\Vx) = \\frac{p_a(\\Vx')}{ p_a(\\Vx) } T_a(\\Vx \\mid \\Vx') = \n\\frac{  \\tilde{p}_a(\\Vx')}{ \\tilde{p}_a(\\Vx) } T_a(\\Vx \\mid \\Vx') .\n\\end{equation}\n将以上代入到\\eqn?给出的扩展状态空间上的联合分布中，我们得到：\n\\begin{align}\n\t&\\tilde{p} (\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1) \\\\\n\t= &\\tilde{p}_1 (\\Vx_1) \\frac{ \\tilde{p}_{\\eta_{n-1}} (\\Vx_{\\eta_{n-1}})  }{ \\tilde{p}_{\\eta_{n-1}}(\\Vx_1)} T_{\\eta_{n-1}} (\\Vx_1 \\mid \\Vx_{\\eta_{n-1}})\n\\prod_{i=1}^{n-2} \\frac{ \\tilde{p}_{\\eta_i}(\\Vx_{\\eta_i}) }{ \\tilde{p}_{\\eta_i}(\\Vx_{\\eta_{i+1}})} T_{\\eta_i} (\\Vx_{\\eta_{i+1}} \\mid \\Vx_{\\eta_i}) \\\\\n\t= &\\frac{ \\tilde{p}_1(\\Vx_1) }{ \\tilde{p}_{\\eta_{n-1}}(\\Vx_1) } T_{\\eta_{n-1}} (\\Vx_1 \\mid \\Vx_{\\eta_{n-1}})\n\\end{align}\n通过上面给定的采样方案，现在我们可以从扩展样本上的联合提议分布 $q$上生成采样，联合分布如下\n\\begin{equation}\n\tq(\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1)  = p_0(\\Vx_{\\eta_1}) T_{\\eta_1}( \\Vx_{\\eta_2} \\mid \\Vx_{\\eta_1} ) \\dots T_{\\eta_{n-1}} (\\Vx_1 \\mid \\Vx_{\\eta_{n-1}}) .\n\\end{equation}\n\\eqn?给出了扩展空间上的联合分布。\n将$q(\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1)$作为扩展状态空间上的提议分布（我们会从中抽样），重要性权重如下\n\\begin{equation}\n\tw^{(k)} = \\frac{ \\tilde{p}(\\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1) }{ q( \\Vx_{\\eta_1}, \\dots, \\Vx_{\\eta_{n-1}}, \\Vx_1 ) } =\n\\frac{ \\tilde{p}_1(\\Vx_1^{(k)}) }{ \\tilde{p}_{\\eta_{n-1}}(\\Vx_{\\eta_{n-1}}^{(k)}) } \\dots\n\\frac{ \\tilde{p}_{\\eta_{2}}(\\Vx_{\\eta_{2}}^{(k)}) }{ \\tilde{p}_{\\eta_1}(\\Vx_{\\eta_{1}}^{(k)}) } \n\\frac{ \\tilde{p}_{\\eta_{1}}(\\Vx_{\\eta_{1}}^{(k)}) }{ \\tilde{p}_{0}(\\Vx_{0}^{(k)}) } .\n\\end{equation}\n这些权重和\\,AIS\\,上的权重相同。\n因此，我们可以将\\,AIS\\,解释为应用于扩展状态上的简单重要采样，其有效性直接来源于重要采样的有效性。\n\n<!-- % -- 619 -- -->\n\n退火重要采样首先由~{Jarzynski1997}发现，然后由~{Neal-2001}再次独立发现。\n目前它是估计无向概率模型的配分函数的最常用方法。\n其原因可能与一篇有影响力的论文~{cite?}有关，该论文并没有讨论该方法相对于其他方法的优点，而是介绍了将其应用于估计受限玻尔兹曼机和深度信念网络的配分函数。\n\n\n关于\\,AIS\\,估计性质（例如，方差和效率）的讨论，请参看~{Neal-2001}。\n\n\n\n## 桥式采样\n\n类似于\\,AIS，桥式采样~{cite?}是另一种处理重要采样缺点的方法。\n并非将一系列中间分布连接在一起，桥式采样依赖于单个分布$p_*$（被称为桥），在已知配分函数的分布$p_0$和分布$p_1$（我们试图估计其配分函数 $Z_1$）之间插值。\n\n\n桥式采样估计比率$Z_1 / Z_0$：$\\tilde{p}_0$和$\\tilde{p}_*$之间重要性权重期望与$\\tilde{p}_1$和$\\tilde{p}_*$之间重要性权重的比率，\n\\begin{equation}\n\t\\frac{Z_1}{ Z_0} \\approx \\sum_{k=1}^K \\frac{ \\tilde{p}_*(\\Vx_0^{(k)}) }{ \\tilde{p}_0(\\Vx_0^{(k)}) } \\bigg/ \\sum_{k=1}^K \\frac{ \\tilde{p}_*(\\Vx_1^{(k)}) }{ \\tilde{p}_1(\\Vx_1^{(k)}) } .\n\\end{equation}\n如果仔细选择桥式采样 $p_*$，使其与$p_0$和$p_1$都有很大重合的话，那么桥式采样能够允许两个分布（或更正式地，$D_{\\text{KL}}(p_0 \\| p_1)$）之间有较大差距（相对标准重要采样而言）。\n\n<!-- % -- 620 -- -->\n\n可以表明，最优的桥式采样是$p_*^{(opt)} (\\RVx) \\propto \\frac{ \\tilde{p}_0(\\Vx) \\tilde{p}_1(\\Vx) }{ r\\tilde{p}_0(\\Vx) + \\tilde{p}_1(\\Vx) }$，其中$r = Z_1 / Z_0$。\n这似乎是一个不可行的解决方案，因为它似乎需要我们估计数值$Z_1 / Z_0$。\n然而，可以从粗糙的$r$开始估计，然后使用得到的桥式采样逐步迭代以改进估计~{cite?}。\n也就是说，我们会迭代地重新估计比率，并使用每次迭代更新$r$的值。\n\n\n\\paragraph{链接重要采样}\nAIS\\,和桥式采样各有优点。\n如果$D_{\\text{KL}}(p_0 \\| p_1)$不太大（由于$p_0$和$p_1$足够接近）的话，那么桥式采样能比\\,AIS\\,更高效地估计配分函数比率。\n然而，如果对于单个分布$p_*$而言，两个分布相距太远难以桥接差距，那么\\,AIS\\,至少可以使用许多潜在中间分布来跨越$p_0$和$p_1$之间的差距。\n{Neal05estimatingratios}展示链接重要采样方法如何利用桥式采样的优点，桥接\\,AIS\\,中使用的中间分布，并且显著改进了整个配分函数的估计。\n\n\n\\paragraph{在训练期间估计配分函数}\n虽然\\,AIS\\,已经被认为是用于估计许多无向模型配分函数的标准方法，但是它在计算上代价很高，以致其在训练期间仍然不很实用。\n研究者探索了一些在训练过程中估计配分函数的替代方法。\n\n\n使用桥式采样、短链\\,AIS\\,和并行回火的组合，{Desjardins+al-NIPS2011}设计了一种在训练过程中追踪\\,RBM\\,配分函数的方法。\n该策略的基础是，在并行回火方法操作的每个温度下，RBM\\,配分函数的独立估计会一直保持。\n作者将相邻链（来自并行回火）的配分函数比率的桥式采样估计和跨越时间的\\,AIS\\,估计组合起来，提出一个在每次迭代学习时估计配分函数的（且方差较小的）方法。\n\n\n本章中描述的工具提供了许多不同的方法，以解决难处理的配分函数问题，但是在训练和使用生成模型时，可能会存在一些其他问题。\n其中最重要的是我们接下来会遇到的难以推断的问题。\n\n<!-- % -- 621 -- -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-19-Chapter19_approximate_inference.md",
    "content": "---\ntitle: 近似推断\nlayout: post\nshare: false\n---\n<!-- % 623 -->\n\n\n许多概率模型很难训练的原因是很难进行推断。\n在深度学习中，通常我们有一系列可见变量$\\Vv$和一系列潜变量 $\\Vh$。\n推断困难通常是指难以计算$p(\\Vh\\mid\\Vv)$或其期望。\n而这样的操作在一些诸如最大似然学习的任务中往往是必需的。\n\n<!-- % 623 -->\n\n许多仅含一个隐藏层的简单图模型会定义成易于计算$p(\\Vh\\mid\\Vv)$或其期望的形式，例如受限玻尔兹曼机和概率PCA。\n不幸的是，大多数具有多层隐藏变量的图模型的后验分布都很难处理。\n对于这些模型而言，精确推断算法需要指数量级的运行时间。\n即使一些只有单层的模型，如稀疏编码，也存在着这样的问题。\n<!-- % 623 -->\n\n\n在本章中，我们将会介绍几个用来解决这些难以处理的推断问题的技巧。\n稍后，在\\chap?中，我们还将描述如何将这些技巧应用到训练其他方法难以奏效的概率模型中，如深度信念网络、深度玻尔兹曼机。\n<!-- % 623 -->\n\n\n在深度学习中难以处理的推断问题通常源于结构化图模型中潜变量之间的相互作用。\n读者可以参考\\fig?的几个例子。\n这些相互作用可能是无向模型的直接相互作用，也可能是有向模型中同一个可见变量的共同祖先之间的\"相消解释\"作用。\n<!-- % 623 end -->\n\n\n\n<!-- % 624 head -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter19/figures/intractable_graphs}}\n\\fi\n\\caption{深度学习中难以处理的推断问题通常是由于结构化图模型中潜变量的相互作用。\n这些相互作用产生于一个潜变量与另一个潜变量或者当V-结构的子节点可观察时与更长的激活路径相连。\n\\emph{(左)}一个隐藏单元存在连接的半受限玻尔兹曼机~{cite?}。\n由于存在大量潜变量的团，潜变量的直接连接使得后验分布难以处理。\n\\emph{(中)}一个深度玻尔兹曼机，被分层从而使得不存在层内连接，由于层之间的连接其后验分布仍然难以处理。\n\\emph{(右)}当可见变量可观察时这个有向模型的潜变量之间存在相互作用，因为每两个潜变量都是共父。\n即使拥有上图中的某一种结构，一些概率模型依然能够获得易于处理的关于潜变量的后验分布。\n如果我们选择条件概率分布来引入相对于图结构描述的额外的独立性这种情况也是可能出现的。\n举个例子，概率PCA的图结构如右图所示，然而由于其条件分布的特殊性质（带有相互正交基向量的线性高斯条件分布）依然能够进行简单的推断。}\n\\end{figure}\n<!-- % 624 head -->\n\n\n\n\n# 把推断视作优化问题\n\n<!-- % 624 -->\n\n<!-- % 许多难以利用观察值进行精确推断的问题往往可以描述为一个优化问题。 -->\n精确推断问题可以描述为一个优化问题，有许多方法正是由此解决了推断的困难。\n通过近似这样一个潜在的优化问题，我们往往可以推导出近似推断算法。\n<!-- % 624 -->\n\n\n为了构造这样一个优化问题，假设我们有一个包含可见变量$\\Vv$和潜变量 $\\Vh$的概率模型。\n我们希望计算观察数据的对数概率$\\log p(\\Vv;\\Vtheta)$。\n有时候如果边缘化消去$\\Vh$的操作很费时，我们会难以计算$\\log p(\\Vv;\\Vtheta)$。\n作为替代，我们可以计算一个$\\log p(\\Vv;\\Vtheta)$的下界$\\CalL(\\Vv,{\\Vtheta},q)$。\n这个下界被称为证据下界。\n这个下界的另一个常用名称是负变分自由能。\n具体地，这个证据下界是这样定义的：\n<!-- % 625 head  -->\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q) = \\log p(\\Vv;{\\Vtheta}) - D_{\\text{KL}}(q(\\Vh\\mid\\Vv) \\Vert p(\\Vh\\mid\\Vv;{\\Vtheta})),\n\\end{align}\n其中$q$是关于$\\Vh$的一个任意概率分布。\n<!-- % 625 -->\n\n\n因为$\\log p(\\Vv)$和$\\CalL(\\Vv,{\\Vtheta},q)$之间的距离是由~KL散度来衡量的，且~KL散度总是非负的，我们可以发现$\\CalL$总是小于等于所求的对数概率。\n当且仅当分布$q$完全相等于$p(\\Vh\\mid\\Vv)$时取到等号。\n<!-- % 625 -->\n\n\n令人吃惊的是，对于某些分布$q$，计算$\\CalL$可以变得相当简单。\n通过简单的代数运算我们可以把$\\CalL$重写成一个更加简单的形式：\n\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q) = & \\log p(\\Vv;{\\Vtheta})- D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv;{\\Vtheta})) \\\\\n= & \\log p(\\Vv;{\\Vtheta}) - \\SetE_{\\RVh\\sim q}\\log \\frac{q(\\Vh\\mid\\Vv)}{p(\\Vh\\mid\\Vv)} \\\\\n= & \\log p(\\Vv;{\\Vtheta}) -  \\SetE_{\\RVh\\sim q} \\log \\frac{q(\\Vh\\mid\\Vv) }{ \\frac{p(\\Vh,\\Vv;{\\Vtheta})}{p(\\Vv; {\\Vtheta})} } \\\\\n= & \\log p(\\Vv; {\\Vtheta}) -  \\SetE_{\\RVh\\sim q} [\\log q(\\Vh\\mid\\Vv) - \\log {p(\\Vh,\\Vv; {\\Vtheta})} + \\log {p(\\Vv; {\\Vtheta})} ]\\\\\n= & - \\SetE_{\\RVh\\sim q}[\\log q(\\Vh\\mid\\Vv) - \\log {p(\\Vh,\\Vv;{\\Vtheta})}].\n\\end{align}\n<!-- % 625 -->\n这也给出了证据下界的标准定义：\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q) = \\SetE_{\\RVh\\sim q}[\\log p(\\Vh , \\Vv)] + H(q).\n\\end{align}\n\n\n对于一个选择的合适分布$q$来说，$\\CalL$是容易计算的。\n对任意分布$q$的选择来说，$\\CalL$提供了似然函数的一个下界。\n越好地近似$p(\\Vh\\mid\\Vv)$的分布$q(\\Vh\\mid\\Vv)$，得到的下界就越紧，换言之，就是与$\\log p(\\Vv)$更加接近。\n当$q(\\Vh\\mid\\Vv) = p(\\Vh\\mid\\Vv)$时，这个近似是完美的，也意味着$\\CalL(\\Vv,{\\Vtheta},q) = \\log {p(\\Vv;{\\Vtheta})} $。\n<!-- % 625 -->\n\n\n因此我们可以将推断问题看作是找一个分布$q$使得$\\CalL$最大的过程。\n精确推断能够在包含分布$p(\\Vh\\mid\\Vv)$的函数族中搜索一个函数，完美地最大化$\\CalL$。\n在本章中，我们将会讲到如何通过近似优化寻找分布$q$的方法来推导出不同形式的近似推断。\n我们可以通过限定分布$q$的形式或者使用并不彻底的优化方法来使得优化的过程更加高效（却更粗略），但是优化的结果是不完美的，\n不求彻底地最大化$\\CalL$，而只要显著地提升$\\CalL$。\n<!-- %因为只能显著地提升$\\CalL$而无法彻底地最大化$\\CalL$。 -->\n<!-- % 625  end -->\n\n\n无论我们选择什么样的分布$q$，$\\CalL$始终是一个下界。\n我们可以通过选择一个更简单或更复杂的计算过程来得到对应的更松或更紧的下界。\n通过一个不彻底的优化过程或者将分布$q$做很强的限定（并且使用一个彻底的优化过程）我们可以获得一个很差的分布$q$，但是降低了计算开销。\n<!-- % 626 head -->\n\n\n\n# 期望最大化\n\n<!-- % 626 -->\n\n我们介绍的第一个最大化下界$\\CalL$的算法是期望最大化算法。\n在潜变量模型中，这是一个非常常见的训练算法。\n在这里我们描述 {emview} 所提出的~EM~算法。\n与大多数我们在本章中介绍的其他算法不同的是，EM~并不是一个近似推断算法，而是一种能够学到近似后验的算法。\n<!-- % 626 -->\n\n\nEM算法由交替迭代，直到收敛的两步运算组成：\n\n+ E步: 令${\\Vtheta^{(0)}}$表示在这一步开始时的参数值。\n对任何我们想要训练的（对所有的或者小批量数据均成立）索引为$i$的训练样本$\\Vv^{(i)}$，令$q(\\Vh^{(i)}\\mid \\Vv) = p(\\Vh^{(i)}\\mid\\Vv^{(i)};\\Vtheta^{(0)})$。\n通过这个定义，我们认为$q$在\\emph{当前}参数$\\Vtheta^{(0)}$下定义。\n如果我们改变$\\Vtheta$，那么$p(\\Vh\\mid\\Vv;\\Vtheta)$将会相应地变化，但是$q(\\Vh\\mid\\Vv)$还是不变并且等于$p(\\Vh\\mid\\Vv;\\Vtheta^{(0)})$。\n+ M步：使用选择的优化算法完全地或者部分地关于$\\Vtheta$最大化\n\\begin{align}\n\\sum_i \\CalL(\\Vv^{(i)},\\Vtheta,q).\n\\end{align}\n\n<!-- % 626   -->\n\n\n这可以被看作通过坐标上升算法来最大化$\\CalL$。\n在第一步中，我们更新分布$q$来最大化$\\CalL$，而在另一步中，我们更新$\\Vtheta$来最大化$\\CalL$。\n<!-- % 626 -->\n\n\n基于潜变量模型的随机梯度上升可以被看作是一个~EM~算法的特例，其中~M步包括了单次梯度操作。\nEM~算法的其他变种可以实现多次梯度操作。\n对一些模型族来说，M步甚至可以直接推出解析解，不同于其他方法，在给定当前$q$的情况下直接求出最优解。\n<!-- % 626 end -->\n\n\n尽管E步采用的是精确推断，我们仍然可以将~EM~算法视作是某种程度上的近似推断。\n具体地说，M步假设一个分布$q$可以被所有的$\\Vtheta$值分享。\n当~M步越来越远离~E步中的$\\Vtheta^{(0)}$时，这将会导致$\\CalL$和真实的$\\log p(\\Vv)$之间出现差距。\n幸运的是，在进入下一个循环时，E步把这种差距又降到了$0$。\n<!-- % 627 head -->\n\n\n\nEM~算法还包含一些不同的见解。\n首先，它包含了学习过程的一个基本框架，就是我们通过更新模型参数来提高整个数据集的似然，其中缺失变量的值是通过后验分布来估计的。\n这种特定的性质并非~EM~算法独有的。\n例如，使用梯度下降来最大化对数似然函数的方法也有相同的性质。\n计算对数似然函数的梯度需要对隐藏单元的后验分布求期望。 \nEM~算法另一个关键的性质是当我们移动到另一个$\\Vtheta$时候，我们仍然可以使用旧的分布$q$。\n在传统机器学习中，这种特有的性质在推导大~M步更新时候得到了广泛的应用。\n在深度学习中，大多数模型太过于复杂以致于在最优大~M步更新中很难得到一个简单的解。\n所以~EM~算法的第二个特质，更多为其所独有，较少被使用。\n<!-- % 627 -->\n\n\n\n# 最大后验推断和稀疏编码\n\n<!-- % 627 -->\n\n\n我们通常使用推断这个术语来指代给定一些其他变量的情况下计算某些变量概率分布的过程。\n当训练带有潜变量的概率模型时，我们通常关注于计算$p(\\Vh\\mid\\Vv)$。\n另一种可选的推断形式是计算一个缺失变量的最可能值来代替在所有可能值的完整分布上的推断。\n在潜变量模型中，这意味着计算\n\\begin{align}\n\\Vh^* = \\underset{\\Vh}{\\arg\\max} \\ \\  p(\\Vh\\mid\\Vv).\n\\end{align}\n这被称作最大后验推断，简称~MAP~推断。\n<!-- % 627   -->\n\n\n\nMAP~推断并不被视作是一种近似推断，它只是精确地计算了最有可能的一个$\\Vh^*$。\n然而，如果我们希望设计一个最大化$\\CalL(\\Vv,\\Vh,q)$的学习过程，那么把~MAP~推断视作是输出一个$q$值的学习过程是很有帮助的。\n在这种情况下，我们可以将~MAP~推断视作是近似推断，因为它并不能提供一个最优的$q$。\n<!-- % 627 end -->\n\n\n\n我们回过头来看看\\sec?中所描述的精确推断，它指的是关于一个在无限制的概率分布族中的分布$q$使用精确的优化算法来最大化\n\\begin{align}\n\\CalL(\\Vv,{\\Vtheta},q)\n = \\SetE_{\\RVh\\sim q}[\\log p(\\Vh , \\Vv)] + H(q).\n\\end{align}\n我们通过限定分布$q$属于某个分布族，能够使得~MAP~推断成为一种形式的近似推断。\n具体地说，我们令分布$q$满足一个\\,Dirac分布：\n\\begin{align}\nq(\\Vh\\mid\\Vv) = \\delta(\\Vh - {\\Vmu}).\n\\end{align}\n这也意味着现在我们可以通过$\\Vmu$来完全控制分布$q$。\n将$\\CalL$中不随$\\Vmu$变化的项丢弃，我们只需解决一个优化问题：\n\\begin{align}\n\\Vmu^*  =  \\underset{\\Vmu}{\\arg\\max}\\ \\log p(\\Vh = \\Vmu,\\Vv),\n\\end{align}\n这等价于~MAP~推断问题\n\\begin{align}\n\\Vh^* = \\underset{\\Vh}{\\arg\\max}\\  p(\\Vh\\mid\\Vv).\n\\end{align}\n<!-- % 628 -->\n\n\n\n\n因此我们能够证明一种类似于~EM~算法的学习算法，其中我们轮流迭代两步，一步是用~MAP~推断估计出$\\Vh^*$，另一步是更新$\\Vtheta$来增大$\\log p(\\Vh^*,\\Vv)$。\n从~EM~算法角度看，这也是对$\\CalL$的一种形式的坐标上升，交替迭代时通过推断来优化关于$q$的$\\CalL$以及通过参数更新来优化关于$\\Vtheta$的$\\CalL$。\n作为一个整体，这个算法的正确性可以得到保证，因为$\\CalL$是$\\log p(\\Vv)$的下界。\n在~MAP~推断中，这个保证是无效的，因为~Dirac分布的微分熵趋近于负无穷，使得这个界会无限地松。\n然而，人为加入一些$\\Vmu$的噪声会使得这个界又有了意义。\n<!-- % 628 -->\n\n\nMAP~推断作为特征提取器以及一种学习机制被广泛地应用在了深度学习中。\n它主要用于稀疏编码模型中。\n<!-- % 628 -->\n\n\n我们回过头来看\\sec?中的稀疏编码，稀疏编码是一种在隐藏单元上加上了诱导稀疏性的先验知识的线性因子模型。\n一个常用的选择是可分解的Laplace先验，表示为\n\\begin{align}\n\tp(h_i) = \\frac{\\lambda}{2}  \\exp(-\\lambda \\vert h_i \\vert).\n\\end{align}\n可见的节点是由一个线性变化加上噪声生成的：\n\\begin{align}\np(\\Vv\\mid\\Vh) = \\CalN(\\Vv;{\\MW}\\Vh + \\Vb,\\beta^{-1}{\\MI}).\n\\end{align}\n<!-- % 628 end -->\n\n\n分布$p(\\Vh\\mid\\Vv)$难以计算，甚至难以表达。\n每一对$h_i$， $h_j$变量都是$\\Vv$的母节点。\n这也意味着当$\\Vv$可被观察时，图模型包含了一条连接$h_i$和$h_j$的活跃路径。\n因此$p(\\Vh \\mid\\Vv)$中所有的隐藏单元都包含在了一个巨大的团中。\n如果是高斯模型，那么这些相互作用关系可以通过协方差矩阵来高效地建模。\n然而稀疏型先验使得这些相互作用关系并不服从高斯分布。\n<!-- % 629 head -->\n\n\n分布$p(\\Vx\\mid\\Vh)$的难处理性导致了对数似然及其梯度也很难得到。\n因此我们不能使用精确的最大似然估计来进行学习。\n取而代之的是，我们通过~MAP~推断以及最大化由以$\\Vh$为中心的\\,Dirac分布所定义而成的~ELBO~来学习模型参数。\n<!-- % 629 -->\n\n\n如果我们将训练集中所有的向量$\\Vh$拼成矩阵$\\MH$，并将所有的向量$\\Vv$拼起来组成矩阵$\\MV$，那么稀疏编码问题意味着最小化\n\\begin{align}\n\tJ(\\MH,\\MW) = \\sum_{i,j}^{}\\vert H_{i,j}\\vert + \\sum_{i,j}^{}\\Big(\\MV - \\MH \\MW^{\\top}\\Big)^2_{i,j}.\n\\end{align}\n为了避免如极端小的$\\MH$和极端大的$\\MW$这样的病态的解，大多数稀疏编码的应用包含了权重衰减或者对$\\MH$列范数的限制。\n<!-- % 629 -->\n\n\n我们可以通过交替迭代，分别关于$\\MH$和$\\MW$最小化$J$的方式来最小化$J$。\n且两个子问题都是凸的。\n事实上，关于$\\MW$的最小化问题就是一个线性回归问题。\n然而关于这两个变量同时最小化$J$的问题通常并不是凸的。\n<!-- % 629 -->\n\n\n关于$\\MH$的最小化问题需要某些特别设计的算法，例如特征符号搜索方法~{cite?}。\n<!-- % 629 -->\n\n\n\n# 变分推断和变分学习\n\n<!-- % 629 -->\n\n\n我们已经说明过了为什么证据下界 $\\CalL(\\Vv,\\Vtheta,q)$是$\\log  p(\\Vv;\\Vtheta)$的一个下界、如何将推断看作是关于分布$q$最大化$\\CalL$ 的过程以及如何将学习看作是关于参数$\\Vtheta$最大化$\\CalL$的过程。\n我们也讲到了~EM~算法在给定了分布$q$的条件下能够进行大学习步骤，而基于~MAP~推断的学习算法则是学习一个$p(\\Vh \\mid \\Vv)$的点估计而非推断整个完整的分布。\n在这里我们介绍一些变分学习中更加通用的算法。\n<!-- % 629 -->\n\n<!-- %  在一个关于q的有约束的分布族上 -->\n变分学习的核心思想就是在一个关于$q$的有约束的分布族上最大化$\\CalL$。\n选择这个分布族时应该考虑到计算$\\SetE_q \\log p(\\Vh,\\Vv)$的难易度。\n一个典型的方法就是添加分布$q$如何分解的假设。\n<!-- % 630 head -->\n\n\n一种常用的变分学习的方法是加入一些限制使得$q$是一个因子分布：\n\\begin{align}\n\tq(\\Vh\\mid\\Vv) = \\prod_{i}^{}q(h_i \\mid \\Vv).\n\\end{align}\n这被称为均值场方法。\n更一般地说，我们可以通过选择分布$q$的形式来选择任何图模型的结构，通过选择变量之间相互作用的多少来灵活地决定近似程度的大小。\n这种完全通用的图模型方法被称为结构化变分推断 {cite?}。\n<!-- % 630  -->\n\n\n变分方法的优点是我们不需要为分布$q$设定一个特定的参数化形式。\n我们设定它如何分解，之后通过解决优化问题来找出在这些分解限制下最优的概率分布。\n对离散型潜变量来说，这意味着我们使用传统的优化技巧来优化描述分布$q$的有限个变量。\n对连续型潜变量来说，这意味着我们使用一个被称为变分法的数学分支工具来解决函数空间上的优化问题。\n然后决定哪一个函数来表示分布$q$。\n变分法是\"变分学习\"或者\"变分推断\"这些名字的来因，尽管当潜变量是离散时变分法并没有用武之地。\n当遇到连续型潜变量时，变分法不需要过多地人工选择模型，是一种很有用的工具。\n我们只需要设定分布$q$如何分解，而不需要去猜测一个特定的能够精确近似原后验分布的分布$q$。\n<!-- % 630  -->\n\n\n因为$\\CalL(\\Vv,\\Vtheta,q)$被定义成$\\log p(\\Vv;\\Vtheta) - D_{\\text{KL}} (q(\\Vh\\mid\\Vv) \\Vert  p(\\Vh\\mid\\Vv;\\Vtheta) )$，我们可以认为关于$q$最大化$\\CalL$的问题等价于（关于$q$）最小化$D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv))$。\n在这种情况下，我们要用$q$来拟合$p$。\n然而，与以前方法不同，我们使用~KL散度的相反方向来拟合一个近似。\n当我们使用最大似然估计来用模型拟合数据时，我们最小化$D_{\\text{KL}}(p_{\\text{data}} \\Vert p_{\\text{model}})$。\n如\\fig?所示，这意味着最大似然鼓励模型在每一个数据达到高概率的地方达到高概率，而基于优化的推断则鼓励了$q$在每一个真实后验分布概率低的地方概率较小。\n这两种基于~KL散度的方法都有各自的优点与缺点。\n选择哪一种方法取决于在具体每一个应用中哪一种性质更受偏好。\n在基于优化的推断问题中，从计算角度考虑，我们选择使用$D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv))$。\n具体地说，计算$D_{\\text{KL}}(q(\\Vh\\mid\\Vv)\\Vert p(\\Vh\\mid\\Vv))$涉及到了计算分布$q$下的期望。\n所以通过将分布$q$设计得较为简单，我们可以简化求所需要的期望的计算过程。\nKL散度的相反方向需要计算真实后验分布下的期望。\n因为真实后验分布的形式是由模型的选择决定的，所以我们不能设计出一种能够精确计算$D_{\\text{KL}}(p(\\Vh\\mid\\Vv) \\Vert q(\\Vh\\mid\\Vv))$的开销较小的方法。\n<!-- % 631 head -->\n\n\n\n\n\n## 离散型潜变量\n\n<!-- % 631  19.4.1 -->\n\n关于离散型潜变量的变分推断相对来说比较直接。\n我们定义一个分布$q$，通常分布$q$的每个因子都由一些离散状态的可查询表格定义。\n在最简单的情况中，$\\Vh$是二值的并且我们做了均值场假定，分布$q$可以根据每一个$h_i$分解。\n在这种情况下，我们可以用一个向量$\\hat{\\Vh}$来参数化分布$q$，$\\hat{\\Vh}$的每一个元素都代表一个概率，即$q(h_i = 1\\mid \\Vv) = \\hat{h}_i$。\n<!-- % 631 -->\n\n\n在确定了如何表示分布$q$以后，我们只需要优化它的参数。\n在离散型潜变量模型中，这是一个标准的优化问题。\n基本上分布$q$的选择可以通过任何优化算法解决，比如梯度下降算法。\n<!-- % 631 -->\n\n\n因为它在许多学习算法的内循环中出现，所以这个优化问题必须可以很快求解。\n为了追求速度，我们通常使用特殊设计的优化算法。\n这些算法通常能够在极少的循环内解决一些小而简单的问题。\n一个常见的选择是使用不动点方程，换句话说，就是解关于$\\hat{h}_i$的方程\n\\begin{equation}\n\\frac{\\partial}{\\partial \\hat{h}_i}\\CalL = 0.\n\\end{equation}\n我们反复地更新$\\hat{\\Vh}$不同的元素直到满足收敛准则。\n<!-- % 631 -->\n\n\n为了具体化这些描述，我们接下来会讲如何将变分推断应用到二值稀疏编码模型（这里我们所描述的模型是 {henniges2010binary} 提出的，但是我们采用了传统、通用的均值场方法，而原文作者采用了一种特殊设计的算法）中。\n数学推导过程非常详细，为希望完全了解我们描述过的变分推断和变分学习高级概念描述的读者所准备。\n而对于并不计划推导或者实现变分学习算法的读者来说，可以放心跳过，直接阅读下一节，这并不会遗漏新的高级概念。\n建议那些从事二值稀疏编码研究的读者可以重新看一下\\sec?中描述的一些经常在概率模型中出现的有用的函数性质。\n我们在推导过程中随意地使用了这些性质，并没有特别强调它们。\n<!-- % 632  head -->\n\n\n在二值稀疏编码模型中，输入$\\Vv\\in\\SetR^n$，是由模型通过添加高斯噪声到$m$个或有或无的不同成分的和而生成的。\n每一个成分可以是开或者关的，对应着隐藏单元~$\\Vh \\in\\{0,1\\}^m$:\n\\begin{align}\np(h_i = 1) &= \\sigma(b_i), \\\\\np(\\Vv\\mid\\Vh) &= \\CalN(\\Vv;\\MW \\Vh,{\\Vbeta}^{-1}),\n\\end{align}\n其中$\\Vb$是一个可以学习的偏置集合，$\\MW$是一个可以学习的权值矩阵，${\\Vbeta}$是一个可以学习的对角精度矩阵。\n<!-- % 632 -->\n\n\n使用最大似然来训练这样一个模型需要对参数进行求导。\n我们考虑对其中一个偏置进行求导的过程：\n\\begin{align}\n\t\t& \\frac{\\partial}{\\partial b_i} \\log p(\\Vv) \\\\\n\t\t= &  \\frac{\\frac{\\partial}{\\partial b_i} p(\\Vv)}{p(\\Vv)}\\\\\n\t\t= & \\frac{\\frac{\\partial}{\\partial b_i} \\sum_{\\Vh}^{} p(\\Vh,\\Vv)}{p(\\Vv)}\\\\\n\t\t= &  \\frac{\\frac{\\partial}{\\partial b_i} \\sum_{\\Vh}^{} p(\\Vh) p(\\Vv\\mid \\Vh)  }{p(\\Vv)}\\\\\n\t\t= &  \\frac{ \\sum_{\\Vh}^{}  p(\\Vv\\mid \\Vh) \\frac{\\partial}{\\partial b_i} p(\\Vh) }{p(\\Vv)}\\\\\n\t\t= &  \\sum_{\\Vh}^{}  p(\\Vh\\mid \\Vv) \\frac{  \\frac{\\partial}{\\partial b_i} p(\\Vh) }{p(\\Vh)}\\\\\n\t\t= & \\SetE_{\\RVh\\sim p(\\Vh\\mid\\Vv)} \\frac{\\partial}{\\partial b_i}\\log p(\\Vh).\n\\end{align}\n<!-- % 632 end -->\n\n\n这需要计算$p(\\Vh\\mid\\Vv)$下的期望。\n不幸的是，$p(\\Vh\\mid\\Vv)$是一个很复杂的分布。\n关于$p(\\Vh,\\Vv)$和$p(\\Vh\\mid\\Vv)$的图结构可以参考\\fig?。\n隐藏单元的后验分布对应的是关于隐藏单元的完全图，所以相对于暴力算法，变量消去算法并不能有助于提高计算期望的效率。\n<!-- % 633 head -->\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\t\\centerline{\\includegraphics{Chapter19/figures/bsc}}\n\\fi\n\\caption{包含四个隐藏单元的二值稀疏编码的图结构。\n\\emph{(左)}~$p(\\Vh,\\Vv)$的图结构。\n要注意边是有向的，每两个隐藏单元都是每个可见单元的共父。\n\\emph{(右)}~$p(\\Vh,\\Vv)$的图结构。\n为了解释共父之间的活跃路径，后验分布所有隐藏单元之间都有边。}\n\\end{figure}\n\n\n\n取而代之的是，我们可以应用变分推断和变分学习来解决这个难点。\n<!-- % 633 -->\n\n\n我们可以做一个均值场近似：\n\\begin{equation}\n\tq(\\Vh\\mid\\Vv) = \\prod_{i}^{}q(h_i\\mid\\Vv).\n\\end{equation}\n<!-- % 633 -->\n\n\n二值稀疏编码中的潜变量是二值的，所以为了表示可分解的$q$我们假设对$m$个~Bernoulli分布 $q(h_i\\mid\\Vv)$建模。\n表示~Bernoulli分布的一种很自然的方法是使用一个概率向量$\\hat{\\Vh}$，满足$q(h_i\\mid\\Vv) = \\hat{h}_i$。\n为了避免计算中的误差，比如说计算$\\log \\hat{h}_i$时，我们对$\\hat{h}_i$添加一个约束，即$\\hat{h}_i$不等于$0$或者$1$。\n<!-- % 633  -->\n\n\n我们将会看到变分推断方程理论上永远不会赋予$\\hat{h}_i\\ $ $0$或者$1$。\n然而在软件实现过程中，机器的舍入误差会导致$0$或者$1$的值。\n在二值稀疏编码的软件实现中，我们希望使用一个没有限制的变分参数向量$\\Vz$以及\n通过关系$\\hat{\\Vh} = \\sigma(\\Vz)$来获得$\\Vh$。\n因此通过使用等式$\\log \\sigma(z_i) = -\\zeta(-z_i)$来建立\\,sigmoid\\,函数和\\,softplus\\,函数的关系，我们可以放心地在计算机上计算$\\log \\hat{h}_i$。\n<!-- % 633 -->\n\n\n在开始二值稀疏编码模型中变分学习的推导时，我们首先说明了均值场近似的使用可以使得学习过程更加简单。\n<!-- % 633 end   -->\n\n\n证据下界可以表示为\n\\begin{align}\n& \\CalL(\\Vv,\\Vtheta,q)\\\\\n = & \\SetE_{\\RVh\\sim q}[\\log p(\\Vh,\\Vv)] + H(q)\\\\\n = & \\SetE_{\\RVh\\sim q}[\\log p(\\Vh) + \\log p(\\Vv\\mid\\Vh) - \\log q(\\Vh\\mid\\Vv)]\\\\\n= & \\SetE_{\\RVh\\sim q}\\Big[\\sum_{i=1}^{m}\\log p(h_i) + \\sum_{i=1}^{n} \\log p(v_i\\mid\\Vh) - \\sum_{i=1}^{m}\\log q(h_i\\mid\\Vv)\\Big]\\\\\n= &  \\sum_{i=1}^{m}\\Big[\\hat{h}_i(\\log \\sigma(b_i) - \\log \\hat{h}_i) + (1 - \\hat{h}_i)(\\log \\sigma(-b_i) - \\log (1-\\hat{h}_i))\\Big] \\\\\n& +  \\SetE_{\\RVh\\sim q} \\Bigg[ \\sum_{i=1}^{n}\\log \\sqrt{\\frac{\\beta_i}{2\\pi}}\\exp(-\\frac{\\beta_i}{2}(v_i - \\MW_{i,:}\\Vh)^2)\\Bigg] \\\\\n= &  \\sum_{i=1}^{m}\\Big[\\hat{h}_i(\\log \\sigma(b_i) - \\log \\hat{h}_i) + (1 - \\hat{h}_i)(\\log \\sigma(-b_i) - \\log (1-\\hat{h}_i))\\Big] \\\\\n& + \\frac{1}{2} \\sum_{i=1}^{n} \\Bigg[ \\log {\\frac{\\beta_i}{2\\pi}} - \\beta_i \\Bigg(v_i^2 - 2 v_i \\MW_{i,:}\\hat{\\Vh} + \\sum_{j}\\Big[W^2_{i,j}\\hat{h}_j + \\sum_{k \\neq j}W_{i,j}W_{i,k}\\hat{h}_j\\hat{h}_k \\Big] \\Bigg) \\Bigg]. \n\\end{align}\n<!-- % 634 head  -->\n尽管这些方程从美学观点来看有些不尽如人意。\n他们展示了$\\CalL$可以被表示为少量简单的代数运算。\n因此证据下界$\\,\\CalL$是易于处理的。\n我们可以把$\\CalL$看作是难以处理的对数似然函数的一个替代。\n<!-- % 634  head  -->\n\n\n原则上说，我们可以使用关于$\\Vv$和$\\Vh$的梯度上升。\n这会成为一个推断和学习算法的完美组合。%\\footnote{译者注：推断算法和学习算法的组合}\n但是，由于两个原因，我们往往不这么做。\n第一点，对每一个$\\Vv$我们需要存储$\\hat{\\Vh}$。\n我们通常更加偏向于那些不需要为每一个样本都准备内存的算法。\n如果我们需要为每一个样本都存储一个动态更新的向量，使得算法很难处理几十亿的样本。\n第二个原因就是为了能够识别$\\Vv$的内容，我们希望能够有能力快速提取特征$\\hat{\\Vh}$。\n在实际应用场景中，我们需要在有限时间内计算出$\\hat{\\Vh}$。\n<!-- % 634 -->\n\n\n由于以上两个原因，我们通常不会采用梯度下降来计算均值场参数$\\hat{\\Vh}$。\n取而代之的是，我们使用不动点方程来快速估计。\n<!-- % 634 -->\n\n\n不动点方程的核心思想是我们寻找一个关于$\\Vh$的局部极大点，满足$\\nabla_{\\Vh}\\CalL(\\Vv,\\Vtheta,\\hat{\\Vh}) = 0$。\n我们无法同时高效地计算所有$\\hat{\\Vh}$的元素。\n然而，我们可以解决单个变量的问题：\n\\begin{equation}\n\\frac{\\partial}{\\partial \\hat{h}_i} \\CalL(\\Vv,\\Vtheta,\\hat{\\Vh}) = 0 .\n\\end{equation}\n<!-- % 634 end   -->\n\n\n我们可以迭代地将这个解应用到$i = 1,\\ldots,m$，然后重复这个循环直到我们满足了收敛准则。\n常见的收敛准则包含了当整个循环所改进的$\\CalL$不超过预设的容差量时停止，或者是循环中改变的$\\hat{\\Vh}$不超过某个值时停止。\n<!-- % 635  head -->\n\n在很多不同的模型中，迭代的均值场不动点方程是一种能够提供快速变分推断的通用算法。\n为了使它更加具体，我们详细地讲一下如何推导出二值稀疏编码模型的更新过程。\n<!-- % 635 -->\n\n\n首先，我们给出了对$\\hat{h}_i$的导数表达式。\n为了得到这个表达式，我们将\\eqn?代入到\\eqn?的左边：\n\\begin{align}\n& \\frac{\\partial}{\\partial \\hat{h}_i} \\CalL (\\Vv,\\Vtheta,\\hat{\\Vh})    \\\\\n= & \\frac{\\partial}{\\partial \\hat{h}_i} \\Bigg[\\sum_{j=1}^{m}\\Big[\\hat{h}_j (\\log \\sigma(b_j) - \\log \\hat{h}_j) + (1 - \\hat{h}_j)(\\log \\sigma(-b_j) - \\log (1-\\hat{h}_j))\\Big] \\\\\n& + \\frac{1}{2} \\sum_{j=1}^{n} \\Bigg[ \\log {\\frac{\\beta_j}{2\\pi}} - \\beta_j \\Bigg(v_j^2 - 2 v_j \\MW_{j,:}\\hat{\\Vh} + \\sum_{k}\\Bigg[W^2_{j,k}\\hat{h}_k + \\sum_{l \\neq k}W_{j,k}W_{j,l}\\hat{h}_k\\hat{h}_l \\Bigg] \\Bigg) \\Bigg]\\Bigg] \\\\\n= & \\log \\sigma(b_i) - \\log \\hat{h}_i - 1 + \\log (1 - \\hat{h}_i ) + 1 - \\log \\sigma (- b_i ) \\\\\n & + \\sum_{j=1}^{n} \\Bigg[\\beta_j \\Bigg(v_j W_{j,i} - \\frac{1}{2} W_{j,i}^2 - \\sum_{k \\neq i} \\MW_{j,k}\\MW_{j,i} \\hat{h}_k\\Bigg) \\Bigg]\\\\\n = & b_i - \\log \\hat{h}_i + \\log (1 - \\hat{h}_i ) + \\Vv^{\\top} {\\Vbeta} \\MW_{:,i} - \\frac{1}{2} \\MW_{:,i}^{\\top} {\\Vbeta}\\MW_{:,i} -\\sum_{j\\neq i}\\MW^{\\top}_{:,j}{\\Vbeta}\\MW_{:,i}\\hat{h}_j.\n\\end{align}\n<!-- % 635   -->\n\n为了应用固定点更新的推断规则，我们通过令\\eqn?等于$0$来解$\\hat{h}_i$：\n\\begin{align}\n\\hat{h}_i = \\sigma\\Bigg(b_i + \\Vv^{\\top} {\\Vbeta} \\MW_{:,i} - \\frac{1}{2} \\MW_{:,i}^{\\top} {\\Vbeta} \\MW_{:,i} - \\sum_{j \\neq i }  \\MW_{:,j}^{\\top} {\\Vbeta}  \\MW_{:,i} \\hat{h}_j \\Bigg).\n\\end{align}\n<!-- % 635 end -->\n\n此时，我们可以发现图模型中的推断和循环神经网络之间存在着紧密的联系。\n具体地说，均值场不动点方程定义了一个循环神经网络。\n这个神经网络的任务就是完成推断。\n我们已经从模型描述的角度介绍了如何推导这个网络，但是直接训练这个推断网络也是可行的。\n有关这种思路的一些想法在\\chap?中有所描述。\n<!-- % 636  head  -->\n\n\n在二值稀疏编码模型中，我们可以发现\\eqn?中描述的循环网络连接包含了根据相邻隐藏单元变化值来反复更新当前隐藏单元的操作。   %?? 连接  换成 （和图模型推断的相关联系）     \n输入层通常给隐藏单元发送一个固定的信息$\\Vv^{\\top}\\beta\\MW$，然而隐藏单元不断地更新互相传送的信息。\n具体地说，当$\\hat{h}_i$和$\\hat{h}_j$两个单元的权重向量平行时，它们会互相抑制。\n这也是一种形式的竞争——两个解释输入的隐藏单元之间，只有一个解释得更好的才被允许继续保持活跃。\n在二值稀疏编码的后验分布中，均值场近似试图捕获到更多的相消解释相互作用，从而产生了这种竞争。   %?? 捕获  换成  反应，\n事实上，相消解释效应会产生一个多峰值的后验分布，以致于如果我们从后验分布中采样，一些样本在一个单元是活跃的，其他的样本在另一个单元活跃，只有很少的样本能够两者都处于活跃状态。\n不幸的是，相消解释作用无法通过均值场中因子分布$q$来建模，因此建模时均值场近似只能选择一个峰值。\n这个现象的一个例子可以参考\\fig?。\n<!-- % 636 -->\n\n\n\n\n我们将\\eqn?重写成等价的形式来揭示一些深层的含义：\n\\begin{align}\n\\hat{h}_i = \\sigma\\Bigg(b_i + \\Big(\\Vv - \\sum_{j\\neq i} \\MW_{:,j}\\hat{h}_j\\Big)^{\\top} {\\Vbeta}\\MW_{:,i} - \\frac{1}{2} \\MW_{:,i}^{\\top} {\\Vbeta} \\MW_{:,i}\\Bigg). \n\\end{align}\n在这种新的形式中，我们可以将$\\Vv - \\sum_{j\\neq i} \\MW_{:,j}\\hat{h}_j$看作是输入，而不是$\\Vv$。\n因此，我们可以把第$i$个单元视作给定其他单元编码时给$\\Vv$中的剩余误差编码。\n由此我们可以将稀疏编码视作是一个迭代的自编码器，将输入反复地编码解码，试图在每一轮迭代后都能修复重构中的误差。\n<!-- % 636 -->\n\n\n在这个例子中，我们已经推导出了每一次更新单个结点的更新规则。\n如果能够同时更新更多的结点，那会更令人满意。\n某些图模型，比如深度玻尔兹曼机，我们可以同时解出$\\hat{\\Vh}$中的许多元素。\n不幸的是，二值稀疏编码并不适用这种块更新。\n取而代之的是，我们使用一种被称为衰减的启发式技巧来实现块更新。\n在衰减方法中，对$\\hat{\\Vh}$中的每一个元素我们都可以解出最优值，然后对于所有的值都在这个方向上移动一小步。\n这个方法不能保证每一步都能增加$\\CalL$，但是对于许多模型都很有效。\n关于在信息传输算法中如何选择同步程度以及使用衰减策略可以参考 {koller-book2009} 。\n % 637 head \n\n\n\n\n\n## 变分法\n\n<!-- % p 637 head   19.4.2  -->\n\n在继续介绍变分学习之前，我们有必要简单地介绍一种变分学习中重要的数学工具：变分法。\n<!-- % p 637 -->\n\n\n许多机器学习的技巧是基于寻找一个输入向量$\\Vtheta\\in\\SetR^n$来最小化函数$J(\\Vtheta)$，使得它取到最小值。\n这个步骤可以利用多元微积分以及线性代数的知识找到满足$\\nabla_{\\Vtheta} J(\\Vtheta) = 0$的临界点来完成。\n在某些情况下，我们希望能够解一个函数$f(\\Vx)$，比如当我们希望找到一些随机变量的概率密度函数时。\n正是变分法能够让我们完成这个目标。\n<!-- % p 637 -->\n\n\n\n函数$f$的函数被称为泛函 $J[f]$。\n正如我们许多情况下对一个函数求关于以向量的元素为变量的偏导数一样，我们可以使用泛函导数，\n即在任意特定的$\\Vx$值，对一个泛函 $J[f]$求关于函数$f(\\Vx)$的导数，这也被称为变分导数。\n泛函 $J$的关于函数$f$在点$\\Vx$处的泛函导数被记作$\\frac{\\delta}{\\delta f(x)}J$。\n<!-- % p 637 -->\n\n\n\n完整正式的泛函导数的推导不在本书的范围之内。\n对于我们的目标而言，了解可微分函数$f(\\Vx)$以及带有连续导数的可微分函数$g(y,\\Vx)$就足够了：\n\\begin{align}\n\t\\frac{\\delta}{\\delta f(\\Vx)} \\int g(f(\\Vx),\\Vx)d\\Vx = \\frac{\\partial}{\\partial y}g(f(\\Vx),\\Vx).\n\\end{align}\n为了使上述等式更加直观，我们可以把$f(\\Vx)$看作是一个有着无穷不可数多元素的向量，由一个实数向量$\\Vx$表示。\n在这里（看作是一个不完全的介绍），这种关系式中描述的泛函导数和向量$\\Vtheta\\in\\SetR^n$的导数相同：\n\\begin{align}\n\t\\frac{\\partial}{\\partial \\theta_i}\\sum_{j}^{}g(\\theta_j,j) = \\frac{\\partial}{\\partial \\theta_i}g(\\theta_i,i).\n\\end{align}\n在其他机器学习文献中的许多结果则使用了更为通用的欧拉-拉格朗日方程，\n它能够使得$g$不仅依赖于$f$的值，还依赖于$f$的导数。\n但是在本书中我们不需要这个通用版本。\n<!-- % p 637  end -->\n\n\n为了关于一个向量优化某个函数，我们求出了这个函数关于这个向量的梯度，然后找这个梯度中每一个元素都为$0$的点。\n类似地，我们可以通过寻找一个函数使得泛函导数的每个点都等于$0$从而来优化一个泛函。\n<!-- % p 638 head -->\n\n\n下面介绍一个该过程如何运行的例子，我们考虑寻找一个定义在$x\\in\\SetR$上的有最大微分熵的概率密度函数。\n我们回过头来看一下一个概率分布$p(x)$的熵，定义如下：\n\\begin{align}\n\tH[p] = - \\SetE_x \\log p(x).\n\\end{align}\n对于连续的值，这个期望可以被看作一个积分：\n\\begin{align}\n\tH[p] = - \\int p(x) \\log p(x) dx.\n\\end{align}\n<!-- % p 638 -->\n\n\n我们不能简单地仅仅关于函数$p(x)$最大化$H[p]$，因为那样的话结果可能不是一个概率分布。\n为了解决这个问题，我们需要使用一个拉格朗日乘子来添加一个分布$p(x)$积分值为$1$的约束。\n同样地，当方差增大时，熵也会无限制地增加。\n因此，寻找哪一个分布有最大熵这个问题是没有意义的。\n但是，在给定固定的方差$\\sigma^2$时，我们可以寻找一个最大熵的分布。\n最后，这个问题还是欠定的，因为在不改变熵的条件下一个分布可以被随意地改变。\n为了获得一个唯一的解，我们再加一个约束：分布的均值必须为$\\mu$。\n那么这个问题的拉格朗日泛函如下：\n\\begin{align}\n&\t\t\\CalL[p] =  \\lambda_1 \\Big(\\int p(x)dx - 1\\Big)  + \\lambda_2 (\\SetE[x] - \\mu) +  \\lambda_3 (\\SetE[(x-\\mu)^2] - \\sigma^2)  + H[p]\\\\\n& =  \\int \\Big(\\lambda_1 p(x) + \\lambda_2 p(x)x + \\lambda_3 p(x)(x-\\mu)^2 - p(x)\\log p(x) \\Big)dx - \\lambda_1 - \\mu \\lambda_2 - \\sigma^2\\lambda_3.\n\\end{align}\n<!-- % p 638    -->\n\n\n为了关于$p$最小化拉格朗日乘子，我们令泛函导数等于$0$：\n\\begin{align}\n\t\\forall x,\\ \\  \\frac{\\delta}{\\delta p(x)} \\CalL = \\lambda_1 + \\lambda_2 x + \\lambda_3(x-\\mu)^2 - 1 - \\log p(x) = 0 .\n\\end{align}\n<!-- % p 638  end  -->\n\n\n这个条件告诉我们$p(x)$的泛函形式。\n通过代数运算重组上述方程，我们可以得到\n\\begin{align}\n\tp(x) = \\exp\\big(\\lambda_1 + \\lambda_2 x + \\lambda_3 (x-\\mu)^2  - 1\\big).\n\\end{align}\n<!-- % p 638 end  -->\n\n\n我们并没有直接假设$p(x)$取这种形式，而是通过最小化泛函从理论上得到了这个$p(x)$的表达式。\n为了解决这个最小化问题，我们需要选择$\\lambda$的值来确保所有的约束都能够满足。\n我们有很大的自由去选择$\\lambda$。\n因为只要满足约束，拉格朗日关于$\\lambda$这个变量的梯度就为$0$。\n为了满足所有的约束，我们可以令$\\lambda_1 = 1 - \\log \\sigma\\sqrt{2\\pi}$,$\\lambda_2 = 0$, $\\lambda_3 = - \\frac{1}{2\\sigma^2}$，从而得到\n\\begin{align}\n\tp(x) = \\CalN(x;\\mu,\\sigma^2).\n\\end{align}\n这也是当我们不知道真实的分布时总是使用正态分布的一个原因。\n因为正态分布拥有最大的熵，我们通过这个假定来保证了最小可能量的结构。\n<!-- % 639 head -->\n\n\n\n当寻找熵的拉格朗日泛函的临界点并且给定一个固定的方差时，我们只能找到一个对应最大熵的临界点。\n那最小化熵的概率密度函数是什么样的呢？\n为什么我们无法发现对应着极小点的第二个临界点呢？\n原因是没有一个特定的函数能够达到最小的熵值。\n当函数把越多的概率密度加到$x = \\mu + \\sigma$和$x = \\mu - \\sigma$两个点上，越少的概率密度到其他点上时，它们的熵值会减少，而方差却不变。\n然而任何把所有的权重都放在这两点的函数的积分都不为$1$，不是一个有效的概率分布。\n所以不存在一个最小熵的概率密度函数，就像不存在一个最小的正实数一样。\n然而，我们发现存在一个收敛的概率分布的序列，收敛到权重都在两个点上。\n这种情况能够退化为混合Dirac分布。\n因为\\,Dirac分布并不是一个单独的概率密度函数，所以\\,Dirac分布或者混合\\,Dirac分布并不能对应函数空间的一个点。\n所以对我们来说，当寻找一个泛函导数为$0$的函数空间的点时，这些分布是不可见的。\n这就是这种方法的局限之处。\n诸如\\,Dirac分布这样的分布可以通过其他方法被找到，比如可以先猜测一个解，然后证明它是满足条件的。\n<!-- % 639  -->\n\n\n\n\n## 连续型潜变量\n\n<!-- % 639 end            19.4.3  -->\n\n\n当我们的图模型包含连续型潜变量时，我们仍然可以通过最大化$\\CalL$进行变分推断和变分学习。\n然而，我们需要使用变分法来实现关于$q(\\Vh\\mid\\Vv)$最大化$\\CalL$。\n<!-- % 639 end   -->\n\n\n<!-- % 640 head   -->\n在大多数情况下，研究者并不需要解决任何变分法的问题。\n取而代之的是，均值场固定点迭代更新有一个通用的方程。\n如果我们做了均值场近似：\n\\begin{align}\n\tq(\\Vh\\mid\\Vv) = \\prod_i q(h_i \\mid\\Vv),\n\\end{align}\n<!-- % 640 mid -->\n并且对任何的$j\\neq i$固定$q(h_j\\mid\\Vv)$，那么只需要满足分布$p$中任何联合分布变量的概率值不为$0$，我们就可以通过归一化下面这个未归一的分布\n\\begin{align}\n\t\\tilde{q}(h_i \\mid\\Vv) = \\exp \\big(\\SetE_{\\RVh_{-i}\\sim q(\\RVh_{-i}\\mid\\Vv)}\t\\log \\tilde{p}(\\Vv,\\Vh)\\big)\n\\end{align}\n<!-- % 640 mid -->\n来得到最优的$q(h_i\\mid\\Vv)$。\n在这个方程中计算期望就能得到正确的$q(h_i\\mid\\Vv)$的表达式。\n我们只有在希望提出一种新形式的变分学习算法时才需要使用变分法来直接推导$q$的函数形式。\n\\eqn?给出了适用于任何概率模型的均值场近似。\n<!-- % 640   -->\n\n\n\n\n<!-- % 640   -->\n\\eqn?是一个不动点方程，对每一个$i$它都被迭代地反复使用直到收敛。\n然而，它还包含着更多的信息。\n它还包含了最优解取到的泛函形式，无论我们是否能够通过不动点方程来解出它。\n这意味着我们可以利用方程中的泛函形式，把其中一些值当成参数，然后通过任何我们想用的优化算法来解决这个问题。\n\n\n<!-- % 640   -->\n我们拿一个简单的概率模型作为例子，其中潜变量满足$\\Vh\\in\\SetR^2$，可见变量只有一个$v$。\n假设$p(\\Vh) = \\CalN(\\Vh;0,\\MI)$以及$p(v\\mid\\Vh) = \\CalN(v;\\Vw^{\\top}\\Vh;1)$，我们可以积掉$\\Vh$来简化这个模型，结果是关于$v$的高斯分布。\n这个模型本身并不有趣。\n只是为了说明变分法如何应用在概率建模之中，我们才构造了这个模型。\n\n\n\n<!-- % 640  end -->\n忽略归一化常数时，真实的后验分布如下：\n\\begin{align}\n   & p(\\Vh\\mid\\Vv)\\\\\n \\propto & p(\\Vh, \\Vv)\\\\\n = & p(h_1) p(h_2) p(\\Vv\\mid\\Vh)\\\\\n \\propto & \\exp \\big(-\\frac{1}{2} [h_1^2 + h_2^2 + (v-h_1w_1 - h_2w_2)^2]\\big)\\\\\n = & \\exp \\big( - \\frac{1}{2} [h_1^2 + h_2^2 + v^2 + h_1^2w_1^2 + h_2^2w_2^2 - 2vh_1w_1 - 2vh_2w_2 + 2h_1w_1h_2w_2] \\big).\n\\end{align}\n在上式中，我们发现由于带有$h_1,h_2$乘积项的存在，真实的后验并不能关于$h_1,h_2$分解。\n<!-- % 641 head  -->\n\n\n\n应用\\eqn?，我们可以得到\n\\begin{align}\n& \\tilde{q}(h_1\\mid\\Vv)\\\\ \n= & \\exp\\big(\\SetE_{\\RSh_2\\sim q(\\RSh_2\\mid\\Vv)} \\log \\tilde{p}(\\Vv,\\Vh)\\big) \\\\\n= & \\exp\\Big( -\\frac{1}{2} \\SetE_{\\RSh_2\\sim q(\\RSh_2\\mid\\Vv)} [h_1^2 + h_2^2 + v^2 + h_1^2w_1^2 + h_2^2w_2^2 \\\\\n& -2vh_1w_1 - 2vh_2w_2 + 2h_1w_1h_2w_2]\\Big).\n\\end{align}\n<!-- % 641  -->\n从这里，我们可以发现其中我们只需要从$q(h_2\\mid \\Vv)$中获得两个有效值：\n$\\SetE_{\\RSh_2\\sim q(\\RSh\\mid\\Vv)}[h_2]$和$\\SetE_{\\RSh_2\\sim q(\\RSh\\mid\\Vv)}[h_2^2]$。\n把这两项记作$\\langle h_2 \\rangle$和$\\langle h_2^2 \\rangle$，我们可以得到：\n\\begin{align}\n\\tilde{q}(h_1\\mid\\Vv) = & \\exp(-\\frac{1}{2} [h_1^2 + \\langle h_2^2 \\rangle  + v^2 + h_1^2w_1^2 + \\langle h_2^2 \\rangle w_2^2 \n\\\\ &\t-2vh_1w_1 - 2v\\langle h_2 \\rangle w_2 + 2h_1w_1\\langle h_2 \\rangle w_2]).\t\n\\end{align}\n<!-- % 641  -->\n\n\n从这里，我们可以发现$\\tilde{q}$的泛函形式满足高斯分布。\n因此，我们可以得到$q(\\Vh\\mid\\Vv) = \\CalN(\\Vh;\\Vmu,\\Vbeta^{-1})$，其中$\\Vmu$和对角的$\\Vbeta$是变分参数，我们可以使用任何方法来优化它。\n<!-- %有必要再强调一下，我们并没有假设$q$是一个高斯分布，这个高斯的形式是使用变分法来最大化关于$\\CalL$的分布$q$\\footnote{此处似乎有笔误。}推导出的。    %?? 什么笔误啊。。。  最大化L关于q 还是 最大化q关于L -->\n有必要再强调一下，我们并没有假设$q$是一个高斯分布，这个高斯的形式是使用变分法来关于分布$q$最大化$\\CalL$而推导出来的。\n在不同的模型上应用相同的方法可能会得到不同泛函形式的分布$q$。\n<!-- % 641 -->\n\n当然，上述模型只是为了说明情况的一个简单例子。\n深度学习中关于变分学习中连续型变量的实际应用可以参考~{Goodfeli-et-al-TPAMI-Deep-PrePrint-2013-small}。\n<!-- % 641 -->\n\n\n\n\n## 学习和推断之间的相互作用\n\n<!-- % 641 end  19.4.4   -->\n\n\n在学习算法中使用近似推断会影响学习的过程，反过来学习的过程也会影响推断算法的准确性。\n<!-- % 641 end -->\n\n\n具体来说，训练算法倾向于朝使得近似推断算法中的近似假设变得更加真实的方向来适应模型。\n当训练参数时，变分学习增加\n\\begin{align}\n\t\\SetE_{\\RVh \\sim q}\\log p(\\Vv,\\Vh).\n\\end{align}\n<!-- % 642  -->\n对于一个特定的$\\Vv$，对于$q(\\Vh \\mid \\Vv)$中概率很大的$\\Vh$它增加了$p(\\Vh\\mid\\Vv)$；对于$q(\\Vh \\mid \\Vv)$中概率很小的$\\Vh$它减小了$p(\\Vh\\mid\\Vv)$。\n<!-- % 642 -->\n\n这种行为使得我们做的近似假设变得合理。 %这种行为使我们的近似假设成为自我实现。\n如果我们用单峰值近似后验来训练模型，那么所得具有真实后验的模型会比我们使用精确推断训练模型获得的模型更接近单峰值。  %?? \n<!-- % 642 -->\n\n\t\n因此，估计变分近似对模型的破坏程度是很困难的。\n存在几种估计$\\log p(\\Vv)$的方式。\n通常我们在训练模型之后估计$\\log p(\\Vv;\\Vtheta)$，然后发现它和$\\CalL(\\Vv,\\Vtheta,q)$的差距是很小的。\n从这里我们可以得出结论，对于特定的从学习过程中获得的$\\Vtheta$来说，变分近似是很准确的。\n然而我们无法直接得到变分近似普遍很准确或者变分近似几乎不会对学习过程产生任何负面影响这样的结论。\n为了准确衡量变分近似带来的危害，我们需要知道$\\Vtheta^* = \\max_{\\Vtheta} \\log p(\\Vv;\\Vtheta)$。\n$\\CalL(\\Vv,\\Vtheta,q)\\approx \\log p(\\Vv;\\Vtheta)$和$\\log p(\\Vv;\\Vtheta)\\ll \\log p(\\Vv;\\Vtheta^*)$同时成立是有可能的。\n如果存在$\\max_q \\CalL(\\Vv,\\Vtheta^*,q)\\ll \\log p(\\Vv;\\Vtheta^*)$，即在$\\Vtheta^*$点处后验分布太过复杂使得$q$分布族无法准确描述，那么学习过程永远无法到达$\\Vtheta^*$。\n这样的一类问题是很难发现的，因为只有在我们有一个能够找到$\\Vtheta^*$的较好的学习算法时，才能确定地进行上述的比较。\n<!-- % 642 -->\n\n\n\n\n# 学成近似推断\n\n<!-- % 642  end    19.5 -->\n\n我们已经看到了推断可以被视作一个增加函数$\\CalL$值的优化过程。\n显式地通过迭代方法（比如不动点方程或者基于梯度的优化算法）来进行优化的过程通常是代价很高且耗时巨大的。\n通过学习一个近似推断，许多推断算法避免了这种代价。\n具体地说，我们可以将优化过程视作将一个输入$\\Vv$投影到一个近似分布$q^* = \\arg\\max_q\\  \\CalL(\\Vv,q)$的一个$f$的函数。\n一旦我们将多步的迭代优化过程看作是一个函数，我们可以用一个近似函数为$\\hat{f}(\\Vv;{\\Vtheta})$的神经网络来近似它。\n\n\n\n## 醒眠算法\n  \n<!-- %?? wake_sleep 翻译成  醒眠  你斟酌下 -->\n<!-- % 643 head 19.5.1 -->\n\n训练一个可以用$\\Vv$来推断$\\Vh$的模型的一个主要难点在于我们没有一个监督训练集来训练模型。\n给定一个$\\Vv$，我们无法获知一个合适的$\\Vh$。\n从$\\Vv$到$\\Vh$的映射依赖于模型族的选择，并且在学习过程中随着${\\Vtheta}$的改变而变化。\n醒眠算法~{cite?}通过从模型分布中抽取$\\Vv$和$\\Vh$的样本来解决这个问题。\n例如，在有向模型中，这可以通过执行从$\\Vh$开始并在$\\Vv$结束的原始采样来高效地完成。\n然后这个推断网络可以被训练来执行反向的映射：预测哪一个$\\Vh$产生了当前的$\\Vv$。\n<!-- %这种方法的主要缺点是我们将只能够训练推断网络在模型下具有高概率的$\\Vv$值。 -->\n这种方法的主要缺点是我们将只能在那些在当前模型上有较高概率的$\\Vv$值上训练推断网络。\n在学习早期，模型分布与数据分布偏差较大，因此推断网络将不具有在类似数据的样本上学习的机会。\n<!-- % 643 mid -->\n\n\n在\\sec?中，我们看到睡眠做梦在人类和动物中作用的一个可能解释是，做梦可以提供蒙特卡罗训练算法用于近似无向模型中对数配分函数负梯度的负相样本。\n生物做梦的另一个可能解释是它提供来自$p(\\Vh,\\Vv)$的样本，这可以用于训练推断网络在给定$\\Vv$的情况下预测$\\Vh$。\n在某些意义上，这种解释比配分函数的解释更令人满意。\n如果蒙特卡罗算法仅使用梯度的正相运行几个步骤，然后仅对梯度的负相运行几个步骤，那么结果通常不会很好。\n人类和动物通常连续清醒几个小时，然后连续睡着几个小时。\n这个时间表如何支持无向模型的蒙特卡罗训练尚不清楚。\n然而，基于最大化$\\CalL$的学习算法可以通过长时间调整改进$q$和长期调整${\\Vtheta}$来实现。\n如果生物做梦的作用是训练网络来预测$q$，那么这解释了动物如何能够保持清醒几个小时\n（它们清醒的时间越长，$\\CalL$和$\\log p(\\Vv)$之间的差距越大， 但是$\\CalL$仍然是下限）\n并且睡眠几个小时（生成模型本身在睡眠期间不被修改）， 而不损害它们的内部模型。\n当然，这些想法纯粹是猜测性的，没有任何确定的证据表明做梦实现了这些目标之一。\n做梦也可以通过从动物的过渡模型（用来训练动物策略）采样合成经验来服务于强化学习而不是概率建模。\n也许睡眠可以服务于一些机器学习社区尚未发现的其他目的。\n<!-- % 644 head -->\n\n\n\n\n## 学成推断的其他形式\n\n<!-- % 644    19.5.2  -->\n\n这种学成近似推断策略已经被应用到了其他模型中。\n{Salakhutdinov+Larochelle-2010}证明了在学成推断网络中的单遍传递相比于在深度玻尔兹曼机中的迭代均值场不动点方程能够得到更快的推断。\n其训练过程是基于运行推断网络的，然后运行一步均值场来改进其估计，并训练推断网络来输出这个更精细的估计以代替其原始估计。\n<!-- % 644 -->\n\n\n我们已经在\\sec?中看到，预测性的稀疏分解模型训练一个浅层编码器网络，从而预测输入的稀疏编码。\n这可以被看作是自编码器和稀疏编码之间的混合。\n为模型设计概率语义是可能的，其中编码器可以被视为执行学成近似~MAP~推断。\n由于其浅层的编码器，PSD不能实现我们在均值场推断中看到的单元之间的那种竞争。\n然而，该问题可以通过训练深度编码器实现学成近似推断来补救，如ISTA技术~{cite?}。\n<!-- % 644 -->\n\n\n近来学成近似推断已经成为了变分自编码器形式的生成模型中的主要方法之一 {cite?}。\n在这种优美的方法中，不需要为推断网络构造显式的目标。\n反之，推断网络仅仅被用来定义$\\CalL$，然后调整推断网络的参数来增大$\\CalL$。\n我们将在\\sec?中详细介绍这种模型。\n<!-- % 644 -->\n\n我们可以使用近似推断来训练和使用很多不同的模型。\n其中许多模型将在下一章中描述。\n<!-- % 644 -->\n\n"
  },
  {
    "path": "docs/_posts/2016-12-20-Chapter20_deep_generative_models.md",
    "content": "---\ntitle: 深度生成模型\nlayout: post\nshare: false\n---\n在本章中，我们介绍几种具体的生成模型，这些模型可以使用\\chap?至\\chap?中出现的技术构建和训练。\n所有这些模型在某种程度上都代表了多个变量的概率分布。\n有些模型允许显式地计算概率分布函数。\n其他模型则不允许直接评估概率分布函数，但支持隐式获取分布知识的操作，如从分布中采样。\n这些模型中的一部分使用\\chap?中的图模型语言，从图和因子的角度描述为结构化概率模型。\n其他的不能简单地从因子角度描述，但仍然代表概率分布。\n\n\n\n# 玻尔兹曼机\n\n玻尔兹曼机最初作为一种广义的\"联结主义\"引入，用来学习二值向量上的任意概率分布~{cite?}。\n玻尔兹曼机的变体（包含其他类型的变量）早已超过了原始玻尔兹曼机的流行程度。\n在本节中，我们简要介绍二值玻尔兹曼机并讨论训练模型和进行推断时出现的问题。\n\n我们在$d$维二值随机向量$\\Vx \\in \\{0, 1\\}^d$上定义玻尔兹曼机。\n玻尔兹曼机是一种基于能量的模型（\\sec?），意味着我们可以使用能量函数定义联合概率分布：\n P(\\Vx) = \\frac{\\exp(-E(\\Vx))}{Z},\n\\end{align}\n其中$E(\\Vx)$是能量函数，$Z$是确保$\\sum_{\\Vx} P(\\Vx)=1$的配分函数。\n玻尔兹曼机的能量函数如下\n给出：\n E(\\Vx) = -\\Vx^\\top \\MU \\Vx - \\Vb^\\top \\Vx,\n\\end{align}\n其中$\\MU$是模型参数的\"权重\"矩阵，$\\Vb$是偏置向量。\n\n<!-- % -- 645 -- -->\n\n在一般设定下，给定一组训练样本，每个样本都是$n$维的。\n\\eqn?描述了观察到的变量的联合概率分布。\n虽然这种情况显然可行，但它限制了观察到的变量和权重矩阵描述的变量之间相互作用的类型。\n具体来说，这意味着一个单元的概率由其他单元值的线性模型（逻辑回归）给出。\n\n当不是所有变量都能被观察到时，玻尔兹曼机变得更强大。\n在这种情况下，潜变量类似于多层感知机中的隐藏单元，并模拟可见单元之间的高阶交互。\n正如添加隐藏单元将逻辑回归转换为~MLP，导致~MLP~成为函数的万能近似器，具有隐藏单元的玻尔兹曼机不再局限于建模变量之间的线性关系。\n相反，玻尔兹曼机变成了离散变量上概率质量函数的万能近似器 {cite?}。\n\n\n正式地，我们将单元$\\Vx$分解为两个子集：可见单元$\\Vv$和潜在（或隐藏）单元$\\Vh$。\n能量函数变为\n\\begin{align}\n E(\\Vv, \\Vh) = -\\Vv^\\top \\MR \\Vv - \\Vv^\\top \\MW \\Vh - \\Vh^\\top \\MS \\Vh - \\Vb^\\top \\Vv - \\Vc^\\top \\Vh.\n\\end{align}\n\\paragraph{玻尔兹曼机的学习}玻尔兹曼机的学习算法通常基于最大似然。\n所有玻尔兹曼机都具有难以处理的配分函数，因此最大似然梯度必须使用\\chap?中的技术来近似。\n\n<!-- % -- 646 -- -->\n\n玻尔兹曼机有一个有趣的性质，当基于最大似然的学习规则训练时，连接两个单元的特定权重的更新仅取决于这两个单元在不同分布下收集的统计信息：$P_{\\text{model}}(\\Vv)$和$\\hat{P}_{\\text{data}}(\\Vv) P_{\\text{model}}(\\Vh  \\mid  \\Vv)$。\n网络的其余部分参与塑造, % ？ 整这些统计信息，但权重可以在完全不知道网络其余部分或这些统计信息如何产生的情况下更新。\n这意味着学习规则是\"局部\"的，这使得玻尔兹曼机的学习似乎在某种程度上是生物学合理的。\n我们可以设想每个神经元都是玻尔兹曼机中随机变量的情况，那么连接两个随机变量的轴突和树突只能通过观察与它们物理上实际接触细胞的激发模式来学习。\n特别地，正相期间，经常同时激活的两个单元之间的连接会被加强。\n这是~Hebbian~学习规则{cite?}的一个例子 ，经常总结为好记的短语——\"fire together, wire together\"。\nHebbian~学习规则是生物系统学习中最古老的假设性解释之一，直至今天仍然有重大意义 {cite?}。\n\n\n不仅仅使用局部统计信息的其他学习算法似乎需要假设更多的学习机制。\n例如，对于大脑在多层感知机中实现的反向传播，似乎需要维持一个辅助通信的网络，并借此向后传输梯度信息。\n已经有学者{cite?} 提出生物学上可行（和近似）的反向传播实现方案，但仍然有待验证，{Bengio-arxiv2015} 还将梯度的反向传播关联到类似于玻尔兹曼机（但具有连续潜变量）的能量模型中的推断。\n\n从生物学的角度看，玻尔兹曼机学习中的负相阶段有点难以解释。\n正如\\sec?所主张的，人类在睡眠时做梦可能是一种形式的负相采样。\n尽管这个想法更多的只是猜测。\n\n\n# 受限玻尔兹曼机\n\n受限玻尔兹曼机以簧风琴之名{cite?}面世之后，成为了深度概率模型中最常见的组件之一。\n我们之前在\\sec?简要介绍了~RBM。\n在这里我们回顾以前的内容并探讨更多的细节。\nRBM~是包含一层可观察变量和单层潜变量的无向概率图模型。\nRBM~可以堆叠起来（一个在另一个的顶部）形成更深的模型。\n\\fig?展示了一些例子。\n特别地， \\fig?a显示~RBM~本身的图结构。\n它是一个二分图，观察层或潜层中的任何单元之间不允许存在连接。\n\n<!-- % -- 647 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n\\begin{tabular}{cc}\n\\includegraphics{Chapter20/figures/squished_rbm.pdf} &\n\\includegraphics{Chapter20/figures/dbn.pdf}\\\\\n(a)&(b)\n\\end{tabular}\n\\begin{tabular}{c}\n \\includegraphics{Chapter20/figures/dbm_simple.pdf}\\\\\n(c)\n\\end{tabular}\n\\fi\n\\caption{可以用受限玻尔兹曼机构建的模型示例。\n(a)受限玻尔兹曼机本身是基于二分图的无向图模型，在图的一部分具有可见单元，另一部分具有隐藏单元。可见单元之间没有连接，隐藏单元之间也没有任何连接。通常每个可见单元连接到每个隐藏单元，但也可以构造稀疏连接的~RBM，如卷积~RBM。\n(b)深度信念网络是涉及有向和无向连接的混合图模型。\n与~RBM~一样，它也没有层内连接。\n然而，DBN~具有多个隐藏层，因此隐藏单元之间的连接在分开的层中。\n深度信念网络所需的所有局部条件概率分布都直接复制~RBM~的局部条件概率分布。\n或者，我们也可以用完全无向图表示深度信念网络，但是它需要层内连接来捕获父节点间的依赖关系。\n(c)深度玻尔兹曼机是具有几层潜变量的无向图模型。\n与~RBM~和~DBN~一样，DBM~也缺少层内连接。\nDBM~与~RBM~的联系不如~DBN~紧密。\n当从~RBM~堆栈初始化~DBM~时，有必要对~RBM~的参数稍作修改。\n某些种类的~DBM~可以直接训练，而不用先训练一组~RBM。\n}\n\\end{figure}\n\n<!-- % -- 648 -- -->\n\n我们从二值版本的受限玻尔兹曼机开始，但如我们之后所见，这还可以扩展为其他类型的可见和隐藏单元。\n\n更正式地说，令观察层由一组$n_v$个二值随机变量组成，我们统称为向量$\\RVv$。\n我们将$n_h$个二值随机变量的潜在或隐藏层记为$\\Vh$。\n\n就像普通的玻尔兹曼机，受限玻尔兹曼机也是基于能量的模型，其联合概率分布由能量函数指定：\n\\begin{align}\n P(\\RVv = \\Vv, \\RVh = \\Vh) = \\frac{1}{Z} \\exp(-E(\\Vv, \\Vh)).\n\\end{align}\nRBM的能量函数由下给出\n E(\\Vv, \\Vh) = -\\Vb^\\top \\Vv - \\Vc^\\top \\Vh - \\Vv^\\top \\MW \\Vh,\n\\end{align}\n其中$Z$是被称为配分函数的归一化常数：\n\\begin{align}\n Z = \\sum_{\\Vv} \\sum_{\\Vh} \\exp \\{-E(\\Vv, \\Vh) \\}\n\\end{align}\n从配分函数 $Z$的定义显而易见，计算$Z$的朴素方法（对所有状态进行穷举求和）计算上可能是难以处理的，除非有巧妙设计的算法可以利用概率分布中的规则来更快地计算$Z$。\n在受限玻尔兹曼机的情况下， {long10rbm}正式证明配分函数 $Z$是难解的。\n难解的配分函数 $Z$意味着归一化联合概率分布 $P(\\Vv)$也难以评估。\n\n\n\n## 条件分布\n\n虽然$P(\\Vv)$难解，但~RBM~的二分图结构具有非常特殊的性质，其条件分布$P(\\RVh \\mid \\RVv)$和$P(\\RVv\\mid\\RVh)$是因子的，并且计算和采样是相对简单的。\n\n<!-- % -- 649 -- -->\n\n从联合分布中导出条件分布是直观的：\n\\begin{align}\n P(\\Vh \\mid \\Vv) &= \\frac{P(\\Vh, \\Vv)}{P(\\Vv)} \\\\\n &= \\frac{1}{P(\\Vv)} \\frac{1}{Z} \\exp \\big\\{ \\Vb^\\top \\Vv + \\Vc^\\top \\Vh + \\Vv^\\top\\MW \\Vh \\big\\} \\\\\n &=  \\frac{1}{Z^\\prime} \\exp \\big\\{ \\Vc^\\top \\Vh + \\Vv^\\top\\MW \\Vh \\big\\} \\\\\n &=  \\frac{1}{Z^\\prime} \\exp \\Big\\{ \\sum_{j=1}^{n_h}\\Vc_j^\\top \\Vh_j \n + \\sum_{n_h}^{j=1} \\Vv^\\top\\MW_{:,j} \\Vh_j \\Big\\} \\\\\n &=  \\frac{1}{Z^\\prime} \\prod_{j=1}^{n_h} \\exp \\big\\{ \\Vc_j^\\top \\Vh_j + \\Vv^\\top\\MW_{:,j} \\Vh_j \\big\\} .\n\\end{align}\n由于我们相对可见单元$\\RVv$计算条件概率，相对于分布$P(\\RVh  \\mid  \\RVv)$我们可以将它们视为常数。\n条件分布$ P(\\RVh  \\mid  \\RVv) $ 因子相乘的本质，我们可以将向量$\\Vh$上的联合概率写成单独元素$h_j$上（未归一化）分布的乘积。\n现在原问题变成了对单个二值$h_j$上的分布进行归一化的简单问题。\n\\begin{align}\n P(h_j=1  \\mid  \\Vv) &= \\frac{\\tilde{P}(h_j=1 \\mid \\Vv)}{\\tilde{P}(h_j=0 \\mid \\Vv) + \\tilde{P}(h_j=1 \\mid \\Vv)} \\\\\n &= \\frac{\\exp \\{ c_j + \\Vv^\\top \\MW_{:,j} \\} }{\\exp\\{ 0 \\} + \\exp \\{ c_j + \\Vv^\\top \\MW_{:,j}\\}} \\\\\n &= \\sigma (c_j + \\Vv^\\top \\MW_{:,j}).\n\\end{align}\n现在我们可以将关于隐藏层的完全条件分布表达为因子形式：\n\\begin{align}\n P(\\Vh  \\mid  \\Vv) = \\prod_{j=1}^{n_h} \\sigma \\big( (2\\Vh-1) \\odot (\\Vc + \\MW^\\top \\Vv) \\big)_j .\n\\end{align}\n\n类似的推导将显示我们感兴趣的另一条件分布，$P(\\Vv  \\mid  \\Vh)$也是因子形式的分布：\n\\begin{align}\n  P(\\Vv  \\mid  \\Vh) = \\prod_{i=1}^{n_v} \\sigma \\big( (2\\Vv-1) \\odot (\\Vb + \\MW \\Vh) \\big)_i .\n\\end{align}\n\n\n\n## 训练受限玻尔兹曼机\n\n\n<!-- %因为~RBM~允许以高效~MCMC~采样（块吉布斯采样的形式）对$\\tilde{P}(\\Vv)$进行高效评估和求导，所以可以简单地使用\\chap?中描述的任意训练具有难解配分函数模型的技术。 -->\n因为~RBM~允许高效计算$\\tilde{P}(\\Vv)$的估计和微分，并且还允许高效地（以块吉布斯采样的形式）进行MCMC~采样，所以我们很容易使用\\chap?中训练具有难以计算配分函数的模型的技术来训练~RBM。\n这包括~CD、\\,SML（PCD）、比率匹配等。\n与深度学习中使用的其他无向模型相比，RBM~可以相对直接地训练，因为我们可以以闭解形式计算$P(\\RVh  \\mid  \\Vv)$。\n其他一些深度模型，如深度玻尔兹曼机，同时具备难处理的配分函数和难以推断的难题。\n\n<!-- % -- 650 -- -->\n\n\n# 深度信念网络\n\n\n深度信念网络是第一批成功应用深度架构训练的非卷积模型之一{cite?}。\n2006年深度信念网络的引入开始了当前深度学习的复兴。\n在引入深度信念网络之前，深度模型被认为太难以优化。\n具有凸目标函数的核机器引领了研究前沿。\n深度信念网络在MNIST数据集上表现超过内核化支持向量机，以此证明深度架构是能够成功的{cite?}。\n尽管现在与其他无监督或生成学习算法相比，深度信念网络大多已经失去了青睐并很少使用，但它们在深度学习历史中的重要作用仍应该得到承认。\n\n深度信念网络是具有若干潜变量层的生成模型。\n潜变量通常是二值的，而可见单元可以是二值或实数。\n尽管构造连接比较稀疏的~DBN~是可能的，但在一般的模型中，每层的每个单元连接到每个相邻层中的每个单元（没有层内连接）。\n顶部两层之间的连接是无向的。\n而所有其他层之间的连接是有向的，箭头指向最接近数据的层。\n见\\fig?b的例子。\n\n\n具有$l$个隐藏层的~DBN~包含$l$个权重矩阵：$\\MW^{(1)},\\ldots, \\MW^{(l)}$。\n同时也包含$l+1$个偏置向量：\n$\\Vb^{(0)},\\ldots,\\Vb^{(l)}$，其中$\\Vb^{(0)}$是可见层的偏置。\nDBN~表示的概率分布由下式给出：\n\\begin{align}\n P(\\Vh^{(l)}, \\Vh^{(l-1)}) \\propto& \\exp \\big( \\Vb^{(l)^\\top} \\Vh^{(l)} +  \\Vb^{(l-1)^\\top} \\Vh^{(l-1)}\n + \\Vh^{(l-1)^\\top} \\MW^{(l)} \\Vh^{(l)} \\big), \\\\\n P(h_i^{(k)} = 1  \\mid  \\Vh^{(k+1)}) &= \\sigma \\big( b_i^{(k)} + \\MW_{:,i}^{(k+1)^\\top} \\Vh^{(k+1)} \n                                                          \\big)~ \\forall i,  \\forall k \\in 1, \\ldots, l-2, \\\\\nP(v_i = 1  \\mid  \\Vh^{(1)}) &=  \\sigma \\big( b_i^{(0)} + \\MW_{:,i}^{(1)^\\top} \\Vh^{(1)} \n                                                          \\big)~ \\forall i.\n\\end{align}\n在实值可见单元的情况下，替换\n\\begin{align}\n \\RVv \\sim \\CalN \\big( \\Vv; \\Vb^{(0)} + \\MW^{(1)^\\top} \\Vh^{(1)}, \\Vbeta^{-1} \\big)\n\\end{align}\n为便于处理，$\\Vbeta$为对角形式。\n至少在理论上，推广到其他指数族的可见单元是直观的。\n只有一个隐藏层的~DBN~只是一个~RBM。\n\n<!-- % -- 651 -- -->\n\n为了从~DBN~中生成样本，我们先在顶部的两个隐藏层上运行几个~Gibbs采样步骤。\n这个阶段主要从~RBM（由顶部两个隐藏层定义）中采一个样本。\n然后，我们可以对模型的其余部分使用单次原始采样，以从可见单元绘制样本。\n\n深度信念网络引发许多与有向模型和无向模型同时相关的问题。\n\n<!-- % What ? -->\n由于每个有向层内的相消解释效应，并且由于无向连接的两个隐藏层之间的相互作用，深度信念网络中的推断是难解的。\n评估或最大化对数似然的标准证据下界也是难以处理的，因为证据下界基于大小等于网络宽度的团的期望。\n\n评估或最大化对数似然，不仅需要面对边缘化潜变量时难以处理的推断问题，而且还需要处理顶部两层无向模型内难处理的配分函数问题。\n\n为训练深度信念网络，我们可以先使用对比散度或随机最大似然方法训练~RBM~以最大化$ \\SetE_{\\RVv \\sim p_{\\text{data}}} \\log p(\\Vv)$。\n\\,RBM~的参数定义了~DBN~第一层的参数。\n然后，第二个~RBM~训练为近似最大化\n\\begin{align}\n \\SetE_{\\RVv \\sim p_{\\text{data}}}  \\SetE_{\\RVh^{(1)} \\sim p^{(1)}(\\Vh^{(1)}  \\mid  \\Vv)}  \\log p^{(2)}(\\Vh^{(1)}) ,\n\\end{align}\n其中$p^{(1)}$是第一个~RBM~表示的概率分布，$p^{(2)}$是第二个~RBM~表示的概率分布。\n换句话说，第二个~RBM~被训练为模拟由第一个~RBM~的隐藏单元采样定义的分布，而第一个~RBM~由数据驱动。\n这个过程能无限重复，从而向~DBN~添加任意多层，其中每个新的~RBM~对前一个~RBM~的样本建模。\n每个~RBM~定义~DBN~的另一层。\n这个过程可以被视为提高数据在~DBN~下似然概率的变分下界{cite?}。\n\n\n在大多数应用中，对~DBN~进行贪心逐层训练后，不需要再花功夫对其进行联合训练。\n然而，使用醒眠算法对其进行生成精调是可能的。\n\n<!-- % -- 652 -- -->\n\n训练好的~DBN~可以直接用作生成模型，但是~DBN~的大多数兴趣来自于它们改进分类模型的能力。\n我们可以从~DBN~获取权重，并使用它们定义~MLP：\n\\begin{align}\n \\Vh^{(1)} &= \\sigma \\big( b^{(1)} + \\Vv^\\top \\MW^{(1)} \\big), \\\\\n \\Vh^{(l)} &= \\sigma \\big( b_i^{(l)} + \\Vh^{(l-1)^\\top}\\MW^{(l)} \\big) ~\\forall l \\in 2, \\ldots, m.\n\\end{align}\n利用~DBN~的生成训练后获得的权重和偏置初始化该~MLP~之后，我们可以训练该~MLP~来执行分类任务。\n这种~MLP~的额外训练是判别性精调的示例。\n\n\n与\\chap?中从基本原理导出的许多推断方程相比，这种特定选择的~MLP~有些随意。\n这个~MLP~是一个启发式选择，似乎在实践中效果不错，并在文献中一贯使用。\n许多近似推断技术是由它们在一些约束下，并在对数似然上找到最大\\emph{紧}变分下界的能力所驱动的。\n我们可以使用~DBN~中~MLP~定义的隐藏单元的期望，构造对数似然的变分下界，但这对于隐藏单元上的\\emph{任何}概率分布都是如此，并没有理由相信该~MLP~提供了一个特别的紧界。\n特别地，MLP~忽略了~DBN~图模型中许多重要的相互作用。\nMLP~将信息从可见单元向上传播到最深的隐藏单元，但不向下或侧向传播任何信息。\nDBN~图模型解释了同一层内所有隐藏单元之间的相互作用以及层之间的自顶向下的相互作用。\n\n\n虽然~DBN~的对数似然是难处理的，但它可以使用~AIS~近似{cite?}。\n通过近似，可以评估其作为生成模型的质量。\n\n\n术语\"深度信念网络\"通常不正确地用于指代任意种类的深度神经网络，甚至没有潜变量意义的网络。\n这个术语应特指最深层中具有无向连接，而在所有其他连续层之间存在向下有向连接的模型。\n\n这个术语也可能导致一些混乱，因为术语\"信念网络\"有时指纯粹的有向模型，而深度信念网络包含一个无向层。\n深度信念网络也与动态贝叶斯网络（dynamic Bayesian networks） {cite?}共享首字母缩写~DBN，动态贝叶斯网络表示马尔可夫链的贝叶斯网络。\n\n<!-- % -- 653 -- -->\n\n\n# 深度玻尔兹曼机\n\n\n深度玻尔兹曼机 {cite?}是另一种深度生成模型。\n与深度信念网络不同的是，它是一个完全无向的模型。\n与~RBM~不同的是，DBM~有几层潜变量（RBM~只有一层）。\n但是像~RBM~一样，每一层内的每个变量是相互独立的，并条件于相邻层中的变量。\n见\\fig?中的图结构。\n深度玻尔兹曼机已经被应用于各种任务，包括文档建模{cite?}。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/dbm_simple}}\n\\fi\n\\caption{具有一个可见层（底部）和两个隐藏层的深度玻尔兹曼机的图模型。\n仅在相邻层的单元之间存在连接。\n没有层内连接。}\n\\end{figure}\n\n与~RBM~和~DBN~一样，DBM~通常仅包含二值单元 （正如我们为简化模型的演示而假设的），但很容易就能扩展到实值可见单元。\n\nDBM~是基于能量的模型，这意味着模型变量的联合概率分布由能量函数 $E$参数化。\n在一个深度玻尔兹曼机包含一个可见层$\\Vv$和三个隐藏层 $\\Vh^{(1)},\\Vh^{(2)}$和$\\Vh^{(3)}$的情况下，联合概率由下式给出：\n\\begin{align}\n P(\\Vv, \\Vh^{(1)},  \\Vh^{(2)},  \\Vh^{(3)}) = \\frac{1}{Z(\\Vtheta)} \n \\exp \\big( -E(\\Vv, \\Vh^{(1)},  \\Vh^{(2)},  \\Vh^{(3)}; \\Vtheta) \\big).\n\\end{align}\n为简化表示，下式省略了偏置参数。\nDBM~能量函数定义如下：\n\\begin{align}\n    E(\\Vv, \\Vh^{(1)}, \\Vh^{(2)}, \\Vh^{(3)}; \\Vtheta)  = -\\Vv^\\top \\MW^{(1)}\\Vh^{(1)} \n - \\Vh^{(1)^\\top}\\MW^{(2)}\\Vh^{(2)}- \\Vh^{(2)^\\top}\\MW^{(3)}\\Vh^{(3)}.\n\\end{align}\n\n与~RBM~的能量函数（\\eqn?）相比，DBM~能量函数以权重矩阵（$\\MW^{(2)}$和$\\MW^{(3)}$）的形式表示隐藏单元（潜变量）之间的连接。\n正如我们将看到的，这些连接对模型行为以及我们如何在模型中进行推断都有重要的影响。\n\n<!-- % -- 654 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/dbm_bipartite}}\n\\fi\n\\caption{深度玻尔兹曼机，重新排列后显示为二分图结构。}\n\\end{figure}\n\n与全连接的玻尔兹曼机（每个单元连接到其他每个单元）相比，DBM~提供了类似于~RBM~的一些优点。\n\n具体来说， 如\\fig?所示，DBM~的层可以组织成一个二分图，其中奇数层在一侧，偶数层在另一侧。\n容易发现，当我们条件于偶数层中的变量时，奇数层中的变量变得条件独立。   \n当然，当我们条件于奇数层中的变量时，偶数层中的变量也会变得条件独立。\n\nDBM~的二分图结构意味着我们可以应用之前用于~RBM~条件分布的相同式子来确定~DBM~中的条件分布。\n在给定相邻层值的情况下，层内的单元彼此条件独立，因此二值变量的分布可以由~Bernoulli~参数（描述每个单元的激活概率）完全描述。\n在具有两个隐藏层的示例中，激活概率由下式给出：\n\\begin{align}\n P(v_i=1  \\mid  \\Vh^{(1)}) &= \\sigma \\big( \\MW_{i,:}^{(1)}\\Vh^{(1)} \\big), \\\\\n P(h_i^{(1)}=1  \\mid  \\Vv, \\Vh^{(2)}) &= \\sigma \\big( \\Vv^\\top  \\MW_{:,i}^{(1)}\n + \\MW_{i,:}^{(2)}\\Vh^{(2)} \\big) ,\n\\end{align}\n和\n\\begin{align}\nP(h_k^{(2)} =1  \\mid  \\Vh^{(1)}) = \\sigma \\big(\\Vh^{(1)\\top} \\MW_{:,k}^{(2)} \\big).\n\\end{align}\n\n<!-- % -- 655 -- -->\n\n二分图结构使~Gibbs采样能在深度玻尔兹曼机中高效采样。\nGibbs采样的方法是一次只更新一个变量。\nRBM~允许所有可见单元以一个块的方式更新，而所有隐藏单元在另一个块上更新。\n我们可以简单地假设具有$l$层的~DBM~需要$l+1$次更新，每次迭代更新由某层单元组成的块。\n然而，我们可以仅在两次迭代中更新所有单元。\nGibbs采样可以将更新分成两个块，一块包括所有偶数层（包括可见层），另一个包括所有奇数层。\n由于~DBM~二分连接模式，给定偶数层，关于奇数层的分布是因子的，因此可以作为块同时且独立地采样。\n类似地，给定奇数层，可以同时且独立地将偶数层作为块进行采样。\n高效采样对使用随机最大似然算法的训练尤其重要。\n\n\n\n## 有趣的性质\n\n深度玻尔兹曼机具有许多有趣的性质。\n\nDBM~在~DBN~之后开发。\n与~DBN~相比，DBM~的后验分布$P(\\Vh  \\mid  \\Vv)$更简单。\n有点违反直觉的是，这种后验分布的简单性允许更加丰富的后验近似。\n在~DBN~的情况下，我们使用启发式的近似推断过程进行分类，其中我们可以通过~MLP（使用~sigmoid~激活函数并且权重与原始~DBN~相同）中的向上传播猜测隐藏单元合理的均匀场期望值。\n\\emph{任何}分布$Q(\\Vh)$可用于获得对数似然的变分下界。\n因此这种启发式的过程让我们能够获得这样的下界。\n但是，该界没有以任何方式显式优化，所以该界可能是远远不紧的。\n特别地，$Q$的启发式估计忽略了相同层内隐藏单元之间的相互作用以及更深层中隐藏单元对更接近输入的隐藏单元自顶向下的反馈影响。\n因为~DBN~中基于启发式~MLP~的推断过程不能考虑这些相互作用，所以得到的$Q$想必远不是最优的。\nDBM~中，在给定其他层的情况下，层内的所有隐藏单元都是条件独立的。\n这种层内相互作用的缺失使得通过不动点方程优化变分下界并找到真正最佳的均匀场期望（在一些数值容差内）变得可能的。\n\n<!-- % -- 656 -- -->\n\n使用适当的均匀场允许~DBM~的近似推断过程捕获自顶向下反馈相互作用的影响。\n这从神经科学的角度来看是有趣的，因为根据已知，人脑使用许多自上而下的反馈连接。\n由于这个性质，DBM~已被用作真实神经科学现象的计算模型 {cite?}。\n\n\nDBM~一个不理想的特性是从中采样是相对困难的。 \n在一次高效的原始采样过程中，DBN~只需要在其顶部的一对层中使用~MCMC~采样，而其他层仅在采样过程末尾参与。\n要从~DBM~生成样本，必须在所有层中使用~MCMC，并且模型的每一层都参与每个马尔可夫链转移。\n\n\n\n## DBM均匀场推断\n\n给定相邻层，一个~DBM~层上的条件分布是因子的。\n在有两个隐藏层的~DBM~的示例中，这些分布是$P(\\Vv  \\mid  \\Vh^{(1)}), P(\\Vh^{(1)}  \\mid  \\Vv, \\Vh^{(2)})$和$P(\\Vh^{(2)}  \\mid  \\Vh^{(1)})$。\n因为层之间的相互作用，\\emph{所有}隐藏层上的分布通常不是因子的。\n在有两个隐藏层的示例中，由于$\\Vh^{(1)}$和$\\Vh^{(2)}$之间的交互权重$\\MW^{(2)}$使得这些变量相互依赖， $ P(\\Vh^{(1)}  \\mid  \\Vv, \\Vh^{(2)})$不是因子的。\n\n\n与~DBN~的情况一样，我们还是要找出近似~DBM~后验分布的方法。\n然而，与~DBN~不同，DBM~在其隐藏单元上的后验分布（复杂的） 很容易用变分近似来近似（如\\sec?所讨论），具体是一个均匀场近似。\n均匀场近似是变分推断的简单形式，其中我们将近似分布限制为完全因子的分布。\n在~DBM~的情况下，均匀场方程捕获层之间的双向相互作用。\n在本节中，我们推导出由~{SalHinton09}最初引入的迭代近似推断过程。\n\n<!-- % -- 657 -- -->\n\n在推断的变分近似中，我们通过一些相当简单的分布族近似特定目标分布——在这里指给定可见单元时隐藏单元的后验分布。\n在均匀场近似的情况下，近似族是隐藏单元条件独立的分布集合。\n\n\n我们现在为具有两个隐藏层的示例推导均匀场方法。\n令$Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)$为$P(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)$的近似。\n均匀场假设意味着\n\\begin{align}\n Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv) = \\prod_j Q(h_j^{(1)} \\mid  \\Vv) \\prod_k Q(\\Vh_k^{(2)}  \\mid  \\Vv).\n\\end{align}\n\n均匀场近似试图找到这个分布族中最适合真实后验$P(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)$的成员。\n重要的是，每次我们使用$\\Vv$的新值时，必须再次运行推断过程以找到不同的分布$Q$。\n\n\n我们可以设想很多方法来衡量$Q(\\Vh  \\mid  \\Vv)$与$P(\\Vh  \\mid  \\Vv)$的拟合程度。\n均匀场方法是最小化\n\\begin{align}\n \\text{KL}(Q \\mid  \\mid P) = \\sum_{\\Vh} Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv) \n \\log \\Big( \\frac{Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)}{P(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv)} \\Big).\n\\end{align}\n\n一般来说，除了要保证独立性假设，我们不必提供参数形式的近似分布。\n变分近似过程通常能够恢复近似分布的函数形式。\n然而，在二值隐藏单元（我们在这里推导的情况）的均匀场假设的情况下，不会由于预先固定模型的参数而损失一般性。\n\n我们将$Q$作为~Bernoulli分布的乘积进行参数化，即我们将$\\Vh^{(1)}$每个元素的概率与一个参数相关联。\n具体来说，对于每个$j$，$\\hat h_j^{(1)} = Q(h_j^{(1)}=1 \\mid  \\Vv)$，其中$\\hat h_j^{(1)} \\in [0,1]$。\n另外，对于每个$k$，$\\hat h_k^{(2)} = Q(h_k^{(2)}=1 \\mid  \\Vv)$，其中$\\hat h_k^{(2)} \\in [0,1]$。\n因此，我们有以下近似后验：\n\\begin{align}\n Q(\\Vh^{(1)}, \\Vh^{(2)}  \\mid  \\Vv) &=  \\prod_j Q(h_j^{(1)} \\mid  \\Vv) \\prod_k Q(h_k^{(2)}  \\mid  \\Vv) \\\\\n &= \\prod_j (\\hat h_j^{(1)})^{h_j^{(1)}}(1-\\hat h_j^{(1)})^{(1-h_j^{(1)})} \\times\n \\prod_k (\\hat h_k^{(2)})^{h_k^{(2)}}(1-\\hat h_k^{(2)})^{(1-h_k^{(2)})} .\n\\end{align}\n当然，对于具有更多层的~DBM，近似后验的参数化可以通过明显的方式扩展，即利用图的二分结构，遵循~Gibbs采样相同的调度，同时更新所有偶数层，然后同时更新所有奇数层。\n\n<!-- % -- 658 -- -->\n\n现在我们已经指定了近似分布$Q$的函数族，但仍然需要指定用于选择该函数族中最适合$P$的成员的过程。\n最直接的方法是使用\\eqn?指定的均匀场方程。\n这些方程是通过求解变分下界导数为零的位置而导出。\n他们以抽象的方式描述如何优化任意模型的变分下界（只需对$Q$求期望）。\n\n应用这些一般的方程，我们得到以下更新规则（再次忽略偏置项）：\n \\hat h_j^{(1)} &= \\sigma  \\Big(  \\sum_i v_i \\MW_{i,j}^{(1)}\n + \\sum_{k^{\\prime}} \\MW_{j,k^{\\prime}}^{(2)} \\hat h_{k^{\\prime}}^{(2)}  \\Big), ~\\forall j ,\\\\\n \\hat h_{k}^{(2)} &=  \\sigma  \\Big(  \\sum_{j^{\\prime}} \\MW_{j^{\\prime},k}^{(2)}\n \\hat h_{j^{\\prime}}^{(1)}  \\Big), ~\\forall k.\n\\end{align}\n在该方程组的不动点处，我们具有变分下界$\\CalL(Q)$的局部最大值。\n因此，这些不动点更新方程定义了迭代算法，其中我们交替更新$h_{j}^{(1)} $ （使用\\eqn?）和$h_{k}^{(2)} $ （使用\\eqn?）。\n对于诸如MNIST的小问题，少至10次迭代就足以找到用于学习的近似正相梯度，而50次通常足以获得要用于高精度分类的单个特定样本的高质量表示。\n将近似变分推断扩展到更深的~DBM~是直观的。\n\n\n\n## DBM~的参数学习\n\n\nDBM~中的学习必须面对难解配分函数的挑战（使用\\chap?中的技术），以及难解后验分布的挑战（使用\\chap?中的技术）。\n\n如\\sec?中所描述的，变分推断允许构建近似难处理的$P(\\Vh  \\mid  \\Vv)$的分布$Q(\\Vh \\mid \\Vv)$。\n然后通过最大化$\\CalL(\\Vv, Q, \\Vtheta)$（难处理的对数似然的变分下界$\\log P(\\Vv; \\Vtheta)$）学习。\n\n<!-- % -- 659 -- -->\n\n对于具有两个隐藏层的深度玻尔兹曼机，$\\CalL$由下式给出\n\\begin{align}\n \\CalL(Q, \\Vtheta) = \\sum_i \\sum_{j^{\\prime}} v_i W_{i,j^{\\prime}}^{(1)} \n \\hat h_{j^{\\prime}}^{(1)} +  \\sum_{j^{\\prime}} \\sum_{k^{\\prime}} \\hat h_{j^{\\prime}}^{(1)}\n W_{j^{\\prime}, k^{\\prime}}^{(2)} \\hat h_{k^{\\prime}}^{(2)} - \\log Z(\\Vtheta) + \\CalH(Q).\n\\end{align}\n该表达式仍然包含对数配分函数 $ \\log Z(\\Vtheta) $。\n由于深度玻尔兹曼机包含受限玻尔兹曼机作为组件，用于计算受限玻尔兹曼机的配分函数和采样的困难同样适用于深度玻尔兹曼机。\n这意味着评估玻尔兹曼机的概率质量函数需要近似方法，如退火重要采样。\n同样，训练模型需要近似对数配分函数的梯度。\n见\\chap?对这些方法的一般性描述。\nDBM~通常使用随机最大似然训练。\n\\chap?中描述的许多其他技术都不适用。\n诸如伪似然的技术需要评估非归一化概率的能力，而不是仅仅获得它们的变分下界。\n对于深度玻尔兹曼机，对比散度是缓慢的，因为它们不能在给定可见单元时对隐藏单元进行高效采样——反而，每当需要新的负相样本时，对比散度将需要磨合一条马尔可夫链。\n<!-- % 660 mid -->\n\n非变分版本的随机最大似然算法已经在\\sec?讨论过。\n\\alg?给出了应用于~DBM~的变分随机最大似然算法。\n回想一下，我们描述的是~DBM~的简化变体（缺少偏置参数）; 很容易推广到包含偏置参数的情况。\n\n\\begin{algorithm}%[!ht]\n\\caption{用于训练具有两个隐藏层的DBM的变分随机最大似然算法} \n\\begin{algorithmic}\n\\STATE 设步长 $\\epsilon$ 为一个小正数\n\\STATE 设定吉布斯步数 $k$，大到足以让$p(\\Vv,\\Vh^{(1)},\\Vh^{(2)}; \\Vtheta + \\epsilon \\Delta_{\\Vtheta})$的马尔可夫链能磨合 （从来自 $p(\\Vv,\\Vh^{(1)},\\Vh^{(2)}; \\Vtheta)$ 的样本开始）。 \n\\STATE 初始化三个矩阵，$\\tilde{\\MV}$, $\\tilde{\\MH}^{(1)}$ 和 $\\tilde{\\MH}^{(2)}$ 每个都将 $m$行设为随机值（例如，来自~Bernoulli分布，边缘分布大致与模型匹配）。  \n\\WHILE{没有收敛（学习循环）} \n\\STATE 从训练数据采包含$m$个样本的小批量，并将它们排列为设计矩阵$\\MV$的行。\n\\STATE 初始化矩阵 $\\hat{\\MH}^{(1)}$ 和 $\\hat{\\MH}^{(2)}$，使其大致符合模型的边缘分布。 % ??\n\\WHILE{没有收敛（均匀场推断循环）}\n        \\STATE $\\hat{\\MH}^{(1)} \\leftarrow \\sigmoid \\left(\n          \\MV \\MW^{(1)} + \\hat{\\MH}^{(2)} \\MW^{(2) \\top} \\right)$.\n        \\STATE $\\hat{\\MH}^{(2)} \\leftarrow \\sigmoid \\left(\n          \\hat{\\MH}^{(1)} \\MW^{(2)} \\right)$.\n\\ENDWHILE\n\\STATE $\\Delta_{\\MW^{(1)}} \\leftarrow \\frac{1}{m} \\MV^\\top \\hat{\\MH}^{(1)}$\n\\STATE $\\Delta_{\\MW^{(2)}} \\leftarrow \\frac{1}{m} \\hat{\\MH}^{(1)\\ \\top} \\hat{\\MH}^{(2)}$\n\n\\FOR{$l=1$ to $k$ （Gibbs采样）}\n\\STATE Gibbs block 1:\n   \\STATE $\\forall i, j, \\tilde{V}_{i,j} \\text{ 采自 } P(\\tilde{V}_{i,j} = 1) =\n    \\sigmoid \\left( \n     \\MW_{j,:}^{(1)} \n     \\left( \\tilde{\\MH}_{i,:}^{(1)} \\right)^\\top\n     \\right)$.\n   \\STATE $\\forall i, j, \\tilde{H}^{(2)}_{i,j} \\text{ 采自 } P(\\tilde{H}^{(2)}_{i,j} = 1) = \n   \\sigmoid \\left(\\tilde{\\MH}_{i,:}^{(1)} \\MW_{:,j}^{(2)} \n    \\right)$.\n\\STATE Gibbs block 2:\n   \\STATE $\\forall i, j, \\tilde{H}^{(1)}_{i,j} \\text{ 采自 } P(\\tilde{H}^{(1)}_{i,j} = 1) = \\sigmoid \\left( \\tilde{\\MV}_{i,:}\n     \\MW_{:,j}^{(1)} + \\tilde{\\MH}_{i,:}^{(2)} \\MW_{j,:}^{(2) \\top} \\\n   \\right)$.\n\\ENDFOR\n\\STATE $\\Delta_{\\MW^{(1)}} \\leftarrow \\Delta_{\\MW^{(1)}} - \\frac{1}{m} \\MV^\\top \\tilde{\\MH}^{(1)}$\n\\STATE $\\Delta_{\\MW^{(2)}} \\leftarrow \\Delta_{\\MW^{(2)}} - \\frac{1}{m} \\tilde{\\MH}^{(1) \\top} \\tilde{\\MH}^{(2)}$\n\\STATE $\\MW^{(1)} \\leftarrow \\MW^{(1)} + \\epsilon \\Delta_{\\MW^{(1)}}$\n（这是大概的描述，实践中使用的算法更高效，如具有衰减学习率的动量）\n\\STATE $\\MW^{(2)} \\leftarrow \\MW^{(2)} + \\epsilon \\Delta_{\\MW^{(2)}}$\n\\ENDWHILE\n\\end{algorithmic}\n\\end{algorithm}\n\n\n\n## 逐层预训练\n\n\n不幸的是，随机初始化后使用随机最大似然训练（如上所述）的~DBM~通常导致失败。\n在一些情况下，模型不能学习如何充分地表示分布。\n在其他情况下，DBM~可以很好地表示分布，但是没有比仅使用~RBM~获得更高的似然。\n除第一层之外，所有层都具有非常小权重的~DBM~与~RBM~表示大致相同的分布。\n\n如\\sec? 所述，目前已经开发了允许联合训练的各种技术。\n然而，克服~DBM~的联合训练问题最初和最流行的方法是贪心逐层预训练。\n在该方法中，DBM~的每一层被单独视为~RBM，进行训练。\n第一层被训练为对输入数据进行建模。\n每个后续~RBM~被训练为对来自前一~RBM~后验分布的样本进行建模。\n在以这种方式训练了所有~RBM~之后，它们可以被组合成~DBM。\n然后可以用~PCD~训练~DBM。\n通常，PCD~训练将仅使模型的参数、由数据上的对数似然衡量的性能、或区分输入的能力发生微小的变化。\n见\\fig?展示的训练过程。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/standard_dbm_color}}\n\\fi\n\\caption{用于分类MNIST数据集的深度玻尔兹曼机训练过程~{cite?}。\n(a)使用CD近似最大化$\\log P(\\Vv)$来训练RBM。\n(b)训练第二个RBM，使用CD-$k$近似最大化$\\log P(\\Vh^{(1)}, \\RSy)$来建模$\\Vh^{(1)}$和目标类$\\RSy$，其中$\\Vh^{(1)}$采自第一个RBM条件于数据的后验。 在学习期间将$k$从$1$增加到$20$。\n(c)将两个RBM组合为DBM。\n使用$k = 5$的随机最大似然训练，近似最大化$\\log P(\\RVv, \\RSy)$。\n(d)将$\\RSy$从模型中删除。\n定义新的一组特征$\\Vh^{(1)}$和$\\Vh^{(2)}$，可在缺少$\\RSy$的模型中运行均匀场推断后获得。% ??\n使用这些特征作为MLP的输入，其结构与均匀场的额外轮相同，并且具有用于估计$\\RSy$的额外输出层。\n初始化MLP的权重与DBM的权重相同。\n使用随机梯度下降和Dropout训练MLP近似最大化$\\log P(\\RSy \\mid \\RVv)$。\n图来自~{Goodfellow-et-al-NIPS2013}。\n}\n\\end{figure}\n\n<!-- % -- 662 head -->\n\n这种贪心逐层训练过程不仅仅是坐标上升。\n因为我们在每个步骤优化参数的一个子集，它与坐标上升具有一些传递相似性。\n这两种方法是不同的，因为贪心逐层训练过程中，我们在每个步骤都使用了不同的目标函数。\n\n\nDBM~的贪心逐层预训练与~DBN~的贪心逐层预训练不同。\n每个单独的~RBM~的参数可以直接复制到相应的~DBN。\n在~DBM~的情况下，RBM~的参数在包含到~DBM~中之前必须修改。\nRBM~栈的中间层仅使用自底向上的输入进行训练，但在栈组合形成~DBM~后，该层将同时具有自底向上和自顶向下的输入。\n为了解释这种效应，{SalHinton09}提倡在将其插入~DBM~之前，将所有~RBM（顶部和底部~RBM~除外）的权重除2。\n另外，必须使用每个可见单元的两个\"副本\"来训练底部~RBM，并且两个副本之间的权重约束为相等。\n这意味着在向上传播时，权重能有效地加倍。\n类似地，顶部~RBM~应当使用最顶层的两个副本来训练。\n\n为了使用深度玻尔兹曼机获得最好结果，我们需要修改标准的~SML~算法，即在联合~PCD~训练步骤的负相期间使用少量的均匀场 {cite?}。\n具体来说，应当相对于其中所有单元彼此独立的均匀场分布来计算能量梯度的期望。\n这个均匀场分布的参数应该通过运行一次均匀场不动点方程获得。\n{Goodfellow-et-al-NIPS2013}比较了在负相中使用和不使用部分均匀场的中心化~DBM~的性能。\n\n\n\n## 联合训练深度玻尔兹曼机\n\n\n经典~DBM~需要贪心无监督预训练，并且为了更好的分类，需要在它们提取的隐藏特征之上，使用独立的基于~MLP~的分类器。\n这种方法有一些不理想的性质。\n因为我们不能在训练第一个~RBM~时评估完整~DBM~的属性，所以在训练期间难以跟踪性能。\n因此，直到相当晚的训练过程，我们都很难知道我们的超参数表现如何。\nDBM~的软件实现需要很多不同的模块，如用于单个~RBM~的~CD~训练、完整~DBM~的~PCD~训练以及基于反向传播的~MLP~训练。\n最后，玻尔兹曼机顶部的~MLP~失去了玻尔兹曼机概率模型的许多优点，例如当某些输入值丢失时仍能够进行推断的优点。\n\n<!-- % -- 662 -- -->\n\n主要有两种方法可以处理深度玻尔兹曼机的联合训练问题。\n第一个是\\textbf{中心化深度玻尔兹曼机}(centered deep Boltzmann machine) {cite?}，通过重参数化模型使其在开始学习过程时代价函数的~Hessian~具有更好的条件数。\n这个模型不用经过贪心逐层预训练阶段就能训练。\n这个模型在测试集上获得出色的对数似然，并能产生高质量的样本。\n不幸的是，作为分类器，它仍然不能与适当正则化的~MLP~竞争。\n联合训练深度玻尔兹曼机的第二种方式是使用多预测深度玻尔兹曼机 {cite?}。\n该模型的训练准则允许反向传播算法，以避免使用~MCMC~估计梯度的问题。\n不幸的是，新的准则不会导致良好的似然性或样本，但是相比~MCMC~方法，它确实会导致更好的分类性能和良好的推断缺失输入的能力。\n\n如果我们回到玻尔兹曼机的一般观点，即包括一组权重矩阵$\\MU$和偏置 $\\Vb$的单元$\\Vx$，玻尔兹曼机中心化技巧是最容易描述的。\n回顾\\eqn?，能量函数由下式给出\n\\begin{align}\n E(\\Vx) = -\\Vx^\\top \\MU \\Vx - \\Vb^\\top \\Vx.\n\\end{align}\n在权重矩阵$\\MU$中使用不同的稀疏模式，我们可以实现不同架构的玻尔兹曼机，如~RBM~或具有不同层数的~DBM。\n将$\\Vx$分割成可见和隐藏单元并将$\\MU$中不相互作用的单元的归零可以实现这些架构。\n中心化玻尔兹曼机引入了一个向量$\\Vmu$，并从所有状态中减去：\n\\begin{align}\n    E^{\\prime}(\\Vx; \\MU, \\Vb) = -(\\Vx - \\Vmu)^\\top \\MU (\\Vx - \\Vmu) - (\\Vx - \\Vmu)^\\top \\Vb.\n\\end{align}\n通常$\\Vmu$在开始训练时固定为一个超参数。\n当模型初始化时，通常选择为$\\Vx - \\Vmu \\approx 0$。\n这种重参数化不改变模型可表示的概率分布的集合，但它确实改变了应用于似然的随机梯度下降的动态。\n具体来说，在许多情况下，这种重参数化导致更好条件数的~Hessian~矩阵。\n{melchior2013center}通过实验证实了~Hessian~矩阵条件数的改善，并观察到中心化技巧等价于另一个玻尔兹曼机学习技术——\\textbf{增强梯度}(enhanced gradient) {cite?}。\n即使在困难的情况下，例如训练多层的深度玻尔兹曼机，Hessian~矩阵条件数的改善也能使学习成功。\n\n<!-- % -- 664 -- -->\n\n联合训练深度玻尔兹曼机的另一种方法是多预测深度玻尔兹曼机，它将均匀场方程视为定义一系列用于近似求解每个可能推断问题的循环网络~{cite?}。\n模型被训练为使每个循环网络获得对相应推断问题的准确答案，而不是训练模型来最大化似然。\n训练过程如\\fig?所示。\n它包括随机采一个训练样本、随机采样推断网络的输入子集，然后训练推断网络来预测剩余单元的值。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/multi_prediction_training}}\n\\fi\n\\caption{深度玻尔兹曼机多预测训练过程的示意图。\n每一行指示相同训练步骤内小批量中的不同样本。\n每列表示均匀场推断过程中的时间步。\n对于每个样本，我们对数据变量的子集进行采样，作为推断过程的输入。\n这些变量以黑色阴影表示条件。\n然后我们运行均匀场推断过程，箭头指示过程中的哪些变量会影响其他变量。\n在实际应用中，我们将均匀场展开为几个步骤。\n在此示意图中，我们只展开为两个步骤。\n虚线箭头表示获得更多步骤需要如何展开该过程。\n未用作推断过程输入的数据变量成为目标，以灰色阴影表示。\n我们可以将每个样本的推断过程视为循环网络。\n为了使其在给定输入后能产生正确的目标，我们使用梯度下降和反向传播训练这些循环网络。\n这可以训练~MP-DBM~均匀场过程产生准确的估计。\n图改编自~{Goodfellow-et-al-NIPS2013}。\n}\n\\end{figure}\n\n这种用于近似推断，通过计算图进行反向传播的一般原理已经应用于其他模型~{cite?}。\n在这些模型和~MP-DBM~中，最终损失不是似然的下界。\n相反，最终损失通常基于近似推断网络对缺失值施加的近似条件分布。\n这意味着这些模型的训练有些启发式。\n如果我们检查由~MP-DBM~学习出来的玻尔兹曼机表示$p(\\Vv)$，在~Gibbs采样产生较差样本的意义下，它倾向于有些缺陷。\n\n通过推断图的反向传播有两个主要优点。\n首先，它以模型真正使用的方式训练模型 —— 使用近似推断。\n这意味着在~MP-DBM~中，进行如填充缺失的输入或执行分类（尽管存在缺失的输入）的近似推断比在原始~DBM~中更准确。\n原始~DBM~不会自己做出准确的分类器; 使用原始~DBM~的最佳分类结果是基于~DBM~提取的特征训练独立的分类器，而不是通过使用~DBM~中的推断来计算关于类标签的分布。\nMP-DBM~中的均匀场推断作为分类器，不需要进行特殊修改就获得良好的表现。\n通过近似推断反向传播的另一个优点是反向传播计算损失的精确梯度。\n对于优化而言，比~SML~训练中具有偏差和方差的近似梯度更好。\n这可能解释了为什么~MP-DBM~可以联合训练，而~DBM~需要贪心逐层预训练。\n近似推断图反向传播的缺点是它不提供一种优化对数似然的方法，而提供广义伪似然的启发式近似。\n\nMP-DBM~启发了对NADE框架的扩展NADE-$k$~{cite?} ，我们将在\\sec?中描述。\n<!-- % 665 end -->\n\nMP-DBM~与~Dropout~有一定联系。\nDropout~在许多不同的计算图之间共享相同的参数，每个图之间的差异是包括还是排除每个单元。\nMP-DBM~还在许多计算图之间共享参数。\n在~MP-DBM~的情况下，图之间的差异是每个输入单元是否被观察到。\n当没有观察到单元时，MP-DBM~不会像~Dropout~那样将其完全删除。\n相反，MP-DBM~将其视为要推断的潜变量。\n我们可以想象将~Dropout~应用到~MP-DBM，即额外去除一些单元而不是将它们变为潜变量。\n\n<!-- % 667 head -->\n\n# 实值数据上的玻尔兹曼机\n\n虽然玻尔兹曼机最初是为二值数据而开发的，但是许多应用，例如图像和音频建模似乎需要表示实值上概率分布的能力。\n在一些情况下，我们可以将区间$[0,1]$中的实值数据视为表示二值变量的期望。\n例如， {Hinton-PoE-2000}将训练集中灰度图像的像素值视为定义$[0,1]$间的概率值。\n每个像素定义二值变量为$1$的概率，并且二值像素的采样\n都彼此独立。\n这是评估灰度图像数据集上二值模型的常见过程。\n然而，这种方法理论上并不特别令人满意，并且以这种方式独立采样的二值图像具有噪声表象。\n在本节中，我们介绍概率密度定义在实值数据上的玻尔兹曼机。\n\n\n\n## Gaussian-Bernoulli RBM\n\n受限玻尔兹曼机可以用于许多指数族的条件分布 {cite?}。\n其中，最常见的是具有二值隐藏单元和实值可见单元的~RBM，其中可见单元上的条件分布是高斯分布（均值为隐藏单元的函数）。\n\n有很多方法可以参数化~Gaussian-Bernoulli RBM。\n首先，我们可以选择协方差矩阵或精度矩阵来参数化高斯分布。\n这里，我们介绍选择精度矩阵的情况。\n我们可以通过简单的修改获得协方差的形式。\n我们希望条件分布为\n\\begin{align}\n p(\\Vv  \\mid  \\Vh) = \\CalN(\\Vv; \\MW\\Vh, \\Vbeta^{-1}).\n\\end{align}\n通过扩展未归一化的对数条件分布可以找到需要添加到能量函数中的项：\n \\log \\CalN(\\Vv; \\MW\\Vh, \\Vbeta^{-1}) = -\\frac{1}{2}(\\Vv - \\MW\\Vh)^\\top \\Vbeta (\\Vv - \\MW\\Vh) + \n f(\\Vbeta) .\n\\end{align}\n\n<!-- % -- 667 -- -->\n\n此处$f$封装所有的参数，但不包括模型中的随机变量。\n因为$f$的唯一作用是归一化分布，并且我们选择的任何可作为配分函数的能量函数都能起到这个作用，所以我们可以忽略$f$。\n\n如果我们在能量函数中包含\\eqn?中涉及$\\Vv$的所有项（其符号被翻转），并且不添加任何其他涉及$\\Vv$的项，那么我们的能量函数就能表示想要的条件分布$p(\\Vv  \\mid  \\Vh)$。\n\n其他条件分布比较自由，如$p(\\Vh  \\mid  \\Vv)$。\n注意\\eqn?包含一项\n\\begin{align}\n \\frac{1}{2}\\Vh^\\top\\MW^\\top \\Vbeta \\MW \\Vh .\n\\end{align}\n因为该项包含$h_i h_j$项，它不能被全部包括在内。\n这些对应于隐藏单元之间的边。\n如果我们包括这些项，我们将得到一个线性因子模型，而不是受限玻尔兹曼机。\n当设计我们的玻尔兹曼机时，我们简单地省略这些$h_i h_j$交叉项。\n省略这些项不改变条件分布$p(\\Vv  \\mid  \\Vh)$，因此\\eqn?仍满足。\n然而，我们仍然可以选择是否包括仅涉及单个$h_i$的项。\n如果我们假设精度矩阵是对角的，就能发现对于每个隐藏单元 $h_i$，我们有一项\n\\begin{align}\n \\frac{1}{2} h_i \\sum_j \\beta_j W_{j,i}^2.\n\\end{align}\n在上面，我们使用了$h_i^2 = h_i$的事实（因为$h_i \\in \\{ 0, 1\\}$）。\n如果我们在能量函数中包含此项（符号被翻转），则当该单元的权重较大且以高精度连接到可见单元时，偏置 $h_i$将自然被关闭。\n是否包括该偏置项不影响模型可以表示的分布族（假设我们包括隐藏单元的偏置参数），但是它确实会影响模型的学习动态。\n包括该项可以帮助隐藏单元（即使权重在幅度上快速增加时）保持合理激活。\n\n因此，在~Gaussian-Bernoulli RBM~上定义能量函数的一种方式：\n\\begin{align}\n E(\\Vv, \\Vh) = \\frac{1}{2} \\Vv^\\top (\\Vbeta \\odot \\Vv) -  (\\Vv \\odot \\Vbeta)^\\top\\MW \\Vh - \\Vb^\\top \\Vh,\n\\end{align}\n但我们还可以添加额外的项或者通过方差而不是精度参数化能量。\n\n<!-- % -- 668 -- -->\n\n在这个推导中，我们没有在可见单元上添加偏置项，但添加这样的偏置是容易的。\nGaussian-Bernoulli RBM~参数化一个最终变化的来源是如何处理精度矩阵的选择。\n它可以被固定为常数（可能基于数据的边缘精度估计）或学习出来。\n它也可以是标量乘以单位矩阵，或者是一个对角矩阵。\n在此情况下，由于一些操作需要对矩阵求逆，我们通常不允许非对角的精度矩阵，因为高斯分布的一些操作需要对矩阵求逆，一个对角矩阵可以非常容易地被求逆。\n在接下来的章节中，我们将看到其他形式的玻尔兹曼机，它们允许对协方差结构建模，并使用各种技术避免对精度矩阵求逆。\n\n\n\n## 条件协方差的无向模型\n\n\n虽然高斯RBM~已成为实值数据的标准能量模型， {Ranzato2010a}认为高斯RBM~感应偏置不能很好地适合某些类型的实值数据中存在的统计变化，特别是自然图像。\n问题在于自然图像中的许多信息内容嵌入于像素之间的协方差而不是原始像素值中。\n换句话说，图像中的大多数有用信息在于像素之间的关系，而不是其绝对值。\n由于高斯RBM~仅对给定隐藏单元的输入条件均值建模，所以它不能捕获条件协方差信息。\n为了回应这些评论，已经有学者提出了替代模型，设法更好地考虑实值数据的协方差。\n这些模型包括均值和协方差RBM\\footnote{术语\"mcRBM\"根据字母M-C-R-B-M发音；\"mc\"不是\"McDonald's\"中的\"Mc\"的发音。}、学生$t$分布均值乘积模型和尖峰和平板RBM。\n\n\n\\paragraph{均值和协方差RBM} mcRBM~使用隐藏单元独立地编码所有可观察单元的条件均值和协方差。\nmcRBM~的隐藏层分为两组单元：均值单元和协方差单元。\n建模条件均值的那组单元是简单的高斯RBM。\n另一半是协方差RBM {cite?}，对条件协方差的结构进行建模（如下所述）。\n\n<!-- % -- 669 -- -->\n\n具体来说，在二值均值的单元$\\Vh^{(m)}$和二值协方差单元$\\Vh^{(c)}$的情况下，mcRBM~模型被定义为\n两个能量函数的组合：\n\\begin{align}\n E_{\\text{mc}}(\\Vx, \\Vh^{(m)}, \\Vh^{(c)}) = E_{\\text{m}}(\\Vx, \\Vh^{(m)}) + E_{\\text{c}}(\\Vx, \\Vh^{(c)}),\n\\end{align}\n其中$E_{\\text{m}}$为标准的~Gaussian-Bernoulli RBM~能量函数\\footnote{这个版本的~Gaussian-Bernoulli RBM~能量函数假定图像数据的每个像素具有零均值。考虑非零像素均值时，可以简单地将像素偏移添加到模型中。}，\nE_{\\text{m}}(\\Vx, \\Vh^{(m)}) = \\frac{1}{2}\\Vx^\\top \\Vx - \\sum_j \\Vx^\\top \\MW_{:,j} h_j^{(m)} - \\sum_j \n b_j^{(m)} h_j^{(m)},\n\\end{align}\n$E_{\\text{c}}$是~cRBM~建模条件协方差信息的能量函数：\n\\begin{align}\n E_{\\text{c}}(\\Vx, \\Vh^{(c)}) = \\frac{1}{2} \\sum_j h_j^{(c)} \\big( \\Vx^\\top \\Vr^{(j)}\\big)^2 - \\sum_j \n b_j^{(c)} h_j^{(c)}.\n\\end{align}\n参数$\\Vr^{(j)}$与$h_j^{(c)}$关联的协方差权重向量对应，$\\Vb^{(c)}$是一个协方差偏置向量。\n组合后的能量函数定义联合分布，\n\\begin{align}\n p_{\\text{mc}}(\\Vx, \\Vh^{(m)}, \\Vh^{(c)}) = \\frac{1}{Z} \\exp \\Big\\{ -E_{\\text{mc}}(\\Vx, \\Vh^{(m)}, \n \\Vh^{(c)}) \\Big\\},\n\\end{align}\n以及给定$\\Vh^{(m)}$和$\\Vh^{(c)}$后，关于观察数据相应的条件分布（为一个多元高斯分布）：\n\\begin{align}\n p_{\\text{mc}}(\\Vx \\mid \\Vh^{(m)}, \\Vh^{(c)})  = \\CalN \\Bigg( \\Vx \\,; \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{mc}} \\Bigg(\n\\sum_j \\MW_{:,j}h_j^{(m)} \\Bigg), \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{mc}}\n \\Bigg).\n\\end{align}\n注意协方差矩阵$\\MC_{\\Vx \\mid \\Vh}^{\\,\\text{mc}} = \\Big( \\sum_j h_j^{(c)} \\Vr^{(j)} \\Vr^{(j)T} + \\MI\n\\Big)^{-1}$是非对角的，且$\\MW$是与建模条件均值的高斯RBM~相关联的权重矩阵。\n由于非对角的条件协方差结构，难以通过对比散度或持续性对比散度来训练~mcRBM。\nCD~和~PCD~需要从$\\Vx,\\Vh^{(m)},\\Vh^{(c)}$的联合分布中采样，这在标准RBM~中可以通过~Gibbs采样在条件分布上采样实现。\n但是，在~mcRBM~中，从$ p_{\\text{mc}}(\\Vx  \\mid \\Vh^{(m)}, \\Vh^{(c)}) $中抽样需要在学习的每个迭代计算$(\\MC^{\\,\\text{mc}})^{-1}$。\n这对于更大的观察数据可能是不切实际的计算负担。\n{Ranzato2010b-short}通过使用~mcRBM~自由能上的哈密尔顿（混合）蒙特卡罗~{cite?}直接从边缘$p(\\Vx)$采样，避免了直接从条件$  p_{\\text{mc}}(\\Vx  \\mid \\Vh^{(m)}, \\Vh^{(c)}) $抽样。\n\n % -- 670 --\n \n\\paragraph{学生$t$分布均值乘积}\n学生$t$分布均值乘积模型~{cite?}以类似~mcRBM~扩展~cRBM~的方式扩展PoT模型~{cite?}。\n通过添加类似高斯RBM~中隐藏单元的非零高斯均值来实现。\n与~mcRBM~一样，观察值上的PoT条件分布是多元高斯（具有非对角的协方差）分布; 然而，不同于~mcRBM~，隐藏变量的互补条件分布是由条件独立的~Gamma分布给出。\nGamma分布 $\\CalG(k, \\theta)$是关于正实数且均值为$k\\theta$的概率分布。\n我们只需简单地了解~Gamma分布就足以理解~mPoT~模型的基本思想。\n\nmPoT~的能量函数为：\n\\begin{align}\n &E_{\\text{mPoT}}(\\Vx, \\Vh^{(m)}, \\Vh^{(c)}) \\\\\n &= E_{\\text{m}}(\\Vx, \\Vh^{(m)}) + \\sum_j \\Big( h_j^{(c)} \\big( 1+\\frac{1}{2}(\\Vr^{(j)T}\\Vx)^2  \\big)\n +(1-\\gamma_j)\\log h_j^{(c)} \\Big),\n\\end{align}\n其中$\\Vr^{(j)}$是与单元$h_j^{(c)}$相关联的协方差权重向量，$E_m(\\Vx, \\Vh^{(m)})$如\\eqn?所定义。\n\n正如~mcRBM~一样，mPoT~模型能量函数指定一个多元高斯分布，其中关于$\\Vx$的条件分布具有非对角的协方差。\nmPoT~模型中的学习（也像~mcRBM ） 由于无法从非对角高斯条件分布$p_{\\text{mPoT}}(\\Vx  \\mid  \\Vh^{(m)}, \\Vh^{(c)}) $采样而变得复杂。\n因此~{ranzato+mnih+hinton:2010-short} 也倡导通过哈密尔顿（混合）蒙特卡罗~{cite?}直接采样$p(\\Vx)$。\n\n\n\\paragraph{尖峰和平板RBM} 尖峰和平板RBM{cite?}提供对实值数据的协方差结构建模的另一种方法。\n与~mcRBM~相比，ssRBM~具有既不需要矩阵求逆也不需要哈密尔顿蒙特卡罗方法的优点。\n<!-- %作为自然图像的模型，ssRBM感兴趣的是。 -->\n就像~mcRBM~和~mPoT~模型，ssRBM~的二值隐藏单元通过使用辅助实值变量来编码跨像素的条件协方差。\n\n<!-- % -- 671 -- -->\n\n尖峰和平板RBM~有两类隐藏单元：二值\\,\\textbf{尖峰}(spike)单元$\\RVh$和实值\\,\\textbf{平板}(slab)单元$\\RVs$。\n条件于隐藏单元的可见单元均值由$(\\Vh \\odot \\Vs)\\MW^\\top$给出。\n换句话说，每一列$\\MW_{:,i}$定义当$h_i=1$时可出现在输入中的分量。\n相应的尖峰变量$\\RSh_i$确定该分量是否存在。\n如果存在的话，相应的平板变量$\\RSs_i$确定该分量的强度。\n当尖峰变量激活时，相应的平板变量将沿着$\\MW_{:,i}$定义的轴的输入增加方差。\n这允许我们对输入的协方差建模。\n幸运的是，使用~Gibbs采样的对比散度和持续性对比散度仍然适用。\n此处无需对任何矩阵求逆。\n\n形式上，ssRBM~模型通过其能量函数定义：\n\\begin{align}\n E_{\\text{ss}}(\\Vx, \\Vs, \\Vh) &= - \\sum_i \\Vx^\\top \\MW_{:,i} s_i h_i + \\frac{1}{2} \\Vx^\\top\n \\Bigg( \\VLambda + \\sum_i \\VPhi_i h_i \\Bigg) \\Vx \\\\\n &+ \\frac{1}{2} \\sum_i \\alpha_i s_i^2 - \\sum_i \\alpha_i \\mu_i s_i h_i - \\sum_i b_i h_i \n + \\sum_i \\alpha_i \\mu_i^2 h_i,\n \\end{align}\n其中$b_i$是尖峰$h_i$的偏置，$\\VLambda$是观测值$\\Vx$上的对角精度矩阵。\n参数$\\alpha_i > 0$是实值平板变量$\\Vs_i$的标量精度参数。\n参数$\\VPhi_i$是定义$\\Vx$上的$\\Vh$调制二次惩罚的非负对角矩阵。\n每个$\\mu_i$是平板变量$s_i$的均值参数。\n\n\n利用能量函数定义的联合分布，能相对容易地导出~ssRBM~条件分布。\n例如，通过边缘化平板变量$\\Vs$，给定二值尖峰变量$\\Vh$，关于观察量的条件分布由下式给出\n\\begin{align}\n p_{\\text{ss}} (\\Vx  \\mid  \\Vh) &= \\frac{1}{P(\\Vh)} \\frac{1}{Z} \\int \\exp\\{ -E(\\Vx, \\Vs, \\Vh) \\} d\\Vs \\\\\n &= \\CalN \\Bigg( \\Vx\\,; \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} \\sum_i \\MW_{:,i}\\mu_i h_i, \n  \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} \\Bigg)\n\\end{align}\n其中$ \\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} = (\\VLambda + \\sum_i \\VPhi_i h_i \n-\\sum_i \\alpha_i^{-1} h_i \\MW_{:,i}\\MW_{:,i}^\\top)^{-1}$。\n最后的等式只有在协方差矩阵$\\MC_{\\Vx \\mid \\Vh}^{\\,\\text{ss}} $正定时成立。\n\n由尖峰变量选通意味着$\\RVh \\odot \\RVs$上的真实边缘分布是稀疏的。\n这不同于稀疏编码，其中来自模型的样本在编码中\"几乎从不\"（在测度理论意义上）包含零，并且需要MAP推断来强加稀疏性。\n\n<!-- % -- 672 -- -->\n\n相比~mcRBM~和~mPoT~模型，ssRBM~以明显不同的方式参数化观察量的条件协方差。\nmcRBM~和~mPoT~都通过 $\\big( \\sum_j h_j^{(c)} \\Vr^{(j)} \\Vr^{(j)\\top} + \\MI \\big)^{-1}$建模观察量的协方差结构，使用 $\\Vh_j > 0$的隐藏单元的激活来对方向$\\Vr^{(j)}$的条件协方差施加约束。\n相反，ssRBM~使用隐藏尖峰激活$h_i = 1$来指定观察结果的条件协方差，以沿着由相应权重向量指定的方向捏合精度矩阵。\nssRBM~条件协方差与一个不同模型给出的类似：概率主成分分析的乘积（PoPPCA）{cite?}。\n在过完备的设定下，ssRBM~参数化的稀疏激活仅允许在稀疏激活$h_i$的所选方向上有显著方差（高于由$\\VLambda^{-1}$给出的近似方差）。\n在~mcRBM~或~mPoT~模型中，过完备的表示意味着，捕获观察空间中特定方向上的变化需要在该方向上的正交投影下去除潜在的所有约束。\n这表明这些模型不太适合于过完备设定。\n\n尖峰和平板RBM~的主要缺点是参数的一些设置会对应于非正定的协方差矩阵。\n这种协方差矩阵会在离均值更远的值上放置更大的未归一化概率，导致所有可能结果上的积分发散。\n通常这个问题可以通过简单的启发式技巧来避免。\n理论上还没有任何令人满意的解决方法。\n使用约束优化来显式地避免概率未定义的区域（不过分保守是很难做到的），并且这还会阻止模型到达参数空间的高性能区域。\n\n定性地，ssRBM~的卷积变体能产生自然图像的优秀样本。\n\\fig?中展示了一些样例。\n\nssRBM~允许几个扩展，\n包括平板变量的高阶交互和平均池化{cite?} 使得模型能够在标注数据稀缺时为分类器学习到出色的特征。\n向能量函数添加一项能防止配分函数在稀疏编码模型下变得不确定，如尖峰和平板稀疏编码~{cite?}，也称为S3C。\n\n<!-- % -- 673 -- -->\n\n\n# 卷积玻尔兹曼机 \n\n\n如\\chap?所示，超高维度输入（如图像）会对机器学习模型的计算、 内存和统计要求造成很大的压力。\n通过使用小核的离散卷积来替换矩阵乘法是解决具有空间平移不变性或时间结构的输入问题的标准方式。\n{Desjardins-2008} 表明这种方法应用于~RBM~时效果很好。\n\n深度卷积网络通常需要池化操作，使得每个连续层的空间大小减小。\n前馈卷积网络通常使用池化函数，例如池化元素的最大值。\n目前尚不清楚如何将其推广到基于能量的模型的设定中。\n我们可以在$n$个二值检测器单元$\\RVd$上引入二值池化单元$\\RSp$，强制$p = \\max_i d_i$，并且当违反约束时将能量函数设置为$\\infty$。\n因为它需要评估$2^n$个不同的能量设置来计算归一化常数，这种方式不能很好地扩展。\n对于小的$3\\times3$池化区域，每个池化单元需要评估$2^9 = 512$个能量函数！\n\n\n~{HonglakL2009} 针对这个问题，开发了一个称为\\,\\textbf{概率最大池化}(probabilistic max pooling)的解决方案（不要与\"随机池化\"混淆，\"随机池化\"是用于隐含地构建卷积前馈网络集成的技术）。\n概率最大池化背后的策略是约束检测器单元，使得一次最多只有一个可以处于活动状态。\n这意味着仅存在$n + 1$个总状态（$n$个检测器单元中某一个状态为开和一个对应于所有检测器单元关闭的附加状态）。\n当且仅当检测器单元中的一个开启时，池化单元打开。\n所有单元的状态关闭时，能量被分配为零。\n我们可以认为这是在用包含$n + 1$个状态的单个变量来描述模型，或者等价地具有$n + 1$个变量的模型，除了$n+1$个联合分配的变量之外的能量赋为$\\infty$。\n\n虽然高效的概率最大池化确实能强迫检测器单元互斥，这在某些情景下可能是有用的正则化约束而在其他情景下是对模型容量有害的限制。\n它也不支持重叠池化区域。\n从前馈卷积网络获得最佳性能通常需要重叠的池化区域，因此这种约束可能大大降低了卷积玻尔兹曼机 的性能。\n\n{HonglakL2009} 证明概率最大池化可以用于构建卷积深度玻尔兹曼机\\footnote{该论文将模型描述为\"深度信念网络\"，但因为它可以被描述为纯无向模型（具有易处理逐层均匀场不动点更新），所以它最适合深度玻尔兹曼机的定义。}。\n该模型能够执行诸如填补输入缺失部分的操作。\n虽然这种模型在理论上有吸引力，让它在实践中工作是具有挑战性的，作为分类器通常不如通过监督训练的传统卷积网络。\n\n<!-- % -- 674 -- -->\n\n许多卷积模型对于许多不同空间大小的输入同样有效。\n对于玻尔兹曼机， 由于各种原因很难改变输入尺寸。\n配分函数随着输入大小的改变而改变。\n此外，许多卷积网络按与输入大小成比例地缩放池化区域来实现尺寸不变性，但缩放玻尔兹曼机池化区域是不优雅的。\n传统的卷积神经网络可以使用固定数量的池化单元并且动态地增加它们池化区域的大小，以此获得可变大小输入的固定尺寸的表示。\n对于玻尔兹曼机，大型池化区域的计算成本比朴素方法高很多。\n {HonglakL2009} 的方法使得每个检测器单元在相同的池化区域中互斥，解决了计算问题，但仍然不允许大小可变的池化区域。\n例如，假设我们在学习边缘检测器时，检测器单元上具有$2 \\times 2$的概率最大池化。\n这强制约束在每个$2 \\times 2$的区域中只能出现这些边中的一条。\n如果我们随后在每个方向上将输入图像的大小增加50\\%， 则期望边缘的数量会相应地增加。\n相反，如果我们在每个方向上将池化区域的大小增加50\\%到$3 \\times 3 $，则互斥性约束现在指定这些边中的每一个在$3 \\times3$区域中仅可以出现一次。\n当我们以这种方式增长模型的输入图像时， 模型会生成密度较小的边。\n当然，这些问题只有在模型必须使用可变数量的池化，以便产出固定大小的输出向量时才会出现。\n只要模型的输出是可以与输入图像成比例缩放的特征图，使用概率最大池化的模型仍然可以接受可变大小的输入图像。\n\n图像边界处的像素也带来一些困难， 由于玻尔兹曼机中的连接是对称的事实而加剧。\n如果我们不隐式地补零输入， 则将会导致比可见单元更少的隐藏单元，并且图像边界处的可见单元将不能被良好地建模，因为它们位于较少隐藏单元的接受场中。\n然而，如果我们隐式地补零输入，则边界处的隐藏单元将由较少的输入像素驱动，并且可能在需要时无法激活。\n\n<!-- % -- 675 -- -->\n\n\n# 用于结构化或序列输出的玻尔兹曼机\n\n\n在结构化输出场景中，我们希望训练可以从一些输入$\\Vx$映射到一些输出$\\Vy$的模型，$\\Vy$的不同条目彼此相关，并且必须遵守一些约束。\n例如，在语音合成任务中，$\\Vy$是波形，并且整个波形听起来必须像连贯的发音。\n\n表示$\\Vy$中的条目之间关系的自然方式是使用概率分布$p(\\RVy  \\mid  \\Vx)$。\n扩展到建模条件分布的玻尔兹曼机可以支持这种概率模型。\n\n使用玻尔兹曼机条件建模的相同工具不仅可以用于结构化输出任务，还可以用于序列建模。 \n在后一种情况下，模型必须估计变量序列上的概率分布$p(\\RVx^{(1)}, \\dots, \\RVx^{(\\tau)})$，而不仅仅是将输入$\\Vx$映射到输出$\\Vy$。\n为完成这个任务，条件玻尔兹曼机可以表示$p(\\RVx^{(\\tau)}  \\mid  \\RVx^{(1)}, \\dots, \\RVx^{(\\tau-1)})$形式的因子。\n\n视频游戏和电影工业中一个重要序列建模任务是建模用于渲染3-D人物骨架关节角度的序列。 \n这些序列通常通过记录角色移动的运动捕获系统收集。\n人物运动的概率模型允许生成新的（之前没见过的）但真实的动画。\n为了解决这个序列建模任务，{Taylor+2007} 针对小的$m$引入了条件~RBM~建模$p(\\Vx^{(t)}  \\mid  \\Vx^{(t-1)}, \\dots, \\Vx^{(t-m)})$。\n该模型是$p(\\Vx^{(t)})$上的~RBM，其偏置参数是$\\Vx$前面$m$个值的线性函数。\n当我们条件于$\\Vx^{(t-1)}$的不同值和更早的变量时， 我们会得到一个关于$\\RVx$的新~RBM。\nRBM~关于$\\RVx$的权重不会改变，但是条件于不同的过去值， 我们可以改变~RBM~中的不同隐藏单元处于活动状态的概率。\n通过激活和去激活隐藏单元的不同子集，我们可以对$\\RVx$上诱导的概率分布进行大的改变。\n条件~RBM~的其他变体 {cite?} 和使用条件~RBM~进行序列建模的其他变体是可能的 {cite?}。\n\n另一个序列建模任务是对构成歌曲音符序列的分布进行建模。\n{Boulanger-et-al-ICML2012} 引入了\\textbf{RNN-RBM}序列模型并应用于这个任务。\nRNN-RBM由~RNN（产生用于每个时间步的~RBM~参数）组成，是帧序列$\\Vx^{(t)}$的生成模型。\n与之前只有~RBM~的偏置参数会在一个时间步到下一个发生变化的方法不同，RNN-RBM使用~RNN~来产生~RBM~的所有参数（包括权重）。\n为了训练模型，我们需要能够通过~RNN~反向传播损失函数的梯度。\n损失函数不直接应用于~RNN~输出。\n相反，它应用于~RBM。\n这意味着我们必须使用对比散度或相关算法关于~RBM~参数进行近似的微分。\n然后才可以使用通常的通过时间反向传播算法通过~RNN~反向传播该近似梯度。\n\n<!-- % -- 676 -- -->\n\n\n# 其他玻尔兹曼机\n\n玻尔兹曼机的许多其他变种是可能的。\n\n玻尔兹曼机可以用不同的训练准则扩展。\n我们专注于训练为大致最大化生成标准$\\log p(\\Vv)$的玻尔兹曼机。\n相反，旨在最大化$\\log p(y \\mid \\Vv)$来训练判别的~RBM~也是有可能的{cite?}。\n当使用生成性和判别性标准的线性组合时，该方法通常表现最好。\n不幸的是，至少使用现有的方法来看，RBM~似乎并不如~MLP~那样的监督学习器强大。\n\n在实践中使用的大多数玻尔兹曼机在其能量函数中仅具有二阶相互作用，意味着它们的能量函数是许多项的和，并且每个单独项仅包括两个随机变量之间的乘积。\n这种项的一个例子是$v_iW_{i,j}h_j$。\n我们还可以训练高阶玻尔兹曼机~{cite?} ，其中能量函数项涉及许多变量的乘积。\n隐藏单元和两个不同图像之间的三向交互可以建模从一个视频帧到下一个帧的空间变换 {cite?}。\n通过one-hot类别变量的乘法可以根据存在哪个类来改变可见单元和隐藏单元之间的关系{cite?}。\n使用高阶交互的一个最近的示例是具有两组隐藏单元的玻尔兹曼机，一组同时与可见单元$\\Vv$和类别标签$y$交互，另一组仅与输入值$\\Vv$交互{cite?}。 % ?\n这可以被解释为鼓励一些隐藏单元学习使用与类相关的特征来建模输入，而且还学习额外的隐藏单元（不需要根据样本类别，学习逼真$\\Vv$样本所需的繁琐细节）。\n高阶交互的另一个用途是选通一些特征。\n{Sohn-et-al-ICML2013} 介绍了一个带有三阶交互的玻尔兹曼机，以及与每个可见单元相关的二进制掩码变量。\n当这些掩码变量设置为零时，它们消除可见单元对隐藏单元的影响。\n这允许将与分类问题不相关的可见单元从估计类别的推断路径中移除。\n\n更一般地说，玻尔兹曼机框架是一个丰富的模型空间，允许比迄今为止已经探索的更多的模型结构。\n开发新形式的玻尔兹曼机相比于开发新的神经网络层需要更多细心和创造力，因为它通常很难找到一个能保持玻尔兹曼机所需的所有不同条件分布的可解性的能量函数。\n尽管这需要努力，该领域仍对创新开放。\n\n<!-- % -- 677 -- -->\n\n\n# 通过随机操作的反向传播\n\n\n\n传统的神经网络对一些输入变量$\\Vx$施加确定性变换。\n当开发生成模型时，我们经常希望扩展神经网络以实现$\\Vx$的随机变换。\n这样做的一个直接方法是使用额外输入$\\Vz$（从一些简单的概率分布采样得到，如均匀或高斯分布）来增强神经网络。\n神经网络在内部仍可以继续执行确定性计算，但是函数$f(\\Vx,\\Vz)$对于不能访问$\\Vz$的观察者来说将是随机的。\n假设$f$是连续可微的，我们可以像往常一样使用反向传播计算训练所需的梯度。\n\n作为示例，让我们考虑从均值$\\mu$和方差$\\sigma^2$的高斯分布中采样$\\RSy$的操作：\n\\begin{align}\n \\RSy \\sim \\CalN(\\mu, \\sigma^2).\n\\end{align}\n因为$\\RSy$的单个样本不是由函数产生的，而是由一个采样过程产生，它的输出会随我们的每次查询变化，所以取$\\RSy$相对于其分布的参数$\\mu$和$\\sigma^2$的导数似乎是违反直觉的。\n然而，我们可以将采样过程重写，对基本随机变量$\\RSz \\sim \\CalN(z;0,1)$进行转换以从期望的分布获得样本：\n\\begin{align}\n y = \\mu + \\sigma z.\n\\end{align}\n\n现在我们将其视为具有额外输入$\\RSz$的确定性操作，可以通过采样操作来反向传播。\n至关重要的是，额外输入是一个随机变量，其分布不是任何我们想对其计算导数的变量的函数。\n如果我们可以用相同的$\\RSz$值再次重复采样操作，结果会告诉我们$\\mu$或$\\sigma$的微小变化将会如何改变输出。\n\n<!-- % -- 678 -- -->\n\n能够通过该采样操作反向传播允许我们将其并入更大的图中。\n我们可以在采样分布的输出之上构建图元素。\n例如，我们可以计算一些损失函数$J(y)$的导数。\n我们还可以构建这样的图元素，其输出是采样操作的输入或参数。\n例如，我们可以通过$\\mu = f(\\Vx; \\Vtheta)$和$\\sigma = g(\\Vx; \\Vtheta)$构建更大的图。\n在这个增强图中，我们可以通过这些函数的反向传播导出$\\nabla_{\\Vtheta} J(y)$。\n\n在该高斯采样示例中使用的原理能更广泛地应用。\n我们可以将任何形为$p(\\RSy;\\Vtheta)$或$p(\\RSy \\mid \\Vx;\\Vtheta)$的概率分布表示为$p(\\RSy \\mid \\Vomega)$，其中$\\Vomega$是同时包含参数$\\Vtheta$和输入$\\Vx$的变量(如果适用的话)。\n给定从分布$p(\\RSy \\mid \\Vomega)$采样的值$\\RSy$（其中$\\Vomega$可以是其他变量的函数），我们可以将\n\\begin{align}\n \\RVy \\sim p(\\RVy  \\mid  \\Vomega)\n\\end{align}\n重写为\n\\begin{align}\n \\Vy = f(\\Vz; \\Vomega),\n\\end{align}\n其中$\\Vz$是随机性的来源。\n只要$f$是几乎处处连续可微的，我们就可以使用传统工具（例如应用于$f$的反向传播算法）计算$\\RSy$相对于$\\Vomega$的导数。\n至关重要的是，$\\Vomega$不能是$\\Vz$的函数，且$\\Vz$不能是$\\Vomega$的函数。\n这种技术通常被称为重参数化技巧、\\textbf{随机反向传播}(stochastic back-propagation)或\\textbf{扰动分析}(perturbation analysis)。\n\n\n要求$f$是连续可微的，当然需要$\\Vy$是连续的。\n如果我们希望通过产生离散值样本的采样过程进行反向传播，则可以使用强化学习算法（如~REINFORCE~算法{cite?}的变体）来估计$\\Vomega$上的梯度，这将在\\sec?中讨论。\n\n在神经网络应用中，我们通常选择从一些简单的分布中采样$\\Vz$，如单位均匀分布或单位高斯分布，并通过网络的确定性部分重塑其输入来实现更复杂的分布。\n\n通过随机操作扩展梯度或优化的想法可追溯到二十世纪中叶~{cite?}，并且首先在强化学习~{cite?}的情景下用于机器学习。\n最近，它已被应用于变分近似~{cite?} 和随机生成神经网络~{cite?}。\n许多网络，如去噪自编码器或使用~Dropout~的正则化网络，也被自然地设计为将噪声作为输入，而不需要任何特殊的重参数化就能使噪声独立于模型。\n\n<!-- % -- 679 -- -->\n\n\n## 通过离散随机操作的反向传播\n\n\n当模型发射离散变量$\\Vy$时，重参数化技巧不再适用。\n假设模型采用输入$\\Vx$和参数$\\Vtheta$，两者都封装在向量$\\Vomega$中，并且将它们与随机噪声$\\Vz$组合以产生$\\Vy$：\n\\begin{align}\n \\Vy = f(\\Vz;\\Vomega).\n\\end{align}\n因为$\\Vy$是离散的，$f$必须是一个阶跃函数。\n阶跃函数的导数在任何点都是没用的。\n在每个阶跃边界， 导数是未定义 的，但这是一个小问题。\n大问题是导数在阶跃边界之间的区域几乎处处为零。\n因此，任何代价函数 $J(\\Vy)$的导数无法给出如何更新模型参数$\\Vtheta$的任何信息。\n\nREINFORCE~算法（REward Increment $=$ nonnegative Factor $\\times$ Offset Reinforcement $\\times$ Characteristic Eligibility）提供了定义一系列简单而强大解决方案的框架{cite?}。\n其核心思想是，即使$J(f(\\Vz;\\Vomega))$是具有无用导数的阶跃函数，期望代价$\\SetE_{\\RVz \\sim p(\\RVz)} J(f(\\Vz;\\Vomega))$通常是服从梯度下降的光滑函数。\n虽然当 $\\Vy$是高维（或者是许多离散随机决策组合的结果）时，该期望通常是难解的，但我们可以使用蒙特卡罗平均进行无偏估计。\n梯度的随机估计可以与~SGD~或其他基于随机梯度的优化技术一起使用。\n\n通过简单地微分期望成本，我们可以推导出~REINFORCE~最简单的版本：\n\\begin{align}\n \\SetE_{\\Vz}[J(\\Vy)] &= \\sum_{\\Vy} J(\\Vy) p(\\Vy), \\\\\n \\frac{\\partial \\SetE[J(\\Vy)]}{\\partial \\Vomega} &= \\sum_{\\Vy} J(\\Vy)\n &=  \\sum_{\\Vy} J(\\Vy) p(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \n & \\approx \\frac{1}{m} \\sum_{\\Vy^{(i)} \\sim p(\\Vy), i=1}^m \n\\end{align}\n\\eqn?依赖于$J$不直接引用$\\Vomega$的假设。\n放松这个假设来扩展该方法是简单的。\n\\eqn?利用对数的导数规则，\n$\\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} = \\frac{1}{p(\\Vy)}\n\\frac{\\partial p(\\Vy)}{\\partial \\Vomega}$。\n\\eqn?给出了该梯度的无偏蒙特卡罗估计。\n\n<!-- % -- 680 -- -->\n\n在本节中我们写的$p(\\Vy)$，可以等价地写成$p(\\Vy  \\mid  \\Vx)$。\n这是因为$p(\\Vy)$由$\\Vomega$参数化，并且如果$\\Vx$存在，$\\Vomega$包含$\\Vtheta$和$\\Vx$两者。\n\n简单~REINFORCE~估计的一个问题是其具有非常高的方差，需要采$\\Vy$的许多样本才能获得对梯度的良好估计，或者等价地，如果仅绘制一个样本，SGD~将收敛得非常缓慢并将需要较小的学习率。\n通过使用方差减小方法~{cite?}，可以地减少该估计的方差。\n想法是修改估计量，使其预期值保持不变，但方差减小。\n在~REINFORCE~的情况下提出的方差减小方法，涉及计算用于偏移$J(\\Vy)$的\\,\\textbf{基线}(baseline)。\n注意，不依赖于$\\Vy$的任何偏移$b(\\Vw)$都不会改变估计梯度的期望，因为\n\\begin{align}\n E_{p(\\Vy)} \\Bigg[ \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega}  \\Bigg] &=\n \\sum_{\\Vy} p(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \\\\\n &= \\sum_{\\Vy} \\frac{\\partial p(\\Vy)}{\\partial \\Vomega} \\\\\n &= \\frac{\\partial}{\\partial \\Vomega} \\sum_{\\Vy} p(\\Vy) = \n \\frac{\\partial}{\\partial \\Vomega} 1 = 0,\n\\end{align}\n这意味着\n\\begin{align}\n E_{p(\\Vy)} \\Bigg[ (J(\\Vy) - b(\\Vomega))\\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega}  \\Bigg] &= \n E_{p(\\Vy)} \\Bigg[ J(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \\Bigg]\n - b(\\Vomega) E_{p(\\Vy)} \\Bigg[ \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega}  \\Bigg] \\\\\n &= E_{p(\\Vy)} \\Bigg[ J(\\Vy) \\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} \\Bigg] .\n\\end{align}\n此外，我们可以通过计算$(J(\\Vy) - b(\\Vomega))\\frac{\\partial\\log p(\\Vy)}{\\partial \\Vomega} $\n关于$p(\\Vy)$的方差，并关于$b(\\Vomega)$最小化获得最优$b(\\Vomega)$。\n我们发现这个最佳基线$b^*(\\Vomega)_i$对于向量$\\Vomega$的每个元素$\\omega_i$是不同的：\n b^*(\\Vomega)_i = \\frac{E_{p(\\Vy)} \\Big[ J(\\Vy)\n \\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}  \\Big]}\n{E_{p(\\Vy)} \\Big[\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}\\Big] }.\n\\end{align}\n相对于$\\omega_i$的梯度估计则变为\n\\begin{align}\n (J(\\Vy) - b(\\Vomega)_i)\\frac{\\partial\\log p(\\Vy)}{\\partial \\omega_i},\n\\end{align}\n其中$ b(\\Vomega)_i$ 估计上述$ b^*(\\Vomega)_i$。\n获得估计$b$通常需要将额外输出添加到神经网络，并训练新输出对$\\Vomega$的每个元素估计$E_{p(\\Vy)} \n[J(\\Vy)\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}]$和\n$E_{p(\\Vy)}[\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}]$。\n这些额外的输出可以用均方误差目标训练，对于给定的$\\Vomega$，从$p(\\Vy)$采样$\\Vy$时，分别用$J(\\Vy)\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}$和 $\\frac{\\partial\\log p(\\Vy)^2}{\\partial \\omega_i}$作目标。\n然后可以将这些估计代入\\eqn?就能恢复估计$b$。\n{Mnih+Gregor-ICML2014} 倾向于使用通过目标$J(\\Vy)$训练的单个共享输出（跨越$\\Vomega$的所有元素$i$），并使用$b(\\Vomega) \\approx E_{p(\\Vy)} [J(\\Vy)]$作为基线。\n\n<!-- % -- 681 -- -->\n\n在强化学习背景下引入的方差减小方法{cite?}， {Dayan-1990}推广了二值奖励的前期工作。\n可以参考 {bengio2013estimating}、{Mnih+Gregor-ICML2014}、{Ba+Mnih-arxiv2014}、{Mnih2014}或 {Xu-et-al-ICML2015} 中在深度学习的背景下使用减少方差的~REINFORCE~算法的现代例子。\n除了使用与输入相关的基线$b(\\Vomega)$，{Mnih+Gregor-ICML2014}发现可以在训练期间调整$(J(\\Vy) - b(\\Vomega))$的尺度（即除以训练期间的移动平均估计的标准差 ），即作为一种适应性学习率，可以抵消训练过程中该量大小发生的重要变化的影响。\n{Mnih+Gregor-ICML2014} 称之为启发式\\textbf{方差归一化}(variance normalization)。\n\n基于~REINFORCE~的估计器可以被理解为将$\\Vy$的选择与$J(\\Vy)$的对应值相关联来估计梯度。\n如果在当前参数化下不太可能出现$\\Vy$的良好值，则可能需要很长时间来偶然获得它，并且获得所需信号的配置应当被加强。\n\n\n# 有向生成网络\n\n\n如\\chap?所讨论的，有向图模型构成了一类突出的图模型。\n虽然有向图模型在更大的机器学习社群中非常流行，但在较小的深度学习社群中，大约直到2013年它们都掩盖在无向模型（如~RBM）的光彩之下。\n\n在本节中，我们回顾一些传统上与深度学习社群相关的标准有向图模型。\n\n我们已经描述过部分有向的模型——深度信念网络。\n我们还描述过可以被认为是浅度有向生成模型的稀疏编码模型。\n尽管在样本生成和密度估计方面表现不佳，在深度学习的背景下它们通常被用作特征学习器。\n我们接下来描述多种深度完全有向的模型。\n\n<!-- % -- 682 -- -->\n\n\n## sigmoid信念网络\n\n\nsigmoid信念网络 {cite?}是一种具有特定条件概率分布的有向图模型的简单形式。\n一般来说，我们可以将~sigmoid信念网络视为具有二值向量的状态$\\Vs$，其中状态的每个元素都受其祖先影响：\n\\begin{align}\n p(s_i) = \\sigma \\Bigg( \\sum_{j<i} W_{j,i} s_j + b_i \\Bigg).\n\\end{align}\n\nsigmoid信念网络最常见的结构是被分为许多层的结构，其中原始采样通过一系列多个隐藏层进行，然后最终生成可见层。\n这种结构与深度信念网络非常相似，但它们在采样过程开始时的单元彼此独立，而不是从受限玻尔兹曼机采样。\n这种结构由于各种原因而令人感兴趣。\n一个原因是该结构是可见单元上概率分布的通用近似，即在足够深的情况下，可以任意良好地近似二值变量的任何概率分布（即使各个层的宽度受限于可见层的维度 ）{cite?}。\n\n\n虽然生成可见单元的样本在~sigmoid信念网络中是非常高效的，但是其他大多数操作不是很高效。\n给定可见单元，对隐藏单元的推断是难解的。\n因为变分下界涉及对包含整个层的团求期望，均匀场推断也是难以处理的。\n这个问题一直困难到足以限制有向离散网络的普及。\n\n\n在~sigmoid信念网络中执行推断的一种方法是构造专用于~sigmoid信念网络的不同下界 {cite?}。\n这种方法只适用于非常小的网络。\n另一种方法是使用学成推断机制，如\\sec?中描述的。\nHelmholtz机 {cite?} 结合了一个~sigmoid信念网络与一个预测隐藏单元上均匀场分布参数的推断网络。\nsigmoid信念网络的现代方法{cite?} 仍然使用这种推断网络的方法。\n因为潜变量的离散本质，这些技术仍然是困难的。\n人们不能简单地通过推断网络的输出反向传播，而必须使用相对不可靠的机制即通过离散采样过程进行反向传播（如\\sec?所述）。\n最近基于重要采样、重加权的醒眠{cite?} 或双向~Helmholtz机~{cite?} 的方法使得我们可以快速训练~sigmoid信念网络，并在基准任务上达到最好的表现。\n\nsigmoid信念网络的一种特殊情况是没有潜变量的情况。\n在这种情况下学习是高效的，因为没有必要将潜变量边缘化到似然之外。\n一系列称为自回归网络的模型将这个完全可见的信念网络泛化到其他类型的变量（除二值变量）和其他结构（除对数线性关系）的条件分布。\n自回归网络将在\\sec?中描述。\n\n\n\n## 可微生成器网络\n\n\n许多生成模型基于使用可微生成器网络的想法。\n这种模型使用可微函数$g(\\Vz;\\Vtheta^{(g)})$将潜变量 $\\RVz$的样本变换为样本$\\RVx$或样本$\\RVx$上的分布，可微函数通常可以由神经网络表示。\n这类模型包括将生成器网络与推断网络配对的变分自编码器、将生成器网络与判别器网络配对的生成式对抗网络，以及孤立地训练生成器网络的技术。\n\n\n生成器网络本质上仅是用于生成样本的参数化计算过程，其中的体系结构提供了从中采样的可能分布族以及选择这些族内分布的参数。\n\n作为示例，从具有均值$\\Vmu$和协方差$\\VSigma$的正态分布绘制样本的标准过程是将来自零均值和单位协方差的正态分布的样本$\\Vz$馈送到非常简单的生成器网络中。 这个生成器网络只包含一个仿射层：\n\\begin{align}\n \\Vx = g(\\Vz) = \\Vmu + \\ML \\Vz ,\n\\end{align}\n其中$\\ML$由$\\VSigma$的~Cholesky~分解给出。\n\n\n伪随机数发生器也可以使用简单分布的非线性变换。\n例如，\\textbf{逆变换采样}(inverse transform sampling){cite?}从$U(0,1)$中采一个标量$z$，并且对标量$x$应用非线性变换。 % ??\n在这种情况下，$g(z)$由累积分布函数$F(x) = \\int_{-\\infty}^{x} p(v) dv$的反函数给出。\n如果我们能够指定$p(x)$，在$x$上积分，并取所得函数的反函数，我们不用通过机器学习就能从$p(x)$进行采样。\n\n为了从更复杂的分布（难以直接指定、难以积分或难以求所得积分的反函数）中生成样本，我们使用前馈网络来表示非线性函数$g$的参数族，并使用训练数据来推断参数以选择所期望的函数。\n\n我们可以认为$g$提供了变量的非线性变化，将$\\RVz$上的分布变换成$\\RVx$上想要的分布。\n\n回顾\\eqn?，对于可求反函数的、可微的、连续的$g$，\n\\begin{align}\n p_z(\\Vz) = p_x(g(\\Vz)) \\Big | \\det (\\frac{\\partial g}{\\partial \\Vz}) \\Big |.\n\\end{align}\n这隐含地对$\\RVx$施加概率分布：\n\\begin{align}\n p_x(\\Vx) = \\frac{p_z(g^{-1}(\\Vx))}{ | \\det (\\frac{\\partial g}{\\partial \\Vz}) |}.\n\\end{align}\n当然，取决于$g$的选择，这个公式可能难以评估，因此我们经常需要使用间接学习$g$的方法，而不是直接尝试最大化$\\log p(\\Vx)$。\n\n在某些情况下，我们使用$g$来定义$\\Vx$上的条件分布，而不是使用$g$直接提供$\\Vx$的样本。\n例如，我们可以使用一个生成器网络，其最后一层由~sigmoid~输出组成，可以提供~Bernoulli分布的平均参数：\n\\begin{align}\n p(\\RVx_i = 1  \\mid  \\Vz) = g(\\Vz)_i .\n\\end{align}\n在这种情况下， 我们使用$g$来定义$p(\\Vx  \\mid  \\RVz)$时， 我们通过边缘化$\\Vz$来对$\\Vx$施加分布：\n\\begin{align}\n p(\\Vx) = \\SetE_{\\Vz} p(\\Vx  \\mid  \\Vz).\n\\end{align}\n\n两种方法都定义了一个分布$p_g(\\Vx)$， 并允许我们使用\\sec?中的重参数化技巧来训练$p_g$的各种评估准则。\n\n<!-- % -- 685 -- -->\n\n表示生成器网络的两种不同方法（发出条件分布的参数相对直接发射样品 ）具有互补的优缺点。\n当生成器网络在$\\Vx$上定义条件分布时，它不但能生成连续数据，也能生成离散数据。\n当生成器网络直接提供采样时，它只能产生连续的数据（我们可以在前向传播中引入离散化，但这样做意味着模型不再能够使用反向传播进行训练）。\n直接采样的优点是，我们不再被迫使用条件分布（可以容易地写出来并由人类设计者进行代数操作的形式）。\n\n基于可微生成器网络的方法是由分类可微前馈网络中梯度下降的成功应用而推动的。\n在监督学习的背景中，基于梯度训练学习的深度前馈网络在给定足够的隐藏单元和足够的训练数据的情况下，在实践中似乎能保证成功。\n这个同样的方案能成功转移到生成式建模上吗？\n\n生成式建模似乎比分类或回归更困难，因为学习过程需要优化难以处理的准则。\n在可微生成器网络的情况中，准则是难以处理的，因为数据不指定生成器网络的输入$\\Vz$和输出$\\Vx$。\n在监督学习的情况下，输入$\\Vx$和输出$\\Vy$同时给出，并且优化过程只需学习如何产生指定的映射。\n在生成建模的情况下，学习过程需要确定如何以有用的方式排布$\\Vz$空间，以及额外的如何从$\\Vz$映射到$\\Vx$。\n\n{dosovitskiy2015learning}研究了一个简化问题，其中$\\Vz$和$\\Vx$之间的对应关系已经给出。\n具体来说，训练数据是计算机渲染的椅子图。\n潜变量 $\\Vz$是渲染引擎的参数，描述了椅子模型的选择、椅子的位置以及影响图像渲染的其他配置细节。\n使用这种合成的生成数据，卷积网络能够学习将图像内容的描述$\\Vz$映射到渲染图像的近似$\\Vx$。\n这表明当现代可微生成器网络具有足够的模型容量时，足以成为良好的生成模型，并且现代优化算法具有拟合它们的能力。\n困难在于当每个$\\Vx$的$\\Vz$的值不是固定的且在每次训练前是未知时，如何训练生成器网络。\n\n\n在接下来的章节中，我们讨论仅给出$\\Vx$的训练样本，训练可微生成器网络的几种方法。\n\n<!-- % -- 686 -- -->\n\n\n## 变分自编码器\n\n变分自编码器{cite?}是一个使用学好的近似推断的有向模型， 可以纯粹地使用基于梯度的方法进行训练。\n\n\n为了从模型生成样本，VAE~首先从编码分布$p_{\\text{model}}(\\Vz)$中采样$\\Vz$。\n然后使样本通过可微生成器网络 $g(\\Vz)$。\n最后，从分布$p_{\\text{model}}(\\Vx;g(\\Vz)) = p_{\\text{model}}(\\Vx  \\mid  \\Vz)$ 中采样$\\Vx$。\n然而在训练期间，近似推断网络（或编码器）$q(\\Vz  \\mid  \\Vx)$用于获得$\\Vz$，而$p_{\\text{model}}(\\Vx  \\mid  \\Vz)$则被视为解码器网络。\n\n\n变分自编码器背后的关键思想是，它们可以通过最大化与数据点$\\Vx$相关联的变分下界$\\CalL(q)$来训练：\n\\begin{align}\n\\CalL(q) &= \\SetE_{\\Vz \\sim q(\\Vz  \\mid  \\Vx)} \\log p_{\\text{model}} (\\Vz, \\Vx)\n&= \\SetE_{\\Vz \\sim q(\\Vz  \\mid  \\Vx)} \\log p_{\\text{model}} (\\Vx  \\mid  \\Vz)\n& \\leq \\log p_{\\text{model}}(\\Vx).\n\\end{align}\n在\\eqn?中，我们将第一项视为潜变量的近似后验下可见和隐藏变量的联合对数似然性（正如~EM~一样，不同的是我们使用近似而不是精确后验）。\n第二项则可视为近似后验的熵。\n当$q$被选择为高斯分布，其中噪声被添加到预测平均值时，最大化该熵项促使该噪声标准偏差的增加。\n更一般地，这个熵项鼓励变分后验将高概率质量置于可能已经产生$\\Vx$的许多$\\Vz$值上，而不是坍缩到单个估计最可能值的点。\n在\\eqn?中，我们将第一项视为在其他自编码器中出现的重构对数似然。\n第二项试图使近似后验分布$q(\\RVz  \\mid  \\Vx)$和模型先验$p_{\\text{model}}(\\Vz)$彼此接近。\n\n\n变分推断和学习的传统方法是通过优化算法推断 $q$，通常是迭代不动点方程（\\sec?）。\n这些方法是缓慢的，并且通常需要以闭解形式计算$\\SetE_{\\RVz \\sim q} \\log p_{\\text{model}} (\\Vz, \\Vx)$。 % mistake ???\n变分自编码器背后的主要思想是训练产生$q$参数的参数编码器（有时也称为推断网络或识别模型）。\n只要$\\Vz$是连续变量，我们就可以通过从$q(\\Vz  \\mid  \\Vx) = q(\\Vz; f(\\Vx; \\Vtheta))$中采样$\\Vz$的样本反向传播，以获得相对于$\\Vtheta$的梯度。\n学习则仅包括相对于编码器和解码器的参数最大化$\\CalL$。\n$\\CalL$中的所有期望都可以通过蒙特卡罗采样来近似。\n\n<!-- % -- 687 -- -->\n\n变分自编码器方法是优雅的， 理论上令人愉快的，并且易于实现。\n它也获得了出色的结果，是生成式建模中的最先进方法之一。\n它的主要缺点是从在图像上训练的变分自编码器中采样的样本往往有些模糊。\n这种现象的原因尚不清楚。\n一种可能性是模糊性是最大似然的固有效应，因为我们需要最小化$D_{\\text{KL}}(p_{\\text{data}} ||p_{\\text{model}} )$。\n如\\fig?所示，这意味着模型将为训练集中出现的点分配高的概率，但也可能为其他点分配高的概率。\n还有其他原因可以导致模糊图像。\n模型选择将概率质量置于模糊图像而不是空间的其他部分的部分原因是实际使用的变分自编码器通常在$p_{\\text{model}}(\\Vx; g(\\Vz))$使用高斯分布。\n最大化这种分布似然性的下界与训练具有均方误差的传统自编码器类似，这意味着它倾向于忽略由少量像素表示的特征或其中亮度变化微小的像素。\n如~{Theis2015d}和~{Huszar-arXiv2015}指出的，该问题不是~VAE~特有的，而是与优化对数似然或$D_{\\text{KL}}(p_{\\text{data}} ||p_{\\text{model}} )$的生成模型共享的。\n现代~VAE~模型另一个麻烦的问题是，它们倾向于仅使用$\\Vz$维度中的小子集，就像编码器不能够将具有足够局部方向的输入空间变换到边缘分布与分解前匹配的空间。\n\n\nVAE~框架可以直接扩展到大范围的模型架构。\n相比玻尔兹曼机，这是关键的优势，因为玻尔兹曼机需要非常仔细地设计模型来保持易解性。\nVAE~可以与广泛的可微算子族一起良好工作。\n一个特别复杂的~VAE~是\\textbf{深度循环注意写者}(DRAW)模型{cite?}。\nDRAW使用一个循环编码器和循环解码器并结合注意力机制。\nDRAW模型的生成过程包括顺序访问不同的小图像块并绘制这些点处的像素值。\n我们还可以通过在~VAE~框架内使用循环编码器和解码器来定义变分~RNN~{cite?}来扩展~VAE~以生成序列。\n从传统~RNN~生成样本仅在输出空间涉及非确定性操作。\n而变分~RNN~还具有由~VAE~潜变量捕获的潜在更抽象层的随机变化性。\n\n<!-- % -- 688 -- -->\n\nVAE~框架已不仅仅扩展到传统的变分下界，还有\\,\\textbf{重要加权自编码器}(importance-weighted autoencoder){cite?}的目标：\n\\begin{align}\n \\CalL_k(\\Vx, q) = \\SetE_{\\RVz^{(1)},\\dots,\\RVz^{(k)} \\sim q(\\Vz  \\mid  \\Vx)}\n \\Bigg[ \\log \\frac{1}{k} \\sum_{i=1}^k \n \\frac{p_{\\text{model}}(\\Vx, \\Vz^{(i)})}{q(\\Vz^{(i)}  \\mid  \\Vx)} \\Bigg].\n\\end{align}\n这个新的目标在$k=1$时等同于传统的下界$\\CalL$。\n然而，它也可以被解释为基于提议分布$q(\\Vz  \\mid  \\Vx)$中$\\Vz$的重要采样而形成的真实$\\log p_{\\text{model}}(\\Vx)$估计。\n重要加权自编码器目标也是$\\log p_{\\text{model}}(\\Vx)$的下界，并且随着$k$增加而变得更紧。\n\n\n变分自编码器与~MP-DBM~和其他涉及通过近似推断图的反向传播方法有一些有趣的联系 {cite?}。\n这些以前的方法需要诸如均匀场不动点方程的推断过程来提供计算图。\n变分自编码器被定义为任意计算图，这使得它能适用于更广泛的概率模型族，因为它不需要将模型的选择限制到具有易处理的均匀场不动点方程的那些模型。\n变分自编码器还具有增加模型对数似然边界的优点，而~MP-DBM~和相关模型的准则更具启发性，并且除了使近似推断的结果准确外很少有概率的解释。\n变分自编码器的一个缺点是它仅针对一个问题学习推断网络，即给定$\\Vx$ 推断 $\\Vz$。\n较老的方法能够在给定任何其他变量子集的情况下对任何变量子集执行近似推断，因为均匀场不动点方程指定如何在所有这些不同问题的计算图之间共享参数。\n\n\n变分自编码器的一个非常好的特性是，同时训练参数编码器与生成器网络的组合迫使模型学习一个编码器可以捕获的可预测的坐标系。\n这使得它成为一个优秀的流形学习算法。\n\\fig?展示了由变分自编码器学到的低维流形的例子。\n图中所示的情况之一，算法发现了存在于面部图像中两个独立的变化因素：旋转角和情绪表达。\n\n<!-- % -- 689 -- -->\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\n\\includegraphics[width=0.44\\figwidth]{Chapter20/figures/kingma-vae-2d-faces-manifold.pdf}\n\\includegraphics[width=0.55\\figwidth]{Chapter20/figures/kingma-vae-2d-mnist-manifold.pdf}\n}\n\\fi\n\\caption{由变分自编码器学习的高维流形在2维坐标系中的示例{cite?}。\n我们可以在纸上直接绘制两个可视化的维度，因此可以使用2维潜在编码训练模型来了解模型的工作原理（即使我们认为数据流形的固有维度要高得多）。\n图中所示的图像不是来自训练集的样本，而是仅仅通过改变2维\"编码\"$\\Vz$，由模型$p(\\Vx \\mid \\Vz)$实际生成的图像$\\Vx$（每个图像对应于\"编码\"$\\Vz$位于2维均匀网格的不同选择）。\n\\emph{(左)}~Frey~人脸流形的2维映射。 其中一个维度（水平）已发现大致对应于面部的旋转，而另一个（垂直）对应于情绪表达。\n\\emph{(右)}~MNIST~流形的2维映射。\n}\n\\end{figure}\n\n\n## 生成式对抗网络\n\n\n生成式对抗网络{cite?}是基于可微生成器网络的另一种生成式建模方法。\n\n\n生成式对抗网络基于博弈论场景，其中生成器网络必须与对手竞争。\n生成器网络直接产生样本$\\Vx = g(\\Vz; \\Vtheta^{(g)})$。\n其对手，判别器网络，试图区分从训练数据抽取的样本和从生成器抽取的样本。\n判别器发出由$d(\\Vx; \\Vtheta^{(d)})$给出的概率值，指示$\\Vx$是真实训练样本而不是从模型抽取的伪造样本的概率。\n\n<!-- % -- 690 -- -->\n\n\n形式化表示生成式对抗网络中学习的最简单方式是零和游戏，其中函数$v(\\Vtheta^{(g)}, \\Vtheta^{(d)})$确定判别器的收益。\n生成器接收$-v(\\Vtheta^{(g)}, \\Vtheta^{(d)})$作为它自己的收益。\n在学习期间，每个玩家尝试最大化自己的收益，因此收敛在\n\\begin{align}\n g^* = \\underset{g}{\\argmin} \\, \\underset{d}{\\max}~ v(g, d).\n\\end{align}\n$v$的默认选择是\n\\begin{align}\n v(\\Vtheta^{(g)}, \\Vtheta^{(d)}) = \\SetE_{\\RVx \\sim p_{\\text{data}}} \n \\log d(\\Vx) + \\SetE_{\\Vx \\sim p_{\\text{model}}} \\log (1 - d(\\Vx)).\n\\end{align}\n这驱使判别器试图学习将样品正确地分类为真的或伪造的。\n同时，生成器试图欺骗分类器以让其相信样本是真实的。\n在收敛时，生成器的样本与实际数据不可区分，并且判别器处处都输出$\\frac{1}{2}$。\n然后就可以丢弃判别器。\n\n\n设计~GAN~的主要动机是学习过程既不需要近似推断也不需要配分函数梯度的近似。\n当$\\max_d v(g,d)$在$\\Vtheta^{(g)}$中是凸的（例如，在概率密度函数的空间中直接执行优化的情况）时，该过程保证收敛并且是渐近一致的。\n\n\n不幸的是，在实践中由神经网络表示的$g$和$d$以及$\\max_d v(g, d)$不凸时，GAN~中的学习可能是困难的。\n{Goodfellow-ICLR2015}认为不收敛可能会引起~GAN~的欠拟合问题。\n一般来说，同时对两个玩家的成本梯度下降不能保证达到平衡。\n例如，考虑价值函数$v(a,b) = ab$，其中一个玩家控制$a$并产生成本$ab$，而另一玩家控制$b$并接收成本$-ab$。\n如果我们将每个玩家建模为无穷小的梯度步骤，每个玩家以另一个玩家为代价降低自己的成本，则$a$和$b$进入稳定的圆形轨迹，而不是到达原点处的平衡点。\n注意，极小极大化游戏的平衡不是$v$的局部最小值。\n相反，它们是同时最小化的两个玩家成本的点。\n这意味着它们是$v$的鞍点，相对于第一个玩家的参数是局部最小值，而相对于第二个玩家的参数是局部最大值。\n两个玩家可以永远轮流增加然后减少$v$，而不是正好停在玩家没有能力降低其成本的鞍点。\n目前不知道这种不收敛的问题会在多大程度上影响~GAN。\n \n{Goodfellow-ICLR2015}确定了另一种替代的形式化收益公式，其中博弈不再是零和，每当判别器最优时， 具有与最大似然学习相同的预期梯度。\n因为最大似然训练收敛，这种~GAN~博弈的重述在给定足够的样本时也应该收敛。\n不幸的是，这种替代的形式化似乎并没有提高实践中的收敛，可能是由于判别器的次优性或围绕期望梯度的高方差。\n\n<!-- % -- 691 -- -->\n\n在真实实验中，GAN~博弈的最佳表现形式既不是零和也不等价于最大似然，而是{Goodfellow-et-al-NIPS2014-small}引入的带有启发式动机的不同形式化。\n在这种最佳性能的形式中，生成器旨在增加判别器发生错误的对数概率，而不是旨在降低判别器进行正确预测的对数概率。\n这种重述仅仅是观察的结果，即使在判别器确信地拒绝所有生成器样本的情况下，它也能导致生成器代价函数的导数相对于判别器的对数保持很大。\n\n稳定~GAN~学习仍然是一个开放的问题。\n幸运的是，当仔细选择模型架构和超参数时，GAN~学习效果很好。\n{radford2015unsupervised}设计了一个深度卷积~GAN（DCGAN），在图像合成的任务上表现非常好，并表明其潜在的表示空间能捕获到变化的重要因素，如\\fig?所示。\n\\fig?展示了DCGAN生成器生成的图像示例。\n \n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centering\n$\\vcenter{\\hbox{\n\\includegraphics[width=0.45\\figwidth]{Chapter20/figures/lsun_bedrooms_small.png}\n}}\n\\vcenter{\\hbox{\n\\includegraphics[width=0.45\\figwidth]{Chapter20/figures/lsun_small.png}\n}}$\n\\fi\n\\caption{在LSUN数据集上训练后，由~GAN~生成的图像。\n\\emph{(左)}由DCGAN模型生成的卧室图像，经{radford2015unsupervised}许可转载。\n\\emph{(右)}由LAPGAN模型生成的教堂图像，经 {denton2015deep}许可转载。\n}\n\\end{figure}\n\nGAN~学习问题也可以通过将生成过程分成许多级别的细节来简化。\n我们可以训练有条件的~GAN~{cite?}，并学习从分布$p(\\Vx \\mid \\Vy)$中采样，而不是简单地从边缘分布$p(\\Vx)$中采样。\n{denton2015deep} 表明一系列的条件~GAN~可以被训练为首先生成非常低分辨率的图像，然后增量地向图像添加细节。\n由于使用拉普拉斯金字塔来生成包含不同细节水平的图像，这种技术被称为~LAPGAN~模型。\nLAPGAN~生成器不仅能够欺骗判别器网络，而且能够欺骗人类观察者，实验主体将高达40％的网络输出识别为真实数据。\n请看\\fig?中~LAPGAN~生成器生成的图像示例。\n\n\nGAN~训练过程中一个不寻常的能力是它可以拟合向训练点分配零概率的概率分布。\n生成器网络学习跟踪其点在某种程度上类似于训练点的流形，而不是最大化特定点的对数概率。\n有点矛盾的是，这意味着模型可以将负无穷大的对数似然分配给测试集，同时仍然表示人类观察者判断为能捕获生成任务本质的流形。\n这不是明显的优点或缺点，并且只要向生成器网络最后一层所有生成的值添加高斯噪声，就可以保证生成器网络向所有点分配非零概率。\n以这种方式添加高斯噪声的生成器网络，从中采样的分布，和使用生成器网络参数化条件高斯分布的均值所获得的分布是相同的。\n\n<!-- % -- 692 -- -->\n\nDropout~似乎在判别器网络中很重要。\n特别地，在计算生成器网络的梯度时，单元应当被随机地丢弃。\n使用权重除以二的确定性版本的判别器的梯度似乎不是那么有效。\n同样，从不使用~Dropout~似乎会产生不良的结果。\n\n\n虽然~GAN~框架被设计为用于可微生成器网络，但是类似的原理可以用于训练其他类型的模型。\n例如，\\textbf{自监督提升}( self-supervised boosting)可以用于训练~RBM~生成器以欺骗逻辑回归判别器~{cite?}。\n\n<!-- % -- 693 -- -->\n\n\n## 生成矩匹配网络\n\n\n生成矩匹配网络{cite?}是另一种基于可微生成器网络的生成模型。\n与~VAE~和~GAN~不同，它们不需要将生成器网络与任何其他网络配对，如不需要与用于~VAE~的推断网络配对，也不需要与~GAN~的判别器网络。\n\n\n生成矩匹配网络使用称为矩匹配的技术训练。\n矩匹配背后的基本思想是以如下的方式训练生成器——令模型生成的样本的许多统计量尽可能与训练集中的样本相似。\n在此情景下，矩是对随机变量不同幂的期望。\n例如，第一矩是均值，第二矩是平方值的均值，以此类推。\n多维情况下，随机向量的每个元素可以被升高到不同的幂， 因此使得矩可以是任意数量的形式 %？\n\\begin{align}\n \\SetE_{\\Vx} \\prod_i x_i^{n_i},\n\\end{align}\n其中 $\\Vn = [n_1, n_2, \\dots, n_d]^\\top$是一个非负整数的向量。\n\n\n在第一次检查时，这种方法似乎在计算上是不可行的。\n例如，如果我们想匹配形式为$x_ix_j$的所有矩，那么我们需要最小化在$\\Vx$的维度上是二次的多个值之间的差。\n此外，甚至匹配所有第一和第二矩将仅足以拟合多变量高斯分布，其仅捕获值之间的线性关系。\n我们使用神经网络的野心是捕获复杂的非线性关系，这将需要更多的矩。\nGAN~通过使用动态更新的判别器避免了穷举所有矩的问题，该判别器自动将其注意力集中在生成器网络最不匹配的统计量上。\n\n\n相反，我们可以通过最小化一个被称为最大平均偏差{cite?}的代价函数来训练生成矩匹配网络。\n该代价函数通过向核函数定义的特征空间隐式映射，在无限维空间中测量第一矩的误差，使得对无限维向量的计算变得可行。\n当且仅当所比较的两个分布相等时，MMD~代价为零。\n\n从可视化方面看，来自生成矩匹配网络的样本有点令人失望。\n幸运的是，它们可以通过将生成器网络与自编码器组合来改进。\n首先，训练自编码器以重构训练集。\n接下来， 自编码器的编码器用于将整个训练集转换到编码空间。\n然后训练生成器网络以生成编码样本， 这些编码样本可以经解码器映射到视觉上令人满意的样本。\n\n与~GAN~不同，代价函数仅关于一批同时来自训练集和生成器网络的实例定义。\n我们不可能将训练更新作为一个训练样本或仅来自生成器网络的一个样本的函数。\n这是因为必须将矩计算为许多样本的经验平均值。\n当批量大小太小时，MMD~可能低估采样分布的真实变化量。\n有限的批量大小都不足以大到完全消除这个问题， 但是更大的批量大小减少了低估的量。\n当批量大小太大时，训练过程就会慢得不可行，因为计算单个小梯度步长必须一下子处理许多样本。\n\n与~GAN~一样，即使生成器网络为训练点分配零概率，仍可以使用~MMD~训练生成器网络。\n\n<!-- % -- 694 -- -->\n\n\n## 卷积生成网络\n\n当生成图像时，将卷积结构的引入生成器网络通常是有用的（见~{Goodfellow-et-al-NIPS2014-small}或~{dosovitskiy2015learning}的例子）。\n为此，我们使用卷积算子的\"转置\"，如\\sec?所述。\n这种方法通常能产生更逼真的图像，并且比不使用参数共享的全连接层使用更少的参数。\n\n\n用于识别任务的卷积网络具有从图像到网络顶部的某些概括层（通常是类标签）的信息流。\n当该图像通过网络向上流动时， 随着图像的表示变得对于有害变换保持不变，信息也被丢弃。\n在生成器网络中，情况恰恰相反。\n要生成图像的表示通过网络传播时必须添加丰富的详细信息， 最后产生图像的最终表示，这个最终表示当然是带有所有细节的精细图像本身（具有对象位置、姿势、纹理以及明暗）。\n在卷积识别网络中丢弃信息的主要机制是池化层。\n而生成器网络似乎需要添加信息。\n由于大多数池化函数不可逆，我们不能将池化层求逆后放入生成器网络。\n更简单的操作是仅仅增加表示的空间大小。\n似乎可接受的方法是使用~{dosovitskiy2015learning}引入的\"去池化\"。\n该层对应于某些简化条件下最大池化的逆操作。\n首先，最大池化操作的步幅被约束为等于池化区域的宽度。\n其次，每个池化区域内的最大输入被假定为左上角的输入。\n最后，假设每个池化区域内所有非最大的输入为零。\n这些是非常强和不现实的假设，但它们允许我们对最大池化算子求逆。\n逆去池化的操作分配一个零张量，然后将每个值从输入的空间坐标$i$复制到输出的空间坐标$i \\times k$。\n整数值$k$定义池化区域的大小。\n即使驱动去池化算子定义的假设是不现实的， 后续层也能够学习补偿其不寻常的输出， 所以由整体模型生成的样本在视觉上令人满意。\n\n<!-- % -- 695 -- -->\n\n\n## 自回归网络\n\n自回归网络是没有潜在随机变量的有向概率模型。\n这些模型中的条件概率分布由神经网络表示（有时是极简单的神经网络，例如逻辑回归）。\n这些模型的图结构是完全图。\n它们可以通过概率的链式法则分解观察变量上的联合概率，从而获得形如$P(x_d \\mid x_{d-1},\\dots, x_1)$条件概率的乘积。\n这样的模型被称为\\,\\textbf{完全可见的贝叶斯网络}（fully-visible Bayes networks, FVBN），并成功地以许多形式使用，首先是对每个条件分布逻辑回归~{cite?} ，然后是带有隐藏单元的神经网络~{cite?}。\n在某些形式的自回归网络中， 例如在\\sec?中描述的~NADE~{cite?}，我们可以引入参数共享的一种形式，它能带来统计优点（较少的唯一参数）和计算优势 （较少计算量）。\n这是深度学习中反复出现的主题——\\emph{特征重用}的另一个实例。\n\n\n\n## 线性自回归网络\n\n\n自回归网络的最简单形式是没有隐藏单元、没有参数或特征共享的形式。\n每个$P(x_i \\mid x_{i-1},\\dots, x_1)$被参数化为线性模型（对于实值数据的线性回归，对于二值数据的逻辑回归，对于离散数据的softmax回归）。\n这个模型由~{Frey98} 引入，当有$d$个变量要建模时，该模型有$\\CalO(d^2)$个参数。\n如\\fig?所示。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/fvbn}}\n\\fi\n\\caption{完全可见的信念网络从前$i-1$个变量预测第$i$个变量。\n\\emph{(上)}~FVBN的有向图模型。\n\\emph{(下)}对数FVBN相应的计算图，其中每个预测由线性预测器作出。\n}\n\\end{figure}\n\n如果变量是连续的，线性自回归网络只是表示多元高斯分布的另一种方式， 只能捕获观察变量之间线性的成对相互作用。\n \n线性自回归网络本质上是线性分类方法在生成式建模上的推广。\n因此，它们具有与线性分类器相同的优缺点。\n像线性分类器一样，它们可以用凸损失函数训练，并且有时允许闭解形式（如在高斯情况下）。\n像线性分类器一样，模型本身不提供增加其容量的方法，因此必须使用其他技术（如输入的基扩展或核技巧）来提高容量。\n\n<!-- % -- 696 -- -->\n\n\n## 神经自回归网络\n\n\n神经自回归网络 {cite?}具有与逻辑自回归网络相同的从左到右的图模型（\\fig?），但在该图模型结构内采用不同的条件分布参数。\n新的参数化更强大，它可以根据需要随意增加容量，并允许近似任意联合分布。\n新的参数化还可以引入深度学习中常见的参数共享和特征共享原理来改进泛化能力。\n设计这些模型的动机是避免传统表格图模型引起的维数灾难，并与\\fig?共享相同的结构。\n在表格离散概率模型中，每个条件分布由概率表表示，其中所涉及的变量的每个可能配置都具有一个条目和一个参数。\n通过使用神经网络，可以获得两个优点：\n\\begin{enumerate}\n+ 通过具有$(i-1) \\times k$个输入和$k$个输出的神经网络（如果变量是离散的并有$k$个值，使用one-hot编码）参数化每个$P(x_i  \\mid  x_{i-1}, \\dots, x_1)$，让我们不需要指数量级参数（和样本）的情况下就能估计条件概率， 然而仍然能够捕获随机变量之间的高阶依赖性。\n\n+ 不需要对预测每个$x_i$使用不同的神经网络，如\\fig?所示的从左到右连接，允许将所有神经网络合并成一个。\n 等价地，它意味着为预测$x_i$所计算的隐藏层特征可以重新用于预测$x_{i+k}~(k > 0)$。\n 因此隐藏单元被\\emph{组织}成第$i$组中的所有单元仅依赖于输入值 $x_1, \\dots, x_i$的特定的组。\n 用于计算这些隐藏单元的参数被联合优化以改进对序列中所有变量的预测。\n 这是\\emph{重用原理}的一个实例，这是从循环和卷积网络架构到多任务和迁移学习的场景中反复出现的深度学习原理。\n\n\\end{enumerate}\n\n<!-- % -- 697 -- -->\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/neural_autoregressive}}\n\\fi\n\\caption{神经自回归网络从前$i-1$个变量预测第$i$个变量$x_i$，但经参数化后，作为$x_1,\\dots,x_i$函数的特征（表示为$h_i$的隐藏单元的组）可以在预测所有后续变量$x_{i+1},x_{i+2},\\dots,x_{d}$时重用。\n}\n\\end{figure}\n\n\n如在\\sec?中讨论的，使神经网络的输出预测$x_i$条件分布的\\emph{参数}，每个$P(x_i  \\mid  x_{i-1}, \\dots, x_1)$就可以表示一个条件分布。\n虽然原始神经自回归网络最初是在纯粹离散多变量数据（带有~sigmoid~输出的~Bernoulli~变量或~softmax~输出的~Multinoulli~变量）的背景下评估，但我们可以自然地将这样的模型扩展到连续变量或同时涉及离散和连续变量的联合分布。\n\n<!-- % -- 698 -- -->\n\n\n## NADE\n\n\n神经自回归密度估计器是最近非常成功的神经自回归网络的一种形式 {cite?}。\n与~{Bengio+Bengio-NIPS2000}的原始神经自回归网络中的连接相同，但~NADE~引入了附加的参数共享方案，如\\fig?所示。\n不同组$j$的隐藏单元的参数是共享的。\n\n从第$i$个输入$x_i$到第$j$组隐藏单元的第$k$个元素$h_k^{(j)} ~(j \\geq i)$的权重$W_{j,k,i}^{'}$是组内共享的：\n\\begin{align}\n W_{j,k,i}^{'} = W_{k,i}.\n\\end{align}\n其余$j<i$的权重为零。\n\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/NADE}}\n\\fi\n\\caption{神经自回归密度估计器（NADE）的示意图。\n隐藏单元被组织在组$\\Vh^{(j)}$中，使得只有输入$x_1,\\dots,x_i$参与计算$\\Vh^{(i)}$和预测$P(x_j \\mid x_{j-1},\\dots,x_1)$（对于$j> i$）。\nNADE~使用特定的权重共享模式区别于早期的神经自回归网络：$W_{j,k,i}^{'} = W_{k,i}$被共享于所有从$x_i$到任何$j \\geq i$组中第$k$个单元的权重（在图中使用相同的线型表示复制权重的每个实例）。 \n注意向量$(W_{1,i}, W_{2,i},\\dots,W_{n,i})$记为$\\MW_{:,i}$。\n}\n\\end{figure}\n\n<!-- % -- 699 -- -->\n\n{Larochelle+Murray-2011-small} 选择了这种共享方案，使得~NADE~模型中的正向传播与在均匀场推断中执行的计算大致相似，以填充~RBM~中缺失的输入。\n这个均匀场推断对应于运行具有共享权重的循环网络，并且该推断的第一步与~NADE~中的相同。\n使用~NADE~的唯一区别是，连接隐藏单元到输出的输出权重独立于连接输入单元和隐藏单元的权重进行参数化。\n在~RBM~中，隐藏到输出的权重是输入到隐藏权重的转置。\nNADE~架构可以扩展为不仅仅模拟均匀场循环推断的一个时间步，而是$k$步。\n这种方法称为~NADE-$k$~{cite?}。\n\n\n如前所述，自回归网络可以被扩展成处理连续数据。\n用于参数化连续密度的特别强大和通用的方法是混合权重为$\\alpha_i$（组$i$的系数或先验概率），每组条件均值为$\\mu_i$和每组条件方差为$\\sigma_i^2$的高斯混合体。\n一个称为~RNADE~的模型{cite?} 使用这种参数化将~NADE~扩展到实值。\n与其他混合密度网络一样，该分布的参数是网络的输出，由~softmax~单元产生混合的权量概率以及参数化的方差，因此可使它们为正的。\n由于条件均值$\\mu_i$和条件方差$\\sigma_i^2$之间的相互作用，随机梯度下降在数值上可能会表现不好。\n为了减少这种困难， {Benigno-et-al-NIPS2013-small}在后向传播阶段使用伪梯度代替平均值上的梯度。\n\n另一个非常有趣的神经自回归架构的扩展摆脱了为观察到的变量选择任意顺序的需要{cite?}。\n在自回归网络中，该想法是训练网络以能够通过随机采样顺序来处理任何顺序，并将信息提供给指定哪些输入被观察的隐藏单元（在条件条的右侧），以及哪些是被预测并因此被认为是缺失的（在条件条的左侧）。\n这是不错的性质，因为它允许人们非常高效地使用训练好的自回归网络来\\emph{执行任何推断问题}（即从给定任何变量的子集，从任何子集上的概率分布预测或采样）。\n最后，由于变量的许多顺序是可能的（对于$n$个变量是$n!$），并且变量的每个顺序$o$产生不同的$p(\\RVx \\mid o)$，我们可以组成许多$o$值模型的集成：\n\\begin{align}\n p_{\\text{ensemble}}(\\RVx) = \\frac{1}{k} \\sum_{i=1}^k p(\\RVx  \\mid  o^{(i)}).\n\\end{align}\n这个集成模型通常能更好地泛化，并且为测试集分配比单个排序定义的单个模型更高的概率。\n\n<!-- % -- 700 -- -->\n\n在同一篇文章中，作者提出了深度版本的架构，但不幸的是，这立即使计算成本像原始神经自回归网络一样高{cite?}。\n第一层和输出层仍然可以在$\\CalO(nh)$的乘法-加法操作中计算，如在常规~NADE~中，其中$h$是隐藏单元的数量（\\fig?和\\fig?中的组$h_i$的大小），而它在~{Bengio+Bengio-NIPS2000}中是$\\CalO(n^2h)$。\n然而，对于其他隐藏层的计算量是$\\CalO(n^2 h^2)$（假设在每个层存在$n$组$h$个隐藏单元，且在$l$层的每个\"先前\"组参与预测$l+1$层处的\"下一个\"组）。\n如在~{Uria+al-ICML2014}中， 使$l+1$层上的第$i$个组仅取决于第$i$个组，$l$层处的计算量将减少到$\\CalO(nh^2)$，但仍然比常规~NADE~差$h$倍。\n\n\n\n# 从自编码器采样\n\n\n在\\chap?中，我们看到许多种学习数据分布的自编码器。\n得分匹配、 去噪自编码器和收缩自编码器之间有着密切的联系。\n这些联系表明某些类型的自编码器以某些方式学习数据分布。\n我们还没有讨论如何从这样的模型中采样。\n\n某些类型的自编码器，例如变分自编码器，明确地表示概率分布并且允许直接的原始采样。\n而大多数其他类型的自编码器则需要~MCMC~采样。\n\n收缩自编码器被设计为恢复数据流形切面的估计。\n这意味着使用注入噪声的重复编码和解码将引起沿着流形表面的随机游走{cite?}。\n这种流形扩散技术是马尔可夫链的一种。\n\n更一般的马尔可夫链还可以从任何去噪自编码器中采样。\n\n<!-- % -- 701 -- -->\n\n\n## 与任意去噪自编码器相关的马尔可夫链\n\n\n上述讨论留下了一个开放问题——注入什么噪声和从哪获得马尔可夫链（可以根据自编码器估计的分布生成样本）。\n{Bengio-et-al-NIPS2013-small}展示了如何构建这种用于\\textbf{广义去噪自编码器}(generalized denoising autoencoder)的马尔可夫链。\n广义去噪自编码器由去噪分布指定，给定损坏输入后，对干净输入的估计进行采样。\n\n根据估计分布生成的马尔可夫链的每个步骤由以下子步骤组成，如\\fig?所示：\n\\begin{enumerate}\n+ 从先前状态$\\Vx$开始，注入损坏噪声，从$C(\\tilde{\\Vx}  \\mid  \\Vx)$中采样$\\tilde{\\Vx}$。\n+ 将$\\tilde{\\Vx}$编码为$\\Vh = f(\\tilde{\\Vx})$。\n+ 解码$\\Vh$以获得$p(\\RVx  \\mid  \\Vomega = g(\\Vh)) = p(\\RVx  \\mid  \\tilde{\\Vx})$的参数$\\Vomega = g(\\Vh)$。\n+ 从$p(\\RVx  \\mid  \\Vomega = g(\\Vh)) = p(\\RVx  \\mid  \\tilde{\\Vx})$采样下一状态$\\Vx$。\n\\end{enumerate}\n{Bengio-et-al-ICML-2014} 表明，如果自编码器 $p(\\RVx  \\mid  \\tilde{\\Vx})$形成对应真实条件分布的一致估计量，则上述马尔可夫链的平稳分布形成数据生成分布$\\RVx$的一致估计量（虽然是隐式的）。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics{Chapter20/figures/dae_markov_chain}}\n\\fi\n\\caption{马尔可夫链的每个步骤与训练好的去噪自编码器相关联，根据由去噪对数似然准则隐式训练的概率模型生成样本。\n每个步骤包括：(a)通过损坏过程$C$向状态$\\Vx$注入噪声产生$\\tilde{\\Vx}$，(b)用函数$f$对其编码，产生$\\Vh = f(\\tilde{\\Vx})$，(c)用函数$g$解码结果， 产生用于重构分布的参数$\\Vomega$，(d)给定$\\Vomega$，从重构分布$p(\\RVx \\mid \\Vomega = g(f(\\tilde{\\Vx})))$采样新状态。\n在典型的平方重构误差情况下，$g(\\Vh) = \\hat{\\Vx}$，并估计$\\SetE [ \\Vx \\mid \\tilde{\\Vx}]$，损坏包括添加高斯噪声，并且从$p(\\RVx | \\Vomega)$的采样包括第二次向重构 $\\hat{\\Vx}$添加高斯噪声。\n后者的噪声水平应对应于重构的均方误差，而注入的噪声是控制混合速度以及估计器平滑经验分布程度的超参数{cite?}。\n在这所示的例子中，只有$C$和$p$条件是随机步骤（$f$和$g$是确定性计算），我们也可以在自编码器内部注入噪声，如生成随机网络~{cite?}。\n}\n\\end{figure}\n\n<!-- % -- 702 -- -->\n\n\n## 夹合与条件采样\n\n\n与玻尔兹曼机类似，去噪自编码器及其推广（例如下面描述的~GSN）可用于从条件分布$p(\\RVx_f  \\mid  \\RVx_o)$中采样，只需夹合\\emph{观察}单元$\\RVx_f$并在给定$\\RVx_f$和采好的潜变量（如果有的话）下仅重采样\\emph{自由}单元$\\RVx_o$。\n例如，MP-DBM~可以被解释为去噪自编码器的一种形式，并且能够采样丢失的输入。\nGSN~随后将~MP-DBM~中的一些想法推广以执行相同的操作~{cite?}。\n{Alain-et-al-arxiv2015} 从~{Bengio-et-al-ICML-2014}的命题1中发现了一个缺失条件，即转移算子（由从链的一个状态到下一个状态的随机映射定义）应该满足细致平衡的属性， 表明无论转移算子正向或反向运行，马尔可夫链都将保持平衡。\n\n在\\fig?中展示了夹合一半像素（图像的右部分）并在另一半上运行马尔可夫链的实验。\n\n\\begin{figure}[!htb]\n\\ifOpenSource\n\\centerline{\\includegraphics{figure.pdf}}\n\\else\n\\centerline{\\includegraphics[width=0.8\\textwidth]{Chapter20/figures/inpainting1500-half_croppedhalf__with_nearest}}\n\\fi\n\\caption{在每步仅重采样左半部分，夹合图像的右半部分并运行马尔可夫链的示意图。\n这些样本来自重构~MNIST数字的~GSN（每个时间步使用回退过程）。\n}\n\\end{figure}\n\n\n## 回退训练过程\n\n回退训练过程由~{Bengio-et-al-NIPS2013-small} 等人提出，作为一种加速去噪自编码器生成训练收敛的方法。\n不像执行一步编码-解码重建，该过程由交替的多个随机编码-解码步骤组成（如在生成马尔可夫链中），以训练样本初始化（正如在\\sec?中描述的对比散度算法），并惩罚最后的概率重建（或沿途的所有重建）。\n\n训练$k$个步骤与训练一个步骤是等价的（在实现相同稳态分布的意义上），但是实际上可以更有效地去除来自数据的伪模式。\n\n<!-- % -- 703 -- -->\n\n\n# 生成随机网络\n\n生成随机网络 {cite?} 是去噪自编码器的推广，除可见变量（通常表示为$\\RVx$）之外，在生成马尔可夫链中还包括潜变量 $\\RVh$。\n\nGSN~由两个条件概率分布参数化， 指定马尔可夫链的一步：\n\\begin{enumerate}\n+ $p(\\RVx^{(k)}  \\mid \\RVh^{(k)} )$指示在给定当前潜在状态下如何产生下一个可见变量。\n 这种\"重建分布\"也可以在去噪自编码器、 RBM、DBN~和~DBM~中找到。\n+ $p(\\RVh^{(k)}  \\mid \\RVh^{(k-1)}, \\RVx^{(k-1)})$指示在给定先前的潜在状态和可见变量下如何更新潜在状态变量。\n\\end{enumerate}\n\n去噪自编码器和~GSN~不同于经典的概率模型（有向或无向），它们自己参数化生成过程而不是通过可见和潜变量的联合分布的数学形式。\n相反，后者\\emph{如果存在则隐式}地定义为生成马尔可夫链的稳态分布。\n存在稳态分布的条件是温和的，并且需要与标准~MCMC~方法相同的条件（见\\sec?）。\n这些条件是保证链混合的必要条件，但它们可能被某些过渡分布的选择（例如，如果它们是确定性的）所违反。\n\n<!-- % -- 704 -- -->\n\n我们可以想象~GSN~不同的训练准则。\n由~{Bengio-et-al-ICML-2014} 提出和评估的只对可见单元上对数概率的重建，如应用于去噪自编码器。\n通过将$\\RVx^{(0)} = \\Vx$ 夹合到观察到的样本并且在一些后续时间步处使生成$\\Vx$的概率最大化，即最大化$\\log p(\\RVx^{(k)} = \\Vx  \\mid  \\RVh^{(k)})$， 其中给定$\\RVx^{(0)} = \\Vx$后，$\\RVh^{(k)}$从链中采样。\n为了估计相对于模型其他部分的$\\log p(\\RVx^{(k)} = \\Vx  \\mid  \\RVh^{(k)})$的梯度，{Bengio-et-al-ICML-2014}使用了在\\sec?中介绍的重参数化技巧。\n\n回退训练过程（在\\sec?中描述）可以用来改善训练~GSN~的收敛性~{cite?} 。\n\n\n\n## 判别性\\,GSN\n\nGSN的原始公式{cite?} 用于无监督学习和对观察数据$\\RVx$的$p(\\RVx)$的隐式建模，但是我们可以修改框架来优化$p(\\RVy  \\mid  \\Vx)$。\n\n\n例如， {Zhou+Troyanskaya-ICML2014} 以如下方式推广~GSN，只反向传播输出变量上的重建对数概率，并保持输入变量固定。\n他们将这种方式成功应用于建模序列（蛋白质二级结构），并在马尔可夫链的转换算子中引入（一维）卷积结构。\n重要的是要记住，对于马尔可夫链的每一步，我们需要为每个层生成新序列，并且该序列用于在下一时间步计算其他层的值（例如下面一个和上面一个）的输入。\n\n因此，马尔可夫链确实不只是输出变量（与更高层的隐藏层相关联），并且输入序列仅用于条件化该链，其中反向传播使得它能够学习输入序列如何条件化由马尔可夫链隐含表示的输出分布。\n因此这是在结构化输出中使用~GSN~的一个例子。\n\n{Zohrer+Pernkopf-NIPS2014-small} 引入了一个混合模型，通过简单地添加（使用不同的权重）监督和非监督成本即$\\RVy$和$\\RVx$的重建对数概率， 组合了监督目标（如上面的工作）和无监督目标（如原始的~GSN）。\n{Larochelle+Bengio-2008-small}以前在~RBM~中就提出了这样的混合标准。\n他们展示了在这种方案下分类性能的提升。\n\n<!-- % -- 705 -- -->\n\n\n# 其他生成方案\n\n目前为止我们已经描述的方法，使用~MCMC~采样、原始采样或两者的一些混合来生成样本。\n虽然这些是生成式建模中最流行的方法，但它们绝不是唯一的方法。\n\n\n{Sohl-Dickstein-et-al-ICML2015} 开发了一种基于非平衡热力学学习生成模型的\\,\\textbf{扩散反演}(diffusion inversion)训练方案。\n该方法基于我们希望从中采样的概率分布具有结构的想法。\n这种结构会被递增地使概率分布具有更多熵的扩散过程逐渐破坏。\n为了形成生成模型，我们可以反过来运行该过程，通过训练模型逐渐将结构恢复到非结构化分布。\n通过迭代地应用使分布更接近目标分布的过程，我们可以逐渐接近该目标分布。\n在涉及许多迭代以产生样本的意义上，这种方法类似于~MCMC~方法。\n然而，模型被定义为由链的最后一步产生的概率分布。\n在这个意义上，没有由迭代过程诱导的近似。\n{Sohl-Dickstein-et-al-ICML2015} 介绍的方法也非常接近于去噪自编码器的生成解释（\\sec?）。\n与去噪自编码器一样， 扩散反演训练一个尝试概率地撤消添加的噪声效果的转移算子。\n不同之处在于，扩散反演只需要消除扩散过程的一个步骤，而不是一直返回到一个干净的数据点。\n这解决了去噪自编码器的普通重建对数似然目标中存在的以下两难问题：小噪声的情况下学习者只能看到数据点附近的配置， 而在大噪声的情况下，去噪自编码器被要求做几乎不可能的工作（因为去噪分布是高度复杂和多峰值的）。\n利用扩散反演目标，学习者可以更精确地学习数据点周围的密度形状，以及去除可能在远离数据点处出现的假性模式。\n\n样本生成的另一种方法是近似贝叶斯计算框架{cite?}。\n在这种方法中，样本被拒绝或修改以使样本选定函数的矩匹配期望分布的那些矩。\n虽然这个想法与矩匹配一样使用样本的矩，但它不同于矩匹配，因为它修改样本本身，而不是训练模型来自动发出具有正确矩的样本。\n{BachmanP15} 展示了如何在深度学习的背景下使用~ABC~中的想法，即使用~ABC~来塑造, % ？ 整~GSN~的~MCMC~轨迹。\n\n我们期待更多其他等待发现的生成式建模方法。\n\n<!-- % -- 706 -- -->\n\n\n# 评估生成模型\n\n\n研究生成模型的研究者通常需要将一个生成模型与另一个生成模型比较，通常是为了证明新发明的生成模型比之前存在的模型更能捕获一些分布。\n\n这可能是一个困难且微妙的任务。\n通常，我们不能实际评估模型下数据的对数概率，但仅可以评估一个近似。\n在这些情况下，重要的是思考和沟通清楚正在测量什么。\n例如，假设我们可以评估模型A对数似然的随机估计和模型B对数似然的确定性下界。\n如果模型A得分高于模型B，哪个更好？\n如果我们关心确定哪个模型具有分布更好的内部表示，我们实际上不能说哪个更好，除非我们有一些方法来确定模型B的边界有多松。\n然而，如果我们关心在实践中该模型能用得多好，例如执行异常检测，则基于特定于感兴趣的实际任务的准则，可以公平地说模型是更好的，例如基于排名测试样例和排名标准，如精度和召回率。\n\n评估生成模型的另一个微妙之处是，评估指标往往是自身困难的研究问题。 \n可能很难确定模型是否被公平比较。\n例如，假设我们使用~AIS~来估计$\\log Z$以便为我们刚刚发明的新模型计算$\\log \\tilde{p}(\\Vx) - \\log Z$。\nAIS~计算经济的实现可能无法找到模型分布的几种模式并低估$Z$，这将导致我们高估$\\log p(\\Vx)$。\n因此可能难以判断高似然估计是否是良好模型或不好的~AIS~实现导致的结果。\n \n机器学习的其他领域通常允许在数据预处理中有一些变化。\n例如，当比较对象识别算法的准确性时，通常可接受的是对每种算法略微不同地预处理输入图像（基于每种算法具有何种输入要求）。\n而因为预处理的变化，会导致生成式建模的不同，甚至非常小和微妙的变化也是完全不可接受的。\n对输入数据的任何更改都会改变要捕获的分布，并从根本上改变任务。\n例如，将输入乘以$0.1$将人为地将概率增加$10$倍。\n\n<!-- % -- 707 -- -->\n\n预处理的问题通常在基于MNIST数据集上的生成模型产生，MNIST数据集是非常受欢迎的生成式建模基准之一。\nMNIST由灰度图像组成。\n一些模型将MNIST图像视为实向量空间中的点，而其他模型将其视为二值。\n还有一些将灰度值视为二值样本的概率。\n我们必须将实值模型仅与其他实值模型比较，二值模型仅与其他二值模型进行比较。\n否则，测量的似然性不在相同的空间。\n对于二值模型，对数似然可以最多为零，而对于实值模型，它可以是任意高的，因为它是关于密度的测度。\n在二值模型中，比较使用完全相同的二值化模型是重要的。\n例如，我们可以将$0.5$设为阈值后，将灰度像素二值化为0或1，或者通过由灰度像素强度给出样本为1的概率来采一个随机样本。\n如果我们使用随机二值化，我们可能将整个数据集二值化一次，或者我们可能为每个训练步骤采不同的随机样例，然后采多个样本进行评估。\n这三个方案中的每一个都会产生极不相同的似然数，并且当比较不同的模型时，两个模型使用相同的二值化方案来训练和评估是重要的。\n事实上，应用单个随机二值化步骤的研究者共享包含随机二值化结果的文件，使得基于二值化步骤的不同输出的结果没有差别。\n\n因为从数据分布生成真实样本是生成模型的目标之一，所以实践者通常通过视觉检查样本来评估生成模型。\n在最好的情况下，这不是由研究人员本身，而是由不知道样品来源的实验受试者完成 {cite?}。\n不幸的是，非常差的概率模型可能会产生非常好的样本。\n验证模型是否仅复制一些训练示例的常见做法如\\fig?所示。\n该想法是根据在$\\Vx$空间中的欧几里得距离，为一些生成的样本显示它们在训练集中的最近邻。\n此测试旨在检测模型过拟合训练集并仅再现训练实例的情况。\n甚至可能同时欠拟合和过拟合，但仍然能产生单独看起来好的样本。\n想象一下，生成模型用狗和猫的图像训练时，但只是简单地学习来重现狗的训练图像。\n这样的模型明显过拟合，因为它不能产生不在训练集中的图像，但是它也欠拟合，因为它不给猫的训练图像分配概率。\n然而，人类观察者将判断狗的每个个体图像都是高质量的。\n在这个简单的例子中，对于能够检查许多样本的人类观察者来说，确定猫的不存在是容易的。\n在更实际的设定中，在具有数万个模式的数据上训练后的生成模型可以忽略少数模式，并且人类观察者不能容易地检查或记住足够的图像以检测丢失的变化。\n\n<!-- % -- 708 -- -->\n\n由于样本的视觉质量不是可靠的标准，所以当计算可行时，我们通常还评估模型分配给测试数据的对数似然。\n不幸的是，在某些情况下，似然性似乎不可能测量我们真正关心的模型的任何属性。\n例如，MNIST的实值模型可以将任意低的方差分配给从不改变的背景像素，获得任意高的似然。\n即使这不是一个非常有用的事情，检测这些常量特征的模型和算法可以获得无限的奖励。\n实现接近负无穷代价的可能性存在于任何实值的最大似然问题中，但是对于MNIST的生成模型问题尤为严重， 因为许多输出值是不需要预测的。\n这强烈地表明需要开发评估生成模型的其他方法。\n\n\n{Theis2015d} 回顾了评估生成模型所涉及的许多问题，包括上述的许多想法。\n他们强调了生成模型有许多不同的用途，并且指标的选择必须与模型的预期用途相匹配。\n例如，一些生成模型更好地为大多数真实的点分配高概率，而其他生成模型擅长于不将高概率分配给不真实的点。\n这些差异可能源于生成模型是设计为最小化$D_{\\text{KL}}(p_{\\text{data}} || p_{\\text{model}})$还是$D_{\\text{KL}}(p_{\\text{model}} || p_{\\text{data}})$，如\\fig?所示。\n不幸的是，即使我们将每个指标的使用限制在最适合的任务上，目前使用的所有指标仍存在严重的缺陷。\n因此，生成式建模中最重要的研究课题之一不仅仅是如何提升生成模型，事实上还包括了设计新的技术来衡量我们的进步。\n\n<!-- % -- 709 -- -->\n\n\n# 结论\n\n\n为了让模型理解表示在给定训练数据中的大千世界，训练具有隐藏单元的生成模型是一种有力方法。\n通过学习模型$p_{\\text{model}}(\\Vx)$和表示$p_{\\text{model}}(\\Vh  \\mid  \\Vx)$，生成模型可以解答$\\Vx$输入变量之间关系的许多推断问题， 并且可以在层次的不同层对$\\Vh$求期望来提供表示$\\Vx$的许多不同方式。\n生成模型承诺为~AI~系统提供它们需要理解的、所有不同直观概念的框架，让它们有能力在面对不确定性的情况下推理这些概念。\n我们希望我们的读者能够找到增强这些方法的新途径，并继续探究学习和智能背后原理的旅程。\n\n"
  },
  {
    "path": "docs/_sass/_animations.scss",
    "content": "/* ==========================================================================\n   Animations\n   ========================================================================== */\n\n.animated{-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;}.animated.hinge{-webkit-animation-duration:2s;-moz-animation-duration:2s;-ms-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;}\n\n/* \n   Fade in\n   ========================================================================== */\n\n@-webkit-keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n@-moz-keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n@-o-keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n@keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  -moz-animation-name: fadeIn;\n  -o-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n  }\n}\n@-moz-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-20px);\n  } \n  100% {\n    opacity: 1;\n    -moz-transform: translateY(0);\n  }\n}\n@-o-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    -o-transform: translateY(0);\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  -moz-animation-name: fadeInDown;\n  -o-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n  }\n}\n@-moz-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    -moz-transform: translateY(0);\n  }\n}\n@-o-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    -o-transform: translateY(0);\n  }\n}\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  -moz-animation-name: fadeInDownBig;\n  -o-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n\n/* \n   Bounce\n   ========================================================================== */\n\n@-webkit-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(.3);\n  }\n  50% {\n    opacity: 1;\n    -webkit-transform: scale(1.05);\n  }\n  70% {\n    -webkit-transform: scale(.9);\n  }\n  100% {\n    -webkit-transform: scale(1);\n  }\n}\n@-moz-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -moz-transform: scale(.3);\n  }\n  50% {\n    opacity: 1;\n    -moz-transform: scale(1.05);\n  }\n  70% {\n    -moz-transform: scale(.9);\n  }\n  100% {\n    -moz-transform: scale(1);\n  }\n}\n@-o-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -o-transform: scale(.3);\n  }\n  50% {\n    opacity: 1;\n    -o-transform: scale(1.05);\n  }\n  70% {\n    -o-transform: scale(.9);\n  }\n  100% {\n    -o-transform: scale(1);\n  }\n}\n@keyframes bounceIn {\n  0% {\n    opacity: 0;\n    transform: scale(.3);\n  }\n  50% {\n    opacity: 1;\n    transform: scale(1.05);\n  }\n  70% {\n    transform: scale(.9);\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  -moz-animation-name: bounceIn;\n  -o-animation-name: bounceIn;\n  animation-name: bounceIn;\n}\n\n@-webkit-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    -webkit-transform: translateY(30px);\n  }\n  \n  80% {\n    -webkit-transform: translateY(-10px);\n  }\n  \n  100% {\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    -moz-transform: translateY(30px);\n  }\n  \n  80% {\n    -moz-transform: translateY(-10px);\n  }\n  \n  100% {\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    -o-transform: translateY(30px);\n  }\n  \n  80% {\n    -o-transform: translateY(-10px);\n  }\n  \n  100% {\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    transform: translateY(30px);\n  }\n  \n  80% {\n    transform: translateY(-10px);\n  }\n  \n  100% {\n    transform: translateY(0);\n  }\n}\n\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  -moz-animation-name: bounceInDown;\n  -o-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n\n/* \n   Drop\n   ========================================================================== */\n\n@-webkit-keyframes drop {\n  0% {\n    -webkit-transform: translateY(-500px);\n  } \n  100% {\n    -webkit-transform: translateY(0);\n  }\n}\n@-moz-keyframes drop {\n  0% {\n    -moz-transform: translateY(-500px);\n  } \n  100% {\n    -moz-transform: translateY(0);\n  }\n}\n@-o-keyframes drop {\n  0% {\n    -o-transform: translateY(-500px);\n  } \n  100% {\n    -o-transform: translateY(0);\n  }\n}\n@keyframes drop {\n  0% {\n    transform: translateY(-500px);\n  } \n  100% {\n    transform: translateY(0);\n  }\n}\n\n.drop {\n  -webkit-animation-name: drop;\n  -moz-animation-name: drop;\n  -o-animation-name: drop;\n  animation-name: drop;\n}\n\n/* \n   DL Menu In/Out\n   ========================================================================== */\n\n@-webkit-keyframes MenuAnimOut {\n  100% {\n    -webkit-transform: translateZ(300px);\n    opacity: 0;\n  }\n}\n@-moz-keyframes MenuAnimOut {\n  100% {\n    -moz-transform: translateZ(300px);\n    opacity: 0;\n  }\n}\n@keyframes MenuAnimOut {\n  100% {\n    transform: translateZ(300px);\n    opacity: 0;\n  }\n}\n\n@-webkit-keyframes MenuAnimIn {\n  0% {\n    -webkit-transform: translateZ(300px);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform: translateZ(0px);\n    opacity: 1;\n  }\n}\n@-moz-keyframes MenuAnimIn {\n  0% {\n    -moz-transform: translateZ(300px);\n    opacity: 0;\n  }\n  100% {\n    -moz-transform: translateZ(0px);\n    opacity: 1;\n  }\n}\n@keyframes MenuAnimIn {\n  0% {\n    transform: translateZ(300px);\n    opacity: 0;\n  }\n  100% {\n    transform: translateZ(0px);\n    opacity: 1;\n  }\n}\n\n@-webkit-keyframes SubMenuAnimIn {\n  0% {\n    -webkit-transform: translateZ(-300px);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform: translateZ(0px);\n    opacity: 1;\n  }\n}\n@-moz-keyframes SubMenuAnimIn {\n  0% {\n    -moz-transform: translateZ(-300px);\n    opacity: 0;\n  }\n  100% {\n    -moz-transform: translateZ(0px);\n    opacity: 1;\n  }\n}\n@keyframes SubMenuAnimIn {\n  0% {\n    transform: translateZ(-300px);\n    opacity: 0;\n  }\n  100% {\n    transform: translateZ(0px);\n    opacity: 1;\n  }\n}\n\n@-webkit-keyframes SubMenuAnimOut {\n  0% {\n    -webkit-transform: translateZ(0px);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translateZ(-300px);\n    opacity: 0;\n  }\n}\n@-moz-keyframes SubMenuAnimOut {\n  0% {\n    -moz-transform: translateZ(0px);\n    opacity: 1;\n  }\n  100% {\n    -moz-transform: translateZ(-300px);\n    opacity: 0;\n  }\n}\n@keyframes SubMenuAnimOut {\n  0% {\n    transform: translateZ(0px);\n    opacity: 1;\n  }\n  100% {\n    transform: translateZ(-300px);\n    opacity: 0;\n  }\n}"
  },
  {
    "path": "docs/_sass/_coderay.scss",
    "content": "/* ==========================================================================\n   CodeRay Syntax Highlighting\n   ========================================================================== */\n\n.CodeRay {\n  font-family: $code-font;\n  @include font(12);\n  color: #d0d0d0;\n  margin-bottom: 1.5em;\n  border-radius: 3px;\n}\n\n.CodeRay .code pre {\n  margin: 0;\n  padding: 1em;\n  background-color: #272822;\n  border: 1px solid darken($body-color, 5);\n}\n\ndiv.CodeRay { }\nspan.CodeRay { white-space: pre; border: 0px; padding: 2px }\n\ntable.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }\ntable.CodeRay td {\n  padding: 1em 0.5em;\n  vertical-align: top;\n}\n\n.CodeRay .line-numbers, .CodeRay .no {\n  color: #8f908a;\n  text-align: right;\n}\n\n.CodeRay .line-numbers a {\n  color: #8f908a;\n}\n\n.CodeRay .line-numbers tt { font-weight: bold }\n.CodeRay .line-numbers .highlighted { color: red }\n.CodeRay .line { display: block; float: left; width: 100%; }\n.CodeRay span.line-numbers { padding: 0 24px 0 4px; }\n.CodeRay .code { width: 100% }\n\nol.CodeRay { font-size: 10pt }\nol.CodeRay li { white-space: pre }\n\n.CodeRay .code pre { overflow: auto }\n.CodeRay .debug { color:white ! important; background:blue ! important; }\n\n.CodeRay .doctype,\n.CodeRay .key,\n.CodeRay .instance-variable { color: #f8f8f2; }\n.CodeRay .attribute-name { color: #a6e22e;}\n.CodeRay .symbol,\n.CodeRay .integer,\n.CodeRay .float { color: #ff658b; }\n.CodeRay .string { color: #2dc900; }\n.CodeRay .keyword { color: #66d9ef; }\n.CodeRay .function,\n.CodeRay .class { color: #a6e22e; }\n.CodeRay .regexp,\n.CodeRay .constant,\n.CodeRay .tag { color: #f92672; }\n.CodeRay .modifier,\n.CodeRay .predefined-constant { color: #ff84e4; }\n.CodeRay .comment { color: #75715e; }\n.CodeRay .error { color: #ecc; }\n.CodeRay .content { color: #e6db74; }\n.CodeRay .delimiter { color: #e6db74; }\n.CodeRay .inline { color: #e6db74; }"
  },
  {
    "path": "docs/_sass/_dl-menu.scss",
    "content": "/* ==========================================================================\n   DL Menu\n   ========================================================================== */\n\n.dl-menuwrapper {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 1000;\n\t-webkit-perspective: 1000px;\n\t-moz-perspective: 1000px;\n\tperspective: 1000px;\n\t-webkit-perspective-origin: 50% 200%;\n\t-moz-perspective-origin: 50% 200%;\n\tperspective-origin: 50% 200%;\n\n\t@media #{$medium} {\n\t\tposition: fixed;\n\t\tmax-width: 175px;\n\t\ttop: 25px;\n\t\tleft: 25px;\n\t}\n\n\t&.dl-menuopen {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\tbutton {\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tbackground: $comp-color;\n\t\tborder: none;\n\t\twidth: 48px;\n\t\theight: 45px;\n\t\ttext-indent: -900em;\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t\tcursor: pointer;\n\t\toutline: none;\n\t\tborder-radius: 0 0 3px 0;\n\t\topacity: 0.6;\n\t\tbox-shadow: 0 12px 24px rgba(#000,0.4);\n\t\ttransition: 0.4s ease-in-out;\n\n\t\t&:hover {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t@media #{$medium} {\n\t\t\tborder-radius: 3px;\n\t\t}\n\t}\n\n\tbutton:hover,\n\tbutton.dl-active,\n\tul {\n\t\tbackground: #aaa;\n\t}\n\n\tbutton:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\twidth: 68%;\n\t\theight: 5px;\n\t\tbackground: #fff;\n\t\ttop: 10px;\n\t\tleft: 16%;\n\t\tbox-shadow: \n\t\t\t0 10px 0 #fff, \n\t\t\t0 20px 0 #fff;\n\t}\n\n\tul {\n\t\tpadding: 0;\n\t\tlist-style: none;\n\t\t-webkit-transform-style: preserve-3d;\n\t\t-moz-transform-style: preserve-3d;\n\t\ttransform-style: preserve-3d;\n\t}\n\n\tli {\n\t\tposition: relative;\n\n\t\th4 {\n\t\t\tmargin:0;\n\t\t\tpadding: 15px 20px 0;\n\t\t\tcolor: rgba(#fff,0.9);\n\t\t}\n\n\t\tp {\n\t\t\tmargin: 0;\n\t\t\tpadding: 15px 20px;\n\t\t\t@include font-rem(14);\n\t\t\tcolor: rgba(#fff,0.8);\n\t\t\tfont-weight: 300;\n\n\t\t\ta {\n\t\t\t\tdisplay: inline;\n\t\t\t\tpadding: 0;\n\t\t\t\t@include font-rem(14);\n\t\t\t}\n\t\t}\n\n\t\ta {\n\t\t\tdisplay: block;\n\t\t\tposition: relative;\n\t\t\tpadding: 15px 20px;\n\t\t\t@include font-rem(14);\n\t\t\tline-height: 20px;\n\t\t\tfont-weight: 400;\n\t\t\tcolor: #fff;\n\t\t\toutline: none;\n\t\t}\n\n\t\t&.dl-back > a {\n\t\t\tpadding-left: 30px;\n\t\t\tbackground: rgba(0,0,0,0.2);\n\t\t}\n\n\t\t&.dl-back:after,\n\t\t> a:not(:only-child):after {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tline-height: 50px;\n\t\t\tfont-family: \"fontawesome\";\n\t\t\tcolor: #fff;\n\t\t\tspeak: none;\n\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\tcontent: \"\\f105\";\n\t\t}\n\n\t\t&.dl-back:after {\n\t\t\tleft: 10px;\n\t\t\tcolor: rgba(212,204,198,0.5);\n\t\t\t-webkit-transform: rotate(180deg);\n\t\t\t-moz-transform: rotate(180deg);\n\t\t\ttransform: rotate(180deg);\n\t\t}\n\n\t\t> a:after {\n\t\t\tright: 10px;\n\t\t\tcolor: rgba(0,0,0,0.15);\n\t\t}\n\t}\n\n\t.dl-menu {\n\t\tmargin: 5px 0 0 0;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tmax-height: 90%;\n\t\toverflow-y: auto;\n\t  overflow-x: hidden;\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t\tbox-shadow: 0 12px 24px rgba(#000,0.4);\n\t\t-webkit-transform: translateY(10px);\n\t\t-moz-transform: translateY(10px);\n\t\ttransform: translateY(10px);\n\t\t-webkit-backface-visibility: hidden;\n\t\t-moz-backface-visibility: hidden;\n\t\tbackface-visibility: hidden;\n\t\tz-index: inherit;\n\n\t\t@media #{$medium} {\n\t\t\tborder-radius: 3px;\n\t\t}\n\t}\n\n\t.dl-menu.dl-menu-toggle {\n\t\t-webkit-transition: all 0.3s ease;\n\t\t-moz-transition: all 0.3s ease;\n\t\ttransition: all 0.3s ease;\n\t}\n\n\t.dl-menu.dl-menuopen {\n\t\topacity: 1;\n\t\tpointer-events: auto;\n\t\t-webkit-transform: translateY(0px);\n\t\t-moz-transform: translateY(0px);\n\t\ttransform: translateY(0px);\n\t}\n\n\t.dl-submenu {\n\t\tborder-radius: 3px;\n\t\tbox-shadow: 0 12px 24px rgba(#000,0.4);\n\n\t\t.btn {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n\n\t/* Hide the inner submenus */\n\tli .dl-submenu {\n\t\tdisplay: none;\n\t}\n}\n\n/* \nWhen a submenu is opened, we will hide all li siblings.\nFor that we give a class to the parent menu called \"dl-subview\".\nWe also hide the submenu link. \nThe opened submenu will get the class \"dl-subviewopen\".\nAll this is done for any sub-level being entered.\n*/\n.dl-menu.dl-subview li,\n.dl-menu.dl-subview li.dl-subviewopen > a,\n.dl-menu.dl-subview li.dl-subview > a {\n\tdisplay: none;\n}\n\n.dl-menu.dl-subview li.dl-subview,\n.dl-menu.dl-subview li.dl-subview .dl-submenu,\n.dl-menu.dl-subview li.dl-subviewopen,\n.dl-menu.dl-subview li.dl-subviewopen > .dl-submenu,\n.dl-menu.dl-subview li.dl-subviewopen > .dl-submenu > li {\n\tdisplay: block;\n}\n\n/* Animation classes for moving out and in */\n.dl-menu.dl-animate-out {\n\t-webkit-animation: MenuAnimOut 0.4s ease;\n\t-moz-animation: MenuAnimOut 0.4s ease;\n\tanimation: MenuAnimOut 0.4s ease;\n}\n\n.dl-menu.dl-animate-in {\n\t-webkit-animation: MenuAnimIn 0.4s ease;\n\t-moz-animation: MenuAnimIn 0.4s ease;\n\tanimation: MenuAnimIn 0.4s ease;\n}\n\n.dl-menuwrapper > .dl-submenu.dl-animate-in {\n\t-webkit-animation: SubMenuAnimIn 0.4s ease;\n\t-moz-animation: SubMenuAnimIn 0.4s ease;\n\tanimation: SubMenuAnimIn 0.4s ease;\n}\n\n.dl-menuwrapper > .dl-submenu.dl-animate-out {\n\t-webkit-animation: SubMenuAnimOut 0.4s ease;\n\t-moz-animation: SubMenuAnimOut 0.4s ease;\n\tanimation: SubMenuAnimOut 0.4s ease;\n}\n\n/* No Touch Fallback */\n.no-touch .dl-menuwrapper li a:hover {\n\tbackground: rgba(255,248,213,0.1);\n}\n\n/* No JS Fallback */\n.no-js {\n\t.dl-trigger {\n\t\tdisplay: none;\n\t}\n\t.dl-menuwrapper {\n\t\tposition: initial;\n\n\t\t@media #{$medium} {\n\t\t\tposition: absolute;\n\t\t}\n\t}\n\n\t.dl-menuwrapper .dl-menu {\n\t\tposition: relative;\n\t\topacity: 1;\n\t\tpointer-events: auto;\n\t\t-webkit-transform: none;\n\t\t-moz-transform: none;\n\t\ttransform: none;\n\t}\n\n\t.dl-menuwrapper li .dl-submenu {\n\t\tdisplay: block;\n\t}\n\n\t.dl-menuwrapper li.dl-back {\n\t\tdisplay: none;\n\t}\n\n\t.dl-menuwrapper li > a:not(:only-child) {\n\t\tbackground: rgba(0,0,0,0.1);\n\t}\n\n\t.dl-menuwrapper li > a:not(:only-child):after {\n\t\tcontent: '';\n\t}\n\n\t.dl-menu {\n\t\tmax-height: 100%;\n\t}\n\n\t.dl-menu li {\n\t\tdisplay: block;\n\t}\n}\n\n// Menu Color\n.dl-menuwrapper button:hover,\n.dl-menuwrapper button.dl-active,\n.dl-menuwrapper ul {\n\tbackground: $comp-color;\n}\n\n// Fix for IE\n.dl-menu li {\n\tdisplay: none\n}\n\n.dl-menuopen li {\n\tdisplay: block\n}\n"
  },
  {
    "path": "docs/_sass/_elements.scss",
    "content": "/* ==========================================================================\n   Base Elements and Components\n   ========================================================================== */\n\nhr { \n    display: block; \n    margin: 1em 0; \n    padding: 0;\n    height: 1px; \n    border: 0; \n    border-top: 1px solid #ccc;\n    border-bottom: 1px solid #fff; \n}\n\n/* \n   Figures and images\n   ========================================================================== */\n\nfigure {\n  margin: 0;\n  padding-top: 10px;\n  padding-bottom: 10px;\n  @include clearfix();\n\n  img {\n    margin-bottom: 10px;\n  }\n\n  a { \n\n    img {\n      transform: translate(0, 0);\n      transition-duration: 0.25s;\n\n      &:hover {\n        transform: translate(0, -5px);\n        box-shadow: 0 0 10px rgba($base-color, 0.2);\n      }\n    }\n  }\n\n  /* 2 columns */\n  &.half {\n    @media #{$large} {\n\n      img {\n        width: 310px;\n        float: left;\n        margin-right: 10px;\n      }\n\n      figcaption {\n        clear: left;\n      }\n    }\n  }\n\n  /* 3 columns */\n  &.third {\n    @media #{$large} {\n\n      img {\n        width: 200px;\n        float: left;\n        margin-right: 10px;\n      }\n\n      figcaption {\n        clear: left;\n      }\n    }\n  }\n}\n\nsvg:not(:root) {\n  overflow: hidden; \n}\n\n/* \n   Buttons\n   ========================================================================== */\n\n.btn {\n  display: inline-block;\n  margin-bottom: 20px;\n  padding: 8px 20px;\n  @include font-rem(14);\n  background-color: $primary;\n  color: #fff;\n  border-width: 2px !important;\n  border-style: solid !important;\n  border-color: $primary;\n  border-radius: 3px;\n\n  &:visited {\n    color: #fff;\n  }\n\n  &:hover {\n    background-color: #fff;\n    color: $primary;\n  }\n}\n\n.btn-inverse {\n  background-color: #fff;\n  color: $primary;\n  border-color: #fff;\n\n  &:visited {\n    color: $primary;\n  }\n\n  &:hover {\n    background-color: $primary;\n    color: #fff;\n  }\n}\n\n.btn-success {\n  background-color: $success;\n  color: #fff;\n  border-color: $success;\n\n  &:visited {\n    color: #fff;\n  }\n\n  &:hover {\n    background-color: #fff;\n    color: $success;\n  }\n}\n\n.btn-warning {\n  background-color: $warning;\n  color: #fff;\n  border-color: $warning;\n\n  &:visited {\n    color: #fff;\n  }\n\n  &:hover {\n    background-color: #fff;\n    color: $warning;\n  }\n}\n\n.btn-danger {\n  background-color: $danger;\n  color: #fff;\n  border-color: $danger;\n\n  &:visited {\n    color: #fff;\n  }\n\n  &:hover {\n    background-color: #fff;\n    color: $danger;\n  }\n}\n\n.btn-info {\n  background-color: $info;\n  color: #fff;\n  border-color: $info;\n\n  &:visited {\n    color: #fff;\n  }\n\n  &:hover {\n    background-color: #fff;\n    color: $info;\n  }\n}\n\n/* \n   Wells\n   ========================================================================== */\n\n.well {\n  padding: 20px;\n  border: 1px solid $comp-color;\n  border-radius: 4px;\n}"
  },
  {
    "path": "docs/_sass/_grid.scss",
    "content": "/* ==========================================================================\n   Grid\n   ========================================================================== */\n\n// Defining number of columns in the grid.\n// Common Values would be 12, 16 or 24\n$width: 100%;\n$def_grid: 12;\n$margin: 0;\n\n@mixin container(){\n  margin:0 auto;\n  width:$width;\n}\n                                      \n// Works out the width of elements based\n// on total number of columns and width\n// number of columns being displayed.\n// Removes 20px for margins\n@mixin grid($grid:$def_grid,$cols:'',$float:left,$display:inline){\n  display:$display;\n  float:$float;\n  width:(100%/$grid * $cols) - ($margin * 2);\n}  \n\n// Allows for padding before element\n@mixin prefix($grid:$def_grid,$cols:''){\n  margin-left:(100%/$grid * $cols);\n}\n\n// Allows for padding after element\n@mixin suffix($grid:$def_grid,$cols:''){  \n  margin-right:(100%/$grid * $cols);    \n}\n\n// Removes left margin\n@mixin first(){\n  margin-left:0;\n}\n\n// Removes right margin\n@mixin last(){\n  margin-right:0;\n}\n\n@mixin push($grid:$def_grid,$move:'') {\n  position:relative;\n  left:(100%/$grid * $move);\n} \n\n@mixin pull($grid:$def_grid,$move:''){\n  position:relative;\n  left:(100%/$grid * $move) * -1;\n}"
  },
  {
    "path": "docs/_sass/_mixins.scss",
    "content": "/* ==========================================================================\n   Mixins\n   ========================================================================== */\n\n/* \n   Utility mixins\n   ========================================================================== */\n\n/* clearfix */\n@mixin clearfix {\n  *zoom: 1;\n\n  &:before,\n  &:after {\n    display: table;\n    content: \"\";\n    // Fixes Opera/contenteditable bug:\n    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952\n    line-height: 0;\n  }\n\n  &:after {\n    clear: both;\n  }\n}\n\n/* Webkit-style focus */\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted #333;\n  // Webkit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n/* Center-align a block level element */\n\n@mixin center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/* \n   Typography mixins\n   ========================================================================== */\n\n/* Full-fat vertical rhythm */\n@mixin font-size($size) {\n  font-size: 0px + $size;\n  font-size: 0rem + $size / $doc-font-size;\n  line-height: 0 + round($doc-line-height / $size*10000) / 10000;\n  margin-bottom: 0px + $doc-line-height;\n  margin-bottom: 0rem + ($doc-line-height / $doc-font-size);\n}\n\n/* Just the REMs */\n@mixin font-rem($size) {\n  font-size: 0px + $size;\n  font-size: 0rem + $size / $doc-font-size;\n}\n\n/* Just font-size and line-height */\n@mixin font($size) {\n  font-size: 0px + $size;\n  font-size: 0rem + $size / $doc-font-size;\n  line-height: 0 + round($doc-line-height / $size*10000) / 10000;\n}\n\n/* Ellipsis */\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap; \n}\n\n/* \n   Visibility\n   ========================================================================== */\n\n/* For image replacement */\n@mixin hide-text() {\n  text-indent : 100%;\n  white-space : nowrap;\n  overflow : hidden; \n}\n\n/* Hide from visual and speaking browsers */\n@mixin hidden() {\n  display : none !important; \n  visibility : hidden; \n}\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n/* Hide but maintain layout */\n@mixin invisible() { \n  visibility : hidden; \n}\n\n/* Hidden but available to speaking browsers */\n@mixin visuallyhidden() { \n  overflow : hidden; \n  position : absolute;\n  clip : rect(0 0 0 0); \n  height : 1px; \n  width : 1px;\n  margin : -1px; \n  padding : 0; \n  border : 0; \n}\n\n/* Make visuallyhidden focusable with a keyboard */\n.visuallyhidden.focusable:active, \n.visuallyhidden.focusable:focus { \n  position : static;\n  clip : auto; \n  height : auto; \n  width : auto;\n  margin : 0; \n  overflow: visible; \n}"
  },
  {
    "path": "docs/_sass/_page.scss",
    "content": "/* ==========================================================================\n   Page layout\n   ========================================================================== */\n\nbody {\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n\tbackground-color: $body-color;\n}\n\n/* \n   Main content\n   ========================================================================== */\n\n.entry,\n.hentry {\n\t@include clearfix;\n\n\th1, h2, h3, h4, h5, h6, p, li {\n\t\tword-wrap: break-word;\n\t}\n}\n\n.entry-content {\n\t@include font-size(16);\n\n\t// Dotted line underlines for links\n\tp > a,\n\tli > a {\n\t\tborder-bottom: 1px dotted lighten($link-color, 50);\n\n\t\t&:hover {\n\t\t\tborder-bottom-style: solid;\n\t\t}\n\t}\n\n\tli {\n\t\tmargin-bottom: 7px;\n\t}\n\n\t.footnotes {\n\t\tol, li, p {\n\t\t\t@include font-size(14);\n\t\t}\n\t}\n}\n\n/* \n   Entry header\n   ========================================================================== */\n\n.entry-header {\n\twidth: 100%;\n\toverflow: hidden;\n\tposition: relative;\n}\n\n.header-title {\n\ttext-align: center;\n\tmargin: 30px 0 0;\n\n\th1 {\n\t\tmargin: 10px 20px;\n\t\tfont-weight: 700;\n\t\t@include font-rem(32);\n\t\tcolor: lighten($base-color,20);\n\n\t\t@media #{$medium} {\n\t\t\t@include font-rem(48);\n\t\t}\n\n\t\t@media #{$large} {\n\t\t\t@include font-rem(60);\n\t\t}\n\t}\n\n\th2 {\n\t\tmargin: 0;\n\t\t@include font-rem(18);\n\t\ttext-transform: uppercase;\n\t\tcolor: lighten($base-color,40);\n\n\t\t@media #{$medium} {\n\t\t\t@include font-rem(24);\n\t\t}\n\t}\n\n\tp {\n\t\tcolor: lighten($base-color,20);\n\t}\n}\n\n.feature .header-title {\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: table;\n\tmargin-top: 0;\n\twidth: 100%;\n\theight: $feature-image-height;\n\toverflow: hidden;\n\n\t.header-title-wrap {\n\t\tdisplay: table-cell;\n\t\tvertical-align: middle;\n\t\tmargin: 0 auto;\n\t\ttext-align: center;\n\t}\n\n\th1 {\n\t\tmargin: 10px;\n\t\tfont-weight: 700;\n\t\tmargin: 10px 60px;\n\t\tcolor: #fff;\n\t\ttext-shadow: 1px 1px 4px rgba($base-color,0.6);\n\n\t\ta {\n\t\t\tcolor: #fff;\n\t\t}\n\t}\n\n\th2 {\n\t\tmargin: 0;\n\t\tcolor: #fff;\n\t\ttext-transform: uppercase;\n\n\t\t@media #{$medium} {\n\t\t\ta {\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\t\t}\n\t}\n\n\tp {\n\t\tcolor: #fff;\n\t}\n}\n\n.entry-image {\n\tposition: relative;\n\ttop: -50%; \n\tleft: -50%; \n\twidth: 200%; \n\theight: 200%;\n\tmin-height: $feature-image-height;\n\toverflow: hidden;\n\n\t&:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-color: rgba($base-color,0.3);\n\t}\n\n\timg {\n\t\tposition: absolute; \n\t\ttop: 0; \n\t\tleft: 0; \n\t\tright: 0; \n\t\tbottom: 0; \n\t\tmargin: auto; \n\t\tmin-width: 50%;\n\t\tmin-height: $feature-image-height; // match .entry-image min-height\n\t}\n}\n\n// Feature Image height on Front Page\n#post-index {\n\n\t&.feature .header-title {\n\t\theight: $front-page-feature-image-height;\n\t}\n\n\t.entry-image {\n\t\tmin-height: $front-page-feature-image-height;\n\n\t\timg {\n\t\t\tmin-height: $front-page-feature-image-height;\n\t\t}\n\t}\n}\n\n// Feature Image Caption\n.image-credit {\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\tmargin: 0 auto;\n\tmax-width: 440px;\n\tpadding: 10px 15px;\n\tbackground-color: rgba($base-color,0.5);\n\tcolor: #fff;\n\t@include font-rem(12);\n\ttext-align: right;\n\tborder-radius: 3px 0 0 0;\n\tz-index: 10;\n\n\t@media #{$medium} {\n\t\tmax-width: 760px;\n\t}\n\n\t@media #{$large} {\n\t\tmax-width: 960px;\n\t}\n\n\ta {\n\t\tcolor: #fff;\n\t\ttext-decoration: none;\n\t}\n}\n\n/* \n   Single post and page\n   ========================================================================== */\n\n.entry-meta {\n\t@include font-rem(12);\n\ttext-transform: uppercase;\n\tcolor: lighten($base-color,60);\n\n\ta {\n\t\tcolor: lighten($base-color,60);\n\t}\n\n\t.vcard {\n\n\t\t&:before {\n\t\t\tcontent: \" by \";\n\t\t}\n\t}\n\n\t.tag {\n\t\tdisplay: inline-block;\n\t\tmargin: 4px;\n\t\tcolor: #fff;\n\t\tborder-radius: 3px;\n\t\tbackground-color: lighten($base-color,50);\n\n\t\tspan {\n\t\t\tfloat: left;\n\t\t\tpadding: 2px 6px;\n\t\t}\n\n\t\t.count {\n\t\t\tbackground-color: lighten($base-color,40);\n\t\t\tborder-radius: 0 3px 3px 0;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground-color: lighten($base-color,40);\n\t\t}\n\t}\n\n\t.entry-reading-time {\n\t\tfloat: right;\n\t}\n}\n\nheader .entry-meta {\n\tdisplay: none; // hide header meta on small screens\n\n\t@media #{$medium} {\n\t\tdisplay: block;\n\t}\n}\n\n#post,\n#page {\n\n\t.entry-content {\n\t\tmargin: 40px 2px 20px 2px;\n\t\tpadding: 10px 15px;\n\t\tbackground-color: #fff;\n\t\tbox-shadow: 0 0 0 0, 0 6px 12px rgba(#000,0.1);\n\t\tborder-radius: 3px;\n\n\t\t@media #{$medium} {\n\t\t\tmargin-left: 10px;\n\t\t\tmargin-right: 10px;\n\t\t\tpadding: 20px 30px;\n\t\t}\n\n\t\t@media #{$large} {\n\t\t\tmax-width: 1000px;\n\t\t\tmargin: 50px auto 30px auto;\n\t\t\tpadding: 50px 80px;\n\t\t}\n\t}\n\n\t#disqus_thread {\n\t\tmargin: 40px 2px 20px 2px;\n\t\tpadding: 10px 15px;\n\t\tbackground-color: #fff;\n\t\tbox-shadow: 0 0 0 1px rgba($border-color,0.1), 0 6px 12px rgba(#000,0.1);\n\t\tborder-radius: 3px;\n\n\t\t@media #{$medium} {\n\t\t\tmargin-left: 10px;\n\t\t\tmargin-right: 10px;\n\t\t\tpadding: 20px 30px;\n\t\t}\n\n\t\t@media #{$large} {\n\t\t\tmax-width: 1000px;\n\t\t\tpadding: 50px 80px;\n\t\t\tmargin: 0 auto 30px auto;\n\t\t}\n\t}\n\n\t.entry-meta {\n\t\tmargin: 50px 30px 30px;\n\t\ttext-align: center;\n\t}\n}\n\n.entry-tags {\n\tdisplay: block;\n\tmargin-bottom: 6px;\n}\n\n.tag-heading,\n.year-heading {\n\tmargin-top: 0;\n}\n\n// Permalink icon for link post\n.permalink {\n\tmargin-right: 7px;\n}\n\n// Post Pagination Module\n.pagination {\n\tmargin: 20px 10px;\n\ttext-align: center;\n\n\tul {\n\t\tdisplay: inline;\n\t\tmargin-left: 10px;\n\t\tmargin-right: 10px;\n\t}\n\n\tli {\n\t\tpadding-left: 4px;\n\t\tpadding-right: 4px;\n\t}\n\n\t.current-page {\n\t\tfont-weight: 700;\n\t}\n}\n\n// Read More Module\n.read-more {\n\tposition: relative;\n\tmargin: 40px 2px 20px 2px;\n\tpadding: 40px 15px 25px;\n\tbackground-color: #fff;\n\tbox-shadow: 0 0 0 1px rgba($border-color,0.1), 0 6px 12px rgba(#000,0.1);\n\tborder-radius: 3px;\n\n\t@media #{$medium} {\n\t\tmargin: 50px 10px 20px 10px;\n\t\tpadding: 50px 40px 25px;\n\t}\n\n\t@media #{$large} {\n\t\tmax-width: 1000px;\n\t\tpadding: 50px 80px;\n\t\tmargin: 60px auto;\n\t}\n\n\ttext-align: center;\n\t@include clearfix;\n}\n\n.read-more-header {\n\tposition: absolute;\n\ttop: -20px;\n\tleft: 0;\n\tright: 0;\n\theight: 35px;\n\n\ta {\n\t\t@extend .btn;\n\t}\n}\n\n.read-more-content {\n\t@include font-size(16);\n\n\t// Dotted line underlines for links\n\tp > a,\n\tli > a {\n\t\tborder-bottom: 1px dotted lighten($link-color, 50);\n\n\t\t&:hover {\n\t\t\tborder-bottom-style: solid;\n\t\t}\n\t}\n\n\th3 {\n\t\tmargin: 0;\n\t\t@include font-rem(28);\n\n\t\ta { \n\t\t\tcolor: $text-color;\n\t\t}\n\n\t\t@media #{$medium} {\n\t\t\t@include font-rem(36);\n\t\t}\n\t}\n}\n\n.read-more-list {\n\tborder-top: solid 2px lighten($base-color,80);\n}\n\n.list-item {\n\twidth: 100%;\n\ttext-align: left;\n\n\th4 { \n\t\t@include font-rem(18);\n\t\tmargin-bottom: 0; \n\t}\n\n\tspan { \n\t\tdisplay: block;\n\t\t@include font-rem(14);\n\t\tcolor: lighten($base-color,50);\n\t}\n\n\t@media #{$medium} {\n\t\twidth: 49%;\n\t\tfloat: left;\n\n\t\t&:nth-child(2) {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n}\n\n/* \n   Post index\n   ========================================================================== */\n\n#post-index {\n\t#main {\n\t\tmargin: 40px 2px 20px 2px;\n\n\t\t@media #{$medium} {\n\t\t\tmargin-left: 20px;\n\t\t\tmargin-right: 20px;\n\t\t}\n\n\t\t@media #{$large} {\n\t\t\tmax-width: 1000px;\n\t\t\tmargin-top: 50px;\n\t\t\tmargin-left: auto;\n\t\t\tmargin-right: auto;\n\t\t}\n\t}\n\n\tarticle {\n\t\tbackground-color: #fff;\n\t\tbox-shadow: 0 0 0 0, 0 6px 12px rgba($base-color,0.1);\n\t\tborder-radius: 3px;\n\t\tmargin-bottom: 20px;\n\t\tpadding: 25px 15px;\n\n\t\t@media #{$medium} {\n\t\t\tpadding: 30px;\n\t\t}\n\n\t\t@media #{$large} {\n\t\t\tmargin-bottom: 30px;\n\t\t\tpadding: 50px 80px;\n\t\t}\n\t}\n}\n\n.entry-image-index {\n\tmargin-top: -25px;\n\tmargin-left: -15px;\n\tmargin-right: -15px;\n\tmargin-bottom: 10px;\n\n\t@media #{$medium} {\n\t\tmargin-top: -30px;\n\t\tmargin-left: -30px;\n\t\tmargin-right: -30px;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t@media #{$large} {\n\t\tmargin-top: -50px;\n\t\tmargin-left: -80px;\n\t\tmargin-right: -80px;\n\t\tmargin-bottom: 20px;\n\t}\n\n\timg {\n\t\tborder-radius: 3px 3px 0 0; // round image corners\n\t}\n}\n\n/* \n   Footer\n   ========================================================================== */\n\n.footer-wrapper {\n\t@include clearfix;\n\tmargin: 2em auto;\n\ttext-align: center;\n\tcolor: lighten($text-color,20);\n\n\ta {\n\t\tcolor: lighten($text-color,20);\n\t}\n}\n\n/* \n   Social share\n   ========================================================================== */\n\n.socialcount {\n\t@include font-rem(16);\n\n\tli { \n\t\tpadding-left: 10px;\n\t\tpadding-right: 10px;\n\t}\n\n\tp > a,\n\tli > a {\n\t\tborder-bottom-width: 0;\n\t}\n}\n\n\n/* \n   Browser upgrade\n   ========================================================================== */\n\n.upgrade {\n\tpadding: 10px;\n\ttext-align: center;\n}\n\n/* \n   Google Search\n   ========================================================================== */\n\n#goog-fixurl {\n\n\tul {\n\t\tlist-style: none;\n\t\tmargin-left: 0;\n\t\tpadding-left: 0;\n\n\t\tli {\n\t\t\tlist-style-type: none;\n\t\t}\n\t}\n}\n\n#goog-wm-qt {\n\twidth: auto;\n\tmargin-right: 10px;\n\tmargin-bottom: 20px;\n\tpadding: 8px 20px;\n\tdisplay: inline-block;\n\t@include font-rem(14);\n\tbackground-color: #fff;\n\tcolor: $text-color;\n\tborder-width: 2px !important;\n\tborder-style: solid !important;\n\tborder-color: lighten($primary,50);\n\tborder-radius: 3px;\n}\n\n#goog-wm-sb {\n\t@extend .btn;\n}\n"
  },
  {
    "path": "docs/_sass/_reset.scss",
    "content": "/* ==========================================================================\n   Reset CSS\n   Adapted from http://github.com/necolas/normalize.css\n   ========================================================================== */\n\n*, *:after, *:before {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n// Display in IE6-9 and FF3\n// -------------------------\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\n// Display block in IE6-9 and FF3\n// -------------------------\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\n// Prevents modern browsers from displaying 'audio' without controls\n// -------------------------\naudio:not([controls]) {\n    display: none;\n}\n\n// Base settings\n// -------------------------\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n// Focus states\na:focus {\n  @include tab-focus();\n}\n// Hover & Active\na:hover,\na:active {\n  outline: 0;\n}\n\n// Prevents sub and sup affecting line-height in all browsers\n// -------------------------\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\n\n// Blockquote\n// -------------------------\nblockquote {\n  margin: 0;\n}\n\n// Img border in a's and image quality\n// -------------------------\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n  max-width: 100%; /* Part 1: Set a maxium relative to the parent */\n  width: auto\\9; /* IE7-8 need help adjusting responsive images */\n  height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n// Full width tables\n// -------------------------\ntable {\n  width: 100%;\n}\n\n// Prevent max-width from affecting Google Maps\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\n\n// Forms\n// -------------------------\n// Font size in all browsers, margin changes, misc consistency\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible; // Inner spacing ie IE6/7\n  line-height: normal; // FF3/4 have !important on line-height in UA stylesheet\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner { // Inner padding and border oddities in FF3/4\n  padding: 0;\n  border: 0;\n}\nbutton,\nhtml input[type=\"button\"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls.\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n    -webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS.\n    cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.\n}\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n    cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.\n}\ninput[type=\"search\"] { // Appearance in Safari/Chrome\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5\n}\ntextarea {\n  overflow: auto; // Remove vertical scrollbar in IE6-9\n  vertical-align: top; // Readability and alignment cross-browser\n}"
  },
  {
    "path": "docs/_sass/_site.scss",
    "content": "/* ==========================================================================\n   Site utilities\n   ========================================================================== */\n\n/* \n   Selection\n   ========================================================================== */\n\n::-moz-selection { \n\tbackground-color: lighten($base-color, 65%); \n\tcolor: $base-color; \n\ttext-shadow: none; \n}\n\n::selection { \n\tbackground-color: lighten($base-color, 65%); \n\tcolor: $base-color; \n\ttext-shadow: none; \n}\n\n/* \n   Global classes\n   ========================================================================== */\n\n/* wrapper */\n.wrap {\n\tmargin: 0 auto;\n}\n\n/* capitalize */\n.all-caps {\n\ttext-transform: uppercase;\n}\n\n/* float image to the left */\n.image-left {\n\tfloat: none;\n\t@media #{$medium} {\n\t\tfloat: left;\n\t}\n}\n\n/* float image to the right */\n.image-right {\n\tfloat: none;\n\t@media #{$medium} {\n\t\tfloat: right;\n\t}\n}\n\n/* remove styling from a list element */\n.unstyled-list {\n\tlist-style: none;\n\tmargin-left: 0;\n\tpadding-left: 0;\n\n\tli {\n\t\tlist-style-type: none;\n\t}\n}\n\n/* inline a list */\n.inline-list {\n\tlist-style: none;\n\tmargin-left: 0;\n\tpadding-left: 0;\n\n\tli {\n\t\tlist-style-type: none;\n\t\tdisplay: inline;\n\t}\n}\n\n/* \n   Global transition\n   ========================================================================== */\n\nb, i, strong, em, blockquote, p, q, span, figure, img, h1, h2, header, input, a {\n\ttransition: all 0.2s ease;\n}"
  },
  {
    "path": "docs/_sass/_syntax.scss",
    "content": "/* ==========================================================================\n   Syntax Highlighting\n   ========================================================================== */\n\ndiv.highlighter-rouge,\nfigure.highlight {\n  position: relative;\n  margin-bottom: 1.5em;\n  color: #d0d0d0;\n  @include font-rem(12);\n  line-height: 1.5;\n  border: 1px solid darken($body-color, 5);\n  border-radius: 3px;\n  background-color: #272822;\n\n  .highlight {\n    margin: 0;\n    padding: 1em;\n  }\n}\n\nfigure.highlight {\n  padding-left: 1em;\n  padding-right: 1em;\n}\n\n.highlight table {\n  font-size: 1em;\n  border: 0;\n\n  td {\n    padding: 5px;\n    border: 0;\n\n    // line numbers\n    &.gutter {\n      padding-right: 1em;\n      color: #ccc;\n    }\n  }\n\n  pre {\n    margin: 0;\n  }\n}\n\n.highlight pre { width: 100%; }\n\n.highlight {\t\n\n\t.lineno { padding-right: 24px; color: #8f908a;}\n\t.hll { background-color: #49483e }\n\t.c { color: #75715e } /* Comment */\n\t.err { color: #960050; background-color: #1e0010 } /* Error */\n\t.k { color: #66d9ef } /* Keyword */\n\t.l { color: #ae81ff } /* Literal */\n\t.n { color: #f8f8f2 } /* Name */\n\t.o { color: #f92672 } /* Operator */\n\t.p { color: #f8f8f2 } /* Punctuation */\n\t.cm { color: #75715e } /* Comment.Multiline */\n\t.cp { color: #75715e } /* Comment.Preproc */\n\t.c1 { color: #75715e } /* Comment.Single */\n\t.cs { color: #75715e } /* Comment.Special */\n\t.ge { font-style: italic } /* Generic.Emph */\n\t.gs { font-weight: bold } /* Generic.Strong */\n\t.kc { color: #66d9ef } /* Keyword.Constant */\n\t.kd { color: #66d9ef } /* Keyword.Declaration */\n\t.kn { color: #f92672 } /* Keyword.Namespace */\n\t.kp { color: #66d9ef } /* Keyword.Pseudo */\n\t.kr { color: #66d9ef } /* Keyword.Reserved */\n\t.kt { color: #66d9ef } /* Keyword.Type */\n\t.ld { color: #e6db74 } /* Literal.Date */\n\t.m { color: #ae81ff } /* Literal.Number */\n\t.s { color: #e6db74 } /* Literal.String */\n\t.na { color: #a6e22e } /* Name.Attribute */\n\t.nb { color: #f8f8f2 } /* Name.Builtin */\n\t.nc { color: #a6e22e } /* Name.Class */\n\t.no { color: #66d9ef } /* Name.Constant */\n\t.nd { color: #a6e22e } /* Name.Decorator */\n\t.ni { color: #f8f8f2 } /* Name.Entity */\n\t.ne { color: #a6e22e } /* Name.Exception */\n\t.nf { color: #a6e22e } /* Name.Function */\n\t.nl { color: #f8f8f2 } /* Name.Label */\n\t.nn { color: #f8f8f2 } /* Name.Namespace */\n\t.nx { color: #a6e22e } /* Name.Other */\n\t.py { color: #f8f8f2 } /* Name.Property */\n\t.nt { color: #f92672 } /* Name.Tag */\n\t.nv { color: #f8f8f2 } /* Name.Variable */\n\t.ow { color: #f92672 } /* Operator.Word */\n\t.w { color: #f8f8f2 } /* Text.Whitespace */\n\t.mf { color: #ae81ff } /* Literal.Number.Float */\n\t.mh { color: #ae81ff } /* Literal.Number.Hex */\n\t.mi { color: #ae81ff } /* Literal.Number.Integer */\n\t.mo { color: #ae81ff } /* Literal.Number.Oct */\n\t.sb { color: #e6db74 } /* Literal.String.Backtick */\n\t.sc { color: #e6db74 } /* Literal.String.Char */\n\t.sd { color: #e6db74 } /* Literal.String.Doc */\n\t.s2 { color: #e6db74 } /* Literal.String.Double */\n\t.se { color: #ae81ff } /* Literal.String.Escape */\n\t.sh { color: #e6db74 } /* Literal.String.Heredoc */\n\t.si { color: #e6db74 } /* Literal.String.Interpol */\n\t.sx { color: #e6db74 } /* Literal.String.Other */\n\t.sr { color: #e6db74 } /* Literal.String.Regex */\n\t.s1 { color: #e6db74 } /* Literal.String.Single */\n\t.ss { color: #e6db74 } /* Literal.String.Symbol */\n\t.bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */\n\t.vc { color: #f8f8f2 } /* Name.Variable.Class */\n\t.vg { color: #f8f8f2 } /* Name.Variable.Global */\n\t.vi { color: #f8f8f2 } /* Name.Variable.Instance */\n\t.il { color: #ae81ff } /* Literal.Number.Integer.Long */\n}"
  },
  {
    "path": "docs/_sass/_typography.scss",
    "content": "/* ==========================================================================\n   Typography\n   ========================================================================== */\n\n/* \n   Body\n   ========================================================================== */\n\nbody {\n\tfont-family: $base-font;\n\tcolor: $text-color;\n}\n\n/* \n   Headings\n   ========================================================================== */\n\nh1, h2, h3, h4, h5, h6 {\n\tfont-family: $heading-font;\n}\n\nh1 {\n\t@include font-rem(28);\n\n\t@media #{$medium} {\n\t\t@include font-rem(32);\n\t}\n}\n\n/* \n   Links\n   ========================================================================== */\n\na { \n\ttext-decoration: none;\n\tcolor: $link-color; \n\n\t&:visited { \n\t\tcolor: lighten($link-color, 20); \n\t}\n\n\t&:hover { \n\t\tcolor: darken($link-color, 20); \n\t}\n\n\t&:focus { \n\t\toutline: thin dotted; \n\t\tcolor: darken($link-color, 20);\n\t}\n\n\t&:hover, \n\t&:active { \n\t\toutline: 0; \n\t}\n}\n\n.link-arrow {\n\tfont-weight: 100;\n\ttext-decoration: underline;\n\tfont-style: normal;\n}\n\n/* \n   Captions\n   ========================================================================== */\n\nfigcaption {\n\tpadding-top: 10px;\n\t@include font(14);\n\tline-height: 1.3;\n\tcolor: lighten($text-color, 10);\n}\n\n/* \n   Notices\n   ========================================================================== */\n\n.notice {\n\tmargin-top: 1.5em;\n\tpadding: .5em 1em;\n\ttext-indent: 0;\n\t@include font-rem(14);\n\tbackground-color: $body-color;\n\tborder: 1px solid darken($body-color,20);\n\tborder-radius: 3px;\n}\n\n/* \n   Blockquotes\n   ========================================================================== */\n\nblockquote {\n\tfont-family: $alt-font;\n\tfont-style: italic;\n\tborder-left: 8px solid $border-color;\n\tpadding-left: 20px;\n\n\t@media #{$medium} {\n\t\tmargin-left: -28px;\n\t}\n}\n\n/* \n   Code\n   ========================================================================== */\n\ntt, code, kbd, samp, pre {\n\tfont-family: $code-font;\n}\n\np > code,\na > code,\nli > code,\nfigcaption > code,\ntd > code {\n  margin: 0 2px;\n\tpadding: 0 5px;\n  @include font-rem(12);\n\tline-height: 1.5;\n  border: 1px solid lighten(#000, 90);\n\tbackground-color: lighten(#000, 95);\n\tborder-radius: 3px;\n}\n\npre {\n\n\t@include font-rem(12);\n\tline-height: 1.5;\n\toverflow-x: auto;\n\n\t&::-webkit-scrollbar {\n\t\theight: 12px;\n\t\tbackground-color: #34362e;\n\t\tborder-radius: 0 0 4px 4px;\n\t}\n\n\t&::-webkit-scrollbar-thumb:horizontal {\n\t\tbackground-color: #6a6d5d;\n\t\tborder-radius: 4px;\n\t}\n}"
  },
  {
    "path": "docs/_sass/_variables.scss",
    "content": "/* ==========================================================================\n   SCSS Variables\n   ========================================================================== */\n\n/* \n   Page\n   ========================================================================== */\n\n$feature-image-height            : 400px; // min 150px recommended\n$front-page-feature-image-height : 400px; // min 150px recommended\n\n/* \n   Typography\n   ========================================================================== */\n\n$base-font                       : 'Lato', Calibri, Arial, sans-serif;\n$heading-font                    : $base-font;\n$caption-font                    : $base-font;\n$code-font                       : monospace;\n$alt-font                        : serif;\n\n$doc-font-size                   : 16;\n$doc-line-height                 : 26;\n\n\n// set-up the body font-size / line-height\nbody {\n  margin-top: 0px + $doc-line-height;\n  font-size: 0px + $doc-font-size;\n}\n\n/* \n   Colors\n   ========================================================================== */\n\n$base-color                      : rgba(#222,0.8);\n$body-color                      : #e8e8e8;\n$text-color                      : rgba(#222,0.8);\n$comp-color                      : complement(#222);\n$border-color                    : lighten($base-color,60);\n$link-color                      : rgba(#222,0.8);\n\n$primary                         : #222;\n$success                         : #5cb85c;\n$warning                         : #dd8338;\n$danger                          : #C64537;\n$info                            : #308cbc;\n\n\n/* \n   Screen sizes\n   ========================================================================== */\n\n$small                           : \"only screen and (min-width: 30em)\";\n$medium                          : \"only screen and (min-width: 48em)\";\n$large                           : \"only screen and (min-width: 62.5em)\";"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_animated.scss",
    "content": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_bordered-pulled.scss",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em $fa-border-color;\n  border-radius: .1em;\n}\n\n.#{$fa-css-prefix}-pull-left { float: left; }\n.#{$fa-css-prefix}-pull-right { float: right; }\n\n.#{$fa-css-prefix} {\n  &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_core.scss",
    "content": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_fixed-width.scss",
    "content": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_icons.scss",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-feed:before,\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-y-combinator-square:before,\n.#{$fa-css-prefix}-yc-square:before,\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-intersex:before,\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n.#{$fa-css-prefix}-yc:before,\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\n.#{$fa-css-prefix}-battery-4:before,\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\n.#{$fa-css-prefix}-battery-3:before,\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\n.#{$fa-css-prefix}-battery-2:before,\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\n.#{$fa-css-prefix}-battery-1:before,\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\n.#{$fa-css-prefix}-battery-0:before,\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\n.#{$fa-css-prefix}-hourglass-1:before,\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\n.#{$fa-css-prefix}-hourglass-2:before,\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\n.#{$fa-css-prefix}-hourglass-3:before,\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\n.#{$fa-css-prefix}-hand-grab-o:before,\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\n.#{$fa-css-prefix}-hand-stop-o:before,\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\n.#{$fa-css-prefix}-tv:before,\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\n.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }\n.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }\n.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }\n.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }\n.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }\n.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }\n.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }\n.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }\n.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }\n.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }\n.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }\n.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }\n.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }\n.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }\n.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }\n.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }\n.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }\n.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }\n.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }\n.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_larger.scss",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_list.scss",
    "content": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n  position: absolute;\n  left: -$fa-li-width;\n  width: $fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.#{$fa-css-prefix}-lg {\n    left: -$fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_mixins.scss",
    "content": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n  -webkit-transform: scale($horiz, $vert);\n      -ms-transform: scale($horiz, $vert);\n          transform: scale($horiz, $vert);\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_path.scss",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n//  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_rotated-flipped.scss",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_stacked.scss",
    "content": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/_variables.scss",
    "content": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts\" !default;\n$fa-font-size-base:   14px !default;\n$fa-line-height-base: 1 !default;\n//$fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.5.0/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix:       fa !default;\n$fa-version:          \"4.5.0\" !default;\n$fa-border-color:     #eee !default;\n$fa-inverse:          #fff !default;\n$fa-li-width:         (30em / 14) !default;\n\n$fa-var-500px: \"\\f26e\";\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-amazon: \"\\f270\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-balance-scale: \"\\f24e\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-battery-0: \"\\f244\";\n$fa-var-battery-1: \"\\f243\";\n$fa-var-battery-2: \"\\f242\";\n$fa-var-battery-3: \"\\f241\";\n$fa-var-battery-4: \"\\f240\";\n$fa-var-battery-empty: \"\\f244\";\n$fa-var-battery-full: \"\\f240\";\n$fa-var-battery-half: \"\\f242\";\n$fa-var-battery-quarter: \"\\f243\";\n$fa-var-battery-three-quarters: \"\\f241\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-black-tie: \"\\f27e\";\n$fa-var-bluetooth: \"\\f293\";\n$fa-var-bluetooth-b: \"\\f294\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-check-o: \"\\f274\";\n$fa-var-calendar-minus-o: \"\\f272\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-calendar-plus-o: \"\\f271\";\n$fa-var-calendar-times-o: \"\\f273\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-diners-club: \"\\f24c\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-jcb: \"\\f24b\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-chrome: \"\\f268\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-clone: \"\\f24d\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-codiepie: \"\\f284\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-commenting: \"\\f27a\";\n$fa-var-commenting-o: \"\\f27b\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-contao: \"\\f26d\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-creative-commons: \"\\f25e\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-credit-card-alt: \"\\f283\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edge: \"\\f282\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-expeditedssl: \"\\f23e\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-feed: \"\\f09e\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-firefox: \"\\f269\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-fonticons: \"\\f280\";\n$fa-var-fort-awesome: \"\\f286\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f22d\";\n$fa-var-get-pocket: \"\\f265\";\n$fa-var-gg: \"\\f260\";\n$fa-var-gg-circle: \"\\f261\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-grab-o: \"\\f255\";\n$fa-var-hand-lizard-o: \"\\f258\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hand-paper-o: \"\\f256\";\n$fa-var-hand-peace-o: \"\\f25b\";\n$fa-var-hand-pointer-o: \"\\f25a\";\n$fa-var-hand-rock-o: \"\\f255\";\n$fa-var-hand-scissors-o: \"\\f257\";\n$fa-var-hand-spock-o: \"\\f259\";\n$fa-var-hand-stop-o: \"\\f256\";\n$fa-var-hashtag: \"\\f292\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-hourglass: \"\\f254\";\n$fa-var-hourglass-1: \"\\f251\";\n$fa-var-hourglass-2: \"\\f252\";\n$fa-var-hourglass-3: \"\\f253\";\n$fa-var-hourglass-end: \"\\f253\";\n$fa-var-hourglass-half: \"\\f252\";\n$fa-var-hourglass-o: \"\\f250\";\n$fa-var-hourglass-start: \"\\f251\";\n$fa-var-houzz: \"\\f27c\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-i-cursor: \"\\f246\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-industry: \"\\f275\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-internet-explorer: \"\\f26b\";\n$fa-var-intersex: \"\\f224\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map: \"\\f279\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-map-o: \"\\f278\";\n$fa-var-map-pin: \"\\f276\";\n$fa-var-map-signs: \"\\f277\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mixcloud: \"\\f289\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-modx: \"\\f285\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-mouse-pointer: \"\\f245\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-object-group: \"\\f247\";\n$fa-var-object-ungroup: \"\\f248\";\n$fa-var-odnoklassniki: \"\\f263\";\n$fa-var-odnoklassniki-square: \"\\f264\";\n$fa-var-opencart: \"\\f23d\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-opera: \"\\f26a\";\n$fa-var-optin-monster: \"\\f23c\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-pause-circle: \"\\f28b\";\n$fa-var-pause-circle-o: \"\\f28c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-percent: \"\\f295\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f1a7\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-product-hunt: \"\\f288\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-alien: \"\\f281\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-registered: \"\\f25d\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-safari: \"\\f267\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-scribd: \"\\f28a\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-bag: \"\\f290\";\n$fa-var-shopping-basket: \"\\f291\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-sticky-note: \"\\f249\";\n$fa-var-sticky-note-o: \"\\f24a\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-stop-circle: \"\\f28d\";\n$fa-var-stop-circle-o: \"\\f28e\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-television: \"\\f26c\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trademark: \"\\f25c\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-tripadvisor: \"\\f262\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-tv: \"\\f26c\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usb: \"\\f287\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo: \"\\f27d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-wikipedia-w: \"\\f266\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-y-combinator: \"\\f23b\";\n$fa-var-y-combinator-square: \"\\f1d4\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yc: \"\\f23b\";\n$fa-var-yc-square: \"\\f1d4\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "docs/_sass/vendor/font-awesome/font-awesome.scss",
    "content": "/*!\n *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n"
  },
  {
    "path": "docs/_sass/vendor/magnific-popup/_settings.scss",
    "content": "////////////////////////\n//      Settings      //\n////////////////////////\n\n// overlay\n$mfp-overlay-color:                   #000;                     // Color of overlay screen\n$mfp-overlay-opacity:                 0.8;                        // Opacity of overlay screen\n$mfp-shadow:                          0 0 8px rgba(0, 0, 0, 0.6); // Shadow on image or iframe\n\n// spacing\n$mfp-popup-padding-left:              8px;                        // Padding from left and from right side\n$mfp-popup-padding-left-mobile:       6px;                        // Same as above, but is applied when width of window is less than 800px\n\n$mfp-z-index-base:                    1040;                       // Base z-index of popup\n\n// controls\n$mfp-include-arrows:                  true;                       // Include styles for nav arrows\n$mfp-controls-opacity:                1;                          // Opacity of controls\n$mfp-controls-color:                  #fff;                     // Color of controls\n$mfp-controls-border-color:           #fff;                     // Border color of controls\n$mfp-inner-close-icon-color:          #fff;                     // Color of close button when inside\n$mfp-controls-text-color:             #CCC;                       // Color of preloader and \"1 of X\" indicator\n$mfp-controls-text-color-hover:       #fff;                     // Hover color of preloader and \"1 of X\" indicator\n$mfp-IE7support:                      true;                       // Very basic IE7 support\n\n// Iframe-type options\n$mfp-include-iframe-type:             true;                       // Enable Iframe-type popups\n$mfp-iframe-padding-top:              40px;                       // Iframe padding top\n$mfp-iframe-background:               #000;                       // Background color of iframes\n$mfp-iframe-max-width:                900px;                      // Maximum width of iframes\n$mfp-iframe-ratio:                    9/16;                       // Ratio of iframe (9/16 = widescreen, 3/4 = standard, etc.)\n\n// Image-type options\n$mfp-include-image-type:              true;                       // Enable Image-type popups\n$mfp-image-background:                #444 !default;\n$mfp-image-padding-top:               40px;                       // Image padding top\n$mfp-image-padding-bottom:            40px;                       // Image padding bottom\n$mfp-include-mobile-layout-for-image: true;                       // Removes paddings from top and bottom\n\n// Image caption options\n$mfp-caption-title-color:             #F3F3F3;                    // Caption title color\n$mfp-caption-subtitle-color:          #BDBDBD;                    // Caption subtitle color\n.mfp-counter { font-family: $alt-font; }                          // Caption font family\n\n// A11y\n$mfp-use-visuallyhidden:              false; "
  },
  {
    "path": "docs/_sass/vendor/magnific-popup/magnific-popup.scss",
    "content": "/* Magnific Popup CSS */\n\n@import \"settings\";\n\n////////////////////////\n//\n// Contents:\n//\n// 1. Default Settings\n// 2. General styles\n//    - Transluscent overlay\n//    - Containers, wrappers\n//    - Cursors\n//    - Helper classes\n// 3. Appearance\n//    - Preloader & text that displays error messages\n//    - CSS reset for buttons\n//    - Close icon\n//    - \"1 of X\" counter\n//    - Navigation (left/right) arrows\n//    - Iframe content type styles\n//    - Image content type styles\n//    - Media query where size of arrows is reduced\n//    - IE7 support\n//\n////////////////////////\n\n\n\n////////////////////////\n// 1. Default Settings\n////////////////////////\n\n$mfp-overlay-color:                   #0b0b0b !default;\n$mfp-overlay-opacity:                 0.8 !default;\n$mfp-shadow:                          0 0 8px rgba(0, 0, 0, 0.6) !default; // shadow on image or iframe\n$mfp-popup-padding-left:              8px !default; // Padding from left and from right side\n$mfp-popup-padding-left-mobile:       6px !default; // Same as above, but is applied when width of window is less than 800px\n\n$mfp-z-index-base:                    1040 !default; // Base z-index of popup\n$mfp-include-arrows:                  true !default; // include styles for nav arrows\n$mfp-controls-opacity:                0.65 !default;\n$mfp-controls-color:                  #FFF !default;\n$mfp-controls-border-color:           #3F3F3F !default;\n$mfp-inner-close-icon-color:          #333 !default;\n$mfp-controls-text-color:             #CCC !default; // Color of preloader and \"1 of X\" indicator\n$mfp-controls-text-color-hover:       #FFF !default;\n$mfp-IE7support:                      true !default; // Very basic IE7 support\n\n// Iframe-type options\n$mfp-include-iframe-type:             true !default;\n$mfp-iframe-padding-top:              40px !default;\n$mfp-iframe-background:               #000 !default;\n$mfp-iframe-max-width:                900px !default;\n$mfp-iframe-ratio:                    9/16 !default;\n\n// Image-type options\n$mfp-include-image-type:              true !default;\n$mfp-image-background:                #444 !default;\n$mfp-image-padding-top:               40px !default;\n$mfp-image-padding-bottom:            40px !default;\n$mfp-include-mobile-layout-for-image: true !default; // Removes paddings from top and bottom\n\n// Image caption options\n$mfp-caption-title-color:             #F3F3F3 !default;\n$mfp-caption-subtitle-color:          #BDBDBD !default;\n\n// A11y\n$mfp-use-visuallyhidden:              false !default; // Hide content from browsers, but make it available for screen readers \n\n\n\n////////////////////////\n// 2. General styles\n////////////////////////\n\n// Transluscent overlay\n.mfp-bg {\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: $mfp-z-index-base + 2;\n  overflow: hidden;\n  position: fixed;\n\n  background: $mfp-overlay-color;\n  opacity: $mfp-overlay-opacity;\n  @if $mfp-IE7support {\n    filter: unquote(\"alpha(opacity=#{$mfp-overlay-opacity*100})\");\n  }\n}\n\n// Wrapper for popup\n.mfp-wrap {\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: $mfp-z-index-base + 3;\n  position: fixed;\n  outline: none !important;\n  -webkit-backface-visibility: hidden; // fixes webkit bug that can cause \"false\" scrollbar\n}\n\n// Root container\n.mfp-container {\n  text-align: center;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  left: 0;\n  top: 0;\n  padding: 0 $mfp-popup-padding-left;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n// Vertical centerer helper\n.mfp-container {\n  &:before {\n    content: '';\n    display: inline-block;\n    height: 100%;\n    vertical-align: middle;\n  }\n}\n\n// Remove vertical centering when popup has class `mfp-align-top`\n.mfp-align-top {\n  .mfp-container { \n    &:before {\n      display: none;\n    }\n  }\n}\n\n// Popup content holder\n.mfp-content {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n  margin: 0 auto;\n  text-align: left;\n  z-index: $mfp-z-index-base + 5;\n}\n.mfp-inline-holder,\n.mfp-ajax-holder {\n  .mfp-content {\n    width: 100%;\n    cursor: auto;\n  }\n}\n\n// Cursors\n.mfp-ajax-cur {\n  cursor: progress;\n}\n.mfp-zoom-out-cur {\n  &, .mfp-image-holder .mfp-close {\n    cursor: -moz-zoom-out;\n    cursor: -webkit-zoom-out;\n    cursor: zoom-out;\n  }\n}\n.mfp-zoom {\n  cursor: pointer;\n  cursor: -webkit-zoom-in;\n  cursor: -moz-zoom-in;\n  cursor: zoom-in;\n}\n.mfp-auto-cursor {\n  .mfp-content {\n    cursor: auto;\n  }\n}\n\n.mfp-close,\n.mfp-arrow,\n.mfp-preloader,\n.mfp-counter {\n  -webkit-user-select:none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n// Hide the image during the loading\n.mfp-loading {\n  &.mfp-figure {\n    display: none;\n  }\n}\n\n// Helper class that hides stuff\n@if $mfp-use-visuallyhidden {\n  // From HTML5 Boilerplate https://github.com/h5bp/html5-boilerplate/blob/v4.2.0/doc/css.md#visuallyhidden\n  .mfp-hide {\n    border: 0 !important;\n    clip: rect(0 0 0 0) !important;\n    height: 1px !important;\n    margin: -1px !important;\n    overflow: hidden !important;\n    padding: 0 !important;\n    position: absolute !important;\n    width: 1px !important;\n  }\n} @else {\n  .mfp-hide {\n    display: none !important;\n  }\n}\n\n\n////////////////////////\n// 3. Appearance\n////////////////////////\n\n// Preloader and text that displays error messages\n.mfp-preloader {\n  color: $mfp-controls-text-color;\n  position: absolute;\n  top: 50%;\n  width: auto;\n  text-align: center;\n  margin-top: -0.8em;\n  left: 8px;\n  right: 8px;\n  z-index: $mfp-z-index-base + 4;\n  a {\n    color: $mfp-controls-text-color;\n    &:hover {\n      color: $mfp-controls-text-color-hover;\n    }\n  }\n}\n\n// Hide preloader when content successfully loaded\n.mfp-s-ready {\n  .mfp-preloader {\n    display: none;\n  }\n}\n\n// Hide content when it was not loaded\n.mfp-s-error {\n  .mfp-content {\n    display: none;\n  }\n}\n\n// CSS-reset for buttons\nbutton {\n  &.mfp-close,\n  &.mfp-arrow {\n    overflow: visible;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n    display: block;\n    outline: none;\n    padding: 0;\n    z-index: $mfp-z-index-base + 6;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n  &::-moz-focus-inner {\n      padding: 0;\n      border: 0\n  }\n}\n\n\n// Close icon\n.mfp-close {\n  width: 44px;\n  height: 44px;\n  line-height: 44px;\n\n  position: absolute;\n  right: 0;\n  top: 0;\n  text-decoration: none;\n  text-align: center;\n  opacity: $mfp-controls-opacity;\n  @if $mfp-IE7support {\n    filter: unquote(\"alpha(opacity=#{$mfp-controls-opacity*100})\");\n  }\n  padding: 0 0 18px 10px;\n  color: $mfp-controls-color;\n\n  font-style: normal;\n  font-size: 28px;\n  font-family: Arial, Baskerville, monospace;\n\n  &:hover,\n  &:focus {\n    opacity: 1;\n    @if $mfp-IE7support {\n      filter: unquote(\"alpha(opacity=#{1*100})\");\n    }\n  }\n\n  &:active {\n    top: 1px;\n  }\n}\n.mfp-close-btn-in {\n  .mfp-close {\n    color: $mfp-inner-close-icon-color;\n  }\n}\n.mfp-image-holder,\n.mfp-iframe-holder {\n  .mfp-close {\n    color: $mfp-controls-color;\n    right: -6px;\n    text-align: right;\n    padding-right: 6px;\n    width: 100%;\n  }\n}\n\n// \"1 of X\" counter\n.mfp-counter {\n  position: absolute;\n  top: 0;\n  right: 0;\n  color: $mfp-controls-text-color;\n  font-size: 12px;\n  line-height: 18px;\n}\n\n// Navigation arrows\n@if $mfp-include-arrows {\n  .mfp-arrow {\n    position: absolute;\n    opacity: $mfp-controls-opacity;\n    @if $mfp-IE7support {\n      filter: unquote(\"alpha(opacity=#{$mfp-controls-opacity*100})\");\n    }\n    margin: 0;\n    top: 50%;\n    margin-top: -55px;\n    padding: 0;\n    width: 90px;\n    height: 110px;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    &:active {\n      margin-top: -54px;\n    }\n    &:hover,\n    &:focus {\n      opacity: 1;\n      @if $mfp-IE7support {\n        filter: unquote(\"alpha(opacity=#{1*100})\");\n      }\n    }\n    &:before,\n    &:after,\n    .mfp-b,\n    .mfp-a {\n      content: '';\n      display: block;\n      width: 0;\n      height: 0;\n      position: absolute;\n      left: 0;\n      top: 0;\n      margin-top: 35px;\n      margin-left: 35px;\n      border: medium inset transparent;\n    }\n\n    &:after,\n    .mfp-a {\n\n      border-top-width: 13px;\n      border-bottom-width: 13px;\n      top:8px;\n    }\n\n    &:before,\n    .mfp-b {\n      border-top-width: 21px;\n      border-bottom-width: 21px;\n      opacity: 0.7;\n    }\n\n  }\n\n  .mfp-arrow-left {\n    left: 0;\n\n    &:after,\n    .mfp-a {\n      border-right: 17px solid $mfp-controls-color;\n      margin-left: 31px;\n    }\n    &:before,\n    .mfp-b {\n      margin-left: 25px;\n      border-right: 27px solid $mfp-controls-border-color; \n    }\n  }\n\n  .mfp-arrow-right {\n    right: 0;\n    &:after,\n    .mfp-a {\n      border-left: 17px solid $mfp-controls-color;\n      margin-left: 39px\n    }\n    &:before,\n    .mfp-b {\n      border-left: 27px solid $mfp-controls-border-color;\n    }\n  }\n}\n\n\n\n// Iframe content type\n@if $mfp-include-iframe-type {\n  .mfp-iframe-holder {\n    padding-top: $mfp-iframe-padding-top;\n    padding-bottom: $mfp-iframe-padding-top;\n    .mfp-content {\n      line-height: 0;\n      width: 100%;\n      max-width: $mfp-iframe-max-width;\n    }\n    .mfp-close {\n      top: -40px;\n    }\n  }\n  .mfp-iframe-scaler {\n    width: 100%;\n    height: 0;\n    overflow: hidden;\n    padding-top: $mfp-iframe-ratio * 100%;\n    iframe {\n      position: absolute;\n      display: block;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      box-shadow: $mfp-shadow;\n      background: $mfp-iframe-background;\n    }\n  }\n}\n\n\n\n// Image content type\n@if $mfp-include-image-type {\n\n  /* Main image in popup */\n  img {\n    &.mfp-img {\n      width: auto;\n      max-width: 100%;\n      height: auto;\n      display: block;\n      line-height: 0;\n      -webkit-box-sizing: border-box;\n      -moz-box-sizing: border-box;\n      box-sizing: border-box;\n      padding: $mfp-image-padding-top 0 $mfp-image-padding-bottom;\n      margin: 0 auto;\n    }\n  }\n\n  /* The shadow behind the image */\n  .mfp-figure {\n    line-height: 0;\n    &:after {\n      content: '';\n      position: absolute;\n      left: 0;\n      top: $mfp-image-padding-top;\n      bottom: $mfp-image-padding-bottom;\n      display: block;\n      right: 0;\n      width: auto;\n      height: auto;\n      z-index: -1;\n      box-shadow: $mfp-shadow;\n      background: $mfp-image-background;\n    }\n    small {\n      color: $mfp-caption-subtitle-color;\n      display: block;\n      font-size: 12px;\n      line-height: 14px;\n    }\n    figure {\n      margin: 0;\n    }\n  }\n  .mfp-bottom-bar {\n    margin-top: -$mfp-image-padding-bottom + 4;\n    position: absolute;\n    top: 100%;\n    left: 0;\n    width: 100%;\n    cursor: auto;\n  }\n  .mfp-title {\n    text-align: left;\n    line-height: 18px;\n    color: $mfp-caption-title-color;\n    word-wrap: break-word;\n    padding-right: 36px; // leave some space for counter at right side\n  }\n\n  .mfp-image-holder {\n    .mfp-content {\n      max-width: 100%;\n    }\n  }\n\n  .mfp-gallery {\n    .mfp-image-holder {\n      .mfp-figure {\n        cursor: pointer;\n      }\n    }\n  }\n\n\n  @if $mfp-include-mobile-layout-for-image {\n    @media screen and (max-width: 800px) and (orientation:landscape), screen and (max-height: 300px) {\n      /**\n       * Remove all paddings around the image on small screen\n       */\n      .mfp-img-mobile {\n        .mfp-image-holder {\n          padding-left: 0;\n          padding-right: 0;\n        }\n        img {\n          &.mfp-img {\n            padding: 0;\n          }\n        }\n        .mfp-figure {\n          // The shadow behind the image\n          &:after {\n            top: 0;\n            bottom: 0;\n          }\n          small {\n            display: inline;\n            margin-left: 5px;\n          }\n        }\n        .mfp-bottom-bar {\n          background: rgba(0,0,0,0.6);\n          bottom: 0;\n          margin: 0;\n          top: auto;\n          padding: 3px 5px;\n          position: fixed;\n          -webkit-box-sizing: border-box;\n          -moz-box-sizing: border-box;\n          box-sizing: border-box;\n          &:empty {\n            padding: 0;\n          }\n        }\n        .mfp-counter {\n          right: 5px;\n          top: 3px;\n        }\n        .mfp-close {\n          top: 0;\n          right: 0;\n          width: 35px;\n          height: 35px;\n          line-height: 35px;\n          background: rgba(0, 0, 0, 0.6);\n          position: fixed;\n          text-align: center;\n          padding: 0;\n        }\n      }\n    }\n  }\n}\n\n\n\n// Scale navigation arrows and reduce padding from sides\n@media all and (max-width: 900px) {\n  .mfp-arrow {\n    -webkit-transform: scale(0.75);\n    transform: scale(0.75);\n  }\n  .mfp-arrow-left {\n    -webkit-transform-origin: 0;\n    transform-origin: 0;\n  }\n  .mfp-arrow-right {\n    -webkit-transform-origin: 100%;\n    transform-origin: 100%;\n  }\n  .mfp-container {\n    padding-left: $mfp-popup-padding-left-mobile;\n    padding-right: $mfp-popup-padding-left-mobile;\n  }\n}\n\n\n\n// IE7 support\n// Styles that make popup look nicier in old IE\n@if $mfp-IE7support {\n  .mfp-ie7 {\n    .mfp-img {\n      padding: 0;\n    }\n    .mfp-bottom-bar {\n      width: 600px;\n      left: 50%;\n      margin-left: -300px;\n      margin-top: 5px;\n      padding-bottom: 5px;\n    }\n    .mfp-container {\n      padding: 0;\n    }\n    .mfp-content {\n      padding-top: 44px;\n    }\n    .mfp-close {\n      top: 0;\n      right: 0;\n      padding-top: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "docs/assets/css/main.scss",
    "content": "---\nsitemap: false\n---\n\n/*\n *\n *  HPSTR\n *\n *  Designer: Michael Rose\n *  Twitter: http://twitter.com/mmistakes\n *\n*/\n\n// Partials\n@import \"variables\";\n@import \"mixins\";\n@import \"reset\";\n@import \"vendor/font-awesome/font-awesome\";\n@import \"vendor/magnific-popup/magnific-popup\";\n@import \"site\";\n@import \"typography\";\n@import \"syntax\";\n// @import \"coderay\";\n@import \"grid\";\n@import \"elements\";\n@import \"animations\";\n@import \"dl-menu\";\n@import \"page\";"
  },
  {
    "path": "docs/assets/js/_main.js",
    "content": "/*! Plugin options and other jQuery stuff */\n\n// dl-menu options\n$(function() {\n  $( '#dl-menu' ).dlmenu({\n    animationClasses : { classin : 'dl-animate-in', classout : 'dl-animate-out' }\n  });\n});\n\n// FitVids options\n$(function() {\n  $(\"article\").fitVids();\n});\n\n$(\".close-menu\").click(function () {\n  $(\".menu\").toggleClass(\"disabled\");\n  $(\".links\").toggleClass(\"enabled\");\n});\n\n$(\".about\").click(function () {\n  $(\"#about\").css('display','block');\n});\n\n$(\".close-about\").click(function () {\n  $(\"#about\").css('display','');\n});\n\n// Add lightbox class to all image links\n$(\"a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif']\").addClass(\"image-popup\");\n\n// Magnific-Popup options\n$(document).ready(function() {\n  $('.image-popup').magnificPopup({\n    type: 'image',\n    tLoading: 'Loading image #%curr%...',\n    gallery: {\n      enabled: true,\n      navigateByImgClick: true,\n      preload: [0,1] // Will preload 0 - before current, and 1 after the current image\n    },\n    image: {\n      tError: '<a href=\"%url%\">Image #%curr%</a> could not be loaded.',\n    },\n    removalDelay: 300, // Delay in milliseconds before popup is removed\n    // Class that is added to body when popup is open. \n    // make it unique to apply your CSS animations just to this exact popup\n    mainClass: 'mfp-fade'\n  });\n});"
  },
  {
    "path": "docs/assets/js/plugins/jquery.dlmenu.js",
    "content": "/**\n * jquery.dlmenu.js v1.0.1\n * http://www.codrops.com\n *\n * Licensed under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n * \n * Copyright 2013, Codrops\n * http://www.codrops.com\n *\n * Modified by Michael Rose\n */\n;( function( $, window, undefined ) {\n\n\t'use strict';\n\n\t// global\n\tvar Modernizr = window.Modernizr, $body = $( 'body' );\n\n\t$.DLMenu = function( options, element ) {\n\t\tthis.$el = $( element );\n\t\tthis._init( options );\n\t};\n\n\t// the options\n\t$.DLMenu.defaults = {\n\t\t// classes for the animation effects\n\t\tanimationClasses : { classin : 'dl-animate-in-1', classout : 'dl-animate-out-1' },\n\t\t// callback: click a link that has a sub menu\n\t\t// el is the link element (li); name is the level name\n\t\tonLevelClick : function( el, name ) { return false; },\n\t\t// callback: click a link that does not have a sub menu\n\t\t// el is the link element (li); ev is the event obj\n\t\tonLinkClick : function( el, ev ) { return false; }\n\t};\n\n\t$.DLMenu.prototype = {\n\t\t_init : function( options ) {\n\n\t\t\t// options\n\t\t\tthis.options = $.extend( true, {}, $.DLMenu.defaults, options );\n\t\t\t// cache some elements and initialize some variables\n\t\t\tthis._config();\n\t\t\t\n\t\t\tvar animEndEventNames = {\n\t\t\t\t\t'WebkitAnimation' : 'webkitAnimationEnd',\n\t\t\t\t\t'OAnimation' : 'oAnimationEnd',\n\t\t\t\t\t'msAnimation' : 'MSAnimationEnd',\n\t\t\t\t\t'animation' : 'animationend'\n\t\t\t\t},\n\t\t\t\ttransEndEventNames = {\n\t\t\t\t\t'WebkitTransition' : 'webkitTransitionEnd',\n\t\t\t\t\t'MozTransition' : 'transitionend',\n\t\t\t\t\t'OTransition' : 'oTransitionEnd',\n\t\t\t\t\t'msTransition' : 'MSTransitionEnd',\n\t\t\t\t\t'transition' : 'transitionend'\n\t\t\t\t};\n\t\t\t// animation end event name\n\t\t\tthis.animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ] + '.dlmenu';\n\t\t\t// transition end event name\n\t\t\tthis.transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ] + '.dlmenu',\n\t\t\t// support for css animations and css transitions\n\t\t\tthis.supportAnimations = Modernizr.cssanimations,\n\t\t\tthis.supportTransitions = Modernizr.csstransitions;\n\n\t\t\tthis._initEvents();\n\n\t\t},\n\t\t_config : function() {\n\t\t\tthis.open = false;\n\t\t\tthis.$menuwrapper = $( '#dl-menu' );\n\t\t\tthis.$trigger = this.$el.children( '.dl-trigger' );\n\t\t\tthis.$menu = this.$el.children( 'ul.dl-menu' );\n\t\t\tthis.$menuitems = this.$menu.find( 'li:not(.dl-back)' );\n\t\t\tthis.$el.find( 'ul.dl-submenu' ).prepend( '<li class=\"dl-back\"><a href=\"#\">back</a></li>' );\n\t\t\tthis.$back = this.$menu.find( 'li.dl-back' );\n\t\t},\n\t\t_initEvents : function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.$trigger.on( 'click.dlmenu', function() {\n\t\t\t\t\n\t\t\t\tif( self.open ) {\n\t\t\t\t\tself._closeMenu();\n\t\t\t\t} \n\t\t\t\telse {\n\t\t\t\t\tself._openMenu();\n\t\t\t\t}\n\t\t\t\treturn false;\n\n\t\t\t} );\n\n\t\t\tthis.$menuitems.on( 'click.dlmenu', function( event ) {\n\t\t\t\t\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tvar $item = $(this),\n\t\t\t\t\t$submenu = $item.children( 'ul.dl-submenu' );\n\n\t\t\t\tif( $submenu.length > 0 ) {\n\n\t\t\t\t\tvar $flyin = $submenu.clone().css({\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\tmargin: 0\n\t\t\t\t\t}).insertAfter( self.$menu ),\n\t\t\t\t\t\tonAnimationEndFn = function() {\n\t\t\t\t\t\t\tself.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classout ).addClass( 'dl-subview' );\n\t\t\t\t\t\t\t$item.addClass( 'dl-subviewopen' ).parents( '.dl-subviewopen:first' ).removeClass( 'dl-subviewopen' ).addClass( 'dl-subview' );\n\t\t\t\t\t\t\t$flyin.remove();\n\t\t\t\t\t\t};\n\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t$flyin.addClass( self.options.animationClasses.classin );\n\t\t\t\t\t\tself.$menu.addClass( self.options.animationClasses.classout );\n\t\t\t\t\t\tif( self.supportAnimations ) {\n\t\t\t\t\t\t\tself.$menu.on( self.animEndEventName, onAnimationEndFn );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tonAnimationEndFn.call();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tself.options.onLevelClick( $item, $item.children( 'a:first' ).text() );\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.options.onLinkClick( $item, event );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tthis.$back.on( 'click.dlmenu', function( event ) {\n\t\t\t\t\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\t$submenu = $this.parents( 'ul.dl-submenu:first' ),\n\t\t\t\t\t$item = $submenu.parent(),\n\n\t\t\t\t\t$flyin = $submenu.clone().insertAfter( self.$menu );\n\n\t\t\t\tvar onAnimationEndFn = function() {\n\t\t\t\t\tself.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classin );\n\t\t\t\t\t$flyin.remove();\n\t\t\t\t};\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$flyin.addClass( self.options.animationClasses.classout );\n\t\t\t\t\tself.$menu.addClass( self.options.animationClasses.classin );\n\t\t\t\t\tif( self.supportAnimations ) {\n\t\t\t\t\t\tself.$menu.on( self.animEndEventName, onAnimationEndFn );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tonAnimationEndFn.call();\n\t\t\t\t\t}\n\n\t\t\t\t\t$item.removeClass( 'dl-subviewopen' );\n\t\t\t\t\t\n\t\t\t\t\tvar $subview = $this.parents( '.dl-subview:first' );\n\t\t\t\t\tif( $subview.is( 'li' ) ) {\n\t\t\t\t\t\t$subview.addClass( 'dl-subviewopen' );\n\t\t\t\t\t}\n\t\t\t\t\t$subview.removeClass( 'dl-subview' );\n\t\t\t\t} );\n\n\t\t\t\treturn false;\n\n\t\t\t} );\n\t\t\t\n\t\t},\n\t\tcloseMenu : function() {\n\t\t\tif( this.open ) {\n\t\t\t\tthis._closeMenu();\n\t\t\t}\n\t\t},\n\t\t_closeMenu : function() {\n\t\t\tvar self = this,\n\t\t\t\tonTransitionEndFn = function() {\n\t\t\t\t\tself.$menu.off( self.transEndEventName );\n\t\t\t\t\tself._resetMenu();\n\t\t\t\t};\n\t\t\t\n\t\t\tthis.$menuwrapper.removeClass( 'dl-menuopen' );\n\t\t\tthis.$menu.removeClass( 'dl-menuopen' );\n\t\t\tthis.$menu.addClass( 'dl-menu-toggle' );\n\t\t\tthis.$trigger.removeClass( 'dl-active' );\n\t\t\t\n\t\t\tif( this.supportTransitions ) {\n\t\t\t\tthis.$menu.on( this.transEndEventName, onTransitionEndFn );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tonTransitionEndFn.call();\n\t\t\t}\n\n\t\t\tthis.open = false;\n\t\t},\n\t\topenMenu : function() {\n\t\t\tif( !this.open ) {\n\t\t\t\tthis._openMenu();\n\t\t\t}\n\t\t},\n\t\t_openMenu : function() {\n\t\t\tvar self = this;\n\t\t\t// clicking somewhere else makes the menu close\n\t\t\t$body.off( 'click' ).on( 'click.dlmenu', function() {\n\t\t\t\tself._closeMenu() ;\n\t\t\t} );\n\t\t\tthis.$menuwrapper.addClass( 'dl-menuopen' );\n\t\t\tthis.$menu.addClass( 'dl-menuopen dl-menu-toggle' ).on( this.transEndEventName, function() {\n\t\t\t\t$( this ).removeClass( 'dl-menu-toggle' );\n\t\t\t} );\n\t\t\tthis.$trigger.addClass( 'dl-active' );\n\t\t\tthis.open = true;\n\t\t},\n\t\t// resets the menu to its original state (first level of options)\n\t\t_resetMenu : function() {\n\t\t\tthis.$menu.removeClass( 'dl-subview' );\n\t\t\tthis.$menuitems.removeClass( 'dl-subview dl-subviewopen' );\n\t\t}\n\t};\n\n\tvar logError = function( message ) {\n\t\tif ( window.console ) {\n\t\t\twindow.console.error( message );\n\t\t}\n\t};\n\n\t$.fn.dlmenu = function( options ) {\n\t\tif ( typeof options === 'string' ) {\n\t\t\tvar args = Array.prototype.slice.call( arguments, 1 );\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, 'dlmenu' );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\tlogError( \"cannot call methods on dlmenu prior to initialization; \" +\n\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt(0) === \"_\" ) {\n\t\t\t\t\tlogError( \"no such method '\" + options + \"' for dlmenu instance\" );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tinstance[ options ].apply( instance, args );\n\t\t\t});\n\t\t} \n\t\telse {\n\t\t\tthis.each(function() {\t\n\t\t\t\tvar instance = $.data( this, 'dlmenu' );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance._init();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tinstance = $.data( this, 'dlmenu', new $.DLMenu( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t};\n\n} )( jQuery, window );\n"
  },
  {
    "path": "docs/assets/js/plugins/jquery.fitvids.js",
    "content": "/*global jQuery */\n/*jshint multistr:true, browser:true */\n/*!\n* FitVids 1.0\n*\n* Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com\n* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/\n* Released under the WTFPL license - http://sam.zoy.org/wtfpl/\n*\n* Date: Thu Sept 01 18:00:00 2011 -0500\n*/\n\n(function( $ ){\n\n  \"use strict\";\n\n  $.fn.fitVids = function( options ) {\n    var settings = {\n      customSelector: null\n    };\n\n    var div = document.createElement('div'),\n        ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0];\n\n    div.className = 'fit-vids-style';\n    div.innerHTML = '&shy;<style>         \\\n      .fluid-width-video-wrapper {        \\\n         width: 100%;                     \\\n         position: relative;              \\\n         padding: 0;                      \\\n      }                                   \\\n                                          \\\n      .fluid-width-video-wrapper iframe,  \\\n      .fluid-width-video-wrapper object,  \\\n      .fluid-width-video-wrapper embed {  \\\n         position: absolute;              \\\n         top: 0;                          \\\n         left: 0;                         \\\n         width: 100%;                     \\\n         height: 100%;                    \\\n      }                                   \\\n    </style>';\n\n    ref.parentNode.insertBefore(div,ref);\n\n    if ( options ) {\n      $.extend( settings, options );\n    }\n\n    return this.each(function(){\n      var selectors = [\n        \"iframe[src*='player.vimeo.com']\",\n        \"iframe[src*='www.youtube.com']\",\n        \"iframe[src*='www.youtube-nocookie.com']\",\n        \"iframe[src*='www.kickstarter.com']\",\n        \"object\",\n        \"embed\"\n      ];\n\n      if (settings.customSelector) {\n        selectors.push(settings.customSelector);\n      }\n\n      var $allVideos = $(this).find(selectors.join(','));\n\n      $allVideos.each(function(){\n        var $this = $(this);\n        if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }\n        var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),\n            width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),\n            aspectRatio = height / width;\n        if(!$this.attr('id')){\n          var videoID = 'fitvid' + Math.floor(Math.random()*999999);\n          $this.attr('id', videoID);\n        }\n        $this.wrap('<div class=\"fluid-width-video-wrapper\"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+\"%\");\n        $this.removeAttr('height').removeAttr('width');\n      });\n    });\n  };\n})( jQuery );"
  },
  {
    "path": "docs/assets/js/plugins/jquery.magnific-popup.js",
    "content": "/*! Magnific Popup - v0.9.3 - 2013-07-16\n* http://dimsemenov.com/plugins/magnific-popup/\n* Copyright (c) 2013 Dmitry Semenov; */\n;(function($) {\n\n/*>>core*/\n/**\n * \n * Magnific Popup Core JS file\n * \n */\n\n\n/**\n * Private static constants\n */\nvar CLOSE_EVENT = 'Close',\n\tBEFORE_CLOSE_EVENT = 'BeforeClose',\n\tAFTER_CLOSE_EVENT = 'AfterClose',\n\tBEFORE_APPEND_EVENT = 'BeforeAppend',\n\tMARKUP_PARSE_EVENT = 'MarkupParse',\n\tOPEN_EVENT = 'Open',\n\tCHANGE_EVENT = 'Change',\n\tNS = 'mfp',\n\tEVENT_NS = '.' + NS,\n\tREADY_CLASS = 'mfp-ready',\n\tREMOVING_CLASS = 'mfp-removing',\n\tPREVENT_CLOSE_CLASS = 'mfp-prevent-close';\n\n\n/**\n * Private vars \n */\nvar mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'\n\tMagnificPopup = function(){},\n\t_isJQ = !!(window.jQuery),\n\t_prevStatus,\n\t_window = $(window),\n\t_body,\n\t_document,\n\t_prevContentType,\n\t_wrapClasses,\n\t_currPopupType;\n\n\n/**\n * Private functions\n */\nvar _mfpOn = function(name, f) {\n\t\tmfp.ev.on(NS + name + EVENT_NS, f);\n\t},\n\t_getEl = function(className, appendTo, html, raw) {\n\t\tvar el = document.createElement('div');\n\t\tel.className = 'mfp-'+className;\n\t\tif(html) {\n\t\t\tel.innerHTML = html;\n\t\t}\n\t\tif(!raw) {\n\t\t\tel = $(el);\n\t\t\tif(appendTo) {\n\t\t\t\tel.appendTo(appendTo);\n\t\t\t}\n\t\t} else if(appendTo) {\n\t\t\tappendTo.appendChild(el);\n\t\t}\n\t\treturn el;\n\t},\n\t_mfpTrigger = function(e, data) {\n\t\tmfp.ev.triggerHandler(NS + e, data);\n\n\t\tif(mfp.st.callbacks) {\n\t\t\t// converts \"mfpEventName\" to \"eventName\" callback and triggers it if it's present\n\t\t\te = e.charAt(0).toLowerCase() + e.slice(1);\n\t\t\tif(mfp.st.callbacks[e]) {\n\t\t\t\tmfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);\n\t\t\t}\n\t\t}\n\t},\n\t_setFocus = function() {\n\t\t(mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).trigger('focus');\n\t},\n\t_getCloseBtn = function(type) {\n\t\tif(type !== _currPopupType || !mfp.currTemplate.closeBtn) {\n\t\t\tmfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) );\n\t\t\t_currPopupType = type;\n\t\t}\n\t\treturn mfp.currTemplate.closeBtn;\n\t},\n\t// Initialize Magnific Popup only when called at least once\n\t_checkInstance = function() {\n\t\tif(!$.magnificPopup.instance) {\n\t\t\tmfp = new MagnificPopup();\n\t\t\tmfp.init();\n\t\t\t$.magnificPopup.instance = mfp;\n\t\t}\n\t},\n\t// Check to close popup or not\n\t// \"target\" is an element that was clicked\n\t_checkIfClose = function(target) {\n\n\t\tif($(target).hasClass(PREVENT_CLOSE_CLASS)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar closeOnContent = mfp.st.closeOnContentClick;\n\t\tvar closeOnBg = mfp.st.closeOnBgClick;\n\n\t\tif(closeOnContent && closeOnBg) {\n\t\t\treturn true;\n\t\t} else {\n\n\t\t\t// We close the popup if click is on close button or on preloader. Or if there is no content.\n\t\t\tif(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// if click is outside the content\n\t\t\tif(  (target !== mfp.content[0] && !$.contains(mfp.content[0], target))  ) {\n\t\t\t\tif(closeOnBg) {\n\t\t\t\t\t// last check, if the clicked element is in DOM, (in case it's removed onclick)\n\t\t\t\t\tif( $.contains(document, target) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(closeOnContent) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t}\n\t\treturn false;\n\t},\n\t// CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr\n\tsupportsTransitions = function() {\n\t\tvar s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist\n\t\t\tv = ['ms','O','Moz','Webkit']; // 'v' for vendor\n\n\t\tif( s['transition'] !== undefined ) {\n\t\t\treturn true; \n\t\t}\n\t\t\t\n\t\twhile( v.length ) {\n\t\t\tif( v.pop() + 'Transition' in s ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\treturn false;\n\t};\n\n\n\n/**\n * Public functions\n */\nMagnificPopup.prototype = {\n\n\tconstructor: MagnificPopup,\n\n\t/**\n\t * Initializes Magnific Popup plugin. \n\t * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed\n\t */\n\tinit: function() {\n\t\tvar appVersion = navigator.appVersion;\n\t\tmfp.isIE7 = appVersion.indexOf(\"MSIE 7.\") !== -1; \n\t\tmfp.isIE8 = appVersion.indexOf(\"MSIE 8.\") !== -1;\n\t\tmfp.isLowIE = mfp.isIE7 || mfp.isIE8;\n\t\tmfp.isAndroid = (/android/gi).test(appVersion);\n\t\tmfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);\n\t\tmfp.supportsTransition = supportsTransitions();\n\n\t\t// We disable fixed positioned lightbox on devices that don't handle it nicely.\n\t\t// If you know a better way of detecting this - let me know.\n\t\tmfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) );\n\t\t_body = $(document.body);\n\t\t_document = $(document);\n\n\t\tmfp.popupsCache = {};\n\t},\n\n\t/**\n\t * Opens popup\n\t * @param  data [description]\n\t */\n\topen: function(data) {\n\n\t\tvar i;\n\n\t\tif(data.isObj === false) { \n\t\t\t// convert jQuery collection to array to avoid conflicts later\n\t\t\tmfp.items = data.items.toArray();\n\n\t\t\tmfp.index = 0;\n\t\t\tvar items = data.items,\n\t\t\t\titem;\n\t\t\tfor(i = 0; i < items.length; i++) {\n\t\t\t\titem = items[i];\n\t\t\t\tif(item.parsed) {\n\t\t\t\t\titem = item.el[0];\n\t\t\t\t}\n\t\t\t\tif(item === data.el[0]) {\n\t\t\t\t\tmfp.index = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmfp.items = $.isArray(data.items) ? data.items : [data.items];\n\t\t\tmfp.index = data.index || 0;\n\t\t}\n\n\t\t// if popup is already opened - we just update the content\n\t\tif(mfp.isOpen) {\n\t\t\tmfp.updateItemHTML();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tmfp.types = []; \n\t\t_wrapClasses = '';\n\t\tif(data.mainEl && data.mainEl.length) {\n\t\t\tmfp.ev = data.mainEl.eq(0);\n\t\t} else {\n\t\t\tmfp.ev = _document;\n\t\t}\n\n\t\tif(data.key) {\n\t\t\tif(!mfp.popupsCache[data.key]) {\n\t\t\t\tmfp.popupsCache[data.key] = {};\n\t\t\t}\n\t\t\tmfp.currTemplate = mfp.popupsCache[data.key];\n\t\t} else {\n\t\t\tmfp.currTemplate = {};\n\t\t}\n\n\n\n\t\tmfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); \n\t\tmfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;\n\n\t\tif(mfp.st.modal) {\n\t\t\tmfp.st.closeOnContentClick = false;\n\t\t\tmfp.st.closeOnBgClick = false;\n\t\t\tmfp.st.showCloseBtn = false;\n\t\t\tmfp.st.enableEscapeKey = false;\n\t\t}\n\t\t\n\n\t\t// Building markup\n\t\t// main containers are created only once\n\t\tif(!mfp.bgOverlay) {\n\n\t\t\t// Dark overlay\n\t\t\tmfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() {\n\t\t\t\tmfp.close();\n\t\t\t});\n\n\t\t\tmfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) {\n\t\t\t\tif(_checkIfClose(e.target)) {\n\t\t\t\t\tmfp.close();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmfp.container = _getEl('container', mfp.wrap);\n\t\t}\n\n\t\tmfp.contentContainer = _getEl('content');\n\t\tif(mfp.st.preloader) {\n\t\t\tmfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);\n\t\t}\n\n\n\t\t// Initializing modules\n\t\tvar modules = $.magnificPopup.modules;\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar n = modules[i];\n\t\t\tn = n.charAt(0).toUpperCase() + n.slice(1);\n\t\t\tmfp['init'+n].call(mfp);\n\t\t}\n\t\t_mfpTrigger('BeforeOpen');\n\n\n\t\tif(mfp.st.showCloseBtn) {\n\t\t\t// Close button\n\t\t\tif(!mfp.st.closeBtnInside) {\n\t\t\t\tmfp.wrap.append( _getCloseBtn() );\n\t\t\t} else {\n\t\t\t\t_mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) {\n\t\t\t\t\tvalues.close_replaceWith = _getCloseBtn(item.type);\n\t\t\t\t});\n\t\t\t\t_wrapClasses += ' mfp-close-btn-in';\n\t\t\t}\n\t\t}\n\n\t\tif(mfp.st.alignTop) {\n\t\t\t_wrapClasses += ' mfp-align-top';\n\t\t}\n\n\t\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tmfp.wrap.css({\n\t\t\t\toverflow: mfp.st.overflowY,\n\t\t\t\toverflowX: 'hidden',\n\t\t\t\toverflowY: mfp.st.overflowY\n\t\t\t});\n\t\t} else {\n\t\t\tmfp.wrap.css({ \n\t\t\t\ttop: _window.scrollTop(),\n\t\t\t\tposition: 'absolute'\n\t\t\t});\n\t\t}\n\t\tif( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) {\n\t\t\tmfp.bgOverlay.css({\n\t\t\t\theight: _document.height(),\n\t\t\t\tposition: 'absolute'\n\t\t\t});\n\t\t}\n\n\t\t\n\n\t\tif(mfp.st.enableEscapeKey) {\n\t\t\t// Close on ESC key\n\t\t\t_document.on('keyup' + EVENT_NS, function(e) {\n\t\t\t\tif(e.keyCode === 27) {\n\t\t\t\t\tmfp.close();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_window.on('resize' + EVENT_NS, function() {\n\t\t\tmfp.updateSize();\n\t\t});\n\n\n\t\tif(!mfp.st.closeOnContentClick) {\n\t\t\t_wrapClasses += ' mfp-auto-cursor';\n\t\t}\n\t\t\n\t\tif(_wrapClasses)\n\t\t\tmfp.wrap.addClass(_wrapClasses);\n\n\n\t\t// this triggers recalculation of layout, so we get it once to not to trigger twice\n\t\tvar windowHeight = mfp.wH = _window.height();\n\n\t\t\n\t\tvar windowStyles = {};\n\n\t\tif( mfp.fixedContentPos ) {\n            if(mfp._hasScrollBar(windowHeight)){\n                var s = mfp._getScrollbarSize();\n                if(s) {\n                    windowStyles.paddingRight = s;\n                }\n            }\n        }\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tif(!mfp.isIE7) {\n\t\t\t\twindowStyles.overflow = 'hidden';\n\t\t\t} else {\n\t\t\t\t// ie7 double-scroll bug\n\t\t\t\t$('body, html').css('overflow', 'hidden');\n\t\t\t}\n\t\t}\n\n\t\t\n\t\t\n\t\tvar classesToadd = mfp.st.mainClass;\n\t\tif(mfp.isIE7) {\n\t\t\tclassesToadd += ' mfp-ie7';\n\t\t}\n\t\tif(classesToadd) {\n\t\t\tmfp._addClassToMFP( classesToadd );\n\t\t}\n\n\t\t// add content\n\t\tmfp.updateItemHTML();\n\n\t\t_mfpTrigger('BuildControls');\n\n\n\t\t// remove scrollbar, add padding e.t.c\n\t\t$('html').css(windowStyles);\n\t\t\n\t\t// add everything to DOM\n\t\tmfp.bgOverlay.add(mfp.wrap).prependTo( document.body );\n\n\n\n\t\t// Save last focused element\n\t\tmfp._lastFocusedEl = document.activeElement;\n\t\t\n\t\t// Wait for next cycle to allow CSS transition\n\t\tsetTimeout(function() {\n\t\t\t\n\t\t\tif(mfp.content) {\n\t\t\t\tmfp._addClassToMFP(READY_CLASS);\n\t\t\t\t_setFocus();\n\t\t\t} else {\n\t\t\t\t// if content is not defined (not loaded e.t.c) we add class only for BG\n\t\t\t\tmfp.bgOverlay.addClass(READY_CLASS);\n\t\t\t}\n\t\t\t\n\t\t\t// Trap the focus in popup\n\t\t\t_document.on('focusin' + EVENT_NS, function (e) {\n\t\t\t\tif( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) {\n\t\t\t\t\t_setFocus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t}, 16);\n\n\t\tmfp.isOpen = true;\n\t\tmfp.updateSize(windowHeight);\n\t\t_mfpTrigger(OPEN_EVENT);\n\t},\n\n\t/**\n\t * Closes the popup\n\t */\n\tclose: function() {\n\t\tif(!mfp.isOpen) return;\n\t\t_mfpTrigger(BEFORE_CLOSE_EVENT);\n\n\t\tmfp.isOpen = false;\n\t\t// for CSS3 animation\n\t\tif(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition )  {\n\t\t\tmfp._addClassToMFP(REMOVING_CLASS);\n\t\t\tsetTimeout(function() {\n\t\t\t\tmfp._close();\n\t\t\t}, mfp.st.removalDelay);\n\t\t} else {\n\t\t\tmfp._close();\n\t\t}\n\t},\n\n\t/**\n\t * Helper for close() function\n\t */\n\t_close: function() {\n\t\t_mfpTrigger(CLOSE_EVENT);\n\n\t\tvar classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';\n\n\t\tmfp.bgOverlay.detach();\n\t\tmfp.wrap.detach();\n\t\tmfp.container.empty();\n\n\t\tif(mfp.st.mainClass) {\n\t\t\tclassesToRemove += mfp.st.mainClass + ' ';\n\t\t}\n\n\t\tmfp._removeClassFromMFP(classesToRemove);\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tvar windowStyles = {paddingRight: ''};\n\t\t\tif(mfp.isIE7) {\n\t\t\t\t$('body, html').css('overflow', '');\n\t\t\t} else {\n\t\t\t\twindowStyles.overflow = '';\n\t\t\t}\n\t\t\t$('html').css(windowStyles);\n\t\t}\n\t\t\n\t\t_document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);\n\t\tmfp.ev.off(EVENT_NS);\n\n\t\t// clean up DOM elements that aren't removed\n\t\tmfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');\n\t\tmfp.bgOverlay.attr('class', 'mfp-bg');\n\t\tmfp.container.attr('class', 'mfp-container');\n\n\t\t// remove close button from target element\n\t\tif(mfp.st.showCloseBtn &&\n\t\t(!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {\n\t\t\tif(mfp.currTemplate.closeBtn)\n\t\t\t\tmfp.currTemplate.closeBtn.detach();\n\t\t}\n\n\n\t\tif(mfp._lastFocusedEl) {\n\t\t\t$(mfp._lastFocusedEl).trigger('focus'); // put tab focus back\n\t\t}\n\t\tmfp.currItem = null;\t\n\t\tmfp.content = null;\n\t\tmfp.currTemplate = null;\n\t\tmfp.prevHeight = 0;\n\n\t\t_mfpTrigger(AFTER_CLOSE_EVENT);\n\t},\n\t\n\tupdateSize: function(winHeight) {\n\n\t\tif(mfp.isIOS) {\n\t\t\t// fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2\n\t\t\tvar zoomLevel = document.documentElement.clientWidth / window.innerWidth;\n\t\t\tvar height = window.innerHeight * zoomLevel;\n\t\t\tmfp.wrap.css('height', height);\n\t\t\tmfp.wH = height;\n\t\t} else {\n\t\t\tmfp.wH = winHeight || _window.height();\n\t\t}\n\t\t// Fixes #84: popup incorrectly positioned with position:relative on body\n\t\tif(!mfp.fixedContentPos) {\n\t\t\tmfp.wrap.css('height', mfp.wH);\n\t\t}\n\n\t\t_mfpTrigger('Resize');\n\n\t},\n\n\t/**\n\t * Set content of popup based on current index\n\t */\n\tupdateItemHTML: function() {\n\t\tvar item = mfp.items[mfp.index];\n\n\t\t// Detach and perform modifications\n\t\tmfp.contentContainer.detach();\n\n\t\tif(mfp.content)\n\t\t\tmfp.content.detach();\n\n\t\tif(!item.parsed) {\n\t\t\titem = mfp.parseEl( mfp.index );\n\t\t}\n\n\t\tvar type = item.type;\t\n\n\t\t_mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);\n\t\t// BeforeChange event works like so:\n\t\t// _mfpOn('BeforeChange', function(e, prevType, newType) { });\n\t\t\n\t\tmfp.currItem = item;\n\n\t\t\n\n\t\t\n\n\t\tif(!mfp.currTemplate[type]) {\n\t\t\tvar markup = mfp.st[type] ? mfp.st[type].markup : false;\n\n\t\t\t// allows to modify markup\n\t\t\t_mfpTrigger('FirstMarkupParse', markup);\n\n\t\t\tif(markup) {\n\t\t\t\tmfp.currTemplate[type] = $(markup);\n\t\t\t} else {\n\t\t\t\t// if there is no markup found we just define that template is parsed\n\t\t\t\tmfp.currTemplate[type] = true;\n\t\t\t}\n\t\t}\n\n\t\tif(_prevContentType && _prevContentType !== item.type) {\n\t\t\tmfp.container.removeClass('mfp-'+_prevContentType+'-holder');\n\t\t}\n\t\t\n\t\tvar newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);\n\t\tmfp.appendContent(newContent, type);\n\n\t\titem.preloaded = true;\n\n\t\t_mfpTrigger(CHANGE_EVENT, item);\n\t\t_prevContentType = item.type;\n\t\t\n\t\t// Append container back after its content changed\n\t\tmfp.container.prepend(mfp.contentContainer);\n\n\t\t_mfpTrigger('AfterChange');\n\t},\n\n\n\t/**\n\t * Set HTML content of popup\n\t */\n\tappendContent: function(newContent, type) {\n\t\tmfp.content = newContent;\n\t\t\n\t\tif(newContent) {\n\t\t\tif(mfp.st.showCloseBtn && mfp.st.closeBtnInside &&\n\t\t\t\tmfp.currTemplate[type] === true) {\n\t\t\t\t// if there is no markup, we just append close button element inside\n\t\t\t\tif(!mfp.content.find('.mfp-close').length) {\n\t\t\t\t\tmfp.content.append(_getCloseBtn());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmfp.content = newContent;\n\t\t\t}\n\t\t} else {\n\t\t\tmfp.content = '';\n\t\t}\n\n\t\t_mfpTrigger(BEFORE_APPEND_EVENT);\n\t\tmfp.container.addClass('mfp-'+type+'-holder');\n\n\t\tmfp.contentContainer.append(mfp.content);\n\t},\n\n\n\n\t\n\t/**\n\t * Creates Magnific Popup data object based on given data\n\t * @param  {int} index Index of item to parse\n\t */\n\tparseEl: function(index) {\n\t\tvar item = mfp.items[index],\n\t\t\ttype = item.type;\n\n\t\tif(item.tagName) {\n\t\t\titem = { el: $(item) };\n\t\t} else {\n\t\t\titem = { data: item, src: item.src };\n\t\t}\n\n\t\tif(item.el) {\n\t\t\tvar types = mfp.types;\n\n\t\t\t// check for 'mfp-TYPE' class\n\t\t\tfor(var i = 0; i < types.length; i++) {\n\t\t\t\tif( item.el.hasClass('mfp-'+types[i]) ) {\n\t\t\t\t\ttype = types[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titem.src = item.el.attr('data-mfp-src');\n\t\t\tif(!item.src) {\n\t\t\t\titem.src = item.el.attr('href');\n\t\t\t}\n\t\t}\n\n\t\titem.type = type || mfp.st.type || 'inline';\n\t\titem.index = index;\n\t\titem.parsed = true;\n\t\tmfp.items[index] = item;\n\t\t_mfpTrigger('ElementParse', item);\n\n\t\treturn mfp.items[index];\n\t},\n\n\n\t/**\n\t * Initializes single popup or a group of popups\n\t */\n\taddGroup: function(el, options) {\n\t\tvar eHandler = function(e) {\n\t\t\te.mfpEl = this;\n\t\t\tmfp._openClick(e, el, options);\n\t\t};\n\n\t\tif(!options) {\n\t\t\toptions = {};\n\t\t} \n\n\t\tvar eName = 'click.magnificPopup';\n\t\toptions.mainEl = el;\n\t\t\n\t\tif(options.items) {\n\t\t\toptions.isObj = true;\n\t\t\tel.off(eName).on(eName, eHandler);\n\t\t} else {\n\t\t\toptions.isObj = false;\n\t\t\tif(options.delegate) {\n\t\t\t\tel.off(eName).on(eName, options.delegate , eHandler);\n\t\t\t} else {\n\t\t\t\toptions.items = el;\n\t\t\t\tel.off(eName).on(eName, eHandler);\n\t\t\t}\n\t\t}\n\t},\n\t_openClick: function(e, el, options) {\n\t\tvar midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;\n\n\n\t\tif(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;\n\n\t\tif(disableOn) {\n\t\t\tif($.isFunction(disableOn)) {\n\t\t\t\tif( !disableOn.call(mfp) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else { // else it's number\n\t\t\t\tif( _window.width() < disableOn ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(e.type) {\n\t\t\te.preventDefault();\n\n\t\t\t// This will prevent popup from closing if element is inside and popup is already opened\n\t\t\tif(mfp.isOpen) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t}\n\t\t\t\n\n\t\toptions.el = $(e.mfpEl);\n\t\tif(options.delegate) {\n\t\t\toptions.items = el.find(options.delegate);\n\t\t}\n\t\tmfp.open(options);\n\t},\n\n\n\t/**\n\t * Updates text on preloader\n\t */\n\tupdateStatus: function(status, text) {\n\n\t\tif(mfp.preloader) {\n\t\t\tif(_prevStatus !== status) {\n\t\t\t\tmfp.container.removeClass('mfp-s-'+_prevStatus);\n\t\t\t}\n\n\t\t\tif(!text && status === 'loading') {\n\t\t\t\ttext = mfp.st.tLoading;\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tstatus: status,\n\t\t\t\ttext: text\n\t\t\t};\n\t\t\t// allows to modify status\n\t\t\t_mfpTrigger('UpdateStatus', data);\n\n\t\t\tstatus = data.status;\n\t\t\ttext = data.text;\n\n\t\t\tmfp.preloader.html(text);\n\n\t\t\tmfp.preloader.find('a').on('click', function(e) {\n\t\t\t\te.stopImmediatePropagation();\n\t\t\t});\n\n\t\t\tmfp.container.addClass('mfp-s-'+status);\n\t\t\t_prevStatus = status;\n\t\t}\n\t},\n\n\n\t/*\n\t\t\"Private\" helpers that aren't private at all\n\t */\n\t_addClassToMFP: function(cName) {\n\t\tmfp.bgOverlay.addClass(cName);\n\t\tmfp.wrap.addClass(cName);\n\t},\n\t_removeClassFromMFP: function(cName) {\n\t\tthis.bgOverlay.removeClass(cName);\n\t\tmfp.wrap.removeClass(cName);\n\t},\n\t_hasScrollBar: function(winHeight) {\n\t\treturn (  (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) );\n\t},\n\t_parseMarkup: function(template, values, item) {\n\t\tvar arr;\n\t\tif(item.data) {\n\t\t\tvalues = $.extend(item.data, values);\n\t\t}\n\t\t_mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] );\n\n\t\t$.each(values, function(key, value) {\n\t\t\tif(value === undefined || value === false) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tarr = key.split('_');\n\t\t\tif(arr.length > 1) {\n\t\t\t\tvar el = template.find(EVENT_NS + '-'+arr[0]);\n\n\t\t\t\tif(el.length > 0) {\n\t\t\t\t\tvar attr = arr[1];\n\t\t\t\t\tif(attr === 'replaceWith') {\n\t\t\t\t\t\tif(el[0] !== value[0]) {\n\t\t\t\t\t\t\tel.replaceWith(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(attr === 'img') {\n\t\t\t\t\t\tif(el.is('img')) {\n\t\t\t\t\t\t\tel.attr('src', value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tel.replaceWith( '<img src=\"'+value+'\" class=\"' + el.attr('class') + '\" />' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.attr(arr[1], value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\ttemplate.find(EVENT_NS + '-'+key).html(value);\n\t\t\t}\n\t\t});\n\t},\n\n\t_getScrollbarSize: function() {\n\t\t// thx David\n\t\tif(mfp.scrollbarSize === undefined) {\n\t\t\tvar scrollDiv = document.createElement(\"div\");\n\t\t\tscrollDiv.id = \"mfp-sbm\";\n\t\t\tscrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';\n\t\t\tdocument.body.appendChild(scrollDiv);\n\t\t\tmfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n\t\t\tdocument.body.removeChild(scrollDiv);\n\t\t}\n\t\treturn mfp.scrollbarSize;\n\t}\n\n}; /* MagnificPopup core prototype end */\n\n\n\n\n/**\n * Public static functions\n */\n$.magnificPopup = {\n\tinstance: null,\n\tproto: MagnificPopup.prototype,\n\tmodules: [],\n\n\topen: function(options, index) {\n\t\t_checkInstance();\t\n\n\t\tif(!options) \n\t\t\toptions = {};\n\n\t\toptions.isObj = true;\n\t\toptions.index = index || 0;\n\t\treturn this.instance.open(options);\n\t},\n\n\tclose: function() {\n\t\treturn $.magnificPopup.instance.close();\n\t},\n\n\tregisterModule: function(name, module) {\n\t\tif(module.options) {\n\t\t\t$.magnificPopup.defaults[name] = module.options;\n\t\t}\n\t\t$.extend(this.proto, module.proto);\t\t\t\n\t\tthis.modules.push(name);\n\t},\n\n\tdefaults: {   \n\n\t\t// Info about options is in docs:\n\t\t// http://dimsemenov.com/plugins/magnific-popup/documentation.html#options\n\t\t\n\t\tdisableOn: 0,\t\n\n\t\tkey: null,\n\n\t\tmidClick: false,\n\n\t\tmainClass: '',\n\n\t\tpreloader: true,\n\n\t\tfocus: '', // CSS selector of input to focus after popup is opened\n\t\t\n\t\tcloseOnContentClick: false,\n\n\t\tcloseOnBgClick: true,\n\n\t\tcloseBtnInside: true, \n\n\t\tshowCloseBtn: true,\n\n\t\tenableEscapeKey: true,\n\n\t\tmodal: false,\n\n\t\talignTop: false,\n\t\n\t\tremovalDelay: 0,\n\t\t\n\t\tfixedContentPos: 'auto', \n\t\n\t\tfixedBgPos: 'auto',\n\n\t\toverflowY: 'auto',\n\n\t\tcloseMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&times;</button>',\n\n\t\ttClose: 'Close (Esc)',\n\n\t\ttLoading: 'Loading...'\n\n\t}\n};\n\n\n\n$.fn.magnificPopup = function(options) {\n\t_checkInstance();\n\n\tvar jqEl = $(this);\n\n\t// We call some API method of first param is a string\n\tif (typeof options === \"string\" ) {\n\n\t\tif(options === 'open') {\n\t\t\tvar items,\n\t\t\t\titemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,\n\t\t\t\tindex = parseInt(arguments[1], 10) || 0;\n\n\t\t\tif(itemOpts.items) {\n\t\t\t\titems = itemOpts.items[index];\n\t\t\t} else {\n\t\t\t\titems = jqEl;\n\t\t\t\tif(itemOpts.delegate) {\n\t\t\t\t\titems = items.find(itemOpts.delegate);\n\t\t\t\t}\n\t\t\t\titems = items.eq( index );\n\t\t\t}\n\t\t\tmfp._openClick({mfpEl:items}, jqEl, itemOpts);\n\t\t} else {\n\t\t\tif(mfp.isOpen)\n\t\t\t\tmfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\n\t} else {\n\n\t\t/*\n\t\t * As Zepto doesn't support .data() method for objects \n\t\t * and it works only in normal browsers\n\t\t * we assign \"options\" object directly to the DOM element. FTW!\n\t\t */\n\t\tif(_isJQ) {\n\t\t\tjqEl.data('magnificPopup', options);\n\t\t} else {\n\t\t\tjqEl[0].magnificPopup = options;\n\t\t}\n\n\t\tmfp.addGroup(jqEl, options);\n\n\t}\n\treturn jqEl;\n};\n\n\n//Quick benchmark\n/*\nvar start = performance.now(),\n\ti,\n\trounds = 1000;\n\nfor(i = 0; i < rounds; i++) {\n\n}\nconsole.log('Test #1:', performance.now() - start);\n\nstart = performance.now();\nfor(i = 0; i < rounds; i++) {\n\n}\nconsole.log('Test #2:', performance.now() - start);\n*/\n\n\n/*>>core*/\n\n/*>>inline*/\n\nvar INLINE_NS = 'inline',\n\t_hiddenClass,\n\t_inlinePlaceholder, \n\t_lastInlineElement,\n\t_putInlineElementsBack = function() {\n\t\tif(_lastInlineElement) {\n\t\t\t_inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach();\n\t\t\t_lastInlineElement = null;\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(INLINE_NS, {\n\toptions: {\n\t\thiddenClass: 'hide', // will be appended with `mfp-` prefix\n\t\tmarkup: '',\n\t\ttNotFound: 'Content not found'\n\t},\n\tproto: {\n\n\t\tinitInline: function() {\n\t\t\tmfp.types.push(INLINE_NS);\n\n\t\t\t_mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() {\n\t\t\t\t_putInlineElementsBack();\n\t\t\t});\n\t\t},\n\n\t\tgetInline: function(item, template) {\n\n\t\t\t_putInlineElementsBack();\n\n\t\t\tif(item.src) {\n\t\t\t\tvar inlineSt = mfp.st.inline,\n\t\t\t\t\tel = $(item.src);\n\n\t\t\t\tif(el.length) {\n\n\t\t\t\t\t// If target element has parent - we replace it with placeholder and put it back after popup is closed\n\t\t\t\t\tvar parent = el[0].parentNode;\n\t\t\t\t\tif(parent && parent.tagName) {\n\t\t\t\t\t\tif(!_inlinePlaceholder) {\n\t\t\t\t\t\t\t_hiddenClass = inlineSt.hiddenClass;\n\t\t\t\t\t\t\t_inlinePlaceholder = _getEl(_hiddenClass);\n\t\t\t\t\t\t\t_hiddenClass = 'mfp-'+_hiddenClass;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// replace target inline element with placeholder\n\t\t\t\t\t\t_lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);\n\t\t\t\t\t}\n\n\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t} else {\n\t\t\t\t\tmfp.updateStatus('error', inlineSt.tNotFound);\n\t\t\t\t\tel = $('<div>');\n\t\t\t\t}\n\n\t\t\t\titem.inlineElement = el;\n\t\t\t\treturn el;\n\t\t\t}\n\n\t\t\tmfp.updateStatus('ready');\n\t\t\tmfp._parseMarkup(template, {}, item);\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n/*>>inline*/\n\n/*>>ajax*/\nvar AJAX_NS = 'ajax',\n\t_ajaxCur,\n\t_removeAjaxCursor = function() {\n\t\tif(_ajaxCur) {\n\t\t\t_body.removeClass(_ajaxCur);\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(AJAX_NS, {\n\n\toptions: {\n\t\tsettings: null,\n\t\tcursor: 'mfp-ajax-cur',\n\t\ttError: '<a href=\"%url%\">The content</a> could not be loaded.'\n\t},\n\n\tproto: {\n\t\tinitAjax: function() {\n\t\t\tmfp.types.push(AJAX_NS);\n\t\t\t_ajaxCur = mfp.st.ajax.cursor;\n\n\t\t\t_mfpOn(CLOSE_EVENT+'.'+AJAX_NS, function() {\n\t\t\t\t_removeAjaxCursor();\n\t\t\t\tif(mfp.req) {\n\t\t\t\t\tmfp.req.abort();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tgetAjax: function(item) {\n\n\t\t\tif(_ajaxCur)\n\t\t\t\t_body.addClass(_ajaxCur);\n\n\t\t\tmfp.updateStatus('loading');\n\n\t\t\tvar opts = $.extend({\n\t\t\t\turl: item.src,\n\t\t\t\tsuccess: function(data, textStatus, jqXHR) {\n\t\t\t\t\tvar temp = {\n\t\t\t\t\t\tdata:data,\n\t\t\t\t\t\txhr:jqXHR\n\t\t\t\t\t};\n\n\t\t\t\t\t_mfpTrigger('ParseAjax', temp);\n\n\t\t\t\t\tmfp.appendContent( $(temp.data), AJAX_NS );\n\n\t\t\t\t\titem.finished = true;\n\n\t\t\t\t\t_removeAjaxCursor();\n\n\t\t\t\t\t_setFocus();\n\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tmfp.wrap.addClass(READY_CLASS);\n\t\t\t\t\t}, 16);\n\n\t\t\t\t\tmfp.updateStatus('ready');\n\n\t\t\t\t\t_mfpTrigger('AjaxContentAdded');\n\t\t\t\t},\n\t\t\t\terror: function() {\n\t\t\t\t\t_removeAjaxCursor();\n\t\t\t\t\titem.finished = item.loadError = true;\n\t\t\t\t\tmfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));\n\t\t\t\t}\n\t\t\t}, mfp.st.ajax.settings);\n\n\t\t\tmfp.req = $.ajax(opts);\n\n\t\t\treturn '';\n\t\t}\n\t}\n});\n\n\n\n\n\n\t\n\n/*>>ajax*/\n\n/*>>image*/\nvar _imgInterval,\n\t_getTitle = function(item) {\n\t\tif(item.data && item.data.title !== undefined) \n\t\t\treturn item.data.title;\n\n\t\tvar src = mfp.st.image.titleSrc;\n\n\t\tif(src) {\n\t\t\tif($.isFunction(src)) {\n\t\t\t\treturn src.call(mfp, item);\n\t\t\t} else if(item.el) {\n\t\t\t\treturn item.el.attr(src) || '';\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\n$.magnificPopup.registerModule('image', {\n\n\toptions: {\n\t\tmarkup: '<div class=\"mfp-figure\">'+\n\t\t\t\t\t'<div class=\"mfp-close\"></div>'+\n\t\t\t\t\t'<div class=\"mfp-img\"></div>'+\n\t\t\t\t\t'<div class=\"mfp-bottom-bar\">'+\n\t\t\t\t\t\t'<div class=\"mfp-title\"></div>'+\n\t\t\t\t\t\t'<div class=\"mfp-counter\"></div>'+\n\t\t\t\t\t'</div>'+\n\t\t\t\t'</div>',\n\t\tcursor: 'mfp-zoom-out-cur',\n\t\ttitleSrc: 'title', \n\t\tverticalFit: true,\n\t\ttError: '<a href=\"%url%\">The image</a> could not be loaded.'\n\t},\n\n\tproto: {\n\t\tinitImage: function() {\n\t\t\tvar imgSt = mfp.st.image,\n\t\t\t\tns = '.image';\n\n\t\t\tmfp.types.push('image');\n\n\t\t\t_mfpOn(OPEN_EVENT+ns, function() {\n\t\t\t\tif(mfp.currItem.type === 'image' && imgSt.cursor) {\n\t\t\t\t\t_body.addClass(imgSt.cursor);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\tif(imgSt.cursor) {\n\t\t\t\t\t_body.removeClass(imgSt.cursor);\n\t\t\t\t}\n\t\t\t\t_window.off('resize' + EVENT_NS);\n\t\t\t});\n\n\t\t\t_mfpOn('Resize'+ns, mfp.resizeImage);\n\t\t\tif(mfp.isLowIE) {\n\t\t\t\t_mfpOn('AfterChange', mfp.resizeImage);\n\t\t\t}\n\t\t},\n\t\tresizeImage: function() {\n\t\t\tvar item = mfp.currItem;\n\t\t\tif(!item.img) return;\n\n\t\t\tif(mfp.st.image.verticalFit) {\n\t\t\t\tvar decr = 0;\n\t\t\t\t// fix box-sizing in ie7/8\n\t\t\t\tif(mfp.isLowIE) {\n\t\t\t\t\tdecr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);\n\t\t\t\t}\n\t\t\t\titem.img.css('max-height', mfp.wH-decr);\n\t\t\t}\n\t\t},\n\t\t_onImageHasSize: function(item) {\n\t\t\tif(item.img) {\n\t\t\t\t\n\t\t\t\titem.hasSize = true;\n\n\t\t\t\tif(_imgInterval) {\n\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\titem.isCheckingImgSize = false;\n\n\t\t\t\t_mfpTrigger('ImageHasSize', item);\n\n\t\t\t\tif(item.imgHidden) {\n\t\t\t\t\tif(mfp.content)\n\t\t\t\t\t\tmfp.content.removeClass('mfp-loading');\n\t\t\t\t\t\n\t\t\t\t\titem.imgHidden = false;\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Function that loops until the image has size to display elements that rely on it asap\n\t\t */\n\t\tfindImageSize: function(item) {\n\n\t\t\tvar counter = 0,\n\t\t\t\timg = item.img[0],\n\t\t\t\tmfpSetInterval = function(delay) {\n\n\t\t\t\t\tif(_imgInterval) {\n\t\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t\t}\n\t\t\t\t\t// decelerating interval that checks for size of an image\n\t\t\t\t\t_imgInterval = setInterval(function() {\n\t\t\t\t\t\tif(img.naturalWidth > 0) {\n\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter > 200) {\n\t\t\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\tif(counter === 3) {\n\t\t\t\t\t\t\tmfpSetInterval(10);\n\t\t\t\t\t\t} else if(counter === 40) {\n\t\t\t\t\t\t\tmfpSetInterval(50);\n\t\t\t\t\t\t} else if(counter === 100) {\n\t\t\t\t\t\t\tmfpSetInterval(500);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay);\n\t\t\t\t};\n\n\t\t\tmfpSetInterval(1);\n\t\t},\n\n\t\tgetImage: function(item, template) {\n\n\t\t\tvar guard = 0,\n\n\t\t\t\t// image load complete handler\n\t\t\t\tonLoadComplete = function() {\n\t\t\t\t\tif(item) {\n\t\t\t\t\t\tif (item.img[0].complete) {\n\t\t\t\t\t\t\titem.img.off('.mfploader');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(item === mfp.currItem){\n\t\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\n\t\t\t\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\t\t\titem.loaded = true;\n\n\t\t\t\t\t\t\t_mfpTrigger('ImageLoadComplete');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// if image complete check fails 200 times (20 sec), we assume that there was an error.\n\t\t\t\t\t\t\tguard++;\n\t\t\t\t\t\t\tif(guard < 200) {\n\t\t\t\t\t\t\t\tsetTimeout(onLoadComplete,100);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonLoadError();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// image error handler\n\t\t\t\tonLoadError = function() {\n\t\t\t\t\tif(item) {\n\t\t\t\t\t\titem.img.off('.mfploader');\n\t\t\t\t\t\tif(item === mfp.currItem){\n\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\t\t\t\t\t\t\tmfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\t\titem.loaded = true;\n\t\t\t\t\t\titem.loadError = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\timgSt = mfp.st.image;\n\n\n\t\t\tvar el = template.find('.mfp-img');\n\t\t\tif(el.length) {\n\t\t\t\tvar img = new Image();\n\t\t\t\timg.className = 'mfp-img';\n\t\t\t\titem.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);\n\t\t\t\timg.src = item.src;\n\n\t\t\t\t// without clone() \"error\" event is not firing when IMG is replaced by new IMG\n\t\t\t\t// TODO: find a way to avoid such cloning\n\t\t\t\tif(el.is('img')) {\n\t\t\t\t\titem.img = item.img.clone();\n\t\t\t\t}\n\t\t\t\tif(item.img[0].naturalWidth > 0) {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmfp._parseMarkup(template, {\n\t\t\t\ttitle: _getTitle(item),\n\t\t\t\timg_replaceWith: item.img\n\t\t\t}, item);\n\n\t\t\tmfp.resizeImage();\n\n\t\t\tif(item.hasSize) {\n\t\t\t\tif(_imgInterval) clearInterval(_imgInterval);\n\n\t\t\t\tif(item.loadError) {\n\t\t\t\t\ttemplate.addClass('mfp-loading');\n\t\t\t\t\tmfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n\t\t\t\t} else {\n\t\t\t\t\ttemplate.removeClass('mfp-loading');\n\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t}\n\t\t\t\treturn template;\n\t\t\t}\n\n\t\t\tmfp.updateStatus('loading');\n\t\t\titem.loading = true;\n\n\t\t\tif(!item.hasSize) {\n\t\t\t\titem.imgHidden = true;\n\t\t\t\ttemplate.addClass('mfp-loading');\n\t\t\t\tmfp.findImageSize(item);\n\t\t\t} \n\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n\n\n/*>>image*/\n\n/*>>zoom*/\nvar hasMozTransform,\n\tgetHasMozTransform = function() {\n\t\tif(hasMozTransform === undefined) {\n\t\t\thasMozTransform = document.createElement('p').style.MozTransform !== undefined;\n\t\t}\n\t\treturn hasMozTransform;\t\t\n\t};\n\n$.magnificPopup.registerModule('zoom', {\n\n\toptions: {\n\t\tenabled: false,\n\t\teasing: 'ease-in-out',\n\t\tduration: 300,\n\t\topener: function(element) {\n\t\t\treturn element.is('img') ? element : element.find('img');\n\t\t}\n\t},\n\n\tproto: {\n\n\t\tinitZoom: function() {\n\t\t\tvar zoomSt = mfp.st.zoom,\n\t\t\t\tns = '.zoom';\n\t\t\t\t\n\t\t\tif(!zoomSt.enabled || !mfp.supportsTransition) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar duration = zoomSt.duration,\n\t\t\t\tgetElToAnimate = function(image) {\n\t\t\t\t\tvar newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),\n\t\t\t\t\t\ttransition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,\n\t\t\t\t\t\tcssObj = {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t'-webkit-backface-visibility': 'hidden'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tt = 'transition';\n\n\t\t\t\t\tcssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;\n\n\t\t\t\t\tnewImg.css(cssObj);\n\t\t\t\t\treturn newImg;\n\t\t\t\t},\n\t\t\t\tshowMainContent = function() {\n\t\t\t\t\tmfp.content.css('visibility', 'visible');\n\t\t\t\t},\n\t\t\t\topenTimeout,\n\t\t\t\tanimatedImg;\n\n\t\t\t_mfpOn('BuildControls'+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\n\t\t\t\t\tclearTimeout(openTimeout);\n\t\t\t\t\tmfp.content.css('visibility', 'hidden');\n\n\t\t\t\t\t// Basically, all code below does is clones existing image, puts in on top of the current one and animated it\n\t\t\t\t\t\n\t\t\t\t\timage = mfp._getItemToZoom();\n\n\t\t\t\t\tif(!image) {\n\t\t\t\t\t\tshowMainContent();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tanimatedImg = getElToAnimate(image); \n\t\t\t\t\t\n\t\t\t\t\tanimatedImg.css( mfp._getOffset() );\n\n\t\t\t\t\tmfp.wrap.append(animatedImg);\n\n\t\t\t\t\topenTimeout = setTimeout(function() {\n\t\t\t\t\t\tanimatedImg.css( mfp._getOffset( true ) );\n\t\t\t\t\t\topenTimeout = setTimeout(function() {\n\n\t\t\t\t\t\t\tshowMainContent();\n\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\tanimatedImg.remove();\n\t\t\t\t\t\t\t\timage = animatedImg = null;\n\t\t\t\t\t\t\t\t_mfpTrigger('ZoomAnimationEnded');\n\t\t\t\t\t\t\t}, 16); // avoid blink when switching images \n\n\t\t\t\t\t\t}, duration); // this timeout equals animation duration\n\n\t\t\t\t\t}, 16); // by adding this timeout we avoid short glitch at the beginning of animation\n\n\n\t\t\t\t\t// Lots of timeouts...\n\t\t\t\t}\n\t\t\t});\n\t\t\t_mfpOn(BEFORE_CLOSE_EVENT+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\n\t\t\t\t\tclearTimeout(openTimeout);\n\n\t\t\t\t\tmfp.st.removalDelay = duration;\n\n\t\t\t\t\tif(!image) {\n\t\t\t\t\t\timage = mfp._getItemToZoom();\n\t\t\t\t\t\tif(!image) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tanimatedImg = getElToAnimate(image);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tanimatedImg.css( mfp._getOffset(true) );\n\t\t\t\t\tmfp.wrap.append(animatedImg);\n\t\t\t\t\tmfp.content.css('visibility', 'hidden');\n\t\t\t\t\t\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tanimatedImg.css( mfp._getOffset() );\n\t\t\t\t\t}, 16);\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\t\t\t\t\tshowMainContent();\n\t\t\t\t\tif(animatedImg) {\n\t\t\t\t\t\tanimatedImg.remove();\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t});\n\t\t},\n\n\t\t_allowZoom: function() {\n\t\t\treturn mfp.currItem.type === 'image';\n\t\t},\n\n\t\t_getItemToZoom: function() {\n\t\t\tif(mfp.currItem.hasSize) {\n\t\t\t\treturn mfp.currItem.img;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Get element postion relative to viewport\n\t\t_getOffset: function(isLarge) {\n\t\t\tvar el;\n\t\t\tif(isLarge) {\n\t\t\t\tel = mfp.currItem.img;\n\t\t\t} else {\n\t\t\t\tel = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);\n\t\t\t}\n\n\t\t\tvar offset = el.offset();\n\t\t\tvar paddingTop = parseInt(el.css('padding-top'),10);\n\t\t\tvar paddingBottom = parseInt(el.css('padding-bottom'),10);\n\t\t\toffset.top -= ( $(window).scrollTop() - paddingTop );\n\n\n\t\t\t/*\n\t\t\t\n\t\t\tAnimating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.\n\n\t\t\t */\n\t\t\tvar obj = {\n\t\t\t\twidth: el.width(),\n\t\t\t\t// fix Zepto height+padding issue\n\t\t\t\theight: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop\n\t\t\t};\n\n\t\t\t// I hate to do this, but there is no another option\n\t\t\tif( getHasMozTransform() ) {\n\t\t\t\tobj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';\n\t\t\t} else {\n\t\t\t\tobj.left = offset.left;\n\t\t\t\tobj.top = offset.top;\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\n\t}\n});\n\n\n\n/*>>zoom*/\n\n/*>>iframe*/\n\nvar IFRAME_NS = 'iframe',\n\t_emptyPage = '//about:blank',\n\t\n\t_fixIframeBugs = function(isShowing) {\n\t\tif(mfp.currTemplate[IFRAME_NS]) {\n\t\t\tvar el = mfp.currTemplate[IFRAME_NS].find('iframe');\n\t\t\tif(el.length) { \n\t\t\t\t// reset src after the popup is closed to avoid \"video keeps playing after popup is closed\" bug\n\t\t\t\tif(!isShowing) {\n\t\t\t\t\tel[0].src = _emptyPage;\n\t\t\t\t}\n\n\t\t\t\t// IE8 black screen bug fix\n\t\t\t\tif(mfp.isIE8) {\n\t\t\t\t\tel.css('display', isShowing ? 'block' : 'none');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(IFRAME_NS, {\n\n\toptions: {\n\t\tmarkup: '<div class=\"mfp-iframe-scaler\">'+\n\t\t\t\t\t'<div class=\"mfp-close\"></div>'+\n\t\t\t\t\t'<iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe>'+\n\t\t\t\t'</div>',\n\n\t\tsrcAction: 'iframe_src',\n\n\t\t// we don't care and support only one default type of URL by default\n\t\tpatterns: {\n\t\t\tyoutube: {\n\t\t\t\tindex: 'youtube.com', \n\t\t\t\tid: 'v=', \n\t\t\t\tsrc: '//www.youtube.com/embed/%id%?autoplay=1'\n\t\t\t},\n\t\t\tvimeo: {\n\t\t\t\tindex: 'vimeo.com/',\n\t\t\t\tid: '/',\n\t\t\t\tsrc: '//player.vimeo.com/video/%id%?autoplay=1'\n\t\t\t},\n\t\t\tgmaps: {\n\t\t\t\tindex: '//maps.google.',\n\t\t\t\tsrc: '%id%&output=embed'\n\t\t\t}\n\t\t}\n\t},\n\n\tproto: {\n\t\tinitIframe: function() {\n\t\t\tmfp.types.push(IFRAME_NS);\n\n\t\t\t_mfpOn('BeforeChange', function(e, prevType, newType) {\n\t\t\t\tif(prevType !== newType) {\n\t\t\t\t\tif(prevType === IFRAME_NS) {\n\t\t\t\t\t\t_fixIframeBugs(); // iframe if removed\n\t\t\t\t\t} else if(newType === IFRAME_NS) {\n\t\t\t\t\t\t_fixIframeBugs(true); // iframe is showing\n\t\t\t\t\t} \n\t\t\t\t}// else {\n\t\t\t\t\t// iframe source is switched, don't do anything\n\t\t\t\t//}\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {\n\t\t\t\t_fixIframeBugs();\n\t\t\t});\n\t\t},\n\n\t\tgetIframe: function(item, template) {\n\t\t\tvar embedSrc = item.src;\n\t\t\tvar iframeSt = mfp.st.iframe;\n\t\t\t\t\n\t\t\t$.each(iframeSt.patterns, function() {\n\t\t\t\tif(embedSrc.indexOf( this.index ) > -1) {\n\t\t\t\t\tif(this.id) {\n\t\t\t\t\t\tif(typeof this.id === 'string') {\n\t\t\t\t\t\t\tembedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tembedSrc = this.id.call( this, embedSrc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tembedSrc = this.src.replace('%id%', embedSrc );\n\t\t\t\t\treturn false; // break;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tvar dataObj = {};\n\t\t\tif(iframeSt.srcAction) {\n\t\t\t\tdataObj[iframeSt.srcAction] = embedSrc;\n\t\t\t}\n\t\t\tmfp._parseMarkup(template, dataObj, item);\n\n\t\t\tmfp.updateStatus('ready');\n\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n\n\n/*>>iframe*/\n\n/*>>gallery*/\n/**\n * Get looped index depending on number of slides\n */\nvar _getLoopedId = function(index) {\n\t\tvar numSlides = mfp.items.length;\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else  if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t_replaceCurrTotal = function(text, curr, total) {\n\t\treturn text.replace('%curr%', curr + 1).replace('%total%', total);\n\t};\n\n$.magnificPopup.registerModule('gallery', {\n\n\toptions: {\n\t\tenabled: false,\n\t\tarrowMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',\n\t\tpreload: [0,2],\n\t\tnavigateByImgClick: true,\n\t\tarrows: true,\n\n\t\ttPrev: 'Previous (Left arrow key)',\n\t\ttNext: 'Next (Right arrow key)',\n\t\ttCounter: '%curr% of %total%'\n\t},\n\n\tproto: {\n\t\tinitGallery: function() {\n\n\t\t\tvar gSt = mfp.st.gallery,\n\t\t\t\tns = '.mfp-gallery',\n\t\t\t\tsupportsFastClick = Boolean($.fn.mfpFastClick);\n\n\t\t\tmfp.direction = true; // true - next, false - prev\n\t\t\t\n\t\t\tif(!gSt || !gSt.enabled ) return false;\n\n\t\t\t_wrapClasses += ' mfp-gallery';\n\n\t\t\t_mfpOn(OPEN_EVENT+ns, function() {\n\n\t\t\t\tif(gSt.navigateByImgClick) {\n\t\t\t\t\tmfp.wrap.on('click'+ns, '.mfp-img', function() {\n\t\t\t\t\t\tif(mfp.items.length > 1) {\n\t\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_document.on('keydown'+ns, function(e) {\n\t\t\t\t\tif (e.keyCode === 37) {\n\t\t\t\t\t\tmfp.prev();\n\t\t\t\t\t} else if (e.keyCode === 39) {\n\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t_mfpOn('UpdateStatus'+ns, function(e, data) {\n\t\t\t\tif(data.text) {\n\t\t\t\t\tdata.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {\n\t\t\t\tvar l = mfp.items.length;\n\t\t\t\tvalues.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';\n\t\t\t});\n\n\t\t\t_mfpOn('BuildControls' + ns, function() {\n\t\t\t\tif(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {\n\t\t\t\t\tvar markup = gSt.arrowMarkup,\n\t\t\t\t\t\tarrowLeft = mfp.arrowLeft = $( markup.replace('%title%', gSt.tPrev).replace('%dir%', 'left') ).addClass(PREVENT_CLOSE_CLASS),\t\t\t\n\t\t\t\t\t\tarrowRight = mfp.arrowRight = $( markup.replace('%title%', gSt.tNext).replace('%dir%', 'right') ).addClass(PREVENT_CLOSE_CLASS);\n\n\t\t\t\t\tvar eName = supportsFastClick ? 'mfpFastClick' : 'click';\n\t\t\t\t\tarrowLeft[eName](function() {\n\t\t\t\t\t\tmfp.prev();\n\t\t\t\t\t});\t\t\t\n\t\t\t\t\tarrowRight[eName](function() {\n\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t});\t\n\n\t\t\t\t\t// Polyfill for :before and :after (adds elements with classes mfp-a and mfp-b)\n\t\t\t\t\tif(mfp.isIE7) {\n\t\t\t\t\t\t_getEl('b', arrowLeft[0], false, true);\n\t\t\t\t\t\t_getEl('a', arrowLeft[0], false, true);\n\t\t\t\t\t\t_getEl('b', arrowRight[0], false, true);\n\t\t\t\t\t\t_getEl('a', arrowRight[0], false, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tmfp.container.append(arrowLeft.add(arrowRight));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(CHANGE_EVENT+ns, function() {\n\t\t\t\tif(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);\n\n\t\t\t\tmfp._preloadTimeout = setTimeout(function() {\n\t\t\t\t\tmfp.preloadNearbyImages();\n\t\t\t\t\tmfp._preloadTimeout = null;\n\t\t\t\t}, 16);\t\t\n\t\t\t});\n\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\t_document.off(ns);\n\t\t\t\tmfp.wrap.off('click'+ns);\n\t\t\t\n\t\t\t\tif(mfp.arrowLeft && supportsFastClick) {\n\t\t\t\t\tmfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick();\n\t\t\t\t}\n\t\t\t\tmfp.arrowRight = mfp.arrowLeft = null;\n\t\t\t});\n\n\t\t}, \n\t\tnext: function() {\n\t\t\tmfp.direction = true;\n\t\t\tmfp.index = _getLoopedId(mfp.index + 1);\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tprev: function() {\n\t\t\tmfp.direction = false;\n\t\t\tmfp.index = _getLoopedId(mfp.index - 1);\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tgoTo: function(newIndex) {\n\t\t\tmfp.direction = (newIndex >= mfp.index);\n\t\t\tmfp.index = newIndex;\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tpreloadNearbyImages: function() {\n\t\t\tvar p = mfp.st.gallery.preload,\n\t\t\t\tpreloadBefore = Math.min(p[0], mfp.items.length),\n\t\t\t\tpreloadAfter = Math.min(p[1], mfp.items.length),\n\t\t\t\ti;\n\n\t\t\tfor(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {\n\t\t\t\tmfp._preloadItem(mfp.index+i);\n\t\t\t}\n\t\t\tfor(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {\n\t\t\t\tmfp._preloadItem(mfp.index-i);\n\t\t\t}\n\t\t},\n\t\t_preloadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\n\t\t\tif(mfp.items[index].preloaded) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar item = mfp.items[index];\n\t\t\tif(!item.parsed) {\n\t\t\t\titem = mfp.parseEl( index );\n\t\t\t}\n\n\t\t\t_mfpTrigger('LazyLoad', item);\n\n\t\t\tif(item.type === 'image') {\n\t\t\t\titem.img = $('<img class=\"mfp-img\" />').on('load.mfploader', function() {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t}).on('error.mfploader', function() {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\titem.loadError = true;\n\t\t\t\t\t_mfpTrigger('LazyLoadError', item);\n\t\t\t\t}).attr('src', item.src);\n\t\t\t}\n\n\n\t\t\titem.preloaded = true;\n\t\t}\n\t}\n});\n\n/*\nTouch Support that might be implemented some day\n\naddSwipeGesture: function() {\n\tvar startX,\n\t\tmoved,\n\t\tmultipleTouches;\n\n\t\treturn;\n\n\tvar namespace = '.mfp',\n\t\taddEventNames = function(pref, down, move, up, cancel) {\n\t\t\tmfp._tStart = pref + down + namespace;\n\t\t\tmfp._tMove = pref + move + namespace;\n\t\t\tmfp._tEnd = pref + up + namespace;\n\t\t\tmfp._tCancel = pref + cancel + namespace;\n\t\t};\n\n\tif(window.navigator.msPointerEnabled) {\n\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t} else if('ontouchstart' in window) {\n\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t} else {\n\t\treturn;\n\t}\n\t_window.on(mfp._tStart, function(e) {\n\t\tvar oE = e.originalEvent;\n\t\tmultipleTouches = moved = false;\n\t\tstartX = oE.pageX || oE.changedTouches[0].pageX;\n\t}).on(mfp._tMove, function(e) {\n\t\tif(e.originalEvent.touches.length > 1) {\n\t\t\tmultipleTouches = e.originalEvent.touches.length;\n\t\t} else {\n\t\t\t//e.preventDefault();\n\t\t\tmoved = true;\n\t\t}\n\t}).on(mfp._tEnd + ' ' + mfp._tCancel, function(e) {\n\t\tif(moved && !multipleTouches) {\n\t\t\tvar oE = e.originalEvent,\n\t\t\t\tdiff = startX - (oE.pageX || oE.changedTouches[0].pageX);\n\n\t\t\tif(diff > 20) {\n\t\t\t\tmfp.next();\n\t\t\t} else if(diff < -20) {\n\t\t\t\tmfp.prev();\n\t\t\t}\n\t\t}\n\t});\n},\n*/\n\n\n/*>>gallery*/\n\n/*>>retina*/\n\nvar RETINA_NS = 'retina';\n\n$.magnificPopup.registerModule(RETINA_NS, {\n\toptions: {\n\t\treplaceSrc: function(item) {\n\t\t\treturn item.src.replace(/\\.\\w+$/, function(m) { return '@2x' + m; });\n\t\t},\n\t\tratio: 1 // Function or number.  Set to 1 to disable.\n\t},\n\tproto: {\n\t\tinitRetina: function() {\n\t\t\tif(window.devicePixelRatio > 1) {\n\n\t\t\t\tvar st = mfp.st.retina,\n\t\t\t\t\tratio = st.ratio;\n\n\t\t\t\tratio = !isNaN(ratio) ? ratio : ratio();\n\n\t\t\t\tif(ratio > 1) {\n\t\t\t\t\t_mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {\n\t\t\t\t\t\titem.img.css({\n\t\t\t\t\t\t\t'max-width': item.img[0].naturalWidth / ratio,\n\t\t\t\t\t\t\t'width': '100%'\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\t_mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {\n\t\t\t\t\t\titem.src = st.replaceSrc(item, ratio);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n});\n\n/*>>retina*/\n\n/*>>fastclick*/\n/**\n * FastClick event implementation. (removes 300ms delay on touch devices)\n * Based on https://developers.google.com/mobile/articles/fast_buttons\n *\n * You may use it outside the Magnific Popup by calling just:\n *\n * $('.your-el').mfpFastClick(function() {\n *     console.log('Clicked!');\n * });\n *\n * To unbind:\n * $('.your-el').destroyMfpFastClick();\n * \n * \n * Note that it's a very basic and simple implementation, it blocks ghost click on the same element where it was bound.\n * If you need something more advanced, use plugin by FT Labs https://github.com/ftlabs/fastclick\n * \n */\n\n(function() {\n\tvar ghostClickDelay = 1000,\n\t\tsupportsTouch = 'ontouchstart' in window,\n\t\tunbindTouchMove = function() {\n\t\t\t_window.off('touchmove'+ns+' touchend'+ns);\n\t\t},\n\t\teName = 'mfpFastClick',\n\t\tns = '.'+eName;\n\n\n\t// As Zepto.js doesn't have an easy way to add custom events (like jQuery), so we implement it in this way\n\t$.fn.mfpFastClick = function(callback) {\n\n\t\treturn $(this).each(function() {\n\n\t\t\tvar elem = $(this),\n\t\t\t\tlock;\n\n\t\t\tif( supportsTouch ) {\n\n\t\t\t\tvar timeout,\n\t\t\t\t\tstartX,\n\t\t\t\t\tstartY,\n\t\t\t\t\tpointerMoved,\n\t\t\t\t\tpoint,\n\t\t\t\t\tnumPointers;\n\n\t\t\t\telem.on('touchstart' + ns, function(e) {\n\t\t\t\t\tpointerMoved = false;\n\t\t\t\t\tnumPointers = 1;\n\n\t\t\t\t\tpoint = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0];\n\t\t\t\t\tstartX = point.clientX;\n\t\t\t\t\tstartY = point.clientY;\n\n\t\t\t\t\t_window.on('touchmove'+ns, function(e) {\n\t\t\t\t\t\tpoint = e.originalEvent ? e.originalEvent.touches : e.touches;\n\t\t\t\t\t\tnumPointers = point.length;\n\t\t\t\t\t\tpoint = point[0];\n\t\t\t\t\t\tif (Math.abs(point.clientX - startX) > 10 ||\n\t\t\t\t\t\t\tMath.abs(point.clientY - startY) > 10) {\n\t\t\t\t\t\t\tpointerMoved = true;\n\t\t\t\t\t\t\tunbindTouchMove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}).on('touchend'+ns, function(e) {\n\t\t\t\t\t\tunbindTouchMove();\n\t\t\t\t\t\tif(pointerMoved || numPointers > 1) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlock = true;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\ttimeout = setTimeout(function() {\n\t\t\t\t\t\t\tlock = false;\n\t\t\t\t\t\t}, ghostClickDelay);\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\telem.on('click' + ns, function() {\n\t\t\t\tif(!lock) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n\n\t$.fn.destroyMfpFastClick = function() {\n\t\t$(this).off('touchstart' + ns + ' click' + ns);\n\t\tif(supportsTouch) _window.off('touchmove'+ns+' touchend'+ns);\n\t};\n})();\n\n/*>>fastclick*/\n})(window.jQuery || window.Zepto);"
  },
  {
    "path": "docs/assets/js/plugins/respond.js",
    "content": "/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\n\nwindow.matchMedia = window.matchMedia || (function( doc, undefined ) {\n\n  \"use strict\";\n\n  var bool,\n      docElem = doc.documentElement,\n      refNode = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement( \"body\" ),\n      div = doc.createElement( \"div\" );\n\n  div.id = \"mq-test-1\";\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n\n  return function(q){\n\n    div.innerHTML = \"&shy;<style media=\\\"\" + q + \"\\\"> #mq-test-1 { width: 42px; }</style>\";\n\n    docElem.insertBefore( fakeBody, refNode );\n    bool = div.offsetWidth === 42;\n    docElem.removeChild( fakeBody );\n\n    return {\n      matches: bool,\n      media: q\n    };\n\n  };\n\n}( document ));\n\n\n\n\n\n/*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\n\t\"use strict\";\n\n\t//exposed namespace\n\tvar respond = {};\n\twin.respond = respond;\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update = function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){\n\t\treturn;\n\t}\n\t\n\t//define vars\n\tvar doc = win.document,\n\t\tdocElem = doc.documentElement,\n\t\tmediastyles = [],\n\t\trules = [],\n\t\tappendedEls = [],\n\t\tparsedSheets = {},\n\t\tresizeThrottle = 30,\n\t\thead = doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase = doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks = head.getElementsByTagName( \"link\" ),\n\t\trequestQueue = [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS = function(){\n\n\t\t\tfor( var i = 0; i < links.length; i++ ){\n\t\t\t\tvar sheet = links[ i ],\n\t\t\t\thref = sheet.href,\n\t\t\t\tmedia = sheet.media,\n\t\t\t\tisCSS = sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base) ||\n\t\t\t\t\t\t\thref.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\n\t\t\t\t\t// by wrapping recursive function call in setTimeout \n\t\t\t\t\t// we prevent \"Stack overflow\" error in IE7\n\t\t\t\t\twin.setTimeout(function(){ makeRequests(); },0);\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate = function( styles, href, media ){\n\t\t\tvar qs = styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql = qs && qs.length || 0;\n\n\t\t\t//try to get CSS path\n\t\t\thref = href.substring( 0, href.lastIndexOf( \"/\" ) );\n\n\t\t\tvar repUrls\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia = !ql && media;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\n\t\t\tfor( var i = 0; i < ql; i++ ){\n\t\t\t\tvar fullq, thisq, eachq, eql;\n\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq = qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq = fullq.split( \",\" );\n\t\t\t\teql\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( var j = 0; j < eql; j++ ){\n\t\t\t\t\tthisq = eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia : thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules : rules.length - 1,\n\t\t\t\t\t\thasquery : thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw : thisq.match( /\\(\\s*min\\-width\\s*:\\s*(\\s*[0-9\\.]+)(px|em)\\s*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw : thisq.match( /\\(\\s*max\\-width\\s*:\\s*(\\s*[0-9\\.]+)(px|em)\\s*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue = function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia = function( fromResize ){\n\t\t\tvar name = \"clientWidth\",\n\t\t\t\tdocElemProp = docElem[ name ],\n\t\t\t\tcurrWidth = doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink = links[ links.length-1 ],\n\t\t\t\tnow = (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\twin.clearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = win.setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall = now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tif( mediastyles.hasOwnProperty( i ) ){\n\t\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\t\tminnull = min === null,\n\t\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\t\tem = \"em\";\n\t\t\t\t\t\n\t\t\t\t\tif( !!min ){\n\t\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t\t}\n\t\t\t\t\tif( !!max ){\n\t\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var j in appendedEls ){\n\t\t\t\tif( appendedEls.hasOwnProperty( j ) ){\n\t\t\t\t\tif( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){\n\t\t\t\t\t\thead.removeChild( appendedEls[ j ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var k in styleBlocks ){\n\t\t\t\tif( styleBlocks.hasOwnProperty( k ) ){\n\t\t\t\t\tvar ss = doc.createElement( \"style\" ),\n\t\t\t\t\t\tcss = styleBlocks[ k ].join( \"\\n\" );\n\t\t\t\t\t\n\t\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\t\tss.media = k;\n\t\t\t\t\t\n\t\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\t\n\t\t\t\t\tif ( ss.styleSheet ){ \n\t\t\t\t\t\tss.styleSheet.cssText = css;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\t\tappendedEls.push( ss );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t};\n\t\t\tif ( req.readyState === 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new win.XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new win.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);"
  },
  {
    "path": "docs/index.html",
    "content": "---\nlayout: post-index\ntitle: Deep Learning Book Chinese Translation\ncomments: false\n---\n\n{% for post in paginator.posts reversed %}\n\n<article class=\"hentry\">\n  <header>\n    {% if post.image.feature %}\n      <div class=\"entry-image-index\">\n        <a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\"><img src=\"{{ site.url }}/images/{{ post.image.feature }}\" alt=\"{{ post.title }}\"></a>\n      </div><!-- /.entry-image -->\n    {% endif %}\n    {% if post.link %}\n      <h1 class=\"entry-title\"><a href=\"{{ site.url }}{{ post.url }}\" class=\"permalink\" rel=\"bookmark\" title=\"{{ post.title }}\"><i class=\"fa fa-bookmark\"></i></a> <a href=\"{{ post.link }}\">{{ post.title }}</a></h1>\n    {% else %}\n    <h1 class=\"entry-title\"><a href=\"{{ site.url }}{{ post.url }}\" rel=\"bookmark\" title=\"{{ post.title }}\" itemprop=\"url\">{{ post.url | replace:'_', ' ' | replace:'/Chapter', '第' | truncatewords: 1 | remove:'...' | append: '章 ' }} <span style='font-size:0.8em;margin-left:1em;'> {{ post.title }} </span></a></h1>\n    {% endif %}\n  </header>\n  <div class=\"read-more-content\">\n    <p>{% if post.description %}{{ post.description }}{% else %}{{ post.content | strip_html | strip_newlines | truncate: 140 }}&hellip;{% endif %} <a href=\"{{ site.url }}{{ post.url }}\">继续阅读</a></p>\n  </div><!-- /.read-more-content -->\n</article><!-- /.hentry -->\n{% endfor %}\n\n{% include pagination.html %}\n"
  },
  {
    "path": "math_symbol.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\newcommand{\\argmax}{\\arg\\max}\n\\newcommand{\\argmin}{\\arg\\min}\n\\newcommand{\\sigmoid}{\\text{sigmoid}}\n\\newcommand{\\norm}[1]{\\left\\lVert#1\\right\\rVert}\n\\newcommand{\\Tr}{\\text{Tr}}\n\n\\newcommand{\\Var}{\\text{Var}}\n\\newcommand{\\Cov}{\\text{Cov}}\n\\newcommand{\\plim}{\\text{plim}}\n\\newcommand{\\Tsp}{\\top}\n\n% Scala\n\\newcommand{\\Sa}{\\mathit{a}}\n\\newcommand{\\Sb}{\\mathit{b}}\n\\newcommand{\\Sc}{\\mathit{c}}\n\\newcommand{\\Sd}{\\mathit{d}}\n\\newcommand{\\Se}{\\mathit{e}}\n\\newcommand{\\Sf}{\\mathit{f}}\n\\newcommand{\\Sg}{\\mathit{g}}\n\\newcommand{\\Sh}{\\mathit{h}}\n\\newcommand{\\Si}{\\mathit{i}}\n\\newcommand{\\Sj}{\\mathit{j}}\n\\newcommand{\\Sk}{\\mathit{k}}\n\\newcommand{\\Sl}{\\mathit{l}}\n\\newcommand{\\Sm}{\\mathit{m}}\n\\newcommand{\\Sn}{\\mathit{n}}\n\\newcommand{\\So}{\\mathit{o}}\n\\newcommand{\\Sp}{\\mathit{p}}\n\\newcommand{\\Sq}{\\mathit{q}}\n\\newcommand{\\Sr}{\\mathit{r}}\n\\newcommand{\\Ss}{\\mathit{s}}\n\\newcommand{\\St}{\\mathit{t}}\n\\newcommand{\\Su}{\\mathit{u}}\n\\newcommand{\\Sv}{\\mathit{v}}\n\\newcommand{\\Sw}{\\mathit{w}}\n\\newcommand{\\Sx}{\\mathit{x}}\n\\newcommand{\\Sy}{\\mathit{y}}\n\\newcommand{\\Sz}{\\mathit{z}}\n\n\\newcommand{\\SA}{\\mathit{A}}\n\\newcommand{\\SB}{\\mathit{B}}\n\\newcommand{\\SC}{\\mathit{C}}\n\\newcommand{\\SD}{\\mathit{D}}\n\\newcommand{\\SE}{\\mathit{E}}\n\\newcommand{\\SF}{\\mathit{F}}\n\\newcommand{\\SG}{\\mathit{G}}\n\\newcommand{\\SH}{\\mathit{H}}\n\\newcommand{\\SJ}{\\mathit{J}}\n\\newcommand{\\SK}{\\mathit{K}}\n\\newcommand{\\SI}{\\mathit{L}}\n\\newcommand{\\SM}{\\mathit{M}}\n\\newcommand{\\SN}{\\mathit{N}}\n\\newcommand{\\SO}{\\mathit{O}}\n\\newcommand{\\SP}{\\mathit{P}}\n\\newcommand{\\SQ}{\\mathit{Q}}\n\\newcommand{\\SR}{\\mathit{R}}\n\\newcommand{\\ST}{\\mathit{T}}\n\\newcommand{\\SU}{\\mathit{U}}\n\\newcommand{\\SV}{\\mathit{V}}\n\\newcommand{\\SW}{\\mathit{W}}\n\\newcommand{\\SX}{\\mathit{X}}\n\\newcommand{\\SY}{\\mathit{Y}}\n\\newcommand{\\SZ}{\\mathit{Z}}\n\n\n\n% Vector\n\\newcommand{\\Va}{\\boldsymbol{\\mathit{a}}}\n\\newcommand{\\Vb}{\\boldsymbol{\\mathit{b}}}\n\\newcommand{\\Vc}{\\boldsymbol{\\mathit{c}}}\n\\newcommand{\\Vd}{\\boldsymbol{\\mathit{d}}}\n\\newcommand{\\Ve}{\\boldsymbol{\\mathit{e}}}\n\\newcommand{\\Vf}{\\boldsymbol{\\mathit{f}}}\n\\newcommand{\\Vg}{\\boldsymbol{\\mathit{g}}}\n\\newcommand{\\Vh}{\\boldsymbol{\\mathit{h}}}\n\\newcommand{\\Vi}{\\boldsymbol{\\mathit{i}}}\n\\newcommand{\\Vj}{\\boldsymbol{\\mathit{j}}}\n\\newcommand{\\Vk}{\\boldsymbol{\\mathit{k}}}\n\\newcommand{\\Vl}{\\boldsymbol{\\mathit{l}}}\n\\newcommand{\\Vm}{\\boldsymbol{\\mathit{m}}}\n\\newcommand{\\Vn}{\\boldsymbol{\\mathit{n}}}\n\\newcommand{\\Vo}{\\boldsymbol{\\mathit{o}}}\n\\newcommand{\\Vp}{\\boldsymbol{\\mathit{p}}}\n\\newcommand{\\Vq}{\\boldsymbol{\\mathit{q}}}\n\\newcommand{\\Vr}{\\boldsymbol{\\mathit{r}}}\n\\newcommand{\\Vs}{\\boldsymbol{\\mathit{s}}}\n\\newcommand{\\Vt}{\\boldsymbol{\\mathit{t}}}\n\\newcommand{\\Vu}{\\boldsymbol{\\mathit{u}}}\n\\newcommand{\\Vv}{\\boldsymbol{\\mathit{v}}}\n\\newcommand{\\Vw}{\\boldsymbol{\\mathit{w}}}\n\\newcommand{\\Vx}{\\boldsymbol{\\mathit{x}}}\n\\newcommand{\\Vy}{\\boldsymbol{\\mathit{y}}}\n\\newcommand{\\Vz}{\\boldsymbol{\\mathit{z}}}\n\n% Matrix\n\\newcommand{\\MA}{\\boldsymbol{\\mathit{A}}}\n\\newcommand{\\MB}{\\boldsymbol{\\mathit{B}}}\n\\newcommand{\\MC}{\\boldsymbol{\\mathit{C}}}\n\\newcommand{\\MD}{\\boldsymbol{\\mathit{D}}}\n\\newcommand{\\ME}{\\boldsymbol{\\mathit{E}}}\n\\newcommand{\\MF}{\\boldsymbol{\\mathit{F}}}\n\\newcommand{\\MG}{\\boldsymbol{\\mathit{G}}}\n\\newcommand{\\MH}{\\boldsymbol{\\mathit{H}}}\n\\newcommand{\\MI}{\\boldsymbol{\\mathit{I}}}\n\\newcommand{\\MJ}{\\boldsymbol{\\mathit{J}}}\n\\newcommand{\\MK}{\\boldsymbol{\\mathit{K}}}\n\\newcommand{\\ML}{\\boldsymbol{\\mathit{L}}}\n\\newcommand{\\MM}{\\boldsymbol{\\mathit{M}}}\n\\newcommand{\\MN}{\\boldsymbol{\\mathit{N}}}\n\\newcommand{\\MO}{\\boldsymbol{\\mathit{O}}}\n\\newcommand{\\MP}{\\boldsymbol{\\mathit{P}}}\n\\newcommand{\\MQ}{\\boldsymbol{\\mathit{Q}}}\n\\newcommand{\\MR}{\\boldsymbol{\\mathit{R}}}\n\\newcommand{\\MS}{\\boldsymbol{\\mathit{S}}}\n\\newcommand{\\MT}{\\boldsymbol{\\mathit{T}}}\n\\newcommand{\\MU}{\\boldsymbol{\\mathit{U}}}\n\\newcommand{\\MV}{\\boldsymbol{\\mathit{V}}}\n\\newcommand{\\MW}{\\boldsymbol{\\mathit{W}}}\n\\newcommand{\\MX}{\\boldsymbol{\\mathit{X}}}\n\\newcommand{\\MY}{\\boldsymbol{\\mathit{Y}}}\n\\newcommand{\\MZ}{\\boldsymbol{\\mathit{Z}}}\n\n\n%Tensor\n\\newcommand{\\TSA}{\\textsf{\\textbf{A}}}\n\\newcommand{\\TSB}{\\textsf{\\textbf{B}}}\n\\newcommand{\\TSC}{\\textsf{\\textbf{C}}}\n\\newcommand{\\TSD}{\\textsf{\\textbf{D}}}\n\\newcommand{\\TSE}{\\textsf{\\textbf{E}}}\n\\newcommand{\\TSF}{\\textsf{\\textbf{F}}}\n\\newcommand{\\TSG}{\\textsf{\\textbf{G}}}\n\\newcommand{\\TSH}{\\textsf{\\textbf{H}}}\n\\newcommand{\\TSI}{\\textsf{\\textbf{I}}}\n\\newcommand{\\TSJ}{\\textsf{\\textbf{J}}}\n\\newcommand{\\TSK}{\\textsf{\\textbf{K}}}\n\\newcommand{\\TSL}{\\textsf{\\textbf{L}}}\n\\newcommand{\\TSM}{\\textsf{\\textbf{M}}}\n\\newcommand{\\TSN}{\\textsf{\\textbf{N}}}\n\\newcommand{\\TSO}{\\textsf{\\textbf{O}}}\n\\newcommand{\\TSP}{\\textsf{\\textbf{P}}}\n\\newcommand{\\TSQ}{\\textsf{\\textbf{Q}}}\n\\newcommand{\\TSR}{\\textsf{\\textbf{R}}}\n\\newcommand{\\TSS}{\\textsf{\\textbf{S}}}\n\\newcommand{\\TST}{\\textsf{\\textbf{T}}}\n\\newcommand{\\TSU}{\\textsf{\\textbf{U}}}\n\\newcommand{\\TSV}{\\textsf{\\textbf{V}}}\n\\newcommand{\\TSW}{\\textsf{\\textbf{W}}}\n\\newcommand{\\TSX}{\\textsf{\\textbf{X}}}\n\\newcommand{\\TSY}{\\textsf{\\textbf{Y}}}\n\\newcommand{\\TSZ}{\\textsf{\\textbf{Z}}}\n\n% Tensor Element\n\\newcommand{\\TEA}{\\textit{\\textsf{A}}}\n\\newcommand{\\TEB}{\\textit{\\textsf{B}}}\n\\newcommand{\\TEC}{\\textit{\\textsf{C}}}\n\\newcommand{\\TED}{\\textit{\\textsf{D}}}\n\\newcommand{\\TEE}{\\textit{\\textsf{E}}}\n\\newcommand{\\TEF}{\\textit{\\textsf{F}}}\n\\newcommand{\\TEG}{\\textit{\\textsf{G}}}\n\\newcommand{\\TEH}{\\textit{\\textsf{H}}}\n\\newcommand{\\TEI}{\\textit{\\textsf{I}}}\n\\newcommand{\\TEJ}{\\textit{\\textsf{J}}}\n\\newcommand{\\TEK}{\\textit{\\textsf{K}}}\n\\newcommand{\\TEL}{\\textit{\\textsf{L}}}\n\\newcommand{\\TEM}{\\textit{\\textsf{M}}}\n\\newcommand{\\TEN}{\\textit{\\textsf{N}}}\n\\newcommand{\\TEO}{\\textit{\\textsf{O}}}\n\\newcommand{\\TEP}{\\textit{\\textsf{P}}}\n\\newcommand{\\TEQ}{\\textit{\\textsf{Q}}}\n\\newcommand{\\TER}{\\textit{\\textsf{R}}}\n\\newcommand{\\TES}{\\textit{\\textsf{S}}}\n\\newcommand{\\TET}{\\textit{\\textsf{T}}}\n\\newcommand{\\TEU}{\\textit{\\textsf{U}}}\n\\newcommand{\\TEV}{\\textit{\\textsf{V}}}\n\\newcommand{\\TEW}{\\textit{\\textsf{W}}}\n\\newcommand{\\TEX}{\\textit{\\textsf{X}}}\n\\newcommand{\\TEY}{\\textit{\\textsf{Y}}}\n\\newcommand{\\TEZ}{\\textit{\\textsf{Z}}}\n\n% Random Scala\n\\newcommand{\\RSa}{\\mathrm{a}}\n\\newcommand{\\RSb}{\\mathrm{b}}\n\\newcommand{\\RSc}{\\mathrm{c}}\n\\newcommand{\\RSd}{\\mathrm{d}}\n\\newcommand{\\RSe}{\\mathrm{e}}\n\\newcommand{\\RSf}{\\mathrm{f}}\n\\newcommand{\\RSg}{\\mathrm{g}}\n\\newcommand{\\RSh}{\\mathrm{h}}\n\\newcommand{\\RSi}{\\mathrm{i}}\n\\newcommand{\\RSj}{\\mathrm{j}}\n\\newcommand{\\RSk}{\\mathrm{k}}\n\\newcommand{\\RSl}{\\mathrm{l}}\n\\newcommand{\\RSm}{\\mathrm{m}}\n\\newcommand{\\RSn}{\\mathrm{n}}\n\\newcommand{\\RSo}{\\mathrm{o}}\n\\newcommand{\\RSp}{\\mathrm{p}}\n\\newcommand{\\RSq}{\\mathrm{q}}\n\\newcommand{\\RSr}{\\mathrm{r}}\n\\newcommand{\\RSs}{\\mathrm{s}}\n\\newcommand{\\RSt}{\\mathrm{t}}\n\\newcommand{\\RSu}{\\mathrm{u}}\n\\newcommand{\\RSv}{\\mathrm{v}}\n\\newcommand{\\RSw}{\\mathrm{w}}\n\\newcommand{\\RSx}{\\mathrm{x}}\n\\newcommand{\\RSy}{\\mathrm{y}}\n\\newcommand{\\RSz}{\\mathrm{z}}\n\n\n% Random Vector\n\\newcommand{\\RVa}{\\mathbf{a}}\n\\newcommand{\\RVb}{\\mathbf{b}}\n\\newcommand{\\RVc}{\\mathbf{c}}\n\\newcommand{\\RVd}{\\mathbf{d}}\n\\newcommand{\\RVe}{\\mathbf{e}}\n\\newcommand{\\RVf}{\\mathbf{f}}\n\\newcommand{\\RVg}{\\mathbf{g}}\n\\newcommand{\\RVh}{\\mathbf{h}}\n\\newcommand{\\RVi}{\\mathbf{i}}\n\\newcommand{\\RVj}{\\mathbf{j}}\n\\newcommand{\\RVk}{\\mathbf{k}}\n\\newcommand{\\RVl}{\\mathbf{l}}\n\\newcommand{\\RVm}{\\mathbf{m}}\n\\newcommand{\\RVn}{\\mathbf{n}}\n\\newcommand{\\RVo}{\\mathbf{o}}\n\\newcommand{\\RVp}{\\mathbf{p}}\n\\newcommand{\\RVq}{\\mathbf{q}}\n\\newcommand{\\RVr}{\\mathbf{r}}\n\\newcommand{\\RVs}{\\mathbf{s}}\n\\newcommand{\\RVt}{\\mathbf{t}}\n\\newcommand{\\RVu}{\\mathbf{u}}\n\\newcommand{\\RVv}{\\mathbf{v}}\n\\newcommand{\\RVw}{\\mathbf{w}}\n\\newcommand{\\RVx}{\\mathbf{x}}\n\\newcommand{\\RVy}{\\mathbf{y}}\n\\newcommand{\\RVz}{\\mathbf{z}}\n\n% Random Matrix\n% will be added later\n\\newcommand{\\RMX}{\\boldsymbol{\\mathrm{X}}}\n\\newcommand{\\RMA}{\\boldsymbol{\\mathrm{A}}}\n\n\\newcommand{\\Valpha}{\\boldsymbol{\\alpha}}\n\\newcommand{\\Vbeta}{\\boldsymbol{\\beta}}\n\\newcommand{\\Vtheta}{\\boldsymbol{\\theta}}\n\\newcommand{\\Vlambda}{\\boldsymbol{\\lambda}}\n\\newcommand{\\VLambda}{\\boldsymbol{\\Lambda}}\n\\newcommand{\\Vepsilon}{\\boldsymbol{\\epsilon}}\n\\newcommand{\\Vmu}{\\boldsymbol{\\mu}}\n\\newcommand{\\VPhi}{\\boldsymbol{\\Phi}}\n\\newcommand{\\Vsigma}{\\boldsymbol{\\sigma}}\n\\newcommand{\\VSigma}{\\boldsymbol{\\Sigma}}\n\\newcommand{\\Vrho}{\\boldsymbol{\\rho}}\n\\newcommand{\\Vgamma}{\\boldsymbol{\\gamma}}\n\\newcommand{\\Vomega}{\\boldsymbol{\\omega}}\n\\newcommand{\\Vpsi}{\\boldsymbol{\\psi}}\n\\newcommand{\\Vzeta}{\\boldsymbol{\\zeta}}\n\\newcommand{\\Vone}{\\boldsymbol{1}}\n\n\n\\newcommand{\\CalB}{\\mathcal{B}}\n\\newcommand{\\CalC}{\\mathcal{C}}\n\\newcommand{\\CalG}{\\mathcal{G}}\n\\newcommand{\\CalH}{\\mathcal{H}}\n\\newcommand{\\CalL}{\\mathcal{L}}\n\\newcommand{\\CalM}{\\mathcal{M}}\n\\newcommand{\\CalN}{\\mathcal{N}}\n\\newcommand{\\CalO}{\\mathcal{O}}\n\\newcommand{\\CalD}{\\mathcal{D}}\n\\newcommand{\\CalU}{\\mathcal{U}}\n\\newcommand{\\CalF}{\\mathcal{F}}\n\\newcommand{\\CalT}{\\mathcal{T}}\n\n% Set\n\\newcommand{\\SetA}{\\mathbb{A}}\n\\newcommand{\\SetB}{\\mathbb{B}}\n\\newcommand{\\SetD}{\\mathbb{D}}\n\\newcommand{\\SetE}{\\mathbb{E}}\n\\newcommand{\\SetG}{\\mathbb{G}}\n\\newcommand{\\SetL}{\\mathbb{L}}\n\\newcommand{\\SetN}{\\mathbb{N}}\n\\newcommand{\\SetR}{\\mathbb{R}}\n\\newcommand{\\SetS}{\\mathbb{S}}\n\\newcommand{\\SetT}{\\mathbb{T}}\n\\newcommand{\\SetV}{\\mathbb{V}}\n\\newcommand{\\SetX}{\\mathbb{X}}\n\\newcommand{\\SetY}{\\mathbb{Y}}\n"
  },
  {
    "path": "natbib.bst",
    "content": "%% \r\n%% This is file `natbib.bst', generated \r\n%% on <1994/9/16> with the docstrip utility (2.2h).\r\n%% \r\n%% The original source files were:\r\n%% \r\n%% genbst.mbs  (with options: `ay,nat,seq-lab,nm-rev,dt-beg,yr-par,vol-bf,\r\n%%                             volp-com,etal-it')\r\n%% ---------------------------------------- \r\n%% *** Personal bib style, PWD *** \r\n%% \r\n%% (Here are the specifications of the source file)\r\n%% \\ProvidesFile{genbst.mbs}[1994/09/16 1.5 (PWD)]\r\n%%   For use with BibTeX version 0.99a or later\r\n%%     and with LaTeX 2.09 or 2e\r\n%%-------------------------------------------------------------------\r\n%% NOTICE:\r\n%% This file may be used for non-profit purposes.\r\n%% It may not be distributed in exchange for money,\r\n%%   other than distribution costs.\r\n%%\r\n%% The author provides it `as is' and does not guarantee it in any way.\r\n%%\r\n%% Copyright (C) 1994 Patrick W. Daly\r\n%% Max-Planck-Institut f\\\"ur Aeronomie\r\n%% Postfach 20\r\n%% D-37189 Katlenburg-Lindau\r\n%% Germany\r\n%%\r\n%% E-mail:\r\n%% SPAN--     nsp::linmpi::daly    (note nsp also known as ecd1)\r\n%% Internet-- daly@linmpi.dnet.gwdg.de\r\n%%-----------------------------------------------------------\r\n%% \\CharacterTable\r\n%%  {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\r\n%%   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\r\n%%   Digits        \\0\\1\\2\\3\\4\\5\\6\\7\\8\\9\r\n%%   Exclamation   \\!     Double quote  \\\"     Hash (number) \\#\r\n%%   Dollar        \\$     Percent       \\%     Ampersand     \\&\r\n%%   Acute accent  \\'     Left paren    \\(     Right paren   \\)\r\n%%   Asterisk      \\*     Plus          \\+     Comma         \\,\r\n%%   Minus         \\-     Point         \\.     Solidus       \\/\r\n%%   Colon         \\:     Semicolon     \\;     Less than     \\<\r\n%%   Equals        \\=     Greater than  \\>     Question mark \\?\r\n%%   Commercial at \\@     Left bracket  \\[     Backslash     \\\\\r\n%%   Right bracket \\]     Circumflex    \\^     Underscore    \\_\r\n%%   Grave accent  \\`     Left brace    \\{     Vertical bar  \\|\r\n%%   Right brace   \\}     Tilde         \\~}\r\n%%---------------------------------------------------------------------\r\n % This is an author-year citation style bibliography. As such, it is\r\n % non-standard LaTeX, and requires a special package file to function properly.\r\n % Such a package is    natbib.sty   by Patrick W. Daly\r\n % The form of the \\bibitem entries is\r\n %   \\bibitem[Jones et al.(1990)]{key}...\r\n %   \\bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...\r\n % The essential feature is that the label (the part in brackets) consists\r\n % of the author names, as they should appear in the citation, with the year\r\n % in parentheses following. There must be no space before the opening\r\n % parenthesis!\r\n % With natbib v5.3, a full list of authors may also follow the year.\r\n % In natbib.sty, it is possible to define the type of enclosures that is\r\n % really wanted (brackets or parentheses), but in either case, there must\r\n % be parentheses in the label.\r\n % The \\cite command functions as follows:\r\n %   \\cite{key} ==>>                Jones et al. (1990)\r\n %   \\cite[]{key} ==>>              (Jones et al., 1990)\r\n %   \\cite[chap. 2]{key} ==>>       (Jones et al., 1990, chap. 2)\r\n %   \\cite[e.g.][]{key} ==>>        (e.g. Jones et al., 1990)\r\n %   \\cite[e.g.][p. 32]{key} ==>>   (e.g. Jones et al., p. 32)\r\n %   \\citeauthor{key}               Jones et al.\r\n %   \\citefullauthor{key}           Jones, Baker, and Smith\r\n %   \\citeyear{key}                 1990\r\n%%---------------------------------------------------------------------\r\n\r\nENTRY\r\n  { address\r\n    author\r\n    booktitle\r\n    chapter\r\n    edition\r\n    editor\r\n    howpublished\r\n    institution\r\n    journal\r\n    key\r\n    month\r\n    note\r\n    number\r\n    organization\r\n    pages\r\n    publisher\r\n    school\r\n    series\r\n    title\r\n    type\r\n    volume\r\n    year\r\n  }\r\n  {}\r\n  { label extra.label sort.label }\r\n\r\nINTEGERS { output.state before.all mid.sentence after.sentence after.block }\r\n\r\nFUNCTION {init.state.consts}\r\n{ #0 'before.all :=\r\n  #1 'mid.sentence :=\r\n  #2 'after.sentence :=\r\n  #3 'after.block :=\r\n}\r\n\r\nSTRINGS { s t }\r\n\r\nFUNCTION {output.nonnull}\r\n{ 's :=\r\n  output.state mid.sentence =\r\n    { \", \" * write$ }\r\n    { output.state after.block =\r\n        { add.period$ write$\r\n          newline$\r\n          \"\\newblock \" write$\r\n        }\r\n        { output.state before.all =\r\n            'write$\r\n            { add.period$ \" \" * write$ }\r\n          if$\r\n        }\r\n      if$\r\n      mid.sentence 'output.state :=\r\n    }\r\n  if$\r\n  s\r\n}\r\n\r\nFUNCTION {output}\r\n{ duplicate$ empty$\r\n    'pop$\r\n    'output.nonnull\r\n  if$\r\n}\r\n\r\nFUNCTION {output.check}\r\n{ 't :=\r\n  duplicate$ empty$\r\n    { pop$ \"empty \" t * \" in \" * cite$ * warning$ }\r\n    'output.nonnull\r\n  if$\r\n}\r\n\r\nFUNCTION {fin.entry}\r\n{ add.period$\r\n  write$\r\n  newline$\r\n}\r\n\r\nFUNCTION {new.block}\r\n{ output.state before.all =\r\n    'skip$\r\n    { after.block 'output.state := }\r\n  if$\r\n}\r\n\r\nFUNCTION {new.sentence}\r\n{ output.state after.block =\r\n    'skip$\r\n    { output.state before.all =\r\n        'skip$\r\n        { after.sentence 'output.state := }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {not}\r\n{   { #0 }\r\n    { #1 }\r\n  if$\r\n}\r\n\r\nFUNCTION {and}\r\n{   'skip$\r\n    { pop$ #0 }\r\n  if$\r\n}\r\n\r\nFUNCTION {or}\r\n{   { pop$ #1 }\r\n    'skip$\r\n  if$\r\n}\r\n\r\nFUNCTION {non.stop}\r\n{ duplicate$\r\n   \"}\" * add.period$\r\n   #-1 #1 substring$ \".\" =\r\n}\r\n\r\nFUNCTION {new.block.checkb}\r\n{ empty$\r\n  swap$ empty$\r\n  and\r\n    'skip$\r\n    'new.block\r\n  if$\r\n}\r\n\r\nFUNCTION {field.or.null}\r\n{ duplicate$ empty$\r\n    { pop$ \"\" }\r\n    'skip$\r\n  if$\r\n}\r\n\r\nFUNCTION {emphasize}\r\n{ duplicate$ empty$\r\n    { pop$ \"\" }\r\n    { \"{\\em \" swap$ * non.stop\r\n        { \"\\/}\" * }\r\n        { \"}\" * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {bolden}\r\n{ duplicate$ empty$\r\n    { pop$ \"\" }\r\n    { \"{\\bf \" swap$ * \"}\" * }\r\n  if$\r\n}\r\n\r\nINTEGERS { nameptr namesleft numnames }\r\n\r\nFUNCTION {format.names}\r\n{ 's :=\r\n  #1 'nameptr :=\r\n  s num.names$ 'numnames :=\r\n  numnames 'namesleft :=\r\n    { namesleft #0 > }\r\n    { s nameptr\r\n      \"{vv~}{ll}{, jj}{, f.}\" format.name$ 't :=\r\n      nameptr #1 >\r\n        {\r\n          namesleft #1 >\r\n            { \", \" * t * }\r\n            {\r\n              numnames #2 >\r\n                { \",\" * }\r\n                'skip$\r\n              if$\r\n              t \"others\" =\r\n                { \" \" * \"et~al.\" emphasize * }\r\n                { \" and \" * t * }\r\n              if$\r\n            }\r\n          if$\r\n        }\r\n        't\r\n      if$\r\n      nameptr #1 + 'nameptr :=\r\n      namesleft #1 - 'namesleft :=\r\n    }\r\n  while$\r\n}\r\n\r\nFUNCTION {format.names.ed}\r\n{ 's :=\r\n  #1 'nameptr :=\r\n  s num.names$ 'numnames :=\r\n  numnames 'namesleft :=\r\n    { namesleft #0 > }\r\n    { s nameptr\r\n      \"{f.~}{vv~}{ll}{, jj}\"\r\n      format.name$ 't :=\r\n      nameptr #1 >\r\n        {\r\n          namesleft #1 >\r\n            { \", \" * t * }\r\n            {\r\n              numnames #2 >\r\n                { \",\" * }\r\n                'skip$\r\n              if$\r\n              t \"others\" =\r\n                { \" \" * \"et~al.\" emphasize * }\r\n                { \" and \" * t * }\r\n              if$\r\n            }\r\n          if$\r\n        }\r\n        't\r\n      if$\r\n      nameptr #1 + 'nameptr :=\r\n      namesleft #1 - 'namesleft :=\r\n    }\r\n  while$\r\n}\r\n\r\nFUNCTION {format.key}\r\n{ empty$\r\n    { key field.or.null }\r\n    { \"\" }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.authors}\r\n{ author empty$\r\n    { \"\" }\r\n    { author format.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.editors}\r\n{ editor empty$\r\n    { \"\" }\r\n    { editor format.names\r\n      editor num.names$ #1 >\r\n        { \", editors\" * }\r\n        { \", editor\" * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.in.editors}\r\n{ editor empty$\r\n    { \"\" }\r\n    { editor format.names.ed\r\n      editor num.names$ #1 >\r\n        { \", editors\" * }\r\n        { \", editor\" * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.title}\r\n{ title empty$\r\n    { \"\" }\r\n    { title \"t\" change.case$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.full.names}\r\n{'s :=\r\n  #1 'nameptr :=\r\n  s num.names$ 'numnames :=\r\n  numnames 'namesleft :=\r\n    { namesleft #0 > }\r\n    { s nameptr\r\n      \"{vv~}{ll}\" format.name$ 't :=\r\n      nameptr #1 >\r\n        {\r\n          namesleft #1 >\r\n            { \", \" * t * }\r\n            {\r\n              numnames #2 >\r\n                { \",\" * }\r\n                'skip$\r\n              if$\r\n              t \"others\" =\r\n                { \" \" * \"et~al.\" emphasize * }\r\n                { \" and \" * t * }\r\n              if$\r\n            }\r\n          if$\r\n        }\r\n        't\r\n      if$\r\n      nameptr #1 + 'nameptr :=\r\n      namesleft #1 - 'namesleft :=\r\n    }\r\n  while$\r\n}\r\n\r\nFUNCTION {author.editor.key.full}\r\n{ author empty$\r\n    { editor empty$\r\n        { key empty$\r\n            { cite$ #1 #3 substring$ }\r\n            'key\r\n          if$\r\n        }\r\n        { editor format.full.names }\r\n      if$\r\n    }\r\n    { author format.full.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {author.key.full}\r\n{ author empty$\r\n    { key empty$\r\n         { cite$ #1 #3 substring$ }\r\n          'key\r\n      if$\r\n    }\r\n    { author format.full.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {editor.key.full}\r\n{ editor empty$\r\n    { key empty$\r\n         { cite$ #1 #3 substring$ }\r\n          'key\r\n      if$\r\n    }\r\n    { editor format.full.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {make.full.names}\r\n{ type$ \"book\" =\r\n  type$ \"inbook\" =\r\n  or\r\n    'author.editor.key.full\r\n    { type$ \"proceedings\" =\r\n        'editor.key.full\r\n        'author.key.full\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {output.bibitem}\r\n{ newline$\r\n  \"\\bibitem[\" write$\r\n  label write$\r\n  \")\" make.full.names * \"]{\" * write$\r\n  cite$ write$\r\n  \"}\" write$\r\n  newline$\r\n  \"\"\r\n  before.all 'output.state :=\r\n}\r\n\r\nFUNCTION {n.dashify}\r\n{ 't :=\r\n  \"\"\r\n    { t empty$ not }\r\n    { t #1 #1 substring$ \"-\" =\r\n        { t #1 #2 substring$ \"--\" = not\r\n            { \"--\" *\r\n              t #2 global.max$ substring$ 't :=\r\n            }\r\n            {   { t #1 #1 substring$ \"-\" = }\r\n                { \"-\" *\r\n                  t #2 global.max$ substring$ 't :=\r\n                }\r\n              while$\r\n            }\r\n          if$\r\n        }\r\n        { t #1 #1 substring$ *\r\n          t #2 global.max$ substring$ 't :=\r\n        }\r\n      if$\r\n    }\r\n  while$\r\n}\r\n\r\nFUNCTION {word.in}\r\n{ \"In \" }\r\n\r\nFUNCTION {format.date}\r\n{ year duplicate$ empty$\r\n    { \"empty year in \" cite$ * \"; set to ????\" * warning$\r\n       pop$ \"????\" }\r\n    'skip$\r\n  if$\r\n  before.all 'output.state :=\r\n  \" (\" swap$ * extra.label * \")\" *\r\n}\r\n\r\nFUNCTION {format.btitle}\r\n{ title emphasize\r\n}\r\n\r\nFUNCTION {tie.or.space.connect}\r\n{ duplicate$ text.length$ #3 <\r\n    { \"~\" }\r\n    { \" \" }\r\n  if$\r\n  swap$ * *\r\n}\r\n\r\nFUNCTION {either.or.check}\r\n{ empty$\r\n    'pop$\r\n    { \"can't use both \" swap$ * \" fields in \" * cite$ * warning$ }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.bvolume}\r\n{ volume empty$\r\n    { \"\" }\r\n    { \"volume\" volume tie.or.space.connect\r\n      series empty$\r\n        'skip$\r\n        { \" of \" * series emphasize * }\r\n      if$\r\n      \"volume and number\" number either.or.check\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.number.series}\r\n{ volume empty$\r\n    { number empty$\r\n        { series field.or.null }\r\n        { output.state mid.sentence =\r\n            { \"number\" }\r\n            { \"Number\" }\r\n          if$\r\n          number tie.or.space.connect\r\n          series empty$\r\n            { \"there's a number but no series in \" cite$ * warning$ }\r\n            { \" in \" * series * }\r\n          if$\r\n        }\r\n      if$\r\n    }\r\n    { \"\" }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.edition}\r\n{ edition empty$\r\n    { \"\" }\r\n    { output.state mid.sentence =\r\n        { edition \"l\" change.case$ \" edition\" * }\r\n        { edition \"t\" change.case$ \" edition\" * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nINTEGERS { multiresult }\r\n\r\nFUNCTION {multi.page.check}\r\n{ 't :=\r\n  #0 'multiresult :=\r\n    { multiresult not\r\n      t empty$ not\r\n      and\r\n    }\r\n    { t #1 #1 substring$\r\n      duplicate$ \"-\" =\r\n      swap$ duplicate$ \",\" =\r\n      swap$ \"+\" =\r\n      or or\r\n        { #1 'multiresult := }\r\n        { t #2 global.max$ substring$ 't := }\r\n      if$\r\n    }\r\n  while$\r\n  multiresult\r\n}\r\n\r\nFUNCTION {format.pages}\r\n{ pages empty$\r\n    { \"\" }\r\n    { pages multi.page.check\r\n        { \"pages\" pages n.dashify tie.or.space.connect }\r\n        { \"page\" pages tie.or.space.connect }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.vol.num.pages}\r\n{ volume field.or.null\r\n  bolden\r\n  number empty$\r\n    'skip$\r\n    { \"(\" number * \")\" * *\r\n      volume empty$\r\n        { \"there's a number but no volume in \" cite$ * warning$ }\r\n        'skip$\r\n      if$\r\n    }\r\n  if$\r\n  pages empty$\r\n    'skip$\r\n    { duplicate$ empty$\r\n        { pop$ format.pages }\r\n        { \", \" * pages n.dashify * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.chapter.pages}\r\n{ chapter empty$\r\n    'format.pages\r\n    { type empty$\r\n        { \"chapter\" }\r\n        { type \"l\" change.case$ }\r\n      if$\r\n      chapter tie.or.space.connect\r\n      pages empty$\r\n        'skip$\r\n        { \", \" * format.pages * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.in.ed.booktitle}\r\n{ booktitle empty$\r\n    { \"\" }\r\n    { editor empty$\r\n        { word.in booktitle emphasize * }\r\n        { word.in format.in.editors * \", \" * booktitle emphasize * }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.thesis.type}\r\n{ type empty$\r\n    'skip$\r\n    { pop$\r\n      type \"t\" change.case$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.tr.number}\r\n{ type empty$\r\n    { \"Technical Report\" }\r\n    'type\r\n  if$\r\n  number empty$\r\n    { \"t\" change.case$ }\r\n    { number tie.or.space.connect }\r\n  if$\r\n}\r\n\r\nFUNCTION {format.article.crossref}\r\n{\r\n  word.in\r\n  \"\\cite{\" * crossref * \"}\" *\r\n}\r\n\r\nFUNCTION {format.book.crossref}\r\n{ volume empty$\r\n    { \"empty volume in \" cite$ * \"'s crossref of \" * crossref * warning$\r\n      word.in\r\n    }\r\n    { \"Volume\" volume tie.or.space.connect\r\n      \" of \" *\r\n    }\r\n  if$\r\n  \"\\cite{\" * crossref * \"}\" *\r\n}\r\n\r\nFUNCTION {format.incoll.inproc.crossref}\r\n{\r\n  word.in\r\n  \"\\cite{\" * crossref * \"}\" *\r\n}\r\n\r\nFUNCTION {article}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title \"title\" output.check\r\n  new.block\r\n  crossref missing$\r\n    { journal emphasize \"journal\" output.check\r\n      format.vol.num.pages output\r\n    }\r\n    { format.article.crossref output.nonnull\r\n      format.pages output\r\n    }\r\n  if$\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {book}\r\n{ output.bibitem\r\n  author empty$\r\n    { format.editors \"author and editor\" output.check\r\n      editor format.key output\r\n    }\r\n    { format.authors output.nonnull\r\n      crossref missing$\r\n        { \"author and editor\" editor either.or.check }\r\n        'skip$\r\n      if$\r\n    }\r\n  if$\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.btitle \"title\" output.check\r\n  crossref missing$\r\n    { format.bvolume output\r\n      new.block\r\n      format.number.series output\r\n      new.sentence\r\n      publisher \"publisher\" output.check\r\n      address output\r\n    }\r\n    {\r\n      new.block\r\n      format.book.crossref output.nonnull\r\n    }\r\n  if$\r\n  format.edition output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {booklet}\r\n{ output.bibitem\r\n  format.authors output\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title \"title\" output.check\r\n  new.block\r\n  howpublished output\r\n  address output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {inbook}\r\n{ output.bibitem\r\n  author empty$\r\n    { format.editors \"author and editor\" output.check\r\n      editor format.key output\r\n    }\r\n    { format.authors output.nonnull\r\n      crossref missing$\r\n        { \"author and editor\" editor either.or.check }\r\n        'skip$\r\n      if$\r\n    }\r\n  if$\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.btitle \"title\" output.check\r\n  crossref missing$\r\n    { format.bvolume output\r\n      format.chapter.pages \"chapter and pages\" output.check\r\n      new.block\r\n      format.number.series output\r\n      new.sentence\r\n      publisher \"publisher\" output.check\r\n      address output\r\n    }\r\n    { format.chapter.pages \"chapter and pages\" output.check\r\n      new.block\r\n      format.book.crossref output.nonnull\r\n    }\r\n  if$\r\n  format.edition output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {incollection}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title \"title\" output.check\r\n  new.block\r\n  crossref missing$\r\n    { format.in.ed.booktitle \"booktitle\" output.check\r\n      format.bvolume output\r\n      format.number.series output\r\n      format.chapter.pages output\r\n      new.sentence\r\n      publisher \"publisher\" output.check\r\n      address output\r\n      format.edition output\r\n    }\r\n    { format.incoll.inproc.crossref output.nonnull\r\n      format.chapter.pages output\r\n    }\r\n  if$\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {inproceedings}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title \"title\" output.check\r\n  new.block\r\n  crossref missing$\r\n    { format.in.ed.booktitle \"booktitle\" output.check\r\n      format.bvolume output\r\n      format.number.series output\r\n      format.pages output\r\n      address output\r\n      new.sentence\r\n      organization output\r\n      publisher output\r\n    }\r\n    { format.incoll.inproc.crossref output.nonnull\r\n      format.pages output\r\n    }\r\n  if$\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {conference} { inproceedings }\r\n\r\nFUNCTION {manual}\r\n{ output.bibitem\r\n  format.authors output\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.btitle \"title\" output.check\r\n  organization address new.block.checkb\r\n  organization output\r\n  address output\r\n  format.edition output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {mastersthesis}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.btitle \"title\" output.check\r\n  new.block\r\n  \"Master's thesis\" format.thesis.type output.nonnull\r\n  school \"school\" output.check\r\n  address output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {misc}\r\n{ output.bibitem\r\n  format.authors output\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title output\r\n  new.block\r\n  howpublished output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {phdthesis}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.btitle \"title\" output.check\r\n  new.block\r\n  \"Ph.D. thesis\" format.thesis.type output.nonnull\r\n  school \"school\" output.check\r\n  address output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {proceedings}\r\n{ output.bibitem\r\n  format.editors output\r\n  editor format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.btitle \"title\" output.check\r\n  format.bvolume output\r\n  format.number.series output\r\n  address output\r\n  new.sentence\r\n  organization output\r\n  publisher output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {techreport}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title \"title\" output.check\r\n  new.block\r\n  format.tr.number output.nonnull\r\n  institution \"institution\" output.check\r\n  address output\r\n  new.block\r\n  note output\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {unpublished}\r\n{ output.bibitem\r\n  format.authors \"author\" output.check\r\n  author format.key output\r\n  format.date \"year\" output.check\r\n  new.block\r\n  format.title \"title\" output.check\r\n  new.block\r\n  note \"note\" output.check\r\n  fin.entry\r\n}\r\n\r\nFUNCTION {default.type} { misc }\r\n\r\nMACRO {jan} {\"January\"}\r\n\r\nMACRO {feb} {\"February\"}\r\n\r\nMACRO {mar} {\"March\"}\r\n\r\nMACRO {apr} {\"April\"}\r\n\r\nMACRO {may} {\"May\"}\r\n\r\nMACRO {jun} {\"June\"}\r\n\r\nMACRO {jul} {\"July\"}\r\n\r\nMACRO {aug} {\"August\"}\r\n\r\nMACRO {sep} {\"September\"}\r\n\r\nMACRO {oct} {\"October\"}\r\n\r\nMACRO {nov} {\"November\"}\r\n\r\nMACRO {dec} {\"December\"}\r\n\r\nMACRO {acmcs} {\"ACM Computing Surveys\"}\r\n\r\nMACRO {acta} {\"Acta Informatica\"}\r\n\r\nMACRO {cacm} {\"Communications of the ACM\"}\r\n\r\nMACRO {ibmjrd} {\"IBM Journal of Research and Development\"}\r\n\r\nMACRO {ibmsj} {\"IBM Systems Journal\"}\r\n\r\nMACRO {ieeese} {\"IEEE Transactions on Software Engineering\"}\r\n\r\nMACRO {ieeetc} {\"IEEE Transactions on Computers\"}\r\n\r\nMACRO {ieeetcad}\r\n {\"IEEE Transactions on Computer-Aided Design of Integrated Circuits\"}\r\n\r\nMACRO {ipl} {\"Information Processing Letters\"}\r\n\r\nMACRO {jacm} {\"Journal of the ACM\"}\r\n\r\nMACRO {jcss} {\"Journal of Computer and System Sciences\"}\r\n\r\nMACRO {scp} {\"Science of Computer Programming\"}\r\n\r\nMACRO {sicomp} {\"SIAM Journal on Computing\"}\r\n\r\nMACRO {tocs} {\"ACM Transactions on Computer Systems\"}\r\n\r\nMACRO {tods} {\"ACM Transactions on Database Systems\"}\r\n\r\nMACRO {tog} {\"ACM Transactions on Graphics\"}\r\n\r\nMACRO {toms} {\"ACM Transactions on Mathematical Software\"}\r\n\r\nMACRO {toois} {\"ACM Transactions on Office Information Systems\"}\r\n\r\nMACRO {toplas} {\"ACM Transactions on Programming Languages and Systems\"}\r\n\r\nMACRO {tcs} {\"Theoretical Computer Science\"}\r\n\r\nREAD\r\n\r\nFUNCTION {sortify}\r\n{ purify$\r\n  \"l\" change.case$\r\n}\r\n\r\nINTEGERS { len }\r\n\r\nFUNCTION {chop.word}\r\n{ 's :=\r\n  'len :=\r\n  s #1 len substring$ =\r\n    { s len #1 + global.max$ substring$ }\r\n    's\r\n  if$\r\n}\r\n\r\nFUNCTION {format.lab.names}\r\n{ 's :=\r\n  s #1 \"{vv~}{ll}\" format.name$\r\n  s num.names$ duplicate$\r\n  #2 >\r\n    { pop$ \" \" * \"et~al.\" emphasize * }\r\n    { #2 <\r\n        'skip$\r\n        { s #2 \"{ff }{vv }{ll}{ jj}\" format.name$ \"others\" =\r\n            { \" \" * \"et~al.\" emphasize * }\r\n            { \" and \" * s #2 \"{vv~}{ll}\" format.name$ * }\r\n          if$\r\n        }\r\n      if$\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {author.key.label}\r\n{ author empty$\r\n    { key empty$\r\n        { cite$ #1 #3 substring$ }\r\n        'key\r\n      if$\r\n    }\r\n    { author format.lab.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {author.editor.key.label}\r\n{ author empty$\r\n    { editor empty$\r\n        { key empty$\r\n            { cite$ #1 #3 substring$ }\r\n            'key\r\n          if$\r\n        }\r\n        { editor format.lab.names }\r\n      if$\r\n    }\r\n    { author format.lab.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {editor.key.label}\r\n{ editor empty$\r\n    { key empty$\r\n        { cite$ #1 #3 substring$ }\r\n        'key\r\n      if$\r\n    }\r\n    { editor format.lab.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {calc.label}\r\n{ type$ \"book\" =\r\n  type$ \"inbook\" =\r\n  or\r\n    'author.editor.key.label\r\n    { type$ \"proceedings\" =\r\n        'editor.key.label\r\n        'author.key.label\r\n      if$\r\n    }\r\n  if$\r\n  \"(\"\r\n  *\r\n  year duplicate$ empty$\r\n     { pop$ \"????\" }\r\n     { purify$ #-1 #4 substring$ }\r\n  if$\r\n  *\r\n  'label :=\r\n}\r\n\r\nFUNCTION {sort.format.names}\r\n{ 's :=\r\n  #1 'nameptr :=\r\n  \"\"\r\n  s num.names$ 'numnames :=\r\n  numnames 'namesleft :=\r\n    { namesleft #0 > }\r\n    { nameptr #1 >\r\n        { \"   \" * }\r\n        'skip$\r\n      if$\r\n      s nameptr\r\n      \"{vv{ } }{ll{ }}{  f{ }}{  jj{ }}\"\r\n      format.name$ 't :=\r\n      nameptr numnames = t \"others\" = and\r\n        { \"et al\" * }\r\n        { numnames #2 > nameptr #2 = and\r\n          { \"zzzzzz\" * #1 'namesleft := }\r\n          { t sortify * }\r\n        if$\r\n        }\r\n      if$\r\n      nameptr #1 + 'nameptr :=\r\n      namesleft #1 - 'namesleft :=\r\n    }\r\n  while$\r\n}\r\n\r\nFUNCTION {sort.format.title}\r\n{ 't :=\r\n  \"A \" #2\r\n    \"An \" #3\r\n      \"The \" #4 t chop.word\r\n    chop.word\r\n  chop.word\r\n  sortify\r\n  #1 global.max$ substring$\r\n}\r\n\r\nFUNCTION {author.sort}\r\n{ author empty$\r\n    { key empty$\r\n        { \"to sort, need author or key in \" cite$ * warning$\r\n          \"\"\r\n        }\r\n        { key sortify }\r\n      if$\r\n    }\r\n    { author sort.format.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {author.editor.sort}\r\n{ author empty$\r\n    { editor empty$\r\n        { key empty$\r\n            { \"to sort, need author, editor, or key in \" cite$ * warning$\r\n              \"\"\r\n            }\r\n            { key sortify }\r\n          if$\r\n        }\r\n        { editor sort.format.names }\r\n      if$\r\n    }\r\n    { author sort.format.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {editor.sort}\r\n{ editor empty$\r\n    { key empty$\r\n        { \"to sort, need editor or key in \" cite$ * warning$\r\n          \"\"\r\n        }\r\n        { key sortify }\r\n      if$\r\n    }\r\n    { editor sort.format.names }\r\n  if$\r\n}\r\n\r\nFUNCTION {presort}\r\n{ calc.label\r\n  label sortify\r\n  \"    \"\r\n  *\r\n  type$ \"book\" =\r\n  type$ \"inbook\" =\r\n  or\r\n    'author.editor.sort\r\n    { type$ \"proceedings\" =\r\n        'editor.sort\r\n        'author.sort\r\n      if$\r\n    }\r\n  if$\r\n  #1 entry.max$ substring$\r\n  'sort.label :=\r\n  sort.label\r\n  *\r\n  \"    \"\r\n  *\r\n  title field.or.null\r\n  sort.format.title\r\n  *\r\n  #1 entry.max$ substring$\r\n  'sort.key$ :=\r\n}\r\n\r\nITERATE {presort}\r\n\r\nSORT\r\n\r\nSTRINGS { last.label next.extra }\r\n\r\nINTEGERS { last.extra.num }\r\n\r\nFUNCTION {initialize.extra.label.stuff}\r\n{ #0 int.to.chr$ 'last.label :=\r\n  \"\" 'next.extra :=\r\n  #0 'last.extra.num :=\r\n}\r\n\r\nFUNCTION {forward.pass}\r\n{ last.label label =\r\n    { last.extra.num #1 + 'last.extra.num :=\r\n      last.extra.num int.to.chr$ 'extra.label :=\r\n    }\r\n    { \"a\" chr.to.int$ 'last.extra.num :=\r\n      \"\" 'extra.label :=\r\n      label 'last.label :=\r\n    }\r\n  if$\r\n}\r\n\r\nFUNCTION {reverse.pass}\r\n{ next.extra \"b\" =\r\n    { \"a\" 'extra.label := }\r\n    'skip$\r\n  if$\r\n  extra.label 'next.extra :=\r\n  label extra.label * 'label :=\r\n}\r\n\r\nEXECUTE {initialize.extra.label.stuff}\r\n\r\nITERATE {forward.pass}\r\n\r\nREVERSE {reverse.pass}\r\n\r\nFUNCTION {bib.sort.order}\r\n{ sort.label\r\n  \"    \"\r\n  *\r\n  year field.or.null sortify\r\n  *\r\n  \"    \"\r\n  *\r\n  title field.or.null\r\n  sort.format.title\r\n  *\r\n  #1 entry.max$ substring$\r\n  'sort.key$ :=\r\n}\r\n\r\nITERATE {bib.sort.order}\r\n\r\nSORT\r\n\r\nFUNCTION {begin.bib}\r\n{ preamble$ empty$\r\n    'skip$\r\n    { preamble$ write$ newline$ }\r\n  if$\r\n  \"\\begin{thebibliography}{}\" write$ newline$\r\n}\r\n\r\nEXECUTE {begin.bib}\r\n\r\nEXECUTE {init.state.consts}\r\n\r\nITERATE {call.type$}\r\n\r\nFUNCTION {end.bib}\r\n{ newline$\r\n  \"\\end{thebibliography}\" write$ newline$\r\n}\r\n\r\nEXECUTE {end.bib}\r\n%% End of customized bst file \r\n\r\n"
  },
  {
    "path": "notation.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n%TODO\n\\chapter*{数学符号}\n\\label{notation}\n\n\\addcontentsline{toc}{chapter}{数学符号}\n\n\n本节简要介绍本书所使用的数学符号。 \n我们在\\chapref{chap:linear_algebra}至\\chapref{chap:numerical_computation}中描述大多数数学概念，如果你不熟悉任何相应的数学概念，可以参考对应的章节。\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 数和数组}\n\\bgroup\n% The \\arraystretch definition here increases the space between rows in the table,\n% so that \\displaystyle math has more vertical space.\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle a$ & 标量 (整数或实数) \\\\\n$\\displaystyle \\Va$ & 向量 \\\\\n$\\displaystyle \\MA$ & 矩阵 \\\\\n$\\displaystyle \\TSA$ & 张量 \\\\\n$\\displaystyle \\MI_n$ & $n$行$n$列的\\gls{identity_matrix} \\\\\n    $\\displaystyle \\MI$ &  维度蕴含于上下文的\\gls{identity_matrix} \\\\\n$\\displaystyle \\Ve^{(i)}$ & 标准基向量$[0,\\dots,0,1,0,\\dots,0]$，其中索引$i$处值为1 \\\\ \n$\\displaystyle \\text{diag}(\\Va)$ & 对角方阵，其中对角元素由$\\Va$给定 \\\\\n$\\displaystyle \\RSa$ & 标量随机变量 \\\\\n$\\displaystyle \\RVa$ & 向量随机变量 \\\\\n$\\displaystyle \\RMA$ & 矩阵随机变量 \\\\\n\\end{tabular}\n\\egroup\n\\end{minipage}\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 集合和图}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle \\SetA$ & 集合 \\\\\n$\\displaystyle \\SetR$ & 实数集 \\\\\n$\\displaystyle \\{0, 1\\}$ & 包含0和1的集合 \\\\\n$\\displaystyle \\{0, 1, \\dots, n \\}$ & 包含$0$和$n$之间所有整数的集合 \\\\\n$\\displaystyle [a, b]$ & 包含$a$和$b$的实数区间 \\\\\n$\\displaystyle (a, b]$ & 不包含$a$但包含$b$的实数区间 \\\\\n$\\displaystyle \\SetA \\backslash \\SetB$ & 差集，即其元素包含于$\\SetA$但不包含于$\\SetB$\\\\\n$\\displaystyle \\CalG$ & 图 \\\\\n$\\displaystyle Pa_\\CalG(\\RSx_i)$ & 图$\\CalG$中$\\RSx_i$的父节点\n\\end{tabular}\n\\egroup\n\\end{minipage}\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 索引}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle a_i$ & 向量$\\Va$的第$i$个元素，其中索引从1开始  \\\\\n$\\displaystyle a_{-i}$ & 除了第$i$个元素，$\\Va$的所有元素 \\\\\n$\\displaystyle A_{i,j}$ & 矩阵$\\MA$的$i,j$元素 \\\\\n$\\displaystyle \\MA_{i, :}$ & 矩阵$\\MA$的第$i$行 \\\\\n$\\displaystyle \\MA_{:, i}$ & 矩阵$\\MA$的第$i$列 \\\\\n$\\displaystyle \\TEA_{i, j, k}$ & 3维张量$\\TSA$的$(i, j, k)$元素   \\\\\n$\\displaystyle \\TSA_{:, :, i}$ & 3维张量的2维切片 \\\\\n$\\displaystyle \\RSa_i$ & 随机向量$\\RVa$的第$i$个元素 \\\\\n\\end{tabular} \n\\egroup\n\\end{minipage}\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 线性代数中的操作}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle \\MA^\\top$ & 矩阵$\\MA$的转置 \\\\\n$\\displaystyle \\MA^+$ & $\\MA$的\\gls{Moore} \\\\\n    $\\displaystyle \\MA \\odot \\MB $ &  $\\MA$和$\\MB$的逐元素乘积（\\gls{hadamard_product}） \\\\\n$\\displaystyle \\mathrm{det}(\\MA)$ & $\\MA$的行列式 \\\\\n\\end{tabular} \n\\egroup\n\\end{minipage}\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 微积分}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle\\frac{d y} {d x}$ &  $y$关于$x$的导数 \\\\\n$\\displaystyle \\frac{\\partial y} {\\partial x} $ &  $y$关于$x$的偏导 \\\\\n$\\displaystyle \\nabla_{\\Vx} y $ & $y$关于$\\Vx$的梯度 \\\\\n$\\displaystyle \\nabla_{\\MX} y $ & $y$关于$\\MX$的矩阵导数 \\\\\n$\\displaystyle \\nabla_{\\TSX} y $ &  $y$关于$\\TSX$求导后的张量 \\\\\n$\\displaystyle \\frac{\\partial f}{\\partial \\Vx} $ &$f: \\SetR^n \\rightarrow \\SetR^m$的\\gls{jacobian}矩阵$\\MJ \\in \\SetR^{m\\times n}$   \\\\\n$\\displaystyle \\nabla_{\\Vx}^2 f(\\Vx)\\text{ or }\\MH( f)(\\Vx)$ &  $f$在点$\\Vx$处的\\gls{hessian}矩阵 \\\\\n$\\displaystyle \\int f(\\Vx) d\\Vx $ & $\\Vx$整个域上的定积分 \\\\\n$\\displaystyle \\int_\\SetS f(\\Vx) d\\Vx$ & 集合$\\SetS$上关于$\\Vx$的定积分 \\\\\n\\end{tabular}\n\\egroup\n\\end{minipage}\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 概率和信息论}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle \\RSa \\bot \\RSb$ &  $\\RSa$和$\\RSb$相互独立的随机变量 \\\\\n$\\displaystyle \\RSa \\bot \\RSb \\mid \\RSc $ &  给定$\\RSc$后条件独立 \\\\\n$\\displaystyle P(\\RSa)$ & 离散变量上的概率分布 \\\\\n$\\displaystyle p(\\RSa)$ & 连续变量（或变量类型未指定时）上的概率分布  \\\\\n$\\displaystyle \\RSa \\sim P$ &  具有分布$P$的随机变量$\\RSa$\\\\\n$\\displaystyle  \\SetE_{\\RSx\\sim P} [ f(x) ]\\text{ or } \\SetE f(x)$ & $f(x)$关于$P(\\RSx)$的期望 \\\\\n$\\displaystyle \\Var(f(x)) $ &  $f(x)$在分布$P(\\RSx)$下的方差 \\\\\n$\\displaystyle \\Cov(f(x),g(x)) $ &  $f(x)$和$g(x)$在分布$P(\\RSx)$下的协方差 \\\\\n$\\displaystyle H(\\RSx) $ & 随机变量$\\RSx$的\\gls{Shannon_entropy} \\\\\n$\\displaystyle D_{\\text{KL}} ( P \\Vert Q ) $ & P和Q的\\gls{KL_divergence} \\\\\n$\\displaystyle \\mathcal{N} ( \\Vx ; \\Vmu , \\VSigma)$ & 均值为$\\Vmu$协方差为$\\VSigma$，$\\Vx$上的\\gls{gaussian_distribution} \\\\\n\\end{tabular}\n\\egroup\n\\end{minipage}\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 函数}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle f: \\SetA \\rightarrow \\SetB$ & 定义域为$\\SetA$值域为$\\SetB$的函数$f$ \\\\\n$\\displaystyle f \\circ g $ &  $f$和$g$的组合 \\\\\n$\\displaystyle f(\\Vx ; \\Vtheta) $ &  由$\\Vtheta$参数化，关于$\\Vx$的函数（有时为简化表示，我们忽略$\\Vtheta$记为$f(\\Vx)$ ）\\\\\n$\\displaystyle \\log x$ & $x$的自然对数 \\\\\n$\\displaystyle \\sigma(x)$ & Logistic sigmoid, $\\displaystyle \\frac{1} {1 + \\exp(-x)}$ \\\\\n$\\displaystyle \\zeta(x)$ & Softplus, $\\log(1 + \\exp(x))$ \\\\\n$\\displaystyle || \\Vx ||_p $ & $\\Vx$的$L^p$范数 \\\\\n$\\displaystyle || \\Vx || $ &  $\\Vx$的$L^2$范数 \\\\\n$\\displaystyle x^+$ & $x$的正数部分, 即$\\max(0,x)$\\\\\n$\\displaystyle \\textbf{1}_\\mathrm{condition}$ & 如果条件为真则为1，否则为0\\\\ \n\\end{tabular}\n\\egroup\n\\end{minipage}\n\n有时候我们使用函数$f$，它的参数是一个标量，但应用到一个向量、矩阵或张量： $f(\\Vx)$, $f(\\MX)$, or $f(\\TSX)$ 。\n这表示逐元素地将$f$应用于数组。\n例如，$\\TSC = \\sigma(\\TSX)$，则对于所有合法的$i$、$j$和$k$， $\\TEC_{i,j,k} = \\sigma(\\TEX_{i,j,k})$。\n\n\n\\vspace{\\notationgap}\n\\begin{minipage}{\\textwidth}\n\\centerline{\\bf 数据集和分布}\n\\bgroup\n\\def\\arraystretch{1.5}\n\\begin{tabular}{cp{3.25in}}\n$\\displaystyle p_{\\text{data}}$ & 数据生成分布 \\\\\n$\\displaystyle \\hat{p}_{\\text{train}}$ & 由训练集定义的经验分布 \\\\\n$\\displaystyle \\SetX$ & 训练样本的集合 \\\\\n$\\displaystyle \\Vx^{(i)}$ & 数据集的第$i$个样本（输入）\\\\\n$\\displaystyle y^{(i)}\\text{ or }\\Vy^{(i)}$ & \\gls{supervised_learning}中与$\\Vx^{(i)}$关联的目标 \\\\\n$\\displaystyle \\MX$ & $m \\times n$ 的矩阵，其中行$\\MX_{i,:}$为输入样本$\\Vx^{(i)}$ \\\\\n\\end{tabular} \n\\egroup\n\\end{minipage}\n"
  },
  {
    "path": "scripts/parse_anno.py",
    "content": "import json\n\n# download the raw annotations from hypothes\n# for example https://hypothes.is/api/search?_separate_replies=true&group=__world__&limit=200&offset=0&order=asc&sort=created&uri=https%3A%2F%2Fexacity.github.io%2Fdeeplearningbook-chinese%2FChapter2_linear_algebra%2F\nanno = open('raw.txt','r').read()\njson_anno = json.loads(anno)\n\nrows = json_anno['rows']\nreplies = json_anno['replies']\n\ncleaned_keys = ['user', 'text']\ncleaned_replies = []\ncleaned_rows = []\n\nfor reply in replies:\n    cleaned_reply = {k:reply[k] for k in ['user', 'text']}\n    cleaned_reply['time'] = reply['updated'][:16]\n    cleaned_replies.append(str(cleaned_reply))\n\nfor row in rows:\n    cleaned_row = {k:row[k] for k in ['user', 'text']}\n    origin_text = row['target'][0]['selector'][3]\n    cleaned_row['origin_text'] = (origin_text['prefix'] + \"  !!!\" + origin_text['exact'] + \"!!!  \" + origin_text['suffix']).replace('\\n', '')\n    cleaned_row['time'] = row['updated'][:16]\n    cleaned_rows.append(str(cleaned_row))\n\n# write to new file\nf = open('annotations.txt', 'w')\nf.write('\\n'.join(cleaned_rows))\nf.write('\\n\\n=============================   Replies   =============================\\n\\n')\nf.write('\\n'.join(cleaned_replies))\nf.close()\n"
  },
  {
    "path": "scripts/parse_gls.py",
    "content": "#!/usr/bin/env python3\nimport sys\nimport re\n\ndef create_gls_dict():\n    term_file = open('../terminology.tex', 'r')\n    term_file.readline()\n    terms = term_file.read()\n    term_file.close()\n    term_name_dict = {}\n    term_symbol_dict = {}\n    for term in terms.split('\\n\\n'):\n        tmp = term.strip().split('\\n')\n        if tmp[2].strip()[:4] != 'name':\n            print(tmp)\n        dirty_term = tmp[0][18:]\n        term_name_dict[dirty_term[:dirty_term.find('}')]] = tmp[2].strip()[5:-1]\n        for s in tmp:\n            if s.strip()[:6] == 'symbol':\n                dirty_symbol = s.strip()[8:]\n                term_symbol_dict[dirty_term[:dirty_term.find('}')]] =  dirty_symbol[:dirty_symbol.find('}')]\n                \n\n    return term_name_dict, term_symbol_dict\n\n\ndef replace_single_gls(tex, p, term_dict):\n    pl = p.finditer(tex)\n    new_tex = ''\n    prev_pos = 0\n    for i in pl:\n        new_tex += tex[prev_pos:i.start()] + term_dict[i.group()[i.group().find('{')+1:-1]]\n        prev_pos = i.end()\n    new_tex += tex[prev_pos:]\n    return new_tex\n\n\ndef replace_all_gls(input_tex, term_name_dict, term_symbol_dict):\n    # matched \\gls{}\n    tex_file = open(input_tex, 'r')\n    tex = tex_file.read()\n\n    p = re.compile('\\\\\\\\gls\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_name_dict)\n\n    p = re.compile('\\\\\\\\firstgls\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_name_dict)\n\n    p = re.compile('\\\\\\\\firstall\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_name_dict)\n\n    p = re.compile('\\\\\\\\firstacr\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_name_dict)\n\n    p = re.compile('\\\\\\\\glsacr\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_name_dict)\n\n    p = re.compile('\\\\\\\\glsentrytext\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_name_dict)\n\n    p = re.compile('\\\\\\\\glssymbol\\\\{[^\\\\}]*\\\\}')\n    tex = replace_single_gls(tex, p, term_symbol_dict)\n\n    return tex\n\nif __name__ == '__main__':\n    input_tex = sys.argv[1]\n    term_name_dict, term_symbol_dict = create_gls_dict()\n    print(replace_all_gls(input_tex, term_name_dict, term_symbol_dict))\n    #print(term_name_dict, term_symbol_dict)\n\n"
  },
  {
    "path": "terminology.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\newglossaryentry{DL}\n{\n  name=深度学习,\n  description={deep learning},\n  sort={deep learning},\n}\n\n\\newglossaryentry{knowledge_base}\n{\n  name=知识库,\n  description={knowledge base},\n  sort={knowledge base},\n}\n\n\\newglossaryentry{ML}\n{\n  name=机器学习,\n  description={machine learning},\n  sort={machine learning},\n}\n\n\\newglossaryentry{ML_model}\n{\n  name=机器学习模型,\n  description={machine learning model},\n  sort={machine learning model},\n}\n\n\\newglossaryentry{ebv}\n{\n  name=基本单位向量,\n  description={elementary basis vectors},\n  sort={elementary basis vectors},\n}\n\n\\newglossaryentry{logistic_regression}\n{\n  name=逻辑回归,\n  description={logistic regression},\n  sort={logistic regression},\n}\n\n\\newglossaryentry{regression}\n{\n  name=回归,\n  description={regression},\n  sort={regression},\n}\n\n\\newglossaryentry{AI}\n{\n  name=人工智能,\n  description={artificial intelligence},\n  sort={artificial intelligence},\n  symbol={AI}\n}\n\n\\newglossaryentry{naive_bayes}\n{\n  name=朴素贝叶斯,\n  description={naive Bayes},\n  sort={naive Bayes},\n}\n\n\\newglossaryentry{representation}\n{\n  name=表示,\n  description={representation},\n  sort={representation},\n}\n\n\\newglossaryentry{representation_learning}\n{\n  name=表示学习,\n  description={representation learning},\n  sort={representation learning},\n}\n\n\\newglossaryentry{AE}\n{\n  name=自编码器,\n  description={autoencoder},\n  sort={autoencoder},\n}\n\n\\newglossaryentry{encoder}\n{\n  name=编码器,\n  description={encoder},\n  sort={encoder},\n}\n\n\\newglossaryentry{decoder}\n{\n  name=解码器,\n  description={decoder},\n  sort={decoder},\n}\n\n\\newglossaryentry{MLP}\n{\n  name=多层感知机,\n  description={multilayer perceptron},\n  sort={multilayer perceptron},\n  symbol={MLP}\n}\n\n\\newglossaryentry{cybernetics}\n{\n  name=控制论,\n  description={cybernetics},\n  sort={cybernetics},\n}\n\n\\newglossaryentry{connectionism}\n{\n  name=联结主义,\n  description={connectionism},\n  sort={connectionism},\n}\n\n\\newglossaryentry{ANN}\n{\n  name=人工神经网络,\n  description={artificial neural network},\n  sort={artificial neural network},\n  symbol={ANN}\n}\n\n\\newglossaryentry{NN}\n{\n  name=神经网络,\n  description={neural network},\n  sort={neural network},\n}\n\n\\newglossaryentry{SGD}\n{\n  name=随机梯度下降,\n  description={stochastic gradient descent},\n  sort={stochastic gradient descent},\n  symbol={SGD}\n}\n\n\\newglossaryentry{linear_model}\n{\n  name=线性模型,\n  description={linear model},\n  sort={linear model},\n}\n\n\\newglossaryentry{mode}\n{\n  name=峰值,\n  description={mode},\n  sort={mode},\n}\n\n\\newglossaryentry{unimodal}\n{\n  name=单峰值,\n  description={unimodal},\n  sort={unimodal},\n}\n\n\\newglossaryentry{modality}\n{\n  name=模态,\n  description={modality},\n  sort={modality},\n}\n\n\\newglossaryentry{multimodal}\n{\n  name=多峰值,\n  description={multimodal},\n  sort={multimodal},\n}\n\n\\newglossaryentry{linear_regression}\n{\n  name=线性回归,\n  description={linear regression},\n  sort={linear regression},\n}\n\n\\newglossaryentry{ReLU}\n{\n  name=整流线性单元,\n  description={rectified linear unit},\n  sort={rectified linear unit},\n  symbol={ReLU}\n}\n\n\\newglossaryentry{distributed_representation}\n{\n  name=分布式表示,\n  description={distributed representation},\n  sort={distributed representation},\n}\n\n\\newglossaryentry{nondistributed_representation}\n{\n  name=非分布式表示,\n  description={nondistributed representation},\n  sort={nondistributed representation},\n}\n\n\\newglossaryentry{nondistributed}\n{\n  name=非分布式,\n  description={nondistributed},\n  sort={nondistributed},\n}\n\n\\newglossaryentry{hidden_unit}\n{\n  name=隐藏单元,\n  description={hidden unit},\n  sort={hidden unit},\n}\n\n\\newglossaryentry{LSTM}\n{\n  name=长短期记忆,\n  description={long short-term memory},\n  sort={long short-term memory},\n  symbol={LSTM}\n}\n\n\\newglossaryentry{DBN}\n{\n  name=深度信念网络,\n  description={deep belief network},\n  sort={deep belief network},\n  symbol={DBN}\n}\n\n\\newglossaryentry{RNN}\n{\n  name=循环神经网络,\n  description={recurrent neural network},\n  sort={recurrent neural network},\n  symbol={RNN}\n}\n\n\\newglossaryentry{recurrence}\n{\n  name=循环,\n  description={recurrence},\n  sort={recurrence},\n}\n\n\\newglossaryentry{RL}\n{\n  name=强化学习,\n  description={reinforcement learning},\n  sort={reinforcement learning},\n}\n\n\\newglossaryentry{inference}\n{\n  name=推断,\n  description={inference},\n  sort={inference},\n}\n\n\\newglossaryentry{overflow}\n{\n  name=上溢,\n  description={overflow},\n  sort={overflow},\n}\n\n\\newglossaryentry{underflow}\n{\n  name=下溢,\n  description={underflow},\n  sort={underflow},\n}\n\n\\newglossaryentry{softmax}\n{\n  name=softmax函数,\n  description={softmax function},\n  sort={softmax function},\n}\n\n\\newglossaryentry{softmax_chap15}\n{\n  name=softmax,\n  description={softmax},\n  sort={softmax},\n}\n\n\\newglossaryentry{underestimation}\n{\n  name=欠估计,\n  description={underestimation},\n  sort={underestimation},\n}\n\n\\newglossaryentry{overestimation}\n{\n  name=过估计,\n  description={overestimation},\n  sort={overestimation},\n}\n\n\\newglossaryentry{softmax_unit}\n{\n  name=softmax单元,\n  description={softmax unit},\n  sort={softmax unit},\n}\n\n\\newglossaryentry{softmax_chap11}\n{\n  name=softmax,\n  description={softmax},\n  sort={softmax},\n}\n\n\\newglossaryentry{multinoulli}\n{\n  name=Multinoulli分布,\n  description={multinoulli distribution},\n  sort={multinoulli distribution},\n}\n\n\\newglossaryentry{poor_conditioning}\n{\n  name=病态条件,\n  description={poor conditioning},\n  sort={poor conditioning},\n}\n\n\\newglossaryentry{objective_function}\n{\n  name=目标函数,\n  description={objective function},\n  sort={objective function},\n}\n\n\\newglossaryentry{objective}\n{\n  name=目标,\n  description={objective},\n  sort={objective},\n}\n\n\\newglossaryentry{criterion}\n{\n  name=准则,\n  description={criterion},\n  sort={criterion},\n}\n\n\\newglossaryentry{cost_function}\n{\n  name=代价函数,\n  description={cost function},\n  sort={cost function},\n}\n\n\\newglossaryentry{cost}\n{\n  name=代价,\n  description={cost},\n  sort={cost},\n}\n\n\\newglossaryentry{loss_function}\n{\n  name=损失函数,\n  description={loss function},\n  sort={loss function},\n}\n\n\\newglossaryentry{prcurve}\n{\n  name=PR曲线,\n  description={PR curve},\n  sort={PR curve},\n}\n\n\\newglossaryentry{fscore}\n{\n  name=F分数,\n  description={F-score},\n  sort={F-score},\n}\n\n\\newglossaryentry{loss}\n{\n  name=损失,\n  description={loss},\n  sort={loss},\n}\n\n\\newglossaryentry{error_function}\n{\n  name=误差函数,\n  description={error function},\n  sort={error function},\n}\n\n\\newglossaryentry{GD}\n{\n  name=梯度下降,\n  description={gradient descent},\n  sort={gradient descent},\n}\n\n\\newglossaryentry{local_descent}\n{\n  name=局部下降,\n  description={local descent},\n  sort={local descent},\n}\n\n\\newglossaryentry{steepest}\n{\n  name=最陡下降,\n  description={steepest descent},\n  sort={steepest descent},\n}\n\n\\newglossaryentry{GA}\n{\n  name=梯度上升,\n  description={gradient ascent},\n  sort={gradient ascent},\n}\n\n\\newglossaryentry{derivative}\n{\n  name=导数,\n  description={derivative},\n  sort={derivative},\n}\n\n\\newglossaryentry{critical_points}\n{\n  name=临界点,\n  description={critical point},\n  sort={critical point},\n}\n\n\\newglossaryentry{stationary_point}\n{\n  name=驻点,\n  description={stationary point},\n  sort={stationary point},\n}\n\n\\newglossaryentry{local_minimum}\n{\n  name=局部极小点,\n  description={local minimum},\n  sort={local minimum},\n}\n\n\\newglossaryentry{minimum}\n{\n  name=极小点,\n  description={minimum},\n  sort={minimum},\n}\n\n\\newglossaryentry{local_minima}\n{\n  name=局部极小值,\n  description={local minima},\n  sort={local minima},\n}\n\n\\newglossaryentry{minima}\n{\n  name=极小值,\n  description={minima},\n  sort={minima},\n}\n\n\\newglossaryentry{global_minima}\n{\n  name=全局极小值,\n  description={global minima},\n  sort={global minima},\n}\n\n\\newglossaryentry{local_maxima}\n{\n  name=局部极大值,\n  description={local maxima},\n  sort={local maxima},\n}\n\n\\newglossaryentry{maxima}\n{\n  name=极大值,\n  description={maxima},\n  sort={maxima},\n}\n\n\\newglossaryentry{local_maximum}\n{\n  name=局部极大点,\n  description={local maximum},\n  sort={local maximum},\n}\n\n\\newglossaryentry{saddle_points}\n{\n  name=鞍点,\n  description={saddle point},\n  sort={saddle point},\n}\n\n\\newglossaryentry{global_minimum}\n{\n  name=全局最小点,\n  description={global minimum},\n  sort={global minimum},\n}\n\n\\newglossaryentry{partial_derivatives}\n{\n  name=偏导数,\n  description={partial derivative},\n  sort={partial derivative},\n}\n\n\\newglossaryentry{gradient}\n{\n  name=梯度,\n  description={gradient},\n  sort={gradient},\n}\n\n\\newglossaryentry{identifiable}\n{\n  name=可辨认的,\n  description={identifiable},\n  sort={identifiable},\n}\n\n\\newglossaryentry{directional_derivative}\n{\n  name=方向导数,\n  description={directional derivative},\n  sort={directional derivative},\n}\n\n\\newglossaryentry{line_search}\n{\n  name=线搜索,\n  description={line search},\n  sort={line search},\n}\n\n\\newglossaryentry{example}\n{\n  name=样本,\n  description={example},\n  sort={example},\n}\n\n\\newglossaryentry{hill_climbing}\n{\n  name=爬山,\n  description={hill climbing},\n  sort={hill climbing},\n}\n\n\\newglossaryentry{ill_conditioning}\n{\n  name=病态,\n  description={ill conditioning},\n  sort={ill conditioning},\n}\n\n\\newglossaryentry{jacobian}\n{\n  name=Jacobian,\n  description={Jacobian},\n  sort={Jacobian},\n}\n\n\\newglossaryentry{hessian}\n{\n  name=Hessian,\n  description={Hessian},\n  sort={Hessian},\n}\n\n\\newglossaryentry{second_derivative}\n{\n  name=二阶导数,\n  description={second derivative},\n  sort={second derivative},\n}\n\n\\newglossaryentry{curvature}\n{\n  name=曲率,\n  description={curvature},\n  sort={curvature},\n}\n\n\\newglossaryentry{taylor}\n{\n  name=泰勒,\n  description={taylor},\n  sort={taylor},\n}\n\n\\newglossaryentry{second_derivative_test}\n{\n  name=二阶导数测试,\n  description={second derivative test},\n  sort={second derivative test},\n}\n\n\\newglossaryentry{newton_method}\n{\n  name=牛顿法,\n  description={Newton's method},\n  sort={Newton's method},\n}\n\n\\newglossaryentry{second_order_method}\n{\n  name=二阶方法,\n  description={second-order method},\n  sort={second-order method},\n}\n\n\\newglossaryentry{first_order_method}\n{\n  name=一阶方法,\n  description={first-order method},\n  sort={first-order method},\n}\n\n\\newglossaryentry{lipschitz}\n{\n  name=Lipschitz,\n  description={Lipschitz},\n  sort={Lipschitz},\n}\n\n\\newglossaryentry{lipschitz_continuous}\n{\n  name=Lipschitz连续,\n  description={Lipschitz continuous},\n  sort={Lipschitz continuous},\n}\n\n\\newglossaryentry{lipschitz_constant}\n{\n  name=Lipschitz常数,\n  description={Lipschitz constant},\n  sort={Lipschitz constant},\n}\n\n\\newglossaryentry{convex_optimization}\n{\n  name=凸优化,\n  description={Convex optimization},\n  sort={Convex optimization},\n}\n\n\\newglossaryentry{nonconvex}\n{\n  name=非凸,\n  description={nonconvex},\n  sort={nonconvex},\n}\n\n\\newglossaryentry{nume_optimization}\n{\n  name=数值优化,\n  description={numerical optimization},\n  sort={numerical optimization},\n}\n\n\\newglossaryentry{constrained_optimization}\n{\n  name=约束优化,\n  description={constrained optimization},\n  sort={constrained optimization},\n}\n\n\\newglossaryentry{feasible}\n{\n  name=可行,\n  description={feasible},\n  sort={feasible},\n}\n\n\\newglossaryentry{KKT}\n{\n  name=Karush–Kuhn–Tucker,\n  description={Karush–Kuhn–Tucker},\n  sort={Karush–Kuhn–Tucker},\n  symbol={KKT}\n}\n\n\\newglossaryentry{generalized_lagrangian}\n{\n  name=广义Lagrangian,\n  description={generalized Lagrangian},\n  sort={generalized Lagrangian},\n}\n\n\\newglossaryentry{generalized_lagrange_function}\n{\n  name=广义Lagrange函数,\n  description={generalized Lagrange function},\n  sort={generalized Lagrange function},\n}\n\n\\newglossaryentry{equality_constraints}\n{\n  name=等式约束,\n  description={equality constraint},\n  sort={equality constraint},\n}\n\n\\newglossaryentry{inequality_constraints}\n{\n  name=不等式约束,\n  description={inequality constraint},\n  sort={inequality constraint},\n}\n\n\\newglossaryentry{regularization}\n{\n  name=正则化,\n  description={regularization},\n  sort={regularization},\n}\n\n\\newglossaryentry{regularizer}\n{\n  name=正则化项,\n  description={regularizer},\n  sort={regularizer},\n}\n\n\\newglossaryentry{regularize}\n{\n  name=正则化,\n  description={regularize},\n  sort={regularize},\n}\n\n\\newglossaryentry{generalization}\n{\n  name=泛化,\n  description={generalization},\n  sort={generalization},\n}\n\n\\newglossaryentry{generalize}\n{\n  name=泛化,\n  description={generalize},\n  sort={generalize},\n}\n\n\\newglossaryentry{underfitting}\n{\n  name=欠拟合,\n  description={underfitting},\n  sort={underfitting},\n}\n\n\\newglossaryentry{overfitting}\n{\n  name=过拟合,\n  description={overfitting},\n  sort={overfitting},\n}\n\n\\newglossaryentry{bias_sta}\n{\n  name=偏差,\n  description={bias in statistics},\n  sort={bias in statistics},\n}\n\n\\newglossaryentry{BIAS}\n{\n  name=偏差,\n  description={biass},\n  sort={biass},\n}\n\n\\newglossaryentry{bias_aff}\n{\n  name=偏置,\n  description={bias in affine function},\n  sort={bias in affine function},\n}\n\n\\newglossaryentry{variance}\n{\n  name=方差,\n  description={variance},\n  sort={variance},\n}\n\n\\newglossaryentry{ensemble}\n{\n  name=集成,\n  description={ensemble},\n  sort={ensemble},\n}\n\n\\newglossaryentry{estimator}\n{\n  name=估计,\n  description={estimator},\n  sort={estimator},\n}\n\n\\newglossaryentry{weight_decay}\n{\n  name=权重衰减,\n  description={weight decay},\n  sort={weight decay},\n}\n\n\\newglossaryentry{ridge_regression}\n{\n  name=岭回归,\n  description={ridge regression},\n  sort={ridge regression},\n}\n\n\\newglossaryentry{tikhonov_regularization}\n{\n  name=Tikhonov正则,\n  description={Tikhonov regularization},\n  sort={Tikhonov regularization},\n}\n\n\\newglossaryentry{covariance}\n{\n  name=协方差,\n  description={covariance},\n  sort={covariance},\n}\n\n\\newglossaryentry{sparse}\n{\n  name=稀疏,\n  description={sparse},\n  sort={sparse},\n}\n\n\\newglossaryentry{feature_selection}\n{\n  name=特征选择,\n  description={feature selection},\n  sort={feature selection},\n}\n\n\\newglossaryentry{feature_extractor}\n{\n  name=特征提取器,\n  description={feature extractor},\n  sort={feature extractor},\n}\n\n\\newglossaryentry{MAP}\n{\n  name=最大后验,\n  description={Maximum A Posteriori},\n  sort={Maximum A Posteriori},\n  symbol={MAP}\n}\n\n\\newglossaryentry{pooling}\n{\n  name=池化,\n  description={pooling},\n  sort={pooling},\n}\n\n\\newglossaryentry{dropout}\n{\n  name=Dropout,\n  description={Dropout},\n  sort={dropout},\n}\n\n\\newglossaryentry{monte_carlo}\n{\n  name=蒙特卡罗,\n  description={Monte Carlo},\n  sort={Monte Carlo},\n}\n\n\\newglossaryentry{early_stopping}\n{\n  name=提前终止,\n  description={early stopping},\n  sort={early stopping},\n}\n\n\\newglossaryentry{CNN}\n{\n  name=卷积神经网络,\n  description={convolutional neural network},\n  sort={convolutional neural network},\n  symbol={CNN}\n}\n\n\\newglossaryentry{mcmc}\n{\n  name=马尔可夫链蒙特卡罗,\n  description={Markov Chain Monte Carlo},\n  symbol={MCMC},\n  sort={Markov Chain Monte Carlo},\n}\n\n\\newglossaryentry{tempering_transition}\n{\n  name=回火转移,\n  description={tempered transition},\n  sort={tempered transition},\n}\n\n\\newglossaryentry{markov_chain}\n{\n  name=马尔可夫链,\n  description={Markov Chain},\n  sort={Markov Chain},\n}\n\n\\newglossaryentry{harris_chain}\n{\n  name=哈里斯链,\n  description={Harris Chain},\n  sort={Harris Chain},\n}\n\n\\newglossaryentry{minibatch}\n{\n  name=小批量,\n  description={minibatch},\n  sort={minibatch},\n}\n\n\\newglossaryentry{importance_sampling}\n{\n  name=重要采样,\n  description={Importance Sampling},\n  sort={Importance Sampling},\n}\n\n\\newglossaryentry{undirected_model}\n{\n  name=无向模型,\n  description={undirected Model},\n  sort={undirected Model},\n}\n\n\\newglossaryentry{partition_function}\n{\n  name=配分函数,\n  description={Partition Function},\n  sort={Partition Function},\n}\n\n\\newglossaryentry{law_of_large_numbers}\n{\n  name=大数定理,\n  description={Law of large number},\n  sort={Law of large number},\n}\n\n\\newglossaryentry{central_limit_theorem}\n{\n  name=中心极限定理,\n  description={central limit theorem},\n  sort={central limit theorem},\n}\n\n\\newglossaryentry{energy_based_model}\n{\n  name=基于能量的模型,\n  description={Energy-based model},\n  symbol={EBM},\n  sort={Energy-based model},\n}\n\n\\newglossaryentry{tempering}\n{\n  name=回火,\n  description={tempering},\n  sort={tempering},\n}\n\n\\newglossaryentry{biased_importance_sampling}\n{\n  name=有偏重要采样,\n  description={biased importance sampling},\n  sort={biased importance sampling},\n}\n\n\\newglossaryentry{VAE}\n{\n  name=变分自编码器,\n  description={variational auto-encoder},\n  sort={variational auto-encoder},\n  symbol={VAE},\n}\n\n\\newglossaryentry{CV}\n{\n  name=计算机视觉,\n  description={Computer Vision},\n  sort={Computer Vision},\n}\n\n\\newglossaryentry{SR}\n{\n  name=语音识别,\n  description={Speech Recognition},\n  sort={Speech Recognition},\n}\n\n\\newglossaryentry{NLP}\n{\n  name=自然语言处理,\n  description={Natural Language Processing},\n  sort={Natural Language Processing},\n  symbol={NLP}\n}\n\n\\newglossaryentry{RBM}\n{\n  name=受限玻尔兹曼机,\n  description={Restricted Boltzmann Machine},\n  sort={Restricted Boltzmann Machine},\n  symbol={RBM}\n}\n\n\\newglossaryentry{discriminative_RBM}\n{\n  name=判别RBM,\n  description={discriminative RBM},\n  sort={discriminative RBM},\n}\n\n\\newglossaryentry{Boltzmann}\n{\n  name=玻尔兹曼,\n  description={Boltzmann},\n  sort={Boltzmann},\n}\n\n\\newglossaryentry{BM}\n{\n  name=玻尔兹曼机,\n  description={Boltzmann Machine},\n  sort={Boltzmann Machine},\n}\n\n\\newglossaryentry{DBM}\n{\n  name=深度玻尔兹曼机,\n  description={Deep Boltzmann Machine},\n  sort={Deep Boltzmann Machine},\n  symbol={DBM}\n}\n\n\\newglossaryentry{CBM}\n{\n  name=卷积玻尔兹曼机,\n  description={Convolutional Boltzmann Machine},\n  sort={Convolutional Boltzmann Machine},\n  symbol={CBM}\n}\n\n\\newglossaryentry{directed_model}\n{\n  name=有向模型,\n  description={Directed Model},\n  sort={Directed Model},\n}\n\n\\newglossaryentry{ancestral_sampling}\n{\n  name=原始采样,\n  description={Ancestral Sampling},\n  sort={Ancestral Sampling},\n}\n\n\\newglossaryentry{stochastic_matrix}\n{\n  name=随机矩阵,\n  description={Stochastic Matrix},\n  sort={Stochastic Matrix},\n}\n\n\\newglossaryentry{stationary_distribution}\n{\n  name=平稳分布,\n  description={Stationary Distribution},\n  sort={Stationary Distribution},\n}\n\n\\newglossaryentry{equilibrium_distribution}\n{\n  name=均衡分布,\n  description={Equilibrium Distribution},\n  sort={Equilibrium Distribution},\n}\n\n\\newglossaryentry{index}\n{\n  name=索引,\n  description={index of matrix},\n  sort={index of matrix},\n}\n\n\\newglossaryentry{burn_in}\n{\n  name=磨合,\n  description={Burning-in},\n  sort={Burning-in},\n}\n\n\\newglossaryentry{mixing_time}\n{\n  name=混合时间,\n  description={Mixing Time},\n  sort={Mixing Time},\n}\n\n\\newglossaryentry{mixing}\n{\n  name=混合,\n  description={Mixing},\n  sort={Mixing},\n}\n\n\\newglossaryentry{gibbs_sampling}\n{\n  name=Gibbs采样,\n  description={Gibbs Sampling},\n  sort={Gibbs Sampling},\n}\n\n\\newglossaryentry{block_gibbs_sampling}\n{\n  name=块吉布斯采样,\n  description={block Gibbs Sampling},\n  sort={block Gibbs Sampling},\n}\n\n\\newglossaryentry{gibbs_steps}\n{\n  name=吉布斯步数,\n  description={Gibbs steps},\n  sort={Gibbs steps},\n}\n\n\\newglossaryentry{bagging}\n{\n  name=Bagging,\n  description={bootstrap aggregating},\n  sort={bagging},\n}\n\n\\newglossaryentry{mask}\n{\n  name=掩码,\n  description={mask},\n  sort={mask},\n}\n\n\\newglossaryentry{batch_normalization}\n{\n  name=批标准化,\n  description={batch normalization},\n  sort={batch normalization},\n}\n\n\\newglossaryentry{Batch_normalization}\n{\n  name=批标准化,\n  description={Batch normalization},\n  sort={Batch normalization},\n}\n\n\\newglossaryentry{parameter_sharing}\n{\n  name=参数共享,\n  description={parameter sharing},\n  sort={parameter sharing},\n}\n\n\\newglossaryentry{KL}\n{\n  name=KL散度,\n  description={KL divergence},\n  sort={KL},\n}\n\n\\newglossaryentry{temperature}\n{\n  name=温度,\n  description={temperature},\n  sort={temperature},\n}\n\n\\newglossaryentry{critical_temperatures}\n{\n  name=临界温度,\n  description={critical temperatures},\n  sort={critical temperatures},\n}\n\n\\newglossaryentry{parallel_tempering}\n{\n  name=并行回火,\n  description={parallel tempering},\n  sort={parallel tempering},\n}\n\n\\newglossaryentry{ASR}\n{\n  name=自动语音识别,\n  description={Automatic Speech Recognition},\n  sort={Automatic Speech Recognition},\n  symbol={ASR}\n}\n\n\\newglossaryentry{GP_GPU}\n{\n  name=通用GPU,\n  description={general purpose GPU},\n  sort={general purpose GPU},\n}\n\n\\newglossaryentry{coalesced}\n{\n  name=级联,\n  description={coalesced},\n  sort={coalesced},\n}\n\n\\newglossaryentry{warp}\n{\n  name=warp,\n  description={warp},\n  sort={warp},\n}\n\n\\newglossaryentry{data_parallelism}\n{\n  name=数据并行,\n  description={data parallelism},\n  sort={data parallelism},\n}\n\n\\newglossaryentry{model_parallelism}\n{\n  name=模型并行,\n  description={model parallelism},\n  sort={model parallelism},\n}\n\n\\newglossaryentry{ASGD}\n{\n  name=异步随机梯度下降,\n  description={Asynchoronous Stochastic Gradient Descent},\n  sort={Asynchoronous Stochastic Gradient Descent},\n}\n\n\\newglossaryentry{parameter_server}\n{\n  name=参数服务器,\n  description={parameter server},\n  sort={parameter server},\n}\n\n\\newglossaryentry{model_compression}\n{\n  name=模型压缩,\n  description={model compression},\n  sort={model compression},\n}\n\n\\newglossaryentry{dynamic_structure}\n{\n  name=动态结构,\n  description={dynamic structure},\n  sort={dynamic structure},\n}\n\n\\newglossaryentry{conditional_computation}\n{\n  name=条件计算,\n  description={conditional computation},\n  sort={conditional computation},\n}\n\n\\newglossaryentry{sphering}\n{\n  name=sphering,\n  description={sphering},\n  sort={sphering},\n}\n\n\\newglossaryentry{GCN}\n{\n  name=全局对比度归一化,\n  description={Global contrast normalization},\n  sort={Global contrast normalization},\n  symbol={GCN}\n}\n\n\\newglossaryentry{LCN}\n{\n  name=局部对比度归一化,\n  description={local contrast normalization},\n  symbol={LCN},\n  sort={local contrast normalization},\n}\n\n\\newglossaryentry{HMM}\n{\n  name=隐马尔可夫模型,\n  description={Hidden Markov Model},\n  sort={Hidden Markov Model},\n  symbol={HMM}\n}\n\n\\newglossaryentry{GMM}\n{\n  name=高斯混合模型,\n  description={Gaussian Mixture Model},\n  sort={Gaussian Mixture Model},\n  symbol={GMM}\n}\n\n\\newglossaryentry{transcribe}\n{\n  name=转录,\n  description={transcribe},\n  sort={transcribe},\n}\n\n\\newglossaryentry{PCA}\n{\n  name=主成分分析,\n  description={principal components analysis},\n  sort={principal components analysis},\n  symbol={PCA}\n}\n\n\\newglossaryentry{FA}\n{\n  name=因子分析,\n  description={factor analysis},\n  sort={factor analysis},\n}\n\n\\newglossaryentry{ICA}\n{\n  name=独立成分分析,\n  description={independent component analysis},\n  sort={independent component analysis},\n  symbol={ICA}\n}\n\n\\newglossaryentry{tICA}\n{\n  name=地质ICA,\n  description={topographic ICA},\n  sort={topo independent component analysis},\n}\n\n\\newglossaryentry{sparse_coding}\n{\n  name=稀疏编码,\n  description={sparse coding},\n  sort={sparse coding},\n}\n\n\\newglossaryentry{fixed_point_arithmetic}\n{\n  name=定点运算,\n  description={fixed-point arithmetic},\n  sort={fixed-point arithmetic},\n}\n\n\\newglossaryentry{float_point_arithmetic}\n{\n  name=浮点运算,\n  description={float-point arithmetic},\n  sort={float-point arithmetic},\n}\n\n\\newglossaryentry{GPU}\n{\n  name=图形处理器,\n  description={Graphics Processing Unit},\n  sort={Graphics Processing Unit},\n  symbol={GPU}\n}\n\n\\newglossaryentry{generative_model}\n{\n  name=生成模型,\n  description={generative model},\n  sort={generative model},\n}\n\n\\newglossaryentry{generative_modeling}\n{\n  name=生成式建模,\n  description={generative modeling},\n  sort={generative modeling},\n}\n\n\\newglossaryentry{dataset_augmentation}\n{\n  name=数据集增强,\n  description={dataset augmentation},\n  sort={dataset augmentation},\n}\n\n\\newglossaryentry{whitening}\n{\n  name=白化,\n  description={whitening},\n  sort={whitening},\n}\n\n\\newglossaryentry{DNN}\n{\n  name=深度神经网络,\n  description={DNN},\n  sort={DNN},\n}\n\n\\newglossaryentry{end_to_end}\n{\n  name=端到端的,\n  description={end-to-end},\n  sort={end-to-end},\n}\n\n\\newglossaryentry{structured_probabilistic_models}\n{\n  name=结构化概率模型,\n  description={structured probabilistic model},\n  sort={structured probabilistic model},\n}\n\n\\newglossaryentry{graphical_models}\n{\n  name=图模型,\n  description={graphical model},\n  sort={graphical model},\n}\n\n\\newglossaryentry{directed_graphical_model}\n{\n  name=有向图模型,\n  description={directed graphical model},\n  sort={directed graphical model},\n}\n\n\\newglossaryentry{dependency}\n{\n  name=依赖,\n  description={dependency},\n  sort={dependency},\n}\n\n\\newglossaryentry{bayesian_network}\n{\n  name=贝叶斯网络,\n  description={Bayesian network},\n  sort={Bayesian network},\n}\n\n\\newglossaryentry{model_averaging}\n{\n  name=模型平均,\n  description={model averaging},\n  sort={model averaging},\n}\n\n\\newglossaryentry{boosting}\n{\n  name=Boosting,\n  description={Boosting},\n  sort={Boosting},\n}\n\n\\newglossaryentry{weight_scaling_inference_rule}\n{\n  name=权重比例推断规则,\n  description={weight scaling inference rule},\n  sort={weight scaling inference rule},\n}\n\n\\newglossaryentry{statement}\n{\n  name=声明,\n  description={statement},\n  sort={statement},\n}\n\n\\newglossaryentry{quantum_mechanics}\n{\n  name=量子力学,\n  description={quantum mechanics},\n  sort={quantum mechanics},\n}\n\n\\newglossaryentry{subatomic}\n{\n  name=亚原子,\n  description={subatomic},\n  sort={subatomic},\n}\n\n\\newglossaryentry{fidelity}\n{\n  name=逼真度,\n  description={fidelity},\n  sort={fidelity},\n}\n\n\\newglossaryentry{degree_of_belief}\n{\n  name=信任度,\n  description={degree of belief},\n  sort={degree of belief},\n}\n\n\\newglossaryentry{frequentist_probability}\n{\n  name=频率派概率,\n  description={frequentist probability},\n  sort={frequentist probability},\n}\n\n\\newglossaryentry{subsample}\n{\n  name=子采样,\n  description={subsample},\n  sort={subsample},\n}\n\n\\newglossaryentry{bayesian_probability}\n{\n  name=贝叶斯概率,\n  description={Bayesian probability},\n  sort={Bayesian probability},\n}\n\n\\newglossaryentry{likelihood}\n{\n  name=似然,\n  description={likelihood},\n  sort={likelihood},\n}\n\n\\newglossaryentry{RV}\n{\n  name=随机变量,\n  description={random variable},\n  sort={random variable},\n}\n\n\\newglossaryentry{PD}\n{\n  name=概率分布,\n  description={probability distribution},\n  sort={probability distribution},\n}\n\n\\newglossaryentry{PMF}\n{\n  name=概率质量函数,\n  description={probability mass function},\n  sort={probability mass function},\n  symbol={PMF}\n}\n\n\\newglossaryentry{joint_probability_distribution}\n{\n  name=联合概率分布,\n  description={joint probability distribution},\n  sort={joint probability distribution},\n}\n\n\\newglossaryentry{normalized}\n{\n  name=归一化的,\n  description={normalized},\n  sort={normalized},\n}\n\n\\newglossaryentry{uniform_distribution}\n{\n  name=均匀分布,\n  description={uniform distribution},\n  sort={uniform distribution},\n}\n\n\\newglossaryentry{PDF}\n{\n  name=概率密度函数,\n  description={probability density function},\n  sort={probability density function},\n  symbol={PDF}\n}\n\n\\newglossaryentry{cumulative_function}\n{\n  name=累积函数,\n  description={cumulative function},\n  sort={cumulative function},\n}\n\n\\newglossaryentry{marginal_probability_distribution}\n{\n  name=边缘概率分布,\n  description={marginal probability distribution},\n  sort={marginal probability distribution},\n}\n\n\\newglossaryentry{sum_rule}\n{\n  name=求和法则,\n  description={sum rule},\n  sort={sum rule},\n}\n\n\\newglossaryentry{conditional_probability}\n{\n  name=条件概率,\n  description={conditional probability},\n  sort={conditional probability},\n}\n\n\\newglossaryentry{intervention_query}\n{\n  name=干预查询,\n  description={intervention query},\n  sort={intervention query},\n}\n\n\\newglossaryentry{causal_modeling}\n{\n  name=因果模型,\n  description={causal modeling},\n  sort={causal modeling},\n}\n\n\\newglossaryentry{causal_factor}\n{\n  name=因果因子,\n  description={causal factor},\n  sort={causal factor},\n}\n\n\\newglossaryentry{chain_rule}\n{\n  name=链式法则,\n  description={chain rule},\n  sort={chain rule},\n}\n\n\\newglossaryentry{product_rule}\n{\n  name=乘法法则,\n  description={product rule},\n  sort={product rule},\n}\n\n\\newglossaryentry{independent}\n{\n  name=相互独立的,\n  description={independent},\n  sort={independent},\n}\n\n\\newglossaryentry{conditionally_independent}\n{\n  name=条件独立的,\n  description={conditionally independent},\n  sort={conditionally independent},\n}\n\n\\newglossaryentry{expectation}\n{\n  name=期望,\n  description={expectation},\n  sort={expectation},\n}\n\n\\newglossaryentry{expected_value}\n{\n  name=期望值,\n  description={expected value},\n  sort={expected value},\n}\n\n\\newglossaryentry{example:chap5}\n{\n  name=样本,\n  description={example},\n  sort={example},\n}\n\n\\newglossaryentry{feature}\n{\n  name=特征,\n  description={feature},\n  sort={feature},\n}\n\n\\newglossaryentry{accuracy}\n{\n  name=准确率,\n  description={accuracy},\n  sort={accuracy},\n}\n\n\\newglossaryentry{error_rate}\n{\n  name=错误率,\n  description={error rate},\n  sort={error rate},\n}\n\n\\newglossaryentry{training_set}\n{\n  name=训练集,\n  description={training set},\n  sort={training set},\n}\n\n\\newglossaryentry{explanatory_factor}\n{\n  name=解释因子,\n  description={explanatory factort},\n  sort={explanatory factor},\n}\n\n\\newglossaryentry{underlying}\n{\n  name=潜在,\n  description={underlying},\n  sort={underlying},\n}\n\n\\newglossaryentry{underlying_cause}\n{\n  name=潜在成因,\n  description={underlying cause},\n  sort={underlying cause},\n}\n\n\\newglossaryentry{test_set}\n{\n  name=测试集,\n  description={test set},\n  sort={test set},\n}\n\n\\newglossaryentry{performance_measures}\n{\n  name=性能度量,\n  description={performance measures},\n  sort={performance measures},\n}\n\n\\newglossaryentry{experience}\n{\n  name=经验,\n  description={experience, E},\n  sort={experience, E},\n}\n\n\\newglossaryentry{unsupervised}\n{\n  name=无监督,\n  description={unsupervised},\n  sort={unsupervised},\n}\n\n\\newglossaryentry{supervised}\n{\n  name=监督,\n  description={supervised},\n  sort={supervised},\n}\n\n\\newglossaryentry{semi_supervised}\n{\n  name=半监督,\n  description={semi-supervised},\n  sort={semi-supervised},\n}\n\n\\newglossaryentry{supervised_learning}\n{\n  name=监督学习,\n  description={supervised learning},\n  sort={supervised learning},\n}\n\n\\newglossaryentry{unsupervised_learning}\n{\n  name=无监督学习,\n  description={unsupervised learning},\n  sort={unsupervised learning},\n}\n\n\\newglossaryentry{dataset}\n{\n  name=数据集,\n  description={dataset},\n  sort={dataset},\n}\n\n\\newglossaryentry{setting}\n{\n  name=情景,\n  description={setting},\n  sort={setting},\n}\n\n\\newglossaryentry{data_points}\n{\n  name=数据点,\n  description={data point},\n  sort={data point},\n}\n\n\\newglossaryentry{label}\n{\n  name=标签,\n  description={label},\n  sort={label},\n}\n\n\\newglossaryentry{labeled}\n{\n  name=标注,\n  description={labeled},\n  sort={labeled},\n}\n\n\\newglossaryentry{unlabeled}\n{\n  name=未标注,\n  description={unlabeled},\n  sort={unlabeled},\n}\n\n\\newglossaryentry{target}\n{\n  name=目标,\n  description={target},\n  sort={target},\n}\n\n\\newglossaryentry{reinforcement_learning}\n{\n  name=强化学习,\n  description={reinforcement learning},\n  sort={reinforcement learning},\n}\n\n\\newglossaryentry{design_matrix}\n{\n  name=设计矩阵,\n  description={design matrix},\n  sort={design matrix},\n}\n\n\\newglossaryentry{parameters}\n{\n  name=参数,\n  description={parameter},\n  sort={parameter},\n}\n\n\\newglossaryentry{weights}\n{\n  name=权重,\n  description={weight},\n  sort={weight},\n}\n\n\\newglossaryentry{mean_squared_error}\n{\n  name=均方误差,\n  description={mean squared error},\n  sort={mean squared error},\n  symbol={MSE}\n}\n\n\\newglossaryentry{normal_equations}\n{\n  name=正规方程,\n  description={normal equation},\n  sort={normal equation},\n}\n\n\\newglossaryentry{training_error}\n{\n  name=训练误差,\n  description={training error},\n  sort={training error},\n}\n\n\\newglossaryentry{generalization_error}\n{\n  name=泛化误差,\n  description={generalization error},\n  sort={generalization error},\n}\n\n\\newglossaryentry{test_error}\n{\n  name=测试误差,\n  description={test error},\n  sort={test error},\n}\n\n\\newglossaryentry{hypothesis_space}\n{\n  name=假设空间,\n  description={hypothesis space},\n  sort={hypothesis space},\n}\n\n\\newglossaryentry{capacity}\n{\n  name=容量,\n  description={capacity},\n  sort={capacity},\n}\n\n\\newglossaryentry{representational_capacity}\n{\n  name=表示容量,\n  description={representational capacity},\n  sort={representational capacity},\n}\n\n\\newglossaryentry{effective_capacity}\n{\n  name=有效容量,\n  description={effective capacity},\n  sort={effective capacity},\n}\n\n\\newglossaryentry{linear_threshold_units}\n{\n  name=线性阈值单元,\n  description={linear threshold units},\n  sort={linear threshold units},\n}\n\n\\newglossaryentry{nonparametric}\n{\n  name=非参数,\n  description={non-parametric},\n  sort={non-parametric},\n}\n\n\\newglossaryentry{nearest_neighbor_regression}\n{\n  name=最近邻回归,\n  description={nearest neighbor regression},\n  sort={nearest neighbor regression},\n}\n\n\\newglossaryentry{nearest_neighbor}\n{\n  name=最近邻,\n  description={nearest neighbor},\n  sort={nearest neighbor},\n}\n\n\\newglossaryentry{bayes_error}\n{\n  name=贝叶斯误差,\n  description={Bayes error},\n  sort={Bayes error},\n}\n\n\\newglossaryentry{no_free_lunch_theorem}\n{\n  name=没有免费午餐定理,\n  description={no free lunch theorem},\n  sort={no free lunch theorem},\n}\n\n\\newglossaryentry{validation_set}\n{\n  name=验证集,\n  description={validation set},\n  sort={validation set},\n}\n\n\\newglossaryentry{benchmarks}\n{\n  name=基准,\n  description={bechmark},\n  sort={bechmark},\n}\n\n\\newglossaryentry{baseline}\n{\n  name=基准,\n  description={baseline},\n  sort={beseline}\n}\n\n\\newglossaryentry{point_estimator}\n{\n  name=点估计,\n  description={point estimator},\n  sort={point estimator},\n}\n\n\\newglossaryentry{estimator:chap5}\n{\n  name=估计量,\n  description={estimator},\n  sort={estimator},\n}\n\n\\newglossaryentry{statistics}\n{\n  name=统计量,\n  description={statistics},\n  sort={statistics},\n}\n\n\\newglossaryentry{unbiased}\n{\n  name=无偏,\n  description={unbiased},\n  sort={unbiased},\n}\n\n\\newglossaryentry{biased}\n{\n  name=有偏,\n  description={biased},\n  sort={biased},\n}\n\n\\newglossaryentry{asynchronous}\n{\n  name=异步,\n  description={asynchronous},\n  sort={asynchronous},\n}\n\n\\newglossaryentry{asymptotically_unbiased}\n{\n  name=渐近无偏,\n  description={asymptotically unbiased},\n  sort={asymptotically unbiased},\n}\n\n\\newglossaryentry{sample_mean}\n{\n  name=样本均值, %采样均值？\n  description={sample mean},\n  sort={sample mean},\n}\n\n\\newglossaryentry{sample_variance}\n{\n  name=样本方差, %采样方差？\n  description={sample variance},\n  sort={sample variance},\n}\n\n\\newglossaryentry{unbiased_sample_variance}\n{\n  name=无偏样本方差, %采样方差？\n  description={unbiased sample variance},\n  sort={unbiased sample variance},\n}\n\n\\newglossaryentry{standard_error}\n{\n  name=标准差,\n  description={standard error},\n  symbol={SE},\n  sort={standard error},\n}\n\n\\newglossaryentry{consistency}\n{\n  name=一致性,\n  description={consistency},\n  sort={consistency},\n}\n\n\\newglossaryentry{almost_sure}\n{\n  name=几乎必然,\n  description={almost sure},\n  sort={almost sure},\n}\n\n\\newglossaryentry{almost_sure_convergence}\n{\n  name=几乎必然收敛,\n  description={almost sure convergence},\n  sort={almost sure convergence},\n}\n\n\\newglossaryentry{statistical_efficiency}\n{\n  name=统计效率,\n  description={statistic efficiency},\n  sort={statistic efficiency},\n}\n\n\\newglossaryentry{parametric_case}\n{\n  name=有参情况,\n  description={parametric case},\n  sort={parametric case},\n}\n\n\\newglossaryentry{frequentist_statistics}\n{\n  name=频率派统计,\n  description={frequentist statistics},\n  sort={frequentist statistics},\n}\n\n\\newglossaryentry{bayesian_statistics}\n{\n  name=贝叶斯统计,\n  description={Bayesian statistics},\n  sort={Bayesian statistics},\n}\n\n\\newglossaryentry{prior_probability_distribution}\n{\n  name=先验概率分布,\n  description={prior probability distribution},\n  sort={prior probability distribution},\n}\n\n\\newglossaryentry{maximum_a_posteriori}\n{\n  name=最大后验,\n  description={maximum a posteriori},\n  sort={maximum a posteriori},\n}\n\n\\newglossaryentry{maximum_likelihood_estimation}\n{\n  name=最大似然估计,\n  description={maximum likelihood estimation},\n  sort={maximum likelihood estimation},\n}\n\n\\newglossaryentry{maximum_likelihood}\n{\n  name=最大似然,\n  description={maximum likelihood},\n  sort={maximum likelihood},\n}\n\n\\newglossaryentry{kernel_trick}\n{\n  name=核技巧,\n  description={kernel trick},\n  sort={kernel trick},\n}\n\n\\newglossaryentry{kernel}\n{\n  name=核函数,\n  description={kernel function},\n  sort={kernel function},\n}\n\n\\newglossaryentry{gaussian_kernel}\n{\n  name=高斯核,\n  description={Gaussian kernel},\n  sort={Gaussian kernel},\n}\n\n\\newglossaryentry{kernel_machines}\n{\n  name=核机器,\n  description={kernel machine},\n  sort={kernel machine},\n}\n\n\\newglossaryentry{kernel_methods}\n{\n  name=核方法,\n  description={kernel method},\n  sort={kernel method},\n}\n\n\\newglossaryentry{support_vectors}\n{\n  name=支持向量,\n  description={support vector},\n  sort={support vector},\n}\n\n\\newglossaryentry{SVM}\n{\n  name=支持向量机,\n  description={support vector machine},\n  symbol={SVM}\n}\n\n\\newglossaryentry{phoneme}\n{\n  name=音素,\n  description={phoneme},\n  sort={phoneme},\n}\n\n\\newglossaryentry{acoustic}\n{\n  name=声学,\n  description={acoustic},\n  sort={acoustic},\n}\n\n\\newglossaryentry{phonetic}\n{\n  name=语音,\n  description={phonetic},\n  sort={phonetic},\n}\n\n\\newglossaryentry{mixture_of_experts}\n{\n  name=专家混合体,\n  description={mixture of experts},\n  sort={mixture of experts},\n}\n\n\\newglossaryentry{gauss_mixture}\n{\n  name=高斯混合体,\n  description={Gaussian mixtures},\n  sort={Gaussian mixtures},\n}\n\n\\newglossaryentry{hard_mixture_of_experts}\n{\n  name=硬专家混合体, \n  description={hard mixture of experts},\n  sort={hard mixture of experts},\n}\n\n\\newglossaryentry{gater}\n{\n  name=选通器,\n  description={gater},\n  sort={gater},\n}\n\n\\newglossaryentry{expert_network}\n{\n  name=专家网络,\n  description={expert network},\n  sort={expert network},\n}\n\n\\newglossaryentry{attention_mechanism}\n{\n  name=注意力机制,\n  description={attention mechanism},\n  sort={attention mechanism},\n}\n\n\\newglossaryentry{fast_dropout}\n{\n  name=快速Dropout,\n  description={fast dropout},\n  sort={fast dropout},\n}\n\n\\newglossaryentry{dropout_boosting}\n{\n  name=Dropout Boosting,\n  description={Dropout Boosting},\n  sort={dropout boosting},\n}\n\n\\newglossaryentry{adversarial_example}\n{\n  name=对抗样本,\n  description={adversarial example},\n  sort={adversarial example},\n}\n\n\\newglossaryentry{adversarial}\n{\n  name=对抗,\n  description={adversarial},\n  sort={adversarial},\n}\n\n\\newglossaryentry{virtual_adversarial_example}\n{\n  name=虚拟对抗样本,\n  description={virtual adversarial example},\n  sort={virtual adversarial example},\n}\n\n\\newglossaryentry{adversarial_training}\n{\n  name=对抗训练,\n  description={adversarial training},\n  sort={adversarial training},\n}\n\n\\newglossaryentry{virtual_adversarial_training}\n{\n  name=虚拟对抗训练,\n  description={virtual adversarial training},\n  sort={virtual adversarial training}\n}\n\n\\newglossaryentry{tangent_distance}\n{\n  name=切面距离,\n  description={tangent distance},\n  sort={tangent distance},\n}\n\n\\newglossaryentry{tangent_prop}\n{\n  name=正切传播,\n  description={tangent prop},\n  sort={tangent prop},\n}\n\n\\newglossaryentry{tangent_propagation}\n{\n  name=正切传播,\n  description={tangent propagation}\n}\n\n\\newglossaryentry{double_backprop}\n{\n  name=双反向传播,\n  description={double backprop},\n  sort={double backprop},\n}\n\n\\newglossaryentry{EM}\n{\n  name=期望最大化,\n  description={expectation maximization},\n  sort={expectation maximization},\n  symbol={EM}\n}\n\n\\newglossaryentry{mean_field}\n{\n  name=均值场,\n  description={mean-field},\n  sort={mean-field},\n}\n\n\\newglossaryentry{ELBO}\n{\n  name=证据下界,\n  description={evidence lower bound},\n  sort={evidence lower bound},\n  symbol={ELBO}\n}\n\n\\newglossaryentry{variational_free_energy}\n{\n  name=变分自由能,\n  description={variational free energy},\n  sort={variational free energy},\n}\n\n\\newglossaryentry{structured_variational_inference}\n{\n  name=结构化变分推断,\n  description={structured variational inference},\n  sort={structured variational inference},\n}\n\n\\newglossaryentry{variational_inference}\n{\n  name=变分推断,\n  description={variational inference},\n  sort={variational inference},\n}\n\n\\newglossaryentry{binary_sparse_coding}\n{\n  name=二值稀疏编码,\n  description={binary sparse coding},\n  sort={binary sparse coding},\n}\n\n\\newglossaryentry{feedforward_network}\n{\n  name=前馈网络,\n  description={feedforward network},\n  sort={feedforward network},\n}\n\n\\newglossaryentry{transition}\n{\n  name=转移,\n  description={transition},\n  sort={transition},\n}\n\n\\newglossaryentry{reconstruction}\n{\n  name=重构,\n  description={reconstruction},\n  sort={reconstruction},\n}\n\n\\newglossaryentry{GSN}\n{\n  name=生成随机网络,\n  description={generative stochastic network},\n  sort={generative stochastic network},\n  symbol={GSN}\n}\n\n\\newglossaryentry{score_matching}\n{\n  name=得分匹配,\n  description={score matching},\n  sort={score matching},\n}\n\n\\newglossaryentry{factorial}\n{\n  name=因子,\n  description={factorial},\n  sort={factorial},\n}\n\n\\newglossaryentry{factorized}\n{\n  name=分解的,\n  description={factorized},\n  sort={factorized},\n}\n\n\\newglossaryentry{meanfield}\n{\n  name=均匀场,\n  description={meanfield},\n  sort={meanfield},\n}\n\n\\newglossaryentry{MLE}\n{\n  name=最大似然估计,\n  description={maximum likelihood estimation},\n  sort={maximum likelihood estimation},\n}\n\n\\newglossaryentry{PPCA}\n{\n  name=概率PCA,\n  description={probabilistic PCA},\n  sort={probabilistic PCA},\n  symbol={PPCA}\n}\n\n\\newglossaryentry{SGA}\n{\n  name=随机梯度上升,\n  description={Stochastic Gradient Ascent},\n  sort={Stochastic Gradient Ascent},\n}\n\n\\newglossaryentry{clique}\n{\n  name=团,\n  description={clique},\n  sort={clique},\n}\n\n\\newglossaryentry{dirac_distribution}\n{\n  name=Dirac分布,\n  description={dirac distribution},\n  sort={dirac distribution},\n}\n\n\\newglossaryentry{fixed_point_equation}\n{\n  name=不动点方程,\n  description={fixed point equation},\n  sort={fixed point equation},\n}\n\n\\newglossaryentry{calculus_of_variations}\n{\n  name=变分法,\n  description={calculus of variations},\n  sort={calculus of variations},\n}\n\n\\newglossaryentry{wake_sleep}\n{\n  name=醒眠,\n  description={wake sleep},\n  sort={wake sleep},\n}\n\n\\newglossaryentry{BN}\n{\n  name=信念网络,\n  description={belief network},\n  sort={belief network},\n}\n\n\\newglossaryentry{MRF}\n{\n  name=马尔可夫随机场,\n  description={Markov random field},\n  sort={Markov random field},\n  symbol={MRF}\n}\n\n\\newglossaryentry{markov_network}\n{\n  name=马尔可夫网络,\n  description={Markov network},\n  sort={Markov network},\n}\n\n\\newglossaryentry{log_linear_model}\n{\n  name=对数线性模型,\n  description={log-linear model},\n  sort={log-linear model},\n}\n\n\\newglossaryentry{product_of_expert}\n{\n  name=专家之积,\n  description={product of expert},\n  sort={product of expert},\n}\n\n\\newglossaryentry{free_energy}\n{\n  name=自由能,\n  description={free energy},\n  sort={free energy},\n}\n\n\\newglossaryentry{harmony}\n{\n  name=harmony,\n  description={harmony},\n  sort={harmony},\n}\n\n\\newglossaryentry{separation}\n{\n  name=分离,\n  description={separation},\n  sort={separation},\n}\n\n\\newglossaryentry{separate}\n{\n  name=分离的,\n  description={separate},\n  sort={separate},\n}\n\n\\newglossaryentry{dseparation}\n{\n  name=d-分离,\n  description={d-separation},\n  sort={d-separation},\n}\n\n\\newglossaryentry{local_conditional_probability_distribution}\n{\n  name=局部条件概率分布,\n  description={local conditional probability distribution},\n  sort={local conditional probability distribution},\n}\n\n\\newglossaryentry{conditional_probability_distribution}\n{\n  name=条件概率分布,\n  description={conditional probability distribution}\n}\n\n\\newglossaryentry{boltzmann_distribution}\n{\n  name=玻尔兹曼分布,\n  description={Boltzmann distribution},\n  sort={Boltzmann distribution},\n}\n\n\\newglossaryentry{gibbs_distribution}\n{\n  name=吉布斯分布,\n  description={Gibbs distribution},\n  sort={Gibbs distribution},\n}\n\n\\newglossaryentry{energy_function}\n{\n  name=能量函数,\n  description={energy function},\n  sort={energy function},\n}\n\n\\newglossaryentry{immorality}\n{\n  name=不道德,\n  description={immorality},\n  sort={immorality},\n}\n\n\\newglossaryentry{moralization}\n{\n  name=道德化,\n  description={moralization},\n  sort={moralization},\n}\n\n\\newglossaryentry{moralized_graph}\n{\n  name=道德图,\n  description={moralized graph},\n  sort={moralized graph},\n}\n\n\\newglossaryentry{standard_deviation}\n{\n  name=标准差,\n  description={standard deviation},\n  symbol={SD},\n  sort={standard deviation},\n}\n\n\\newglossaryentry{correlation}\n{\n  name=相关系数,\n  description={correlation},\n  sort={correlation},\n}\n\n\\newglossaryentry{standard_normal_distribution}\n{\n  name=标准正态分布,\n  description={standard normal distribution},\n  sort={standard normal distribution},\n}\n\n\\newglossaryentry{covariance_matrix}\n{\n  name=协方差矩阵,\n  description={covariance matrix},\n  sort={covariance matrix},\n}\n\n\\newglossaryentry{bernoulli_distribution}\n{\n  name=Bernoulli分布,\n  description={Bernoulli distribution},\n  sort={Bernoulli distribution},\n}\n\n\\newglossaryentry{bernoulli_output_distribution}\n{\n  name=Bernoulli输出分布,\n  description={Bernoulli output distribution},\n  sort={Bernoulli output distribution},\n}\n\n\\newglossaryentry{multinoulli_distribution}\n{\n  name=Multinoulli分布,\n  description={multinoulli distribution},\n  sort={multinoulli distribution},\n}\n\n\\newglossaryentry{multinoulli_output_distribution}\n{\n  name=Multinoulli输出分布,\n  description={multinoulli output distribution},\n  sort={multinoulli output distribution},\n}\n\n\\newglossaryentry{categorical_distribution}\n{\n  name=范畴分布,\n  description={categorical distribution},\n  sort={categorical distribution},\n}\n\n\\newglossaryentry{multinomial_distribution}\n{\n  name=多项式分布,\n  description={multinomial distribution},\n  sort={multinomial distribution},\n}\n\n\\newglossaryentry{normal_distribution}\n{\n  name=正态分布,\n  description={normal distribution},\n  sort={normal distribution},\n}\n\n\\newglossaryentry{gaussian_distribution}\n{\n  name=高斯分布,\n  description={Gaussian distribution},\n  sort={Gaussian distribution},\n}\n\n\\newglossaryentry{precision}\n{\n  name=精度,\n  description={precision},\n  sort={precision},\n}\n\n\\newglossaryentry{multivariate_normal_distribution}\n{\n  name=多维正态分布,\n  description={multivariate normal distribution},\n  sort={multivariate normal distribution},\n}\n\n\\newglossaryentry{precision_matrix}\n{\n  name=精度矩阵,\n  description={precision matrix},\n  sort={precision matrix},\n}\n\n\\newglossaryentry{isotropic}\n{\n  name=各向同性,\n  description={isotropic},\n  sort={isotropic},\n}\n\n\\newglossaryentry{exponential_distribution}\n{\n  name=指数分布,\n  description={exponential distribution},\n  sort={exponential distribution},\n}\n\n\\newglossaryentry{indicator_function}\n{\n  name=指示函数,\n  description={indicator function},\n  sort={indicator function},\n}\n\n\\newglossaryentry{laplace_distribution}\n{\n  name=Laplace分布,\n  description={Laplace distribution},\n  sort={Laplace distribution},\n}\n\n\\newglossaryentry{dirac_delta_function}\n{\n  name=Dirac delta函数,\n  description={Dirac delta function},\n  sort={Dirac delta function},\n}\n\n\\newglossaryentry{generalized_function}\n{\n  name=广义函数,\n  description={generalized function},\n  sort={generalized function},\n}\n\n\\newglossaryentry{empirical_distribution}\n{\n  name=经验分布,\n  description={empirical distribution},\n  sort={empirical distribution},\n}\n\n\\newglossaryentry{empirical_frequency}\n{\n  name=经验频率,\n  description={empirical frequency},\n  sort={empirical frequency},\n}\n\n\\newglossaryentry{mixture_distribution}\n{\n  name=混合分布,\n  description={mixture distribution},\n  sort={mixture distribution},\n}\n\n\\newglossaryentry{latent_variable}\n{\n  name=潜变量,\n  description={latent variable},\n  sort={latent variable},\n}\n\n\\newglossaryentry{hidden_variable}\n{\n  name=隐藏变量,\n  description={hidden variable},\n  sort={hidden variable},\n}\n\n\\newglossaryentry{prior_probability}\n{\n  name=先验概率,\n  description={prior probability},\n  sort={prior probability},\n}\n\n\\newglossaryentry{posterior_probability}\n{\n  name=后验概率,\n  description={posterior probability},\n  sort={posterior probability},\n}\n\n\\newglossaryentry{universal_approximator}\n{\n  name=万能近似器,\n  description={universal approximator},\n  sort={universal approximator},\n}\n\n\\newglossaryentry{universal_function_approximator}\n{\n  name=万能函数近似器,\n  description={universal function approximator},\n  sort={universal function approximator},\n}\n\n\\newglossaryentry{logistic_sigmoid}\n{\n  name=logistic sigmoid,\n  description={logistic sigmoid},\n  sort={logistic sigmoid},\n}\n\n\\newglossaryentry{sigmoid}\n{\n  name=sigmoid,\n  description={sigmoid},\n  sort={sigmoid},\n}\n\n\\newglossaryentry{saturate}\n{\n  name=饱和,\n  description={saturate},\n  sort={saturate},\n}\n\n\\newglossaryentry{softplus_function}\n{\n  name=softplus函数,\n  description={softplus function},\n  sort={softplus function},\n}\n\n\\newglossaryentry{logit}\n{\n  name=分对数,\n  description={logit},\n  sort={logit},\n}\n\n\\newglossaryentry{positive_part_function}\n{\n  name=正部函数,\n  description={positive part function},\n  sort={positive part function},\n}\n\n\\newglossaryentry{negative part function}\n{\n  name=负部函数,\n  description={negative part function},\n  sort={negative part function},\n}\n\n\\newglossaryentry{bayes_rule}\n{\n  name=贝叶斯规则,\n  description={Bayes' rule},\n  sort={Bayes' rule},\n}\n\n\\newglossaryentry{measure_theory}\n{\n  name=测度论,\n  description={measure theory},\n  sort={measure theory},\n}\n\n\\newglossaryentry{measure_zero}\n{\n  name=零测度,\n  description={measure zero},\n  sort={measure zero},\n}\n\n\\newglossaryentry{almost_everywhere}\n{\n  name=几乎处处,\n  description={almost everywhere},\n  sort={almost everywhere},\n}\n\n\\newglossaryentry{jacobian_matrix}\n{\n  name=Jacobian矩阵,\n  description={Jacobian matrix},\n  sort={Jacobian matrix},\n}\n\n\\newglossaryentry{self_information}\n{\n  name=自信息,\n  description={self-information},\n  sort={self-information},\n}\n\n\\newglossaryentry{nats}\n{\n  name=奈特,\n  description={nats},\n  sort={nats},\n}\n\n\\newglossaryentry{bits}\n{\n  name=比特,\n  description={bit},\n  sort={bit},\n}\n\n\\newglossaryentry{shannons}\n{\n  name=香农,\n  description={shannons},\n  sort={shannons},\n}\n\n\\newglossaryentry{Shannon_entropy}\n{\n  name=香农熵,\n  description={Shannon entropy},\n  sort={Shannon entropy},\n}\n\n\\newglossaryentry{differential_entropy}\n{\n  name=微分熵,\n  description={differential entropy},\n  sort={differential entropy},\n}\n\n\\newglossaryentry{differential_equation}\n{\n  name=微分方程,\n  description={differential equation},\n  sort={differential equation},\n}\n\n\\newglossaryentry{KL_divergence}\n{\n  name=KL散度,\n  description={Kullback-Leibler (KL) divergence},\n  sort={Kullback-Leibler (KL) divergence},\n}\n\n\\newglossaryentry{cross_entropy}\n{\n  name=交叉熵,\n  description={cross-entropy},\n  sort={cross-entropy},\n}\n\n\\newglossaryentry{entropy}\n{\n  name=熵,\n  description={entropy},\n  sort={entropy},\n}\n\n\\newglossaryentry{factorization}\n{\n  name=分解,\n  description={factorization},\n  sort={factorization},\n}\n\n\\newglossaryentry{structured_probabilistic_model}\n{\n  name=结构化概率模型,\n  description={structured probabilistic model},\n  sort={structured probabilistic model},\n}\n\n\\newglossaryentry{graphical_model}\n{\n  name=图模型,\n  description={graphical model},\n  sort={graphical model},\n}\n\n\\newglossaryentry{backoff}\n{\n  name=回退,\n  description={back-off},\n  sort={back-off},\n}\n\n\\newglossaryentry{directed}\n{\n  name=有向,\n  description={directed},\n  sort={directed},\n}\n\n\\newglossaryentry{undirected}\n{\n  name=无向,\n  description={undirected},\n  sort={undirected},\n}\n\n\\newglossaryentry{undirected_graphical_model}\n{\n  name=无向图模型,\n  description={undirected graphical model}\n}\n\n\\newglossaryentry{proportional}\n{\n  name=成比例,\n  description={proportional},\n  sort={proportional},\n}\n\n\\newglossaryentry{description}\n{\n  name=描述,\n  description={description},\n  sort={description},\n}\n\n\\newglossaryentry{decision_tree}\n{\n  name=决策树,\n  description={decision tree},\n  sort={decision tree},\n}\n\n\\newglossaryentry{factor_graph}\n{\n  name=因子图,\n  description={factor graph},\n  sort={factor graph},\n}\n\n\\newglossaryentry{structure_learning}\n{\n  name=结构学习,\n  description={structure learning},\n  sort={structure learning},\n}\n\n\\newglossaryentry{loopy_belief_propagation}\n{\n  name=环状信念传播,\n  description={loopy belief propagation},\n  sort={loopy belief propagation},\n}\n\n\\newglossaryentry{harmonium}\n{\n  name=簧风琴,\n  description={harmonium},\n  sort={harmonium},\n}\n\n\\newglossaryentry{convolutional_network}\n{\n  name=卷积网络,\n  description={convolutional network},\n  sort={convolutional network},\n}\n\n\\newglossaryentry{convolutional_net}\n{\n  name=卷积网络,\n  description={convolutional net},\n  sort={convolutional net},\n}\n\n\\newglossaryentry{main_diagonal}\n{\n  name=主对角线,\n  description={main diagonal},\n  sort={main diagonal},\n}\n\n\\newglossaryentry{transpose}\n{\n  name=转置,\n  description={transpose},\n  sort={transpose},\n}\n\n\\newglossaryentry{broadcasting}\n{\n  name=广播,\n  description={broadcasting},\n  sort={broadcasting},\n}\n\n\\newglossaryentry{matrix_product}\n{\n  name=矩阵乘积,\n  description={matrix product},\n  sort={matrix product},\n}\n\n\\newglossaryentry{adagrad}\n{\n  name=AdaGrad,\n  description={AdaGrad},\n  sort={AdaGrad},\n}\n\n\\newglossaryentry{element_wise_product}\n{\n  name=元素对应乘积,\n  description={element-wise product},\n  sort={element-wise product},\n}\n\n\\newglossaryentry{hadamard_product}\n{\n  name=Hadamard乘积,\n  description={Hadamard product},\n  sort={Hadamard product},\n}\n\n\\newglossaryentry{clique_potential}\n{\n  name=团势能,\n  description={clique potential},\n  sort={clique potential},\n}\n\n\\newglossaryentry{factor}\n{\n  name=因子,\n  description={factor},\n  sort={factor},\n}\n\n\\newglossaryentry{unnormalized_probability_function}\n{\n  name=未归一化概率函数,\n  description={unnormalized probability function},\n  sort={unnormalized probability function},\n}\n\n\\newglossaryentry{recurrent_network}\n{\n  name=循环网络,\n  description={recurrent network},\n  sort={recurrent network},\n}\n\n\\newglossaryentry{vanish_explode_gradient}\n{\n  name=梯度消失与爆炸问题,\n  description={vanishing and exploding gradient problem},\n  sort={vanishing and exploding gradient problem },\n}\n\n\\newglossaryentry{vanish_gradient}\n{\n  name=梯度消失,\n  description={vanishing gradient},\n  sort={vanishing gradient},\n}\n\n\\newglossaryentry{explode_gradient}\n{\n  name=梯度爆炸,\n  description={exploding gradient},\n  sort={exploding gradient},\n}\n\n\\newglossaryentry{computational_graph}\n{\n  name=计算图,\n  description={computational graph},\n  sort={computational graph},\n}\n\n\\newglossaryentry{unfolding}\n{\n  name=展开,\n  description={unfolding},\n  sort={unfolding},\n}\n\n\\newglossaryentry{invert}\n{\n  name=求逆,\n  description={invert},\n  sort={invert},\n}\n\n\\newglossaryentry{time_step}\n{\n  name=时间步,\n  description={time step},\n  sort={time step},\n}\n\n\\newglossaryentry{n_gram}\n{\n  name=$n$-gram,\n  description={n-gram},\n  sort={n-gram},\n}\n\n\\newglossaryentry{curse_of_dimensionality}\n{\n  name=维数灾难,\n  description={curse of dimensionality},\n  sort={curse of dimensionality},\n}\n\n\\newglossaryentry{smoothness_prior}\n{\n  name=平滑先验,\n  description={smoothness prior},\n  sort={smoothness prior},\n}\n\n\\newglossaryentry{local_constancy_prior}\n{\n  name=局部不变性先验,\n  description={local constancy prior},\n  sort={local constancy prior},\n}\n\n\\newglossaryentry{local_kernel}\n{\n  name=局部核,\n  description={local kernel},\n  sort={local kernel},\n}\n\n\\newglossaryentry{manifold}\n{\n  name=流形,\n  description={manifold},\n  sort={manifold},\n}\n\n\\newglossaryentry{manifold_tangent_classifier}\n{\n  name=流形正切分类器,\n  description={manifold tangent classifier}\n}\n\n\\newglossaryentry{manifold_learning}\n{\n  name=流形学习,\n  description={manifold learning},\n  sort={manifold learning},\n}\n\n\\newglossaryentry{manifold_hypothesis}\n{\n  name=流形假设,\n  description={manifold hypothesis},\n  sort={manifold hypothesis},\n}\n\n\\newglossaryentry{loop}\n{\n  name=环,\n  description={loop},\n  sort={loop},\n}\n\n\\newglossaryentry{chord}\n{\n  name=弦,\n  description={chord},\n  sort={chord},\n}\n\n\\newglossaryentry{chordal_graph}\n{\n  name=弦图,\n  description={chordal graph},\n  sort={chordal graph},\n}\n\n\\newglossaryentry{triangulated_graph}\n{\n  name=三角形化图,\n  description={triangulated graph},\n  sort={triangulated graph},\n}\n\n\\newglossaryentry{triangulate}\n{\n  name=三角形化,\n  description={triangulate},\n  sort={triangulate},\n}\n\n\\newglossaryentry{risk}\n{\n  name=风险,\n  description={risk},\n  sort={risk},\n}\n\n\\newglossaryentry{empirical_risk}\n{\n  name=经验风险,\n  description={empirical risk},\n  sort={empirical risk},\n}\n\n\\newglossaryentry{empirical_risk_minimization}\n{\n  name=经验风险最小化,\n  description={empirical risk minimization},\n  sort={empirical risk minimization},\n}\n\n\\newglossaryentry{surrogate_loss_function}\n{\n  name=代理损失函数,\n  description={surrogate loss function},\n  sort={surrogate loss function},\n}\n\n\\newglossaryentry{batch}\n{\n  name=批量,\n  description={batch},\n  sort={batch},\n}\n\n\\newglossaryentry{deterministic}\n{\n  name=确定性,\n  description={deterministic},\n  sort={deterministic},\n}\n\n\\newglossaryentry{stochastic}\n{\n  name=随机,\n  description={stochastic},\n  sort={stochastic},\n}\n\n\\newglossaryentry{online}\n{\n  name=在线,\n  description={online},\n  sort={online},\n}\n\n\\newglossaryentry{minibatch_stochastic}\n{\n  name=小批量随机, %小批量\n  description={minibatch stochastic},\n  sort={minibatch stochastic},\n}\n\n\\newglossaryentry{stream}\n{\n  name=流,\n  description={stream},\n  sort={stream},\n}\n\n\\newglossaryentry{model_identifiability}\n{\n  name=模型可辨识性,\n  description={model identifiability},\n  sort={model identifiability},\n}\n\n\\newglossaryentry{weight_space_symmetry}\n{\n  name=权重空间对称性,\n  description={weight space symmetry},\n  sort={weight space symmetry},\n}\n\n\\newglossaryentry{saddle_free_newton_method}\n{\n  name=无鞍牛顿法,\n  description={saddle-free Newton method},\n  sort={saddle-free Newton method},\n}\n\n\\newglossaryentry{gradient_clipping} \n{\n  name=梯度截断,\n  description={gradient clipping},\n  sort={gradient clipping},\n}\n\n\\newglossaryentry{power_method}\n{\n  name=幂方法,\n  description={power method},\n  sort={power method},\n}\n\n\\newglossaryentry{linear_factor}\n{\n  name=线性因子模型,\n  description={linear factor model},\n  sort={linear factor model},\n}\n\n\\newglossaryentry{forward_propagation}\n{\n  name=前向传播,\n  description={forward propagation},\n  sort={forward propagation},\n}\n\n\\newglossaryentry{backward_propagation}\n{\n  name=反向传播,\n  description={backward propagation},\n  sort={backward propagation},\n}\n\n\\newglossaryentry{unfolded_graph}\n{\n  name=展开图,\n  description={unfolded graph},\n  sort={unfolded graph},\n}\n\n\\newglossaryentry{BPTT}\n{\n  name=通过时间反向传播,\n  description={back-propagation through time},\n  sort={back-propagation through time},\n  symbol={BPTT}\n}\n\n\\newglossaryentry{teacher_forcing}\n{\n  name=导师驱动过程,\n  description={teacher forcing},\n  sort={teacher forcing},\n}\n\n\\newglossaryentry{stationary}\n{\n  name=平稳的,\n  description={stationary},\n  sort={stationary},\n}\n\n\\newglossaryentry{deep_feedforward_network}\n{\n  name=深度前馈网络,\n  description={deep feedforward network},\n  sort={deep feedforward network},\n}\n\n\\newglossaryentry{feedforward_neural_network}\n{\n  name=前馈神经网络,\n  description={feedforward neural network},\n  sort={feedforward neural network},\n}\n\n\\newglossaryentry{feedforward}\n{\n  name=前向,\n  description={feedforward},\n  sort={feedforward},\n}\n\n\\newglossaryentry{feedback}\n{\n  name=反馈,\n  description={feedback},\n  sort={feedback},\n}\n\n\\newglossaryentry{network}\n{\n  name=网络,\n  description={network},\n  sort={network},\n}\n\n\\newglossaryentry{first_layer}\n{\n  name=第一层,\n  description={first layer},\n  sort={first layer},\n}\n\n\\newglossaryentry{second_layer}\n{\n  name=第二层,\n  description={second layer},\n  sort={second layer},\n}\n\n\\newglossaryentry{depth}\n{\n  name=深度,\n  description={depth},\n  sort={depth},\n}\n\n\\newglossaryentry{output_layer}\n{\n  name=输出层,\n  description={output layer},\n  sort={output layer},\n}\n\n\\newglossaryentry{hidden_layer}\n{\n  name=隐藏层,\n  description={hidden layer},\n  sort={hidden layer},\n}\n\n\\newglossaryentry{width}\n{\n  name=宽度,\n  description={width},\n  sort={width},\n}\n\n\\newglossaryentry{unit}\n{\n  name=单元,\n  description={unit},\n  sort={unit},\n}\n\n\\newglossaryentry{activation_function}\n{\n  name=激活函数,\n  description={activation function},\n  sort={activation function},\n}\n\n\\newglossaryentry{dbd}\n{\n  name=delta-bar-delta,\n  description={delta-bar-delta},\n  sort={delta-bar-delta},\n}\n\n\\newglossaryentry{gaussian_output_distribution}\n{\n  name=高斯输出分布,\n  description={Gaussian output distribution},\n  sort={Gaussian output distribution},\n}\n\n\\newglossaryentry{back_propagation}\n{\n  name=反向传播,\n  description={back propagation},\n  sort={back propagation},\n}\n\n\\newglossaryentry{back_propagate}\n{\n  name=反向传播,\n  description={back propagate},\n  sort={back propagate},\n}\n\n\\newglossaryentry{BP}\n{\n  name=反向传播,\n  description={backprop},\n  sort={backprop},\n  symbol={BP}\n}\n\n\\newglossaryentry{functional}\n{\n  name=泛函,\n  description={functional},\n  sort={functional},\n}\n\n\\newglossaryentry{mean_absolute_error}\n{\n  name=平均绝对误差,\n  description={mean absolute error},\n  sort={mean absolute error},\n}\n\n\\newglossaryentry{winner_take_all}\n{\n  name=赢者通吃,\n  description={winner-take-all},\n  sort={winner-take-all},\n}\n\n\\newglossaryentry{heteroscedastic}\n{\n  name=异方差,\n  description={heteroscedastic},\n  sort={heteroscedastic},\n}\n\n\\newglossaryentry{mixture_density_network}\n{\n  name=混合密度网络,\n  description={mixture density network},\n  sort={mixture density network},\n}\n\n\\newglossaryentry{clip_gradients}\n{\n  name=梯度截断,\n  description={clip gradient},\n  sort={clip gradient},\n}\n\n\\newglossaryentry{absolute_value_rectification}\n{\n  name=绝对值整流,\n  description={absolute value rectification},\n  sort={absolute value rectification},\n}\n\n\\newglossaryentry{leaky_ReLU}   %有没有更好的翻译\n{\n  name=渗漏整流线性单元,\n  description={Leaky ReLU},\n  sort={Leaky ReLU},\n  symbol={Leaky ReLU}\n}\n\n\\newglossaryentry{PReLU}\n{\n  name=参数化整流线性单元,\n  description={parametric ReLU},\n  sort={parametric ReLU},\n  symbol={PReLU}\n}\n\n\\newglossaryentry{maxout_unit}\n{\n  name=maxout单元,\n  description={maxout unit},\n  sort={maxout unit},\n}\n\n\\newglossaryentry{maxout}\n{\n  name=maxout,\n  description={maxout},\n  symbol={maxout}\n}\n\n\\newglossaryentry{catastrophic_forgetting}\n{\n  name=灾难遗忘,\n  description={catastrophic forgetting},\n  sort={catastrophic forgetting},\n}\n\n\\newglossaryentry{RBF}\n{\n  name=径向基函数,\n  description={radial basis function},\n  sort={radial basis function},\n  symbol={RBF}\n}\n\n\\newglossaryentry{softplus}\n{\n  name=softplus,\n  description={softplus},\n  sort={softplus},\n}\n\n\\newglossaryentry{hard_tanh}\n{\n  name=硬双曲正切函数,\n  description={hard tanh},\n  sort={hard tanh},\n}\n\n\\newglossaryentry{architecture}\n{\n  name=架构,\n  description={architecture},\n  sort={architecture},\n}\n\n\\newglossaryentry{universal_approximation_theorem}\n{\n  name=万能近似定理, %万能逼近定理?\n  description={universal approximation theorem},\n  sort={universal approximation theorem},\n}\n\n\\newglossaryentry{operation}\n{\n  name=操作,\n  description={operation},\n  sort={operation},\n}\n\n\\newglossaryentry{symbol}\n{\n  name=符号,\n  description={symbol},\n  sort={symbol},\n}\n\n\\newglossaryentry{numeric_value}\n{\n  name=数值,\n  description={numeric value},\n  sort={numeric value},\n}\n\n\\newglossaryentry{dynamic_programming}\n{\n  name=动态规划,\n  description={dynamic programming},\n  sort={dynamic programming},\n}\n\n\\newglossaryentry{automatic_differentiation}\n{\n  name=自动微分,\n  description={automatic differentiation},\n  sort={automatic differentiation},\n}\n\n\\newglossaryentry{reverse_mode_accumulation}\n{\n  name=反向模式累加,\n  description={reverse mode accumulation},\n  sort={reverse mode accumulation},\n}\n\n\\newglossaryentry{forward_mode_accumulation}\n{\n  name=前向模式累加,\n  description={forward mode accumulation},\n  sort={forward mode accumulation},\n}\n\n\\newglossaryentry{Krylov_methods}\n{\n  name=Krylov方法,\n  description={Krylov method},\n  sort={Krylov method},\n}\n\n\\newglossaryentry{parallel_distributed_processing}\n{\n  name=并行分布式处理,\n  description={Parallel Distributed Processing},\n  sort={Parallel Distributed Processing},\n}\n\n\\newglossaryentry{sparse_activation}\n{\n  name=稀疏激活,\n  description={sparse activation},\n  sort={sparse activation},\n}\n\n\\newglossaryentry{damping}\n{\n  name=衰减,\n  description={damping},\n  sort={damping},\n}\n\n\\newglossaryentry{learned}\n{\n  name=学成,\n  description={learned},\n  sort={learned},\n}\n\n\\newglossaryentry{message_passing}\n{\n  name=信息传输,\n  description={message passing},\n  sort={message passing},\n}\n\n\\newglossaryentry{functional_derivative}\n{\n  name=泛函导数,\n  description={functional derivative},\n  sort={functional derivative},\n}\n\n\\newglossaryentry{variational_derivative}\n{\n  name=变分导数,\n  description={variational derivative},\n  sort={variational derivative},\n}\n\n\\newglossaryentry{excess_error}\n{\n  name=额外误差,\n  description={excess error},\n  sort={excess error},\n}\n\n\\newglossaryentry{momentum}\n{\n  name=动量,\n  description={momentum},\n  sort={momentum},\n}\n\n\\newglossaryentry{nmomentum}\n{\n  name=Nesterov 动量,\n  description={Nesterov momentum},\n  sort={Nesterov momentum},\n}\n\n\\newglossaryentry{chaos}\n{\n  name=混沌,\n  description={chaos},\n  sort={chaos},\n}\n\n\\newglossaryentry{normalized_initialization}\n{\n  name=标准初始化, % ??\n  description={normalized initialization},\n  sort={normalized initialization},\n}\n\n\\newglossaryentry{sparse_initialization}\n{\n  name=稀疏初始化,\n  description={sparse initialization},\n  sort={sparse initialization},\n}\n\n\\newglossaryentry{conjugate_directions}\n{\n  name=共轭方向,\n  description={conjugate directions},\n  sort={conjugate directions},\n}\n\n\\newglossaryentry{conjugate}\n{\n  name=共轭,\n  description={conjugate},\n  sort={conjugate},\n}\n\n\\newglossaryentry{conditional_independent}\n{\n  name=条件独立,\n  description={conditionally independent},\n  sort={conditionally independent},\n}\n\n\\newglossaryentry{ensemble_learning}\n{\n  name=集成学习,\n  description={ensemble learning},\n  sort={ensemble learning},\n}\n\n\\newglossaryentry{NICE}\n{\n  name=非线性独立成分估计,\n  description={nonlinear independent components estimation},\n  sort={nonlinear independent components estimation},\n  symbol={NICE}\n}\n\n\\newglossaryentry{ISA}\n{\n  name=独立子空间分析,\n  description={independent subspace analysis},\n  sort={independent subspace analysis},\n}\n\n\\newglossaryentry{SFA}\n{\n  name=慢特征分析,\n  description={slow feature analysis},\n  sort={slow feature analysis},\n  symbol={SFA}\n}\n\n\\newglossaryentry{slow_principle}\n{\n  name=慢性原则,\n  description={slowness principle},\n  sort={slowness principle},\n}\n\n\\newglossaryentry{rectified_linear}\n{\n  name=整流线性,\n  description={rectified linear},\n  sort={rectified linear},\n}\n\n\\newglossaryentry{rectified_linear_transformation}\n{\n  name=整流线性变换,\n  description={rectified linear transformation},\n  sort={rectified linear transformation},\n}\n\n\\newglossaryentry{rectifier_network}\n{\n  name=整流网络,\n  description={rectifier network},\n  sort={rectifier network},\n}\n\n\\newglossaryentry{coordinate_descent}\n{\n  name=坐标下降,\n  description={coordinate descent},\n  sort={coordinate descent},\n}\n\n\\newglossaryentry{coordinate_ascent}\n{\n  name=坐标上升,\n  description={coordinate ascent},\n  sort={coordinate ascent},\n}\n\n\\newglossaryentry{block_coordinate_descent}\n{\n  name=块坐标下降,\n  description={block coordinate descent},\n  sort={block coordinate descent},\n}\n\n\\newglossaryentry{pretraining}\n{\n  name=预训练,\n  description={pretraining},\n  sort={pretraining},\n}\n\n\\newglossaryentry{unsupervised_pretraining}\n{\n  name=无监督预训练,\n  description={unsupervised pretraining},\n  sort={unsupervised pretraining},\n}\n\n\\newglossaryentry{greedy_layer_wise_unsupervised_pretraining}\n{\n  name=贪心逐层无监督预训练,\n  description={greedy layer-wise unsupervised pretraining},\n  sort={greedy layer-wise unsupervised pretraining},\n}\n\n\\newglossaryentry{greedy_layer_wise_pretraining}\n{\n  name=贪心逐层预训练,\n  description={greedy layer-wise pretraining},\n  sort={greedy layer-wise pretraining},\n}\n\n\\newglossaryentry{greedy_layer_wise_training}\n{\n  name=贪心逐层训练,\n  description={greedy layer-wise training},\n  sort={greedy layer-wise training},\n}\n\n\\newglossaryentry{layer_wise}\n{\n  name=逐层的,\n  description={layer-wise},\n  sort={layer-wise},\n}\n\n\\newglossaryentry{greedy_algorithm}\n{\n  name=贪心算法,\n  description={greedy algorithm},\n  sort={greedy algorithm},\n}\n\n\\newglossaryentry{greedy}\n{\n  name=贪心,\n  description={greedy},\n  sort={greedy},\n}\n\n\\newglossaryentry{fine_tuning}\n{\n  name=精调,\n  description={fine-tuning},\n  sort={fine-tuning},\n}\n\n\\newglossaryentry{greedy_supervised_pretraining}\n{\n  name=贪心监督预训练,\n  description={greedy supervised pretraining},\n  sort={greedy supervised pretraining},\n}\n\n\\newglossaryentry{continuation_method}\n{\n  name=延拓法,\n  description={continuation method},\n  sort={continuation method},\n}\n\n\\newglossaryentry{curriculum_learning}\n{\n  name=课程学习,\n  description={curriculum learning},\n  sort={curriculum learning},\n}\n\n\\newglossaryentry{shaping}\n{\n  name=塑造, % ？ 整形\n  description={shaping},\n  sort={shaping},\n}\n\n\\newglossaryentry{stochastic_curriculum}\n{\n  name=随机课程,\n  description={stochastic curriculum},\n  sort={stochastic curriculum},\n}\n\n\\newglossaryentry{recall}\n{\n  name=召回率,\n  description={recall},\n  sort={recall},\n}\n\n\\newglossaryentry{coverage}\n{\n  name=覆盖,\n  description={coverage},\n  sort={coverage},\n}\n\n\\newglossaryentry{hyperparameter_optimization}\n{\n  name=超参数优化,\n  description={hyperparameter optimization},\n  sort={hyperparameter optimization},\n}\n\n\\newglossaryentry{hyperparameter}\n{\n  name=超参数,\n  description={hyperparameter},\n  sort={hyperparameter}\n}\n\n\\newglossaryentry{grid_search}\n{\n  name=网格搜索,\n  description={grid search},\n  sort={grid search},\n}\n\n\\newglossaryentry{finite_difference}\n{\n  name=有限差分,\n  description={finite difference},\n  sort={finite difference},\n}\n\n\\newglossaryentry{centered_difference}\n{\n  name=中心差分,\n  description={centered difference},\n  sort={centered difference},\n}\n\n\\newglossaryentry{e_step}\n{\n  name=E步,\n  description={expectation step},\n  sort={expectation step},\n  symbol={E step}\n}\n\n\\newglossaryentry{m_step}\n{\n  name=M步,\n  description={maximization step},\n  sort={maximization step},\n  symbol={M step}\n}\n\n\\newglossaryentry{euler_lagrange_eqn}\n{\n  name=欧拉-拉格朗日方程,\n  description={Euler-Lagrange Equation},\n  sort={Euler-Lagrange Equation},\n}\n\n\\newglossaryentry{lagrange_multi}\n{\n  name=拉格朗日乘子,\n  description={Lagrange multiplier},\n  sort={Lagrange multiplier},\n}\n\n\\newglossaryentry{ESN}\n{\n  name=回声状态网络,\n  description={echo state network},\n  sort={echo state network},\n  symbol={ESN}\n}\n\n\\newglossaryentry{liquid_state_machines}\n{\n  name=流体状态机,\n  description={liquid state machine},\n  sort={liquid state machine},\n}\n\n\\newglossaryentry{reservoir_computing}\n{\n  name=储层计算,\n  description={reservoir computing},\n  sort={reservoir computing},\n}\n\n\\newglossaryentry{spectral_radius}\n{\n  name=谱半径,\n  description={spectral radius},\n  sort={spectral radius},\n}\n\n\\newglossaryentry{contractive}\n{\n  name=收缩,\n  description={contractive},\n  sort={contractive},\n}\n\n\\newglossaryentry{long_term_dependency}\n{\n  name=长期依赖,\n  description={long-term dependency},\n  sort={long-term dependency},\n}\n\n\\newglossaryentry{skip_connection}\n{\n  name=跳跃连接,\n  description={skip connection},\n  sort={skip connection},\n}\n\n\\newglossaryentry{leaky_unit}\n{\n  name=渗漏单元,\n  description={leaky unit},\n  sort={leaky unit},\n}\n\n\\newglossaryentry{gated_rnn}\n{\n  name=门控RNN,\n  description={gated RNN},\n  sort={gated RNN},\n}\n\n\\newglossaryentry{gated}\n{\n  name=门控,\n  description={gated},\n  sort={gated},\n}\n\n\\newglossaryentry{convolution}\n{\n  name=卷积,\n  description={convolution},\n  sort={convolution},\n}\n\n\\newglossaryentry{input}\n{\n  name=输入,\n  description={input},\n  sort={input},\n}\n\n\\newglossaryentry{input_distribution}\n{\n  name=输入分布,\n  description={input distribution},\n  sort={input distribution},\n}\n\n\\newglossaryentry{output}\n{\n  name=输出,\n  description={output},\n  sort={output},\n}\n\n\\newglossaryentry{feature_map}\n{\n  name=特征映射,\n  description={feature map},\n  sort={feature map},\n}\n\n\\newglossaryentry{flip}\n{\n  name=翻转,\n  description={flip},\n  sort={flip},\n}\n\n\\newglossaryentry{cross_correlation}\n{\n  name=互相关函数,\n  description={cross-correlation},\n  sort={cross-correlation},\n}\n\n\\newglossaryentry{Toeplitz_matrix}\n{\n  name=Toeplitz矩阵,\n  description={Toeplitz matrix},\n  sort={Toeplitz matrix},\n}\n\n\\newglossaryentry{doubly_block_circulant_matrix}\n{\n  name=双重分块循环矩阵,\n  description={doubly block circulant matrix},\n  sort={doubly block circulant matrix},\n}\n\n\\newglossaryentry{sparse_interactions}\n{\n  name=稀疏交互,\n  description={sparse interactions},\n  sort={sparse interactions},\n}\n\n\\newglossaryentry{equivariant_representations}\n{\n  name=等变表示,\n  description={equivariant representations},\n  sort={equivariant representations},\n}\n\n\\newglossaryentry{sparse_connectivity}\n{\n  name=稀疏连接,\n  description={sparse connectivity},\n  sort={sparse connectivity},\n}\n\n\\newglossaryentry{sparse_weights}\n{\n  name=稀疏权重,\n  description={sparse weights},\n  sort={sparse weights},\n}\n\n\\newglossaryentry{receptive_field}\n{\n  name=接受域,\n  description={receptive field},\n  sort={receptive field},\n}\n\n\\newglossaryentry{tied_weights}\n{\n  name=绑定的权重,\n  description={tied weights},\n  sort={tied weights},\n}\n\n\\newglossaryentry{equivariance}\n{\n  name=等变,\n  description={equivariance},\n  sort={equivariance},\n}\n\n\\newglossaryentry{detector_stage}\n{\n  name=探测级,\n  description={detector stage},\n  sort={detector stage},\n}\n\n\\newglossaryentry{symbolic_representation}\n{\n  name=符号表示,\n  description={symbolic representation},\n  sort={symbolic representation},\n}\n\n\\newglossaryentry{pooling_funciton}\n{\n  name=池化函数,\n  description={pooling function},\n  sort={pooling function},\n}\n\n\\newglossaryentry{max_pooling}\n{\n  name=最大池化,\n  description={max pooling},\n  sort={max pooling},\n}\n\n\\newglossaryentry{pool}\n{\n  name=池,\n  description={pool},\n  sort={max pool},\n}\n\n\\newglossaryentry{invariant}\n{\n  name=不变,\n  description={invariant},\n  sort={invariant},\n}\n\n\\newglossaryentry{permutation_invariant}\n{\n  name=置换不变性,\n  description={permutation invariant},\n  sort={permutation invariant},\n}\n\n\\newglossaryentry{stride}\n{\n  name=步幅,\n  description={stride},\n  sort={stride},\n}\n\n\\newglossaryentry{downsampling}\n{\n  name=降采样,\n  description={downsampling},\n  sort={downsampling},\n}\n\n\\newglossaryentry{valid}\n{\n  name=有效,\n  description={valid},\n  sort={valid},\n}\n\n\\newglossaryentry{same}\n{\n  name=相同,\n  description={same},\n  sort={same},\n}\n\n\\newglossaryentry{full}\n{\n  name=全,\n  description={full},\n  sort={full},\n}\n\n\\newglossaryentry{unshared_convolution}\n{\n  name=非共享卷积,\n  description={unshared convolution},\n  sort={unshared convolution},\n}\n\n\\newglossaryentry{tiled_convolution}\n{\n  name=平铺卷积,\n  description={tiled convolution},\n  sort={tiled convolution},\n}\n\n\\newglossaryentry{recurrent_convolutional_network}\n{\n  name=循环卷积网络,\n  description={recurrent convolutional network},\n  sort={recurrent convolutional network},\n}\n\n\\newglossaryentry{Fourier_transform}\n{\n  name=傅立叶变换,\n  description={Fourier transform},\n  sort={Fourier transform},\n}\n\n\\newglossaryentry{separable}\n{\n  name=可分离的,\n  description={separable},\n  sort={separable},\n}\n\n\\newglossaryentry{primary_visual_cortex}\n{\n  name=初级视觉皮层,\n  description={primary visual cortex},\n  sort={primary visual cortex},\n}\n\n\\newglossaryentry{simple_cells}\n{\n  name=简单细胞,\n  description={simple cell},\n  sort={simple cell},\n}\n\n\\newglossaryentry{complex_cells}\n{\n  name=复杂细胞,\n  description={complex cell},\n  sort={complex cell},\n}\n\n\\newglossaryentry{fovea}\n{\n  name=中央凹,\n  description={fovea},\n  sort={fovea},\n}\n\n\\newglossaryentry{saccade}\n{\n  name=扫视,\n  description={saccade},\n  sort={saccade},\n}\n\n\\newglossaryentry{TDNNs}\n{\n  name=时延神经网络,\n  description={time delay neural network},\n  sort={time delay neural network},\n  symbol={TDNN}\n}\n\n\\newglossaryentry{reverse_correlation}\n{\n  name=反向相关,\n  description={reverse correlation},\n  sort={reverse correlation},\n}\n\n\\newglossaryentry{Gabor_function}\n{\n  name=Gabor函数,\n  description={Gabor function},\n  sort={Gabor function},\n}\n\n\\newglossaryentry{quadrature_pair}\n{\n  name=象限对,\n  description={quadrature pair},\n  sort={quadrature pair},\n}\n\n\\newglossaryentry{gated_recurrent_unit}\n{\n  name=门控循环单元,\n  description={gated recurrent unit},\n  sort={gated recurrent unit},\n  symbol={GRU}\n}\n\n\\newglossaryentry{gated_recurrent_net}\n{\n  name=门控循环网络,\n  description={gated recurrent net},\n  sort={gated recurrent net}, \n}\n\n\\newglossaryentry{forget_gate}\n{\n  name=遗忘门,\n  description={forget gate},\n  sort={forget gate},\n}\n\n\\newglossaryentry{clipping_gradient}\n{\n  name=截断梯度,\n  description={clipping the gradient},\n  sort={clipping the gradient},\n}\n\n\\newglossaryentry{memory_network}\n{\n  name=记忆网络,\n  description={memory network},\n  sort={memory network},\n}\n\n\\newglossaryentry{NTM}\n{\n  name=神经网络图灵机,\n  description={neural Turing machine},\n  sort={neural Turing machine},\n  symbol={NTM}\n}\n\n\\newglossaryentry{fine_tune}\n{\n  name=精调,\n  description={fine-tune},\n  sort={fine-tune},\n}\n\n\\newglossaryentry{explaining_away}\n{\n  name=相消解释,\n  description={explaining away},\n  sort={explaining away},\n}\n\n\\newglossaryentry{explaining_away_effect}\n{\n  name=相消解释作用,\n  description={explaining away effect},\n  sort={explaining away effect},\n}\n\n\\newglossaryentry{common_cause}\n{\n  name=共因,\n  description={common cause},\n  sort={common cause},\n}\n\n\\newglossaryentry{code}\n{\n  name=编码,\n  description={code},\n  sort={code},\n}\n\n\\newglossaryentry{recirculation}\n{\n  name=再循环,\n  description={recirculation},\n  sort={recirculation},\n}\n\n\\newglossaryentry{undercomplete}\n{\n  name=欠完备,\n  description={undercomplete},\n  sort={undercomplete},\n}\n\n\\newglossaryentry{complete_graph}\n{\n  name=完全图,\n  description={complete graph},\n  sort={complete graph},\n}\n\n\\newglossaryentry{underdetermined}\n{\n  name=欠定的,\n  description={underdetermined},\n  sort={underdetermined},\n}\n\n\\newglossaryentry{overcomplete}\n{\n  name=过完备,\n  description={overcomplete},\n  sort={overcomplete},\n}\n\n\\newglossaryentry{denoising}\n{\n  name=去噪,\n  description={denoising},\n  sort={denoising},\n}\n\n\\newglossaryentry{denoise}\n{\n  name=去噪,\n  description={denoise}\n}\n\n\\newglossaryentry{DAE}\n{\n  name=去噪自编码器,\n  description={denoising autoencoder},\n  sort={denoising autoencoder},\n  symbol={DAE}\n}\n\n\\newglossaryentry{CAE}\n{\n  name=收缩自编码器,\n  description={contractive autoencoder},\n  sort={contractive autoencoder},\n  symbol={CAE}\n}\n\n\\newglossaryentry{reconstruction_error}\n{\n  name=重构误差,\n  description={reconstruction error},\n  sort={reconstruction error},\n}\n\n\\newglossaryentry{gradient_field}\n{\n  name=梯度场,\n  description={gradient field},\n  sort={gradient field},\n}\n\n\\newglossaryentry{denoising_score_matching}\n{\n  name=去噪得分匹配,\n  description={denoising score matching},\n  sort={denoising score matching},\n}\n\n\\newglossaryentry{score}\n{\n  name=得分,\n  description={score},\n  sort={score},\n}\n\n\\newglossaryentry{tangent_plane}\n{\n  name=切平面,\n  description={tangent plane},\n  sort={tangent plane},\n}\n\n\\newglossaryentry{nearest_neighbor_graph}\n{\n  name=最近邻图,\n  description={nearest neighbor graph},\n  sort={nearest neighbor graph},\n}\n\n\\newglossaryentry{embedding}\n{\n  name=嵌入,\n  description={embedding},\n  sort={embedding},\n}\n\n\\newglossaryentry{PSD}\n{\n  name=预测稀疏分解,\n  description={predictive sparse decomposition},\n  sort={predictive sparse decomposition},\n  symbol={PSD}\n}\n\n\\newglossaryentry{learned_approximate_inference}\n{\n  name=学习近似推断,\n  description={learned approximate inference},\n  sort={learned approximate inference},\n}\n\n\\newglossaryentry{approximate_inference}\n{\n  name=近似推断,\n  description={approximate inference},\n  sort={approximate inference},\n}\n\n\\newglossaryentry{information_retrieval}\n{\n  name=信息检索,\n  description={information retrieval},\n  sort={information retrieval},\n}\n\n\\newglossaryentry{semantic_hashing}\n{\n  name=语义哈希,\n  description={semantic hashing},\n  sort={semantic hashing},\n}\n\n\\newglossaryentry{dimensionality_reduction}\n{\n  name=降维,\n  description={dimensionality reduction},\n  sort={dimensionality reduction},\n}\n\n\\newglossaryentry{helmholtz_machine}\n{\n  name=Helmholtz机,\n  description={Helmholtz machine},\n  sort={Helmholtz machine},\n}\n\n\\newglossaryentry{contrastive_divergence}\n{\n  name=对比散度,\n  description={contrastive divergence},\n  symbol={CD},\n  sort={contrastive divergence},\n}\n\n\\newglossaryentry{language_model}\n{\n  name=语言模型,\n  description={language model},\n  sort={language model}，\n}\n\n\\newglossaryentry{token}\n{\n  name=标记,\n  description={token},\n  sort={token}，\n}\n\n\\newglossaryentry{unigram}\n{\n  name=一元语法,\n  description={unigram},\n  sort={unigram},\n}\n\n\\newglossaryentry{bigram}\n{\n  name=二元语法,\n  description={bigram},\n  sort={bigram},\n}\n\n\\newglossaryentry{trigram}\n{\n  name=三元语法,\n  description={trigram},\n  sort={trigram},\n}\n\n\\newglossaryentry{smoothing}\n{\n  name=平滑,\n  description={smoothing},\n  sort={smoothing},\n}\n\n\\newglossaryentry{NLM}\n{\n  name=神经语言模型,\n  description={Neural Language Model},\n  sort={Neural Language Model},\n  symbol={NLM}\n}\n\n\\newglossaryentry{cascade}\n{\n  name=级联,\n  description={cascade},\n  sort={cascade},\n}\n\n\\newglossaryentry{policy_gradient}\n{\n  name=策略梯度,\n  description={policy gradient},\n  sort={policy gradient},\n}\n\n\\newglossaryentry{DGM}\n{\n  name=深度生成模型,\n  description={deep generative model},\n  sort={deep generative model},\n}\n\n\\newglossaryentry{model}\n{\n  name=模型,\n  description={model},\n  sort={model},\n}\n\n\\newglossaryentry{layer}\n{\n  name=层,\n  description={layer},\n  sort={layer},\n}\n\n\\newglossaryentry{greedy_unsupervised_pretraining}\n{\n  name=贪心无监督预训练,\n  description={greedy unsupervised pretraining},\n  sort={greedy unsupervised pretraining},\n}\n\n\\newglossaryentry{semi_supervised_learning}\n{\n  name=半监督学习,\n  description={semi-supervised learning},\n  sort={semi-supervised learning},\n}\n\n\\newglossaryentry{supervised_model}\n{\n  name=监督模型,\n  description={supervised model},\n  sort={supervised model},\n}\n\n\\newglossaryentry{word_embeddings}\n{\n  name=词嵌入,\n  description={word embedding},\n  sort={word embedding},\n}\n\n\\newglossaryentry{one_hot}\n{\n  name=one-hot,\n  description={one-hot},\n  sort={one-hot},\n}\n\n\\newglossaryentry{supervised_pretraining}\n{\n  name=监督预训练,\n  description={supervised pretraining},\n  sort={supervised pretraining},\n}\n\n\\newglossaryentry{transfer_learning}\n{\n  name=迁移学习,\n  description={transfer learning},\n  sort={transfer learning},\n}\n\n\\newglossaryentry{learner}\n{\n  name=学习器,\n  description={learner},\n  sort={learner},\n}\n\n\\newglossaryentry{multitask_learning}\n{\n  name=多任务学习,\n  description={multitask learning},\n  sort={multitask learning},\n}\n\n\\newglossaryentry{domain_adaption}\n{\n  name=领域自适应,\n  description={domain adaption}  ,\n  sort={domain adaption}  ,\n}\n\n\\newglossaryentry{concept_drift}\n{\n  name=概念漂移,\n  description={concept drift},\n  sort={concept drift},\n}\n\n\\newglossaryentry{one_shot_learning}\n{\n  name=一次学习,\n  description={one-shot learning},\n  sort={one-shot learning},\n}\n\n\\newglossaryentry{zero_shot_learning}\n{\n  name=零次学习,\n  description={zero-shot learning},\n  sort={zero-shot learning},\n}\n\n\\newglossaryentry{zero_data_learning}\n{\n  name=零数据学习,\n  description={zero-data learning},\n  sort={zero-data learning},\n}\n\n\\newglossaryentry{multimodal_learning}\n{\n  name=多模态学习,\n  description={multimodal learning},\n  sort={multimodal learning},\n}\n\n\\newglossaryentry{generative_adversarial_networks}\n{\n  name=生成式对抗网络,\n  description={generative adversarial network},\n  sort={generative adversarial network},\n  symbol={GAN}\n}\n\n\\newglossaryentry{generative_adversarial_framework}\n{\n  name=生成式对抗框架,\n  description={generative adversarial framework},\n  sort={generative adversarial framework},\n}\n\n\\newglossaryentry{GAN}\n{\n  name=生成式对抗网络,\n  description={generative adversarial network},\n  sort={generative adversarial network},\n  symbol={GAN}\n}\n\n\\newglossaryentry{feedforward_classifier}\n{\n  name=前馈分类器,\n  description={feedforward classifier},\n  sort={feedforward classifier},\n}\n\n\\newglossaryentry{sum_product_network}\n{\n  name=和-积网络,\n  description={sum-product network},\n  sort={sum-product network},\n  symbol={SPN}\n}\n\n\\newglossaryentry{deep_circuit}\n{\n  name=深度回路,\n  description={deep circuit},\n  sort={deep circuit},\n}\n\n\\newglossaryentry{shadow_circuit}\n{\n  name=浅度回路,\n  description={shadow circuit},\n  sort={shadow circuit},\n}\n\n\\newglossaryentry{linear_classifier}\n{\n  name=线性分类器,\n  description={linear classifier},\n  sort={linear classifier},\n}\n\n\\newglossaryentry{positive_phase}\n{\n  name=正相,\n  description={positive phase},\n  sort={positive phase},\n}\n\n\\newglossaryentry{negative_phase}\n{\n  name=负相,\n  description={negative phase},\n  sort={negative phase},\n}\n\n\\newglossaryentry{leibniz_rule}\n{\n  name=莱布尼兹法则,\n  description={Leibniz's rule},\n  sort={Leibniz's rule},\n}\n\n\\newglossaryentry{lebesgue_integrable}\n{\n  name=勒贝格可积,\n  description={Lebesgue-integrable},\n  sort={Lebesgue-integrable},\n}\n\n\\newglossaryentry{spurious_modes}\n{\n  name=虚假模态,\n  description={spurious modes},\n  sort={spurious modes},\n}\n\n\\newglossaryentry{SML}\n{\n  name=随机最大似然,\n  symbol={SML},\n  description={stochastic maximum likelihood},\n  sort={stochastic maximum likelihood},\n}\n\n\\newglossaryentry{persistent_contrastive_divergence}\n{\n  name=持续性对比散度,\n  description={persistent contrastive divergence},\n  sort={persistent contrastive divergence},\n  symbol={PCD}\n}\n\n\\newglossaryentry{FPCD}\n{\n  name=快速持续性对比散度,\n  symbol={FPCD},\n  description={fast persistent contrastive divergence},\n  sort={fast persistent contrastive divergence},\n}\n\n\\newglossaryentry{pseudolikelihood}\n{\n  name=伪似然,\n  description={pseudolikelihood},\n  sort={pseudolikelihood},\n}\n\n\\newglossaryentry{generalized_pseudolikelihood_estimator}\n{\n  name=广义伪似然估计,\n  description={generalized pseudolikelihood estimator},\n  sort={generalized pseudolikelihood estimator},\n}\n\n\\newglossaryentry{generalized_pseudolikelihood}\n{\n  name=广义伪似然,\n  description={generalized pseudolikelihood},\n  sort={generalized pseudolikelihood},\n}\n\n\\newglossaryentry{GSM}\n{\n  name=广义得分匹配,\n  description={generalized score matching},\n  sort={generalized score matching},\n  symbol={GSM}\n}\n\n\\newglossaryentry{ratio_matching}\n{\n  name=比率匹配,\n  description={ratio matching},\n  sort={ratio matching},\n}\n\n\\newglossaryentry{NCE}\n{\n  name=噪声对比估计,\n  description={noise-contrastive estimation},\n  sort={noise-contrastive estimation},\n  symbol={NCE}\n}\n\n\\newglossaryentry{noise_distribution}\n{\n  name=噪声分布,\n  description={noise distribution},\n  sort={noise distribution},\n}\n\n\\newglossaryentry{noise}\n{\n  name=噪声,\n  description={noise},\n  sort={noise},\n}\n\n\\newglossaryentry{self_contrastive_estimation}\n{\n  name=自对比估计,\n  description={self-contrastive estimation},\n  sort={self-contrastive estimation},\n}\n\n\\newglossaryentry{iid_chap18}\n{\n  name=独立同分布,\n  description={independent identically distributed},\n  sort={independent identically distributed},\n  symbol={i.i.d.}\n}\n\n\\newglossaryentry{AIS}\n{\n  name=退火重要采样,\n  description={annealed importance sampling},\n  sort={annealed importance sampling},\n  symbol={AIS}\n}\n\n\\newglossaryentry{bridge_sampling}\n{\n  name=桥式采样,\n  description={bridge sampling},\n  sort={bridge sampling},\n}\n\n\\newglossaryentry{linked_importance_sampling}\n{\n  name=链接重要采样,\n  description={linked importance sampling},\n  sort={linked importance sampling},\n}\n\n\\newglossaryentry{ASIC}\n{\n  name=专用集成电路,\n  description={application-specific integrated circuit},\n  sort={application-specific integrated circuit},\n  symbol={ASIC}\n}\n\n\\newglossaryentry{FPGA}\n{\n  name=现场可编程门阵列,\n  description={field programmable gated array},\n  sort={field programmable gated array},\n  symbol={FPGA}\n}\n\n\\newglossaryentry{scalar}\n{\n  name=标量,\n  description={scalar},\n  sort={scalar},\n}\n\n\\newglossaryentry{vector}\n{\n  name=向量,\n  description={vector},\n  sort={vector},\n}\n\n\\newglossaryentry{matrix}\n{\n  name=矩阵,\n  description={matrix},\n  sort={matrix},\n}\n\n\\newglossaryentry{tensor}\n{\n  name=张量,\n  description={tensor},\n  sort={tensor},\n}\n\n\\newglossaryentry{dot_product}\n{\n  name=点积,\n  description={dot product},\n  sort={dot product},\n}\n\n\\newglossaryentry{inner_product}\n{\n  name=内积,\n  description={inner product},\n  sort={inner product}\n}\n\n\\newglossaryentry{square}\n{\n  name=方阵,\n  description={square},\n  sort={square},\n}\n\n\\newglossaryentry{singular}\n{\n  name=奇异的,\n  description={singular},\n  sort={singular},\n}\n\n\\newglossaryentry{norm}\n{\n  name=范数,\n  description={norm},\n  sort={norm},\n}\n\n\\newglossaryentry{triangle_inequality}\n{\n  name=三角不等式,\n  description={triangle inequality},\n  sort={triangle inequality},\n}\n\n\\newglossaryentry{euclidean_norm}\n{\n  name=欧几里得范数,\n  description={Euclidean norm},\n  sort={Euclidean norm},\n}\n\n\\newglossaryentry{max_norm}\n{\n  name=最大范数,\n  description={max norm},\n  sort={max norm},\n}\n\n\\newglossaryentry{frobenius_norm}\n{\n  name=Frobenius 范数,\n  description={Frobenius norm},\n  sort={Frobenius norm},\n}\n\n\\newglossaryentry{diagonal_matrix}\n{\n  name=对角矩阵,\n  description={diagonal matrix},\n  sort={diagonal matrix},\n}\n\n\\newglossaryentry{symmetric}\n{\n  name=对称,\n  description={symmetric},\n  sort={symmetric},\n}\n\n\\newglossaryentry{unit_vector}\n{\n  name=单位向量,\n  description={unit vector},\n  sort={unit vector},\n}\n\n\\newglossaryentry{unit_norm}\n{\n  name=单位范数,\n  description={unit norm},\n  sort={unit norm},\n}\n\n\\newglossaryentry{orthogonal}\n{\n  name=正交,\n  description={orthogonal},\n  sort={orthogonal},\n}\n\n\\newglossaryentry{orthogonal_matrix}\n{\n  name=正交矩阵,\n  description={orthogonal matrix},\n  sort={orthogonal matrix},\n}\n\n\\newglossaryentry{orthonormal}\n{\n  name=标准正交,\n  description={orthonormal},\n  sort={orthonormal},\n}\n\n\\newglossaryentry{eigendecomposition}\n{\n  name=特征分解,\n  description={eigendecomposition},\n  sort={eigendecomposition},\n}\n\n\\newglossaryentry{eigenvector}\n{\n  name=特征向量,\n  description={eigenvector},\n  sort={eigenvector},\n}\n\n\\newglossaryentry{eigenvalue}\n{\n  name=特征值,\n  description={eigenvalue},\n  sort={eigenvalue},\n}\n\n\\newglossaryentry{decompose}\n{\n  name=分解,\n  description={decompose},\n  sort={decompose},\n}\n\n\\newglossaryentry{P_D}\n{\n  name=正定,\n  description={positive definite},\n  sort={positive definite},\n}\n\n\\newglossaryentry{ND}\n{\n  name=负定,\n  description={negative definite},\n  sort={negative definite},\n}\n\n\\newglossaryentry{NSD}\n{\n  name=半负定,\n  description={negative semidefinite},\n  sort={negative semidefinite},\n}\n\n\\newglossaryentry{P_SD}\n{\n  name=半正定,\n  description={positive semidefinite},\n  sort={positive semidefinite},\n}\n\n\\newglossaryentry{SVD}\n{\n  name=奇异值分解,\n  description={singular value decomposition},\n  sort={singular value decomposition},\n  symbol={SVD}\n}\n\n\\newglossaryentry{Svalue}\n{\n  name=奇异值,\n  description={singular value},\n  sort={singular value},\n}\n\n\\newglossaryentry{Svector}\n{\n  name=奇异向量,\n  description={singular vector},\n  sort={singular vector},\n}\n\n\\newglossaryentry{left_Svector}\n{\n  name=左奇异向量,\n  description={left singular vector},\n  sort={left singular vector},\n}\n\n\\newglossaryentry{right_Svector}\n{\n  name=右奇异向量,\n  description={right singular vector},\n  sort={right singular vector},\n}\n\n\\newglossaryentry{left_Evector}\n{\n  name=左特征向量,\n  description={left eigenvector},\n  sort={left eigenvector},\n}\n\n\\newglossaryentry{right_Evector}\n{\n  name=右特征向量,\n  description={right eigenvector},\n  sort={right eigenvector},\n}\n\n\\newglossaryentry{Moore}\n{\n  name=Moore-Penrose 伪逆,\n  description={Moore-Penrose pseudoinverse},\n  sort={Moore-Penrose pseudoinverse},\n}\n\n\\newglossaryentry{identity_matrix}\n{\n  name=单位矩阵,\n  description={identity matrix},\n  sort={identity matrix},\n}\n\n\\newglossaryentry{matrix_inverse}\n{\n  name=矩阵逆,\n  description={matrix inversion},\n  sort={matrix inversion},\n}\n\n\\newglossaryentry{origin}\n{\n  name=原点,\n  description={origin},\n  sort={origin},\n}\n\n\\newglossaryentry{linear_combination}\n{\n  name=线性组合,\n  description={linear combination},\n  sort={linear combination},\n}\n\n\\newglossaryentry{column_space}\n{\n  name=列空间,\n  description={column space},\n  sort={column space},\n}\n\n\\newglossaryentry{range}\n{\n  name=值域,\n  description={range},\n  sort={range},\n}\n\n\\newglossaryentry{linear_depend}\n{\n  name=线性相关,\n  description={linear dependency},\n  sort={linear dependency},\n}\n\n\\newglossaryentry{linear_dependence}\n{\n  name=线性相关,\n  description={linear dependence},\n  sort={linear dependence}\n}\n\n\\newglossaryentry{linearly_independent}\n{\n  name=线性无关,\n  description={linearly independent},\n  sort={linearly independent}\n}\n\n\\newglossaryentry{column}\n{\n  name=列,\n  description={column},\n  sort={column},\n}\n\n\\newglossaryentry{row}\n{\n  name=行,\n  description={row},\n  sort={row},\n}\n\n\\newglossaryentry{span}\n{\n  name=生成子空间,\n  description={span},\n  sort={span},\n}\n\n\\newglossaryentry{SLT}\n{\n  name=统计学习理论,\n  description={statistical learning theory},\n  sort={statistical learning theory},\n}\n\n\\newglossaryentry{DGP}\n{\n  name=数据生成过程,\n  description={data generating process},\n  sort={data generating process},\n}\n\n\\newglossaryentry{iid}\n{\n  name=独立同分布假设,\n  description={i.i.d. assumption},\n  sort={i.i.d. assumption},\n}\n\n\\newglossaryentry{id}\n{\n  name=同分布的,\n  description={identically distributed},\n  sort={identically distributed},\n}\n\n\\newglossaryentry{DGD}\n{\n  name=数据生成分布,\n  description={data generating distribution},\n  sort={data generating distribution},\n}\n\n\\newglossaryentry{large_learning_step}\n{\n  name=大学习步骤,\n  description={large learning step},\n  sort={large learning step},\n}\n\n\\newglossaryentry{variable_elimination}\n{\n  name=变量消去,\n  description={variable elimination},\n  sort={variable elimination},\n}\n\n\\newglossaryentry{OR}\n{\n  name=奥卡姆剃刀,\n  description={Occam's razor},\n  sort={Occam's razor},\n}\n\n\\newglossaryentry{VC}\n{\n  name=Vapnik-Chervonenkis维度,\n  description={Vapnik-Chervonenkis dimension},\n  sort={Vapnik-Chervonenkis dimension},\n  symbol={VC}\n}\n\n\\newglossaryentry{unsupervised_learning_algorithm}\n{\n  name=无监督学习算法,\n  description={unsupervised learning algorithm},\n  sort={unsupervised learning algorithm},\n}\n\n\\newglossaryentry{supervised_learning_algorithm}\n{\n  name=监督学习算法,\n  description={supervised learning algorithm},\n  sort={supervised learning algorithm},\n}\n\n\\newglossaryentry{word_embedding}\n{\n  name=词嵌入,\n  description={word embedding},\n  sort={word embedding},\n}\n\n\\newglossaryentry{shortlist}\n{\n  name=短列表,\n  description={shortlist},\n  sort={shortlist},\n}\n\n\\newglossaryentry{NMT}\n{\n  name=神经机器翻译,\n  description={Neural Machine Translation},\n  sort={Neural Machine Translation},\n  symbol={NMT}\n}\n\n\\newglossaryentry{machine_translation}\n{\n  name=机器翻译,\n  description={machine translation},\n  sort={machine translation}\n}\n\n\\newglossaryentry{recommender_system}\n{\n  name=推荐系统,\n  description={recommender system},\n  sort={recommender system},\n}\n\n\\newglossaryentry{proposal_distribution}\n{\n  name=提议分布,\n  description={proposal distribution},\n  sort={proposal distribution},\n}\n\n\\newglossaryentry{bag_of_words}\n{\n  name=词袋,\n  description={bag of words},\n  sort={bag of words},\n}\n\n\\newglossaryentry{collaborative_filtering}\n{\n  name=协同过滤,\n  description={collaborative filtering},\n  sort={collaborative filtering},\n}\n\n\\newglossaryentry{exploration}\n{\n  name=探索,\n  description={exploration},\n  sort={exploration},\n}\n\n\\newglossaryentry{exploitation}\n{\n  name=利用,\n  description={exploitation},\n  sort={exploitation},\n}\n\n\\newglossaryentry{bandit}\n{\n  name=bandit ,\n  description={bandit},\n  sort={bandit},\n}\n\n\\newglossaryentry{contextual_bandit}\n{\n  name=contextual bandit ,\n  description={contextual bandit},\n  sort={contextual bandit},\n}\n\n\\newglossaryentry{policy}\n{\n  name=策略,\n  description={policy},\n  sort={policy},\n}\n\n\\newglossaryentry{relation}\n{\n  name=关系,\n  description={relation},\n  sort={relation},\n}\n\n\\newglossaryentry{binary_relation}\n{\n  name=二元关系,\n  description={binary relation},\n  sort={binary relation},\n}\n\n\\newglossaryentry{attribute}\n{\n  name=属性,\n  description={attribute},\n  sort={attribute},\n}\n\n\\newglossaryentry{relational_database}\n{\n  name=关系型数据库,\n  description={relational database},\n  sort={relational database},\n}\n\n\\newglossaryentry{link_prediction}\n{\n  name=链接预测,\n  description={link prediction},\n  sort={link prediction},\n}\n\n\\newglossaryentry{word_sense_disambiguation}\n{\n  name=词义消歧,\n  description={word-sense disambiguation},\n  sort={word-sense disambiguation},\n}\n\n\\newglossaryentry{error_metric}\n{\n  name=误差度量,\n  description={error metric},\n  sort={error metric},\n}\n\n\\newglossaryentry{performance_metrics}\n{\n  name=性能度量,\n  description={performance metrics},\n  sort={performance metrics},\n}\n\n\\newglossaryentry{transcription_system}\n{\n  name=转录系统,\n  description={transcription system},\n  sort={transcription system},\n}\n\n\\newglossaryentry{BFGS}\n{\n  name=BFGS,\n  description={BFGS},\n  sort={BFGS},\n}\n\n\\newglossaryentry{LBFGS}\n{\n  name=L-BFGS,\n  description={L-BFGS},\n  sort={L-BFGS},\n}\n\n\\newglossaryentry{CG}\n{\n  name=共轭梯度,\n  description={conjugate gradient},\n  sort={conjugate gradient},\n  symbol={CG}\n}\n\n\\newglossaryentry{nonlinear_CG}\n{\n  name=非线性共轭梯度,\n  description={nonlinear conjugate gradients},\n  sort={nonlinear conjugate gradients},\n}\n\n\\newglossaryentry{bayesian_inference}\n{\n  name=贝叶斯推断,\n  description={Bayesian inference},\n  sort={Bayesian inference},\n}\n\n\\newglossaryentry{online_learning}\n{\n  name=在线学习,\n  description={online learning},\n  sort={online learning},\n}\n\n\\newglossaryentry{layer_wise_pretraining}\n{\n  name=逐层预训练,\n  description={layer-wise pretraining},\n  sort={layer-wise pretraining},\n}\n\n\\newglossaryentry{MPDBM}\n{\n  name=多预测深度玻尔兹曼机,\n  description={multi-prediction deep Boltzmann machine},\n  sort={multi-prediction deep Boltzmann machine},\n  symbol={MP-DBM}\n}\n\n\\newglossaryentry{GBRBM}\n{\n  name=Gaussian-Bernoulli RBM,\n  description={Gaussian-Bernoulli RBM},\n  sort={Gaussian-Bernoulli RBM},\n  symbol={GB-RBM}\n}\n\n\\newglossaryentry{gaussian_rbm}\n{\n  name=高斯RBM,\n  description={Gaussian RBM},\n  sort={Gaussian RBM}\n}\n\n\\newglossaryentry{mcrbm}\n{\n  name=均值和协方差RBM,\n  description={mean and covariance RBM},\n  sort={mean and covariance RBM},\n  symbol={mcRBM},\n}\n\n\\newglossaryentry{mcrbm2}\n{\n  name=均值-协方差RBM,\n  description={mean-covariance restricted Boltzmann machine},\n  sort={mean-covariance restricted Boltzmann machine},\n  symbol={mcRBM2},\n}\n\n\\newglossaryentry{crbm}\n{\n  name=协方差RBM,\n  description={covariance RBM},\n  sort={covariance RBM},\n  symbol={cRBM},\n}\n\n\\newglossaryentry{mpot}\n{\n  name=学生$t$分布均值乘积,\n  description={mean product of Student t-distribution},\n  sort={mean product of Student t-distribution},\n  symbol={mPoT},\n}\n\n\\newglossaryentry{ssrbm}\n{\n  name=尖峰和平板RBM,\n  description={spike and slab RBM},\n  sort={spike and slab RBM},\n  symbol={ssRBM},\n}\n\n\\newglossaryentry{gamma_distribution}\n{\n  name=Gamma分布,\n  description={Gamma distribution},\n  sort={Gamma distribution},\n}\n\n\\newglossaryentry{convolutional_bm}\n{\n  name=卷积玻尔兹曼机 ,\n  description={convolutional Boltzmann machine},\n  sort={convolutional Boltzmann machine},\n}\n\n\\newglossaryentry{reparametrization_trick}\n{\n  name=重参数化技巧,\n  description={reparametrization trick},\n  sort={reparametrization trick},\n}\n\n\\newglossaryentry{reparametrization}\n{\n  name=重参数化,\n  description={reparametrization},\n  sort={reparametrization},\n}\n\n\\newglossaryentry{variance_reduction}\n{\n  name=方差减小,\n  description={variance reduction},\n  sort={variance reduction},\n}\n\n\\newglossaryentry{sigmoid_bn}\n{\n  name=sigmoid信念网络,\n  description={sigmoid Belief Network},\n  sort={sigmoid Belief Network},\n}\n\n\\newglossaryentry{auto_regressive_network}\n{\n  name=自回归网络,\n  description={auto-regressive network},\n  sort={auto-regressive network}\n}\n\n\\newglossaryentry{generator_network}\n{\n  name=生成器网络,\n  description={generator network},\n  sort={generator network}\n}\n\n\\newglossaryentry{discriminator_network}\n{\n  name=判别器网络,\n  description={discriminator network},\n  sort={discriminator network},\n}\n\n\\newglossaryentry{generative_moment_matching_network}\n{\n  name=生成矩匹配网络,\n  description={generative moment matching network},\n  sort={generative moment matching network},\n}\n\n\\newglossaryentry{moment_matching}\n{\n  name=矩匹配,\n  description={moment matching},\n  sort={moment matching},\n}\n\n\\newglossaryentry{moment}\n{\n  name=矩,\n  description={moment},\n  sort={moment},\n}\n\n\\newglossaryentry{MMD}\n{\n  name=最大平均偏差,\n  description={maximum mean discrepancy},\n  sort={maximum mean discrepancy},\n  symbol={MMD}\n}\n\n\\newglossaryentry{linear_auto_regressive_network}\n{\n  name=线性自回归网络,\n  description={linear auto-regressive network},\n  sort={linear auto-regressive network}\n}\n\n\\newglossaryentry{neural_auto_regressive_network}\n{\n  name=神经自回归网络,\n  description={neural auto-regressive network},\n  sort={neural auto-regressive network}\n}\n\n\\newglossaryentry{NADE}\n{\n  name=神经自回归密度估计器,\n  description={neural auto-regressive density estimator},\n  sort={neural auto-regressive density estimator},\n  symbol={NADE}\n}\n\n\\newglossaryentry{detailed_balance}\n{\n  name=细致平衡,\n  description={detailed balance},\n  sort={detailed balance},\n}\n\n\\newglossaryentry{ABC}\n{\n  name=近似贝叶斯计算,\n  description={approximate Bayesian computation},\n  sort={approximate Bayesian computationA},\n  symbol={ABC}\n}\n\n\\newglossaryentry{visible_layer}\n{\n  name=可见层,\n  description={visible layer},\n  sort={visible layer},\n}\n\n\\newglossaryentry{infinite}\n{\n  name=无限,\n  description={infinite},\n  sort={infinite},\n}\n\n\\newglossaryentry{deep_model}\n{\n  name=深度模型,\n  description={deep model},\n  sort={deep model},\n}\n\n\\newglossaryentry{deep_network}\n{\n  name=深度网络,\n  description={deep network},\n  sort={deep network},\n}\n\n\\newglossaryentry{tolerance}\n{\n  name=容差,\n  description={tolerance},\n  sort={tolerance},\n}\n\n\\newglossaryentry{learning_rate}\n{\n  name=学习率,\n  description={learning rate},\n  sort={learning rate},\n}\n\n\\newglossaryentry{ss}\n{\n  name=尖峰和平板,\n  description={spike and slab},\n  sort={spike and slab},\n}\n\n\\newglossaryentry{context_specific_independence}\n{\n  name=特定环境下的独立,\n  description={context-specific independences},\n  sort={context-specific independences},\n}\n\n\\newglossaryentry{coparent}\n{\n  name=共父,\n  description={coparent},\n  sort={coparent},\n}\n\n\\newglossaryentry{srbm}\n{\n  name=半受限玻尔兹曼机,\n  description={semi-restricted Boltzmann Machine},\n  sort={semi-restricted Boltzmann Machine},\n}\n\n\\newglossaryentry{underfit_regime}\n{\n  name=欠拟合机制,\n  description={underfitting regime},\n  sort={underfitting regime},\n}\n\n\\newglossaryentry{overfit_regime}\n{\n  name=过拟合机制,\n  description={overfitting regime},\n  sort={overfitting regime},\n}\n\n\\newglossaryentry{optimal_capacity}\n{\n  name=最佳容量,\n  description={optimal capacity},\n  sort={optimal capacity},\n}\n\n\\newglossaryentry{error_bar}\n{\n  name=误差条,\n  description={error bar},\n  sort={error bar},\n}\n\n\\newglossaryentry{vstructure}\n{\n  name=V-结构,\n  description={V-structure},\n  sort={V-structure},\n}\n\n\\newglossaryentry{collider}\n{\n  name=碰撞情况,\n  description={the collider case},\n  sort={the collider case},\n}\n\n\\newglossaryentry{epochs}\n{\n  name=轮数,\n  description={epochs},\n  sort={epochs},\n}\n\n\\newglossaryentry{epoch}\n{\n  name=轮,\n  description={epoch},\n  sort={epoch},\n}\n\n\\newglossaryentry{logarithmic_scale}\n{\n  name=对数尺度,\n  description={logarithmic scale},\n  sort={logarithmic scale}\n}\n\n\\newglossaryentry{random_search}\n{\n  name=随机搜索,\n  description={random search},\n  sort={random search}\n}\n\n\\newglossaryentry{closed_form_solution}\n{\n  name=闭式解,\n  description={closed form solution},\n  sort={closed form solution}\n}\n\n\\newglossaryentry{object_recognition}\n{\n  name=对象识别,\n  description={object recognition},\n  sort={object recognition}\n}\n\n\\newglossaryentry{piecewise}\n{\n  name=分段,\n  description={piecewise},\n  sort={piecewise},\n}\n\n\\newglossaryentry{alternative_splicing_dataset}\n{\n  name=选择性剪接数据集,\n  description={alternative splicing dataset},\n  sort={alternative splicing dataset},\n}\n\n\\newglossaryentry{hamming_distance}\n{\n  name=汉明距离,\n  description={Hamming distance},\n  sort={Hamming distance}\n}\n\n\\newglossaryentry{visible_variable}\n{\n  name=可见变量,\n  description={visible variable},\n  sort={visible variable},\n}\n\n\\newglossaryentry{approxi_inference}\n{\n  name=近似推断,\n  description={approximate inference},\n  sort={approximate inference},\n}\n\n\\newglossaryentry{exact_inference}\n{\n  name=精确推断,\n  description={exact inference},\n  sort={exact inference},\n}\n\n\\newglossaryentry{latent}\n{\n  name=潜在,\n  description={latent},\n  sort={latent},\n}\n\n\\newglossaryentry{latent_layer}\n{\n  name=潜层,\n  description={latent layer},\n  sort={latent layer},\n}\n\n\\newglossaryentry{knowledge_graph}\n{\n  name=知识图谱,\n  description={knowledge graph},\n  sort={knowledge graph},\n}\n\n\\newglossaryentry{factors_of_variation}\n{\n  name=变差因素,\n  description={factors of variation},\n  sort={factors of variation},\n}\n\n\\newglossaryentry{isomap}\n{\n  name=Isomap,\n  description={Isomap},\n  sort={isomap},\n}\n"
  },
  {
    "path": "website.tex",
    "content": "% !Mode:: \"TeX:UTF-8\"\n\\chapter*{网站}\n\\addcontentsline{toc}{chapter}{网站}\n\n\\centerline{www.deeplearningbook.org}\n\n\\ \\\\\n\\ \\\\\n\\ \\\\\n\n这本书伴随有上述网站。\n网站提供了各种补充材料，包括练习、讲义幻灯片、错误更正以及其他应该对读者和讲师有用的资源。\n"
  }
]