多伦多大学机器学习神经网络笔记-全-

多伦多大学机器学习神经网络笔记(全)

1.1:为什么需要机器学习?🤖

在本节课中,我们将探讨机器学习的必要性、其应用场景以及它能完成的任务。我们将从为什么某些问题难以通过传统编程解决开始,逐步了解机器学习的基本思想,并通过一些实际案例来展示其强大的能力。


为什么需要机器学习?

上一节我们介绍了课程主题,本节中我们来看看为什么我们需要机器学习。原因在于,存在一些非常难以编写程序来解决的问题。

例如,识别一个三维物体。当物体处于新的视角、新的光照条件或复杂的场景中时,识别变得极其困难。我们不知道如何编写程序,因为我们甚至不清楚人类大脑是如何完成这项任务的。即使我们知道,编写出的程序也可能异常复杂。

另一个例子是检测欺诈性信用卡交易。可能不存在任何简单、明确的规则来判断一笔交易是否欺诈。实际上,我们需要组合大量并不可靠的规则。此外,这些规则会随着欺诈者手段的变化而改变。

因此,我们需要一个能够组合不可靠规则、并且易于修改的复杂程序。


机器学习的方法

既然为每个特定任务手动编写程序如此困难,机器学习提供了一种不同的思路。

机器学习的方法是:对于特定任务,我们收集大量输入-输出配对示例,这些示例指明了给定输入对应的正确输出。然后,机器学习算法接收这些示例,并生成一个能完成该任务的程序。

由学习算法生成的程序,可能与典型的手写程序看起来非常不同。例如,它可能包含数百万个数字,用于表示对不同类型证据的权重

如果方法得当,这个程序不仅能在训练过的案例上工作,也应该能处理新的案例。如果数据发生变化,我们也可以通过在新数据上重新训练,相对容易地更新程序。

如今,大量的计算资源比雇佣专人为特定任务编写程序更便宜。因此,我们可以负担得起使用庞大、复杂的机器学习程序来为我们生成这些特定任务的系统。


机器学习的应用领域

以下是机器学习算法最擅长处理的一些任务类型:

  • 模式识别:例如,识别真实场景中的物体、人脸的身份或表情、以及语音中的单词。
  • 异常检测:例如,检测信用卡交易中的异常序列,或核电站传感器读数中的异常模式。对于这类问题,我们通常不希望使用监督学习(即查看爆炸案例并找出原因),而是希望在没有监督信号的情况下,仅通过识别“行为异常”来发现问题。
  • 预测:例如,预测未来的股票价格或汇率,或者根据用户喜欢的电影以及其他大量用户的喜好,预测该用户可能喜欢的电影。


我们的“果蝇”:MNIST数据集

在本课程中,我将使用一个标准示例来解释许多机器学习算法。这类似于遗传学中使用果蝇进行研究:它们繁殖快,且已有大量已知的遗传学知识。

MNIST 手写数字数据库就是机器学习领域的“果蝇”。它是公开可用的数据集,我们可以让机器学习算法快速学习如何识别这10个数字(0-9),因此便于尝试各种算法变体。此外,我们已经对不同机器学习方法在MNIST上的表现有了深入的了解,特别是因为这些方法通常由其支持者实现,结果相对可靠。

基于以上所有原因,我们将使用MNIST作为我们的标准任务。

以下是MNIST中的一些数字示例。这些是神经网络首次看到时就能正确识别的数字,但也是神经网络信心不足的那些。你可以看到原因。

这些数字按标准扫描线顺序排列(先是0,然后是1、2,依此类推)。观察绿色矩形框中的一堆“2”,你会发现,即使你知道它们是手写数字,你很可能也会猜它们是“2”,但很难说清楚到底是什么让它们成为“2”。它们并没有一个简单的共同特征。特别是,如果你尝试将一个“2”叠加在另一个上,你会发现它们并不吻合。即使进行一些扭曲,也很难让它们完全重叠。因此,使用模板匹配的方法将无法胜任。具体来说,很难找到一个模板既能匹配绿色框中的两个“2”,又不会错误匹配红色框中的其他数字。

这正是使得手写数字识别成为机器学习理想任务的原因之一。


超越MNIST:更复杂的任务

我不希望你认为MNIST是机器学习唯一能做的事情。对于现代机器学习系统来说,MNIST已经是一个相对简单的任务。

为了激发你对后续课程的兴趣,我想展示一些更困难任务的例子。

我们现在拥有参数接近1亿的神经网络,能够识别1000种不同的物体类别。这些网络在从网络获取的130万张高分辨率训练图像上进行训练。在2010年的一场竞赛中,最佳系统的错误率是:第一选择错误率为47%,如果放宽到前五个选择中包含正确答案就算对,则错误率为25%。这对于1000种不同物体来说已经不错了。

著名的神经网络怀疑论者、顶尖计算机视觉研究员Geoffrey Hinton曾表示,这场竞赛是检验深度神经网络在物体识别上能否表现出色的良好测试。如今,一个非常深的神经网络的表现已经远超当年的获胜系统,其第一选择错误率低于40%,前五选择错误率低于20%。我将在第5讲中更详细地描述这一点。

以下是一些需要识别的图像示例,这些图像来自它从未见过的测试集。在示例下方,我展示了神经网络认为的正确答案,其中水平条的长度表示其置信度,红色标注的是正确答案。

  • 在中间的例子中,它正确识别出那是一辆“扫雪机”。但你可以看到,它的其他选择也相当合理。它看起来确实有点像“钻井平台”。而它的第三选择“救生艇”,看起来也非常像救生艇,你可以看到船头的旗帜、船桥、船尾的旗帜以及背景中的巨浪。因此,它的错误揭示了其工作原理,并且这些错误非常合理。
  • 在左边的例子中,它识别错了,可能是因为鸟的喙缺失了,并且鸟的羽毛看起来非常像水獭湿漉漉的皮毛。但正确答案仍在它的前五个选择中。它的表现甚至比我好,我都不知道那是一只鹌鹑、松鸡还是山鹑。
  • 在右边的例子中,它完全识别错了。它认为是“断头台”,你或许能明白为什么:背景看起来像丛林,中间有橙色的东西,但它未能得出正确答案。

然而,神经网络能够处理各种不同的物体。例如,在左边的图中,我可能会首先猜是“微波炉”,但实际正确答案是“电灶”,并且神经网络将其列入了前五选择。在中间的图中,它识别出了“旋转栅门”,这是一个分散的物体,表明它不仅能识别紧凑的物体,也能处理图片和真实场景(如右边的“防弹背心”)。

它还会犯一些非常有趣的错误。例如,在左边的图像(一个“耳机”)中,它完全没有识别出与耳机相关的东西,但它的第四个选择认为是“蚂蚁”。乍看之下这很荒谬,但仔细观察,你会发现这很像从下方看一只蚂蚁的视角:眼睛在向下看你,后面可以看到触角。这可不是你作为一只青蛙愿意看到的蚂蚁视角。在右边的图像中,它虽然没有得到正确答案,但它的所有答案都是圆柱形物体。


另一个成功领域:语音识别

神经网络和我(指演讲者)非常擅长的另一个任务是语音识别,或者至少是语音识别系统的一部分。

语音识别系统包含多个阶段。首先,它们对声波进行预处理,为每10毫秒的声波获取一个声学系数向量,因此每秒会得到100个这样的向量。然后,它们取几个相邻的声学系数向量,需要据此对正在发音的是哪个音素的哪个部分下注。因此,它们观察这个小窗口,并判断在窗口中心,他们认为是什么音素以及是该音素的哪一部分。

一个好的语音识别系统会为每个音素准备许多替代模型,每个模型可能包含三个不同的部分。因此,系统可能认为当前片段是数千种可能片段中的一种,并且需要对这数千种可能性都下注。下注完成后,会有一个解码阶段,它尽可能好地利用这些看似合理的下注,将它们拼接成一个符合人们说话习惯的序列。

目前,由多伦多大学的George DahlAbdel-rahman Mohamed开创的深度神经网络,在声学模型上的表现优于以往的机器学习方法,并且已经开始应用于实际系统。Mohamed开发了一个使用多层二元神经元的系统,它接收一些声学帧并对标签进行下注。他们在一个相对较小的数据库上工作,使用了183个替代标签。为了使系统工作,他们进行了一些预训练(这将在课程后半部分描述)。经过标准的后处理后,他们在一个非常标准的基准测试(类似于语音领域的MNIST)上获得了20.7%的错误率。而之前在该基准测试上,说话人无关识别的最佳结果是24.4%。微软研究院一位经验丰富的语音研究员意识到,这是一个足够大的改进,可能会改变语音识别系统的构建方式,事实也确实如此。

观察近期的结果,来自几个领先语音研究团队的数据显示:

  • 微软证明,这种深度神经网络用作语音系统中的声学模型时,能将错误率从27.4% 降低到18.5%。或者,可以理解为将获得可比性能所需的训练数据量从2000小时减少到309小时
  • IBM在大词汇量语音识别的标准任务中拥有最佳系统之一,其高度优化的系统错误率为18.8%,但也被这种深度神经网络超越。
  • 谷歌最近在大量语音数据(5800小时,但仍远少于其高斯混合模型的训练数据)上训练了一个深度神经网络。即使使用更少的数据,它的表现也远超之前的技术,将错误率从16% 降低到12.3%,并且错误率仍在持续下降。在最新的Android系统中,如果你使用语音搜索,它正在使用这种深度神经网络来实现高质量的语音识别。

总结

本节课中,我们一起学习了为什么需要机器学习。我们了解到,对于编写明确程序极其困难或规则复杂多变的任务(如物体识别、欺诈检测),机器学习提供了一种通过从示例中学习来自动生成解决方案的强大方法。我们以MNIST手写数字识别为例,说明了机器学习任务的典型特征。此外,我们还看到了机器学习在更复杂领域(如大规模图像分类和语音识别)取得的显著成功,这些成功证明了深度神经网络等现代机器学习技术的巨大潜力。

1.2:什么是神经网络 🧠

在本节课中,我们将要学习神经网络的生物学灵感来源——真实的大脑神经元。虽然本课程大部分内容将专注于人工神经网络,但了解其灵感来源有助于我们理解这种计算范式的核心思想。

概述:为何研究神经元网络

研究神经元网络如何进行计算,主要有以下几个原因。

首先,是为了理解大脑的实际工作原理。仅通过实验研究大脑非常困难,因为它结构庞大复杂,且无法承受直接的物理干预。因此,我们需要借助计算机模拟来帮助理解实证研究中的发现。

其次,是为了理解一种受大脑启发的并行计算风格。大脑能够通过一个由相对缓慢的神经元组成的大型并行网络进行计算。理解这种计算风格,可能有助于我们制造出更好的并行计算机。这种计算方式与传统的串行处理器截然不同,它非常擅长处理大脑所擅长的事务(如视觉识别),但在处理大脑不擅长的事务(如数字乘法)时则表现不佳。

第三个原因,也是与本课程最相关的,是为了利用受大脑启发的新型学习算法来解决实际问题。这些算法即使并非大脑真实的工作方式,也可能非常有用。

因此,在本课程的大部分时间里,我们不会过多讨论大脑的实际工作机制,它主要作为一个灵感来源,告诉我们大型并行神经元网络能够进行非常复杂的计算。不过,在本视频中,我们将更多地探讨大脑的实际工作原理。

真实神经元的结构与功能

上一节我们介绍了研究神经元网络的动机,本节中我们来看看真实神经元的具体结构。

一个典型的皮层神经元具有以下基本物理结构:

  • 细胞体:神经元的核心部分。
  • 轴突:用于向其他神经元发送信号。
  • 树突:用于接收来自其他神经元的信号。

当一个神经元的轴突与另一个神经元的树突接触时,会形成一个叫做突触的结构。沿着轴突传播的动作电位(电脉冲)会导致电荷被注入到突触后神经元中。

当神经元在其树突中接收到足够的电荷,使细胞体上一个叫做轴丘的部分去极化时,它就会产生动作电位。轴丘去极化后,神经元会沿着其轴突发送出一个电脉冲,这个脉冲就是沿着轴突传播的去极化波。

突触:学习发生的关键

我们了解了神经元如何传递信号,接下来聚焦于信号传递的关键节点——突触。

突触本身具有有趣的结构,它们包含微小的神经递质化学物质囊泡。当动作电位到达轴突末端时,会导致这些囊泡移动到细胞膜表面,并将神经递质释放到突触间隙中。

神经递质有多种类型,有些实现正权重(兴奋性),有些实现负权重(抑制性)。这些递质分子扩散穿过突触间隙,并与突触后神经元膜上的受体分子结合。结合后,这些大分子的形状发生改变,从而在膜上形成孔洞。这些孔洞允许特定的离子流入或流出突触后神经元,从而改变其去极化状态。

突触具有适应性,这正是大多数学习过程的基础:改变突触的效能。它们可以通过改变每次动作电位到达时释放的囊泡数量,或改变对释放的递质分子敏感的受体分子数量来适应。

与计算机内存相比,突触的速度非常慢,但它们具有许多优势:体积非常小、功耗极低,并且能够适应。适应性是最重要的特性,它们利用局部可用的信号来改变自身强度,这就是我们学会执行复杂计算的方式。当然,核心问题在于它们如何决定改变强度,即适应规则是什么。

大脑如何工作:一个整体视图

前面我们分解了神经元和突触的细节,现在让我们从整体上理解大脑的工作方式。

大脑的工作原理可以概括如下:

  • 每个神经元接收来自其他神经元的输入(少数神经元直接从感受器接收输入)。
  • 神经元通过发送动作电位在皮层中相互通信。
  • 输入线路对神经元的影响由突触权重控制,权重可以是正值或负值。
  • 这些突触权重具有适应性
  • 通过调整这些权重,整个网络学会执行不同类型的计算,例如识别物体、理解语言、制定计划、控制身体运动。

人脑拥有大约1011个神经元,每个神经元约有104个权重,因此总共有大约1014到1015个突触权重。在极短的时间(几毫秒)内,其中很大一部分权重可以影响正在进行的计算。与存储知识交互的带宽,甚至比现代工作站还要高。

关于大脑的最后一个要点是,皮层是模块化的,或者说它学会了模块化。皮层的不同部分最终会负责不同的功能。从遗传学上讲,来自感官的输入会到达皮层的不同区域,这在很大程度上决定了它们最终的功能。

成年人大脑的局部损伤会导致特定的功能丧失。例如,一个区域的损伤可能导致失去理解语言的能力,另一个区域的损伤可能导致失去识别物体的能力。我们通过脑部扫描(如fMRI)可以了解功能在大脑中的定位,因为当使用大脑的某一部分执行任务时,该部分需要更多能量,从而导致血流量增加,这在扫描仪上可以观察到。

但皮层的显著之处在于,它各处看起来都非常相似。这强烈表明它内部包含一个相当灵活、通用的学习算法。这一点也得到了早期大脑损伤研究的支持:如果大脑在早期受损,功能会重新定位到大脑的其他部分。因此,大脑的哪部分执行哪项功能并非完全由遗传预先决定。

在幼貂身上进行的令人信服的实验表明,如果切断听觉皮层来自耳朵的输入,并将视觉输入重新路由到听觉皮层,那么原本注定处理声音的听觉皮层实际上会学会处理视觉输入,并产生看起来非常像视觉系统中神经元的细胞。这表明皮层是由通用材料构成的,它有能力根据经验转变为执行特定任务的专用硬件。这提供了一个很好的组合:学习后的快速并行计算能力,加上灵活性,使你能够学习新的功能。这很像FPGA(现场可编程门阵列):你先构建一些标准的并行硬件,然后在构建完成后,输入信息告诉它执行特定的并行计算。

传统的计算机通过存储串行程序来获得灵活性,但这需要非常快速的中央处理器来访问串行程序中的指令并执行长串行计算。

总结

本节课中我们一起学习了神经网络的生物学基础。我们探讨了研究神经元网络的三个主要原因,详细了解了真实神经元和突触的结构与功能,并从整体上概述了大脑通过可适应的突触权重进行并行计算的工作原理。最后,我们认识到大脑皮层具有模块化和通用学习算法的特性,这为构建灵活而强大的人工神经网络提供了深刻的灵感。理解这些生物学原理,为我们后续学习人工神经网络模型奠定了重要的概念基础。

1.3:几种简单的神经元模型 🧠

在本节课中,我们将学习几种相对简单的神经元模型。我们将从最简单的线性神经元和阈值神经元开始,逐步介绍一些稍复杂的模型。这些模型远比真实的生物神经元简单,但它们仍然足够复杂,能让我们构建出可以进行有趣机器学习的神经网络。

为了理解任何复杂的事物,我们必须对其进行理想化。这意味着我们需要进行简化,以便掌握其工作原理。例如,对于原子,我们将其简化为类似小型太阳系的行为。

理想化移除了那些对于理解主要原理并非必要的复杂细节。它允许我们应用数学,并与其他熟悉的系统进行类比。一旦我们理解了基本原理,就很容易增加复杂性,使模型更贴近现实。当然,在进行理想化时,我们必须小心,不要移除赋予事物主要特性的部分。只要我们不忘记它们是错误的,理解那些已知是错误的模型通常也是有价值的。

例如,许多神经网络研究使用输出实数值而非离散脉冲的神经元。我们知道大脑皮层神经元并非如此工作,但理解这类系统仍然有价值,并且在实践中,它们对机器学习非常有用。

线性神经元

首先,我们来介绍最简单的神经元类型:线性神经元。它很简单,计算能力有限。它可能帮助我们洞察更复杂的神经元,但也可能有些误导性。

在一个线性神经元中,输出 y 是神经元偏置 b 与所有输入连接加权和的一个函数。具体来说,加权和是每条输入线上的活动值乘以该线上的权重(即输入线上的突触权重)。

其公式可以表示为:
y = b + Σ (x_i * w_i)

如果我们以偏置 b 加上输入线的加权活动值之和为横轴,输出 y 为纵轴绘图,会得到一条穿过原点的直线。

二元阈值神经元

与线性神经元截然不同的是由麦卡洛克和皮茨提出的二元阈值神经元。冯·诺依曼在设计通用计算机时,实际上受到了它们的影响。

在二元阈值神经元中,首先计算输入的加权和。如果这个加权和超过了某个阈值,神经元就会发放一个活动脉冲。

麦卡洛克和皮茨认为,这些脉冲就像命题的真值。因此,每个神经元都在组合来自其他神经元的真值,以产生自己的真值。这就像组合一些命题来计算另一个命题的真值。在20世纪40年代,逻辑是解释心智如何运作的主要范式。自那以后,人们思考大脑如何计算时,开始对大脑组合许多不同来源的不可靠证据这一想法更感兴趣,因此逻辑不再是解释大脑活动的好范式。

对于二元阈值神经元,可以将其输入输出函数理解为:如果加权输入高于阈值,则输出为1;否则输出为0。

实际上,有两种等价的方式来描述二元阈值神经元的方程:

  1. 我们可以说总输入 z 就是输入线上的活动值乘以权重:z = Σ (x_i * w_i)。然后,如果 z 高于阈值 θ,则输出 y 为1,否则为0:y = 1 if z > θ else 0
  2. 或者,我们可以说总输入包含一个偏置项:z = b + Σ (x_i * w_i)。然后,如果总输入 z 大于0,则输出 y 为1,否则为0:y = 1 if z > 0 else 0

这两种表述的等价性在于,第一种表述中的阈值 θ 等于第二种表述中偏置 b 的负值:θ = -b

整流线性神经元

一种结合了线性神经元和二元阈值神经元特性的神经元是整流线性神经元。

它首先计算其输入的线性加权和,但其输出是这个加权和的线性函数。我们像之前一样计算 z。如果 z 小于0,则输出0;否则,输出等于 z。因此,在0以上是线性的,而在0点则做出一个硬性决策。

其输入输出曲线如下图所示。它肯定不是线性的,但在0以上是线性的。使用这样的神经元,当输入大于0时,我们可以获得线性系统的许多优良特性,同时也获得了在0点做出决策的能力。

Sigmoid神经元

本课程中我们将大量使用,并且可能是人工神经网络中最常用的神经元类型是Sigmoid神经元。它们输出一个实数值,该值是其总输入的平滑且有界函数。

通常使用逻辑函数。总输入的计算方式与之前相同:偏置 b 加上加权输入线信号之和 Σ (x_i * w_i)

逻辑神经元的输出公式为:
y = 1 / (1 + e^(-z))

思考一下这个公式:如果总输入 z 是一个很大的正数,e^(-z) 趋近于0,因此输出 y 将趋近于1。如果总输入 z 是一个很大的负数,e^(-z) 是一个很大的数,因此输出 y 将趋近于0。所以其输入输出函数曲线如下图所示。当总输入为0时,e^0 = 1,所以输出是0.5。

Sigmoid函数的优点在于它具有平滑的导数。导数连续变化,因此它们行为良好,使得学习过程更容易进行,我们将在第三讲中看到这一点。

随机二元神经元

最后,我们来介绍随机二元神经元。

它们使用与逻辑单元完全相同的方程来计算总输入 z,并使用逻辑函数计算一个实数值 p,这个值代表它们输出一个脉冲的概率。

但是,它们并不将这个概率 p 作为实数值输出,而是实际做出一个概率性决策。因此,它们实际输出的是1或0。它们是内在随机的。所以,它们将 p 视为产生1的概率,而不是一个实数值。当然,如果输入是非常大的正数,它们几乎总是产生1;如果输入是非常大的负数,它们几乎总是产生0。

随机脉冲与整流线性单元

我们可以对整流线性单元进行类似的变换。

我们可以说,当整流线性单元的输入大于0时,其输出的实数值是产生脉冲的速率。这是确定性的。

但是,一旦我们计算出这个脉冲产生速率,脉冲实际产生的时间就是一个随机过程,它是一个泊松过程。因此,整流线性单元决定了速率,但单元内在的随机性决定了脉冲实际产生的时间。


本节课中,我们一起学习了从线性神经元、二元阈值神经元到整流线性神经元、Sigmoid神经元以及随机二元神经元等多种简单的神经元模型。我们了解了每种模型的基本计算方式和特点,例如线性神经元的简单加权和、阈值神经元的决策特性、Sigmoid神经元的平滑非线性以及随机神经元的概率性输出。理解这些基础模型是构建和理解更复杂神经网络的关键第一步。

1.4:一个简单的学习示例 🧠

在本节课中,我们将通过一个非常简单的神经网络示例,来直观地理解机器学习是如何工作的。我们将看到这个网络如何学习识别手写数字,并观察在学习算法运行过程中,网络权重是如何演变的。

网络结构与学习目标

上一节我们介绍了神经网络的基本概念,本节中我们来看看一个具体的应用实例。我们将训练一个极其简单的网络来识别手写形状。

这个网络只有两层神经元:

  • 输入层神经元:其活动代表图像像素的灰度值。
  • 输出层神经元:其活动代表不同的数字类别(0-9)。

我们的目标是:当向网络展示一个特定形状(例如数字“2”)时,代表该形状的输出神经元(“2”号神经元)能够被激活。其工作原理是,每个活跃的像素会为包含该像素的形状“投票”。一个像素可以为多个形状投票,且投票的“强度”可以不同。获得最多投票的形状将胜出。这里我们假设输出单元之间存在竞争机制,这个机制我们将在后续课程中详细解释。

权重的可视化方法

为了理解学习过程,我们首先需要决定如何展示成千上万的连接权重。将权重直接写在每条连接线上是不可行的。

因此,我们为每个输出单元创建一个小型权重图。在这张图中,每个输入像素的位置上,我们显示从该像素连接到当前输出单元的权重强度。我们使用黑白圆点来表示权重:

  • 圆点面积:代表权重的大小
  • 圆点颜色:代表权重的正负(例如,黑色为正,白色为负)。

你最初看到的权重只是随机初始化的小权重值。

简单的学习算法

接下来,我们将向网络展示数据,并让它学习比随机权重更好的权重值。

我们采用的学习规则如下:

  1. 增强正确连接:当展示一张图像时,我们增加从图像中活跃像素连接到正确类别输出单元的权重。
  2. 抑制猜测连接:同时,我们减少从活跃像素连接到网络当前猜测类别输出单元的权重。

如果我们只做第一步,权重只会不断增大,最终任何图像都会导致每个类别获得巨大的输入。因此,我们需要一种控制权重的方法。通过同时执行第二步,我们实际上是在训练网络去做正确的事,而不是强化它当前倾向于做的事。

当然,如果网络已经猜对了,那么第一步的增强和第二步的抑制将会完全抵消,权重保持不变,这正是我们期望的结果。

观察学习过程

以下是学习过程的直观展示。初始时,所有权重都是随机的小值。

现在,我们向网络展示几百个训练样本,然后再次观察权重。可以看到,权重已经开始变化,并初步形成了有规律的图案。

我们再展示几百个样本,权重的变化更加明显。继续这个过程,经过数千次训练后,权重基本达到了它们的最终值。

关于学习算法的具体细节,我们将在未来的课程中深入讨论。但现在你可以看到,学习后的权重看起来像是每个数字的“小模板”。例如,连接到“1”号输出单元的权重,看起来就像一个识别“1”的模板。

但它们并不完全是完美的模板。例如,观察连接到“9”号单元的权重,你会发现中线以下几乎没有正权重。这是因为网络需要区分“9”和“7”(或“4”),中线以下的像素对于这个区分任务用处不大,网络必须通过判断顶部是圆圈还是横杠来区分。因此,这些输出单元将注意力集中在了关键的区分特征上。

简单网络的局限性

这个学习算法的一个特点是,由于网络结构过于简单,它无法学会一种非常有效的形状区分方法。

它所学到的东西,等价于为每个形状准备一个模板,然后根据哪个形状的模板与墨水(像素)重叠最多来决定胜者。问题在于,手写数字的变化方式过于复杂,无法通过简单的整体形状模板匹配来捕捉。

你必须首先提取特征(如线条、端点、圆圈),然后再分析这些特征的组合方式,才能有效建模数字的允许变体。

示例说明

这里有一些我们已经看过的例子。观察绿色框中的那些“2”,你会发现没有一个模板能很好地匹配所有这些“2”,同时又能明确地不匹配红色框中的那个“3”。

因此,像这样的简单网络根本无法解决这个复杂的问题。网络已经尽了最大努力,但它能力有限。

总结

本节课中,我们一起学习了一个简单的两层神经网络如何通过“增强正确连接,抑制猜测连接”的规则来学习识别手写数字。我们看到了权重如何从随机值演变为类似数字模板的图案,同时也认识到这种简单网络的局限性——它只能进行简单的模板匹配,无法处理手写数字复杂多变的结构。这为我们后续学习更强大的、能够自动提取特征的深层神经网络奠定了基础。

1.5:三种学习类型 🧠

在本节课中,我们将学习机器学习的三种主要类型:监督学习、强化学习和无监督学习。我们将逐一探讨它们的定义、目标、应用场景以及核心区别。课程的前半部分将重点介绍监督学习,后半部分则主要关注无监督学习,而强化学习将不在本课程中详细展开。


监督学习

上一节我们介绍了机器学习的三种主要类型,本节中我们来看看第一种:监督学习。在监督学习中,我们的目标是在给定输入向量时,预测一个输出。监督学习的目的非常明确。

监督学习本身又分为两种不同的形式:

以下是两种主要的监督学习任务:

  • 回归:目标输出是一个实数或一个实数向量。例如,预测一支股票六个月后的价格或明天中午的温度。其目标是尽可能接近正确的实数。
  • 分类:目标输出是一个类别标签。最简单的情况是在1和0(正例和负例)之间做选择。当然,我们也可以有多个备选标签,例如对手写数字进行分类。

监督学习的工作原理如下:首先选择一个模型类,即我们准备考虑作为候选的一整套模型。你可以将模型类看作一个函数,它接收一个输入向量和一些参数,并给出一个输出 y。因此,模型类只是一种使用某些数值参数 W 将输入映射到输出的方式。

然后,我们调整这些数值参数,使映射关系拟合监督训练数据。所谓“拟合”,是指最小化每个训练案例的目标输出与我们的机器学习系统产生的实际输出之间的差异

如果输出是实数值,一个衡量差异的直观指标是我们的系统输出 Y 与正确输出 T 之间的平方差。我们通常会加上一个 1/2 系数,以便在求导时消去系数 2

对于分类任务,虽然也可以使用这个指标,但后续我们会介绍其他更合理的衡量标准,而且这些标准通常效果也更好。


强化学习

在了解了需要明确目标输出的监督学习后,我们来看看第二种类型:强化学习。在强化学习中,智能体需要选择动作或动作序列,其依据是偶尔获得的奖励。

选择每个动作的目标是最大化未来奖励的期望总和。我们通常会使用一个折扣因子,这样就不必看得太远。这意味着,遥远的未来奖励不如近期获得的奖励重要。

强化学习是困难的。其难点在于奖励通常是延迟的,因此很难在长序列的动作中确切知道是哪个动作导致了问题。此外,稀疏的奖励(尤其是偶尔才出现的奖励)所提供的用于调整参数的信息量很少。因此,通常无法使用强化学习来学习数百万个参数。

而在监督学习和无监督学习中,则可以做到。通常,在强化学习中,我们试图学习几十个或可能几百个参数,但不会是数百万个。


无监督学习

由于课程无法涵盖所有内容,我们将不涉及强化学习,尽管它是一个重要主题。无监督学习将在课程的后半部分进行讲解。

在大约40年的时间里,机器学习界基本上忽视了无监督学习,除了一种非常有限的形式——聚类。事实上,他们使用的机器学习定义甚至将其排除在外。在一些教科书中,机器学习被定义为从输入到输出的映射。许多研究人员认为聚类是无监督学习的唯一形式。

造成这种情况的一个原因是,很难说清无监督学习的目标是什么。

一个主要目标是创建一种对输入有用的内部表示,以用于后续的监督学习或强化学习。我们之所以希望分两个阶段进行,是因为我们不想(例如)使用强化学习的回报来设置我们视觉系统的参数。

你可以通过双眼图像之间的视差来计算到物体表面的距离。但你不想通过反复撞到脚趾,并在每次撞到脚趾时调整视觉系统的参数来学习这种距离计算。那将需要撞到脚趾非常多次。有更好的方法,可以仅基于输入中的信息来学习融合两幅图像。

无监督学习的其他目标包括:

以下是几个无监督学习的目标:

  • 提供输入的紧凑、低维表示:像图像这样的高维输入,通常位于或接近一个低维流形。对于手写数字这样的数据,可能存在多个这样的流形。这意味着,即使你有一百万个像素,实际可能发生的变化自由度并没有一百万那么多,可能只有几百个。因此,我们希望从一百万个像素转换到能表示这几百个自由度的表示,这相当于说明我们在流形上的位置。同时,我们还需要知道我们位于哪个流形上。一个非常有限的形式是主成分分析,它是线性的,并假设只有一个流形,且该流形是高维空间中的一个平面。
  • 提供基于学习特征的输入的经济表示:例如,如果我们能用二进制特征来表示输入,这通常是经济的,因为表示一个二进制特征的状态只需要一个比特。或者,我们可以使用大量实值特征,但要求对于每个输入,这些特征中几乎全部恰好为0。在这种情况下,对于每个输入,我们只需要表示少数几个实数,这也是经济的。
  • 在输入中发现聚类:如前所述,聚类可以被视为一种非常稀疏的编码。也就是说,我们为每个聚类设置一个特征,并要求除了一个特征外,所有特征都为0,而那个特征值为1。因此,聚类实际上是寻找稀疏特征的一个极端情况。

总结

本节课中,我们一起学习了机器学习的三种主要类型。监督学习旨在根据输入预测明确的输出,分为回归(预测实数值)和分类(预测类别标签)。强化学习则关注通过选择动作来最大化延迟的、稀疏的奖励总和,其学习过程更具挑战性。最后,无监督学习的目标是发现输入数据中有用的内部结构或表示,例如降维、特征学习或聚类,它为理解复杂数据提供了基础,而无需明确的输出标签。本课程后续将重点深入探讨监督学习和无监督学习。

2.1:神经网络架构类型 🧠

在本节课中,我们将学习神经网络的不同架构类型。所谓“架构”,指的是神经元之间的连接方式。理解这些基本架构是深入学习神经网络工作原理的第一步。

前馈神经网络 📤

最常见的神经网络架构是前馈神经网络。在这种网络中,信息从输入单元进入,沿着单一方向流经一个或多个隐藏层,最终到达输出单元。

以下是前馈神经网络的主要特点:

  • 结构层次:包含输入层、一个或多个隐藏层以及输出层。
  • 深度网络:当隐藏层多于一层时,我们称之为深度神经网络。
  • 信息变换:网络在输入和输出之间计算一系列变换。每一层都会生成输入的一个新表示。
  • 非线性:为了实现有效的表示学习,每一层神经元的激活值必须是其下层神经元激活值的非线性函数。例如,在语音识别中,我们希望不同说话者说的相同内容在经过网络各层后变得更相似,而同一说话者说的不同内容变得更不相似。

上一节我们介绍了最常见的前馈网络,本节中我们来看看一种功能更强大但也更复杂的架构。

循环神经网络 🔁

循环神经网络比前馈神经网络更强大。它们的连接图中包含有向循环,这意味着从一个神经元出发,沿着箭头方向有时可以回到起点。这种结构带来了复杂的动态特性,但也使得训练它们非常困难。

目前,人们非常关注寻找训练循环网络的有效方法,因为一旦能够成功训练,它们将非常强大。此外,循环神经网络也更接近生物神经网络的实际情况。具有多个隐藏层的循环网络,实际上只是更一般的循环网络的一种特例,其中某些隐藏层到隐藏层的连接被省略了。

循环神经网络是建模序列数据的自然方式。以下是其工作原理:

  • 时间深度:隐藏单元之间的连接使得网络在时间上非常“深”。在每一个时间步,隐藏单元的状态决定了下一个时间步隐藏单元的状态。
  • 权重共享:与普通前馈网络不同,循环网络在每个时间步使用相同的权重矩阵(如图中红色箭头所示)。输入和输出在每个时间步也使用相同的权重矩阵。
  • 记忆能力:循环网络有能力在其隐藏状态中长时间记住信息。然而,训练它们使用这种能力相当困难。幸运的是,近期的算法已经在这方面取得了进展。

为了展示循环神经网络的能力,我们来看一个由Ilya Sutskever设计的网络示例。该网络经过大量英文维基百科文本训练,用于预测序列中的下一个字符。训练后,让它根据给定的字符序列生成文本(通过从预测的概率分布中采样下一个字符),结果如下:

“Several Irish intelligence agencies in the Mediterranean region... Such that it is the blurring of appearing on any well paid type of box printer.”

请注意,这段文本是一个字符一个字符生成的。它能够组成基本合理的句子,并且几乎全部由真实的英文单词构成。句子内部也具有一定的主题连贯性。这表明网络通过阅读维基百科并尝试预测下一个字符,学到了大量的语言结构知识。

对称连接网络 ⚖️

与循环网络截然不同的是对称连接网络。在这种网络中,两个单元之间的连接在两个方向上具有相同的权重。

John Hopfield等人意识到,对称网络比循环网络更容易分析。这主要是因为它们的功能受到更多限制,因为它们遵循一个能量函数。例如,它们无法建模循环动态,你无法在这样的对称网络中回到起点。


本节课中我们一起学习了三种主要的前馈神经网络循环神经网络对称连接网络。前馈网络结构简单、应用广泛;循环网络擅长处理序列数据并具有记忆能力,但训练复杂;对称网络则因其能量函数的特性而易于分析。理解这些基础架构是探索更高级神经网络模型和应用的关键。

2.2:感知机——第一代神经网络 🧠

在本节课中,我们将要学习感知机,这是20世纪60年代早期研究的第一代神经网络模型。我们将了解它的工作原理、历史背景、强大的学习算法以及其固有的局限性。

概述

感知机是一种统计模式识别系统。它首先将原始输入转换为一系列特征激活值,然后通过学习为每个特征分配权重,最后通过一个决策单元来判断输入是否属于目标类别。

感知机的工作原理

上一节我们介绍了感知机的基本概念,本节中我们来看看它的具体工作流程。

在统计模式识别中,存在一种标准的模式识别方法。

我们首先获取原始输入,并将其转换为一组特征激活值向量。这个过程使用基于常识的手写程序完成,因此系统的这一部分不进行学习。我们观察问题,决定哪些是好的特征,尝试一些特征,看它们是否有效。如果无效,则尝试更多特征,最终得到一组能通过后续学习阶段解决问题的特征。

我们学习的是如何为每个特征激活值分配权重,以获得一个单一的标量值。特征的权重代表了该特征为“当前输入是目标模式”这一假设提供支持或反对证据的程度。

将所有加权特征相加,我们就得到了支持“这是目标模式”这一假设的总证据。如果该证据超过某个阈值,我们就判定该输入是我们试图识别的模式类别的正例。

感知机的定义与结构

了解了基本原理后,我们来看看感知机的具体定义。

感知机是统计模式识别系统的一个特定例子。实际上存在许多不同类型的感知机,但标准类型(罗森布拉特称之为α感知机)由一些输入组成,这些输入随后被转换为特征活动。转换过程可能由类似神经元的部件完成,但系统的这一阶段不学习。

一旦获得特征活动,你就可以学习一些权重。这样你就可以用特征活动乘以权重,并通过判断“特征活动乘以学习到的权重”之和是否大于阈值,来决定它是否是你感兴趣的类别的例子。

历史背景与争议

感知机有着有趣的历史。它在20世纪60年代早期由弗兰克·罗森布拉特推广。他写了一本名为《神经动力学原理》的大部头著作,其中描述了许多不同类型的感知机。

那本书充满了思想。书中最重要的内容是一个非常强大的学习算法,或者看起来非常强大的学习算法。人们为感知机使用这种学习算法所能做的事情做出了许多宏大的宣称。

以下是当时的一些宣称例子:

  • 例如,人们声称感知机可以区分坦克图片和卡车图片,即使坦克和卡车部分被森林遮挡。

然而,其中一些宣称后来被证明是错误的。在坦克和卡车的案例中,结果发现坦克的图片是在晴天拍摄的,而卡车的图片是在阴天拍摄的。感知机所做的只是测量所有像素的总强度。这是我们人类相当不敏感的东西。我们注意到图片中的物体,但感知机很容易学会累加总强度。😊

正是这类事情给算法带来了坏名声。1969年,明斯基和帕普特出版了一本名为《感知机》的书,分析了感知机能做什么,并指出了它们的局限性。许多人认为这些局限性适用于所有神经网络模型。人工智能领域的普遍看法是,明斯基和帕普特已经证明神经网络模型是无稽之谈,或者它们无法学习困难的事物。

明斯基和帕普特本人知道他们并没有证明这一点。他们只是证明了那种适用于强大学习算法的感知机无法做很多事情。或者更准确地说,它们无法通过学习来完成这些事情。如果你在输入中手动编码答案,它们可以做到,但无法通过学习做到。但这个结果被过度泛化了。当我在20世纪70年代开始研究神经网络模型时,人工智能领域的人不断告诉我,明斯基和帕普特已经证明这些模型不好。

实际上,感知机收敛过程(我们稍后会看到)至今仍被广泛用于具有非常大特征向量的任务。例如,谷歌就用它来根据非常大的特征向量预测事物。

决策单元与偏置处理

现在,让我们深入了解感知机的核心计算单元。

感知机中的决策单元是一个二元阈值神经元。我们之前见过这些神经元,为了帮你回忆:它们计算从其他神经元获得的输入的加权和,加上一个偏置,得到它们的总输入。然后,如果该总和超过0,则输出1;否则输出0。

我们不希望必须有一个单独的学习规则来学习偏置。事实证明,我们可以像处理权重一样处理偏置。如果我们取每个输入向量,在其前面附加一个1,并将偏置视为该始终为1的第一个特征的权重,那么偏置就只是阈值的负数。使用这个技巧,我们不需要为偏置设置单独的学习规则。这完全是等价的。

为了学习这个额外维度上的权重。

感知机学习算法

上一节我们介绍了如何简化模型,本节中我们来看看感知机强大的学习过程。

以下是感知机非常强大的学习过程。这是一个保证有效的学习过程,这是一个很好的特性。😊当然,你稍后必须查看细则,了解为什么这个保证并不像你想象的那么好。

我们首先为每个输入向量添加一个值为1的额外分量。现在我们可以忘记阈值了。然后,我们使用任何我们喜欢的策略持续选取训练案例,只要我们确保每个训练案例都能被选取,且等待时间不会太长。我不打算精确定义“等待时间太长”的含义。如果你是数学家,可以思考一下什么可能是好的定义。

选取训练案例后,你查看输出是否正确。如果正确,则不改变权重。如果输出单元输出0,而它本应输出1(换句话说,当它确实是我们要识别的模式实例时,它却说不是),那么我们只需将输入向量加到感知机的权重向量上。相反,如果输出单元输出1,而它本应输出0,则我们从感知机的权重向量中减去输入向量。

令人惊讶的是,这个简单的学习过程保证能找到一组权重,为每个训练案例提供正确答案。但前提是存在这样一组权重。对于许多有趣的问题,并不存在这样一组权重。是否存在一组权重很大程度上取决于你使用什么特征。

因此,事实证明,对于许多问题,困难的部分在于决定使用什么特征。如果你使用了合适的特征,学习可能变得容易;如果你没有使用正确的特征,学习就变得不可能,所有的工作都在于决定特征。

总结

本节课中我们一起学习了感知机,作为第一代神经网络模型的核心。我们了解了它如何作为统计模式识别系统工作,其结构包括特征提取和权重学习的二元阈值决策单元。我们回顾了其历史兴衰,认识到其强大的收敛学习算法具有理论保证,但效能严重受限于手动设计的特征。最终,感知机的局限性并非神经网络的终点,而是指明了特征学习的重要性,为后续更深层网络模型的发展埋下了伏笔。

2.3:感知器的几何视角 🧠

在本节课中,我们将从几何角度理解感知器学习时发生了什么。我们将引入“权重空间”的概念,并在此空间中用平面表示训练样本。学习的目标是让权重向量移动到所有训练样本平面正确的一侧。

理解权重空间 📐

上一节我们介绍了感知器的基本工作原理,本节中我们来看看如何从几何视角理解它。

为了做到这一点,我们必须从“权重空间”的角度来思考。这是一个高维空间,空间中的每一个点都对应着所有权重的一个特定设置。

在这个空间中,我们可以将训练样本表示为平面。学习的过程就是尝试让权重向量移动到所有训练平面的正确一侧。

对于非数学背景的学习者,这部分内容可能比之前的材料更难。你可能需要花相当长的时间来学习接下来的两部分内容。

特别是,如果你不习惯思考高维空间中的超平面,你将需要学习这个概念。例如,要处理14维空间中的超平面,你需要先在脑海中想象三维空间,然后对自己大声说“14”。每个人都是这么做的。

但请记住,当你从13维空间进入14维空间时,你所增加的复杂度,与从2维空间进入3维空间时增加的复杂度是相当的。140维空间非常庞大且复杂。

权重空间与训练平面 🔍

现在,让我们开始思考权重空间。这个空间的维度数量等于感知器中权重的数量。空间中的一个点代表了所有权重的一个特定设置。

假设我们已经消除了阈值,那么每个训练样本都可以在权重空间中表示为一个穿过原点的超平面。

因此,空间中的点对应权重向量,而训练样本对应平面。对于一个特定的训练样本,权重必须位于该超平面的某一侧,才能为该样本给出正确答案。

让我们通过一张图来理解发生了什么。

这是一张权重空间的示意图。我们暂时只考虑一个训练样本。它定义了一个平面,在这张二维图中就是那条黑线。该平面穿过原点,并且垂直于该训练样本的输入向量(图中显示为蓝色向量)。

我们考虑一个正确答案为1的训练样本。对于这类样本,权重向量需要位于超平面的正确一侧才能得到正确答案,即它需要位于与训练向量所指方向相同的超平面那一侧。

对于任何位于超平面那一侧的权重向量(如图中绿色的向量),其与输入向量的夹角将小于90度。因此,输入向量与权重向量的标量积(点积)将是正数。

由于我们已经去除了阈值,这意味着感知器将输出1(即“是”),从而得到正确答案。

反之,如果我们有一个位于平面错误一侧的权重向量(如图中红色的向量),其与输入向量的夹角将大于90度。因此,权重向量和输入向量的标量积将为负数。我们将得到一个小于0的标量积,所以感知器将输出0(即“否”),在这种情况下,我们会得到错误答案。

总结一下:在平面的一侧,所有权重向量都会得到正确答案;在平面的另一侧,所有权重向量都会得到错误答案。

现在,让我们看一个正确答案为0的不同训练样本。

这里我们再次看到权重空间。我们选择了一个不同的输入向量,并且对于这个输入向量,正确答案是0。

同样,这个输入样本对应一个由黑线表示的平面。在这种情况下,任何与输入向量夹角小于90度的权重向量,都会给出正的标量积,从而导致感知器输出1(“是”),从而得到错误答案。

反之,任何位于平面另一侧的输入向量,其夹角将大于90度,它们将正确地给出0的答案。

和之前一样,平面穿过原点,垂直于输入向量。在平面的一侧,所有权重向量都是“坏”的(给出错误答案),在另一侧,它们都是“好”的(给出正确答案)。

现在,让我们把这两个训练样本放在同一张权重空间图中。

我的权重空间图变得有点拥挤了。我把输入向量移开了一点,这样所有向量就不会完全在同一个位置。现在你可以看到,存在一个可能的权重向量构成的锥形区域。

任何位于这个锥形区域内的权重向量,都会为两个训练样本都给出正确答案。

当然,也可能不存在这样的锥形区域。可能没有任何权重向量能为所有训练样本给出正确答案。但如果存在这样的向量,它们就会位于这个锥形区域内。

因此,学习算法需要做的是:逐个考虑训练样本,并以某种方式移动权重向量,使其最终落在这个锥形区域内。

需要注意的一点是:如果你得到一个好的权重向量(即对所有训练样本都有效的向量),它将位于锥形区域内。如果你得到另一个好的权重向量,它也会位于锥形区域内。因此,如果你取这两个权重向量的平均值,这个平均值也会位于锥形区域内。这意味着问题是凸的。两个解的平均值本身也是一个解。

一般来说,在机器学习中,如果你能得到一个凸的学习问题,事情就会变得简单。

核心概念总结 📝

以下是本节课的核心概念总结:

  • 权重空间:一个高维空间,每个维度对应一个权重。空间中的一个点代表一个完整的权重向量配置。
  • 训练样本表示为平面:每个训练样本在权重空间中对应一个穿过原点的超平面。
  • 学习目标:调整权重向量,使其位于所有训练样本平面的“正确一侧”。
  • 凸性:如果存在解(即能正确分类所有样本的权重向量),那么这些解构成一个凸集(如锥形区域)。凸性意味着解的线性组合(如平均值)仍然是解,这简化了学习过程。

本节课中我们一起学习了如何从几何视角理解感知器的学习过程。我们引入了权重空间的概念,并看到训练样本如何在该空间中表示为平面。学习的目标是找到位于所有训练平面正确一侧的权重向量,这通常对应一个凸区域。理解这个几何视角有助于我们更直观地把握感知器的工作原理和学习算法的目标。

2.4:感知机学习为何有效 🧠

在本节课中,我们将学习一个证明,即感知机学习过程最终会将权重向量带入可行解的区域。请注意,本课程主要关注工程实践而非数学证明,因此证明内容较少。然而,通过尝试证明感知机最终能获得正确答案,我们可以更深入地理解其工作原理。

上一节我们介绍了感知机在权重空间中的几何理解。本节中,我们来看看如何利用这种理解来证明感知机最终能找到对所有训练样本都给出正确答案的权重向量,前提是存在这样的向量。

证明思路概述

我们的证明假设存在一个向量,它能对所有训练样本给出正确答案。我们称其为可行向量。在示意图中,绿色点代表一个可行向量。

我们从一个对某些训练样本分类错误的权重向量开始。示意图中展示了一个被错误分类的训练样本。证明的核心思想是:每当感知机犯一个错误时,它都会更新当前的权重向量,使其更接近每一个可行的权重向量。

我们可以将当前权重向量与一个可行权重向量之间的平方距离,表示为沿当前输入向量方向的距离平方,加上与该方向正交的距离平方。正交方向的平方距离不会改变,而沿输入向量方向的平方距离会减小。

因此,我们希望证明:每当感知机犯一个错误,当前权重向量都会更接近所有可行的权重向量。

一个潜在问题与解决方案

然而,上述思路存在一个问题。考虑一个恰好位于某个训练样本决策平面正确一侧的可行权重向量(图中金色点),而当前权重向量恰好位于错误一侧。如果输入向量很大,当我们将其加到当前权重向量上时,实际上可能离那个金色的可行向量更远。因此,我们的“希望”并不总是成立。

但我们可以通过定义一个宽裕可行权重向量来修复这个问题。宽裕可行权重向量不仅对所有训练样本分类正确,而且其正确分类的“裕度”至少与该训练样本的输入向量长度一样大。

于是,在可行解锥内部,我们有了另一个宽裕可行解锥。现在,我们的证明就可以进行了。

核心证明步骤

以下是证明的核心逻辑:

每当感知机犯一个错误时,当前权重向量到所有宽裕可行权重向量的平方距离,将至少减少当前输入向量长度的平方(即我们更新的大小)。

基于此,我们可以给出一个非正式的收敛性证明草图。每次犯错,权重向量都会移动,并且它到所有宽裕可行权重向量的平方距离至少减少当前输入向量的平方长度。

因此,到所有宽裕可行权重向量的平方距离至少减少该平方长度。假设没有输入向量是无限小的,这意味着在经过有限次错误后,权重向量必须进入可行区域(如果该区域存在)。注意,它不必进入宽裕可行区域,但至少必须进入可行区域才能停止犯错。

总结与关键前提

本节课中我们一起学习了感知机学习算法收敛性的一个非正式证明。证明的核心在于展示了每次错误更新如何使权重向量更接近一组“更好”的解(宽裕可行解),从而最终达到一个可行解。

但请注意,整个证明都依赖于一个关键前提:存在一个宽裕可行的权重向量。如果不存在这样的向量,整个证明将不成立。这提醒我们,感知机学习算法的有效性依赖于数据本身是线性可分的,并且存在一个具有足够分类裕度的解。

2.5:感知机的局限性 🧠

在本节课中,我们将探讨感知机的局限性。这些局限性源于所使用的特征类型。如果使用正确的特征,感知机几乎可以完成任何任务。但如果使用错误的特征,其学习部分的能力将受到极大限制。这正是感知机一度失宠的原因,同时也强调了机器学习中的一个核心难点:学习正确的特征本身

即使不了解特征,我们仍能通过大量手动设计的特征进行学习。例如,判断一个句子是否为合理的英语句子,我们可以手动设计大量特征,然后学习如何加权这些特征以做出判断。但从长远来看,学习特征本身是必要的。

感知机为何停滞不前?🤔

神经网络研究在20世纪60年代末至70年代初陷入停滞,原因在于感知机被证明存在严重局限性。现在,我们来理解这些局限性是什么。

如果你愿意手动选择特征,并且使用足够多的特征,你几乎可以让感知机完成任何任务。例如,假设我们有一个二进制输入向量,并为每一个可能的二进制输入向量创建一个独立的特征单元(即,每个单元仅被一个特定的输入向量激活)。这将需要指数级数量的特征单元,但理论上,我们可以对二进制输入向量进行任何可能的区分。

然而,这并非解决实际问题的好策略。因为你需要海量的特征单元,并且模型无法泛化。你无法指望通过观察所有可能情况的一个子集,就能正确预测剩余的情况,因为那些剩余情况需要新的特征单元,而你并不知道如何为这些新单元设置权重。

一旦你决定了手动编码的特征,感知机在学习能力上就存在非常强的限制。

一个经典的限制案例:异或问题 ❌

我们将展示,即使是极其简单的任务,感知机也可能无法学习。最经典的例子是“异或”问题。

考虑一个只有两个特征(x1, x2)的问题,每个特征值为0或1。我们定义:

  • 正例:两个特征值相同(即 (1,1) 和 (0,0)),期望输出为1。
  • 负例:两个特征值不同(即 (1,0) 和 (0,1)),期望输出为0。

我们要求一个二元阈值单元(感知机)判断两个特征是否相等。事实证明,它无法学会这个任务。

我们可以用代数方法证明。这四个输入输出对产生了四个不等式,它们不可能同时被满足。

  1. 对于正例 (1,1):1 * w1 + 1 * w2 > θ
  2. 对于正例 (0,0):0 * w1 + 0 * w2 > θ => 0 > θ
  3. 对于负例 (1,0):1 * w1 + 0 * w2 < θ
  4. 对于负例 (0,1):0 * w1 + 1 * w2 < θ

将前两个不等式相加,得到 w1 + w2 > 2θ
将后两个不等式相加,得到 w1 + w2 < 2θ
显然,没有一组权重 (w1, w2) 和阈值 θ 能同时满足这两个矛盾的条件。

我们也可以从几何角度理解。在由特征 x1x2 构成的数据空间中,每个点代表一个数据案例。权重向量定义了一个平面(一条直线),该平面将空间分为两部分:输出为1的区域和输出为0的区域。我们的目标是找到一条直线,将两个绿色点(正例)与两个红色点(负例)分开。从图中可以直观看出,这是不可能的。

我们将这样一组无法被一个超平面(在二维中是直线)正确划分的训练案例,称为非线性可分的数据集。

更致命的限制:平移不变性识别 🔄

一个对感知机更具毁灭性的限制,出现在尝试识别具有平移不变性的简单模式时。

假设我们直接使用像素值作为特征。问题是:一个二元阈值单元能否区分两个不同的模式(一个作为正例,一个作为负例),如果这两个模式包含相同数量的激活像素,并且这种区分必须在模式发生平移(允许循环平移,即移出右边界后从左边界重新进入)时仍然有效?

答案是不能。

以下是证明思路:
考虑模式A(正例)在所有可能平移位置上的所有实例。由于模式A有4个激活像素,那么对于视网膜上的任何一个像素,都会有4个不同的平移位置使得模式A激活该像素。因此,决策单元在所有平移后的模式A实例上接收到的总输入4 * (所有权重之和)

现在考虑模式B(负例)在所有可能平移位置上的所有实例。同理,决策单元在所有平移后的模式B实例上接收到的总输入也是 4 * (所有权重之和)

为了让感知机正确区分,它必须设置权重,使得每一个模式A的实例提供的输入都大于每一个模式B的实例。然而,如果对所有实例求和后,模式A和模式B提供的总输入完全相同,那么上述要求显然不可能实现。

这就证明了,在允许循环平移的情况下,感知机无法学会识别具有平移不变性的模式。这是明斯基和帕佩特群不变性定理的一个特例。这个结果对感知机是毁灭性的,因为模式识别的核心目标之一,正是识别经过变换(如平移)后仍是同一模式的物体。

明斯基和帕佩特证明,如果变换构成一个“群”(如循环平移),那么感知机的学习部分就无法学会这种识别。感知机架构本身仍然可以完成识别,但你必须手动组织特征来完成困难的部分。你需要多个特征单元来识别那些能提供类别信息的子模式,并且对于这些子模式的每一个可能位置,你都需要单独的特征单元。

结论与启示:从感知机到多层网络 🚀

从感知机的局限性中,我们得出了暂时的结论:感知机不够好,因此神经网络也不够好。但更长期的结论是:只有当神经网络能够学习特征检测器本身时,它才会真正强大。仅仅学习特征检测器上的权重是不够的。

没有隐藏单元的神经网络(即单层感知机)在学习建模能力上非常有限。增加更多线性单元层也无济于事,因为组合后仍然是线性的。我们可以通过加入手动编码的隐藏单元来大幅提升其能力,但这些单元并非真正的“隐藏”单元,因为是我们告诉它们该做什么。

我们需要的是多层、自适应的非线性隐藏单元。核心问题随之而来:如何训练这样的网络? 我们需要一种方法来调整所有权重,而不仅仅是像感知机那样只调整最后一层的权重。这很困难。

具体来说,学习进入隐藏单元的权重,就等同于学习特征。这是一项艰巨的任务,因为没有人直接告诉我们隐藏单元应该做什么,应该在何时激活。真正的问题是:我们如何找出学习这些权重的方法,使得隐藏单元能够自动变成解决特定问题所需的那种特征检测器,尤其是在无人告知特征检测器应该是什么样的情况下。

总结:本节课我们一起学习了感知机的核心局限性,包括无法解决非线性可分问题(如异或)以及无法学习具有群变换不变性(如平移)的模式识别。这些局限性凸显了手动设计特征的不足,并引出了神经网络发展的关键方向——开发能够自动学习多层次特征表示(即隐藏单元)的学习算法。这为下一讲即将介绍的、开启了神经网络第二次浪潮的反向传播算法等深度学习方法埋下了伏笔。

3.1:线性神经元的权重学习 🧠

在本节课中,我们将学习线性神经元的权重学习算法。我们将了解它与感知机学习算法的区别,推导其核心的Delta规则,并通过一个简单的例子来理解其工作原理。

概述

本节介绍线性神经元的学习算法。该算法与感知机学习算法相似,但目标不同。感知机学习旨在使权重向量不断接近一组“好”的权重,而线性神经元学习则旨在使神经元的输出值不断接近目标输出值。这种差异对于理解更复杂的多层网络至关重要。

线性神经元与感知机学习的区别

上一节我们介绍了感知机,本节中我们来看看线性神经元的学习有何不同。

感知机的收敛过程通过确保每次权重更新都使其更接近一组好的权重来工作。然而,这种保证无法扩展到更复杂的网络。因为在复杂网络中,平均两组好的权重可能会得到一组坏的权重。因此,对于多层神经网络,我们不使用感知机学习过程。

为了证明学习过程在改进,我们使用了完全不同的证明方法。多层网络本不应被称为“多层感知机”,这在一定程度上是我的错,我为此感到抱歉。

对于多层网络,我们需要一种不同的方式来证明学习过程在取得进展。我们不再证明权重更接近一组好的权重,而是证明实际的输出值更接近目标输出值。即使在非凸问题中,这种方法也可能成立,因为平均两个好的解并不一定能得到一个好的解。这在感知机学习中是不成立的。

线性神经元与平方误差

使输出值更接近目标输出的最简单学习例子,是使用平方误差度量的线性神经元学习。

线性神经元,在电子工程中也称为线性滤波器,其输出是一个简单的输入加权和。因此,神经元的输出 y(即对目标值的估计)是所有输入 x_i 与权重 w_i 乘积的总和。

我们可以用求和形式或向量符号表示:
y = Σ (w_i * x_i)y = w · x

学习的目标是最小化所有训练案例的总误差。为了简化,我们使用目标输出 t 与实际输出 y 之间的平方差作为误差度量:
E = 1/2 * Σ (t - y)^2

一个自然的问题是:为什么不直接解析求解?我们可以为每个训练案例写下一个方程,然后求解最佳权重集。这是标准的工程方法。

以下是两个不使用解析解的原因:

  • 科学原因:我们希望理解真实神经元可能的行为,而它们很可能不是在符号化地求解方程组。
  • 工程原因:我们希望找到一种可以推广到多层非线性网络的方法。解析解依赖于系统的线性和平方误差度量。我们接下来要看到的迭代方法虽然通常效率较低,但更容易推广到更复杂的系统。

一个迭代学习的例子:食堂午餐问题

现在,我们通过一个玩具例子来说明寻找线性神经元权重的迭代方法。

假设你每天都在食堂吃午餐,你的饮食完全由鱼、薯条和番茄酱组成。每天,你点每种食物的份数不同。收银员只告诉你这顿饭的总价。但几天后,你应该能算出每种食物每份的价格。

在迭代方法中,你从对每份食物价格的随机猜测开始,然后调整这些猜测,使其更符合收银员告诉你的整餐价格(即观测到的目标值)。

每顿饭的总价构成了对单个食物份数价格的线性约束,公式如下:
总价 = (鱼份数 * 鱼单价) + (薯条份数 * 薯条单价) + (番茄酱份数 * 番茄酱单价)

食物的单价就像线性神经元的权重。我们可以将权重向量 w 视为(鱼单价, 薯条单价, 番茄酱单价)。

假设收银员使用的真实权重是:鱼 150, 薯条 50, 番茄酱 100。
对于一顿包含 2 份鱼、5 份薯条、3 份番茄酱的餐,真实总价是 850。这就是我们的目标值 t

假设我们初始猜测每份食物都是 50 元。
那么,根据当前权重,我们预测这顿饭的价格 y 是 500。
这产生了 350 的残差误差(目标值与我们当前权重估计值之间的差)。

Delta 规则

然后,我们使用 Delta 规则来修正我们对单价的猜测。
权重 w_i 的变化量 Δw_i 等于:
Δw_i = ε * x_i * (t - y)
其中 ε 是学习率,x_i 是第 i 种食物的份数,(t - y) 是残差。

如果我们设学习率 ε = 1/35(为使计算简单),那么对于这个例子,ε * (t - y) = 10
因此:

  • 鱼权重的变化:Δw_fish = 2 * 10 = 20,新权重为 70。
  • 薯条权重的变化:Δw_chips = 5 * 10 = 50,新权重为 100。
  • 番茄酱权重的变化:Δw_ketchup = 3 * 10 = 30,新权重为 80。

请注意,薯条的权重(从50变为100)实际上变得更差了。这种学习并不保证单个权重会持续变好。变好的是收银员报价与我们估计值之间的总误差。

Delta 规则的推导

现在我们来推导 Delta 规则。
我们从定义误差度量开始,即所有训练案例的平方残差和:
E = 1/2 * Σ (t - y)^2
前面的 1/2 是为了在求导时消去产生的 2。

现在,我们对误差 E 关于其中一个权重 w_i 求导。需要使用链式法则:
∂E/∂w_i = (∂y/∂w_i) * (∂E/∂y)

链式法则很容易记住,你可以想象把两个 ∂y 消掉,但最好别在数学家面前这么做。

  • ∂y/∂w_i 实际上等于 x_i,因为 y 就是 w_i * x_i 的和(对于特定的 iyw_i 的偏导就是 x_i)。
  • ∂E/∂y 等于 -(t - y),因为对 1/2*(t-y)^2 求导,并用 1/2 消去 2,得到 (t-y),再考虑梯度下降需要负号。

因此,∂E/∂w_i = x_i * (-(t - y)) = -x_i * (t - y)

我们的学习规则是,权重的变化量与误差关于该权重的负梯度成正比:
Δw_i = -ε * ∂E/∂w_i
这个负号是因为我们希望误差下降。将上面的导数代入,负号相消,得到:
Δw_i = ε * x_i * (t - y)
对于批量学习,我们需要对所有训练案例求和:
Δw_i = ε * Σ [x_i * (t - y)]

Delta 规则的行为与挑战

我们可以思考这个学习过程,即 Delta 规则,是如何行为的。

  • 它会得到正确答案吗? 可能不存在完美的答案。即使给线性神经元一堆带有期望答案的训练案例,也可能没有一组权重能给出完全正确的答案。但仍然存在一组权重,能在所有训练案例上得到最佳近似,最小化误差度量。如果学习率足够小,学习时间足够长,我们可以无限接近那个最佳答案。
  • 学习速度有多快? 即使对于线性系统,这种迭代学习也可能相当慢。如果两个输入维度高度相关,就很难判断这两个输入维度上的总权重应该分别归因于每个维度多少。例如,如果我们总是得到相同份数的番茄酱和薯条,我们就无法决定价格有多少归因于番茄酱,多少归因于薯条。如果它们几乎总是相同,学习过程可能需要很长时间才能正确地将价格归因于番茄酱和薯条。

Delta 规则与感知机学习规则的关系

Delta 规则的在线版本(在每个训练案例后更新权重)与感知机学习规则非常相似。

以下是两者的比较:

  • 感知机学习规则:当且仅当输出错误时,才根据输入向量 x 来增加或减少权重。
  • 在线 Delta 规则:总是根据输入向量 x 来调整权重,但调整的幅度由残差误差 (t-y) 和学习率 ε 共同缩放。

Delta 规则的一个烦人之处是必须选择学习率。如果学习率太大,系统会不稳定;如果学习率太小,学习一组合理的权重将不必要地漫长。

总结

本节课中我们一起学习了线性神经元的权重学习。我们了解了它与感知机学习在目标上的根本区别:后者优化权重与理想权重的距离,而前者直接优化输出与目标输出的距离。我们通过食堂定价的例子直观理解了迭代学习过程,并推导了核心的 Delta 规则 Δw_i = ε * x_i * (t - y)。最后,我们讨论了该规则的行为、其在输入相关时可能遇到的困难,以及它与感知机学习规则的异同。这种基于梯度下降和平方误差的方法,为后续学习更复杂的多层非线性网络奠定了基础。

3.2:线性神经元的误差曲面 📉

在本节课中,我们将学习线性神经元的误差曲面。通过理解这个误差曲面的形状,我们可以深入了解线性神经元在学习过程中发生了什么。

误差曲面的几何理解

上一节我们介绍了感知器的权重空间。本节中,我们来看看如何通过一个类似但多出一维的空间,来几何化地理解线性神经元权重的学习过程。

我们想象一个空间,其中所有水平维度对应权重,一个垂直维度对应误差。在这个空间中,水平面上的点对应不同的权重设置,而高度则对应使用该组权重在所有训练案例上产生的总误差。

对于一个线性神经元,每组权重产生的误差定义了一个误差曲面。这个误差曲面是一个二次曲面。具体来说:

  • 如果你取一个垂直截面,它总是一个抛物线
  • 如果你取一个水平截面,它总是一个椭圆

注意:这仅适用于使用平方误差的线性系统。一旦我们转向多层非线性神经网络,误差曲面将变得更加复杂。只要权重不是太大,误差曲面仍然是平滑的,但可能会有许多局部最小值。

梯度下降与Delta规则

利用这个误差曲面,我们可以描绘出使用Delta规则进行梯度下降学习时发生的情况。

Delta规则计算的是误差相对于权重的导数。如果你按该导数的比例改变权重,就相当于在误差曲面上进行最陡下降。换句话说,如果我们从上方观察误差曲面,会看到椭圆形的等高线。Delta规则将引导我们垂直于这些椭圆形等高线移动,如图所示。

以上描述的是批量学习的情况,即我们计算所有训练案例的总梯度。但我们也可以进行在线学习,即在每个训练案例之后,我们根据该单个训练案例的梯度按比例改变权重。这更类似于我们在感知器中做的操作。

以下是两种学习方式的对比:

  • 批量学习:计算所有训练数据的平均梯度后更新权重。
  • 在线学习:每处理一个训练数据就立即更新权重。

如图所示,右侧图片中有两个训练案例。要使第一个训练案例正确,权重必须位于其中一条蓝线上;要使第二个正确,则必须位于另一条蓝线上。如果我们从某个红点开始,计算第一个训练案例的梯度,Delta规则会将我们垂直移向那条线。接着考虑另一个训练案例,我们会垂直移向另一条线。如果我们在两个训练案例之间交替,就会来回曲折地移动,逐渐逼近两条线的交点,即那个对两个训练案例都正确的权重集合。

学习缓慢的条件

利用误差曲面的图像,我们也能理解导致学习速度非常缓慢的条件。

如果椭圆被拉得非常长(当训练案例对应的线几乎平行时就会发生这种情况),那么梯度会有一个糟糕的特性。如图中红色箭头所示,梯度在我们不需要移动很远的方向上很大,而在我们需要移动很长距离的方向上却很小。

因此,梯度会迅速将我们带过那个“沟壑”的底部(对应椭圆的短轴),但需要很长时间才能沿着“沟壑”(对应椭圆的长轴)前进。这与我们期望的恰恰相反。我们期望的梯度是在跨越沟壑时小,沿着沟壑时大,但实际情况并非如此。

所以,在简单的最陡下降法中,你按照学习率乘以误差导数的比例来改变每个权重,对于图中所示的这种非常狭长的误差曲面,将会遇到巨大困难。

总结

本节课中,我们一起学习了线性神经元的误差曲面。我们了解到,对于使用平方误差的线性神经元,其误差曲面是一个二次曲面(垂直截面为抛物线,水平截面为椭圆)。我们通过这个几何视角,理解了Delta规则如何在该曲面上进行梯度下降,以及批量学习与在线学习的区别。最后,我们探讨了当误差曲面非常狭长(即训练数据特征高度相关)时,会导致梯度下降学习速度缓慢的问题,因为梯度方向并非最有效的更新方向。这为后续学习更高级的优化算法奠定了基础。

3.3:逻辑输出神经元的权重学习 🧠

在本节课中,我们将学习如何将线性神经元的学习规则,推广到可用于多层非线性神经网络的规则。我们将分两步进行:首先,将学习规则扩展到单个非线性神经元,这里我们以逻辑神经元为例。

上一节我们介绍了线性神经元的学习规则,本节中我们来看看如何将其应用于非线性神经元。

从线性到非线性:逻辑神经元

逻辑神经元首先计算其对数几率,即其总输入。其公式为:

Z = b + Σ (X_i * W_i)

其中,b 是偏置,X_i 是第 i 个输入的值,W_i 是该输入线上的权重。然后,神经元输出 Y,它是 Z 的一个平滑非线性函数。如下图所示,当 Z 为很大的负数时,Y 近似为 0;当 Z 为很大的正数时,Y 近似为 1;在中间区域,Y 平滑且非线性地变化。

这种连续变化的特性使其具有良好的导数,从而使学习变得容易。

计算导数

为了获得逻辑神经元关于权重的导数(这是学习所必需的),我们首先需要计算对数几率 Z 关于某个权重 W_i 的导数。这非常简单,因为 Z 是权重的线性函数:

dZ / dW_i = X_i

类似地,对数几率关于输入 X_i 的导数为:

dZ / dX_i = W_i

接下来,我们需要计算输出 Y 关于对数几率 Z 的导数。输出 Y 由逻辑函数定义:

Y = 1 / (1 + e^{-Z})

其导数为:

dY / dZ = Y * (1 - Y)

这个结果并不直观,其数学推导过程虽然繁琐但完全直接,我们将在下一张幻灯片中展示。

应用链式法则

现在我们已经有了 dY/dZdZ/dW_i,我们可以使用链式法则来计算输出 Y 关于权重 W_i 的导数:

dY / dW_i = (dZ / dW_i) * (dY / dZ) = X_i * [Y * (1 - Y)]

推导学习规则

为了得到完整的学习规则,我们需要误差 E 关于权重 W_i 的变化。我们再次应用链式法则,将 dY/dW_i 乘以误差关于输出的导数 dE/dY

对于单个训练样本,假设误差 E 定义为目标值 t 与实际输出 Y 之差的平方的一半(即均方误差),则 dE/dY = -(t - Y)

因此,对于单个训练样本 n,权重 W_i 的更新量(负梯度方向)为:

ΔW_i ∝ - dE / dW_i = X_i^n * (t^n - Y^n) * [Y^n * (1 - Y^n)]

对于所有训练样本,我们通常对梯度进行求和(或平均)。这得到了一个与 Delta 规则非常相似的学习规则,但多了一个由逻辑函数斜率产生的额外项 Y*(1-Y)

以下是逻辑神经元梯度下降学习规则的总结步骤:

  1. 对于每个训练样本,计算神经元的输出 Y
  2. 计算误差信号 (t - Y)
  3. 将误差信号乘以逻辑函数的斜率 Y*(1-Y),得到 δ
  4. 权重的更新量与该输入值 X_i 和计算出的 δ 成正比。

这个经过轻微修改的 Delta 规则,为我们提供了训练逻辑单元的梯度下降学习规则。

总结

本节课中我们一起学习了如何将线性神经元的学习规则推广到逻辑神经元。我们首先回顾了逻辑神经元的结构和激活函数,然后逐步计算了其输出关于权重的导数,并最终应用链式法则推导出了基于梯度下降的学习规则。这个规则是构建和训练更复杂的多层神经网络的基础。

3.4:反向传播算法 🧠

在本节课中,我们将学习神经网络的核心算法——反向传播。我们将了解为什么需要这个算法,它如何高效地计算网络中每个权重的误差梯度,以及它是如何工作的。

从预备知识到核心问题

上一节我们介绍了如何学习单个逻辑单元的权重。本节中,我们将回到核心问题:如何学习多层网络中隐藏单元的权重。

没有隐藏单元的神经网络,其输入输出映射能力非常有限。如果像感知机那样使用一层手工设计的特征,网络会强大得多,但对于新任务来说,难点在于设计这些特征。学习过程无法解决特征设计问题,必须手动完成。

我们希望找到一种方法,能够自动发现好的特征,而不需要深入了解任务本身,也不需要反复试错。本质上,我们需要自动化“为任务设计特征并评估其效果”这个循环,让计算机代替人来完成这个循环。

低效的替代方法:权重扰动法

了解进化论的人首先想到的方法是:通过扰动权重来学习。你随机扰动一个权重(这类似于突变),然后观察它是否改善了网络的性能。如果改善了,就保留这个权重的改变。

你可以将其视为一种强化学习。你的动作是做出一个小的改变,然后检查这个改变是否带来了回报。如果是,你就决定执行这个动作。问题是,这种方法效率非常低下。

仅仅为了决定是否改变一个权重,我们就需要在有代表性的训练集上进行多次前向传播。我们必须观察改变这个权重是否改善了结果,而仅凭一个训练案例是无法判断的。

与这种随机改变权重并观察是否有效的方法相比,反向传播要高效得多。实际上,它的效率是网络权重的数量级,而网络权重可能多达数百万个。

随机改变权重方法的另一个问题是:在学习接近尾声时,对权重的任何大改动几乎总是会让情况变得更糟。因为权重必须具有正确的相对值才能正常工作。因此,在学习后期,你不仅需要做大量工作来判断每个改变是否有益,而且改变本身也必须非常微小。

改进的扰动方法及其局限

有一些稍好的方法可以利用扰动进行学习。

一种可能尝试的方法是:并行扰动所有权重,然后将性能增益与权重变化相关联。但这实际上并没有帮助。问题在于,我们需要进行大量试验,每次试验都对所有权重进行不同的随机扰动,才能透过改变其他所有权重所产生的“噪音”,看清改变某一个权重的效果。因此,并行操作并无帮助。

一种确实有帮助的方法是:随机扰动隐藏单元的活动值,而不是扰动权重。一旦你确定在某个特定训练案例上扰动一个隐藏单元的活动值会改善结果,你就可以计算如何改变权重。由于活动值的数量远少于权重的数量,你需要随机探索的东西就更少,这使得算法更高效。但它仍然远不如反向传播高效。

反向传播的效率优势仍然是神经元数量的倍数级。

反向传播的核心思想

反向传播背后的思想是:我们不知道隐藏单元应该做什么(它们被称为“隐藏”单元,正是因为没有人告诉我们它们的状态应该是什么)。但是,我们可以计算在特定训练案例上,当我们改变一个隐藏单元的活动值时,误差的变化速度。

因此,我们不是使用隐藏单元的活动值作为期望状态,而是使用误差相对于活动值的导数。由于每个隐藏单元可以影响许多不同的输出单元,如果我们有许多输出单元,它可能对总误差产生多种不同的影响。这些影响必须被合并,而我们可以高效地做到这一点。

这使我们能够同时高效地计算所有隐藏单元的误差导数。

反向传播算法详解

一旦我们获得了隐藏单元的误差导数(即我们知道在特定训练案例上改变隐藏单元活动值时,误差的变化速度),就很容易将这些关于活动值的误差导数,转换为关于进入该隐藏单元的权重的误差导数。

以下是反向传播算法针对单个训练案例的工作原理概述。

首先,我们必须定义误差。这里我们使用误差作为输出单元 j 的目标值与网络实际产生的输出值之间的平方差。我们假设有多个输出单元。

我们对该误差进行微分,得到熟悉的表达式,表示当你改变输出单元 j 的活动值时,误差如何变化。这里我将使用一种标记法:单元的索引会告诉你它在哪一层。因此,输出层的典型索引是 j,而它前面的层(图中位于其下方的隐藏层)的典型索引是 i。我不会特意说明我们在哪一层,因为索引会告诉你。

一旦我们得到了误差相对于某个输出单元输出的导数,我们就想利用输出层中的所有导数,来计算位于输出层之前的隐藏层中的相同量。

反向传播的核心是:获取某一层的误差导数,并由此计算前一层(更靠近输入层)的误差导数。

我们想要计算 ∂E/∂yᵢ。显然,当我们改变单元 i 的输出时,它会改变所有三个输出单元的活动值。因此,我们必须汇总所有这些影响。所以,我们将有一个算法,它获取我们已经在顶层计算好的导数,并使用我们在前向传播中使用的相同权重来组合它们,从而得到下一层的误差导数。

算法步骤解析

这个部分将解释反向传播算法。你真的需要理解这部分内容,第一次看到时,可能需要花很长时间研究。这就是如何反向传播误差相对于单元输出的导数。

我们考虑一个输出单元 j 和一个隐藏单元 i。隐藏单元 i 的输出是 yᵢ,输出单元 j 的输出是 yⱼ,该输出单元 j 接收的总输入是 zⱼ

我们需要做的第一件事是:将误差相对于 yⱼ 的导数转换为误差相对于 zⱼ 的导数。为此,我们使用链式法则:

∂E/∂zⱼ = (∂yⱼ/∂zⱼ) * (∂E/∂yⱼ)

正如我们之前研究逻辑单元时所见,∂yⱼ/∂zⱼ 就是 yⱼ * (1 - yⱼ),乘以误差相对于单元 j 输出的导数。

现在我们已经得到了误差相对于单元 j 接收的总输入的导数。

接下来,我们可以计算误差相对于单元 i 输出的导数。它将是单元 i 所有三个输出连接上的以下量的总和:

(∂zⱼ/∂yᵢ) * (∂E/∂zⱼ)

其中第一项 ∂zⱼ/∂yᵢ 是单元 j 的总输入如何随单元 i 输出的变化而变化。然后我们必须将其乘以误差如何随单元 j 总输入的变化而变化(我们在上一行已经计算了 ∂E/∂zⱼ)。

正如我们之前研究逻辑单元时所看到的,∂zⱼ/∂yᵢ 就是连接上的权重 wᵢⱼ。因此我们得到,误差相对于单元 i 输出的导数是:

∂E/∂yᵢ = Σⱼ [ wᵢⱼ * (∂E/∂zⱼ) ]

即,对连接到上一层的所有输出连接求和,权重 wᵢⱼ 乘以我们已经计算好的量 ∂E/∂zⱼ

你可以看到,这个计算看起来非常像我们在前向传播中所做的,但方向相反。对于包含单元 i 的隐藏层中的每个单元,我们计算这个总和:上一层中的某个量乘以连接上的权重。

一旦我们得到了 ∂E/∂zⱼ(我们在第一行已经计算),就很容易得到进入单元 j 的所有权重的误差导数。∂E/∂wᵢⱼ 就是:

∂E/∂wᵢⱼ = (∂E/∂zⱼ) * (∂zⱼ/∂wᵢⱼ)

∂zⱼ/∂wᵢⱼ 简单地等于来自下一层的单元活动值 yᵢ

因此,改变权重的规则就是:将你在单元处计算出的量 ∂E/∂zⱼ,乘以来自下一层的活动值 yᵢ,这就得到了误差相对于该权重的导数。

算法总结与扩展

在这一部分,我们看到了如何从 ∂E/∂yⱼ 开始,反向传播得到 ∂E/∂yᵢ。我们反向穿过一层,计算了相同的量——误差相对于前一层输出的导数。

显然,我们可以对任意多层进行此操作。在对所有这些层完成此操作后,我们就可以计算当你改变连接上的权重时,误差如何变化。这就是反向传播算法。

它是一个针对单个训练案例,高效计算网络中每个权重的误差变化(在该特定训练案例上,当你改变权重时)的算法。


本节课中,我们一起学习了反向传播算法。我们首先探讨了为什么需要自动学习多层特征,然后分析了简单但低效的权重扰动法及其局限。接着,我们深入讲解了反向传播的核心思想:利用误差导数而非期望状态来指导学习。最后,我们详细拆解了反向传播的数学推导过程,展示了如何通过链式法则将输出层的误差导数高效地反向传播到隐藏层乃至输入层,并计算出所有权重的更新梯度。反向传播是神经网络得以有效训练的关键,它使得大规模多层网络的学习成为可能。

3.5:使用反向传播的导数 🧠

在本节课中,我们将学习如何利用反向传播算法计算出的导数,来构建一个完整、高效且能良好泛化的神经网络学习过程。我们将探讨权重更新的时机与幅度,以及防止模型过拟合的关键策略。

上一节我们介绍了反向传播算法如何高效地计算单个训练样本的误差相对于每个权重的导数。然而,这本身还不是一个完整的学习算法。要得到一个完善的学习流程,还需要指定许多其他事项。

我们需要做出许多其他决策。其中一部分决策关乎如何进行优化,即如何利用单个样本的误差导数来找到一组好的权重。这些内容将在第6讲中详细描述。另一组问题是如何确保我们学到的权重能够良好地泛化,也就是如何保证它们能在训练时未见过的样本上有效工作。第7讲将专门讨论这个问题。现在,我将对这两组问题做一个非常简要的概述。

优化问题:如何使用权重导数

优化问题关注的是如何使用权重导数。第一个问题是:应该多久更新一次权重?

我们可以尝试在每个训练样本之后更新权重。具体做法是,使用反向传播计算一个训练样本上的误差,然后对权重做一个小的调整。显然,这会带来曲折的路径,因为每个训练样本都会给出不同的误差导数。但平均而言,如果我们把权重变化设置得足够小,它最终会朝着正确的方向前进。

更明智的做法似乎是使用全批次训练。在这种方法中,你需要完整地遍历所有训练数据,将每个样本上得到的误差导数相加,然后沿着这个总方向迈出一小步。这种方法的一个问题是,我们初始的权重可能很差,而训练集可能非常大。我们并不希望为了修正一些已知很差的权重,而完成遍历整个训练集这样繁重的工作。

实际上,我们只需要观察少量训练样本,就能对权重应该朝哪个方向移动有一个合理的判断。直到学习接近尾声时,我们才需要查看大量的训练样本。

这就引出了小批次学习。我们随机抽取一小部分训练样本组成一个批次,并沿着这个批次计算出的总梯度方向更新。这会产生一些曲折,但远不如每次只用一个样本的在线学习那么曲折。当在大数据集上训练大型神经网络时,小批次学习是人们的典型做法。

接下来是更新权重幅度的问题,即我们应该做多大的改变。

我们可以手动尝试并选择一个固定的学习率,然后通过将每个权重改变为我们计算出的导数乘以该学习率来学习权重。更明智的做法是让学习率能够自适应调整。我们可以让计算机来调整它。例如,如果误差持续上下振荡,我们就降低学习率;如果我们正在稳步取得进展,我们可能会提高学习率。

我们甚至可以为网络中的每个连接设置单独的学习率,这样一些权重可以学得快,而另一些权重学得慢。或者我们可以更进一步,说我们其实根本不想沿着最陡下降的方向前进。

请看右边的图。当我们有一个非常扁长的椭圆时,最陡下降的方向几乎与我们想要找到的最小值方向成直角。这在大多数学习问题中,尤其是在学习接近尾声时,是非常典型的情况。因此,存在比最陡下降方向好得多的方向。问题在于,要找出这些方向相当困难。

泛化问题:如何防止过拟合

第二组问题涉及网络对训练期间未见过的样本的泛化能力。这里的问题是,训练数据包含了从输入到输出映射的规律性信息,但也包含两种类型的噪声。

第一种噪声是目标值可能不可靠。对于神经网络来说,这通常只是一个小问题。第二种噪声是抽样误差。如果我们取任何一个特定的训练集,特别是如果它很小,就会存在由我们选择的特定样本引起的偶然规律性。

例如,如果你向某人展示一些多边形。如果你是个糟糕的老师,你可能会选择展示一个正方形和一个矩形。它们都是多边形,但对方无法从中意识到多边形可能有三条边或七条边,也无法理解角度不一定非要是直角。

如果你是个稍好一点的老师,你可能会展示一个三角形和一个六边形。但是,同样地,对方无法从中判断多边形是否总是凸的,也无法判断多边形的内角是否总是60度的倍数。无论你如何精心选择示例,对于任何有限的示例集,都会存在偶然的规律性。

现在,当我们拟合一个模型时,模型无法区分哪些是仅仅因为我们选择的特定样本而存在的偶然规律,哪些是能够正确泛化到新样本的真实规律。因此,模型会同时拟合这两种规律。如果你有一个庞大而强大的模型,它将非常擅长拟合抽样误差,这将是一场真正的灾难,导致其泛化能力极差。

通过一个小例子可以最好地理解这一点。

这里,我们有六个用黑色显示的数据点。我们可以用一条直线来拟合它们。这是一个具有两个自由度的模型,它根据6个x值拟合6个y值。或者,我们考虑一个具有六个自由度的多项式。我用手工画了一条红线,代表我认为的具有6个自由度、拟合这些数据的多项式。你会看到这个多项式恰好穿过了所有数据点。因此,它对数据的拟合要好得多。

但你信任哪个模型?复杂的模型当然对数据的拟合好得多,但它不经济。要让一个模型有说服力,你希望它是一个能出人意料地很好地解释大量数据的简单模型。而多项式模型做不到这一点。它解释了这六个数据点,但它有6个自由度。所以,无论这些数据点在哪里,它都能解释它们。我们不会惊讶于一个复杂的模型能很好地拟合这些数据,这并不能让我们信服这是一个好模型。

请看箭头所指的位置。对于这个输入值,你预测哪个输出值?你必须对多项式模型有极大的信心,才会预测一个超出你目前所见所有训练数据值范围的值。我想几乎所有人都会更倾向于预测绿线上的蓝色圆圈,而不是红线上的那个。

然而,如果我们有10倍多的数据,并且所有这些数据点都非常接近红线,那么我们肯定会更倾向于红线。

减少过拟合的方法

针对神经网络以及许多其他模型,人们已经开发了多种减少过拟合的方法。我在这里仅做一个简要的概述。

  • 权重衰减:你试图保持网络的权重较小,或者试图让许多权重保持为0。其思想是,这将使模型更简单。
    • 新的损失函数 = 原始损失 + λ * Σ(权重²),其中λ是衰减系数。
  • 权重共享:你再次通过强制要求许多权重彼此具有完全相同的值来简化模型。你不知道这个值是什么,你将学习它,但它对于许多权重必须是完全相同的。我们将在下一讲中看到权重共享是如何使用的。
  • 早停法:你为自己制作一个假的测试集。在训练网络时,你观察这个假测试集上的表现。一旦假测试集上的性能开始变差,你就停止训练。
  • 模型平均:你训练许多不同的神经网络,然后将它们平均在一起,希望这能减少你所犯的错误。
  • 神经网络的贝叶斯拟合:这实际上只是模型平均的一种高级形式。
  • 丢弃法:你尝试通过在训练时随机丢弃隐藏单元来使你的模型更加鲁棒。
  • 生成式预训练:这比我将在课程末尾描述的要复杂一些。

本节课中,我们一起学习了如何将反向传播计算出的导数整合到一个完整的学习框架中。我们探讨了权重更新的频率(在线、全批次、小批次)和幅度(固定学习率、自适应学习率、更优的搜索方向)等优化问题。更重要的是,我们深入理解了模型过拟合的本质——模型同时学习了数据中的真实规律和抽样噪声导致的偶然规律。为了应对过拟合,我们简要介绍了权重衰减、权重共享、早停法、模型平均、贝叶斯方法、丢弃法和生成式预训练等多种正则化技术。理解这些概念是设计出高效且泛化能力强的神经网络的关键。

4.1:学习预测下一个词 🧠

在本节课中,我们将学习如何使用反向传播算法,来学习单词含义的特征表示。我们将从一个简单的案例开始,说明如何将关系信息转化为能够捕捉单词含义的特征向量。

接下来的几个视频将介绍使用反向传播算法,来学习单词含义的特征表示。我将从20世纪80年代的一个非常简单的案例开始,当时计算机速度非常慢。这是一个小案例,但它阐明了如何获取一些关系信息,并使用反向传播算法将这些关系信息转化为能够捕捉单词含义的特征向量。

上图展示了一个简单的家谱。例如,Christopher和Penelope结婚并育有孩子Arthur和Victoria。我们的目标是训练一个神经网络来理解这个家谱中的信息。我们还给了它另一个意大利人的家谱,其结构与英语家谱基本相同。也许当它试图学习这两组事实时,神经网络将能够利用这种类比关系。

将信息表达为命题

上一节我们看到了家谱的图示,本节中我们来看看如何用形式化的语言描述其中的信息。

这些家谱中的信息可以表达为一组命题。如果我们为家谱中描述的关系命名,我们将使用以下关系:儿子、女儿、侄子/侄女、父亲、母亲、叔叔、阿姨、兄弟、姐妹、丈夫、妻子。使用这些关系,我们可以写下一组三元组,例如:

  • Colin的父亲是James。
  • Colin的母亲是Victoria。
  • James的妻子是Victoria。

在图中描述的简单家庭中,第三个命题可以从前两个推导出来。同样,下一组中的第三个命题也可以从前两个推导出来。

关系学习任务

上一节我们将信息表达为三元组,本节中我们正式定义学习任务。

因此,关系学习任务,即学习这些家谱中的信息,可以看作是找出表达这些树信息的大量三元组中的规律。表达这些规律的明显方式是使用符号规则。例如,X的母亲是Y且Y的丈夫是Z 蕴含 X的父亲是Z。我们可以搜索这样的规则,但这将涉及在一个相当大的空间(组合上庞大的离散可能性空间)中进行搜索。

一种非常不同的尝试捕捉相同信息的方法是使用神经网络,它在实值权重的连续空间中搜索,以尝试捕捉信息。它实现这一点的方式是,我们将说它捕捉了信息,如果它能够预测...

神经网络架构

上一节我们提到要让网络学会预测,本节我们来看看为实现这个目标而设计的网络结构。

...三元组中的第三项。所以在这个图的底部,我们将输入一个人和一种关系。信息将通过网络向前传播。在网络学习之后,我们试图从神经网络中得到的输出是,通过该关系与第一个人相关的那个人。

这个网络的结构是手动设计的。也就是说,我决定了它应该有多少层,并且我还决定了在哪里放置瓶颈,以迫使它学习有趣的特征表示。

以下是我们的具体做法:

  1. 以中性方式编码信息:有24个可能的人。因此,图中底部标有“人物1的局部编码”的块有24个神经元,每个训练案例中恰好有一个神经元会被激活。同样,有12种关系,恰好有一个关系单元会被激活。
  2. 期望的输出:对于一个有唯一答案的关系,我们希望顶部的24个人(24个输出人物)中有一个被激活以表示答案。
  3. 避免预设相似性:通过使用恰好一个神经元被激活的表示,我们不会意外地给网络提供任何人之间的相似性。所有人对之间都同样不相似。因此,我们没有通过给网络提供关于谁像谁的信息来作弊。就网络而言,人物是未被解释的符号。
  4. 引入瓶颈:现在,在网络的下一层,我们获取了人物1的局部编码,并将其连接到一个小的神经元集合(我实际上使用了6个神经元)。因为有24个人,它不可能为每个人分配一个神经元。它必须将这24个人重新表示为这六个神经元上的活动模式。我们所希望的是,当它学习这些命题时,它编码一个人的方式(在那个分布式活动模式中)将揭示任务中的结构或领域中的结构。

因此,我们将要做的是,在112个这样的命题上训练它。我们多次遍历这112个命题,使用反向传播缓慢地改变权重。训练之后,我们将查看标有“人物1的分布式编码”的那一层中的六个单元...

分析学习到的特征

上一节我们介绍了网络的训练过程,本节中我们具体分析网络在瓶颈层学到了哪些有用的特征。

...看看它们在做什么。所以这里那些六个单元显示为大灰色块。我布置了24个人,12个英国人在顶部排成一排,12个意大利人在下面排成一排。你会看到,这些块中的每一个都有24个斑点。这些斑点告诉你该层中一个隐藏单元的输入权重。

回到上一张幻灯片,如果你看标有“人物1的分布式编码”的那一层,那里有六个神经元,我们正在查看这六个神经元中每一个的输入权重。

以下是网络自动学习到的几个关键特征:

  • 国籍特征:如果你看右上角的大灰色矩形,你会看到权重的有趣结构。来自英国人的顶部权重都是正的,而底部的权重都是负的。这意味着这个单元告诉你输入的人是英国人还是意大利人。我们从未明确地给它这个信息,但显然,在这个非常简单的世界中,拥有这个信息是有用的。因为在我们正在学习的家谱中,如果输入的人是英国人,输出的人也总是英国人。所以仅仅知道某人是英国人已经允许你预测关于输出的一比特信息,这相当于说它将可能性数量减半。
  • 代际特征:如果你看它正下方的灰色块(右边第二个),你会看到它在开头有四个大的正权重。这些对应于Christopher和Andrew,或他们的意大利对应者。然后它有一些较小的权重。接着它有两个大的负权重,对应于Colin或他的意大利对应者。然后还有四个大的正权重,对应于Penelope或Christina(她们的意大利对应者)。在最右边,有两个大的负权重对应于Charlotte或她的意大利对应者。现在,你可能已经意识到,那个神经元代表某人的代际。它对最老的一代有大的正权重,对最年轻的一代有大的负权重,对中间一代有大致为0的中间权重。所以这实际上是一个三值特征,它告诉你这个人的代际。
  • 家族分支特征:最后,如果你看左手边的底部灰色矩形,你会看到它具有不同的结构。如果我们看顶行,并查看该单元顶行中的负权重,它对Andrew、James、Charles、Christine和Jennifer有负权重。现在,如果你看英国家谱,你会发现Andrew、James、Charles、Christine和Jennifer都在家谱的右手分支。所以那个单元学会了表示某人在家谱的哪个分支中。同样,这对于预测输出人物来说是一个非常有用的特征,因为如果你知道这是一种亲密的家庭关系,你期望输出与输入在同一家族分支中。

特征协同与泛化能力

上一节我们看到网络学会了有用的特征,本节我们探讨这些特征如何协同工作,以及网络的泛化能力。

因此,网络在瓶颈处学会了表示对预测答案有用的人物特征。注意,我们没有告诉它使用什么特征。我们从未提及诸如国籍、分支、家谱或代际之类的事情。它发现这些是表达该领域规律性的好特征。当然,这些特征只有在其他瓶颈(关系附近的瓶颈和输出人物之前靠近网络顶部的瓶颈)使用相似表示时才有用。并且中间层能够说明输入人物的特征和关系的特征如何预测输出人物的特征。

例如,如果输入人物是第3代,而关系要求输出人物向上推一代,那么输出人物就是第2代。但请注意,要捕捉那条规则,你必须在网络的第一隐藏层和最后隐藏层提取适当的特征,并且你必须让中间层的单元正确地关联这些特征。

另一种验证网络有效性的方法是,在除少数几个三元组外的所有三元组上训练它,看看它是否能正确补全那些三元组。即它是否能泛化。这里有112个三元组,我在其中108个上训练它,并在剩下的四个上测试。我这样做了几次。它要么答对两个,要么答对三个。对于一个24选1的问题来说,这不算太差。所以它确实会犯错,但它没有太多的训练数据。这个领域中没有足够的三元组来真正很好地确定规律性。而且它比随机猜测要好得多。如果你在一个大得多的数据集上训练它,它可以从数据的小得多的部分进行泛化。

所以,如果你有成千上万的关系,你只需要向它展示一小部分,它就可以开始正确猜测其他关系。这项研究是在20世纪80年代完成的,是一种展示反向传播可以学习有趣特征的方式。它是一个玩具示例。现在我们有了更大的计算机,我们拥有数百万关系事实的数据库。

现代应用与扩展

上一节我们回顾了历史案例,本节我们展望其在现代大数据场景下的应用潜力。

其中许多事实的形式是 A R B(A与B具有关系R)。我们可以想象训练一个网络来发现A和R的特征向量表示,使其能够预测B的特征向量表示。如果我们这样做,这将是清理数据库的一个非常好的方法。它不一定能做出完美的预测,但它可以找到数据库中它认为高度不可信的东西。

例如,如果数据库包含诸如“巴克出生于1902年”这样的信息,它可能意识到那是错误的,因为巴克是一个更老派的人,并且与他相关的所有其他东西都比1902年早得多。

我们还可以扩展这个想法。与其实际使用前两项来预测第三项,我们可以使用整个项集(在这种情况下是三项,但可能更多),并预测该事实正确的概率。为了训练一个网络做到这一点,我们需要一大堆正确事实的例子,并要求它给出高输出。我们还需要一个良好的错误事实来源,并要求它在被告知错误信息时给出低输出。

总结

本节课中我们一起学习了如何使用反向传播算法和神经网络来学习关系数据中的特征表示。我们通过一个简单的家谱示例,看到了网络如何自动从数据中提取出如国籍、代际和家族分支等有意义的特征,而无需人工指定。这些学习到的分布式表示使网络能够进行预测和泛化。最后,我们探讨了这种方法在现代大规模关系数据库清理和事实校验中的潜在应用。这展示了神经网络从原始数据中自动发现有用抽象的强大能力。

4.2:认知科学中的一次短暂探讨 🧠

在本节课中,我们将探讨一个认知科学家感兴趣,但工程师可能不太关心的话题。如果你是一名工程师,可以忽略这部分内容。我们将了解神经网络如何为一场持续近百年的认知科学辩论提供新的视角。

概念表征的两种理论

上一节我们介绍了神经网络如何学习家族树关系。本节中,我们来看看认知科学中关于概念如何被表征的长期争论。这场争论主要围绕两种对立的理论展开。

特征理论认为,一个概念是一组语义特征的集合。这种理论便于解释概念之间的相似性,并且非常适合机器学习,因为我们习惯于处理活动向量

结构理论则认为,一个概念的意义在于它与其他概念之间的关系。因此,概念性知识最好表示为关系图,而不是一个大的特征向量。

明斯基的批评与神经网络的调和

在20世纪70年代初,马文·明斯基曾用感知机的局限性来反对特征向量理论,并支持关系图表征。

然而,我认为这场辩论的双方都错了,因为他们错误地认为这两种理论是互斥的。实际上,它们并非对手。一个神经网络可以利用语义特征向量来实现一个关系图

在我们学习家族树的神经网络中,我们可以将显式推理理解为:给定一个人(person1)和一种关系,网络会告诉你另一个人(person2)。为了得出这个结论,神经网络并不遵循一大堆推理规则,它只是通过网络向前传递信息。对神经网络而言,答案是直观且显而易见的。

微观特征与直觉推理

如果我们深入观察其中发生的细节,会发现有许多概率性特征在相互影响。我们称这些为微观特征,以强调它们不同于显式的、有意识的特征。在一个真实的大脑中,可能存在数百万个这样的特征和相互作用。正是所有这些相互作用的结果,使我们能够进行一步显式的推理。

我们认为,这就是我们“看到”某个问题答案时所涉及的过程。中间没有有意识的步骤,但神经元之间的相互作用确实在进行计算。

因此,我们可能会使用明确的规则进行有意识的、深思熟虑的推理。但我们大量的常识推理,特别是类比推理,是通过直接“看到”答案来完成的,中间没有有意识的步骤。

在神经网络中实现关系知识的挑战

即使在我们进行有意识推理时,也必须要有某种方式来直接“看到”哪些规则适用,以避免无限倒退。

许多人考虑在神经网络中实现关系图时,会简单地假设应该让一个神经元对应关系图中的一个节点,让两个神经元之间的连接对应一种二元关系。但这种方法行不通。

首先,关系有不同的类型(如“母亲”或“阿姨”),而神经网络中的连接只有强度,没有类型之分。其次,我们还需要处理三元关系,例如“A在B和C之间”。目前,我们仍然不确定在神经网络中实现关系知识的正确方法。

分布式表征的可能性

但是,一种可能性似乎非常大:我们已知的每个概念都由许多神经元共同表征,而每个神经元又可能参与处理许多不同的概念。这被称为分布式表征。它是概念与神经元之间的一种多对多映射


本节课中,我们一起学习了认知科学中关于概念表征的“特征理论”与“结构理论”之争。我们看到,神经网络模型提供了一种调和视角:它可以使用分布式表征的特征向量来有效地实现关系图,从而完成直观推理。这提示我们,大脑中的知识表征可能是多层次、分布式且高度交互的。

4.3:Softmax输出函数 🧮

在本节课中,我们将学习一种称为Softmax的输出函数。这种函数能够强制神经网络的输出总和为1,从而使其能够表示一组离散且互斥的备选方案上的概率分布。

为何需要Softmax?🤔

在上一节中,我们讨论了使用平方误差作为神经网络的训练目标。对于线性神经元,这是一个非常合理的选择。然而,平方误差度量存在一些缺点。

例如,如果期望输出是1,但神经元的实际输出是十亿分之一,那么误差几乎达到了最大值。然而,对于逻辑单元(如Sigmoid函数)来说,当输出接近0或1时,其梯度会变得非常平缓。这意味着即使误差很大,权重更新的速度也会非常缓慢,导致学习过程耗时极长。

此外,当我们试图为互斥的类别标签分配概率时,我们知道所有输出的概率之和应为1。任何不符合这一约束的答案(例如,说某个事物是A的概率是3/4,同时是B的概率也是3/4)都是不合理的。我们应该让网络知晓这些答案是互斥的。

因此,问题是:是否存在一种不同的、效果更好的代价函数?是否存在一种方法,既能告知网络输出是互斥的,又能使用合适的代价函数?答案是肯定的。

什么是Softmax?🔢

我们需要做的是,如果计划将神经网络的输出用作概率分布,就强制它们表示一组离散备选方案上的概率分布。实现这一目标的方法是使用一种称为Softmax的函数。它是最大值函数的一种“柔和”、连续的版本。

Softmax组中神经元的工作方式如下:每个神经元从下层接收一个累积的总输入,我们称之为对数几率(logit),记作 z_i(对于第 i 个神经元)。然后,它产生一个输出 y_i,这个输出不仅取决于它自己的 z_i,也取决于组内所有其他神经元的 z 值。

具体公式如下:

y_i = e^{z_i} / Σ_j e^{z_j}

在这个公式中,分母是所有神经元 e^{z_j} 的总和。由于分母是分子在所有可能性上的求和,我们知道所有 y_i 的和必须等于1。此外,每个 y_i 的值都介于0和1之间。这样,我们就通过Softmax方程强制 y_i 表示了一组互斥备选方案上的概率分布。

Softmax的导数 📈

Softmax方程有一个简洁的导数。如果我们想知道 y_i 如何随 z_i 变化,结果会是一个简单的形式,类似于逻辑单元。对于Softmax组中的单个神经元,其输出对输入的导数为:

∂y_i / ∂z_i = y_i * (1 - y_i)

这个推导并非完全平凡。如果你尝试对上面的方程求导,必须记住分母中的归一化项包含了所有项,很容易遗漏这些项而得到错误答案。

合适的代价函数:交叉熵 🎯

现在的问题是,如果我们使用Softmax组作为输出层,什么是最合适的代价函数?答案通常是:最合适的代价函数是正确标签的负对数概率。也就是说,我们希望最大化得到正确答案的对数概率。

如果目标值中一个是1(正确类别),其余都是0(错误类别),那么代价函数 C 可以简单地定义为:

C = - Σ_j t_j * log(y_j)

其中 t_j 是目标值(对于正确类别为1,其余为0),y_j 是Softmax的输出。这被称为交叉熵代价函数

它有一个很好的特性:当目标值是1而输出接近0时(即预测非常错误),梯度会非常大。你可以通过考虑两种情况来理解这一点:输出为百万分之一和输出为十亿分之一。虽然两者数值相差极小,但前者比后者“好得多”,因为如果你相信百万分之一的概率并据此下注,你会损失一百万;而如果你相信十亿分之一的概率,你会损失十亿。因此,这个代价函数在答案非常错误时具有非常陡峭的导数。

梯度的计算 ⚙️

当我们使用链式法则计算交叉熵代价 C 相对于输入到输出单元 i 的对数几率 z_i 的导数时,结果会非常简洁:

∂C / ∂z_i = y_i - t_i

这个结果是实际输出 y_i 减去目标输出 t_i。当实际输出和目标输出差异很大时,这个导数的值约为1或-1。只有当两者非常接近时,梯度才会变小。换句话说,在你得到基本正确的答案之前,梯度不会衰减。这正好平衡了之前提到的、当输出非常错误时 ∂y_i/∂z_i 非常平缓的问题,使得整体学习过程更加高效。

总结 📝

本节课我们一起学习了Softmax输出函数。我们了解到,为了表示一组互斥类别的概率分布,需要强制网络输出和为1。Softmax通过一个指数归一化的公式实现了这一点。同时,我们认识到平方误差代价函数在此场景下的局限性,并引入了更适合的交叉熵代价函数。交叉熵代价函数在预测错误时能提供强力的梯度,与Softmax的导数特性相结合,使得神经网络在分类任务上能够进行有效且稳定的学习。

4.4:神经概率语言模型 🧠

在本节课中,我们将学习如何利用表示单词的特征向量来解决一个实际问题——提升语音识别系统的性能。我们将看到传统的统计方法(如三元模型)的局限性,并了解神经网络如何通过捕捉单词之间的语义和句法相似性来构建更强大的语言模型。

概述

语音识别系统面临一个核心挑战:在嘈杂的语音环境中,仅凭声学信号往往无法完美地识别音素,因为信号本身可能是模糊的。此时,系统若能对“用户接下来可能说什么”有一个良好的预测,将极大地帮助识别过程。这正是语言模型的任务。

传统方法的局限性:三元模型

上一节我们介绍了单词的特征向量表示。本节中,我们来看看如何利用这些特征来构建更好的语言模型。在神经网络方法兴起之前,预测下一个单词概率的标准方法是三元模型

以下是三元模型的工作原理:

  • 它基于海量文本,统计所有三个单词连续出现的组合频率。
  • 给定前两个单词(例如 “A” 和 “B”),通过比较序列 “A B C” 和 “A B D” 的统计次数,来估算下一个单词是 “C” 还是 “D” 的相对概率。公式可以表示为:P(C|A,B) / P(D|A,B) ≈ count(ABC) / count(ABD)

然而,三元模型存在几个明显缺陷:

  • 上下文有限:由于需要存储所有可能的三元组,无法使用超过两个单词的上下文信息。
  • 数据稀疏性:即使对于二元上下文,也存在大量从未出现过的组合(例如 “恐龙 披萨”)。对于这些情况,模型必须“回退”到仅使用前一个单词的信息。
  • 无法理解语义:三元模型无法捕捉单词之间的相似性。例如,它无法理解“猫”和“狗”、“压扁”和“碾平”、“花园”和“院子”、“周五”和“周一”之间的关联。因此,它无法利用关于“猫”的句子来帮助理解关于“狗”的句子。

神经网络的解决方案:特征向量与预测

为了克服三元模型的局限性,我们需要将单词转换为包含语义和句法信息的特征向量,并利用前几个单词的特征来预测下一个单词的特征。

使用特征表示法允许我们利用更长的上下文(例如前10个单词)。Joshua Bengio 率先将这种方法应用于语言模型。他最初的网络结构与我们之前见过的“家庭树”网络非常相似,只是规模更大且应用于实际问题。

以下是该网络的基本工作流程:

  1. 输入层:输入一个单词的索引。这可以看作是一组神经元中只有一个被激活。
  2. 特征查找层:从被激活的输入神经元出发的权重,决定了下一层(隐藏层)的活动模式。这等价于进行了一次查表操作,获取了该单词的分布式表示(即其特征向量)。通过训练,我们可以修改这些权重,从而优化每个单词的特征向量。
  3. 上下文整合:获取前几个单词(例如5个)的分布式表示后,通过另一个隐藏层整合这些信息。
  4. 输出预测:最后,通过一个巨大的 Softmax 输出层,预测所有可能的下一个单词的概率分布。

为了使模型效果更好,Bengio 还引入了跳跃连接,让输入单词可以直接影响输出层。这是因为单个输入单词本身对于预测下一个单词就具有很高的信息量。

挑战与改进

Bengio 的初始模型在预测下一个单词的任务上,表现略差于三元模型,但处于同一水平。当与三元模型结合时,效果得到了提升。

此后,使用单词特征向量的语言模型得到了显著改进,现在已明显优于三元模型。然而,这类模型面临一个主要挑战:巨大的 Softmax 输出层。

以下是该挑战的具体表现:

  • 在典型的语言模型中,单词的单复数、动词的不同时态都被视为不同的词,因此输出层可能需要处理多达 100,000 个不同的单词。
  • 这意味着网络的最后一个隐藏层中的每个神经元都可能需要有 10 万个输出权重。为了避免过拟合,我们只能在该层使用很少的神经元。
  • 但如果我们使用太小的隐藏层,又难以准确预测所有单词(包括大量出现概率很小但有时又很关键的单词)的概率。

总结

本节课中,我们一起学习了神经概率语言模型的基本思想。我们了解到,传统的三元模型因数据稀疏和无法理解语义而受限。神经网络通过将单词表示为可学习的特征向量,能够捕捉单词间的相似性并利用更长的上下文,从而构建更强大的语言模型。尽管面临输出维度巨大的挑战,但这仍是推动语言模型发展的核心方向。

在下一个视频中,我们将探讨几种处理这种大规模输出问题的更好方法。

4.5:处理大量可能输出的方法 🧠

在本节课中,我们将学习如何避免在需要为10万个不同单词计算概率时,使用包含10万个输出单元的Softmax层。课程结束时,我们将展示通过特定方法学习到的单词表示示例,以观察这些表示的特征。

概述

当词汇表非常庞大时,使用传统的Softmax输出层会带来巨大的计算负担。本节将介绍几种高效的方法来应对这一挑战,核心思想是通过改变网络结构或输出策略,避免直接计算所有单词的概率。


序列架构法 🔄

上一节我们讨论了标准Softmax的局限性,本节中我们来看看第一种解决方案:序列架构。

这种方法的核心是,我们不一次性输出所有单词的概率,而是依次评估每个候选单词。网络接收上下文单词作为输入,同时也以相同的方式接收一个候选单词。网络前向传播后,输出一个分数,用于衡量该候选单词在当前上下文中的匹配程度。

当然,这需要多次运行网络前向传播,但大部分计算可以复用。具体来说,从上下文到大隐藏层的输入对于所有候选单词都是相同的。对于每个候选单词,我们只需要计算来自该候选单词的输入以及最终输出的分数部分,这部分涉及的权重参数很少。

通过将单词作为候选词输入到底层,我们能够复用该单词作为上下文时学习到的特征表示。这意味着,一个单词无论是作为上下文的一部分,还是作为待预测的候选词,都可以使用相同的特征表示。

学习过程如下:

  1. 依次计算每个可能候选词的分数。
  2. 将所有(顺序计算出的)分数输入到一个大型Softmax函数中,以获得单词概率。
  3. 计算单词概率与目标概率(正确单词为1,其他为0)之间的交叉熵导数。
  4. 利用这些导数调整权重,以提高正确候选词的分数,并降低其高分竞争对手的分数。

在此架构中可以节省大量时间,如果我们不评估所有可能的候选词,而只考虑一个由其他预测器(例如三元模型)建议的小型候选集。


分层Softmax法 🌳

序列架构虽然节省了训练时的计算量,但在测试时仍需评估多个候选词。另一种完全避免大型Softmax的方法是:将单词组织成树形结构。

我们将所有单词安排在一棵二叉树的叶子节点上。然后,利用上文单词的上下文信息生成一个预测向量 V。我们将这个预测向量与为树中每个节点学习到的向量 U_node 进行比较。

比较的方式是计算预测向量 V 与节点向量 U_node 的点积(标量积),然后对点积结果应用逻辑函数(Sigmoid)。这将给出在该节点选择右分支的概率,而选择左分支的概率则是 1 - 该概率

用公式表示节点分支概率为:
P(right) = σ(V · U_node)
P(left) = 1 - σ(V · U_node)

这样,从根节点到目标单词叶子节点的路径概率,就是路径上各分支选择概率的乘积。

学习过程的优势在于,我们只需要考虑通往正确下一个单词的路径上的节点(例如图中的 I、J、M 节点)。我们希望预测该单词的概率尽可能高,即希望选择该路径的概率尽可能高。这等价于希望路径上各节点分支概率的对数之和尽可能高。

因此,在训练时,我们只需考虑正确路径上的节点,这比考虑所有节点(M个)要少得多,数量级为 log₂(M)。对于路径上的每个节点,我们知道正确的分支方向。通过比较预测向量 V 和该节点的学习向量 U_node,我们可以得到当前选择该分支的概率,并据此计算用于更新 VU_node 的导数。这使得训练速度提高了数百倍。


词向量学习法 🔤

上述方法主要关注预测任务。还有一种更简单的方法来学习单词的特征向量(词向量),该方法由Collobert和Weston提出。他们的目标不是预测下一个单词,而是为单词获取高质量的特征向量,并证明这些向量能极大地提升多种自然语言处理任务的性能。

他们同时使用过去和未来的上下文。具体做法是:观察一个包含11个词的窗口(前5个词,后5个词)。在窗口中间,放置一个词——要么是文本中实际出现的正确词,要么是一个随机词。然后训练一个神经网络,如果中间是正确词则输出高分,如果是随机词则输出低分。

神经网络的工作方式与前文类似:将单个词映射为特征向量(词编码),然后可能在更多网络层中使用这些特征向量,来预测中间词对于该上下文是“正确”还是“错误”的。本质上,他们是在判断中间词对于其两侧的五词上下文是否合适。

他们在维基百科的约6亿个例子上训练了这个模型,并证明得到的词向量对于多种不同的自然语言处理任务都非常有效。


词向量可视化示例 🗺️

为了感受这些学习到的词向量是什么样的,我们可以将它们嵌入到一个二维空间中进行可视化。这样做的目的是以这样一种方式布局词向量:语义非常相似的向量在空间中也彼此接近。通过观察,我们就能发现神经网络认为哪些词具有相似的含义。

我们使用一种称为“t-SNE”的多尺度方法进行降维可视化。t-SNE不仅能够将非常相似的词放在一起,还能将相似的词簇也放在相近的位置,从而在多个不同尺度上展示出结构。

我们可以看到,学习到的特征向量捕捉了许多细微的语义区别,而这一切仅仅是通过观察维基百科中的词序列完成的,没有任何额外的监督信息。令人惊讶的是,这种上下文信息(即这些词共同出现的事实)揭示了单词含义的绝大部分。事实上,有些人认为这是我们学习单词含义的主要方式。

以下是几个可视化示例:

游戏相关词汇区域:这个区域的所有词汇都与游戏有关。它不仅将相似类型的词放在一起(如 matches, games, races),还将 players, teams, clubs 放在一起,将游戏中赢得的东西(cups, bowls, medals, prizes)放在一起,也将不同种类的游戏放在一起。这表明模型成功地将与游戏相关的词汇根据语义相似性进行了组织。

地点相关词汇区域:这个区域完全关于地点。顶部是美国各州,其下是一些城市(主要是北美城市),再往下是其他城市,然后是一些国家。例如,它将多伦多与底特律、安大略省、波士顿放在一起(多伦多位于英语加拿大),而将魁北克(位于法语加拿大)与柏林、巴黎放在一起。在底部,它认为伊拉克与越南非常相似。

副词与其他词汇区域:这里展示了副词。模型理解到 likely, probably, possibly, perhaps 含义非常相似;也理解到 entirely, completely, fully, greatly 含义非常相似。它还理解了其他类型的相似性,例如 which 和 that,whom 和 what,以及 how, whether, why。


总结

本节课中,我们一起学习了三种处理大规模词汇表输出问题的方法:

  1. 序列架构法:通过依次评分候选词来复用大部分计算,适用于与快速候选生成器结合的场景。
  2. 分层Softmax法:将词汇组织成二叉树,将预测复杂度从 O(M) 降低到 O(log M),极大提升了训练效率。
  3. 词向量学习法:通过一个简单的二分类任务(判断词是否适合上下文)来学习通用的词向量表示,这些向量能有效捕捉语义信息并提升下游任务性能。

通过将学习到的词向量降维可视化,我们直观地验证了神经网络仅从无监督的文本数据中就能自动发现并编码丰富的语义关系。

5.1:为何物体识别如此困难 🧠

在本节课中,我们将要学习为什么让计算机识别真实场景中的物体是一项极具挑战性的任务。人类对此非常擅长,以至于我们很难意识到,从一堆描述像素强度的数字出发,最终得出一个物体标签的过程有多么复杂。这其中存在诸多困难,包括需要将物体从背景中分割出来、处理光照和视角的变化、应对物体定义的复杂性,以及可能需要海量的知识来完成从图像到物体的映射。如果情况确实如此,那么任何手工设计的程序都很难在这些方面表现出色。

物体识别的核心挑战

上一节我们概述了物体识别的整体难度,本节中我们来看看构成这些困难的具体原因。以下是几个主要挑战:

分割困难

首先,将物体从图像中的其他元素中分割出来非常困难。在现实世界中,我们通过移动获得运动线索,通过双眼获得立体视觉线索。但在静态图像中,这些线索都不存在。因此,很难判断哪些像素片段属于同一个物体。此外,物体的某些部分可能被其他物体遮挡,导致我们通常无法看到物体的全貌。人类视觉系统过于出色,以至于我们常常注意不到这一点。

光照影响

另一个使物体识别变得困难的因素是,像素的强度既取决于物体本身的性质,也取决于光照条件。例如,明亮光线下的黑色表面产生的像素强度,可能远高于昏暗光线下的白色表面。请记住,识别物体需要将一组数字(即像素强度)转换为一个类别标签。而这些强度值会因各种与物体本质或身份无关的原因而发生巨大变化。

物体形变

物体可以以多种方式发生形变。即使是相对简单的物体,比如手写数字,也存在大量形状各异但名称相同的实例。例如,数字“2”可以是非常倾斜的、只有一个尖角而非圆环的形状,也可以是一个带有大圆环的非常圆润的形状。

功能定义

对于许多类型的物体,其类别的定义更多地基于其功能,而非视觉外观。以椅子为例,我们称之为“椅子”的物品多种多样,从扶手椅到由钢架和木背制成的现代椅,再到任何可以坐上去的东西。

视角变化带来的维度跳跃问题

除了上述挑战,视角变化也使得物体识别变得困难。我们可以从多种不同的视角来识别一个三维物体。然而,视角变化会导致图像发生变化,这是标准机器学习方法难以应对的。

问题的核心在于,信息会在输入维度之间“跳跃”。通常,在视觉任务中,输入维度对应着像素。如果一个物体在场景中移动,而你的眼睛没有跟随它移动,那么关于该物体的信息就会出现在不同的像素上。这不是我们在常规机器学习中通常需要处理的情况。

为了强调这一点,假设我们有一个医疗数据库,其中一个输入维度是患者的年龄,另一个是患者的体重。我们开始进行机器学习,然后发现某个编码员实际上调换了编码这两个属性的输入维度。对于这个编码员的数据,他们把体重数据放在了本应是年龄的位置,反之亦然。显然,我们不会继续按原样进行学习,而是会尝试修复这个问题,否则一切都会出错。我将这种现象称为“维度跳跃”,即信息从一个输入维度跳转到另一个维度。这正是视角变化所导致的问题,我们需要解决它,并且最好能以系统化的方式解决。

总结

本节课中我们一起学习了为什么物体识别对计算机来说如此困难。我们探讨了从图像中分割物体的挑战、光照变化对像素强度的巨大影响、物体本身的形变和多样性,以及基于功能而非外观的类别定义。最后,我们深入分析了视角变化带来的“维度跳跃”问题,这是标准机器学习方法难以直接处理的根本性障碍。理解这些困难是设计有效识别系统的第一步。

5.2:实现视角不变性

在本节课中,我们将探讨机器学习中的一个核心挑战:视角不变性。当我们在不同角度观察同一物体时,它在图像像素上的投影会发生变化,这使得物体识别任务变得异常复杂。我们将介绍几种应对这一挑战的主要方法。

视角不变性的挑战

每次我们观察场景中的一个物体,通常都会有不同的视角。因此,物体出现在不同的像素位置上。这使得物体识别与大多数机器学习任务非常不同。

人类非常擅长处理视角变化,以至于我们并未真正意识到其难度。然而,无论是在工程学还是心理学领域,这仍然是让计算机实现感知的主要困难之一,并且目前尚未有被普遍接受的解决方案。

应对视角变化的四种方法

以下是几种被提出的、用于应对视角变化的主要方法。

1. 使用冗余的不变特征

第一种方法是使用冗余的不变特征。其核心思想是提取一组数量庞大且冗余的特征,这些特征在平移、旋转和缩放等变换下应保持不变。

例如,一个不变特征可以是一对大致平行的线,中间有一个红点。有研究表明,刚孵化的雏鸥会使用这个特征来知道该在哪里啄食。如果你在一块木头上画出这个特征,它们会在木头的相应位置啄食。

理论上,只要有足够多的不变特征,就只有一种方式能将它们组合成一个物体或图像。你甚至不需要直接表示特征之间的关系,因为这些关系会被其他特征所捕获。心理学家韦恩·威肯格伦特和视觉科学家西蒙·乌尔曼都曾指出这一点:我们只需要一个包含大量特征的“特征袋”,因为重叠和冗余的特征中,一个特征会告诉你另外两个特征是如何关联的。

然而,这种方法存在一个严重问题:在进行识别时,你会得到大量由不同物体的部分组成的特征,这些特征对于识别任务具有极大的误导性。因此,我们需要避免从不同物体的部分中形成特征。

2. 明智的归一化

第二种方法被称为明智的归一化。其思路是为物体画一个“框”,然后相对于这个框来描述物体的特征。

例如,观察右边那个倒置的大写字母R。我(虽然画得不太好)给它画了一个框,并标记了框的“顶部”和“正面”。相对于这个框,R具有一些不变的特征,比如“背部有一条垂直线”,“顶部有一个朝前的环”。如果我们相对于这个框来描述R的特征,这些特征将是视角不变的。这假设物体是刚性形状。为一个刚性形状画框,可以解决维度跳跃问题,消除视角变化的影响——前提是我们能正确地选择这个框。

这样,物体的同一部分将总是出现在归一化后的相同像素位置上。这个框不一定是矩形,我们还可以提供对剪切、拉伸等变换的不变性。

但问题在于,选择正确的框非常困难。困难可能源于分割错误、遮挡(因此不能简单地围绕物体收缩一个框)或物体处于不寻常的朝向。那个倒置的R的例子清楚地表明:我们需要利用对形状本身的知识来帮助我们决定框应该是什么。例如,如果我们有一个像小写字母d但多了一笔的字符,我们会将其视为一个正立的字符。这就形成了一个“先有鸡还是先有蛋”的问题:为了得到正确的框,我们需要识别形状;而为了识别形状,我们又需要正确的框。

这里需要澄清一个心理学上的误解:许多心理学家认为我们通过“心理旋转”来处理方向不正确的形状。这是完全错误的。对于那个大写字母R,你在进行任何心理旋转之前就已经完美地识别了它。事实上,你需要先识别出它是一个R并且是倒置的,才知道该如何旋转它。心理旋转主要用于处理像“手性”(例如,它是正确的图像还是镜像)这样的判断,而不是用于识别一个倒置的物体。

3. 暴力归一化方法

暴力归一化方法的工作流程如下:在训练识别器时,使用分割良好、方向正确的图像,并明智地为其画框。在测试时,当需要处理杂乱无章的图像时,尝试所有可能位置和尺度下的框。

这种方法在计算机视觉中被广泛使用,特别是在未分割图像中检测直立物体(如人脸或门牌号)时。如果识别器本身能够容忍一定程度的位置和尺度变化,那么这种方法会高效得多,因为这样我们就可以在尝试所有可能的框时使用更粗糙的网格。

4. 使用层级化的部件

第四种方法,也是本讲最后要讨论的,是使用层级化的部件,并显式地表示部件相对于相机或视网膜的姿态。这种方法将在后续详细展开。

总结

本节课我们一起学习了实现视角不变性的核心挑战以及四种主要应对策略:使用冗余的不变特征明智的归一化暴力归一化以及层级化部件表示。每种方法都有其优势和局限性,理解这些是构建鲁棒视觉识别系统的关键。在接下来的课程中,我们将深入探讨其中一种极为重要的方法——卷积神经网络。

5.3:用于手写数字识别的卷积网络 🧠

在本节课中,我们将学习卷积神经网络在手写数字识别中的应用。这是20世纪80年代神经网络领域取得重大成功的案例之一。

卷积网络的基本思想

上一节我们介绍了神经网络的基本结构,本节中我们来看看卷积网络的核心设计理念。

卷积神经网络基于特征复制的思想。由于物体可能在图像的不同位置出现,如果一个特征检测器在图像的某个位置有用,那么同样的检测器在其他位置也很可能有用。因此,我们的想法是在所有不同位置构建许多相同特征检测器的副本。

例如,假设我们有一个特征检测器,其权重连接到9个像素。我们可以在图像的不同位置复制这个检测器,并且所有副本中的对应权重(例如,所有“红色箭头”对应的权重)在训练过程中被强制保持相同。这可以用以下约束表示:

权重共享约束:对于所有位置 i, j 上的同一特征检测器副本,其权重 W_ij 必须相等。

这种跨位置的复制极大地减少了需要学习的参数数量。在上面的例子中,3个复制检测器共涉及27个像素连接,但只有9个不同的权重需要学习。

网络结构与池化

我们不会只使用一种特征类型。以下是典型的卷积网络结构:

  • 多个特征图:网络会包含多个“特征图”。每个图内是相同特征的复制品(不同位置的权重被约束为相同),而不同的图则学习检测不同的特征。这使得图像的每个局部区域都能用多种不同类型的特征来表示。
  • 反向传播与权重约束:复制特征的思想可以很好地融入反向传播算法。我们可以修改梯度计算方式,以确保在权重更新前后,线性约束(如权重相等)始终得到满足。具体做法是,计算各个约束权重的梯度,然后使用这些梯度的总和或平均值来更新所有受约束的权重。

关于复制特征检测器的作用,文献中存在一些混淆。许多人声称它们实现了平移不变性,但这并不准确,至少在神经元的活动层面不是这样。

复制特征实现的是等变性,而非不变性。举例来说,如果图像平移了,那么被激活的神经元位置也会发生同样的平移。图像变了,其表示也以同样的程度变化,这就是等变性。

真正不变的是知识(即权重)。我们学会了在某个位置检测一个特征,也就知道了如何在其他位置检测相同的特征。我们在活动层面实现了等变性,在权重层面实现了不变性。

如果希望在活动层面获得一定的不变性,我们需要对复制特征检测器的输出进行池化。例如,可以对四个相邻的复制检测器的输出取平均或最大值。这样做有两个好处:

  1. 在每个层级上获得少量的平移不变性。
  2. 减少下一层的输入数量,从而允许我们在下一层拥有更多不同的特征图,学习更多种类的特征。

通常,取最大值的效果略好于取平均值。但池化会带来一个问题:经过几层这样的池化操作后,我们会丢失关于物体精确位置的信息。这对于识别“是否存在一张脸”可能足够了,但对于识别“这是谁的脸”,则需要利用眼睛、鼻子、嘴巴之间的精确空间关系,而这些信息在卷积网络中可能已经丢失。

LeNet-5:一个成功的早期案例

第一个令人印象深刻的卷积网络例子是由Yann LeCun及其合作者开发的LeNet-5,它在手写数字识别上表现优异。

LeNet-5具有多个隐藏层,每层包含多个由复制单元组成的特征图,并且在层与层之间使用了池化操作(他们称之为“子采样”)。此外,它还是一个“宽”网络,能够同时处理多个字符,即使字符重叠也能工作,因此无需在输入网络前预先分割单个字符。

一个常被忽视的关键点是,他们采用了一种巧妙的方法来训练整个系统,而不仅仅是训练单个字符识别器。输入是像素,输出是整个邮政编码。在训练这个系统时,他们使用了一种后来被称为“最大间隔”的方法,但这在当时远早于该概念的正式提出。

LeNet-5曾一度负责读取北美约10%的支票,具有巨大的实用价值。其架构大致如下:输入是像素,然后是一系列“特征图”和“子采样”层的交替。例如,C1特征层有6个不同的28x28的特征图,每个图检测小的特征(如3x3像素区域),并且同一图内的权重是共享的。接着通过池化(子采样)得到更小的图,再输入到下一层去发现更复杂的复制特征。通过这种层次结构,网络能够获得更复杂、对位置更不敏感的特征。

在包含10000个测试样本的数据集上,LeNet-5取得了超过99%的正确率,犯了82个错误。这些错误大多是人类也很容易认错的数字,表明仍有改进空间。估计人类在该数据集上的错误率可能在20到30个左右。

注入先验知识的两种方式

现在,我想探讨一个关于如何在机器学习(特别是神经网络)中注入先验知识的普遍观点。

我们可以像LeNet-5那样,通过网络设计来注入先验知识。例如,使用局部连接、权重约束,或者选择特别适合当前任务的神经元活动类型。这种方式比手工设计特征侵入性小,但它仍然将网络偏向于我们设想的那种解决问题的方式(例如,通过逐渐构建更大特征并在空间上复制来实现物体识别)。

还有一种替代方法,能给网络更大的自由度。我们可以利用先验知识来创建大量额外的训练数据。一个早期的例子是Hoffman和Tresp在钢厂建模方面的工作。他们有一个大型的Fortran模拟器来模拟钢厂过程,虽然模拟器不是真实的,但他们将模拟生成的合成数据与真实数据结合,取得了比仅用真实数据更好的效果。

就学习速度而言,通过连接性和权重约束等方式注入知识效率更高。但随着计算机越来越快,通过生成合成样本来注入知识的方式看起来越来越好。特别是,它允许优化过程发现我们未曾想到的使用多层网络的巧妙方法,我们甚至可能无法完全理解其工作原理。如果我们只想要问题的良好解决方案,这或许是可以接受的。

通过合成数据实现突破

在LeNet-5利用关于不变性的知识设计连接、权重共享和池化,取得约80个错误的基础上,通过添加更多技巧(包括使用合成数据),Marc’Aurelio Ranzato等人将错误数降低到了约40个。

一个由Jürgen Schmidhuber领导的瑞士小组,在通过注入合成数据来融入知识方面做到了极致。他们投入大量工作创建了非常有指导意义的合成数据:对每个真实的训练样本进行多种变换,生成更多的训练样本。然后,他们在图形处理器上训练了一个每层具有许多单元、层数也很多的大型网络。GPU提供了30倍的计算加速,而由于他们注入了大量合成数据,网络没有过拟合。如果他们仅仅在GPU上训练一个大型“笨”网络,将会是灾难性的过拟合。

他们实际上结合了三个技巧:

  1. 投入精力生成大量合成数据。
  2. 训练一个大型的“笨”网络。
  3. 使用GPU进行加速。

通过这种方法,他们将错误数降低到了35个。观察他们的错误案例可以发现,正确答案几乎总是出现在他们的前两个预测中。通过构建多个这样的不同模型,然后使用共识来决定数字是什么,他们最终将错误数降低到了约25个,这大概已接近人类的错误率。

如何比较模型性能

这项工作引出了一个重要问题:如何判断一个犯30个错误的模型是否真的比一个犯40个错误的模型更好?这个差异显著吗?

令人惊讶的是,答案取决于它们具体犯了哪些错误。仅仅看错误数量提供的信息不够,你必须知道它们各自在哪些样本上出错,哪些样本上正确。

有一种称为McNemar检验的统计测试,它利用具体的错误情况,比仅仅使用错误数量要敏感得多。

举例来说,考虑两个模型在测试集上的表现。我们关注的是两个模型不一致的情况:即模型1正确而模型2错误,以及模型2正确而模型1错误的样本数量。如果其中一个数量远大于另一个(例如11:1),那么我们可以很有信心地说性能较好的模型确实更优。反之,如果两个数量相差不大(例如25:15),那么即使错误总数有差异,我们也不能确信一个模型比另一个更好。


本节课中我们一起学习了卷积神经网络用于手写数字识别的基本原理、经典网络LeNet-5的架构,以及两种向神经网络注入先验知识的方式(网络结构设计与生成合成数据)。我们还了解了通过合成数据和现代计算硬件(GPU)可以大幅提升模型性能,并学习了使用McNemar检验来更精确地比较两个分类模型性能的方法。

5.4:用于物体识别的卷积网络 🧠

在本节课中,我们将探讨卷积神经网络(CNN)如何从识别手写数字扩展到处理更复杂的任务——识别高分辨率彩色图像中的真实物体。我们将了解这一转变面临的挑战,以及以AlexNet为代表的深度卷积网络如何通过创新的架构和训练技巧,在ImageNet等大型竞赛中取得突破性成果。


从数字到真实世界的挑战

上一节我们介绍了用于手写数字识别的卷积网络。本节中我们来看看,这类网络能否成功扩展到计算机视觉领域所谓的“真实任务”上,即在杂乱场景的高分辨率彩色图像中识别物体。这类任务需要处理图像分割、三维视角变化、场景中存在多个物体等复杂问题。

自本课程开始以来,我们已经在这一领域取得了一些有趣的新成果。在第一讲中,我描述了Alex Krizhevsky开发的网络,并展示了其在物体识别方面的良好表现。但当时,它尚未与最好的计算机视觉系统进行基准测试。现在,测试已经完成。

人们研究MNIST数据集多年,逐步提升了网络识别手写数字的能力。然而,许多计算机视觉研究者认为,如果目标是识别彩色图像中的真实物体,那么研究MNIST是在浪费时间。他们认为从MNIST中学到的经验无法推广到真实图像领域。

这种想法相当合理。以下是真实物体识别任务更为困难的几个原因:

以下是几个关键原因:

  • 物体类别更多:即使只识别100个类别,也比10个数字多出100倍。
  • 像素数量更多:即使使用下采样至256x256的彩色图像,其像素数量也是MNIST图像的100到300倍。
  • 维度信息丢失:真实场景是三维世界的二维投影,大量信息已经丢失。
  • 场景杂乱:手写数字中可能包含重叠字母,但不会出现大块物体被其他不透明物体遮挡的情况。
  • 物体多样性:同一场景中通常不会出现多种完全不同的物体。
  • 光照变化:真实场景中存在各种光照变化,而手写数字图像则没有。

因此,核心问题是:在MNIST上表现优异的同类型卷积神经网络,能否适用于真实的彩色图像识别?

在真实彩色图像领域,我们很可能需要嵌入一些先验知识。因为如果我们试图以“纯粹”的方式,不嵌入任何知识,仅通过生成额外的训练样本来注入所有知识,那么计算量对当前的计算机来说仍然过于庞大。


ImageNet竞赛与数据

近期举行了一场基于ImageNet数据库的竞赛。ImageNet实际上拥有超过一百万张图像,竞赛从中选取了120万张图像的子集。分类任务是为这些图像正确打上标签。这些图像被人工标注了1000个不同的类别,但标注并不完全可靠。一张图像中可能包含标注类别中的两个物体,但只标注了其中一个。

为了使任务可行,计算机视觉系统被允许做出五次预测。只要其中一次预测与人工标注的标签相符,即视为正确。

竞赛还包含一个定位任务。设置定位任务的原因是,许多计算机视觉系统对整个图像或图像的某个象限使用“词袋”方法。它们知道图像中存在哪些特征,但不知道这些特征的具体位置。这使它们能够识别物体,但无法精确定位。定位任务要求系统在识别出物体后,用一个边界框将其框出。要判断定位正确,预测框与正确框的重叠面积必须至少达到50%。

在这个任务上,来自牛津大学、法国国家信息与自动化研究所、施乐欧洲研究中心等顶尖研究团队尝试了当时最好的计算机视觉方法,发现任务非常困难。这些系统通常是复杂的多阶段系统,早期阶段通过优化少量参数进行手动调优,顶层则使用学习算法。但它们不像通过反向传播训练的深度神经网络那样进行端到端的学习,即早期特征检测器中的参数不会受到它们对最终分类决策有用性的影响。

以下是测试集中的一些示例,以便您了解数据的样子:

以下是几个示例:

  • 猎豹:图像中的物体相当明显,但缺失了耳朵和腿等部分。Alex Krizhevsky的深度神经网络给出了未归一化的概率预测,它非常自信地认为这是一只猎豹。如果不是猎豹,它认为几乎可以肯定是豹子。它还考虑了其他可能性,如雪豹(但颜色不对)或埃及猫。
  • 子弹头列车:图像中有许多物体,而目标物体(列车)只占像素的很小一部分。网络正确预测为“子弹头列车”,但也给出了“地铁列车”或“电力机车”等其他合理预测。图像中还有许多其他可能被标记的物体,如占据更大面积的屋顶、支撑屋顶的柱子、行人或背景中的大型公寓楼。在这类图像中,系统必须能够应对存在许多替代目标的情况。
  • 搅拌碗:这是一种不同类型的例子。没有背景杂乱,物体隔离得很好,可能来自产品目录。网络在第一次预测中没有完全正确,但在前五次预测中包含了正确答案。然而,网络对任何预测都不是很自信。这些是相对概率,网络正确地意识到它并不真正确定。如果眯起眼睛看,您可能会理解它为何认为可能是煎锅或听诊器。

竞赛结果与网络架构

那么,各系统在这项数据上的表现如何呢?以下是计算机视觉系统的错误率。您会注意到,最好的几个系统性能都非常接近。东京大学达到了26.1%的错误率(这里只报告每个团队的最佳系统)。牛津大学(通常被认为是欧洲最好的计算机视觉团队之一)同样达到了26%左右的错误率。法国国家研究实验室和施乐帕克研究中心(同样是顶尖的计算机视觉团队)达到了27%。由此可以推测,要击败26%将非常困难,如果能做到,就意味着与最好的计算机视觉系统不相上下。

然而,Alex Krizhevsky的神经网络取得了16% 的错误率。这是一个巨大的差距。通常在这类竞赛中,不会看到如此大的差距。

Alex Krizhevsky的网络结构如下:

  • 网络类型:它是一种非常深的卷积神经网络,其类型由Yann LeCun首创并用于数字识别,后来由Jianan等人应用于识别真实物体。我们借鉴了Jianan团队、Yoshua Bengio团队以及其他开发用于真实视觉任务的深度神经网络的团队所获得的所有经验。
  • 网络深度:它具有7个隐藏层(不包括一些最大池化层),比通常的网络更深。
  • 卷积层:早期层是卷积层。如果我们有更大的计算机,或许可以只使用局部感受野而不进行权值共享。但通过使用卷积,我们大幅减少了参数数量,从而减少了对训练数据量和计算时间的需求。
  • 全连接层:最后两层是全局连接的全连接层,这里包含了大部分参数。我认为每对这样的层之间大约有1600万个参数。最后两层的作用是寻找由早期层提取的局部特征的组合。显然,需要寻找的组合在数量上是组合级增长的,这就是为什么那里需要大量参数。
  • 激活函数:每个隐藏层都使用修正线性单元(ReLU)。这些单元的训练速度比逻辑单元快得多,并且表达能力更强。大多数认真将深度神经网络应用于真实图像进行物体识别的人,都已转向使用ReLU。
  • 竞争性归一化:我们在层内使用了竞争性归一化,以抑制某个单元的活性——如果查看附近区域的其他单元非常活跃的话。这极大地帮助应对强度变化。例如,一个边缘检测器可能因为一些相当微弱的边缘而变得有些活跃,但如果周围有更强烈的特征,这个微弱边缘就几乎无关紧要。

提升性能的关键技巧

我们还使用了一些其他技巧来显著提升该网络的泛化能力。

以下是几个关键技巧:

  • 数据增强:Elis at Skiva将竞赛中的图像下采样至256x256,但Alex Krizhevsky并没有使用整张图像。他从这些图像中随机截取224x224的图像块,这为他提供了海量的训练图像,并帮助他处理平移不变性(尽管是卷积网络,这仍然有帮助)。他还使用了图像的左右翻转,这再次使数据量翻倍。他没有使用上下翻转,因为重力方向非常重要。左右翻转通常不会太大改变物体的外观(除非是文字等)。在测试时,他不仅使用一个图像块。他使用了多个不同的图像块(四个角和中块),这给了他5个块。然后对所有块进行左右翻转,最终得到10个块。他将所有10个块输入网络,然后综合它们的预测结果。
  • Dropout正则化:在参数最多的顶层,他使用了一种称为Dropout的新正则化技术,这种方法非常有效,可以防止网络过拟合。这为他的结果贡献了几个百分点的提升。我将在后续课程中详细描述Dropout。目前,Dropout的基本思想是:每次呈现一个训练样本时,随机“丢弃”(即暂时忽略)某一层中一半的隐藏单元。这意味着该层中幸存的其他隐藏单元不能依赖其“同伴”的存在。它们不能学会去修正该层中其他隐藏单元留下的错误,因为其他隐藏单元可能不在那里,它们可能正在修正一个不存在的错误。因此,它们必须变得更加“个人主义”,必须各自独立地做有用的事情,但同时它们做的事情又必须与其他幸存者不同。所以,Dropout阻止了隐藏单元之间过多的协作。过多的协作对于拟合训练数据非常有益,但如果测试数据分布有显著不同,所有这些协作就会导致过拟合。

硬件与计算效率

Alex的这项工作离不开强大的硬件支持,但这些硬件的成本现在只需几千美元。Alex是一位非常优秀的程序员,他使用了卷积神经网络的高效实现。他使用了两个NVIDIA GTX 580图形处理器(GPU),每个GPU拥有超过500个快速的小核心,这些核心非常擅长做算术运算,但不擅长其他任务。GPU非常擅长进行矩阵乘法运算。

因此,如果将多个训练样本中某一隐藏层的向量活动堆叠在一起,就得到一个矩阵。然后将其乘以权重矩阵,即可计算出所有这些训练样本在下一个隐藏层的活动。如果这两个矩阵都很大,GPU能带来巨大的优势——大约30倍的加速。GPU还具有很高的内存带宽,这对于神经网络是必需的,因为在神经网络中,你需要不断访问另一个权重以便与某个活动值相乘,而这里有数百万个权重,无法全部保存在缓存中。

利用所有这些硬件,他能够在一周内训练出最终的网络。在测试时,他也能非常快速地将10个不同图像块的结果结合起来。因此,在测试时,他几乎可以达到实时帧率。

未来,随着核心变得更便宜,我们将能够把这类网络扩展到大量核心上。谷歌的研究人员已经在进行相关实验。如果我们能足够快地通信状态,我们将能够在更多核心上运行更大的网络。谷歌已经模拟了拥有17亿个连接的神经网络。我认为网络只会变得越来越大。随着核心变得更便宜、数据集变得更大,这些大型深度神经网络的改进速度将远远超过传统的计算机视觉系统,因为它们不需要太多人工工程,并且能够非常好地利用海量数据集和巨大的计算资源。

因此,我们已经拉开巨大差距的事实,我认为意味着没有回头路了。我认为从现在开始,所有最好的物体识别系统(至少在静态图像中)都将使用大型深度神经网络。


在其他领域的应用

在其他应用领域,我们也学到了同样的经验。

例如,Vladimir N. 使用了一个具有局部感受野但没有卷积的网络,从航拍图像中提取道路。这些是城市场景的杂乱航拍图像。他同样使用了多层ReLU。他取一个相对较大的图像块,并预测其中央16x16像素区域内的每个像素是否是道路的一部分。

这项任务的一个优点是,有大量带标签的训练数据可用。这是因为地图会告诉你道路的中心线在哪里,而道路的宽度大致是固定的。因此,从地图上指示道路中心线的矢量,可以估计哪些像素可能是道路。尽管如此,这项任务仍然非常困难。

存在常见的视觉问题:道路被建筑物遮挡(因为飞机拍照时并非垂直向下看)、被树木遮挡、被停在路上的汽车遮挡、建筑物的阴影效应、主要的光照变化(例如晴天与阴天),以及次要的视角变化(飞机基本上是向下看,但在任何大照片中,它不可能在每个像素点都是垂直向下看的)。

这些数据中最严重的问题是不正确的标签。标签不正确是因为地图没有完美配准。对于大多数用途,地图的配准精度不需要高于几米。而这些数据的像素单元大约是1米见方。因此,如果地图的配准偏差3米,那么每条道路上的像素至少会有三个标签错误。另一个严重问题是,制作地图的人必须对什么算作道路、什么算作小巷做出武断的决定。因此,在许多地图中,你看着某个东西,完全不知道它会被视为道路还是小巷,所以你根本不知道它会从地图上得到什么标签。

我认为,在数百万个样本的大型图像块上训练的大型神经网络,是出色完成这项任务的唯一真正希望。很难确定人类在这项任务上能做到多好。

这是数据的样子。这是多伦多的一部分。如果您熟悉多伦多,可以通过道路的角度辨认出来。在图像上方,我放置了从该图像中提取的两个图像块。观察这些图像块,您可以发现判断哪些像素是道路并非易事。右侧是Labir系统的输出,绿色表示正确识别的道路像素,红色表示系统认为是道路但实际上不是的像素。实际上,那个东西是一个停车场,但您可以理解为什么他可能认为那是道路。


总结

本节课中,我们一起学习了卷积神经网络如何从手写数字识别成功扩展到复杂的真实世界物体识别任务。我们探讨了ImageNet竞赛带来的挑战,深入分析了AlexNet的深度架构、ReLU激活函数、数据增强和Dropout等关键技巧,并了解了GPU加速如何使训练大规模网络成为可能。最后,我们还看到了类似技术在航拍图像道路提取等其他领域的应用。这些进展表明,端到端学习的大型深度神经网络正在成为计算机视觉领域的主导力量,其性能提升速度远超依赖大量手工设计的传统方法。

6.1:小批量梯度下降法概述 🧠

在本节课中,我们将学习用于神经网络训练的小批量随机梯度下降法。这是目前训练大型神经网络时最广泛使用的学习算法。

误差曲面回顾

上一节我们介绍了线性神经元的误差曲面。现在我们来回顾一下其基本形态。

误差曲面存在于一个空间中,其中水平轴对应神经网络的权重,垂直轴对应误差值。对于一个使用平方误差的线性神经元,其误差曲面总是一个二次碗状。其垂直截面是抛物线,水平截面是椭圆。

对于多层非线性网络,误差曲面要复杂得多。但只要权重值不是太大,它就是一个平滑的曲面。在局部,它可以很好地用一个二次碗的片段来近似。这个片段可能不是碗的底部,但它能很好地拟合局部误差曲面。

收敛速度与问题

上一节我们介绍了误差曲面的形态,本节中我们来看看使用全批量学习时的收敛速度问题。

当误差曲面是一个二次碗时,最直观的做法是沿着最陡峭的下降方向前进。这会减少误差。但问题是,最陡峭的下降方向并不指向我们真正想去的地方。从椭圆截面可以看出,最陡峭的下降方向几乎与我们想去的方向成直角。我们得到的梯度在椭圆短轴方向(我们只想移动一小段距离的方向)上非常大,而在椭圆长轴方向(我们想移动很长距离的方向)上却非常小。这正好是反过来的。

你可能会认为,研究这种线性系统对于优化大型非线性网络没有帮助。但即使对于这些非线性的多层网络,也会出现非常类似的问题。尽管误差曲面在全局上不是二次碗,但在局部,它们具有相同的特性:在某些方向上曲率很大,在其他方向上曲率很小。

如果学习率设置得太大,学习过程就会出现问题。你会在误差曲面曲率很大的方向上来回振荡,我们称之为“在峡谷中晃动”。如果学习率过大,你甚至会发散。

我们想要实现的目标是:在那些梯度小但非常一致的方向上快速前进(沿着峡谷底部),而在那些梯度大但非常不一致的方向上缓慢移动(即,如果你在这个方向上移动一小段距离,梯度就会改变符号)。

随机梯度下降的动机

在深入探讨如何实现上述目标之前,我需要先谈谈随机梯度下降及其使用动机。

如果你的数据集高度冗余,那么计算权重在数据集前半部分的梯度,与计算其在数据集后半部分的梯度,得到的答案几乎完全相同。因此,在整个数据集上计算梯度完全是浪费时间。

更好的做法是:在一个数据子集上计算梯度,然后更新权重,接着在剩余数据上使用更新后的权重计算梯度。

我们可以将这种做法推向极致,即每次只在一个训练样本上计算梯度,更新权重,然后使用新权重在下一个训练样本上计算梯度。这被称为在线学习

通常,我们不会走得那么极端。使用小批量样本通常更好,典型的小批量大小为10、100甚至1000个样本。

以下是使用小批量的两个主要优势:

  • 计算效率:与在线学习相比,更新权重的频率更低,因此用于实际更新权重的计算量更少。
  • 并行计算:计算梯度时,可以并行计算一批样本的梯度。大多数计算机非常擅长进行矩阵乘法运算。这允许你同时考虑一批训练样本,并将权重同时应用于这批样本,以计算下一层所有样本的激活值。这形成了一个矩阵乘法运算,效率非常高,尤其是在图形处理器上。

关于使用小批量,需要注意一点:你不希望一个小批量中的所有样本答案都相同,而下一个小批量中的答案又完全不同。这会导致权重产生不必要的振荡。理想情况下,如果你有10个类别,一个小批量(例如10个或100个样本)中应包含来自每个类别的相同数量的样本。

近似实现这一目标的一种简单方法是:将所有数据随机排序,然后随机抓取小批量。但必须避免小批量样本非常不具有整个数据集代表性的情况,例如一个小批量全部来自同一个类别。

算法类型对比

基本上,神经网络的训练算法有两种类型。

一种是全梯度算法,即从所有训练样本中计算梯度。一旦计算出梯度,有很多巧妙的方法可以加速学习,例如非线性共轭梯度法。优化领域多年来一直在研究如何优化平滑非线性函数这个一般性问题。然而,多层神经网络与他们研究的问题类型有很大不同。因此,应用他们开发的方法可能需要大量修改才能适用于这些多层网络。

另一种是小批量学习。当你拥有高度冗余的大型训练集时,使用小批量学习几乎总是更好。小批量可能需要相当大,但这并不坏,因为大批量在计算上更高效。

基础小批量梯度下降算法

现在,我将描述一个基础的小批量梯度下降学习算法。这是大多数人在大型冗余数据集上开始训练大型神经网络时会使用的方法。

以下是算法的基本步骤:

  1. 初始化:首先猜测一个初始学习率。
  2. 观察与调整:观察网络是否学习良好,或者误差是否持续变差或剧烈振荡。
    • 如果发生上述情况,降低学习率。
    • 同时观察误差是否下降得太慢。如果你在验证集上测量误差,它可能会有些波动,因为每个小批量的梯度只是对整体梯度的粗略估计。因此,你不希望每次误差上升时都降低学习率。但你期望的是误差能相当一致地下降。
    • 如果误差下降得相当一致但非常缓慢,你或许可以提高学习率。
  3. 自动化:一旦算法正常工作,你可以编写一个简单的程序来自动化这种调整学习率的方式。
  4. 学习率衰减:一个几乎总是有帮助的技巧是:在用小批量学习的后期阶段,降低学习率。这是因为小批量带来的梯度波动会导致权重波动。你希望得到一组对许多小批量都表现良好的最终权重。因此,当你降低学习率时,你是在平滑这些波动,从而得到一组适用于多个小批量的最终权重。
  5. 衰减时机:降低学习率的一个好时机是当误差停止持续下降时。判断误差是否停止下降的一个好标准是使用一个独立的验证集上的误差。验证集是一组你不用于训练,也不会用于最终测试的样本。

总结

本节课中,我们一起学习了小批量随机梯度下降法。我们回顾了神经网络的误差曲面特性,分析了全批量梯度下降在收敛速度上的问题,从而引出了使用随机梯度下降的动机。我们对比了全梯度算法与小批量学习,并详细介绍了基础的小批量梯度下降算法的步骤,包括学习率的初始化、观察调整、自动化以及后期的学习率衰减策略。这是训练大型神经网络最核心、最实用的基础算法之一。

6.2:小批量梯度下降的实用技巧 🧠

在本节课中,我们将学习使用小批量随机梯度下降法时可能遇到的一系列问题,并介绍一系列能显著提升训练效果的实用技巧。这些技巧常被视为神经网络的“黑魔法”,掌握它们对于高效训练模型至关重要。

权重初始化

上一节我们介绍了梯度下降的基本概念,本节中我们来看看如何正确初始化神经网络的权重。如果两个隐藏单元拥有完全相同的权重和偏置(包括输入和输出),那么它们将永远无法变得不同,因为它们总是会获得完全相同的梯度。为了让它们学习到不同的特征检测器,我们需要让它们的初始状态彼此不同。

我们通过使用小的随机权重来初始化,以此打破对称性。这些小的随机权重的大小并不需要完全相同。以下是初始化权重的关键原则:

  • 根据“扇入”调整权重大小:如果一个隐藏单元的输入连接(扇入)非常多,使用较大的权重会容易使其饱和。因此,对于扇入很大的单元,应使用更小的权重。反之,对于扇入很小的单元,可以使用稍大的权重。
  • 一个良好的经验法则是:初始权重的标准差应与扇入数量的平方根成反比。公式表示为:std = 1 / sqrt(fan_in)
  • 学习率的调整:我们也可以按照同样的方式,为不同权重的学习率进行缩放。

输入数据的预处理

一个对神经网络学习速度有显著影响的因素是输入数据的平移,即给输入的每个分量加上一个常数。这看似简单,但在使用最速下降法时,平移输入值能带来巨大差异。

通常,将每个输入分量的均值调整为0会很有帮助。也就是说,确保在整个训练集上,每个输入特征的均值为0。

为了理解其原理,我们来看一个简单的线性神经元例子。假设我们有一个包含两个权重的线性网络,以及两个训练样本。如果不对输入做处理,误差曲面会是一个被拉得很长的椭圆形,导致梯度下降非常困难。然而,如果我们简单地将每个输入减去100(即中心化处理),误差曲面就会变成一个理想的圆形,梯度下降变得非常高效。

隐藏层的激活函数

考虑到隐藏单元,使用输出范围在-1到1之间的双曲正切函数tanh)是有意义的。tanh函数实际上是2 * logistic - 1。使用它的原因在于,隐藏单元的活动值大致是零均值的,这应该能使下一层的训练更快。当然,这只有在输入到tanh的值合理地分布在零附近时才成立。

不过,逻辑斯蒂函数(logistic)也有其优势。例如,它能“掩盖”很大的负向输入波动,因为当输入很小时,其输出稳定在0。而对于tanh,你需要到达其饱和区的末端才能忽略输入。

输入数据的缩放

另一个重要技巧是缩放输入值。在使用最速下降法时,缩放输入是一个简单的操作。

我们通过变换数据,使得每个输入分量在整个训练集上具有单位方差(即典型值为1或-1)。继续之前的例子,如果第一个输入分量很小而第二个很大,误差曲面会是一个高曲率(对应大输入分量)和低曲率(对应小输入分量)的椭圆,不利于学习。通过简单地重新缩放输入,使两个分量方差相同,我们就能得到一个圆形的误差曲面,学习变得容易。

输入数据的去相关

比平移和缩放更复杂但效果更好的方法是去除输入向量各分量之间的相关性。换句话说,我们希望消除像“薯条份数”和“番茄酱份数”之间那种高度相关的关系,这会使学习变得容易得多。

有多种方法可以实现去相关。对于了解主成分分析(PCA)的人来说,一个非常合理的方法是应用PCA:移除特征值最小的成分(这本身也实现了降维),然后用特征值的平方根来缩放剩余的成分。对于一个线性系统,这将保证你得到一个圆形的误差曲面。如果你不了解PCA,我们将在课程后续部分进行讲解。

一旦你得到了一个圆形的误差曲面,梯度就直接指向最小值,学习将变得非常容易。

常见问题与陷阱

现在,我想谈谈人们常遇到的几个问题。

  • 学习率过大:如果你使用的初始学习率过大,可能会将隐藏单元驱动到完全饱和(“开”或“关”)的状态。此时,其状态不再依赖于输入,来自输出的误差导数也无法影响它们(因为处于导数基本为零的饱和区),学习会停止。人们常误以为遇到了糟糕的局部最小值,但实际上通常是卡在了平坦的饱和区上。
  • 分类任务中的“猜测策略”平台期:在分类任务中,如果使用平方误差或交叉熵误差,网络很快会学会一个最优的“猜测策略”——将输出设置为目标为1的比例。误差会快速下降。但随后,特别是对于深层网络,可能需要很长时间才能利用输入信息改进这个策略,因为信息需要穿过所有隐藏层。这看起来也像一个局部最小值,但实际上是一个学习平台期。
  • 过早降低学习率:我之前提到,在训练后期应该降低学习率。但也要注意不要降得太早或太多。降低学习率可以减少由于不同小批量梯度差异引起的误差随机波动,但同时也降低了学习速度。如果降得太早,总体学习效率可能反而会降低。

加速小批量学习的四种主要方法

前面讨论的是一系列让训练更好工作的技巧。现在我将介绍四种专门设计来显著加速学习的方法。

1. 动量法

在标准梯度下降中,我们直接用梯度乘以学习率来更新权重(想象成在误差曲面上移动一个球)。在动量法中,我们使用梯度来加速这个球。梯度改变的是球的速度,然后速度再改变球的位置。这样做的不同之处在于,球具有了“动量”,即它的速度记住了之前的梯度信息,有助于平滑更新并加速穿过平缓的沟壑。

2. 自适应学习率

第二种方法是为每个参数使用独立的自适应学习率,并根据经验测量缓慢调整这个学习率。一个直观的测量是:观察梯度方向是否保持一致。如果梯度的符号不断变化(振荡),我们就降低该参数的学习率;如果梯度的符号保持一致,我们就增加其学习率。

3. RMSProp

第三种方法是RMSProp。在这种方法中,我们用该权重近期梯度大小的滑动平均值来除当前梯度。这样,如果梯度大,就除以一个大数;如果梯度小,就除以一个小数。这能很好地处理梯度大小变化范围很大的情况。它本质上是“仅使用梯度符号”方法的小批量版本,而后者是一种称为Rprop的、为全批量学习设计的方法。

4. 利用曲率信息的二阶优化方法

最后一种加速学习的方法是使用全批量学习,并采用考虑曲率信息的二阶优化方法(如牛顿法、共轭梯度法或拟牛顿法)。优化领域的研究者通常会推荐这种方法。为了使其适用于神经网络,并可能进一步适配小批量学习,需要进行一些调整。不过,这不在本讲座的讨论范围之内。


本节课总结:在本节课中,我们一起学习了优化小批量梯度下降的一系列关键技巧。我们从权重初始化的原理开始,强调了打破对称性的重要性。接着深入探讨了数据预处理的三大支柱:中心化(平移)、缩放(归一化方差)和去相关(如PCA),它们能从根本上改善误差曲面的形状,使学习更高效。然后,我们分析了训练中常见的问题与陷阱,如学习率不当导致的饱和和平台期。最后,我们介绍了四种高级优化方法:动量法、自适应学习率、RMSProp和二阶优化方法,它们能显著加速神经网络的训练过程。掌握这些“黑魔法”是成功训练现代神经网络的重要基础。

6.3:动量法 🚀

在本节课中,我们将学习一种名为“动量法”的技术,它用于提升神经网络中梯度下降的学习速度。动量法不仅适用于全批量学习,也适用于小批量学习。目前,训练大型神经网络最常用的方法就是结合了小批量随机梯度下降与动量法。

动量法的直观理解

上一节我们介绍了梯度下降的基本概念,本节中我们来看看动量法的核心思想。我们可以想象一个球在误差曲面上滚动。球在水平面上的位置代表当前的权重向量。

球从静止开始,因此初始时会沿着最陡的下降方向,即梯度方向移动。一旦它获得了一些速度,它就不再完全沿着梯度方向前进。其动量会使它保持之前的方向运动。显然,我们希望球最终能到达曲面的低点,因此需要让它损失能量。为此,我们引入一点“粘性”,即在每次权重更新时让速度平缓衰减。

动量法的作用是抑制高曲率方向上的振荡。例如,从红色起点出发,经过两步后到达绿色点,这两个点的梯度方向几乎相反。结果是,横跨峡谷方向的梯度相互抵消了,但沿着峡谷方向的梯度没有抵消。沿着峡谷方向,速度会不断累积。当动量法稳定后,球会倾向于沿着峡谷底部前进,并在此过程中积累速度。如果运气好,这将比单纯的梯度下降快得多。

动量法的数学公式

理解了直观原理后,我们来看看动量法的具体公式。核心概念用公式描述如下:

设时间 t(代表权重更新的次数)的速度向量 v_t 为:
v_t = α * v_{t-1} - ε * ∇E(w_t)

其中:

  • α 是动量系数(通常接近1,如0.9)。
  • ε 是学习率。
  • ∇E(w_t) 是当前权重 w_t 处的梯度。

然后,权重的更新规则为:
w_{t+1} = w_t + v_t

这个速度向量也可以用之前的权重变化来表示(如幻灯片所示),具体推导留给大家完成。

动量法的行为与调参技巧

动量法的行为非常直观。在一个平坦的误差曲面上,球会达到一个终极速度。此时,梯度带来的速度增益与动量项(本质是粘性)带来的速度衰减达到平衡。如果动量系数 α 接近1,那么下降速度将远快于单纯使用学习率的梯度下降法。

终极速度(时间趋于无穷时的速度)近似等于梯度乘以学习率,再乘以因子 1/(1-α)。因此,如果 α=0.99,速度将大约是仅使用学习率时的100倍。

在设置动量时,学习初期需要特别注意。以下是关于动量系数设置的几个要点:

  • 学习初期:如果初始随机权重较大,梯度可能非常大。此时你不需要大的动量,因为权重需要快速调整以显著改善性能。之后,你才进入寻找不同权重间合适相对值的困难阶段。因此,学习初期使用较小的动量(如0.5)比0更好,因为它能平均掉一些明显峡谷中的振荡。
  • 学习稳定期:当大梯度消失,进入需要沿着峡谷底部平稳前进而不左右振荡的正常学习阶段时,可以平滑地将动量提升到最终值(如0.9或0.99)。也可以一步到位,但这可能引发振荡。
  • 与学习率的关系:你可能会想,为什么不直接使用更大的学习率?你会发现,使用较小的学习率配合较大的动量,可以达到比单独使用大学习率(无动量)更大的整体有效学习速度。如果单独使用过大的学习率,会导致在峡谷两侧产生巨大的发散性振荡。

内斯特罗夫动量法

最近,Ilya Sutskever 发现了一种更好的动量形式。标准的动量法是先计算当前位置的梯度,然后将其与存储的先前梯度记忆(即球的速度)结合,最后沿着当前梯度与历史梯度累积的方向进行一大步跳跃。

Ilya Sutskever 发现,在许多情况下,采用由 Nesterov 提出的动量形式效果更好。Nesterov 最初是为了优化凸函数而提出的这种方法。其思想是:我们先沿着先前累积的梯度方向进行一大步跳跃,然后测量跳跃终点的梯度,并据此进行修正。它与标准动量法非常相似,但顺序不同。

理解差异的一种方式是:在标准动量法中,你先加入当前梯度,然后沿着这个混合方向“赌博式”地跳跃。在内斯特罗夫方法中,你先用先前累积的梯度进行“赌博式”跳跃,然后在你到达的位置进行修正。

具体步骤如下:

  1. 沿着先前迭代累积的梯度方向(如图中棕色向量)迈出一大步。
  2. 在跳跃终点测量梯度。
  3. 沿着该梯度方向向下走一小步进行修正。
  4. 将这一小步修正与之前的大跳跃结合,得到新的累积梯度。
  5. 新的累积梯度经过衰减(如乘以0.9)后,用于下一次大跳跃。

事实证明,先“赌博”再修正,比先修正再“赌博”要好得多

总结

本节课中我们一起学习了动量法。我们首先通过“球在曲面滚动”的比喻理解了动量法抑制振荡、加速峡谷方向收敛的直观原理。接着,我们学习了其核心数学公式 v_t = α * v_{t-1} - ε * ∇E(w_t)w_{t+1} = w_t + v_t。然后,我们探讨了动量系数 α 的设置技巧,特别是在学习初期应使用较小值,稳定后可增大,并解释了其与学习率协同工作的优势。最后,我们介绍了更先进的内斯特罗夫动量法,它通过改变“计算梯度”和“沿累积方向跳跃”的顺序,实现了更稳定、更有效的优化。动量法是训练现代深度神经网络不可或缺的优化工具。

6.4:为每个连接设置自适应学习率 🎯

在本节课中,我们将学习一种由Robbie Jacobs在20世纪80年代末提出,并由多人改进的优化方法。该方法的核心思想是为神经网络中的每一个连接都设置一个自适应学习率。我们将通过观察权重更新时的梯度变化,来经验性地调整这个学习率。如果某个权重的梯度方向频繁反转,我们就降低其学习率;如果梯度方向保持一致,我们就提高其学习率。

为何需要自适应学习率?🤔

上一节我们介绍了学习率的基本概念,本节中我们来看看为何需要为每个连接单独设置学习率。在深层神经网络中,不同权重所需的学习率差异可能非常大,尤其是在不同层之间。

以下是导致这种差异的两个主要原因:

  • 梯度大小差异:例如,如果初始权重设置得很小,那么初始层的梯度通常会远小于后面层的梯度。
  • 输入扇入数:一个单元的扇入数决定了当你同时改变其多个输入权重来修正同一个误差时,可能产生的“超调”效应的大小。如果某个单元输入不足,当你同时调整多个权重来修正误差时,它可能会突然获得过多的输入。显然,扇入数越大,这种效应就越明显。

因此,我们的思路是:首先设置一个全局学习率,然后为每个权重乘以一个根据经验确定的局部增益因子。

如何确定局部增益?🔧

一个简单的方法是,初始时将所有连接的局部增益设为1。这样,权重 W_ij 的更新量就是学习率乘以增益 G_ij,再乘以该权重的误差导数。

接下来,我们将根据梯度符号的变化来调整 G_ij。以下是调整规则:

  • 增加增益:如果当前时刻 t 的梯度与上一时刻 t-1 的梯度符号相同(即它们的乘积为正),则以一个小的加性量增加 G_ij
  • 减少增益:如果梯度符号相反,则以一个乘性因子减少 G_ij。采用乘性减少是为了在增益已经很大时能快速抑制它,防止因振荡而失控。

思考一下,如果梯度是完全随机的会怎样?每次更新时梯度符号随机,那么增益增加和减少的次数大致相等。加性增加(如+0.05)和乘性减少(如×0.95)会达到一个平衡点,即增益在1附近波动。如果梯度方向持续一致,增益可以变得远大于1;如果梯度方向持续相反(意味着在“山谷”两侧振荡),增益则可以变得远小于1。

实用技巧与结合动量 🚀

为了让自适应学习率更好地工作,这里有一些实用技巧。

首先,限制增益的大小非常重要。一个合理的范围是[0.1, 10]或[0.01, 100]。防止增益变得过大而导致不稳定,从而破坏所有权重。

其次,自适应学习率方法最初是为全批量学习设计的。你也可以将其用于小批量学习,但批量最好足够大,以确保梯度符号的变化不是由于小批量的采样误差引起的,而是真正反映了跨越“山谷”的行为。

最后,自适应学习率完全可以与动量方法结合使用。Jacobs建议,不要使用当前梯度与上一时刻梯度的符号一致性,而是使用当前梯度与该权重速度(即累积梯度)的符号一致性。这样做可以结合动量法和自适应学习率两者的优势。

自适应学习率主要处理的是坐标轴对齐的效应,而动量法则不关心坐标轴的对齐,它能处理对角线方向上的快速移动,这是单纯的自适应学习率做不到的。

总结 📝

本节课我们一起学习了为神经网络中每个连接设置自适应学习率的方法。我们了解了其必要性,掌握了通过梯度符号一致性来调整局部增益的基本规则,并探讨了限制增益范围、结合动量等实用技巧。这种方法通过动态调整每个参数的学习步长,有助于更平稳、高效地训练深度网络。

6.5:RMSprop - 梯度归一化方法 🚀

在本节课中,我们将学习两种重要的神经网络权重优化方法:Rprop及其改进版本RMSprop。我们将重点理解它们如何通过处理梯度幅度的巨大差异来提升学习效率,特别是RMSprop如何将Rprop的思想成功应用于小批量学习场景。

Rprop方法介绍

上一节我们讨论了梯度下降的变体,本节中我们来看看Rprop方法。这是一种专为全批量学习设计的优化技术。

Rprop旨在解决梯度幅度差异巨大的问题。某些梯度可能极小,而另一些可能极大,这使得选择单一的全局学习率变得困难。在全批量学习中,我们可以通过仅使用梯度的符号来应对这种变化,这使得所有权重更新具有相同的大小。对于逃离梯度极小的平台区域,这是一项优秀的技术。

Rprop结合了仅使用梯度符号的思想,以及让步长依赖于具体权重的理念。决定如何改变权重时,我们不关注梯度的大小,只关注梯度的符号。但我们会关注为该权重确定的步长,该步长会随时间自适应调整。

以下是Rprop更新步长的规则:

  • 如果最近两次梯度的符号一致,则以乘法方式增加该权重的步长(例如乘以因子1.2)。
  • 如果最近两次梯度的符号不一致,则以乘法方式减少该权重的步长,且减少的力度通常大于增加的力度,以便能比增长更快地衰减。

我们需要限制步长的范围。Mike Schhuusster的建议是将步长限制在50和百万分之一之间。具体上限取决于处理的问题类型。

从Rprop到小批量学习

那么,为什么Rprop不适用于小批量学习呢?人们尝试过但发现难以使其生效。其根本原因在于它违背了随机梯度下降的核心思想。

随机梯度下降的核心思想是,当学习率较小时,梯度会在连续的小批量上被有效地平均。考虑一个权重,它在9个小批量上获得+0.1的梯度,然后在第10个小批量上获得-0.9的梯度。我们希望这些梯度大致平均,从而使权重保持原位。但Rprop无法实现这一点。

Rprop会根据其当前步长将该权重增加9次,仅减少1次,这将导致权重变得非常大。这里我们假设步长的自适应速度远慢于这些小批量的时间尺度。

因此,问题在于:我们能否结合Rprop仅使用梯度符号带来的鲁棒性、小批量学习带来的效率、以及小批量间梯度平均的优势?这引出了RMSprop方法。

RMSprop方法详解

RMSprop可以被视为Rprop的小批量版本。Rprop等效于使用梯度,但同时除以梯度的大小。它在小批量上出现问题,是因为我们为每个小批量除以了不同的梯度幅度值。

RMSprop的核心思想是:强制要求相邻小批量所除的数值大致相同。我们通过为每个权重保持一个平方梯度的移动平均来实现这一点。

以下是RMSprop的关键计算公式:

mean_square(w, t) = decay_rate * mean_square(w, t-1) + (1 - decay_rate) * (gradient(w, t))^2

其中,mean_square(w, t)表示在时间t(即第t次权重更新时)对于权重w的移动平均。视频中以0.9和0.1作为计算移动平均的衰减率示例,这是合理的选择。

然后,我们取该均方值的平方根(即RMS,均方根),并用梯度除以这个RMS值,最后进行与该结果成比例的更新。

weight_update = -learning_rate * (gradient(w, t) / sqrt(mean_square(w, t) + epsilon))

这种方法使学习效果更好。请注意,这里我们没有为每个连接单独调整学习率,而是一种更简单的方法:仅为每个连接保持一个均方根梯度的运行平均值,然后除以它。

RMSprop的扩展与比较

关于RMSprop,可以进行许多进一步的开发。可以将其与标准动量结合,但目前的实验表明其帮助不如动量通常那么大,这需要更多研究。也可以将其与Nesterov动量结合,Eli Sskiva最近尝试了这种方法并取得了良好结果。

显然,还可以将RMSprop与每个连接的自适应学习率结合,这将使其更像Rprop,但这需要大量进一步的研究。

还有一些其他方法与RMSprop有很多共同之处。Yann LeCun的团队今年发表了一篇有趣的论文《No More Pesky Learning Rates》,其中的一些项看起来很像RMSprop。

神经网络学习方法总结

神经网络学习方法的总结如下:

如果你有一个小数据集(例如少于10000个样本)或一个冗余不多的大数据集,应考虑使用全批量方法。例如来自优化文献的全批量方法(如非线性共轭梯度、L-BFGS或Levenberg-Marquardt),或者使用之前视频中描述的自适应学习率或Rprop。

如果你有一个大型冗余数据集,则必须使用小批量学习。首先可以尝试带动量的标准梯度下降。你可能需要选择一个全局学习率,并可能编写一个小循环来根据梯度是否改变符号来调整该全局学习率。

接下来可以尝试RMSprop。如果不使用动量,它实现起来非常简单。根据我目前的实验,它的效果似乎与带动量的梯度下降一样好,甚至更好。

你也可以考虑通过添加动量或为每个权重添加自适应步长等方法来改进RMSprop,但这基本上仍是未知领域。最后,你可以查找Yann LeCun的最新方案并尝试它。

为何没有万能配方?

你可能会问,为什么没有简单的通用配方?我们认为主要有两个原因。

首先,神经网络差异很大。非常深的网络,特别是其中包含狭窄瓶颈的网络,是非常难以优化的,它们需要能对非常小的梯度非常敏感的方法。循环网络是另一个特例。如果你想让它注意到很久以前发生的事情并根据这些很早以前的事情改变权重,那么它们通常很难优化。还有宽而浅的网络,它们在实践中被大量使用,通常可以用不太精确的方法进行优化。

其次,任务差异也很大。有些任务需要非常精确的权重,有些则完全不需要权重非常精确。此外,有些任务具有奇怪的特性。例如,如果你的输入是单词,稀有词可能每10万个样本中只出现一次,这与输入是像素时的情况截然不同。

课程总结

本节课中我们一起学习了Rprop和RMSprop这两种优化算法。我们了解到Rprop通过仅使用梯度符号和自适应步长来处理全批量学习中的梯度幅度差异,而RMSprop通过维护梯度平方的移动平均并将其用于归一化,成功地将这一思想扩展到了小批量学习场景,从而结合了小批量学习的效率与梯度归一化的鲁棒性。

总而言之,对于如何训练神经网络,我们确实没有清晰明确的建议,只有一些经验法则。虽然这并不完全令人满意,但请想想,一旦我们解决了这个问题,神经网络将会工作得多么好——而它们现在已经工作得相当不错了。

7.1:序列建模概述 🧠

在本节课中,我们将要学习用于序列建模的各种模型。我们将从最简单的自回归模型开始,逐步深入到包含隐藏状态和隐藏动态的更复杂模型,如线性动态系统和隐马尔可夫模型。最后,我们将探讨循环神经网络如何克服这些传统模型的局限性,并成为强大的序列建模工具。


序列建模的目标

当我们使用机器学习来建模序列时,通常希望将一个序列转换为另一个序列。例如,将英语单词序列转换为法语单词序列,或将声压序列转换为单词身份序列(如语音识别)。有时,我们没有单独的目标序列。在这种情况下,可以通过尝试预测输入序列中的下一个项来获得教学信号。因此,目标输出序列就是输入序列向前移动一个时间步。

这种方法比在图像中从所有其他像素预测一个像素,或从图像的其余部分预测一个图像块显得更自然。一个可能的原因是,对于时间序列,预测有一个自然的顺序;而对于图像,则不清楚应该从什么预测什么。但实际上,类似的方法在图像处理中效果也很好。


预测与学习类型的模糊

当我们预测序列中的下一个项时,它模糊了本课程开始时区分的监督学习和无监督学习之间的界限。我们使用为监督学习设计的方法来预测下一个项,但我们不需要单独的教学信号。从这个意义上说,它是无监督的。

在开始使用循环神经网络建模序列之前,我们先快速回顾一些其他序列模型。


自回归模型

一个简单且没有记忆的序列模型是自回归模型。它的作用是获取序列中的一些先前项,并尝试预测下一个项。基本上,它是先前项的加权平均值。先前项可以是单个值,也可以是整个向量。线性自回归模型将只取这些项的加权平均值来预测下一个项。

我们可以通过添加隐藏单元使其变得更加复杂。因此,在前馈神经网络中,我们可能会取一些先前的输入项,通过一些隐藏单元,然后预测下一个项。


具有隐藏状态的模型

无记忆模型只是可用于序列的模型的一个子类。我们可以考虑生成序列的方法。一种非常自然的生成序列的方法是拥有一个具有隐藏状态的模型,该状态具有其自身的内部动态。因此,隐藏状态根据其内部动态演化,并且隐藏状态也产生观测值。我们能够看到这些观测值。

这是一种更有趣的模型。它可以在其隐藏状态中长期存储信息。与无记忆模型不同,在确定其不再影响事物之前,没有简单的界限来限制我们需要回溯多远。

如果隐藏状态的动态是嘈杂的,并且它从其隐藏状态生成输出的方式也是嘈杂的,那么通过观察像这样的生成模型的输出,你永远无法确定其隐藏状态是什么。你最多只能推断出所有可能隐藏状态向量空间上的概率分布。你可以知道它可能在空间的某个部分,而不是另一个部分,但你无法精确定位它。

因此,对于像这样的生成模型,如果你观察它产生的结果,并尝试推断隐藏状态是什么,通常这是非常困难的。但有两种类型的隐藏状态模型,其计算是易于处理的。也就是说,存在一种相当直接的计算方法,允许你推断出可能导致数据的隐藏状态向量的概率分布。

当然,当我们这样做并将其应用于真实数据时,我们假设真实数据是由我们的模型生成的。这通常是我们建模时所做的事情。我们假设数据是由模型生成的,然后推断模型必须处于什么状态才能生成该数据。

接下来的内容主要面向已经了解我将要描述的两种隐藏状态模型的人。这些内容的目的是为了明确循环神经网络与这些标准模型有何不同。如果你无法理解这两种标准模型的细节,请不要过于担心,这不是重点。


线性动态系统

一个标准模型是线性动态系统。它在工程中应用非常广泛。这是一个具有实值隐藏状态的生成模型。隐藏状态具有线性动态(如右侧红色箭头所示),并且动态具有高斯噪声,因此隐藏状态以概率方式演化。可能还有驱动输入(如底部所示),直接影响隐藏状态。因此,输入直接影响隐藏状态,隐藏状态决定输出。

要预测像这样的系统的下一个输出,我们需要能够推断其隐藏状态。这类系统被用于例如跟踪导弹。事实上,高斯分布最早的应用之一就是试图从嘈杂的观测中追踪行星。高斯本人发现,如果假设噪声为高斯噪声,就可以很好地完成这项工作。

高斯分布的一个优点是,如果你对高斯分布进行线性变换,你会得到另一个高斯分布。由于线性动态系统中的所有噪声都是高斯的,因此,给定迄今为止的观测(即迄今为止的输出),隐藏状态上的分布也是高斯的。它是一个全协方差高斯分布,计算它是什么相当复杂,但可以高效计算。有一种称为卡尔曼滤波的技术,它是一种高效的递归方法,用于在给定新观测的情况下更新你对隐藏状态的表示。

总结:给定系统输出的观测,我们无法确定它处于什么隐藏状态,但我们可以估计它可能处于的可能隐藏状态的高斯分布。当然,这总是假设我们的模型是我们所观察现实的正确模型。


隐马尔可夫模型

另一种使用离散分布而非高斯分布的隐藏状态模型是隐马尔可夫模型。因为它基于离散数学,所以计算机科学家很喜欢这种模型。在隐马尔可夫模型中,隐藏状态由N个选择中的一个组成。因此,有许多称为状态的东西,系统总是恰好处于这些状态之一。状态之间的转移是概率性的,它们由转移矩阵控制,转移矩阵只是一组概率,表示如果你在时间1处于状态1,那么在时间2进入状态3的概率是多少。输出模型也是随机的。因此,系统所处的状态并不完全决定它产生什么输出。每个状态可以产生的输出存在一些变化。因此,我们无法确定哪个状态产生了给定的输出。从某种意义上说,状态隐藏在这个概率面纱后面。这就是为什么它们被称为“隐藏”。

历史上,神经网络中隐藏单元被称为“隐藏”的原因是因为我喜欢这个术语。它听起来很神秘,所以我把它借用于神经网络。

用N个数字来表示N个状态上的概率分布很容易。因此,隐马尔可夫模型的一个优点是,我们可以表示其离散状态上的概率分布。因此,即使我们不确定它处于什么状态,我们也可以轻松地表示概率分布。

要预测隐马尔可夫模型的下一个输出,我们需要推断它可能处于什么隐藏状态。因此,我们需要掌握那个概率分布。事实证明,有一种基于动态规划的简单方法,允许我们根据所做的观测来计算隐藏状态上的概率分布。一旦我们有了那个分布,隐马尔可夫模型就有一个优雅的学习算法,这就是为什么它们如此适合语音识别。在20世纪70年代,它们接管了语音识别领域。


隐马尔可夫模型的局限性

隐马尔可夫模型有一个根本性的局限性。如果我们考虑隐马尔可夫模型生成数据时会发生什么,就最容易理解这个局限性。在生成的每个时间步,它选择其隐藏状态之一。因此,如果它有N个隐藏状态,隐藏状态中存储的总信息最多为log N比特。这就是它对自己迄今为止所做事情的全部了解。

现在,让我们考虑隐马尔可夫模型可以从其产生的语句的前半部分向后半部分传达多少信息。想象它已经产生了语句的前半部分,现在它将必须产生后半部分。请记住,它对前半部分所说内容的记忆在于它处于N个状态中的哪一个。因此,它的记忆只有log N比特的信息。

要产生与前半部分兼容的后半部分,它必须使语法匹配。例如,数字和必须一致。它还需要使语义匹配。句子的后半部分不能与前半部分完全无关。此外,语调也需要匹配。因此,如果语调轮廓在句子中途完全改变,那会显得很傻。还有许多其他事情也必须匹配:说话者的口音、说话速度、说话音量以及说话者的声道特征。所有这些事情都必须在句子的后半部分和前半部分之间匹配。

因此,如果你想要一个隐马尔可夫模型实际生成一个句子,隐藏状态必须能够将信息从前半部分传达到后半部分。问题是,所有这些方面加起来很容易达到100比特的信息。因此,句子的前半部分需要向后半部分传达100比特的信息,这意味着隐马尔可夫模型需要2的100次方个状态。这实在是太多了。


循环神经网络

这就引出了循环神经网络。它们有一种更有效的方式来记忆信息。它们非常强大,因为它们结合了两个特性。它们具有分布式隐藏状态。这意味着几个不同的单元可以同时激活。因此,它们可以同时记住几件不同的事情。它们不仅仅有一个活跃的单元。它们也是非线性的。你看,线性动态系统有一个完整的隐藏状态向量,因此它一次有多个值。但这些值被限制以线性方式作用,以便使推断变得容易。而在循环神经网络中,我们允许动态变得更加复杂。只要有足够的神经元和足够的时间,循环神经网络可以计算你的计算机可以计算的任何东西。它是一个非常强大的设备。

因此,线性动态系统和隐马尔可夫模型都是随机模型。也就是说,动态和从底层状态产生观测都涉及内在噪声。问题是,模型需要这样吗?嗯,需要注意的一点是,无论是线性动态系统还是隐马尔可夫模型,其隐藏状态的后验概率分布都是迄今为止所见数据的确定性函数。也就是说,这些系统的推断算法最终会得到一个概率分布,而这个概率分布只是一堆数字,这些数字是迄今为止数据的确定性函数。在循环神经网络中,你得到一堆数字,这些数字是迄今为止数据的确定性函数。将这些构成循环神经网络隐藏状态的数字视为类似于这些更简单随机模型的概率分布,可能是一个好主意。


循环神经网络的行为

那么,循环神经网络可以表现出什么样的行为呢?它们可以振荡。这对于像运动控制这样的事情显然是有益的。例如,当你走路时,你需要一个良好的规则振荡,那就是你的步伐。它们可以收敛到点吸引子。这对于检索记忆可能是有益的。在本课程后面,我们将研究霍普菲尔德网络,它们利用收敛到点吸引子来存储记忆。其思想是,你对你试图检索的内容有一个大致的概念,然后让系统稳定到一个稳定点,这些稳定点对应于你知道的事物。因此,通过收敛到那个稳定点,你检索了一个记忆。

如果你将权重设置在适当的范围内,它们也可能表现出混沌行为。通常,混沌行为对信息处理不利,因为在信息处理中,你希望能够可靠地行为,你想要实现某个目标。但在某些情况下,这可能是一个好主意。如果你面对一个更聪明的对手,你可能无法智胜他们。因此,表现得随机可能是一个好主意。而获得随机性表象的一种方式就是表现得混沌。

循环神经网络的一个优点是,很久以前,我认为这将使它们非常强大,那就是循环神经网络可以学会使用其隐藏状态的不同子集来实现许多小程序。每个小程序都可以捕捉一小块知识。所有这些都可以并行运行,并以复杂的方式相互交互。不幸的是,循环神经网络的计算能力使它们非常难以训练。多年来,我们无法利用循环神经网络的计算能力。有一些英勇的努力。例如,托尼·罗宾逊设法使用循环网络制作了一个相当好的语音识别器。他必须做很多工作,在由transputer构建的并行计算机上实现它们。直到最近,人们才设法生产出性能与托尼·罗宾逊曾经相当的循环神经网络。


总结

在本节课中,我们一起学习了序列建模的多种方法。我们从简单的自回归模型开始,了解了其基本思想是使用序列的先前项预测下一个项。接着,我们探讨了包含隐藏状态和内部动态的更复杂模型,包括线性动态系统和隐马尔可夫模型,理解了它们如何通过概率分布来描述不确定的隐藏状态。最后,我们重点介绍了循环神经网络,它结合了分布式隐藏状态和非线性动态,拥有强大的记忆和计算能力,能够克服传统模型(如HMM)在信息容量上的根本限制,尽管其训练颇具挑战性。这些模型构成了我们理解和处理序列数据的基础。

7.2:通过时间反向传播训练RNN 🧠

在本节课中,我们将要学习如何训练循环神经网络,核心方法是“通过时间反向传播”算法。我们将看到RNN如何被展开成一个前馈网络,并理解如何利用权重共享和梯度计算来有效地训练它。


上一节我们介绍了循环神经网络的基本概念,本节中我们来看看如何具体地训练它们。

理解RNN与前馈网络的等价性 🔄

理解如何训练循环神经网络的关键,在于认识到一个循环神经网络,实际上等同于一个在时间上展开的前馈网络。

循环网络从某个初始状态开始,然后使用其连接上的权重来获得一个新的状态。接着,它再次使用相同的权重来获得另一个新状态,并如此反复。因此,它本质上就是一个多层前馈网络,只不过每一层的权重都被约束为相同。

公式表示: 如果我们用 s_t 表示时间步 t 的状态,W 表示共享的权重矩阵,f 表示激活函数,那么状态更新可以表示为:
s_t = f(W * s_{t-1})

通过时间反向传播算法 ⏳

反向传播算法擅长处理存在权重约束的情况,我们在卷积网络中已经见过这一点。为了处理线性约束,我们可以先像权重没有约束一样正常计算梯度,然后修改梯度以维持约束。

算法核心: 如果我们希望 W1 等于 W2,我们开始时让它们相等。然后,我们需要确保 W1 的变化量等于 W2 的变化量。我们通过计算误差对 W1 的导数和对 W2 的导数,将它们相加或取平均,然后用这个相同的量来同时更新 W1W2。这样,如果权重开始时满足约束,它们将继续满足约束。

通过时间反向传播算法,正是将循环网络视为具有共享权重的前馈网络,并用反向传播进行训练时所发生的过程。

我们可以从时间域来思考这个算法:

  • 前向传播:在每个时间片累积构建一个活动堆栈。
  • 反向传播:从堆栈中逐层剥离活动,并计算误差导数。每一步都向后传播,因此得名“通过时间反向传播”。

在反向传播之后,我们可以将每个特定权重在所有不同时间步的导数相加,然后按照与所有这些导数之和或平均值成比例的量,来改变该权重的所有副本。

处理初始状态 🚦

这里有一个额外的棘手问题。如果我们没有指定所有单元的初始状态,例如,其中一些是隐藏单元或输出单元,那么我们必须以某种特定状态启动它们。

我们可以简单地将这些初始状态固定为某个默认值,比如0.5。但这可能无法让系统发挥出拥有更合理初始值时的最佳性能。

实际上,我们可以学习初始状态。我们将它们视为参数,而不是活动值,并像学习权重一样学习它们。我们从一个对初始状态的随机猜测开始,然后在每个训练序列结束时,通过时间反向传播一直传播到初始状态。这为我们提供了误差函数关于初始状态的梯度。我们只需沿着该梯度方向调整初始状态,即沿着梯度下降,从而得到略有不同的新初始状态。

输入与目标输出的指定方式 🎯

有多种方式可以为我们的循环神经网络提供输入。

以下是几种常见的输入指定方式:

  • 指定所有单元的初始状态:当我们将循环网络视为具有约束权重的前馈网络时,这是最自然的方式。
  • 仅指定部分单元的初始状态
  • 在每一个时间步指定部分单元的状态:这可能是输入序列数据最自然的方式。

同样,指定循环网络的目标输出也有多种方式。

以下是几种常见的目标指定方式:

  • 指定所有单元的期望最终状态:当我们将它视为具有约束权重的前馈网络时,这是自然的方式。
  • 指定多个时间步的期望状态:如果我们试图训练它收敛到某个吸引子,我们可能不仅想指定最终时间步的期望状态,还想指定多个时间步的期望状态。这将促使它真正稳定在那里,而不是经过某个状态后跑到别处。通过指定末尾的几个状态,我们可以强制它学习吸引子。
  • 指定部分单元的期望活动:你可以将这些单元视为输出单元。这是一种非常自然的方式来训练旨在提供连续输出的循环神经网络。

在反向传播时,从最顶层(最终时间步)的导数开始,然后当我们回到顶层之前的层时,加入该层的导数,依此类推。因此,在多个不同层拥有导数只需要很少的额外努力。


本节课中我们一起学习了训练循环神经网络的核心算法——通过时间反向传播。我们理解了RNN在时间上展开后与前馈网络的等价性,掌握了如何处理共享权重的约束、如何学习网络的初始状态,并了解了为RNN指定输入和目标输出的多种灵活方式。这些是构建和训练能够处理序列数据的强大神经网络模型的基础。

7.3:循环神经网络训练示例 🧮

在本节课中,我们将学习循环神经网络如何解决一个简单的示例问题。这个示例旨在展示循环神经网络相对于前馈神经网络的优势。我们将以二进制加法为例,探讨RNN的工作原理,并分析其隐藏状态与有限状态自动机中状态的对应关系。


二进制加法问题

考虑两个二进制数相加的问题。理论上,我们可以训练一个前馈神经网络来完成这个任务。右侧的图表展示了一个接收输入并产生输出的网络结构。

然而,使用前馈神经网络存在一些问题。我们必须预先确定输入数字和输出数字的最大位数。更重要的是,我们对输入数字不同位的处理无法实现泛化。例如,当我们学习如何处理最后两位的加法及进位时,这些知识被编码在特定的权重中。在处理长二进制数的其他部分时,相同的知识需要由不同的权重来编码,因此无法实现自动泛化。

因此,尽管可以训练前馈神经网络使其最终学会对固定长度的数字进行二进制加法,但这并非一个优雅的解决方案。


二进制加法算法

下图展示了二进制加法的算法流程。图中显示的状态类似于隐马尔可夫模型中的状态,但它们并非完全隐藏。系统在任一时刻处于一个状态,进入状态时会执行一个动作,即输出一个1或0。当系统处于某个状态时,它会接收输入(即下一列的两个数字),该输入会使其进入一个新的状态。

例如,在右上角,系统处于进位状态并刚刚输出一个1。如果它看到输入为(1, 1),它会保持在同一状态并再次输出一个1。如果它看到输入为(1, 0)(0, 1),它会进入进位状态但输出一个0。如果看到输入为(0, 0),它会进入无进位状态并输出一个1,依此类推。


循环神经网络的结构

用于二进制加法的循环神经网络需要两个输入单元和一个输出单元。在每个时间步,它接收两个输入数字,并需要产生一个输出。输出对应的是它两个时间步之前接收的列的结果。

之所以需要两个时间步的延迟,是因为需要一个时间步来根据输入更新隐藏单元,另一个时间步来从隐藏状态生成输出。

因此,网络结构如下所示。我们只使用了三个隐藏单元,这足以完成任务。使用更多隐藏单元会学得更快,但三个也能完成。

三个隐藏单元完全互连,它们之间的连接是双向的,且权重不一定相同(通常确实不同)。隐藏单元之间的连接允许一个时间步的模式影响下一个时间步的隐藏活动模式。输入单元通过前馈连接连接到隐藏单元,这是它“看到”一列中两个数字的方式。同样,隐藏单元通过前馈连接连接到输出单元,从而产生输出。


学习到的模式与有限状态自动机

观察循环神经网络学习到的内容很有趣。它在三个隐藏单元中学会了四种不同的活动模式。这些模式对应于二进制加法有限状态自动机中的节点。

我们不应将神经网络中的单元与有限状态自动机中的节点混淆。有限状态自动机中的节点对应于循环神经网络的活动向量。自动机被限制为每次只处于一个状态。类似地,循环神经网络中的隐藏单元在每个时间点也只具有一个活动向量。

因此,循环神经网络可以模拟有限状态自动机,但其表示能力呈指数级增长。对于N个隐藏神经元,它有2^N个可能的二进制活动向量。当然,它只有N^2个权重,因此不一定能充分利用所有这些表示能力。但如果瓶颈在于表示,循环神经网络可以比有限状态自动机做得更好。这在输入流中同时存在两个独立事物时尤为重要。


表示能力的对比

有限状态自动机需要将其状态数量平方,以处理同时发生的两件事情。而循环神经网络只需要将其隐藏单元数量加倍。通过将单元数量加倍,它确实将其拥有的二进制向量状态数量平方了。


总结

本节课中,我们一起学习了循环神经网络如何通过一个二进制加法的玩具示例进行训练。我们探讨了其相对于前馈网络的优势,分析了其网络结构和工作原理,并将其隐藏状态与有限状态自动机的状态进行了对比,理解了循环神经网络在表示复杂、并发模式时的强大能力。

7.4:为何训练RNN如此困难?🤔

在本节课中,我们将探讨一个核心问题:为什么训练循环神经网络(RNN)会如此困难?我们将深入分析“梯度爆炸与梯度消失”现象,并了解这一现象如何阻碍RNN学习长期依赖关系。最后,我们将简要介绍四种解决此问题的有效方法。


为了理解训练RNN的困难之处,我们必须认识到RNN在前向传播与反向传播之间存在一个关键差异。

在前向传播过程中,我们使用如逻辑函数(logistic)这样的压缩函数来防止激活值爆炸。例如,每个神经元的输出被限制在0到1之间,这有效阻止了数值的无限增长。

然而,反向传播过程却是完全线性的。这一点常令人惊讶。如果你将网络最后一层的误差加倍,那么通过反向传播计算出的所有梯度也会加倍。在前向传播完成后,每个神经元激活点(如前图中的红点)处的梯度(即该点切线的斜率)就已确定。随后的反向传播过程,就如同在一个线性系统中前向传播,其线性斜率已被固定。

由于反向传播是线性的,它会遭遇线性系统的典型问题:在迭代过程中,梯度倾向于要么爆炸式增长,要么衰减至零


以下是梯度爆炸与消失问题的具体表现:

  • 梯度消失:当网络权重较小时,梯度在反向传播多层后会指数级缩小。这意味着,在通过时间反向传播时,距离目标时间点很远的早期输入所获得的梯度会变得极其微小。
  • 梯度爆炸:当网络权重较大时,梯度在反向传播多层后会指数级增长。这意味着,在通过时间反向传播时,梯度会变得巨大,从而“冲毁”之前学到的所有知识。

在普通的前馈神经网络中,除非网络极深,否则这个问题并不严重。但对于在长序列(例如100个时间步)上训练的RNN而言,梯度在反向传播100步后,其增长或衰减率将被放大到100次幂,导致梯度要么爆炸,要么消失。


RNN难以处理长期依赖关系。这里有一个在学习“吸引子”时出现梯度爆炸和消失的例子。

假设我们训练一个RNN,使其无论从何种初始状态开始,最终都能到达两个“吸引子”状态之一。我们学习一个蓝色的吸引盆和一个粉色的吸引盆。

  • 如果从蓝色吸引盆内的任何位置开始,最终都会到达同一个点。这意味着初始状态的微小差异对最终结果没有影响。因此,最终状态相对于初始状态变化的导数为0。这就是梯度消失
  • 然而,如果初始位置恰好位于两个吸引盆的边界附近,那么初始位置一个微小的、跨越分水岭的差异,就会导致最终结果天差地别。这就是梯度爆炸问题。

因此,每当试图用RNN学习此类吸引子动态时,都不可避免地会遇到梯度消失或爆炸的问题。


幸运的是,现在至少有四种有效的方法可以训练RNN。上一节我们看到了问题的严峻性,本节中我们来看看解决方案。

  1. 长短期记忆网络(LSTM):这种方法通过改变神经网络的结构,使其擅长记忆信息。我们将在本讲座后续部分详细讨论。
  2. 使用更优的优化器:使用能够处理极小梯度的优化器。真正的问题在于优化时,需要探测那些曲率极小的微小梯度。为神经网络量身定制的无Hessian优化方法擅长处理此问题。
  3. 回声状态网络(ESN):这种方法巧妙地规避了问题。其核心思想是精心初始化输入到隐藏层、隐藏层到隐藏层以及输出到隐藏层的反馈权重。目标是让隐藏状态成为一个充满弱耦合振荡器的“大水库”。输入序列会在这个水库中产生长时间的回响,这些回响就记住了输入序列的信息。然后,我们尝试将这些回响耦合到期望的输出上。在ESN中,唯一需要学习的是隐藏单元到输出单元的连接。如果输出单元是线性的,训练将变得非常简单。
  4. 结合动量的初始化方法:在回声状态网络那种精心初始化的基础上使用动量方法,可以使其性能更优。这是一种非常巧妙的方法,它先初始化RNN以获得有趣的动态特性,然后通过动量轻微调整这些动态,使其更有利于手头的任务。


本节课中,我们一起学习了训练RNN的核心挑战——梯度爆炸与消失问题。我们了解到,这是由于RNN反向传播的线性特性导致的,使其在处理长序列时,梯度会指数级地增长或衰减。最后,我们概述了四种应对此挑战的主流方法:LSTM结构改进、更优的优化器、回声状态网络策略以及结合动量的初始化技术。这些方法为有效训练RNN、使其能够学习长期依赖关系提供了可能。

7.5:长短期记忆网络 🧠

在本节课中,我们将学习一种名为“长短期记忆”的训练循环神经网络的方法。我们将了解其核心概念、工作原理以及一个成功的应用案例。

概述

神经网络的动态状态可以被视为一种短期记忆。长短期记忆网络的目标是让这种短期记忆能够持续很长时间。这是通过创建特殊的模块来实现的,这些模块设计用于在需要时允许信息被“门控”进入,并在之后被“门控”输出。在中间阶段,门是关闭的,以确保在此期间到达的信息不会干扰被记住的状态。长短期记忆网络在手写识别等任务上取得了巨大成功。

长短期记忆网络的起源

上一节我们介绍了长短期记忆网络的基本概念,本节中我们来看看它的起源。

1997年,Hochreiter和Schmidhuber在《Neural Computation》上发表了一篇论文,解决了让循环神经网络长时间记住信息的问题。他们的循环网络能够记住数百个时间步长的信息。他们通过设计一个使用逻辑单元和线性单元以及乘法交互的记忆单元来实现这一点。

记忆单元的工作原理

了解了其起源后,我们深入探讨记忆单元的具体工作机制。

记忆单元通过三个由网络其余部分控制的“门”来管理信息流:写入门、保持门和读取门。

以下是记忆单元的三个核心操作:

  1. 信息写入:当循环网络的其余部分想要存储信息时,它会打开一个逻辑写入门。此时,从网络其余部分输入到记忆单元的当前值就会被存储进去。
  2. 信息保持:信息会一直保留在记忆单元中,只要其逻辑保持门处于开启状态。如果网络其余部分希望信息持续存在,就会将保持门设置为开启。
  3. 信息读取:最后,信息通过打开一个逻辑读取门从记忆单元中读取出来,从而影响循环神经网络的未来状态。

记忆单元实际上存储的是一个模拟值。可以将其视为一个具有模拟值的线性神经元,它通过权重为1的连接在每个时间步长将值写回自身。这个权重为1的连接由保持门控制。如果保持门的值接近1,信息就会循环保留;如果设置为0,信息就会消失。

反向传播与训练

我们已经了解了记忆单元的前向信息流,本节中我们来看看如何通过反向传播来训练它。

使用逻辑单元作为门的关键在于,我们可以通过它们进行反向传播,因为它们具有良好的导数。这意味着我们可以学习在多个时间步长上使用这种电路。

考虑一个前向传播的例子:在初始时刻,假设保持门设置为0(清空旧信息),写入门设置为1,来自网络其余部分的值(例如1.7)被写入记忆单元,此时读取门为0。接着,保持门被设置为1,信息被存储。在后续时间步,写入门和读取门保持为0,信息被隔离保存。最后,当需要读取时,读取门被设置为1,值1.7被输出。

当进行反向传播时,从读取时刻输出的1.7,沿着路径回溯到存储时刻输入的1.7。只要相关的门值为1,这条路径上的有效权重就是1。因此,误差导数可以几乎无衰减地回传数百个时间步长,这正是我们想要的特性。公式上,这可以表示为梯度流的有效路径。

应用案例:手写识别

理论部分介绍完毕,现在让我们看一个长短期记忆循环神经网络非常擅长的实际任务。

这是一个非常自然的循环神经网络任务:读取草书手写体。输入仅仅是笔尖的X和Y坐标序列,加上笔是否在纸上的信息。输出则是一个被识别出的字符序列。

Graves和Schmidhuber在2009年证明,带有长短期记忆的循环神经网络在此任务上表现极佳。据我所知,它们目前是这方面最好的系统。加拿大邮政已开始使用它们来读取手写体。在2009年的工作中,他们并未使用笔坐标作为输入,而是使用了一系列小图像。这意味着他们可以处理光学输入,即使书写的时序未知,也可以在书写完成后查看图像并进行识别。

系统演示

以下是Alex Graves系统处理笔坐标输入的演示说明。在演示中,你将看到四行信息流:

  1. 第一行:显示被识别的字符。系统从不修订其输出。如果遇到难以决策的情况,它会稍微延迟输出,以便观察未来一小段信息来帮助消除歧义。
  2. 第二行:显示一部分记忆单元的状态。你会注意到在识别出一个字符时它们是如何被重置的。
  3. 第三行:显示实际的书写轨迹。网络看到的只是笔尖的X和Y坐标这两个数字,以及笔是否抬起的信息。
  4. 第四行:显示更复杂的信息。它展示了梯度一直反向传播到X、Y坐标位置的情况。对于最活跃的字符,如果你从该字符反向传播,并询问什么会使该字符更活跃,你就能看到输入的哪些部分影响了它是该字符的概率。这让你了解决策是如何依赖于过去发生的事件的。

总结

本节课中我们一起学习了长短期记忆网络。我们了解到,LSTM通过引入由写入门、保持门和读取门控制的特殊记忆单元,解决了标准循环神经网络难以长期保存信息的问题。其核心机制允许信息在需要时被存储、保持和读取,同时通过门的控制实现了梯度的有效长程反向传播,从而能够训练非常深的时序网络。最后,我们看到了LSTM在手写识别这一自然时序任务上的成功应用,展示了其强大的实践价值。

8.1:Hessian-Free优化方法概述 🧠

在本节课中,我们将学习一种名为Hessian-Free的优化方法,它能够非常有效地训练循环神经网络。这是一种非常复杂的优化器,我们不期望你通过这个视频掌握所有细节,但希望你能对其工作原理有一个总体的了解。在下一讲中,我们将看到它在解决一个有趣问题上的表现。

优化目标与方向选择 📈

当我们训练神经网络的权重时,目标是尽可能降低误差曲面上的值。一个关键问题是:如果我们选择了一个特定的移动方向,沿着这个方向移动合适的距离,误差能减少多少?在误差开始回升之前,误差能下降多少?

这里我们假设曲率是恒定的,即误差曲面确实是二次的。我们可以假设梯度的幅度会随着我们沿着梯度方向移动而减小,这相当于假设误差曲面是向上凹的,像一个碗。

通过沿特定方向移动所能获得的最大误差减少量,取决于梯度与曲率的比值。因此,我们希望移动到那些具有良好比值的方向上。即使梯度很小,我们也希望曲率更小。

以下是两个方向的例子:

  • 方向一:梯度较大,但曲率也较大,导致误差减少有限。
  • 方向二:梯度较平缓,但由于梯度与曲率的比值更好,到达最小值时误差减少得更多。

问题在于,我们如何找到像第二个那样的方向?在这些方向上,即使梯度可能很小,曲率却更小。

牛顿法及其挑战 ⚙️

上一节我们讨论了方向选择的重要性,本节中我们来看看牛顿法。牛顿法解决了梯度下降的一个基本问题:梯度方向并不总是你真正想移动的方向。

如果误差曲面具有圆形横截面且是二次的,那么梯度就是一个好的移动方向,它会直接指向最小值。牛顿法的思想是应用一个线性变换,将椭圆变成圆形。如果我们对这个变换后的梯度向量进行操作,就好像我们在一个圆形的误差曲面上向下移动。

为了实现这一点,我们需要将误差E关于权重W的梯度乘以曲率矩阵的逆。这里,H 是曲率矩阵,有时也称为Hessian矩阵。它是我们当前权重的函数。我们需要取其逆矩阵,并用它乘以梯度。

然后,我们需要沿着这个方向移动一段距离。如果是一个真正的二次曲面,我们可以很容易地选择正确的步长 ε,从而一步就到达曲面的最小值。

当然,这一步涉及复杂的操作,即求那个巨大的Hessian矩阵的逆。问题在于,即使我们的神经网络只有一百万个权重,曲率矩阵(Hessian)也将有一万亿个项,完全无法求逆。

理解曲率矩阵 🔄

曲率矩阵看起来是这样的。对于每一对权重 W_iW_j,它告诉你一个方向上的梯度如何随着你在另一个方向上移动而变化。换句话说,当我改变权重 i 时,误差关于权重 j 的梯度如何变化?这就是典型的非对角线项告诉你的信息。

对角线项则告诉你,当你改变某个权重时,误差在该权重方向上的梯度如何变化。因此,曲率矩阵中的非对角线项对应于误差曲面中的“扭曲”。扭曲意味着当你沿一个方向移动时,另一个方向上的梯度会发生变化。

如果我们有一个漂亮的圆形碗,所有这些非对角线项都是0。当我们沿一个方向移动时,其他方向上的梯度不会改变。所以,当你在一个椭圆形误差曲面上使用最速下降法时,问题在于:当你沿一个方向移动时,另一个方向上的梯度会发生变化。

因此,如果我在更新所有权重的同时更新其中一个权重,所有其他权重的更新都会导致第一个权重的梯度发生变化。这意味着当我更新它时,我实际上可能使情况变得更糟——由于所有其他权重的变化,梯度实际上可能已经反号了。随着我们拥有越来越多的权重,我们需要对改变每一个权重都越来越谨慎,因为所有其他权重的同时变化会改变一个权重的梯度。曲率矩阵决定了这些相互作用的强度。

Hessian-Free方法的思路 💡

既然我们必须处理曲率,不能忽视它,但又无法实际求逆一个巨大的矩阵,我们该怎么办?

一种方法是只关注曲率矩阵的主对角线,并根据该对角线调整我们的步长。这有一点帮助,能使我们对不同的权重使用不同的步长。但对角线项只是相互作用中的一小部分,当我们这样做时,我们忽略了曲率矩阵中的大部分项,事实上,我们忽略了几乎所有的项。

另一种方法是尝试用一个低秩矩阵来近似曲率矩阵,以捕捉曲率矩阵的主要特征。这就是Hessian-Free方法、L-BFGS以及许多其他试图使用近似二阶方法来最小化误差的方法所做的事情。

在Hessian-Free方法中,我们对曲率矩阵做一个近似,并假设这个近似是正确的。因此,我们假设我们知道曲率是多少,并且误差曲面确实是二次的。然后,从我们当前所在位置开始,我们使用一种称为共轭梯度的高效技术来最小化误差。一旦我们完成了这一步,即在这个近似的曲率上接近了一个最小值,我们就对曲率矩阵做另一个近似,并再次使用共轭梯度进行最小化。

共轭梯度法简介 🧭

现在我们需要解释一下共轭梯度法。我将简要地解释一下。

共轭梯度法是一种非常聪明的方法,它不像牛顿法那样试图直接到达最小值,而是一次在一个方向上最小化

它首先沿着最速下降的方向,并移动到该方向上的最小值。这可能涉及多次重新评估梯度或误差,以找到该方向上的最小值。完成这一步后,它找到另一个方向,并移动到第二个方向上的最小值。

这项技术的巧妙之处在于,它选择第二个方向的方式不会破坏它已经在第一个方向上完成的最小化。这被称为共轭方向。“共轭”意味着当你沿着新方向移动时,你不会改变先前方向上的梯度。这是一个有趣的概念,类似于误差曲面中“扭曲”的想法。扭曲意味着当你沿一个方向移动时,你会改变另一个方向上的梯度。而共轭方向是你可以沿着移动的方向,在某种意义上没有扭曲——你沿着那个方向移动,第一个方向上的梯度不会改变。

共轭梯度法的工作原理 🎯

这是一个椭圆的图示。红线是椭圆的长轴。我们首先沿着最速下降方向做一步,一直移动到该方向上的最小值。稍微思考一下,你会发现最小值实际上并不在红线上。在红线上,梯度在垂直于红线的方向上为0,因为那是谷底。但我们移动的方向实际上并不垂直于红线。

我们可以通过沿着垂直于红线方向做一小步,然后再沿着红线方向做一小步,来取得更多进展。由于红线向椭圆的中心倾斜,这将为我们带来一些进展。因此,当我们在第一个方向上最小化时,我们会稍微穿过椭圆的底部。当我们到达那个点时,存在一个最小值。

绿线上的所有点都有一个有趣的性质:在该绿线上,沿着黑色箭头方向的梯度为0。因此,我们可以沿着那条绿线移动到任何位置,而不会破坏我们在黑色箭头方向上已达到最小值的事实。

如果我们在许多方向上都能做到这一点,在一个高维误差曲面上,我们最终将在许多不同的方向上达到最小值。如果我们在与空间维度数量一样多的不同方向上达到最小值,那么我们就处于全局最小值。

因此,我们采取最速下降的第一步。然后我们计算出(这里不解释如何计算)那条绿线的方向。接着,我们沿着绿线搜索,以找到我们应该移动多远,从而最小化绿线上的误差,然后我们采取第二步。现在,在这个二维空间中,我们将处于最小值。因为我们在第一步的方向上处于最小值,并且现在我们在第二步的方向上也处于最小值,同时仍然保持在第一步方向上的最小值。所以那必定是全局最小值。

共轭梯度法实现的是:它只需 N步 就能到达一个N维二次曲面的全局最小值,非常高效。它之所以能做到这一点,是因为它设法让梯度在N个不同的方向上为0。这些方向不是正交的,但它们是彼此独立的,这足以达到全局最小值。

更重要的是,在一个典型的二次曲面上,远少于N步 就能将误差降低到非常接近最小值。这就是我们使用它的原因。我们不会做完整的N步,那将和求逆整个矩阵一样昂贵。我们将做远少于N步的迭代,并相当接近最小值。

在神经网络中的应用 🔗

你可以将共轭梯度法直接应用于非线性多层神经网络的非二次误差曲面,它通常效果很好。它本质上是一种批量方法,但你可以将其应用于大型小批量。当你这样做时,你在同一个大型小批量上执行多次共轭梯度步骤,然后转到下一个大型小批量。这被称为非线性共轭梯度。

Hessian-Free优化器使用共轭梯度在一个真正的二次曲面上进行最小化,而这是共轭梯度最擅长的。对于这种任务,它比用于非线性曲面时效果要好得多。Hessian-Free方法所使用的这个真正的二次曲面,正是它对真实曲面所做的二次近似。

因此,它的流程是:先做出那个近似,然后使用共轭梯度在第一个近似上接近最小值,接着对曲率做出新的近似,并再次重复这个过程。


本节课中我们一起学习了Hessian-Free优化方法的核心思想。我们了解到,直接使用牛顿法处理高维神经网络的曲率矩阵是不可行的。Hessian-Free方法通过低秩近似曲率矩阵,并利用共轭梯度法在这个近似的二次曲面上高效寻找下降方向,从而巧妙地规避了直接求逆巨大Hessian矩阵的难题。这种方法特别适合训练像循环神经网络这样复杂的模型。在下一讲中,我们将看到它在实际问题上的具体表现。

8.2:字符序列建模 📝

在本节课中,我们将学习如何应用无Hessian优化方法来建模来自维基百科的字符序列。核心思想是让模型阅读大量维基百科文本,并尝试预测下一个字符。在探讨模型能学到什么之前,我们需要先理解为何需要引入乘法连接,以及如何在现有神经网络中高效地实现它们。

为何选择字符而非单词? 🤔

上一节我们介绍了建模任务的目标,本节中我们来看看为何选择字符作为建模单元,而不是通常用于语言建模的单词。

网络由字符序列构成。任何足够强大的学习方法,若想通过阅读网络来理解世界,或想轻松学会哪些字符串能构成单词,处理字符序列是基础。我们将看到,这确实是可行的。因此,我们的目标非常宏大:我们希望构建一个能阅读维基百科并理解世界的模型。

如果必须将维基百科的文本预处理成单词,将会非常麻烦,并带来诸多问题。

以下是预处理成单词会遇到的主要问题:

  • 语素问题:根据语言学家的观点,最小的意义单位是语素。为了合理处理语言,我们需要将单词分解为这些语素。但问题在于,语素的界定并不完全清晰。
  • 类语素现象:存在一些类似语素但语言学家不会称之为语素的现象。例如在英语中,以字母“sn”开头的单词有很大概率与嘴唇或鼻子(尤其是上唇或鼻子)有关,如“snarl”、“sneeze”、“snot”、“snug”、“snort”。这类词数量众多,并非巧合。
  • 复合词问题:有些词由多个部分组成。通常,我们会将“New York”视为一个词汇项。但如果谈论“New Yorkers' roof”,我们可能希望将“New”和“Yorkers”视为两个独立的词汇项。
  • 黏着语问题:例如芬兰语等黏着语,会将许多语素组合成很长的单词。一个芬兰语单词可能需要用五个英语单词才能表达相同的意思。这凸显了基于单词建模的复杂性。

基础循环网络的局限性 🔄

理解了建模单元的选择后,我们来看看一个可能用于建模字符序列的简单循环网络结构。

一个明显的循环网络结构包含一个隐藏状态(例如使用1500个隐藏单元)。其动态过程是:时间T的隐藏状态和当前字符共同作为输入,以确定时间T+1的新隐藏状态。然后,基于新的隐藏状态,通过一个覆盖86个字符的单一Softmax层来预测下一个字符。整个系统通过从该Softmax输出的正确字符的对数概率进行反向传播来训练。

预测86个字符比预测10万个单词容易得多,因此输出层使用Softmax是可行的,避免了大型Softmax层的问题。

现在,我想解释为什么我们没有使用那种循环网络,而是使用了一种效果更好的不同网络。

引入乘法连接的必要性 ✖️

上一节我们看到了基础循环网络的结构,本节中我们来看看其局限性以及改进方案。

你可以将所有可能的字符序列排列成一棵树,分支因子为86。循环神经网络试图通过隐藏状态向量来表示这棵巨大树中的每个节点,从而应对树规模指数级增长的问题。这种方法的一个优点是能够共享大量结构。例如,当模型到达代表“FIX”的节点时,它可能已判定这很可能是一个动词。如果它是动词,那么看到字母“I”的可能性就很高(因为“-ING”结尾)。这种“动词后可能接I”的知识可以在所有其他不包含“FIX”的动词节点间共享。

关键在于,是当前状态当前字符结合共同决定了我们想要前往的下一个状态。我们不希望字母“I”总是让我们预期下一个是“N”;我们真正希望的是:如果你已经认为它是一个动词,那么当你看到“I”时,你应该预期下一个是“N”。是“认为它是动词”和“看到了I”这个组合让我们进入了标记为“FIX I”并预期看到“N”的状态。

为了捕捉这种组合关系,我们将使用乘法连接

高效实现乘法连接 🏗️

上一节我们论证了需要乘法连接来捕捉字符与上下文的组合效应,本节中我们来看看如何高效地实现它。

我们将不再使用字符输入为隐藏单元提供额外的加性输入,而是使用这些字符来切换整个隐藏层到隐藏层的权重矩阵。也就是说,字符将决定状态转移矩阵。

如果以简单直接的方式实现,我们需要让86个字符中的每一个都定义一个1500x1500的矩阵,这将导致参数数量巨大,容易过拟合,除非有海量文本数据。

因此,问题是:我们能否利用字符之间的共性(例如,所有数字在促使隐藏状态演变的方式上非常相似),以更少的参数实现这种乘法交互,让字符决定隐藏到隐藏的权重矩阵?我们希望为86个字符各自提供不同的转移矩阵,但同时希望这些矩阵能共享参数。

以下是我们的实现方法:

我们将引入称为“因子”的组件。每个因子表示组A和组B以乘法方式交互,为组C提供输入。

每个因子首先为其两个输入组各计算一个加权和(即点积)。然后,将这两个标量结果相乘,得到一个标量。最后,用这个标量来缩放出权重向量V,作为对组C的输入。

用公式表示,因子F对组C提供的向量输入为:
输入_C = (状态_B · W_F) * (状态_A · U_F) * V_F
其中,· 表示点积,* 表示标量乘法。

因子的矩阵视角 📊

上一节我们介绍了因子的计算方式,本节我们从矩阵乘法的角度来重新审视它,以获得更深入的理解。

我们可以重新排列上述公式。每个因子实际上定义了一个非常简单的转移矩阵——一个秩为1的矩阵。

重新排列后,公式可以看作:因子F对组C的输入 = (状态_B · W_F) * (矩阵_U_V) * 状态_A,其中 矩阵_U_V 是向量 U_FV_F 的外积,形成一个秩为1的矩阵。

因此,状态_B · W_F 计算出的标量,成为了这个秩为1矩阵的系数。我们将当前隐藏状态 状态_A 乘以这个被缩放的矩阵,就得到了该因子对下一个隐藏状态的贡献。

如果我们对所有因子求和,那么对组C的总输入就是:∑_F [ (状态_B · W_F) * (矩阵_U_V_F) ] * 状态_A。这个总和构成了一个巨大的矩阵——这就是由当前字符决定的特定转移矩阵。然后,当前隐藏状态乘以这个矩阵,就产生了新的隐藏状态。

由此可见,我们通过这些因子提供的秩为1矩阵,合成了一个完整的转移矩阵。而当前字符(在组B中)的作用,就是确定每个秩为1矩阵的权重(系数)。

系统整体架构 🖼️

最后,让我们看看整个系统的架构图。

我们会有多个因子(例如约1500个)。字符输入是独热编码,因此每次只有一个字符是活跃的。当前字符K对因子F的权重 W_KF,就是用于缩放由 U_FV_F 外积得到的那个秩为1矩阵的“增益”。

字符决定了每个因子对应的增益 W_KF。你将每个秩为1矩阵 U V 乘以其对应的增益,然后将所有缩放后的矩阵相加,就得到了你的(字符)特定转移矩阵。


本节课总结:在本节课中,我们一起学习了如何为字符序列建模任务设计循环神经网络。我们首先探讨了为何选择字符而非单词作为建模单元。接着,我们分析了简单循环网络在捕捉字符与上下文组合关系上的局限性,从而引出了引入乘法连接的必要性。然后,我们详细介绍了如何通过“因子”这种组件,以参数共享的方式高效实现乘法交互,让当前字符动态决定隐藏状态之间的转移矩阵。最后,我们从矩阵视角理解了因子的工作原理,并俯瞰了整个系统的架构。这种方法使得模型能够更有效地从字符序列中学习复杂的语言结构。

8.3:使用HF优化RNN预测维基百科下一个字符 📚

在本节课中,我们将探讨当使用Hessian-Free优化器来优化包含乘法连接(multiplicative connections)的循环神经网络时会发生什么。我们将看到一个被训练用于预测维基百科文本中下一个字符的网络实例,并分析其表现与学到的知识。

实验设置与训练过程

上一节我们介绍了循环神经网络的基本概念,本节中我们来看看一个具体的应用案例。Ilya Sutskever使用了一个包含乘法连接的循环神经网络,并利用Hessian-Free优化器对其进行训练,目标是预测维基百科文本中的下一个字符。

以下是实验的关键细节:

  • 数据:使用了500万个字符串,每个字符串包含100个字符,均取自英文维基百科。
  • 初始化:对于每个字符串,网络从默认的隐藏状态开始,先读取11个字符以更新其状态,然后才开始进行预测。
  • 训练:通过反向传播其预测产生的误差来训练网络。
  • 耗时:在一块高速GPU上,训练一个优质模型大约花费了一个月时间。

目前,这个用于字符预测的最佳循环神经网络模型,在单模型中是表现最好的。虽然可以通过组合多个模型并使用神经网络来决定使用哪一个来获得更好的效果,但就单一模型而言,它已经达到了顶尖水平。

模型的能力:长距离依赖与文本生成

该模型的工作方式与其他最佳模型截然不同。例如,Ilya的模型能够在长距离上平衡引号和括号。任何依赖匹配特定先前上下文的模型都无法做到这一点。因为要正确地在35个字符后闭合一个括号,依赖上下文匹配的模型必须精确匹配中间的全部35个字符,而这几乎不可能被完整存储。

一旦模型训练完成,我们可以通过从模型中生成字符串来观察它学到了什么。当然,我们需要谨慎,避免过度解读其生成的内容。

文本生成的过程如下:

  1. 从默认的隐藏状态开始。
  2. 提供一个“预热”序列,即输入一些字符,让网络在读取每个字符后更新其隐藏状态。
  3. 开始预测。查看模型为下一个字符预测的概率分布。
  4. 根据该分布随机选取一个字符(例如,如果它预测‘Q’的概率是1/1000,那么我们就有千分之一的几率选中‘Q’)。
  5. 告诉网络我们选中的字符就是实际发生的字符,并让它预测下一个字符。换句话说,我们假设它的猜测总是正确的。
  6. 重复此过程,直到生成足够多的字符。

以下是Ilya的网络在经过预热后生成的一个字符串示例(选自一段更长的连续文本):

“Opus Paul at Rome. No person would ever say that, but we understand that Opus and Paul and Rome are all highly interconnected.”

观察这个例子,我们可以发现:

  • 语义关联:它产生了奇怪的语义关联(如Opus, Paul, Rome),但我们可以理解这些词是高度相关的。
  • 主题结构:它缺乏长距离的主题结构,基本上在每个句号后就会改变话题。
  • 词汇准确性:一个惊人的特点是它很少产生非单词。这意味着,一旦字符序列足以构成一个唯一的英语单词,它几乎能完美地预测下一个字符。即使偶尔产生非单词(如红色的“aemerable”),这些词看起来也非常像真词。
  • 符号平衡:它并不总能平衡括号(本例中有一个多余的闭合括号),但它经常能做到。在本例末尾,它正确地在一个开引号之后,隔了很远才放置了闭合引号。

这段文本显示出良好的局部语法(短词串看起来很合理)和大量的语义知识。

测试模型的知识

我们可以通过输入精心设计的字符串来测试模型到底知道什么。以下是一些测试示例:

以下是针对一个非单词“Thrunged”的测试:

  • 输入“Sheila thrunged”,最可能的下一个字符是‘s’。这表明模型知道“Sheila”是单数。
  • 输入“people thrunged”,最可能的下一个字符是空格而非‘s’。这表明模型知道“people”是复数。

以下是针对名字列表的测试:

  • 输入“Tom, Dick, Harry, Thrunged, …”,模型将其补全为一个名字(如“Thrungedullini deel Rey”),这表明它从维基百科中学到了大量关于多种语言名字的知识。

以下是关于“生命的意义”的趣味测试:

  • 输入“The meaning of life is”,模型产生了多种补全。在最初的10次尝试中,有一次产生了“The meaning of life is literary recognition.”,这在语法和语义上都是合理的。经过更多训练后,它产生了更有趣的补全,但这可能只是过度解读。

模型学到了什么?

那么,在阅读了海量维基百科字符后,这个模型究竟知道了什么?

  • 词汇知识:它几乎总是生成英语单词,极少产生非单词,即使产生也看起来非常合理。
  • 专有名词:它了解许多专有名词(如Trangeullini deel Rey)。
  • 数字与日期:它能生成数字、日期及其出现的上下文。
  • 符号计数:它擅长平衡引号和括号,实际上能够“数”括号。如果没有开括号,它极不可能生成闭括号;如果有一个开括号,它很可能在大约20个字符内生成闭括号;如果有两个开括号,它会更快地生成闭括号。
  • 句法知识:它显然掌握了许多句法知识,能够生成语法合理的小段英文词串。但这种知识的形式难以精确界定,它不像三元模型那样只是存储词序列,而是在合成具有合理句法的词串。这更像是一个语言学家在说母语时头脑中的知识,而非一套明确的规则。
  • 语义关联:它知道许多弱的语义关联。例如,它只生成过一次“Wittgenstein”,而这次生成紧接在“Plato”之后,表明它知道这两者有关联。同样,它知道“cabbage”和“vegetable”相关联,尽管不一定清楚具体关联方式。

人类在快速反应时也类似。例如,快速问“奶牛喝什么?”,大多数人会喊出“牛奶”。虽然大多数奶牛并不常喝牛奶,但“牛奶”与“喝”和“奶牛”都高度关联,尽管从逻辑上讲这不完全正确。

RNN语言模型的优势与前景

最近,Thomas Mikolov及其合作者一直在训练大型循环神经网络来预测大型数据集中的下一个词。他们使用了与先前前馈神经网络相同的技术(先将词转换为实值特征向量,再将这些向量作为网络其余部分的输入),并且效果优于前馈神经网络和其他最佳模型。当将它们与其他最佳模型结合时,效果更佳,这使其成为当前最好的语言模型。

循环神经网络有两个有趣的特性:

  1. 数据效率:要达到给定的性能水平,RNN比其他方法需要更少的训练数据。
  2. 缩放优势:随着数据集增大,RNN的性能提升速度比其他方法更快。例如,三元模型等会随数据集增大而改进,但过程非常缓慢,需要将数据集翻倍才能获得小幅提升。而RNN能更好地利用数据。

这意味着,随着数据集变得更大,其他方法将很难超越RNN。这与使用大型深度神经网络进行物体识别的故事可能类似:一旦神经网络取得领先,它们就能更好地利用更快的计算机和更大的数据集,因此其他方法将很难追上。


本节课总结:我们一起学习了使用Hessian-Free优化器训练循环神经网络来预测维基百科下一个字符的案例。我们探讨了该模型的训练过程、其通过文本生成展现出的能力(如长距离依赖、词汇和句法知识),以及如何通过设计输入来测试其学到的语义和语法关联。最后,我们了解了循环神经网络在语言建模任务上相对于其他模型的数据效率和缩放优势,预示着其在处理更大数据时的巨大潜力。

8.4:回声状态网络 🧠

在本节课中,我们将要学习一种名为“回声状态网络”的循环神经网络。这种网络使用了一个巧妙的技巧,使得训练循环神经网络变得更加容易。我们将了解其核心思想、工作原理、优点与局限性,并探讨如何将其初始化技巧与传统的反向传播训练相结合。

概述

回声状态网络的核心思想是:固定循环神经网络中的大部分连接权重,只训练输出层的连接。具体来说,网络会初始化一个由大量松散耦合的振荡器组成的“动态储备池”。输入信号会驱动这个储备池产生复杂的动态响应,而我们只需要学习如何将这些响应状态线性映射到期望的输出上。这完全避免了学习隐藏层到隐藏层连接或输入到隐藏层连接的难题。

回声状态网络的工作原理

上一节我们介绍了回声状态网络的核心概念,本节中我们来看看它是如何具体工作的。

其基本结构与一个标准的循环神经网络类似,但关键区别在于权重的处理方式:

  • 输入到隐藏层隐藏层到隐藏层 的连接权重被随机初始化并固定
  • 只有 隐藏层到输出层 的连接权重是需要学习的

如果使用线性输出单元,学习过程就简化为一个快速的线性回归问题。

以下是其工作流程的简要说明:

  1. 精心设置随机的循环连接,形成一个“动态储备池”。
  2. 输入信号驱动储备池,产生复杂的、随时间演化的状态。
  3. 学习一个线性模型,将储备池的当前状态映射到目标输出。

如何设置随机连接

仅仅随机设置连接是不够的。为了让网络有效工作,必须非常小心地设置这些随机连接,以确保网络活动既不会迅速衰减至零,也不会爆炸式增长。

以下是设置时需要遵循的几个关键原则:

  1. 控制谱半径:将隐藏层到隐藏层权重矩阵的最大特征值(谱半径) 设置为接近1。在线性系统中,这能保证状态向量的长度在每次迭代后大致保持不变。在非线性系统中,我们也希望达到类似的效果。这样,输入信息才能在循环状态中“回荡”很长时间。

    • 公式表示:设 W_hh 为隐藏层到隐藏层的权重矩阵,其谱半径 ρ(W_hh) ≈ 1。
  2. 使用稀疏连接:隐藏层到隐藏层的连接应该是稀疏的,即大部分权重为零,只有少数权重值较大。这能创造出许多松散耦合的振荡器,使得信息能在网络的一部分停留较长时间,而不会过快传播到其他部分。

  3. 精心调整输入权重尺度:输入到隐藏层的连接权重需要仔细调整其尺度。它们需要能驱动振荡器的状态,但又不能抹掉这些振荡器所携带的近期历史信息。

幸运的是,由于回声状态网络的学习速度极快,我们可以负担得起通过实验来调整输入权重的尺度和隐藏连接的稀疏度,以找到让系统表现最佳的组合。

一个简单示例:生成正弦波

为了更具体地理解,我们来看一个从网上获取的简单示例。该网络的任务是根据输入值生成特定频率的正弦波。

  • 输入序列:一个随时间变化的实数值,用于指定正弦波的期望频率。
  • 目标输出序列:一个正弦波,其频率由输入指定。
  • 学习目标:拟合一个线性模型,该模型以隐藏单元的状态为输入,并试图预测正确的标量输出值。

下图展示了一个回声状态网络处理此问题的结构:

[输入信号] -> [动态储备池] -> [输出信号]

输入信号驱动由松散耦合振荡器组成的动态储备池,产生复杂的动力学行为。输出权重则学习将这种复杂的动力学映射到我们期望的输出动态上。值得注意的是,图中还有从输出返回到储备池的连接,这并非必需,但有助于让储备池了解目前已产生了什么输出。

在学习完成后,系统能够产生频率正确的正弦波。不过,它可能无法确定正弦波的正确相位,除非在训练目标中明确指定。

优点与局限性

回声状态网络有其独特的优势,但也存在一些局限。

优点

  • 训练速度极快:因为本质上只是拟合一个线性模型。
  • 证明了初始化的重要性:展示了明智地初始化循环权重对循环网络性能的关键影响。
  • 擅长一维时间序列建模:在观察一段时间序列后,能够很好地预测其未来的长期走势。

局限性

  • 不擅长高维数据建模:例如音频系数帧或视频帧。为了建模此类数据,它需要比训练了全部权重的循环神经网络多得多的隐藏单元。

与反向传播的结合

最近,一项相当明显的改进被尝试:使用回声状态网络开发的所有技巧来初始化一个循环神经网络。一旦完成初始化,你当然可以通过只学习隐藏到输出的连接来获得不错的效果。但可以推测,如果进一步学习并优化隐藏到隐藏的权重,网络性能可能会更好。

因此,研究者尝试在使用回声状态网络初始化后,再使用通过时间的反向传播(配合动量方法,如RMSProp)进行训练。结果发现,这实际上是一种非常有效的训练循环神经网络的方法。它结合了快速初始化和精细优化的优点。

总结

本节课中我们一起学习了回声状态网络。我们了解到,它通过固定循环连接的随机权重并只训练输出层,极大地简化了循环神经网络的训练过程。其成功依赖于精心设置权重矩阵的谱半径、使用稀疏连接来创建动态储备池,以及调整输入尺度。虽然它在处理一维时间序列时表现出色,但在高维数据上效率较低。最后,我们看到了将其初始化策略与传统的反向传播训练相结合,可以成为一种更强大的循环神经网络训练方法。

9.1:提升泛化能力的方法概述 🧠

在本节课中,我们将学习如何提升神经网络的泛化能力,即防止模型在训练数据上表现过好,而在未见过的测试数据上表现不佳的现象,这被称为过拟合。

过拟合的原因

上一节我们介绍了神经网络的基本概念,本节中我们来看看为什么会出现过拟合。任何有限的训练数据集,除了包含从输入到输出映射的真实规律信息外,还包含采样误差。这意味着训练集中存在一些偶然的规律,仅仅是因为我们选择了特定的训练样本。当模型进行拟合时,它无法区分哪些规律是真实的(即使重新采样训练集也会存在),哪些是由采样误差引起的。因此,模型会同时拟合这两种规律。如果模型过于灵活,它会非常完美地拟合采样误差,从而导致泛化能力变差。

防止过拟合的方法

为了应对过拟合,我们需要采取一些策略。以下是几种主要的方法:

  1. 获取更多数据:这是迄今为止最好的方法。如果你能获得更多数据,就没有必要设计复杂的方案来防止过拟合。数据本身具有防止过拟合的正确特性。假设你的计算机足够快,数据越多越好。

  2. 限制模型容量:这种方法试图明智地限制模型的容量,使其有足够的能力拟合真实规律,但又不足以拟合由采样误差引起的虚假规律。这当然非常困难,本讲剩余部分将描述各种尝试适当调节容量的方法。

  3. 模型平均:在下一讲中,我们将讨论将许多不同模型进行平均的方法。如果我们对具有不同形式并犯不同错误的模型进行平均,那么平均模型的表现将优于单个模型。我们可以通过在不同的训练数据子集上训练模型来使它们不同,这种技术称为“装袋法”。还有其他方法可以干扰训练数据,以使模型尽可能不同。

  1. 贝叶斯方法:这种方法使用单一的神经网络架构,但寻找许多不同的权重集合,这些权重都能很好地预测输出。然后在测试数据上,对所有不同权重向量做出的预测进行平均。

控制模型容量的具体方式

有多种方式可以控制模型的容量。以下是几种常见的方法:

  • 通过架构控制:最明显的方式是通过架构,即限制隐藏层的数量和每层的单元数量。这控制了网络中的连接数量,也就是参数的数量。
  • 提前停止:第二种方法通常非常方便,即从较小的权重开始,然后在模型有时间再次过拟合之前停止学习。其假设是模型会先找到真实规律,然后才会找到仅与我们拥有的特定训练集相关的虚假规律。本视频末尾将描述此方法。
  • 权重惩罚或约束:控制神经网络容量的一种非常常见的方法是给它一个略大的隐藏层或每层单元数,然后通过对权重的平方值或绝对值施加惩罚或约束来惩罚权重。
  • 添加噪声:我们可以通过向权重或激活值添加噪声来控制模型的容量。

通常,我们会结合使用上述几种不同的容量控制方法。

如何设置元参数

对于大多数这些方法,都有需要设置的元参数,例如隐藏单元的数量、层数或权重惩罚的大小。

一个显而易见的方法是尝试某个元参数(例如隐藏单元数量)的许多不同值,看看哪个在测试集上表现最好。但这种方法存在一个严重问题:它会对方法在另一个测试集上的表现给出错误的印象。因为在一个特定测试集上表现最好的设置,不太可能在从同一分布中抽取的新测试集上表现得同样好,因为它们已经被调整到适合那个特定的测试集。这意味着你会对在新测试集上的表现产生错误的印象。

让我给你一个极端的例子。假设测试集确实是随机的(很多金融数据似乎就是这样),即答案根本不依赖于输入或无法从输入预测。如果你选择在测试集上表现最好的模型,它显然会比随机猜测更好,因为你选择了它来超越随机猜测。但如果你将该模型应用于同样是随机的新数据,你不能期望它比随机猜测更好。

因此,通过选择模型,你会对模型在新数据上的表现产生错误的印象。问题是,有没有办法解决这个问题?

更好的元参数选择方法

以下是选择元参数的更好方法:

你首先将总数据集分成三个子集:

  1. 训练数据:用于训练模型。
  2. 验证数据:不用于训练,但用于决定如何设置元参数。换句话说,你将根据模型在验证数据上的表现来决定合适的隐藏单元数量或权重惩罚大小。
  3. 测试数据:一旦你完成了上述步骤,并用看起来最好的隐藏单元数量和权重惩罚大小训练了模型,你将查看它在最后保留的数据集(即测试数据)上的表现。你只能使用测试数据一次,这将为你提供网络性能的无偏估计。通常,这个估计会比在验证数据上的表现稍差一些。

如今,在竞赛中,组织者已经学会保留真正的测试数据,并让参赛者提交预测结果,以便他们可以看到参赛者是否真的能预测真正的测试数据,或者他们是否只是通过选择在验证数据上表现特别好的元参数来过度拟合验证数据,而这些元参数无法泛化到新的测试集。

我们可以通过旋转验证集来获得对权重惩罚、隐藏单元数量或我们试图使用验证数据固定的任何其他参数的更好估计。我们保留一个最终的测试集用于最终的无偏估计,然后将其他数据分成N个大小相等的子集,我们在除其中一个子集外的所有子集上进行训练,并将该子集用作验证集。然后我们可以旋转并保留一个不同的子集作为验证集,从而获得关于最佳权重惩罚或最佳隐藏单元数量的许多不同估计。这被称为N折交叉验证。重要的是要记住,我们得到的不同估计并不是相互独立的。例如,如果我们真的不走运,某个类别的所有样本都落入其中一个子集,我们会期望泛化能力非常差。无论该子集是验证集还是在训练数据中,我们都会期望泛化能力非常差。

提前停止法

现在,我将描述一种特别易于使用的防止过拟合的方法。当你有一个大模型和一台小计算机,并且没有时间用不同的隐藏单元数量或不同的权重惩罚大小多次训练模型时,这种方法很有效。

具体做法是:你从小权重开始,随着模型训练,权重会增长。你观察模型在验证集上的表现。一旦表现开始变差,你就停止训练。验证集上的表现可能会波动,特别是如果你测量的是错误率而不是平方误差或交叉熵误差。因此,很难决定何时停止。所以,你通常的做法是继续训练,直到你确定情况正在恶化,然后回到情况最好的那个点。

这种方法之所以能控制模型的容量,是因为具有小权重的模型通常没有太大的容量,而且权重还没有时间增长到很大。一个有趣的问题是:为什么小权重会降低容量?

小权重如何降低容量

考虑一个具有一些输入单元、隐藏单元和输出单元的模型。当权重非常小时,如果隐藏单元是逻辑单元,它们的总输入将接近0,并且它们将处于其线性范围的中间。也就是说,它们的行为非常像线性单元。这意味着当权重很小时,整个网络等同于一个将输入直接映射到输出的线性网络。因此,如果你将权重矩阵 W1 乘以权重矩阵 W2,你将得到一个可用于连接输入和输出的权重矩阵。只要权重很小,具有一层逻辑隐藏单元的网络的行为将与那个线性网络大致相同,前提是我们还将线性网络中的权重除以4,以考虑到当隐藏单元处于其线性区域时,其斜率为四分之一。因此,它的容量并不比线性网络大。

所以,即使在我展示的那个网络中有 3*6 + 6*2 个权重,它的容量实际上并不比一个有 3*2 个权重的网络大。但随着权重增长,我们开始使用Sigmoid单元的线性区域,然后开始利用所有这些参数。

因此,如果网络在学习开始时具有6个有效参数,在学习结束时具有30个有效参数,那么我们可以认为容量随着权重的增大而从6个参数平滑地变化到30个参数。在提前停止中发生的情况是,当模型具有适当数量的参数以在验证数据上达到最佳可能表现时,我们停止学习。也就是说,当它在拟合数据中的真实规律和拟合仅由于我们选择的特定训练样本而存在的虚假规律之间达到最佳权衡时。

总结

本节课中我们一起学习了提升神经网络泛化能力的核心思想与方法。我们首先理解了过拟合的根本原因在于模型同时拟合了数据中的真实规律和采样误差带来的虚假规律。接着,我们探讨了四种主要的应对策略:获取更多数据、限制模型容量、模型平均以及贝叶斯方法。在控制模型容量的具体技术中,我们详细了解了通过架构设计、提前停止、权重惩罚和添加噪声等方法。我们还学习了正确设置元参数的重要性,并介绍了使用训练集、验证集和测试集的三分法以及N折交叉验证来获得无偏性能评估。最后,我们深入分析了提前停止法的工作原理,解释了小权重如何通过使网络在初期近似于线性模型来有效控制容量,从而在拟合真实规律与避免过拟合之间找到平衡点。

9.2:限制权重的大小 🧠

在本节课中,我们将学习如何通过限制神经网络中权重的大小来控制模型的容量。这是防止模型过拟合、提升其泛化能力的关键技术之一。

概述 📋

控制模型容量的一种标准方法是引入一个惩罚项,以防止权重变得过大。其背后的隐含假设是,具有较小权重的网络在某种意义上比具有较大权重的网络更简单。我们将探讨几种不同的惩罚项,以及如何通过约束权重向量长度来实现这一目标。

标准方法:L2权重惩罚

上一节我们介绍了控制容量的概念,本节中我们来看看最常用的方法:L2权重惩罚。

标准限制权重大小的方法是使用L2权重惩罚。这意味着我们对权重的平方值进行惩罚。在神经网络文献中,这有时被称为“权重衰减”,因为该惩罚项的导数会产生一个将权重拉向0的力。

这种权重惩罚会保持权重较小,除非它们有足够大的误差导数来抵消它。从公式上看,我们优化的总成本函数是:

总成本 = 误差 + (λ/2) * Σ(权重²)

其中,λ是决定惩罚强度的系数,有时被称为“权重成本”。除以2是为了在求导时与平方项的导数2相抵消。

当我们对总成本函数求导时,其导数等于误差的导数加上与权重大小和λ值相关的项。在成本函数的最小值点,导数为0。这意味着,只有当权重同时具有较大的误差导数时,才能在最小值点保持较大的权重值。

L2惩罚的效果是防止网络使用它不需要的权重。这通常能显著提升泛化能力,因为网络无法使用那些不必要的权重去拟合训练数据中的采样误差。同时,它还能产生一个更平滑的模型,使得输出随输入的变化更缓慢。

例如,当网络有两个非常相似的输入时,使用L2惩罚的网络倾向于将权重平分给这两个输入,而不是将所有权重放在其中一个上。这样,当输入变化时,输出的变化就不会那么极端。

其他类型的权重惩罚

除了L2惩罚,还有其他类型的惩罚项可供选择。

以下是几种常见的替代方案:

  • L1惩罚:其成本函数呈V字形,惩罚的是权重的绝对值。这种方法的一个优点是,它会将许多权重驱动到恰好为0,这极大地有助于模型的解释。如果只剩下少数非零权重,就更容易理解网络在做什么。
  • 更极端的惩罚:我们还可以使用比L1更极端的惩罚函数,其成本函数的梯度在权重变得非常大时反而会减小。这允许网络保留较大的权重而不被拉向0,主要是将小权重拉向0。因此,我们更有可能得到具有少数大权重的网络。

权重约束:一种替代方案

除了对权重施加惩罚,我们还可以直接使用权重约束。

所谓权重约束,是指我们不对每个权重单独进行平方惩罚,而是对每个隐藏单元或输出单元的输入权重向量的最大平方长度施加一个约束。在更新权重时,如果某个单元的输入权重向量长度超过了约束允许的最大值,我们只需将所有权重除以同一个缩放因子,直到其长度符合约束。

与权重惩罚相比,使用权重约束有几个优势,并且实践表明其效果通常更佳。

以下是权重约束的主要优势:

  • 参数选择更直观:为输入权重向量的平方长度选择一个合理的值,比为权重惩罚系数λ选值要容易得多。这是因为逻辑单元(如Sigmoid)本身具有自然的尺度,我们知道权重为1意味着什么。
  • 防止隐藏单元“卡死”:权重约束可以防止隐藏单元的所有权重都变得极小,导致该单元失效。因为当所有权重都很小时,约束不会被触发,没有什么能阻止它们增长。
  • 防止权重爆炸:约束能有效防止权重在训练过程中变得无限大。
  • 自适应的惩罚效果:权重约束的一个微妙之处在于,当一个单元触及约束时,对其所有权重的有效惩罚是由最大的梯度决定的。如果某些输入权重有很大的梯度,它们会试图增加权重向量的长度,而这会压制所有其他权重。从效果上看,这就像一个自适应的惩罚,它会根据大权重的情况调整自身强度,并抑制小权重。这比固定的惩罚项在将无关权重推向0方面更有效。

对于那些了解拉格朗日乘数法的读者,这些惩罚项可以看作是保持约束满足所需的拉格朗日乘子。

总结 🎯

本节课中我们一起学习了控制神经网络容量的重要技术:限制权重大小。我们首先介绍了标准的L2权重惩罚(权重衰减)及其原理与效果,它能产生更平滑的模型并提升泛化能力。接着,我们探讨了L1惩罚等其他惩罚形式,它们能产生稀疏的权重,便于解释。最后,我们学习了权重约束这一强大的替代方案,它通过直接限制每个单元的输入权重向量长度来实现控制,具有参数选择直观、防止单元失效和权重爆炸等优点,在实践中往往表现更佳。理解并应用这些技术,对于构建稳健、高效的神经网络模型至关重要。

9.3:使用噪声作为正则化器 🎛️

在本节课中,我们将学习一种通过向神经网络添加噪声来限制其容量的方法。我们将探讨向输入或权重添加噪声的原理,并了解这种技术如何作为一种有效的正则化手段,帮助模型提升泛化能力。

向输入添加噪声与L2正则化的等价性

上一节我们讨论了限制网络容量的方法。本节中,我们来看看向简单线性网络的输入添加高斯噪声的效果。我们将证明,对于试图最小化平方误差的网络,这等同于对网络权重施加L2惩罚。

考虑一个简单的线性网络,其输出单元直接连接到输入。当我们向输入 Xi 添加均值为0、方差为 σ_i² 的高斯噪声时,该噪声的方差会被连接权重 W_i 的平方放大。

公式描述如下:
设无噪声系统的输出为 y = Σ_i (W_i * X_i)。添加噪声后,输出变为 y_noisy = Σ_i (W_i * (X_i + ε_i)),其中 ε_i ~ N(0, σ_i²)

因此,y_noisy = y + Σ_i (W_i * ε_i)y_noisy 与目标值 t 之间的期望平方误差为:

E[(y_noisy - t)²] = E[(y - t + Σ_i W_i ε_i)²]

展开并利用 ε_i 的独立性(E[ε_i] = 0, E[ε_i ε_j] = 0 (i≠j)),可得:

E[(y_noisy - t)²] = (y - t)² + Σ_i (W_i² * σ_i²)

由此可见,最小化带噪声输入的期望平方误差,等价于在最小化原始平方误差的同时,最小化一项额外的 Σ_i (W_i² * σ_i²)。这正是L2权重惩罚项的形式,其中 σ_i² 决定了惩罚强度。

在更复杂网络中使用权重噪声

向输入添加噪声在简单线性模型中等价于L2正则化。然而,在更复杂的网络(尤其是循环神经网络)中,直接向权重添加高斯噪声被证明是更有效的正则化方法。

以下是关于权重噪声的一些要点:

  • 这种方法并非严格等价于L2惩罚,但实践效果往往更好。
  • 例如,Alex Graves在其手写识别循环网络中发现,添加权重噪声能提升模型性能。

使用激活值噪声作为正则化器

除了输入和权重,我们还可以在神经元的激活值上引入噪声。这是一种近期发现的有效技术。

具体方法是:在前向传播过程中,将原本的Sigmoid(逻辑)隐藏单元视为随机的二元神经元。我们计算其激活概率 P,然后根据该概率随机输出1或0。然而,在反向传播计算梯度时,我们却使用确定性的概率值 P 进行回传。

这种“前向随机,后向确定”的做法虽然不完全精确,但在每个单元对上层贡献较小时是合理的近似。其效果是:

  • 训练集上的性能会变差,训练速度会显著变慢(可能慢数倍)。
  • 但模型在测试集上的泛化性能会得到显著提升。
  • 注:这是一个尚未正式发表的研究结果。

总结

本节课中,我们一起学习了如何使用噪声作为神经网络的正则化器。

  • 我们首先证明了,在最小化平方误差的简单线性网络中,向输入添加高斯噪声等价于对权重施加L2惩罚。
  • 接着,我们了解到在复杂的循环网络等结构中,向权重添加噪声是更有效的正则化方法。
  • 最后,我们探讨了一种前沿技术:通过在隐藏层激活值中引入极端噪声(前向传播随机二值化,反向传播使用概率值),可以显著提升模型的泛化能力,尽管这会以降低训练速度和训练集精度为代价。

这些方法的核心思想都是通过引入随机扰动来防止模型对训练数据过度拟合,从而鼓励学习到更鲁棒的特征表示。

9.4:贝叶斯方法入门 🎲

在本节课中,我们将通过一个简单的抛硬币例子,学习贝叶斯方法如何用于拟合模型。我们将理解其核心思想,并与传统的最大似然估计方法进行比较。

概述

贝叶斯方法的核心思想是:我们不应只寻找模型参数最可能的单一取值,而应考虑参数所有可能的取值,并计算在观察到数据后,每个可能取值的概率。贝叶斯框架假设我们总是对一切事件拥有一个先验分布。

贝叶斯方法的核心流程

上一节我们介绍了贝叶斯方法的核心理念,本节中我们来看看它的具体流程。

贝叶斯推断的过程可以概括为:我们拥有关于参数的先验知识(先验分布),当观察到数据后,数据会提供一个似然项。我们将先验与似然结合,从而得到后验分布。

  • 先验分布:在观察任何数据之前,我们对参数可能取值的信念。它可以是模糊的。
  • 似然项:在给定特定参数值时,观察到当前数据的可能性。它倾向于使数据更有可能的参数值。
  • 后验分布:结合先验和似然后,我们得到的关于参数在给定数据下的更新后的概率分布。

似然项可能与先验发生冲突。在极限情况下,如果我们获得足够多的数据,无论先验多么不可能,数据都能压倒它。最终,只要有足够的数据,真相就会显现。也就是说,即使你的先验是错误的,你最终也会得到正确的假设。但如果你的先验认为某些情况极不可能,那么这可能需要非常多的数据。

抛硬币示例:从最大似然到贝叶斯

为了具体理解,让我们从一个抛硬币的例子开始。假设你对硬币一无所知,只知道它可以被抛出,并且每次抛掷会得到正面或反面。我们还假设你知道每次抛掷是独立的决策。

我们的硬币模型有一个参数 P。这个参数 P 决定了硬币产生正面的概率。

最大似然估计法

现在,如果我们看到100次抛掷中有53次正面,P 的好值是多少?显然,你可能会说0.53。但这样做的理由是什么?

频率学派的答案,也称为最大似然估计,是选择使观测数据概率最大的 P 值。这个 P 值就是0.53。让我们推导一下。

包含53次正面和47次反面的特定序列的概率可以写成:每次抛到正面时写下一个 P,每次抛到反面时写下一个 (1-P)。然后,如果我们把所有 P 和所有 (1-P) 分别收集起来,我们得到 P^53 * (1-P)^47

如果我们现在问,观测到该数据的概率如何依赖于 P?我们可以对 P 求导,并得到如下表达式:

d/dP [P^53 * (1-P)^47] = 53*P^52*(1-P)^47 - 47*P^53*(1-P)^46

然后令该导数为0,我们发现数据的概率在设置 P = 0.53 时最大化。这就是最大似然估计。

最大似然估计的局限性

但是,使用最大似然估计来决定模型参数存在一些问题。

例如,假设我们只抛了一次硬币,并且得到了一个正面。说我们认为硬币未来出现正面的概率是1,这并不合理。那意味着我们愿意以无限的赔率打赌它不会出现反面,这看起来很荒谬。直觉上,一个更好的答案是0.5左右,但我们如何证明这一点呢?

更重要的是,我们可以问:给出单一答案是否合理?我们知之甚少,数据也不多,因此我们对 P 的值并不确定。所以我们真正应该做的是拒绝给出单一答案,而是给出一个跨越所有可能答案的完整概率分布。

完整的贝叶斯推断过程

上一节我们指出了点估计的不足,本节中我们来看看贝叶斯方法如何给出完整的概率分布。

我将通过一个例子来说明,我们从参数值的某个先验分布开始(为了计算方便,我们选择一个不一定符合我们对硬币真实看法的简单先验),然后展示如果我们采用贝叶斯方法,这个先验分布如何被数据修改。

步骤一:设定均匀先验

我们从一个认为所有不同值都同等可能的先验分布开始。我们相信硬币有各种程度的偏差,并且任何偏差量都同等可能。因此,有些硬币一半时间出现正面,有些硬币总是出现正面,这两种硬币的可能性相同。这个先验分布是一条水平的红线。

步骤二:观察到一次正面

现在我们观察到一次硬币出现正面。我们对于 P 的每个可能值,取其先验概率,并乘以在该 P 值是正确的情况下我们会观察到一次正面的概率。

例如:

  • 如果取 P = 1(硬币每次都是正面),那么观察到正面的概率是1。
  • 如果取 P = 0,观察到正面的概率是0。
  • 如果取 P = 0.5,观察到正面的概率是0.5。

我们取那条红色的先验线,将其每个点乘以根据该假设观察到一次正面的概率,现在我们得到一条倾斜的线。那是我们的未归一化后验。它是未归一化的,因为该线下的面积加起来不等于1。当然,对于一个概率分布,所有替代事件的概率之和必须为1。

步骤三:归一化后验

我们做的最后一件事是重新归一化它。我们按比例放大一切,使得曲线下的面积为1。现在,如果我们从一个均匀的 P 先验分布开始,在观察到一个正面后,我们最终得到这个三角形的 P 后验分布。

步骤四:继续观察更多数据

让我们再做一次。这次,假设我们得到一个反面。我们现在开始的先验分布是我们观察到一个正面后得到的后验分布。现在,绿线显示了根据每个对应于 P 值的假设,我们会得到一个反面的概率。

我们必须将我们的先验乘以似然项,现在我们得到一条那样的曲线。然后我们必须重新归一化以使面积为1。这就是我们在观察到一次正面和一次反面后的后验分布。

注意,这是一个非常合理的分布。在观察到一正一反后,我们知道 P 不可能是0或1。而且最可能的事情现在在中间,这似乎也非常合理。

如果我们再这样做98次,并继续应用相同的策略:将上次抛掷后的后验乘以在各种不同参数 P 设置下观察到该事件的似然。假设我们总共得到53次正面和47次反面,那么我们最终会得到一条看起来像这样的曲线。因为我们从均匀先验开始,它的均值在0.53。它会相当尖锐地在0.53处达到峰值。但它也允许其他值,比如0.49在这条曲线下是完全合理的值,虽然没有0.53那么可能,但非常合理;而像0.25这样的值在这条曲线下就极不可能了。

贝叶斯定理

我们可以用贝叶斯定理来总结以上所有内容。

以下等式中间的项是参数集 W 和一些数据 D 的联合概率。对于监督学习,数据将包含目标值。我们假设输入是给定的,数据由与这些输入相关联的目标值组成,这就是我们观察到的。

P(W, D) = P(D) * P(W|D) = P(W) * P(D|W)

这个联合概率可以重写为一个个体概率和一个条件概率的乘积。在右边,我们将其写为 P(W) 乘以 P(D|W)。在左边,我将其写为 P(D) 乘以 P(W|D)

现在我们可以两边同时除以 P(D),这就得到了贝叶斯定理的通常形式:

P(W|D) = [P(W) * P(D|W)] / P(D)

贝叶斯定理说:给定数据 D,参数 W 的某个特定值的后验概率,就等于该特定 W 值的先验概率,乘以在该特定 W 值下你会观察到你所观测数据的概率,然后除以数据 D 的概率 P(D) 进行归一化。

P(D) 是数据概率,它简单地是 P(W) * P(D|W) 在所有可能 W 值上的积分。为了使这是一个总和为1的概率分布,底行必须是顶行在所有可能 W 值上的总和。因为那个 P(D) 已经对所有可能的 W 值进行了积分,所以它不受在左侧选择特定 W 值的影响。

因此,例如,当我们寻找最佳的 W 值时,我们可以忽略 P(D),因为它不依赖于 W。然而,右边的另外两项确实依赖于 W

总结

本节课中我们一起学习了贝叶斯方法的基本原理。我们通过抛硬币的例子,对比了最大似然估计与贝叶斯推断的区别。贝叶斯方法的核心优势在于它不提供参数的单一“最佳”估计,而是提供一个完整的后验概率分布,这能更好地表达我们的不确定性。我们从先验信念出发,利用观测数据(似然)对其进行更新,最终得到后验信念。这个过程由贝叶斯定理精确描述,为我们在数据有限或需要纳入先验知识时提供了强大的建模框架。

9.5:权重衰减的贝叶斯解释 🧠

在本节课中,我们将学习权重衰减的贝叶斯解释。我们将看到,在监督学习中最小化平方误差,以及在损失函数中添加权重惩罚项,都可以从概率的角度进行理解。这为我们控制模型容量提供了一种理论依据。

最大后验学习

上一节我们介绍了神经网络训练的基本目标。本节中我们来看看一种简化的贝叶斯方法。

在完整的贝叶斯方法中,我们试图计算模型所有可能参数设置的后验概率。但这通常非常困难。一个简化版本是寻找单一的最佳参数集,使其在拟合我们关于参数的先验信念和拟合观测到的数据之间达到最佳折衷。这被称为最大后验学习。它为我们使用权重衰减来控制模型容量提供了很好的解释。

平方误差的概率解释

现在,我们来谈谈在监督最大似然学习中最小化平方误差时,其背后的真实含义。

找到最小化平方残差(即目标值与网络预测值之间的差异)的权重向量,等价于找到最大化正确答案的对数概率密度的权重向量。

为了理解这种等价性,我们必须假设正确答案是通过在神经网络的输出上添加高斯噪声而产生的。模型输出是高斯分布的中心,我们希望目标值在该高斯分布下具有高概率。

假设在训练案例 C 上,神经网络的输出是 Y_C,这是权重 W 应用于输入 C 的结果。当我们向该输出 Y_C 添加高斯噪声时,得到正确目标值的概率由以 Y_C 为中心的高斯分布给出。

如果我们取对数并加上负号,会发现目标值 T_C 的负对数概率密度(给定网络输出 Y_C)是一个常数项加上 (T_C - Y_C)^2 / (2 * σ^2),其中 σ^2 是高斯的方差。

因此,如果我们的成本函数是得到正确答案的负对数概率,那就转化为最小化一个平方距离。了解这一点很有帮助:每当你看到最小化平方误差时,都可以对其做出概率解释。在该概率解释中,你实际上是在最大化高斯分布下的对数概率。

从概率到损失函数

完整的贝叶斯方法是找到所有可能权重向量的完整后验分布。对于非线性网络,如果权重数量众多,这几乎不可能实现。贝叶斯方法有许多近似该分布的方法,通常使用蒙特卡洛方法。

但目前,让我们尝试更简单的方法:只寻找最可能的权重向量,即给定先验知识和数据后,概率最高的单一权重设置。

我们将尝试通过从某个随机权重向量开始,然后沿提高该权重向量(给定数据)概率的方向调整它,来找到 W 的最优值。这只会是局部最优解。在概率域中操作比较困难,因此我们通常在对数域中工作。如果我们想最小化一个成本,最好使用负对数概率。

以下是关于为什么我们最大化对数概率之和或最小化负对数概率之和的说明:

我们真正想做的是最大化数据的概率,即最大化在所有不同训练案例中观测到的所有目标值的概率乘积。如果我们假设不同案例的输出误差是独立的,可以将其写为所有训练案例中产生目标值 T_C(给定权重)的概率乘积。对数函数是单调的,因此不会改变最大值的位置。所以,我们可以最大化对数概率之和,而不是概率的乘积,这在计算机上通常更稳定。

最大后验学习的损失构成

在最大后验学习中,我们试图找到在拟合先验和拟合数据之间达到最优权衡的权重集。根据贝叶斯定理,如果我们取负对数来得到一个成本函数,那么权重给定数据的负对数概率等于先验项的负对数加上数据项的负对数,再加上一个额外的常数项。这个额外的常数项是所有可能权重向量的积分,因此在优化 W 时可以忽略它。

依赖于数据的项是目标值给定 W 的负对数概率,这就是我们通常的误差项。而只依赖于 W 的项是 W 在其先验分布下的负对数概率。

最大化权重的对数概率与最小化平方距离相关,其方式与最大化产生正确目标值的对数概率与最小化平方距离相关完全相同。

权重衰减的贝叶斯解释

因此,最小化权重的平方和,等价于在均值为0的高斯先验下最大化权重的对数概率。

假设我们有一个均值为0的高斯先验。最大化权重的概率(或对数概率),显然希望 W 接近均值0。高斯分布的方程如下,其中均值为0:

P(W) = (1 / sqrt(2πσ_w^2)) * exp(-W^2 / (2σ_w^2))

W 的对数概率则是 -W^2 / (2σ_w^2) 加上一个来自高斯归一化项的常数,该常数在改变 W 时无效。

最终,我们可以得到权重衰减或权重惩罚的贝叶斯解释。

我们试图最小化权重给定数据的负对数概率。这涉及最小化一个既依赖于数据又依赖于权重的项(即我们拟合目标的程度),以及一个仅依赖于权重的项(源自先验)。

  • 如果我们假设在模型输出中添加了高斯噪声以进行预测,那么数据给定权重的对数概率就是网络输出与目标值之间的平方距离,除以该高斯噪声方差的两倍。
  • 类似地,如果我们假设权重有一个高斯先验,那么权重在先验下的对数概率就是该权重的平方值,除以高斯先验方差的两倍。

现在,让我们对这个方程两边同时乘以 2σ_d^2(数据噪声方差的两倍),得到一个新的成本函数:

C = Σ (Y_C - T_C)^2 + (σ_d^2 / σ_w^2) * Σ W_i^2

第一项变成了所有训练案例中网络输出与目标之间平方差的总和,这就是我们通常在神经网络中最小化的平方误差。第二项现在变成了两个方差的比值乘以权重的平方和。

因此,你会看到这两个方差的比值正是权重惩罚系数 λ。

我们最初认为权重惩罚只是一个为了改善效果而编造的数字,通过验证集来固定其值。但现在我们看到,如果我们做出这种高斯解释(即我们有一个高斯先验,并且对网络输出与目标的关系有一个高斯模型),那么权重惩罚就由这些高斯的方差决定。它只是这些方差的比值,在这个框架下完全不是一个任意的东西。

总结

本节课中我们一起学习了权重衰减的贝叶斯解释。我们了解到:

  1. 最小化平方误差等价于在高斯噪声假设下最大化数据的对数似然。
  2. 在损失函数中添加权重的L2惩罚项,等价于假设权重服从均值为零的高斯先验分布,并进行最大后验估计。
  3. 权重衰减系数 λ 并非一个任意的超参数,它在贝叶斯框架下具有明确的含义:λ = σ_d^2 / σ_w^2,即数据噪声方差与权重先验方差的比值。

这为神经网络中正则化技术的使用提供了坚实的概率论基础。

9.6:MacKay的快速近似方法 🧠

在本节课中,我们将学习一种由David MacKay在20世纪90年代开发的方法。该方法用于确定神经网络中应使用的权重惩罚项,而无需借助验证集。我们将看到,这种方法基于将权重惩罚解释为最大后验概率估计,并通过经验性地拟合权重惩罚和输出噪声,来实现对不同连接子集使用不同惩罚系数的目标。


概述

上一节我们介绍了权重惩罚与贝叶斯先验之间的关系。本节中,我们来看看David MacKay提出的一种实用方法,它允许我们在没有验证集的情况下,自动确定合适的权重惩罚强度,甚至可以为网络中的不同层或连接组设置不同的惩罚系数。

方法原理

该方法的核心思想是,我们可以将权重惩罚项解释为两个方差的比值。具体来说,在最小化平方误差学习到一个模型后,我们可以找到输出噪声方差的最佳值,这个最佳值就是残差误差的方差。

我们也可以估计权重高斯先验的方差。这需要从一个初始猜测开始,然后进行学习,最后使用一个被称为“经验贝叶斯”的技巧:我们将先验方差设置为模型学习到的权重的方差,因为该方差会使这些权重出现的可能性最大。

这种方法虽然违反了贝叶斯方法中“先验应独立于数据”的前提假设,但在实践中非常有效。它的一个优点是,如果存在不同的权重子集(例如在不同层中),我们可以为不同层学习不同的方差。由于不需要验证集,我们可以将所有非测试数据都用于训练。

实施步骤

以下是MacKay方法的具体步骤:

  1. 初始化:猜测噪声方差和权重先验方差。实际上,只需要猜测它们的比值。
  2. 学习:进行梯度下降学习,以改进权重。
  3. 更新方差
    • 将噪声方差重置为当前模型残差误差的方差。
    • 将权重先验方差重置为已学习权重的实际分布的方差。
  4. 迭代:返回步骤2,重复此循环。

这个方法在实践中效果很好,MacKay曾凭借此类方法赢得了多次竞赛。


总结

本节课中,我们一起学习了David MacKay的快速近似方法。该方法通过经验贝叶斯框架,在训练过程中同时更新输出噪声的估计和权重先验方差的估计,从而自动确定合适的权重衰减强度。它最大的优势在于无需使用验证集来调优惩罚系数,使得为网络中不同部分设置不同的正则化强度变得可行且高效。

10.1:为何组合模型有效 🧠

在本节课中,我们将探讨在机器学习中组合多个模型进行预测的原因。我们将从模型组合的基本动机开始,分析其数学原理,并介绍几种促使模型产生多样化预测的方法。

概述

当使用单一模型进行预测时,我们需要为其选择一个合适的容量。如果容量选择过小,模型将无法捕捉训练数据中的真实规律。如果容量选择过大,模型则可能过度拟合特定训练集中的采样误差。通过组合多个模型,我们可以在拟合真实规律与避免过度拟合采样误差之间取得更好的平衡。

模型平均化的优势

上一节我们提到了模型容量选择的困境。本节中,我们来看看如何通过组合模型来解决这个问题。

当训练数据有限时,模型容易发生过拟合。如果我们对多个不同模型的预测结果进行平均,通常可以减少这种过拟合。当各个模型之间的预测差异很大时,这种方法的帮助最大。

为了分析其原理,我们可以将平方误差分解为偏差项和方差项。

  • 偏差项:如果模型容量太小,无法充分拟合数据,偏差项就会很大。它衡量了模型对真实函数的近似程度有多差。
  • 方差项:如果模型容量过大,以至于能够很好地拟合我们特定训练集中的采样误差,方差项就会很大。之所以称为方差,是因为如果我们从同一分布中获取另一个相同大小的训练集,模型会因不同的采样误差而产生不同的拟合结果,从而导致模型在不同训练集上的拟合方式存在差异。

当我们对模型进行平均时,实际上是在平均掉方差。这使得我们可以使用具有高容量(因此高方差)的单个模型。这些高容量模型通常具有低偏差,因此我们可以通过平均来消除方差,从而获得低偏差而不必承受高方差。

组合模型的数学分析

现在,让我们尝试分析单个模型与模型平均之间的比较。

在任何单个测试案例上,某些独立的预测器可能比组合预测器表现更好。但不同的独立预测器会在不同的案例上表现更优。如果独立预测器之间存在很大分歧,那么在所有测试案例上平均来看,组合预测器通常优于所有独立的预测器。因此,我们的目标应该是让独立预测器产生分歧,同时又不让它们成为糟糕的预测器。关键在于让各个预测器犯下彼此非常不同的错误,但各自仍保持相当的准确性。

以下是组合网络时的数学分析。

我们将比较两个期望平方误差。

第一个期望平方误差是:如果我们随机选择一个预测器并用它进行预测,然后对所有预测器采用此策略时可能得到的误差进行平均。用公式表示如下:

E_i[(t - y_i)^2]

其中,y_bar 是所有预测器输出的平均值,y_i 是单个预测器的输出。y_bar 就是所有单个预测器 y_i 的期望值,即 y_bar = E_i[y_i],也可以写作 y_bar = (1/N) * Σ y_i

如果我们观察随机选择预测器时的期望平方误差,我们需要将该预测器的输出与目标值 t 进行比较,计算平方差,然后对所有预测器进行平均。这就是等号左边的部分。

E_i[(t - y_i)^2] = E_i[(t - y_bar + y_bar - y_i)^2]

通过展开平方项并进行数学推导,我们可以得到:

E_i[(t - y_i)^2] = (t - y_bar)^2 + E_i[(y_i - y_bar)^2]

其中:

  • (t - y_bar)^2 是将模型平均值与目标值比较得到的平方误差。
  • E_i[(y_i - y_bar)^2]y_i 的方差,即 y_iy_bar 之间的期望平方差。

推导过程中,交叉项 2 * E_i[(t - y_bar)(y_bar - y_i)] 由于 (y_bar - y_i) 的期望为零,且与 (t - y_bar) 不相关,因此期望为零。

结果表明,随机选择一个模型得到的期望平方误差,比使用模型平均得到的平方误差要大,其差值正好等于模型输出的方差。这就是我们通过取平均所获得的收益。

促使模型多样化的方法

为了使模型平均化带来显著收益,我们希望各个预测器之间存在很大差异。以下是几种促使它们产生差异的方法。

使用不同的模型架构

你可以仅仅依赖一个效果不佳、每次都会陷入不同局部最优解的学习算法。这不是一个非常智能的方法,但值得一试。你也可以使用许多不同类型的模型,包括非神经网络的模型。例如,可以尝试决策树、高斯过程模型、支持向量机等。如果你确实想使用一堆不同的神经网络模型,可以通过以下方式使它们不同:

  • 使用不同数量的隐藏层。
  • 每层使用不同数量的单元。
  • 使用不同类型的单元(例如,在某些网络中使用修正线性单元,在其他网络中使用逻辑单元)。
  • 使用不同类型或强度的权重惩罚(例如,对某些网络使用早停法,对其他网络使用L2权重惩罚,再对其他网络使用L1权重惩罚)。
  • 使用不同的学习算法(例如,如果数据集足够小,可以对某些网络使用全批量梯度下降,对其他网络使用小批量梯度下降)。

使用不同的训练数据

你也可以通过在不同的训练数据上训练模型来使模型产生差异。

Bagging(自举汇聚法):由Leo Breiman引入的一种方法。通过对训练集进行有放回抽样来获得不同的数据子集,并在这些子集上训练不同的模型。这种方法在名为“随机森林”的方法中与决策树结合使用,效果显著。虽然可以将Bagging用于神经网络,但计算成本非常高。

Boosting(提升法):另一种方法是使用整个训练集训练每个模型,但对每个模型的训练案例赋予不同的权重。在Boosting中,我们通常使用一系列容量较低的模型。我们对每个模型的训练案例进行不同的加权:增加先前模型预测错误的案例的权重,降低先前模型预测正确的案例的权重。这样,序列中的下一个模型就不会浪费时间在已经正确的案例上,而是利用其资源来处理其他模型出错的案例。Boosting的早期应用之一是用于手写数字识别的神经网络。

10.2:专家混合模型 👨‍🔬

在本节课中,我们将要学习一种名为“专家混合”的模型。这个模型的核心思想是训练多个神经网络,让每个网络专门处理数据的不同部分,并通过一个“管理者”网络来决定将输入数据分配给哪个专家。

模型的基本思想

上一节我们介绍了模型组合的基本概念,本节中我们来看看专家混合模型的独特之处。

该模型假设数据集来自多个不同的“机制”或“状态”。我们训练一个系统,其中每个神经网络专门处理一种机制,而一个管理者神经网络则查看输入数据,并决定将数据交给哪位专家处理。

这种系统对数据的利用效率不高,因为数据被分散给了所有不同的专家。因此,在小数据集上,它的表现可能不会很好。但随着数据集变得越来越大,这类系统可能会展现出优势,因为它能非常有效地利用极其庞大的数据集。

与提升法的区别

在提升法中,模型的权重并不相等,但在训练完成后,每个模型对于每个测试用例的权重是相同的。我们不会让单个模型的权重依赖于我们正在处理的特定用例。

在专家混合模型中,我们恰恰这样做。其核心思想是,我们可以在训练和测试时,查看特定用例的输入数据,以帮助我们决定可以信赖哪个模型。在训练期间,这将允许模型专注于一部分用例。它们将不会学习那些未被选中的用例,从而可以忽略它们不擅长建模的部分。这将导致每个模型在某些方面非常出色,而在其他方面则非常糟糕。

关键思想是让每个模型(我们称之为“专家”)专注于预测那些它已经比其他专家做得更好的用例的正确答案,这将促使专业化。

模型的频谱:从局部到全局

在模型选择上,存在一个从非常局部的模型到非常全局的模型的频谱。

以下是两种极端情况:

  • 最近邻模型:这是一个非常局部的模型。拟合它只需要存储训练用例,这非常简单。然后,如果需要根据X预测Y,只需找到与测试X值最接近的存储X值,并预测与存储值相同的Y值。这样做的结果是,输入与输出之间的关系曲线由许多由陡峭“悬崖”连接的水平线段组成。显然,将其平滑处理会更有意义。
  • 完全全局模型:例如,用一个多项式拟合所有数据。它们更难拟合数据,也可能不稳定。也就是说,数据的微小变化可能导致拟合的模型发生巨大变化。这是因为每个参数都依赖于所有数据。

中间方案:多个局部模型

在这两个极端之间,我们拥有复杂度居中的多个局部模型。如果数据集包含几个不同的机制,并且这些不同的机制具有不同的输入-输出关系,那么这种方法就很好。

例如,在金融数据中,经济状态对确定输入和输出之间的映射关系有很大影响,你可能希望为不同的经济状态使用不同的模型。但你可能事先不知道如何界定不同的经济状态,这也需要学习。

因此,如果我们打算为不同的机制使用不同的模型,就会面临一个问题:如何将数据划分到这些不同的机制中。

基于映射相似性的数据划分

为了将不同的模型拟合到不同的机制,我们需要将训练数据聚类成子集,每个子集对应一种机制。

但我们不希望基于输入特征的相似性来聚类数据。我们感兴趣的是输入-输出映射的相似性。

请看右侧的示例。有四个数据点可以很好地用红色抛物线拟合,另外四个数据点可以很好地用绿色抛物线拟合。如果基于输入-输出映射(即基于抛物线能很好拟合数据的想法)来划分数据,那么划分线就在棕色线处。然而,如果仅通过聚类输入来划分数据,划分线就在蓝色线处。那么,在蓝色线左侧,你将得到一个无法用简单模型很好拟合的数据子集。

鼓励协作与鼓励专业化的误差函数

接下来,我将解释一个鼓励模型协作的误差函数,然后再解释一个鼓励模型专业化的误差函数。我将尝试让你直观地理解为什么这两个不同的函数会产生如此不同的效果。

鼓励协作的误差函数

如果你想鼓励协作,你应该做的是将所有预测器的平均值与目标进行比较,并训练所有预测器共同工作,以减少目标与其平均值之间的差异。

再次使用尖括号表示期望,误差将是目标与所有预测器预测值的平均值之间的差值。这会导致严重的过拟合。它将使模型比单独训练每个预测器时强大得多,因为模型将学会纠正其他模型所犯的错误。

鼓励专业化的误差函数

以下是鼓励专业化的误差函数,它与协作函数差异不大。

为了鼓励专业化,我们分别将每个模型的输出与目标进行比较。我们还需要使用一个管理者来确定我们赋予每个模型的权重,这可以看作是在必须选择一个模型时,选择该模型的概率。

现在,我们的误差是所有不同模型的期望,即该模型产生的平方误差乘以选择该模型的概率。管理者或门控网络通过查看特定用例的输入来确定这个概率。

如果你试图最小化这个误差,会发生的情况是,大多数专家最终会忽略大多数目标。每个专家只处理一小部分训练用例,并学会在该小部分上做得非常好。

专家混合模型架构

以下是专家混合模型的架构图。

我们的成本函数是每个专家输出与目标之间的平方差,在所有专家上进行平均,但该平均值中的权重由管理者决定。实际上,我们稍后会介绍一个基于混合模型的更好的成本函数,但这是我最初想到的成本函数,我认为用这个成本函数更容易解释其直观含义。

我们有一个输入。所有不同的专家都查看该输入,并根据该输入做出预测。此外,我们还有一个管理者。管理者可能有多层,其最后一层是一个Softmax函数。因此,管理者输出的概率数量与专家数量相同。利用管理者的输出和专家的输出,我们就可以计算该误差函数的值。

误差函数的梯度

如果我们查看该误差函数的导数,管理者的输出由输入到管理者最后一层Softmax组的Xi决定。然后,误差由专家的输出以及管理者输出的概率决定。

如果我们对误差关于某个专家输出的导数,我们会得到一个用于训练该专家的信号。我们得到的关于专家输出的梯度,仅仅是选择该专家的概率乘以该专家输出与目标之间的差值。因此,如果管理者决定对于该特定训练用例选择该专家的概率非常低,那么该专家将获得非常小的梯度,并且该专家内部的参数不会受到该训练用例的干扰。它将能够保存其参数,用于建模管理者赋予其高概率的那些训练用例。

我们也可以对误差关于门控网络输出的导数。实际上,我们要做的是对输入到Softmax的量(称为logit,即Xi)求导。如果我们对Xi求导,我们得到的是该专家被选中的概率,乘以该专家的平方误差与所有专家的平均平方误差(使用管理者提供的权重)之间的差值。

这意味着,如果专家I产生的平方误差低于其他专家的平均值,那么我们将尝试提高专家I的概率。但如果专家I产生的平方误差高于其他专家,我们将尝试降低其概率。这正是导致专业化的原因。

基于混合模型的更好成本函数

现在,实际上有一个更好的成本函数,只是更复杂一些。它依赖于混合模型,我在本课程中没有解释过。同样,这些内容在Andrew Ng的课程中会有很好的解释。

然而,我之前确实解释过,在进行回归时,最大似然估计可以解释为网络实际上在进行高斯预测。也就是说,网络输出一个特定值,比如y1,我们可以将其视为对目标值可能是什么进行下注,这些下注是围绕y1、具有单位方差的高斯分布。

因此,红色专家做出围绕y1的高斯分布预测,绿色专家做出围绕y2的高斯分布预测。然后,管理者决定两个专家的概率,这些概率用于按比例缩小高斯分布。这些概率之和必须为1,被称为混合比例。因此,在按比例缩小高斯分布后,我们得到的分布不再是高斯分布,而是按比例缩小后的红色高斯分布和绿色高斯分布之和。这就是我们专家混合模型的预测分布。

我们现在要做的是,最大化目标值在该黑色曲线下的对数概率。请记住,黑色曲线只是红色曲线和绿色曲线的总和。

最终的概率模型与成本函数

这导致了以下关于目标值在专家混合模型下的概率模型。

左边的概率是所有专家的总和,即管理者或门控网络分配给该专家的混合比例,乘以e的负(目标与该专家输出之间的平方差)次方,再除以具有单位方差的高斯分布的归一化项。

因此,我们的成本函数将简单地是左边概率的负对数。我们将尝试最小化该概率的负对数。

总结

本节课中,我们一起学习了专家混合模型。我们了解了其基本思想,即通过多个专家网络和一个管理者网络来处理数据的不同机制。我们探讨了它与提升法的区别,以及它在模型频谱中的位置。我们深入分析了如何基于输入-输出映射的相似性来划分数据,并比较了鼓励协作与鼓励专业化的两种误差函数。最后,我们介绍了模型的架构、梯度计算以及基于混合模型的更优成本函数。专家混合模型为处理包含多种机制的大型数据集提供了一种有效的框架。

10.3:全贝叶斯学习的概念 🧠

在本节课中,我们将要学习全贝叶斯学习的核心思想。我们将探讨它如何工作,以及它如何通过考虑所有可能的参数设置来避免过拟合问题,而不是仅仅寻找单一的“最佳”参数。


概述

全贝叶斯学习不试图寻找参数的最佳单一设置。相反,它试图找到所有可能参数设置上的完整后验分布。这意味着,对于每一个可能的参数设置,我们都希望得到一个后验概率密度,并且所有这些密度加起来总和为1。

全贝叶斯学习的工作原理

上一节我们介绍了贝叶斯学习的基本概念,本节中我们来看看全贝叶斯方法的具体运作方式。

计算这种后验分布对于除了最简单模型以外的所有模型来说,计算量都极大。在之前的例子中,我们为一个有偏硬币(只有一个参数)做到了这一点。但对于一个神经网络来说,这通常是不可能的。

在计算了所有可能参数设置的后验分布之后,我们就可以进行预测。方法是让每一个不同的参数设置做出自己的预测,然后根据它们的后验概率对所有这些预测进行加权平均。

这个过程同样计算量巨大。但这样做的好处是,如果我们使用全贝叶斯方法,即使我们没有太多数据,也可以使用复杂的模型。

全贝叶斯与过拟合

这里有一个非常有趣的哲学观点。我们现在已经习惯了当你用少量数据拟合复杂模型时会出现过拟合的想法。

但这基本上只是没有费力去获取参数完整后验分布的结果。一个频率主义者会说,如果你没有太多数据,你应该使用一个简单的模型。这没错,但前提是你假设“拟合模型”意味着找到参数的单一最佳设置。

如果你找到了完整的后验分布,就能消除过拟合。如果数据非常少,完整的后验分布通常会给出非常模糊的预测,因为许多做出非常不同预测的参数设置都会具有显著的后验概率。

随着你获得更多数据,后验概率会越来越集中在少数几个参数设置上,后验预测也会变得更加清晰。

以下是过拟合的一个经典例子:

  • 数据:我们有六个数据点。
  • 模型一:我们拟合了一个五阶多项式。它有六个系数,几乎完全拟合了数据。
  • 模型二:我们拟合了一条直线。它只有两个自由度,对数据的拟合没有那么好。

复杂的模型显然拟合得更好,但你不会相信它。它不经济,而且会做出愚蠢的预测。例如,在蓝色箭头所指的输入值处,红色曲线(五阶多项式)预测的输出值比任何观测到的数据点都低,这看起来很荒谬。而绿色直线则会预测一个合理的值。

但是,如果我们不是拟合一个五阶多项式,而是从一个合理的先验(例如,多项式的系数不应该太大)开始,然后计算所有五阶多项式的完整后验分布,一切就都改变了。

在图中,我展示了从这个分布中抽取的一些样本,其中较粗的线表示后验概率较高。你会看到一些细线会与某些数据点相差甚远,但它们仍然很接近大多数数据点。现在,我们得到了更模糊但更合理的预测。在蓝色箭头处,你会看到不同的模型预测出非常不同的结果,但平均而言,它们的预测非常接近绿色直线的预测。

从贝叶斯的角度来看,你收集的数据量不应该影响你对模型复杂性的先验信念。一个真正的贝叶斯主义者会说,你对事物可能有多复杂有先验信念。仅仅因为你还没有收集任何数据,并不意味着你认为事物要简单得多。

在神经网络中近似全贝叶斯学习

如果神经网络的参数非常少,我们可以在其中近似全贝叶斯学习。

其思想是在参数空间上放置一个网格。每个参数只允许有几个可选值。然后我们取所有参数的所有这些值的笛卡尔积。现在我们得到了参数空间中的许多网格点。

在每个网格点上,我们可以评估我们的模型对数据的预测效果。也就是说,如果我们正在进行监督学习,我们可以看模型对目标输出的预测有多好。

我们可以说,该网格点的后验概率是:

  • 数据似然:它预测数据的程度。
  • 先验概率:它在先验下的可能性。
  • 归一化:将整个结果归一化,使得所有后验概率之和为1。

这仍然非常昂贵,但请注意它有一些吸引人的特点:不涉及梯度下降,也没有局部最优问题。我们不是在这个空间中沿着一条路径走,我们只是评估空间中的一组点。

一旦我们决定了分配给每个网格点的后验概率,我们就用它们全部来对测试数据进行预测。这也很昂贵,但当数据不多时,它的效果会比最大似然或最大后验估计好得多。

以下是预测测试输出的方式:

给定测试输入,测试输出的概率是所有网格点上的和:
P(test_output | test_input) = Σ_grid_points [ P(grid_point | data, prior) * P(test_output | test_input, grid_point) ]

换句话说,我们必须考虑到我们可能在网络的输出上添加了噪声,然后才产生测试答案。

图解全贝叶斯学习

这里有一张全贝叶斯学习的示意图。我们有一个小型网络,它有四个权重和两个偏置。

如果我们允许每个权重和偏置有9个可能的值,那么在参数空间中就会有 9^6 个网格点。这是一个很大的数字,但我们可以处理它。

对于每一个网格点,我们计算模型在所有训练案例上观测到输出的概率。我们会乘以该网格点的先验概率(例如,这可能取决于权重的值)。然后我们进行重新归一化,得到所有网格点上的后验概率。

最后,我们使用这些网格点进行预测,但根据每个网格点的后验概率对其预测进行加权。


总结

本节课中我们一起学习了全贝叶斯学习的核心概念。我们了解到,这种方法通过计算并利用所有可能参数设置的后验分布来进行预测,从而在理论上避免了过拟合问题,尤其是在数据量较少时。虽然其计算成本极高,但对于参数极少的模型,可以通过在参数空间设置网格点来进行近似。这种方法不依赖于梯度下降,也没有局部最优的困扰,为处理小数据集的复杂模型提供了一种哲学上严谨且实用的思路。

10.4:实现实用的完全贝叶斯学习 🧠

在本节课中,我们将要学习如何将完全贝叶斯学习应用于拥有数千甚至数百万权重的神经网络,使其变得实用。我们将探讨一种基于蒙特卡洛方法的采样技术,它允许我们通过随机游走权重空间来近似后验分布,从而避免了对整个高维空间进行穷举计算的难题。

贝叶斯学习的计算挑战

上一节我们介绍了贝叶斯学习的理论基础,本节中我们来看看其在实际应用中的核心障碍。

对于拥有大量参数的神经网络,其权重空间是极高维的。如果我们想通过网格点来穷举计算后验分布,其计算量将是参数数量的指数级增长。这意味着,对于超过几个参数的模型,构建这样的网格在计算上是不可行的。

然而,如果数据足够多,使得大多数参数向量的后验概率极低,那么只有权重空间中极小一部分区域会对最终的预测做出显著贡献。因此,一个关键思路是:如果我们能找到这个高概率区域,或许只需专注于评估这一小部分即可。

蒙特卡洛采样:核心思路

一个让贝叶斯学习变得可行的想法是:根据后验概率对权重向量进行采样可能就足够了

让我们回顾一下预测公式。我们为测试输出分配的概率,是在给定测试输入和训练数据的情况下,对所有权重空间点的后验概率与该权重下预测分布的乘积求和。

公式表示:
P(test_output | test_input, training_data) = Σ [ P(W_i | training_data) * P(test_output | W_i, test_input) ]

现在,我们不必计算这个求和中的所有项,而是可以从这个求和中采样项。具体做法是:我们按照权重向量的后验概率对其进行采样。每个权重向量要么被采样(权重为1),要么不被采样(权重为0),而被采样的概率正是其后验概率。这样,我们就能得到等式右侧的正确期望值,尽管由于采样会引入噪声。

对比:标准反向传播与采样方法

为了理解采样方法,我们先回顾标准反向传播的做法。

在标准反向传播中,我们从某个较小的初始权重开始,然后沿着梯度方向,在成本函数(通常是负对数似然加负对数先验)上向下移动。最终,我们会收敛到某个局部最小值,或陷入平台期,或因为进展缓慢而停止。关键点是:这个过程遵循一条从起点到某个单一终点的路径

而当我们使用采样方法时,可以从相同起点开始。但每次更新权重时,我们添加一点高斯噪声。这样,权重向量永远不会完全稳定下来,而是会在空间中持续游走。它倾向于向低成本区域移动,但也会因为噪声而探索其他区域。游走过程中,我们会定期(例如每10000步)保存权重向量作为样本(可视作红点)。

这些红点样本的分布具有重要特性:虽然少数可能位于高成本区域(因为这些区域可能很广),但最深的极小值附近会有最多的红点,其他极小值附近也会有。红点不会精确位于极小值底部,因为它们是带有噪声的样本。

马尔可夫链蒙特卡洛与朗之万动力学

如果我们以恰当的方式添加高斯噪声,就会得到马尔可夫链蒙特卡洛方法的一个美妙性质。

这是一个惊人的事实:只要我们游走足够长的时间,所获得的权重向量将是真实后验分布的无偏样本。这意味着,之前幻灯片上的红点就是从后验分布中采样得到的——后验概率高的权重向量更有可能被红点代表。

这种添加高斯噪声的方法被称为朗之万动力学。虽然它并非最高效的MCMC方法(存在更复杂、更高效的方法,能减少开始采集有效样本所需的游走时间),但它阐明了核心原理。

使用小批量的完全贝叶斯学习

一个重要的进展是,完全贝叶斯学习实际上可以与小批量训练相结合。

当我们在随机小批量上计算成本函数的梯度时,会得到一个带有采样噪声的无偏估计。一个非常巧妙的想法是:利用这种梯度估计固有的采样噪声,来提供马尔可夫链蒙特卡洛方法所需的噪声

最近,Welling及其合作者成功实现了这一点,使得他们能够相当高效地使用小批量方法从权重的后验分布中获取样本。这应该使得将完全贝叶斯学习应用于更大的网络成为可能,因为对于大型网络,必须使用小批量训练才有希望完成训练。

以下是实现这一结合的关键点概述:

  • 梯度估计:小批量提供的梯度是真实梯度的无偏但带噪声的估计。
  • 噪声利用:该噪声被用作MCMC采样过程中的探索机制。
  • 效率提升:这使得在大规模网络上进行贝叶斯学习变得可行。

总结

本节课中我们一起学习了如何使完全贝叶斯学习在大规模神经网络中变得实用。核心方法是利用马尔可夫链蒙特卡洛采样,通过在有噪声的梯度方向上移动,在权重空间中进行随机游走,从而获得后验分布的近似样本。我们对比了传统的确定性优化与随机采样路径,并了解了朗之万动力学的基本思想。最后,我们看到了如何将这一过程与小批量训练自然结合,利用梯度计算中固有的噪声进行采样,这为将完全贝叶斯学习扩展到现代大型深度学习模型铺平了道路。

10.5:Dropout 技术详解 🧠

在本节课中,我们将学习一种名为 Dropout 的神经网络正则化技术。它通过一种巧妙的方式,组合大量不同的网络模型,而无需分别训练每一个模型,从而有效防止过拟合,提升模型的泛化能力。


上一节我们介绍了模型组合的基本概念,本节中我们来看看 Dropout 的具体实现机制。

Dropout 的核心思想是:在每次训练迭代中,随机“丢弃”网络中的一部分隐藏单元。这意味着,对于每一个训练样本,我们实际上都在一个随机生成的、略有不同的网络架构上进行前向和反向传播。

我们可以将此理解为,为每一个训练样本都使用了一个不同的模型。随之而来的问题是:我们如何仅用一个训练样本来训练一个模型?以及,在测试时,我们如何高效地平均所有这些模型的预测结果?

答案在于权重共享。所有可能的子网络都共享同一套权重参数。


在深入 Dropout 之前,我们先回顾两种组合多个模型输出的方式。

1. 混合平均
混合平均通过算术平均来组合模型的输出概率。

2. 乘积平均
乘积平均则通过几何平均来组合模型的输出概率。其特点是,任何一个模型给出的极小概率,都拥有对其他模型的“一票否决权”。


Dropout 提供了一种高效平均大量神经网络模型的方法,它是贝叶斯模型平均的一种实用近似。

考虑一个具有一个隐藏层的神经网络。每次输入一个训练样本时,我们以固定的概率(例如 0.5)随机“丢弃”每个隐藏单元。这意味着,我们从 2^H 个可能的网络架构中随机采样一个(H 是隐藏单元数)。这是一个极其庞大的模型集合。

所有这些架构都共享权重。因此,Dropout 可以被视为一种模型平均。每个被采样的模型只看到一个训练样本,这是一种极端的“装袋法”。模型间的权重共享,意味着每个模型都受到其他模型的强烈正则化约束,这比 L1/L2 等倾向于将权重拉向零的正则化方法更为有效。


接下来,我们探讨在测试阶段如何处理。

理论上,我们可以采样许多架构(例如 100 个),然后取它们输出分布的几何平均。但这计算量巨大。有一个更简单的方法:我们使用所有的隐藏单元,但将其输出权重减半

这样做的结果是,使用所有单元并减半权重,恰好计算了所有 2^H 个模型预测的几何平均(前提是使用 softmax 输出层)。这个网络被称为 “平均网络”

对于多层网络,我们可以在每一层都使用 Dropout。测试时,将所有隐藏单元的输出权重减半。这虽然不是精确的平均,但是一个良好且快速的近似。


我们也可以将 Dropout 应用于输入层,但通常保留输入单元的概率会设置得更高(例如 0.8)。这一技巧在“去噪自编码器”中已被成功应用。


那么,Dropout 效果如何?

实践证明,Dropout 能显著减少过拟合。例如,Alex Krizhevsky 破纪录的图像识别网络,在使用 Dropout 后性能得到了大幅提升。通常,如果一个深度网络出现过拟合,使用 Dropout 可以明显改善。即使网络没有过拟合,使用更大的网络并配合 Dropout 也往往能获得更好的性能。


最后,我们从另一个角度理解 Dropout 的动机。

如果没有 Dropout,网络中的隐藏单元知道其他所有单元的存在,它们会在训练数据上形成复杂的“协同适应”。这就像一个大而复杂的“阴谋”,在训练集上可能运作良好,但一旦遇到新的测试数据,就很容易因为某个环节的意外而失效。

Dropout 迫使每个隐藏单元必须与组合意义上的许多其他隐藏单元集合协作。这使得它更倾向于学习一些独立有用的特征,而不是仅在与某些特定伙伴协作时才有用。它需要学习在给定其“同事”们通常能完成什么的基础上,做出“边际上有用”的贡献。我认为,这正是 Dropout 网络表现出色的根本原因。


本节课总结

本节课中,我们一起学习了 Dropout 技术。我们了解了它通过随机丢弃隐藏单元来模拟大量子网络训练的思想,掌握了在测试时通过“权重减半”来高效近似模型平均的实用方法,并探讨了其防止复杂协同适应、提升模型鲁棒性的内在原理。Dropout 是一种强大且广泛应用的正则化工具,能有效提升深度神经网络的泛化能力。

11.1:霍普菲尔德网络 🧠

在本节课中,我们将要学习一种与之前介绍的前馈神经网络截然不同的模型——霍普菲尔德网络。这种网络是20世纪80年代神经网络研究复兴的主要原因之一。它是一种结构简单、可用于以分布式活动模式存储记忆的模型。

能量基础模型

上一节我们介绍了前馈网络,本节中我们来看看一种基于全局能量函数的模型,有时被称为“能量基础模型”。霍普菲尔德网络是最简单的能量基础模型之一。

它由二元阈值单元组成,单元之间存在循环连接。通常,具有循环连接的非线性单元网络非常难以分析,它们的行为方式多样:可以稳定在某个状态、可以振荡,甚至可能出现混沌行为。混沌意味着除非你以无限精度知道其初始状态,否则无法预测其未来的状态。

幸运的是,约翰·霍普菲尔德以及斯蒂芬·格罗斯伯格等研究小组发现,如果网络中的连接是对称的,那么整个网络就存在一个全局能量函数。网络的每一种二元配置(即网络中每个神经元都被赋予一个二元值)都对应一个能量值。

能量函数与状态更新

霍普菲尔德意识到,如果设置了正确的能量函数,二元阈值决策规则实际上会使网络朝着能量降低的方向演化。持续应用该规则,网络最终会到达一个能量最小值。

全局配置的能量由许多局部贡献的总和构成,其主要贡献形式是连接权重与两个神经元二元状态的乘积。能量函数如下所示:

能量公式:
E = - Σ_i Σ_j w_ij * s_i * s_j - Σ_i b_i * s_i

其中,能量越低越好,公式中的负号即为此意。w_ij 是两个神经元之间的对称连接强度,s_is_j 是神经元的二元活动状态(取值为1或0,或另一种形式中的1或-1)。除了涉及两个单元状态的二次项,还有一个仅涉及单个单元状态的偏置项 b_i

这种二次能量函数使得每个单元能够局部地计算其状态改变将如何影响全局能量。为此,我们首先需要定义“能量差”。

能量差与决策规则

单元 i 的能量差是指,根据单元 i 处于“开启”或“关闭”状态,整个网络全局能量的差值。我们将其定义为单元 i 关闭时的能量减去其开启时的能量。这个差值正是二元阈值决策规则所计算的内容。

如果对能量公式关于单元 i 的状态进行微分(尽管状态是二元变量,但这样做在数学上可行),你会发现得到的结果正是二元阈值决策规则(只是少了负号,因为该规则是为了使能量下降)。

因此,遵循二元阈值决策规则,霍普菲尔德网络会使其全局能量不断下降。

寻找能量最小值

在霍普菲尔德网络中寻找能量最小值的一种方法是:从一个随机状态开始,然后以随机顺序逐个更新单元。我们进行顺序更新。对于选中的每个单元,计算其两种状态中哪一种能带来更低的全局能量,并将其置于该状态,而不管它之前处于什么状态。这等同于直接应用二元阈值决策规则。

以下是更新过程的一个小例子:

假设我们从一个精心挑选的随机状态开始,其能量为 -3(或者说“优度”为 3,优度是负能量的相反数,便于思考)。在这个配置中,只有一个活跃的单元对,其权重为 3,因此优度为 3。

  1. 随机选择一个单元:例如选择某个单元。计算其总输入:1 * (-4) + 0 * 3 + 0 * 3 = -4。该值低于 0,因此我们将其关闭(它原本就是关闭的,状态不变)。
  2. 选择另一个单元:计算其总输入:1 * 3 + (-1) * 0 = 3。二元阈值决策规则会使其开启。
  3. 再选择一个单元:计算其总输入:1 * 2 + 1 * (-1) + 0 * 3 + 0 * (-1) = 1。因此它将开启(之前是关闭的)。此时,全局能量变为 -4(优度为 4)。

现在网络达到了一个局部能量最小值。如果尝试探测任何单元,你会发现它们都不希望改变当前状态。网络已经稳定在一个最小值上。

然而,这个最小值并非网络中最深的能量最小值。这个网络存在两个最小值,更深的最小值出现在另一个相互支持的三角形单元组全部开启时,其优度为 3 + 3 + (-1) = 5,是稍好一些的能量最小值。

顺序更新的必要性

你可能会问,为什么霍普菲尔德网络中的决策必须是顺序的?问题在于,如果单元同时做出决策,每个单元可能都认为自己正在降低能量,但实际上总能量可能上升。

使用同步并行更新时,我们可能会得到振荡,且振荡周期总是为 2。例如,在一个两个单元偏置均为 +5、相互间权重为 -100 的小网络中:

  • 当两个单元都关闭时,下一步并行更新会使两者都开启(因为它们都认为可以通过偏置项改善状况)。
  • 但一旦都开启,就会引入 -100 的权重项,实际上使情况变得更糟。
  • 于是在下一个并行步骤中,两个单元又会都关闭,如此循环振荡。

但是,如果我们采用并行更新,但更新时机是随机的(即,在考虑更新另一个单元之前,我们不等一个单元的更新状态传播给所有单元,而是每个单元的更新间隔时间是随机的),那么这种随机时序通常会破坏这种双相振荡。

这意味着,从生物学角度看,“更新必须是顺序的”这一要求并不像看起来那么严格。

作为记忆存储的能量最小值

霍普菲尔德提出,我们可以利用这种能稳定在能量最小值的基于能量的模型来存储记忆。他在1982年发表了一篇非常有影响力的论文,提出记忆可以是对称权重神经网络的能量最小值。

二元阈值决策规则可以将部分记忆“清理”成完整记忆。也就是说,记忆可能因部分内容错误而被破坏,或者部分内容尚未确定,我们可以利用网络来补全记忆。

将记忆视为能量最小值的想法由来已久。霍普菲尔德意识到,使用能量最小值来表示记忆,可以提供一种“内容可寻址”存储器。这意味着,你只需知道记忆内容的一部分,就可以访问整个记忆项。

你可以告诉我某个事物的几个属性,这将设置网络中一些神经元的状态。如果你将其他神经元置于随机状态,然后开始循环应用二元阈值规则,运气好的话,你就能补全该记忆,得到某个已知的存储项。

在1982年霍普菲尔德网络被提出时,这是一个非常有趣的特性(那时距离谷歌诞生还有16年)。如今有了谷歌,我们觉得这理所当然。

霍普菲尔德网络的另一个具有生物学意义的特性是,它们对硬件损伤具有鲁棒性。你可以移除网络中的一些单元,与计算机的中央处理器不同,一切仍能正常工作。心理学家对此类记忆有一个很好的类比:就像仅凭几块骨头重建恐龙,因为你了解骨头应该如何组合在一起。

网络中的权重提供了关于神经元状态如何组合的信息。现在,给定少数神经元的状态,我可以补全整个状态以恢复完整的记忆。

记忆存储规则

霍普菲尔德网络中的记忆存储规则非常简单。

如果我们使用取值为 1 和 -1 的活动状态,那么存储一个二元状态向量的方法是:简单地按照两个单元活动值的乘积来增加它们之间的权重。

存储规则(状态为 ±1):
Δw_ij = s_i * s_j

这个规则的一个优点是,你只需遍历数据一次就完成了存储。因此,它确实是一种真正的在线学习规则。这是因为它不是基于误差驱动的:你不是在比较预测结果与正确答案,然后进行微调。

它不是一个误差校正规则,这既是其优点也是其弱点。优点在于它可以实现在线学习,但正如我们稍后将看到的,弱点在于这不是一种非常高效的存储方式。

我们也可以设置偏置,通常将偏置视为来自一个永久开启单元的权重。

如果你想使用 0 和 1 作为单元的状态(这是我们后面会用的形式),更新规则只是稍微复杂一点。

存储规则(状态为 0/1):
Δw_ij = (2*s_i - 1) * (2*s_j - 1)
(或者等效地,先将状态转换为 ±1 形式,再应用 ±1 规则)


本节课中我们一起学习了霍普菲尔德网络的基本原理。我们了解到它是一种基于能量函数的循环神经网络,能够通过简单的局部规则收敛到能量最小值,并利用这些最小值来实现内容可寻址的记忆存储。我们还探讨了其顺序更新的必要性、作为记忆模型的优势(如鲁棒性、内容寻址)以及其简单但非误差驱动的学习规则。

11.2:处理伪极小值问题 🧠

在本节课中,我们将探讨霍普菲尔德网络的存储容量限制,特别是由“伪记忆”或“伪极小值”引起的问题。我们将了解这些伪极小值如何形成,以及它们如何限制网络的记忆存储能力。随后,我们将介绍“反学习”这一有趣的概念,并探讨物理学家为提高网络容量而发现的一种更高效的存储规则。

霍普菲尔德网络的存储容量限制 😔

上一节我们介绍了霍普菲尔德网络的基本原理。本节中,我们来看看其作为记忆存储设备时面临的核心限制:存储容量。

霍普菲尔德网络的存储容量受限于所谓的“伪记忆”。当两个相邻的能量极小值合并,在错误的位置产生一个新的极小值时,就会发生这种情况。

使用霍普菲尔德存储规则,对于一个全连接网络,其容量大约为 0.15N 个记忆。这意味着,如果你有 N 个二元阈值单元,在记忆开始相互混淆之前,你大约可以存储 0.15N 个记忆。每个记忆是 N 个单元的一个随机配置,因此包含 N 比特信息。因此,霍普菲尔德网络中存储的总信息量约为 0.15N² 比特。

然而,这种分布式记忆并未高效利用计算机中存储权重所需的比特数。网络使用远超过 0.15N² 比特来存储权重。因此,这种基于局部能量极小值的分布式记忆方式,在比特利用效率上并不高。

我们可以分析,如果高效利用计算机中的比特,理论上应该能存储多少信息。网络中有 N² 个权重。在存储了 M 个记忆后,每个连接权重的整数值范围在 -M 到 M 之间(假设我们使用 -1 和 1 的状态)。以简单方式存储一个连接权重所需的比特数约为 log₂(2M+1)。因此,计算机内存使用的总比特数约为 N² * log₂(2M+1)。请注意,这个容量随 M 呈对数增长,而霍普菲尔德方法得到的容量是一个常数(0.15)。这种对数缩放关系表明,我们理应能做得更好。

容量限制的根源:极小值的合并

那么,是什么限制了霍普菲尔德网络的容量,导致其失效呢?答案是能量极小值的合并。

每次我们记忆一个二元配置时,都希望创建一个新的能量极小值。我们可以将网络的所有可能状态空间水平展示,能量垂直展示。我们可能为蓝色模式有一个能量极小值,为绿色模式有另一个。

但是,如果这两个模式彼此接近,我们将不会得到两个独立的极小值。它们会合并,在中间位置产生一个单一的极小值。这意味着我们无法区分这两个独立的记忆,并且我们回忆起的将是它们的混合体,而非独立的记忆。正是这种附近极小值的合并,限制了霍普菲尔德网络的容量。

需要指出的是,这种图示是一种很大的误导。霍普菲尔德网络的状态实际上是超立方体的角点,将其描绘成连续的一维水平空间并不准确。

一个有趣的解决方案:反学习 💡

在思考如何提高霍普菲尔德网络容量的过程中,产生了一个非常有趣的想法:“反学习”。

这个想法最早由霍普菲尔德、范斯坦和帕尔默提出。他们建议采用以下策略:让网络从一个随机初始状态稳定下来,然后进行“反学习”。也就是说,无论它稳定到哪个二元状态,都对其应用与存储规则相反的操作。

在之前的例子中,那个红色的合并极小值,如果你让网络稳定在那里,并对该合并极小值进行一些反学习,你会重新得到两个独立的极小值,因为你将那个红点“拉高”了。因此,通过消除深的、伪极小值,我们实际上可以增加记忆容量。霍普菲尔德、范斯坦和帕尔默证明了这确实是有效的。

反学习与快速眼动睡眠 🛌

DNA 结构的发现者之一弗朗西斯·克里克和格雷姆·米奇森提出,反学习可能是快速眼动睡眠期间发生的过程。

这个观点是:白天,你存储了许多东西,会产生伪极小值。夜晚,你将网络置于随机状态,使其稳定到一个极小值,然后对你稳定到的状态进行反学习。这实际上解释了一个重大的谜题。

这个谜题似乎没有困扰大多数研究睡眠的人,但它本应如此。每晚,你入睡并会做好几个小时的梦。当你早晨醒来时,那些梦都消失了。当然,并非完全消失。你在醒来前做的梦可以进入短期记忆,你会记得一阵子。如果你仔细回想,可能会记住很长时间。但我们很清楚,如果我们在夜晚的其他时间被叫醒,你当时也一直在做梦。而到了早晨,这些梦就不见了。

所以看起来,你根本没有存储你梦到的内容。问题是,为什么?事实上,你为什么还要做梦呢?做梦是矛盾的,因为你的大脑状态看起来与你清醒时的大脑状态极其相似,只是它并非由真实输入驱动,而是由位于真实输入之后的一个中继站——丘脑——所驱动。

因此,克里克-米奇森理论至少从功能上解释了做梦的意义:即为了消除伪极小值。

反学习的数学问题与解决方案 ➗

但反学习还存在另一个问题,一个更数学化的问题:我们应该进行多少反学习?

根据你目前在本课程中学到的知识,这个问题的真正解决方案是证明:反学习是使模型拟合数据过程的一部分。如果你对该模型进行最大似然拟合,那么反学习将自动从模型拟合中产生。更重要的是,你会确切知道需要进行多少反学习。

因此,我们要尝试的是,将反学习推导为最小化成本函数的正确方法,其中成本函数衡量的是你的神经网络对白天所见数据的建模效果。

提高容量的物理学家方法:感知器收敛程序 🔄

在深入探讨上述方案之前,我想谈谈物理学家发现的提高霍普菲尔德网络容量的方法。正如我所说,这是该领域的一大执念。

最终,一位名叫伊丽莎白·加德纳的聪明学生发现,如果关心容量,实际上有一种更好的存储规则,它能充分利用权重的容量。我想这个存储规则你会很熟悉。

我们不再试图一次性存储向量,而是将要多次循环遍历训练集。这样我们失去了只需遍历数据一次的良好的在线特性,但作为回报,我们可以获得更高效的存储。

我们将要做的是:使用感知器收敛程序来训练每个单元,使其在给定我们想要存储的全局向量中所有其他单元状态的情况下,具有正确的状态。

具体步骤如下:

  1. 将你的网络置于你想要存储的记忆状态。
  2. 然后单独处理每个单元,并判断:在给定所有其他单元状态的情况下,这个单元是否会采用我希望它处于的状态?
  3. 如果会,则保持其输入权重不变。
  4. 如果不会,则按照感知器收敛程序指定的方式更改其输入权重(注意,这些是对权重的整数更改)。
  5. 你可能需要多次执行此操作。当然,如果你给它太多记忆,这个过程可能不会收敛。只有当存在一组权重可以解决问题时,感知器收敛程序才能保证收敛。

假设存在这样的权重,这是在霍普菲尔德网络中存储记忆的一种高效得多的方法。

伪似然与跨领域应用

这项技术也在另一个领域——统计学中得到了发展,统计学家称该技术为“伪似然”。其思想是:在给定所有其他事物的情况下,让一件事变得正确。因此,对于高维数据,如果你想为其建立模型,思路是构建一个模型,该模型试图在给定所有其他维度值的情况下,正确预测一个维度上的值。

感知器收敛程序通常用法与伪似然之间的主要区别在于,在霍普菲尔德网络中,权重是对称的。因此,我们必须为每个权重获取两组梯度并取平均。但除此之外,充分利用霍普菲尔德网络容量的方法就是使用感知器收敛程序并多次遍历数据。


本节课总结

在本节课中,我们一起学习了霍普菲尔德网络存储容量的核心限制——伪极小值的形成与合并。我们探讨了“反学习”这一概念,它不仅能提高网络容量,还被理论用于解释快速眼动睡眠的功能。最后,我们介绍了一种更高效的存储规则,即通过多次迭代和使用感知器收敛程序(或伪似然方法)来充分利用网络权重容量,这标志着从简单一次性存储到迭代优化的重要转变。

11.3:带隐藏单元的霍普菲尔德网络 🧠

在本节课中,我们将学习一种使用霍普菲尔德能量函数的全新方法。我们将为网络添加隐藏单元,并尝试让这些隐藏单元的状态表示对可见单元上感知输入的一种解释。核心思想是,单元之间的权重代表了良好解释所必须满足的约束。通过找到一个低能量状态,我们就能找到对输入数据的一种良好解释。


霍普菲尔德网络的两个核心思想

上一节我们介绍了霍普菲尔德网络的基本概念。霍普菲尔德网络结合了两个核心思想:

  1. 你可以通过使用一个对称连接的二元阈值单元网络来找到局部能量最小值。
  2. 这些局部能量最小值可能对应着记忆。

然而,利用寻找局部最小值的能力,还有另一种不同的方式。

我们不是用网络来存储记忆,而是用它来构建对感知输入的解释。其思想是,输入由一些可见单元表示,而我们在隐藏单元集合中构建对该输入的解释。因此,对输入的解释或说明将是隐藏单元上的一个二元配置。

整个系统的能量将代表该解释的“糟糕程度”。因此,为了根据我们当前对世界的模型(该模型体现在能量函数中)获得良好的解释,我们需要在给定由可见单元表示的输入的情况下,找到隐藏单元的低能量状态。


一个具体的感知解释示例 👁️

为了让这个想法更清晰,我想举一个例子。为了说明这个例子,我需要稍微详细地解释一下,当你在图像中看到一条二维线段时,你能推断出关于三维世界的什么信息。

图像中的一条二维线段,可能由世界中许多不同的三维边缘所导致。如果我们假设世界中的一条笔直三维边缘是图像中一条笔直二维线段的原因,那么我们就丢失了该三维边缘的两个自由度,即其两端的深度。因此,存在一整个三维边缘家族,它们都对应于同一条二维线段。你一次只能看到这些三维边缘中的一个,因为它们会互相遮挡。

现在,我们可以通过一个小例子来看看,如果你能利用找到二元单元网络低能量状态的能力来帮助寻找感知输入的解释,你可能会做什么。


构建解释网络:从2D到3D

以下是构建解释网络的步骤:

我们想象看到一幅线条画,并希望将其解释为一个三维物体。我们拥有的数据,假设是一束二维线段,就像图中显示的线条那样。对于每一条可能的线段,我们都预留了一个神经元(暂时不必担心这需要太多神经元的问题)。在任何一幅图片中,只有少数可能的线段会出现,因此我们只会激活那些神经元中的少数几个。图中我展示了激活两个神经元的两条边缘,这些神经元代表二维线段,即感知数据。

接下来,我们将拥有一大堆三维线段单元,每一个对应一条可能的三维线段或三维边缘。每一个二维线段单元,可能是许多不同可能的三维线段的投影。因此,我们需要让二维线段单元去兴奋那些三维线段单元,但同时我们也需要让它们彼此竞争,因为你一次只能看到其中一个。

这里有一个例子,我有一组三维线段单元。绿色的连接是来自二维线段单元的兴奋性连接,它们都具有相同的权重,表示“如果这条线段存在,我将尝试激活所有这些三维单元”。但此外,我们需要在这些单元之间建立竞争,以便只有一个会被激活,这就是红线所代表的。我们对每个二维线段单元都这样做(图中只展示了当前活跃的二维线段单元的情况,同样,暂时不必担心这需要太多单元的问题)。


整合三维世界的约束

现在,故事还不完整。我们已经将关于投影的信息(即上一张幻灯片展示的:每条二维线段可以对应许多不同的三维边缘,但一次只能出现一个)通过绿色和红色的连接“连接”到了神经网络中。但是,我们还知道很多关于三维边缘如何连接的知识。

例如,当我们看到图像中两条二维线段相连时,我们几乎可以肯定它们对应的边缘在连线点处具有相同的深度。因此,我们期望在图像中重合的二维线段,对应于在该点深度一致的三维边缘。我们会加入许多这样的连接。

我们还可以利用一个更强的效应:在我们制造的世界中,我们期望三维边缘经常以直角连接。因此,对于恰好深度一致并以直角连接的两条特定三维边缘,我们会加入一个特别强的连接(图中用更粗的绿线表示)。

通过加入许多这样的连接,我们可以表明我们期望三维边缘如何组合在一起,形成一个连贯的三维物体。


网络的解释能力与内克尔立方体

现在,我们有了一个网络,它包含了关于边缘在世界上如何组合以及边缘如何投影以在图像中产生线段的信息。因此,如果我们给这个网络一幅图像,它应该能够提出对该图像的一种解释。

对于我展示给你的这幅图像,存在两种相当不同的解释。它被称为内克尔立方体。如果你盯着它看足够久,它在深度上会对你产生翻转。而这个网络将会有两个能量深度几乎相等的极小值,分别对应内克尔立方体的那两种解释。

请记住,这一切只是一个类比,旨在帮助你理解使用低能量状态作为感知数据解释这一理念。要实际构建一个描述内克尔立方体翻转时发生什么的恰当模型,会比这复杂得多。


使用低能量状态的两个关键问题 ❓

如果我们决定使用低能量状态来表示良好的感知解释,那么我们面临两个问题。

第一个问题与搜索有关,我将在下一个视频中讨论。搜索问题是:我们如何避免隐藏单元陷入能量函数的不良局部极小值?这些不良极小值代表了根据我们网络中权重的当前模型来看是次优的解释。我们能否做得比从某个随机初始状态简单地沿着能量下坡更好?

第二个问题,看起来甚至更困难,是我们如何学习隐藏单元之间以及可见单元与隐藏单元之间连接的权重?是否存在一种简单的学习算法来调整所有这些权重,以便我们得到合理的感知解释?请注意,这里我们没有任何监督者,我们只是向它展示输入,我们希望它在隐藏单元中构建出代表合理解释的活动模式。

这似乎是一个相当高的要求。


本节课总结 📝

本节课中,我们一起学习了霍普菲尔德网络的一种新颖应用:利用其能量函数和隐藏单元来为感知输入构建解释。我们通过从2D线段推断3D边缘的具体例子,阐述了如何将关于世界(如投影几何、边缘连接约束)的知识编码到网络的连接权重中,从而使网络的低能量状态对应于对输入数据的合理解释。最后,我们指出了实现这一目标所面临的两个核心挑战:如何有效搜索以避免不良局部极小值,以及如何在没有监督的情况下学习到合适的连接权重。这为后续讨论更强大的模型(如玻尔兹曼机)奠定了基础。

11.4:使用随机单元改进搜索 🔍

在本节课中,我们将学习如何通过向系统中添加噪声来帮助其逃离局部最小值,并了解如何在霍普菲尔德网络中实现这一点。

概述:噪声如何帮助搜索

上一节我们介绍了霍普菲尔德网络及其能量最小化的特性。本节中我们来看看,这种确定性更新规则如何导致网络陷入局部最小值,以及如何通过引入噪声来改进搜索过程。

一个霍普菲尔德网络总是做出降低能量的决策。如果它不改变单元的状态,能量则保持不变。这使得网络不可能从局部最小值中爬升出来。

观察这里的能量景观。如果我们陷入局部最小值A,我们将无法越过能量壁垒到达更好的最小值B,因为我们无法在能量上坡。如果我们引入随机噪声,就可以逃离较差的极小值,特别是那些周围没有高能量壁垒的浅层极小值。

事实证明,最有效的策略不是使用固定的噪声水平,而是从大量噪声开始。这允许你在宏观尺度上探索空间,并找到空间中普遍较好的区域,然后逐渐降低噪声水平。在大量噪声下,你可以跨越大的壁垒;随着噪声水平的降低,你开始专注于附近的最佳极小值。

如果你缓慢地降低噪声,使系统最终陷入一个深层的极小值,这被称为模拟退火。这个想法由Kirkpatrick提出,时间大约与霍普菲尔德网络的提出同期。

模拟退火的原理

模拟退火的原因在于,物理系统中的温度(或具有能量函数的模拟系统中的温度)会影响状态转移的概率。

在一个高温系统中,从B到A上坡的概率低于从A到B下坡的概率,但差距并不大。实际上,温度使能量景观变得平坦。这里的小黑点代表粒子。我们想象粒子根据能量函数和温度决定的转移概率移动。

这可能是系统在高温下运行的典型分布,此时容易跨越壁垒,但一旦到达深层极小值,也难以停留。如果系统在更低的温度下运行,跨越壁垒的概率会小得多,但概率比会好得多。从A到B的概率与从B到A的概率之比,在低温系统中要好得多。

因此,如果我们运行足够长的时间,我们期望所有粒子最终都聚集在B。但如果我们只在低温下长时间运行,粒子从A逃逸将需要非常长的时间。一个好的折衷方案是从高温开始,然后逐渐降低温度。

在霍普菲尔德网络中引入噪声

我们将二元阈值单元替换为做出随机决策的二元随机单元,从而将噪声引入霍普菲尔德网络。噪声量由一个称为温度的参数控制,你将在稍后的公式中看到。提高噪声水平相当于减小所有配置之间的能量差。

以下是我们的标准逻辑方程,但能量差被温度缩放:

p_i = 1 / (1 + exp(-ΔE_i / T))

如果温度非常高,指数项将趋近于0,因此等式右侧将约为 1 / (1+1),单元开启的概率将约为二分之一。单元将大致均等地处于开启和关闭状态。

随着我们降低温度,根据ΔE的符号,单元将变得越来越坚定地开启或关闭。在温度为0时(即我们在霍普菲尔德网络中使用的),ΔE的符号决定了等式右侧是变为0还是1。当T=0时,右侧要么是0要么是1,因此单元将表现出确定性行为,这就是一个总是采用两个状态中能量较低状态的二元阈值单元。

能量差我们在之前的幻灯片中见过,它就是整个系统在单元i关闭或开启时的能量之差。

关于模拟退火的说明

虽然模拟退火是改进陷入局部最优搜索的一种非常强大的方法,并且对引导玻尔兹曼机器的思想产生了影响,但它实际上分散了我们对玻尔兹曼机器的理解。因此,本课程中我将不再讨论它,尽管它是一个非常有趣的想法。

从现在开始,我将使用温度为1的二元随机单元。也就是说,使用能量差的标准逻辑函数。

理解热平衡概念

为了理解玻尔兹曼机器的学习过程,你需要理解的一个概念是热平衡。因为我们设定温度为1,所以它是在固定温度下的热平衡概念。这是一个困难的概念。

大多数人认为这意味着系统已经稳定下来,不再变化。这通常是“平衡”的含义。但稳定下来的不是单个单元的状态。在热平衡下,除非温度为0,否则单个单元仍在随机变化。

稳定下来的是配置的概率分布。这是你第一次遇到时的难点概念,因此我将给你一个例子。

概率分布会稳定到一个特定的分布,称为平稳分布。这个平稳分布由系统的能量函数决定。事实上,在平稳分布中,任何配置的概率与其能量的负指数成正比:P(config) ∝ exp(-E(config))

思考热平衡的一个直观方式是,想象一个由许多相同系统组成的巨大集合,这些系统都具有完全相同的能量函数。想象大量具有相同权重的随机霍普菲尔德网络。在这个巨大的集合中,我们可以将一个配置的概率定义为处于该配置的系统所占的比例。

接近热平衡的过程

现在我们可以理解接近热平衡时发生了什么。我们可以从这些相同系统上的任何分布开始。我们可以让它们都处于相同的配置,即一个配置的概率为1,其他所有配置的概率为0。或者我们可以让它们在每个可能配置中的系统数量相等,即均匀分布。

然后,我们将持续应用随机更新规则。在随机霍普菲尔德网络的情况下,这意味着你选择一个单元,查看其能量差,并基于该能量差随机决定是将其开启还是关闭。然后你选择另一个单元,依此类推。

我们持续以这种方式随机运行系统。最终,我们可能会达到一种状态,即每个配置中的系统比例保持恒定。事实上,如果我们有对称连接,就会发生这种情况。这就是平稳分布,物理学家称之为热平衡。

任何给定的系统都会不断改变其配置。我们应用更新规则,其单元的状态将在0和1之间不断翻转。但处于任何特定配置的系统比例不会改变。这是因为我们拥有的系统数量远远多于配置数量。

一个类比

以下是一个类比,以帮助理解这个概念。想象拉斯维加斯一个非常大的赌场,里面有很多发牌员。事实上,我们拥有的发牌员数量远多于52!(52的阶乘)个。

我们开始时,所有牌包都处于制造商出厂时的标准顺序(假设是黑桃A、黑桃K、黑桃Q……)。然后所有发牌员开始洗牌。他们进行随机洗牌,而不是那种能让牌序恢复原样的花式洗牌。

洗了几次之后,在任何给定的牌包中,黑桃K紧挨着黑桃Q的可能性仍然很大。因此,牌包还没有忘记它们的起始顺序。它们的初始顺序仍然影响着当前顺序。

如果我们持续洗牌,最终初始顺序将变得无关紧要。牌包将忘记它们从哪里开始。事实上,在这个例子中,在52!种可能的顺序中,每种顺序的牌包数量将相等。一旦发生这种情况,如果我们继续洗牌,在52!种顺序中的每一种,牌包数量仍然相等。

这就是为什么它被称为平衡。因为处于任何一种配置的比例不会改变,即使单个系统仍在变化。

这个类比的一个不足之处在于,一旦我们在这里达到平衡,所有配置都具有相等的能量,因此它们都具有相同的概率。通常,我们感兴趣的是为那些某些配置能量低于其他配置的系统达到平衡。

总结

本节课中我们一起学习了如何通过将霍普菲尔德网络中的确定性单元替换为随机单元来引入噪声,从而帮助网络逃离局部最小值。我们探讨了模拟退火的基本思想,即从高温(高噪声)开始并逐渐降温以找到更好的能量最小值。更重要的是,我们引入了热平衡这一核心概念,它描述了当大量相同系统随机运行时,系统配置的概率分布达到并保持稳定的状态,即使单个系统的状态仍在不断变化。理解热平衡是学习后续玻尔兹曼机器的基础。

11.5:玻尔兹曼机如何建模数据 🔍

在本节课中,我们将学习玻尔兹曼机如何为一组二进制数据向量建立模型。我们将探讨建模二进制数据的目的、模型的应用场景,并详细解释玻尔兹曼机中权重如何决定分配给每个二进制数据向量的概率。


为何需要建模二进制数据向量? 🤔

带有隐藏单元的随机霍普菲尔德网络,也称为玻尔兹曼机,擅长对二进制数据进行建模。给定一组二进制训练向量,它们可以利用隐藏单元来拟合一个模型,该模型为每一个可能的二进制向量分配一个概率。

以下是需要此类模型的几个原因:

  • 分类任务:如果你拥有几种不同类型的二进制向量分布,你可能希望观察一个新的二进制向量,并判断它来自哪个分布。例如,对于不同类型的文档,你可以用一组二进制特征(每个特征表示某个特定词在文档中是否出现)来表示一个文档。不同类型的文档,其词汇出现频率和词汇间的相关性也不同。你可以为每类文档使用一组隐藏单元来建模其分布,然后通过计算新文档向量最可能由哪类文档分布生成,来为其分配类别。
  • 异常检测:你也可以使用玻尔兹曼机来监控复杂系统,以检测异常行为。例如,假设你有一个核电站,所有仪表读数都是二进制的。你希望系统能注意到它进入了异常状态——一种你从未见过的状态。由于你不可能拥有系统爆炸状态的样本,因此不能使用监督学习。相反,你可以通过建立一个正常状态模型,然后注意到当前状态与正常状态不同来实现异常检测。

两种建模方式:因果模型与能量模型 ⚖️

上一节我们介绍了建模二进制数据的目的,本节中我们来看看两种主要的建模方式。

因果生成模型

生成二进制向量最自然的方式是首先生成一些潜在变量的状态,然后利用这些潜在变量来生成二进制向量。这是一个因果模型,包含两个顺序步骤:

  1. 首先,根据先验分布选择潜在变量(或隐藏单元)的状态。在因果模型中,这些变量在先验中通常是独立的。
  2. 一旦选定了隐藏单元的状态,就利用它们通过加权连接来生成可见单元的状态。

这是一个使用逻辑单元的神经网络因果生成模型。它使用隐藏单元的偏置和隐藏单元与可见单元之间的连接权重,为每个可能的可见向量分配概率。

生成特定可见向量 V 的概率,是对所有可能的隐藏状态 H 求和:P(V) = Σ_H [ P(H) * P(V|H) ]。因子分析就是一个使用连续变量的因果模型示例。

能量基础模型:玻尔兹曼机

玻尔兹曼机是一种基于能量的模型。在这类模型中,数据不是以因果方式生成的,它不是因果生成模型。相反,一切定义都基于可见单元和隐藏单元联合配置的能量。

有两种方式可以将联合配置的能量与其概率联系起来:

  1. 定义方式:直接定义联合配置的概率与其能量的负指数成正比。
  2. 过程方式:通过定义网络在更新所有随机二元单元足够多次以达到热平衡后,处于该状态的概率。

好消息是,这两种定义是一致的。

一个联合配置 {V, H}负能量(为简化符号,此处列出负能量)包含以下项:
-E(V, H) = Σ_i b_i v_i + Σ_k b_k h_k + Σ_{i<j} v_i v_j w_{ij} + Σ_{i,k} v_i h_k w_{ik} + Σ_{k<l} h_k h_l w_{kl}

其中:

  • v_i, h_k 是单元的二值状态(0或1)。
  • b_i, b_k 是偏置。
  • w_{ij}, w_{ik}, w_{kl} 是连接权重。

我们使用能量来定义概率的方式如下:可见与隐藏单元的联合配置概率为 P(V, H) = exp(-E(V, H)) / Z,其中 Z 是归一化常数(配分函数),需要对所有可能的可见和隐藏单元配置求和:Z = Σ_{V', H'} exp(-E(V', H'))

要得到仅可见单元配置的概率,必须对所有可能的隐藏单元配置求和:P(V) = Σ_H exp(-E(V, H)) / Z


计算示例:理解概率分配 🧮

仅仅看公式可能不够直观,让我们通过一个计算示例来更好地理解玻尔兹曼机如何为可见向量分配概率。

考虑一个简单的网络:2个可见单元,2个隐藏单元。为简化,忽略偏置,并且可见单元之间不连接。我们有三条权重:w(v1-h1)=2, w(v1-h2)=-1, w(v2-h1)=1

以下是计算 P(V) 的步骤:

  1. 列出所有联合配置:每个可见向量(4种可能)对应4种隐藏单元状态,共16种联合配置。
  2. 计算每种联合配置的负能量 -E(V, H):根据公式计算。例如,当所有单元都为1时,-E = 2*1*1 + (-1)*1*1 + 1*1*1 = 2
  3. 计算未归一化概率 exp(-E(V, H)):对每个负能量取指数。
  4. 计算配分函数 Z:将所有 exp(-E) 值相加。
  5. 计算联合配置概率:每个 exp(-E) 除以 Z
  6. 计算可见向量概率 P(V):对每个可见向量,将其对应的4种隐藏状态的联合概率相加。

通过这个具体计算,你可以清晰地看到权重如何影响最终的 P(V)


从模型中采样与后验分布采样 🔄

上一节我们通过一个小例子手动计算了概率,但对于大型网络,由于配置空间是指数级的,我们无法进行精确计算。

从模型分布中采样

当网络很大时,我们无法直接计算配分函数 Z。但我们可以使用马尔可夫链蒙特卡洛方法从模型中获取样本。具体步骤如下:

  1. 从一个随机的全局配置开始。
  2. 随机选择一个单元,根据该单元在当前网络状态下翻转(0变1或1变0)的能量差,以随机方式(通常使用逻辑函数)决定是否更新其状态。能量差由网络中所有其他单元的当前状态决定。
  3. 重复步骤2足够多次,直到马尔可夫链达到平稳分布

此时获得的样本即来自模型分布,样本的概率遵循玻尔兹曼分布:P(样本) ∝ exp(-E(样本))

从给定数据向量的后验分布中采样

在学习和推理中,我们常常需要知道:给定一个观测到的数据向量 V,隐藏单元的可能状态(即“解释”)分布是怎样的。这个分布就是后验分布 P(H|V)

同样,由于可能的隐藏配置数量是指数级的,我们使用MCMC进行采样。过程与从模型采样类似,但有一个关键区别:

  • 将可见单元钳制到给定的数据向量 V
  • 在MCMC更新过程中,只更新隐藏单元,可见单元的状态保持不变。

这样,采样过程就会从后验分布 P(H|V) 中抽取样本。我们需要这个后验样本,既是为了找到对观测数据的一个良好“解释”,也是为了后续的权重学习算法(如对比散度)提供必要的信息。


总结 📝

本节课中我们一起学习了玻尔兹曼机如何对二进制数据进行建模。

  • 我们首先了解了为二进制数据建立概率模型的应用,如文档分类和复杂系统异常检测。
  • 接着,我们对比了因果生成模型能量基础模型(玻尔兹曼机)这两种不同的建模范式。玻尔兹曼机通过定义联合配置的能量来分配概率,其概率公式为 P(V, H) ∝ exp(-E(V, H))
  • 通过一个包含2个可见单元和2个隐藏单元的小型网络示例,我们逐步演示了如何根据权重计算每个可见向量的概率,这有助于直观理解模型的工作原理。
  • 最后,针对大型网络,我们介绍了如何使用马尔可夫链蒙特卡洛方法从模型分布 P(V) 中采样,以及如何通过钳制可见单元来从后验分布 P(H|V) 中采样。这些采样技术是训练和运用大型玻尔兹曼机的关键。

12.1:玻尔兹曼机学习算法 🔍

在本节课中,我们将学习玻尔兹曼机的学习算法。这是一个具有优雅理论基础的简单学习规则,但在实践中曾被认为效率低下。我们将探讨其工作原理、数学形式以及实际应用中的挑战。

概述

上一节我们介绍了玻尔兹曼机如何作为二进制数据向量的概率模型。本节中,我们来看看玻尔兹曼机的学习算法。

学习算法基础

玻尔兹曼机学习算法是一种无监督学习算法。与使用反向传播的典型场景不同(在反向传播中我们提供输入向量和期望输出),在玻尔兹曼机学习中,我们只提供输入向量,没有标签。

算法的目标是建立一组输入向量的模型(更准确地说,可以将其视为输出向量)。我们希望最大化玻尔兹曼机分配给训练集中二进制向量的概率乘积。这等价于最大化玻尔兹曼机分配给训练向量的对数概率之和。

学习困难与解决方案

学习过程可能面临许多困难,其中最重要的原因可以通过以下示例理解:

考虑一个隐藏单元链,两端连接着可见单元。如果训练集包含[1,0][0,1](即我们希望两个可见单元处于相反状态),实现这一目标的方法是确保所有权重的乘积为负。

这意味着,在考虑学习权重W1时,我们需要知道其他权重(如W3)的信息。令人惊讶的是,存在一个非常简单的学习算法,且该算法只需要局部信息。

学习规则推导

实际上,每个权重需要了解的所有其他权重和数据信息,都包含在两个相关性的差异中。换句话说,如果我们取玻尔兹曼机分配给可见向量V的对数概率,并求其对权重W_ij的导数,结果是两个期望值的差:

公式: ∂logP(V)/∂W_ij = ⟨s_i s_j⟩_data - ⟨s_i s_j⟩_model

其中:

  • 第一项:当网络在可见单元上固定V并达到热平衡时,单元ij状态乘积的期望值
  • 第二项:当没有固定任何数据,网络在无外部干扰下达到热平衡时,相同两个单元状态乘积的期望值

因此,权重的变化可以设置为与这两个项的差成比例。

学习规则解释

这是一个非常有趣的学习规则。第一项表示:按呈现数据时单元活动的乘积比例增加权重。这是赫布学习规则的最简单形式。

但如果只使用这一规则,突触强度会不断增强,所有权重都会变得非常正,整个系统会失控。学习算法通过使用第二项来保持控制:按从模型分布中采样时这两个单元同时激活的频率比例减少权重。

理论依据

一个明显的问题是:为什么导数如此简单?原因在于,在热平衡时全局配置的概率是其能量的指数函数:P ∝ e^(-E)

能量函数在权重上是线性的,因此权重和对数概率之间存在线性关系。具体来说,能量对特定权重W_ij的导数正好是该权重连接的两个活动的乘积。

正负相的作用

正相学习规则的第一项是减小求和式中已经较大的项的能源,它通过固定向量V达到热平衡来找到这些项。负相学习则对配分函数(归一化项)做同样的事情:找到给出低能量的全局配置,然后尝试提高它们的能量,使它们贡献更少。

因此,第一项使分子变大,第二项使分母变小。

统计收集方法

为了运行这个学习规则,需要收集两种统计量:正统计量(当数据固定在可见单元上时)和负统计量(当没有固定数据时,用于"反学习")。

以下是收集这些统计量的低效方法:

正相收集步骤:

  1. 将数据向量固定在可见单元上
  2. 将隐藏单元设置为随机二进制状态
  3. 一次更新一个隐藏单元,直到网络在温度为1时达到热平衡
  4. 采样两个单元同时激活的频率
  5. 对所有可见向量重复此过程

负相收集步骤:

  1. 不固定任何数据,网络不受外部干扰
  2. 将所有单元(可见和隐藏)设置为随机二进制状态
  3. 一次更新一个单元,直到网络在温度为1时达到热平衡
  4. 采样每对单元ij的相关性
  5. 多次重复此过程

实践挑战

在负相中,期望能量景观有许多不同但能量相近的最小值。这是因为我们使用玻尔兹曼机来建模像图像集合这样的数据,期望存在多个合理的图像(都具有相似的低能量)和许多不合理的高能量图像。

因此,只有一小部分空间是这些低能量状态,而大部分空间是糟糕的高能量状态。当存在多个模式时,不清楚需要重复这个过程多少次才能充分采样这些模式。

总结

本节课中我们一起学习了玻尔兹曼机学习算法的基本原理。我们了解到该算法通过正相(数据固定)和负相(自由运行)的统计差异来更新权重,从而学习数据的概率分布。虽然基础算法理论上优雅,但在实践中存在采样效率低下的问题,这为后续改进算法提供了方向。

12.2:获取统计量的更高效方法 🔍

在本节课中,我们将深入探讨如何通过巧妙的方法,加速玻尔兹曼机的学习算法。具体来说,我们将学习如何让马尔可夫链保持在平衡分布附近,以及如何使用所谓的“平均场方法”。请注意,本节内容较为深入,不属于课程核心考核范围,初学者可以安全跳过。本教程专为那些对深度玻尔兹曼机高效工作原理感兴趣的学习者准备。

概述 📋

传统的玻尔兹曼机学习算法在收集统计量时效率较低。本节将介绍两种改进方法:使用持久化粒子进行“热启动”,以及基于“单模态”假设的平均场近似法。这些方法能显著提升学习速度,尤其是在处理深度架构时。

持久化粒子方法 🔄

上一节我们介绍了基础的学习算法,本节中我们来看看如何通过“持久化粒子”来更高效地收集统计量。

特瑞诺夫斯基和我最初提出的方法存在两个问题:从随机状态开始可能需要很长时间才能达到热平衡;并且无法轻易判断是否已达到平衡。因此,我们不知道需要运行链多久。

核心思想是:为什么不从上一次看到特定数据向量时结束的状态开始呢?我们记住数据向量在隐藏单元中的解释(即状态),并从此处开始。这个存储的状态被称为一个“粒子”。

使用持久化的粒子能提供一个“热启动”,并带来巨大优势:如果之前处于平衡状态,并且权重只更新了一点点,那么只需要对粒子中的单元进行几次更新,就能使其回到平衡状态。

我们可以为两个阶段都使用粒子:在正相阶段(当数据向量被钳制时)和在负相阶段(当没有钳制时)。

以下是拉福德·尼尔在1992年引入的收集统计量的方法:

在正相阶段,你有一组数据特定的粒子。每个训练案例对应一个或几个粒子。每个粒子都有一个当前值,即隐藏单元的配置以及与之关联的数据向量。你在每个粒子中,将相关数据向量钳制住,然后对所有隐藏单元进行几次顺序更新。接着,对于每一对相连的单元,你在所有这些粒子上平均两个单元同时开启的概率。

在负相阶段,你保留一组幻想粒子。这些是全局配置。同样,在每次权重更新后,你在每个幻想粒子中对所有单元进行几次顺序更新(此时也会更新可见单元)。然后,对于每一对相连的单元,你在所有幻想粒子上平均 S_i * S_j 的值。

学习规则是:权重的变化量与(在所有训练数据上平均得到的“数据平均”)和(在无钳制时幻想粒子得到的“幻想平均”)之差成正比。

这种方法比我和特瑞诺夫斯基引入的学习规则效果更好,至少对于全批次学习是如此。然而,这种方法难以应用于小批次学习。

原因是:如果我们使用小批次学习,等到再次看到同一个数据向量时,权重已经被更新了很多次。因此,为该数据向量存储的数据特定粒子,在新的权重下,将不再接近热平衡。我们也不知道需要再运行多久才能重新接近平衡。

平均场近似法 ⚖️

为了解决小批次学习的问题,我们可以对世界的理解做出一个强假设。这是一种认识论上的假设:我们假设当一个数据向量被钳制时,好的解释集合(即作为该数据向量解释的隐藏单元状态)是单模态的。

这意味着,对于一个给定的数据向量,不存在两种非常不同的解释。我们假设对于感官输入,存在一个正确的解释。如果我们有一个好的数据模型,我们的模型会为该数据点给出一个能量最小值。

这是对我们愿意学习模型种类的一种限制。我们将使用一种无法学习“一个数据向量具有多种非常不同解释”的模型的学习算法。

只要我们愿意做出这个假设,我们就可以使用一种非常高效的方法来接近热平衡(或热平衡的近似)。这被称为平均场近似。

为了获得正确的统计量,我们需要随机且顺序地更新单元。更新规则是:单元i开启的概率是它从其他单元接收的总输入及其偏置的逻辑斯蒂函数。这里,S_j(另一个单元的状态)是一个随机的二值量。

现在,我们不使用那个规则,而是说:我们不为单元i保留二值状态,而是保留一个0到1之间的实数值,我们称之为概率。这个概率在时间T+1将是逻辑斯蒂函数的输出,输入是偏置加上所有其他单元在时间T的概率乘以权重的总和。

因此,我们用实值概率替换了这个随机的二值量。这并不完全正确,因为这个随机的二值量位于一个非线性函数内部。如果它是线性函数,那就没问题。但由于逻辑斯蒂函数是非线性的,当我们在内部放入概率而不是波动的二值量时,我们得不到正确答案。

然而,它效果相当好。它可能会因为给我们双相振荡而出错,因为现在我们要并行更新所有东西。我们通常可以通过使用所谓的阻尼平均场来处理这些振荡。在阻尼平均场中,我们计算P_i(T+1),但我们不会完全到达那里,而是前往当前位置和更新规则指示位置之间的一个点。具体来说,我们会前往 λ * 当前位置 + (1 - λ) * 更新规则指示的位置,这将消除振荡。

现在,我们可以为玻尔兹曼机获得一个高效的小批次学习过程。这是鲁斯·萨拉赫丁诺夫意识到的方法。

在正相阶段,我们可以将所有概率初始化为0.5。我们将数据向量钳制在可见单元上。然后,我们使用平均场并行更新所有隐藏单元,直到收敛。对于平均场,当概率停止变化时,你就可以识别出收敛。一旦收敛,我们为每一对相连的单元记录 P_i * P_j

在负相阶段,我们做之前做的事情。我们保留一组幻想粒子,每个粒子都有一个作为全局配置的值。在每次权重更新后,我们在每个幻想粒子中顺序更新所有单元几次。然后,对于每一对相连的单元,我们在所有幻想粒子上平均这些随机的二值量 S_i * S_j。这些平均值之间的差异就是学习规则。也就是说,我们按与该差异成正比的量改变权重。

深度玻尔兹曼机架构 🏗️

如果我们想让幻想粒子的更新更加并行,我们可以改变玻尔兹曼机的架构。

我们将采用一种特殊的架构,允许对幻想粒子进行交替并行更新。我们在同一层内没有连接,也没有跨层跳跃连接,但我们允许自己有很多隐藏层。因此,架构看起来像这样。我们称之为深度玻尔兹曼机。它实际上是一个带有许多缺失连接(所有跳跃连接)的通用玻尔兹曼机。如果这些连接存在,我们就没有真正的层了,它将只是一个通用的玻尔兹曼机。

但在这种特殊架构中,我们可以做一些很好的事情。例如,给定可见单元和第二隐藏层的当前状态,我们可以更新第一隐藏层和第三隐藏层的状态。然后我们可以更新可见单元和第二隐藏层的状态。然后我们可以返回并更新其他状态,如此反复。因此,我们可以并行更新所有单元的一半状态,这将是一个正确的更新。

那么一个问题来了:如果我们有一个像那样的深度玻尔兹曼机,通过使用平均场进行正相,并通过在负相中交替更新偶数和奇数层来更新幻想粒子进行训练,我们能否学习到像MNIST数字甚至更复杂事物的良好模型?

判断是否学到了一个好模型的一种方法是:在学习之后,你移除所有输入,只从你的模型中生成样本。你运行马尔可夫链很长时间直到它“燃烧”完成,然后查看你得到的样本。鲁斯·萨拉赫丁诺夫使用深度玻尔兹曼机,通过平均场进行正相,以及通过交替更新粒子各层进行负相,来建模MNIST数字。

真实数据看起来是这样的。而他从模型中得到的数据看起来是这样的。你可以看到它们实际上相当相似。模型产生的东西非常像MNIST数字。所以它学到了一个相当好的模型。

一个有趣的谜题与洞察 🧩

这里有一个谜题:当他学习时,他使用的是包含100个数据示例的小批次,并且也使用了100个幻想粒子。同样的100个幻想粒子用于每一个小批次。

谜题是:我们如何仅用100个负样本来表征整个空间的负统计量?对于所有有趣的问题,全局配置空间将是高度多模态的。我们如何设法仅用100个粒子来找到并代表所有的模式?

对此有一个有趣的答案:学习过程与用于收集负统计量的马尔可夫链(即用于更新幻想粒子的链)相互作用。这种相互作用使其具有更高的有效混合率。

这意味着,我们不能通过认为存在一个更新权重的外循环和一个在固定权重下收集统计量的内循环来分析学习过程。学习正在影响那个内循环的有效性。

原因是:每当幻想粒子的数量超过正数据时,能量表面就会被抬高。这对马尔可夫链的混合率有影响。它使得幻想粒子过度活跃地四处奔走,它们移动的速度比由当前静态权重定义的马尔可夫链的混合率快得多。

下面这张图展示了正在发生的情况:如果能量表面中有一个模式拥有的幻想粒子比数据多,那么能量表面将被抬高,直到幻想粒子逃离那个模式。因此,左边的模式有四个幻想粒子和只有两个数据点。所以学习的效果将是抬高那里的能量。那个能量壁垒对于我们的马尔可夫链来说可能太高而无法跨越,因此混合率会非常慢。但学习实际上会通过抬高最小值,将这些红色粒子从那个能量最小值中“溅出”。它会被填满,幻想粒子会逃离并去往其他地方的其他深最小值。

因此,我们可以逃离马尔可夫链无法逃离的最小值(至少在合理时间内)。所以这里发生的是,能量表面实际上被用于两个不同的目的:能量表面代表我们的模型,但它也被学习算法操纵,以使马尔可夫链混合得更快,或者更准确地说,达到更快混合的马尔可夫链的效果。

一旦幻想粒子填满了一个“坑”,它们就会冲向下一个地方去处理下一个问题。一个类比是:它们就像调查记者,一旦某个糟糕问题因曝光而被解决,它们不会说“哦,现在一切都好了”,而是立即冲去寻找下一个糟糕问题。

总结 ✨

本节课中我们一起学习了提升玻尔兹曼机学习效率的两种高级策略。首先,持久化粒子方法通过“热启动”加速了马尔可夫链达到平衡的过程,尤其适用于全批次学习。其次,基于单模态假设的平均场近似法,通过用概率值代替二值状态并进行并行更新,为小批次学习提供了高效的解决方案。我们还探讨了深度玻尔兹曼机的特殊架构如何支持交替并行更新,并揭示了学习过程与幻想粒子马尔可夫链之间有趣的相互作用——学习本身能抬高能量面,帮助粒子逃离局部极小值,从而间接加速了混合过程。这些方法使得训练更深的模型并获取有意义的生成样本成为可能。

12.3:受限玻尔兹曼机 🧠

在本节课中,我们将要学习一种名为“受限玻尔兹曼机”的神经网络模型。这种模型具有简化的架构,使得学习和推断过程变得更加容易。我们将从它的基本结构开始,逐步深入到其高效的学习算法。

概述

受限玻尔兹曼机是一种简化的玻尔兹曼机。它的主要特点是隐藏单元之间没有连接。这种结构使得在给定可见单元状态时,能够非常容易地计算出隐藏单元的平衡分布。

架构与优势

上一节我们介绍了玻尔兹曼机的基本概念,本节中我们来看看受限玻尔兹曼机的具体结构。

在受限玻尔兹曼机中,我们通过限制网络的连接性来简化推断和学习过程。它只有一层隐藏单元,并且隐藏单元之间没有连接。可见单元之间也没有连接。因此,其架构看起来是一个二分图:包含两个部分,每个部分内部没有连接。

RBM的一个优点是,如果你将一个数据向量固定在可见单元上,你可以一步就达到热平衡。这意味着在数据向量固定的情况下,我们可以快速计算 V_i H_j 的期望值。因为我们可以精确计算第 j 个隐藏单元激活的概率,并且这个概率独立于隐藏层中的所有其他单元。

j 个隐藏单元激活的概率,仅仅是它从可见单元接收到的输入的逻辑函数,完全独立于其他隐藏单元在做什么。因此,我们可以并行计算所有隐藏单元的概率,这是一个巨大的优势。

构建密度模型的算法

如果你想为一组二进制向量建立一个好的模型,那么用于受限玻尔兹曼机的正确算法是由Tieleman在2008年提出的,它基于Neil的早期工作。

以下是该算法的两个阶段:

  • 正相:将一个数据向量固定在可见单元上。然后为所有可见单元和隐藏单元对计算 V_i H_j 的期望值。因为 V_i 是固定的,并且你可以精确计算 P_j,所以可以做到这一点。接着,对于每一对连接的单元,你在小批次的所有数据向量上平均 V_i H_j 的期望值。
  • 负相:保留一组“幻想粒子”,即全局配置。然后通过使用交替并行更新,对每个幻想粒子进行几次更新。在每次权重更新后,你对幻想粒子进行少量更新,这应该能使它们回到接近平衡的状态。然后,对于每一对连接的单元,你在所有幻想粒子上平均 V_i H_j,从而得到你的负统计量。

这个算法实际上效果很好,并且允许RBM为二进制向量集建立良好的密度模型。

对比散度:一种更快的算法

现在,我将介绍一种学习算法,它在构建密度模型方面不如上一个算法好,但速度要快得多。我将从一个低效的受限玻尔兹曼机学习算法的图示开始。

我们首先将一个数据向量固定在可见单元上,我们称这个时间为 t0。给定这个可见向量,我们更新隐藏单元。我们为隐藏单元选择二进制状态,并测量所有相连的可见单元和隐藏单元对的 V_i H_j 期望值。我称之为 V_i H_j 0,表示这是在时间0测量的。

然后,我们使用隐藏向量并行更新所有可见单元。接着,再次并行更新所有隐藏单元。因此,时间 t=1 的可见向量,我们称之为“重构”或“一步重构”。我们可以继续以这种方式进行交替链式更新,并行更新可见单元和隐藏单元。

经过长时间运行后,我们将到达可见单元的某个状态,我称之为 T∞,表示需要很长时间,此时系统将处于热平衡。现在,在链运行很长时间后,我们可以测量 V_iH_j 的相关性,我称之为 V_i H_j ∞。长时间后得到的可见状态,我称之为“幻想”。

那么学习规则很简单:我们通过学习率乘以 V_i H_j 在时间0和 V_i H_j 在时间∞的差值来改变权重 W_ij。当然,这个算法的问题在于,我们必须运行这个链很长时间才能达到热平衡。如果我们运行时间不够长,学习可能会出错。

惊人的捷径:对比散度

实际上,最后那句话非常具有误导性。事实证明,即使我们只运行链很短的时间,学习仍然有效。

以下是这个非常惊人的捷径:你只需要运行链:上、下、再上一次。也就是说,从数据生成一个隐藏状态,从该状态生成一个重构,再从该重构生成另一个隐藏状态。完成这些后,你测量统计量。

因此,我们不是使用在平衡时测量的统计量,而是使用在执行马尔可夫链一次完整更新后测量的统计量。学习规则与之前相同,只是计算起来要快得多。这显然不是在执行最大似然学习,因为我们用于负统计量的项是错误的。但尽管如此,学习效果相当好。

一个明显的问题是:为什么这个捷径有效?推理如下:如果我们从数据开始链,马尔可夫链会从数据游走开,趋向其平衡分布,即趋向于其初始权重比数据更喜欢的东西。我们可以在仅仅几步之后就看到它游走的方向。如果我们知道初始权重不是很好,那么一直走到平衡是浪费时间。我们知道如何改变权重来阻止它从数据游走开,而不需要一直走到平衡。

我们需要做的就是降低它在一次完整步骤后产生的重构(或心理学家称之为“虚构”)的概率,然后提高数据的概率。这将阻止它从数据游走开。一旦数据和它在一次完整步骤后到达的地方具有相同的分布,学习就会停止。

算法原理与权衡

以下是正在发生的情况图示:这是全局配置空间中的能量曲面。这是能量曲面上的一个数据点。从该数据点开始,我们运行马尔可夫链一个完整步骤,得到一个新的可见向量以及与之对应的隐藏向量。然后我们改变权重,以降低数据点的能量,并提高重构的能量。这样做的效果将是使曲面看起来像这样。你会注意到我们开始在数据处构建一个能量最小值。你还会注意到,远离数据的地方,情况与之前基本保持不变。

因此,只做一个完整步骤来获得重构的这个捷径,对于远离数据的地方是无效的。我们需要担心模型喜欢但远离任何数据点的数据空间区域。这些低能量“空洞”会导致归一化项变大,如果我们使用捷径,就无法感知到它们。如果我们使用持久粒子,记住它们的状态,并在每次更新后对它们进行更多次更新,那么它们最终会找到这些空洞。它们会进入空洞,而学习会导致空洞被填满。

速度与正确性之间的一个良好折衷是:从小权重开始,并使用CD1(即对比散度,使用一个完整步骤来获得负数据)。一旦权重增长了一些,马尔可夫链混合得更慢,现在我们可以使用CD3。一旦权重增长得更多,我们可以使用CD5、9或10。因此,通过随着权重增长而增加步骤数,我们可以保持学习效果相当好,即使马尔可夫链的混合率在下降。

总结

本节课中我们一起学习了受限玻尔兹曼机。我们了解了其简化的二分图结构如何使得推断变得高效,并深入探讨了两种主要的学习算法:一种基于幻想粒子的密度建模算法,以及更快速实用的对比散度算法。我们明白了CD算法通过近似负相统计量来加速学习,虽然理论上不完美,但在实践中非常有效,并且理解了通过逐步增加马尔可夫链的步数可以在学习速度和模型质量之间取得平衡。

12.4:受限玻尔兹曼机学习示例 🧠

在本节课中,我们将学习一个受限玻尔兹曼机学习手写数字“2”图像模型的简单示例。我们将观察模型学习后如何重建数字“2”,以及当输入其他数字时会发生什么。此外,我们还将探讨一个更大的RBM模型在所有数字类别上训练后所学习到的权重特征。

模型结构与学习过程

上一节我们介绍了RBM的基本概念,本节中我们来看看一个具体的学习示例。该RBM模型相对简单,旨在学习手写数字“2”的图像模型。图像尺寸为16x16像素,模型包含50个二值隐藏单元,这些单元将学习成为有趣的特征检测器。

当模型接收到一个数据样本时,首先会利用从像素到特征检测器的连接权重来激活这些特征检测器。具体来说,对于每个二值神经元,模型会随机决定其状态应为1还是0。

随后,模型利用这些激活的二值模式来重建数据。即,每个像素会做出一个二值决策,决定其应为1还是0。

接着,模型使用重建结果(而非原始数据)来重新激活二值特征检测器。

权重的更新规则如下:

  • 当网络观察数据时,增加活跃像素与活跃特征检测器之间的权重。这将降低数据及其对应隐藏模式这一全局配置的能量。
  • 当网络观察重建结果时,减少活跃像素与活跃特征检测器之间的权重。这将提高重建结果的能量。

在学习初期,权重是随机的,重建结果几乎总是比原始数据具有更低的能量。这是因为重建结果是网络根据其隐藏活动模式,在其可见单元上喜欢重现的模式。显然,根据其能量函数,网络倾向于重现低能量的模式。

学习过程可以理解为改变权重,使得数据的能量变低,而数据的重建结果通常能量更高。

权重学习与特征演化

以下是权重学习过程的直观展示。我们首先为50个特征检测器设置小的随机初始权重,以打破对称性(尽管由于更新规则是随机的,这并非必需)。

在观察了几百个数字样本并多次调整权重后,权重开始形成模式。随着训练继续,许多特征检测器开始学习检测数字“2”的轮廓。这些特征检测器起初较为全局化,随后逐渐变得更加局部化。

最终,每个神经元都成为了不同的特征检测器。大多数特征检测器是相当局部的。例如,红色框中的特征检测器专门检测数字“2”的顶部。当“2”的顶部出现在其白色像素位置,且黑色像素位置没有内容时,该检测器会被激活。

模型测试与重建

一旦模型学习完成,我们可以观察它重建数字的效果。我们将给它一些之前未见过的测试数字。

首先,我们输入一个数字“2”的测试样本。其重建结果相当忠实于原测试样本,尽管略显模糊。例如,测试样本顶部有一个钩状结构,在重建中被模糊化了,但整体重建效果良好。

更有趣的是,当我们输入一个来自不同数字类别(例如数字“3”)的测试样本时,模型重建出的结果看起来更像数字“2”而非“3”。这是因为模型学习到的所有特征检测器都擅长表示“2”,但它没有专门用于表示“3”中间那个尖角的特征检测器。因此,它最终重建出的东西更符合“2”的规律,而非“3”的规律。

实际上,这个网络倾向于将所有输入都视为“2”。

扩展模型:多类别特征学习

接下来,我们看看一个更大的模型所学习到的特征。这是一个使用500个隐藏单元来建模所有10个数字类别的模型的第一层隐藏单元特征检测器。该模型已通过对比散度法训练了很长时间。

它学习了多种多样的特征检测器。以下是几个例子:

  • 蓝色框中的检测器:显然对检测类似“4”的数字有用。
  • 红色框中的检测器:这是一种奇特的特征。它喜欢看到靠近底部的像素,但非常不喜欢看到在底部上方第21行的像素。这是因为数据经过了归一化处理,数字高度不能超过20像素。因此,如果你知道在那些具有大正权重的像素位置有像素激活,那么在那些负权重的位置就不可能再有像素激活。这个检测器捕捉到了由数据归一化方式引入的长程规律性。
  • 绿色框中的检测器:非常有趣。它用于检测垂直笔画的底部位置。它会在多个不同位置检测到它,但拒绝在中间位置检测。这非常像一个二进制数中的最低有效位,随着数值增大,它会反复开启和关闭。这表明网络正在发展出相当复杂的方式来表示事物的位置。

总结

本节课中,我们一起学习了受限玻尔兹曼机学习手写数字模型的具体示例。我们看到了一个简单RBM如何学习检测特定数字(如“2”)的特征,并理解了其重建和泛化行为。通过扩展模型,我们还观察到RBM能够学习到多样化的、有时甚至是复杂的特征,这些特征共同构成了对多类别数据(如所有手写数字)的有效模型。

12.5:受限玻尔兹曼机在协同过滤中的应用 🎬

在本节课中,我们将学习如何将受限玻尔兹曼机应用于协同过滤问题。协同过滤是指根据用户对其他产品的喜好程度,以及其他用户对产品的喜好程度,来推测某个用户对某个产品的喜好程度。我们将以Netflix竞赛为例,探讨机器学习算法如何预测特定用户对特定电影的评分。

理解协同过滤与Netflix竞赛 🎯

协同过滤的目标是预测用户对产品的喜好。我们重点关注的案例是Netflix竞赛,该竞赛要求机器学习算法预测特定用户对特定电影的评分。

竞赛的训练数据包含1亿条评分,涉及50万用户对1.8万部电影的评分。这是一个相当大的数据集。在当时,人们很难想象玻尔兹曼机能够处理这样的数据。然而,我们将看到,通过一个重要的技巧,受限玻尔兹曼机能够应对几乎所有电影的评分都缺失的情况。使用这个技巧后,我们能够训练出在实践中非常有用的模型,并且这些模型实际上被用于获胜方案中。

接下来,我将解释在Netflix竞赛中,受限玻尔兹曼机是如何用于协同过滤的。

数据表示与挑战 📊

在竞赛中,我们获得了50万用户对1.8万部电影的大部分评分。每部电影的评分范围是1到5分。当然,每个用户只对一小部分电影进行了评分。即便如此,仍有大约1亿条评分,因此数据集相当庞大。

我们的任务是预测用户对预留电影的评分。如果预测准确,将获得大奖。实际上,最佳预测者将赢得一百万美元。

我们可以将评分绘制成一个大矩阵,其中顶部是电影,侧面是用户。例如,用户2给电影1评了5分,给电影3评了1分。用户4给电影1评了4分。问题是,他给电影3评了多少分?你可能会认为他类似于用户2,因为他们对电影1的评分相同。因此,也许像用户2一样,他不喜欢电影3。另一方面,用户4喜欢电影6,所以他可能喜欢所有电影。当你进行这样的推理时,你会意识到最好使用一些统计方法。

从语言模型到矩阵分解 🔄

首先,我们尝试使用语言模型。这听起来可能有些奇怪,但正如你将看到的,它等同于一种标准方法。我们可以将数据写成一个三元组字符串,类似于家谱。每个三元组的形式是:用户、电影、评分。

以下是从上一张幻灯片的表格中提取的一些数据。我们只需要预测三元组的第三项。如果我们构建一个语言模型,我们会将每个用户转换为该用户的特征向量,这是一个我们学习的向量。同样,我们将每部电影转换为该电影的特征向量,这也是一个我们学习的向量。然后,我们尝试从这两个特征向量预测评分。

显然的方法是添加一个大的隐藏层,让特征向量输入到隐藏层,然后让隐藏层预测评分。我们尝试了这种方法,但发现它并不比一个非常简单的方法更好。这个方法就是简单地取用户特征向量和电影特征向量的标量积。你只需将它们逐点相乘,然后求和,并将结果作为评分输出。因此,它甚至不是一个softmax函数,你实际上输出的是从标量积得到的任何实数。

现在,这完全等同于另一种通常称为矩阵分解模型的方法。如果我们按行排列用户特征,按列排列电影特征,我们可以看到,如果我们将用户特征矩阵乘以特征时间电影矩阵,那么我们将得到评分的预测,并且它将完全等同于旁边的语言模型。因此,矩阵分解模型是用于此类协同过滤的最常用模型。

引入受限玻尔兹曼机 🧠

矩阵分解模型效果相当不错。现在,让我们考虑使用受限玻尔兹曼机的替代模型。如何将受限玻尔兹曼机应用于这个问题并不明显。因此,我们进行了一些思考。最终,我们决定将每个用户视为一个训练案例。因此,一个用户实际上是一个电影评分向量。对于每部电影,我们将有一个具有五个替代值的可见单元。因此,可见单元不是二元的,而是一个五路softmax。因此,网络或受限玻尔兹曼机看起来像这样。

它的每个可见单元都是一个五路softmax,每部电影对应一个可见单元。你可能会开始担心这里有18000个可见单元。然后,我们大约有100个二元隐藏单元。每个隐藏单元都连接到softmax的所有五个值。它还有一个偏置。因此,你可以看到我们将拥有的参数数量是巨大的。顺便说一下,softmax的CD学习规则与二元单元完全相同。

如前所述,我们大约有100个隐藏单元。我们将学习一个模型,然后尝试使用该模型填充一个缺失值。现在,这种方法的问题是,我们不希望有一个具有18000个可见单元的RBM,其中只有少数几个具有已知值。这是一个需要处理的大量缺失值。

巧妙的解决方案:权重共享 💡

有一个巧妙的方法可以解决这个问题。对于每个用户,我们使用一个RBM,该RBM只具有用户评分的电影数量的可见单元。因此,每个用户可能对应一个不同的RBM,具有不同的可见单元子集。不,所有这些RBM将共享相同的权重。也就是说,我们知道哪部电影是哪部电影。因此,如果两个用户观看了同一部电影并对同一部电影进行了评分,那么从该电影到隐藏单元的权重对于这两个用户将是相同的。

因此,我们在这里进行了大量的权重共享。这是幸运的。因为对于每个用户,我们只得到一个训练案例。我们为每个用户创建这个特定的RBM,具有正确的架构,即用户评分的电影的正确数量的可见单元。现在只有一个训练案例,即评分向量。但是,所有这些50万个训练案例共享到隐藏单元的权重。因此,学习效果很好。

模型使用CD1进行训练,然后一段时间后使用CD3,即在上上下下三次之后收集负相的统计信息,然后使用CD5,最后使用CD9。

模型性能与集成优势 🏆

那么,它的效果如何呢?RBM的效果与矩阵分解方法大致相当,但它们产生的误差非常不同。这意味着,如果你将RBM的预测与矩阵分解方法的预测进行平均,你会获得很大的优势。获胜团队实际上在他们的平均中使用了多个不同的RBM模型和多个不同的矩阵分解模型。据我所知,他们的主要模型是矩阵分解模型和RBM模型。

总结 📝

本节课中,我们一起学习了如何将受限玻尔兹曼机应用于协同过滤问题,特别是Netflix竞赛中的电影评分预测。我们首先理解了协同过滤的基本概念和Netflix竞赛的数据规模与挑战。接着,我们探讨了从语言模型到矩阵分解的标准方法。然后,我们引入了受限玻尔兹曼机模型,并详细解释了如何通过为每个用户构建仅包含其已评分电影的可见单元的特定RBM,并共享权重,来巧妙地处理海量缺失值问题。最后,我们看到RBM模型与矩阵分解模型性能相当但误差不同,通过集成平均可以获得更好的预测效果,这也是实际获胜方案的关键。

13.1:反向传播的兴衰史 📈📉

在本节课中,我们将回顾反向传播算法的历史发展脉络。我们将从其在上世纪70-80年代的起源开始,探讨它在90年代为何遭遇冷落,并分析其后来重新崛起的原因。最后,我们将通过一份历史文件,了解当时研究者们的观点与预判。

反向传播的起源与早期发展

上一节我们概述了本节课的内容,本节中我们来看看反向传播算法最初的诞生过程。

反向传播在70年代和80年代被独立发明了数次。
它始于60年代末,控制理论家Bryson和Ho发明了反向传播的线性版本。
Paul Werbos听了他们的讲座,意识到它可以被非线性化。在他的1974年博士论文中,他发表了可能是第一个正确的反向传播版本。
Rumelhart、Hinton和Williams在1981年发明了它,但并不知道Paul Werbos的工作。
我们尝试了它,但对我们尝试的第一件事效果并不好,因此我们放弃了它。
David Parker在1985年发明了它,Jan LeCun也在1985年发明了它。
同样在1985年,我回去再次尝试了Rumelhart、Williams和我放弃的事情,并发现它效果相当好。
1986年,我们发表了一篇论文,其中包含了一个关于它能做什么的非常令人信服的例子。

很明显,反向传播在学习多层非线性特征检测器方面大有可为。
但它并未真正兑现其承诺。到了90年代末,机器学习领域大多数严肃的研究者已经放弃了反向传播。
例如,在David MacKay的教科书中,几乎没有提到它。
它仍然被心理学家广泛用于构建心理模型,并且在信用卡欺诈检测等实际应用中也相当广泛地使用。
但在机器学习领域,人们认为它已经被支持向量机所取代。

90年代的反向传播:流行观点与真实原因

上一节我们介绍了反向传播的早期发展,本节中我们来看看它在90年代遭遇困境时,流行的解释是什么,以及我们如今如何看待其真实原因。

关于90年代末反向传播遭遇了什么,流行的解释是它无法有效利用多层和非线性特征。
这在卷积神经网络中并不成立,卷积网络是个例外。但总的来说,人们无法让使用反向传播训练的前馈神经网络在拥有多个隐藏层时做出令人印象深刻的事情,除了一些玩具示例。
它在循环网络或深度自编码器(我们将在后面的课程中介绍)中效果也不好。
循环网络或许是它最令人兴奋的应用领域。因此,正是在那里,人们无法让它良好工作最令人失望。
相比之下,支持向量机效果很好。它们不需要太多专业知识就能使其工作。
它们产生了可重复的结果。并且它们有更好的理论,更花哨的理论。
这就是关于反向传播出了什么问题的流行解释。

以更历史的视角来看,我们可以看到它真正失败的原因。
计算机的速度慢了数千倍。并且对于反向传播真正能大放异彩的领域,带标签的数据集小了数百倍。
此外,深度网络不仅规模太小,而且初始化方式也不合理。
因此,通过深度网络进行反向传播效果不佳。因为梯度往往会消失,因为初始权重通常太小。

这些问题阻碍了反向传播在视觉和语音等任务上取得成功,而这些任务最终将是它大获全胜的领域。

机器学习任务谱系:统计学与人工智能

上一节我们分析了反向传播失败的技术原因,本节中我们需要区分不同类型的机器学习任务,以理解不同方法的适用场景。

我们需要区分不同类型的机器学习任务。
一类更偏向于统计学中人们研究的事物,另一类更偏向于人工智能中人们研究的事物。
在统计学这一端,你通常拥有低维数据。统计学家认为100维就是高维数据。
在人工智能这一端,像图像或表示语音的系数通常有远多于100个维度。
在统计学这一端,数据中通常有很多噪声。
而在人工智能这一端,噪声不是真正的问题。
对于统计学,数据中通常没有那么多结构。存在的结构可以由一个相当简单的模型捕捉。
在人工智能这一端,数据中通常有大量的结构。
所以,如果你取一组图像,它是高度结构化的数据,但结构过于复杂,无法用简单模型捕捉。
因此,在统计学中,主要问题是将真实结构与噪声分离,不把噪声误认为是结构。
贝叶斯神经网络可以很好地做到这一点。但对于典型的非贝叶斯神经网络来说,这不是它们擅长处理的问题。
因此,对于这类问题,尝试支持向量机或一种称为高斯过程的方法(如果你在做回归,我稍后会简要提及)是有意义的。
在人工智能这一端,主要问题是找到一种表示所有这些复杂结构的方法,以便能够学习它。
显而易见的做法是尝试手动设计合适的表示,但实际上,让反向传播通过赋予它多层并使用大量计算能力来决定表示应该是什么,要更容易。

支持向量机的局限

上一节我们对比了不同任务的特点,本节中我们将简要讨论一下支持向量机,并阐述其局限性。

我现在想非常简要地谈谈支持向量机。我不会解释它们如何工作,但我会说明我认为它们的局限性是什么。

有几种方式可以看待支持向量机。我将给你两种不同的观点。
根据第一种观点,支持向量机只是感知机的重生,带有一个称为核技巧的巧妙技巧。
其思想是,你获取输入,将原始输入扩展到一个非常大的非线性但也是非自适应的特征层。这就像感知机,你有一个大的、不学习的特征层。
然后你只需要学习一层自适应权重,即从特征到决策单元的权重。
支持向量机有一种非常聪明的方法来避免在学习这些权重时过拟合。
它们在高维空间中寻找所谓的最大间隔超平面。它们能做到这一点的效率比你想象的可能要高得多,这就是它们效果好的原因。
第二种观点也将支持向量机视为感知机的巧妙重生,但它对它们使用的特征类型有完全不同的概念。
根据第二种观点,训练集中的每个输入向量都被用来定义一个特征。
我将用不同的拼写来表明它是与第一种完全不同的特征。
这些特征中的每一个都给出一个标量值,这涉及到在测试输入和那个特定的训练输入之间进行全局匹配。
粗略地说,就是测试输入与特定训练案例的相似程度。
然后有一种巧妙的方法可以同时找到如何加权这些特征以做出正确决策,并进行特征选择,即决定不使用哪些特征。
所以,尽管这些观点听起来彼此截然不同,但它们只是看待同一事物(支持向量机)的两种替代方式。
在这两种情况下,它都使用非自适应特征,然后是一层自适应权重。
这种方式有其局限性。你无法用支持向量机学习多层的表示。

一份历史赌约与反思

上一节我们探讨了支持向量机的特点,本节中我们通过一份历史文件,来回顾当时研究者们的预判,并总结本节课的核心内容。

这是一份来自1995年的历史文件。是Yann LeCun给我的。
这是Larry Jackel(贝尔实验室自适应系统研究组的负责人)和Vladimir Vapnik(支持向量机的主要倡导者)之间的一个赌约。
Larry Jackel打赌,到2000年,人们将理解为什么用反向训练的大型神经网络在大数据集上效果良好。也就是说,他们将从理论和条件上理解它。
Vapnik打赌他们不会,但他附带了一个侧赌,即如果他是那个弄清楚原因的人,他无论如何都会赢。
Vapnik反过来打赌,到2005年,将没有人再使用像那样用反向传播训练的大型神经网络。
事实证明,他们都错了。
使用反向传播的大型神经网络的限制,不在于我们没有好的理论,也不在于它们本质上没有希望,而在于我们没有足够大的计算机或足够大的数据集。这是一个实践上的限制,而非理论上的。

总结

本节课中我们一起学习了反向传播算法的历史轨迹。我们回顾了其多次独立发明的起源,分析了它在90年代被主流机器学习界放弃的流行解释(无法有效利用深度)和真实原因(算力与数据不足)。我们对比了统计学与人工智能两类任务的特点,指出了反向传播在后者处理复杂结构数据时的潜力。我们还简要讨论了支持向量机的两种视角及其无法学习多层表示的局限性。最后,通过一份历史赌约,我们认识到技术发展的限制往往来自实践条件,而非理论本身。这段历史提醒我们,在评估技术潜力时,需要考虑计算资源和数据规模的长期发展趋势。

13.2:信念网络 🧠

在本节课中,我们将学习信念网络。这是一种生成模型,它通过建模输入数据的概率分布,而非预测标签,来克服反向传播算法对大量标注数据的依赖。我们将探讨其基本原理、与图形模型的关系,以及如何利用神经元构建因果模型。


放弃反向传播的原因

上一节我们介绍了反向传播的局限性,本节中我们来看看导致我在20世纪90年代放弃反向传播的主要原因。

它需要太多标签。当时我们根本没有足够多标签的数据集。

我也受到一个事实的影响:人们能够用很少的显式标签进行学习。

然而,我不想放弃使用梯度下降学习来调整大量权重的优势。

因此,问题在于是否存在另一个我们可以进行梯度下降的目标函数。

一个显而易见的研究方向是生成模型。

其目标函数是建模输入数据,而不是预测标签。

这与统计学和人工智能领域一个主要运动——图形模型——很好地结合了起来。

图形模型的思想是结合离散图结构来表示变量之间的依赖关系,以及基于实值计算来推断给定其他变量观测值时某个变量的概率。

玻尔兹曼机实际上是图形模型的一个早期例子,但它们是无向图形模型

在1992年,拉德福德·尼尔指出,使用与玻尔兹曼机中相同类型的单元,我们可以构建有向图形模型,他称之为Sigmoid信念网络

随之而来的问题是:我们如何学习Sigmoid信念网络?


深度网络的挑战

第二个问题是,对于深度网络,学习时间无法很好地扩展。

当存在多个隐藏层时,学习速度非常慢。

你可能会问为什么会这样。我们现在知道原因之一是我们没有以合理的方式初始化权重。

另一个问题是,反向传播可能会陷入较差的局部最优解。

这些局部最优解通常相当不错,因此反向传播是有用的。但我们现在可以证明,对于深度网络,如果从小随机权重开始,陷入的局部最优解通常远非最优。

存在退回到更简单模型以进行凸优化的可能性。

但我认为这不是一个好主意。数学家喜欢这样做,因为他们可以证明一些定理。

但在实践中,你只是在逃避真实数据的复杂性。


无监督学习作为解决方案

克服反向传播限制的一种方法是使用无监督学习。

其思想是,我们希望保持使用梯度方法和随机小批量下降来调整权重的效率和简单性。

但我们将使用这种方法来建模感官输入的结构,而不是建模输入和输出之间的关系。

因此,思想是调整权重,以最大化生成模型生成感官输入的概率。

我们在学习玻尔兹曼机时已经看到了这一点。一种思考方式是,如果你想做计算机视觉,你应该先学习计算机图形学。粗略地说,计算机图形学是可行的,而计算机视觉则不然。

正如我们在玻尔兹曼机中看到的,生成模型的学习目标是最大化观测数据的概率,而不是最大化给定输入时标签的概率。


生成模型的类型

那么问题来了,我们应该学习哪种生成模型?

我们可能学习一个基于能量的模型,比如玻尔兹曼机。

或者,我们可能学习一个由理想化神经元构成的因果模型。这是我们首先要看的。

最终,我们可能会学习两者的某种混合体,而这将是我们最终的目标。


人工智能与概率的背景

在深入探讨由神经元构成的因果信念网络之前,我想先介绍一下人工智能和概率的背景。

在20世纪70年代和80年代初,人工智能领域的人们难以置信地反对概率。

当我还是研究生时,如果你提到概率,那表明你很愚蠢,还没有理解。计算机完全是关于离散符号处理的。如果你引入任何概率,它们就会污染一切。

很难想象人们当时有多么反对概率,这里有一段引文可以帮助你理解。我来读一下:

“许多古希腊人支持苏格拉底的观点,认为深刻、难以解释的思想来自神灵。今天这些神灵的等价物是反复无常、甚至具有概率性的神经元。神经行为随机性的增加更可能是癫痫患者和醉酒者的问题,而不是聪明人的优势。”

这段话出自帕特里克·亨利·温斯顿第一版的第一本AI教科书。这是当时的普遍观点。温斯顿后来成为了麻省理工学院人工智能实验室的负责人。

这里有一个相反的观点:

“所有这些都将导致计算理论,它比过去和现在的形式逻辑更少具有全有或全无的刚性性质。有许多迹象使我们相信,这个新的形式逻辑系统将更接近另一个过去与逻辑联系甚少的学科。这就是热力学,主要是以玻尔兹曼所接受的形式。”

这段话由约翰·冯·诺依曼在1957年撰写,是他未完成手稿的一部分,本应是他关于大脑中计算机的著作的巅峰之作。

我认为如果冯·诺依曼还活着,人工智能的历史可能会有所不同。


图形模型的兴起

概率最终通过一种叫做图形模型的东西进入了人工智能领域。

图形模型是图论和概率论的结合。

在20世纪80年代,人工智能领域有很多关于专家系统的工作,这些系统使用规则集来处理诸如医疗诊断或矿产勘探等任务。

这些都是实际问题,因此必须处理不确定性。它们不能只使用一切都很确定的玩具例子。

人工智能领域的人们非常不喜欢概率,以至于即使他们在处理不确定性时,也不想使用概率,因此他们发明了自己处理不确定性的方法,不涉及概率。

你实际上可以证明这是一个糟糕的选择。

图形模型由珀尔、赫克曼、劳里森等人引入,他们证明了概率实际上比专家系统人员开发的临时方法效果更好。

离散图擅长表示哪些变量依赖于哪些其他变量。

但一旦有了这些图,你就需要进行实值计算,这些计算遵循概率规则,以便你可以计算图中某些节点的期望值,给定其他节点的观测状态。


信念网络的定义

信念网络是图形模型中人们对特定图子集的称呼。

这些图是有向无环图。通常,它们使用稀疏连接的图。

如果这些图是稀疏连接的,它们就有巧妙的推理算法,可以高效地计算未观测节点的概率。

但这些巧妙的算法在影响每个节点的节点数量上是指数级的,因此它们不适用于密集连接的网络。

所以,信念网络是由随机变量组成的有向无环图。这里有一张图。

通常,你可能观测到任何变量。我将限制自己只讨论仅观测叶节点的网络。

因此,我们想象存在这些未观测的隐藏原因。它们可能分层,最终产生一些观测到的结果。

一旦我们观测到一些变量,就有两个问题需要解决。

第一个是我称之为推理问题的问题,即推断未观测变量的状态。

当然,我们无法确定地推断它们。因此,我们追求的是未观测变量的概率分布。

如果未观测变量在给定观测变量的情况下彼此不独立,那么这些概率分布可能是庞大、笨重的东西,包含指数级的项。

第二个问题是学习问题

即,给定一个由所有叶节点状态观测向量组成的训练集,我们如何调整变量之间的相互作用,以使网络更有可能生成该训练数据。

因此,调整相互作用将涉及决定哪个节点受哪个其他节点影响,以及决定该影响的强度。


图形模型与神经网络的关系

让我简单谈谈图形模型和神经网络之间的关系。

早期的图形模型使用专家来定义图结构以及条件概率。

他们通常会询问医学专家,某事导致另一件事的可能性有多大。然后他们会制作一个节点具有含义的图。

他们通常有条件概率表,描述父节点的一组值如何决定该节点值的分布。

他们的图是稀疏连接的,他们最初关注的问题是如何进行正确的推理。

最初,他们对学习不感兴趣,因为知识来自专家。

相比之下,对于神经网络,学习始终是一个核心问题。

手工编码知识被认为是不酷的,尽管当然,像在卷积网络中那样编码一些基本属性是非常明智的做法。

但基本上,网络中的知识来自学习训练数据,而不是来自专家。

神经网络的目标不是具有可解释性或稀疏连接以使推理变得容易。尽管如此,信念网络也有神经网络的版本。


基于神经元的生成模型

如果我们思考如何用理想化神经元构建生成模型,基本上有两种类型可以构建。

基于能量的模型,你使用对称连接连接二元随机神经元,然后得到玻尔兹曼机。

正如我们所看到的,玻尔兹曼机很难学习,但如果我们限制连接性,那么学习一个受限玻尔兹曼机就很容易。

然而,当我们这样做时,我们只学习了一个隐藏层。因此,为了简化学习,我们放弃了具有多个隐藏层的神经网络的许多能力。

你可以构建的另一种模型是因果模型

这是一个由二元随机神经元组成的有向无环图。当你这样做时,你会得到一个Sigmoid信念网络。

1992年,尼尔引入了这样的模型,并将其与玻尔兹曼机进行了比较,表明Sigmoid信念网络稍微容易学习一些。

所以,Sigmoid信念网络就是一个所有变量都是二元随机神经元的信念网络。

要从这个模型生成数据,你取顶层的神经元,根据它们的偏置随机决定它们应该是1还是0。

然后,给定顶层神经元的状态,你随机决定中间层神经元应该做什么。

然后,给定它们的二元状态,你决定可见效应应该是什么。

通过执行这一系列从层到层的因果操作,你将获得神经网络所相信的可见值向量类型的无偏样本。

因此,在因果模型中,与玻尔兹曼机不同,生成样本很容易。


总结

本节课中我们一起学习了信念网络的基本概念。我们探讨了放弃反向传播、转向生成模型的原因,了解了图形模型和概率在AI中的历史背景,并区分了基于能量的模型(如玻尔兹曼机)和因果模型(如Sigmoid信念网络)。Sigmoid信念网络作为由神经元构成的有向无环图,能够通过因果序列高效生成数据样本,为无监督学习提供了一种重要框架。

13.3:学习Sigmoid信念网络 🧠

在本节课中,我们将探讨学习Sigmoid信念网络为何困难。我们将首先理解其背后的核心挑战——“解释消除”现象,然后了解理想情况下的学习规则。最后,我们会简要介绍两种应对此挑战的学习方法。

学习Sigmoid信念网络的挑战

上一节我们介绍了Sigmoid信念网络的基本概念,本节中我们来看看学习这种网络时面临的主要困难。

学习Sigmoid信念网络的好消息是,与玻尔兹曼机不同,我们不需要两个不同的学习阶段,只需要玻尔兹曼机中的“正相”阶段。这是因为Sigmoid信念网络是所谓的局部归一化模型,因此我们无需处理配分函数或其导数。

另一个好消息是,如果我们能够从给定数据向量时隐藏单元的后验分布中获得无偏样本,那么学习将变得容易。也就是说,我们可以以一种小批量随机的方式,遵循最大似然学习指定的梯度进行学习。

问题在于,很难从隐藏单元的后验分布中获得无偏样本。这主要归因于朱迪亚·珀尔提出的“解释消除”现象。理解这一现象至关重要。

解释消除现象

现在,我们来深入探讨为什么学习Sigmoid信念网络很困难。我们已经看到,一旦完成学习(即确定了网络中的权重),生成无偏样本是容易的。我们可以通过从其模型中生成样本来轻松查看网络“相信”的事物类型。这是自上而下、逐层完成的,因为它是一个因果模型,所以很简单。

然而,即使我们知道权重,当我们观察到可见效应时,推断隐藏原因的后验分布也是困难的。原因在于,隐藏原因的可能模式数量随隐藏节点数量呈指数增长。甚至从后验中获取一个样本都很困难,而这正是我们进行随机梯度下降所需要的。

考虑到从后验中采样的这种困难,我们很难看出如何学习具有数百万参数的Sigmoid信念网络,而这正是我们希望做到的。请注意,这与通常用于图模型的范式非常不同。在图模型中,人们通常使用可解释的模型,并试图学习几十个或几百个参数,而不是数百万个。

理想情况下的学习规则

在探讨如何尝试从后验分布获取样本的方法之前,我们先了解一下如果我们能获得这些样本,学习规则是什么。

如果我们能从给定观测数据时隐藏状态的后验分布中获得一个无偏样本,那么学习就很容易。以下是Sigmoid信念网络的一部分。我们假设对于每个节点J,都有一个二进制值S_J。这个二进制值向量是网络的一个全局配置,它是来自后验分布的一个样本。

为了进行最大似然学习,我们需要做的就是最大化单元I的推断二进制状态由其父节点的推断二进制状态生成的对数概率。因此,学习规则是局部且简单的。

父节点将单元I激活的概率由一个逻辑函数给出,该函数涉及父节点的二进制状态。我们需要做的是使这个概率与I的实际观测二进制值相似。虽然这里不进行推导,但权重W_{JI}的最大似然学习规则很简单:按比例改变它,比例因子是J的状态乘以I的二进制状态与其父节点二进制状态将其激活的概率之差。

总结来说,如果我们有一个分配给所有隐藏节点的二进制状态,那么进行最大似然学习就很容易。我们可以采用典型的随机方式:从后验中采样,然后基于该样本更新权重,并在一个小批量样本上平均这个更新。

理解“解释消除”

让我们回到为什么难以从后验中采样的问题。其核心原因是一个称为“解释消除”的现象。

观察这个小型的Sigmoid信念网络,它有两个隐藏原因和一个观测效应。观察偏置项,你会发现除非其中一个原因为真,否则观测效应“房子跳跃”极不可能发生。但如果其中一个原因发生了,-20的偏置被抵消,房子跳跃的概率变为二分之一。

每个原因本身都相当不可能,但远不如房子自发跳跃那么不可能。因此,如果你看到房子跳跃,一个合理的解释是卡车撞了房子。另一个合理的解释是发生了地震。每个原因的概率约为e{-10},而房子自发跳跃的概率约为e。然而,如果你假设两个隐藏原因同时发生,其概率为e^{-20},即使房子确实跳跃了,这也极不可能。因此,假设发生了地震,会降低房子跳跃是因为卡车撞击的概率。当我们观察到房子跳跃时,两个隐藏原因之间就产生了反相关性。

在模型本身的先验中,这两个隐藏原因是相当独立的。所以如果房子跳跃了,基本上有均等的机会是因为卡车或是因为地震。后验实际上看起来是这样的:给定房子跳跃,隐藏原因有四种可能的模式。其中两种极不可能,即卡车撞房且发生地震,或者两者都没发生。另外两种组合的概率相等,你会注意到它们形成了一个“异或”关系。我们有两种可能的因果模式,它们彼此相反。这就是“解释消除”。

深度Sigmoid信念网络的学习难题

理解了“解释消除”后,让我们重新考虑学习深度Sigmoid信念网络的问题。

我们将有多层隐藏变量。在我们的因果模型中,它们会产生一些数据。我们想要学习数据与第一层隐藏变量之间的权重W。让我们看看学习W需要什么。

首先,第一层隐藏变量的后验分布不是因式分解的(即不是独立的)。这是因为“解释消除”。所以,即使我们只有那一层隐藏变量,一旦我们看到数据,它们也不会彼此独立。而且,因为我们有更高层的隐藏变量,它们甚至在先验中也不是独立的。那些更高层的隐藏变量创造了一个先验,这个先验本身会导致第一层隐藏变量之间的相关性。

为了学习W,我们需要知道第一隐藏层的后验,或者至少是它的一个近似。即使我们只是在近似它,为了计算那个先验项,我们也需要知道更高层的所有权重。实际上,情况甚至更糟,因为要计算那个先验项,我们需要积分掉更高层的所有隐藏变量。也就是说,我们需要考虑这些更高层中所有可能的活动模式,并将它们全部组合起来,以计算更高层为第一隐藏层创造的先验。计算这个先验是一件非常复杂的事情。

这三个问题表明,学习权重W将极其困难。特别是,如果不做大量高层工作来计算先验,我们将无法学习它们。

应对方法概述

现在,我们将考虑一些学习深度信念网络的方法。

第一种是拉福德·尼尔使用的蒙特卡洛方法。这种方法基本上完成了所有工作。也就是说,如果我们回到上一张幻灯片,它考虑了所有隐藏变量上的活动模式,并运行一个马尔可夫链。给定一个数据向量,这个链需要很长时间才能稳定下来。一旦它达到热平衡,你就可以从后验中获得一个样本,但这需要大量的计算工作。

在大型深度信念网络中,这种方法相当慢。在20世纪90年代,人们开发了更快的学习深度信念网络的方法,称为变分方法。实际上,这就是变分方法(至少对人工智能社区而言)的起源。

变分方法放弃了从后验获得无偏样本的目标,转而满足于仅获得近似样本,即来自某个近似后验的其他分布的样本。

正如我们之前所见,如果我们有来自后验的样本,最大似然学习是简单的。如果我们有来自其他分布的样本,我们仍然可以使用最大似然学习规则,但结果不确定。表面上,如果我们使用错误的分布来获取样本,可能会发生奇怪的事情。似乎没有任何保证情况会改善。

实际上,有一个保证:某些东西会得到改善。虽然不是模型生成数据的对数概率本身,但与之相关。事实上,它是该模型概率的一个下界。通过提升这个下界,我们通常也能提升对数概率。


本节课中我们一起学习了学习Sigmoid信念网络的核心挑战——“解释消除”现象,理解了理想情况下的最大似然学习规则,并初步认识了蒙特卡洛和变分这两种应对学习难题的主要方法框架。理解这些基础是掌握后续具体学习算法的关键。

13.4:Wake-Sleep算法 🧠💤

在本节课中,我们将学习一种用于高效学习Sigmoid信念网络的早期方法——Wake-Sleep算法。我们将了解其核心思想、具体步骤,并探讨其优势与局限性。


概述

学习复杂的模型(如Sigmoid信念网络)是困难的,因为当给定一个数据向量时,很难从隐藏配置的真实后验分布中获取样本。Wake-Sleep算法提出了一个看似“疯狂”的想法:我们使用来自另一个分布的样本来近似后验分布,并希望学习过程仍然有效。这个想法后来催生了机器学习中一个全新的领域——变分学习。

核心思想:变分方法

变分方法的基本思想是:既然计算正确的后验分布很困难,我们就计算一个更廉价的近似,然后仍然进行最大似然学习。也就是说,我们应用一个学习规则,这个规则在我们从真实后验中获得样本时是正确的,并希望即使我们没有获得真实样本,它也能奏效。

这听起来可能行不通,但学习过程本身会起到“补救”作用。当我们使用近似后验时,驱动权重更新的实际上有两项:

  1. 一项驱动权重,使模型能更好地拟合训练数据。
  2. 另一项则驱动权重,使得我们使用的近似后验能更好地拟合真实后验。它通过操纵真实后验来尝试使其适应近似后验。

正是由于这种效应,这类模型的变分学习效果相当不错。

近似分布:因式分解假设

我们将使用的分布是一个忽略“解释消除”效应的分布。我们错误地假设,给定数据后,隐藏配置的后验分布可以因式分解为每个独立隐藏单元分布的乘积。

换句话说,我们假设给定数据后,每个隐藏层中的单元是相互独立的,就像在受限玻尔兹曼机中一样。但在Sigmoid信念网络中,这个假设并不成立。

什么是因式分布?

在因式分布中,整个向量的概率就是其各个分量概率的乘积。

公式示例
假设一个隐藏层有三个单元,它们被激活的概率分别为 0.30.60.8。要计算隐藏层状态为 [1, 0, 1] 的概率,我们计算:
P([1,0,1]) = 0.3 * (1-0.6) * 0.8

通常,一个长度为 n 的二元向量分布有 2^n - 1 个自由度。而一个因式分布只有 n 个自由度,它是一个简单得多的对象。

Wake-Sleep算法详解 🌀

Wake-Sleep算法利用了“使用错误分布”这一思想。在该算法中,神经网络有两组不同的权重:

  • 生成权重(绿色):定义模型数据向量概率分布的权重。
  • 识别权重(红色):用于近似获取后验分布的权重。

该算法包含两个交替进行的阶段:

1. Wake阶段(清醒期)

在Wake阶段,我们将数据输入底部的可见层,并使用识别权重进行前向传播。在每个隐藏层,我们为每个隐藏单元独立地做出随机的二元决策(开启或关闭)。

前向传播为所有隐藏单元获得了随机的二元状态。然后,我们将这些状态视为从给定数据的真实后验分布中采样的样本,并据此对生成权重进行最大似然学习。

简单来说:用识别权重驱动网络前向传播,但学习的是生成权重。

2. Sleep阶段(睡眠期)

在Sleep阶段,我们做相反的事情。我们使用生成权重来驱动系统。我们从顶层隐藏层的一个随机向量开始,根据其先验(独立)生成这些隐藏单元的二元状态,然后逐层向下,生成每一层的状态。这是生成模型定义的正确数据生成方式,因此我们能从模型中生成一个无偏样本。

生成样本后,我们尝试从数据中恢复隐藏状态(或从H1层的状态恢复H2层的状态)。也就是说,我们训练识别权重,使其尝试恢复实际生成了下层状态的隐藏状态。

简单来说:用生成权重驱动网络生成数据,但学习的是识别权重。

实践证明,如果从随机权重开始,并交替进行Wake阶段和Sleep阶段,模型可以学习到一个相当好的结果。

算法的局限性

尽管有效,Wake-Sleep算法存在一些缺陷:

  1. 次要问题:在学习的初期,识别权重学习的是在数据空间之外的部分反转生成模型,因为此时模型生成的数据与真实数据差异很大。这是一种浪费,但不是大问题。
  2. 严重问题:模式平均:识别权重不仅不遵循数据对数概率的梯度,甚至不遵循其变分下界的梯度。因为它们没有遵循正确的梯度,会导致不正确的“模式平均”。我们将在下一部分详细解释。
  3. 近似误差:我们知道,由于解释消除效应,顶层隐藏层的真实后验分布远非独立,但我们却被迫用一个假设独立的分布来近似它。不过,对于中间隐藏层,这种近似可能没那么糟糕,因为来自下方的解释消除效应可能会被来自上方的先验效应部分抵消。

尽管存在这些问题,卡尔·弗里斯顿认为这就是大脑的工作方式。我们最初提出该算法时,也认为这是一个关于大脑如何学习的有趣新理论。但目前我认为它存在太多问题,不可能是大脑的工作方式,未来我们会找到更好的算法。

模式平均问题详解

让我们用之前见过的“地震与卡车”小模型来解释模式平均。

假设我们运行Sleep阶段,并从模型中生成数据。大多数时候,顶层的两个单元是关闭的。只是偶尔(概率极低),其中一个单元会开启,且左右单元开启的概率相等。当某个顶层单元开启时,可见单元有0.5的概率开启。

现在考虑可见单元开启的那些情况。其中一半情况是左侧隐藏单元开启,另一半是右侧隐藏单元开启,几乎不会出现两个都开或都不开的情况。

那么,识别权重的学习会怎么做呢?当可见单元为1时,有一半时间顶层左侧单元是开的,另一半时间右侧单元是开的。因此,识别权重将学会产生一个隐藏层的因式分布,其中每个单元开启的概率都是 0.5

这个因式分布将其质量的四分之一放在了配置 [1,1] 上,另外四分之一放在 [0,0] 上。而给定可见单元开启时,这两种配置都极不可能出现。更好的做法是只选择一个模式(例如,只支持“卡车”或只支持“地震”),这是在被迫使用因式模型时所能得到的最佳识别模型。

图示说明
即使我们处理的是隐藏配置,最佳表示是正方形的两个角(对应 [1,0][0,1])。真实后验是双峰的(黑色曲线)。而如果我们使用Wake-Sleep算法的Sleep阶段,学习到的近似将是红色曲线,它给予隐藏单元的四种状态以相等的概率。最佳解决方案本应是选择其中一个状态并给予其全部概率质量。

在变分学习中,我们操纵真实后验以使其适应我们使用的近似。通常在学习中,我们是操纵一个近似去适应真实事物,但在这里是反过来的。


总结

本节课我们一起学习了Wake-Sleep算法。我们了解到,该算法通过交替进行“Wake”和“Sleep”两个阶段,使用因式分布的近似后验来学习Sigmoid信念网络的生成权重和识别权重。其核心的变分思想——用廉价近似代替真实后验并进行学习——为后来的变分学习方法奠定了基础。同时,我们也分析了该算法存在的模式平均等局限性。尽管它可能不是大脑或现代应用的最佳算法,但其开创性的思路在机器学习发展史上具有重要意义。

14.1:通过堆叠RBM学习特征层 🧠

在本节课中,我们将学习一种不同的方法来学习深度神经网络,即通过堆叠受限玻尔兹曼机来逐层学习非线性特征。这种方法意外地解决了深度Sigmoid信念网络的训练难题,并最终引发了深度神经网络研究的复兴。

从RBM到深度特征学习

上一节我们介绍了Sigmoid信念网络,本节中我们来看看一种不同的学习深度模型的方法。这个方法源于一个意外的发现:研究者放弃了直接学习有向的Sigmoid信念网络,转而研究无向的玻尔兹曼机,并发现受限玻尔兹曼机可以高效地学习。

受限玻尔兹曼机可以高效地学习一层非线性特征。一个很自然的想法是,将这些学习到的特征视为新的“数据”,然后应用另一个RBM来建模这些特征之间的相关性。我们可以继续这个过程,将一个RBM堆叠在另一个之上,从而学习多层非线性特征。

这种方法最终极大地推动了深度神经网络的研究兴趣。随之而来的问题是:一旦堆叠了多个RBM,每个RBM都学习前一层RBM产生的特征活动模式,那么我们是得到了一组独立的RBM,还是可以将它们组合成一个统一的模型?

一个合理的预期是,如果将一组RBM组合成一个模型,得到的结果应该是一个多层玻尔兹曼机。然而,一位名叫Geoffrey Hinton的研究生发现,结果并非如此。实际上,你得到的是一个看起来更像Sigmoid信念网络的东西。这是一个巨大的惊喜,因为我们通过放弃直接学习深度Sigmoid信念网络,转而专注于学习像玻尔兹曼机这样的无向模型,意外地解决了如何学习深度Sigmoid信念网络的问题。

堆叠RBM的过程 📚

以下是堆叠RBM学习多层特征的具体步骤:

  1. 训练第一层RBM:使用高效的RBM学习算法,训练一层直接从像素接收输入的特征。
  2. 将特征激活视为数据:将这些特征检测器的激活模式视为新的“像素”。
  3. 训练后续层:在第二个隐藏层学习另一层特征,建模下层特征之间的相关活动。
  4. 重复堆叠:可以按需重复此过程多次,每增加一层新特征,就建模其下一层特征的相关活动。

可以证明,每次添加新层时,都在改进某个组合模型生成数据的对数概率的变分下界。这个证明虽然复杂,并且只在理想条件下成立,但它表明这种堆叠RBM的做法是合理的。证明基于一个巧妙的等价关系:一个RBM等价于一个无限深的信念网络。

组合模型:深度信念网络

当我们学习两个堆叠的RBM,然后将它们组合成一个整体模型时,会发生什么?这个组合模型被称为深度信念网络

首先,我们学习第一个RBM及其权重 W1。训练完成后,我们取该RBM在查看数据时的隐藏活动模式,并将每个隐藏活动模式视为训练第二个RBM的数据。我们只是将二进制状态复制到第二个RBM,然后学习第二个RBM的权重 W2

一个有趣的现象是,如果我们初始化第二个RBM,使 W2 等于 W1 的转置,并且 H2 的隐藏单元数量与 V 相同,那么第二个RBM已经是一个相当好的 H1 模型,因为它只是第一个模型的倒置。对于一个RBM来说,哪边是可见层、哪边是隐藏层并不重要,它只是一个学习了模型的双向图。

学习完这两个RBM后,我们将它们组合成一个单一模型。这个单一模型看起来是这样的:它的顶部两层与顶部的RBM相同,是一个具有对称连接的无向模型。但它的底部两层是一个有向模型,就像一个Sigmoid信念网络。我们所做的是,取 VH1 之间的对称连接,丢弃了向上的部分,只保留了向下的部分。这样做的原因相当复杂。

得到的组合模型显然不是玻尔兹曼机,因为它的底层连接不对称。它是一种我们称为深度信念网络的图模型,其中较低层就像Sigmoid信念网络,而顶部两层形成一个RBM。因此,它是一种混合模型。

如果我们堆叠三个RBM,会得到一个类似的混合模型:顶部两层仍然是RBM,下面的层则像Sigmoid信念网络一样是有向的。

从模型生成数据 🎲

从这个模型生成数据的正确流程如下:

  1. 顶层RBM采样:首先,在 H2H3 之间来回进行多次吉布斯采样,直到在顶层RBM中达到平衡。这涉及并行更新 H3 中的所有单元,然后并行更新 H2 中的所有单元,如此反复多次,直到从顶层RBM获得一个平衡样本。顶层RBM定义了 H2 的先验分布。
  2. 自上而下传递:完成上述步骤后,只需使用生成连接 W2H2H1 进行一次传递。然后,无论你在 H1 中得到什么二进制模式,再使用权重 W1 进行一次传递以生成数据。

因此,我们执行一个从 H2 开始的自上而下的传递,以获取所有其他层的状态,就像在Sigmoid信念网络中一样。图中较低层显示的红色自下而上连接不是生成模型的一部分,它们实际上是对应权重的转置(即 W1W2 的转置),将用于推断,但不属于模型本身。

贪婪学习为何有效?🔍

在解释为什么堆叠RBM是个好主意之前,需要理清“平均两个因式分解分布”意味着什么。你可能会惊讶地发现,如果我平均两个因式分解分布,我不会得到一个因式分解分布。这里的“平均”指的是取分布的混合:首先随机选择两个分布中的一个,然后从你选中的那个生成样本。

假设我们有一个包含四个隐藏单元的RBM。给定一个可见向量 V1,这四个隐藏单元的后验分布是因式分解的。假设分布是前两个单元开启的概率为0.9,后两个为0.1。因式分解意味着,例如,从这个分布中采样时,前两个单元同时开启的概率正好是 0.9 * 0.9 = 0.81

现在假设有另一个输入向量 V2,相同四个隐藏单元的后验分布变为 [0.1, 0.1, 0.9, 0.9]。如果我们平均这两个分布,每个隐藏单元开启的平均概率确实是每个分布均值的平均,即 [0.5, 0.5, 0.5, 0.5]。但你得到的并不是由这四个概率定义的因式分解分布。以隐藏单元向量 [1, 1, 0, 0] 为例,在 V1 的后验中,其概率为 0.9*0.9*0.1*0.1 = 0.0081;在 V2 的后验中,这个向量极不可能,概率为 0.1*0.1*0.9*0.9 = 0.0081。平均这两个概率得到约 0.0081。这比一个均值为0.5的因式分解分布分配给该向体的概率 0.5^4 = 0.0625 要小得多(注:此处原文计算和比较有误,根据上下文逻辑,意在说明混合分布非因式分解)。关键在于,当你平均两个因式分解的后验时,你得到的是一个非因式分解的混合分布

现在,让我们看看为什么贪婪学习(先学一个RBM,再学第二个RBM来建模第一个RBM隐藏单元的活动模式)是有效的。

底层RBM的权重实际上以一致的方式定义了四种分布:

  • P(v|h):给定隐藏单元时可见单元的概率。
  • P(h|v):给定可见单元时隐藏单元的概率。
  • P(v, h):联合分布。
  • P(h):忽略 v 时,由该RBM定义的 h 的先验分布。
  • P(v):忽略 h 时,由该RBM定义的 v 的先验分布。

我们将从这四种分布中选取一对令人惊讶的分布来定义模型。我们将RBM分配给可见向量 v 的概率定义为:
P(v) = Σ_h P(h) * P(v|h)
这看起来有点奇怪,因为定义 P(h) 和定义 P(v) 一样困难。尽管如此,我们就这样定义 P(v)

现在,如果我们保持 P(v|h) 不变,但学习一个更好的 P(h) 模型(即学习一些新参数,给我们一个更好的 P(h) 模型),并用它代替我们原有的 P(h) 模型,那么我们实际上会改进我们对 v 的建模。这里“更好的 P(h) 模型”指的是一个能更好拟合聚合后验的先验。聚合后验是整个训练集中所有数据向量对应的隐藏层后验分布的平均。

我们要做的就是:使用我们的第一个RBM来获得这个聚合后验,然后使用我们的第二个RBM来构建一个比第一个RBM更好的聚合后验模型。如果我们把第二个RBM初始化为第一个RBM的倒置,那么它开始时对聚合后验的模型将与第一个RBM的相同,然后如果我们改变权重,只能使模型变得更好。这就是贪婪学习有效性的解释。

微调:对比唤醒-睡眠算法 ⚙️

堆叠RBM之后,一旦我们学习了一堆RBM并将它们组合成一个深度信念网络,我们就可以使用对比唤醒-睡眠算法的变体来微调整个复合模型。

首先,我们通过堆叠RBM来学习多层特征。然后,我们希望微调自下而上的识别权重和自上而下的生成权重,以获得更好的生成模型。我们可以通过使用三种不同的学习规则来实现:

  1. 自下而上传递与生成权重更新:首先进行随机的自下而上传递。然后调整较低层的自上而下生成权重,使其擅长重建下一层的特征活动。这与标准的唤醒-睡眠算法中的“唤醒”阶段类似。
  2. 顶层RBM的对比散度学习:在顶层RBM中,进行几次前向后向的吉布斯采样,采样该RBM的隐藏层和“可见”层(即下一层的激活)。然后使用对比散度学习更新该RBM的权重:利用数据首次到达该RBM时的相关性,与在该RBM内进行几次迭代后的相关性之间的差异来更新权重。
  3. 自上而下传递与识别权重更新:然后,取该顶层RBM的“可见”单元(即其下一层的单元),从那里开始,使用有向的下层连接(即一个Sigmoid信念网络)进行一次随机的自上而下传递,生成一些数据。接着,调整自下而上的权重,使其擅长重建上一层的特征活动。这就是唤醒-睡眠算法中的“睡眠”阶段。

与标准唤醒-睡眠算法的不同之处在于:

  • 顶层RBM作为对顶层活动的更好的先验,而不仅仅是Sigmoid信念网络中假设的独立单元层。
  • 我们不是通过从先验采样来生成数据,而是观察一个训练案例,向上传播到顶层RBM,然后在生成数据之前只运行几次吉布斯采样迭代。

实例:手写数字识别 🔢

现在我们将看一个例子:首先学习一些堆叠的RBM,然后使用对比唤醒-睡眠算法进行微调,最后观察它作为生成模型和识别模型的效果。

首先,我们将使用500个二进制隐藏单元来学习建模28x28像素图像中的所有10个数字类别。我们在没有标签的情况下学习这个RBM(无监督学习)。然后,我们取这500个隐藏单元在查看数据时的活动模式,将这些活动模式视为数据,并学习另一个也有500个单元的RBM。前两个隐藏层都是在没有标签的情况下学习的。

之后,我们才告诉它标签。我们添加一个大的顶层,并给它10个标签。你可以认为我们将这10个标签与代表特征的500个单元连接起来,只不过这10个标签实际上是一个10维的softmax单元。然后,我们训练这个顶层RBM来建模这10个标签的softmax单元与由下面两层产生的500个特征活动的联合分布。

训练完顶层RBM后,我们可以使用对比唤醒-睡眠算法微调整个系统。这样我们就得到了一个非常好的生成模型,也就是在本课程介绍视频中展示的那个模型。在那个介绍视频中,你可以看到这个模型在运行时有多好,无论是识别还是生成。现在,你已经了解了这个模型是如何被学习出来的。


本节课中我们一起学习了如何通过堆叠受限玻尔兹曼机来逐层学习深度特征,从而构建深度信念网络。我们探讨了堆叠的过程、组合模型的原理、生成数据的方法、贪婪学习有效的理论解释,以及如何使用对比唤醒-睡眠算法进行微调。最后,通过一个手写数字识别的实例,我们看到了这种方法的实际应用和强大能力。

14.2:深度信念网络的判别式学习 🧠

在本节课中,我们将学习如何通过堆叠受限玻尔兹曼机来构建一个深度信念网络,然后将其视为一个深度神经网络,并进行判别式微调。我们将探讨这种方法为何有效,以及它如何克服传统反向传播的局限性,最终在图像识别和语音识别等任务上取得突破性成果。

上一节我们介绍了如何使用对比醒眠算法对深度网络进行生成式微调。本节中,我们来看看如何使用反向传播对模型进行判别式微调。

判别式微调的原理

首先,我们通过逐层堆叠受限玻尔兹曼机来学习特征。这被视为一种预训练,为深度神经网络找到一组良好的初始权重。随后,我们使用局部搜索程序(如反向传播)对这些权重进行微调,使其在分类任务上表现更好。

这种方法克服了反向传播的许多标准限制,使得学习深度网络变得更容易,并且这些网络的泛化能力也更强。

预训练为何有效:优化与泛化

我们需要理解为何在预训练权重后,反向传播的效果会更好。这主要归因于两个效应:优化效应泛化效应

优化效应:预训练具有良好的可扩展性,尤其是在每层具有局部连接性的大型网络中。例如,在处理视觉任务时,每层的局部感受野使得不同区域之间的交互很少,因此可以近乎并行地学习大型层。在开始反向传播之前,我们已经通过预训练学到了合理的特征检测器。这些特征检测器对判别任务非常有帮助,因此初始梯度比使用随机权重时更加合理。反向传播无需进行全局搜索,只需从一个合理的起点进行局部搜索。

泛化效应:除了易于优化,预训练的网络表现出更少的过拟合。这是因为最终权重中的大部分信息来自于对输入向量分布的建模。以图像为例,输入向量通常包含比标签多得多的信息。标签通常只包含少量信息来约束从输入到输出的映射,而图像则包含大量信息,这些信息会约束任何图像集合的生成模型。标签信息仅用于最终的微调阶段。由于到那时我们已经确定了特征检测器,因此不会浪费这些宝贵的信息从头开始设计特征检测器。微调只对我们生成式预训练阶段学到的特征检测器进行微小的调整,这些调整是为了将决策边界放置在正确的位置。关键在于,反向传播不需要去发现新的特征,因此它不需要那么多的标记数据。

事实上,这种学习方法在大多数数据未标记的情况下效果很好,因为生成式预训练可以利用所有这些数据,未标记的数据对于发现好的特征仍然非常有用。

对预训练的质疑与回应

对于这种学习方式,存在一个明显的质疑:当我们进行生成式预训练时,可能会学到许多对特定判别任务无用的特征。

例如,你可能希望网络区分不同的形状,或者区分同一形状的不同姿态,这需要非常不同的特征。如果你事先不知道任务是什么,你不可避免地会学到一些永远不会用到的特征。

在计算机规模较小的时代,这是一个严重的缺点。但现在计算机已经足够强大,我们可以负担得起学习一些永远不会用到的特征。这是因为在我们学到的所有特征中,总会有一些比原始输入更有用的特征,这足以弥补我们学到了一些对特定任务无用的特征这一事实。

应用于MNIST数字建模

现在,我们将这种方法应用于MNIST数字建模。我们将完全无监督地学习三层隐藏特征。完成学习后,当我们从模型中生成样本时,它会生成看起来像真实数字的图像,并且会生成来自所有不同类别的数字。它通常会在从一个类别切换到另一个类别之前停留一段时间,因为它倾向于在同一个“山谷”中停留一段时间,然后才跳转到另一个“山谷”。

但问题是,我们以这种方式学到的特征对执行判别任务有用吗?我们只需要在顶部添加一个最终的10路softmax层,并使用反向传播进行微调,然后看看是否比纯粹的判别式训练效果更好。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字建模的结果。

以下是关于MNIST数字

14.3:判别式微调详解 🔍

在本节课中,我们将详细探讨神经网络在经过玻尔兹曼机堆叠预训练后,进行判别式微调时会发生什么。我们将看到,尽管底层权重变化微小,但这些变化对网络的分类性能有显著影响。此外,我们还将分析预训练如何使深层网络比浅层网络更有效,并解释为何先进行生成式训练再进行判别式训练是合理的做法。

微调过程中的权重变化

上一节我们介绍了判别式微调的基本概念,本节中我们来看看微调过程中权重的具体变化。在 Yoshua Bengio 实验室的研究中,研究人员观察了神经网络在经过生成式预训练后进行微调时的权重变化。

在左侧,我们可以看到经过生成式预训练但尚未进行微调时,第一层隐藏层特征检测器的感受野。右侧则是经过微调后的同一层感受野。几乎看不到任何明显变化。然而,这些微小的变化却显著提升了网络的判别能力。

预训练对网络性能的影响

了解了权重变化的特性后,我们进一步探讨预训练对网络整体性能,特别是对不同深度网络的影响。

以下是预训练如何减少具有一个隐藏层的网络的测试误差示例。该任务是在一个包含大量扭曲数字的数据集中区分数字。

  • 经过反向传播微调后,经过预训练的网络几乎总是比未经预训练的网络表现更好。
  • 如果使用更深的网络,这种效果会更加明显。图中显示,两个分布几乎没有重叠。
  • 经过预训练的深层网络比浅层网络表现更好,而未经预训练的深层网络则比浅层网络表现更差。

此图展示了分类误差及其变化情况,随网络层数的改变而变化。

  • 当不进行预训练时,两层网络似乎是最佳选择。当网络达到四层时,性能会显著下降。
  • 相比之下,如果使用预训练,四层网络优于两层网络,误差变化更小,且整体误差更低。

预训练与未预训练网络的函数空间对比

为了更深入地理解预训练的效果,我们需要比较网络在函数空间中的行为,而不仅仅是权重向量。

以下是使用 t-SNE 技术对预训练和未预训练网络在训练过程中权重变化进行的可视化。所有网络都被绘制在同一空间中,但形成了两个明显不同的类别。

  • 顶部的点是未经预训练的网络。
  • 底部的点是经过预训练的网络。

每个点代表函数空间中的一个模型。颜色表示训练的不同阶段。

  • 观察顶部的网络(未预训练),初始阶段有一个深蓝色的点群。可以看到,经过一个训练周期后,这些点大致朝同一方向移动。换句话说,经过一个周期学习后的网络彼此之间比初始网络更为相似。
  • 底部的预训练网络,这种趋势更为明显。

顶部的训练轨迹(未预训练)显示,不同的网络最终会到达函数空间的不同位置,且分布相当分散。底部的训练轨迹(预训练)显示,经过预训练后,网络会到达函数空间中一个完全不同的区域,并且网络之间往往更加相似。

关键点在于,这两种解决方案没有重叠。通过生成式预训练网络所找到的解决方案类型,与从小型随机权重开始训练所找到的解决方案类型,在性质上是完全不同的。

为何预训练是合理的

在本视频的最后,我想解释为什么预训练是合理的。让我们想象一下生成图像-标签对的方式。

一种方式是,我们利用现实世界中的事物生成图像(例如拍照),然后为图像附加一个标签,而这个标签不依赖于现实世界中的事物。也就是说,在给定图像本身的前提下,现实世界中的事物是无关的,标签仅取决于图像中的像素。例如,标签告诉我们左上角像素是否与右下角像素相似。

如果以这种方式生成图像,那么尝试学习从图像到标签的映射是有意义的,因为标签直接依赖于图像。

但实际上,更合理的图像-标签对生成方式是:现实世界中存在某些事物,这些事物产生了图像,而图像之所以有某个名称,正是因为现实世界中的这些事物,而不是因为图像中的像素。例如,你看到一头牛,拍了一张照片,你称这张照片为“牛的照片”,是因为你在拍照时正在看一头牛。

这里的关键在于,从现实世界到图像存在一条高带宽的路径,而从现实世界到标签则存在一条低带宽的路径。例如,如果我只说“牛”,你并不知道这头牛是倒立的还是正立的,是棕色的还是黑白的,是活的还是死的,有多大,图像中还有什么其他东西,它是面向你还是背对你。所有这些信息都没有通过标签传达。

如果你看到一张包含成千上万个像素的图像,你通常能知道所有这些信息。通过观察图像,你获得的关于图像成因的信息量,远比通过观察图像标签获得的信息量要多得多。

因此,在这种情况下,更合理的做法是:首先尝试反转高带宽路径,以回溯到导致图像的现实世界中的事物;然后,在恢复了导致图像的这些现实世界事物之后,再决定应该给它赋予什么标签。

这是一个更合理的、我们为图像中事物命名的模型。这也证明了先进行一个预训练阶段(尝试从图像到其潜在成因)是合理的,随后再进行一个判别式阶段(尝试从这些潜在成因到标签),并且可能对从图像到潜在成因的映射进行轻微的微调。

总结

本节课中,我们一起学习了判别式微调的详细过程。我们看到,微调主要引起底层权重的微小变化,但这些变化能显著优化决策边界,从而提升分类性能。预训练不仅普遍提升了网络性能,更重要的是,它改变了深度网络与浅层网络的效能对比,使得深层网络能够超越浅层网络,并收敛到函数空间中更优、更一致的解区域。最后,我们从信息论的角度理解了预训练的合理性:它模拟了从高带宽的感官数据(图像)中推断潜在成因,再根据这些成因进行低带宽的判别(分类)这一更符合现实世界认知过程的路径。

14.4:使用RBM建模实值数据 📊

在本节课中,我们将学习如何使用受限玻尔兹曼机来建模实值数据,例如图像像素的连续强度值。我们将看到,将可见单元从二值随机单元改为带有高斯噪声的线性单元,并配合使用修正线性单元作为隐藏单元,可以有效地解决建模过程中的学习难题。

从二值到实值:为何需要改变? 🔄

上一节我们介绍了用于二值数据的RBM。然而,对于像真实图像这样的实值数据,简单的二值单元(如逻辑单元)无法很好地建模。

在真实图像中,一个像素的强度值通常非常接近其邻居的平均值。这意味着该值有很高的概率出现在平均值附近,而偏离该值的概率则迅速减小。逻辑单元无法精确表示这种“强度值为0.69,但几乎不可能是0.71或0.67”的概率分布。

因此,我们需要一种新的单元类型。

高斯线性单元:建模实值数据 📈

一个显而易见的解决方案是使用带有高斯噪声的线性单元。这样,我们可以将像素建模为高斯变量。

我们仍然可以使用交替吉布斯采样来运行对比散度学习所需的马尔可夫链。但此时需要使用更小的学习率,否则模型容易发散。

其能量方程如下:

E(v, h) = Σ_i (v_i - b_i)^2 / (2 * σ_i^2) - Σ_j b_j h_j - Σ_{i,j} (v_i / σ_i) * w_{ij} * h_j

以下是该方程各部分的解释:

  • 第一项:这是一个抛物线形的约束函数,防止数值爆炸。对于第 i 个可见单元,该项是一个以偏置 b_i 为最小值的抛物线,旨在将可见单元的值保持在 b_i 附近。
  • 交互项:描述可见单元与隐藏单元之间的相互作用。该项对 v_i 的导数是常数 Σ_j h_j * w_{ij} / σ_i,其效果是线性地推动可见单元均值的偏移。

隐藏单元的总效果就是线性地推动可见单元均值的偏移。虽然写出这样的能量函数并求导很容易,但在实际学习时,我们常常会遇到问题。

学习难题:方差与权重的冲突 ⚖️

文献中有很多报告指出,高斯-二值RBM难以训练。其中一个核心难题是学习可见单元的方差(σ_i)非常困难。

下图有助于理解原因。考虑可见单元 i 对隐藏单元 j 的影响:

  • 当可见单元 i 的标准差 σ_i 很小时,自底向上的权重效应会被放大(因为需要以标准差为单位衡量活动)。
  • 同时,自顶向下的权重效应会被衰减(因为乘以了小的 σ_i)。

这导致了一个冲突:要么自底向上的效应过大,要么自顶向下的效应过小。结果是隐藏单元容易饱和(始终开启或关闭),从而破坏学习过程。

解决方案是使用比可见单元数量多得多的隐藏单元。这样,即使可见单元和隐藏单元之间的权重很小,由于隐藏单元数量众多,其自顶向下的总效应仍然可以很强。当然,理想情况下,隐藏单元的数量应能随着标准差 σ_i 的减小而动态增加。

解决方案:修正线性单元 🛠️

为了实现隐藏单元数量随需要动态增加的效果,我们可以引入“阶梯式Sigmoid单元”的概念。

其思想是为每个随机二值隐藏单元创建多个副本。所有副本共享相同的权重和学习到的偏置 b,但每个副本有一个固定的偏置偏移量(例如-0.5, -1.5, -2.5...)。这样,随着总输入 x 的增加,被激活的副本数量会线性增加。当可见单元的标准差变小时,被激活的隐藏单元副本数量就会增加,从而提供更强的自顶向下效应。

然而,使用大量带偏移偏置的二值随机单元计算成本很高。我们可以采用更快的近似方法,效果同样好。

以下是关键的近似公式:

Σ_k sigmoid(x - k + 0.5) ≈ log(1 + exp(x)) ≈ max(0, x)

这个 max(0, x) 函数定义的单元,就是修正线性单元。它计算速度快得多,并且对比散度学习在这种单元上同样运行良好。

修正线性单元的优良特性:尺度等变性 🌟

修正线性单元有一个很好的特性:如果其偏置为0,则具有尺度等变性。这对于图像处理非常有用。

尺度等变性意味着,如果你将图像 X 的所有像素强度乘以一个标量 a,那么图像 aX 在修正线性单元中的表示,就是 a 乘以图像 X 的表示。换句话说,当我们缩放图像强度时,所有单元的活性按相同比例缩放,但比例关系保持不变。

这种特性与卷积网络(忽略池化层时)的平移等变性非常相似。在卷积网络中,输入图像的平移只会导致网络各层表示的相应平移,而不会改变其内容。

总结 📝

本节课中,我们一起学习了如何使用RBM建模实值数据。核心要点是:

  1. 对于实值数据(如图像像素),需要使用高斯线性单元作为可见单元。
  2. 直接使用高斯-二值RBM学习会遇到方差与权重冲突的难题,导致隐藏单元饱和。
  3. 解决方案是使用修正线性单元作为隐藏单元。它本质上是“阶梯式Sigmoid单元”的高效近似,能动态提供所需的建模能力,并且计算速度快。
  4. 修正线性单元具有尺度等变性,这是一个对图像建模非常有益的属性。

通过结合高斯线性可见单元和修正线性隐藏单元,我们可以有效地学习一个能很好建模实值数据的受限玻尔兹曼机。

14.5:RBM是无限深的Sigmoid信念网络 🧠

在本节课中,我们将探讨一个高级主题:受限玻尔兹曼机与无限深的Sigmoid信念网络之间的深刻等价关系。这个数学上非常优美的见解,揭示了逐层预训练和对比散度学习算法有效性的根源。

上一节我们介绍了深度学习的起源,本节中我们来看看一个核心的数学洞察:堆叠受限玻尔兹曼机本质上等同于构建一个具有共享权重的无限深Sigmoid信念网络。这种等价性无需复杂数学,仅通过观察结构即可理解。

RBM与无限深信念网络的等价性 🔄

一个受限玻尔兹曼机,实际上就是一个具有共享权重的无限深Sigmoid信念网络。这种权重共享的特性带来了非常有趣的结果。

以下是该等价关系的图示。我们有一个非常深(实际上是无限深)的Sigmoid信念网络。每一层都使用相同的权重矩阵。所有V层的大小必须相同,所有H层的大小也必须相同,但V和H的大小可以不同。

这个具有复制权重的深度网络所生成的分布,完全等同于通过交替执行 P(V|H)P(H|V) 所达到的平衡分布。这里的条件概率都由同一个权重矩阵 W 定义。而这正是我们从RBM运行马尔可夫链以获取平衡分布样本时所做的事情。

因此,从这个无限深的有向网络顶部开始进行的自上而下传播,完全等同于让一个RBM达到平衡状态。它们定义了相同的分布。如果你运行这个无限深网络,在 v0 处得到的样本,就是等价RBM的一个平衡样本。

无限深信念网络中的推理 🔍

现在,让我们看看在无限深Sigmoid信念网络中如何进行推理。在推理时,我们从 v0 开始,然后需要推断 H0 的状态。

通常情况下,由于“解释消除”效应,这会很困难。例如,如果隐藏单元K和J都对可见单元I有大的正权重,那么当我们观察到I激活时,K和J在后验分布中会变得负相关。这就是解释消除。

然而,在这个网络中,给定 V0 进行推理时,K和J是完全独立的。推理变得非常简单:我们只需将 v0 乘以权重转置 W^T,将结果通过逻辑Sigmoid函数,然后采样,就得到了 H0 中单元的二进制状态。

问题是,考虑到解释消除,它们怎么可能独立?答案是,H0 之上的模型实现了我称之为互补先验的东西。它实现的 H0 先验分布,恰好抵消了解释消除带来的相关性。

对于上面展示的例子,先验会在K和J之间实现正相关,而解释消除会导致负相关,两者恰好抵消。

实际上发生的是,当我们乘以权重转置时,我们不仅仅是在计算似然项,而是在计算似然项和先验项的乘积。这正是得到后验分布所需做的。

在这个网络中,由 H0 之上所有层实现的互补先验,精确地抵消了解释消除,使得推理变得非常简单。这在网络的每一层都成立

因此,我们可以对每一层进行推理,只需将 v0 乘以 W^T,就能得到每一层的无偏样本。一旦计算出 H0 的二进制状态,我们将其乘以 W,通过逻辑Sigmoid函数并采样,就得到了 V1 的二进制状态,依此类推,一直向上。

所以,正如从这个模型生成样本等同于运行RBM的交替马尔可夫链以达到平衡,在这个模型中执行推理,正是相反方向的同一过程。这是一种非常特殊的Sigmoid信念网络,其中推理和生成一样简单。

从有向网络学习规则到玻尔兹曼机学习规则 📈

上图展示了定义模型的生成权重(绿色),以及我们用于推理的它们的转置(红色)。现在我想展示的是,我们如何从有向Sigmoid信念网络的学习算法,得到玻尔兹曼机的学习算法。

Sigmoid信念网络的学习规则是:首先从后验分布中获取一个样本(即 SJSI),然后按比例改变一个生成权重,比例是突触前活动 SJ突触后活动 SI给定父层所有二进制状态时单元I激活的概率 P 之差 的乘积。

如果我们问如何计算 P,会发生一些非常有趣的事情。观察右边网络的推理过程:我们首先推断出 H0 的二进制状态。一旦选择了这个状态,我们通过将 H0 乘以 W,将结果输入逻辑函数并采样,来推断 V1 的二进制状态。

因此,SI1 的生成方式,正是我们将 H0 通过权重矩阵 W 再通过逻辑函数后得到的样本。而这正是我们计算 P 所需要做的:我们需要获取 H0 中的二进制活动,然后通过绿色的权重 W 向下传播,计算给定其父节点二进制状态时单元I激活的概率。

关键在于,从 H0V1 的过程,与从 H0V0 的过程是完全相同的。因此,SI1P 的一个无偏样本。这意味着我们可以在学习规则中用它来替换 P

我们最终得到一个如下所示的学习规则。由于我们有复制的权重,每一行都对应一个绿色权重矩阵的学习规则项。

对于第一个绿色权重矩阵,学习规则是:突触前状态 SJ0 乘以突触后状态 SI0 与概率 PI0 之差。而具有该概率的样本正是 SI1。因此,通过代入 SI1,可以得到导数的一个无偏估计。

类似地,对于第二个权重矩阵,学习规则是 SI1 乘以 SJ0PJ0 之差。而 PJ0 的一个无偏估计是 SJ1。这就是第二个权重矩阵学习规则的无偏估计。

如果对所有权重矩阵持续这个过程,你会得到一个无限级数,除了第一项和最后一项,所有中间项都相互抵消。最终你得到的就是玻尔兹曼机学习规则:SJ0 * SI0 - SJ∞ * SI∞

逐层学习与变分边界 📚

让我们回到如何学习一个无限深Sigmoid信念网络。我们首先将所有权重矩阵设为相同,即绑定所有权重,然后使用这些绑定的权重进行学习。这完全等价于学习一个受限玻尔兹曼机。左右两图是完全相同的。我们可以将左图中的对称箭头,视为具有绑定权重的无限深有向网络的一种简便表示。

我们首先学习那个RBM。虽然我们应该使用最大似然学习,但实际上我们将使用对比散度学习作为一种捷径。

一旦学习了第一个RBM,我们可以冻结底层权重(即定义模型的生成权重),同时冻结我们将用于推理的权重(即那些生成权重的转置)。我们保持所有其他权重绑定在一起,但现在允许它们与底层权重不同(但它们彼此之间仍然绑定)。

学习这些剩余的绑定权重,完全等价于学习另一个RBM。这个RBM以 H0 作为其可见单元,V1 作为其隐藏单元。而训练这个网络的数据,是跨 H0聚合后验分布

也就是说,要采样一个数据向量来训练这个网络,我们做的是:在 V0 输入一个真实数据向量,通过那些冻结的权重进行推理,得到一个二进制向量 H0,并将其视为训练下一个RBM的数据。我们可以根据需要向上堆叠任意多层。当我们堆叠足够多层后,最顶层就是一个RBM,这等价于说,在那之上的无限深有向网络中的所有权重仍然是绑定的,但其下的权重现在变得不同了。

我们对推理过程正确性的解释,依赖于由上层权重创建的互补先验这一概念。当然,当我们改变上层的权重而保持底层权重固定时,由这些已改变的权重创建的先验就不再是精确互补的了。因此,现在使用底层冻结权重的推理过程不再完全正确。

好消息是,它几乎总是非常接近正确。并且,即使使用不正确的推理过程,我们仍然能得到数据对数概率的一个变分下界。高层权重之所以改变,是因为它们学习到了一个更接近聚合后验分布的、针对底层隐藏层的先验分布,这使得模型变得更好。

所以,改变高层权重使得我们在底层隐藏层所做的推理变得不正确,但给了我们一个更好的模型。如果考察这两种效应,我们可以证明:从一个更好模型中获得的变分下界的提升,总是大于因推理略微不正确而造成的损失。因此,在这个变分边界框架下,学习高层权重时,只要你用正确的最大似然方法去做,你总是赢的。

对比散度学习的原理 🎯

现在让我们回到对比散度学习中发生了什么。右边是无限深网络,左边是RBM,两者等价。如果我们对RBM进行最大似然学习,那也就是对无限深Sigmoid信念网络进行最大似然学习。

但我们要做的是截断处理。我们将忽略在无限深Sigmoid信念网络更高层中得到的那些微小权重导数。我们在图中红色虚线处将其截断。

现在,如果我们观察导数,它们有两项。第一项来自底层权重,我们之前见过,底层权重的导数就是这里的第一行。第二项来自下一层权重,对应这里的第二行。我们需要计算 H1 中的活动来计算第二行中的 SJ1。但我们实际上并不计算第三层权重的导数。

当我们取前两项并将它们组合时,我们得到的正是一步对比散度的学习规则。因此,对比散度中发生的是:我们组合了较低层的权重导数,而忽略了更高层的权重导数

为何可以忽略高层导数? 🤔

问题是,为什么我们可以忽略那些更高的导数?当权重很小时,马尔可夫链混合得非常快。如果权重为0,它一步就能混合。如果马尔可夫链混合得快,更高层将接近平衡分布,即它们将“忘记”底层输入是什么。

现在我们有一个很好的性质:如果更高层是从平衡分布中采样的,那么我们知道,数据对数概率相对于这些权重的导数,其平均值必须为0。这是因为模型中的当前权重是平衡分布的完美模型——平衡分布正是使用这些权重生成的。如果你想从平衡分布生成样本,这些就是你能拥有的最佳权重。所以我们知道梯度在那里是0。

随着权重变大,我们可能需要运行更多步的对比散度,这对应于考虑更多层无限深Sigmoid信念网络。这将使对比散度继续成为最大似然的一个良好近似。因此,如果我们试图学习一个密度模型,这是很有意义的:随着权重增长,你运行CD的步数也越来越多。如果有统计学家在场,你可以给他一个保证:在无限极限下,你将运行无限多步CD,然后你就有了一个渐近收敛的结果——这能让统计学家满意。当然,这完全无关紧要,因为你永远达不到那个点。

然而,这里有一个有趣的点:如果我们使用CD的目的是构建一个学习多层特征的RBM堆栈,那么事实证明,我们不需要一个对最大似然的良好近似。对于学习多层特征,CD1就足够了。事实上,它可能比做最大似然更好。

总结 📝

本节课中我们一起学习了受限玻尔兹曼机与无限深Sigmoid信念网络之间的深刻等价关系。我们了解到:

  1. 结构等价:一个RBM等价于一个具有共享权重的无限深有向信念网络。
  2. 互补先验:这种网络结构中的权重共享,在上层创建了一个“互补先验”,精确抵消了底层推理时的“解释消除”效应,使得推理变得和生成一样简单。
  3. 学习规则衍生:从有向信念网络的最大似然学习规则出发,通过用高层状态的样本近似期望值,并利用权重共享导致中间项抵消的性质,可以推导出RBM的对比散度学习规则。
  4. 逐层学习原理:堆叠RBM进行逐层预训练,对应于先冻结底层权重学习一个RBM,然后将其隐藏层的聚合后验作为数据,训练更高层的RBM。这虽然使底层的推理变得不精确,但通过优化一个变分下界,整体上仍然能得到更好的模型。
  5. 对比散度的有效性:CD学习通过截断无限深网络的高层导数来近似最大似然学习。当权重较小时,高层状态接近平衡分布,其导数的期望为零,因此忽略它们是合理的。CD1对于学习好的特征表示已经足够有效。

这个优雅的数学框架不仅解释了为什么深度信念网络和对比散度学习有效,也揭示了深度学习早期思想中权重共享和层次化表示的核心魅力。

15.1:从主成分分析到自编码器 🧠

在本节课中,我们将要学习主成分分析这一在信号处理中广泛使用的技术,并探讨如何将其思想扩展到使用神经网络,特别是自编码器,以实现更强大的数据降维与表示。

概述 📋

主成分分析的核心思想是,高维数据通常可以用一个维度低得多的编码来表示。这种情况发生在数据位于高维空间中的一个线性流形附近时。如果我们能找到这个线性流形,就可以将数据投影到该流形上,并仅用其在流形上的位置来表示它。这样做的损失很小,因为在垂直于流形的方向上,数据的变化不大。

主成分分析原理 🔍

主成分分析处理的是n维数据,目标是使用少于n个数字来表示它。为此,我们寻找数据方差最大的M个正交方向,并忽略数据变化很小的方向。这M个主方向构成了一个低维子空间。我们通过一个n维数据点在该低维空间中这M个方向上的投影来表示它。

我们丢失了数据点在其余正交方向上的所有位置信息。但由于这些方向本身方差很小,我们并未损失太多信息。

重建与误差

如果我们想根据这M个数字的表示来重建数据点,对于所有未被表示的 n - M 个方向,我们将使用其均值。

重建误差将是所有未被表示的方向上,数据点在该方向上的值与方向均值之差的平方和。这可以通过一个二维数据的例子直观理解。

考虑一个呈细长高斯分布的数据集。椭圆表示高斯分布的一个标准差轮廓。如果我们使用单一成分进行主成分分析,该成分将是数据中方差最大的方向。为了表示一个红色数据点,我们表示它沿该方向的距离,即该红点在线上的投影(绿点)。

当需要重建红点时,我们只需使用所有数据点在被忽略方向上的均值。也就是说,我们表示的是黑线上的一个点。因此,重建损失将是红点与绿点之间的平方差。我们丢失的正是数据点在我们未表示的方向(即方差最小的方向)上与所有数据均值的差异。显然,选择忽略方差最小的方向能最小化我们的损失。

用神经网络实现PCA 🧮

实际上,我们可以使用反向传播来实现PCA或其变体,尽管效率不高。具体做法是构建一个网络,其输出是数据的重建,并尝试最小化重建的平方误差。

该网络有一个中心瓶颈层,只包含M个隐藏单元,这些单元将对应于主成分或类似的东西。

以下是网络结构:

  • 我们有一个输入向量。
  • 将其投影到一个编码向量。
  • 从编码向量中,我们构建一个输出向量。
  • 目标是使输出向量尽可能接近输入向量。

编码向量中隐藏单元的活动形成了一个瓶颈。因此,编码向量是输入向量的一种压缩表示。

线性自编码器

如果隐藏单元和输出单元都是线性的,那么这样的自编码器将学习到能最小化平方重建误差的编码。这正是主成分分析所做的。

它将获得与主成分分析完全相同的重建误差。但其隐藏单元不一定精确对应于主成分。它们将张成与前M个主成分相同的空间,但这些轴可能存在旋转和倾斜。因此,编码单元的输入权重向量(代表成分的方向)可能不正交,并且与主成分分析不同,它们通常具有相等的方差。

然而,这些编码单元的输入权重向量所张成的空间,将与M个主成分所张成的空间完全相同。从这个意义上说,这个网络将执行与主成分分析等价的操作。

只是,如果我们对这个网络使用随机梯度下降学习,其效率通常远低于主成分分析所使用的算法。不过,如果数据量极大,它实际上可能更高效。

从PCA到非线性自编码器 🚀

使用神经网络中的反向传播来实现主成分分析的主要意义在于,它允许我们推广主成分分析。

网络结构

如果我们使用一个在编码层前后都有线性或非线性层的神经网络,就有可能表示位于高维空间中弯曲流形上的数据,而不仅仅是线性流形。这更具普适性。

我们的网络结构如下:

  • 输入向量。
  • 一层或多层非线性隐藏单元(通常使用逻辑单元)。
  • 一个编码层(可能是线性单元)。
  • 编码层之后,是一层或多层非线性隐藏单元。
  • 最后是一个输出向量,我们训练它使其尽可能接近输入向量。

这是一个有趣的网络,我们使用监督学习算法来进行无监督学习。

  • 编码器:网络的下半部分。它接收输入向量,并通过非线性映射将其转换为编码。
  • 解码器:网络的上半部分。它接收非线性编码,并将其映射回输入向量的重建。

学习完成后,我们就得到了双向的映射。

总结 ✨

本节课中我们一起学习了主成分分析的基本原理,它是一种通过寻找数据最大方差方向来实现降维的技术。我们探讨了其重建过程与误差计算。更重要的是,我们了解了如何用带有瓶颈层的线性神经网络(自编码器)来实现等效功能,并认识到这种方法的真正价值在于其可扩展性:通过引入非线性层,我们可以构建深度自编码器,从而学习数据在非线性弯曲流形上的低维表示,这比传统的线性PCA更加强大和通用。这种使用监督学习目标(最小化重建误差)进行无监督特征学习的思想,是深度学习中的一个重要概念。

15.2:深度自编码器 🧠

在本节课中,我们将要学习如何训练深度自编码器。自编码器是一种用于数据降维和特征学习的神经网络。我们将探讨其历史背景、训练难点以及现代解决方案,特别是逐层预训练方法如何使其性能超越传统的主成分分析。

历史背景与训练难题

上一节我们介绍了自编码器的基本概念,本节中我们来看看其深度版本的发展历程。

深度自编码器在20世纪80年代中期就被提出。但当时人们无法有效地训练它们,导致其性能无法显著超越主成分分析。虽然有多篇相关论文发表,但始终缺乏令人印象深刻的性能演示。

现代训练方法:逐层预训练

在开发出逐层预训练深度网络的方法后,情况发生了改变。

Rus Salakhutdinov 和我将这种方法应用于深度自编码器的预训练。这是我们首次从深度自编码器中获得比主成分分析好得多的数据表示。

深度自编码器一直被认为是进行降维的绝佳方法,因为它们理应比主成分分析表现更好。以下是其理论优势:

  • 它们能提供双向的、灵活的映射关系。
  • 这些映射可以是非线性的。
  • 其学习时间在训练样本数量上是线性或更优的复杂度。
  • 学习完成后,网络的编码部分速度很快,因为每层只需进行一次矩阵乘法运算。

然而,使用反向传播优化深度自编码器曾经非常困难。通常,人们尝试使用小的初始权重,但反向传播的梯度会消失。因此,对于深度网络,训练根本无法有效启动。

解决方案与成功案例

现在,我们有了更好的优化方法。我们可以使用无监督的逐层预训练,或者像回声状态网络那样,对权重进行合理的初始化。

第一个真正成功的深度自编码器由 Rus Salakhutdinov 和我在2006年实现。我们将其应用于 MNIST 手写数字数据集。以下是我们的方法步骤:

  1. 我们从784个像素的图像开始。
  2. 通过三个隐藏层将其编码为中央编码层的30个实值激活单元。
  3. 然后将这30个实值激活单元解码回784个重建像素。

我们使用堆叠的受限玻尔兹曼机来初始化编码部分的权重。然后,我们取这些权重的转置来初始化解码网络。因此,最初784个像素的重建使用的是编码权重的转置矩阵。

在四个受限玻尔兹曼机被训练并“展开”以提供解码转置器之后,我们应用反向传播来最小化784个像素的重建误差。在本例中,由于像素由逻辑单元表示,我们使用了交叉熵误差。

该误差通过整个深度网络进行反向传播。一旦开始反向传播误差,用于重建像素的权重就变得与用于编码像素的权重不同,尽管它们通常保持相当相似。

性能展示与对比

这种方法效果非常好。观察结果:

  • 第一行显示每个数字类别的一个随机样本。
  • 第二行显示由深度自编码器重建的随机样本,其中央层使用30个线性隐藏单元。数据被压缩为30个实数然后重建。
  • 观察数字“8”,可以看到重建结果实际上比原始数据更好。它去掉了“8”上的小缺陷,因为网络没有能力编码它。

与线性主成分分析相比,深度自编码器要好得多。一个映射到30个实数的线性映射无法在表示数据方面做得如此出色。

总结

本节课中我们一起学习了深度自编码器的训练。我们回顾了其早期因梯度消失问题而难以训练的困境,并重点介绍了通过逐层无监督预训练(如使用受限玻尔兹曼机)来有效初始化权重的现代方法。这种方法使得深度自编码器能够学习到强大且非线性的数据低维表示,其性能显著超越了传统的线性降维方法(如主成分分析),并在MNIST等数据集上得到了成功验证。

15.3:用于文档检索的深度自编码器 🗂️🔍

在本节课中,我们将学习如何应用深度自编码器进行文档检索。我们将了解如何将文档转换为向量,通过神经网络压缩这些向量以提取关键信息,并利用压缩后的编码高效地查找相似文档或可视化文档集合。

概述

文档检索的目标是找到与查询文档内容相似的其他文档。传统方法如潜在语义分析(LSA)使用主成分分析(PCA)处理词频向量。然而,深度自编码器作为一种非线性方法,能够更有效地从文档中提取信息,从而获得性能更优的文档编码。

从文档到词袋向量

为了比较文档,我们首先需要一种数值化的表示方法。以下是处理步骤:

我们首先将每个文档转换为一个“词袋”向量。这意味着我们统计文档中每个特定词汇的出现次数,形成一个计数向量,同时忽略词汇的顺序。

这种方法虽然丢弃了词序信息,但保留了关于文档主题的大量信息。我们通常会忽略“the”、“over”这类被称为“停用词”的词汇,因为它们对主题信息的贡献很小。

例如,对于一个文档,我们可能得到类似 {"vector": 5, "count": 3, "query": 2, ...} 的计数向量,这能有效反映文档的核心内容。

直接比较查询文档与数百万其他文档的长向量(例如2000维)会非常缓慢。因此,我们需要一种方法将这些高维向量压缩为更小、但仍包含核心信息的低维向量。

使用深度自编码器进行压缩

上一节我们介绍了文档的向量表示,本节中我们来看看如何对其进行压缩。我们使用深度自编码器来完成这个任务。

自编码器是一种神经网络,其目标是尽可能好地重建其输入。通过将2000维的词频向量压缩到仅10个实数组成的编码,再从这个编码重建原始向量,网络被迫将尽可能多的输入信息塞进这10个数字中。

训练完成后,我们只需比较文档对应的10维编码向量,这比直接比较2000维的原始向量要快得多。

处理词频数据的技巧

然而,词频计数与图像像素等实数值有所不同,需要特殊处理。以下是具体的预处理和网络设计步骤:

  1. 概率化:我们将词袋中的每个计数除以文档中非停用词的总数,从而将计数向量转换为一个概率向量。可以将其理解为从文档中随机抽取一个非停用词时,抽到某个特定词的概率。
  2. 输出层:在自编码器的输出层,我们使用一个巨大的2000路Softmax层。我们的目标值就是上述概率化后的词概率向量。
  3. 输入加权:还有一个技巧。当我们将概率向量作为第一隐藏层的输入时,我们会将所有权重乘以文档中的非停用词总数 n。这是因为我们有 n 次独立观测来自该概率分布。如果直接使用概率值,输入单元的激活值会非常小,无法为第一隐藏层提供足够的输入信号。因此,对于第一个受限玻尔兹曼机(RBM),其自下而上的权重是自上而下权重的 n 倍。

性能评估:与LSA的对比

那么,这种方法效果如何呢?我们在路透社数据集的4000篇商业文档上进行了训练,这些文档被人工标注了大约100个不同的类别。

我们首先训练了一堆受限玻尔兹曼机(RBM)进行预训练,然后使用反向传播进行微调,输出层是2000路的Softmax。接着,我们在另外4000篇文档上进行了测试。

测试时,我们选取一篇测试文档作为查询,然后根据自编码器生成的10维编码向量之间的余弦相似度,对所有其他测试文档进行排序。对每个可能的查询文档重复此过程后,我们绘制图表:横轴是计划检索的文档数量(即在排序列表中向下查看多远),纵轴是检索到的文档中与查询文档属于同一人工标注类别的比例。

虽然这不是衡量检索质量的完美指标,但我们用同样的指标与潜在语义分析(LSA)进行比较,因此至少是公平的。

以下是检索准确率随检索文档数量变化的曲线图。可以看到,仅使用10维实数编码的自编码器,其性能优于使用50维实数编码的潜在语义分析。当然,在获得编码后,处理每个文档的工作量也减少了五倍。而使用10维编码的LSA效果则要差得多。

二维可视化应用

我们也可以将文档压缩到仅两个实数。这样,我们就不再用于检索,而是可以将所有文档绘制在一张地图上进行可视化。

我们采用文档的主要类别,并为不同类别赋予不同颜色。首先,我们对词频计数取 log(1+count) 后进行PCA降维到2维并绘图(取对数可以抑制大数值,通常使PCA效果更好)。得到的分布图显示类别间有一些分离,但混合程度很高。

然后,我们使用深度自编码器将文档压缩到两个数字,同样以这两个数字作为坐标,将文档绘制在二维空间中。

我们得到了好得多的布局,它能更好地揭示数据集的结构。可以看到不同的类别,并且它们分离得相当好。我们推测位于中间区域的文档可能包含的词汇量较少,因此难以区分其类别。

这样的可视化展示可能非常有用。例如,如果你看到其中一个绿点代表安然公司的财报,你可能不会想购买其附近有绿点的公司的股票。

总结

本节课中我们一起学习了深度自编码器在文档检索中的应用。我们了解了如何将文档表示为词袋向量,如何利用深度自编码器将其压缩为低维编码,以及这种编码在高效检索和直观可视化方面的优势。实验表明,深度自编码器在压缩效率和提取的编码质量上均显著优于传统的线性方法(如潜在语义分析)。

15.4:语义哈希 🗂️

在本节课中,我们将要学习一种名为“语义哈希”的技术。该技术提供了一种极其高效的方法,用于查找与查询文档相似的文档。其核心思想是将文档转换为一个内存地址,并在该内存中组织数据,使得当你访问特定地址并查看其附近地址时,就能找到非常相似的文档。这类似于在超市中,当你走到某个特定商品的存放位置并环顾四周时,就能找到相似的商品。

概述

语义哈希旨在解决大规模文档或图像检索的效率问题。传统方法需要遍历庞大的数据库,而语义哈希通过将高维数据(如文档的词袋表示)映射到低维的二进制码,并将此二进制码直接用作内存地址,从而实现了近乎即时的相似项查找。接下来,我们将详细探讨其工作原理、实现步骤以及优势。

从文档到二进制码

上一节我们介绍了语义哈希的基本概念,本节中我们来看看如何为文档生成有效的二进制描述符。

人们很早就认识到,如果能获得图像的二进制描述符,就能拥有一种快速检索图像的好方法。某些二进制描述符很容易获取,例如判断场景是室内还是室外,图像是彩色还是黑白。但要获得一组(例如30个)彼此大致正交的二进制描述符则困难得多,而这正是高效检索真正需要的。机器学习可以帮助我们解决这个问题。

我们将从文档的等价问题开始研究,然后再将其应用于图像。

因此,考虑为文档获取二进制码,而不是实值码。我们通过训练一个深度自编码器来实现这一点,该自编码器在其编码层使用逻辑单元。仅此还不够,因为逻辑单元为了尽可能多地传达关于2000个词频计数的信息,会倾向于在其中间值域(实数值)工作。

为了防止这种情况,我们在微调阶段向编码单元的输入添加噪声。具体步骤如下:

  1. 首先,将其作为一堆受限玻尔兹曼机进行训练。
  2. 然后,使用解码器权重矩阵的转置来“展开”这些玻尔兹曼机。
  3. 接着,使用反向传播进行微调。在此过程中,我们向编码单元的输入添加额外的高斯噪声。

为了抵抗这种噪声,编码单元需要被坚定地“开启”或“关闭”。因此,噪声会促使学习过程避开逻辑单元的中间区域,因为该区域虽然能传达大量信息,但对其输入噪声非常敏感。在测试时,我们只需在逻辑单元的中间值处设置阈值,即可获得二进制值。

如果我们能训练出这样的自编码器,就能将词袋的计数转换为少量二进制值。换句话说,我们将学习到一组对重建词袋表示有益的二进制特征。

后来,Alex Krizhevsky 发现,实际上我们不必向30个编码单元的输入添加高斯噪声。相反,我们可以直接让它们成为随机二元单元。因此,在前向传播过程中,我们使用逻辑单元的输出概率随机选取一个二进制值;在反向传播过程中,我们假设传输的是逻辑单元输出的实值概率,这为我们提供了平滑的梯度用于反向传播。

利用二进制码进行高效检索

一旦我们获得了这些简短的二进制码,当然可以进行顺序搜索:为每个已知文档存储一个码,当查询文档到达时,首先提取其码(如果它不在已知文档中),然后将其码与所有存储文档的码进行比较。这种比较可以非常快,因为它可以在典型CPU上使用特殊的位操作并行比较多个位。但我们必须遍历一个可能包含数十亿文档的非常长的列表。

有一种更快的办法。我们可以将二进制码视为内存地址。

其思想是,我们取一个文档,并使用我们的深度自编码器作为哈希函数,将文档转换为一个30位的地址。现在我们拥有一个具有30位地址的内存空间。在该内存中,每个地址将包含一个指向具有该地址的文档的指针。如果多个文档具有相同的地址,我们可以在那里建立一个小列表。

现在,如果自编码器成功地使相似文档具有相似地址,我们就拥有了一种非常快速的查找相似文档的方法。你只需获取查询文档,前往其二进制码对应的内存地址,然后查看附近的地址。换句话说,你开始翻转该地址中的位,以访问附近的地址。你可以想象一个小的汉明球,其中的地址仅相差几位。我们期望在这些附近地址找到语义相似的文档。

这样,我们就完全避免了搜索一个大列表。我们只需计算内存地址,翻转几位,然后查找到相似文档。这种方法极其高效,尤其是在我们拥有非常庞大的数据库(例如十亿文档)时。我们完全避免了遍历十亿个项目的串行搜索。

我有时称之为“超市搜索”,因为它就像你在超市里会做的事。假设你去了一个不熟悉的超市,想找到凤尾鱼。你可能会问超市的收银员:“你们把金枪鱼罐头放在哪里?”然后你会去超市的那个地址,并环顾四周。希望在那附近,有像鲑鱼罐头这样的东西。当然,如果你运气不好,凤尾鱼可能被完全存放在另一个地方,比如披萨配料旁边。这就是这种搜索的缺点。

超市本质上是一个二维表面(一排排货架,加上高度,形成二维)。因此,你只有两个维度来定位物品,这不足以将所有你希望彼此靠近的物品都放在一起。例如,你可能希望素食版本、犹太洁食版本或稍微过期的版本都放在附近。在二维空间中,你无法做到所有这些。

但我们这里拥有的是一个30维的“超市”。这是一个复杂得多的空间,很容易让物品因为许多不同维度上的相似性而彼此靠近。

语义哈希的另一种视角

以下是语义哈希工作原理的另一种视图。

大多数快速检索方法通过交集存储列表来工作,这些列表与从查询中提取的线索相关联。例如,谷歌会有一个包含某个特定罕见词的所有文档的列表,当你在查询中使用该罕见词时,他们就能立即访问该列表。然后,他们必须将该列表与其他列表取交集,以找到满足你查询中所有条件的文档。

计算机实际上拥有特殊的硬件,可以在一条机器指令中交集32个非常长的列表。这种硬件被称为内存总线。因此,32位二进制地址中的每一位都指定了内存中一半地址的列表。例如,如果该位是开启的并且是地址的第一位,它指定了内存的上半部分;如果该位是关闭的,它指定了下半部分。

内存总线所做的就是交集32个列表,以找到满足二进制码中所有32个值的那个唯一位置。

因此,我们可以将语义哈希视为一种利用机器学习,将检索问题映射到计算机擅长的列表交集类型上的方法。只要我们的32位二进制码对应于文档或图像的有意义属性,我们就可以非常快速地找到相似的项,而无需任何搜索。

总结

本节课中,我们一起学习了语义哈希技术。我们了解到,通过训练一个深度自编码器为文档生成紧凑的二进制码,并将此二进制码直接用作内存地址,可以实现极其高效的相似文档检索。该方法的核心优势在于将高维相似性搜索问题,转化为在低维二进制地址空间中进行邻近查找的问题,从而完全避免了遍历整个数据库的昂贵操作。这就像拥有一个高维的“超市”,让语义相似的物品自然地聚集在相近的“货架地址”上。

15.5:图像检索的二进制编码学习 🖼️

在本节课中,我们将学习如何使用二进制编码进行图像检索。我们将探讨为何直接使用像素进行检索效果不佳,以及如何通过深度自编码器或预训练网络的隐藏层表示来生成包含丰富语义信息的短二进制码,从而实现快速、高效的图像相似性搜索。

概述

目前,图像检索通常依赖于图像的标题或标签。然而,图像本身包含的信息远多于标题。直接使用像素进行检索的主要问题是,单个像素无法有效传达图像内容。如果我们能识别图像中的物体,问题会简单得多,但物体识别本身是一项困难的任务。因此,一种替代方案是提取一个能概括图像内容的向量。虽然实值向量是一种选择,但在大型数据库中进行匹配和存储的成本很高。相比之下,提取一个较短的二进制向量则更易于存储和快速匹配。

从像素到二进制码

上一节我们提到了使用内容向量的想法,本节中我们来看看如何具体实现二进制编码。

基本思路是,我们不直接识别物体,而是提取一个包含图像内容信息的向量。最直接的方法是提取一个实值向量。但问题在于,在大数据库中匹配实值向量速度慢,且存储这些向量需要大量空间。

如果我们能提取一个相当短的、包含大量图像信息的二进制向量,那么存储和匹配都会容易得多。更快的是一种两阶段方法:

  1. 首先,提取一个约30位的短二进制码。
  2. 这个短码通过语义哈希技术,能非常快速地为我们提供一个有希望的图像候选短列表。
  3. 然后,候选图像可以使用与每个已知图像一起存储的256位二进制码进行匹配,以搜索比28位二进制码所能找到的更好的匹配。

即使是256位的二进制码,每张图像也只需要4个字的内存。尽管我们需要对这些二进制码进行串行搜索,但由于只需几次操作即可比较两个256位二进制码以找出它们有多少位相同,因此搜索速度可以非常快。

自编码器架构

那么,如何生成这样的二进制码呢?以下是一个由Alex Krushevsky训练的网络,它处理小型彩色图像(32x32像素)。

以下是该自编码器的架构描述:

  • 输入层:红色、绿色和蓝色通道,共 3 * 32 * 32 = 3072 个输入。
  • 中间层:网络首先将输入扩展到更多隐藏单元(因为要从实值输入转换到可能容量较小的逻辑隐藏单元),然后逐层减少单元数量。
  • 输出层:最终降至256个二进制单元。

这个编码器拥有约6700万个参数,规模相当大。在NVIDIA GPU上训练需要数天时间。Alex使用了200万张图像进行训练。

目前没有理论证明他所使用的架构是最优的。我们知道需要一个相当深的网络,并且随着层数增加而变窄是合理的。但这种每层单元数减半的具体架构只是一种猜测。有趣的是,即使是这样的猜测也能工作得相当好。很可能存在其他效果更好的架构。

重建与检索效果

首先需要问的是,这样的自编码器在重建图像方面表现如何。

以下是重建示例:

  • 人脸图像:从重建图像中可以分辨出图像的类型。
  • 派对场景:虽然无法确切分辨场景类型,但可能猜测涉及多人。
  • 户外场景:重建图像捕捉了大量关于户外场景的信息,如水面、天空以及有一条狭长陆地的事实。

接下来,让我们看看使用能产生此类重建的自编码器进行检索的质量。

我们以红色方框中的迈克尔·杰克逊图片开始。Alex检索了最相似的图像。在每个图像上方,可以看到它与迈克尔·杰克逊图像相差的比特数。值得注意的是,这些差值都在一个相当相似的范围内。在256位中,仅相差61位如果是随机图像则极不可能发生,这必须是相当相似的图像。

检索结果的一个优点是,除一个例外,其他都是人脸。如果我们查看使用原始像素的欧几里得距离进行检索的结果,那么其中一些是人脸,但大多数不是。显然,自编码器理解了关于人脸的某些信息,这些信息并未包含在欧几里得距离的信息中。它显然提供了更好的检索效果。

再看另一个例子。我们取派对场景的图像并检索其他图像。可以看到,大约一半的图像是你认为相当相似的,即其他派对场景。它们通常是中间有明亮物体的其他派对场景,就像原始派对场景一样。你会注意到,大多数不匹配的图像中间也有明亮物体。因此,即使我们通过许多隐藏层将信息压缩到256位二进制码,网络仍然对图像结构和较亮斑块的位置相当敏感。

如果你观察欧几里得距离的效果,它会差得多。欧几里得距离只找到另一个有一群人的场景,然后其他所有图像都相当不相似。你会注意到,使用欧几里得距离时,它经常得到非常平滑的图像。这是因为如果你无法匹配图像中的高频变化,匹配其平均值比匹配其他相位不同的高频变化内容更好。所以,当你有一个复杂的图像时,欧几里得距离通常会找到平滑的图像来匹配它。这是因为它最小化了像素空间中的平方误差。

基于语义的改进方法

显然,我们希望图像检索能对图像内容(即图像中物体的种类及其关系)更敏感,而对像素强度不那么敏感。

我们可以通过首先训练一个大型网络来识别真实图像中的许多不同种类的物体来实现这一点。我们在第5讲中已经看到了如何做到这一点。然后,我们取这个大网络最后一个隐藏层的激活向量,并将其用作图像的表示。在捕捉图像中物体种类信息方面,这应该比像素强度好得多。

为了验证这种方法是否可行,我们使用了第5讲中描述的、赢得ImageNet比赛的网络。到目前为止,我们只尝试了在最后一个隐藏层的激活向量之间使用欧几里得距离。但显然,如果这对欧几里得距离有效,我们就可以获取这些激活向量,并在此基础上构建一个自编码器,将其压缩为二进制码。

首先看看它使用欧几里得距离是否有效。事实证明效果非常好。

  • 在左侧列中,您可以看到查询图像。
  • 在它们的右侧,您可以看到所有检索到的内容。
  • 观察大象查询图像,你会发现检索到的是其他大象,但是姿态非常不同的大象。这些图像在像素空间的重叠度不会很好。
  • 观察万圣节南瓜,你会发现所有检索到的都是其他万圣节南瓜。其中一些在像素空间的重叠度会很差。
  • 同样,对于航空母舰,我们检索到的其他航空母舰图像也非常不同。

因此,我们预期,如果能够将这些激活向量压缩为短二进制码,我们将拥有一种快速有效的方法,仅通过图像内容来检索相似图像。

我们将在第16讲中看到,实际上可以将图像内容与图像标题结合起来,以获得更好的表示。

总结

本节课中,我们一起学习了用于图像检索的二进制编码技术。我们了解到,直接匹配像素效果不佳,而通过深度自编码器或利用预训练分类网络的深层特征,可以生成包含高级语义信息的紧凑二进制码。这种两阶段检索方法(先用短码哈希快速筛选,再用长码精细匹配)能显著提升大规模图像库的检索速度和精度。未来,结合图像内容与文本信息将是进一步提升检索性能的重要方向。

15.6:用于预训练的浅层自编码器

在本节课中,我们将探讨用于学习深度神经网络的替代性预训练方法。我们将介绍几种不同的浅层自编码器,并比较它们在预训练中的效果。

概述

上一节我们介绍了使用对比散度训练的受限玻尔兹曼机进行预训练。本节中,我们来看看其他几种有效的预训练方法,特别是不同类型的浅层自编码器。

浅层自编码器与受限玻尔兹曼机

受限玻尔兹曼机可以被视为一种浅层自编码器,尤其是在使用对比散度训练时,因为它们的目标是使重构数据看起来像原始数据。

作为一种自编码器,受限玻尔兹曼机具有非常强的正则化能力,因为其隐藏单元只允许有二元激活,这极大地限制了其容量。

# 受限玻尔兹曼机的二元隐藏单元
hidden_activation = binary(weighted_sum(inputs) + bias)

然而,如果用最大似然法训练受限玻尔兹曼机,它们的行为就与自编码器完全不同。例如,对于一个纯噪声像素,自编码器会尝试重构其噪声值,而最大似然训练的受限玻尔兹曼机会完全忽略该像素,仅使用该输入的偏置来建模。

堆叠自编码器的效果

既然我们可以将受限玻尔兹曼机视为一种强正则化的自编码器,那么或许可以用一堆自编码器来替代用于预训练的受限玻尔兹曼机。

事实证明,如果使用仅通过惩罚权重平方来进行正则化的浅层自编码器,那么堆叠这些自编码器的预训练效果不如堆叠受限玻尔兹曼机有效。

去噪自编码器

然而,有一种不同类型的自编码器效果同样出色,那就是由蒙特利尔小组广泛研究的去噪自编码器

去噪自编码器的工作原理是,通过将许多分量设置为0来为每个样本向量添加噪声,但不同输入向量的噪声分量不同。这类似于Dropout,但它是针对输入而非隐藏单元。

去噪自编码器仍然需要重构那些被置零的输入,因此它不能简单地复制其输入。浅层自编码器的风险在于,如果给予足够多的隐藏单元,它可能只是将每个像素复制到一个隐藏单元,然后从该隐藏单元重构该像素。而去噪自编码器显然无法做到这一点。

因此,它必须使用隐藏单元来捕获输入之间的相关性,以便利用某些输入的值来帮助重构那些被置零的输入。

以下是去噪自编码器的核心思想:

# 去噪自编码器前向过程
corrupted_input = apply_noise_mask(original_input)  # 添加噪声
hidden_code = encode(corrupted_input)               # 编码
reconstructed_input = decode(hidden_code)           # 解码
loss = compare(reconstructed_input, original_input) # 与原始输入比较

如果使用一堆去噪自编码器进行预训练,效果会非常好。在某些情况下,受限玻尔兹曼机仍然表现更好,但在大多数情况下,去噪自编码器更有效。

去噪自编码器的另一个优点是,评估其预训练过程更简单,因为我们可以轻松计算目标函数的值。当我们使用对比散度预训练受限玻尔兹曼机时,无法计算我们试图最小化的真实目标函数值,通常只能使用平方重构误差,而这并非实际被最小化的目标。在去噪自编码器中,我们可以打印出我们试图最小化的目标值,这非常有帮助。

去噪自编码器的一个缺点是,它缺乏受限玻尔兹曼机所具有的漂亮的变分下界。但这只是理论上的兴趣,因为该下界仅适用于用最大似然法训练的受限玻尔兹曼机。

收缩自编码器

另一种自编码器是由蒙特利尔小组开发的收缩自编码器

其工作原理是,我们试图使隐藏层活动对输入尽可能不敏感。当然,隐藏单元不能完全忽略输入,因为它们必须能够重构输入。

我们通过惩罚每个隐藏单元相对于每个输入的平方梯度来实现这种不敏感性。我们试图使每个隐藏单元在输入值改变时变化不大。

收缩自编码器在预训练中也表现得非常好。它们的编码倾向于具有这样的特性:对于空间的不同部分,只有一小部分隐藏单元处于敏感范围。这是一个不同的子集,因此这个活动集就像一个稀疏编码。其他隐藏单元都处于饱和状态且不敏感。

受限玻尔兹曼机在训练后实际上也有非常相似的行为:许多隐藏单元会饱和,而对于不同的训练样本,未饱和的“工作集”也会不同。

预训练的当前观点总结

现在有许多不同的方法可以进行逐层预训练,以发现良好的特征。

当我们的数据集没有大量标签时,这种在使用标签之前发现特征的方法对后续的判别性微调非常有帮助。它可以在不使用标签信息的情况下发现特征,然后利用标签信息来微调类别之间的决策边界。

如果我们有大量未标记数据,使得预训练能够很好地发现有趣特征,那么这种方法尤其有用。

然而,对于非常大的标记数据集,通过无监督预训练来初始化用于监督学习的权重是不必要的,即使网络很深。预训练是初始化深度网络权重的第一个好方法,但现在我们有了许多其他方法。

但是,即使我们有很多标签,如果我们再次使网络变得更大,我们将再次需要预训练。

我经常与来自谷歌的人争论。他们说他们有很多很多标签数据,因此不需要正则化方法,他们的网络无论如何也不会过拟合,因为他们有这么多数据。

反驳的论点是,这只是因为你们使用的网络太小了。你们应该在更强大的计算机上使用更大、更大的网络,然后你们会再次开始过拟合,并且将需要像Dropout和预训练这样的正则化方法。

如果你问大脑处于哪种状态,大脑显然处于其参数数量远多于其数据量的状态。因此,至少对于大脑来说,正则化方法非常重要。

总结

本节课中,我们一起学习了用于深度神经网络预训练的几种浅层自编码器方法。我们比较了标准自编码器、去噪自编码器和收缩自编码器的原理与效果,并讨论了预训练在数据量不同情况下的重要性。理解这些方法有助于我们根据实际任务和数据条件,选择合适的策略来初始化网络权重,从而提升模型性能。

16.1:学习图像与描述文本的联合模型 🖼️📝

在本节课中,我们将学习如何构建一个联合模型,该模型能够同时理解图像及其对应的文字描述。我们将看到,通过结合图像特征和文本信息,模型可以更有效地学习两者的语义关系。

在上一讲中,我们讨论了如何从图像中提取有意义的语义特征,但当时并未利用描述文本的信息。显然,描述中的词语应当有助于从图像中提取合适的语义类别。同样,图像也应当有助于消除描述中词语的歧义。

因此,我们的核心思想是训练一个大型网络。该网络的输入是两部分:

  • 从图像中提取的标准计算机视觉特征向量。
  • 描述文本的词袋表示。

网络将学习这两种输入表示是如何相互关联的。在本讲末尾,我将展示一段视频,演示最终的网络如何使用词语来为图像创建特征向量,并在其数据库中找出最相似的图像;以及如何使用图像来生成词袋。

模型构建方法

以下是Niti Srivastava、Ruslan Salakhutdinov等人的研究工作。目标是构建一个描述文本和图像的联合密度模型,但图像由计算机视觉中标准使用的特征表示,而非原始像素。这比我们之前在课程中看到的构建标签和数字图像的联合密度模型需要更多的计算。

他们的具体做法如下:

  1. 分别预训练单模态模型

    • 首先,他们单独训练了一个图像的多层模型。实际上,这是一个基于标准计算机视觉特征提取的图像特征的多层模型。
    • 然后,他们单独训练了一个描述文本词袋向量的多层模型
  2. 构建联合模型

    • 在分别训练好这两个模型后,他们添加了一个新的顶层,该层连接到两个独立模型的顶层。
  3. 联合微调

    • 之后,他们对整个系统进行进一步的联合训练。这样,每种模态(图像或文本)都能改进另一种模态的早期层。

模型架构选择:深度玻尔兹曼机

你可能会期望他们使用深度信念网络,但他们使用了深度玻尔兹曼机,其中对称连接存在于所有层对之间。

对整个深度玻尔兹曼机进行进一步的联合训练,正是允许每种模态改变另一种模态早期层中特征检测器的原因。这也是他们选择使用深度玻尔兹曼机的原因。

他们本可以使用深度信念网络并通过对比唤醒-睡眠算法进行生成式微调,但深度玻尔兹曼机的微调算法可能效果更好。

深度玻尔兹曼机的预训练技巧

这引出了一个问题:他们如何预训练深度玻尔兹曼机的隐藏层?因为我们在课程中目前看到的是,如果你训练一堆受限玻尔兹曼机并将它们组合成一个复合模型,你得到的是一个深度信念网络,而不是深度玻尔兹曼机。

现在我将解释,尽管我在课程早期那样说过,但实际上你可以以一种特殊方式预训练一堆受限玻尔兹曼机,然后将它们组合成深度玻尔兹曼机。

关键在于:堆栈中顶部和底部的受限玻尔兹曼机,其权重需要在一个方向上是另一个方向的两倍。

  • 观察可见单元的底部玻尔兹曼机,其训练时自底向上的权重是自上而下权重的两倍。除此之外,权重是对称的。我称之为尺度对称
  • 堆栈中的下一个受限玻尔兹曼机,使用真正的对称权重进行训练。我在这里称它们为 2W 而不是 W,原因稍后解释。
  • 我们可以继续用这种方式训练受限玻尔兹曼机,使用真正的对称权重。
  • 堆栈顶部的那个,其训练时自底向上的权重是自上而下权重的一半。所以,这又是尺度对称权重,但现在是自上而下的权重是自底向上权重的两倍,这与我们训练堆栈中第一个受限玻尔兹曼机时的情况相反。

在训练了这三个受限玻尔兹曼机之后,我们可以将它们组合起来形成一个复合模型。复合模型如下图所示。

  • 对于中间的受限玻尔兹曼机,我们简单地将它的权重减半(这就是为什么它们一开始是 2W2)。
  • 对于底部的那个,我们将其向上权重减半,但保持向下权重不变。
  • 对于顶部的那个,我们将其向下权重减半,但保持向上权重不变。

为什么需要权重减半?

解释相当复杂,但我会给你一个大致的思路。如果你看层 H1,在左侧的受限玻尔兹曼机堆栈中,我们有两种不同的方式来推断 H1 中单元的状态:

  1. 我们可以自底向上从 V 推断 H1 的状态。
  2. 我们也可以自上而下从 H2 推断 H1 的状态。

当我们将这些玻尔兹曼机组合在一起时,我们要做的是对推断每一层的这两种方式取一个平均。为了取一个几何平均,我们需要做的是将权重减半。

因此,我们将使用自底向上模型所说的一半(即 1/2 * 2W1),并使用自上而下模型所说的一半(即 1/2 * 2W2)。如果你看右侧的深度玻尔兹曼机,这正是用来推断 H1 状态所使用的权重。

我们需要减半权重的原因是为了避免双重计数。在右侧的玻尔兹曼机中,H2 的状态已经依赖于 V(至少在我们对玻尔兹曼机进行一些稳定迭代之后)。因此,如果我们使用来自堆栈中第一个受限玻尔兹曼机的自底向上输入,并且使用来自堆栈中第二个玻尔兹曼机的自上而下输入,我们将会把证据计算两次,因为我们既从 V 推断 H1,又从 H2(其本身依赖于 V)推断 H1。为了避免双重计算证据,我们必须将权重减半。

这是一个非常高层次、或许不完全清晰的描述,解释了为什么我们必须减半权重。如果你想了解数学细节,可以去阅读相关论文。但核心思想是:我们需要减半权重,以便中间层可以对原始堆栈中两个不同受限玻尔兹曼机对该层的两种不同模型进行几何平均。

总结

本节课中,我们一起学习了如何构建一个联合模型来关联图像和其文字描述。我们了解到,通过分别预训练图像和文本的单模态模型,然后将它们连接并进行联合微调,可以有效地让两种信息相互增强。特别地,我们探讨了使用深度玻尔兹曼机作为架构,并详细解释了通过特殊设计的权重减半策略来预训练其各层的方法,以避免在组合模型时对证据进行双重计数。这种方法使得模型能够更准确地理解图像内容与描述语言之间的复杂关系。

16.2:分层坐标系 🧠

在本节课中,我们将要学习如何将两种物体识别方法结合起来:一种是基于部件间关系的识别方法,另一种是使用深度神经网络的识别方法。我们将探讨卷积神经网络的局限性,并介绍一种更强大的方法——分层坐标系框架。


物体识别的三种方法

目前,物体识别主要有三种方法。

以下是这三种方法的简要介绍:

  • 深度卷积神经网络:这是目前效果最好的方法。
  • 基于部件的方法:从长远来看,这被认为是最有潜力的方法。
  • 手工特征工程:这种方法提取计算机视觉领域已知的图像特征,制作特征直方图,并进行大量手工设计。卷积神经网络最近已经超越了这种方法。

本视频的重点在于展示如何将基于部件的方法与使用卷积神经网络的早期阶段结合起来。


卷积神经网络的局限性

上一节我们介绍了物体识别的几种方法。本节中我们来看看当前主流的卷积神经网络存在哪些问题。

尽管卷积神经网络在图像物体识别方面表现优异,但它存在一些缺失。当我们对一组复制的特征检测器的活动进行池化时,我们会丢失最活跃的特征检测器的精确位置信息。

这意味着我们无法确切知道物体在哪里。这对于识别高级部件(如鼻子和嘴巴)是致命的。为了识别这是谁的脸,你需要利用鼻子和嘴巴等高级部件之间的精确空间关系。

如果让池化区域重叠,使得每个特征出现在几个不同的池中,可以保留更多关于其位置的信息,从而使效果稍好一些。但这并非根本的解决方案。

一个相关的问题是,使用平移来复制特征检测器的卷积神经网络,无法将其对几何关系的理解外推到全新的视角,例如不同的方向或不同的尺度。

当然,我们可以尝试在方向和尺度上进行复制。但这会导致特征检测器的数量变得极其庞大。


分层坐标系框架

为了解决上述问题,一个更好的方法是使用分层坐标系框架。我们使用一组神经元来表示一个特征的形状及其相对于视网膜的姿态的结合。

当这些神经元活跃时,它告诉你“那种特征(比如一个鼻子)在那里”。而这些神经元的精确活动或相对活动则告诉你鼻子的姿态。

思考如何表示某物的姿态,这实际上是两个坐标系之间的关系:即嵌入在该物体内部的坐标系与相机或视网膜坐标系之间的关系。

因此,为了表示某物的姿态,我们必须在其中嵌入一个坐标系。一旦我们做到了这一点,并且有了物体部件相对于视网膜的姿态表示,就很容易利用部件之间的关系来识别更大的物体。

我们将利用部件姿态的一致性,作为识别更大形状的线索。

请看这张图,我们有一个鼻子和一个嘴巴,它们处于正确的空间关系中。一种理解方式是:如果你让嘴巴预测整个脸的姿态,同时让鼻子也预测整个脸的姿态,它们会做出相似的预测。

再看右边这里,我们有相同的鼻子和嘴巴,但现在它们处于错误的空间关系中。这意味着,如果它们分别预测整个脸的姿态,这些预测将完全不一致。


通过一致性预测进行识别

上一节我们引入了利用姿态一致性进行识别的概念。本节中我们来看看其具体实现机制。

假设我们正在寻找一张脸。中间这个带有 T_J 的椭圆,是一组用于识别脸部姿态的神经元。旁边的 P_J 是一个逻辑神经元,用于表示我们是否认为那里有一张脸。

在下面一层,我们有类似的表示:一个用于表示嘴巴姿态,一个用于表示鼻子姿态。

我们将通过注意到这两个表示能做出一致的预测来识别一张脸。

具体过程如下:

  1. 我们取一个表示嘴巴姿态的活动向量 T_I
  2. 我们将其乘以一个表示嘴巴与脸部之间空间关系的矩阵 T_IJ
  3. 我们得到对脸部姿态的预测:T_I × T_IJ
  4. 我们对鼻子做同样的事情:取表示鼻子姿态的活动向量 T_H,乘以鼻子与脸部的关系矩阵,得到另一个对脸部姿态的预测。
  5. 如果这两个预测一致,那么就存在一张脸,因为鼻子和嘴巴处于正确的空间关系中。在没有脸的情况下,这种情况极不可能发生。

我们在这里所做的是逆向计算机图形学。在计算机图形学中,如果你知道脸的姿态,你可以使用 T_IJ 的逆矩阵来计算嘴巴的姿态,对鼻子也是如此。因此,在计算机图形学中,你是从较大物体的姿态推导出其部件的姿态。而在计算机视觉中,你需要从部件的姿态推导出较大物体的姿态,并在此过程中检查一致性。


姿态向量与权重的作用

现在,如果我们能让神经网络将这些姿态向量表示为神经活动向量,那么我们将获得一个非常好的特性:空间关系可以被建模为线性操作

这使得学习视觉实体的层次结构变得非常容易,也使得跨视角泛化变得非常容易。

那么,当我们对视角进行微小改变时会发生什么?姿态向量(那些神经活动向量)都会发生变化。保持不变的是权重,即表示部件与整体之间关系的权重(如前一张幻灯片上的 T_IJ)。这些权重不依赖于视角。

因此,我们希望将形状的不变特性编码到权重中,而将姿态信息放在活动向量中。因为当我们改变视角时,所有的姿态向量都会改变。

所以,我们的目标不是获得对视角不变的神经活动(这是卷积网络中池化操作试图做的),而是获得对视角等变的神经活动。随着物体姿态的变化,神经元的活性也相应变化。这意味着,对物体的感知(不是它的标签,而是它的外观)会随着视角的变化而变化。


人类视觉的证据

我将通过一些证据来结束本次课程,证明我们的视觉系统确实会强加坐标系来表示形状。这一点在很久以前就被一位伟大的心理学家欧文·洛克指出。

如果你看这个形状,我告诉你它是一个国家,大多数人不知道是哪个国家。他们看着它,觉得有点像澳大利亚,但又是澳大利亚的镜像,总之不是一个熟悉的国家。

如果你告诉他们顶部在哪里(是那个方向),他们立刻会认出那是非洲。一旦他们知道应该强加哪个坐标系,它立刻就变成了一个熟悉的形状。

同样,如果我给你一个像这样的形状,你可以把它感知为一个正方形,也可以把它感知为一个菱形。这是两种完全不同的感知。你对形状的了解完全不同,取决于你以哪种方式感知它。

例如,如果你把它感知为一个倾斜的正方形,你会敏锐地察觉到它的角是否是直角。如果你把它感知为一个直立的菱形,你则完全不会敏感于此,即使角度偏差了5度,你也不会注意到。但你会对别的东西敏感:如果你把它感知为一个直立的菱形,你会敏锐地察觉到左边的角和右边的角是否在同一高度。你现在可能已经注意到,在这个图形中,它们的高度有非常细微的差别。

这类演示证明了,为了表示形状,我们确实会对它们强加坐标系。因为当你看着那个正方形或菱形时,你看的是同一个东西,但根据你强加的坐标系不同,你的感知会完全不同。


总结

本节课中我们一起学习了如何结合基于部件和深度神经网络的物体识别方法。我们探讨了卷积神经网络在位置信息和视角泛化方面的局限性,并引入了分层坐标系框架这一解决方案。该方法的核心在于使用神经活动向量表示部件的姿态,将不变的空间关系编码在权重中,从而实现通过部件姿态的一致性来识别更大物体,并能优雅地处理视角变化。最后,我们从人类视觉感知中找到了支持这一理论的证据。

16.3:贝叶斯优化 🧠

在本节课中,我们将学习一种利用机器学习自动优化神经网络超参数的方法。这种方法可以替代人工繁琐的调参过程,通过高斯过程模型来高效地探索超参数空间,找到性能最佳的组合。


概述

神经网络的成功很大程度上依赖于超参数的设置,例如层数、每层神经元数量、学习率、权重惩罚项等。手动调整这些参数不仅耗时,而且需要大量经验。本节介绍一种基于高斯过程的贝叶斯优化方法,它能自动、高效地寻找最优超参数组合。


手动调参的挑战

上一节我们介绍了超参数的重要性,本节中我们来看看手动调参面临的具体困难。

人们常以“需要大量技巧来设置超参数”为由拒绝使用神经网络。这确实是一个合理的理由。缺乏经验时,很容易为某个超参数设置完全错误的值,导致整个网络无法工作。需要设置的超参数包括层数、每层单元数、单元类型、权重惩罚项、学习率、动量等等。如果学习率设置得过大或过小100倍,网络将无法正常工作。

一种简单的方法是进行朴素的网格搜索。即为每个超参数列出一系列候选值,然后尝试所有可能的组合。如果超参数数量稍多,组合数量就会爆炸式增长,远超实际可尝试的范围。


随机搜索的优势

事实证明,有一种方法比朴素的网格搜索要好得多,那就是随机采样组合。即对于每个超参数列表,我们随机选取一个值。

以下是随机搜索优于网格搜索的原因:

  • 某些超参数影响不大,而另一些影响巨大。
  • 我们不希望重复那些对结果影响巨大的超参数的相同设置。对于那些影响不大的超参数,即使改变设置,我们也学不到太多新东西。
  • 在网格搜索中,每个坐标轴上会有多个点,这些点在其他所有参数上都相同。因此,如果沿着该坐标轴移动没有影响,就等于重复进行了多次相同的实验,而没有学到关于其他参数的任何信息。

引入机器学习模型

我们可以做得比随机组合更好。本质上,这意味着使用机器学习来模拟试图决定超参数应该是什么的研究生。

因此,我们不是使用随机组合,而是根据目前已获得的结果,尝试预测哪些组合可能表现良好。也就是说,我们必须预测超参数空间中我们期望获得良好结果的区域。

仅仅预测我们期望的表现如何是不够的,我们还必须对不确定性有所了解。例如,可能存在一个区域,我们预计表现与当前水平大致相同,但也可能表现得更好。在这种情况下,就值得去探索那个区域。甚至值得探索那些我们预计表现会更差,但也可能好得多的区域。

现在,我们假设评估一组超参数设置所需的计算量是巨大的。这涉及在大型数据集上训练一个大型神经网络,可能需要在一台大型计算机上运行数天。相对于这个工作量,构建一个模型来预测给定我们迄今为止实验过的所有设置下,一组超参数设置的表现如何,所需的工作量要小得多。因此,将预测模型拟合到我们迄今为止看到的实验结果所需的计算量,远小于运行一次实验。


高斯过程模型

那么,我们将使用什么样的模型来预测未来实验的结果呢?

事实证明,有一种我在课程中尚未讨论过的模型,称为高斯过程模型。基本上,这些模型所做的就是假设相似的输入会产生相似的输出。它们没有比这更复杂的先验知识。但它们非常善于有效地利用这种先验。

因此,如果你对超参数的预期作用了解不多,像这样的弱先验可能是你能做的最好选择。高斯过程能够为每个输入维度学习衡量相似性的适当尺度。例如,如果是隐藏单元的数量,可能是200,也可能是300。问题是,这些数字是相似还是非常不同?我们是否应该期望使用200得到的结果与使用300得到的结果非常相似,还是应该期望它们非常不同?如果我们对神经网络一无所知,最初我们毫无头绪。但我们可以查看迄今为止的实验结果。如果考虑到实验之间的其他差异,使用200的实验和使用300的实验往往给出非常相似的答案,那么200可能就与300相似。因此,我们为该维度设置一个尺度,使得需要比该尺度大得多的差异才能预期获得非常不同的结果。

重要的是,高斯过程模型所做的不仅仅是预测特定实验的预期结果(即我们训练的神经网络在验证集上的表现)。除了预测神经网络预期表现的均值外,它们还预测一个分布,即预测方差。它们之所以被称为高斯过程,是因为它们的预测是高斯的。当它们对接近我们已经运行过的几个一致设置的新超参数设置进行预测时(因为我们知道答案),它们的预测往往会相当精确,即方差较低。但是,当它们对超参数与我们迄今为止实验过的任何设置都大不相同的实验进行预测时,高斯过程模型做出的预测将具有非常高的方差。


优化策略

以下是使用高斯过程决定下一步尝试什么的一个相当好的策略。请记住,我们有一种学习模型,即需要长时间运行的大型神经网络。我们正试图找出一个良好的超参数设置来进行下一次尝试。我们有另一种称为高斯过程的机器学习算法,它查看我们迄今为止所做的实验结果,并尝试为某个提议的新超参数设置预测神经网络的表现如何,以及该预测的不确定性有多大。

因此,我们要做的是跟踪迄今为止效果最好的超参数设置,即所有超参数的一个单一设置,它给了我们迄今为止性能最高的神经网络。现在,当我们运行下一个实验时,我们迄今为止的最佳设置可能会被新实验取代,因为它能带来更好的神经网络性能,也可能保持不变。因此,既然如果新实验比我们迄今为止看到的任何结果都好,我们将用新实验的结果替换,那么我们迄今为止的最佳设置只会改善。

以下是一个关于下一步尝试什么超参数设置的好策略。我们选择一个超参数设置,使得我们最佳设置的预期改进很大。我们不担心可能进行一个导致非常糟糕结果的实验,因为如果得到非常糟糕的结果,我们不会用这个新实验替换我们迄今为止的最佳结果。而且,我们还能学到一些东西。这是对冲基金经理们熟知的一个现象。他们经常告诉客户:“如果基金上涨,我将收取你利润的3%。如果基金下跌,你承担损失。”对于客户来说,同意这一点是疯狂的,因为这给了对冲基金经理巨大的激励去冒巨大的风险,因为他没有显著的 downside。但对于寻找效果良好的超参数来说,这是一个明智的策略。

考虑这三个预测:A、B 和 C。我们假设 A、B 和 C 是尚未尝试过的不同超参数设置。那些绿色的高斯分布是我们的高斯过程模型对这些设置各自表现如何的预测。对于设置 A,均值远低于我们当前的最佳值,并且只有中等方差。对于设置 B,均值更接近我们迄今为止的最佳值,但由于方差不大,上升空间真的不大。对于设置 C,均值实际上低于设置 B,但由于方差高,上升空间很大。

我们将取高斯分布 C 在红线以上的面积,并计算该面积关于红线的矩。这就是我们寻找最大值的东西。你可以看到 C 的矩比 B 或 A 大得多。它可能只有与 B 相同的面积在红线以上,但其中一部分面积远高于红线。因此,如果我们尝试设置 C,我们可能会获得非常大的收益。所以,这就是我们的策略在这里会告诉我们要选择的一个。它是风险最高的赌注,但也是潜在收益最大的赌注。


效果与优势

那么,这种方法效果如何呢?如果你有资源运行大量实验,它在寻找良好的超参数组合方面比人类要好得多。

到目前为止我给你的策略是一个严格的顺序策略,它假设可以看到迄今为止运行的所有实验。但没有理由不把它变得更复杂一点,使用高斯过程模型并行运行一大堆实验。使用高斯过程模型来预测特定超参数设置的表现如何是合理的,因为这不是我们人类擅长的任务,它不像视觉或语音任务。而且,数据中是否存在大量复杂结构尚不清楚。可能唯一真正的结构是事物是平滑的,并且具有某种尺度。

此外,一个人无法记住50个不同实验的结果来预测它们。如果你手动完成所有这些,你可能只是没有注意到你所有好的结果都有非常小的学习率,而所有非常糟糕的结果都有非常大的学习率,因为你关注的是你正在改变的其他许多事情。高斯过程模型不会错过这样的趋势。

高斯过程模型是设置超参数的一个非常好的方法的最后一个原因是,它们比人更不可能作弊。通常,当我们进行研究时,我们想将我们想到的新方法与一些旧的或标准的方法进行比较。有一个非常强烈的倾向,即为我们新方法寻找良好超参数比为那个愚蠢的旧方法更努力。这就是为什么在比较方法时,你真的应该比较不同小组得到的结果,对于每种方法,结果都是由相信该方法的小组产生的。如果我们使用高斯过程模型来搜索良好的超参数集,它们将为那些我们不相信的模型类型所做的搜索,与为我们相信的模型类型所做的搜索一样努力。


总结

本节课中我们一起学习了如何利用高斯过程进行贝叶斯优化,以自动化地寻找神经网络的最佳超参数组合。我们了解了手动调参和网格搜索的局限性,认识了随机搜索的改进,并深入探讨了高斯过程模型如何通过“相似输入产生相似输出”的先验,以及预测均值和方差,来智能地指导超参数空间的探索。最后,我们看到了这种策略的有效性及其在避免人为偏差、高效利用计算资源方面的优势。

16.4:进展的迷雾 🌫️

在本节课中,我们将探讨为何难以对神经网络研究的长期未来做出预测。我们将通过一个生动的类比来理解技术进步的本质,并明确短期预测与长期预测之间的根本区别。

课程概述

在上一节中,我们讨论了神经网络研究的现状。本节作为课程的结尾,我们将不进行具体的未来预测,而是深入分析为何做出长期预测是极其不明智的。我们将通过一个“迷雾中行车”的类比来阐明这一观点。

迷雾的类比:短期清晰与长期模糊

想象一下,你在夜晚驾车,正看着前方车辆的尾灯。

在空气清澈的情况下,你接收到的尾灯光子数量与距离的平方成反比下降。这可以用公式表示为:
光子数量 ∝ 1 / D²
其中,D 代表到前车的距离。

现在,假设起了雾。在短距离范围内,雾对光的吸收微乎其微,因此光子数量仍然大致遵循 1 / D² 的规律衰减。然而,对于长距离,情况发生了根本变化。雾会按单位距离吸收固定比例的光子,这使得衰减变为指数形式:
光子数量 ∝ e⁻ᴰ
(其中 e 是自然常数)。

这意味着,在短距离内,雾看起来是透明的;但在长距离下,它变得完全不透明。因此,前方车辆会在一个根据短期模型(1 / D²)预测其仍应清晰可见的距离上,突然变得完全不可见。这正是雾天导致追尾事故的原因。

技术发展的指数本质

技术的发展通常也遵循指数规律。

  • 短期可预测:在短期内,变化看起来相对缓慢,进展也容易预测。例如,我们大多数人都能对“iPhone 6会包含什么功能”做出相当准确的猜测。
  • 长期不可知:但从长期来看,我们对未来的认知会撞上一堵“墙”,就像迷雾的效果一样。因此,机器学习和神经网络的长期未来完全是一个谜。我们根本无法根据当前的知识预测30年后会发生什么,因为我们将经历指数级的进步。

短期展望与课程结束

然而,在短期范围内,例如未来的 3到10年,我们可以进行相当不错的预测。在我看来,在接下来的五年左右,大型深度神经网络必将取得惊人的成就

以下是本讲的核心要点总结:

  1. 技术发展具有指数特性,类似迷雾中的指数衰减效应。
  2. 短期(数年)进展相对可预测。
  3. 长期(数十年)未来因其指数增长的本质而无法准确预知。
  4. 神经网络在可预见的短期内前景广阔。

我要祝贺所有坚持学习到这里的同学们。😊

希望你们喜欢这门课程。祝大家在期末考试中好运!

posted @ 2026-03-26 12:27  布客飞龙III  阅读(7)  评论(0)    收藏  举报