批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

本文深入探讨了批量梯度下降(BGD)、随机梯度下降(SGD)及小批量梯度下降(MBGD)三种梯度下降方法的概念、工作原理及其在机器学习中的应用。通过对比分析,帮助读者理解不同梯度下降方法的优缺点。

批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解
转载:https://www.cnblogs.com/lliuye/p/9451903.html

### 批量梯度下降BGD) - **原理**:批量梯度下降在每一次迭代时,使用整个训练数据集来计算梯度,然后更新模型参数。其目标是最小化损失函数,通过沿着损失函数的负梯度方向更新参数,使得损失函数的值逐渐减小。假设损失函数为 $J(\theta)$,参数为 $\theta$,学习率为 $\alpha$,则参数更新公式为 $\theta = \theta - \alpha \nabla J(\theta)$,其中 $\nabla J(\theta)$ 是基于整个训练集计算得到的梯度。 - **特点**: - 收敛稳定,因为每次更新参数都是基于整个训练集的信息,所以能朝着全局最优解的方向稳定下降。 - 计算开销大,当训练数据集非常大时,每次迭代都要处理所有样本,计算梯度的时间和内存成本都很高。 - 收敛速度可能较慢,尤其是在数据集较大时,每次迭代的计算量巨大,导致整体收敛到最优解的时间较长。 ### 随机梯度下降SGD) - **原理**:随机梯度下降在每一次迭代时,随机选择一个样本计算梯度并更新模型参数。即每次只使用一个样本的信息来估计梯度,参数更新公式同样为 $\theta = \theta - \alpha \nabla J_i(\theta)$,其中 $J_i(\theta)$ 是第 $i$ 个样本的损失函数。 - **特点**: - 计算速度快,由于每次只处理一个样本,计算梯度的时间和内存开销都很小,适合大规模数据集。 - 收敛过程不稳定,因为每次只基于一个样本的信息更新参数,会导致参数更新的方向具有随机性,可能会在最优解附近震荡,难以精确收敛到全局最优解。 - 有可能跳出局部最优解,由于其随机性,在某些情况下能够跳出局部最优,找到更优的解。 ### 小批量梯度下降MBGD) - **原理**:小批量梯度下降结合了批量梯度下降随机梯度下降的优点,每次使用一个小批量(mini - batch)样本来计算梯度并更新模型参数。这个小批量通常是从训练数据中随机选择的一部分(如32个、64个或128个样本)。参数更新公式为 $\theta = \theta - \alpha \nabla J_{batch}(\theta)$,其中 $J_{batch}(\theta)$ 是小批量样本的损失函数[^1]。 - **特点**: - 计算效率较高,相比于批量梯度下降小批量梯度下降每次处理的样本数量较少,减少了计算梯度的时间和内存开销。 - 收敛相对稳定,由于使用了多个样本的信息,比随机梯度下降更能稳定地朝着最优解方向下降,减少了震荡。 - 泛化能力较好,在实际应用中,小批量梯度下降通常能取得较好的泛化效果。 ### 区别 - **样本使用数量**:批量梯度下降使用整个训练集,随机梯度下降使用单个样本,小批量梯度下降使用小批量样本。 - **计算效率**:随机梯度下降计算速度最快,批量梯度下降计算开销最大,小批量梯度下降介于两者之间。 - **收敛稳定性**:批量梯度下降收敛最稳定,随机梯度下降收敛最不稳定,小批量梯度下降收敛稳定性较好。 - **收敛速度**:在大多数情况下,小批量梯度下降的收敛速度较快,随机梯度下降可能在前期收敛较快,但后期可能会在最优解附近震荡,批量梯度下降在数据集较大时收敛速度较慢。 以下是一个简单的Python代码示例,展示三种梯度下降的基本实现: ```python import numpy as np # 生成一些示例数据 X = np.array([[1], [2], [3], [4], [5]]) y = np.array([2, 4, 6, 8, 10]) # 初始化参数 theta = np.zeros((1, 1)) learning_rate = 0.01 epochs = 100 # 批量梯度下降 def batch_gradient_descent(X, y, theta, learning_rate, epochs): m = len(y) for _ in range(epochs): gradients = (2/m) * X.T.dot(X.dot(theta) - y.reshape(-1, 1)) theta = theta - learning_rate * gradients return theta # 随机梯度下降 def stochastic_gradient_descent(X, y, theta, learning_rate, epochs): m = len(y) for _ in range(epochs): for i in range(m): random_index = np.random.randint(m) xi = X[random_index:random_index+1] yi = y[random_index:random_index+1] gradients = 2 * xi.T.dot(xi.dot(theta) - yi.reshape(-1, 1)) theta = theta - learning_rate * gradients return theta # 小批量梯度下降 def mini_batch_gradient_descent(X, y, theta, learning_rate, epochs, batch_size=2): m = len(y) for _ in range(epochs): shuffled_indices = np.random.permutation(m) X_shuffled = X[shuffled_indices] y_shuffled = y[shuffled_indices] for i in range(0, m, batch_size): xi = X_shuffled[i:i+batch_size] yi = y_shuffled[i:i+batch_size] gradients = (2/batch_size) * xi.T.dot(xi.dot(theta) - yi.reshape(-1, 1)) theta = theta - learning_rate * gradients return theta # 调用不同的梯度下降方法 theta_bgd = batch_gradient_descent(X, y, theta, learning_rate, epochs) theta_sgd = stochastic_gradient_descent(X, y, theta, learning_rate, epochs) theta_mbgd = mini_batch_gradient_descent(X, y, theta, learning_rate, epochs) print("批量梯度下降得到的参数:", theta_bgd) print("随机梯度下降得到的参数:", theta_sgd) print("小批量梯度下降得到的参数:", theta_mbgd) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值