**迁移学习(Transfer Learning)**就是:把一个模型在大数据、大任务上学到的知识,迁移到另一个相关任务上使用。
在深度学习里,它最常见的形式是:
text
先用一个已经训练好的预训练模型
再在自己的小数据集或新任务上微调
比如,别人已经用 ImageNet 训练好了 ResNet,它已经学会了很多通用视觉特征:边缘、纹理、形状、物体部件。你现在要做"猫狗分类"或"医学图像分类",就不必从零开始训练,而是直接拿这个 ResNet 作为起点。
1. 为什么迁移学习有效?
因为神经网络学到的很多特征是可以复用的。
以图像任务为例:
text
浅层:边缘、颜色、纹理
中层:局部形状、物体部件
深层:类别相关语义
浅层和中层特征通常比较通用。
例如识别猫、车、鸟、医学图像时,很多任务都需要先识别边缘、纹理、局部结构。
所以预训练模型不是"只会 ImageNet",而是已经学到了一套比较好的视觉表示。
对于 NLP 也是类似的:
text
BERT / GPT / RoBERTa 等模型
在大规模文本上预训练后,已经学到了词义、语法、上下文关系和一些世界知识。再迁移到情感分类、文本匹配、问答、命名实体识别等任务时,效果通常比从零训练好很多。
2. 迁移学习解决什么问题?
数据少
如果你的任务只有几百张图片、几千条文本,从零训练一个深度网络很容易过拟合。
迁移学习可以利用预训练模型已有的知识,减少对标注数据的依赖。
训练成本高
从零训练大模型非常耗时、耗显存、耗算力。
使用预训练模型可以显著缩短训练时间。
效果更好
预训练模型通常已经在大规模数据上学到了稳定表示,所以作为初始化点更好,微调后往往能得到更高准确率。
3. 常见迁移学习方式
方式一:特征提取 Feature Extraction
把预训练模型当成固定特征提取器,只训练最后的分类层。
例如图像分类中:
text
ResNet 前面的卷积层保留并冻结
把最后的 1000 类分类头替换成自己的分类头
只训练新的分类头
适合:
text
你的数据很少
新任务和预训练任务比较相似
算力有限
想快速得到 baseline
优点:
text
训练快
不容易过拟合
显存需求较低
缺点:
text
模型适应新任务的能力有限
如果新任务和原任务差异大,效果可能受限
方式二:微调 Fine-tuning
用预训练权重初始化模型,然后继续训练部分或全部参数。
常见做法:
text
替换最后分类头
先训练分类头
再解冻后面几层
最后用较小学习率微调整个模型
适合:
text
数据量中等或较大
新任务和预训练任务有一定差异
追求更好效果
优点:
text
适应能力更强
通常效果比只做特征提取更好
缺点:
text
训练成本更高
更容易过拟合
学习率需要小心设置
方式三:部分冻结
不是全冻结,也不是全训练,而是冻结前面层,只训练后面层。
例如 CNN 中:
text
冻结浅层卷积
训练深层卷积和分类头
原因是:
text
浅层特征通用:边缘、纹理、颜色
深层特征任务相关:类别语义
所以很多时候没有必要改浅层,只需要让深层适应新任务。
4. 图像任务中的迁移学习例子
假设你要做一个 5 类花朵分类任务,但只有 2000 张图片。
可以这样做:
text
1. 加载 ImageNet 预训练的 ResNet
2. 去掉原来的 1000 类分类层
3. 换成 5 类分类层
4. 冻结 backbone
5. 先训练新的分类头
6. 解冻最后几个 block
7. 用较小学习率微调
PyTorch 例子:
python
import torch
import torch.nn as nn
from torchvision import models
model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
# 替换分类头
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 5)
# 冻结 backbone
for name, param in model.named_parameters():
if not name.startswith("fc."):
param.requires_grad = False
optimizer = torch.optim.AdamW(model.fc.parameters(), lr=1e-3)
这时只训练最后的分类层。
之后可以解冻最后几层:
python
for name, param in model.named_parameters():
if name.startswith("layer4") or name.startswith("fc"):
param.requires_grad = True
optimizer = torch.optim.AdamW(
filter(lambda p: p.requires_grad, model.parameters()),
lr=1e-4,
weight_decay=1e-4
)
5. NLP 中的迁移学习
NLP 里迁移学习更常见。
典型流程是:
text
预训练语言模型 → 下游任务微调
比如用 BERT 做情感分类:
text
输入文本
经过 BERT 编码
取 [CLS] 表示
接一个分类层
在情感分类数据上微调
常见预训练模型:
text
BERT
RoBERTa
DeBERTa
GPT 系列
T5
LLaMA 类模型
NLP 微调通常会训练整个模型,但学习率很小,例如:
text
1e-5 到 5e-5
因为预训练模型已经有较好的参数,学习率太大容易破坏原有知识。
6. 什么时候适合迁移学习?
适合迁移学习的情况:
text
数据量少
标注成本高
训练资源有限
任务和已有预训练任务有一定相关性
想快速建立 baseline
模型从零训练效果差
例如:
text
医学图像分类
工业缺陷检测
小样本文本分类
语音识别微调
目标检测微调
情感分析
命名实体识别
推荐系统 embedding 迁移
7. 什么时候迁移学习效果可能不好?
迁移学习不是万能的。
如果源任务和目标任务差异太大,可能出现 负迁移(Negative Transfer)。
例如:
text
用自然图像预训练模型迁移到非常特殊的雷达图像
用英文文本模型迁移到低资源小语种
用普通场景模型迁移到医学影像
不是一定不行,但可能需要:
text
更多微调
更低学习率
更合适的预训练模型
领域内预训练
更多目标领域数据
8. 迁移学习中的关键问题
1. 冻结多少层?
一般经验:
| 数据量 | 建议 |
|---|---|
| 很少 | 冻结大部分层,只训练分类头 |
| 中等 | 冻结浅层,训练后几层 |
| 较多 | 全模型微调 |
| 新任务和原任务很相似 | 多冻结一些 |
| 新任务和原任务差异大 | 多解冻一些 |
2. 学习率怎么设?
迁移学习通常学习率要比从零训练小。
常见设置:
text
只训练分类头:1e-3 左右
微调 backbone:1e-5 到 1e-4
Transformer 微调:1e-5 到 5e-5
一个常用策略是:分类头用大学习率,预训练层用小学习率。
例如:
python
optimizer = torch.optim.AdamW([
{"params": model.backbone.parameters(), "lr": 1e-5},
{"params": model.classifier.parameters(), "lr": 1e-4}
])
因为分类头是随机初始化的,需要学得快;backbone 已经有知识,只需要轻微调整。
3. 数据增强重要吗?
很重要。
尤其是小数据迁移学习,如果不做数据增强,很容易过拟合。
图像中常见增强:
text
随机裁剪
随机翻转
颜色抖动
旋转
Mixup
CutMix
RandAugment
文本中常见方法:
text
同义词替换
回译
随机 mask
prompt 改写
数据扩充
4. 是否要重新训练 BatchNorm?
CNN 微调时 BatchNorm 要特别注意。
如果目标数据集很小,BatchNorm 的统计量可能不稳定。常见做法:
text
冻结 BatchNorm
或者使用很小学习率微调
如果目标数据分布和预训练数据差异较大,可以考虑更新 BatchNorm 统计量,但要小心验证集表现。
9. 迁移学习和从零训练的区别
| 方式 | 初始化 | 数据需求 | 训练成本 | 收敛速度 | 适用场景 |
|---|---|---|---|---|---|
| 从零训练 | 随机初始化 | 高 | 高 | 慢 | 数据大、任务特殊 |
| 特征提取 | 预训练权重,冻结大部分层 | 低 | 低 | 快 | 小数据、相似任务 |
| 微调 | 预训练权重,训练部分或全部层 | 中等 | 中等 | 较快 | 大多数实际任务 |
10. 实用调参流程
可以按这个流程做:
text
1. 先选一个合适的预训练模型
2. 替换最后任务头
3. 冻结 backbone,只训练任务头
4. 观察验证集效果
5. 解冻最后几层,用小学习率微调
6. 如果还欠拟合,再解冻更多层
7. 如果过拟合,加强正则化和数据增强
8. 最后再尝试更大模型或领域预训练模型
11. 选择预训练模型的原则
优先选和目标任务接近的模型。
图像任务:
text
普通图片分类:ImageNet 预训练 ResNet / EfficientNet / ConvNeXt / ViT
医学影像:医学数据预训练模型更好
目标检测:COCO 预训练模型
人脸任务:人脸数据预训练模型
遥感图像:遥感数据预训练模型
文本任务:
text
中文任务:中文 BERT、MacBERT、RoBERTa-wwm、中文大语言模型
英文任务:BERT、RoBERTa、DeBERTa
生成任务:T5、GPT 类模型
多语言任务:mBERT、XLM-R
12. 一句话总结
迁移学习就是把大模型在大数据上学到的通用表示拿来复用,再针对自己的任务做少量训练。
最常用的实践是:
text
小数据:冻结预训练模型,只训练分类头
中等数据:解冻后几层微调
大数据或领域差异大:全模型小学习率微调
它的核心价值是:
text
少数据也能训练出不错模型
训练更快
泛化更好
更容易得到强 baseline