首先引入一些便于稍后讨论的新标记方法: html
假设神经网络的训练样本有𝑚个,每一个包含一组输入𝑥和一组输出信号𝑦,𝐿表示神经网络层数,𝑆𝑙表示输出层神经元个数,𝑆𝐿表明最后一层中处理单元的个数。算法
在逻辑回归中,代价函数为:安全
在逻辑回归中,咱们只有一个输出变量,也只有一个因变量𝑦,可是在神经网络中,咱们能够有不少输出变量,咱们的ℎ𝜃(𝑥)是一个维度为𝐾的向量,而且咱们训练集中的因变量也是一样维度的一个向量,所以咱们的代价函数会比逻辑回归更加复杂一些,为: ℎ𝜃(𝑥) ∈ ℝ𝐾 ,( ℎ𝜃(𝑥) )𝑖= 𝑖𝑡ℎoutput微信
这个看起来复杂不少的代价函数背后的思想仍是同样的,咱们但愿经过代价函数来观察算法预测的结果与真实状况的偏差有多大。惟一不一样的是,对于每一行特征,咱们都会给出𝐾个预测。网络
步骤以下:机器学习
(1)利用循环,对每一行特征都预测𝐾个不一样结果函数
(2)利用循环在𝐾个预测中选择可能性(为某个结果的几率值)最大的一个,将其与𝑦中的实际数据进行比较。学习
正则化的那一项只是排除了每一层 𝜃0 后,每一层的 𝜃 矩阵的和。最里层的循环 𝑗 循环全部的行(𝑠𝑙 +1 个),循环 𝑖 则循环全部的列,由该层(𝑠𝑙 个)的激活单元数所决定。ps:j 表明第 j 层,i 表明该层的第 i 个激活单元 优化
通俗理解就是,先把每一行的每一个𝜃加起来求和,原矩阵变成了一列, 而后再把这一列中的每一个数加起来,而后再把不一样层的𝜃加起来。spa
为了计算代价函数的偏导数,咱们须要采用反向传播的算法,即先计算最后一层的偏差,而后一层一层反向求出各层的偏差,直到倒数第二层。
举个例子,以下图所示的神经网络中:
(1)计算最后一层(layer 4)的偏差:
该层偏差是激活单元的预测 ak(4) 与实际值 yk 之间的差值,记为: 𝛿(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,即咱们不作任何正则化处理时有:
重要的是清楚地知道上面式子中上下标的含义:
𝑙 表明目前所计算的是第几层。
𝑗 表明目前计算层中的激活单元的下标,也将是下一层的第𝑗个输入变量的下标。
𝑖 表明下一层中偏差单元的下标,是受到权重矩阵中第𝑖行影响的下一层中的偏差单元的下标。
若是咱们考虑正则化处理,而且咱们的训练集是一个特征矩阵而非向量。在上面的特殊状况中,咱们须要计算每一层的偏差单元来计算代价函数的偏导数。在更为通常的状况中,咱们一样须要计算每一层的偏差单元,可是咱们须要为整个训练集计算偏差单元,此时的偏差单元也是一个矩阵,咱们用𝛥𝑖𝑗(𝑙)表示这个偏差矩阵。第 𝑙 层的第 𝑖 个激活单元受到第 𝑗个参数影响而致使的偏差。
咱们的算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的偏差,而后利用该偏差运用反向传播法计算出直至第二层的全部偏差。在求出了𝛥𝑖𝑗(𝑙)以后,咱们即可以计算代价函数的偏导数了,计算方法以下:
在使用一些高级优化算法时,咱们通常须要将参数从矩阵形式展开成向量。
矩阵转换成向量以及向量转换成矩阵:
步骤以下:
当咱们对一个较为复杂的模型(例如神经网络)使用梯度降低算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减少,但最终的结果可能并非最优解。为了不这样的问题,咱们采起一种叫作梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是经过估计梯度值来检验咱们计算的导数值是否真的是咱们要求的。
梯度检验方法的步骤以下:
(1)当 𝜃 是一个实数时:
沿着切线的方向选择离两个很是近的点,而后计算两个点的平均值用以估计梯度。即对于某个特定的 𝜃,咱们计算出在 𝜃-𝜀 处和 𝜃+𝜀 的代价值(𝜀是一个很是小的值,一般选取 0.001),而后求两个代价的平均,用以估计在 𝜃 处的代价值。
公式为:gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
当𝜃是一个向量时:
(2)经过反向传播方法计算出偏导数,将这些偏导数存储在矩阵 𝐷𝑖𝑗(𝑙) 中
(3)将计算出来的斜率和偏导数进行对比,具体实现以下:
最后,检查一下 gradApprox 和 DVec 的值是否近似相等。
随机初始化的方法有不少,并且各有其特色,在这里介绍一下比较简单的随机初始化方法,在以后的内容中(涉及到梯度消失和梯度爆炸,再去介绍其余的初始化方法)
(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之间的随机数 :
小结一下使用神经网络时的步骤:
(1)肯定网络结构:即多少层、每层多少个单元
第一层的单元数即咱们训练集的特征数量,最后一层的单元数是咱们训练集的结果的类的数量,真正须要决定的是隐含层的层数和每层的单元数。
(2)训练神经网络
① 参数随机初始化
② 利用正向传播方法计算全部的ℎ𝜃(𝑥)
③ 编写计算代价函数 𝐽 的代码
④ 利用反向传播方法计算全部偏导数
⑤ 利用数值检验方法检验这些偏导数
⑥ 使用优化算法来最小化代价函数
在这一部份内容中,介绍了一个具备历史意义的神经网络学习的重要例子。那就是使用神经网络来实现自动驾驶。
ALVINN (Autonomous Land Vehicle In a Neural Network)是一个基于神经网络的智能系统,经过观察人类的驾驶来学习驾驶,ALVINN 可以控制NavLab,装在一辆改装版军用悍马,这辆悍马装载了传感器、计算机和驱动器用来进行自动驾驶的导航试验。实现ALVINN 功能的第一步,是对它进行训练,也就是训练一我的驾驶汽车。
而后让ALVINN 观看,ALVINN 每两秒将前方的路况图生成一张数字化图片,而且记录驾驶者的驾驶方向,获得的训练集图片被压缩为 30x32 像素,而且做为输入提供给 ALVINN 的三层神经网络,经过使用反向传播学习算法,ALVINN 会训练获得一个与人类驾驶员操纵方向基本相近的结果。一开始,咱们的网络选择出的方向是随机的,大约通过两分钟的训练后,咱们的神经网络便可以准确地模拟人类驾驶者的驾驶方向,对其余道路类型,也重复进行这个训练过程,当网络被训练完成后,操做者就可按下运行按钮,车辆便开始行驶了。
每秒钟 ALVINN 生成 12 次数字化图片,而且将图像传送给神经网络进行训练,多个神经网络同时工做,每个网络都生成一个行驶方向,以及一个预测自信度的参数,预测自信度最高的那个神经网络获得的行驶方向。好比这里,在这条单行道上训练出的网络将被最终用于控制车辆方向,车辆前方忽然出现了一个交叉十字路口,当车辆到达这个十字路口时,咱们单行道网络对应的自信度骤减,当它穿过这个十字路口时,前方的双车道将进入其视线,双车道网络的自信度便开始上升,当它的自信度上升时,双车道的网络,将被选择来控制行驶方向,车辆将被安全地引导进入双车道路。
以上,就是吴恩达机器学习课程第十章的主要内容。
【重要提示】:本人机器学习课程的主要学习资料包括:吴恩达教授的机器学习课程和黄广海博士的中文学习笔记。感谢吴恩达教授和黄广海博士的知识分享和无私奉献。做为机器学习小白,计划每周末记录一周以来的学习内容,总结回顾。但愿你们多多挑错,也愿个人学习笔记能帮助到有须要的人。