【ShuQiHere】SGD vs BGD:搞清楚它们的区别和适用场景

【ShuQiHere】

在机器学习中,优化模型是构建准确预测模型的关键步骤。优化算法帮助我们调整模型的参数,使其更好地拟合训练数据,减少预测误差。在众多优化算法中,梯度下降法 是一种最为常见且有效的手段。

梯度下降法主要有两种变体:批量梯度下降(Batch Gradient Descent, BGD)随机梯度下降(Stochastic Gradient Descent, SGD)。这两者在如何计算梯度并更新模型参数方面有所不同,适用于不同的应用场景。

为了更好地理解这两种算法的区别和适用场景,我们将在本文中通过一个简单的 线性回归 实例,逐步解释BGD和SGD的工作原理及其应用。


1. 什么是梯度下降?

在机器学习中,我们通常会构建一个模型来预测某些输出。以线性回归为例,模型的目标是找到一条最佳的直线,来描述输入数据与输出数据之间的关系。我们可以把这条直线用一个数学公式表示为:

[
y = w ⋅ x + b y = w \cdot x + b y=wx+b
]

其中,( w ) 是斜率,表示输入 ( x ) 每变化一个单位,输出 ( y ) 变化的程度;( b ) 是截距,表示当输入 ( x ) 为零时,输出 ( y ) 的值。通过训练,我们希望找到最合适的 ( w ) 和 ( b ) 值,使得这条直线能尽可能准确地预测输出 ( y )。

在这个过程中,我们需要一种方法来衡量模型预测值与实际值之间的差距,这个方法就是 损失函数。对于线性回归,常用的损失函数是 均方误差(Mean Squared Error, MSE),其公式如下:

[
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2
]

其中,( y_i ) 是第 ( i ) 个样本的真实值,( \hat{y}_i ) 是模型的预测值,( n ) 是样本总数。均方误差的意义在于:它告诉我们模型的预测与真实值之间的平均偏差有多大。

梯度下降 是一种迭代优化损失函数的算法。它的基本思想是:从当前参数开始,沿着损失函数下降最快的方向(即梯度的反方向)调整参数,使得损失逐步减小,直到找到最小值。梯度下降的更新公式为:

[
θ : = θ − α ⋅ ∇ θ J ( θ ) \theta := \theta - \alpha \cdot \nabla_\theta J(\theta) θ:=θαθJ(θ)
]

其中,( \theta ) 是模型参数(如 ( w ) 和 ( b )),( \alpha ) 是学习率,决定了每次更新的步长大小,( \nabla_\theta J(\theta) ) 是损失函数对参数 ( \theta ) 的梯度,表示损失函数关于参数变化的方向和速率。


2. 什么是Batch Gradient Descent (BGD)?

批量梯度下降(Batch Gradient Descent, BGD) 是梯度下降的一种经典形式。它的特点是在每次迭代时,使用整个训练集来计算损失函数的梯度,并根据这个全局梯度来更新模型的参数。

BGD的工作机制

让我们通过一个简单的线性回归例子来解释 BGD 的工作方式。假设我们有一个包含 ( m ) 个样本的训练集。每次迭代时,BGD 计算整个训练集的损失,并对所有参数(如 ( w ) 和 ( b ))同时进行更新。具体步骤如下:

  1. 计算梯度:对于整个训练集,计算损失函数的梯度:
    [
    ∇ w J ( w ) = 1 m ∑ i = 1 m ( y i − y ^ i ) ⋅ x i \nabla_w J(w) = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i) \cdot x_i wJ(w)=m1i=1m(yiy^i)xi
    ]
    [
    ∇ b J ( b ) = 1 m ∑ i = 1 m ( y i − y ^ i ) \nabla_b J(b) = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i) bJ(b)=m1i=1m(yiy^i)
    ]
    这里,( m ) 是样本数,( \hat{y}_i = w \cdot x_i + b ) 是模型的预测值。这个步骤的关键在于,我们使用所有的样本来计算梯度,因此得到的是整体误差的方向。

  2. 更新参数:根据计算出的梯度,更新模型参数:
    [
    w : = w − α ⋅ ∇ w J ( w ) w := w - \alpha \cdot \nabla_w J(w) w:=wαwJ(w)
    ]
    [
    b : = b − α ⋅ ∇ b J ( b ) b := b - \alpha \cdot \nabla_b J(b) b:=bαbJ(b)
    ]
    这个更新公式意味着我们要沿着误差减小的方向调整参数 ( w ) 和 ( b ),以减少模型的预测误差。

  3. 重复迭代:不断重复上述步骤,直到损失函数的值收敛到一个较小的范围,或达到预设的迭代次数。这个过程通常需要多次迭代,才能让模型找到最佳的参数。

