吴恩达机器学习笔记六_神经网络的反向传播

回顾

上一章说到,神经网络是一种很有效的多元分类器。那么神经网络是如何起作用的呢?

由之前的图片我们可以看到,神经网络从左向右,一层一层地向右传播,这种传播方式我们叫做“前向传播”。前向传播是根据上一层的节点值和权值来更新本层节点值的方式。这里,我们再复习一下前向传播的具体算法。

前向传播算法

上面的图片中,把第一层即输入层的节点用\(a_1\)代替,第一层到第二层的连线,即权重以\(\theta_1\)代替,那么我们可以得到第二层节点的值:

\[a_2 = g(z_2) = g(a_1 * theta_1') \]

这里涉及到矩阵运算。其中\(theta_1\)是一个\((size_2 * size_1)\)维的矩阵,而\(a_1\)是一个\((m * size_1)\)维的矩阵,而函数\(g(x)\)是sigmoid函数或者任意其他函数。sigmoid函数的形式如下:

\[g(z) = \frac{1}{1+e^{-z}} \]

那么可以得到\(a_2\)是一个\((m * size_2)\)维矩阵。同理,我们可以推出\(theta_2\)的维度。

需要注意的是,除了输出层,输入层和隐藏层都多加了一个偏置节点。这个节点所对应的权值,不应该计入之后的代价计算和梯度计算中。

代价函数

代价函数最明显的作用,应该是在迭代的过程中观察是否有收敛的趋势。如果上面提到的函数是sigmoid函数,那么代价函数的计算如下图:

这里代价函数的计算,和之前对率回归的形式是一样的(两者都使用了sigmoid函数)。注意,偏置节点对应的权重不能带入计算

反向传播

为什么要用反向传播算法?其实还是梯度下降的思路,如下:

从右向左计算每一层的权值偏导,这里的计算与对率回归的类似,但还是有一些区别。以上图为例,反向传播的计算式如下:

\[g'(z) = g(z) * (1 - g(z)) \]

\[\delta_4 = a_4 - y \]

\[\delta_j = (\theta_j)'*\delta_{j+1} * g(z_j), 2 <= j < 4 \]

梯度检测

NG提到,在神经网络的实际编程过程中,会有一些很难发现的bug,即算法表面上还是收敛的,但是最终却得不到正确的结果。这时候可以用梯度检测的方法,对比每一次梯度下降的结果,观察算法是否正确,如下:

可以看出,梯度检测其实就是求代价函数的偏导。事实上,梯度下降也是从导数中推出来的,所以正常来讲,我们可以模拟求偏导来模拟梯度下降的结果。如果算法代码是正确的,那么两种方法的结果应该非常相似。这就是梯度检测的实质。

随机初始化

随机初始化是对权值参数\(\theta\)的随机化。它的必要性在于,参数越随机,那么算法运行的过程越顺利;相反地,如果参数都是一样的,最后算法的整体是无法收敛。下面是随机化的方法:

下面那行小字中,提到随机误差的方法:

\[e_{init} = \frac{\sqrt{6}}{\sqrt{L_{in}} + \sqrt{L_{out}}} \]

随机化权值的算式为:

\[W = rand(L_{out}, 1 + L_{in}) * 2 * e_{init} - e_{init} \]

神经网络训练流程

神经网络训练流程为:

  1. 随机初始化权值;
  2. 执行前向传播算法;
  3. 计算代价函数;
  4. 执行反向传播算法,计算代价函数的偏导\(\frac{\alpha}{\alpha\theta_{jk}^{(i)}}J(\theta)\)
posted @ 2018-11-25 23:04  Wunsam_Chan  阅读(880)  评论(0编辑  收藏  举报