当前位置:   article > 正文

神经网络之反向传播_人工神经网络模型中的反向传播误差原理

人工神经网络模型中的反向传播误差原理

神经网络的代价函数

        神经网络中采用了与逻辑回归类似的代价函数,逻辑回归的代价函数如下图所示:

        而神经网络中因为加入了隐藏层,不再只有一个逻辑单元,而是有k个,所以代价函数也发生了变化:

        这里的k表示输出单元的个数,加号后面的式子即我们在逻辑回归中添加的正则化项,对象是每一层的权重矩阵,同样的,对于每一层中的偏置项不做正则化处理。为了使这个式子最小化,我们要使用梯度下降法或其他优化算法,多次计算J(\theta) 的偏导数项,而这个偏导数项可以使用反向传播算法来计算。


反向传播算法

        反向传播算法,其实质就是要对神经网络中的每个结点计算一个值:\delta_{j}^{(l)} ,与前向传播中的a_{j}^{(l)} 类似,这个值表示第L 层第j 个结点的误差。以下面这个四层神经网络为例:

        对于第四层输出单元,其误差的计算方法为:\delta_{j}^{(4)}=a_{j}^{(4)}-y_{j} ,即用预测的结果减去真实结果。如果从整层的角度来看,这个式子可以转换为向量运算:\delta^{(4)}=a^{(4)}-y 。现在我们得到了\delta^{(4)} ,就可以用它来计算出\delta^{(3)}\delta^{(2)} 。其计算方法为:                    δ(3)=(θ(3))Tδ(4).g(z(3))

        δ(2)=(θ(2))Tδ(3).g(z(2))

        输入层不用进行反向传播计算,输入层本身就是准确的值,我们不需要改变这些值。反向传播这个算法源自于我们从输出层开始计算得到\delta^{(4)},用向后推导出其他各层的误差值\delta^{(3)} 和\delta^{(2)}。就像是第四层的误差传播到了第三层,然后又传播到了第二层上。

        在最小化代价函数过程中所要计算的那些偏导数项,可以通过反向传播算法计算得到,其计算过程大致如下:

        假设某个神经网络有L 层,训练集中有m个样本,设置\bigtriangleup _{ij}^{(l)}=0 (for all i,j,l),这个三角形符号是δ的大写形式。然后遍历每个样本,做如下操作:

        1、对于遍历到的第i 个样本,设置a^{(1)}=x^{(i)} 

        2、运用正向传播,计算得出所有层的激活项a^{(l)},这里的a^{(l)}是一个向量。

        3、使用样本的y值,计算出输出层的误差项:\delta^{(L)}=a^{(L)}-y^{(i)}

        4、运用反向传播,计算出除输入层外所有层的误差项\delta^{(L-1)}\delta^{(L-2)}、......、\delta^{(2)}

        5、计算\bigtriangleup _{ij}^{(l)}:=\bigtriangleup _{ij}^{(l)}+a_{j}^{(l)}\delta_{i}^{(l+1)}

        6、计算D_{ij}^{(l)}:=\frac{1}{m}\bigtriangleup _{ij}^{(l)}+\lambda \theta_{ij}^{(l)}(j\neq 0) 和 D_{ij}^{(l)}:=\frac{1}{m}\bigtriangleup _{ij}^{(l)}(j=0)

        7、最后,\frac{\partial }{\partial \theta_{ij}^{(l)}}J(\theta)=D_{ij}^{(l)}。然后就可以使用梯度下降等优化算法来寻找最后的参数θ了。

        直观地看,反向传播是在计算每个单元的误差项\delta_{j}^{(l)}。但实际上,\delta_{j}^{(l)}是代价函数关于z_{j}^{(l)}的偏导数。而代价函数可以看作是一个样本观测值y^{(i)} 和预测结果h_{\theta}(x^{(i)}) 的函数,所以当我们改变了神经网络中的z_{j}^{(l)},那么h_{\theta}(x^{(i)}) 和代价函数都会随着改变。所以误差项\delta_{j}^{(l)}所衡量的就是,为了影响这些中间项z_{j}^{(l)},我们需要改变神经网络权重的程度。


梯度检验

        假设代价函数为J(\theta) ,函数在一点θ出的导数值就是函数在该点处切线的斜率。我们在点θ附近再寻找两个点\theta-\varepsilon\theta+\varepsilon,函数在这两点处函数值的连线斜率也可以近似认为是θ点出切线的斜率。如下图所示:

        所以函数在点θ出的导数值可以近似认为是:\frac{\mathrm{d} }{\mathrm{d} \theta}J(\theta)\approx \frac{J(\theta+\varepsilon )-J(\theta-\varepsilon )}{2\varepsilon }。当\varepsilon 足够小时,该近似值就可以代替真正的导数值,但如果\varepsilon 太小的话,可能在计算机的计算过程中发生一些数值错误,所以\varepsilon一般设置为10^{-4}左右即可。

        如果θ是一个向量的话,同样可以套用上面的原理进行导数的估计:

        接下来我们使用上述式子得到的结果,与使用反向传播算法计算得到的导数值D相比较,如果二者相等或者非常接近,那么我们就可以确定反向传播的实现是正确的。确认正确后,往后不再进行梯度检测。


 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/999086
推荐阅读
相关标签
  

闽ICP备14008679号