0x00 内容
梯度下降:实现梯度下降、线性回归中的梯度下降
随机梯度下降:相关代码即调用
0x01 梯度下降法(回顾四:0x04 梯度下降法)
最小二乘法求损失函数的最小值,但是这只是一个特例。大多数复杂复杂情况下,损失函数就需要用到“梯度算法”。
从损失值出发,去更新参数,且要大幅降低计算次数。
多元函数的导数(derivative)就是梯度(gradient),分别对每个变量进行微分,然后用逗号分割开,梯度是用括号包括起来,说明梯度其实一个向量。
解决局部最低点方案,:首先随机产生多个初始参数集,然后分别对每个初始参数集使用梯度下降法,直到函数值收敛于某个值,最后从这些值中找出最小值,这个找到的最小值被当作函数的最小值。
0x02 梯度下降之前需要使用归一化(回顾四:0x05)
真实数据整体不在一个规模上,解决的方式,就是在梯度下降之前进行数据归一化。
0x03 速度更快的随机梯度下降法
批量梯度下降法BGD(Batch Gradient Descent):每次更新参数时计算所有样本,通过对数据集所有样本的计算来求解梯度的方向。这种方法在数据量很大时计算的时间成本很高。
随机梯度下降法SGD(stochastic gradient descent):每次迭代使用一个样本来对参数进行更新。虽然不是每次迭代得到的损失函数都向着全局最优方向,但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。(相比于批量梯度,这样的方法更快,结果也是可以接受的。)
3.1 随机取值的公式推导
从数学的角度来看:将批量梯度下降损失函数(J(θ)=MSE(y,y^))求导后矩阵,乘以m。(样本数量求和这一操作去掉)得:
注意,得到的向量是搜索方向,不是梯度方向,因此已经不算是函数的梯度了。
3.2 随机下降与学习率的取值
随机梯度下降过程就是:每次随机取出一个i,得到一个向量,沿着这个随机产生的向量的方向进行搜索,不停的迭代,得到的损失函数的最小值。
批量搜索,那么每次都是沿着一个方向前进;随机梯度下降法则不能保证随机选择的方向是损失函数减小的方向(更不能保证一定是减小速度最快的方向),所以搜索路径会呈现随机特性。即随机梯度下降有着不可预知性。
随机梯度下降法的过程中,学习率η是逐渐递减。因为如果学习率取一个固定值,可能会导致已经在最小值附近的点θ,由于固定步长(点θ的取值)跳出这个点的范围。
设计一个函数,使学习率η随着下降循环次数的增加而减小。(分子变为常数t0,并在分母上增加一个常数项t1缓解初始情况下,学习率变化太大的情况,且更灵活。)η=t0/(Ii ter+t1)
0x04 BGD&SGD效果比较
梯度下降算法主要比较运行时间和迭代次数这两个指标。
不同:
1.表达式为:X_b_i.T.dot(X_b_i.dot(theta) - y_i) * 2(传递的不是整个矩阵Xb和整个向量y,而是其中一行X_b_i、其中的一个数值y_i)
2.内置学习率:η=t0/(Ii ter+t1)
3.终止循环条件:循环次数达到上限
代码中随机梯度下降,只使用1/3。并且随机梯度下降中只考虑的1/3的样本量,且得到的结果一定达到了局部最小值的范围内。
批量梯度下降法BGD(Batch Gradient Descent)
优点:全局最优解;易于并行实现;
缺点:当样本数据很多时,计算量开销大,计算速度慢。
随机梯度下降法SGD(stochastic gradient descent)
(每次迭代使用一个样本来对参数进行更新)
优点:计算速度快;
缺点:收敛性能不好 。
0x05
梯度下降另外一种调试方式
一种简单的方法,能够对梯度下降法中求梯度的公式推导进行调试。
以一维为例,求某一点(红色)相应的梯度值(导数),就是曲线在这个点上切线的斜率。可以使用距离该点左右两侧的两个蓝色点的连线的斜率,作为红点处切线斜率。
从数学上来看比较直观,每个维度上都要求两次带入,因此时间复杂度变高了。作为一个调试的手段,在还未完成时,可以使用小数据量,进行计算,得到最终结果。(然后再通过推导公式的方式得到的梯度结果,是否和其相同。)在求梯度的时候,可以用这种通用的debug方式先在小数据集上对求导公式进行检验。
0xFF 总结
批量梯度下降法BGD(Batch Gradient Descent),每次对所有样本都看一遍,缺点是慢,缺点是稳定。
随机梯度下降法SGD(stochastic gradient descent),每次随机看一个,优点是快,缺点是不稳定。
小批量梯度下降法 MBGD(Mini-Batch Gradient Descent),优点:减少了计算的开销量,降低了随机性。(在每次更新时用b个样本,其实批量的梯度下降就是一种折中的方法,用一些小样本来近似全部。)
代码相关:
1.Jupyter中使用IPython的魔法(Magic)命令“%%time”表示代码块用时,必须首行。
参考阅读:
1.《还不了解梯度下降法?看完这篇就懂了!》(回顾四)
2.《手动实现梯度下降(可视化)》 (回顾四)
3.《线性回归中的梯度下降》 (回顾四)