【机器学习】最优化方法:梯度下降法

1. 概念

梯度下降法(Gradient Descent)又称最速下降法(Steepest descent)是一种常用的一阶优化方法,是一种用于求解无约束最优化问题的最常用的方法。它选取适当的初始值{x^{\left( 0 \right)}},并不断向负梯度方向迭代更新x,实现目标函数的极小化,直到收敛。

2. 梯度下降的直观解释

以下山法作为类别,我们想要从山的某个位置下山,但我们并不知道山脚的位置,只能走一步算一步。从当前位置出发,往当前位置的负梯度方向走一步,即往最陡峭的方向往下走一步。然后继续求解当前位置的梯度,往负梯度方向走一步。不停走下去,一直走到我们认为已经到了山脚的位置。当然,也有可能,我们没办法到山脚,而是到了一个小山丘底部。

【机器学习】最优化方法:梯度下降法_第1张图片

当目标函数是凸函数的时候,梯度下降法可以确保找到全局最优解;否则不一定能找到全局最优解,可能会陷入局部最优解。

3. 梯度下降法的原理

考虑最优化问题\min {}_xf\left( x \right),其中f\left( x \right)具有一阶连续偏导数。若第k次迭代值为{x^{\left( k \right)}},对f\left( x \right){x^{\left( k \right)}}处进行一阶泰勒展开:

                                    f\left( x \right) = f\left( {{x^{\left( k \right)}}} \right) + \left( {x - {x^{\left( k \right)}}} \right)\nabla f\left( {{x^{\left( k \right)}}} \right)             (1)

【机器学习】最优化方法:梯度下降法_第2张图片

凸函数f(\theta)的某一小段[\theta_0,\theta]由上图黑色曲线表示,可以利用线性近似的思想求出f(\theta)的值,如上图红色直线。该直线的斜率等于f(\theta)\theta_0处的导数。则根据直线方程,很容易得到f(\theta)的近似表达式为:

               f\left( \theta \right) = f\left( {{\theta _0}} \right) + \left( {\theta - {\theta _0}} \right) \cdot \nabla f\left( {{\theta _0}} \right)

这就是一阶泰勒展开式的推导过程,主要利用的数学思想就是曲线函数的线性拟合近似

其中,x - {x^{\left( k \right)}}是微小矢量,大小是步长\alpha,类比于下山过程中的一步。\alpha是标量,x - {x^{\left( k \right)}}的单位向量用v表示,则x - {x^{\left( k \right)}}可以表示为:

                                                      x - {x^{\left( k \right)}} = \alpha v           (2)

此时,(1)可以化为:

                                             f\left( x \right) = f\left( {{x^{\left( k \right)}}} \right) + \alpha v\nabla f\left( {{x^{\left( k \right)}}} \right)           (3)

我们希望每次迭代,都能使f\left( x \right)变小,也就是说希望有:

                                             f\left( x \right) - f\left( {{x^{\left( k \right)}}} \right) = \alpha v\nabla f\left( {{x^{\left( k \right)}}} \right) < 0           (4)

由于\alpha是标量,且一般设定为正值,因此\alpha可以忽略。由于v\nabla f\left( {{x^{\left( k \right)}}} \right)都是向量,根据向量的乘积公式可以将(4)转换为:

                                    v\nabla f\left( {{x^{\left( k \right)}}} \right) = \left\| v \right\| \cdot \left\| {f\left( {{x^{\left( k \right)}}} \right)} \right\|\cos \left( {v,f\left( {{x^{\left( k \right)}}} \right)} \right) < 0           (5)

v\nabla f\left( {{x^{\left( k \right)}}} \right)反向时,\cos \left( {v,f\left( {{x^{\left( k \right)}}} \right)} \right) = - 1,可以使得\alpha v\nabla f\left( {{x^{\left( k \right)}}} \right)最小,且为负。即v的方向是使局部的目标函数下降最快的方向。得到v为:

                                                      v = - \frac{{\nabla f\left( {{x^{\left( k \right)}}} \right)}}{{\left\| { \nabla f\left( {{x^{\left( k \right)}}} \right)} \right\|}}          (6)

以上解释了为什么局部下降最快的方向就是梯度的负方向。

将(6)中的最优解v代入(2)中,得到x的更新表达式为:

                                             x - {x^{\left( k \right)}} = - \alpha \frac{{ \nabla f\left( {{x^{\left( k \right)}}} \right)}}{{\left\| {\nabla f\left( {{x^{\left( k \right)}}} \right)} \right\|}}          (7)

由于\left\| {f\left( {{x^{\left( k \right)}}} \right)} \right\|是标量,可以吸收入\theta里面,梯度下降算法的更新表达式就变成了:

                                             x - {x^{\left( k \right)}} = - \alpha \nabla f\left( {{x^{ \left( k \right)}}} \right)          (8)

