迁移学习与fine-tuning有什么区别

本文探讨迁移学习的概念及其应用场景,特别是如何通过微调(finetune)技术有效利用目标领域的少量标注数据,避免过拟合,同时介绍了多任务学习等其他迁移学习技巧。
作者:刘兆洋
链接:https://www.zhihu.com/question/49534423/answer/191249820
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

迁移学习,个人感觉是一种思想吧,并不是一种特定的算法或者模型,目的是将已学习到的知识应用到其他领域,提高在目标领域上的性能,比如说一个通用的语音模型迁移到某个人的语音识别,一个ImageNet上的图片分类问题迁移到医疗疾病识别上。

作为知识的搬运工,下面的内容就要开始盗图大法了,台大李宏毅老师的slides,一个能把ML&DL讲成笑话的男人,非常推荐:

1. 首先,回答第一个问题?Why Transfer Learning?

迁移大法好,无论是语音、图片,还是文本处理,都有迁移学习的应用场景和实例,借助现有学习到的知识,能够很好的解决目标问题;


<img src="https://i-blog.csdnimg.cn/blog_migrate/c4ddb700687f30b9c52b34d9df6083f9.png" data-rawwidth="1410" data-rawheight="1024" class="origin_image zh-lightbox-thumb" width="1410" data-original="https://pic2.zhimg.com/v2-7c4ae21abed8ef8acf67190921a4586a_r.jpg">

2. 回答正题,fine tune和Transfer Learning的关系(经典技法之一吧,适用在source和target中都有标签数据集的情形)

李宏毅老师按照源问题数据集和目标问题数据集是否有标签,可以像下图这样划分,方格中是典型的方法技巧,当然这种分类的标准有很多,像杨强老师早在08年的Trasfer Learning Survey中,就按照domain和task的划分方法,又进一步区分了instance transfer,feature transfer,parameter transfer,knowledge transfer;


<img src="https://i-blog.csdnimg.cn/blog_migrate/5170baaa898fb60d96c91bfc70e31a1f.png" data-rawwidth="1406" data-rawheight="990" class="origin_image zh-lightbox-thumb" width="1406" data-original="https://pic2.zhimg.com/v2-fcaf713f373f3f993829249c1041059f_r.jpg">

3. 具体聊一聊fine tune吧,应用情景是我们在target上有少量的label data,如何有效利用这部分label data,而且还不过拟合呢,我们以NN的角度为例,在原问题中学习到的NN,我们在target上采用保守学习的方式,比如让target和source上的输出尽可能相近,神经网络中间的参数尽可能相近,或者tune的时候,只tune某几层,其他层的参数不发生变化;


<img src="https://i-blog.csdnimg.cn/blog_migrate/b7c0fad154ff60a2805a8bee943c1759.png" data-rawwidth="1370" data-rawheight="998" class="origin_image zh-lightbox-thumb" width="1370" data-original="https://pic3.zhimg.com/v2-b74a86fc76cd60e0cc2554d760677e91_r.jpg">
<img src="https://i-blog.csdnimg.cn/blog_migrate/51c37551af443c7d258abee3d1b846e8.png" data-rawwidth="1440" data-rawheight="984" class="origin_image zh-lightbox-thumb" width="1440" data-original="https://pic3.zhimg.com/v2-26cf67b53ad6dac55c75b989e28c3f73_r.jpg">

4. 不同领域的问题,在NN上fine tune的经验也不同,语音识别领域一般tune前几层,图片识别问题tune后面几层(背后的哲学,还请大神指点了);

5. 最后举一下迁移学习中的其他技巧吧,比如multi-task learning,怎么说呢?multi-task学习的哲学是同时学,transfer learning的思想是先学习source,在学习target。但技巧还是可以应用的,比如ACL 2015的工作,同时进行多语音的语音识别,效果会好于单独一种语言的识别效果,底层共享神经元,学习到通用特征:


