深度学习 Fine-tune 技巧总结

深度学习迁移学习与微调策略详解
本文总结了深度学习中的迁移学习,特别是微调技巧。介绍了为什么使用迁移学习,包括节省成本、适应小数据集等优点,并详细阐述了三种迁移学习方式:Transfer Learning、Feature Vector Extraction和Fine-tuning。通过实验和不同数据集的应用,探讨了微调的适用场景及注意事项,强调了在微调中选择合适的学习率和调整层的重要性。

       迁移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune)。通过修改预训练网络模型结构(如修改样本类别输出个数),选择性载入预训练网络模型权重(通常是载入除最后的全连接层的之前所有层 ,也叫瓶颈层)再用自己的数据集重新训练模型就是微调的基本步骤。 微调能够快速训练好一个模型,用相对较小的数据量,还能达到不错的结果。

模型的训练与预测:
深度学习的模型可以划分为 训练预测 两个阶段。
训练 分为两种策略:一种是白手起家从头搭建模型进行训练,一种是通过预训练模型进行训练。
预测 相对简单,直接用已经训练好的模型对数据集进行预测即可。

1.为什么要迁移学习?

1)站在巨人的肩膀上:前人花很大精力训练出来的模型在大概率上会比你自己从零开始搭的模型要强悍,没有必要重复造轮子。
2)训练成本可以很低:如果采用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用CPU都完全无压力,没有深度学习机器也可以做。
3)适用于小数据集:对于数据集本身很小(几千张图片)的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越大,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力,只能靠迁移学习。

2.迁移学习有几种方式

1)Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层。
2)Extract Feature Vector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。
3)Fine-tune:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层),训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。
* 注:Transfer Learning关心的问题是:什么是“知识”以及如何更好地运用之前得到的“知识”,这可以有很多方法和手段,eg:SVM,贝叶斯,CNN等。而fine-tune只是其中的一种手段,更常用于形容迁移学习的后期微调中。

3.三种迁移学习方式的对比

1)第一种和第二种训练得到的模型本质上并没有什么区别,但是第二种的计算复杂度要远远优于第一种。
2)第三种是对前两种方法的补充,以进一步提升模型性能。要注意的是,这种方法并不一定能真的对模型有所提升。
本质上来讲:这三种迁移学习的方式都是为了让预训练模型能够胜任新数据集的识别工作,能够让预训练模型原本的特征提取能力得到充分的释放和利用。但是,在此基础上如果想让模型能够达到更低的Loss,那么光靠迁移学习是不够的,靠的更多的还是模型的结构以及新数据集的丰富程度。

实验:尝试对模型进行微调,以进一步提升模型性能

1.Fine-tune所扮演的角色
拿到新数据集,想要用预训练模型处理的时候,通常都会先用上面方法一或者方法二来看看预训练模型在新数据上的表现怎么样,摸个底。如果表现不错,还想看看能不能进一步提升,就可以试试Fine-tune,进一步解锁卷积层以继续训练模型。
但是不要期待会有什么质的飞跃。
另外,如果由于新数据集与原数据集(例如ImageNet数据集)的差别太大导致表现很糟,那么一方面可以考虑自己从头训练模型,另一方面也可以考虑解锁比较多层的训练,亦或干脆只用预训练模型的参数作为初始值,对模型进行完整训练。

2.Fine-tune 也可以有三种操作方式
注:其实基本思路都是一样的,就是解锁少数卷积层继续对模型进行训练。
场景1:已经采用方法一的方式,带着冻僵的卷积层训练好分类器了。
如何做:接着用方法一里的模型,再解锁一小部分卷积层接着训练就好了。
场景2:已经采用方法二里的方式,把分类器训练好了,现在想要进一步提升模型。
如何做:重新搭一个预训练模型接新分类器,然后把方法二里训练好的分类器参数载入到新分类器里,解锁一小部分卷积层接着训练。
场景3:刚上手,想要 Transfer Learning + Fine-tune一气呵成。
如何做:和方法一里的操作一样,唯一不同的就是只冻僵一部分卷积层训练。需要注意的是,这么做需要搭配很低的学习率,因此收敛可能会很慢。
摘录:https://zhuanlan.zhihu.com/p/30121601

