迁移学习Transfer Learning
本文搬迁自 「李宏毅机器学习」学习笔记-Transfer Learning,由于原作者总结得太好了,在此几乎完全搬运,仅略作修改。
The aim for Transfer Learning and Example
Aim
Transfer Learning要做的是:假设现在手上有与现在进行的task没有直接相关的data,使用这些data来帮助做一些事情。
Example
比如现在要做猫狗的分类器,所谓不直接相关的data就可能是
- Similar domain, different tasks(大象与老虎的图片,与猫狗图片的分布是相像的)
- Different domain, same task(猫狗的卡通图片,与猫狗图片的分布是不像的)
Why Transfer Learning?
为什么考虑transfer learning?因为我们只有很少的数据是符合任务处理要求的(Target Data),但是类似的数据(Source Data)却有很多。
例如,我们的任务是
- 辨识台语,我们只有很少台语数据,但是我们有很多其它语言的数据,类似中文、英语等等;
- 辨识医疗图像,数据很少,但是普通的image很多;
- 文本分析上,需要分析的文件是某个很specific的domain,数据很少,但是从网络上可以找到很多文本数据。
Transfer Learning - Overview (Four Class)
Target data是跟现在考虑的task直接相关的,source data跟我们现在考虑的task没有直接的关系。
Class1: source->labelled, target->labelled
Model Fine-tuning
如果target data的量特别少,少到只有几个example,这时候叫做one-shot learning。
训练的时候,先用source data训练出一个model,然后用target data去fine-tune这个model。其实就相当于把source data训练出的model当作当前model的初始值,然后在用target data训练。
训练的时候有很多小技巧,比如Conservative Training和Layer Transfer。
Conservative Training
为了避免target data在fine-tune模型时造成过拟合,要增加约束,即增加正则化项,希望同一笔data经过fine-tune前后两个模型的output越接近越好,或两个模型的参数越接近越好。
Layer Transfer
把Source data训练好的模型中的某些layer直接copy过来,用target data训练剩下的layer。这样的好处是,target data只需要训练较少的参数,避免了过拟合。
在不同的task上,需要被transfer的layer往往是不一样的。比如
- 在语音识别上,通常copy最后几层,重新训练前几层。这是因为语音识别神经网络前几层是识别语者的发音方式,后几层是识别,后几层与语者没有关系。
- 在图像识别上,通常copy前面几层,重新训练后面几层。这是因为图像识别神经网络的前几层是识别有没有基本的几何结构,因此可以transfer,而后几层往往学到的比较抽象,无法transfer。
所以,哪些layer要被transfer是case by case的。特别是运用之妙,存乎一心。
Image在Layer Transfer上的实验,出自Bengio在NIPS2014的paper。把ImageNet分成Source、Target两部分,横轴代表Layer Transfer时copy几个layer(0个代表没有Layer Transfer,是Baseline),纵轴是Top-1 accuracy。曲线4表明,前面几个layer是可以共用的。曲线5表明,Layer Transfer + Fine-tuning 在所有case下,Top-1 accuracy均有提高。这一结果的惊人之处在于,这里的target data已经非常多(ImageNet的一半),但是再加上Source data(ImageNet的另一半)仍然有所帮助。曲线2表示,如果用target domain训练出一个模型,fix住前几个layer,再用target domain训练后几个layer,结果可能坏掉,因为训练的时候,前面的layer和后面的layer其实是要互相搭配的。曲线3表明,在曲线2基础上fine-tune,结果会恢复。
红色线是上上图中的曲线4。黄色线表示,如果source和target比较没有关系(比如把所有自然界的图片当做source,所有人工的图片当做target),那么transfer效果会掉很多,但只copy前几个layer影响是比较小的。这意味着,就算是source domain和target domain是非常不一样的,一边是自然的东西,一边是人造的东西,在neural network第一个layer,它们做的事情很有可能是一样的。绿色线表示,如果前几个layer的参数是random的,结果会烂掉。
Multitask Learning
Multitask Learning 与 Fine-tuning 的区别在于, Fine-tuning 在意的是在target domain上做得好不好,不介意fine-tune 之后在source domain上结果坏掉。而在Multitask Learning 上,同时在意在target domain和source domain上都做得好不好。
左边的网络结构——假设两个不同的task,它们用的是同样的feature,比如,都做影像辨识,只是影像辨识的class不一样,就可以learn一个neural network,input就是两个不同task同样的feature,但是中间会分叉出来,一部分的network,它的output是task A的答案,一部分network的output是task B的答案。前提是两个task有共通性,然后则可以共用前面几个layer,同时使用task A和task B的数据去同时训练前几个layer,所以前面几个layer是用比较多的数据训练的,可能有比较好的performance。
右边的网络结构——假设两种不同的task,不同的input都用不同的neural network,把它transform到同一个domain上面去,在用一个domain上再应用不同的neural network,一条路做task A,一条路做task B,中间可能有某几个layer是share的。
Multitask Learning的一个成功例子是多语言的语音识别,可以训练一个模型同时识别多国语言。翻译的时候也可以做同样的事情,可以把中翻英、中翻日的两个model一起训练。目前在语音的发现是,几乎所有的语言都可以transfer,曾经有人收集了十几种语言,两两之间做transfer,每个case都有进步,哪怕语言之间不是很像。
蓝
线
\color{blue}{蓝线}
蓝线表示,没有transfer learning时汉语识别的结果。
黄
线
\color{#fbbc05}{黄线}
黄线黄线表示,用欧洲语言做Transfer learning的结果。在相同汉语训练数据下,使用transfer learning的效果要更好一些。如果有做transfer learning的话,只需要二分之一以下的数据就可以跟原来有两倍的数据做的一样好。
Progressive Neural Networks
如果两个task很不相关,却又做了transfer,效果可能是负面的。有人提出了Progressive Neural Network,使得两个task即使无关,做transfer效果也不会比不做更差。
Progressive Neural Network的做法是训练好第一个模型后,第一个模型的参数就fix住。训练第2个模型时,每一个hidden layer都会去接前面第一个模型的某一个hidden layer的输出。在训练的时候,它的好处是就算Task 1、Task2非常的不像,也不会影响Task 2的performance,最糟的情况,就跟自己训练的performance是差不多的。Task 3会同时从Task 1和Task 2的hidden layer得到信息。
Class2: source->labelled, target->unlabelled
Domain-adversarial training
Task description
- 试用情景:Training data 和 Testing data 任务相似。
- source data是MNIST的image,是有label的;
- target data是MNIST-M的image,是没有label的。
通常情况下,我们把source data看作training data,target data看作testing data,有一个问题是training data和testing data是非常mismatch的。
Neural Network前面几层可以看做在抽feature,我们会发现不同 domain 的 feature完全不一样,蓝色点是MNIST, 红色点是MNIST-M(均为t-SNE降维后)。后面几层可以看做在做分类,虽然可以把蓝色点分得很好,但是对红色点却无能为力。
所以,希望feature extractor可以把domain的特性去除掉,把不同domain的feature都混在一起。
做法是在feature extractor后面接一个domain classifier,它的架构类似GAN。不过在GAN中Generator要产生一张Image来骗过Discriminator,这件事很难,但在Domain-adversarial training中要骗过domain classifier很简单,有一个solution是不管什么input, feature extractor的output都是0,就可以骗过domain classifier。所以只训练domain classifier是不够的,要给feature extractor增加任务的难度。
feature extractor不仅要骗过domain classifier,还要让label predictor做得好。不只把domain的特性消掉,对这个任务来讲还要保留digit的特性。
三个network其实是一个大型的neural network,是个“各怀鬼胎”的neural network,
- Label predict想要把class的分类正确率做的越高越好;
- Domain classifier想要正确的预测一个image属于哪个domain;
- Feature extractor要做的是同时提高Label predict的正确率,又同时最小化Domain classifier的正确率。
Feature extractor要如何“陷害”队友domain classifier呢?
只要加一个gradient reversal layer就行。Back propagation时feature extractor做与domain classifier的要求相反的事情,domain classifier要某个值上升,feature extractor就让那个值下降。由于domain classifier看不到input image,所以最后会输掉,无法分辨feature extractor抽出的feature来自哪个domain。但是domain classifier应该要奋力挣扎,否则不能把feature extractor逼到极限,不能把domain information去除掉。
paper中给出的实验结果。source only指的是,只用source data训练模型,然后测试target data。这种方法的效果是比较差的。 proposed approach指的是Domain-adversarial training, 效果有很好的提高。 train on target指的是,直接拿target domain 的 data 训练,是performance的up-bound.
Zero-shot Learning
- 试用情景:不同的task。
例如,
- source data中有猫狗的图片,没有羊驼的图片,而target data中是羊驼的图片。那训练出的模型能认出羊驼吗?
- 语音上常遇到Zero-shot Learning的问题,若把每个word都当做一个class,那么training的时候与testing的时候就可能会看到不同的词汇。
解决办法是:不去识别一段声音属于哪个word,而是识别一段声音属于哪个音素,然后根据人的知识建立一个音素和词汇关系的词典,这样就算有一些word是没有出现在training data里面的,只要在建好的词典里出现过,model就可以正确处理这个问题。
- 在图像上,做法是把图像的类用attributes表示,如图中的database,attributes要足够丰富让每个类有独一无二的attributes。在training时,不直接识别图像所属类别,而是识别图像具备什么attributes。
在testing的时候,就算来了一张没见过的类中的image,输出是attributes,查表就知道与output attributes最接近的类。
有时attributes很复杂,可以做attribute embedding.。把training data中每张image都变成embedding space上的一个点,把所有attributes也都变成embedding space上的一个点。图中的
g
g
g与
f
f
f都可以是神经网络,训练时希望
g
g
g与
f
f
f越接近越好,测试时,如果有一张没有看过的image,看image的attribute经embedding之后与哪个attributes最像,那个attributes对应的class就是image所属的class。(图中
f
(
y
3
)
f(y^3)
f(y3)应改为
f
(
x
3
)
f(x^3)
f(x3))
有时候,我们不知道每一个动物对应的attribute是什么。这时候可以借用word embedding,把attributes换成 word vector。
注意:上面的目标函数是有问题的,因为它只考虑了同一个pair在embedding之后尽可能接近,没有考虑不同pair在embedding之后尽可能拉开,所以可能会把所有的
x
n
x^n
xn,
y
n
y^n
yn都投到同一点。应改为图片中第二行的目标函数。
Zero-shot Learning的一个更简单方法,叫Convex Combination of Semantic Embedding, 不需要training。
把一张图input进neural network里,输出0.5几率lion,0.5几率tiger,然后用1:1的比例混合lion和tiger的word vector,再看哪一个word的word vector跟混合的结果最接近,就是liger。
Class3: source->unlabelled, target->labelled
Self-taught learning
如果现在source data够多,那么可以学习一个feature extractor,然后用这个feature extractor在target data上抽feature。