CNN 迁移学习中冻结和微调怎么选?
简化版
冻结适合目标数据少且与预训练域接近的阶段,微调适合数据更多或域差异较大的阶段。常用做法是先冻结主干训练新 Head,再从高层向低层逐步解冻,并使用分层学习率;BN 的参数和运行统计要单独决定。
详细版
-
冻结减少可训练参数和过拟合风险,也降低反向显存,但限制目标域适配。
-
高层更任务相关,通常先解冻;底层边缘纹理更通用,使用更小学习率。
-
新 Head 随机初始化,初期学习率可比主干高 10~100 倍。
-
解冻会改变优化问题,需重新检查学习率、调度器和 early stopping。
-
域偏移很大时全量微调可能必要,但要监控灾难性遗忘和校准。
完整版教学
一、冻结与微调是在偏差和方差间取舍
预训练权重携带通用视觉先验。
完全冻结把它当固定特征提取器,估计参数少、方差低;全量微调自由度高,能适配新域但更易把小数据记住。
层级语义给出了自然过渡:先让分类头学会读取已有特征,再逐步允许靠近输出的层改变,通常比一开始全网大步更新稳定。
二、底层机制与关键公式
冻结参数意味着不计算其梯度,但 BN 的 running statistics 不是参数,仍可能在 train 模式更新。
若要真正冻结预训练 BN,应同时设置 eval 或采用明确的模块策略。
分层学习率让 Head 快速适配、高层温和调整、底层基本保持。
解冻新层后,优化器必须包含这些参数;只修改 requires_grad 却不重建参数组是常见代码错误。
stage 1: backbone frozen, lr(head)=1e-3
stage 2: unfreeze stage4, lr(stage4)=1e-4
stage 3: full tune, lr(early)=1e-5, lr(head)=1e-4
三、带数字的推演
模型 2500 万参数,Head 仅 51 万。
先冻结主干时只训练约 2%;若验证集停在 82%,解冻 stage4 后升到 86% 而训练验证差距未扩大,说明新增适配自由度有效。
四、方案对比与选择
| 方案/场景 | 机制或优势 | 主要代价 |
|---|---|---|
| 只训 Head | 数据极少、域接近 | 稳定但上限受限 |
| 部分解冻 | 多数迁移任务 | 效果与风险较均衡 |
| 全量微调 | 数据较多、域差异大 | 成本和过拟合风险高 |
五、实际执行流程
加载预训练权重 -> 替换 Head -> 冻结并训稳 Head
-> 解冻最高 stage -> 降低 LR -> 观察验证差距 -> 必要时继续向前解冻
六、边界条件与工程代价
输入通道不同(如灰度、医学多通道)时,第一层权重需复制、平均或重新初始化。
该层变化会向后传播,可能需要比常规迁移解冻更多层。
线性探测表现差不一定说明预训练无用,也可能是特征需要非线性适配。
应把只训 Head、部分解冻、全量微调作为递进基线。
记忆钩子:把流程记成“头先学、高层先松、底层小步走”。
七、常见误区与追问
-
误区:设置 requires_grad=False 就完全冻结了 BN。 running statistics 仍可在 train 模式被更新。
-
追问:为什么高层先解冻? 高层语义更贴近预训练类别,也更需要适配目标任务。
-
误区:解冻后沿用原来的大学习率。 大步更新可能迅速破坏预训练表示。
-
追问:优化器为何可能要重建? 新解冻参数若不在参数组中,就不会被更新。
-
追问:域越相似越应该怎样做? 通常冻结更多层并减少学习率,用更少自由度降低方差。
八、加强记忆
把流程记成“头先学、高层先松、底层小步走”。
冻结不仅看梯度,还要看 BN 统计;解冻不仅改开关,还要把参数加入优化器并降低学习率。