梳理大纲: 最优化方法:梯度下降
【1】梯度下降
【2】随机梯度下降参考资料:
机器学习 西瓜书
以下微信文章 From【木东居士】 公众号From 机器学习 小组:由【木东居士】公众号 定期发起
对数据感兴趣的伙伴们 可一同在此交流学习
【1】梯度下降
梯度的理解:
多元函数的导数(derivative)就是梯度(gradient),分别对每个变量进行微分,然后用逗号分割开,梯度是用括号包括起来,说明梯度其实一个向量,我们说损失函数L的梯度为:
梯度的作用:
在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
梯度指向误差值增加最快的方向,导数为0(梯度为0向量)的点,就是优化问题的解。
梯度下降算法
超参数:学习率η
是模型训练时的一个很重要的超参数,能直接影响算法的正确性和效率
注意【1】:首先,学习率不能太大。因此从数学角度上来说,一阶泰勒公式只是一个近似的公式,只有在学习率很小,也就是很小时才成立。并且从直观上来说,如果学习率太大,那么有可能会“迈过”最低点,从而发生“摇摆”的现象(不收敛),无法得到最低点
注意【2】:其次,学习率又不能太小。如果太小,会导致每次迭代时,参数几乎不变化,收敛学习速度变慢,使得算法的效率降低,需要很长时间才能达到最低点。
超参数:初始位置
梯度算法,从理论上,它只能保证达到局部最低点,而非全局最低点。
在很多复杂函数中有很多极小值点,我们使用梯度下降法只能得到局部最优解,而不能得到全局最优解。那么对应的解决方案如下:首先随机产生多个初始参数集,即多组;然后分别对每个初始参数集使用梯度下降法,直到函数值收敛于某个值;最后从这些值中找出最小值,这个找到的最小值被当作函数的最小值。当然这种方式不一定能找到全局最优解,但是起码能找到较好的。
所以,对于梯度下降来说,初始点的位置,也是一个超参数。
线性回归中的梯度下降
(以下解释图 转自【数据科学家联盟】公众号,自己也手写了一遍,还是觉得文章本身写的比较好,直接贴上)
【2】随机梯度下降
批量梯度下降法BGD(Batch Gradient Descent)在数据量很大时需要计算很久
所以引入了 随机梯度下降法SGD(stochastic gradient descent)
随机梯度下降:
每次迭代使用一个样本来对参数进行更新。虽然不是每次迭代得到的损失函数都向着全局最优方向,但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。
(每次迭代随机选取一个样本来对参数进行更新。使得训练速度加快)
对得到的损失函数进行求导,结果为:
(注意,得到的向量是搜索方向,不是梯度方向,因此已经不是算是函数的梯度了)
随机梯度下降的示意图
实验结论告诉我们,通过随机梯度下降法,依然能够达到最小值的附近(用精度换速度)
随机梯度下降法的过程中,学习率η的取值很重要,这是因为如果学习率一直取一个固定值,所以可能会导致点已经取到最小值附近了,但是固定的步长导致点的取值又跳去了这个点的范围。
因此在随机梯度下降法中,学习率是逐渐递减的
sklearn中的SGD
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor() # 默认n_iter=5
%time sgd_reg.fit(X_train_std, y_train)
sgd_reg.score(X_test_std, y_test)
对比 批量梯度下降法 和 随机梯度下降法
批量梯度下降法BGD(Batch Gradient Descent):
优点:全局最优解;易于并行实现
缺点:当样本数据很多时,计算量开销大,计算速度慢
随机梯度下降法SGD(stochastic gradient descent)
随机梯度下降是每次迭代使用一个样本来对参数进行更新
优点:计算速度快
缺点:收敛性能不好
——————————————————————————————————————————————
(近期工作过忙,自己已经理解了一遍,先把初步内容附上,之后回来再整理一遍思路,进一步完善)