深度学习基础2--神经网络参数的反向传播算法

1 代价函数

  假设神经网络的训练样本有m个,每一个包含一组输入x和一组输出信号y,L表示神经网络层数,S_I表示每层的neuron个数(S_l表示输出层神经元个数),S_L表明最后一层中处理单元的个数。  html

  将神经网络的分类定义为两种状况:二类分类和多类分类,git

  二类分类:表示哪一类;github

  K类分类:表示分到第i类;k>2算法

   咱们回顾逻辑回归问题中咱们的代价函数为:编程

 

  在逻辑回归中,咱们只有一个输出变量,又称标量(scalar),也只有一个因变量y,可是在神经网络中,咱们能够有不少输出变量,咱们的是一个维度为K的向量,而且咱们训练集中的因变量也是一样维度的一个向量,所以咱们的代价函数会比逻辑回归更加复杂一些,为:安全

  这个看起来复杂不少的代价函数背后的思想仍是同样的,咱们但愿经过代价函数来观察算法预测的结果与真实状况的偏差有多大,惟一不一样的是,对于每一行特征,咱们都会给出K​个预测,基本上咱们能够利用循环,对每一行特征都预测K​个不一样结果,而后在利用循环在K​个预测中选择可能性最高的一个,将其与y​中的实际数据进行比较。markdown

  正则化的那一项只是排除了每一层后,每一层的矩阵的和。最里层的循环j循环全部的行(由 层的激活单元数决定),循环 i 则循环全部的列,由该层(层)的激活单元数所决定。即: 与真实值之间的距离为每一个样本-每一个类输出的加和,对参数进行regularization的bias项处理全部参数的平方和。网络

2 反向传播算法

  以前咱们在计算神经网络预测结果的时候咱们采用了一种正向传播方法,咱们从第一层开始正向一层一层进行计算,直到最后一层的机器学习

  如今,为了计算代价函数的偏导数,咱们须要采用一种反向传播算法,也就是首先计算最后一层的偏差,而后再一层一层反向求出各层的偏差,直到倒数第二层。 以一个例子来讲明反向传播算法。函数

  假设咱们的训练集只有一个样本,咱们的神经网络是一个四层的神经网络,其中K=4,S_L=4,L=4:

  前向传播算法:

  下面的公式推导过程见:https://blog.csdn.net/qq_29762941/article/details/80343185

  咱们从最后一层的偏差开始计算,偏差是激活单元的预测()与实际值()之间的偏差,()。 咱们用来表示偏差,则: 咱们利用这个偏差值来计算前一层的偏差: 其中 是 S 形函数的导数,。而则是权重致使的偏差的和。下一步是继续计算第二层的偏差:  由于第一层是输入变量,不存在偏差。咱们有了全部的偏差的表达式后,即可以计算代价函数的偏导数了,假设,即咱们不作任何正则化处理时有:

  重要的是清楚地知道上面式子中上下标的含义:

    l 表明目前所计算的是第几层。

 

  j 表明目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。

 

  i 表明下一层中偏差单元的下标,是受到权重矩阵中第i行影响的下一层中的偏差单元的下标。

 

  若是咱们考虑正则化处理,而且咱们的训练集是一个特征矩阵而非向量。在上面的特殊状况中,咱们须要计算每一层的偏差单元来计算代价函数的偏导数。在更为通常的状况中,咱们一样须要计算每一层的偏差单元,可是咱们须要为整个训练集计算偏差单元,此时的偏差单元也是一个矩阵,咱们用来表示这个偏差矩阵。第 l 层的第 i 个激活单元受到第 j 个参数影响而致使的偏差。

  咱们的算法表示为:

  即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的偏差,而后利用该偏差运用反向传播法计算出直至第二层的全部偏差。

  在求出了以后,咱们即可以计算代价函数的偏导数了,计算方法以下: 

 

  在Octave 中,若是咱们要使用 fminuc这样的优化算法来求解求出权重矩阵,咱们须要将矩阵首先展开成为向量,在利用算法求出最优解后再从新转换回矩阵。

  假设咱们有三个权重矩阵,Theta1,Theta2 和 Theta3,尺寸分别为 10*11,10*11 和1*11, 下面的代码能够实现这样的转换:

