23.Transfer Learning

概念

      迁移学习是什么?

      假设手上有一些和现在要进行的学习任务不相关的数据,那么能不能用这些数据帮助完成学习任务。

       如下图,比如我们想做一个猫狗分类器,但是我们没有猫狗的图片数据,而只有以下数据:

              a、大象和老虎图片(都是动物图片,所以属于相似的域(domain),但是与猫狗分类相比是完全不同的学习任务)

              b、招财猫和高飞狗图片(都是卡通人物图片,所以属于不同的域,但是同属于猫狗分类任务)

       为什么要考虑迁移学习呢?

       因为我们只有很少的数据是符合任务处理要求的(Target Data),但是类似的数据(Source Data)却有很多。例如,我们的任务是辨识台语,我们只有很少台语数据,但是我们有很多其它语言的数据。做医学图像识别,但是医学图像的存量往往很少,那么海量的其它图片能不能帮忙呢。做文本分析,可能特定领域的文本数据少,那么能不能利用其它领域的文本来帮忙呢......

概览

       根据源数据(我们手上已有数据)和目标数据(目标学习任务所需数据)是否有label,我们将迁移学习分成四种不同的类别。

       1.Model Fine-tuning (labelled source, labelled target)

       任务描述

              目标数据量很少,源数据量很多。(One-shot learning:在目标域中只有几个或非常少的样例)

       例子:(有监督)讲话者调整

              Target data可能是某人说的三句话,而Source data可能有上万小时。 

       图中的Idea是非常直觉的,先用Source data训练出一个模型,把训练结果作为初始值,再用Target data来Fine-tune 模型。可能存在的问题是,由于target data可能会很少,所以就算用source data训练出的模型很好,再用target data做fine-tune的时候可能会过拟合。避免这个问题就需要技巧。

       技巧之一便是Conservative Training.

       Conservative Training的意思就是,为了避免target data 在 fine-tune 模型时造成过拟合,要增加约束,即增加正则化项,让同一笔data经fine-tune前后两个模型的output越接近越好,或两个模型的参数越接近越好。

       技巧之二便是Layer Transfer.

       Layer Transfer的意思是,把Source data 训练好的模型中的某些layer直接copy过来,用target data 训练剩下的layer。这样的好处是,target data 只需要训练较少的参数,避免了过拟合。

       那么,这里就产生一个问题:究竟哪些层应该被转移(拷贝)呢?答案是:针对不同的学习任务,往往是需要不一样的层。

       A、在语音识别上,一般拷贝最后几层。(直觉:不同的人由于口腔结构差异,同样的发音方式得到的声音可能不同。而模型的前几层做的事是讲话者的发音方式,后面的几层再根据发音方式就可以获得被辨识的文字,即是跟具体讲话者没有太大关系的,所以做迁移时,只保留后面几层即可,而前面几层就利用新的特定讲话者的目标数据来做训练)

       B、在图像识别上,一般拷贝前几层。(直觉:网络的前几层一般学到的是最简单的模式(比如直线,横线或最简单的几何模型),比较通用,而后几层学习到的模式已经很抽象了,很难迁移到其它的领域)

      《How transferable are features in deep neural networks》论文的相关实验结果:做图像识别,拷贝不同的层,并对迁移模型做不同的操作,观察效果。

      另外一个实验结果:将源数据与目标数据的域划分开,比如源数据都是自然界的东西,而目标数据都是人造的东西,那么这对迁移模型的效果会有怎样的影响。

        可以从上图看出,这对迁移模型的前几层的影响是不大的,说明迁移模型不管是识别自然界事物还是人造事物,其在前几层上面做的事情其实是很相似的。

       2.Multitask Learning (labelled source, labelled target)

       在Fine-tuning上,我们其实只关心迁移模型在目标数据域上的学习任务完成的好不好,而不关心在源数据域上表现如何。而Multitask Learning是会同时关注这两点的。

       如下图,我们针对两种任务A和B,我们用它们的数据一起训练NN模型的前几层,再分别训练模型的后面几层包括输出层,以针对各自任务输出针对性的结果,这样的好处是由于训练数据量的增加,模型的性能可能会更好。关键是要确定两个任务有没有共通性,即是不是能共用前面几层。

       另外,也可以在中间几层用共同数据来训练。

       Multitask Learning的一个成功例子是多语言的语音识别,可训练一个模型同时识别多国语言,如下图,多国语言语音识别模型的前几层共享一些公共特征。

        几乎所有语言都可以transfer(有人做过实验,多国语言两两transfer,每个case都有进步,哪怕语言之间不是很像)。前几个layer共用参数,后几个layer不同。翻译上也可以类似,如中翻英、中翻日可以同时训练。

       蓝线表示,没有transfer learning时汉语识别结果。橘黄线表示,用欧洲语言做Transfer learning,帮助训练汉语识别网络的前几层,在相同汉语训练数据下,错误率要低。所以在这里Multitask Learning的好处是,只需要更少的数据,就可以达到同样好的效果。

       如果两个task很不相关,却又做了transfer,效果可能是负面的。有人提出了Progressive Neural Network,使得两个task即使无关,做transfer效果会比较好。 训练好第一个模型后,第一个模型的参数就fix住。训练第n个模型时,每个隐层都借用前n-1个模型的隐层输出。

       3.Domain-adversarial training (labelled source, unlabelled target)

       任务描述

       源数据对应的学习任务和目标数据对应的学习任务是比较相似的,都是做数字识别,但是两者的输入数据差别很大(目标数据加入了背景),那如何让源数据上学出来的模型也能在目标数据上发挥良好呢?

       如果我们直接用MNIST的数据学一个model,去做MNIST-M的识别,效果是会非常差的。而我们知道,一个NN前几层做的事情相当于特征抽取(feature extraction),我们会发现不同domain 的特征完全不一样。后几层做的事相当于分类(Classification),所以我们将前面几层的输出结果拿出来看一下会是什么样子。如下图,MNIST的数据可以看做蓝色的点,MNIST-M的点可以看做红色的点,虽然可以把蓝色点分得很好,但是对红色点却无能为力。 因为它们分别对应的特征根本不一样,所以做迁移时当然效果很差。

        所以,希望feature extractor可以把领域domain的特性去除掉,把不同领域domain的feature都混在一起(Domain-adversarial training)。做法是在feature extractor(Generator)后面接一个domain classifier(Discriminator),它的架构类似GAN,不过在GAN中Generator要产生一张Image来骗过Discriminator,这件事很难;而在Domain-adversarial training中要骗过domain classifier很简单(不管什么input, feature extractor的output都是0,就轻易骗过domain classifier了)。所以只训练domain classifier是不够的,要给feature extractor增加任务难度。

       所以,我们还要求特征提取器的输出能够满足标签预测器(label predictor)的高精度判别需求。feature extractor不仅要骗过domain classifier,还要让label predictor做得好。不只把domain的特性消掉,对这个任务来讲还要保留digit的特性。三个部分组成一个大网络,各个部分目的不同。 

       那么如何让特征提取器的训练满足我们上述两个要求呢(最大化标签分类的准确度和最小化领域分类的准确度)?只要加一个gradient reversal layer就行。Back propagation时feature extractor做与domain classifier的要求相反的事情,domain classifier要某个值上升,feature extractor就让那个值下降。由于domain classifier看不到input image,所以最后会输掉,无法分辨feature extractor抽出的feature来自哪个domain(这样就可以把domain information去除掉~~~~)。但是domain classifier应该要奋力挣扎,如果特征提取器feature extractor随便生成的输出都能够骗过domain classifier,那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.

       4.Zero-shot Leaning (labelled source, unlabelled target)

        在Zero-shot Learning里面,相对有比Domain-adversarial training更严苛的定义,它要求迁移的两种任务差别也是很大的。

        例如,source data中有猫狗的图片,没有羊驼的图片,而target data中是羊驼的图片。那训练出的模型能认出羊驼吗?

        语音上常遇到Zero-shot Learning的问题,若把每个word都当做一个class,那么training的时候与testing的时候就可能会看到不同的词汇。解决办法是,不去识别一段声音属于哪个word,而是识别一段声音属于哪个音素(音标),然后根据人的知识建立一个音标和词汇关系的词典。

       在图像上,做法是把图像的类用attributes表示,如图中的database,attributes要足够丰富以使每个类有独一无二的attributes。在training时,不直接识别图像所属类别,而是识别图像具备什么attributes。 

       在testing的时候,就算来了一张没见过的类中的image,输出是attributes,查表就知道与output attributes最接近的类。 

       有时attributes维度很高,可以做attribute embedding. 把training data中每张image都变成embedding space上的一个点,把所有attributes也都变成embedding space上的一个点。图中的g f都可以是神经网络,训练时希望g f 越接近越好,测试时看image经embedding之后与哪个attributes经embedding之后最接近,那个attributes对应的class就是image所属的class。

       如果没有database、不知道每个class对应的attributes怎么办呢?可以借用word embedding, 把attributes换成 word vector.

       思想:让同一对的x与y尽量靠近,让不同对的x与y尽量远离。

       还有一种训练方法更简单:Convex Combination of Semantic Embedding

       假设训练出一个狮虎分类器,它对于一张图片给出了“50%是狮子,50%是老虎”的结果,那么我们就将狮子和老虎对应的word vector分别乘以0.5再加和,获得新的vector,看这个vector和哪个动物对应的vector最相近(比如狮虎兽liger最相近)。

      5.Self-taught learning 和 Self-taught Clustering

       Target Data: labelled, Source Data: unlabelled——Self-taught learning

       Target Data: unlabelled, Source Data: unlabelled——Self-taught Clustering

       self-taught learning可以看做一种半监督学习(semi-supervised learning),只是源数据和目标数据关系比较“疏远”。我们可以尝试利用源数据去提取出更好的representation(无监督方法),即学习一个好的Feature extractor,再用这个extractor去帮助有标签的目标数据的学习任务。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值