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

回顾

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

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

前向传播算法

上面的图片中,把第一层即输入层的节点用(a_1)代替,第一层到第二层的连线,即权重以( heta_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 = ( heta_j)'*delta_{j+1} * g(z_j), 2 <= j < 4 ]

梯度检测

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

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

随机初始化

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

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

[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 heta_{jk}^{(i)}}J( heta))
原文地址:https://www.cnblogs.com/ChanWunsam/p/10018033.html