<img src="https://i-blog.csdnimg.cn/blog_migrate/5088d50e245c90e48f103fd0d45008f1.png" data-rawwidth="1462" data-rawheight="1046" class="origin_image zh-lightbox-thumb" width="1462" data-original="https://pic3.zhimg.com/v2-392ce77b235c80df5baa67e71aa0b506_r.jpg">

6. Transfer Learning中的其他技巧也都蛮有意思的,比如domain adversarial training,对抗的思想有点像GAN,通过source domain和target domain的数据投影到同一个空间内,再进行学习;

推荐材料:

1. kddchina.org/file/Intro

2. cse.ust.hk/~qyang/Docs/

3. Hung-yi Lee

4. speech.ee.ntu.edu.tw/~t

### 迁移学习Fine-tuning 的实现方法 Fine-tuning迁移学习中最常用的技术之一,其核心思想是利用预训练模型作为起点,在目标任务上进一步调整模型参数以适配特定任务需求。以下是 Fine-tuning 的具体实现方法: #### 修改输出层 在 Fine-tuning 中,通常会根据新任务的需求修改模型的输出层结构。例如,对于分类任务,可以通过替换最后一层全连接层(Fully Connected Layer)或将输出维度调整为目标类别的数量来满足任务需求[^4]。 #### 微调部分或全部参数 Fine-tuning 可分为两种主要形式: 1. **仅微调顶层参数**:冻结预训练模型的部分底层权重,只更新靠近输出层的高层权重。这种方式有助于保留预训练阶段学到的基础特征表示,同时减少过拟合的风险。 2. **全面微调**:解冻整个网络的所有权重,并基于目标数据集重新训练模型。尽管计算成本较高,但这种方法往往能获得更好的性能表现。 #### 数据增强正则化技术 为了应对目标领域数据不足的问题,可以结合数据增强技术和正则化手段提升泛化能力。例如,在图像处理任务中引入旋转、缩放等变换操作;或者应用 dropout 和 L2 正则项防止过拟合现象发生。 --- ### 应用场景 Fine-tuning 广泛应用于多个领域,因其强大的通用性和有效性备受青睐[^2]。下面列举几个典型的应用实例: #### 自然语言处理 (NLP) BERT、GPT 等大规模语言模型经过充分预训练后,可通过 Fine-tuning 转变为各种下游任务的具体解决方案,如情感分析、机器翻译和问答系统开发。通过学习前缀向量等方式,模型可更好地捕捉到文本序列中的语义信息及其对应的情绪倾向特性[^3]。 #### 计算机视觉 (CV) ImageNet 上预训练得到的大规模卷积神经网络(CNN),经常被用来解决其他小型图片集合上的对象检测或分割等问题。借助于 Transfer Learning 技术,即使面对标注稀缺的小众主题也能取得不错的效果。 #### 强化学习 (RL) 某些复杂的控制环境可能难以直接构建有效的奖励函数来进行探索式训练。此时可以从简单的模拟环境中获取经验知识并通过 Fine-tuning 方法逐步过渡至更复杂的真实世界交互过程之中去完成最终的目标设定。 --- ```python import torch.nn as nn class CustomModel(nn.Module): def __init__(self, pretrained_model, num_classes): super(CustomModel, self).__init__() # 加载预训练模型 self.pretrained = pretrained_model # 替换最后的全连接层 in_features = self.pretrained.fc.in_features self.pretrained.fc = nn.Linear(in_features, num_classes) def forward(self, x): return self.pretrained(x) # 假设我们有一个预训练模型 resnet18 pretrained_resnet = torchvision.models.resnet18(pretrained=True) # 创建自定义模型用于二分类任务 model = CustomModel(pretrained_resnet, num_classes=2) ``` 上述代码展示了如何基于 PyTorch 构建一个支持 Fine-tuning 的定制化深度学习架构。这里我们将 ResNet-18 的原始 FC 层替换成一个新的线性映射单元以便执行两类区分作业。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值