神经网络初探:从数据到参数

神经网络初探:从数据到参数

​ 我们已经知道了什么是神经网络,那么自然而然有一个问题:神经网络拿来干嘛?神经网络有那么多参数我们如何得到?这就是神经网络的核心问题,从数据到参数,这就是:训练!

​ 以手写数字(MNIST数据集)识别为例,接下来介绍下神经网络的训练过程。MNIST数据集包含70000张手写数字图片,每张图片的大小是28乘以28总共784个像素,这784个像素的灰度值(0~1)作为输入,于是输入层需要784个神经元,数字一共有十种,从0到9,那么对应的输出层该有10个输出值,当然我们可以设计一个中间层,具体数目可以调节,20个或者30个都可以,最后我们得到如下所示的网络结构:

神经网络初探:从数据到参数

相当于我们输入一个长度为784的向量,输出一个长度为10的向量,比如(1,0…,0)对应‘0’这个类别,(0,1,0…,0)对应‘1’这个类别,依次类推。终于我们把手写数字的识别问题完全转化为一个数学问题,数据集当中的每一个数据和对应的标签(长度为10的向量)可以看做是高维空间当中的一个点,我们的问题是能否做一条曲线使得这条曲线尽量地经过数据集上的所有点?这个问题其实我们并不陌生,在一个平面上就是我们熟知的拟合问题,使用的数学方法就是最小二乘法。同样,在这样的高维空间中,最小二乘的思想也是适用的,于是我们可以定义一个代价函数(cost function) C:

C=12ni=1n||yiai||2

从这个公式当中,我们可以得到,代价函数是通过神经网络计算输出向量和标签向量距离平方的算数平均数,于是我们将一个识别问题转化为函数的优化问题,我们要做的就是如何得到一组参数,使得代价函数最小?

​ 数学上已经有了处理这种问题的工具,那就是梯度下降方法(gradient descent method)!

以下是简单的推导过程:

CdCΔCΔPΔCΔPΔC=======C(w,b)Cwdw+CbdbCwΔw+CbΔb[ΔwΔb]ΔPCηCη2C

在以上的推导当中我们只要让参数的增量正比于梯度,那么我么就可以保证代价函数一定是减少的,这个参数eta我们称之为学习率!给定一组初始参数,经过足够次数的迭代,我们最终会得到一组网络参数,使得代价函数最小,用测试数据集可以测试这组参数的准确率如何。

​ 到此为止,我们介绍完了神经网络的训练过程。当然,这只是基本的原理介绍,如何转化为可以运行的代码,我们一些简单的技巧以及一个高效的算法。这个算法的核心在于计算梯度,也就是代价函数对每一个参数的偏导,这个问题并没有我们想象的那么简单,在以后的帖子当中我会做进一步的探讨。

备注:参考自Michael Nielsen的博客(http://michaelnielsen.org/