4. 特征迁移基础
各位同学,咱们今天聊聊特征迁移。说白了,就是怎么把在一个任务上学到的“本事”,用到另一个相关任务上。你想想看,从头训练一个模型多费劲啊,数据要标、算力要烧、时间要等。特征迁移就是来解决这个问题的。
我个人习惯把特征迁移分成三大流派:Domain Adaptation(域自适应)、Fine-tuning(微调)、知识蒸馏(Knowledge Distillation)。它们目标相似,但路子完全不同。我在项目中遇到过不少同学把这仨搞混,今天咱们一次理清楚。
4.1 什么是特征迁移?
先给个直观定义:特征迁移,就是把源领域(Source Domain)中学到的特征表示,迁移到目标领域(Target Domain)中,提升目标任务的性能。
举个例子。你训练了一个能识别“猫”的模型,现在想让它识别“老虎”。猫和老虎长得像,特征有重叠。直接迁移特征,比从头训练快得多。嗯,这里要注意:迁移的前提是两个任务之间有共性。如果硬把识别猫的特征拿去识别汽车,那效果肯定翻车。
核心公式(非正式版):
迁移学习效果 ≈ 源任务与目标任务的特征重叠度 × 源模型质量
重叠度越高,迁移越顺;源模型越强,迁移收益越大。
4.2 Domain Adaptation(域自适应)
域自适应,解决的是数据分布不一致的问题。源域和目标域的任务相同,但数据分布不同。
我举个例子你就懂了。你在实验室的完美光照下拍了1000张“产品缺陷”照片,训练了一个检测模型。结果到了工厂产线,光照暗、背景乱、相机角度还歪了。模型直接崩了。这就是典型的域偏移(Domain Shift)。
域自适应的核心思想:让模型学到“域不变”的特征。说白了,就是不管光照怎么变、背景怎么换,模型只关注“缺陷”本身。
4.2.1 常见做法
- 对抗训练:加一个域判别器,让特征提取器骗过它。特征提取器学到的特征,域判别器分不清是来自源域还是目标域,那这些特征就是域不变的。
- 最大均值差异(MMD):在损失函数里加一项,拉近源域和目标域的特征分布距离。
- 风格迁移:把源域图像“翻译”成目标域风格,再训练。
避坑指南:我曾经在工业质检项目里用对抗域自适应,结果模型学偏了——它把“光照暗”当成了特征,反而忽略了真正的缺陷。后来我加了梯度反转层(GRL)的权重调节,才稳住。记住:域自适应不是万能的,源域和目标域差距太大时,效果有限。
4.3 Fine-tuning(微调)
微调,大家应该最熟悉。它的核心思想:用预训练模型做初始化,然后在目标任务上继续训练。
你想想看,ImageNet上训出来的ResNet,已经学会了边缘、纹理、形状这些通用特征。你拿来识别医学影像,只需要把最后的分类头换掉,然后整个模型或者部分层用你的数据再训一训。这就是微调。
4.3.1 微调的两种策略
| 策略 | 做法 | 适用场景 |
|---|---|---|
| 全量微调 | 所有层都参与训练 | 目标数据量较大,且与预训练数据差异大 |
| 冻结微调 | 冻结底层(特征提取层),只训练顶层(分类头) | 目标数据量小,且与预训练数据相似 |
注意:微调不是越久越好。我见过有人微调了100个epoch,结果模型把预训练学到的通用特征全忘了,这叫灾难性遗忘。我建议:先冻结底层训几个epoch看看效果,再决定要不要解冻。
4.4 知识蒸馏(Knowledge Distillation)
知识蒸馏,路子更野。它的核心思想:用一个大的、复杂的教师模型(Teacher),去教一个小的、简单的学生模型(Student)。
为什么需要蒸馏?大模型精度高,但推理慢、显存大,部署到手机或边缘设备上不现实。小模型快,但精度不够。蒸馏就是让小模型“偷师”大模型的“软知识”。
4.4.1 蒸馏的关键:软标签
传统训练用硬标签(0或1),蒸馏用软标签——教师模型输出的概率分布。比如识别一张图,教师模型输出:猫0.7、狗0.2、兔子0.1。这个分布里包含了“猫和狗有点像”的信息,硬标签里没有。
蒸馏的损失函数通常长这样:
Loss = α * KL散度(教师软标签 || 学生软标签) + (1-α) * 交叉熵(学生输出, 硬标签)
α控制蒸馏的强度。我习惯设0.7左右,让学生既学教师的“经验”,又不偏离真实标签。
我的经验:蒸馏时,温度参数T很关键。T越高,软标签越“平滑”,学生学到更多类间关系。T太低,软标签接近硬标签,蒸馏效果打折扣。我一般从T=3开始调。
4.5 三大流派的核心区别
好了,咱们把三个方法放在一起对比一下。你想想看,它们到底差在哪?
| 维度 | Domain Adaptation | Fine-tuning | 知识蒸馏 |
|---|---|---|---|
| 核心问题 | 数据分布不一致 | 目标任务数据少 | 模型太大,部署困难 |
| 迁移什么 | 域不变的特征 | 预训练权重 | 教师模型的输出分布 |
| 是否需要源数据 | 需要(源域+目标域) | 只需要预训练模型 | 只需要教师模型 |
| 模型结构变化 | 通常不变 | 可能换分类头 | 学生模型更小 |
| 典型应用 | 跨场景、跨设备 | CV、NLP预训练模型 | 模型压缩、边缘部署 |
说白了:域自适应解决“数据变了”的问题,微调解决“数据不够”的问题,蒸馏解决“模型太大”的问题。三者可以组合使用。我在实际项目中,经常先做域自适应对齐数据分布,再用微调适配任务,最后蒸馏压缩模型。一条龙服务。
4.6 知识结构图
下面这张图,帮你把三个流派的关系和核心逻辑串起来:
4.7 小结
这一章咱们把特征迁移的三大流派理清楚了。我个人觉得,理解它们的关键不在于背定义,而在于想清楚:你当前的问题到底出在哪?
- 数据分布变了?→ 试试域自适应。
- 数据不够?→ 微调走起。
- 模型太大跑不动?→ 蒸馏压缩。