【机器学习】浅谈梯度下降(Gradient Descent)

本文详细介绍了梯度下降法的基本概念,包括如何将一元函数扩展到多元函数,以及批量梯度下降、随机梯度下降和小批量梯度下降的不同策略。探讨了学习率、初始参数值选择和标准化对优化过程的影响,以及这些方法在实际问题中的应用和区别。
摘要由CSDN通过智能技术生成

梯度下降.png


引入梯度


梯度的概念:梯度就是函数对它的各个自变量求偏导后,由偏导数组成的一个向量
作用:梯度下降法(Gradient Descent,GD)常用于求解无约束情况下凸函数(Convex Function)的极小值,是一种迭代类型的算法,因为凸函数只有一个极值点,故求解出来的极小值点就是函数的最小值点。对凸函数进行优化的方法,梯度下降采用无限逼近的方式逼近参数

待处理问题:

KaTeX parse error: {align} can be used only in display mode.

根据实际问题目标函数转化求解如下目标函数

J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left(\theta\right)=\frac{1}{2}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} J(θ)=21i=1m(hθ(x(i))y(i))2

  • 我们把要最小化或最大化的函数称为目标函数或准则。 当我们对其进行最小化时,我们也把它称为代价函数、损失函数或误差函数

下面我们来求目标函数的最小值对应的 θ \theta θ

从一元到多元


一元函数


引入梯度下降

现在用导数值的 「正负来表示方向」,如果导数的值是正数,那么就代表x轴的正方向。如果导数的值是负数,那么就代表是 x轴的负方向。那么你会发现,知道了这个方向之后也就知道了应该让 x往哪个方向变化 f(x) 的值才会增大。如果想要让 f(x) 的值减小,那么就让x朝着导数告诉我们的方向的反方向变化就好啦。接下来我用**「黄色」箭头代表导数告诉我们的方向,用「黑色」**箭头代表导数指向的方向的反方向

梯度下降法:目标是搜索出来一个能够让函数的值尽可能小的位置,所以应该让x朝着黑色箭头的方向走

学习率

在代码中有一个eta变量,它的专业名词叫 「学习率」。使用数学表达式来表示更新x的过程那就是:

x ← x − e t a ∗ d f ( x ) d x x \xleftarrow[]{} x - eta*\frac{df(x)}{dx} x xetadxdf(x)

表达式的意思就是让x减去eta乘以函数的导数。其中的eta是为了控制x更新的幅度,将eta设置的小一点,那么每一次更新的幅度就会小一点

继续更新迭代

其中红色箭头指向的点是初始时候的点,「黄色」 箭头指向的点是第 1 次更新后的位置,「蓝色」 箭头指向的点是第 2 次更新后的位置

  • 只要不停地重复刚才的这个过程,那么最终就会收敛到一个 「局部」 的极值点。**那么可以想一下这是为什么?**因为随着每一次的更新,曲线都会越来越平缓,相应的导数值也会越来越小,当我们接近极值点的时候导数的值会无限地靠近 「0」。由于导数的绝对值越来越小,那么随后更新的幅度也会越来越小,最终就会停留在极值点的位置了。

二元函数


在这里纵坐标我使用 「y」 表示,底面的两个坐标分别使用 「x1」「x2」 来表示

梯度是一个由各个自变量的偏导数所组成的一个**「向量」**

( ∂ y ∂ x 1 , ∂ y ∂ x 2 ) (\frac{\partial y}{\partial x1},\frac{\partial y}{\partial x2}) (x1y,x2y)

x 1 ← x 1 − e t a ∗ ∂ y ∂ x 1 x 2 ← x 2 − e t a ∗ ∂ y ∂ x 2 \begin{gathered} x1\leftarrow x1-eta*{\frac{\partial y}{\partial x1}} \\ x2 \leftarrow x2-eta*\frac{\partial y}{\partial x2} \end{gathered} x1x1etax1yx2x2etax2y

同样地,一开始随机初始一个位置,随后让当前位置的坐标值减去学习率乘以当前位置的偏导数。更新自变量 x1 就让 x1 减去学习率乘以 y 对 x1 的偏导数,更新自变量 x2 就让 x2 减去学习率乘以 y 对 x2 的偏导数。

