常见的深度学习优化方法

互联网面试常见问题之一:你知道哪些优化方法?优缺点是什么?

下面博主汇总了常见的深度学习优化方法

深度学习常见的优化方法(Optimizer):发展历程:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 

优化算法遵循一个普适框架

定义待优化参数:w ; 目标函数:f(w) ; 初始学习率:\alpha

开始迭代优化,对于每个epoch t:

1) 对目标函数求偏导得到当前参数的梯度:g_{t}=\triangledown f(w)

2) 根据历史梯度计算一阶动量和二阶动量:m_{t}=\phi(g_{1},g_{2},...,g_{t}), V_{t}=\psi(g_{1},g_{2},...,g_{t})

3) 计算当前时刻的下降梯度:\eta_{t}=\alpha \cdot m_{t}/\sqrt{V_{t}}

4) 根据下降梯度进行参数更新:w_{t+1}=w_{t}-\eta_{t}

注:所有的优化算法第3,4步都是一致的,区别就体现在第1,2步上

1规梯度下降算法

SGD-Stochastic gradient descent-随机梯度下降:算法每读入一个数据都会立刻计算Loss函数的梯度来更新参数。\eta _{t}=\alpha \cdot g_{t}    

优点:简单方便

缺点:下降速度慢,容易陷入局部最优。

BGD-Batch gradient descent-批梯度下降:算法读取整个数据集之后计算Loss函数的梯度来更新参数   

优点:如果Loss函数为convex,可得到全局最优解。  

缺点:数据处理量大,导致梯度下降慢;不能实时增加实例在线更新;训练占内存

Mini-BGD-Mini-batch gradient descent-小批量梯度下降:算法分别计算小批量的数据集即训练集的子集,来进行梯度下降。 优点:计算效率高而且收敛稳定,是现在深度学习的主流方法

2SGD with Momentum:为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性,引入一阶动量(各个时刻梯度的平均值 m_{t}=\beta_{t}m_{t-1}+(1-\beta_{1} \cdot g_{t})。t时刻的下降方向,不仅由当前位置的梯度方向决定,而且由此前累积的下降方向决定。

优点:在更新方向的时候保留之前的方向,增加稳定性而且还有摆脱局部最优的能力。

3:NAG- Nesterov Accelerated Gradient:防止以上方法困在局部最优。不是直接计算当前位置的梯度方向,而是计算如果按照累积动量走了一步时候的梯度方向g_{t}=\triangledown f(w_{t}-\alpha \cdot m_{t-1}/ \sqrt {V_{t}}),然后再与历史累积动量相结合(与Momentum一致)

4:Adagrad-Adaptive gradient-自适应梯度:引入二阶动量(所有梯度值的平方和V_{t}=\sum_{\tau=1}^{t} g_{\tau}^{2} , \eta_{t}=\alpha \cdot m_{t-1}/ \sqrt{V_{t}}),改进随机梯度下降算法。以前的算法中,每一个参数都使用相同的学习率。 Adagrad算法能够在训练中自动对learning_rate进行调整\alpha = \alpha / \sqrt{V_{t}},参数更新频率越高,\sqrt{V_{t}}越大,参数\alpha越小;参数更新频率越低,\sqrt{V_{t}}越小,参数\alpha越大。    

优点:很适合处理稀疏数据。

缺点:因为\sqrt{V_{t}}是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。

5:AdaDelta/RMSprop:(root mean square propagation):改变二阶动量计算方法的策略,和Adagrad的区别在于,用的是所有梯度值的平均值(指数移动平均值大约就是过去一段时间的平均值)V_{t}=\beta_{2} * V_{t-1}+(1-\beta_{2})g_{t}^{2} , \alpha = \alpha / \sqrt{V_{t}}           

优点:避免了二阶动量持续累积、导致训练过程提前结束的问题了

6:Adam-adaptive moment estimation(Adagrad + Momentum):同时引入一阶动量和二阶动量。SGD的一阶动量:m_{t}=\beta_{1} * m_{t-1}+(1-\beta_{1})*g_{t}, AdaDelta的二阶动量:V_{t}=\beta_{2}*V_{t-1}+(1-\beta_{2})g_{t}^{2}。

7.:Nadam- Nesterov+ Adam:

g_{t}=\triangledown f(w_{t}-\alpha \cdot w_{t-1} / \sqrt{V_{t}})

m_{t}=\beta_{t} * m_{t-1}+(1-\beta_{1})*g_{t}

V_{t}=\beta_{2}*V_{t-1}+(1-\beta_{2})g_{t}^{2}

注意:β1,β2 是最常见的两个超参数,分别对应于一阶动量和二阶动量,实际使用过程中,参考经验值为\beta_{1}=0.9,\beta_{2}=0.999, 初始化:m_{0}=0,V_{0}=0。初期m_{t},V_{t}很容易接近0,为了实现无偏估计,通常进行误差校正:

\tilde{m_{t}} = m_{t}/(1-\beta_{1}^{t})

\tilde{V_{t}}=V_{t}/(1-\beta_{2}^{t})

(注:如果上述内容与他人相同属于正常现象,因为知识点都是一样的!有的方法优缺点不全,想进一步了解的请问度娘)

最后希望大家能够取得很好的面试成绩!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值