梯度下降法算法比较和进一步优化
常见的梯度下降算法有:
全梯度下降算法(Full gradient descent),随机梯度下降算法(Stochastic gradient descent),小批量梯度下降算法(Mini-batch gradient descent),随机平均梯度下降算法(Stochastic average gradient descent)
它们都是为了正确地调节权重向量,通过为每个权重计算一个梯度,从而更新权值,使目标函数尽可能最小化。其差别在于样本的使用方式不同。
我们通过一个数据集案例进行对比,查看他们的区别
1 算法比较
为了比对四种基本梯度下降算法的性能,我们通过一个逻辑二分类实验来说明。本文所用的Adult数据集来自UCI公共数据库(http://archive.ics.uci.edu/ml/datasets/Adult)。 数据集共有15081条记录,包括“性别”“年龄”“受教育情况”“每周工作时常”等14个特征,数据标记列显示“年薪是否大于50000美元”。我们将数据集的80%作为训练集,剩下的20%作为测试集,使用逻辑回归建立预测模型,根据数据点的14个特征预测其数据标记(收入情况)。
以下6幅图反映了模型优化过程中四种梯度算法的性能差异。
在图1和图2中,横坐标代表有效迭代次数,纵坐标代表平均损失函数值。图1反映了前25次有效迭代过程中平均损失函数值的变化情况,为了便于观察,图2放大了第10次到25次的迭代情况。
从图1中可以看到,四种梯度算法下,平均损失函数值随迭代次数的增加而减少。FG的迭代效率始终领先,能在较少的迭代次数下取得较低的平均损失函数值。FG与SAG的图像较平滑,这是因为这两种算法在进行梯度更新时都结合了之前的梯度;SG与mini-batch的图像曲折明显,这是因为这两种算法在每轮更新梯度时都随机抽取一个或若干样本进行计算,并没有考虑到之前的梯度。
从图2中可以看到**虽然四条折现的纵坐标虽然都趋近于0,但SG和FG较早,mini-batch最晚。**这说明如果想使用mini-batch获得最优参数,必须对其进行较其他三种梯度算法更多频次的迭代。
在图3,4,5,6中,横坐标表示时间,纵坐标表示平均损失函数值。
从图3中可以看出使用四种算法将平均损失函数值从0.7降到0.1最多只需要2.5s,由于本文程序在初始化梯度时将梯度设为了零,故前期的优化效果格外明显。其中SG在前期的表现最好,仅1.75s便将损失函值降到了0.1,虽然SG无法像FG那样达到线性收敛,但在处理大规模机器学习问题时,为了节约时间成本和存储成本,可在训练的一开始先使用SG,后期考虑到收敛性和精度可改用其他算法。
从图4,5,6可以看出,随着平均损失函数值的不断减小,SG的性能逐渐反超FG,FG的优化效率最慢,即达到相同平均损失函数值时FG所需要的时间最久。
综合分析六幅图我们得出以下结论:
(1**)FG方法由于它每轮更新都要使用全体数据集,故花费的时间成本最多,内存存储最大。**
(2)SAG在训练初期表现不佳,优化速度较慢。这是因为我们常将初始梯度设为0,而SAG每轮梯度更新都结合了上一轮梯度值。
(3)综合考虑迭代次数和运行时间,SG表现性能都很好,能在训练初期快速摆脱初始梯度值,快速将平均损失函数降到很低。但要注意,在使用SG方法时要慎重选择步长,否则容易错过最优解。
(4)mini-batch结合了SG的“胆大”和FG的“心细”,从6幅图像来看,它的表现也正好居于SG和FG二者之间。在目前的机器学习领域,mini-batch是使用最多的梯度下降算法,正是因为它避开了FG运算效率低成本大和SG收敛效果不稳定的缺点。
2 梯度下降优化算法
以下这些算法主要用于深度学习优化
动量法 其实动量法(SGD with monentum)就是SAG的姐妹版SAG是对过去K次的梯度求平均值SGD with monentum 是对过去所有的梯度求加权平均 Nesterov加速梯度下降法 类似于一个智能球,在重新遇到斜率上升时候,能够知道减速 Adagrad 让学习率使用参数对于出现次数较少的特征,我们对其采用更大的学习率,对于出现次数较多的特征,我们对其采用较小的学习率。 Adadelta Adadelta是Adagrad的一种扩展算法,以处理Adagrad学习速率单调递减的问题。 RMSProp 其结合了梯度平方的指数移动平均数来调节学习率的变化。能够在不稳定(Non-Stationary)的目标函数情况下进行很好地收敛。 Adam 结合AdaGrad和RMSProp两种优化算法的优点。是一种自适应的学习率算法
参考链接:[/google19890102/article/details/69942970]