📅  最后修改于: 2023-12-03 15:25:48.438000             🧑  作者: Mango
在机器学习中,梯度下降是一个常用的优化算法,用于最小化目标函数。批量梯度下降和随机梯度下降都是梯度下降算法的不同变体,两者有很多区别。
在梯度下降算法中,我们尝试最小化代价函数(目标函数)。代价函数可以被视为误差的度量指标,它衡量模型对训练数据的拟合程度。梯度下降算法通过计算代价函数的导数来更新模型的参数,当代价函数最小化时,模型的参数也会得到最优化。
批量梯度下降和随机梯度下降都是在每个迭代步骤中更新模型参数。他们的主要区别在于,批量梯度下降计算所有样本的代价函数梯度,而随机梯度下降只计算一个样本的代价函数梯度。
批量梯度下降(Batch Gradient Descent,BGD)是最原始的梯度下降算法,它在每次迭代时使用所有训练集中的数据来更新模型的参数。具体地,批量梯度下降计算所有样本的代价函数梯度,并把梯度的平均值作为每个参数的更新值。
批量梯度下降的公式如下:
$$\theta_j=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j}$$
其中,$\theta_j$表示参数向量中的第$j$个参数,$J(\theta)$为目标函数(代价函数),$\alpha$为学习速率。
批量梯度下降的优点是能够很快的收敛,然而,当数据集很大时计算代价函数梯度的时间会很长,这使得批量梯度下降无法处理大规模数据集的问题。
随机梯度下降(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$为学习速率。
随机梯度下降的优点是处理大规模数据集比批量梯度下降更为高效,因为它在每次迭代时只使用一个样本。然而,它与批量梯度下降相比也更不稳定,因为随机梯度下降的更新过程对噪声比较敏感,它可能会在目标函数空间中震荡或跳过最小值点。
批量梯度下降和随机梯度下降有以下区别:
以下是使用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函数中,我们随机选择一个样本并对其进行权重更新,不断迭代,直到达到预设的迭代次数。