50行代码,带你理解梯度下降法(Gradient Descent Method)

梯度下降法是一种常见的优化算法,在机器学习中应用很广泛。本文从代码的角度,带你理解梯度下降法。

在这里插入图片描述

优化算法

优化指的是改变x以最小化或最大化某个函数 f(x) 的任务。通常以最小化 f(x) 指代大多数最优化问题。最大化可以通过最小化 -f(x) 来实现。

在机器学习领域,我们把要最小化或最大化的函数称为目标函数(objective function)或准则(criterion)。当我们对其进行最小化时,也把它称为代价函数(cost function)、损失函数(loss function)或误差函数(error function)1

优化算法中常用的迭代方法有线性搜索和置信域方法等。线性搜索的策略是寻找方向和步长,具体算法有:梯度下降法、牛顿法、共轭梯度法等。2

梯度下降法为一阶收敛算法,当靠近局部最小解时梯度变小,收敛速度会变慢,并且可能以“之字形”的方式下降。如果目标函数为二阶连续可微,可以采用牛顿法,牛顿法(Newton’smethod)为二阶收敛算法,收敛速度更快,但是每次迭代需要计算Hessian矩阵的逆矩阵,复杂度较高。2下一章解析牛顿法。

梯度下降法

梯度(gradient)是相对一个向量求导的导数: f f f的导数是包含所有偏导数的向量,记为 ∇ x f ( x ) \nabla_\boldsymbol{x} f(\boldsymbol x) xf(x)。梯度的第 i i i个元素是 f f f关于 x i \boldsymbol{x}_i xi的偏导数。在多维情况下,临界点是梯度中所有元素都为零的点。

梯度下降(gradient descent)的原理是,梯度向量指向上坡,负梯度向量指向下坡。在负梯度方向上移动可以减小f。

所以,为了让目标函数继续减小,第t+1步的更新值由第t步的值向负梯度方向移动:
x t + 1 = x t − α ∇ x f ( x ) \boldsymbol x_{t+1} = \boldsymbol x_t - α\nabla_\boldsymbol{x} f(\boldsymbol x) xt+1=xtαxf(x)
α是学习率,用于控制梯度下降的速度。一般初始取值0.01、0.001等,可以在训练过程中动态调整。

采用梯度下降法的前提是,我们需要构建一个可以求偏导的目标函数,然后通过不断迭代,得到一个符合预期的结果。

具体的,假如f的值由x、y两个变量确定,则梯度可以这样表示:
∇ f ( x , y ) = ∂ f ∂ x i + ∂ f ∂ y j \nabla f(x,y)=\frac{\partial{f}}{\partial{x}}\bold{i}+\frac{\partial{f}}{\partial{y}}\bold{j} f(x,y)=xfi+yfj
下面用代码具体举例梯度下降的算法步骤。

代码示例

我们用梯度下降法来求多元函数z=f(x,y)的最小值,计算每一次迭代后的坐标位置,并绘制在三维空间中,查看目标函数值是否按照期望下降。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

# 目标函数
def f(x,y):
    return x**2 + y**2 + x*y

# 对x求偏导
def partial_x(x,y):
    return 2*x+y
    
# 对y求偏导
def partial_y(x,y):
    return 2*y+x

X = np.arange(-10, 10, 1)
Y = np.arange(-10, 10, 1)
X, Y = np.meshgrid(X, Y)
Z = f(X,Y)

# 绘制曲面
fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1, cmap=cm.viridis)
#ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.viridis)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

# 随机初始点
x = 8
y = 5
z = f(x,y)
next_x = x
next_y = y

xlist=[x]
ylist=[y]
zlist=[z]

# 设定一个学习率
step = 0.01
while True:
    next_x = x-step*partial_x(x,y)
    next_y = y-step*partial_y(x,y)    
    next_z = f(next_x,next_y)
    #print(next_x,next_y,next_z)
    
    # 小于阈值时,停止下降
    if z - next_z < 1e-9:
        break
    x = next_x
    y = next_y
    z = f(x,y)
    xlist.append(x)
    ylist.append(y)
    zlist.append(z)

ax.plot(xlist,ylist,zlist,'r--')
plt.show()

当梯度下降停止时,当前到达的(x,y,z)坐标为:

x=0.000222924064513216,y=-0.00022292403194797448,z=4.9695131279517545e-08

