举个例子,假设今天老板给你一个新的数据集,让你做一下图片分类,这个数据集是关于Flowers的。问题是,数据集中flower的类别很少,数据集中的数据也不多,你发现从零训练开始训练CNN的效果很差,很容易过拟合。怎么办呢,于是你想到了使用Transfer Learning,用别人已经训练好的Imagenet的模型来做。
做的方法有很多:
综上,Transfer Learning关心的问题是:什么是“知识”以及如何更好地运用之前得到的“知识”。这可以有很多方法和手段。而fine-tune只是其中的一种手段。
SPPNet(Spatial Pyramid Pooling Convolutional Networks,空间金字塔池化卷积网络)将CNN的输大从固定尺寸改进为任意尺寸。在普通的CNN结构中,输入图像的尺寸往往是固定的,输出可以看做是一个固定维数的向量。SPPNet在普通的CNN结构中加入了ROI池化层(ROI Pooling ),使得网络的输入图像可以是任意尺寸的,输出一个固定维数的向量。ROI池化层一般跟在卷积层后面,它的输入是任意大小的卷积,输出是固定维数的向量,如图5-3所示。
设卷积层输出的宽度为w,高度为h,通道为c。不管输入的图像尺寸w,h是多少,卷积层的通道数c是一个常数。
迁移学习的使用场景
使用迁移学习的主要原因在于数据资源的可获得性和训练任务的成本。当我们有海量的数据资源时,自然不需要迁移学习,机器学习系统很容易从海量数据中学习到一个鲁棒性很强的模型。但通常情况下,我们需要研究的领域可获得的数据极为有限,仅靠有限的数据量进行学习,所习得的模型必然是不稳健、效果差的,通常情况下很容易造成过拟合,在少量的训练样本上精度极高,但是泛化效果极差。另一个原因在于训练成本,即所依赖的计算资源和耗费的训练时间。通常情况下,很少有人从头开始训练一整个深度卷积网络,一个是上面提到的数据量的问题,另一个就是时间成本和计算资源的问题,从头开始训练一个卷积网络通常需要较长时间且依赖于强大的 GPU 计算资源,对于一门实验性极强的领域而言,花费好几天乃至一周的时间去训练一个自己心里都没谱的深度神经网络通常是不能忍受的。
深度卷积网络的可迁移性
卷积神经网络具备良好的层次结构,通常而言,普通的卷积神经网络都具备卷积-池化-卷积-池化-全连接这样的层次结构,在深度可观时,卷积神经网络可以提取图像各个 level 的特征。当我们要从图像中识别一张人脸的时候,通常在一开始我们会检测到图像的横的、竖的等边缘特征,然后会检测到脸部的一些曲线特征,再进一步会检测到脸部的鼻子、眼睛和嘴巴等具备明显识别要素的特征等等。
这便揭示了深度卷积网络可迁移性的基本原理和卷积网络训练过程的基本事实。具备良好层次的深度卷积网络通常都是在最初的前几层学习到图像的通用特征(general feature),但随着网络层次的加深,卷积网络便逐渐开始检测到图像的特定的特征,两个任务系统的输入越相近,深度卷积网络检测到的通用特征越多,迁移学习的效果越好。
迁移学习的使用方法
通常而言,迁移学习有两种使用套路。第一种便是常说的 finetune,即微调,简单而言就是将别人训练好的网络拿来进行简单修改用于自己的学习任务。在实际操作中,通常用预训练的网络权值对自己网络的权值进行初始化,以代替原先的随机初始化。第二种称为 fixed feature extractor,即将预训练的网络作为新任务的特征提取器,在实际操作中通常将网络的前几层进行冻结,只训练最后的全连接层,这时候预训练网络便是一个特征提取器。
keras 为我们提供了经典网络在 ImageNet 上为我们训练好的预训练模型,预训练模型的基本信息如下表所示:
迁移学习方法可分类为:
归纳式迁移学习(Inductive Transfer learning):在该场景中,源域和目标域相同,但源任务和目标任务彼此不同。算法尝试利用来自源域的归纳偏差帮助改进目标任务。根据源域中是否包含标记数据,归纳式迁移学习可以进一步分为类似于多任务学习(multitask)和自学习(self-taught)这两类方法。
无监督迁移学习(Unsupervised Transfer Learning):该场景类似于归纳式迁移学习,重点关注目标域中的无监督任务。其中,源域和目标域类似,但是任务不同。在该场景中,任一域都没有可用的标记数据。
直推式迁移学习(Transductive Transfer Learning):在该场景中,源任务和目标任务之间存在一些相似之处,但相应的域不同。源域具有大量标记数据,而目标域没有。根据特征空间或边缘概率的设置不同,直推式迁移学习可进一步分类为多个子类。
下表总结了上述技术的不同设置和场景。
上面介绍的三种迁移类别,详细列出了可应用和研究迁移学习的不同设置。下列方法可回答在类别间迁移什么的问题:
基于样本的迁移学习(Instance transfer):通常,理想场景是源域中的知识可重用到目标任务。但是在大多数情况下,源域数据是不能直接重用的。然而,源域中的某些实例是可以与目标数据一起重用,达到改善结果的目的。对于归纳式迁移,已有一些研究利用来自源域的训练实例来改进目标任务,例如 Dai 及其合作研究者对 AdaBoost 的改进工作。
基于特征表示的迁移学习(Feature-representation transfer): 该类方法旨在通过识别可以从源域应用于目标域的良好特征表示,实现域差异最小化,并降低错误率。根据标记数据的可用性情况,基于特征表示的迁移可采用有监督学习或无监督学习。
基于参数的迁移学习(Parameter transfer): 该类方法基于如下假设:针对相关任务的模型间共享部分参数,或超参数的先验分布。不同于同时学习源和目标任务的多任务学习,在迁移学习中我们可以对目标域应用额外的权重以提高整体性能。
基于关系知识的迁移学习(Relational-knowledge transfer): 与前面三类方法不同,基于关系知识的迁移意在处理非独立同分布(i.i.d)数据即每个数据点均与其他数据点存在关联。例如,社交网络数据就需要采用基于关系知识的迁移学习技术。
下表清晰地总结了不同迁移学习策略间的关系,以及迁移什么的问题。
深度迁移学习策略
近年来,深度学习在可解决的复杂问题类型上取得了长足的进步,其成果令人惊讶。然而,深度学习系统所需的训练时间和训练数据的量级,要远大于传统的机器学习系统。目前人们已经提出了各种深度学习网络,它们具有最先进的性能,有时甚至优于人类的表现。一些深度网络已经在计算机视觉和自然语言处理等领域得到开发和测试,并且其中大多数网络已完全共享给团队和研究人员使用。这些预训练的网络和模型构成了在深度学习环境中迁移学习的基础,我称其为“深度迁移学习”的基础。下面给出两种广为使用的深度迁移学习策略。
以现成可用的预训练模型作为特性抽取器
深度学习的系统和模型采用了分层架构,在不同的层上学习不同的特征,即分层特征的层次表示。各层最终连接到最后一层(对于分类任务而言,通常是完全连接层),并给出最终输出。这种分层架构可不使用预训练网络(例如 Inception V3 或 VGG)的最终层,作为其他任务的固定特征抽取器。
这里的关键理念是,仅利用预训练模型的加权层提取特征,而不是在使用新数据训练新任务期间更新模型层的权重。
例如,使用不包括最终分类层的 AlexNet,可基于图像的隐藏状态将图像从一个新域任务转换为一个 4096 维的向量,从而能够利用来自于源域任务的知识从新域任务中提取特征。这是使用深度神经网络进行迁移学习中最广为使用的方法之一。
现在可能会出现一个问题,这些现成可用的预训练特性对现实中不同任务的运行情况如何?
预训练模型
给出在源任务上表现良好的模型,是迁移学习的基本要求之一。幸运的是,深度学习社区是乐于分享的。已有多个团队公开分享了许多最先进的深度学习框架,跨越了多个不同的领域。其中包括计算机视觉和自然语言处理,这是深度学习得到最广泛应用的两个领域。预训练模型通常是以训练达到稳定状态的数百万参数或权重的形式共享,可供研究人员以不同的方式使用。例如,著名的深度学习 Python 库 Keras 提供了下载界面,可下载一些广为使用的模型。人们还可以通过网络访问一些预训练的模型,因为大多数模型都是开源的。
迁移学习是对现有学习算法所存在的一些普遍问题的增强,前景无量。 然而,迁移学习依然存在一些相关问题需要做进一步研究和探索。除了迁移什么、何时迁移以及如何迁移这三个问题依然难以回答之外,负迁移(negative transfer,也称干扰)和迁移界限(transfer bounds)也是主要的挑战。
在迁移学习中,有四种情况决定着该如何训练pre-trained neural network以便将其应用于新的问题。而这取决于两个因素:新数据集的大小以及新数据集与原始数据集(指训练pre-trained neural network使用的数据集)的相似程度。
下面介绍一个三卷积三全连接层的网络,将其作为pre-trained neural network,来看四种情况下如何对其进行修改:
假设该训练好的网络第一层卷积用于检测边沿信息,第二层用于检测形状信息,第三层用于检测更为高级的特征。三个全连接层对高级特征组合后进行softmax分类。
1.1 新数据集小并且与原始数据集相似
在这种情况下(Feature extraction):
为什么这样修改呢?因为新数据集小,首要考虑的一点就是防止过拟合,所有就保持原网络层的权值不动。另外因为数据集之间是相似的,那么也就可以认为网络之前在旧数据集上学得的高级特征(权值)也可用于新数据集。
1.2 新数据集小且数据集间不相似
在这种情况下:
因为数据集小,所以首要考虑的还是防止发生过拟合,所以原网络层的权值不动。但是由于数据集已经不相似了,原网络中深层卷积所检测的高级特征就不能应用于新数据集了,所以就将其去掉。但由于原网络一般都在大量的训练集上训练,所以低级特征的检测,也就是前几层卷积还是可以用于新数据集的。
1.3 新数据集大且数据集间相似
在这种情况下(Fine tune):
此时,因为数据量大,并不容易发生过拟合,所以可以重训练整个网络。此外由于数据集相似,原网络层检测到的特征可用于新数据集,所以网络层上的原权值可以用来作为初始值,这样可以加快训练的速度。
1.4 新数据集大且数据集间不相似
这时可以:
Feature extraction就是只训练新增加层的权值,其他层的权值保留不动。
Finetune就是使用原网络层的权值作为初始值,训练整个网络。
1. 迁移学习的重要性
传统的机器学习/数据挖掘只有在训练集数据和测试集数据都来自同一个feature space(特征空间)和统一分布的时候才运行的比较好,这意味着每一次换了数据都要重新训练模型,太麻烦了。比如:
(1)从数据类型/内容上看,对于新的数据集,获取新的训练数据很贵也很难。
(2)从时间维度上看,有些数据集很容易过期,即不同时期的数据分布也会不同。比如对于某个用户进行室内wifi定位的时候,把他在一个很大的室内的数据标记好已经很难了,wifi信号强弱还会受到时间影响,所以如果对于每个时间段都要进行一次训练那就太麻烦了。。
2. 概念
记住两对概念就好了:domain(域)和task(任务),source(源)和target(目标),然后给它们进行自由组合。
domain:包括两部分:1.feature space(特征空间);2.probability(概率)。所以当我们说domain不同的时候,就得分两种情况。可能是feature space不同,也可能是feature space一样但probability不同。
task:包括两部分:1. label space(标记空间);2.objective predictive function(目标预测函数)。同理,当我们说task不同的时候,就得分两种情况。可能是label space不同,也可能是label space一样但function不同。
source和target就不用说了,前者是用于训练模型的域/任务,后者是要用前者的模型对自己的数据进行预测/分类/聚类等机器学习任务的域/任务。
3. 迁移学习的分类
3.1. 从问题角度来看
(1)迁移什么?
哪一部分知识可以被迁移?
(2)怎么迁移?
那当然就是训练出适合的模型啦。
(3)什么时候需要用到迁移学习?
当source domain和target domain没什么关系或者太不相同的时候,迁移效果可能就不那么好了,甚至可能会比不迁移的时候表现要更差,这个就叫做negative transfer了。
可以看到,迁移学习的能力也是有限的,所以我们需要关注迁移学习的边界在哪里,比如用conditional Kolmogorov complexity去衡量tasks之间的相关性。
作者指出,现在很多工作都关注前两个问题,但实际上第三个问题是很重要的,因为你在那捣腾半天最后发现其实迁移了还不如不迁移,那不是白费心思嘛。所以作者认为这个问题应当被重视,比如说可以在迁移之前先看看source和domain之间的transferability(可迁移性)。
3.2. 从迁移场景来看
(1)Homogeneous TL(同构学习):source domain和target domain的feature space相同。
(2)Heterogeneous TL(异构学习):source domain和target domain的feature space不同。
3.3. 从迁移场景来看
(1)Inductive TL(归纳式迁移学习)
source和target的domain可能一样或不一样,task不一样;target domain的labeled数据可得,source domain不一定可得。
所以呢,根据source domain的labeled数据可以再细分为两类:
multitask learning(多任务学习):source domain的labeled数据可得。
self-taught learning(自学习):source domain的labeled数据不可得。
(2)Transductive TL(直推式迁移学习)
source和target的task一样,domain不一样;source domain的labeled数据可得,target domain的不可得。注意我们提过,domain不一样意味着两种可能:feature space不一样,或者feature space一样而probability不一样。而后一种情况和domain adaptation(域适配)息息相关。这里也可以根据domain和task的个数分为两个情况:
Domain Adaptation(域适配):不同的domains+single task
Sample Selection Bias(样本选择偏差)/Covariance Shift(协方差转变):single domain+single task
(3)Unsupervised TL(无监督迁移学习)
source和target的domain和task都不一样;source domain和target domain的labeled数据都不可得。
综上,这几个方法差别主要是:(1)source和domain之间,domain是否相同,task是否相同;(2)source domain和target domain的labeled数据是否可以得到。
直接看这两个表。值得注意的是,第一张表中Inductive TL和Unsupervised TL之间是用“/”隔开的,什么意思呢?再看看Inductive TL的定义,是说tasks不一样,但domain可能一样可能不一样,不一样的时候就可以称为Unsupervised TL。不过Unsupervised TL会更关注unsupervised的任务。
3.4. 从“迁移什么”来看
(1)Instance-based TL(样本迁移)
尽管source domain数据不可以整个直接被用到target domain里,但是在source domain中还是找到一些可以重新被用到target domain中的数据。对它们调整权重,使它能与target domain中的数据匹配之后可以进行迁移。盗一张图,比如在这个例子中就是找到例子3,然后加重它的权值,这样在预测的时候它所占权重较大,预测也可以更准确。
instance reweighting(样本重新调整权重)和importance sampling(重要性采样)是instance-based TL里主要用到的两项技术。
(2)Feature-representation-transfer(特征迁移)
找到一些好的有代表性的特征,通过特征变换把source domain和target domain的特征变换到同样的空间,使得这个空间中source domain和target domain的数据具有相同的分布,然后进行传统的机器学习就可以了。
特征变换这一块可以举个栗子,比如评论男生的时候,你会说”好帅!好有男人味!好有担当!“;评论女生的时候,你会说”好漂亮!好有女人味!好温柔!“可以看出共同的特征就是“好看”。把“好帅”映射到“好看”,把“好漂亮”映射到“好看”,“好看”便是它们的共同特征。
关于这一块,感觉这个文章讲的挺详细的,可以看看:迁移学习理论与应用
(3)Parameter-transfer(参数/模型迁移)
假设source tasks和target tasks之间共享一些参数,或者共享模型hyperparameters(超参数)的先验分布。这样把原来的模型迁移到新的domain时,也可以达到不错的精度。
下面这个项目感觉用到就是这个parameter-transfer:基于深度学习和迁移学习的识花实践。
(4)Relational-knowledge-transfer(关系迁移)
把相似的关系进行迁移,比如生物病毒传播到计算机病毒传播的迁移,比如师生关系到上司下属关系的迁移。
4. 具体方法
这一块主要就是把上面的3.3和3.4揉起来。先上一张表看看它们之间哪些可以揉在一起,哪些不可以:
好了,我们来开始揉吧!我主要会介绍它们的一些方法、假设、大概是怎么做的,其中方法只会提一些很出名很出名的,方便索引。
4.1. Inductive TL
(1)Instances TL
主要方法:TrAdaBoost(AdaBoost的拓展)
假设:source domain和target domain数据的feature和labels是一样的,但是分布不一样;部分source domain的数据会对target domain的学习有帮助,但有部分可能会不利于target domain的学习。
过程:大致就是不断地给好的source data赋予更高的权重,给不好的赋予更多的权重。
(2)Features TL
需要根据source domain的labeled data是否可得分为两类(回顾:Inductive TL是target domain的labeled data可得,但是source domain的未必可得):
Supervised Feature Construction(监督的特征构建)
Unsupervised Feature Construction(非监督的特征构建)
大致过程:通过减少model error,找出低维的有代表性的特征
(3)Parameters TL
主要方法:MT-IVM(基于Gaussian Processes)
大致过程(注意这里讲述的不是上面提到的那个主要方法的过程,而是另一个方法的过程):假设source和target的参数都可以分为两部分,一部分是source/target特有的参数,一部分是它们共同有的参数。把这两个参数丢到改进了的SVM问题中,把参数训练出来就好了。
(4)Relational TL
注意和上面三种方法不同的是,这个方法是在relational domains里进行的,这个domain里的数据不是iid(独立同分布)的,所以它不需要假设每个domain里的数据都必须iid。
主要方法:statistical relational learning(SRL,统计关系学习)
4.2. Transductive TL
回顾一下,Transductive TL是source domain的label可得,target domain的label不可得。但是要注意!为了得到target data的边际分布,在training的时候是需要一些unlabeled的target data的。
(1)Instances TL
主要方法:Importance sampling。
大致过程:我们的目标是最小化target domain里的expected risk(期望风险),但是target domain里没有labeled数据可用,所以我们必须替换成source domain里的数据,通过一些方法可以把它替换成source domain里的数据再乘以一个权重,只要把这个权重算出来就好。
(2)Feature Representations TL
主要方法:Structural Correspondence Learning(SCL)
大致过程:定义一些pivot features(就是共同特征),然后把每一个pivot feature都当成是一个新的label vector,通过公式把权重学习出来,然后对权重进行SVD分解,最后在argumented feature vector上使用传统的判别式算法即可。这里argumented feature vector包括这些新的features和所有原来的feature。(我还没有详细看这一块儿,所以先直译了)
难点:如何寻找好的pivot feature、domain之间的依赖性。
4.3. Unsupervised TL
(1)Feature Representations TL
主要方法:涉及两个
Self-taught clustering(STC),主要用于transfer clustering(迁移聚类)。目标就是希望通过source domain里大量的unlabeled data对少量的target domain里的unlabeled data进行聚类。
TDA方法,这个主要用于解决transfer dimensionality reduction(迁移降维)问题
5. 存在不足
(1)当然就是negative transfer的问题啦,比如怎么定义transferability,怎么衡量domain之间或task之间的相关性。
(2)目前的TL算法主要都是想要提高feature space相同probability不同时的表现的,记得我前面说过的domain不同或者task不同都有两种情况,一种是space不同,一种是space相同probability不同吗?这里说的就是目前TL算法主要致力于提高的都是概率不同的。但是很多时候我们其实也想要对feature space不同的domain和task进行迁移。这个就是3.2提到的heterogeneous TL(异构学习)问题。
(3)现在的TL主要都是应用到小且波动不大的数据集中(例如传感器数据、文本分类、图片分类等),以后要考虑如何用到更广泛的数据场景中。