上一周我们学习了 神经网络 | 多分类问题。我们分别使用 逻辑回归 和 神经网络 来解决多分类问题,并了解到在特征数非常多的情况下,神经网络是更为有效的方法。这周的课程会给出训练 神经网络 所使用的 代价函数,并使用 反向传播 算法来计算梯度。笔者会给出 反向传播 算法中重要的思路和推导,但不会包含所有的计算步骤。
点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程作业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看( 无法访问 Github 的话可以点击 Coding 查看 ),代码中的错误和改进欢迎大家指出。
以下是 Ng 机器学习课程第四周的笔记。
假设我们的多分类问题有 个分类,神经网络共有 层,每一层的神经元个数为 ,那么神经网络的 代价函数 为:
其中的第二项为 正则化 项,是网络中所有权值的平方和。第一项与逻辑回归中的 代价函数 类似,但这里我们需要累加所有输出神经元的误差。
为了能够使用 梯度下降 算法来训练网络,我们需要计算代价函数的梯度。一种很直观的方法就是使用数值计算,对于某个 ,给它加上减去一个很小的量 来计算梯度:
但稍微分析一下算法的复杂度就能知道,这样的方法十分缓慢。对于每一组数据,我们需要计算所有权值的梯度,总的计算次数 = 训练数据个数 x 网络权值个数 x 前向传播计算次数 。在通常情况下这样的复杂度是无法接受的,所以我们仅使用这个方法来验证 反向传播 算法计算的梯度是否正确。
为了能够理解之后对于 反向传播 公式的推导,我们首先要了解一个关于多元复合函数求导的 链式法则。对于多元函数 ,其中 , ,那么:
链式法则 告诉我们有多个层次的多元复合函数,下一层次的导数可以由上一层次推得。
上图中笔者有意多加了一层,这里
是
的函数,
是
的函数,
是
的函数。对于要计算的
与
,上式仍成立,原因是我们可以把
看作
的函数。这相当于我们把:
简化为了只与上一层相关,利用上一层计算完成的结果
和
而不用从头算起:
一般的,对于函数 ,如果它能看做 的函数,而 为 的函数,则: