深度学习中的优化器之SGD with Polyak Averaging算法原理与实现细节
字数 1368 2025-11-14 09:26:05
深度学习中的优化器之SGD with Polyak Averaging算法原理与实现细节
题目描述
SGD with Polyak Averaging(带Polyak平均的随机梯度下降)是一种优化技术,通过在训练过程中对参数的历史值进行平均,提升模型在测试集上的泛化性能。该算法由Polyak和Juditsky在1992年提出,核心思想是利用参数的历史轨迹计算平均值作为最终模型参数,而非直接使用训练结束时的参数。本题目将详细解析该算法的原理、数学推导及实现细节。
解题过程
-
问题背景
- 传统SGD在非凸优化中可能收敛到尖锐的局部最小值,导致模型泛化能力较差。
- Polyak Averaging通过对参数历史值进行平滑,使模型倾向于收敛到平坦区域,从而提升鲁棒性。
-
算法原理
- 基本思想:在SGD迭代过程中,记录每一步的参数值,最终取所有参数的平均值作为输出。
- 数学表达:
设SGD迭代公式为:
\[ \theta_{t+1} = \theta_t - \eta \nabla f(\theta_t) \]
其中 $\eta$ 为学习率,$\nabla f(\theta_t)$ 为梯度。
Polyak平均参数计算为:
\[ \bar{\theta}_T = \frac{1}{T} \sum_{t=1}^T \theta_t \]
- 理论依据:对于凸问题,Polyak平均可加速收敛;对于非凸问题,它能降低参数方差,逼近更稳定的解。
- 实现步骤
- 步骤1:初始化参数 \(\theta_0\),设定学习率 \(\eta\) 和总迭代次数 \(T\)。
- 步骤2:在每步迭代中:
- 计算当前梯度 \(\nabla f(\theta_t)\)。
- 更新参数:\(\theta_{t+1} = \theta_t - \eta \nabla f(\theta_t)\)。
- 将 \(\theta_t\) 存入历史参数列表。
- 步骤3:训练完成后,计算历史参数的算术平均值:
\[ \bar{\theta} = \frac{1}{T} \sum_{t=1}^T \theta_t \]
- 步骤4:使用 \(\bar{\theta}\) 作为最终模型参数进行预测。
- 改进策略
- 指数加权平均:为避免存储全部历史参数,可采用指数衰减的移动平均:
\[ \bar{\theta}_t = \beta \bar{\theta}_{t-1} + (1-\beta) \theta_t \]
其中 $\beta$ 为衰减率(通常取0.99)。
- 延迟启动:跳过训练初期的不稳定阶段,仅对后期参数平均(如后50%迭代)。
-
代码实现要点
- 使用累加器实时计算参数和,避免存储全部参数。
- 对于指数加权平均,需进行偏差校正(尤其在训练初期)。
- 示例代码段:
theta_sum = 0.0 for t in range(1, T+1): gradient = compute_gradient(data_batch) theta = theta - learning_rate * gradient theta_sum += theta theta_avg = theta_sum / T
-
算法优势与局限性
- 优势:
- 显著提升泛化能力,尤其适合噪声较多的数据。
- 实现简单,无需调整超参数。
- 局限性:
- 存储历史参数可能增加内存开销(可通过近似平均缓解)。
- 对非凸问题的理论保证较弱。
- 优势:
总结
Polyak Averaging通过参数平滑有效稳定了SGD的优化过程,是提升模型鲁棒性的实用技术。其核心在于利用历史信息抵消随机梯度的波动,使模型收敛到更平坦的最优点。