|
2#

楼主 |
发表于 2020-7-9 13:58:33
|
只看该作者
本帖最后由 winter 于 2020-7-9 14:04 编辑
使用梯度下降算法进行学习
现在我们已经设计出了一个神经网络,那么我们如何使用它去学习识别数字呢。首先,我们需要一个数据集去学习,我们使用的是MNIST数据集,它包含了数以万计的手写数字的扫描图像,以及他们的正确分类。下图是取值MNIST的几个图像:
正如你所见,这些数字和上一篇文章的数字是一样,当然我们需要我们的网络可以识别不在数据集中的图像。
MNIST数据集包含两个部分,第一个部分包含了60000张图片被用作训练数据。这些通过扫面250个人的手写数字获得,其中有些是美国人口普查局的员工,有些是高中生。这些图像是28X28的灰度图。数据集的第二部分是10000张图片被用来测试,与训练数据的格式一样。我们将使用测试数据衡量我们的神经网络学习得怎么样。当然第二部分的图片是另外250个人的手写样本,这有可以让我们证实网络可以识别不在训练集中的人的手写数字。
我们用x表示一个训练输入。显然x是一个28X28=784的向量,向量中每一个元素表示图像中的一个灰度值。我们用y=y(x)表示对应的期望输出值,其中y是一个10维的向量。比如,有一个特定的显示为6的图像输入为x,那么它期望的输出值应该为y(x)=(0,0,0,0,0,0,1,0,0,0)T,其中T表示矩阵的转置。
我们想有这样一个算法,它可以让我们找到权重和偏差,这样网络的输出y(x)可以拟合所有的输入x。为了量化我们如何实现这个目标,我们定义一个代价函数:
其中w记为网络中的所有权重的集合,b为所有的偏差,n是所有训练输入的数量,a是当输入向量为x时网络的输出向量,并且对所有的输入x进行计算并求和。的确,输出a依赖于输入x、w和b,但是为了简介,我并没用使用axi 这样的符号。符号||v||表示的是向量v的长度(模)。我们把C称为二次代价函数,有时也被称为均方误差或者MSE。观察二次代价函数,我们可以发现C(w,b)是非负的。此外,对于所有的x,当y(x)接近于a时,C(w,b)的值是很小的,也就是C(w,b)≈0,因此我们的训练算法需要能够找到合适的权重和偏差,使得C(w,b)≈0。相反,如果C(w,b)的值很大,就说明有大量的y(x)和a相差很大,这是不好的。因此我们的训练算法目标是要能够找到最小化代价函数C(w,b)的权重和偏差。换句话说,我们需要找到一组权重和偏差,使得代价最小,下面我们将使用梯度下降算法来达到目标。
为什么要介绍二次代价函数?我们不应该关注于图像的正确分类的数量上面吗?为什么不尝试直接最大化正确分类的数量而是要使用最小化一个二次代价函数来简介评测呢?这是因为正确分类图像的数量对于权重和偏差来说不是一个平滑的函数,那么在大多数情况下,对权重和偏差的微小改变不会造成目标函数即正确分类数量的值的改变,这让我们很难找到通过改变权重和偏差提高性能的方法。如果我们使用一个像二次代价函数这样的平滑函数,那将很容易找到通过改变权重和偏差来提高性能的方法。这就是我们为什么专注于最小化二次代价,因为只有这样,我们才能测试分类的准确性。
那么可能你又会好奇为什么要选择式(6)那样的二次函数来作为平滑函数呢?这时临时想出来的么?可能如果我们选择另外一个不一样的代价函数,我们将会得到不同的代价最小时的权重和偏差。这个疑问是有必要的,稍后我将对上面的成本函数再次进行讨论,并作一些修改。然而式(6)中的代价函数对于我们理解神经网络的基础很有帮助,所以我们将一直使用它。
重申一次,我们的目标是训练一个神经网络,找到权重和偏差使得二次代价函数C(w,x)C(w,x)最小化。这个目标没毛病,但是,现在有许多让我们分散精力的东西——对权重ww和偏差bb的解释,难以弄清的σσ函数,网络架构的选择,MNIST等等。其实我们可以通过忽略上述这些中的绝大部分,仅仅考虑最小化这一点来理解这些东西。现在,我们打算忘掉代价函数的具体形式,神经网络的组成等等。现在我们只专注于最小化一个给定的多元函数。我们将学习一种用于最小化问题的梯度下降算法,然后再回到我们想要最小化神经网络的特定函数上去。
OK,现在假设我们尝试最小化某些函数,C(v),它可能是任意的多元实数函数,v=v1,v2,...。注意到我将使用v代替前面的w和b,因为我们刚说过我们不再特定研究神经网络代价函数的最小化问题上,而是任意的函数。我们先假设C是只有两个变量的函数,我们称为v1和v2:
我们想要找到使C达到全局最小的位置。现在对于上述的图像中,我们可以很容易的找到全局最小值。从某种意义上说,我可能展示了一个过于简单的函数。通常函数C是一个拥有许多变量的复杂的函数,并且将不可能通过肉眼一下找到它的全局最小值。
解决这个问题的一种方法是使用微积分的方法。我们将计算函数 C 的导数来寻找它的极值点。运气好的话函数可能只有一个或者几个变量,但是一旦变量过多那将很麻烦。尤其是神经网络中,往往拥有数亿计的权重和偏差,微积分的方法将不再有效。
现在微积分是不能解决最小值的问题了。幸运的是,有一种漂亮的推导法暗示有一种算法可以很好的解决问题。首先我们把函数想象成山谷,向上面那幅图画一样。然后我们假设有一个球从山谷上沿斜坡滚下,常识告诉我们这颗球会滚落到山谷底部。也许我们可以使用这样一个想法去寻找函数的最小值。开始我们把球随机放置在一个位置,然后模拟球从该点滚落到谷底这一过程。我们可以通过计算C的导数(和一些二阶导数)来简单模拟——这些导数将告诉我们这个山谷的一切局部形状,然后我们就知道这个球该怎么滚落了。
说了这么多,你可能会以为接下来我将介绍牛顿定理,摩擦力和重力对球体的影响。事实上,我们只是做了一个假设,并不是真的要用这个球的运动来寻找最小值。提到球只是用来激发我们的想象力,而不是束缚我们的思维。因此与其陷进物理学⾥凌乱的细节,不如我们就这样问⾃⼰:如果我们扮演⼀天的上帝,能够 构造⾃⼰的物理定律,能够⽀配球体可以如何滚动,那么我们将会采取什么样的运动学定律来 让球体能够总是滚落到谷底呢?
|
|