深度学习之优化算法详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xwd18280820053/article/details/77529550

 

梯度下降(batch gradient descent, stochastic gradientdescent, 以及 mini-batchgradient descent)现在的SGD一般都指mini-batch gradient descent

(1)Batch gradientdescent:最小化所有训练样本的损失函数。得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度慢;对于convex error surfaces可以得到global minimum,而对于non-convex errorsurfaces能得到local minimum

(2) Stochasticgradient descent: -最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向,但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万)。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。相较于BGDSGD更容易从一个local minimum跳到另一个local minimum(但是当learning rate过小时,performance便和BGD相似);High variance,更容易使得loss curve产生震荡

(3)Mini-batch gradientdescent: 计算whole dataset某个子集(通常设置为50-256)对于paremeters的偏导,而后更新梯度;SGD更稳定,更易收敛;能够使用高效的矩阵化trick,使得在runing的时候更加efficient

SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即:

中,η是学习率,gt是梯度 SGD完全依赖于当前batch的梯度,所以可理解为允许当前batch的梯度多大程度影响参数更新。

1)       选择合适的learning rate比较困难,太小了收敛很慢,太大了容易在local minimum周围晃动,甚至发散- 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求;

2)       SGD容易收敛到局部最优

 

Momentum

遇到沟壑问题(一个方向的坡度比其他方向明显要陡峭,大多数情况下都会对应到一个local minimum)时,SGD不会沿着沟壑加速下降到local minimum,而Momentum的想法则是将上一次更新时的梯度乘以一个因数γ(一般设置为0.9)然后加上此时的梯度若两个梯度的方向类似,则会加速在这一方向上的移动,即加速了收敛

u为动量因子。

特点:下降初期时,使用上一次参数更新,下降方向一致,乘上较大的因子能够进行很好的加速;下降中后期时,在局部最小值来回震荡的时候,梯度趋于0,使得更新幅度增大,跳出陷阱;momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛。

缺点 Momentum的一个问题是盲目,即不判断下一步将要下降到哪,就一直加速下降,所以在坡度开始由下降转为上升时,可能会越过local minimum

Nesterov

先大概预测下一步要下降到的位置,再做出修正,梯度更新时做一个校正,避免前进太快,同时提高灵敏度;

 将上一节中的公式展开可得:

加上nesterov项后,梯度在大的跳跃后,对当前梯度进行校正。

 

 

momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量)nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)

上述方法均需人工调整学习率,接下来介绍几种自适应学习率的方法

Adagrad

Adagrad其实是对学习率进行了一个约束gt1t进行一个递推形成一个约束项regularizer:

特点:前期gt较小的时候, regularizer较大,能够放大梯度;后期gt较大的时候,regularizer较小,能够约束梯度;适合处理稀疏梯度。Adagrad不需要精调learning rate(一般设置为0.01即可)。

缺点:由公式可以看出,仍依赖于人工设置一个全局学习率η设置过大的话,会使regularizer过于敏感,对梯度的调节太大;中后期,分母上梯度平方的累加将会越来越大,使梯度趋于0,使得训练提前结束。

经验之谈:

1.对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值

2.SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠

3.如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。

4.AdadeltaRMSpropAdam是比较相近的算法,在相似的情况下表现差不多。

5.在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

牛顿法:思想:在现有极小点估计值的附近对f(x)做二阶泰勒展开,进而找到极小值点的下一个估计值;

f(x)xk附近的二阶泰勒展开。满足从而

牛顿法是采用其损失函数的二阶偏导数寻找更好的训练下降方向,所以它相比梯度下降只要更少的迭代次数就能下降到损失函数的极小值,因此函数收敛速度也会大幅度地加快。

 

优点:对于非二次函数,若函数的二次性态较强,或迭代点已进入极小点的邻域,则其收敛速度很快;缺点:是一个定步长迭代,对非二次型目标函数,函数值有时会上升,不能保证函数值稳定下降;计算量大。

拟牛顿法(DFPBFGSL-BFGS:求解非线性优化问题;不用二阶偏导数二构造出可近似Hessian矩阵的正定对称阵。

优缺点:无需选择学习率α,更快,但是更复杂

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页