1.5 通过梯度下降学习(八)

现在我们设计了一个神经网络,但是它怎样通过学习来识别手写数字呢?首先需要的是被称为训练数据集的数据集合。我们将使用 MNIST数据集,它包含了几万个手写数字的扫描图片,还要正确的分类。MNIST的名字来源于一个事实,它是一个修改通过NIST( the United States' National Institute of Standards and Technology)整理的两个数据集合的子集。这里有几张MNIST的图片:

正如你看到的,事实上这些数字就是第一章展示要识别的数字。当然我们测试神经网络的时候,我们会让它识别不在这个训练集中的图片。

MNIST数据分为两部分。第一部分包含60000张用来训练的图片。这些图片通过扫描250个人的手写获取,他们一半是来自美国人口普查局的员工,一半来自于高中生。图片均为灰度图,大小为28x28像素。第二部分包含了10000个图片的训练集合。同样是28x28的灰度图。我们将用测试数据评估我们的神经网络学习识别手写数字的情况。为了使测试结构具有代表性,这些测试数据同样来自于250个人。这让我们确信系统可以识别来自于它训练时没有看到过的人写的数字。

我们使用符号x代表训练输入。可以把每一个训练输入x看做一个28x28=784维的向量。向量的每一个元素代表图片中一个像素的灰度值。我们用y = y(x)表示期望的输出,y是一个10维的向量。例如,一个训练图片,x,写的是6,那么y(x) = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0)^T就是神经网络期望的输出(T表示转置)。

我们实现的算法达到的效果是让我们得到合适的权重向量和偏移向量,从而对每一个输入x都可以得到一个相近的输出y(x)。我们使用一个代价函数来量化我们的目标:

上式里,w表示网络中的所有权重,b表示所有偏移,n是训练输入的总数,a是当x为输入时的输出向量。当然,输出a决定于x,x和b。为了保持符号的简洁性,我不会明确的解释这种依赖性。符号∥v∥仅仅表示向量v的长度。我们称C为二次代价函数;它有时也被称为均方误差(mean squared error)或者仅仅是MSE。通过查看二次代价函数,我们发现C(w, b)是 非负的,因为式子的每一部分都是非负的。而且,代价C(w, b)变得很小,或者说C(w, b)~0,意味着对所有的输入x,y(x)都非常接近输出a。因此,如果我们找到合适的权重和偏移使的C(w, b)~0,那么我们的训练算法就做的很好。相反的,如果C(w, b)的话说明训练算法做的不好,意味着对于大部分输入来说y(x)和输出a差别很大。所以我们的训练算法的目标就是使的关于权重和偏移的代价函数C(w, b)值最小。换句话说,我们想要找到一组权重和偏移的集合使的代价尽可能的小。我们将使用一种被称为梯度下降的算法。

为什么要引入二次代价函数呢?毕竟,我们的主要目的不是将数字图片正确分类吗?为什么不直接最大化数字,而去最小化一个像二次代价的代理呢?之所以这样是因为在网络中数字图片被正确分类并不是一个关于权重和偏移的平滑函数。对大多数情况来说,对权重和偏移做很小的改变不能引起所有训练图片的正确性。这使得计算怎样改变权重和偏移来提升性能变得很困难。如果我们使用了一个像二次代价的平滑函数,这就会使得计算怎样改变权重和偏移变得简单。这就是为什么我们首先使二次代价函数最小化然后再检查正确性的原因。

即使给出我们将要使用一个平滑的代价函数,你也要思考我们为什么使用等式(6)的二次函数。这是一个非常特别的选择吗?如果我们选择一个不同的代价函数,我们不会得到一组完全不同的最小权重和偏移集合吗?这是一个很好的问题,一会儿我们将要从新检查代价函数,并且做一些修改。然而,等式(6)代价函数对于在神经网络中学习偏移工作的很好,因此我们现在任然使用它。

重复一遍,我们的目标是通过训练神经网络找到一组权重和偏移的集合使的二次代价函数C(w, b)最小。这是一个 适宜的问题,但是它任然有很多分散结构——w和b代表权重和偏移,σ函数潜伏在背后,神经网络的构架,MNIST,等等。如果忽略大多数结构而仅仅集中在最小化方面,我们可以理解更多的东西。因此,我们现在忘掉代价函数的特殊性以及和神经网络的联系等等。取而代之,我们假设我们仅仅简单的又有一个由很多变量的函数,然后最小化这个函数。我们将要使用梯度下降来解决类似的最小化问题。然后我们回到特殊函数来最小化我们的神经网络。

