第三章 学习率设置:从固定到自适应
学习率,说白了就是模型每次更新参数时迈的步子有多大。步子迈大了容易扯着蛋——损失函数震荡不收敛;步子迈小了又像蜗牛爬,训练到天荒地老。我做了这么多年经济运筹模型,踩过最多的坑就在这学习率上。
今天咱们就把学习率的几种玩法掰开揉碎讲清楚。从最基础的固定学习率,到各种衰减策略,再到如今主流的自适应方法,一条线串下来。
3.1 固定学习率:最朴素的方案
固定学习率就是整个训练过程中学习率保持不变。简单粗暴,但好不好用全看运气。
核心公式:
θ = θ - η * ∇L(θ)
其中 η 就是固定的学习率,比如 0.01、0.001。
我在做宏观经济指标预测时试过固定学习率。数据平稳的时候还行,一旦遇到市场波动剧烈的时期,模型直接原地起飞——损失值忽上忽下,根本收敛不了。
我的经验:固定学习率适合小规模、数据分布稳定的场景。比如你做一个简单的线性回归预测下个月的销售额,0.01 起步基本够用。但但凡数据复杂一点,就别偷懒了。
3.2 学习率衰减:让步子越走越稳
为什么需要衰减?你想想看,训练初期参数离最优解远着呢,大步快跑没问题。但到了后期,参数已经在最优解附近晃悠了,再大步子就容易跳过好位置。所以得让学习率慢慢降下来。
常用的衰减策略有三种:Step、Exponential、Cosine。我一个个说。
3.2.1 Step Decay(阶梯衰减)
每隔固定轮数,学习率乘以一个衰减因子。比如每 30 轮学习率减半。
# Step Decay 示例
initial_lr = 0.1
drop_rate = 0.5
epochs_drop = 30
for epoch in range(total_epochs):
lr = initial_lr * (drop_rate ** (epoch // epochs_drop))
# 用 lr 更新参数
我记得有一次做供应链需求预测,数据有季节性周期。用 Step Decay 把衰减步长设成一个季度(90轮),效果出奇的好。为什么?因为每个周期结束学习率降一档,正好匹配了数据本身的节奏。
避坑指南:我曾经把衰减步长设得太小,结果学习率降得太快,模型还没学到足够特征就卡住了。步长一般设为总轮数的 1/5 到 1/3 比较稳妥。
3.2.2 Exponential Decay(指数衰减)
每个轮次学习率都按指数比例下降。公式:
lr = initial_lr * exp(-decay_rate * epoch)
指数衰减比阶梯衰减更平滑。我个人习惯在需要精细调参的任务上用这个,比如金融时间序列预测。但要注意 decay_rate 别设太大,否则学习率会断崖式下跌。
3.2.3 Cosine Decay(余弦衰减)
这个有意思。学习率按照余弦函数从初始值下降到 0,下降速度先慢后快再慢。
lr = initial_lr * 0.5 * (1 + cos(π * epoch / total_epochs))
为什么用余弦?说白了就是模拟一种「自然」的衰减节奏。初期慢慢降,让模型充分探索;中期快速降,加速收敛;末期又慢下来,精细调整。我在做多因子选股模型时试过,比 Step 和 Exponential 都稳。
| 衰减策略 | 特点 | 适用场景 |
|---|---|---|
| Step Decay | 阶梯式下降,简单可控 | 有明确阶段性的任务 |
| Exponential Decay | 平滑下降,连续性好 | 需要精细调参的场景 |
| Cosine Decay | 先慢后快再慢,自然节奏 | 复杂模型、长周期训练 |
3.3 自适应学习率:让算法自己调步子
手动调学习率太累了。尤其是参数多的时候,每个参数的最佳学习率可能都不一样。这时候自适应方法就派上用场了。
3.3.1 RMSprop
RMSprop 的核心思想:对每个参数单独调整学习率。梯度大的参数,学习率自动变小;梯度小的参数,学习率自动变大。
# RMSprop 核心逻辑
E[g²] = β * E[g²] + (1-β) * g²
lr_adaptive = η / sqrt(E[g²] + ε)
说白了就是给每个参数配一个「自适应刹车」。梯度大说明参数变化剧烈,那就踩刹车;梯度小说明变化平缓,那就松刹车。我在做宏观经济模拟时,参数维度上千,RMSprop 帮我省了太多调参时间。
小技巧:RMSprop 的 β 一般取 0.9,ε 取 1e-8。这两个值我基本没动过,效果一直不错。
3.3.2 Adam
Adam 是目前最主流的优化器。它结合了 RMSprop 的自适应学习率和 Momentum 的动量思想。
# Adam 核心逻辑
m = β₁ * m + (1-β₁) * g # 动量项
v = β₂ * v + (1-β₂) * g² # 自适应项
m_hat = m / (1 - β₁^t) # 偏差修正
v_hat = v / (1 - β₂^t)
θ = θ - η * m_hat / (sqrt(v_hat) + ε)
Adam 为什么好用?它既考虑了梯度方向(动量),又考虑了梯度大小(自适应)。相当于你走路时既知道该往哪个方向走,又知道每一步该迈多大。
我记得有一次做企业信用评分模型,数据有 200 多个特征,很多特征量纲差异巨大。用 SGD 调了半天学习率都不行,换成 Adam 直接一把收敛。从那以后,Adam 就成了我的默认选择。
注意:Adam 虽然好用,但不是万能的。我曾经在稀疏特征的任务上发现 Adam 不如 SGD 效果好。具体问题还得具体分析。
3.4 知识体系总览
下面这张图把学习率设置的整个知识结构串起来了。你可以把它当作一个决策树来用——先看任务复杂度,再选策略。
3.5 实战建议
说了这么多,到底怎么选?我总结几条实战经验:
- 新手入门:直接用 Adam,学习率 0.001 起步。90% 的场景都能搞定。
- 数据量小(<1万条):试试固定学习率或 Step Decay,简单有效。
- 需要可解释性:用 SGD + Cosine Decay,参数变化轨迹更清晰。
- 训练不稳定:先检查数据预处理,再考虑换 RMSprop。
- 终极建议:别在调参上花太多时间。先用 Adam 跑通,再根据 loss 曲线微调。
我的习惯:每次新任务,我都会先用 Adam 跑 50 轮看看 loss 曲线。如果曲线下降平滑,说明学习率没问题;如果震荡厉害,我会把学习率降到 0.0001 再试。这个方法帮我省了至少一半的调参时间。
学习率这东西,说难不难,说简单也不简单。关键是多试、多看 loss 曲线、积累手感。你跑上几十个模型,自然就知道什么场景该用什么策略了。
公众号:蓝海资料掘金营,微信deep3321