深度学习中优化器的SGD with Polyak Averaging算法原理与实现细节
字数 1657 2025-11-04 08:32:53
深度学习中优化器的SGD with Polyak Averaging算法原理与实现细节
题目描述
SGD with Polyak Averaging(又称Polyak-Ruppert平均)是一种在随机梯度下降(SGD)基础上引入参数平均机制的优化算法。其核心思想是:在SGD的迭代过程中,不仅记录当前参数,还计算参数轨迹的算术平均值作为最终模型参数。这种方法通过平滑优化路径的波动,显著提升收敛稳定性和泛化性能,特别适用于非凸优化问题。本题目将详细解析该算法的理论动机、实现细节及其在深度学习中的优势。
解题过程
-
算法提出动机
- 传统SGD在非凸问题中容易因噪声梯度陷入局部极小值或鞍点,其参数轨迹在最优解附近剧烈振荡。
- Polyak(1990)和Ruppert(1988)证明:对SGD的迭代参数取平均,可以降低方差,加速收敛至全局最优解邻域。
- 在深度学习中,这种平均化能抑制过拟合,产生更平坦的极小值,从而提升模型鲁棒性。
-
基本数学形式
- 设待优化参数为 \(\theta\),损失函数为 \(L(\theta)\),学习率为 \(\eta\)。
- 标准SGD更新规则:\(\theta_{t+1} = \theta_t - \eta \nabla L(\theta_t)\)。
- Polyak平均的辅助变量 \(\bar{\theta}_t\) 定义为迭代过程中所有参数的算术平均:
\[ \bar{\theta}_t = \frac{1}{t} \sum_{k=1}^t \theta_k \]
- 最终输出模型使用平均参数 \(\bar{\theta}_T\),而非末次参数 \(\theta_T\)。
- 迭代平均的高效计算
- 直接存储所有参数并计算平均不现实(内存开销大)。
- 采用递推公式实时更新平均参数:
\[ \bar{\theta}_t = \frac{t-1}{t} \bar{\theta}_{t-1} + \frac{1}{t} \theta_t \]
- 初始化:\(\bar{\theta}_0 = 0\),从 \(t=1\) 开始累积。
- 例如:
- 第1步:\(\bar{\theta}_1 = \theta_1\)
- 第2步:\(\bar{\theta}_2 = \frac{1}{2}(\bar{\theta}_1 + \theta_2)\)
- 递推过程仅需保存上一个平均参数,内存复杂度为 \(O(1)\)。
-
与指数移动平均(EMA)的区别
- Polyak平均是等权重算术平均,EMA则赋予近期参数更高权重。
- EMA公式:\(\bar{\theta}_t = \beta \bar{\theta}_{t-1} + (1-\beta) \theta_t\),其中 \(\beta\) 为衰减率(如0.99)。
- Polyak平均更强调长期稳定性,EMA更适应非平稳优化过程。两者可根据任务选择。
-
深度学习中的实现细节
- 初始阶段延迟平均:为避免早期不稳定参数影响平均效果,常从第 \(t_0\) 步开始平均(例如 \(t_0 = 1000\))。
- 学习率调度配合:当学习率衰减时,参数变化量减小,平均结果更贴近最优解。
- 代码示例(PyTorch风格):
theta = torch.randn(10, requires_grad=True) # 初始化参数 theta_avg = torch.zeros_like(theta) # 平均参数初始化 optimizer = torch.optim.SGD([theta], lr=0.01) for t in range(1, total_steps+1): loss = compute_loss(theta) optimizer.zero_grad() loss.backward() optimizer.step() # 更新Polyak平均(从第t0步开始) if t >= t0: theta_avg = (theta_avg * (t - t0) + theta) / (t - t0 + 1) - 训练结束后,使用
theta_avg作为最终模型参数。
-
理论优势与实验效果
- 收敛性保证:在凸问题中,Polyak平均可将SGD的收敛率从 \(O(1/\sqrt{T})\) 提升至 \(O(1/T)\)。
- 非凸问题:通过平滑损失曲面,平均参数更可能落入平坦区域,泛化误差更低。
- 实践表明,在图像分类、语言模型等任务中,Polyak平均能稳定提升测试精度1-2%。
总结
SGD with Polyak Averaging通过简单而有效的参数平均机制,弥补了SGD的振荡缺陷,在几乎不增加计算成本的前提下提升了模型性能。其实现简洁,只需在训练循环中添加递推平均步骤,是深度学习优化中实用的“免费午餐”技术。