目录
前言
书接上回
我们谈到损失器与优化器,这一章我们细谈一下
接下来我用「老师教学生」的比喻来总结,保证清晰易懂:
损失函数(Loss Function)—— 老师的评分标准
作用:量化模型预测结果与真实答案的差距(就像老师给学生打分)
常见类型及适用场景:
-
nn.MSELoss()
(均方误差)- 场景:回归任务(预测连续值)
例如:预测房价、温度、销售额 - 计算方式:
(预测值 - 真实值)^2 的平均值
- 通俗理解:老师严格惩罚大错误(平方放大误差)
- 场景:回归任务(预测连续值)
-
nn.CrossEntropyLoss()
(交叉熵损失)- 场景:多分类任务(如图像分类、文本分类)
例如:识别猫狗图片、新闻分类 - 计算方式:比较预测概率分布与真实标签的差异
- 通俗理解:老师关注「概率分配是否合理」
- 场景:多分类任务(如图像分类、文本分类)
-
nn.L1Loss()
(绝对误差)- 场景:回归任务,对异常值不敏感
例如:预测年龄、库存量 - 计算方式:
|预测值 - 真实值| 的平均值
- 通俗理解:老师对大小错误一视同仁
- 场景:回归任务,对异常值不敏感
-
nn.BCELoss()
(二分类交叉熵)- 场景:二分类任务(是/否问题)
例如:垃圾邮件检测、疾病诊断 - 计算方式:专门处理0/1两种结果的概率差异
- 通俗理解:老师只判断对错,不关心其他可能性
- 场景:二分类任务(是/否问题)
优化器(Optimizer)—— 学生的学习策略
作用:根据损失函数的反馈,调整模型参数(就像学生根据错题改进学习方法)
常见类型及特点:
-
torch.optim.SGD
(随机梯度下降)- 特点:基础方法,直接沿梯度反方向调整参数
- 超参数:
lr
(学习率,即每次调整的步长) - 适用场景:简单任务,需要精细调参时
- 比喻:学生每次订正错题时,固定修改量
-
torch.optim.Adam
(自适应矩估计)- 特点:自动调整学习率,结合动量(惯性)
- 超参数:
lr
(默认0.001通常可用) - 适用场景:大多数任务的默认选择
- 比喻:学生会根据错题类型动态调整订正力度
-
torch.optim.RMSprop
- 特点:对频繁出现的特征减小学习率
- 适用场景:RNN等循环网络
- 比喻:学生发现某类题总错,就重点攻克这类题
-
torch.optim.Adagrad
- 特点:为每个参数分配不同的学习率
- 适用场景:稀疏数据(如推荐系统)
- 比喻:学生为不同科目(如数学/语文)制定不同学习计划
优化器参数调整指南表
优化器 | 关键参数 | 调整建议 | 适用场景 | 注意事项 |
---|---|---|---|---|
SGD | lr (学习率) | 从 0.1 开始尝试,逐步缩小(如0.01→0.001) | 简单任务、精细调参 | 太大→震荡;太小→收敛慢 |
momentum (动量) | 通常设为 0.9 ,模拟物理惯性 | 配合大学习率使用 | 避免与Adam同时用 | |
Adam | lr | 默认 0.001 通常有效,复杂任务可尝试 0.0001 | 绝大多数任务默认选择 | 资源消耗略高 |
weight_decay | 正则化强度,常用 1e-4 | 防止过拟合 | 太大导致欠拟合 | |
RMSprop | lr | 类似Adam,从 0.001 开始 | RNN/LSTM等循环网络 | 对学习率敏感 |
alpha | 衰减率,默认 0.99 ,调整范围 0.9~0.999 | 处理非平稳目标 | 值越大历史影响越久 | |
Adagrad | lr | 初始值需较大(如 0.1 ),因会自动衰减 | 稀疏数据(如推荐系统) | 后期学习率趋近于0 |
AdamW | lr | 类似Adam,但更稳定(推荐 0.001 ) | 搭配权重衰减正则化 | 比Adam更现代 |
betas | 动量参数,默认 (0.9, 0.999) 通常不需改 | 需要稳定训练时 | 调整需谨慎 |
参数调整优先级(从高到低)
-
学习率(lr) ➔ 「控制步伐大小」
- 太大:错过最低点(损失震荡)
- 太小:走得慢(收敛时间长)
- 技巧:用学习率探测(如
lr=0.1
开始,每10轮减半直到稳定)
-
动量(momentum) ➔ 「保持方向惯性」
- 高值(0.9):加速收敛,但可能冲过最优解
- 低值(0.5):更谨慎,适合噪声多的数据
-
权重衰减(weight_decay) ➔ 「防止肌肉过度发达(过拟合)」
- 典型值:
1e-4
(轻量正则)到1e-2
(强正则) - 与Dropout同时使用时需降低强度
- 典型值:
搭配使用示例
# 场景:预测房价(回归任务)
model = ... # 定义模型
criterion = nn.MSELoss() # 均方误差
optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam优化器
# 场景:图像分类(10类别)
model = ...
criterion = nn.CrossEntropyLoss() # 交叉熵损失
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # 带动量的SGD
关键注意事项
- 分类任务必须用
CrossEntropyLoss
等专用损失函数,不能用MSE - 学习率过大 → 模型震荡不收敛;过小 → 学习速度慢
- Adam通常作为默认优化器,效果比SGD稳定
- 二分类任务如果用
BCELoss
,模型最后一层需要Sigmoid
激活函数