python pytorch 损失器与优化器


前言

书接上回
我们谈到损失器与优化器,这一章我们细谈一下
接下来我用「老师教学生」的比喻来总结,保证清晰易懂:

损失函数(Loss Function)—— 老师的评分标准

作用:量化模型预测结果与真实答案的差距(就像老师给学生打分)

常见类型及适用场景:

  1. nn.MSELoss() (均方误差)

    • 场景:回归任务(预测连续值)
      例如:预测房价、温度、销售额
    • 计算方式(预测值 - 真实值)^2 的平均值
    • 通俗理解:老师严格惩罚大错误(平方放大误差)
  2. nn.CrossEntropyLoss() (交叉熵损失)

    • 场景:多分类任务(如图像分类、文本分类)
      例如:识别猫狗图片、新闻分类
    • 计算方式:比较预测概率分布与真实标签的差异
    • 通俗理解:老师关注「概率分配是否合理」
  3. nn.L1Loss() (绝对误差)

    • 场景:回归任务,对异常值不敏感
      例如:预测年龄、库存量
    • 计算方式|预测值 - 真实值| 的平均值
    • 通俗理解:老师对大小错误一视同仁
  4. nn.BCELoss() (二分类交叉熵)

    • 场景:二分类任务(是/否问题)
      例如:垃圾邮件检测、疾病诊断
    • 计算方式:专门处理0/1两种结果的概率差异
    • 通俗理解:老师只判断对错,不关心其他可能性

优化器(Optimizer)—— 学生的学习策略

作用:根据损失函数的反馈,调整模型参数(就像学生根据错题改进学习方法)

常见类型及特点:

  1. torch.optim.SGD (随机梯度下降)

    • 特点:基础方法,直接沿梯度反方向调整参数
    • 超参数lr(学习率,即每次调整的步长)
    • 适用场景:简单任务,需要精细调参时
    • 比喻:学生每次订正错题时,固定修改量
  2. torch.optim.Adam (自适应矩估计)

    • 特点:自动调整学习率,结合动量(惯性)
    • 超参数lr(默认0.001通常可用)
    • 适用场景:大多数任务的默认选择
    • 比喻:学生会根据错题类型动态调整订正力度
  3. torch.optim.RMSprop

    • 特点:对频繁出现的特征减小学习率
    • 适用场景:RNN等循环网络
    • 比喻:学生发现某类题总错,就重点攻克这类题
  4. torch.optim.Adagrad

    • 特点:为每个参数分配不同的学习率
    • 适用场景:稀疏数据(如推荐系统)
    • 比喻:学生为不同科目(如数学/语文)制定不同学习计划

优化器参数调整指南表

优化器关键参数调整建议适用场景注意事项
SGDlr (学习率)0.1 开始尝试,逐步缩小(如0.01→0.001)简单任务、精细调参太大→震荡;太小→收敛慢
momentum (动量)通常设为 0.9,模拟物理惯性配合大学习率使用避免与Adam同时用
Adamlr默认 0.001 通常有效,复杂任务可尝试 0.0001绝大多数任务默认选择资源消耗略高
weight_decay正则化强度,常用 1e-4防止过拟合太大导致欠拟合
RMSproplr类似Adam,从 0.001 开始RNN/LSTM等循环网络对学习率敏感
alpha衰减率,默认 0.99,调整范围 0.9~0.999处理非平稳目标值越大历史影响越久
Adagradlr初始值需较大(如 0.1),因会自动衰减稀疏数据(如推荐系统)后期学习率趋近于0
AdamWlr类似Adam,但更稳定(推荐 0.001搭配权重衰减正则化比Adam更现代
betas动量参数,默认 (0.9, 0.999) 通常不需改需要稳定训练时调整需谨慎

参数调整优先级(从高到低)

  1. 学习率(lr)「控制步伐大小」

    • 太大:错过最低点(损失震荡)
    • 太小:走得慢(收敛时间长)
    • 技巧:用学习率探测(如 lr=0.1 开始,每10轮减半直到稳定)
  2. 动量(momentum)「保持方向惯性」

    • 高值(0.9):加速收敛,但可能冲过最优解
    • 低值(0.5):更谨慎,适合噪声多的数据
  3. 权重衰减(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

关键注意事项

  1. 分类任务必须用CrossEntropyLoss等专用损失函数,不能用MSE
  2. 学习率过大 → 模型震荡不收敛;过小 → 学习速度慢
  3. Adam通常作为默认优化器,效果比SGD稳定
  4. 二分类任务如果用BCELoss,模型最后一层需要Sigmoid激活函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值