主要参考了知乎和CSDN上的一些总结,毕竟自己看论文有点慢,仅作为自己学习的记录,他人学习的话还是看知乎或者别人的博客吧。文后放上自己引用的链接,侵删。
概念
简而言之就是将已经训练好的模型参数迁移到新的模型来帮助新模型训练。例如domain adaptation就是其中一种,其在发现源域和目标域之间在某些特征上存在shift,因此导致验证时性能出现下降,所以可以利用各种特征转换的方式,学习一个域间不变的特征表达,从而对两个域之间都做到较好的处理。
当然迁移学习有用的前提是,如果进行迁移时,源域和目标域之间没有相似性,那么可能会导致负迁移,所以默认要迁移的两个域是相似的。当然这种相似是由人定义的。在数据缺乏的情况下,迁移学习可以有效利用相关领域标定的数据完成数据标定。
分类
按特征空间划分:
1.同构迁移学习:源域和目标域特征空间相同。
2.异构迁移学习:源域和目标域特征空间不同。
按迁移情景分:
1.归纳式迁移学习:源域和目标域的学习任务不同。
2.直推式迁移学习:源域和目标域不同,学习任务相同。
3.无监督迁移学习:源域和目标域均没有标签。
基本方法
1.样本迁移
在源域中找到和目标域相似的数据,把这个数据的权重进行调整,使得新的数据和目标域的数据进行匹配。比如说在源域中有一个样本和目标域中的一个样本非常的相似,那么我们就可以加大此样本对应的权重。优点是方法简单,实现容易。缺点在于权重的选择与相似度的度量依赖经验,且源域与目标域的数据分布往往不同。
2.特征迁移
假设源域和目标域有一些相同的交叉特征,通过特征变换,将源域和目标域的特征变换到相同空间,使得该空间中源域和数据和目标域数据具有相同分布的数据分布。优点是对大多数方法适用,效果较好。缺点在于难于求解,容易发生过适配。
3.模型迁移
假设源域和目标域共享模型参数,将之前在源域中通过大量数据预训练好的模型应用在目标域上进行预测,比如说,将pre-trained的模型拿过来,通过固定一些layer的parameters,修改部分layer的parameters得到最终的非常好的结果。优点是可以充分利用模型之间存在的相似性。缺点在于模型参数不易收敛。
4.关系迁移
假设两个域是相似的,那么它们之间会共享某种相似关系,将源域中逻辑网络关系应用到目标域上来进行迁移。
一些基本概念
1.Model Fine-tuning(源域和目标域都有label)
此时存在的情况是目标数据量很少,源数据量很多。(One-shot learning:在目标域中只有几个或非常少的样例)
想法:用源数据训练一个模型,然后用目标数据微调模型。
难点:只有很有限的目标数据,所以要注意过拟合问题。
可以使用的方法:
方法1(Conservative Training)
通过源域去训练一个模型,然后在源域上进行微调,微调时加入正则限制保证新的model和旧的model在input相同的情况下,得到的output尽可能的相近。因为不这么做的话,在训练新的目标域数据时,会把模型对源域的表现能力遗忘,这会产生灾难性遗忘问题。
方法2 (Layer Transfer)
通过源域去训练一个模型,然后将该model中某些层的parameters直接复制进去新的model中,然后用目标域数据去训练没有保留(拷贝出来)的层。如果target data的数据量比较充足,那么我们就可以在对整个网络进行fine-tuning一下,可以进一步提升模型的性能。对于做图像辨识的任务来说:我们通常去transfer最前面的几层parameters。(直觉:网络的前几层一般学到的是最简单的模式(比如直线,横线或最简单的几何模型),比较通用,而后几层学习到的模式已经很抽象了,很难迁移到其它的领域)
此外还发现,数据足够的情况下,如果transfer的网络的层数增多(即前面固定的层数),model的表现性能越差。而transfer后再做finetune效果反而会更好。
2.Multitask Learning(源域和目标域都有label)
在Fine-tuning上,我们其实只关心迁移模型在目标数据域上的学习任务完成的好不好,而不关心在源数据域上表现如何。而Multitask Learning是会同时关注这两点的。
一般有两种方式,第一种是直接将Task A的训练数据和Task B的训练数据混合在一起,作为整个multi-layer的训练数据,然后通过底层的layer来提取出两个task之间最共性和基础的信息,然后在高层再分别偏向于自己特有的信息,完成了multitask learning的过程。
第二种是直接将Task A中所学到的feature 和 Task B中所学到的feature 映射到同一个domain中,然后以这个domain为分支节点,再来做multitask learning。
当然当Task A和Task B的相似度非常小的时候,这个时候,如果我们还是坚持在Task A到Task B的过程中使用Transfer Learning,那么就会得到负迁移,此时效果不会好。此时可以使用Progressive Neural Networks,可以在几个不同的task之间进行迁移学习。
3.Domain-adversarial training(源域有标签,目标域没有标签)
目前要做的就是通过源域去train一个model,然后对于目标域,也能有一个很好的分类。但是源域和目标域并不是很匹配,也就说,两者之间是mismatch的。于是思考:能不能让NN的前几层将不同域的各自特性消除掉,即把不同的域特性消除掉。即如果能够将mismatch的两类data,毫无区别的混合在一起,让model前面的网络来进行feature extraction,然后在分类层对于不同的task执行不同的classification,transfer learning就能做好了。
实现方式是训练一个域分类器,让它无法准确地对特征提取器的结果进行分类。(“骗过”分类器,类似GAN的思想)。但是,在GAN里面,生成器是要生成一张图片来骗过判别器,这个是很困难的,而这里如果只是要骗过域分类器就太简单了,直接让域分类器对任意输入都输出0就行了。这样学出来的特征提取器很可能是完全无效的。所以,我们应该给特征提取器增加学习难度。所以,我们还要求特征提取器的输出能够满足标签预测器(label predictor)的高精度判别需求。
针对标签预测器的反向传播的误差,我们按照误差的方向进行正常的参数调整,而针对域分类器反向传回的误差,我们则按照误差的反方向进行误差调整(即域分类器要求调高某个参数值以提高准确度,而我们就故意调低对应参数值,以“欺负”它)。所以在域分类器的误差上加个负号就可以。
4.Zero-shot Learning (源域有标签,目标域没有标签)
在学习NN模型时,不再要求NN的输出直接是样例的分类,而要求是对应的分类目标包含哪些属性。那么,我们再在目标数据/测试数据上做分类时,也只要先用模型获提取出样例的属性,再查表即可。而如果数据特征变得复杂(比如是图片作为输入),那么我们就可以做embedding,即尝试训练一个NN,将样例特征映射到一个低维的embedding空间,然后让映射后的结果和样例对应的属性尽可能地相近。
但是,如果我们没有数据库(没有属性数据),借用Word Vector的概念:word vector的每一个dimension代表了当前这个word的某一个属性,所以其实我们也不需要知道具体每个动物对应的属性是什么,只要知道每个动物对应的word vector就可以了。即将属性换成word vector,再做embedding。
有一种训练方法更简单:Convex Combination of Semantic Embedding
假设训练出一个狮虎分类器,它对于一张图片给出了“50%是狮子,50%是老虎”的结果,那么我们就将狮子和老虎对应的word vector分别乘以0.5再加和,获得新的vector,看这个vector和哪个动物对应的vector最相近(比如狮虎兽liger最相近)。
而做这个只要求我们有一组word vector和一个语义辨识系统即可。
Self-Taught Learning(源域没有标签,目标域没有标签)
self-taught learning可以看做一种半监督学习(semi-supervised learning),只是源数据和目标数据关系比较“疏远”。我们可以尝试利用源数据去提取出更好的representation(无监督方法),即学习一个好的Feature extractor,再用这个extractor去帮助有标签的目标数据的学习任务。有点类同于通过 ImageNet 或其他大型数据集学习到的网络特征运用于一个图片分类或其他基于图片特征的任务。
引用: