吴恩达机器学习笔记六_神经网络的反向传播
回顾
上一章说到,神经网络是一种很有效的多元分类器。那么神经网络是如何起作用的呢?
由之前的图片我们可以看到,神经网络从左向右,一层一层地向右传播,这种传播方式我们叫做“前向传播”。前向传播是根据上一层的节点值和权值来更新本层节点值的方式。这里,我们再复习一下前向传播的具体算法。
前向传播算法
上面的图片中,把第一层即输入层的节点用\(a_1\)代替,第一层到第二层的连线,即权重以\(\theta_1\)代替,那么我们可以得到第二层节点的值:
这里涉及到矩阵运算。其中\(theta_1\)是一个\((size_2 * size_1)\)维的矩阵,而\(a_1\)是一个\((m * size_1)\)维的矩阵,而函数\(g(x)\)是sigmoid函数或者任意其他函数。sigmoid函数的形式如下:
那么可以得到\(a_2\)是一个\((m * size_2)\)维矩阵。同理,我们可以推出\(theta_2\)的维度。
需要注意的是,除了输出层,输入层和隐藏层都多加了一个偏置节点。这个节点所对应的权值,不应该计入之后的代价计算和梯度计算中。
代价函数
代价函数最明显的作用,应该是在迭代的过程中观察是否有收敛的趋势。如果上面提到的函数是sigmoid函数,那么代价函数的计算如下图:
这里代价函数的计算,和之前对率回归的形式是一样的(两者都使用了sigmoid函数)。注意,偏置节点对应的权重不能带入计算。
反向传播
为什么要用反向传播算法?其实还是梯度下降的思路,如下:
从右向左计算每一层的权值偏导,这里的计算与对率回归的类似,但还是有一些区别。以上图为例,反向传播的计算式如下:
梯度检测
NG提到,在神经网络的实际编程过程中,会有一些很难发现的bug,即算法表面上还是收敛的,但是最终却得不到正确的结果。这时候可以用梯度检测的方法,对比每一次梯度下降的结果,观察算法是否正确,如下:
可以看出,梯度检测其实就是求代价函数的偏导。事实上,梯度下降也是从导数中推出来的,所以正常来讲,我们可以模拟求偏导来模拟梯度下降的结果。如果算法代码是正确的,那么两种方法的结果应该非常相似。这就是梯度检测的实质。
随机初始化
随机初始化是对权值参数\(\theta\)的随机化。它的必要性在于,参数越随机,那么算法运行的过程越顺利;相反地,如果参数都是一样的,最后算法的整体是无法收敛。下面是随机化的方法:
下面那行小字中,提到随机误差的方法:
随机化权值的算式为:
神经网络训练流程
神经网络训练流程为:
- 随机初始化权值;
- 执行前向传播算法;
- 计算代价函数;
- 执行反向传播算法,计算代价函数的偏导\(\frac{\alpha}{\alpha\theta_{jk}^{(i)}}J(\theta)\)。