aihot  2017-05-17 19:36:21  机器学习 |   查看评论   
神经网络:多层网络与C++实现

 

一、引言

前一关于神经网络的文章中,给出了神经网络中单个神经元的结构和作用原理,并且用梯度下降的方法推导了单个SIMGOID单元的权值更新法则。在文章的最后给了一个例子,我们以一个4维的单位向量作为特征,映射到一维的[0,1]的空间中,我们采用了一个感知器单元,实验结果发现经过15000次(实际应该在5000次左右已经收敛了)的训练后,对于给出的特征向量,感知器单元总是能够得到很接近我们预期的结果了。然而在实际应用过程中,单个神经元不能拟合太复杂的映射关系,我们需要构建更复杂的网络来逼近那些更复杂的目标函数,本文的最后,我们会用多层网络处理前一篇文章中的例子,经过300-500次的训练,就可以很好的收敛。

本篇文章为神经网络这个主题的第二篇文章,主要介绍多层网络的结构及用反向传播算法对权值进行更新,最后我们会一步一步用C++对整个结构进行实现。

二、多层网络结构

多层网络,顾名思义就是由多个层结构组成的网络系统,它的每一层都是由若干个神经元结点构成,该层的任意一个结点都与上一层的每一个结点相联,由它们来提供输入,经过计算产生该结点的输出并作为下一层结点的输入。

值得注意的是任何多层的网络结构必须有一输入层、一个输出层。下面的图结构是更形象的表示:
 

我们从图像中来再次说明多层网络的结构:上图是一个3层的网络结构,它由一个输入层、一个输出层和一个隐藏层构成,当然隐藏层的层数可以更多。图像隐藏层的结点i与输入层的每一个结点相连,也就是说它接收了一组向量作为输入,同时与它相连的n条线代表了n个输入的权值。特别要注意的是图像隐藏层结点与输出结点还有一个红色的连线,它们代表了偏置,即

w0

那么结合上篇文章的内容,我们知道图像的i结点,它将输入与对应的权值进行线性加权求和,然后经过