手把手教你搭建BP神经网络——实践篇

来源:互联网 发布:美国宝宝的好处知乎 编辑:程序博客网 时间:2024/06/06 00:54

经过两个星期的摸索,博主基于数学公式搭建了一个bp神经网络。目的在于学习基本功。在搭建的过程中,博主发现很多文章对于搭建方面讲解的力度不够或者写得不太明了。所以特意写下该文章与大家一起交流。本人才粗浅薄,如有错误望高人指点。本文的优点在于搭建了四层神经网络结构,一般的文章只讲三层对于多个隐含层的式子未给出,通过本文可以很快的写出多层隐含层的BP神经网络。(注:还有数学证明还没Post上来,博主打算开一篇专门推导数学公式的,毕竟是数学系的学生。还有代码也另外放在一篇博客中)

1.工具:matlab

2.公式转换为实战:

a.前向传播

假设输入层I有k个输入节点;第一个隐含层HM有m个神经元;第二个隐含层HN有n个神经元;输出层O有i个输出层。

输入层与第一层隐含层的权值矩阵记为WMK;第一层隐含层到第二层隐含层的权值矩阵记为WNM;第二隐含层到输出层的权值矩阵记为WIN;偏置值分别为bMK,bNM,bIN;

下面以输入与第一隐含层为例,之后可以方便地推广到其他不同层

输入矩阵:


第一隐含层权值:


计算:


利用矩阵运算可以得到:

同样的得到以下公式



b.反向传播


3.算法说明:Levenberg_Marquardt算法——改进牛顿法

由博主BP神经网络数学公式推导的博客的内容(准备写:(),可以知道lm算法的核心是如何求雅可比矩阵。在很多文章里面并没有说明白雅可比矩阵究竟怎么放置不同的偏导矩阵,下面给出详细过程。

其中J(W)为雅可比矩阵的分块矩阵形式


输出层到第二层隐含层的权值偏导数计算


第二隐含层到第一层隐含层的权值偏导数计算



第一隐含层到输出层的权值偏导数计算


按照之前的结果我们可以得到

得到全部权值的变化值放置在上述公式的输出结果中。实践中我们可以明白这些权值的该变量是按顺序排放的,通过整理我们可以得到最后的每一层的权值矩阵。

每迭代一次就使得上一次计算的权值矩阵分别加上权值的改变量。这样就是权值矩阵不断修正,逐渐趋向于目标结果。

综述:

流程图如下,先初始化网络进行数据输入,结构设计,权值矩阵随机取数等等。第一步先前向运行计算,算出一个随机结果,得到每层的结果。经过判断后判断是否更改设计参数,继续计算。当达到精度要求时输出并结束。


u是一个试探参数,当误差减少就使用减小。当足够小时就使用牛顿法求解。反过来,如果足够大时就使用误差向后传递解。

关于u,是一个我自己实践上的问题,因为很多论文都提到要使得U/beta(beta一般取10)。当u足够小时,hessian矩阵就会变为不可逆的值,这样使得计算无法进行。我自己分析的原因是,由于需要对相近数值进行分类,那么难免会有jacobian矩阵中其中几列的元素相近,虽然不一定相等可是计算机是有精度的,所以计算的时候很容易导致不可逆的问题出现。所以我没有使用u/beta,而是使得u=0.01。


原创粉丝点击