目录

CV_5全连接神经网络(中)


全连接神经网络(中)

1.梯度消失与梯度爆炸

梯度消失将导致参数无法更新,网络无法继续训练(无解决方法)

eg.sigmoid函数的导数$\in(0,\frac{1}{4}]$使得回传梯度不断变小

梯度爆炸使得步长过大,超出合理区域,使得算法无法收敛

解决方法:限制步长最大值——梯度裁剪

2.激活函数再议

  1. 一般不使用sigmoid以及tanh函数:

    局部梯度特性不利(导数小,容易导致梯度消失)

  2. 常用relu或者leaky relu函数:

    • relu:输入大于0时,梯度恒为1,特性好,利于计算
    • leaky relu:基本没有死区(除零点),局部梯度特性最佳

3.梯度算法改进

原有问题:损失函数在不同方向上的变化差异大$\to$在山壁间不断震荡但是在朝低谷方向上行进缓慢(增大步长难以解决)

改进方法:

动量法:利用累加历史梯度信息更新梯度

分析历史数据来消去震荡,从而凸显真正方向

https://s2.loli.net/2022/07/26/Hg5s14yJCN2kiqU.png

还可以冲出局部最小以及鞍点(常见于高维空间)来找到更好解

自适应梯度法:调整不同方向的学习率 AdaGrad$\to$RMSProp

  • 梯度幅度平方大的方向是震荡方向
  • 梯度幅度平方小的方向是平坦方向

同时为了纠正当$r\to \infty$时学习率过小的问题,采用了RMSProp方法,修正$r=pr+(1-p)g^2\quad p=0.999(一般情况下)$

https://s3.bmp.ovh/imgs/2022/07/26/00d3938498cbd660.png

ADAM方法:同时使用上述两种方法

https://s3.bmp.ovh/imgs/2022/07/26/366de6bdec242d75.png

通过修正偏差这一步可以解决算法初期的冷启动问题:由于衰减速率以及动量系数均很大,因此无修正偏差的话会导致算法初期学习效率很低

4.权值初始化

有效初始化:使得网络各层激活值和局部梯度的方差在传播过程中一致,因此保证网络中正、反向数据流动

Xaiver初始化——当激活函数为sigmoid或者tanh函数时

采样$N(0,\frac{1}{N})$的高斯分布来初始化

推导过程如下:

https://s3.bmp.ovh/imgs/2022/07/26/94eddd9a51e218eb.png

HE初始化——当激活函数为Relu时

采样$N(0,\frac{2}{N})$的高斯分布来初始化

5.批归一化

调整权值分布使得输入输出具有相同分布

eg.有32样本,则有32输出$y_1,…,y_{32}$对这32个输出进行归一化(减均值除方差),因此只需要每层每个神经元均进行批归一化即可

经常用于全连接层后,非线性激活函数前

总结

https://s3.bmp.ovh/imgs/2022/07/26/2bb7594aae7331ee.png