我使用红色箭头表示我们当前所在的位置,随后我使用 「黑色」 箭头代表其中一个轴上的坐标朝向哪个方向变化可以使得函数值 「y」 减小,并使用 「黄色」 箭头代表另外一个轴上的坐标朝向哪个方向变化可以使得函数值 「y」 减小。根据平行色变形法则有了 「黑色」 向量和 「黄色」 向量,就可以知道这两个向量最终达到的效果就是 「蓝色」 向量所达到的效果。

  • 迭代公式变成向量的形式

( x 1 x 2 ) ← ( x 1 x 2 ) − e t a ( ∂ y ∂ x 1 ∂ y ∂ x 2 ) \begin{pmatrix}x1\\\\x2\end{pmatrix}\leftarrow\begin{pmatrix}x1\\\\x2\end{pmatrix}-eta\begin{pmatrix}\frac{\partial y}{\partial x1}\\\\ \frac{\partial y}{\partial x2}\end{pmatrix} x1x2 x1x2 eta x1yx2y

多元函数


$\begin{pmatrix} x1 \ \ x2 \ \ \cdots\ \ xn \ \end{pmatrix} \xleftarrow[]{} \begin{pmatrix} x1 \ \ x2 \ \ \cdots\ \ xn \ \end{pmatrix} -eta \begin{pmatrix} \frac{\partial y}{\partial x1} \ \ \frac{\partial y}{\partial x2} \ \ \cdots \ \ \frac{\partial y}{\partial xn} \ \end{pmatrix} \$

由上述分析可得n维特征时的迭代矩阵

多种梯度方法


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


批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。从数学上理解如下:

对目标函数求偏导

Δ J ( θ 0 , θ 1 ) Δ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\Delta J(\theta_0,\theta_1)}{\Delta\theta_j}=\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} ΔθjΔJ(θ0,θ1)=m1i=1m(hθ(x(i))y(i))xj(i)

其中 i=1,2,…,m表示样本数, j=0,1表示特征数,这里我们使用了偏置项 x 0 ( i ) = 1 x_{0}^{(i)}=1 x0(i)=1

每次迭代对参数进行更新

θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j:=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)

优缺点

优点:

  1. 一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行
  2. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优

缺点:
当样本数目 m很大时,每迭代一步 都需要对所有样本计算,训练过程会很慢

从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下:

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


随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代使用一个样本来对参数进行更新,使得训练速度加快

对于一个样本的目标函数为:

J ( i ) ( θ 0 , θ 1 ) = 1 2 ( h θ ( x ( i ) ) − y ( i ) ) 2 J^{(i)}(\theta_0,\theta_1)=\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2 J(i)(θ0,θ1)=21(hθ(x(i))y(i))2

对目标函数求偏导

Δ J ( i ) ( θ 0 , θ 1 ) θ j = ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\Delta J^{(i)}(\theta_0,\theta_1)}{\theta_j}=(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} θjΔJ(i)(θ0,θ1)=(hθ(x(i))y(i))xj(i)

每次迭代对参数进行更新

θ j : = θ j − α ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_{j}:=\theta_{j}-\alpha(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)} θj:=θjα(hθ(x(i))y(i))xj(i)

优缺点

优点:
由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快
缺点:

  1. 准确度下降。由于即使在目标函数为 强凸函数的情况下,SGD仍旧无法做到线性收敛
  2. 可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势
  3. 不易于并行实现
  4. 从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目

从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目:

SGD收敛速度比BGD要快

这里我们假设有30W个样本,对于BGD而言,每次迭代需要计算30W个样本才能对参数进行一次更新,需要求得最小值可能需要多次迭代(假设这里10);而对于SGD,每次更新参数只需要一个样本,因此若使用这30W个样本进行参数更新,则参数会被更新(迭代)30W次,而这期间,SGD就能保证能够收敛到一个合适的最小值上了。也就是说,在收敛时,BGD计算了 10×30W次,而SGD只计算了 1×30W次
注意:优先选择SGD

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


小批量梯度下降,是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代获取一定样本(batch_size)来对参数进行更新

优缺点

优点:

  1. 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多
  2. 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W,设置batch_size=100时,需要迭代3000次,远小于SGD的30W次)
  3. 可实现并行化

缺点:
batch_size的不当选择可能会带来一些问题

