【第五章】简单网络实现手写数字分类-梯度下降算法

本文介绍了如何通过神经网络设计学习识别数字,使用MNIST数据集进行训练,并详细阐述了成本函数、梯度下降算法,包括为何选择二次成本函数以及随机梯度下降的原理和优势。文章还提到在高维空间中处理复杂模型的思考方式。
摘要由CSDN通过智能技术生成

前言

现在我们有了神经网络的设计,它该如何学习识别数字呢?我们首先需要一个数据集来学习,即所谓的训练数据集。我们将使用MNIST数据集,其中包含数万张手写数字的扫描图像,以及它们的正确分类。MNIST的名称源于它是美国国家标准与技术研究所(NIST)收集的两个数据集的修改子集。以下是来自MNIST的一些图像:
在这里插入图片描述
正如你所看到的,这些数字实际上与最开始展示的数字相同。当然,在测试我们的网络时,我们会要求它识别不在训练集中的图像!

MNIST数据分为两部分。第一部分包含60,000张图像,用作训练数据。这些图像是来自250人的扫描手写样本,其中一半是美国人口调查局的员工,另一半是高中学生。这些图像是灰度的,大小为28x28像素。MNIST数据集的第二部分是用作测试数据的10,000张图像。同样,这些是28x28的灰度图像。我们将使用测试数据来评估我们的神经网络学习识别数字的能力。为了使这成为性能的良好测试,测试数据来自于与原始训练数据不同的250人(尽管仍然是由人口调查局员工和高中学生组成的群体)。这有助于增强我们对系统能够识别未在训练中看到的人的手写数字的信心。

我们将使用符号 x 表示训练输入。将每个训练输入 x 视为一个 28×28=784 维向量会很方便。向量中的每个条目表示图像中单个像素的灰度值。我们将相应的期望输出表示为 y=y(x),其中 y 是一个10维向量。例如,如果特定的训练图像 x 描绘的是一个数字6,那么 y(x)=(0,0,0,0,0,0,1,0,0,0)^T 就是网络的期望输出。这里的 T 是转置操作,将行向量转换为普通的(列)向量。

成本函数

我们希望有一种算法,能够让我们找到权重和偏差,使网络的输出逼近所有训练输入 x 对应的 y(x)。为了量化我们实现这一目标的程度,我们定义了一个成本函数。有时被称为损失函数或目标函数。在教程中,我们使用成本函数这个术语,但你应该注意到其他术语,因为它经常在研究论文和其他关于神经网络的讨论中使用。
在这里插入图片描述
这里,w表示网络中所有权重的集合,b表示所有偏差,n是训练输入的总数,a是当输入x时网络的实际输出向量,y(x)是期望输出。求和是针对所有训练输入x的。当然,输出a取决于输入x、权重w和偏差b,但为了保持符号简单,我没有明确表示这种依赖关系。符号∥v∥表示向量v的常规长度函数。我们将C称为二次成本函数;有时它也被称为均方误差或简称为MSE。检查二次成本函数的形式,我们看到C(w,b)是非负的,因为求和中的每一项都是非负的。此外,当y(x)近似等于输出a时,成本C(w,b)变小,即C(w,b)≈0,对于所有训练输入x。因此,如果我们的训练算法能够找到权重和偏差,使C(w,b)≈0,那么它就做得很好。相反,如果C(w,b)很大,那么我们的训练算法就表现得不太好,这意味着对于大量的输入,y(x)与输出a不接近。因此,我们的训练算法的目标是最小化成本C(w,b)作为权重和偏差的函数。换句话说,我们想找到一组使成本最小化的权重和偏差。我们将使用称为梯度下降的算法来实现这一点。

