计算机视觉与深度学习-全连接神经网络(中)

1 梯度消失

梯度消失是神经网络训练中非常致命的一个问题,其本质是由于链式法则的乘法特效导致的。

1.1 Sigmoid函数

在这里插入图片描述

1.2 tanh(x)函数

与sigmoid类似,局部梯度特性不利于网络梯度流的反向传递。
在这里插入图片描述sigmoid和tanh局部特性不好,很少用他们,除非作为输出层,不在用作隐层。

2 梯度爆炸

梯度爆炸也是由于链式法则的乘法特性导致的。

  • 梯度爆炸:断崖处梯度乘以学习率后会是一个非常大的值,从而“飞”出了合理区域,最终导致算法不收敛;
  • 解决方案:把沿梯度方向前进的步长限制在某个值内就可以避免“飞”出了,这个方法也称为梯度裁剪。

3 ReLU函数

在这里插入图片描述

4 Leakly ReLU函数

在这里插入图片描述

5 激活函数选择总结

尽量选择ReLU函数或者Leakly ReLU函数,相对于Sigmoid/tanh,ReLU函数或者Leakly ReLU函数会让梯度流更加顺畅,训练过程收敛得更快。

6 梯度算法改进

6.1 梯度下降算法存在的问题

  • 损失函数特性:一个方向上变化迅速而在另一个方向上变化缓慢。
  • 优化目标:从起点处走到底端笑脸处
  • 梯度下降算法存在的问题:山壁间震荡,往谷底方向的行进较慢。
  • 仅增大步长并不能加快算法收敛速度
    在这里插入图片描述

6.2 动量法

  • 目标:改进梯度下降算法存在的问题,即减少震荡,加速通往谷底
  • 改进思想:利用累加历史梯度信息更新梯度
  • 效果:累加过程中震荡方向相互抵消,平坦方向得到加强
    在这里插入图片描述
  • 现象:损失函数常具有不太好的局部最小值或鞍点(高维空间非常常见)
  • 梯度下降算法存在的问题:局部最小处与鞍点处梯度为0,算法无法通过。
  • 动量法的优势:由于动量的存在,算法可以冲出局部最小点以及鞍点,找到更优的解。
    在这里插入图片描述

6.3 自适应梯度与RMSProp

  • 自适应梯度法通过减小震荡方向步长,增大平坦方向步长来减小震荡,加速通往谷底方向;
  • 梯度幅度的平方较大的方向是震荡方向;梯度幅度的平方较小的方向是平坦方向。

6.3.1 AdaGrad

  • AdaGrad方法是一种自适应梯度方法
    在这里插入图片描述

6.3.2 RMSProp

  • RMSProp方法是一种自适应梯度方法
    在这里插入图片描述

6.4 Adam

  • 同时使用动量与自适应梯度思想
  • 修正偏差步骤可以极大缓解算法初期的冷启动问题
    在这里插入图片描述

6.5 总结

7 权值初始化

7.1 全零初始化

  • 建议:采用随机初始化,避免全零初始化
  • 全零初始化:网络中不同的神经元有相同的输出,进行同样的参数更新;因此,这些神经元学到的参数都一样,等价于一个神经元。
    在这里插入图片描述

7.2 随机权值初始化

  • 实验结论:初始化时让权值不相等,并不能保证网络能够正常的被训练。
  • 有效的初始化方法:使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致;以保持网络中正向和反向数据流动。

7.3 Xavier初始化

  • 一个神经元,其输入为z 1 _{1} 1,z 2 _{2} 2,…z N _{N} N,这N个输入是独立同分布的;其权值为w 1 _{1} 1,…,w N _{N} N,它们也是独立同分布的,且wz是独立的;其激活函数为f;其最终输出y的表达式:y = f(w 1 _{1} 1 * z 1 _{1} 1 + … + w N _{N} N * z N _{N} N
  • 目标:使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致,即寻找w的分布使得输出 y 与输入 z 的方差一致
  • 假设f为双曲正切函数,w 1 _{1} 1,…,w N _{N} N,独立同分布,z 1 _{1} 1,…z N _{N} N,独立同分布,随机变量wu与z独立,且均值都为0,则有:
  • Var(y) = Var( ∑ i = 1 n \sum\limits_{i=1}^{n} i=1nw i _{i} iz i _{i} i)= ∑ i = 1 n \sum\limits_{i=1}^{n} i=1nVar(w i _{i} iz i _{i} i)=nVar(w i _{i} i)Var(z i _{i} i),当var(w)=1/N时,y的方差与z的方差一致。
  • 网络结构:10个隐层,1个输出层,每个隐层包含500个神经元,使用的双曲正切激活函数。
  • 随机初始化:权值采样自N(0,1/N)的高斯分布,N为输入神经元个数
  • 达到目的:每层神经元激活值的方差基本相同!

7.4HE初始化(MSRA)

  • 网络结构:10个隐层,1个输出层,每个隐层包含500个神经元,使用的ReLU激活函数。
  • 随机初始化:权值采样自N(0,2/N)的高斯分布,N为输入神经元个数

7.5 权值初始化小结

  • 好的初始化方法可以防止前向传播过程中的信息消失,也可以解决反向传递过程中的梯度消失。
  • 激活函数选择双曲正切或Sigmoid时,建议使用Xaizer初始化方法;
  • 激活函数选择ReLU或Leakly ReLU时,推荐使用He初始化方法。

8 批归一化(也叫BN操作)

  • 小批量梯度下降算法回顾:每次迭代时会读入一批数据,比如32个样本;经过当前神经元后会有32个输出值y 1 _{1} 1,…,y 32 _{32} 32
  • 批归一化操作:对这32个输出进行减均值除方差操作;可保证当前神经元的输出值的分布符合0均值1方差。
  • 如果每一层的每个神经元进行批归一化,就能解决前向传递过程中的信号消失问题。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44606139/article/details/126874229