深度学习篇---优化器
在 PyTorch 中,优化器(Optimizer)是模型训练的 “指挥官”,负责根据损失函数计算的梯度(“误差方向”)调整模型参数,最终让模型预测越来越准确。不同优化器有不同的 “调整策略”,适合不同的任务和场景。
一、基础优化器:SGD 及其变种
1. 随机梯度下降(SGD)
原理:最基础的优化器,核心思想是 “沿着梯度反方向小步调整参数”。每次用一个样本(或一小批样本)计算梯度,然后更新参数:
新参数 = 旧参数 - 学习率 × 梯度
(学习率:每步调整的 “步长”,比如 0.01)特点:
- 优点:简单直观,内存占用小,适合大规模数据。
- 缺点:收敛速度慢,容易在 “陡峭区域” 震荡(比如损失函数曲面像波浪,SGD 会在波浪上跳来跳去),可能陷入局部最优。
应用场景:
数据量极大、对内存敏感的场景,或作为基础优化器验证模型可行性。
例:训练大规模图像分类模型(如 ResNet 在 ImageNet 上)、推荐系统的基础模型。
2. SGD + 动量(Momentum)
原理:借鉴物理中的 “动量” 概念,让参数更新不仅考虑当前梯度,还保留之前的 “运动趋势”。就像推箱子,一旦动起来就有惯性,不容易停下来。
比如之前一直向左调整,即使某次梯度向右,也会先慢慢减速,而不是立刻反向。特点:
- 优点:加速收敛,减少震荡,更容易跳出局部最优。
- 缺点:需要额外调整 “动量系数”(通常设 0.9)。
应用场景:
几乎所有 SGD 适用的场景,尤其适合损失函数曲面较复杂(有很多局部最优)的任务。
例:训练 CNN(卷积神经网络)处理图像、RNN(循环神经网络)处理文本序列。
3. Nesterov 动量(Nesterov Accelerated Gradient, NAG)
原理:在动量基础上 “往前看一步”。先根据之前的动量 “预判” 一个位置,再在这个位置计算梯度,最后调整参数。相当于 “提前减速”,避免冲过头。
特点:比普通动量收敛更快,对 “复杂曲面” 的适应性更好。
应用场景:
对收敛速度要求较高的任务,尤其是深度学习中的复杂模型。
例:训练生成对抗网络(GAN)、复杂的语义分割模型。
二、自适应学习率优化器
普通 SGD 的学习率是固定的,而 “自适应学习率” 优化器会根据参数的梯度特点自动调整步长:梯度大的参数(学习快的)步长小,梯度小的参数(学习慢的)步长大。
1. 自适应梯度调整(AdaGrad)
原理:记录每个参数的 “历史梯度平方和”,然后用学习率除以这个总和的平方根。相当于:某个参数之前的梯度一直很大(比如频繁更新的权重),之后就减小它的步长;反之则增大步长。
特点:
- 优点:适合稀疏数据(大部分参数梯度为 0,少数非 0),自动给重要参数更大学习率。
- 缺点:历史梯度平方和会越来越大,导致学习率逐渐趋近于 0,后期可能停止更新。
应用场景:
处理稀疏数据的任务。
例:自然语言处理(文本中大部分词出现频率低,是稀疏的)、推荐系统(用户 - 物品交互矩阵稀疏)。
2. 动量版 AdaGrad(RMSprop)
原理:解决 AdaGrad 学习率衰减过快的问题。不记录所有历史梯度,而是用 “指数移动平均”(类似滑动窗口)保留最近的梯度信息,避免总和过大。
特点:
- 优点:学习率衰减更合理,收敛更稳定,是 AdaGrad 的改进版。
- 缺点:需要调整 “衰减系数”(通常设 0.9)。
应用场景:
替代 AdaGrad 的大多数场景,尤其适合需要稳定收敛的任务。
例:语音识别模型(音频特征梯度变化快)、LSTM(长短期记忆网络,处理长序列)。
3. 自适应矩估计(Adam)
原理:结合了 “动量” 和 “RMSprop” 的优点:
- 用动量保留梯度的 “方向趋势”;
- 用 RMSprop 的方式自适应调整每个参数的学习率。
特点:
- 优点:收敛速度快,稳定性好,对超参数(学习率等)不敏感,“开箱即用” 效果好。
- 缺点:在某些任务(如生成模型)中可能收敛到局部最优,而非全局最优。
应用场景:
深度学习中最常用的优化器之一,几乎适用于所有场景,尤其是快速迭代的研究和开发。
例:Transformer 模型(BERT、GPT 等)、目标检测(YOLO、Faster R-CNN)、图像生成(StyleGAN)。
4. Adam 的变种(AdamW)
原理:在 Adam 基础上改进了 “权重衰减”(L2 正则化)的实现方式,让正则化效果更稳定。普通 Adam 的权重衰减会和梯度更新耦合,AdamW 将两者分离,更符合正则化的数学定义。
特点:比 Adam 的泛化能力更好(模型在新数据上表现更稳定)。
应用场景:
对模型泛化能力要求高的任务,尤其是需要大量正则化的场景。
例:训练大规模预训练模型(如 BERT、LLaMA)、小样本学习(数据少,易过拟合)。
三、其他特殊优化器
1. 学习率调度优化器(如 RAdam、Lookahead)
RAdam:解决 Adam 在训练初期(样本少)梯度估计不准的问题,让前期收敛更稳定。
Lookahead:作为 “优化器的优化器”,先让一个基础优化器(如 Adam)快速探索,再慢慢调整到更优的参数,适合需要高精度的任务。
应用场景:
对收敛稳定性要求极高的场景,如学术研究中的高精度模型训练。
2. 低资源优化器(如 Adadelta)
原理:完全去掉学习率参数,通过历史梯度自动计算步长,适合不知道如何设置学习率的场景。
应用场景:
资源有限、调参成本高的任务,如嵌入式设备上的小型模型。
总结:如何选择优化器?
- 新手首选:Adam 或 AdamW,适用性广,调参简单,适合 90% 以上的场景(分类、检测、NLP 等)。
- 追求极致性能:
- 数据稀疏(文本、推荐):RMSprop 或 AdaGrad;
- 复杂曲面(GAN、分割):Nesterov 动量或 Adam;
- 大规模数据:SGD + 动量(内存效率高)。
- 特殊需求:
- 泛化能力:AdamW;
- 低资源:Adadelta;
- 学术研究:RAdam、Lookahead。
简单说,优化器就像 “调参的方向盘”,Adam 是 “自动挡”(省心),SGD 是 “手动挡”(灵活但需要更多技巧),根据任务选对 “车型”,模型才能跑得又快又稳!