常用优化方法总结


梯度下降及其变体

包含梯度下降、随机梯度下降、小批量梯度下降

  1. 梯度下降GD
    w k + 1 = w k − γ k ∇ f ( w k ) (1) w_{k+1}=w_k-\gamma_k\nabla f(w_k) \tag{1} wk+1=wkγkf(wk)(1)
    每次更新参数需要计算整个数据集
    优点:对凸问题可以保证取得全局最小,非凸问题局部极小
    缺点:计算量大,可能造成内存不足,无法在线更新模型
  2. 随机梯度下降SGD
    w k + 1 = w k − γ k ∇ f i ( w k ) (2) w_{k+1}=w_k-\gamma_k\nabla f_i(w_k) \tag{2} wk+1=wkγkfi(wk)(2)
    每次随机选择1个训练样本计算梯度
    优点:计算速度快,可用于在线模型更新;由于随机单个样本带来的噪声可以避免陷入浅的局部极小值,找到更好的最小值(退火),能获得比GD更好的效果
    缺点:噪声带来的收敛过程波动较大
  3. 小批量梯度下降SGD
    w k + 1 = w k − γ k 1 B i ∑ j ∈ B i ∇ f j ( w k ) (3) w_{k+1}=w_k-\gamma_k\frac{1}{B_i}\sum_{j\in B_i}\nabla f_j(w_k) \tag{3} wk+1=wkγkBi1jBifj(wk)(3)
    每次随机选择一组训练样本计算梯度
    优点:是随机梯度的改进,可以减少更新中的噪声
  • 以上3种方法中小批量梯度下降的效果最好,因此SGD一般指的就是小批量
  • 但SGD学习率 γ \gamma γ的选择比较困难,另外SGD容易收敛到局部最优,并且可能被困在鞍点
  • 鞍点:一阶导为0,从该点出发一个方向是极大值点,另一个方向是极小值点(非极值的驻点)。其充要条件是,函数在该点的Hessian矩阵为不定的
  • 由于鞍点处会有一个平稳段,导致函数的导数长时间接近0,使得训练变缓慢

基于梯度下降的优化方法

动量