为什么要引入二次成本函数呢?毕竟,我们主要关心的是网络正确分类的图像数量吧?为什么不直接尝试最大化这个数量,而是要最小化类似二次成本的替代度量呢?问题在于,正确分类的图像数量并不是网络中权重和偏差的平滑函数。大多数情况下,对权重和偏差进行微小更改并不会导致训练图像正确分类数量的任何变化。这使得难以确定如何改变权重和偏差以获得改进的性能。如果我们使用一个像二次成本这样的平滑成本函数,那么确定如何对权重和偏差进行微小变化以获得成本改进就会变得容易得多。这就是为什么我们首先专注于最小化二次成本,只有在那之后我们才会检查分类准确性。

即使我们想使用一个平滑的成本函数,你可能仍然会想知道为什么我们选择了方程(6)中使用的二次函数。这不是一个相当专断的选择吗?也许如果我们选择了不同的成本函数,我们会得到完全不同的最小化权重和偏差集合?这是一个合理的担忧,稍后我们将重新审视成本函数,并进行一些修改。然而,方程(6)中的二次成本函数对于理解神经网络中学习的基础非常有效,所以我们暂时将其保留。

总结一下,在训练神经网络时,我们的目标是找到最小化二次成本函数 C(w,b) 的权重和偏差。这是一个明确定义的问题,但目前它有很多分散注意力的结构——权重和偏差的解释,背景中潜伏的σ函数,网络架构的选择,MNIST等等。事实证明,我们可以通过忽略大部分这些结构,只集中精力在最小化方面来理解大量内容。所以现在我们将忘记关于成本函数的具体形式,与神经网络的联系等等。相反,我们将假设我们只是被给定了一个多变量函数,我们想要最小化这个函数。我们将开发一种称为梯度下降的技术,可以用来解决这种最小化问题。然后我们将回到我们想要在神经网络中最小化的具体函数。

梯度下降

好的,让我们假设我们正在尝试最小化某个函数 C(v)。这可以是许多变量 v=v1,v2,… 的任意实值函数。请注意,我用 v 替换了 w 和 b 的符号,以强调这可以是任何函数——我们不再特别考虑神经网络的背景。为了最小化 C(v),将 C 想象成仅有两个变量的函数会有所帮助,我们将它们称为 v1 和 v2:
在这里插入图片描述
我们希望找到 C 达到全局最小值的位置。现在,当然,对于上面绘制的函数,我们可以粗略估计图形并找到最小值。从这个意义上说,我可能展示了一个稍微过于简单的函数!一般的函数 C 可能是许多变量的复杂函数,通常不可能只凭眼睛观察图形找到最小值。

解决这个问题的一种方法是使用微积分来尝试解析地找到最小值。我们可以计算导数,然后尝试使用它们找到 C 是极值的地方。运气好的话,当 C 是一个或几个变量的函数时,这可能有效。但当我们有更多的变量时,这将变成一个噩梦。对于神经网络,我们通常希望有更多的变量 - 最大的神经网络的成本函数以一种极其复杂的方式依赖于数十亿个权重和偏差。使用微积分来最小化它们是行不通的!

好的,那么微积分不起作用。幸运的是,有一种工作得相当不错的算法。我们首先将我们的函数想象成一种山谷。如果你稍微凝视一下上面的图形,这应该不难理解。我们想象一个球沿着山谷的斜坡滚动。我们日常经验告诉我们,球最终会滚到山谷的底部。也许我们可以利用这个想法来找到函数的最小值?我们会随机选择一个起始点作为(想象中的)球的起点,然后模拟球滚动到山谷底部的运动。我们可以通过计算 C 的导数(也许还有一些二阶导数)来进行这种模拟 - 这些导数会告诉我们关于山谷局部“形状”的一切,因此我们的球应该如何滚动。

根据我刚才所写的内容,你可能会认为我们将尝试写出牛顿的运动方程,考虑摩擦和重力等影响。实际上,我们不会对球滚动的类比过于认真——我们正在设计一种用于最小化 C 的算法,而不是开发物理定律的准确模拟!球的视角旨在激发我们的想象力,而不是限制我们的思维。因此,与其深入研究物理学的各种细节,不如简单地问自己:如果我们被宣称为上帝一天,可以制定自己的物理法则,指导球如何滚动,我们可以选择什么样的运动定律,让球总是滚到山谷的底部呢?

