一、什麼是隨機梯度下降?
隨機梯度下降(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