小批量隨機梯度下降

一、什麼是隨機梯度下降?

隨機梯度下降(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/zh-tw/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

發表回復

登錄後才能評論