为了更准确地提出这个问题,让我们考虑当我们沿着 v1 方向移动球一小段 Δv1,以及沿着 v2 方向移动球一小段 Δv2 时会发生什么。微积分告诉我们 C 的变化如下:
在这里插入图片描述
我们将找到一种方法选择 Δv1 和 Δv2,使 ΔC 为负值;也就是说,我们将选择它们使得球朝着山谷滚动。要弄清楚如何做出这样的选择,有助于将 Δv 定义为 v 变化的向量,Δv≡(Δv1,Δv2)^T,其中 T 是转置操作,将行向量转换为列向量。我们还将定义 C 的梯度为偏导数的向量,记作∇C
在这里插入图片描述

片刻后,我们将用 Δv 和梯度 ∇C 重新表达变化 ΔC。在此之前,我想澄清一些有时会让人对梯度感到困惑的事情。第一次遇到 ∇C 符号时,有时人们会想知道他们应该如何理解 ∇ 符号。∇ 到底意味着什么?实际上,把 ∇C 看作一个单一的数学对象是完全可以的——上面定义的向量,只不过用两个符号写出来。从这个角度来看,∇ 只是一种符号标记,告诉你“嘿,∇C 是一个梯度向量”。还有更高级的观点,可以把 ∇ 视为独立的数学实体(例如,作为微分算子),但我们不需要这样的观点。

有了这些定义,表达式 (7) 的 ΔC 可以重写为
在这里插入图片描述
这个方程有助于解释为什么 ∇C 被称为梯度向量:∇C 将 v 的变化与 C 的变化联系起来,正如我们期望梯度所做的那样。但这个方程真正令人兴奋的地方在于,它让我们看到如何选择 Δv,以使 ΔC 变为负数。特别是,假设我们选择
在这里插入图片描述
其中 η 是一个小的正参数(称为学习率)。然后,方程(9)告诉我们
在这里插入图片描述
因为
在这里插入图片描述
这保证了 ΔC≤0,即,如果我们根据(10)中的规定改变 v,那么 C 将始终减少,永远不会增加。(当然,要考虑到方程(9)中的近似极限)。这正是我们想要的属性!因此,我们将采用方程(10)来定义梯度下降算法中球的“运动规律”。也就是说,我们将使用方程(10)来计算 Δv 的值,然后将球的位置 v 移动相应的距离:
在这里插入图片描述
然后我们将再次使用这个更新规则,进行下一步移动。如果我们一直这样做,一遍又一遍地进行下去,我们将持续减小 C,直到达到我们希望 的全局最小值。

总结一下,梯度下降算法的工作方式是反复计算梯度 ∇C,然后沿着相反的方向移动,“沿着山谷的斜坡下滑”。我们可以这样进行可视化:
在这里插入图片描述
请注意,根据这个规则进行梯度下降并不会复制真实的物理运动。在现实生活中,一个球具有动量,这种动量可能使它沿着斜坡滚动,甚至(暂时)朝上滚动。只有在摩擦力产生作用之后,球才能确保滚下山谷。相比之下,我们选择 Δv 的规则只是说“现在就向下”。尽管如此,这仍然是一个寻找最小值的相当不错的规则!

为了使梯度下降正确工作,我们需要选择学习率 η 足够小,以便方程(9)是一个良好的近似值。如果我们不这样做,我们可能会得到 ΔC>0,显然这是不好的!与此同时,我们也不希望 η 太小,因为这会使改变 Δv 微小,从而使梯度下降算法工作得非常缓慢。在实际实现中,通常会调整 η,以使方程(9)仍然是一个良好的近似值,但算法不会太慢。我们稍后会看到这是如何实现的。

