上一章说到,神经网络是一种很有效的多元分类器。那么神经网络是如何起作用的呢?
由之前的图片我们可以看到,神经网络从左向右,一层一层地向右传播,这种传播方式我们叫做“前向传播”。前向传播是根据上一层的节点值和权值来更新本层节点值的方式。这里,我们再复习一下前向传播的具体算法。
上面的图片中,把第一层即输入层的节点用\(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} \]
神经网络训练流程为:
原文:https://www.cnblogs.com/ChanWunsam/p/10018033.html