上一次修改时间:2018-08-10 14:51:34

BP神经网络

  1. BP神经网络简介

    image.png

    注:BP算法也叫误差反向传播算法,可以将误差由最后的输出层一层一层往上传播,从而使整个网络中每一个神经元都可以不断调整自身的权值,使整个网络达到一个较好的状态

    image.png

    注:多层神经网络中,每一层的每个神经元都是和上一层的所有神经元连接在一起的;理论上,多层的神经网络可以模拟出任何方程

    image.png

    http://yann.lecun.com/exdb/lenet/index.html

    多层神经网络手写数字识别的示例

    image.png

    注:多层神经网络中,高层的神经元层可以提取出高层特征,这些高层特征通常是人眼无法识别,但机器可以处理的特征

    image.png

    https://open.163.com/movie/2015/3/Q/R/MAKN9A24M_MAKN9QAQR.html

  2. 神经元常用激活函数

    image.png

    image.png

    注:sigmoid函数的y值范围为(0 , 1),tanh函数和softsign函数的y值范围为(-1 , 1)

  3. BP神经网络

    image.png

    QQ图片20180809224727.png

    image.png

    注:输入层的神经元X是没有权值的,隐藏层的神经元的权值为V,输出层神经元的权值为W

    image.png

    注:误差函数E的展开式中,函数f是指的神经元的激活函数

    image.png

    image.png

    注:前面有image.png,因此netk对wjk求偏导后image.png的值为image.png

    image.pngimage.png

    注:公式的推导过程就是用已知量去表达要求的用于迭代的未知量image.pngimage.png的过程;BP算法的推导中,image.png为学习率,是一个常数,在训练时,根据实际任务的情况指定,为已知量;image.png为直值,即训练数据的目标,为已知量;image.png为输入结果X在经过神经网络后的预测值,为已知量;image.png为输入结果经过隐藏层后的中间结果,为已知量;image.png为已知量;image.png为输出层的权重,初始化时为随机值,迭代时为上一次迭代的值加上,上一次迭代后得到增量值image.png,为已知量;image.png为输入,即训练数据X,为已知量

    image.pngimage.png

    image.png

  4. BP神经网络应用

    image.png

  5. 传统的随机梯度下降不适用于深度学习的分析

    注:以下权值初始化的方式都为:image.png,其中U表示平均分布,n表示前一层的神元的个数;

    目标:理解为什么随机初始化权值,用标准梯度下降后的深层神经网络表现得很差;

    sigmoid函数不适合于随机初始值的深度网络,因为它的均值问题,会使得最上面的隐藏层进入饱和状态;

    使用sigmoid作为激活函数的神经网络里,层数不能太深,通常效果最好时为4层,其它的激活函数,如tanh等,效果最好时为5层;原因:BP神经网络里,激活函数的导数小于1时,如果网络层数太深的话会有梯度消失的问题,因为学习信号的反向传播时,学习信号会越来越小,网络层数太多的话,会导致前面的神经网络接收不到学习信号,从而学习不到任何东西;同理,如果激活函数的导数大于1时,会有梯度爆炸的问题,即越往后,梯度会越来越大;

    激活函数饱和是指激活函数的值趋近于上限,如sigmoid函数,当其值趋近于1时,就认为其处于饱和状态,处于饱和状态的神经网络,因为其梯度趋近于0,学习信号也趋于0,相当于该神经网络已经学习不到任何数据了;另外,如sigmoid函数图形中,处于中间那段类似于线性函数的区域也不是一个好的学习区域,该区域内,因其类似于线性函数,不能描绘出较复杂的边界,因此处理不了较为复杂的问题;综上所述,激活函数中,饱和区域的下面到类似线性区域的上面这段函数区间才是最好的学习区域;

    sigmoid激活函数说明:

    image.png

    注:如上图所示,当最后一层Layer4处于饱和状态,趋向于0时,前面几层的神经网络在训练中几乎没有变化;sigmoid激活函数在神经网络层数只有4层时,还能在训练中脱离饱和状态,让网络学习到新的数据,但如果层数为5层,该函数将不可能在训练中脱离饱和状态;

    注2:造成以上问题的原因,有可能是随机初始化的问题(最上层的网络初始化的权值都在0附近,导致其开始训练时就趋向于0,从而学习不到数据),如果神经网络用受限玻尔兹曼机进行预训练的话,就不会有这种问题;

    注3:如上图中,使用sigmoid作为激活函数的4层BP网络,当训练到一定量数据后,最上层摆脱了饱和状态,前面的网络也能学习到数据,但训练完成后,总体的模型表现还是很差;

    tanh和softsign激活函数说明:

    image.png

    注:如上图,双曲正切函数在训练中一层接一层的都达到了饱和状态,而softsign则没有达到饱和状态,因此,相对来说,softsign函数作为激活函数会比tanh函数要好;

    image.png

    注:如上图,softsign函数的值主要分布在非线性区域(-0.6,-0.8)和(0.6,0.8),因此相对于tanh要好;

    结论:前面提到的初始化方式不是太好,可以改用正则化的初始化方式:

    image.png

    其中image.png表示上一层神经元的个数,image.png表示下一层神经元的个数;

    两种初始化方式下梯度的对比图:(学习梯度可能是指每次迭代后权值的增量image.png)

    image.png

    注:如上图所示,标准化的初始化方法会导致学习梯度集中在0附近,从而导致学习不到数据;正则化的初始化方法下,学习梯度的分布较好,在0附近之外的区域也有较高的分布;

    用标准化的初始化时,激活函数,如sigmoid或tanh,收敛会很慢,而且很容易收敛到局部最小值;而softsign函数,可能因其非线性相对于tanh来说比较柔和,初始化阶段相对比较健壮(标准化的初始化和正则化的初始化都是);

    训练误差对比图:

    image.png

    注:如上图所示,5层的sigmoid函数的网络,误差始终很大,一直在80%以上,而4层的sigmoid函数的网络,脱离饱和状态后,其误差逐渐减小;上图中的N表示正则化,如Softsign N表示采用正则化的初始化方法得到训练误差;