互联网面试常见问题之一:你知道哪些优化方法?优缺点是什么?
下面博主汇总了常见的深度学习优化方法
深度学习常见的优化方法(Optimizer):发展历程:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam
优化算法遵循一个普适框架:
定义待优化参数: ; 目标函数: ; 初始学习率:
开始迭代优化,对于每个epoch :
1) 对目标函数求偏导得到当前参数的梯度:
2) 根据历史梯度计算一阶动量和二阶动量:
3) 计算当前时刻的下降梯度:
4) 根据下降梯度进行参数更新:
注:所有的优化算法第3,4步都是一致的,区别就体现在第1,2步上
1:常规梯度下降算法
SGD-Stochastic gradient descent-随机梯度下降:算法每读入一个数据都会立刻计算Loss函数的梯度来更新参数。
优点:简单方便
缺点:下降速度慢,容易陷入局部最优。
BGD-Batch gradient descent-批梯度下降:算法读取整个数据集之后计算Loss函数的梯度来更新参数
优点:如果Loss函数为convex,可得到全局最优解。
缺点:数据处理量大,导致梯度下降慢;不能实时增加实例在线更新;训练占内存
Mini-BGD-Mini-batch gradient descent-小批量梯度下降:算法分别计算小批量的数据集即训练集的子集,来进行梯度下降。 优点:计算效率高而且收敛稳定,是现在深度学习的主流方法
2:SGD with Momentum:为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性,引入一阶动量(各个时刻梯度的平均值 。t时刻的下降方向,不仅由当前位置的梯度方向决定,而且由此前累积的下降方向决定。
优点:在更新方向的时候保留之前的方向,增加稳定性而且还有摆脱局部最优的能力。
3:NAG- Nesterov Accelerated Gradient:防止以上方法困在局部最优。不是直接计算当前位置的梯度方向,而是计算如果按照累积动量走了一步时候的梯度方向,然后再与历史累积动量相结合(与Momentum一致)
4:Adagrad-Adaptive gradient-自适应梯度:引入二阶动量(所有梯度值的平方和),改进随机梯度下降算法。以前的算法中,每一个参数都使用相同的学习率。 Adagrad算法能够在训练中自动对learning_rate进行调整,参数更新频率越高,越大,参数越小;参数更新频率越低,越小,参数越大。
优点:很适合处理稀疏数据。
缺点:因为是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。
5:AdaDelta/RMSprop:(root mean square propagation):改变二阶动量计算方法的策略,和Adagrad的区别在于,用的是所有梯度值的平均值(指数移动平均值大约就是过去一段时间的平均值)
优点:避免了二阶动量持续累积、导致训练过程提前结束的问题了
6:Adam-adaptive moment estimation(Adagrad + Momentum):同时引入一阶动量和二阶动量。SGD的一阶动量:, AdaDelta的二阶动量:。
7.:Nadam- Nesterov+ Adam:
注意:β1,β2 是最常见的两个超参数,分别对应于一阶动量和二阶动量,实际使用过程中,参考经验值为, 初始化:。初期很容易接近0,为了实现无偏估计,通常进行误差校正:
(注:如果上述内容与他人相同属于正常现象,因为知识点都是一样的!有的方法优缺点不全,想进一步了解的请问度娘)
最后希望大家能够取得很好的面试成绩!