简述迁移学习在深度学习中的应用
概述
本文介绍了迁移学习的基本概念,以及该方法在深度学习中的应用,引导构建预测模型的时候使用迁移学习的基本策略。
迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。
深度学习中在计算机视觉任务和自然语言处理任务中将预训练的模型作为新模型的起点是一种常用的方法,通常这些预训练的模型在开发神经网络的时候已经消耗了巨大的时间资源和计算资源,迁移学习可以将已习得的强大技能迁移到相关的的问题上。
读完本文,你将学会如何使用迁移学习来加速训练过程,提升深度模型的性能。
读完本文之后,你会了解以下内容:
- 什么是迁移学习?如何使用它?
- 迁移学习在深度学习中的简单例子。
- 什么时候可以在你自己的预测模型问题中使用迁移学习。
我们开始吧
什么是迁移学习
迁移学习是一种机器学习的方法,指的是一个预训练的模型被重新用在另一个任务中。
迁移学习和域适应指的是在一种环境中学到的知识被用在另一个领域中来提高它的泛化性能。——《深度学习》,第 526 页
迁移学习与多任务学习以及概念飘移这些问题相关,它不是一个专门的机器学习领域。
然而,迁移学习在某些深度学习问题中是非常受欢迎的,例如在具有大量训练深度模型所需的资源或者具有大量的用来预训练模型的数据集的情况。仅在第一个任务中的深度模型特征是泛化特征的时候,迁移学习才会起作用。
在迁移学习中,我们首先在一个基础数据集和基础任务上训练一个基础网络,然后我们再微调一下学到的特征,或者说将它们迁移到第二个目标网络中,用目标数据集和目标任务训练网络。如果特征是泛化的,那么这个过程会奏效,也就是说,这些特征对基础任务和目标任务都是适用的,而不是特定的适用于某个基础任务。——论文《How transferable are features in deep neural networks?》(https://arxiv.org/abs/1411.1792)
深度学习中的这种迁移被称作归纳迁移。就是通过使用一个适用于不同但是相关的任务的模型,以一种有利的方式缩小可能模型的搜索范围。
如何使用迁移学习
你可以在自己的预测模型问题上使用迁移学习。
以下是两个常用的方法:
- 开发模型的方法
- 预训练模型的方法
开发模型的方法
- 选择源任务。你必须选择一个具有丰富数据的相关的预测建模问题,原任务和目标任务的输入数据、输出数据以及从输入数据和输出数据之间的映射中学到的概念之间有某种关系,
- 开发源模型。然后,你必须为第一个任务开发一个精巧的模型。这个模型一定要比普通的模型更好,以保证一些特征学习可以被执行。
- 重用模型。然后,适用于源任务的模型可以被作为目标任务的学习起点。这可能将会涉及到全部或者部分使用第一个模型,这依赖于所用的建模技术。
- 调整模型。模型可以在目标数据集中的输入-输出对上选择性地进行微调,以让它适应目标任务。
预训练模型方法
- 选择源模型。一个预训练的源模型是从可用模型中挑选出来的。很多研究机构都发布了基于超大数据集的模型,这些都可以作为源模型的备选者。
- 重用模型。选择的预训练模型可以作为用于第二个任务的模型的学习起点。这可能涉及到全部或者部分使用与训练模型,取决于所用的模型训练技术。
- 调整模型。模型可以在目标数据集中的输入-输出对上选择性地进行微调,以让它适应目标任务。
第二种类型的迁移学习在深度学习领域比较常用。
深度学习中使用迁移学习的例子
下面用两个常见的例子具体介绍一下深度学习模型中的迁移学习。
图像数据中的迁移学习
在使用图像作为输入的预测建模问题中应用迁移学习是很常见的,其中使用图像或视频作为输入。
对于这种类型的问题而言,使用为大规模的挑战性图像数据集预训练的模型是很常见的做法,例如 ImageNet(1000 类图像分类挑战赛的数据集)。
为这个竞赛开发模型的研究组织通常会将最终模型发布出来,并且具备重新使用的许可。这些模型的训练一般会耗费几天到几星期不等的时间,这取决于所用的硬件环境。
这些模型可以直接下载到,它们将图像作为输入。
以下是这种类型的模型的三个例子:
- 牛津 VGG 模型(http://www.robots.ox.ac.uk/~vgg/research/very_deep/)
- 谷歌 Inception 模型(https://github.com/tensorflow/models/tree/master/inception)
- 微软 ResNet 模型(https://github.com/KaimingHe/deep-residual-networks)
可以在 Caffe Model Zoo 中找到更多的例子,那里分享了很多预训练的模型。
这个方法是有效的,因为大量的图片在这个模型上进行训练,需要模型能够预测出相对比较多的图片类型,反过来,这需要模型能够有效地学习从图片中提取特征,以较好地解决这个问题。
在斯坦福大学的课程《Convolutional Neural Networks for Visual Recognition》(视觉识别中的卷积神经网络)中,作者特别提醒,要仔细选择将预训练模型在多大程度上利用到新模型中。
卷积神经网络的前面几层提取到的特征更泛化,后面层提取到的特征与原始数据集更相关。——迁移学习,CS231 卷积神经网络视觉识别课程 (http://cs231n.github.io/transfer-learning/)
语言数据中的迁移学习
在以文本作为输入-输出的自然语言处理任务中,使用迁移学习是很常见的。
对于这类问题,首先会使用词向量(Word embedding)将单词映射到连续的高维空间,在这个高维空间中,意思相近的不同单词具有相似的向量表征。
目前已经有学习这些分散词表征的高效算法,并且研究组织经常在大规模文本语料库上基于许可 license 发布预训练模型。
这类例子包括:
这些分立词表征的模型可以在上述地址下载,并且结合使用在将单词表征作为输入或者生成单词作为输出的深度语言学习模型中。
Yoav Goldberg 在他的书中提醒道:
你可以下载到这些基于特大数量的文本训练得到的预训练词向量… 但是,训练方法和本质语料库的不同对结果表征有着严重的影响,并且可以获取的预训练表征可能不是你的实际案例中的最佳选择。——《Deep Learning for Natural Language Processing》(自然语言处理的深度学习方法),2017,第 135 页
什么时候使用迁移学习?
迁移学习是一种优化,是一种节省时间或者得到更好性能的捷径。
通常而言,在模型经过开发和测试之前,并不能明显地发现使用迁移学习带来的性能提升。
Lisa Torrey 和 Jude Shavlik 在他们关于迁移学习的章节中描述了使用迁移学习的时候可能带来的三种益处:
- 更高的起点。在微调之前,源模型的初始性能要比不使用迁移学习来的高。
- 更高的斜率。在训练的过程中源模型提升的速率要比不使用迁移学习来得快。
- 更高的渐进。训练得到的模型的收敛性能要比不使用迁移学习更好。
理想情况下,在一个成功的迁移学习应用中,你会得到上述这三种益处。
如果你能够发现一个与你的任务有相关性的任务,它具备丰富的数据,并且你也有资源来为它开发模型,那么,在你的任务中重用这个模型确实是一个好方法,或者(更好的情况),有一个可用的预训练模型,你可以将它作为你自己模型的训练初始点。
在一些问题上,你或许没有那么多的数据,这时候迁移学习可以让你开发出相对不使用迁移学习而言具有更高性能的模型。
对源数据和源模型的选择是一个开放问题,可能需要领域专家或者实际开发经验。