梯度下降法(Gradient Descent)求解最优化问题

梯度下降法应用十分广泛,可以用于求解最小值问题。一个机器学习算法的目标就是要找到其损失函数最低点对应的参数,这时就用到了梯度下降法,该方法在之后要介绍的很多算法中要用到,所以单独写一篇文章来介绍。

1.概述

梯度下降法也成为最速下降法,是一种一阶最优化算法。

  • 首先对所有的参数进行初始化;
  • 然后不断更新参数的值,直到目标函数达到最小值。此时模型就被训练完成了。

Require: 学习率 α \alpha α和初始参数 Θ \Theta Θ
repeat
θ j : = θ j − α ⋅ ∂ J ( Θ ) ∂ θ j \theta _{j} := \theta _{j} - \alpha \cdot \frac{\partial J(\Theta )}{\partial \theta _{j}} θj:=θjαθjJ(Θ)
until 达到收敛条件

注意事项
参数同时更新
正确的计算方式:(假设只有两个参数)
t e m p 0 : = θ 0 − α ⋅ ∂ J ( Θ ) ∂ θ 0 temp_{0} := \theta _{0} - \alpha \cdot \frac{\partial J(\Theta )}{\partial \theta _{0}} temp0:=θ0αθ0J(Θ)
t e m p 1 : = θ 1 − α ⋅ ∂ J ( Θ ) ∂ θ 1 temp_{1} := \theta _{1} - \alpha \cdot \frac{\partial J(\Theta )}{\partial \theta _{1}} temp1:=θ1αθ1J(Θ)
θ 0 : = t e m p 0 \theta _{0} := temp_{0} θ0:=temp0
θ 1 : = t e m p 1 \theta _{1} := temp_{1} θ1:=temp1
错误的计算方式:(假设只有两个参数)
t e m p 0 : = θ 0 − α ⋅ ∂ J ( Θ ) ∂ θ 0 temp_{0} := \theta _{0} - \alpha \cdot \frac{\partial J(\Theta )}{\partial \theta _{0}} temp0:=θ0αθ0J(Θ)
θ 0 : = t e m p 0 \theta _{0} := temp_{0} θ0:=temp0
t e m p 1 : = θ 1 − α ⋅ ∂ J ( Θ ) ∂ θ 1 temp_{1} := \theta _{1} - \alpha \cdot \frac{\partial J(\Theta )}{\partial \theta _{1}} temp1:=θ1αθ1J(Θ)
(此时由于 θ 0 \theta _{0} θ0已经更新, t e m p 1 temp_{1} temp1的值将受到影响)
θ 1 : = t e m p 1 \theta _{1} := temp_{1} θ1:=temp1

2.公式中各项的含义

收敛准则

不能证明梯度下降法是收敛的,并且没有明确定义的算法停止准则

通常使用如下方法对是否收敛进行判断:

  • 当梯度向量的欧几里得范数达到一个充分小的阈值时。
    ∥ ∇ Θ ∥ = ( ∇ θ 0 ) 2 + ( ∇ θ 1 ) 2 + ⋯ + ( ∇ θ n ) 2 \left \| \nabla\Theta \right \| = \sqrt{(\nabla\theta_{0})^{2}+(\nabla\theta_{1})^{2}+\cdots +(\nabla\theta_{n})^{2}} Θ=(θ0)2+(θ1)2++(θn)2
  • 当迭代的每一个回合的均方误差变化的绝对速率足够小时。

当目标函数是凸函数时,梯度下降法的解是全局最优解。一般情况下,其解不保证是全局最优解。其下降速度也不保证是最快的(不同特征之间特征值相差较大的情况下使用特征缩放,能够加快下降速度)。

导数项含义(作用)

导数为正
导数为正: θ = θ − α ⋅ \theta = \theta - \alpha \cdot θ=θα (positive number), θ \theta θ变小,向代价减小的方向;
导数为负
导数为负: θ = θ − α ⋅ \theta = \theta - \alpha \cdot θ=θα (negtive number), θ \theta θ变大,向代价减小的方向。
由此可见,导数项的作用是使参数向使得损失逐渐减小的方向更新。

学习率(learning rate)的作用

学习率 α \alpha α决定梯度下降的速度
学习率的作用
上图引自知乎用户@马同学,图中的 η \eta η表示学习率。
由上图可知,学习率太小,导致梯度下降缓慢,而学习率太高,可能越过最低点,导致无法收敛甚至发散,因此,应该选取合适大小的学习率。可以尝试从一系列学习率中(…, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, …间隔约三倍)选取合适的学习率。
梯度下降速率
在迭代的过程中,应使梯度下降的速率逐渐缓慢,以免越过最低点,而在实际的操作中,不需要逐渐减小 α \alpha α值,因为导数值越来越小,梯度下降会自动变缓慢。

3.批量与小批量

  • 批量梯度下降法(Gradient Descent, GD, Batch Gradient Descent):使用全部训练样本估计梯度进行训练。计算量大,一般不使用批量算法。
  • 小批量梯度下降法(Mini Batch Gradient Descent, MBGD):使用部分训练样本估计梯度进行训练。实际操作中最常使用。
  • 随机梯度下降法(Stochastic Gradient Descent, SGD):每次从固定训练集中抽取一个训练样本估计梯度进行训练。

4.总结

