- BGD(批量梯度下降):每次迭代需要计算所有 m 个样本的梯度并求和,计算量为 O(m)。
- SGD(随机梯度下降):每次迭代只计算1 个样本的梯度,计算量为 O(1)。但完成一个 epoch 需要处理 m 个样本,因此总计算量为 m × O(1) = O(m)。
结论:当 SGD 完成一个 epoch(m 次迭代)时,其总计算量与 BGD 的单次迭代计算量相同(均为 O (m))。
尽管计算量相同,但两者的实际效率差异显著:
- BGD:每个 epoch 仅更新 1 次参数,可能需要多个 epoch 才能收敛(如 10 次),因此总计算量为 10 × O(m)。
- SGD:每个样本更新 1 次参数,一个 epoch 内完成 m 次更新。由于高频更新和随机噪声,SGD 可能在1 个 epoch 内就接近最优解,总计算量仅为 O(m)。
示例:
对于 30 万个样本(m=300,000):
- BGD 收敛需要 10 次迭代,总计算量为 10 × 300,000 = 300 万次。
- SGD 在 1 个 epoch 内完成 30 万次更新,总计算量为 30 万次。
- 内存占用:
BGD 需要同时加载所有样本,内存需求高;SGD 每次仅处理 1 个样本,内存效率极高。
- 硬件加速:
SGD 的异步特性更适合 GPU 并行计算,实际训练速度可能比 BGD 快数倍。
- 收敛稳定性:
SGD 的随机噪声可能导致震荡,需配合学习率衰减(如从 0.1 逐渐降至 0.001)以保证收敛。
-
小批量梯度下降(MBGD):
每次使用 batch_size 个样本(如 32),平衡计算效率和稳定性。对于 m=300,000 的数据集,MBGD 的每个 epoch 需要 300,000/32 ≈ 9,375 次 迭代,计算量仍为 O (m),但收敛更平滑。
-
学习率调度:
对 SGD 和 MBGD,推荐使用动态学习率(如指数衰减),避免震荡并加速收敛。
当 SGD 完成一个 epoch(计算 m 次)时,其总计算量与 BGD 的单次迭代相同。但由于 SGD 的高频更新特性,它通常能在更少的 epoch 内达到相近的精度,因此实际训练效率远高于 BGD。在大规模数据场景中,SGD 及其变种(如 MBGD)已成为主流选择。