Neural Network 反向传播算法(BP Algorithms)推导,无代码

本篇笔记是因为无意中读了以下博客而写,作者为rachel zhang,本文虽为转载但是我自己标注了很多笔记:

http://blog.csdn.net/abcjennifer/article/details/7758797


作为一个机械电子的毕业生,无意中点链接点到了这篇博客,终于让我看到了计算机科学与控制系统的稍微一点点的关联。人工神经网络和其bp算法是机器学习中一个比较经典的数学工具,它的原理,和最有控制方法其实是十分相似的。

在最优控制中,我们需要找到一个cost function,用某些数值方法找到这个cost function的optimized值(最大或者最小),这些数值方法有很多,例如gradient descent, stochastic gradient descent,牛顿法等等等等。在bp算法中,我们也是需要找到一个cost function,通常这个cost function是要让我们模型得到的输出和reference输出十分的接近,所以bp算法的概念就是使我们模型输出与应得输出的误差最小化,优化的方法举例来说,就是用例如gradient descent更新某个未知数,来迭代求最小。 如果学控制的同学都知道如果用gradient descent,也就是梯度法,我们需要选择一个参数a来作为一个learning rate,这个值如何选择,是要根据模型来进行手动调试的。

下面转帖一下这个博客,红色字是我的笔记笔记:


需要了解的概念,每一个神经元可以有n个输入,但是只有一个输出!!!!

===============================

(一)、Cost function


假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,Sl表示每层的neuron个数(SL表示输出层神经元个数)。

将神经网络的分类定义为两种情况:二类分类和多类分类,

卐二类分类:SL=1, y=0 or 1表示哪一类;

卐K类分类:SL=K, y= 1表示分到第i类;(K>2)


我们在前几章中已经知道,Logistic hypothesis的Cost Function如下定义:这里的h(x)相当于下面的g(x),代表非线性函数。


其中,前半部分表示hypothesis与真实值之间的距离,后半部分为对参数进行regularization的bias项,神经网络的cost function同理:


hypothesis与真实值之间的距离为 每个样本-每个类输出 的加和,对参数进行regularization的bias项处理所有参数的平方和




===============================

(二)、Backpropagation algorithm

前面我们已经讲了cost function的形式,下面我们需要的就是最小化J(Θ)


想要根据gradient descent的方法进行参数optimization,首先需要得到cost function和一些参数的表示。根据forward propagation,我们首先进行training dataset 在神经网络上的各层输出值:a是每个神经元的输出,z是每个神经元的输入


我们定义神经网络的总误差为:按照我所理解,这个误差实际上是y与最后一层输出,也就是a4的差。

希望通过调整权重参数W(也就是theta)来最小化E。
由于


所以每一层按如下方式进行更新:

根据backpropagation算法进行梯度的计算,这里引入了error变量δ该残差表明了该节点对最终输出值的残差产生了多少影响。
对于最后一层,我们可以直接算出网络产生的输出与实际值之间的差距,我们将这个差距定义为。对于隐藏单元我们如何处理呢?我们将通过计算各层节点残差的加权平均值计算hidden layer的残差。读者可以自己验证下,其实就是E对b求导的结果。

在最后一层中,

对于前面的每一层,都有
这里也很重要,更新theta的推倒,这里重要的部分是,当前层每个神经元的输出,其实都是对后一层神经元的输出有影响的,因为当前层的某个神经元的输出,是后一层所有神经元的其中一个输入,所以第一行推倒的sigma j 到n就是下一层所有的计算。注意倒数第二行的第二个sigma,我们其实是在计算所有的下一层的zj(zj是下一层神经元的输入)关于此层zi(次层神经元的输入)的导数,所以有一些g(zk)当k不为i的时候,导数为0,只有当k等于i的时候,这个导数才有求的必要。所以这个时候我们可以看出来一个问题,就这我们要求的这一层的第i个神经元的delta,等于下一层所有神经元的delta乘以此层第i个神经元和下一层第j个神经元之间的weight,再乘以本层第i个神经元输出的导数。

由此得到第l层第i个节点的残差计算方法:

由于我们的真实目的是计算,且


所以我们可以得到神经网络中权重的update方程:
   这个部分是最重要的,因为我们要更新theta,我们更新的是本层第j个神经元和下一层第i个神经元之间的weight,所以本层第j个的输出a很重要。注意推倒过程中角标是很不对称的,一定要自己推倒。
不断迭代直到落入local optima,就是backpropagation的算法过程。

注意以上的例子,cost function在以上博客中举了两个例子,一个cost function就是误差,另一个是Logistic hypothesis的Cost Function。每一个神经元是一个非线性的函数,一般情况下可以用sigmoid函数,或者tanh什么之类的,sigmoid函数比较好因为各种微分推倒都是现成的,可以直接baidu出来。这里其实比较绕的地方是各个角标,因为毕竟有那么多层,每层有那么多神经元。因为我们要更新theta,也就是每个神经元输入的weight,所以我们要对theta求导再运用gradient descent。

============================================================
Example of logistical cost:

下面我们针对logistical cost给出计算的例子:这里我认为cost function不是logistic hypothesis cost,而是单纯的误差,也就是E=(Y-a最后一层),cost function=(E^2)/2,可以看下面推倒而得到原因,尤其是看dE/da的推倒。
而对于每一层,其误差可以定义为:

分别代入即得

 其实可以假设神经元为sigmod函数,推倒一样

由此得来\theta_{k}的update方程:

    这里其实我觉得得到的应该是更新theta k-1层

如果将误差对激励函数(activation function)的导数记做δ,则有:

  也就是E对于z的导数


对于前面一层 ,更新同理,,只是上一层\Theta梯度的第一个分量E对a_k求导有所变化,

 不重要

但是始终是不变的。


下图就是上面推导得出的结果:


由上图我们得到了error变量δ的计算,下面我们来看backpropagation算法的伪代码:


ps:最后一步之所以写+=而非直接赋值是把Δ看做了一个矩阵,每次在相应位置上做修改。

从后向前此计算每层δ,用Δ表示全局误差,每一层都对应一个Δ(l)。再引入D作为cost function对参数的求导结果。下图左边j是否等于0影响的是是否有最后的bias regularization项。左边是定义,右边可证明(比较繁琐)。



上面的图片,是andrew ng课程里的一些东西,注意推倒delta4的时候,或者说这个整个的例子,用的cost function 是 logistic hypothesis,一定要注意,如果用把cost function当成单纯的error平方处以2,推倒不出来的。可以看到给的算法就是简单的一直更新theta,for循环里每一次都要更新每一层,所有神经元相关的weight,然后更新每一层n次。
关键在于根据前一层的delta算现在这个层的delta,delta是必须关于每个神经元都要算出来的。然后更新每一个weight就好了。

这个算法基本上和最有控制一样,牵扯着大量的矩阵计算,还有微积分,在数学的应用上,还是让人感觉比较心烦的。以上就是这个算法大概的推倒过程,其中的数学比较易懂,但是编程起来,似乎难度很大。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值