【深度学习】(三)学习率优化
发布时间:2026/8/31 6:44:09 作者:尧图编辑部 阅读量:1,286
学习率优化)
一、梯度下降1 概述梯度下降是一种优化算法核心是通过反复调整参数让模型的预测误差损失函数降到最低。可以理解为下山找方向计算当前位置最陡的下坡方向梯度反方向。迈一步按照学习率设定的步长向下走一步更新参数。重复直到走到最低点误差最小。关键点学习率决定步长大小。太大容易错过最低点太小则收敛太慢。常用形式小批量梯度下降每次用一小批数据计算方向兼顾速度与稳定。2 核心数学逻辑在数学上我们的目标是最小化损失函数J(θ)J(\theta)J(θ)$ \theta $ 代表模型参数。梯度就是损失函数对参数θ\thetaθ的偏导数∇J(θ)\nabla J(\theta)∇J(θ)。它指向的是函数上升最快的方向。下降既然要最小值我们就朝梯度的反方向更新参数。更新公式$ \theta_{new} \theta_{old} - \eta \cdot \nabla J(\theta) $这里的$ \eta $学习率就是你下山的步长。步长太大容易跨过山谷错过最优点步长太小则下山太慢训练耗时。在实际写代码时如PyTorch/TensorFlow你不会只看到一种梯度下降根据数据量的处理方式主要分为三类批量梯度下降BGD每次更新参数时使用全部训练数据计算梯度。优点梯度方向最准确下降稳定缺点在海量数据下计算极慢无法用于大型数据集。随机梯度下降SGD每次更新时随机选取1个样本计算梯度。优点计算极快且能跳出局部极小值缺点梯度波动剧烈下降路径很“震荡”。小批量梯度下降Mini-batch GD最常用。每次选取一个固定数量如 32、256 个的样本计算梯度。它结合了前两者的优点既有计算效率又有稳定性。你现在听到的大模型训练基本都是用这种。3 注意事项实际使用时需要注意这些特征缩放归一化如果输入数据量级差异巨大如身高1.7m和收入10000元损失函数会变成“扁平”的峡谷梯度下降会走“之”字形极其缓慢。必须使用标准化Standardization将数据压缩到相近范围。学习率的选择这是最重要的超参数。通常从 $ 10^{-3} $ 或 $ 10^{-4} $ 开始尝试或者使用学习率衰减随着训练轮次增加逐渐减小步长。梯度裁剪Gradient Clipping当梯度值过大时梯度爆炸参数会一步跳出很远导致Loss变成NaN。需要设置一个阈值截断过大的梯度。二、反向传播反向传播是训练神经网络的核心算法负责计算梯度告诉每一层参数应该如何调整。形象理解把神经网络想象成一个流水线多名工人依次加工产品。前向原料进去成品出来质检员发现质量差误差大。反向质检员把问题逆向反馈——先调整最后一名工人的操作再调整前一名……直到第一名。每个人根据反馈改进自己的手法。三、梯度下降优化算法基础梯度下降太“笨”了在实际训练中会遇到三个致命问题。训练太慢标准梯度下降每一步都走固定步长在平坦区域梯度很小时移动极其缓慢。容易卡在坏位置鞍点、局部极小值符号含义θ\thetaθ模型参数待优化的变量ggg梯度 $ \nabla L(\theta) $η\etaη学习率基础步长ϵ\epsilonϵ极小常数防止分母为零通常10−810^{-8}10−8或10−710^{-7}10−71 指数加权平均一种平滑时序数据的算法核心思想是当前时刻的估计值 当前实际值 × 权重 历史估计值 × 衰减。vtβ⋅vt−1(1−β)⋅θt v_t \beta \cdot v_{t-1} (1-\beta) \cdot \theta_tvtβ⋅vt−1(1−β)⋅θtvtv_tvt第ttt时刻的加权平均值θtθ_tθt第ttt时刻的实际观测值βββ衰减系数0 βββ 1控制历史值的保留程度2 AdaGrad核心思想不同参数用不同学习率——频繁更新的参数用较小步长稀疏参数用较大步长。实现方式维护梯度平方的累积和rrg2r r g^2rrg2参数更新θθ−ηrϵ⋅g\theta \theta - \frac{\eta}{\sqrt{r \epsilon}} \cdot gθθ−rϵη⋅g优点无需手动调整学习率适合稀疏数据如自然语言处理、推荐系统缺点致命问题r 单调递增学习率会持续衰减 → 训练后期学习率过小模型停止学习3 RMSProp核心思想解决 AdaGrad 学习率过早消失的问题——用指数加权平均替代累积和只关注近期梯度。实现方式维护梯度平方的指数加权平均rβr(1−β)g2r \beta r (1-\beta)g^2rβr(1−β)g2参数更新θθ−ηrϵ⋅g\theta \theta - \frac{\eta}{\sqrt{r \epsilon}} \cdot gθθ−rϵη⋅g优点学习率不会单调衰减保持持续学习能力在非凸问题如深度学习中表现稳定适用场景RNN、强化学习等梯度波动较大的场景4 Adam核心思想结合动量Momentum和自适应学习率RMSProp——既保持方向惯性又自适应调整步长。实现方式一阶矩动量mβ1m(1−β1)gm \beta_1 m (1-\beta_1)gmβ1m(1−β1)g二阶矩自适应vβ2v(1−β2)g2v \beta_2 v (1-\beta_2)g^2vβ2v(1−β2)g2偏差校正m^m/(1−β1t), v^v/(1−β2t)\hat{m} m/(1-\beta_1^t), \ \hat{v} v/(1-\beta_2^t)m^m/(1−β1t),v^v/(1−β2t)参数更新θθ−η⋅m^/(v^ϵ)\theta \theta - \eta \cdot \hat{m} / (\sqrt{\hat{v}} \epsilon)θθ−η⋅m^/(v^ϵ)符号含义更新方式mmm一阶矩动量$ m \beta_1 m (1-\beta_1)g $vvv二阶矩自适应学习率$ v \beta_2 v (1-\beta_2)g^2 $β1\beta_1β1一阶矩衰减系数通常 0.9β2\beta_2β2二阶矩衰减系数通常 0.999m^\hat{m}m^偏差校正后的一阶矩$ \hat{m} m / (1-\beta_1^t) $v^\hat{v}v^偏差校正后的二阶矩$ \hat{v} v / (1-\beta_2^t) $ttt时间步迭代次数从 1 开始计数η\etaη学习率通常 0.001ϵ\epsilonϵ数值稳定项通常10−810^{-8}10−8优点收敛速度快对超参数敏感度低适合大规模数据和深度网络缺点在某些任务中泛化能力可能不如 SGDMomentum需要额外内存存储动量项参数量 × 2场景推荐方法PyTorch配置示例快速上手、通用AdamAdam(lr0.001)图像分类、CVSGD MomentumSGD(lr0.01, momentum0.9)NLP、TransformerAdamWAdamW(lr0.001, weight_decay0.01)稀疏特征Adagrad或AdamAdagrad(lr0.01)RNN/LSTMRMSprop或AdamRMSprop(lr0.001, alpha0.99)需要强正则化AdamWAdamW(lr0.001, weight_decay0.01)importtorchimporttorch.nnasnnimporttorch.optimasoptim# 定义模型modelnn.Linear(10,2)# 1. SGD (含 Momentum 和 Nesterov)optimizer_sgdoptim.SGD(model.parameters(),lr0.01,momentum0.9,nesterovFalse)# 2. Adagradoptimizer_adagradoptim.Adagrad(model.parameters(),lr0.01)# 3. RMSpropoptimizer_rmspropoptim.RMSprop(model.parameters(),lr0.001,alpha0.99)# 4. Adamoptimizer_adamoptim.Adam(model.parameters(),lr0.001,betas(0.9,0.999))# 5. AdamWoptimizer_adamwoptim.AdamW(model.parameters(),lr0.001,weight_decay0.01)# 6. AdaDeltaoptimizer_adadeltaoptim.Adadelta(model.parameters(),lr1.0)# 训练使用forepochinrange(100):optimizer.zero_grad()outputmodel(input_data)losscriterion(output,target)loss.backward()optimizer.step()四、学习率优化如果使用固定的学习率往往会面临以下困境收敛速度慢学习率过小模型参数更新步长太小损失函数下降极其缓慢训练周期过长且容易陷入局部极小值或鞍点难以逃脱。无法收敛或震荡学习率过大参数更新步长太大导致损失函数在最小值附近剧烈震荡甚至越过最优点导致梯度爆炸使得模型无法收敛。难以适应数据特征数据通常是高维且稀疏的如文本、图像局部特征。对于频繁出现的特征我们希望用较小的步长精细调整对于罕见的特征我们希望用较大的步长捕捉其信息。固定学习率无法满足这种差异化需求。训练阶段的需求不同初期通常希望学习率大一些快速靠近最优解区域。中后期需要较小的学习率帮助模型在最小值附近微调避免震荡甚至需要微调Fine-tuning时的极低学习率来防止破坏预训练知识。1. 学习率衰减 (Learning Rate Decay)这是最经典的策略核心思想是随着迭代次数的增加逐步减小学习率。分段常数衰减 (Step Decay)每经过一定轮次Epoch学习率降低为原来的110\frac{1}{\sqrt{10}}101或110\frac{1}{10}101。例如KaTeX parse error: Expected EOF, got _ at position 83: …och}/\text{step_̲size} \rfloor}。指数衰减 (Exponential Decay)学习率按指数函数平滑下降lrlr0⋅e−kt\text{lr} \text{lr}_0 \cdot e^{-kt}lrlr0⋅e−kt。余弦退火 (Cosine Annealing)学习率按照余弦函数周期性地从最大值下降到最小值。这不仅是衰减还引入了重启机制见后文。2. 自适应学习率算法 (Adaptive Learning Rates)这类算法不再需要手动指定全局学习率或衰减策略它们会根据参数的梯度历史自动调整每个参数的学习率。3. 预热 (Warmup)在训练初期模型参数是随机初始化的梯度可能非常大或异常。如果一开始就使用较大的学习率容易导致模型数值不稳定甚至NaN。策略在前几个Epoch或几千步中让学习率从一个非常小的值线性或指数地增长到预设的最大学习率然后再进行正常的衰减如余弦退火。常用组合Warmup Cosine Annealing如“三阶段学习率”。这在Transformer架构如BERT、GPT的训练中几乎是标配。4. 周期性重启 (Cyclical Learning Rates)打破“学习率必须单调递减”的常规允许学习率周期性变化帮助模型跳出局部极小值或鞍点。循环学习率 (CLR)让学习率在预设的边界值之间周期性震荡。带重启的余弦退火 (Cosine Annealing with Restarts)训练过程中学习率多次从最大值开始余弦衰减到最小值每次衰减的周期可以逐渐变长。这种方法在训练深度网络时往往能比单一衰减策略获得更好的泛化能力。