以上就是梯度下降算法公式的数学推导过程。

4. 算法描述

输入:目标函数f\left( x \right)、梯度函数\nabla f\left( x \right),计算精度\varepsilon

输出:f\left( x \right)的极小点{x^*}

(1)初始化相关参数。取初始值{x^{\left( 0 \right)}} \in {R^n},置迭代次数k=0.

(2)计算当前位置的目标函数f\left( {{x^{\left( 0 \right)}}} \right)

(3)计算当前位置的目标函数的梯度\nabla f\left( {{x^{\left( k \right)}}} \right)如果\left\| {\nabla f\left( {{x^{\left( k \right)}}} \right)} \right\| < \varepsilon,则迭代结束,{x^*} = {x^{\left( k \right)}}。否则,继续往下走。

(4)更新x{x^{\left( {k + 1} \right)}} = {x^{\left( k \right)}} - \alpha \nabla f\left( {{x^{\left( k \right)}}} \right),如果\left\| {{x^{\left( {k + 1} \right)}} - {x^{\left( k \right)}}} \right\| < \varepsilon或者\left\| {f\left( {{x^{\left( {k + 1} \right)}}} \right) - f\left( {{x^{\left( k \right)}}} \right)} \right\| < \varepsilon,则停止迭代,令{x^*} = {x^{\left( {k + 1} \right)}}。否则,将迭代次数置为k = k + 1,转到(3)继续迭代。

在机器学习中,目标函数f\left( x \right)实际上就是代价函数J\left( \theta \right)

5. 梯度下降法种类

5.1 批量梯度下降法(Batch Gradient Descent,BGD)

批量梯度下降法是梯度下降法最常用的形式。每次更新参数要使用所有的样本进行计算

假设目标函数为:

                                             J\left( \theta \right) = \frac{1}{{2m}}\sum\limits_{i = 1}^m {{{\left( {{y_i} - {h_\theta }\left( {{x_i}} \right)} \right)}^2}}

求偏导得:

                                             \frac{{\partial J\left( \theta \right)}}{{\partial {\theta _j}}} = - \frac{1}{m}\sum\limits_{i = 1}^m {\left( {{y_i} - {h_\theta }\left( {{x_i}} \right)} \right){x_{ij}}}

批量梯度下降法的更新公式为:

                                             {\theta ^{\left( {k + 1} \right)}} = {\theta ^{\left( k \right)}} - \alpha \sum\limits_{i = 1}^m {\left( {{y_i} - {h_\theta }\left( {{x_i}} \right)} \right){x_{ij}}}

5.2 随机梯度下降法(Stochastic Gradient Descent,SGD)

随机梯度下降法与批量梯度下降法类似。每次更新参数只使用随机的一个样本进行计算。

随机梯度下降法的更新公式为:

                                             {\theta ^{\left( {k + 1} \right)}} = {\theta ^{\left( k \right)}} - \alpha \left( {{y_i} - {h_\theta }\left( {{x_i}} \right)} \right){x_{ij}}

批量梯度下降法和随机梯度下降法的区别是什么?

(1)批量梯度下降法每次使用所有数据来更新参数,训练速度慢;

(2)随机梯度下降法每次只使用一个数据来更新参数,训练速度快;但迭代方向变化大,不一定每次都朝着收敛的方向,不能很快地收敛到局部最优解。

5.3 小批量梯度下降法(Mini-Batch Gradient Descent,MBGD)

小批量梯度下降法是批量梯度下降法和随机梯度下降法的一个折中。每次更新参数选择一小部分数据计算

选择t个数据,1<t<m

小批量梯度下降法的更新公式为:

                                             {\theta ^{\left( {k + 1} \right)}} = {\theta ^{\left( k \right)}} - \alpha \sum\limits_{i = 1}^t {\left( {{y_i} - {h_\theta }\left( {{x_i}} \right)} \right){x_{ij}}}

6. 局部最优解解决方法

如第二节(梯度下降的直观解释)中描述的,如果目标函数具有多个局部极小值,不能保证找到的解是全局最优解。为了解决这一问题,常采用以下策略来试图跳出局部最优:

1. 以多组不同参数值进行初始化,这样有可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果;

2. 使用“模拟退火”技术,在每一步都以一定概率接收比当前解更差的结果,有助于跳出局部极小;

3. 使用随机梯度下降,最小化每个样本的损失函数,而不是最小化整体的损失函数,虽然不是每次迭代得到的损失函数都朝着收敛的方向, 但是整体的方向是朝着全局最优解的,最终的结果往往是在全局最优解附近。

参考文献:

1.《 统计学习方法》附录A梯度下降法——李航 

2. 为什么局部下降最快的方向就是梯度的负方向?

3. 梯度下降(Gradient Descent)小结

 

你可能感兴趣的:(机器学习,机器学习进阶之路)