预训练到微调:深入理解AI的上下游任务
笔者在2022年开始做目标检测时,了解过上游任务和上游任务的区别,在这里举例进行初步的解释。本文以目标检测为例子来解释概念。
一、简单说说:上下游任务的协同关系
上下游任务是前后关系,上游任务先让模型学习到通用的特征表示,下游任务再让模型学习到特定的特征表示来解决特定问题。可以先理解成下图1所示:
如上图所示,通过这种分工,上游任务提供"基础能力",下游任务专注"业务落地",形成完整的pipeline。
二、具体讲讲:上游任务(Upstream Tasks)
#1. 核心目标
上游任务的核心是通过大规模预训练让模型学习通用特征表示,得到「预训练模型」,以此为后续下游任务提供强大的迁移能力。
通用特征比如COCO数据集中80个类别的330K张图片,部分数据样本如下图2所示:
注:本图引子论文《Microsoft COCO: Common Objects in Context》
#2. 关键特点
1️⃣数据规模大
- 通常使用海量数据(如目标检测数据集COOC、图片分类数据集ImageNet等)。
- 例如:YOLO系列在COCO上预训练、BERT在Wikipedia+BookCorpus(16GB文本)上预训练,ViT在JFT-300M(3亿张图片)上训练。
2️⃣学习通用特征
- 图像领域的颜色、纹理、边缘等特征;
- 文本领域的词向量、语法结构等特征。
3️⃣迁移能力强大
- 因为数据集庞大且类别庞大,所以得到的预训练模型通常能适应绝大多数的现实场景。
三、具体讲讲:下游任务(Downstream Tasks)
#1. 核心目标
基于「预训练模型」进行微调训练(Fine-tuning)应用到实际落地场景,解决实际问题。
微调数据集的数据量通常比预训练数据集少几十倍。
#2. 举几个栗子
任务类型 | 输入-输出 | 实际应用 |
---|---|---|
目标检测 | 图片 => 定位+分类 | 工业瑕疵检测、自动驾驶(检测行人、车辆) |
语义分割 | 图片 => 分类(像素级别) | 医学图像(肿瘤区域分割) |
机器翻译 | 文本 => 文本 | Google Translate|有道翻译 |
#3. 实现方式——微调(Fine-tuning)
1️⃣微调(Fine-tuning)
- 对整个网络进行微调训练在预训练模型顶部添加任务特定层(如分类头),端到端训练。
- 适用场景:微调数据集量很大,如几万的数据样本。
2️⃣冻结核心部分并进行微调训练
- 冻结骨干网络(Backbone),仅对部分网络(如Head)进行微调训练,或添加新模块并进行微调。
- 适用场景:数据量较小,如只有几百的数据样本。
如果这篇文章对您有些许帮助,请帮忙点个赞👍或收个藏📃。您的支持是我继续创作的动力💪!
不要害怕,不要着急。保持每日的前进☀️与积极的内心❤️,命运总在曲折中馈赠最好的礼物。