3 理解反向传播

  在上一段视频中,咱们介绍了反向传播算法,对不少人来讲,当第一次看到这种算法时,第一印象一般是,这个算法须要那么多繁杂的步骤,简直是太复杂了,实在不知道这些步骤,到底应该如何合在一块儿使用。就好像一个黑箱,里面充满了复杂的步骤。若是你对反向传播算法也有这种感觉的话,这实际上是正常的,相比于线性回归算法和逻辑回归算法而言,从数学的角度上讲,反向传播算法彷佛并不简洁,对于反向传播这种算法,其实我已经使用了不少年了,但即使如此,即便是如今,我也常常感受本身对反向传播算法的理解并非十分深刻,对于反向传播算法到底是如何执行的,并无一个很直观的理解。作过编程练习的同窗应该能够感觉到这些练习或多或少能帮助你,将这些复杂的步骤梳理了一遍,巩固了反向传播算法具体是如何实现的,这样你才能本身掌握这种算法。

  在这段视频中,我想更加深刻地讨论一下反向传播算法的这些复杂的步骤,而且但愿给你一个更加全面直观的感觉,理解这些步骤到底是在作什么,也但愿经过这段视频,你能理解,它至少仍是一个合理的算法。但可能你即便看了这段视频,你仍是以为反向传播依然很复杂,依然像一个黑箱,太多复杂的步骤,依然感到有点神奇,这也是不要紧的。即便是我接触反向传播这么多年了,有时候仍然以为这是一个难以理解的算法,但仍是但愿这段视频能有些许帮助,为了更好地理解反向传播算法,咱们再来仔细研究一下前向传播的原理:

  前向传播算法:

  反向传播算法作的是:

  感悟:上图中的 理解以下:

   至关因而第 l 层的第 j单元中获得的激活项的“偏差”,即”正确“的  与计算获得的  的差。

  而  ,(g为sigmoid函数)。咱们能够想象  为函数求导时迈出的那一丁点微分,因此更准确的说 

 

4 使用注意:展开参数

  在上一段视频中,咱们谈到了怎样使用反向传播算法计算代价函数的导数。在这段视频中,我想快速地向你介绍一个细节的实现过程,怎样把你的参数从矩阵展开成向量,以便咱们在高级最优化步骤中的使用须要。

5 梯度检测

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

  为了不这样的问题,咱们采起一种叫作梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是经过估计梯度值来检验咱们计算的导数值是否真的是咱们要求的。

  对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个很是近的点而后计算两个点的平均值用以估计梯度。即对于某个特定的 ,咱们计算出在  处和  的代价值(是一个很是小的值,一般选取 0.001),而后求两个代价的平均,用以估计在  处的代价值。

  是一个向量时,咱们则须要对偏导数进行检验。由于代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对进行检验的示例: 

  最后咱们还须要对经过反向传播方法计算出的偏导数进行检验。

  根据上面的算法,计算出的偏导数存储在矩阵中。检验时,咱们要将该矩阵展开成为向量,同时咱们也将  矩阵展开为向量,咱们针对每个 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同  进行比较。

 

6 随机初始化

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

  咱们一般初始参数为正负ε之间的随机值,假设咱们要随机初始一个尺寸为10×11的参数矩阵,代码以下:

7 组合到一块儿

  小结一下使用神经网络时的步骤:

  网络结构:第一件要作的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。

  第一层的单元数即咱们训练集的特征数量。

  最后一层的单元数是咱们训练集的结果的类的数量。

  若是隐藏层数大于1,确保每一个隐藏层的单元个数相同,一般状况下隐藏层单元的个数越多越好。

  咱们真正要决定的是隐藏层的层数和每一个中间层的单元数。

  训练神经网络:

    1. 参数的随机初始化

    2. 利用正向传播方法计算全部的$h_{\theta}(x)$

    3. 编写计算代价函数 $J$ 的代码

    4. 利用反向传播方法计算全部偏导数

    5. 利用数值检验方法检验这些偏导数

    6. 使用优化算法来最小化代价函数

