迁移学习
什么是迁移学习
迁移学习是机器学习领域用于标记数据难获取这一基础问题的重要手段,
将训练好的内容应用到新的任务上被称为迁移学习。
由于这个过程发生在两个领域间,已有的知识和数据也就是被迁移的对象被称为源域,被赋予经验的领域被称为目标域。
迁移学习不是具体的模型,而是解题思路。
核心思想
找到不同任务之间的相关性。不要找相关性不高的数据集(负迁移)。
使用迁移学习的原因
- 目标领域的数据太少,需要标注数据更多的源域的帮助。
- 节约训练时间。
- 为了实现个性化的应用。
常见应用场景
- 语料匮乏的小语种之间的翻译
- 缺乏标注的医疗影像数据识别
- 面向不同领域快速部署对话系统
在大规模数据集上训练好的模型就称作是预训练模型,这种模型通常都具有很好的泛化能力,可以在它的基础上完成各种各样的任务。使用预训练模型的好处就是它可以帮我们去减少训练时间以及计算资源。
学习策略
- 人家训练好的权重参数当做初始化
- 人家训练好的直接拿过来当做我的权重参数,不进行训练
学习策略选择
数据量比较少的时候,一万多不到。数据量越少,越需要借助人家训练好的模型。当数据量越少的时候,需要冻住的层数是越多的。
数据量稍微中一点,不多也不少,可以只冻住前面这一部分,后面的自己训练。
数据量比较大的时候,需要冻住的更少。
总之,具体冻住模型的多少层,没有固定的答案,基本上是根据自己的数据量来的。你觉得数据量比较少,怕出现过拟合,怕出现问题,最好还是用人家训练好的结果。数据量比较多,我的任务跟人家的任务差异其实还很大,那尽可能只做初始化而不冻住这些层。
迁移学习特点
学习的非常快。
比如说A和B同学考试,把A做完的卷子给B,B只需要检查一遍卷子就可以交卷了。
迁移学习的时候,拿过来的网络模型权重参数通常情况下都是大家公认的,训练的比较好的参数,不是随便整出来的,都是经过大量的测试得到的结果。
迁移学习方法分类
迁移学习研究领域与方法分类
同构:特征维度一样
异构:特征维度不一样,比如图片到文本
贯穿同构和异构的方法有监督迁移学习、半监督迁移学习、无监督迁移学习。
领域自适应属于同构迁移学习。
领域自适应
什么是领域自适应
英文名:Domain Adaptation(DA)
相关的概念:cross-domain learning(同构迁移学习)
问题定义:有标签的源于和无标签的目标域共享相同的特征和类别,但是特征分布不同,如何利用源域标定目标域。
领域自适应实际上是源域目标域特征分布不一样,但是特征维度是一样的。
领域自适应问题分类
按照目标域有无标签
- 目标域全部有标签:supervised DA 全监督领域自适应
- 目标域有一些标签:semi-supervised DA 半监督领域自适应
- 目标域全没有标签:unsupervised DA
Unsupervised DA最有挑战性,是我们的关注点。
在域适应中,通常将有监督的训练域称为源域,半监督或无监督的训练域称为目标域。根据目标域标签数据,域适应分为半监督域适应,无监督域适应和其他域适应。基于域知识迁移层面,可将域适应分为3类:基于实例加权的域适应方法、基于特征的域适应方法以及基于模型的域适应方法。具体而言,基于实例加权的域适应是通过调整源域样本和类间权重以减小源域与目标域之间分布差异的;基于特征的域适应则利用新的特征表示空间的方式来拉近域之间的特征分布距离;基于模型的域适应,对源域模型只是迁移利用,以实现领域之间的对齐。
换一种解释:通过在不同阶段进行领域自适应,研究者提出了三种不同的领域自适应方法:1)样本自适应,对源域样本进行加权重采样,从而逼近目标域的分布。2)特征层面自适应,将源域和目标域投影到公共特征子空间。3)模型层面自适应,对源域误差函数进行修改,考虑目标域的误差。
李宏毅讲解领域自适应
Domain shift:一旦训练资料和测试资料之间有一些差异, 它们中间的分布是不一样的,在训练资料上训练出来的模型在测试资料上可能就会坏掉。
领域自适应可以看做是迁移学习的一种,迁移学习就是你在A任务上学到的技能可以被用在B任务上。对于Domain adaptation来说,你的训练资料是一个Domain,你的测试资料是另外一个Damain。你在训练资料Domain上学到的资讯,要把它用到另外一个测试资料Domain上。
最基础的想法
找到一个feature extractor,实际上是一个network,吃入一张图片,吐出一个feature。
虽然source domain和target domain表面上看起来不一样,但是feature extractor会把他们不一样的部分拿掉,只抽取出它们共同的部分。虽然从图片看起来这两组图片一个有颜色,一个没有颜色,本来就不一样,但是期待地说这个feature extractor可以学到无视颜色这个事情,把颜色的资讯过滤掉。所以今天不管来自source domain的图片还是来自target domain的图片,只要通过这个feature extractor以后得到的feature看起来是没有差异的。
这样就可以用source domain的这些feature训练一个模型,直接用在target domain上。接下来是怎么找出一个feature extractor。其实可以把一般的Classifier就分成feature extractor和label predictor两个部分,我们知道一个image的Classifier就是输入一张Image 得到Output就是分类的结果。假设Image Classifier有10层,那么前5层是Feature Extractor,后5层是Label Predictore。如果你上CNN的话,它的输出其实是Feature Map,但Feature Map拉直后就可以看做是一个Factor。再丢到Label Predictore的后面5层会产生class。