深度学习之:详解梯度下降——什么是梯度,梯度和偏导数的联系,如何更新梯度

关于梯度的问题

在深度学习之中,我们往往把梯度和偏导数结合在一起,那么什么是梯度呢?梯度和偏导数之间究竟有什么关系呢?梯度有什么作用呢?得到梯度之后我们应该如何优化我们的模型呢?这些问题在这个文章中都会给出答案

拿线性回归举例

  • 用一个烂大街的线性回归的例子来做演示,首先要弄明白什么是回归任务要做的。简单一句话,==回归就是拟合,就是要通过一堆特征点总结出一条具有直观意义、并能帮助你以后预测其他点的线的过程。==如果觉得这还不是人话,那么让我们来可视化一下:
    在这里插入图片描述
  • 这些蓝点是一个个的已知的特征点,通过这些特征点,我要总结出一条线,有了这条线之后,以后再给我任意一个 x ,我都能根据这条线预测出 y,得到这个红线的过程就叫线性回归过程。

过程介绍

  • 首先我们知道,最后之所以得到这条红线,是因为这个红线所代表的总体损失小于我们规定的一个阈值。例如我们规定,当我们的程序运行到损失小于 0.1 的时候程序停止,得到的线就是这条红线。
  • 因此我们一开始需要初始化我们的程序,也就是先指定一条线,比如说我们指定下图的绿色直线为程序开始时候的线,很显然,绿线到所有点的误差的总和是明显大于红线的,而我们程序需要做的就是不断通过梯度下降来减小绿线的误差,直到绿线移动到红线的位置,这个时候误差小于阈值 0.1 程序就会停止。
    在这里插入图片描述

误差计算

  • 好的,确定好目标之后,我们开始计算误差,并且学习如何减小误差。
  • 误差的计算使用 MSE 均方误差:
    Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 \Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 Σi=1m(y^(i)y(i))2
    • i i i 是第 i i i 个样本点, y ( i ) y^{(i)} y(i) 是当前 x x x y y y 的真实值; y ^ ( i ) \hat{y}^{(i)} y^(i) 是根据当前的 x x x 预测的值
    • 最终我们计算所有 m m m 个样本的预测和真实值的误差,我们可以得到总的误差表示

目标

  • 我们的目标最终是得到一个 y = θ 1 + θ 2 x y=\theta_1+\theta_2x y=θ1+θ2x 的直线,除此之外,再没有其他的参数了,也就是说,我们的目标最终是通过学习求解截距 θ 1 \theta_1 θ1 和 斜率 θ 2 \theta_2 θ2,所以我们把目标函数设置成:
    J ( θ 1 , θ 2 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1,\theta_2) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1,θ2)=2m1Σi=1m(y^(i)y(i))2

    • 之所以有 1 2 m \frac{1}{2m} 2m1 是因为求导之后会多出一个 2 m 2m 2m 项与 Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 \Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 Σi=1m(y^(i)y(i))2 相乘;因此我们人为抵消掉这部分,就是上面的这个式子。
    • 我们通过求解 J ( θ 1 , θ 2 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1,\theta_2) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1,θ2)=2m1Σi=1m(y^(i)y(i))2 的最小值,就可以得到红色的线了。
  • 对于其他的深度学习任务,我们可能有更复杂的非线性的拟合任务,其中可能涉及到非常多的参数情况,那个时候,我们的优化目标就不仅是 J ( θ 1 , θ 2 ) J(\theta_1,\theta_2) J(θ1,θ2) 了,而是 J ( θ 1 , θ 2 , . . . , θ n ) J(\theta_1,\theta_2,...,\theta_n) J(θ1,θ2,...,θn)

梯度

