核心要点

  • AdamW 是事实标准:在 Adam 基础上解耦权重衰减,收敛稳、调参省心,绝大多数微调默认用它。

  • Adafactor 省显存:不存完整二阶矩、用因子化近似,大模型全量微调常用来换取更小的优化器状态。

  • 8-bit Adam(bitsandbytes):把优化器状态量化到 8bit,几乎不掉精度但显存大幅下降,QLoRA 等常配它。

  • Lion 是更省内存的新选择,SGD 在大模型微调里较少用;都要配合 warmup+cosine 学习率、梯度裁剪与梯度累积。

标准回答

首选:AdamW

微调大模型默认就用 AdamW。它在 Adam 的自适应学习率基础上把权重衰减从梯度更新里解耦出来,正则化更干净、收敛更稳,几乎不用怎么调就能跑出好结果,是当前微调的事实标准。代价是它要为每个参数额外保存一阶动量和二阶动量两份状态。

省显存路线:Adafactor / 8-bit Adam / Lion

优化器状态是训练显存的大头,所以省显存的优化器是另一条主线:

  • Adafactor:不保存完整的二阶矩,而是用行列因子化去近似,优化器状态显著变小,大模型全量微调时常用它来挤出显存。
  • 8-bit Adam(bitsandbytes:保留 Adam 的算法,但把动量状态量化成 8bit 存储,精度基本无损、显存却大幅下降,是消费级显卡和 QLoRA 场景的常客。
  • Lion:只维护一份动量、用符号更新,比 AdamW 更省内存,是近年的新选择;SGD 在大模型微调里收敛慢、调参难,用得较少。

配套:学习率调度与稳定性技巧

选完优化器还要配好三件套——学习率用 warmup + cosine 衰减(先小步预热再平滑下降),梯度裁剪防止偶发梯度爆炸,梯度累积在小 batch 下模拟大 batch。它们和优化器一起决定训练是否稳定。

怎么选

显存充足、追求稳:AdamW;全量微调显存紧张:Adafactor;想用消费卡或叠加量化:8-bit Adam;想进一步省内存可试 Lion。

常见误区

⚠️ 常见踩坑

别忽略优化器状态对显存的占用——AdamW 每个参数要多存两份状态,常常比模型权重本身还吃显存,所以「显存不够」很多时候不是模型太大而是优化器太重;另外别把学习率调度和优化器混为一谈,warmup、cosine 是调度策略,和选 AdamW 还是 Adafactor 是两件事,要分别配置。

追问

追问 1为什么 AdamW 比原始 Adam 更适合做微调?

原始 Adam 把权重衰减混进了梯度里,结果衰减强度会被自适应学习率缩放,等价于一个被扭曲的、不一致的正则化。AdamW 把权重衰减从梯度更新中解耦,直接按固定比例对参数做收缩,正则化行为更可预测、泛化更好。对微调这种容易过拟合的小数据场景,干净一致的权重衰减尤其重要,所以 AdamW 成了默认。

追问 2优化器状态到底占多少显存?怎么估?

以 AdamW、fp32 状态为例,每个参数要存一阶矩和二阶矩两份,各 4 字节,光优化器状态就是 8 字节/参数;再加上参数本身和梯度,全量微调粗算要十几到二十字节/参数。所以一个 7B 模型仅优化器状态就约 56GB。8-bit Adam 把每份状态量化到 1 字节(一阶+二阶共约 2 字节/参数,相比 fp32 的 8 字节省约 3/4),能省下绝大部分;Adafactor 则靠因子化把二阶矩从 O(参数量) 降到接近 O(行+列)。这也是大模型微调要么换省显存优化器、要么走 LoRA 只训少量参数的原因。

追问 3梯度累积会影响优化器的表现吗?

梯度累积是在多个小 batch 上累加梯度后再做一次优化器更新,等效于放大 batch size,但它不增加优化器状态显存,只是多走几次前向反向。对 AdamW 这类自适应优化器,等效大 batch 会让梯度估计更稳、动量更平滑,通常是好事;但要注意学习率、warmup 步数要按「有效更新次数」而不是「前向次数」来配,否则调度会算错。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习