小批量随机梯度下降

一、什么是随机梯度下降?

随机梯度下降(Stochastic Gradient Descent, SGD)是一种常用的,用于求解最小二乘问题(包括线性回归和逻辑回归)的优化算法。SGD的主要思想是在每次迭代中,选择其中一个样本来计算梯度。

对于一个损失函数(loss function)L(θ),其被最小化的任务是:找到一组参数 θ₀, θ₁ … θₙ,使得损失函数 L(θ) 达到最小值。在SGD中,我们首先选择一个初始参数,然后对于每个训练数据xᵢ,使用它来更新模型的参数。具体的,每次更新的公式为:

    θ ← θ - α∇L(θ; xⁱ)

其中,α是学习率(learning rate),∇L(θ; xⁱ) 是样本xⁱ对于θ的梯度(gradient),表示模型在当前状态下,沿着梯度方向移动的速度。

二、什么是小批量随机梯度下降?

在实际应用中,我们往往并不会在每次迭代中只用单个样本来更新参数,而是采用一小批样本的平均梯度来更新参数,这种方法被称为小批量随机梯度下降(Mini-batch Stochastic Gradient Descent, MSGD)。

与SGD相比,MSGD可以更稳定地找到一组局部最优的参数,因为每一次前向传播(Forward propagation)和反向传播(Backward propagation)都使用了一组样本的平均信息。

三、小批量随机梯度下降的实现

实现MSGD的步骤可以分为以下几步:

1、首先,我们定义训练集。在本文中,我们使用一个模拟的数据集:y=2x+1+ϵ,其中,x为一个随机的二维数组,ϵ为服从正态分布的随机噪声。

    import numpy as np
    
    np.random.seed(42)
    X = np.random.rand(100, 2)
    y = 1 + 2 * X[:, 0] + 3 * X[:, 1] + np.random.randn(100)

2、然后,我们定义随机初始化参数θ,并设置学习率、批量大小、迭代次数:

    theta = np.random.randn(3, 1)
    eta = 0.1
    n_epochs = 50
    batch_size = 3

3、接下来,我们可以定义一个迭代函数,用于随机选择一批样本数据,并根据这些数据来更新参数:

    def fetch_batch(X, y, batch_size):
        rnd_indices = np.random.permutation(len(X))
        n_batches = len(X) // batch_size
        for batch_idx in np.array_split(rnd_indices, n_batches):
            X_batch, y_batch = X[batch_idx], y[batch_idx]
            yield X_batch, y_batch
    
    for epoch in range(n_epochs):
        for X_batch, y_batch in fetch_batch(X, y, batch_size):
            X_b = np.c_[np.ones((len(X_batch), 1)), X_batch]
            gradients = 2 / len(X_batch) * X_b.T.dot(X_b.dot(theta) - y_batch.reshape(-1, 1))
            theta -= eta * gradients

其中,fetch_batch定义了迭代过程中每个批次的样本,其中rand_indices指定了每个epoch的样本顺序,利用np.array_split可以将样本按照batch_size拆分,最后用X_batch和y_batch的数据进行梯度的计算和更新。

四、小结

本文介绍了随机梯度下降及其变种小批量随机梯度下降,并给出了在Python中如何实现该算法。任何时候,在实际应用中,必须要少量地处理证明梯度算法的正确性。因此,在实际应用时使用小批量随机梯度下降可能是一个很好的选择,实现其可通过控制批量大小,权衡模型精度和运行时间。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/243074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:54
下一篇 2024-12-12 12:54

相关推荐

  • 预处理共轭梯度法

    预处理共轭梯度法是一种求解线性方程组的迭代方法,相比直接求解,其具有更高的效率和更快的速度。本文将从几个方面对预处理共轭梯度法进行详细的阐述,并给出完整的代码示例。 一、预处理共轭…

    编程 2025-04-28
  • Python逻辑回归梯度下降法

    本文将通过Python逻辑回归梯度下降法,对于逻辑回归的原理、实现方法和应用进行详细阐述。 一、逻辑回归原理 逻辑回归是一种常用的分类算法,其原理可以用线性回归模型来描述,将线性回…

    编程 2025-04-27
  • 梯度、散度、旋度的意义及应用

    一、梯度 梯度,是矢量函数的微分运算,表示函数在该点变化最快的方向和大小,通俗地说,就是函数在某点的变化率,其形式化表示如下: $$\nabla f = \frac{\partia…

    编程 2025-04-24
  • 矩阵梯度详解

    在深度学习算法中,矩阵梯度是一个重要的概念,它是一个向量,表示函数在某个点上的变化率。接下来从多个方面对矩阵梯度进行详细的阐述。 一、概述 矩阵梯度的概念最早由欧拉、拉格朗日等数学…

    编程 2025-04-12
  • 小批量梯度下降法的详细阐述

    一、什么是小批量梯度下降法 1、小批量梯度下降法(Mini-batch Gradient Descent, MBGD)是一种介于梯度下降法(GD)和随机梯度下降法(SGD)之间的优…

    编程 2025-02-15
  • 梯度下降法Python代码详解

    学习机器学习算法必不可少的就是梯度下降法。而Python作为一种易学易用的编程语言,自然也有很多开源库可以实现梯度下降法,如Numpy和SciPy等。本文将从多个方面详细探讨梯度下…

    编程 2025-01-16
  • 梯度下降法Python代码详解

    学习机器学习算法必不可少的就是梯度下降法。而Python作为一种易学易用的编程语言,自然也有很多开源库可以实现梯度下降法,如Numpy和SciPy等。本文将从多个方面详细探讨梯度下…

    编程 2025-01-16
  • 梯度直方图:一种简单但强大的图像处理技术

    一、梯度直方图是什么? 梯度直方图是一种简单但强大的图像处理技术,常用于计算机视觉、机器学习、图像处理等领域。梯度直方图可以对图像进行精细的特征表示,从而能够帮助我们更好地理解和处…

    编程 2024-12-16
  • 随机梯度下降法

    一、基本概念 随机梯度下降法(Stochastic Gradient Descent,SGD)相对于传统的梯度下降法,是一种更为高效的机器学习优化算法。梯度下降法每次迭代都要遍历整…

    编程 2024-12-15
  • 深度解析梯度计算公式

    梯度是机器学习和深度学习中常用的数学概念,是指函数在某点处沿着最快上升方向的方向导数。在神经网络中,梯度常用于反向传播算法,计算损失函数对模型参数的导数,以便更新参数,使得模型更加…

    编程 2024-12-12

发表回复

登录后才能评论