在这里插入图片描述

与f(x,y)的最小值误差在可接受范围内,优化完成。


  1. 《深度学习》 ↩︎

  2. 《神经网络与深度学习》 ↩︎ ↩︎

  • 19
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
### 回答1: 最速梯度下降是一种优化算,用于在函数的梯度方向上寻找函数的最小值。在Matlab中,可以使用以下代码实现最速梯度下降: ```matlab function [x, fval] = steepestDescent(f, x0, maxiter, tol) % f为目标函数,x0为初始点,maxiter为最大迭代次数,tol为容差 x = x0; alpha = 1e-3; % 步长 for k = 1 : maxiter g = gradient(f, x); % 计算梯度 if norm(g) < tol % 判断是否满足容差 break; end d = -g; % 计算方向 x = x + alpha * d; % 更新x end fval = f(x); % 计算最小值 ``` 其中,`gradient`函数用于计算函数的梯度,`norm`函数用于计算向量的二范数。使用时,需要将目标函数`f`以函数句柄的形式传入,例如: ```matlab f = @(x) x(1)^2 + 2*x(2)^2; x0 = [1, 1]; maxiter = 1000; tol = 1e-6; [x, fval] = steepestDescent(f, x0, maxiter, tol); ``` ### 回答2: 最速梯度下降(Steepest Descent Method)是一种优化算,用于求解无约束优化问题。该方基于梯度反向方向进迭代,以寻找函数的最小值点。 在Matlab中,可以使用以下步骤实现最速梯度下降: 1. 定义目标函数:首先,根据具体问题定义目标函数。例如,假设需要优化的函数为f(x),其中x为自变量。 2. 初始化参数:定义初始值x0,以及其他必要的参数,如学习率alpha和停止准则。 3. 计算梯度:计算目标函数f(x)关于自变量x的梯度。可以使用matlab中的gradient函数或自定义函数。 4. 梯度下降迭代:重复下述步骤,直到满足停止准则: a. 计算下降方向:将梯度取负数作为下降方向,即delta_x = -gradient。 b. 更新变量:根据学习率alpha和下降方向delta_x,更新自变量x:x = x + alpha * delta_x。 c. 重新计算梯度:计算更新后的自变量x的梯度。 5. 输出结果:迭代过程中,根据需要记录迭代次数、目标函数值和自变量值。 最速梯度下降的优点是简单易实现,缺点是可能会陷入局部最小值点。为了避免这个问题,可以结合其他优化算改进,如牛顿或共轭梯度。 在使用最速梯度下降时,需要根据具体问题进参数的选择和调优。此外,还可考虑加入正则化项、设置合适的学习率衰减策略等,以提高优化效果和迭代速度。 ### 回答3: 最速梯度下降(also known as 最速下降、最陡下降、Steepest Descent Method)是一种最基本的迭代优化算,用于求解无约束优化问题。该方通过在每一步选择在当前点的负梯度方向上进迭代,来逐步逼近最优解。 在MATLAB中,可以使用以下步骤实现最速梯度下降: 1. 初始化变量:设定初始点x0、学习率α(也称为步长)、迭代停止条件等。 2. 计算梯度:使用目标函数的梯度函数gradient()计算当前点的梯度梯度表示函数在某一点的变化率,并指向函数增长最快的方向。 3. 更新变量:使用以下公式更新变量x:x = x - α * gradient。其中,α是学习率,用于控制每一步迭代更新的大小。通常需要选择合适的学习率,以保证算能够快速收敛且不会超调。 4. 判断停止条件:在每一步迭代后,可以通过检查变量的新旧值之间的差异、函数值以及梯度的范数等来判断是否满足停止条件。常见的停止条件包括函数值的相对误差小于某一阈值、梯度的范数小于某一阈值、达到一定的迭代次数等。 5. 重复步骤2-4,直到满足停止条件。 需要注意的是,最速梯度下降在求解大规模问题时可能会收敛速度较慢,容易陷入局部最优解。因此,在实际应用中,可以结合其他方改进,例如采用合适的学习率调度策略、引入二次方向等。 总之,最速梯度下降是一种简单直观的优化算,可用于求解无约束优化问题。在MATLAB中,可以通过设置初始点、学习率和迭代停止条件,并使用梯度函数和更新变量的公式来实现该算

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值