上一周咱们学习了 神经网络 | 多分类问题。咱们分别使用 逻辑回归 和 神经网络 来解决多分类问题,并了解到在特征数很是多的状况下,神经网络是更为有效的方法。这周的课程会给出训练 神经网络 所使用的 代价函数,并使用 反向传播 算法来计算梯度。笔者会给出 反向传播 算法中重要的思路和推导,但不会包含全部的计算步骤。git
点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程做业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看( 没法访问 Github 的话能够点击 Coding 查看 ),代码中的错误和改进欢迎你们指出。github
如下是 Ng 机器学习课程第四周的笔记。算法
假设咱们的多分类问题有 个分类,神经网络共有
层,每一层的神经元个数为
,那么神经网络的 代价函数 为:网络
其中的第二项为 正则化 项,是网络中全部权值的平方和。第一项与逻辑回归中的 代价函数 相似,但这里咱们须要累加全部输出神经元的偏差。app
为了可以使用 梯度降低 算法来训练网络,咱们须要计算代价函数的梯度。一种很直观的方法就是使用数值计算,对于某个 ,给它加上减去一个很小的量
来计算梯度:机器学习
但稍微分析一下算法的复杂度就能知道,这样的方法十分缓慢。对于每一组数据,咱们须要计算全部权值的梯度,**总的计算次数 = 训练数据个数 x 网络权值个数 x 前向传播计算次数 **。在一般状况下这样的复杂度是没法接受的,因此咱们仅使用这个方法来验证 反向传播 算法计算的梯度是否正确。ide
为了可以理解以后对于 反向传播 公式的推导,咱们首先要了解一个关于多元复合函数求导的 链式法则。对于多元函数 ,其中
,
,那么:函数
链式法则 告诉咱们有多个层次的多元复合函数,下一层次的导数能够由上一层次推得。学习
简化为了只与上一层相关,利用上一层计算完成的结果 和
而不用从头算起:.net
通常的,对于函数 ,若是它能看作
的函数,而
为
的函数,则:
神经网络就是一个层次不少的多元函数,咱们能够隐约从 链式法则 中感受到反向传播的意味。
为了施展 反向传播 的魔法,咱们首要要引入一个中间变量 ,定义为:
其中 为第几层,
表示第
层的第几个神经元,
为上次课程提到的中间变量( 为了让式子看上去更清晰,反向传播 中的公式上标不使用括号 )。
被称为第
层第
个神经元的偏差。反向传播 就是先计算每一层每一个神经元的偏差,而后经过偏差来获得梯度的。
首先来看输出层的偏差:
对它使用 链式法则 获得:
而只有当 时,右边部分才不为
,因此:
对于其它层的偏差:
使用 链式法则:
而其中:
求偏导得:
因此:
最后一样使用 链式法则 来计算:
因为:
只有当 ,
时留下一项:
有了 (1) (2) (3) 式,就能够来完成 反向传播 算法了( 须要注意的是刚才所推导的式子都是针对一组训练数据而言的 )。
- 对于全部的
初始化
- 对于
组训练数据,
从
取到
:
- 令
- 前向传播,计算各层激活向量
- 使用 (1) 式,计算输出层偏差
- 使用 (2) 式,计算其它层偏差
- 使用 (3) 式,累加
,
- 计算梯度矩阵:
![]()
- 更新权值
最后提一下权值的初始化。对于神经网络,不能像以前那样使用相同的 0 值来初始化,这会致使每层的 逻辑单元 都相同。所以咱们使用随机化的初始化方法,使得 。
So~,这周学完了 神经网络 和它的学习算法,你们有没有以为很神奇呢?