神经网络

MNIST例程中,如果将lenet_train_test.prototxt去掉两个卷积层和下采样层,剩下两个全连接层,这个网络模型就是一个简单的神经网络模型。使用该模型训练,最终准确率也可以达到97%以上。

该神经网络示意图如下:

神经网络算法流程图 神经网络算法图解_神经网络

这个神经网络包含三个层:

  • 输入层: 28x28 = 784个神经元,每个神经元代表一个像素的值
  • 隐藏层: n个神经元, 例子中 n=500
  • 输出层: 10个神经元,分别代表手写数字识别可能的0~9十个数字,例如: 第一个神经元(代表0)的输出值=1, 其他的<1, 数字被识别为0

神经元

每一个神经元结构如下:

神经网络算法流程图 神经网络算法图解_Caffe_02

神经元的输出为



y=f(∑i=1nxnwn+b)

其中xi为上一层第i个神经元的输出,wi上一层第i个神经元的连接权重,b为偏向,用来改变神经元的活性,f为激活函数。

神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权w”和每个神经元的“偏向b”换而言之,神经网络学到的东西,蕴含在连接权与偏向中

激活函数

激活函数是用来加入非线性因素的,没有激活函数,多层神经网络也只能在线性空间内变换,最终相当于一次神经网络的效果。
常用的激活函数有几种:

Sigmoid函数

Sigmoid函数,值域为(0,1)。

sigmoid(x)=11+e−ax


神经网络算法流程图 神经网络算法图解_Caffe_03

tanh函数

tanh函数,值域为(-1,1)。


tanh(x)=1−e−2x1+e−2x


神经网络算法流程图 神经网络算法图解_神经网络算法流程图_04

ReLU函数

ReLU (Rectiied Linear Unit, 规整化线性单元 )函数, 值域为[0,+∞),是一种非饱和激活函数。


ReLU(x)=max(0,x)


神经网络算法流程图 神经网络算法图解_神经网络算法流程图_05

深度神经网络中最大的问题是梯度消失问题,这在使用Sigmod、tanh函数等饱和函数情况下尤为严重(神经网络进行反向传播时候,各层都要乘以激活函数的一阶倒数,梯度每传递一层都会衰减一次,网络层数多时,梯度会不停衰减直到消失),使得训练网络时收敛极慢,而ReLU函数这类非饱和函数收敛速度则快很多

误差逆传播算法

误差逆传播(error BackPropagation,简称BP)算法是最杰出的代表,他是迄今为止最成功的神经网络学习算法。

神经网络的目标为让计算输出y尽可能接近理想输出t,即然误差函数E=0.5(y−t)2的值最小。BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整。对给定的学习率η,
神经网络各节点的权重w的调整量为


Δw=−η∂E∂w

神经网络各节点偏向b的调整量为

Δb=−η∂E∂b



BP神经网络的计算流程为,先根据输入数据各个节点的权重偏向,计算出神经网络的输出(前向传播计算),通过计算输出与理想输出比较得到误差,再根据误差函数再各个节点的偏导数计算出各权重、偏向的调整量(反向传播计算)。该迭代过程循环进行,直到达到某些停止条件,如训练误差已经小到一定值。

以一个隐藏层的神经网络演示计算流程,每层选一个神经元进行计算。

神经网络算法流程图 神经网络算法图解_BP神经网络算法_06

前向传播计算

对Hidden层的每个单元,其值yj=f(zj),zj=∑iwijxi+bj,其中i取值所有输入层节点,zj是对前一层的所有节点加权和加偏向。网络使用非线性变换,得到该层输出yj。

从Hidden层到Output层计算如下:

对Hidden层每个单元k,其值yk=f(zk),zk=∑jwjkyk+bk,其中j取值遍历Hidden层所有节点。

反向传播计算

每层首先计算对于该层输出节点的误差梯度,即所有相对于后一层节点的误差梯度的加权和。之后使用链式法则将误差梯度传到该层输入点。

输出单元的误差梯度通过对代价函数(或损失函数)求导得到,假设输出层单元k对应的代价函数项为E=0.5(yk−tk)2,其中tk为期望输出值,可计算相对于yk的偏导数为yk−tk,由于yk=f(zk),所以代价函数相对于zk的偏导数为:


∂E∂zk=∂E∂yk.∂yk∂zk=(yk−tk)f′(zk)


对于学习率η,隐藏层和输出层的连接权重

wjk和输出层偏向调整量为



Δwjk=−η∂E∂wjk=−η∂E∂zk.∂zk∂wjk=−η(yk−tk)f′(zk)yj



Δbk=−η∂E∂bk=−η∂E∂zk=−η(yk−tk)f′(zk)

对隐藏层的每个单元j,其误差梯度为


∂Eyj=∑k∂E∂zk.∂zk∂yj=∑kwjk∂E∂zk


对于学习率η,输入层和隐藏层的连接权重

wij和隐藏层偏向调整量为



Δwij=−η∂E∂yj.∂yj∂zj.∂zj∂wjk=−η∂E∂yjf′(zj)xi



Δbj=−η∂E∂yj.∂yj∂zj=−η∂E∂yjf′(zj)


根据得到的调整量不断调整权重和偏向,让神经网络的输出误差越来越小。