吴恩达机器学习笔记(八)神经网络的反向传播算法

吴恩达机器学习笔记(八)神经网络的反向传播算法

  • 一、代价函数(Cost Function)
  • 二、反向传播算法(Back Propagation Algorithm)
  • 三、理解反向传播(Back Propagation Intuition)
  • 四、使用注意:展开参数(Unrolling Parameters)
  • 五、梯度检测(Gradient Checking)
  • 六、随机初始化(Random Initialization)
  • 七、总结(Conclusion)
  • 八、自动驾驶案例(Autonomous Driving Example)

本文章是笔者根据Coursera上吴恩达教授的机器学习课程来整理的笔记。如果是初学者,建议大家首先观看吴恩达教授的课程视频,然后再来看博文的要点总结。两者一起食用,效果更佳。

下面将介绍一种反向传播算法,在给定训练集时,能够为神经网络拟合参数。

一、代价函数(Cost Function)

L L L表示神经网络的层数, s l s_l sl表示第 l l l层的神经元数量(不包括偏置项)。
分别考虑二分类问题和多分类问题:
吴恩达机器学习笔记(八)神经网络的反向传播算法_第1张图片

下图中先是列出了Logistic回归中的代价函数。在此基础上,扩展得到神经网络的代价函数。 K K K是神经网络的输出单元个数。因为正则化项不考虑 θ 0 \theta_0 θ0,所以求和的下标是从1开始的。(实际上如果考虑 θ 0 \theta_0 θ0也不会有太差的影响,但是习惯上正则项不考虑 θ 0 \theta_0 θ0
吴恩达机器学习笔记(八)神经网络的反向传播算法_第2张图片

二、反向传播算法(Back Propagation Algorithm)

在梯度下降法或其他高级算法中,都需要首先计算偏导数。
吴恩达机器学习笔记(八)神经网络的反向传播算法_第3张图片

为了计算偏导数,我们使用一种反向传播的算法。

反向传播的含义:把输出层(第四层)的误差反向传播到第三层,再反向传播到第二层。
根据数学证明,可以推出代价函数的偏导数的计算公式(下图中最下方的蓝色手写体)
吴恩达机器学习笔记(八)神经网络的反向传播算法_第4张图片

下面给出使用反向传播算法计算偏导数的方法。计算出偏导数后,可以使用梯度下降法或其他高级算法。
吴恩达机器学习笔记(八)神经网络的反向传播算法_第5张图片

三、理解反向传播(Back Propagation Intuition)

虽然神经网络算法的内部过程和原理很难可视化地展示出来,但是很多学者已经成功地用神经网络的方法很多年了。

吴恩达机器学习笔记(八)神经网络的反向传播算法_第6张图片

四、使用注意:展开参数(Unrolling Parameters)

神经网络的参数 θ \theta θ是矩阵,不是向量。
在使用高级优化函数时,要求输入的参数 θ \theta θ是向量。因此需要将矩阵转化为向量。

吴恩达机器学习笔记(八)神经网络的反向传播算法_第7张图片

在octave中,把矩阵转化为向量的代码如下:
吴恩达机器学习笔记(八)神经网络的反向传播算法_第8张图片
学习过程:
吴恩达机器学习笔记(八)神经网络的反向传播算法_第9张图片

五、梯度检测(Gradient Checking)

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。

为了避免这样的问题,我们采取一种叫做梯度检测方法(Numerical Gradient Checking)方法。主要思想:先选取离测试点很近的2个点(吴恩达教授建议 1 0 − 4 10^{-4} 104两级),计算这两点间的斜率,用这个斜率来估计测试点的导数。与反向传播算法求出的导数进行对比,如果很接近则认为梯度下降法是正常工作的,如果相差很多说明算法没有正常工作。

吴恩达机器学习笔记(八)神经网络的反向传播算法_第10张图片

神经网络中的梯度检测:
吴恩达机器学习笔记(八)神经网络的反向传播算法_第11张图片

在Octave中的实现:
吴恩达机器学习笔记(八)神经网络的反向传播算法_第12张图片

注意:梯度检测的运行比反向传播算法还要慢的多,因此在已经通过梯度检测验证了反向传播的正确性后,一定要关闭梯度检测。再使用反向传播进行学习。
吴恩达机器学习笔记(八)神经网络的反向传播算法_第13张图片

六、随机初始化(Random Initialization)

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。

我们通常将参数初始化为 ( − ε , ε ) (-\varepsilon,\varepsilon) (εε)之间的随机值。然后再使用反性传播算法等训练模型。

七、总结(Conclusion)

小结一下使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。

训练神经网络的步骤:

  1. 参数的随机初始化,通常初始化成接近于0的较小的值。
  2. 利用正向传播方法计算所有的
  3. 编写计算代价函数 的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数
吴恩达机器学习笔记(八)神经网络的反向传播算法_第14张图片 吴恩达机器学习笔记(八)神经网络的反向传播算法_第15张图片

注意:神经网络的损失函数不是凸函数,这意味着有可能陷入局部最优解。但在实际中,这不是一个很严重的问题,梯度下降法和其他高级优化算法的表现都不太差,即使陷入一个局部最优解,也是一个值很小的局部最优解。

八、自动驾驶案例(Autonomous Driving Example)

讲述了一个神经网络应用到自动驾驶的一个案例。

首先让人类司机开车,每两秒采集一次前方道路的图片和司机选择的行驶转向,对网络进行训练。然后应用到自动驾驶,每两秒采集一次前方道路的图片,神经网络来输出车的行驶转向。选择置信度最高的输出,作为车的最终行驶方向。

你可能感兴趣的:(机器学习笔记)