一、什么是随机梯度下降?
随机梯度下降(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中如何实现该算法。任何时候,在实际应用中,必须要少量地处理证明梯度算法的正确性。因此,在实际应用时使用小批量随机梯度下降可能是一个很好的选择,实现其可通过控制批量大小,权衡模型精度和运行时间。