我已经解释了当 C 是仅有两个变量的函数时的梯度下降。但实际上,即使 C 是更多变量的函数,一切也同样适用。特别是假设 C 是 m 个变量 v1,…,vm 的函数。那么由小变化 Δv=(Δv1,…,Δvm)T 引起的 C 的变化 ΔC 是:
在这里插入图片描述
其中梯度 ∇C 是向量:
在这里插入图片描述
就像对于两个变量的情况一样,我们可以选择
在这里插入图片描述
我们可以确保我们的(近似的)表达式(12)对于 ΔC 将是负数。这为我们提供了一种方法,即使 C 是许多变量的函数,也可以通过反复应用更新规则来沿着梯度找到最小值:
在这里插入图片描述
您可以将这个更新规则视为定义梯度下降算法。它为我们提供了一种通过反复改变位置 v 来寻找函数 C 的最小值的方法。这个规则并不总是有效 - 几件事情可能会出错,阻止梯度下降找到函数 C 的全局最小值,这是我们将在后面的章节中返回探讨的一个点。但是,在实践中,梯度下降通常效果非常好,在神经网络中,我们会发现它是一种强大的方式来最小化成本函数,从而帮助网络学习。

事实上,甚至可以说梯度下降是寻找最小值的最优策略。假设我们试图进行一次位置变化 Δv,以使 C 减小尽可能多。这相当于最小化 ΔC≈∇C⋅Δv。我们将限制移动的大小,使 ∥Δv∥=ϵ,其中 ϵ>0 是一个小的固定值。换句话说,我们希望进行一次固定大小的小步移动,并试图找到尽可能减小 C 的移动方向。可以证明,最小化 ∇C⋅Δv 的选择是 Δv=−η∇C,其中 η=ϵ/∥∇C∥ 由大小约束 ∥Δv∥=ϵ 决定。因此,梯度下降可以被视为一种在能够立即减小 C 的方向上采取小步的方法。

人们已经研究了许多变体的梯度下降,包括更接近真实物理球体的变体。这些模拟球体的变体有一些优点,但也有一个主要的缺点:需要计算 C 的二阶偏导数,而这可能成本很高。要看出为什么成本高,假设我们想要计算所有的二阶偏导数 ∂2C/∂vj∂vk。如果有一百万个这样的 vj 变量,那么我们就需要计算大约一万亿(即一百万的平方)个二阶偏导数。这将是计算成本高昂的。话虽如此,有一些技巧可以避免这种问题,并且寻找梯度下降的替代方法是一个活跃的研究领域。但在本书中,我们将使用梯度下降(及其变体)作为神经网络学习的主要方法。

我们如何将梯度下降应用于神经网络的学习呢?其想法是使用梯度下降来找到最小化方程(6)中成本的权重 wk 和偏置 bl。为了了解这是如何工作的,让我们重新阐述梯度下降的更新规则,用权重和偏置替换变量 vj。换句话说,我们的“位置”现在有了分量 wk 和 bl,梯度向量 ∇C 有了相应的分量 ∂C/∂wk 和 ∂C/∂bl。将梯度下降的更新规则写成分量形式,我们有
在这里插入图片描述
通过反复应用这个更新规则,我们可以“下山”,并且希望找到成本函数的最小值。换句话说,这是一个可以用来在神经网络中学习的规则。

在应用梯度下降规则时存在许多挑战。我们将在后面的章节中深入探讨这些挑战。但现在我只想提及一个问题。为了理解这个问题,让我们回顾一下方程(6)中的二次成本函数。注意到这个成本函数的形式是
在这里插入图片描述

,即它是对各个训练样本的成本
在这里插入图片描述
的平均值。实际上,为了计算梯度 ∇C,我们需要分别计算每个训练输入 x 的梯度 ∇Cx,然后再对它们求平均,即
在这里插入图片描述
。不幸的是,当训练输入的数量非常大时,这可能需要很长时间,因此学习过程会很慢。

