神经网络入门(一)
最近开始阅读神经网络与深度学习一书的第一章,对神经网络的相关概念有了一些了解。第一章主要是希望构建一个简单的神经网络来识别手写数字,主要按一下几个部分进行了讲解:
(一)感知器
感知器是在20世纪五六十年代由科学家提出,虽然现在使用其它人工神经元的模型更为普遍,例如S型神经元。但是,要理解S型神经元为什么被定义成那样,理解感知器有很大的帮助。感知器的结构如图所示:
该感知器接受x1,x2和x3三个输入,通常还会分别为这三个输入赋予不同的权重w1,w2和w3。最终,可以通过一个阈值获得神经元的output,其具体的计算公式如下式所示:
上式,通过向量表示,并令b=-threshold,即可得到重写的感知器规则:
这通常就是一个感知要做的事情。
(二)S型神经元
S型神经元与感知器类似,但是其输出不在是0和1,而是其中,该函数被称为S型函数,也可以称为sigmoid函数,其具体定义如下式所示:
其形状如下图所示:
由此,我可以通过输入、权重和S型函数,得到S型神经元的输出为:
output=
(三)神经网络的架构
在了解了常用的S型神经元的概念以后,我们即可由此得到一个简单的神经网络的架构,如下图所示:
其中,网络最左边的称为输入层,其中的神经元被称为输入神经元,最右边的为输出层,该层的神经元被称为输出神经元。中间的层被称为隐藏层,隐藏层的层可以为多层。
(四)一个简单的手写分类数字的网络
该书在第一章的该部分给出了一个分类手写数字的简单神经网络。其中手写数字的数据为以下格式的图片:
其中,每个数字的图片可以使用像素进行编码表示,在该例子中每个数字图片使用28*28=784的向量表示,向量中的值为0或者1,0代表该像素区域为白色,二1则代表为黑色。由此,构建了一个由784各输入神经元的神经网络:
其中,该神经网络包含一个隐藏层,并且隐藏层包含15各神经元,而输出层则有10个输出神经元,分别代表10各数字。
(五)使用梯度下降算法进行学习
在构建了手写数字识别的神经网络以后,我们希望能够有一个算法,能够让我们学习到权重和偏置,使网络的输出y(x)能够拟合所有的训练输入。因此,如其它机器学习算法一样,我们定义了该网络的一个代价函数如下式所示:
在这个地方,我们选用的是使用二次函数来构建代价函数,也可以选择其它的代价函数。在上式中,w表示网络中权重的集合,b是所有偏置项的集合。n是训练样本的个数,a在这里表示当输入为x时输出的向量。因此,求和是在总的训练输入x上进行的。
由该代价函数可以看出,我们训练算法的目的是最小化权重和偏置的代价函数。而求解该最小化权重和偏置项的方法有多种,最常用的为梯度下降法,该书也是采用了这种方法,其中梯度下降法的具体步骤和方法将在下次进行详细介绍。
(六)代码实现网络来分类数字
在本章节的最后,作者给出了使用python实现的网络分类数字的具体代码,github地址为:https://github.com/mnielsen/neural-networks-and-deep-learning