深度学习常用优化器解析
优化器是深度学习模型训练的核心组件,负责根据损失函数的梯度调整模型参数,以最小化损失值。从基础的随机梯度下降(SGD)衍生出了动量优化器、Adagrad、RMSprop、Adam等一系列优化算法,它们在收敛速度、稳定性、适用场景等方面各有优劣。本文将从演化关系出发,系统讲解各优化器的原理、公式、代码实现、优缺点及应用场景。
一、优化器演化关系梳理
深度学习优化器的演化核心围绕两个关键问题展开:如何加速收敛和如何自适应调整学习率。其演化路径可概括为:
-
基础阶段(SGD):奠定参数更新的基本框架,但存在收敛慢、易震荡、对学习率敏感的问题。
-
加速收敛阶段(动量优化器):引入物理中的"动量"概念,模拟惯性效应,解决SGD收敛慢和震荡的问题。
-
自适应学习率初探(Adagrad):为不同参数分配自适应学习率,解决SGD学习率全局统一的缺陷,尤其适配稀疏数据。
-
自适应学习率优化(RMSprop):改进Adagrad学习率随迭代不断衰减的问题,通过指数加权平均平衡历史与当前梯度信息。
-
融合创新阶段(Adam):结合动量优化器的一阶矩估计和RMSprop的二阶矩估计,实现加速收敛与自适应学习率的双重优势,成为当前最常用的优化器之一。
核心演化逻辑:从"固定学习率+简单更新"到"自适应学习率+惯性加速",逐步提升优化效率与鲁棒性。
二、主流优化器深度解析
1. 动量优化器(SGD + Momentum)
1.1 核心原理
借鉴物理中"动量"的概念,当物体在斜坡上滚动时,会积累惯性并加速前进。动量优化器在SGD基础上引入"速度项",该速度项累积了历史梯度的信息:梯度方向一致时,速度逐渐增大,加速收敛;梯度方向突变时,速度因惯性作用缓慢变化,减少震荡。
1.2 数学公式
设参数为,第t步的梯度为,学习率为,动量因子为(通常取0.9,控制历史梯度的权重),速度项为,则参数更新公式为:
解释:是当前梯度与历史速度的加权和,体现历史惯性,体现当前梯度的影响。
1.3 代码实现(PyTorch)
import torch
import torch.nn as nn# 1. 自定义动量优化器实现
class MomentumOptimizer:def __init__(self, params, lr=0.01, momentum=0.9):self.params = list(params) # 模型参数self.lr = lr # 学习率self.momentum = momentum # 动量因子# 初始化速度项为0self.velocities = [torch.zeros_like(p) for p in self.params]def step(self, loss):# 反向传播计算梯度loss.backward()for i, param in enumerate(self.params):# 更新速度项self.velocities[i] = self.momentum * self.velocities[i] + self.lr * param.grad# 更新参数param.data -= self.velocities[i]# 清空梯度param.grad.zero_()# 2. PyTorch官方API调用
model = nn.Linear(10, 1) # 简单线性模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
1.4 优缺点与局限性
-
优点:① 加速收敛,尤其在梯度平缓区域;② 减少参数更新的震荡,提高训练稳定性;③ 保留了SGD内存占用少的优势。
-
缺点与局限性:① 仍需手动调节学习率和动量因子,超参数选择依赖经验;② 动量因子固定时,对不同任务的适配性有限;③ 对异常梯度敏感,可能因突发大梯度破坏惯性节奏。
1.5 应用场景
适用于训练深度神经网络(如CNN、MLP)时的基础加速场景,尤其当SGD收敛过慢或震荡剧烈时,例如图像分类任务中的初步训练阶段。
2. Adagrad优化器
2.1 核心原理
针对SGD学习率全局统一的缺陷,提出"参数自适应学习率"策略:对频繁更新的参数(如稠密特征)采用较小的学习率,对稀疏更新的参数(如稀疏特征)采用较大的学习率,从而适配稀疏数据场景。其核心是累积每个参数的历史梯度平方和,用该和的平方根调节学习率。
2.2 数学公式
设为第t步的梯度平方累积和,为防止分母为0的小常数(通常取),则参数更新公式为:
解释:累积了参数从初始到第t步的梯度平方,梯度大的参数对应的更大,学习率更小,实现自适应调节。
2.3 代码实现(PyTorch)
import torch
import torch.nn as nn# 1. 自定义Adagrad优化器实现
class AdagradOptimizer:def __init__(self, params, lr=0.01, eps=1e-8):self.params = list(params)self.lr = lrself.eps = eps# 初始化梯度平方累积和为0self.grad_sq_sum = [torch.zeros_like(p) for p in self.params]def step(self, loss):loss.backward()for i, param in enumerate(self.params):# 累积梯度平方self.grad_sq_sum[i] += param.grad ** 2# 计算自适应学习率并更新参数adaptive_lr = self.lr / torch.sqrt(self.grad_sq_sum[i] + self.eps)param.data -= adaptive_lr * param.gradparam.grad.zero_()# 2. PyTorch官方API调用
model = nn.Linear(10, 1)
optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01, eps=1e-8)
2.4 优缺点与局限性
-
优点:① 无需手动调节学习率,自适应适配不同参数;② 对稀疏数据(如文本分类中的词向量、推荐系统中的用户特征)表现优异;③ 实现简单,易于理解。
-
缺点与局限性:① 梯度平方累积和随迭代不断增大,导致学习率逐渐趋近于0,训练后期可能停止收敛;② 对非稀疏数据的适配性不如后续优化器,收敛速度较慢。
2.5 应用场景
核心应用于稀疏数据处理场景,如自然语言处理(NLP)中的文本分类、情感分析,推荐系统中的用户兴趣建模等。
3. RMSprop优化器
3.1 核心原理
为解决Adagrad学习率持续衰减的问题,RMSprop(Root Mean Square Propagation)引入"指数加权移动平均"替代梯度平方的累积和,仅保留近期梯度的信息,遗忘远期梯度,从而避免学习率过早趋近于0。
3.2 数学公式
设为第t步梯度平方的指数加权移动平均,为衰减系数(通常取0.9,控制历史信息的遗忘程度),则参数更新公式为:
解释:是近期梯度平方的加权平均,越大,保留的历史信息越多;通过该平均项调节学习率,既实现自适应又避免学习率持续衰减。
3.3 代码实现(PyTorch)
import torch
import torch.nn as nn# 1. 自定义RMSprop优化器实现
class RMSpropOptimizer:def __init__(self, params, lr=0.001, gamma=0.9, eps=1e-8):self.params = list(params)self.lr = lrself.gamma = gamma # 衰减系数self.eps = eps# 初始化梯度平方的指数加权移动平均为0self.grad_sq_avg = [torch.zeros_like(p) for p in self.params]def step(self, loss):loss.backward()for i, param in enumerate(self.params):# 更新梯度平方的指数加权移动平均self.grad_sq_avg[i] = self.gamma * self.grad_sq_avg[i] + (1 - self.gamma) * (param.grad ** 2)# 更新参数adaptive_lr = self.lr / torch.sqrt(self.grad_sq_avg[i] + self.eps)param.data -= adaptive_lr * param.gradparam.grad.zero_()# 2. PyTorch官方API调用
model = nn.Linear(10, 1)
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.001, alpha=0.9, eps=1e-8)
注:官方API中衰减系数用alpha表示,与公式中的含义一致。
3.4 优缺点与局限性
-
优点:① 解决了Adagrad学习率衰减问题,训练后期仍能有效收敛;② 对非平稳目标函数(如序列数据中的动态特征)适配性好;③ 收敛速度快于SGD和Adagrad。
-
缺点与局限性:① 需手动调节衰减系数和学习率,超参数敏感性较高;② 缺乏动量机制,在梯度平缓区域的收敛速度不如Adam。
3.5 应用场景
适用于非平稳目标函数场景,如循环神经网络(RNN)处理时序数据(文本生成、语音识别),以及复杂CNN模型的中间训练阶段。
4. Adam优化器
4.1 核心原理
Adam(Adaptive Moment Estimation)融合了动量优化器的"一阶矩估计"(梯度均值,体现动量)和RMSprop的"二阶矩估计"(梯度平方均值,体现自适应学习率),并通过偏差修正解决初始阶段矩估计偏差较大的问题,实现了加速收敛与自适应调节的双重优化。
4.2 数学公式
设为一阶矩(梯度均值),为二阶矩(梯度平方均值),(通常取0.9)为一阶矩衰减系数,(通常取0.999)为二阶矩衰减系数,和为偏差修正后的矩估计,则参数更新公式为:
解释:① 一阶矩模拟动量效应,累积梯度方向信息;② 二阶矩实现自适应学习率;③ 偏差修正和是因为初始时和接近0,需通过和修正偏差。
4.3 代码实现(PyTorch)
import torch
import torch.nn as nn# 1. 自定义Adam优化器实现
class AdamOptimizer:def __init__(self, params, lr=0.001, beta1=0.9, beta2=0.999, eps=1e-8):self.params = list(params)self.lr = lrself.beta1 = beta1self.beta2 = beta2self.eps = epsself.t = 0 # 迭代步数计数器# 初始化一阶矩和二阶矩为0self.m = [torch.zeros_like(p) for p in self.params]self.v = [torch.zeros_like(p) for p in self.params]def step(self, loss):self.t += 1 # 迭代步数加1loss.backward()for i, param in enumerate(self.params):# 更新一阶矩和二阶矩self.m[i] = self.beta1 * self.m[i] + (1 - self.beta1) * param.gradself.v[i] = self.beta2 * self.v[i] + (1 - self.beta2) * (param.grad ** 2)# 偏差修正m_hat = self.m[i] / (1 - self.beta1 ** self.t)v_hat = self.v[i] / (1 - self.beta2 ** self.t)# 更新参数param.data -= self.lr * m_hat / (torch.sqrt(v_hat) + self.eps)param.grad.zero_()# 2. PyTorch官方API调用
model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8)
4.4 优缺点与局限性
-
优点:① 融合动量和自适应学习率,收敛速度快且稳定;② 偏差修正机制提升了初始阶段的优化效果;③ 超参数鲁棒性强,默认参数(lr=0.001, betas=(0.9, 0.999))适用于多数场景;④ 内存占用适中,适配大规模模型。
-
缺点与局限性:① 在部分简单任务或小数据集上,泛化性能可能不如SGD(易陷入局部最优);② 对异常值(如梯度突变)敏感,可能影响优化稳定性;③ 计算量略大于SGD和RMSprop(需维护两个矩估计)。
4.5 应用场景
当前最通用的优化器之一,适用于绝大多数深度学习场景,如深度学习基础模型(CNN、Transformer)、大规模图像识别(ResNet系列)、自然语言处理(BERT、GPT)、生成对抗网络(GAN)等。
三、优化器关键特性对比与选择建议
1. 关键特性对比表
| 优化器 | 学习率自适应 | 动量机制 | 收敛速度 | 超参数数量 | 稀疏数据适配 | 泛化性能(均值) |
|---|---|---|---|---|---|---|
| 动量优化器 | ✘ | ✔ | 中 | 2(lr, γ) | 差 | 中 |
| Adagrad | ✔ | ✘ | 前快后慢 | 1(lr) | 优 | 中 |
| RMSprop | ✔ | ✘ | 快 | 2(lr, γ) | 中 | 中 |
| Adam | ✔ | ✔ | 快 | 3(lr, β1, β2) | 中 | 良 |
2. 选择建议
-
快速验证场景:优先选择Adam(默认参数),快速得到初步训练结果。
-
稀疏数据场景:优先选择Adagrad,其次是Adam。
-
时序数据/非平稳目标:优先选择RMSprop或Adam。
-
追求极致泛化性能:尝试用动量优化器(调优学习率)或AdamW(Adam的改进版,加入权重衰减)。
-
大规模模型/内存受限:优先选择Adam(内存占用适中),避免使用需大量额外存储的优化器。
四、总结
深度学习优化器的演化是对"收敛速度"和"自适应能力"的持续优化:从动量优化器解决SGD的收敛问题,到Adagrad实现学习率自适应,再到RMSprop改进衰减缺陷,最终Adam融合两者优势成为通用选择。在实际应用中,需结合数据特性(稀疏性、平稳性)、模型规模、训练目标(速度/泛化)选择合适的优化器,必要时通过对比实验验证效果。
