标准回答
首选: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 步数要按「有效更新次数」而不是「前向次数」来配,否则调度会算错。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习