返回专辑
·Johan·3 分钟阅读

微调:冻哪些层

数据少时一次解冻全网易过拟合+毁 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. 分阶段解冻

python
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 比例写入配置模板;预训练无增益时先审查域差距与标注质量。解冻新层时学习率宜小于分类头,并在日志中核对参数组是否生效。

← 全部文章

johan's blog