吴恩达机器学习笔记(八)神经网络的反向传播算法
本文章是笔者根据Coursera上吴恩达教授的机器学习课程来整理的笔记。如果是初学者,建议大家首先观看吴恩达教授的课程视频,然后再来看博文的要点总结。两者一起食用,效果更佳。
下面将介绍一种反向传播算法,在给定训练集时,能够为神经网络拟合参数。
一、代价函数(Cost Function)
L
L
L表示神经网络的层数,
s
l
s_l
sl表示第
l
l
l层的神经元数量(不包括偏置项)。
分别考虑二分类问题和多分类问题:
下图中先是列出了Logistic回归中的代价函数。在此基础上,扩展得到神经网络的代价函数。
K
K
K是神经网络的输出单元个数。因为正则化项不考虑
θ
0
\theta_0
θ0,所以求和的下标是从1开始的。(实际上如果考虑
θ
0
\theta_0
θ0也不会有太差的影响,但是习惯上正则项不考虑
θ
0
\theta_0
θ0)
二、反向传播算法(Back Propagation Algorithm)
在梯度下降法或其他高级算法中,都需要首先计算偏导数。
为了计算偏导数,我们使用一种反向传播的算法。
反向传播的含义:把输出层(第四层)的误差反向传播到第三层,再反向传播到第二层。
根据数学证明,可以推出代价函数的偏导数的计算公式(下图中最下方的蓝色手写体)
下面给出使用反向传播算法计算偏导数的方法。计算出偏导数后,可以使用梯度下降法或其他高级算法。
三、理解反向传播(Back Propagation Intuition)
虽然神经网络算法的内部过程和原理很难可视化地展示出来,但是很多学者已经成功地用神经网络的方法很多年了。
四、使用注意:展开参数(Unrolling Parameters)
神经网络的参数
θ
\theta
θ是矩阵,不是向量。
在使用高级优化函数时,要求输入的参数
θ
\theta
θ是向量。因此需要将矩阵转化为向量。
在octave中,把矩阵转化为向量的代码如下:
学习过程:
五、梯度检测(Gradient Checking)
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度检测方法(Numerical Gradient Checking)方法。主要思想:先选取离测试点很近的2个点(吴恩达教授建议 1 0 − 4 10^{-4} 10−4两级),计算这两点间的斜率,用这个斜率来估计测试点的导数。与反向传播算法求出的导数进行对比,如果很接近则认为梯度下降法是正常工作的,如果相差很多说明算法没有正常工作。
神经网络中的梯度检测:
在Octave中的实现:
注意:梯度检测的运行比反向传播算法还要慢的多,因此在已经通过梯度检测验证了反向传播的正确性后,一定要关闭梯度检测。再使用反向传播进行学习。
六、随机初始化(Random Initialization)
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
我们通常将参数初始化为 ( − ε , ε ) (-\varepsilon,\varepsilon) (−ε,ε)之间的随机值。然后再使用反性传播算法等训练模型。
七、总结(Conclusion)
小结一下使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络的步骤:
- 参数的随机初始化,通常初始化成接近于0的较小的值。
- 利用正向传播方法计算所有的
- 编写计算代价函数 的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数
- 使用优化算法来最小化代价函数
注意:神经网络的损失函数不是凸函数,这意味着有可能陷入局部最优解。但在实际中,这不是一个很严重的问题,梯度下降法和其他高级优化算法的表现都不太差,即使陷入一个局部最优解,也是一个值很小的局部最优解。
八、自动驾驶案例(Autonomous Driving Example)
讲述了一个神经网络应用到自动驾驶的一个案例。
首先让人类司机开车,每两秒采集一次前方道路的图片和司机选择的行驶转向,对网络进行训练。然后应用到自动驾驶,每两秒采集一次前方道路的图片,神经网络来输出车的行驶转向。选择置信度最高的输出,作为车的最终行驶方向。