以上就是关于梯度下降算法的内容,其具体应用及实现将在以后的算法中展示。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 最速下降法是一种求解最优化问题的常用方法,其基本思想是在每一步中选择使目标函数下降最快的方向进行搜索。下面是使用MATLAB实现最速下降法求解最优化问题的代码: function [x,fval] = steepest_descent(f,x,tol,maxiter) % f: 目标函数 % x: 初始点 % tol: 容差 % maxiter: 最大迭代次数 x = x; % 初始化 fval = f(x); % 计算初始点的目标函数值 iter = ; % 迭代次数 while iter < maxiter % 计算梯度 grad = gradient(f,x); % 计算步长 alpha = fminsearch(@(a) f(x-a*grad),); % 更新x x = x - alpha*grad; % 计算新的目标函数值 new_fval = f(x); % 判断是否满足容差要求 if abs(new_fval-fval) < tol break; end % 更新目标函数值和迭代次数 fval = new_fval; iter = iter + 1; end end 其中,gradient(f,x)是MATLAB内置函数,用于计算目标函数f在点x处的梯度。fminsearch(@(a) f(x-a*grad),)是MATLAB内置函数,用于求解一维函数的最小值,即在方向grad上的最优步长alpha。 ### 回答2: 最速下降法是一种求解最优化问题的常用方法,可以用于解决各种数学模型中的优化问题。在matlab中,可以使用fminunc函数来实现最速下降法求解最优化问题。下面我将详细介绍如何利用matlab代码实现最速下降法求解最优化问题。 首先,我们需要定义一个目标函数,这个函数是我们要进行优化的主要目标。例如,我们可以定义一个简单的目标函数,如下所示: ``` function f = objfun(x) f = x(1)^2 + x(2)^2; end ``` 这个函数的输入参数为x,输出参数为f,函数体中的公式为f = x(1)^2 + x(2)^2,即求解x1的平方与x2的平方和的最小值。 接下来,我们需要确定初始点的位置,以便进行最速下降法的迭代计算。这个初始点可以是任何值,通常是通过试验或者经验找到的。例如,我们可以定义一个初始点的坐标为(1, 1),如下所示: ``` x0 = [1, 1]; ``` 接着,我们需要调用fminunc函数来进行最速下降法的计算,该函数的语法为: ``` [x, fval] = fminunc(fun, x0) ``` 其中,fun为目标函数的句柄,x0为初始点的位置,x为最优点的位置,fval为目标函数在最优点处的取值。 将我们定义的目标函数和初始点输入fminunc函数,得到matlab代码如下: ``` x0 = [1, 1]; fun = @(x)objfun(x); options = optimoptions('fminunc','Display','iter','Algorithm','quasi-newton'); [x,fval,exitflag,output] = fminunc(fun,x0,options); ``` 其中,Display为输出选项,Algorithm为最优化算法选择。该代码中的最优化算法选择为拟牛顿法,也可以选择最速下降法来实现最速下降法求解最优化问题。 最后,我们可以将最速下降法求解最优化问题的结果输出到控制台上,以便查看最优点的位置和目标函数在最优点处的取值。 以上就是关于如何使用matlab代码实现最速下降法求解最优化问题的详细介绍。需要注意的是,最速下降法求解最优化问题具有一定的局限性,对于某些复杂的问题可能求解不出最优解。因此,在实际操作中,需要根据具体问题的复杂程度选择合适的方法来解决。 ### 回答3: 最速下降法是一种常见的求解最优化问题的方法,其基本思想是通过不断迭代找到每一步中相对于当前点下降最快的方向,并按照一定步长沿该方向移动,最终达到最优解点。 在使用matlab进行最速下降法求解最优化问题时,可以采用以下步骤: 1. 定义目标函数和梯度函数 首先需要定义目标函数和梯度函数,以用于计算每次迭代的下降方向和步长。例如,若目标函数为$f(x,y)$,则可以在matlab中定义如下: function [f,g] = myfun(x) f = (1-x(1))^2 + 100*(x(2)-x(1)^2)^2; g = [-2*(1-x(1))-400*x(1)*(x(2)-x(1)^2); 200*(x(2)-x(1)^2)]; 其中,g为目标函数的梯度向量。 2. 初始化 通过给定初始点$x_0$,可以初始化最速下降法迭代过程。例如,可以定义初始点为$(1,1)$: x0 = [1;1]; 3. 迭代过程 在每次迭代中,通过计算目标函数的梯度和每次迭代的下降方向,以及选择一定的步长,来寻找下一个点$x_k$。例如,可以使用以下代码实现: x = x0; for k = 1:100 [f,g] = myfun(x); p = -g; % 计算下降方向 alpha = linesearch(x,p,f,g); % 选择步长 x = x + alpha*p; % 移动到下一个点 end 其中,linesearch(x,p,f,g)为步长选择函数,可以根据不同的步长选择方法进行编写。 4. 输出结果 最后,在迭代结束后,输出最优解点和最优解值。例如,可使用如下代码: fprintf('The minimum point is [%f %f] with value %f.\n', x(1),x(2),f); 综上所述,通过以上步骤,可以利用matlab实现最速下降法求解最优化问题。需要注意的是,在实际应用中,还需根据具体情况进行参数调优、收敛判断等处理,以保证算法的准确性和效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值