batcha_size的选择带来的影响

合理地范围内,增大batch_size的好处:

  1. 内存利用率提高了,大矩阵乘法的并行化效率提高。
  2. 跑完一次 epoch**(全数据集)**所需的迭代次数减少,对于相同数据量的处理速度进一步加快
  3. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起**训练震荡越小

盲目增大batch_size的坏处:

  1. 内存利用率提高了,但是内存容量可能撑不住了
  2. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢
  3. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化

小批量随机梯度下降(Mini-Batch Stochastic Gradient Descent)

是的,小批量随机梯度下降(Mini-Batch Stochastic Gradient Descent)是一种常用的优化算法。它是梯度下降法的一种变体,也是深度学习中最常用的优化算法之一。

在小批量随机梯度下降中,训练数据被划分为多个小批量(mini-batches),每个小批量包含一部分训练样本。在每次迭代中,优化器根据一个小批量的样本计算梯度,并使用梯度来更新模型的参数。这样做的好处是可以减少计算量,同时也可以增加随机性,使优化过程更具有泛化能力。

相对于批量梯度下降(Batch Gradient Descent),小批量随机梯度下降的优化速度更快,因为每次迭代只需要计算一个小批量的样本的梯度,而不是全部样本。此外,小批量随机梯度下降也可以避免陷入局部最优解,因为每个小批量的样本都是随机选择的,可以增加优化的随机性,有助于跳出局部最优。

需要注意的是,小批量随机梯度下降在设置小批量大小时需要权衡不同的因素。如果小批量大小太小,会导致梯度估计的方差较大,优化过程不稳定;如果小批量大小太大,会增加计算开销,降低优化速度。因此,选择适当的小批量大小是一个重要的调参问题。

三种梯度下降算法的收敛过程


image.png

调优策略


  • **学习率的选择:**学习率过大,表示每次迭代更新的时候变化比较大,有可能会跳过最优解;学习率过小,表示每次迭代更新的时候变化比较小,就会导致迭代速度过慢,很长时间都不能结束
  • **算法初始参数值的选择:**初始值不同,最终获得的最小值也有可能不同,因为梯度下降法求解的是局部最优解,所以一般情况下,选择多次不同初始值运行算法,并最终返回损失函数最小情况下的结果值
  • 标准化:由于样本不同特征的取值范围不同,可能会导致在各个不同参数上迭代速度不同,为了减少特征取值的影响,可以将特征进行标准化操作

三种梯度下降算法的比较


BGD、SGD、MBGD的区别:

  • 当样本为m时,每次迭代BGD算法中对于参数值更新一次,SGD算法中对于参数值更新m次,MBGD算法中对于参数值更新m/n次,相对来讲SGD算法更新速度最快。
  • SGD算法中对于每个样本都需要更新参数值,当样本值不太正常的时候,就有可能导致本次的参数更新会产生相反的影响,也就是说SGD算法的结果并不是完全收敛的,而是在收敛结果处波动的。
  • SGD算法是每个样本都更新一次参数值,所以SGD算法特别适合样本数据量大的情况以及在线学习(Online ML)。

线性回归与梯度下降的关系

线性回归是一种机器学习算法,用于建立一个线性模型来预测因变量与自变量之间的关系。梯度下降是一种优化算法,用于找到线性回归模型中的最优参数。

在线性回归中,我们需要找到最优的斜率和截距,使得模型的预测值与实际观测值之间的误差最小化。梯度下降通过迭代的方式来更新模型的参数,使得每一步的更新都朝着误差减小的方向前进。具体来说,梯度下降计算模型参数的梯度(即误差对参数的偏导数),然后按照梯度的方向和学习率的大小来更新参数值,直到达到收敛条件。

因此,梯度下降是线性回归中求解最优参数的一种方法。通过不断迭代更新参数,梯度下降可以找到使得线性回归模型拟合数据最好的参数值。



θ ( n ) = θ ( n − 1 ) − α ⋅ ∂ J ( θ ( n − 1 ) ) ∂ θ ( n − 1 ) θ^{(n)}=θ^{(n-1)}-α\cdot{\frac{\partial{J(θ^{(n-1)})}}{\partial{θ^{(n-1)}}}} θ(n)=θ(n1)αθ(n1)J(θ(n1))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值