深度学习——迁移学习实战指南

**迁移学习(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
相关推荐
hy568569几秒前
2027赛逸展聚焦机器视觉技术,提升机器人环境感知能力
人工智能·机器人
AndrewHZ3 分钟前
图像处理入门018 | 简易图像浏览器开发:用 OpenCV + Tkinter 打造你的第一个图像 GUI 工具
图像处理·人工智能·opencv·canvas·tkinter·事件绑定
智恒百亿4 分钟前
企业 AI 推理本地化部署:GPU 服务器选型技术分析(2026 年 8 月)
大数据·服务器·人工智能
黎阳之光4 分钟前
软硬协同国产化 | 黎阳之光矩阵式视频融合管理系统完成摩尔线程国产GPU兼容适配
大数据·人工智能·物联网·安全·数字孪生
水管在开花.6 分钟前
RAG:知识库问答系统教学②-零基础保姆级教程
人工智能·面试·agent·rag
YOLO数据集集合7 分钟前
无人机视角交通目标检测数据集 | 无人机感知 交通检测 城市监控 目标检测 YOLO格式 深度学习数据集 9016期
人工智能·深度学习·yolo·目标检测·计算机视觉·无人机·交通数据集
2601_957418807 分钟前
相机连续拍摄时,照片为什么会乱?从传输队列到相机即拍即传 SDK 的设计
人工智能·数码相机
蓝悦无人机12 分钟前
端侧神经网络量化(一):为什么要量化 & 量化基础
人工智能·深度学习·神经网络·边缘计算
2401_8322981012 分钟前
绿色AI:算力优化与低碳发展的双向共生之路
人工智能