📜  批量梯度下降和随机梯度下降的区别(1)

📅  最后修改于: 2023-12-03 15:25:48.438000             🧑  作者: Mango

批量梯度下降和随机梯度下降的区别

在机器学习中,梯度下降是一个常用的优化算法,用于最小化目标函数。批量梯度下降和随机梯度下降都是梯度下降算法的不同变体,两者有很多区别。

1. 概述

在梯度下降算法中,我们尝试最小化代价函数(目标函数)。代价函数可以被视为误差的度量指标,它衡量模型对训练数据的拟合程度。梯度下降算法通过计算代价函数的导数来更新模型的参数,当代价函数最小化时,模型的参数也会得到最优化。

批量梯度下降和随机梯度下降都是在每个迭代步骤中更新模型参数。他们的主要区别在于,批量梯度下降计算所有样本的代价函数梯度,而随机梯度下降只计算一个样本的代价函数梯度。

2. 批量梯度下降

批量梯度下降(Batch Gradient Descent,BGD)是最原始的梯度下降算法,它在每次迭代时使用所有训练集中的数据来更新模型的参数。具体地,批量梯度下降计算所有样本的代价函数梯度,并把梯度的平均值作为每个参数的更新值。

批量梯度下降的公式如下:

$$\theta_j=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j}$$

其中,$\theta_j$表示参数向量中的第$j$个参数,$J(\theta)$为目标函数(代价函数),$\alpha$为学习速率。

批量梯度下降的优点是能够很快的收敛,然而,当数据集很大时计算代价函数梯度的时间会很长,这使得批量梯度下降无法处理大规模数据集的问题。

3. 随机梯度下降

随机梯度下降(Stochastic Gradient Descent,SGD)是批量梯度下降的变体之一,它在每次迭代时只选择一个样本来更新模型的参数。具体地,随机梯度下降计算一个样本的代价函数梯度,并把梯度作为每个参数的更新值。

随机梯度下降的公式如下:

$$\theta_j=\theta_j-\alpha\frac{\partial J_i(\theta)}{\partial \theta_j}$$

其中,$J_i(\theta)$为第$i$个样本的目标函数,$\theta_j$表示参数向量中的第$j$个参数,$\alpha$为学习速率。

随机梯度下降的优点是处理大规模数据集比批量梯度下降更为高效,因为它在每次迭代时只使用一个样本。然而,它与批量梯度下降相比也更不稳定,因为随机梯度下降的更新过程对噪声比较敏感,它可能会在目标函数空间中震荡或跳过最小值点。

4. 批量梯度下降和随机梯度下降的比较

批量梯度下降和随机梯度下降有以下区别:

  • 计算代价函数梯度的方式不同。批量梯度下降计算所有样本的代价函数梯度,随机梯度下降只计算一个样本的代价函数梯度。
  • 每次参数更新的数据量不同。批量梯度下降在每次迭代中使用所有数据,而随机梯度下降只使用一个样本。
  • 收敛速度不同。当数据集较小时,随机梯度下降通常比批量梯度下降更快收敛。但是当数据集较大时,批量梯度下降通常更快地达到最小值。
  • 稳定性不同。批量梯度下降更稳定,因为它通过使用所有数据减少了噪声和方差。然而,它只适用于较小的数据集。随机梯度下降更不稳定,因为它通常更快地收敛,但它可能会错过全局最优点。
5. 代码实现

以下是使用Python实现的批量梯度下降和随机梯度下降代码示例。

# 批量梯度下降
def batch_gradient_descent(X, y, theta, alpha, num_iters):
    J_history = []
    m = len(y)
    for i in range(num_iters):
        h = X.dot(theta)
        theta = theta - alpha * (1/m) * X.T.dot(h-y)
        J_history.append(cost_function(X, y, theta))
    return theta, J_history

# 随机梯度下降
def stochastic_gradient_descent(X, y, theta, alpha, num_iters):
    J_history = []
    m = len(y)
    for i in range(num_iters):
        for j in range(m):
            rand_index = np.random.randint(0, m)
            X_i = X[rand_index,:].reshape(1, X.shape[1])
            y_i = y[rand_index].reshape(1,1)
            h = X_i.dot(theta)
            theta = theta - alpha * X_i.T.dot(h-y_i)
            J_history.append(cost_function(X, y, theta))
    return theta, J_history

以上示例中,cost_function是代价函数(目标函数)的实现,X是特征向量矩阵,y是标签向量,theta是参数向量,alpha是学习速率,num_iters是迭代次数。在batch_gradient_descent函数中,我们对所有的样本进行权重更新,并在每次迭代结束时记录代价函数的值。在stochastic_gradient_descent函数中,我们随机选择一个样本并对其进行权重更新,不断迭代,直到达到预设的迭代次数。