继续是机器学习课程的笔记,这节课会继续介绍神经网络的内容,上一节主要是基本的介绍,以及模型表示,而本节会介绍代价函数,反向传播算法等。
神经网络代价函数
首先是有如下一个神经网络,这里将首先介绍一些标记符号的意思。
- L 代表一个神经网络中的层数
-
Sl 代表第l 层的处理单元(包括偏置单元)的个数 -
SL 代表最后一层中处理单元的个数 -
K 代表我们希望分类的类的个数,与
SL 相等所以上图显示的神经网络是一个4层,输出结果也是4个结果,也就是K=4,
SL=S4 。在逻辑回归归一化中,我们的代价函数如下所示:
J(θ)=−1m[∑i=1my(i)loghθ(x(i))+(1−y(i)log(1−hθ(x(i)))]+λ2m∑j=1nθ2j
这里我们只有一个输出变量,也称为标量(scalar),也就是一个因变量
但是在神经网络中,可以有很多输出变量,这里的
上述式子归一化那项中排除了每一层的
反向传播算法
在上一节中介绍了正向传播方法来计算神经网络的输出结果,现在需要计算代价函数的偏导数
下面以一个开头给出的4层神经网络来说明反向传播算法。
假设训练集只有一个实例
从最后一层的误差开始计算,误差
接着利用这个误差值计算前一层,也就是第三层的误差:
其中
下一步就是继续计算第二层的误差:
由于第一层是输入变量,不存在误差,我们有了所有的误差的表达式后,便可以计算代价函数的偏函数了,假设
如果考虑归一化处理,并且训练集是一个特征矩阵而非向量。在上述的特殊情况中,是需要计算每一层的误差单元来计算代价函数的偏导数。而在更为一般的情况中,同样需要计算每一层的误差单元,但是更需要为整个训练集计算误差单元,此时的误差单元就是一个矩阵。使用
算法如下所示:
即首先是用整向传播算法计算出每一层的激活单元,利用训练集的结果和神经网络预测的结果求出最后一层的误差,再利用该误差使用反向传播算法计算出直至第二层的所有误差。
求出了
梯度检验
当对一个比较复杂的模型,如神经网络,使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们将采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度估计采用的方法是在代价函数上沿着切线的方向选择两个非常近的点然后计算两个点的平均值用以估算梯度。也就是对于某个特定的
当
然后需要通过反向传播算法计算出的偏导数进行检验,当两者比较接近就说明运行正确。
这里有几点需要注意的:
- 在反向传播中计算出
J(θ) 对θ 的导数D,并组成向量 - 用梯度检验法计算大概的梯度
gradApprox=J(θ+ϵ)−J(θ−ϵ)2ϵ - 判断上述两者是否相同或者接近
- 最重要的一点是,当需要使用神经网络学习的时候,必须停止使用梯度检验,否则会使得学习速度非常慢
随机初始化
对于梯度下降算法和其他优化算法都是需要初始的参数。在之前逻辑回归中,对于
因此,我们通常初始参数为
小结
这里小结下使用神经网络时的步骤:
网络结构:
第一件事要做的是选择网络结构,即选择多少层以及决定每层分别有多少个单元。
- 第一次的激活单元数就是训练集的特征数量
- 最后一层的激活单元数是训练集的结果的类的数量
- 如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好
所以我们真正要决定的是隐藏层的层数以及其单元数。
训练神经网络
- 权重随机初始化
- 使用正向传播方法计算所有的
hθ(x) - 编写计算代价函数
J(θ) 的代码 - 使用反向传播算法计算所有的偏导数
- 使用梯度数值检验方法检验这些偏导数
- 使用梯度下降算法或其他优化算法来最小化代价函数