微调:冻哪些层
数据少时一次解冻全网易过拟合+毁 pretrained 特征——先训 head、再逐层解冻是稳妥默认,LR 分组随解冻调整。

1. 一次全解冻 + 大 LR,特征毁完
工业缺陷检测八百张图,ImageNet pretrained ResNet 一次全解冻、head 和 backbone 同 LR 1e-3——train acc 很快 99%,val 60%,且比 random init 还差。Pretrained 低层特征被大 LR 洗掉。小数据微调:先冻 backbone 训 head,再逐层解冻是稳妥默认。
2. 分阶段解冻
for param in model.backbone.parameters():
param.requires_grad = False
# 阶段 1:只训 head 若干 epoch
for param in model.backbone.layer4.parameters():
param.requires_grad = True
optimizer = torch.optim.AdamW([
{'params': model.head.parameters(), 'lr': 1e-3},
{'params': model.backbone.layer4.parameters(), 'lr': 1e-4},
])浅层学通用边缘纹理,深层学语义——数据少时只动深层通常够。数据量大(>10k)或 domain 与 pretrain 差很远,可更早解冻更多层。
3. LR 分组随解冻调整
解冻新层时加入 param group,LR 宜小于 head:backbone 已收敛,大 LR 破坏表示。常见比例 head : backbone = 10:1 或 5:1。新解冻层可从更小 LR warmup 几个 epoch。
与 BN 策略配合:小 batch 微调时 freeze BN running stats,避免噪声更新。见 dl-bn-when-finetune。
4. 何时用 linear probe vs full fine-tune
Linear probe:只训最后一层,最快验证 domain 是否 match pretrain——probe 都不涨说明 pretrain 特征不适用或 label 有问题。Full fine-tune:数据够、domain 近时用。中间路线:partial unfreeze + 小 LR。
Self-supervised pretrain(MAE、SimCLR)后 fine-tune 有时可更早解冻——表示更 general,但仍需 LR 分组。
5. 失败模式
小数据全解冻 → 过拟合 + 特征毁。只训 head 但 domain 差 → underfit,需解冻更多层。解冻后不降 backbone LR → 灾难性遗忘 pretrain。忘记 requires_grad 导致 backbone 实际未训或未冻。
6. 案例:全解冻不如 random init
某八百张项目全解冻后 val 低于 random init——pretrain 特征被大 LR 破坏。改先训 head 再解冻 layer4,val 涨十二个点到合理水平。小数据必须分阶段。
7. 验收
- 阶段 1 head-only val 有 baseline。
- 逐层解冻后 val 应 ≥ head-only,不应更差。
- param group LR 在日志可核对。
- 小 batch 时 BN freeze 策略明确。
- 与 random init 同 budget 对比,pretrain 应有 gain。
8. 落地与衔接
微调手册写清阶段:仅训分类头、再解冻深层、可选全解冻,每阶段参数组学习率进配置。小批量时批归一化冻结策略与专门文章对齐,避免噪声统计破坏预训练。与随机初始化同 epoch 预算对比,预训练无增益时先查域与标签,而不是盲目加大学习率。检查点按阶段存最佳验证,方便回滚到头-only 基线。合并请求附阶段曲线,审查者能一眼看出是否跳步全解冻。
9. 案例复盘
某八百张缺陷检测一次全解冻同学习率,验证低于随机初始化——预训练特征被洗掉。改先训头再解冻第四层并分组学习率后验证涨十二点。复盘把「小数据禁止全解冻大学习率」写进代码审查清单。下一项目线性探测不涨则早停查数据,不再堆数周全量盲目训练。该规则已纳入迁移学习培训,减少重复毁特征事故。
8. 与逐层解冻的衔接
解冻节奏须与 dl-bn-when-finetune 的批归一化策略同一配置文件维护:阶段一只训头、阶段二解冻最后一层块,每阶段结束存 checkpoint 并记录验证基线。域差距大时线性探测不涨,应优先审查数据与标签,而不是跳过阶段直接全量解冻。随机初始化对照实验须与微调使用相同 epoch 预算与增广,否则无法判断预训练是否带来净收益。
微调是保留 pretrain 与适应新 task 的权衡。先 head、再逐层、LR 分组——比一次全解冻可靠。数据量决定解冻深度,不决定可以省掉分阶段。把阶段表与 LR 比例写入配置模板;预训练无增益时先审查域差距与标注质量。解冻新层时学习率宜小于分类头,并在日志中核对参数组是否生效。
相关
也可以看看
- ·5 分钟阅读
peft target_modules 与 merge
LoRA 只训低秩增量矩阵,省显存防 catastrophic——rank 和 target modules 决定 capacity,全量微调仍可能在数据足时更强。
- ·4 分钟阅读
freeze_bn 与 target 域 stats
小 batch 微调时 BatchNorm 统计量噪声大——freeze backbone BN、换 SyncBN 或 GroupNorm 往往比盲目加大 batch 更实际。
- ·16 分钟阅读
KV cache 分页与前缀复用:吞吐上去后正确性怎么验
沿 block table、前缀哈希与抢占回收拆开缓存一致性风险,说明错页复用为何表现为「偶发胡话」;用确定性前缀集、强制抢占和逐 token 对照验收。
johan's blog