学习率(Learning Rate)是深度学习中最关键的超参数之一,它控制模型在每次参数更新时的“步长大小”。简单来说:它决定了模型从错误中学习的“速度”。
直观比喻
想象你在山顶蒙眼下山(找最低点):
- 学习率大 → 你大步往下跳(可能错过最低点,甚至越跳越高)
- 学习率小 → 你小步试探(下山很稳,但速度极慢)
- 学习率合适 → 你能快速且稳定地到达山脚(最优解)
实际例子:房价预测
假设我们用线性回归模型 y = w*x + b
预测房价:
- 初始参数:权重
w=0
,偏置b=0
- 输入数据:房子面积
x=100㎡
,真实价格y_true=500万
- 当前预测:
y_pred = 0*100 + 0 = 0
(完全错误!) - 计算损失:
Loss = (y_true - y_pred)² = (500-0)² = 250000
参数更新过程(梯度下降):
# 假设计算得到梯度: ∂Loss/∂w = -100, ∂Loss/∂b = -500
learning_rate = 0.001 # 关键在这里!# 参数更新公式: 新参数 = 旧参数 - 学习率 × 梯度
w_new = 0 - 0.001 * (-100) = 0.1
b_new = 0 - 0.001 * (-500) = 0.5
- 学习率=0.001时:下次预测
y_pred = 0.1*100 + 0.5 = 10.5万
(仍低估,但比之前好) - 若学习率=0.1:
w_new=10
,b_new=50
→y_pred=1050万
(严重高估,震荡发散)
不同学习率的效果
学习率大小 | 训练行为 | 实际表现 |
---|---|---|
太大(如0.1) | 参数剧烈震荡 | 模型无法收敛,甚至爆炸 |
合适(如0.001) | 稳定下降 | 最终找到较好解 |
太小(如1e-6) | 每次更新几乎不动 | 训练极慢,可能卡在局部最优点 |
如何选择学习率?
- 常用初始值:
- CNN/Transformer:
3e-4
~1e-5
- 简单模型:
0.01
~0.001
- CNN/Transformer:
- 动态调整:
- 使用学习率调度器(如
ReduceLROnPlateau
) - 预热(Warmup)策略
- 使用学习率调度器(如
- 实验方法:
# PyTorch示例 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
可视化理解
下图展示了不同学习率下损失函数的变化:
高学习率 → 震荡发散: /\/\/\/\
合适学习率 → 平滑下降: \_______
低学习率 → 缓慢下降: \--------
(实际训练中可通过TensorBoard/WandB等工具观察曲线)