【梯度下降法】详解优化算法之梯度下降法(原理、实现)

  • 本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!
  • ​个人主页:有梦想的程序星空
  • ​个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰富的软件系统、人工智能算法服务的研究和开发经验。
  • ​如果文章对你有帮助,欢迎关注点赞收藏订阅。

1、梯度下降法的介绍

梯度下降法(Gradient descent,简称GD)是一阶最优化算法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点,这个过程则被称为梯度上升法。

梯度下降法是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法和最小二乘法是最常采用的方法。在求解损失函数的最小值时,可以通过梯度下降法来迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种常用梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

【梯度下降法】详解优化算法之梯度下降法(原理、实现)_第1张图片

2、梯度下降法的原理

举例说明,将下山的人看作J(w),即表示目标函数,目的地是最低点。而中间如何到达最低点则是需要解决的问题。

【梯度下降法】详解优化算法之梯度下降法(原理、实现)_第2张图片

在当前位置求偏导,即梯度,正常的梯度方向类似于上山的方向,是使值函数增大的,下山最快需使J(w)最小,从负梯度求最小值,这就是梯度下降。梯度上升是直接求偏导,梯度下降则是梯度上升的负值。由于不知道怎么下山,于是需要走一步算一步,继续求解当前位置的偏导数。这样一步步的走下去,当走到了最低点,此时我们能得到一个近似最优解。

可以看出梯度下降有时得到的是局部最优解,如果损失函数是凸函数,梯度下降法得到的解就是全局最优解

【梯度下降法】详解优化算法之梯度下降法(原理、实现)_第3张图片

如果函数为一元函数,梯度就是该函数的导数:

\nabla f(x) = f'(x)

如果为二元函数,梯度定义为:

\nabla f({x_1},{x_2}) = \frac{​{\partial y}}{​{\partial {x_1}}}i + \frac{​{\partial y}}{​{\partial {x_2}}}j

梯度下降法公式:

{\theta _i} = {\theta _i} - \alpha \frac{​{\partial J({\theta _0},{\theta _1}, \cdots ,{\theta _n})}}{​{\partial {\theta _i}}}

求解步骤:

(1)确定当前位置的损失函数的梯度,对于{\theta _i},其梯度表达式为:

\frac{​{\partial J({\theta _0},{\theta _1}, \cdots ,{\theta _n})}}{​{\partial {\theta _i}}}

(2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即\alpha \frac{​{\partial J({\theta _0},{\theta _1}, \cdots ,{\theta _n})}}{​{\partial {\theta _i}}}

(3)确定是否所有的{\theta _i}梯度下降的距离都小于\varepsilon,如果小于\varepsilon则算法终止,当前所有的{\theta _i}

即为最终结果。否则进入第(4)步。

(4)更新所有的{\theta _i},更新表达式如下,更新完成后转入步骤(1):

{\theta _i} = {\theta _i} - \alpha \frac{​{\partial J({\theta _0},{\theta _1}, \cdots ,{\theta _n})}}{​{\partial {\theta _i}}}

【梯度下降法】详解优化算法之梯度下降法(原理、实现)_第4张图片

3、Python 代码实现

from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
X_train_sta = standardScaler.transform(X_train)
X_test_sta = standardScaler.transform(X_test)
sgd_reg = SGDRegressor(n_iter=100000)
sgd_reg.fit(X_train_sta,y_train)
sgd_reg.score(X_test_sta,y_test)
#0.7102320877365798

 4、几种常用的梯度下降法

 (1)全梯度下降算法(FG)

计算训练集所有样本误差,对其求和再取平均值作为目标函数。权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多。因为在执行每次更新时,需要在整个数据集上计算所有的梯度,所以速度会很慢,同时,其在整个训练数据集上计算损失函数关于参数θ的梯度:

\theta = \theta - \eta \cdot {\nabla _\theta }J(\theta )

(2)随机梯度下降算法(SG)

由于FG每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个设定的阈值。此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为:

\theta = \theta - \eta \cdot {\nabla _\theta }J(\theta ;{x^{(i)}};{y^{(i)}})

其中,{x^{(i)}}表示一条训练样本的特征值,{y^{(i)}}表示一条训练样本的标签值。

但是由于,SG每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。

(3)小批量梯度下降法

小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顾了以上两种方法的优点。每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重。被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理。特别的,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG。其迭代形式为:

\theta = \theta - \eta \cdot {\nabla _\theta }J(\theta ;{x^{(i:i + n)}};{y^{(i:i + n)}})

关注微信公众号【有梦想的程序星空】,了解软件系统和人工智能算法领域的前沿知识,让我们一起学习、一起进步吧!

你可能感兴趣的:(深入浅出讲解自然语言处理,机器学习,算法,机器学习,深度学习,概率论)