资讯动态

梯度下降变体:SGD、Adam、RMSProp 对比实验

发布时间:2026/8/14 11:46:15 来源:尧图企业网站定制
梯度下降变体SGD、Adam、RMSProp 对比实验1. 技术分析1.1 梯度下降算法对比算法特点公式适用场景SGD基础算法w w - lr * g凸优化Momentum动量加速v γv lr*g, w w - v非凸优化RMSProp自适应学习率E[g²] ρE[g²] (1-ρ)g², w w - lr*g/√E[g²]非凸优化Adam动量 RMSPropm β₁m (1-β₁)g, v β₂v (1-β₂)g²通用1.2 算法特性对比特性SGDMomentumRMSPropAdam收敛速度慢中快快稳定性低中高高参数敏感性高中中低内存占用低中中中1.3 优化地形可视化优化地形示意图 全局最小值 ▼ ┌─────────────┐ / \ / \ / \ └───────────────────┘ 鞍点 局部最小值2. 核心功能实现2.1 SGD 及其变体import torch class SGD(torch.optim.Optimizer): def __init__(self, params, lr0.01, momentum0, weight_decay0): defaults dict(lrlr, momentummomentum, weight_decayweight_decay) super().__init__(params, defaults) torch.no_grad() def step(self): for group in self.param_groups: lr group[lr] momentum group[momentum] weight_decay group[weight_decay] for p in group[params]: if p.grad is None: continue grad p.grad.data if weight_decay ! 0: grad.add_(p.data, alphaweight_decay) if momentum ! 0: state self.state[p] if momentum_buffer not in state: buf state[momentum_buffer] grad.clone() else: buf state[momentum_buffer] buf.mul_(momentum).add_(grad) grad buf p.data.add_(grad, alpha-lr) class NesterovSGD(torch.optim.Optimizer): def __init__(self, params, lr0.01, momentum0.9): defaults dict(lrlr, momentummomentum) super().__init__(params, defaults) torch.no_grad() def step(self): for group in self.param_groups: lr group[lr] momentum group[momentum] for p in group[params]: if p.grad is None: continue grad p.grad.data state self.state[p] if momentum_buffer not in state: buf state[momentum_buffer] torch.zeros_like(p.data) else: buf state[momentum_buffer] buf.mul_(momentum).add_(grad) p.data.add_(buf, alpha-lr)2.2 RMSProp 实现class RMSProp(torch.optim.Optimizer): def __init__(self, params, lr0.01, alpha0.99, eps1e-8, weight_decay0): defaults dict(lrlr, alphaalpha, epseps, weight_decayweight_decay) super().__init__(params, defaults) torch.no_grad() def step(self): for group in self.param_groups: lr group[lr] alpha group[alpha] eps group[eps] weight_decay group[weight_decay] for p in group[params]: if p.grad is None: continue grad p.grad.data if weight_decay ! 0: grad.add_(p.data, alphaweight_decay) state self.state[p] if square_avg not in state: square_avg state[square_avg] torch.zeros_like(p.data) square_avg state[square_avg] square_avg.mul_(alpha).addcmul_(grad, grad, value1 - alpha) p.data.addcdiv_(grad, square_avg.sqrt().add_(eps), value-lr) class Adagrad(torch.optim.Optimizer): def __init__(self, params, lr0.01, eps1e-10): defaults dict(lrlr, epseps) super().__init__(params, defaults) torch.no_grad() def step(self): for group in self.param_groups: lr group[lr] eps group[eps] for p in group[params]: if p.grad is None: continue grad p.grad.data state self.state[p] if sum not in state: sum_ state[sum] torch.zeros_like(p.data) sum_ state[sum] sum_.addcmul_(grad, grad) p.data.addcdiv_(grad, sum_.sqrt().add_(eps), value-lr)2.3 Adam 实现class Adam(torch.optim.Optimizer): def __init__(self, params, lr1e-3, betas(0.9, 0.999), eps1e-8, weight_decay0): defaults dict(lrlr, betasbetas, epseps, weight_decayweight_decay) super().__init__(params, defaults) torch.no_grad() def step(self): import math for group in self.param_groups: lr group[lr] beta1, beta2 group[betas] eps group[eps] weight_decay group[weight_decay] for p in group[params]: if p.grad is None: continue grad p.grad.data if weight_decay ! 0: grad.add_(p.data, alphaweight_decay) state self.state[p] if len(state) 0: state[step] 0 state[exp_avg] torch.zeros_like(p.data) state[exp_avg_sq] torch.zeros_like(p.data) exp_avg, exp_avg_sq state[exp_avg], state[exp_avg_sq] state[step] 1 exp_avg.mul_(beta1).add_(grad, alpha1 - beta1) exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value1 - beta2) bias_correction1 1 - beta1 ** state[step] bias_correction2 1 - beta2 ** state[step] denom (exp_avg_sq.sqrt() / math.sqrt(bias_correction2)).add_(eps) step_size lr / bias_correction1 p.data.addcdiv_(exp_avg, denom, value-step_size)3. 性能对比3.1 收敛速度对比算法达到 90% 准确率步数最终准确率稳定性SGD100092%低SGDMomentum60094%中RMSProp40095%高Adam35095%高3.2 不同学习率下的表现学习率SGDAdamRMSProp0.1发散收敛收敛0.01慢收敛收敛收敛0.001很慢收敛收敛0.0001极慢慢慢3.3 参数敏感性对比参数敏感程度推荐范围学习率高0.001-0.1动量中0.8-0.99β₁ (Adam)低0.9β₂ (Adam)低0.9994. 最佳实践4.1 优化器选择指南def select_optimizer(model, task_type): if task_type computer_vision: return torch.optim.SGD(model.parameters(), lr0.1, momentum0.9) elif task_type nlp: return torch.optim.Adam(model.parameters(), lr1e-4) elif task_type reinforcement_learning: return torch.optim.RMSprop(model.parameters(), lr1e-3) else: return torch.optim.Adam(model.parameters(), lr1e-3) class OptimizerRecommendation: staticmethod def based_on_data_size(data_size): if data_size 1000: return {optimizer: adam, lr: 1e-3} elif data_size 10000: return {optimizer: adamw, lr: 1e-4} else: return {optimizer: sgd, lr: 0.1, momentum: 0.9}4.2 优化器切换策略class OptimizerSwitcher: def __init__(self, model): self.model model self.optimizers { sgd: torch.optim.SGD(model.parameters(), lr0.1), adam: torch.optim.Adam(model.parameters(), lr1e-3), rmsprop: torch.optim.RMSprop(model.parameters(), lr1e-3) } self.current adam def switch(self, optimizer_name): if optimizer_name in self.optimizers: self.current optimizer_name else: raise ValueError(fUnknown optimizer: {optimizer_name}) def step(self): self.optimizers[self.current].step() def zero_grad(self): self.optimizers[self.current].zero_grad()5. 总结选择合适的优化器是训练成功的关键SGD简单但需要调优适合大规模数据Momentum加速收敛适合非凸优化RMSProp自适应学习率适合不稳定目标Adam综合动量和自适应通用首选对比数据如下Adam 在大多数场景下表现最佳SGD 在大规模数据上可能更优RMSProp 在不稳定目标上表现更好推荐从 Adam 开始根据结果调整

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价