随机梯度下降法(SGD)加速策略分析
目录
加速方法概述
随机梯度下降(SGD)的加速策略主要包括以下方法:
-
动量法(Momentum)
引入动量项累积历史梯度方向,公式为:
v t = β v t − 1 + ( 1 − β ) g t v_t = \beta v_{t-1} + (1-\beta) g_t vt=βvt−1+(1−β)gt
θ t + 1 = θ t − η v t \theta_{t+1} = \theta_t - \eta v_t θt+1=θt−ηvt -
Nesterov 加速梯度(NAG)
在动量法基础上提前计算“未来位置”的梯度:
v t = β v t − 1 + ( 1 − β ) ∇ J ( θ t − β v t − 1 ) v_t = \beta v_{t-1} + (1-\beta) \nabla J(\theta_t - \beta v_{t-1}) vt=βvt−1+(1−β)∇J(θt−βvt−1) -
AdaGrad
自适应调整学习率,累积梯度平方:
G t = G t − 1 + g t 2 G_t = G_{t-1} + g_t^2 Gt=Gt−1+gt2
θ t + 1 = θ t − η G t + ϵ ⊙ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \odot g_t θt+1=θt−Gt+ϵη⊙gt -
RMSProp
改进 AdaGrad 的累积方式,引入衰减因子:
G t = ρ G t − 1 + ( 1 − ρ ) g t 2 G_t = \rho G_{t-1} + (1-\rho) g_t^2 Gt=ρGt−1+(1−ρ)gt2
θ t + 1 = θ t − η G t + ϵ ⊙ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \odot g_t θt+1=θt−Gt+ϵη⊙gt -
Adam
结合动量和自适应学习率:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t mt=β1mt−1+(1−β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t} m^t=1−β1tmt,v^t=1−β2tvt
θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt+1=θt−v^t+ϵηm^t
方法对比表格
方法 | 核心思想 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
Momentum | 累积动量减少震荡 | 加速收敛,减少震荡 | 需调参 β \beta β | 高方差梯度、非凸优化 |
NAG | 提前计算未来梯度 | 比 Momentum 更精准 | 计算复杂度略高 | 需要快速收敛的场景 |
AdaGrad | 自适应调整稀疏特征学习率 | 适合稀疏数据 | 学习率过早衰减 | 自然语言处理、稀疏特征 |
RMSProp | 指数衰减历史梯度平方 | 解决 AdaGrad 学习率衰减问题 | 对初始学习率敏感 | 非平稳目标、RNN |
Adam | 动量和自适应学习率结合 | 鲁棒性强,广泛适用 | 可能泛化能力差 | 计算机视觉、通用深度学习 |
应用场景分析
- Momentum/NAG:适用于参数空间存在“峡谷”或“平原”的优化问题(如训练 ResNet)。
- AdaGrad:适合处理稀疏特征(如 NLP 中的词向量)。
- RMSProp:适用于非平稳目标函数(如训练 RNN)。
- Adam:通用性强,适合大多数深度学习任务(如图像分类)。
代码分析与详细注释
1. Momentum 实现
def momentum_update(parameters, gradients, velocity, beta=0.9, lr=0.01):
for param, grad in zip(parameters, gradients):
velocity = beta * velocity + (1 - beta) * grad # 累积动量
param -= lr * velocity # 更新参数
return parameters, velocity
2. Adam 实现
def adam_update(params, grads, m, v, t, lr=0.001, beta1=0.9, beta2=0.999, eps=1e-8):
for i in range(len(params)):
m[i] = beta1 * m[i] + (1 - beta1) * grads[i] # 一阶矩估计
v[i] = beta2 * v[i] + (1 - beta2) * (grads[i] ** 2) # 二阶矩估计
m_hat = m[i] / (1 - beta1 ** t) # 偏差校正
v_hat = v[i] / (1 - beta2 ** t)
params[i] -= lr * m_hat / (np.sqrt(v_hat) + eps) # 更新参数
return params, m, v
优化方向与未来建议
-
优化方向
- 改进自适应方法的学习率衰减策略(如 RAdam 解决 Adam 早期方差问题)。
- 结合二阶优化信息(如 K-FAC)。
- 动态调整超参数(如学习率、 β \beta β)。
-
未来建议
- 研究更鲁棒的自适应方法(如 Lion 优化器)。
- 探索元学习自动调参。
- 优化 GPU 并行计算效率。
总结
不同加速策略各有优劣,需根据任务特性选择。未来趋势将向自动化、自适应和高效计算方向发展。