【概述】
迁移学习(Transfer Learning)是利用数据、任务或模型之间的相似性,将在旧领域训练好的模型,应用于新的领域这样的过程,要求两个任务的输入属于同一性质,即要么同是图像、要么同是语音或其他
当有海量的数据资源时,能够很容易从海量数据中学习到一个鲁棒性很强的模型,可以不需要迁移学习
但通常情况下,需要研究的领域可获得的数据极为有限,在少量的训练样本上精度极高,但是泛化效果极差,此时就需要迁移学习
此外,由于训练成本的问题,很少会去从头开始训练一整个深度卷积网络,从头开始训练一个卷积网络通常需要较长时间且依赖于强大的 GPU 计算资源
【方法】
最常见的迁移学习方法是微调(Fine Tuning)
对于已训练好的模型,称之为预训练模型(Pre-trained Model),通常需要加载以预训练模型,然后根据实际训练数据调整网络模型参数
在 PyTorch 的 vision 中,给出了 AlexNet、GoogLeNet、ResNet 等经典卷积神经网络的预训练模型
在从 torchvision.models
中导入后,即可使用,例如:
1 | from torchvision.models import resnet50, ResNet50_Weights |
关于具体使用方法,详见:PyTorch 文档
假设有两个任务 $A$ 与 $B$,任务 $A$ 不是目标任务,其拥有海量的数据资源并且有已训练好 $1000$ 个类别的模型,任务 $B$ 是目标任务,是 $300$ 个类别分类
具体做法是:
- 加载任务 $A$ 的模型,作为预训练模型
- 在预训练模型的基础上,根据任务 $B$ 的要求,修改最后的输出结构
- 进行重训练
- 如果任务 $B$ 的数据量小,那么就将任务 $A$ 的预训练模型的所有层进行冻结(Freeze),即不进行训练,剩下的输出层调整参数
- 如果任务 $B$ 的数据量大,那么就将任务 $A$ 的预训练模型中大部分层进行冻结(Freeze),剩下的层在新任务数据基础上调整参数