一个称为随机梯度下降的方法可以用来加速学习。这个想法是通过计算一小部分随机选择的训练输入的梯度 ∇Cx 来估计梯度 ∇C。通过对这个小样本求平均,结果表明我们可以快速得到真实梯度 ∇C 的良好估计,这有助于加速梯度下降,从而加速学习。

为了使这些想法更加精确,随机梯度下降通过随机挑选一小部分数量为 m 的随机选择的训练输入来工作。我们将这些随机训练输入标记为 X1, X2, …, Xm,并称它们为一个小批量(mini-batch)。只要样本大小 m 足够大,我们期望 ∇CXj 的平均值将大致等于所有 ∇Cx 的平均值,即
在这里插入图片描述
其中第二个求和是对整个训练数据集进行的。交换两边,我们得到
在这里插入图片描述
这确认了我们可以通过仅为随机选择的小批量计算梯度来估计整体梯度
为了将这一点明确地与神经网络中的学习联系起来,假设wk和bl分别表示我们神经网络中的权重和偏置。那么随机梯度下降通过挑选出一个随机选择的小批量训练输入,并使用这些输入进行训练
在这里插入图片描述
其中求和是对当前小批量中所有训练样本 Xj 进行的。然后我们选出另一个随机选择的小批量并用这些进行训练。如此继续,直到我们用完了训练输入,这被称为完成了一轮训练(epoch)。在那时,我们开始新的一轮训练。

顺便提一下,值得注意的是,关于成本函数的缩放以及对权重和偏置的小批量更新,不同的约定是有差异的。在方程(6)中,我们通过一个因子 1/n 缩放了整个成本函数。有时人们省略了 1/n,仅仅对各个训练样本的成本进行求和而不是平均。当总训练样本数事先未知时,这种做法尤其有用。例如,如果更多的训练数据正在实时生成。同样,小批量更新规则(20)和(21)有时省略了求和前面的 1/m 项。在概念上这差别不大,因为这相当于重新缩放学习率 η。但在进行不同工作的详细比较时,注意这一点是值得的。

我们可以将随机梯度下降视为类似政治民调:对一个小批量样本进行抽样要比对整批样本应用梯度下降容易得多,正如进行一次民调要比举行一次完整的选举容易。例如,如果我们有一个大小为 n=60,000 的训练集,就像在 MNIST 中那样,并选择一个小批量大小 m=10,这意味着我们在估计梯度时会获得 6,000 倍的速度提升!当然,这个估计不会是完美的 - 会有统计波动 - 但它不需要完美:我们真正关心的是大致方向上能帮助减少 C,这意味着我们不需要精确计算梯度。实践中,随机梯度下降是一种常用且强大的神经网络学习技术,它是我们在本教程中将发展的大多数学习技术的基础。

让我在这一节的结尾讨论一个有时会困扰初学者的关于梯度下降的问题。在神经网络中,成本 C 当然是许多变量的函数——所有的权重和偏置——因此在某种意义上定义了一个在非常高维空间中的表面。一些人可能会纠结于这样的想法:“嘿,我必须能够想象所有这些额外的维度”。他们可能开始担心:“我无法在四维中思考,更不用说五维(或五百万维)了”。他们是否缺少一些特别的能力,一些“真正”的超级数学家拥有的能力?当然,答案是否定的。即使是大多数专业数学家,也不特别擅长想象四维空间。他们使用的技巧,是开发表示正在发生什么的其他方法。这正是我们上面所做的:我们使用了代数(而不是视觉)表示的 ΔC 来弄清楚如何移动以减少 C。在高维度中思考的人拥有包含许多不同技巧的心智图书馆;我们的代数技巧只是一个例子。这些技术可能没有我们习惯于在想象三维时的简单性,但一旦你建立起这样的技术库,你可以变得相当擅长于在高维度中思考。我不会在这里详细展开,但如果你感兴趣,你可能会喜欢阅读一些专业数学家用来在高维度中思考的技术的讨论。虽然讨论的一些技术相当复杂,但大部分最好的内容都是直观和易于接近的,任何人都可以掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值