吴恩达《机器学习》课程笔记——第十章:神经网络参数的反向传播算法

上一篇  ※※※※※※※※  【回到目录】  ※※※※※※※※  下一篇


10.1 代价函数

首先引入一些便于稍后讨论的新标记方法: 

假设神经网络的训练样本有?个,每个包含一组输入?和一组输出信号?,?表示神经网络层数,??表示输出层神经元个数,??代表最后一层中处理单元的个数。

在逻辑回归中,代价函数为:

在逻辑回归中,我们只有一个输出变量,也只有一个因变量?,但是在神经网络中,我们可以有很多输出变量,我们的ℎ?(?)是一个维度为?的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为: ℎ?(?) ∈ ℝ? ,( ℎ?(?) )?= ??ℎoutput

这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大。唯一不同的是,对于每一行特征,我们都会给出?个预测。

步骤如下:

(1)利用循环,对每一行特征都预测?个不同结果

(2)利用循环在?个预测中选择可能性(为某个结果的概率值)最大的一个,将其与?中的实际数据进行比较。

正则化的那一项只是排除了每一层 ?后,每一层的 ? 矩阵的和。最里层的循环 ? 循环所有的行(?? +1 个),循环 ? 则循环所有的列,由该层(?? 个)的激活单元数所决定。ps:j 代表第 j 层,i 代表该层的第 i 个激活单元 

通俗理解就是,先把每一行的每个?加起来求和,原矩阵变成了一列, 然后再把这一列中的每个数加起来,然后再把不同层的?加起来。


10.2 反向传播算法

为了计算代价函数的偏导数,我们需要采用反向传播的算法,即先计算最后一层的误差,然后一层一层反向求出各层的误差,直到倒数第二层。

举个例子,如下图所示的神经网络中:

(1)计算最后一层(layer 4)的误差:

该层误差是激活单元的预测 ak(4)  与实际值 y之间的差值,记为: ?(4) = ?(4) − ? 

(2)计算layer 3的误差

?(3) = (?(3))??(4) ∗ ?′(?(3)) ,其中?′(?(3))是 ? 形函数的导数,?′(?(3)) = ?(3) ∗ (1 − ?(3))。而(?(3))??(4)则是权重导致的误差的和。

推导过程(?是代价函数关于所计算出的中间项 z 的偏导数,它所衡量的是:为了影响这些中间值,我们所需要改变神经网络中的权重的程度):

(3)计算layer 2的误差

?(2) = (?(2))??(3) ∗ ?′(?(2)

(4)第一层是输入层,不存在误差

我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设? = 0,即我们不做任何正则化处理时有:

 

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

? 代表目前所计算的是第几层。 

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

? 代表下一层中误差单元的下标,是受到权重矩阵中第?行影响的下一层中的误差单元的下标。

如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用???(?)表示这个误差矩阵。第 ? 层的第 ? 个激活单元受到第 ?个参数影响而导致的误差。 

我们的算法表示为:

 

 即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。在求出了???(?)之后,我们便可以计算代价函数的偏导数了,计算方法如下:

 


10.3 反向传播算法的直观理解

 


10.4 使用注意:展开参数

在使用一些高级优化算法时,我们一般需要将参数从矩阵形式展开成向量。

矩阵转换成向量以及向量转换成矩阵:

步骤如下:


10.5 梯度检验

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

梯度检验方法的步骤如下:

(1)当 ? 是一个实数时:

沿着切线的方向选择离两个非常近的点,然后计算两个点的平均值用以估计梯度。即对于某个特定的 ?,我们计算出在 ?-? 处和 ?+? 的代价值(?是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 ? 处的代价值。

公式为:gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps) 

 

当?是一个向量时:

(2)通过反向传播方法计算出偏导数,将这些偏导数存储在矩阵 ???(?)  中

(3)将计算出来的斜率和偏导数进行对比,具体实现如下:

最后,检查一下 gradApprox 和 DVec 的值是否近似相等。


10.6 随机初始化

随机初始化的方法有很多,而且各有其特点,在这里介绍一下比较简单的随机初始化方法,在之后的内容中(涉及到梯度消失和梯度爆炸,再去介绍其他的初始化方法)

(1)对于逻辑回归,通常将参数初始化为0,如下:

initial_tneta = zeros(n,1)

(2)对于神经网络,初始化为0不可行

如果我们令所有的初始参数都为0,或者初始所有的参数都为一个非0的数,这将意味着我们第二层的所有激活单元都会有相同的值。所有的单元都相同,每一层都在计算同一特征,那么是无法进行非线性的拟合的。换句话说,本来我们希望不同的结点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的结点根本无法学到不同的特征!这样就失去了网络学习特征的意义了。

因此在神经网络中,需要采用随机初始化:

%输入层单元数:10,隐含层单元数:10,输出层单元数:1
initial_theta1 = rand(10,11)* (2*eps) – eps 
initial_theta2 = rand(1,11)* (2*eps) – eps 

即将参数初始化为正负eps之间的随机数 :

 


10.7 组合到一起

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

(1)确定网络结构:即多少层、每层多少个单元

第一层的单元数即我们训练集的特征数量,最后一层的单元数是我们训练集的结果的类的数量,真正需要决定的是隐含层的层数和每层的单元数。

(2)训练神经网络

①  参数随机初始化

②  利用正向传播方法计算所有的ℎ?(?) 

③  编写计算代价函数 ? 的代码 

④  利用反向传播方法计算所有偏导数

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

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


10.8 无人驾驶

在这一部分内容中,介绍了一个具有历史意义的神经网络学习的重要例子。那就是使用神经网络来实现自动驾驶。

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

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

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

 


 

 

如果这篇文章帮助到了你,或者你有任何问题,欢迎扫码关注微信公众号:一刻AI  在后台留言即可,让我们一起学习一起进步!

 

 

以上,就是吴恩达机器学习课程第十章的主要内容。

 

【重要提示】:本人机器学习课程的主要学习资料包括:吴恩达教授的机器学习课程和黄广海博士的中文学习笔记。感谢吴恩达教授和黄广海博士的知识分享和无私奉献。作为机器学习小白,计划每周末记录一周以来的学习内容,总结回顾。希望大家多多挑错,也愿我的学习笔记能帮助到有需要的人。

 

转载于:https://www.cnblogs.com/lky-learning/p/10745495.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值