{ p k + 1 = β k p k + ∇ f i ( w k ) w k + 1 = w k − γ k p k + 1 (4) \begin{cases}p_{k+1}=\beta_kp_k+\nabla f_i(w_k)\\w_{k+1}=w_k-\gamma_kp_{k+1}\end{cases} \tag{4} {pk+1=βkpk+fi(wk)wk+1=wkγkpk+1(4)

  • ∇ f i ( w k ) \nabla f_i(w_k) fi(wk)表示第 i i i个样本的损失函数在第 k k k次迭代的权重下的梯度
  • 上式中 p p p称为SGD的动量,其实质就是梯度的平均值,起到噪声平滑的作用
  • 动量可以减轻SGD的震荡,起到加速的作用,其中 β \beta β称为阻尼因子,一般取0.9或0.99

Nesterov

{ p k + 1 = β k p k + ∇ f i ( w k − β k p k ) w k + 1 = w k − γ k p k + 1 (5) \begin{cases}p_{k+1}=\beta_kp_k+\nabla f_i(w_k-\beta_kp_k)\\w_{k+1}=w_k-\gamma_kp_{k+1}\end{cases} \tag{5} {pk+1=βkpk+fi(wkβkpk)wk+1=wkγkpk+1(5)

  • Nesterov是动量方法的改进,比后者收敛速度更快
  • Nesterov与动量的不同是,梯度计算不是根据当前位置,而是根据本来计划要走的一步到达的位置计算

Adagrad

{ p k + 1 = γ ∑ j = 1 k + 1 ∇ f i 2 ( w j ) ∇ f i ( w k ) w k + 1 = w k − p k + 1 (6) \begin{cases}p_{k+1}=\frac{\gamma}{\sqrt{\sum_{j=1}^{k+1}{\nabla f_i^2(w_j)}}}\nabla f_i(w_k)\\w_{k+1}=w_k-p_{k+1}\end{cases} \tag{6} pk+1=j=1k+1fi2(wj) γfi(wk)wk+1=wkpk+1(6)

  • Adagrad将每个参数的每次迭代的梯度取平方做累加后再开方,用全局学习率 γ \gamma γ除以这个数,作为学习率的动态更新
  • 由于训练过程中累加的和会持续增长,会导致学习率不断变小,最终趋向于0,使得训练提前结束
  • 适合处理稀疏数据

Adadelta

  • Adadelta是Adagrad的扩展算法,改进Adagrad学习率单调递减的问题
  • Adadelta无需设置默认的学习率,训练初期、中期速度较快,后期会在局部最小值周围抖动
    { p k + 1 = R M S [ p ] k R M S [ ∇ f i ( w k ) ] ∇ f i ( w k ) w k + 1 = w k − p k + 1 (7) \begin{cases}p_{k+1}=\frac{RMS[p]_k}{RMS[\nabla f_i(w_k)]}\nabla f_i(w_k)\\w_{k+1}=w_k-p_{k+1}\end{cases} \tag{7} {pk+1=RMS[fi(wk)]RMS[p]kfi(wk)wk+1=wkpk+1(7)
    其中 R M S [ p ] k RMS[p]_k RMS[p]k参数更新的均方根误差
    { R M S [ p ] k = E [ p 2 ] k + ϵ E [ p 2 ] k = γ E [ p 2 ] k − 1 + ( 1 − γ ) p k 2 \begin{cases}RMS[p]_k=\sqrt{E[p^2]_k+\epsilon}\\E[p^2]_k=\gamma E[p^2]_{k-1}+(1-\gamma)p^2_k\end{cases} {RMS[p]k=E[p2]k+ϵ E[p2]k=γE[p2]k1+(1γ)pk2
    R M S [ ∇ f i ( w k ) ] RMS[\nabla f_i(w_k)] RMS[fi(wk)]梯度的均方根误差
    { R M S [ ∇ f i ( w k ) ] = E [ ∇ 2 f i ( w k ) ] + ϵ E [ ∇ 2 f i ( w k ) ] = λ E [ ∇ 2 f i ( w k − 1 ) ] + ( 1 − λ ) ∇ 2 f i ( w k ) \begin{cases}RMS[\nabla f_i(w_k)]=\sqrt{E[\nabla ^2f_i(w_k)]+\epsilon}\\E[\nabla ^2f_i(w_k)]=\lambda E[\nabla ^2f_i(w_{k-1})]+(1-\lambda)\nabla ^2f_i(w_k)\end{cases} {RMS[fi(wk)]=E[2fi(wk)]+ϵ E[2fi(wk)]=λE[2fi(wk1)]+(1λ)2fi(wk)

RMSprop

  • RMSprop也是针对Adagrad学习率单调递减问题的改进
  • RMSprop是Adadelta的一个特例,但仍需要一个全局学习率
  • RMSprop适合处理非平稳目标,对RNN效果较好
    { p k + 1 = γ R M S [ ∇ f i ( w k ) ] ∇ f i ( w k ) w k + 1 = w k − p k + 1 (8) \begin{cases}p_{k+1}=\frac{\gamma}{RMS[\nabla f_i(w_k)]}\nabla f_i(w_k)\\w_{k+1}=w_k-p_{k+1}\end{cases} \tag{8} {pk+1=RMS[fi(wk)]γfi(wk)wk+1=wkpk+1(8)
    与Adadelta一样, R M S [ ∇ f i ( w k ) ] RMS[\nabla f_i(w_k)] RMS[fi(wk)]是梯度的均方根误差,RMSprop建议 λ = 0.9 \lambda=0.9 λ=0.9 γ = 0.001 \gamma=0.001 γ=0.001

Adam

  • Adam(自适应矩估计)本质上是带了动量项的RMSprop
  • Adam同时估计了梯度的动量(一阶矩估计)和方差的动量(二阶矩估计)
  • Adam使用了偏置校正,对每次迭代的学习率有动态约束,参数比较平稳
    w k + 1 = w k − γ v ^ k + ϵ m ^ k (9) w_{k+1}=w_k-\frac{\gamma}{\sqrt{\hat{v}_k}+\epsilon}\hat{m}_k\tag{9} wk+1=wkv^k +ϵγm^k(9)
    其中
    { m k = μ ∗ m k − 1 + ( 1 − μ ) ∇ f i ( w k ) m ^ k = m k 1 − μ k \begin{cases}m_k=\mu*m_{k-1}+(1-\mu)\nabla f_i(w_k)\\\hat{m}_k=\frac{m_k}{1-\mu^k}\end{cases} {mk=μmk1+(1μ)fi(wk)m^k=1μkmk
    { v k = ν ∗ v k − 1 + ( 1 − ν ) ∇ f i 2 ( w k ) v ^ k = v k 1 − ν k \begin{cases}v_k=\nu*v_{k-1}+(1-\nu)\nabla f_i^2(w_k)\\\hat{v}_k=\frac{v_k}{1-\nu^k}\end{cases} {vk=νvk1+(1ν)fi2(wk)v^k=1νkvk
  • 一般取 μ = 0.9 \mu=0.9 μ=0.9 ν = 0.999 \nu=0.999 ν=0.999,初始化 m k = v k = 0 m_k=v_k=0 mk=vk=0
  • 以上的 m ^ k \hat{m}_k m^k v ^ k \hat{v}_k v^k分别是对 m k m_k mk v k v_k vk的校正,因为更新过程尤其是初始阶段 m k m_k mk v k v_k vk倾向于0

经验

  • 对于稀疏数据,尽量使用学习率可自适应的优化方法,并且最好采用默认值
  • Adadelta,RMSprop和Adam可以视为一类算法,都是Adagrad的改进,它们在相似场景下表现也相似
  • 综合看来Adam因为校正的步骤是可以优先考虑的方法

参考

[1] https://www.cnblogs.com/hejunlin1992/p/13027288.html
[2] https://zhuanlan.zhihu.com/p/64113429
[3] https://zhuanlan.zhihu.com/p/22252270

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值