8 无人驾驶

  在这段视频中,我想向你介绍一个具备历史意义的神经网络学习的重要例子。那就是使用神经网络来实现自动驾驶,也就是说使汽车经过学习来本身驾驶。接下来我将演示的这段视频是我从 Dean Pomerleau那里拿到的,他是个人同事,任职于美国东海岸的卡耐基梅隆大学。在这部分视频中,你就会明白可视化技术究竟是什么?在看这段视频以前,我会告诉你可视化技术是什么。

  在下面也就是左下方,就是汽车所看到的前方的路况图像。

  在图中你依稀能看出一条道路,朝左延伸了一点,又向右了一点,而后上面的这幅图,你能够看到一条水平的菜单栏显示的是驾驶操做人选择的方向。就是这里的这条白亮的区段显示的就是人类驾驶者选择的方向。好比:最左边的区段,对应的操做就是向左急转,而最右端则对应向右急转的操做。所以,稍微靠左的区段,也就是中心稍微向左一点的位置,则表示在这一点上人类驾驶者的操做是慢慢的向左拐。

  这幅图的第二部分对应的就是学习算法选出的行驶方向。而且,相似的,这一条白亮的区段显示的就是神经网络在这里选择的行驶方向,是稍微的左转,而且实际上在神经网络开始学习以前,你会看到网络的输出是一条灰色的区段,就像这样的一条灰色区段覆盖着整个区域这些均称的灰色区域,显示出神经网络已经随机初始化了,而且初始化时,咱们并不知道汽车如何行驶,或者说咱们并不知道所选行驶方向。只有在学习算法运行了足够长的时间以后,才会有这条白色的区段出如今整条灰色区域之中。显示出一个具体的行驶方向这就表示神经网络算法,在这时候已经选出了一个明确的行驶方向,不像刚开始的时候,输出一段模糊的浅灰色区域,而是输出一条白亮的区段,表示已经选出了明确的行驶方向。

  ALVINN (Autonomous Land Vehicle In a Neural Network)是一个基于神经网络的智能系统,经过观察人类的驾驶来学习驾驶,ALVINN可以控制NavLab,装在一辆改装版军用悍马,这辆悍马装载了传感器、计算机和驱动器用来进行自动驾驶的导航试验。实现ALVINN功能的第一步,是对它进行训练,也就是训练一我的驾驶汽车。

  而后让ALVINN观看,ALVINN每两秒将前方的路况图生成一张数字化图片,而且记录驾驶者的驾驶方向,获得的训练集图片被压缩为30x32像素,而且做为输入提供给ALVINN的三层神经网络,经过使用反向传播学习算法,ALVINN会训练获得一个与人类驾驶员操纵方向基本相近的结果。一开始,咱们的网络选择出的方向是随机的,大约通过两分钟的训练后,咱们的神经网络便可以准确地模拟人类驾驶者的驾驶方向,对其余道路类型,也重复进行这个训练过程,当网络被训练完成后,操做者就可按下运行按钮,车辆便开始行驶了。

  每秒钟ALVINN生成12次数字化图片,而且将图像传送给神经网络进行训练,多个神经网络同时工做,每个网络都生成一个行驶方向,以及一个预测自信度的参数,预测自信度最高的那个神经网络获得的行驶方向。好比这里,在这条单行道上训练出的网络将被最终用于控制车辆方向,车辆前方忽然出现了一个交叉十字路口,当车辆到达这个十字路口时,咱们单行道网络对应的自信度骤减,当它穿过这个十字路口时,前方的双车道将进入其视线,双车道网络的自信度便开始上升,当它的自信度上升时,双车道的网络,将被选择来控制行驶方向,车辆将被安全地引导进入双车道路。

  这就是基于神经网络的自动驾驶技术。固然,咱们还有不少更加先进的试验来实现自动驾驶技术。在美国,欧洲等一些国家和地区,他们提供了一些比这个方法更加稳定的驾驶控制技术。但我认为,使用这样一个简单的基于反向传播的神经网络,训练出如此强大的自动驾驶汽车,的确是一次使人惊讶的成就。

参考:

[1] 吴恩达机器学习课程:https://study.163.com/course/courseMain.htm?courseId=1004570029

[2] https://www.cnblogs.com/sl0309/category/1382582.html

[3] https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/master/markdown/week4.md

相关文章
相关标签/搜索