|
一、AdaGrad
AdaGrad,全称Adaptive Gradient,又叫自适应梯度算法,是一种具有自适应学习率的梯度下降优化方式。
1.1 提出布景
AdaGrad是基于随机梯度下降进行改良后的优化算法。在随机梯度下降或小批量随机梯度下降中,我们所使用的权重迭代公式如下所示:
假设此刻有两个参数 \omega_1 和 \omega_2 ,则:
不难发现,所有参数在迭代时所使用的学习率是一致的,因此我们通过学习率在\omega_1 和 \omega_2的迭代过程中施加的影响和控制是相似的。在实际迭代时,完全可能呈现两个权重的梯度值有较大差异的情况,同样的学习率会导致整体迭代标的目的向更大梯度的标的目的“偏移”,梯度更大的标的目的会迭代得更快、更不不变、甚至形成震荡,而梯度较小的标的目的会迭代得过慢、对整体标的目的的影响过小。凡是来说,为了避免优化算法向某个梯度较大的标的目的发散并让整个迭代标的目的都”跑偏”,我们会将学习率 控制在一个很小的范围内,但是这样做又会让梯度本来就较小的标的目的迭代迟缓,因此需要为分歧的参数设置分歧的学习率才能斗劲好的进行训练,但是这个事情又不能很好地被酬报操作。凡是的原则是为大的梯度设置小的学习率,减缓大值的更新速度,为小梯度设置大的学习率,加快更新速度。
1.2 数学过程
AdaGrad的更新公式为:
此中 G_t 是历史梯度值平方的累加,公式为:
\epsilon 是用来防止分母为0的超参数。在这个公式下,历史梯度越大的特征 G_t 会越大,因此历史梯度越大的特征的学习率会下降越快。
1.3 优错误谬误
长处
① 避免手动去调整学习率
② 他可以自动的为每个参数单独设置学习率,这样梯度较大的参数学习率较小,更新减慢,梯度较小的参数学习率较大,更新加速。在梯度图上可以解释为更为平缓的标的目的,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小) 错误谬误
① 由于学习率分母中的 G_t 是历史梯度值平方的累加,因此随着迭代次数的增加,分母会越来越大,学习率衰减的速度会越来越快,学习率会越来越小甚至接近于0,因此AdaGrad迭代后期的学习率非常小,而非常容易呈现梯度消掉现象。 二、Momentum
2.1 提出布景
对梯度下降来说,如果在很长一段时间内,起始点一直向相似的标的目的移 动,那按照步长一小步一小步地磨着向前是没有意义的,既浪费计算资源又浪费时间,此时就应该斗胆地朝着这个标的目的走一大步。相对的,如果很长时间都走向同一个标的目的,俄然让我们转向,那转向的第一步就应该非常谨慎,走一小步。相当于每次在进行参数更新的时候,城市将之前的标的目的考虑进来,每个参数在各标的目的上的移动幅度不仅取决于当前的梯度,还取决于过去各个梯度在各个标的目的上是否一致,如果一个梯度一直沿着当前标的目的进行更新,那么每次更新的幅度就越来越大,如果一个梯度在一个标的目的上不竭变化,那么其更新幅度就会被衰减, 因此需要有一种能够减缓梯度震荡、加速迭代的方式。
如下图,在程度标的目的上梯度一直向右,在竖直标的目的上的梯度一直来会震动,所以我们要做的就是加速程度标的目的收敛的速度,减缓竖直标的目的的震动。
2.2 数学过程
基本思想是:在历史标的目的与现有标的目的不异的情况下,迈出大步子,在历史标的目的与现有 标的目的相反的情况下,迈出小步子。
借鉴指数平均的思想,让上一步的梯度向量与此刻这一点的梯度向量以加权的方式求和,求解出受到上一步大小和标的目的影响的真实下降标的目的,再让坐标点向真实下降标的目的移动。在坐标轴上,可以暗示为:
首先构造表征包含历史梯度的参数 m_t ,计算如下:
此中,参数 \beta 为动量因子。然后按照 m_t 的标的目的与大小进行参数更新:
2.3 优错误谬误
长处
① 在梯度标的目的改变时,momentum能够降低参数更新速度,从而减少震荡;
② 在梯度标的目的不异时,momentum可以加速参数更新, 从而加速收敛。
③ 总而言之,momentum能够加速SGD收敛,按捺震荡。 错误谬误
① 每一次迭代时,不能动态改变学习率
② 动量因子的取值对成果有必然的影响 三、RMSprop
3.1 提出布景
RMSprop全称为Root Mean Square Propogation。前文已经说了AdaGrad算法有一个致命缺陷,就是在迭代后期的学习率非常小,而非常容易呈现梯度消掉现象。RMSprop就是用来解决这个问题的。
3.2 数学过程
RMSprop将动量的思想引入到AdaGrad中,确切地说:RMSprop=动量+AdaGrad。在AdaGrad中,学习率分母 G_t 为是历史梯度的平方和,会无限增大,我们采用动量的思想,对其作如下改削:
然后更新参数:
3.3 优错误谬误
长处
① 克服了AdaGrad中,梯度消掉的问题 错误谬误
② 加权平均的使用可能导致学习率不衰减、反而增大。设想一下,当 \beta=0.95,如果这一次迭代中梯度平方的1/20小于 V_{t-1} 的1/20,那 V_t 将比本来的 V_{t-1} 更小,在模型训练的过程中,学习率俄然增大,可能会造成非常严重的后果,例如:模型无法收敛、得到糟糕的成果等。 四、Adam
4.1 提出布景
RMSprop是在改善AdaGrad的基础上诞生,而且将动量法的思想与AdaGrad结合,获得了很好的效果。 RMSprop只在学习率中应用了动量的思想,那能不能像原始Momentum方式一样,在梯度中应用动量方式呢?这样在参数更新的过程中,不仅学习率考虑了历史学习率的影响,梯度也考虑到历史梯度的影响。
4.2 数学过程
受到上面思路的启发,将动量思想引入到RMSprop的梯度中,因此Adam=RMSprop+动量。注意:这里的动量和RMSprop的动量应用位置分歧,一个是梯度,一个是学习率。
更新公式如下:
4.3 偏差修正
到此刻为止,算法仍存在一个十分致命的问题。这个问题是指数平均法的通用问题,就是存在迭代开始时估计偏差较大的缺陷。怎么理解这个问题?
设动量因子为0.9,那么对于任意 V_t ,他有90%都是来自于上次迭代中的 V_{t-1} ,在优化算法中,我们几乎总是会将 V_0 和 G_0 这些初始值设置为0,所以 V_1 无论如何都是一个很小的数,这可能导致迭代在一开始就很迟缓,而且这种情况会持续很多轮迭代,直到 V_{t-1} 足够大为止,必然会消耗掉大量的时间。为了解决这个问题,对 V_t 和 G_t 做一个“偏差修正”(bias correction),即在每一次采用指数平均迭代后都对他们分袂除以一个小于1的数,这样他们城市增大,但是随着迭代次数的增加指数平均本身迭代的值就会越来越接近真实值,所以随着迭代次数的增加,这个除数应该也要变换,除以的这个数应该越来越接近1,这样才能保证迭代后期基本没有缩放。公式如下
可以看出,由于动量因子 \beta 是小于1的,随着迭代次数t的增加, \beta^t 会越来越接近于0,分母会越来越接近于1,正好满足了以上思想。
五、AmsGrad
5.1 提出布景
通过上面分析,可知RMSprop有一个错误谬误是可能导致学习率上升的问题,这也导致了RMSprop和基于RMSprop的算法们(包罗Adam)城市存在类似问题,这个问题会导致这些算法无法收敛,为了解决这个问题AmsGrad被提出来了。
5.2 数学过程
它与Adam在理论上的区别仅仅在于,在实际迭代参数前,要选择 G_t 与 G_{t-1} 中较大的一个用于学习率衰减。由于每次迭代前都做出斗劲,因此这一次被用于衰减学习率的必然是过去次衰减中最大的 。这样做可以在保证Adam 原始特点的情况下,确保学习率是减小的,解决了上述问题。
六、优化算法的选择
在众多优化算法中,我们应该如何选择呢?凡是在我们本身使用的时候,首先先尝尝看Adam和RMSprop的效果,如果这两个算法效果不够好,则先测验考试调整算法的参数。只有在Adam和RMSprop展现出糟糕成果的时候,我们才会转向其他的优化算法。在2020年发表的论文《A Comparison of Optimization Algorithms for Deep Learning》(优化算法在深度学习上的斗劲)中,作者对优化算法在深度学习上的应用做出了全面的评估,并测试了10种优化算法的效果。我们可以不雅察看一下作者所做的尝试成果:
可以看出,除了普通梯度下降和AdaGrad劣势明显之外,大部门的算法都能够达到一个较低的loss,但基于分歧的数据的情况,分歧算法可能展现出5%摆布的区别。Adam和RMSprop为代表的衰减学习率的优化算法得到的分数基本都在前列,无论是Kaggle上的数据集、人脸数据集还是CIFAR10,学习率衰减的算法们都表示良好。普通梯度下降中能够有较好表示的是Nesterov梯度下降,如果你遇见了Adam和RMSprop效果不佳的情况,那你则可以选择使用NesterovSGD。在PyTorch中,我们可以使用SGD傍边的参数,Nesterov = True来调用这个算法。
torch.optim.SGD(
params,
lr=<required parameter>,
momentum=0,
dampening=0,
weight_decay=0,
nesterov=False,
*,
maximize=False,
foreach: Union[bool, NoneType] = None,
) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|