梯度下降
在第二篇博客中已经简单介绍过梯度下降算法,梯度下降算法是机器学习领域最广为人知、用途最广的优化算法,用来确定模型的参数(包括随机梯度下降SGD,Momentum,Adam等)。首先回顾一下梯度下降的计算过程:
梯度下降中常用技巧(Tips)
一、调整学习率
如上图左边部分所示,假设我们的loss曲线是图中黑色曲线,从曲线左边端点作为起始点,使用不同的学习率进行参数的更新(学习率可以理解为参数更新的幅度/或者每次前进的步长),蓝色线——红色线——绿色线——黄色线 的学习率依次增大,可以看到蓝色线学习率较小,更新较为缓慢,但是经过足够次数的迭代更新之后,仍能到达全局最优点(loss曲线最小处);红色线的学习率恰好合适,经过比较少次数的更新,就可以到达全局最优点;绿色线的学习率设置的比较大,在更新过程中会错过全局最优点,最终的结果是在全局最优点的两边震荡;黄色线的学习率设置的过大,更新参数之后导致loss剧增。
所以,我们可以根据Loss曲线的变化情况,对我们的学习率进行一个合理的调整。可以绘制上图右边部分所示的曲线图,横轴代表参数更新次数,纵轴代表Loss值,学习率的大小分为四种情况:
1、学习率较小(蓝色曲线):Loss值以一个缓慢的速度下降,不过最终仍然可以到达全局最优点。
2、学习率恰好合适(红色曲线):Loss值下降较快,比较少的更新次数就可以达到全局最优点。
3、学习率较大(绿色曲线):Loss值开始下降比较快,不过最终Loss值会保持在一个比较大的位置,没有到达全局最优点。
4、学习率过大(黄色曲线):Loss值有一个剧增的趋势。
根据绘制出的 Loss-No. of parameters updates曲线,我们可以知道学习率的设置情况,并且进行相应的调整。
在学习率的设置过程中,常见的做法是,进行学习率的衰减。
在模型训练初期,距离全局最优点较远,可以设置一个相对大一些的学习率,随着训练的进行,距离全局最优点的距离越来越小,此时应该减小学习率;所以让学习率随着时间或者更新的次数进行衰减。
除了学习率的衰减之外,另外一个做法是:为不同的参数设置不同的学习率。也就是接下来要介绍的一种优化算法AdaGrad。
AdaGrad优化器
AdaGrad根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题,即为每个参数设置不同的学习率。
原始的梯度下降,所有参数的学习率是一样的,均为。在AdaGrad中,学习率的变化过程为
,其中
是参数相关的,其值为该参数之前所有偏导数的均方根。具体的计算过程如上图右边部分所示。化简之后,得到最终的计算形式为:
这里需要注意的一点为:
如果我们计算得到的较大,在原始的梯度下降中,代表建议参数更新的幅度比较大;但是在AdaGrad中,
较大,分母项会变小,代表分母建议参数更新的幅度较小,而分子建议更新的幅度较大,最终的更新幅度由两者的比值共同确定。这样做的一个原因是:
假设损失函数为一元二次函数:
该损失函数在处取得最小值,假设当前处于
处,那么最好的步长应该为
,也就是
。
而在AdaGrad中,正是这一思想的体现,不过为了减少计算量,增加运算速度,AdaGrad中使用过去一阶偏导数的均方根作为分母项(二阶偏导数)的近似。
过去一阶偏导数的均方根可以在一定程度上反应二阶偏导的大小情况。如上图所示,二阶偏导小的函数,其采样的一阶偏导的值也相对较小。
二、随机梯度下降(SGD)
之前梯度下降算法中,Loss函数是对所有训练样本的Loss之和,而在随机梯度下降中,每次只采样一个样本,根据这一个样本进行一次梯度下降,所以随机梯度下降算法更新参数的过程更快。
三、特征缩放(Feature Scaling)
特征缩放是用来标准化数据特征的范围,减少特征中特异值的影响。
例如:
特征的取值范围[1,10],特征
的取值范围[100,1000],那么损失函数L对于参数
的更新更为敏感,反映到图中,就是在Loss等高线沿
的方向更加密集(陡峭),上图左边部分所示。我们更加希望得到像右图所示的Loss等高线。因为对于左边的情况,不同的参数需要设置不同的学习率,才能很好的完成模型训练过程;对于右图,如果Loss等高线是一个正圆形,沿着等高线下降的方向,就是我们最终想要的优化结果。所以特征缩放可以帮我们得到右图所示的情况。
常用的特征缩放的方式:
归一化:(min-max normalization;缩放到[0,1]之间})
标准化:(Standardization)
其中表示均值,
表示标准差。