1 梯度下降
1.1 SGD
算法介绍
SGD(Stochasitic Gradient Descent)很简单,就是沿着梯度的反方向更新参数,优化目标函数。优化公式如下:
di=g(θi−1) d i = g ( θ i − 1 )
θi=θi−1−λdi θ i = θ i − 1 − λ d i
其中di d i为当前位置的梯度,也就是损失函数关于参数的一阶导数
优点
操作简单,计算量小,在损失函数是凸函数的情况下能够保证收敛到一个较好的全局最优解
缺点
- λ λ是个定值(在最原始的版本),它的选取直接决定了解的好坏,过小会导致收敛太慢,过大会导致震荡而无法收敛到最优解。
- 对于非凸问题,只能收敛到局部最优,并且没有任何摆脱局部最优的能力(一旦梯度为0就不会再有任何变化)
对于非凸的优化问题,我们可以将其转化为对偶问题,对偶函数一定是凹函数,但是这样求出来的解并不等价于原函数的解,只是原函数的一个确下界
1.2 Momentum
算法介绍
Momentum改进自SGD,让每一次的参数更新方向不仅取决于当前位置的梯度,还受到上一次参数更新方向的影响。 di=βdi−1+(1−β)g(θi−1) d i = β d i − 1 + ( 1 − β ) g ( θ i − 1 ) θi=θi−1−λdi θ i = θ i − 1 − λ d iMomentum的意思就是动量,也就意味着上一次更新的方向对本次更新仍然有影响。优点
一定程度上缓解了SGD收敛不稳定的问题,并且有一定的摆脱局部最优的能力(当前梯度为0时,仍可能按照上次迭代的方向冲出局部最优点),直观上理解,它可以让每次迭代的“掉头方向不是那个大“。缺点
这里又多了另外一个超参数 β β需要我们设置,它的选取同样会影响到结果。β β一般取0.9
1.3 Nestrov Momentum
算法介绍
Nestrov Momentum的意义在于,既然下一次一定会更新 λd′i λ d i ′,那么求梯度的时候就可以用提前位置的梯度 g(θi−1−λd′i) g ( θ i − 1 − λ d i ′ ),则: d′i=βdi−1+(1−β)g(θi−1) d i ′ = β d i − 1 + ( 1 − β ) g ( θ i − 1 ) di=βdi−1+(1−β)g(θi−1−λd′i) d i = β d i − 1 + ( 1 − β ) g ( θ i − 1 − λ d i ′ ) θi=θi−1−λdi θ i = θ i − 1 − λ d i优点
实验中,一般用Nestrov Momentum比较多,由于结合了二阶导数的信息,收敛比Momentum要更快一些。缺点
仍然是多了一个超参数需要调整2 自适应方法
2.1 Adagrad
算法介绍
ci=ci−1+g2(θi−1) c i = c i − 1 + g 2 ( θ i − 1 ) θi=θi−1−λci+ε√g(θi−1) θ i = θ i − 1 − λ c i + ε g ( θ i − 1 )其中, ci c i是一个cache,保存了各位置梯度的平方, ε ε一般取值为 10−4~10−8 10 − 4 ~ 10 − 8,为了防止分母取零。优点
Adagrad不需要手动调节学习率 λ λ,因为整体来看,学习率为 λci+ϵ√ λ c i + ϵ,它会根据 ci c i的大小发生自适应的变化(不同位置上变化的幅度不同)。缺点
- 学习率单调递减,在迭代后期可能导致学习率变得特别小而导致收敛及其缓慢。
- 同样的,我们还需要手动设置初始λ λ
2.2 RMSprop
算法介绍
ci=βci−1+(1−β)g2(θi−1) c i = β c i − 1 + ( 1 − β ) g 2 ( θ i − 1 )
θi=θi−1−λci+ε√g(θi−1) θ i = θ i − 1 − λ c i + ε g ( θ i − 1 )
优点
- 可以看出,Rmsprop与Adagrad类似,只不过cache的计算略微复杂一些,利用了一个衰减因子β β,这样可以使得c_i并不是一直处于增大的情况,可以解决Adagrad学习率迅速减小的问题。其中,衰减因子β β通常取值为[0.9,0.99,0.999]。
- 不再需要手动调整学习率,可以根据ci c i的变化自动调整
缺点
同样的,我们还需要手动设置初始λ λ
2.3 Adadelta
算法介绍
ci=γci−1+(1−γ)g2(θi−1) c i = γ c i − 1 + ( 1 − γ ) g 2 ( θ i − 1 )
di=−Δi−1+ε√ci+ε√g(θi−1) d i = − Δ i − 1 + ε c i + ε g ( θ i − 1 )
θi=θi−1+di θ i = θ i − 1 + d i
Δi=γΔi−1+(1−γ)d2i Δ i = γ Δ i − 1 + ( 1 − γ ) d i 2
优点
- Adadelta与Rmsprop类似,自适应的学习率
- 不需要手动设置λ λ
缺点
后期容易在小范围内产生震荡
2.4 Adam
算法介绍
di=β1di−1+(1−β1)g(θi−1) d i = β 1 d i − 1 + ( 1 − β 1 ) g ( θ i − 1 )
ci=β2ci−1+(1−β2)g2(θi−1) c i = β 2 c i − 1 + ( 1 − β 2 ) g 2 ( θ i − 1 )
di^=di1−βt1 d i ^ = d i 1 − β 1 t
ci^=ci1−βt2 c i ^ = c i 1 − β 2 t
θi=θi−1−λci^+ε√mi^ θ i = θ i − 1 − λ c i ^ + ε m i ^
在参数更新的最初几步中,由于初始化d0=0 d 0 = 0与c0=0 c 0 = 0,为了防止最初几步的更新向0偏差,Adam利用βi β i的t次幂来修正这种偏差(t每次更新加1)。
优点
结合Momentum和Adaprop,稳定性好,同时相比于Adagrad,不用存储全局所有的梯度,适合处理大规模数据
缺点
有三个超参数需要调整
通常β1 β 1取值为0.9,β2 β 2取值为0.999,ε ε取值为10−8 10 − 8
3 牛顿法与拟牛顿法
3.1 牛顿法
算法介绍
牛顿法和梯度下降法类似,也是求解无约束最优化问题的方法。
di=g(θi−1) d i = g ( θ i − 1 )
θi=θi−1−λH−1i−1di θ i = θ i − 1 − λ H i − 1 − 1 d i
其中,Hi−1 H i − 1是优化目标函数L在第i-1步的海森矩阵。
优点
收敛速度较快(考虑到了二阶导数的信息)
缺点
牛顿法的缺点就是H−1 H − 1计算比较复杂,因此有其他改进的方法,例如拟牛顿法。
3.2 拟牛顿法
算法介绍
拟牛顿法用一个矩阵G G来近似代替(或B B来代替),其中G G满足拟牛顿条件:
其中yi=g(θi+1)−g(θi) y i = g ( θ i + 1 ) − g ( θ i ),δi=xi+1−xi δ i = x i + 1 − x i。因此按照拟牛顿条件,每次只需更新Gi+1 G i + 1(或Bi+1 B i + 1)即可,使得Gi+1=Gi+ΔGi G i + 1 = G i + Δ G i。
牛顿法有多种的具体实现,其中DFP算法选择更新G G,BFGS选择更新。