Okay,假设我们将要最小化一类函数,C(v)。它可能又有很多实数变量,v = v1,v2,.....注意,我将使用v来代替w和b符号,一次来强调它可以是任何函数——不是在神经网络中的特殊函数。为了最小化C(v),我们首先思考两个变量的函数,变量称为v1和v2:

1.5 通过梯度下降学习(八)_第1张图片

我们将要做的是寻找C在哪里可以达到全局最小。现在,当然,对于在上面绘画出的函数我们可以用眼看到图像并且找到最小点。由此看来,我的确好像展示了一个相当简单的函数!一个函数C通常可能是一个有很多变量的复杂函数,并且不能如此简单的用眼看到图像并找到最小值。

一种解决问题的方法就是施工微积分分析来找到最小值。我们可以计算导数然后使用它们来找到C的极值。如果C是一个仅仅含有一个或者很少几个变量的函数,那么我们很幸运。如果它含有很多变量,那将是一场噩梦。并且在神经网络中,我们经常用用很多很多的变量——极端情况下,最大的神经网络的代价函数依赖于数十亿个权重和偏移。使用微积分来最小化完全无法工作。

Okay,看来微积分无法使用了。幸运的是,有一个漂亮的比喻暗示有一个算法可以工作的很好。我们把我们的函数看做一个山谷。如果你看一下上面的图,这种想象应该不难。我们想象一个球从斜坡滚落。我们的常识告诉我们,球最终会落到谷底。难道我们不可以使用这种方法来寻找一种最小化的方法吗?我们随意为球选取一个起始点,然后模仿球向谷底滚落的过程。我们可以通过计算C的导数来模拟这个过程——这些导数可以告诉我们山谷中附近点的所有信息,那决定我们的球怎样滚动。

通过我刚才的描述,你可能会想我们要分析球受到的摩擦和重力建立牛顿力学的方程式了。事实上,我们我们的类比不是很准确——我们要发明一个算法来最小化C,而不是精确的模拟物理定律!通过球的视角只是为了更爱好的想象,而不是束缚我们的想法。因此,避开散乱的物理细节,我们简单的自问一下:如果我们有一天成我了上帝,并且可以建立自己的物理定律,指定球怎样去滚落,我们应该指定怎样的定律来使小球总是滚落到谷底呢?

使问题变的更加明确一些,让我们想一下当我们在球的v1方向移动了很小的Δv1,在V2方向移动了很小的Δv2会发生什么。微积分告诉我们如下结果:

我们需要找到一个方法来选择Δv1和Δv2使的ΔC是负的;也就是我们选择他们,小球就会向谷底滚落。为了明白如何选择,使用Δv代替向量v,Δv≡(Δv1,Δv2)^T。我们也定义向量的偏导数为C的梯度:


我们用∇C表示梯度:

一会儿我们会使用梯度∇C和Δv来重写变化ΔC的表达式。在那之前,我想说明一些会让人们困惑的梯度的问题。当第一次看到∇C符号的时候,很多人会想为什么要用∇符号,或者说,∇符号有什么意义吗?事实上,你可以把梯度仅仅看做一个简单的数学记号-方便用来表示偏导的向量-这样就不用写两个符号了。这样来看,∇仅仅是一面符号的旗帜,告诉你:“嗨,∇C是一个梯度向量。”也有很多其他的关于∇的解释(比如,作为一种微分符号),但我们不需要这种观点。

通过这个定义,表达式(7)可以被重写为:

这个等式解释了∇C为什么被称为梯度向量:∇C和C中v的变化息息相关,只是我们把他称为梯度罢了。但是真正令人兴奋的还是这个等式用来寻找怎样选择Δv使的ΔC为负。尤其,假设我们选择:

η是一个很小的正数(被称为学习速率)。等式(9)告诉我们:


可得ΔC≤0恒成立,C将会一直减小,永不增大。这就是我们想要的。所以,我们将会使用等式(10)在我们的梯度下降算法中的小球的“运动定律”。也就是我们将用(10)来计算Δv,并使用结果来改变小球的位置v:

接下来将会重复这个运动。如果我们一直做这个,不断重复,我们希望C一直减小直到达到全局最小值。

总结一下,梯度下降算法的工作就是重复计算梯度∇C,然后朝着相反的方向运动,沿着山谷的墙壁“滚落”。如下图:

1.5 通过梯度下降学习(八)_第2张图片

注意,梯度下降并不是完全复制的真实的物理运动。真实的世界中,球拥有动量,它可以让球滚落,甚至再次上升,只有有摩擦力,它才会滚落到谷底。同的是,我们选择Δv的规则不一样,就像再说“立马下降!”。这仍然是一个寻找最小值的好办法。

为了使梯度下降正确,我们需要选择一个足够小的学习速率使(9)式较接近。

你可能感兴趣的:(1.5 通过梯度下降学习(八))