码迷,mamicode.com
首页 > 编程语言 > 详细

神经网络之后向传播算法

时间:2014-11-17 17:35:16      阅读:437      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   sp   java   for   strong   

本文结合维基百科http://en.wikipedia.org/wiki/Backpropagation的说明,对神经网络的后向传播算法做一个总结,并作简单的公式推导。

典型的只含有1个隐层的3层神经网络的后向传播算法流程如下:

initialize network weights (often small random values)
  do
     forEach training example ex
        prediction = neural-net-output(network, ex)  // forward pass
        actual = teacher-output(ex)
        compute error (prediction - actual) at the output units
        compute $\Delta$ $w_h$ for all weights from hidden layer to output layer  // backward pass
        compute $\Delta$ $w_i$ for all weights from input layer to hidden layer   // backward pass continued
        update network weights // input layer not modified by error estimate
  until all examples classified correctly or another stopping criterion satisfied
  return the network

 简单的说明,即当网络的预测结果出来之后,与真实结果相比,计算出错误率,然后对每个权重$w_{ij}$计算其对错误率的偏导数,然后根据偏导数(梯度)调整权重。

记号:

1、$net_j$记为第$j$个神经元的原始输出;

2、$o_j$记为第$j$个神经元的最终输出;

3、转换函数记为$\varphi(\mbox{net}_{j}) = \varphi\left(\sum_{k=1}^{n}w_{kj}x_k\right)=o_{j} $;

4、$E$为整个网络的误差函数,一般为目标值$t$与预测值(输出值)$y$的函数$E=f(t,y)$;

5、$L_j$记为节点$j$的所有输出节点的集合,不引起歧义情况下会省略下标。

我们最终要求出的是$\frac{\partial E}{\partial w_{ij}}$,根据链式法则有:

$$\frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\mathrm{net_j}} \frac{\partial \mathrm{net_j}}{\partial w_{ij}} $$

根据定义,$net_j$是$w_{ij}$的线性函数,因此右边最后一项:

$$\frac{\partial \mathrm{net_j}}{\partial w_{ij}} = \frac{\partial}{\partial w_{ij}}\left(\sum_{k=1}^{n}w_{kj}x_k\right) = x_i$$

右边第二项为转换函数$\varphi(z)$的导数,一般用的比较多的是logistic函数,$ \varphi(z) = \frac{1}{1+e^{-z}} $,其导数为

$$\frac {\partial\varphi}{\partial z} = \varphi(1-\varphi)$$

主要推导的是右部第一项$\frac{\partial E}{\partial o_j}$。

当$j$在输出层时,是比较好计算的,即为$E$对$y$的偏导数:$\frac{\partial E}{\partial o_j} = \frac{\partial E}{\partial y} $。

当$j$在隐层时,我们有以下关系:

$$ \frac{\partial E}{\partial o_j} = \sum_{l \in L} \left(\frac{\partial E}{\partial \mathrm{net}_l}\frac{\partial \mathrm{net}_l}{\partial o_j}\right) = \sum_{l \in L} \left(\frac{\partial E}{\partial o_{l}}\frac{\partial o_{l}}{\partial \mathrm{net}_l}w_{jl}\right) $$

这是一个递推公式,从后层逐渐往前层递推,而最后层即是输出层,由上面公式给出,综合起来,我们有:

 $$\dfrac{\partial E}{\partial w_{ij}} = \delta_{j} x_{i}$$  

where,

$$\delta_{j} = \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\mathrm{net_j}} = \begin{cases} (o_{j}-t_{j})\varphi(\mbox{net}_{j})(1-\varphi(\mbox{net}_{j})) & \mbox{if } j \mbox{ is an output neuron,}\\ (\sum_{l\in L} \delta_{l} w_{jl})\varphi(\mbox{net}_{j})(1-\varphi(\mbox{net}_{j})) & \mbox{if } j \mbox{ is an inner neuron.} \end{cases} $$

$$$$

给定学习率,我们可以得到权重的调整度为:

$$\Delta w_{ij} = - \alpha \frac{\partial E}{\partial w_{ij}} $$

 

与L-BFGS算法的区别

L-BFGS是拟牛顿法,是针对目标函数求全局最优点的算法。而后向传播是神经网络优化算法,当然,其目标函数是$E$。神经网络优化,是基于样本的,有监督的,即$E$是样本和权重(==>待调整系数)的函数,每个样本给定,对应一个配置,样本值可看作超参数,权重是变量,等价于给定超参数的情况下求全局最优的变量。当一个样本优化完毕后,再优化下一个样本。

L-BFGS可以看为,超参数隐含已给定,因此是无监督的。

从广义上来讲,将全部样本囊括,然后可以写出一个广义的目标函数,对应批量优化。

狭义上来说,每个样本对应一个目标函数,对应增量优化。

不管增量优化批量优化,神经网络都有一个目标函数,样本给定后,这个目标函数是所有权重的函数$E=E(T,O(X,W))=E(W;X,T)$,$(X,T)$即是样本。对分层神经网络,O(W;X)是嵌套函数。

对于只有输入输出两层的网络:

$$O(W;X)=\varphi(W\times X)$$

只要求出梯度向量$g_k=\nabla E(W)$和海森矩阵$H_k=\nabla^2E(W)$即可套(拟)牛顿法。

神经网络之后向传播算法

标签:style   blog   http   io   ar   sp   java   for   strong   

原文地址:http://www.cnblogs.com/wuseguang/p/4103796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!