BGD的优缺点

优点:

  • 稳定性:由于每次更新都使用了整个训练集,更新方向是基于全局信息的,因此每次参数更新都较为稳定,不会因为单个样本的噪声而有太大波动。
  • 适合小规模数据:对于小规模的数据集,BGD 能充分利用所有样本的信息,来找到更好的模型参数。

缺点:

  • 计算开销大:对于大规模数据集,每次更新都需要计算整个训练集的梯度,这可能会非常耗时,尤其在数据集非常庞大的情况下。
  • 内存消耗大:如果数据集太大,可能会超出计算设备的内存容量,无法一次性加载整个数据集进行计算。
实例:用线性回归模型演示BGD

假设我们要解决一个简单的线性回归问题,目标是根据房屋面积(输入变量)预测房价(输出变量)。我们有1000个样本数据,使用BGD来训练模型参数 ( w ) 和 ( b )。

  1. 初始化参数:首先,我们随机初始化参数 ( w ) 和 ( b )。
  2. 计算梯度并更新参数:在每次迭代中,我们使用所有1000个样本来计算梯度,然后根据这个梯度来调整 ( w ) 和 ( b ) 的值。
  3. 重复过程:不断重复上述过程,直到模型的损失函数值收敛或达到预设的迭代次数。

在这个例子中,每次迭代我们都利用了所有的样本信息,因此收敛路径相对稳定,但计算量较大。


3. 什么是Stochastic Gradient Descent (SGD)?

随机梯度下降(Stochastic Gradient Descent, SGD) 是梯度下降的另一种变体。与BGD不同,SGD在每次迭代中只使用一个样本来计算梯度并更新模型参数。虽然这种方法在每次更新中引入了更多的噪声,但也大幅提升了计算效率,尤其在大规模数据集上。

SGD的工作机制

同样以线性回归为例,SGD 的工作过程如下:

  1. 随机选择一个样本:在每次迭代中,从训练集中随机选择一个样本 ( (x_i, y_i) )。

  2. 计算梯度:使用该样本计算损失函数的梯度:
    [
    ∇ w J ( w ) = ( y i − y ^ i ) ⋅ x i \nabla_w J(w) = (y_i - \hat{y}_i) \cdot x_i wJ(w)=(yiy^i)xi
    ]
    [
    ∇ b J ( b ) = ( y i − y ^ i ) \nabla_b J(b) = (y_i - \hat{y}_i) bJ(b)=(yiy^i)
    ]
    这里,(
    y ^ i = w ⋅ x i + b   \hat{y}_i = w \cdot x_i + b \ y^i=wxi+b 
    ) 是模型的预测值。因为我们只用一个样本来计算梯度,计算的速度会很快,但会带来一些随机波动。

  3. 更新参数:根据计算出的梯度,更新模型参数:
    [
    w : = w − α ⋅ ∇ w J ( w ) w := w - \alpha \cdot \nabla_w J(w) w:=wαwJ(w)
    ]
    [
    b : = b − α ⋅ ∇ b J ( b ) b := b - \alpha \cdot \nabla_b J(b) b:=bαbJ(b)
    ]
    这一步骤与BGD类似,但由于每次只基于一个样本进行更新,更新的方向会受到该样本的影响,可能会

有所波动。

  1. 重复迭代:不断随机选择不同的样本并重复上述步骤,直到损失函数收敛或达到预设的迭代次数。SGD 的收敛通常需要更多的迭代次数,但每次迭代的计算成本很低。
SGD的优缺点

