梯度

梯度,什么是梯度?梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

在微积分里面,对多元函数的参数求

偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度

。比如函数

, 分别对

求偏导数,求得的梯度向量就是

,简称

或者

前面说到,梯度的方向就是函数值增加最快的方向。也就意味着,沿着梯度向量的方向,更加容易找到函数的最大值。反过来呢,沿着梯度向量相反的方向,函数值减少最快,也就是更加容易找到函数的最小值。

梯度下降

首先来看看梯度下降的一个直观的解释:比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。

所以说,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

批梯度下降BGD

批梯度下降(Batch Gradient Descent)是指每次迭代要利用全部数据计算批梯度。这样一来每迭代一步,都要用到训练集所有的数据,如果数据量很大,那么可想而知这种方法的迭代速度会很慢。所以,这就引入了另外一种方法,随机梯度下降。

随机梯度下降SGD

随机梯度下降(Stochastic Gradient Descent)每次迭代只用到了一个样本,在样本量很大的情况下,常见的情况是只用到了其中一部分样本数据即可迭代到最优解。因此随机梯度下降比批量梯度下降在计算量上会大大减少。SGD有一个缺点是,其噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。而且SGD因为每次都是使用一个样本进行迭代,因此最终求得的最优解往往不是全局最优解,而只是局部最优解。但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。

以多元线性回归为例

线性函数:

损失函数:

梯度:

更新规则:BGD:

SGD:

实例

python 图像的梯度图 python梯度函数_最优解

python解题代码

import

结果

python 图像的梯度图 python梯度函数_python 图像的梯度图_02

GD and SGD loss

python 图像的梯度图 python梯度函数_python sklearn 梯度下降法_03

左下角放大

bgd_w: [[2.8636951]
 [4.5708055]]
bgd predict_y: [[12.00530624 28.58141804 18.88928127 20.59639168]]
bgd_time: 0.114399 s
sgd_w: [[2.8795059]
 [4.519753 ]]
sgd predict_y: [[11.91901183 28.35777664 18.91728234 20.55752945]]
sgd_time: 0.06166 s

根据loss图像我们可以看到,BGD的loss是一直下降的,而SGD的loss虽然整体是下降的,但是中途有升有降。之所以不像网上的那么明显,应该是因为样本量太小。

在时间上,迭代1000次BGD花费0.114s,而SGD只花费了0.062s。

后记

如有问题,欢迎交流批评指正。

参考文献

梯度(数学名词)_百度百科baike.baidu.com

python 图像的梯度图 python梯度函数_线性回归梯度下降法python_04

梯度下降(Gradient Descent)小结

python 图像的梯度图 python梯度函数_迭代_05