来源:
梯度下降法分析;
深入浅出--梯度下降法及其实现;
梯度下降法的分析和改进.
作者:
过客冲冲;
六尺帐篷;
郭跃东,宋旭东.
链接:
https://www.cnblogs.com/jcchen1987/p/4441743.html
https://www.jianshu.com/p/c7e642877b0e http://www.cnki.com.cn/Article/CJFDTotal-KJZW201615104.htm
注:这篇文章是对网上资料的一些归纳总结
一、梯度下降法简介
梯度下降法是一种基于搜索的最优化方法,在机器学习领域,它的作用是最小化一个损失函数。梯度下降法的核心公式为:θ_1 = θ_0 - α▽J(θ_0),其中θ_0为初始值;θ_1是θ_0经过一次梯度下降后得到的结果;▽J(θ_0)是损失函数J在点θ_0处的梯度,它代表着损失函数增大,并且增大速度最快的方向;α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,α不能太大也不能太小,太小的话,会使损失函数J的值下降过慢,从而影响计算速度;太大的话,会导致其错过最低点。这篇文章将重点对α的选取进行探讨。
θ_0 - α▽J(θ_0)可以描述为,让θ_0沿着▽J(θ_0)的反方向移动α▽J(θ_0)这么多距离。我们可以在二维平面将这个过程可视化。
如图1与图2所示。图中theta_0,theta_1以及min表示的是横坐标。theta_1通过theta_0 - α▽J(theta_0)得到的结果,我们可以看到,theta_1对应的函数值在减小。min是损失函数J取最小值时对应的theta值。
图1 函数概览图
图2 函数局部放大图
再将theta_1作为初始值,通过theta_1 - α▽J(theta_1)计算出下一个theta值,如此循环往复,我们最终可以找到逼近min的theta值,从而近似地求出损失函数的最小值。整个过程如图3所示。
图3 梯度下降法
二、关于学习率的一些探讨
正如上一小节所说,学习率的选取很重要。学习率过小会使得算法速率下降。如下面的两幅图所示,图4的学习率为α,该值为合适的学习率,与之对应的是图5的学习率为0.1α。我们可以很直观地看出,直到收敛为止,图5所用的步数远远大于图4。
图4 学习率为α的梯度下降过程
图5 学习率为0.1α的梯度下降过程
而当学习率选取过大时,又会造成算法不收敛,从而得不到正确的结果。图6可以直观地感受到学习率选取过大时造成的后果,损失函数J的值没有随着theta的变化而减小,反而越来越大。
图6 学习率过大的梯度下降过程
所以在这里我们可以思考,如何能够找到最合适的学习率,使得算法在保证收敛的前提下,能够获得最快的收敛速度?
三、获取合适学习率的一些方法
主要的方法有手动测试、固定步进、步长衰减与自适应步长。
手动测试,这种方法需要手动进行多次实验,不停调整参数,观测实验效果,最终来确定出一个最优的学习率。一种常用的评价方法是观察代价函数(对线性回归而言)的变化趋势,如果迭代结束后,代价函数还在不停减少,则说明学习率过小;若代价函数呈现出振荡现象,则说明学习率过大。如此多次调整可得到较合理的学习率。该方法给出的学习率对于这组训练样本而言是相对较优的,但换一组样本,则需要重新实验来调整参数。这种方法的缺点也很明显,费时费力。
固定步进是一个非常保险的方法,但需要舍弃较多的时间资源。既然梯度下降法只给出方向,那么我们就沿着这个方向走固定路程,即将梯度下降迭代公式修改为:θ_1 = θ_0 - αsign(▽J(θ_0))。其中的sign是符号函数,学习率α取可容许的最小误差,这样的迭代方式可以保证下降过程必然不会跨过最终点,但需要耗费更多次迭代。
步长衰减主要考虑到越接近终点,每一步越需要谨慎,所以越接近终点,步长应该越小。减小步长的方法主要有以下几种,1.固定衰减,比如每次迭代后,步长衰减为前一次的某个比例。2.选择性衰减,根据迭代状态来确定本次是否衰减,可以根据梯度或代价函数的情况来确定。比如,若此次迭代后代价函数增加了,则说明上次迭代步长过大,需要减小步长,否则保持不变,这么做的一个缺点是需要不停计算代价函数,训练样本过多可能会大大增加耗时;也可以根据梯度变化情况来判断,我们知道我们的终点是梯度为0的地方,若本次迭代后的梯度与前一次的梯度方向相反,则说明跨过了终点,需要减小步长。显然,采用步长衰减的方式,同样也依赖于初始步长,否则可能不收敛。当然其相对于固定步长,则会更具稳定性。
自适应步长的思想来源于步长衰减。在每次迭代,按照如下步骤来计算步长。1.设置一个较大的初始步长值;2.计算若以此步长移动后的梯度;3.判断移动前后梯度方向是否会改变,若有改变,将步长减半,再进行第1步;否则,以此步长为本次迭代的步长。
四、实验
实验内容是使用梯度下降法来实现线性回归,在梯度下降法中使用自适应步长方法,并测试其性能。实验所用编程语言是python 3。
1.构建模拟数据
图7 模拟数据
2.构造损失函数
设yi_predict为第i个样本的预测值,yi为第i个样本的真实值,m为样本数量,则线性模型的损失函数为:,其中yi_predict = xi * w + b,也可以写为:
,
令,代入损失函数。
则损失函数可写为:
由此公式编码如如图8所示。
图8 构造损失函数的代码
3.求损失函数的梯度
一元线性回归模型中损失函数的梯度可写为:
,其中x1i为第i个样本的第一个特征值, 因为本次实验的样本只有一个特征w,所以x1i可以表示为xi。
将上述公式向量化,即令,则可将梯度求解公式写为:
由此公式编码由图9所示。
图9 构造损失函数梯度的代码
4.自适应步长
自适应步长的算法流程上面已经提过,如下两幅图是自适应步长的算法流程图(图10)以及根据流程图得出的代码(图11)。
图10 自适应步长的算法流程图
图11 自适应步长的代码
5.使用梯度下降法
如下两幅图是梯度下降法的算法流程图(图12)以及根据流程图得出的代码(图13)。
图12 梯度下降法算法流程图
图13 梯度下降法代码
6.结果展示
最终用求得的theta值得到如下结果
图14 结果图
7.关于自适应步长算法的分析
观察在使用自适应步长算法后,初始步长的取值与梯度下降法的步数(循环次数)之间的关系。如图15所示,我们可以看到随着学习率的增大,步数在93至206之间震荡。
图15 初始学习率与步数的关系
回到第二部分中提出的问题,即如何能够找到最合适的步长,使得算法在保证收敛的前提下,能够获得最快的收敛速度?
在这里,已经可以不用考虑算法会因为学习率设置得过大而不收敛这个问题。我们可以将问题聚焦到,什么样的学习率能够使算法获得最快的收敛速度?
在这个实验中,步数最小值为93,对应的学习率为,其中n为整数。
五、总结
这篇文章简单介绍了梯度下降法,并使用梯度下降法解决了简单的线性回归问题。重点讨论了梯度下降法中学习率的设置问题。
关于 天 方 夜 “谈”
天方夜谈原意讲不切实际的东西,而这里想要 “脚踏实地”真正弄懂并感受一篇文章的思想。
方班人有自己的浪漫,
我们探讨知识,谈论理想,
采摘科研的繁星,
脚下是星辰大海。
天:代表我们的理想犹如天空般浩荡
方:代表方班
夜:代表代码人的冷静与静谧
谈:代表方班愿与您,就领域内的经典思想和前沿成果“秉烛夜谈”