当前位置:   article > 正文

AI学习指南数学工具篇-梯度下降算法之随机梯度下降(Stochastic Gradient Descent)

AI学习指南数学工具篇-梯度下降算法之随机梯度下降(Stochastic Gradient Descent)

AI学习指南数学工具篇-梯度下降算法之随机梯度下降(Stochastic Gradient Descent)

梯度下降算法是机器学习中常用的优化算法,用于最小化损失函数并找到最优模型参数。其中,随机梯度下降(Stochastic Gradient Descent)是一种常见的梯度下降算法之一,与批量梯度下降有着一些有趣的区别。本文将对随机梯度下降进行详细解释,并与批量梯度下降进行比较,以帮助读者更好地理解这一常用的优化算法。

一、梯度下降算法简介

梯度下降算法是一种迭代优化算法,用于寻找函数的最小值。在机器学习中,我们通常使用梯度下降算法来更新模型的参数,使得损失函数的值逐渐减小,从而找到最优的模型参数。其基本思想是沿着损失函数的梯度方向不断调整参数,直至找到最优解。

假设有一个损失函数 J ( θ ) J(θ) J(θ),其中 θ θ θ 是模型的参数。梯度下降算法的更新规则如下:

θ t + 1 = θ t − α ∇ J ( θ t ) θ_{t+1} = θ_t - α∇J(θ_t) θt+1=θtαJ(θt)

其中, ∇ J ( θ t ) ∇J(θ_t) J(θt) 表示损失函数 J ( θ ) J(θ) J(θ) 在参数 θ t θ_t θt 处的梯度, α α α 是学习率。

二、随机梯度下降算法

随机梯度下降(Stochastic Gradient Descent,SGD)是梯度下降算法的一种变种。与批量梯度下降不同的是,SGD 不是在每一次迭代中都使用全部训练样本来更新参数,而是随机地选择一个样本来计算梯度并更新参数。其更新规则如下:

θ t + 1 = θ t − α ∇ J ( θ t ; x i , y i ) θ_{t+1} = θ_t - α∇J(θ_t; x_i, y_i) θt+1=θtαJ(θt;xi,yi)

其中, ( x i , y i ) (x_i, y_i) (xi,yi) 是随机选择的一个训练样本, ∇ J ( θ t ; x i , y i ) ∇J(θ_t; x_i, y_i) J(θt;xi,yi) 是损失函数 J ( θ ) J(θ) J(θ) 在参数 θ t θ_t θt 处关于样本 ( x i , y i ) (x_i, y_i) (xi,yi) 的梯度。

三、随机梯度下降与批量梯度下降的区别

  1. 计算效率:

    • 批量梯度下降需要在每一次迭代中使用全部的训练样本来计算梯度,因此在数据集较大时,计算效率较低。
    • 随机梯度下降只使用一个样本来计算梯度,因此计算效率较高。
  2. 收敛速度:

    • 批量梯度下降通常能在较少的迭代次数内收敛到最优解,尤其在凸优化问题中表现良好。
    • 随机梯度下降由于随机性的影响,收敛过程中损失函数的下降曲线会更加崎岖,收敛速度较慢。
  3. 稳定性:

    • 批量梯度下降通常更加稳定,由于每一次迭代都使用全部样本,参数的更新更加可靠。
    • 随机梯度下降的参数更新受到单个样本的影响,因此会更加不稳定,容易陷入局部最优解。

四、随机梯度下降的示例

为了更好地理解随机梯度下降算法,我们以一个简单的线性回归问题为例进行说明。假设我们的模型为 y = k x + b y = kx + b y=kx+b,其中 k k k b b b 是我们要优化的参数,损失函数为均方误差:

J ( k , b ) = 1 2 N ∑ i = 1 N ( y i − ( k x i + b ) ) 2 J(k, b) = \frac{1}{2N} \sum_{i=1}^{N} (y_i - (kx_i + b))^2 J(k,b)=2N1i=1N(yi(kxi+b))2

我们使用随机梯度下降算法来优化参数 k k k b b b,假设学习率 α = 0.01 α = 0.01 α=0.01


import numpy as np

# 生成样本数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 定义损失函数的梯度
def gradients(k, b, x_i, y_i):
    y_pred = k * x_i + b
    return np.array([-(y_i - y_pred) * x_i, -(y_i - y_pred)])

# 随机梯度下降算法
def stochastic_gradient_descent(X, y, epochs, learning_rate):
    k = np.random.randn(1)
    b = np.random.randn(1)
    m = len(X)

    for epoch in range(epochs):
        for i in range(m):
            random_index = np.random.randint(m)
            x_i = X[random_index]
            y_i = y[random_index]
            gradient = gradients(k, b, x_i, y_i)
            k -= learning_rate * gradient[0]
            b -= learning_rate * gradient[1]

    return k, b

# 运行随机梯度下降算法
k_hat, b_hat = stochastic_gradient_descent(X, y, epochs=1000, learning_rate=0.01)
print("k =", k_hat, "b =", b_hat)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

通过上述示例,我们可以看到随机梯度下降算法是如何使用单个样本来计算梯度并更新参数的。通过多次迭代,参数 k k k b b b 逐渐优化,最终得到最优解。

五、总结

通过本文的讲解,我们了解了随机梯度下降算法及其与批量梯度下降的区别。随机梯度下降算法通常在大型数据集和在线学习中表现优异,但也存在收敛速度较慢和参数更新不稳定的问题。在实际应用中,我们需要根据具体问题选择合适的优化算法来保证模型的性能。

希望本文能够帮助读者更好地理解随机梯度下降算法,欢迎大家留言讨论。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/622983
推荐阅读
相关标签
  

闽ICP备14008679号