- 神经网络优化中的挑战
- 病态:极小的更新步长也会增加代价函数
- 局部极小值:不是主要问题,在低维空间中较多。
- 高原、鞍点、平坦区域:对于牛顿法而言,没有做合适的修改,就可能会跳进一个鞍点。
- 悬崖和梯度爆炸:斜率极大的悬崖结构,梯度更新会极大地改变参数值,可能使之前大量的优化工作成为无用功,也可能出现梯度爆炸的问题。解决办法:梯度截断。
- 梯度消失:梯度很小,难以知道参数朝哪个方向改进代价函数;
- 梯度爆炸:学习变得不稳定。
- 参数初始化策略:高斯分布、均匀分布等。
PyTorch 学习笔记(四):权值初始化的十种方法
初始权重太大的问题?
- 在前向传播或反向传播中产生爆炸的值;
- 在循环网络中,导致混沌(对输入很小的扰动非常敏感);
- 产生使得激活函数饱和的值,导致饱和单元的梯度丢失。
- 基本优化算法:
纯Python和PyTorch对比实现SGD, Momentum, RMSprop, Adam梯度下降算法
Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam
α: 学习率
1) SGD:
w = w - α·g
更新方向完全依赖于当前Batch计算出的梯度,十分不稳定。
2)Momentum SGD:
γ: momentum
- 会观察历史梯度Vt-1,一定程度上保留之前的更新方向,加快学习速度,减少震荡,类似于加上了小球沿滑坡向下滚动的惯性。
- 与梯度下降法梯度相同,则会加速;相反则会减速。
3) Nesterov Momentum
与标准Momentum在梯度计算上是不同的。
把 θ+γ * v这个位置看做是当前优化的一个”展望”位置。所以,可以在 θ+γ * v求导, 而不是原始的θ。
在原始形式中, Nesterov Accelerated Gradient(NAG)算法相对于Momentum的改进在于,以“向前看”看到的梯度而不是当前位置梯度去更新。经过变换之后的等效形式中,NAG算法相对于Momentum多了一个本次梯度相对上次梯度的变化量,这个变化量本质上是对目标函数二阶导的近似。由于利用了二阶导的信息,NAG算法才会比Momentum具有更快的收敛速度。
- 自适应学习率算法
(1) AdaGrad
- 应用于凸问题时的快速收敛
- 解决了SGD中不能自适应学习率的问题
- 从训练开始时,积累梯度平方会导致有效学习率过早和过量的减小。
- 小常数δ,用于稳定数值,通常设为1e-7
(2)RMSProp
- 修改AdaGrad以在非凸条件下效果更好,解决了AdaGrad所面临的问题。
- 使用指数衰减ρ以丢弃遥远过去的历史梯度
- 衰减速率ρ
(3)Nesterov RMSProp
- RMSProp改变了学习率,Nesterov引入动量改变了梯度,从两方面改进更新方式。
(4) Adam
Adam对梯度的一阶和二阶都进行了估计与偏差修正,使用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率(参数更新的幅度)。
- 批标准化——Batch Normalization
(1) 把逐渐通过激活函数逐渐向正负饱和区间靠近的数据分布强制拉回到0-1正态分布,可以解决梯度消失的问题。(例如 sigmoid函数在正负饱和区域,梯度几乎为0)因为能一直保持梯度比较大的状态,因而加快了收敛速度。
(2)但标准化一个单元的均值和标准差会降低该单元的神经网络表达能力,增加了需要学习的参数γ、β,将单元H替换为γ·H`+β,进行scale和shift,来还原上一层应该学到的数据分布,来增强网络的表达能力。