深度学习(十七):全批量梯度下降 (BGD)、随机梯度下降 (SGD) 和小批量梯度下降 (MBGD)
**梯度下降(Gradient Descent)**是深度学习中用于最小化损失函数(Loss Function)的核心优化算法。它的基本思想是:沿着损失函数对模型参数的梯度(即最陡峭的下降方向)的反方向,迭代地更新参数,直到收敛到局部(或全局)最小值。
在实践中,根据每次参数更新时所使用的训练样本数量,梯度下降算法被划分为三种主要变体,它们在计算效率、收敛速度和稳定性方面各有权衡。
全批量梯度下降 (Batch Gradient Descent, BGD)
1. 原理与方法
全批量梯度下降,通常简称为梯度下降 (GD),在每一次参数更新迭代时,都使用整个训练数据集来计算损失函数的梯度。
- 数据使用量: N(整个数据集的样本总数)
- 更新频率: 每一轮 (Epoch) 训练只更新一次参数。
流程:
- 将整个训练集输入网络。
- 计算所有 N 个样本的损失,并求平均损失。
- 计算平均损失对所有参数的梯度。
- 根据梯度更新参数,完成一次迭代。
2. 特点与权衡
优点 | 缺点 |
---|---|
精确稳定的梯度: 由于使用了全部数据,计算出的梯度是损失函数的真实梯度,方差最小,参数更新方向最准确。 | 训练速度极慢: 对于大型数据集,每次迭代都需要遍历全部样本,计算量巨大,耗时极长。 |
收敛路径平滑: 损失函数会沿着一个相对平滑的路径单调下降,能够稳定地收敛到局部最小值(对于凸函数可收敛到全局最小值)。 | 内存消耗巨大: 需要将整个训练集加载到内存或显存中进行计算。 |
适合凸损失函数: 在损失函数是凸函数的情况下,收敛性有理论保证。 | 容易陷入局部最优: 收敛路径过于平稳,缺乏随机性,在非凸的深度学习损失曲面中,容易在“碗底”的局部最优解处停止,缺乏逃逸能力。 |
3. 应用场景
在现代深度学习中,由于数据集规模庞大,BGD 几乎很少被单独使用,它主要用于以下场景:
- 数据集非常小(如几百个样本)。
- 需要精确追踪损失函数随迭代次数的变化。
- 作为理论分析的基础。
随机梯度下降 (Stochastic Gradient Descent, SGD)
1. 原理与方法
随机梯度下降是 BGD 的一个极端版本。它在每一次参数更新迭代时,只随机选取训练集中的 一个样本 来计算梯度。
- 数据使用量: 1
- 更新频率: 每处理一个样本就更新一次参数。在一个 Epoch 内,如果数据集大小为 N,则参数更新 N 次。
流程:
- 从训练集中随机选取一个样本 (xi,yi)。
- 计算该样本的损失。
- 计算该样本损失对参数的梯度。
- 根据梯度更新参数,完成一次迭代。
- 重复 N 次完成一个 Epoch。
2. 特点与权衡
优点 | 缺点 |
---|---|
训练速度最快: 每次迭代计算量极小(只需处理一个样本),参数更新频率最高,收敛速度在样本数上非常快。 | 梯度方差大(更新路径“嘈杂”): 单一样本的梯度是对真实梯度的随机近似,噪声大,更新方向波动性强。 |
内存消耗极低: 每次只需处理一个样本,对内存/显存要求最低。 | 收敛震荡剧烈: 学习路径波动大,不会平稳地收敛到最小值,而是在最小值附近不断震荡。 |
更强的逃逸能力: 梯度中的随机性有助于模型跳出浅层的局部最小值,最终可能找到更好的全局/近似全局最优解。 | 无法充分利用硬件并行计算能力: 现代硬件(GPU/TPU)针对矩阵/向量运算优化,处理单个样本的效率远低于批量处理。 |
3. 应用场景
虽然 SGD 这个名称在深度学习文献中经常用来泛指所有随机优化器(包括小批量),但纯粹的单样本 SGD在现代深度学习中也很少使用,因为它效率低下且更新路径过于不稳定。
小批量梯度下降 (Mini-Batch Gradient Descent, MBGD)
1. 原理与方法
小批量梯度下降是 BGD 和 SGD 之间的一个最优折衷方案,也是当前深度学习最常用、最推荐的优化算法。它在每次参数更新时,使用训练集中的一个**小批量(Mini-Batch)**样本来计算梯度。
- 数据使用量: B(批量大小,通常 1<B<N)
- 更新频率: 每处理 B 个样本就更新一次参数。在一个 Epoch 内,更新 N/B 次。
流程:
- 将训练集划分为 M=N/B 个小批量数据块。
- 选取第 k 个小批量 {(x(k),y(k))}i=1B 输入网络。
- 计算这 B 个样本的平均损失。
- 计算平均损失对参数的梯度。
- 根据梯度更新参数,完成一次迭代。
2. 核心优势与特点
优点 | 缺点 |
---|---|
平衡了稳定性和速度: 梯度方差小于 SGD(更稳定),更新频率高于 BGD(更快)。 | 需要调参: 批量大小 B 是一个需要优化的超参数。 |
高效利用硬件: 小批量数据可以高效地进行向量化和并行计算,充分利用 GPU/TPU 的矩阵运算能力,这是其核心优势。 | 收敛路径仍有波动: 相比 BGD,收敛路径仍有轻微波动,但比 SGD 平稳得多。 |
适中的逃逸能力: 适度的梯度噪声使其能有效避免陷入局部最优解。 |
3. 批量大小(Batch Size, B)的选择
批量大小 B 是一个关键超参数,它直接影响训练的效率和泛化能力。
批量大小 B | 影响 | 适用场景 |
---|---|---|
小批量 (e.g., B=16,32,64) | 泛化能力更好,收敛速度更快,内存效率高。梯度噪声略大。 | 大多数深度学习任务的标准选择,如 CV 和 NLP。 |
大批量 (e.g., B=256,512,1024) | 梯度估计更准确,收敛更稳定,但可能牺牲泛化能力(大批量可能导致泛化能力下降)。 | 硬件资源充足,或需要更精确梯度的场景。 |
三种方法的详细对比与总结
下表从多个维度对这三种梯度下降变体进行总结比较:
特性 | 全批量梯度下降 (BGD) | 随机梯度下降 (SGD) | 小批量梯度下降 (MBGD) |
---|---|---|---|
数据量/次更新 | 整个数据集 N | 1 个样本 | B 个样本 (1<B<N) |
更新频率/Epoch | 1 次 | N 次 | N/B 次 |
梯度方差/噪声 | 最低 (真实梯度) | 最高 (随机噪声) | 中等 |
收敛路径 | 平稳,单调下降 | 剧烈震荡,最终在最小值附近徘徊 | 平稳且快速,有轻微震荡 |
收敛速度 (迭代次数) | 慢(迭代次数少,但单次耗时长) | 快(更新频繁) | 最快(平衡了效率和更新频率) |
计算效率 | 低(单次计算成本高) | 低(无法并行计算) | 高(可高度并行化) |
内存/显存 | 高 | 低 | 中等 |
深度学习应用 | 几乎不用 | 理论基石,但纯粹的单样本很少用 | 工业界和研究中最常用的方法 |
总结
小批量梯度下降(MBGD)在现代深度学习中占据主导地位,但它仍然是梯度下降优化器家族的一个基础版本。为了进一步提升训练效率、加速收敛,并在非凸损失曲面上表现更好,研究人员在 MBGD 的基础上加入了动量(Momentum)、**自适应学习率(Adaptive Learning Rate)**等机制,从而发展出了更先进的优化器:
- 带动量的 SGD (SGD with Momentum): 使用梯度的历史信息来平滑更新路径,减少震荡,加速收敛,尤其是沿着平坦方向。
- 自适应学习率优化器:
- Adagrad/Adadelta/RMSprop: 根据参数的历史梯度平方和,为每个参数设置不同的学习率,对不常更新的参数给予更大的学习率。
- Adam (Adaptive Moment Estimation): 结合了动量和 RMSprop 的优点,同时使用梯度的一阶矩(均值)和二阶矩(非中心方差)来调整每个参数的学习率,是当前最流行的优化器之一。
核心总结: 深度学习中的优化技术,无论是早期的 SGD,还是现代的 Adam,其基础计算框架都是小批量梯度下降 (MBGD)。MBGD 巧妙地利用了现代硬件的并行计算能力,同时在梯度稳定性和逃逸局部最优的能力之间找到了完美的平衡,是实现高效深度学习训练的基石。