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

**迁移学习(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
相关推荐
Elastic 中国社区官方博客1 小时前
Elasticsearch 9.4 为 Elastic AI 生态系统的下一阶段提供支持:Dell AI Data Platform(与 NVIDIA 合作)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
SamtecChina20231 小时前
你相信光吗?| Samtec助力AI/ML系统拓扑中的光连接
人工智能
程序媛小鱼1 小时前
hello-agents学习记录
人工智能·语言模型
老码观察1 小时前
数环通LinkBot:当AI智能体遇上企业集成
人工智能
天云数据1 小时前
战略契合,落地先行:天云数据AI+能源双向赋能的实战范本
人工智能·能源
用户3457703593571 小时前
【简单上手】服务器上部署兼容 OpenAI API 的 LLM 的 vLLM 方案
人工智能
青岛前景互联信息技术有限公司1 小时前
以一体化管控新思路,构建园区全域全维度安全管理体系
大数据·人工智能·物联网
加勒比海带662 小时前
目标检测算法——农林行业数据集汇总附下载链接【Plant】
大数据·图像处理·人工智能·算法·目标检测
工业机器人销售服务2 小时前
法奥协作机器人:智能避障,安全协作
人工智能·机器人