梯度下降(Gradient Descent)

在求解机器学习模型参数时,即对问题进行优化时,梯度下降是最最常用的方法之一,下面对梯度下降做一个总结。

一、梯度

在微积分中,对多元函数的变量求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度,比如函数 f(x,y),分别对 x, y 求偏导,得: ∂ f ∂ y , ∂ f ∂ x \frac{{\partial f}}{{\partial y}},\frac{{\partial f}}{{\partial x}} yf,xf,那么这个梯度组成的向量有什么用呢?从几何意义上讲,就是函数变化增长最快的方向,或者说沿着梯度向量的方向,函数会更快找到最大值,反过来,沿着梯度相反的方向,梯度减少最快,函数会更快找到最小值。

二、梯度下降与梯度上升

在机器学习算法求解时,在最小化损目标函数时,可以通过梯度下降一步步迭代求解,得到最小化的损失函数和模型参数值;反过来,如果需要求解目标函数的最大值,,就需要使用梯度上升来迭代。

梯度下降和梯度上升可以互相转化,比如我们想求目标函数 f ( θ ) f(\theta ) f(θ) 的最大值,此时需要使用梯度上升;但如果我们要求解的问题转化成求解 − f ( θ ) -f(\theta ) f(θ)的最小值,此时对 − f ( θ ) -f(\theta ) f(θ) 需要使用梯度下降。

三、梯度下降法

假设 f ( x ) f(x ) f(x) R n {R^n} Rn 上具有一阶连续偏导数的函数,要求解的无约束最优化问题是:

                 min ⁡ x ∈ R n f ( x ) \mathop {\min }\limits_{x \in {R^n}} {\rm{ }}f(x) xRnminf(x)

梯度下降是一种迭代算法,选取适当的初值 x ( 0 ) {x^{(0)}} x(0),不断迭代,更新 x 的值,对 目标函数最小化,直到收敛。由于负梯度方向是使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新 x 的值,从而达到减少函数值的目的。

由于 f ( x ) f(x ) f(x) 具有一阶连续偏导数,若第 k 次迭代值为 x ( k ) {x^{(k)}} x(k),则可将 f ( x ) f(x) f(x) x ( k ) {x^{(k)}} x(k)附近进行一阶泰勒展开:

             f ( x ) = f ( x ( k ) ) + g k T ( x − x ( k ) ) f(x) = f({x^{(k)}}) + g_k^T(x - {x^{(k)}}) f(x)=f(x(k))+gkT(xx(k))

其中 g k T = g ( x ( k ) ) = ∇ f ( x ( k ) ) g_k^T = g({x^{(k)}}) = \nabla f({x^{(k)}}) gkT=g(x(k))=f(x(k)) f ( x ) f(x) f(x) x ( k ) {x^{(k)}} x(k) 的梯度。

第 k+1 次迭代值 x ( k + 1 ) {x^{(k+1)}} x(k+1)

             x ( k + 1 ) : = x ( k ) + λ ( − ∇ f ( x ( k ) ) ) {x^{(k + 1)}} := {x^{(k)}} + \lambda ( - \nabla f({x^{(k)}})) x(k+1):=x(k)+λ(f(x(k)))

其中 λ \lambda λ 是迭代步长,如图所示:

梯度下降算法描述如下:

输入:目标函数 f ( x ) f(x) f(x) ,梯度函数 g ( x ) = ∇ f ( x ) g(x) = \nabla f(x) g(x)=f(x),计算精度 ε \varepsilon ε
输出: f ( x ) f(x) f(x) 的极小值点 x ∗ {x^*} x

(1)取初始值 x ( 0 ) ∈ R n {x^{(0)}} \in {R^n} x(0)Rn,k = 0;
(2)计算 f ( x ( k ) ) f({x^{(k)}}) f(x(k))
(3)计算梯度 g k = g ( x ( k ) ) {g_k} = g({x^{(k)}}) gk=g(x(k)),当 ∣ ∣ g k ∣ ∣ &lt; ε ||{g_k}|| &lt; \varepsilon gk<ε 时,停止迭代,此时 x ∗ = x ( k ) {x^*} = {x^{(k)}} x=x(k)
(4)否则,令 x ( k + 1 ) : = x ( k ) + λ ( − ∇ f ( x ( k ) ) ) {x^{(k + 1)}} := {x^{(k)}} + \lambda ( - \nabla f({x^{(k)}})) x(k+1):=x(k)+λ(f(x(k))),计算 f ( x ( k + 1 ) ) f({x^{(k + 1)}}) f(x(k+1)),当 ∣ ∣ f ( x ( k + 1 ) ) − f ( x ( k ) ) ∣ ∣ &lt; ε ||f({x^{(k + 1)}}) - f({x^{(k)}})|| &lt; \varepsilon f(x(k+1))f(x(k))<ε ∣ ∣ x ( k + 1 ) − x ( k ) ∣ ∣ &lt; ε ||{x^{(k + 1)}} - {x^{(k)}}|| &lt; \varepsilon x(k+1)x(k)<ε 时,停止迭代,此时 x ∗ = x ( k + 1 ) {x^*} = {x^{(k+1)}} x=x(k+1)
(5)否则,令 k = k + 1,转到(3);

需要注意的是,如果目标函数是凸函数,梯度下降可以得到全局最优解,否则,梯度下降算法不一定能够得到全局最优解。

四、梯度下降法的参数

(1)步长 λ \lambda λ :步长决定了梯度下降中每一步沿着负梯度方向前进的长度;
(2)计算精度 ε \varepsilon ε

五、梯度下降算法调优

(1)步长:步长太大,导致迭代过快,可能造成振荡,错过最优解;步长太小,算法收敛过慢;
(2)初始化:由于梯度下降存在局部最优解的情况,建议多次初始化,选择使得目标函数最小的初值;
(3)归一化:由于样本不同特征的取值范围不同,可能导致梯度下降时等高线为椭圆,下降速度太慢,为了减少特征取值对梯度下降的影响,对特征进行归一化:

             x : = x − x ‾ s t d ( x ) x: = \frac{{x - \overline x }}{{std(x)}} x:=std(x)xx

其中 std(x) 是特征 x 的标准差,对特征进行缩放后,消除特征值大小对梯度下降算法的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值