优点:

  • 速度快:SGD 的每次更新只需要计算一个样本的梯度,因此更新频率高,速度快。
  • 适合大规模数据:SGD 不需要一次性加载整个数据集,非常适合处理大规模数据集。
  • 可能跳出局部最优:由于每次更新的方向带有随机性,SGD 在面对复杂的非凸优化问题时,可能帮助模型跳出局部最优,找到更好的解。

缺点:

  • 更新波动大:由于每次更新仅基于一个样本,更新路径可能会非常不稳定,需要通过调整学习率或使用一些优化算法(如动量、Adam)来减小波动。
  • 收敛不稳定:如果学习率设置不当,SGD 可能在迭代过程中表现出过大的振荡或难以收敛。
实例:用线性回归模型演示SGD

假设我们使用同样的线性回归问题来训练模型参数 ( w ) 和 ( b ),但这次我们使用 SGD:

  1. 随机选择一个样本:例如,选择房屋面积为 120 平方米的样本。
  2. 计算梯度并更新参数:使用该样本计算损失函数的梯度,然后更新参数。
  3. 重复这个过程:每次随机选择不同的样本进行梯度计算和参数更新,直到模型收敛。

在这种情况下,SGD 每次迭代只使用一个样本,计算速度非常快,但更新路径可能不如 BGD 稳定。


4. BGD vs SGD:区别与联系

工作机制的比较
  • BGD 每次迭代时使用整个训练集来计算梯度并更新参数,这使得它的更新更加稳定,但计算量较大,适合较小的数据集。
  • SGD 每次迭代时只使用一个样本进行更新,这使得它在大数据集上计算效率更高,但更新路径会有较大的波动。
适用场景的比较
  • BGD 适合数据量较小、要求计算稳定性的场景,如学术研究或需要高精度的模型。
  • SGD 适合数据量较大、需要快速迭代的场景,如在线广告的点击预测、实时推荐系统等。
结合实例说明

在我们讨论的线性回归例子中,BGD 更适合在数据集较小的情况下使用,因为它能充分利用所有样本的信息进行稳健的更新;而 SGD 则更适合处理大规模数据集,特别是在实时性要求高的场景中。


5. 实际应用中的选择策略

Mini-batch Gradient Descent

Mini-batch Gradient Descent 是一种折中方案,它结合了 BGD 和 SGD 的优点。在每次迭代中,使用一小部分样本(称为 mini-batch)来计算梯度并更新参数。它能够在计算效率和更新稳定性之间找到平衡,通常在实践中被广泛使用。

不同场景下的选择策略
  • BGD:适合数据集较小且对计算时间要求不高的场景,如学术研究、小规模实验等。
  • SGD:适合数据集较大且需要快速训练的场景,如大规模在线服务、实时预测等。
  • Mini-batch Gradient Descent:适合需要兼顾效率和稳定性的场景,尤其在数据集较大且训练资源有限的情况下。

6. 优化和调优策略

调整学习率

无论是 BGD 还是 SGD,学习率的选择都至关重要。学习率过大会导致算法不收敛,而学习率过小则会导致收敛速度缓慢。常见的优化策略包括使用 学习率衰减(随着训练进行逐步降低学习率),以帮助模型更平稳地收敛。

其他优化算法

除了基础的 BGD 和 SGD,还有一些高级优化算法如 动量(Momentum)Adam,它们通过引入额外的机制(如动量项、梯度的自适应调整)来进一步提升收敛效率和稳定性。这些算法往往能在复杂的优化问题中表现出更好的效果。


7. 总结

BGD 和 SGD 是两种常见的梯度下降算法,各有优缺点。BGD 适合处理小数据集和需要稳定更新的场景,而 SGD 则更适合大数据集和需要快速训练的任务。通过理解这两种算法的工作原理及其在实际应用中的表现,我们可以根据任务需求选择合适的优化方法。

此外,Mini-batch Gradient Descent 提供了一种兼顾效率与稳定性的解决方案,可以在实际应用中广泛使用。同时,使用 动量Adam 等优化算法,能够进一步提高模型的训练效率和最终表现。


8. 参考文献

  • [推荐阅读]:Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, MIT Press.
  • [推荐阅读]:Sebastian Raschka, Python Machine Learning, Packt Publishing.

  • 17
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShuQiHere

啊这,不好吧

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

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

打赏作者

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

抵扣说明:

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

余额充值