在深度学习算法里面,最基础的是人工神经网络。理解这个算法对于后面的算法是很大的帮助,所以从这里开始。关于历史、发展不再赘述。先来看一下结构:
矩形框中的内容为神经元结构,包含求和、激活两个过程,x为神经元的输入,a为神经元的输出。当然,实际的应用中,神经元的数量不止一个。比如下面的网络结构:
其中layer1是输入层,layer2是隐藏层,layer3是输出层。Layer1中的节点对应上图中的x,layer2和layer3中的节点都是一个上述的神经元结构。用神经元进行预测的过程即是网络的前向传播过程。
前向传播:
其中
为激活函数
如果用y表示目标值,欧式距离表示误差,那么误差函数可以用如下公式表示:
我们的目标是应该尽可能的使输出结果a接近目标值y,也就是让C尽可能的小,即求C的最小值,这也就变成了优化问题。
如何找到C达到最值时的自变量的值(即:w的值)是我们的下一步目标。
最直接的做法就是求解C关于所有权重w的一阶导数,让一阶导数为0,可以求得驻点。然后求Hessian 矩阵,根据Hessian 矩阵判断求得的驻点是否为极值,在实际生活中,一般极值就是最值。但是,这种方法在计算中不容易实现,特别是神经网络的层数比较多,结构比较复杂的时候。
上述的方法,是直接一步计算出结果。既然不容易实现,我们可以采取迂回办法,让目标函数C的值一步步逐渐接近最小值。没错,就是梯度。
对于一个函数而言,在某一点上,函数值是沿着梯度的方法增长,那么当自变量的取值确定时,我们只要求出函数所对应的梯度,让自变量的取值向着与梯度相反的方向变化,函数值必然减小。
先来看一下公式
我们可以用近似代替的方法来计算,如果让⊿x取一个很小的值,然后求出⊿y,就可以用⊿y/⊿x近似代替梯度值。但是,在实际操作中,这种方法的计算量太大,实现起来比较困难。
最终反向传播出现了,足够优雅的解决了梯度计算的问题。从公式来看,最终的目标值C是一个关于权重和偏置的层层复合函数,每增加一层网络,复合一次,这也就给了反向传播解决的方法,利用链式法则,让误差值从输出层一直流动到输入层。(感觉和tensorflow有点像啊,让数据在图中流动)。具体的推倒过程有很多资料,不写太多,这里只给出最终结果(编辑图片、公式什么的太麻烦有木有):
Python实现:https://github.com/haoshengup/Neural-Network
网友评论