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

**迁移学习(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
相关推荐
七牛开发者3 小时前
从 GLM 到 GPT,HarnessPro 如何用 RSI 降低 Agent 成本
人工智能·gpt·agent·harness·rsi
跨境卫士-小汪3 小时前
TikTokShop欧洲商品接口架构调整跨境技术团队需要做好哪些准备
大数据·人工智能·新媒体运营·跨境电商·跨境·营销策略
康小汪4 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
收放扳机4 小时前
多机连线(In-Line)场景下,收放板机“缓存工位”的容量与架构选型参考
人工智能·科技·自动化·制造·pcb工艺
武天旭5 小时前
AI安全--AI大模型的后门攻击检测与防御
人工智能·深度学习·安全·机器学习
智能运维指南5 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
人工智能AI技术5 小时前
DeepInfer开源炸场!别再妄想个人电脑跑满血DeepSeek
人工智能
深蓝电商API5 小时前
用AI生成拟人行为:让鼠标轨迹更“有人味”
人工智能·爬虫
znnnk5 小时前
数据库被AI“重写”:2026,从CPU中心走向GPU中心
数据库·人工智能·oracle
深蓝AI5 小时前
网站正在对 AI Agent 集体关门:亚马逊封锁 Muse、银行拒绝登录,开发者怎么活下去
人工智能