在这里插入图片描述

  • 假设我们再简化一下上面的目标,假设我们整个的参数求解,只涉及一个参数, θ 1 \theta_1 θ1,即: J ( θ 1 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1)=2m1Σi=1m(y^(i)y(i))2

  • 那这个时候我们求解最小值你肯定会,这就变成了一个二次方程求极值 的问题,也就是通过求解 J ′ ( θ 1 ) = 0 J^{'}(\theta_1)=0 J(θ1)=0 的点来得到最小值。这个时候,某个点的导数就是梯度,也就是寻找最小值的方向,这个方向很明确,就是朝着导数的方向
    在这里插入图片描述

  • 这个时候,让我们回归两个参数的情况
    J ( θ 1 , θ 2 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1,\theta_2) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1,θ2)=2m1Σi=1m(y^(i)y(i))2

  • 和一个参数不同的是,这个时候,要确定优化的方向(寻找最小值点的方向)就不能只是把 J ′ ( θ 1 ) J^{'}(\theta_1) J(θ1) 作为决定优化方向的全部筹码了,因为这个时候,要找到最小值, θ 2 \theta_2 θ2 也起着决定性的作用,因此我们要通过 J J J θ 1 , θ 2 \theta_1,\theta_2 θ1,θ2 分别求导的综合表现,来决定优化的方向。而 J J J θ 1 , θ 2 \theta_1,\theta_2 θ1,θ2 的偏导结果,就是这个时候梯度的值!
    在这里插入图片描述

    • 因此在这幅图中,我们把 x x x 轴看做是 θ 1 \theta_1 θ1 而把 y y y 轴看做是 θ 2 \theta_2 θ2,把 z z z 轴看做是当前 J J J 的值(误差的总和); δ J δ θ 1 \frac{\delta J}{\delta \theta_1} δθ1δJ 就相当于是沿着 x x x 轴方向的分量, δ J δ θ 2 \frac{\delta J}{\delta \theta_2} δθ2δJ 就相当于是沿着 y y y 轴方向的分量,
      在这里插入图片描述

梯度下降

  • 梯度下降就是通过更新梯度的方式求解出 J J J 的最小值,这个过程就是:
    θ 1 , θ 2 = θ 1 , θ 2 − g r a d × l r \theta_1,\theta_2=\theta_1,\theta_2-grad×lr θ1,θ2=θ1,θ2grad×lr

    • l r lr lr 是学习率,也就是每次沿梯度方向走的距离,下图中两个红点之间的距离
    • g r a d grad grad 就是梯度,代表下降的方向
      在这里插入图片描述
  • 更新完之后就得到了新的 θ 1 , θ 2 \theta_1,\theta_2 θ1,θ2,而这个时候, J J J 的值就会小于原来的那个 J J J

参考资料

简单易懂的梯度下降算法讲解,带你简单入门

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 梯度下降是一种常见的数学优化方法,用于最小化一些目标函数。Matlab是一种常用的编程语言,用于数值计算及可视化。在Matlab中,可以通过编写代码实现梯度下降算法来求解目标函数的最小值。 梯度下降算法的基本思路是,找到目标函数的梯度(即方向导数)并将自变量沿着梯度方向移动一小步,直到达到目标函数的最小值。这个小步称为学习率。如果学习率太大,可能会导致算法无法收敛,如果学习率太小,可能会导致算法收敛速度太慢。因此,合适的学习率是非常重要的。 以下是一个简单的梯度下降Matlab代码的实现: ```matlab %初始化自变量和学习率 x = 5; lr = 0.01; %目标函数 function y = f(x) y = x^2 - 6*x + 8; end %计算梯度 function g = grad(x) g = 2*x - 6; end %梯度下降算法 while abs(grad(x)) > 1e-6 x = x - lr * grad(x); end %输出结果 fprintf('The optimal value of x is %.4f\n', x); fprintf('The optimal value of the objective function is %.4f\n', f(x)); ``` 这个代码首先定义了自变量x和学习率lr的初始值。然后定义了目标函数f和计算梯度的函数grad。在while循环中,采用梯度下降算法不断更新自变量x的值,直到梯度的绝对值小于某个阈值(本例中为1e-6)。最后输出了最优解和最小的目标函数值。 总而言之,梯度下降算法是一种数学优化方法,常用于最小化目标函数。在Matlab中,可以编写代码实现梯度下降算法来求解目标函数的最小值,需要注意学习率设置和算法的收敛性。 ### 回答2: 梯度下降算法是机器学习中常用的优化算法,可以根据损失函数的梯度来寻找最优解。在MATLAB中实现梯度下降算法可以分为以下几个步骤: 1.定义损失函数 在MATLAB中,可以通过定义一个函数来表示损失函数,例如: ``` function J = costFunction(X, y, theta) % Compute cost for linear regression m = length(y); % number of training examples J = 0; predictions = X*theta; sqrErrors = (predictions - y).^2; J = 1/(2*m) * sum(sqrErrors); end ``` 其中,X为特征矩阵,y为样本输出,theta为待求解的参数,通过计算预测值与实际值的误差平方和来得到损失函数。 2.定义梯度函数 梯度函数表示损失函数对于每个参数的导数,即损失函数在当前参数值处的方向导数。在MATLAB中,可以定义一个函数来计算梯度值,例如: ``` function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) %GRADIENTDESCENT Performs gradient descent to learn theta % theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by % taking num_iters gradient steps with learning rate alpha m = length(y); % number of training examples J_history = zeros(num_iters, 1); for iter = 1:num_iters predictions = X*theta; errors = predictions - y; delta = (1/m)*X'*errors; theta = theta - alpha * delta; J_history(iter) = costFunction(X, y, theta); end end ``` 其中,alpha表示学习率,num_iters表示迭代次数,通过迭代更新参数theta的值。 3.运行并可视化结果 在定义好损失函数和梯度函数之后,可以通过调用gradientDescent函数来得到参数估计值,例如: ``` initial_theta = zeros(size(X, 2), 1); num_iters = 1500; alpha = 0.01; [theta, J_history] = gradientDescent(X, y, initial_theta, alpha, num_iters); ``` 得到的theta就是我们需要的模型参数估计值,J_history则可以用来观察损失函数的变化情况,进而判断优化效果。我们可以通过可视化的方式来呈现损失函数随迭代次数的变化趋势,例如: ``` plot(1:num_iters, J_history, '-b', 'LineWidth', 2); xlabel('Number of iterations'); ylabel('Cost J'); ``` 以上就是使用MATLAB实现梯度下降算法的基本步骤,需要注意的是,选择合适的学习率alpha和迭代次数num_iters对于算法的收敛效果十分重要。 ### 回答3: 梯度下降算法是一种基于优化的方法,用于寻找函数最小值或最大值的过程。在机器学习中,它被广泛应用于训练模型,例如神经网络。 梯度下降的主要思想是通过迭代逐步调整参数,使得损失函数的值逐渐趋近于最小值。具体来说,对于每一次迭代,使用当前参数计算出损失函数的梯度,然后按照一定的步长调整参数的值,使得损失函数的值下降。这个过程一直持续到损失函数的值达到一个稳定的最小值。 以下是一个简单的梯度下降的MATLAB代码: function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) %初始化J_history: J_history = zeros(num_iters, 1); %执行num_iters次迭代: for iter = 1:num_iters %计算当前theta下的代价函数: J_history(iter) = computeCost(X, y, theta); %计算当前theta下的梯度: grad = (1/m) * X' * (X*theta - y); %更新参数: theta = theta - alpha * grad; end end 其中,X是样本矩阵,y是标签矩阵,theta是需要求解的权重向量,alpha是学习率,num_iters是迭代次数。computeCost函数用于计算当前参数下的代价函数。 这个代码是一个简单的批量梯度下降算法。在每次迭代中,它计算出当前参数下的代价函数和梯度,然后沿着负梯度方向更新参数。如果学习率设置得当,这个算法可以很快地收敛到最优解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值