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


    回顾

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

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

    前向传播算法

    上面的图片中,把第一层即输入层的节点用(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))
  • 相关阅读:
    网络流24题 餐巾计划(DCOJ8008)
    网络流24题 负载平衡(DCOJ8013)
    tyvj1982 武器分配
    bzoj1877 晨跑
    bzoj1834 网络扩容
    草地排水 改了又改(DCOJ6013)
    codevs1033 蚯蚓的游戏问题
    codevs1227 方格取数2
    bzoj1412 狼和羊的故事
    codevs1839 洞穴勘测
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10018033.html
Copyright © 2020-2023  润新知