优化算法演化历程
机器学习和深度学习中使用到的优化算法的演化历程如下:
SGD –> Momentum –> Nesterov –> Adagrad –> Adadelta –> Adam –> Nadam
表1 优化算法演化过程及其原因
表
1
优
化
算
法
演
化
过
程
及
其
原
因
演化过程 | 原因 |
---|---|
SGD –> Momentum | 由于SGD在优化过程中容易产生震荡,为减小震荡,Momentum在梯度下降过程中引入了动量,使之具有惯性 |
Momentum –> Nesterov | 对梯度项进行矫正,使梯度下降方向由积累的动量和假设走到下一步的梯度两部分决定的 |
Nesterov –> Adagrad | Adagrad中引入二阶动量,使之能够自适应调节学习率 |
Adagrad –> Adadelta | 由于Adagrad 使用了之前所有梯度的平方,会导致训练到后面梯度为0,因此,在Adadelta中只用前面一段时间的下降梯度的配方 |
Adadelta –> Adam | 在梯度更新中,使用了动量,并且能够自适应调节学习率 |
Adam –> Nadam | 引入了Nesterov 动量项 |
各优化算法的公式与特点
SGD
公式:
- θ=θ−η∇θJ(θ) θ = θ − η ∇ θ J ( θ )
特点:
- 仅由当前所在的梯度来决定参数如何更新
- 梯度下降过程中容易出现震荡
Momentum
公式:
- mt=μ∗mt−1+η∇θJ(θ) m t = μ ∗ m t − 1 + η ∇ θ J ( θ )
- θt=θt−1−mt θ t = θ t − 1 − m t
特点:
- 引入动量,减小SGD在梯度下降过程中的震荡
- 梯度下降过程中,之前的动量也对当前运动有影响
Nesterov
公式:
- mt=μ∗mt−1+η∇θJ(θ−μ∗mt−1) m t = μ ∗ m t − 1 + η ∇ θ J ( θ − μ ∗ m t − 1 )
- θt=θt−1−mt θ t = θ t − 1 − m t
特点:
- 在Momentum优化算法的基础上,对当前梯度值进行矫正
- 矫正方式为,假设参数往积累的动量方向走了一步时所在位置的梯度作为当前的梯度值
Adagrad
公式:
- gt=∇θJ(θ) g t = ∇ θ J ( θ )
- nt=nt−1+(gt)2 n t = n t − 1 + ( g t ) 2
- θt=θt−1−ηnt+ϵ−−−−−√∗gt θ t = θ t − 1 − η n t + ϵ ∗ g t
特点:
- 适合用于稀疏梯度
- 前期梯度下降较快,后期梯度下降较慢
- 具有自适应学习率
- 训练后期,由于梯度累计较大,会使训练提前结束
Adadelta
公式:
- gt=∇θJ(θ) g t = ∇ θ J ( θ )
- nt=v∗nt−1+(1−v)∗(gt)2 n t = v ∗ n t − 1 + ( 1 − v ) ∗ ( g t ) 2
- θt=θt−1−ηnt+ϵ−−−−−√∗gt θ t = θ t − 1 − η n t + ϵ ∗ g t
特点:
- 在Adagrad基础上,减小提前结束训练的风险
Adam
公式:
- mt=μ∗mt−1+(1−μ)∇θJ(θ) m t = μ ∗ m t − 1 + ( 1 − μ ) ∇ θ J ( θ )
- nt=v∗nt−1+(1−v)∗(gt)2 n t = v ∗ n t − 1 + ( 1 − v ) ∗ ( g t ) 2
- mt^=mt1−μt m t ^ = m t 1 − μ t
- nt^=nt1−vt n t ^ = n t 1 − v t
- θt=θt−1−mt^∗ηnt^+ϵ−−−−−√∗gt θ t = θ t − 1 − m t ^ ∗ η n t ^ + ϵ ∗ g t
特点:
- Adam梯度经过偏置校正后,每一次迭代学习率都有一个固定范围,使得参数比较平稳
- 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
- 为不同的参数计算不同的自适应学习率
- 也适用于大多非凸优化问题——适用于大数据集和高维空间
各优化算法的分类
表2 各优化算法的分类
表
2
各
优
化
算
法
的
分
类
梯度修正 | 优化算法 |
---|---|
没进入动量,且不具有自适应学习率 | BGD、SGD |
引入动量 | Momentum、Nesterov |
自适应学习率 | Adagrad、Adadelta、RMSprop |
引入动量且自适应学习率 | Adam、Adamx、Nadam |
优化算法使用总结
- 在不考虑优化算法的使用细节及其技巧的情况下,一般使用Adam
- 虽然后面的优化算法都是在SGD上改进而来,但是目前很多paper依旧使用SGD
- 一般在训练时,数据都要进行shuffle
- 几种优化算法并不一定哪一个绝对好,视模型和数据而定