3.不同数据集下使用微调
数据集1 -

数据量少,但数据相似度非常高

  • 在这种情况下,我们所做的只是修改最后几层或最终的softmax图层的输出类别。

数据集2 -

数据量少,数据相似度低

  • 在这种情况下,我们可以冻结预训练模型的初始层(比如k层),并再次训练剩余的(n-k)层。由于新数据集的相似度较低,因此根据新数据集对较高层进行重新训练具有重要意义。

数据集3 -

数据量大,数据相似度低

  • 在这种情况下,由于我们有一个大的数据集,我们的神经网络训练将会很有效。但是,由于我们的数据与用于训练我们的预训练模型的数据相比有很大不同。使用预训练模型进行的预测不会有效。因此,最好根据你的数据从头开始训练神经网络(Training from scatch)。

数据集4 -

数据量大,数据相似度高

  • 这是理想情况。在这种情况下,      来重新训练该模型。

 

4.微调的注意事项
1)通常的做法是截断预先训练好的网络的最后一层(softmax层),并用与我们自己的问题相关的新的softmax层替换它。
2)使用较小的学习率来训练网络。
3)如果数据集数量过少,我们进来只训练最后一层,如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法。

注:卷积神经网络的核心是:
(1)浅层卷积层提取基础特征,比如边缘,轮廓等基础特征。
(2)深层卷积层提取抽象特征,比如整个脸型。
(3)全连接层根据特征组合进行评分分类。

多重预训练视觉模型的迁移学习

和上面的方法二类似,只是我们现在拥有多个预训练模型,采用特征提取方法,使用堆叠技术将不同的预训练模型的特征组合在一起去训练。使用多个预训练模型后,与使用一个特征集的情况相同:它们希望提供一些不重叠的信息,从而使组合时性能更优越。
注:不同预训练模型的预处理方式,摘录:https://zhuanlan.zhihu.com/p/30121601

### Fine-tuning 的相关技巧 #### 1. 数据集的选择与准备 在执行 Fine-tuning 之前,确保目标领域数据的质量至关重要。对于图像分类任务,通常需要对数据进行增强操作以提高模型的泛化能力[^2]。常见的数据增强技术包括随机裁剪、水平翻转、颜色抖动等。 #### 2. 学习率调整策略 Fine-tuning 过程中的学习率设置是一个关键因素。一般建议采用较低的学习率来防止破坏预训练模型中已经学到的知识结构。可以尝试使用学习率调度器(Learning Rate Scheduler),例如余弦退火或逐步衰减法,以便动态调整学习率。 #### 3. 层冻结与解冻 为了保护预训练权重不被过早更新而导致性能下降,在初始阶段可以选择只训练网络的最后一层或者几层全连接层,而保持其他卷积层参数不变。随着训练过程推进,再逐渐放开更多层参与训练。 #### 4. 批量大小的影响 批量大小也会影响最终效果。较小批次可能带来更稳定收敛但较慢速度;较大则反之。因此需根据具体硬件资源情况合理设定该值。 #### 5. 正则化手段的应用 为了避免过度拟合新数据集,在 fine-tune 期间可引入正则项如 L2 正则化 或 dropout 方法 来增加模型鲁棒性。 ```python import torch.nn as nn from torchvision import models model = models.resnet18(pretrained=True) # 冻结所有层 for param in model.parameters(): param.requires_grad = False # 修改最后一层适应新的类别数 num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, num_classes) ``` 上述代码展示了如何加载 ResNet 并仅允许最后线性变换部分接受梯度反向传播的过程。 #### 6. 使用迁移学习框架简化流程 利用现有的深度学习库比如 PyTorch 和 TensorFlow 提供的功能模块能够极大地减少实现复杂性的负担。这些工具不仅提供了丰富的预训练模型集合还内置了许多实用功能支持快速完成定制化的 fine-tuning 工作流。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值