神经网络优化方法全解析:从数学原理到生活智慧
目录
| 优化方法 | 专业特点 | 生活比喻 | 图表特征 |
|---|---|---|---|
| [SGD:随机梯度下降](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 简单直接,可能陷入局部最优 | 盲人摸象式探索 | 📉 波动大,收敛慢 |
| [Momentum:动量法](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 保留历史更新方向,减少震荡 | 带惯性的滑雪者 | 🎢 平滑下降,减少震荡 |
| [Adagrad:自适应梯度](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 自动调整学习率,适合稀疏数据 | 个性化教学 | 📊 不同参数不同步长 |
| [RMSprop:均方根传播](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 改进Adagrad,防止学习率过快下降 | 聪明的水管工 | 🚰 稳定调节水流 |
| [Adam:自适应矩估计](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 结合动量与自适应,最受欢迎 | 全能运动员 | 🏆 平衡稳定高效 |
| [SGD with Nesterov](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 动量法的改进版 | 有预见的登山者 | ⛰️ 提前减速转弯 |
| [AdaDelta](#优化方法 专业特点 生活比喻 图表特征 SGD:随机梯度下降 简单直接,可能陷入局部最优 盲人摸象式探索 📉 波动大,收敛慢 Momentum:动量法 保留历史更新方向,减少震荡 带惯性的滑雪者 🎢 平滑下降,减少震荡 Adagrad:自适应梯度 自动调整学习率,适合稀疏数据 个性化教学 📊 不同参数不同步长 RMSprop:均方根传播 改进Adagrad,防止学习率过快下降 聪明的水管工 🚰 稳定调节水流 Adam:自适应矩估计 结合动量与自适应,最受欢迎 全能运动员 🏆 平衡稳定高效 SGD with Nesterov 动量法的改进版 有预见的登山者 ⛰️ 提前减速转弯 AdaDelta 自适应学习率,无需手动设置 自动巡航系统 🚗 自动适应路况) | 自适应学习率,无需手动设置 | 自动巡航系统 | 🚗 自动适应路况 |
一、SGD:随机梯度下降
1.1 专业解释
随机梯度下降(Stochastic Gradient Descent) 是最基础的优化算法。其更新公式为:
\\theta_{t+1} = \\theta_t - \\eta \\cdot \\nabla_\\theta J(\\theta_t; x\^{(i)}, y\^{(i)})
其中:
- (\theta):模型参数
- (\eta):学习率(步长)
- (\nabla_\theta J):损失函数关于参数的梯度
- ((x^{(i)}, y^{(i)})):随机选择的一个训练样本
特点:
- 优点:计算快,内存消耗小,可以处理大规模数据
- 缺点 :
- 更新方向完全依赖当前批次的梯度,非常不稳定
- 容易陷入局部最优解
- 学习率需要精心调整
- 在鞍点附近可能停滞不前
1.2 大白话解释
想象你在一个黑暗的山谷里找最低点:
- 你每走一步,只用手摸脚下一小块地方判断坡度
- 坡度陡就大步走,坡度缓就小步走
- 问题是:你只能感受到脚下这一小块,不知道整个山谷的形状
具体表现:
- "摸石头过河":走一步看一步,没有长远规划
- "容易走偏":如果某一步踩到小坑,可能就往错误方向走了
- "可能卡住":走到一个小洼地就以为是最低点,其实下面还有更深的
1.3 生活案例:盲人探险家找宝藏
场景:一个盲人探险家在山谷中寻找最低处的宝藏
探险过程:
1. 每次只能用手杖探测脚下1平方米的范围
2. 感觉哪边坡度向下,就往哪边迈一步
3. 步长固定(比如1米)
遇到的问题:
- 问题1:如果踩到一个小坑,可能错误地以为到了谷底
- 问题2:遇到平坦区域(鞍点),无法判断该往哪走
- 问题3:可能一直在山谷的半山腰来回走,下不到真正的谷底
- 问题4:如果步长太大,可能跨过谷底;步长太小,走得太慢
实际表现:
开始:快速下降
中期:在山坡上反复震荡
后期:可能卡在某个小洼地不动了
图表特征 :📉 波动大,收敛慢
- 损失曲线像锯齿一样上下波动
- 总体趋势下降,但很不稳定
- 最终可能停在一个不够低的点上
二、Momentum:动量法
2.1 专业解释
动量法(Momentum) 引入了物理中的动量概念,更新公式为:
\\begin{align\*} v_t \&= \\gamma v_{t-1} + \\eta \\cdot \\nabla_\\theta J(\\theta_t) \\ \\theta_{t+1} \&= \\theta_t - v_t \\end{align\*}
其中:
- (v_t):当前动量(更新速度)
- (\gamma):动量系数(通常0.9)
- (\eta):学习率
核心思想:
- 保留历史梯度信息:当前更新方向不仅依赖当前梯度,还考虑之前梯度的加权平均
- 模拟惯性:在梯度方向一致时加速,在梯度方向变化时减速
- 减少震荡:在峡谷地形中,可以减少垂直方向的震荡
2.2 大白话解释
想象滑雪下山:
- 你不是每步都重新决定方向,而是保持一定的滑行惯性
- 如果连续几个坡都往右,你会越滑越快往右
- 突然出现左坡时,你会因为惯性先减速再转向
具体表现:
- "有记忆的探索者":记得之前走过的路,不会突然180度转向
- "加速通过平坦区":在平缓区域积累速度,快速通过
- "平滑转弯":遇到转弯不会急刹,而是平滑过渡
2.3 生活案例:带刹车的雪橇下山
场景:坐雪橇从雪山滑下,目标是到达最低点
雪橇的特点:
1. 有惯性:一旦动起来,不会轻易停下
2. 可控制:可以用脚刹车调整方向
3. 动量积累:连续下坡会越来越快
下山过程:
- 阶段1:开始缓慢,积累动量
- 阶段2:遇到连续下坡 → 加速滑行
- 阶段3:遇到上坡 → 动量抵消部分阻力,不会立即停止
- 阶段4:需要转弯 → 提前刹车,平滑转向
与SGD的对比:
SGD滑雪者:每步都重新判断,经常急转弯,效率低
Momentum雪橇:利用惯性,减少不必要的转向,整体更平滑快速
图表特征 :🎢 平滑下降,减少震荡
- 损失曲线更加平滑
- 峡谷地形中的垂直震荡明显减少
- 收敛速度更快,但可能"冲过头"错过最优点
三、Adagrad:自适应梯度
3.1 专业解释
自适应梯度(Adaptive Gradient) 算法为每个参数自适应调整学习率:
\\begin{align\*} G_t \&= G_{t-1} + (\\nabla_\\theta J(\\theta_t))\^2 \\ \\theta_{t+1} \&= \\theta_t - \\frac{\\eta}{\\sqrt{G_t + \\epsilon}} \\cdot \\nabla_\\theta J(\\theta_t) \\end{align\*}
其中:
- (G_t):历史梯度平方的累积
- (\epsilon):小常数(防止除零,通常10⁻⁸)
- 分母:梯度平方累积的平方根
核心特点:
- 自动调整学习率:频繁更新的参数学习率变小,稀疏参数学习率变大
- 适合稀疏数据:在自然语言处理等稀疏特征场景表现好
- 无需手动调学习率:初始学习率设置后自动调整
缺点:
- 学习率单调递减,最终可能变得极小,训练提前停止
3.2 大白话解释
想象个性化教学:
- 对于常犯的错误(频繁出现的梯度),老师会重点讲解,但讲解速度会放慢
- 对于偶尔出现的难点(稀疏梯度),老师会快速带过,但要确保学会
- 随着学习深入,所有知识点的学习速度都会逐渐放慢
具体表现:
- "因材施教":不同参数有不同的学习速度
- "熟能生巧变慢":经常调整的参数调整幅度越来越小
- "补短板":不常更新的参数一旦需要更新,会迈一大步
3.3 生活案例:智能健身教练
场景:AI健身教练为学员定制训练计划
学员情况:
- 经常练的部位:胸肌、二头肌(频繁更新的参数)
- 很少练的部位:小腿、前臂(稀疏参数)
Adagrad教练的策略:
1. 记录每个部位的训练频率(梯度平方累积)
2. 调整训练强度:
- 胸肌:练了100次 → 每次只增加0.1kg(小步更新)
- 小腿:只练了5次 → 下次可以增加2kg(大步更新)
3. 随着训练进行,所有部位的增长都会越来越慢
出现问题:
几个月后,学员进步停滞了!
原因:每个部位的学习率都变得极小,再怎么练也没进步了
教练反思:
"我应该让学员偶尔大胆突破一下,不能总是越来越保守"
图表特征 :📊 不同参数不同步长
- 不同参数的更新幅度差异明显
- 总体学习率随时间下降
- 初期快速下降,后期几乎停滞
四、RMSprop:均方根传播
4.1 专业解释
均方根传播(Root Mean Square Propagation) 改进了Adagrad:
\\begin{align\*} E\[g\^2\]*t \&= \\gamma E\[g\^2\]* {t-1} + (1 - \\gamma) \\cdot (\\nabla_\\theta J(\\theta_t))\^2 \\ \\theta_{t+1} \&= \\theta_t - \\frac{\\eta}{\\sqrt{E\[g\^2\]*t + \\epsilon}} \\cdot \\nabla* \\theta J(\\theta_t) \\end{align\*}
其中:
- (E[g^2]_t):梯度平方的指数移动平均
- (\gamma):衰减率(通常0.9)
- 不再累积所有历史梯度,而是使用加权平均
改进点:
- 解决学习率消失:使用移动平均,而不是累积和
- 适应非平稳目标:更适合RNN等动态环境
- 调节更灵活:通过γ控制历史信息的权重
4.2 大白话解释
想象聪明的水管工调节水压:
- 不是记录所有历史水压变化,而是关注最近一段时间的平均水压
- 如果最近水压波动大,就谨慎调节阀门
- 如果水压稳定,就可以大胆调整
- 老旧的水压数据会逐渐被遗忘
具体表现:
- "短期记忆":只记住最近一段时间的梯度信息
- "灵活适应":当梯度模式变化时,能快速调整策略
- "防止僵化":不会像Adagrad那样最终停止学习
4.3 生活案例:智能恒温系统
场景:办公楼智能空调系统
Adagrad系统(旧版):
- 记录全年每一天的温度调整
- 秋天时:已经调节了200次 → 每次只调0.1°C
- 结果:天气突然变冷,系统反应太慢,办公室冷了半天
RMSprop系统(新版):
- 只关注最近一周的温度模式
- 权重分配:昨天50%,前天25%,三天前12.5%...(指数衰减)
- 秋天平稳期:调节幅度小
- 寒流突然来袭:检测到最近梯度(温度变化)很大 → 大胆调高暖气
- 一周后寒流过去:又恢复小幅度调节
优势:
- 既保持了稳定性(不会过度反应)
- 又具有适应性(能应对突然变化)
- 不会积累"历史包袱"(太久远的数据自动遗忘)
图表特征 :🚰 稳定调节水流
- 学习率动态调整,不会单调递减
- 在平稳期小步更新,在变化期大步更新
- 整体收敛平稳,适应性强
五、Adam:自适应矩估计
5.1 专业解释
Adam(Adaptive Moment Estimation) 结合了动量法和RMSprop:
\\begin{align\*} m_t \&= \\beta_1 m_{t-1} + (1 - \\beta_1) \\cdot \\nabla_\\theta J(\\theta_t) \\quad \&\\text{(一阶矩估计)}\\ v_t \&= \\beta_2 v_{t-1} + (1 - \\beta_2) \\cdot (\\nabla_\\theta J(\\theta_t))\^2 \\quad \&\\text{(二阶矩估计)}\\ \\hat{m}_t \&= \\frac{m_t}{1 - \\beta_1\^t} \\quad \&\\text{(偏差修正)}\\ \\hat{v}*t \&= \\frac{v_t}{1 - \\beta_2\^t} \\quad \&\\text{(偏差修正)}\\ \\theta* {t+1} \&= \\theta_t - \\frac{\\eta}{\\sqrt{\\hat{v}_t} + \\epsilon} \\cdot \\hat{m}_t \\end{align\*}
参数设置:
- (\beta_1 = 0.9):一阶矩衰减率
- (\beta_2 = 0.999):二阶矩衰减率
- (\eta = 0.001):学习率
- (\epsilon = 10^{-8})
优势:
- 结合两者优点:动量法的方向稳定性 + 自适应学习率
- 偏差修正:解决初始阶段估计偏差问题
- 超参数鲁棒:默认参数在大部分情况下表现良好
5.2 大白话解释
想象全能运动员训练:
- 既保持训练惯性(动量),又根据身体状态调整强度(自适应)
- 训练初期保守一点(偏差修正),防止受伤
- 综合考量:既要进步快,又要不受伤,还要持续进步
具体表现:
- "稳重又灵活":有动量法的稳定方向,又有自适应学习率的灵活步长
- "智能调节":不同情况自动切换策略
- "开箱即用":默认参数就能很好工作,不需要复杂调参
5.3 生活案例:自动驾驶汽车的智能控制系统
场景:自动驾驶汽车在复杂路况中学习最优驾驶策略
系统需要同时处理:
1. 保持行驶方向稳定(动量)
2. 根据路况调整速度(自适应学习率)
3. 避免过度反应(偏差修正)
Adam控制系统的工作方式:
一、记忆历史经验(动量部分)
- 记住:高速公路上可以开快,居民区要慢行
- 这提供了基本的行驶"惯性"
二、感知实时路况(自适应部分)
- 检测当前梯度:前面有车?红灯?行人?
- 调整"学习率":紧急情况大刹车,平缓路段微调
三、避免初始误判(偏差修正)
- 刚开始上路时:不因为一次急刹就永远开很慢
- 经验积累后:逐渐形成稳定的驾驶风格
四、综合决策
- 公式计算:结合历史经验 + 实时路况 + 修正因子
- 输出:最优的油门/刹车/转向控制
结果表现:
- 比单纯靠经验的司机(SGD)更稳定
- 比只按规则开车的系统(Adagrad)更灵活
- 比容易受惊吓的新手(原始动量法)更稳健
图表特征 :🏆 平衡稳定高效
- 初期快速下降
- 中期稳定收敛
- 后期精细调整
- 整体曲线平滑高效
六、SGD with Nesterov
6.1 专业解释
Nesterov加速梯度是动量法的改进版:
\\begin{align\*} v_t \&= \\gamma v_{t-1} + \\eta \\cdot \\nabla_\\theta J(\\theta_t - \\gamma v_{t-1}) \\ \\theta_{t+1} \&= \\theta_t - v_t \\end{align\*}
关键改进:
- 计算梯度时,先根据动量"向前看一步"
- 在"预测位置"计算梯度,而不是当前位置
- 这使得在拐点处能有更好的表现
6.2 大白话解释
想象有预见的登山者:
- 普通动量法:按照当前方向和速度走,走到哪算哪
- Nesterov:先根据当前速度预测下一步会在哪,然后在那里"提前感受"坡度
- 如果预测位置是个上坡,现在就提前减速
具体表现:
- "前瞻性思考":不只考虑现在,还考虑下一步
- "提前减速":快到坡顶时提前减速,防止冲过头
- "更平滑转弯":在拐弯处表现更好
6.3 生活案例:赛车手的进弯策略
场景:赛车手学习最佳过弯路线
普通动量法车手(Momentum):
1. 保持油门,按照当前方向前进
2. 到了弯道才刹车转向
3. 结果:要么刹车太急,要么冲出弯道
Nesterov车手:
1. 在进弯前,先"想象"如果保持当前速度,会在哪入弯
2. 在那个"想象位置"判断:会不会太靠外?会不会太快?
3. 根据预测,现在就提前松油门、调整方向
4. 实际入弯时,路线更加精准
结果对比:
- Momentum:入弯晚,路线不优,出弯慢
- Nesterov:提前准备,路线精准,出弯快
图表特征 :⛰️ 提前减速转弯
- 在接近最优点时提前减速
- 减少超调(冲过头再回来)
- 收敛更加稳定
七、AdaDelta
7.1 专业解释
AdaDelta是Adagrad的改进,不需要设置学习率:
\\begin{align\*} E\[g\^2\]*t \&= \\gamma E\[g\^2\]* {t-1} + (1 - \\gamma) \\cdot (\\nabla_\\theta J(\\theta_t))\^2 \\ \\Delta\\theta_t \&= -\\frac{\\sqrt{E\[\\Delta\\theta\^2\]*{t-1} + \\epsilon}}{\\sqrt{E\[g\^2\]*t + \\epsilon}} \\cdot \\nabla* \\theta J(\\theta_t) \\ E\[\\Delta\\theta\^2\]*t \&= \\gamma E\[\\Delta\\theta\^2\]* {t-1} + (1 - \\gamma) \\cdot (\\Delta\\theta_t)\^2 \\ \\theta* {t+1} \&= \\theta_t + \\Delta\\theta_t \\end{align\*}
特点:
- 无需学习率:完全自适应
- 单位一致性:更新量Δθ与参数θ有相同单位
- 对初始学习率不敏感
7.2 大白话解释
想象自动巡航系统:
- 不用司机设定速度(学习率)
- 系统自己根据路况决定:上坡加速,下坡减速,弯道慢行
- 还考虑车辆性能:上次刹车猛,这次就温和点
具体表现:
- "全自动":完全自适应,不用调学习率
- "自我校准":根据历史更新幅度调整当前更新
- "稳定可靠":不会出现学习率过大或过小的问题
7.3 生活案例:智能淋浴系统
场景:酒店智能淋浴,自动调节水温
传统系统(需要学习率):
- 客人要先设定:"我喜欢38°C"
- 系统按固定速度调节:每次调1°C
- 问题:有人喜欢快速加热,有人喜欢慢慢调
AdaDelta系统:
1. 不需要客人设定目标温度
2. 自动学习:
- 检测当前水温与体感差异(梯度)
- 记录历史调节幅度(更新量平方的移动平均)
- 计算:这次该调多少?
3. 举例:
- 上次调了2°C客人嫌太猛 → 这次只调0.5°C
- 水温离舒适区很远 → 大胆调
- 接近舒适区 → 微调
优势:
- 完全自适应,适合不同客人
- 不会过度调节(不会忽冷忽热)
- 快速找到每个人的"黄金水温"
图表特征 :🚗 自动适应路况
- 学习率完全自适应变化
- 更新幅度逐渐趋于合理值
- 收敛平稳,无需手动调参
总结对比
| 优化器 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| SGD | 简单梯度下降 | 简单,理论清晰 | 震荡,局部最优 | 基础教学,简单任务 |
| Momentum | 加入动量惯性 | 减少震荡,加速收敛 | 可能冲过头 | 有噪声的优化地形 |
| Adagrad | 自适应学习率 | 适合稀疏数据 | 学习率消失 | NLP,稀疏特征 |
| RMSprop | 梯度平方移动平均 | 解决Adagrad问题 | 超参数需要调 | RNN,非平稳目标 |
| Adam | 动量+自适应 | 综合最优,开箱即用 | 可能不如专项优化器 | 深度学习默认选择 |
| Nesterov | 前瞻性动量 | 拐点表现更好 | 计算稍复杂 | 需要精细优化的任务 |
| AdaDelta | 无学习率自适应 | 完全自适应 | 早期可能不稳定 | 不想调学习率的场景 |
选择建议
新手选择:
- 首选Adam:大部分情况下表现良好,超参数鲁棒
- 次选RMSprop:在RNN等任务中可能略优于Adam
- 特殊情况 :
- 稀疏数据:Adagrad
- 简单任务:SGD + Momentum
- 理论分析:SGD
实践建议:
python
# 深度学习默认配置
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
# 如果Adam效果不好,尝试
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 更高级的尝试
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001) # Adam + 权重衰减修复
终极比喻:优化器就像不同类型的司机
- SGD司机:新手司机,每米都重新判断方向,开得慢还左右晃
- Momentum司机:老司机,有驾驶惯性,但刹车不够及时
- Adagrad司机:谨慎司机,越开越慢,最后几乎停车
- RMSprop司机:智能司机,根据最近路况调整速度
- Adam司机:全能司机,有经验又灵活,适合各种路况
- Nesterov司机:赛车手司机,提前预判弯道
- AdaDelta司机:自动驾驶司机,完全自动调节
选择哪个司机,取决于你要开什么路,要去哪里,以及你愿意花多少精力指导他。