赞
踩
这一小章节将主要介绍神经网络的主要模型以及神经网络参数优化算法,在下一章节将结合代码进行解析说明。文章所有内容来源于http://neuralnetworksanddeeplearning.com/index.html 个人感觉是对神经网络阐述很详细很细致的一篇文章,建议仔细阅读揣摩。
1.感知机
要想了解神经网络的模型,首先引入一个更为简单的模型-感知机。感知机的基本模型是:输入若干变量数据
输出结果是0或者1是由下面的条件进行判断的,
为了下面更好的引入神经网络的概念,我们将感知机的表达式稍微做些改变:1. 将
图中的感知机bias设为3,weight为
现在考虑使用上述感知机来进行handwriting digit recognition任务,即希望对于如下的手写字母,通过感知机来判断每一个数字的正确归类(如下面图片中的数字分别为 5 0 4 1 9 2)。
我们考虑,假设模型最开始是不具备识别能力的,但是我们希望可以通过一点点地调节参数weight和bias来使得感知机的输出结果不断地逼近真实数字标签。但是感知机模型会存在一个问题:对参数的局部调整都有可能导致模型输出从0变为1或从1变为0这样的突变,在这种情况下,很难用迭代方式优化参数来获得符合我们需求的模型。其实归根结底,是感知机的输出不平滑连续导致的。由此引入了神经网络模型。
神经网络模型中采用sigmoid函数对
sigmoid函数的基本表达形式是,
从图中可以看出sigmoid函数的一条重要性质:当变量
2.神经网络的模型结构
神经网络模拟的是人类神经元之间的信息处理传递过程,下面这张图描述了一个基本的神经网络模型结构,
如图,最左侧具有6个神经元,称为input layer;最右侧只有一个输出神经元,称为output layer;中间还有两层,分别包含4个和3个神经元,位于中间的所有层(除去输入层和输出层之外)称为hidden layers。
对于我们最开始的digit recognition问题,应如何设计神经网络结构呢?可以先考虑简单的情况:判断一张图片上的数字是否为9。我们可以将图片统一为28*28的灰度图,那么每一张输入图片就对应于一个28*28=784的像素矩阵。设置神经网络的输入层包含784个神经元,依次吸收784个像素值;而对于输出层而言,只需要设置一个输出神经元,如果当前模型的输出结果大于0.5,那么我们则认为其上的数字为9,反之,我们认为其上的数字不为9。类推至更复杂的情况,如果期望识别每一张图片上对应的真实数字属于0~9中的哪一个,那么输入层及预处理不变,而调整输出层为10个神经元,分别对应于0~9的10个数字。如果输出层上的哪一个神经元的输出值最大,则可以认为其对应的数字就是该神经网络识别的结果数字。
3.神经网络的数学表示&前向传播
首先介绍几个符号:
从上面的符号推导公式可以看出,在神经网络中,后一层的神经元的值会根据前一层神经元的改变而改变,这种由前向后依次计算每个神经元值的传导过程称为神经网络的前向传播过程。
4.神经网络-梯度优化
对于digit recognition任务,经过前面的介绍,我们已经知道如何设计神经网络结构,以及如何用数学符号和数学表达式对神经网络进行表示,但是这样的一个神经网络又是如何来完成识别任务的呢?
对于上面设计好的神经网络结构(输入784个神经元,中间若干隐含层,输出10个神经元),假设存在这样的一组神经网络参数
这里我们使用MNIST数据集进行训练测试(http://yann.lecun.com/exdb/mnist/),对于每一张画有数字的图像,按照统的一规格预处理为28*28大小,那么所有的784个灰度像素值依次输入神经网络的784个输入层神经元,输出层设置为10个输出神经元,依次对应于0~9的10个数字。我们用变量
为了衡量当前网络的识别能力,定义cost function,【注意,其实有多种定义cost function的方法,下面的这种形式其实是有一定的问题的,这里先不提具体的在哪里,只是从这种简单的cost function开始来说明神经网络算法问题。具体的关于cost function的问题将在第三小节进行讨论】
为了获得适当的参数
而在神经网络中存在两组参数
但是这里会有个小问题,我们回过头来看原本的cost function
随机梯度下降
上面我们已经了知道如何设计神经网络来匹配digit recognition的任务,也知道可以使用梯度下降优化的方法来不断迭代地更新神经网络的参数,使得训练数据集中更多的数据输出尽可能地贴近真实的数字标签,这样训练之后的网络就可以完成我们的期望目标。但是梯度下降法受到训练数据集数量的限制,容易存在效率问题,所以引入随机梯度下降的概念来改善这个问题。
随机梯度下降的思想也很简单,既然使用所有的训练集计算梯度会耗费较多的时间,那么我们考虑在所有训练集上随机选取一个小的子集上进行训练,可以认为在这个子集上训练的平均误差与在整个训练集上的训练误差是比较接近的,而又由于训练数据的减少,就可以明显减少模型整体的训练时间。基于这样的想法,我们将所有的训练数据分为若干个子集
所以
上述公式的求和是针对当前mini-batch中的所有训练数据进行的,然后再随机选择下一个mini-batch,直至将训练集中的所有训练数据遍历完为止,这样的一个过程称为一个epoch。结束一个epoch后,可以继续进行下一个epoch。epoch的次数以及mini-batch的大小需要单独作为参数设置。
5.神经网络-后向传播
前面我们已经介绍了可以使用梯度下降法来优化求解网络参数
向后传播求梯度值关键有四个公式,为了引出这四个公式首先举一个小例子:
假设在第
通过上面这个例子可以看出,
公式1:如何计算输出层的error项?
证明:根据定义有
讨论:
上述公式写成矩阵表达式为:
公式2:error项的向后传播演算
证明:
而又因为,
讨论:由上面的公式可以发现,当前层的误差error可以通过后一层的误差error传播而来,那么我们就可以从最后一层的误差
公式3:关于bias的偏导计算
神经网络关于bias的偏导计算公式是,
证明:
通过链式法则改写上述公式为,
讨论:从上面的公式很明显可以看出,cost方程关于bias的偏导其实就是error项!这离我们的目标只差最后一步了!
公式4:关于weight的偏导计算
神经网络关于weight的偏导计算公式是,
证明:
讨论:从公式中可以看出,当前层关于weight的偏导,可以通过当前层的误差项和前一层的神经元激活项的乘积得到。
以上四个公式介绍了如何求每一层的误差项
6.神经网络优化算法
采用随机梯度下降法优化神经网络参数,每次随机取<script type="math/tex" id="MathJax-Element-146">m</script>个训练数据作为mini-batch。整个算法优化流程为(当然实际中还需要在外层添加循环遍历多个mini-batch,以及更外层多个epoch循环),
好啦,现在已经将整个神经网络最基本的内容介绍结束了,在下一章节将会列举一小段实现神经网络优化算法的代码进一步来说明!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。