19.迁移学习

  National * University (NTU)李宏毅老师的《Machine Learning》的学习笔记,因此在全文对视频出现的内容多次引用。初出茅庐,学艺不精,有不足之处还望大家不吝赐教。

  欢迎大家在评论区多多留言互动~~~~

0. 相关链接

  迁移学习发展至今天有了很大的进展,对其中比较经典的综述进行了相关总结《A Survey on Transfer Learning》,里面主要是关于迁移学习相关概念和方法的总结;当时深度学习孩还不是很流行,所以里面关于深度学习的内容不多,之后迁移学习在深度学习和神经网络中的应用博主也进行了相关的归纳,见《Learning and Transferring Mid-Level Image Representations using Convolutional Neural Networks》,还有《How transferable are features in deep neural networks?》,尚未进行整理。

  关于迁移学的相关基础概念,如域(domain)、任务(task)已经在《A Survey on Transfer Learning》进行了相关总结,所以不会再进行计算。

1. 迁移学习的四种类型

  主要根据源域与目标域中的数据的标签情况进行分类,具体如图1

19.迁移学习

图1. 按源域与目标域的的数据是否具有标签对迁移学习进行分类

  其中需要注意的是,迁移学习的种类特别多,别称也很多,所以在进行分类或者概念介绍的时候会出现分歧,但实际上只是概念上的区别,不需要过多的关注,主要关注算法的核心思想和使用情况。

2. Fine-tuning(微调)

  它使用的情况如图1 ,是源数据域与目标数据域的数据都具有标签,并且源域的数据量很大,而目标域的数据量很小,当目标数据域的数量特别小的时候就将称为“One-shot learning”。其主要想法是使用源域数据训练模型,使用目标域数据进行Fine-tuning(微调)。Fine-tuning 的主要难度在于目标域中只有有限的数据的时候,要小心模型会发生过拟合。

  下面将介绍在 Fine-tuning 的过程中防止模型过拟合的几种方法

2.1 Conservative Training(保守训练)

  在对通过源域数据得到模型上进行 Fine-tuning 的过程中加入了关于参数 w 的惩罚项,使得迁移前后模型的参数很相近,防止模型过拟合。

2.2 Layer Transfer(层迁移)

  将通过源域数据得到模型中的某些层保持不变,只将剩余的一层用目标域数据进行训练,大大减少了过拟合的风险。当然,当你的目标域数据量很大的时候,可以将整个网络进行 Fine-tuning ,而不是仅仅将其中的某一层进行 Fine-tuning。

  对于语音信号来讲,常常使用最后几层进行迁移学习。这是因为 speech 的底层特征得到的这段语音的发音方式,但是对于同样一段话每个人的发音方式是不同的,由于口腔的构造是不同,所以常常采用后面几层进行迁移学习。

  对于图像信号来讲,常常使用前几层进行迁移学习。这是因为图像的底层特征在检查图像中是否具有某些直线或者曲线,是否具有某些特殊的图案,如图 2 所示。

19.迁移学习

图2. 图像往往迁移底层的特征层

  下面是NIPS, 2014论文《How transferable are features in deep neural networks?》中关于图像层迁移的一些实验。

19.迁移学习

图3. 保持不变的层数与模型表现的关系

其中横坐标代表网络在第 n 层被切开并进行重新训练,实际上就是从第一层开始有几个层保持不变。最开始是 0 层,也就是相当于整个网络没有迁移学习,而是通过正常的训练得到的。其中需要注意的是,在这里目标域中的数据与源域中的数据量是相当的,所以当然可以直接进行训练而不会发生严重的过拟合。纵坐标是 top-1 正确率(越高越好)。

  4号线表示的是只训练剩余部分的网络。其中我们可以看到,保持不变的层数越大,网络的表现就下降的越多,这主要是因为越往后的层越是针对某一种特殊的特征表示,并且后面这些层在进行 fine tune 的过程中实际上是要与前面的层进行沟通,没有办法沟通当然效果的就会变差,这也证明了网络的前几层往往提取的是一些通用特征,可迁移性更高。

  5 号线表示的是同样是选取前面几个层,让前面几个层保持在源域得到的参数,而后面的层参数初始值不是源域训练得到的, 最后对整个网络进行fine-tune the whole network,可以看出这种效果是最好的。

  下面是这篇文章的另一个图。

19.迁移学习

图4. 源域与目标域数据相关性对于 fine tune 的影响

其中的横坐标与图4 中的横坐标相同,纵坐标为相对 top-1 正确率,其中的红色的线与图3 中 4 号线是同一条线。黄色的线表示,当源域与目标域的数据相关度不是很高的时候(比如说源域中都是自然风景的图片,而目标域中都是人造物品的图片),那么他在保持前两个层不变的时候还没有较大的差别,但是越往后效果退化的越严重。我们可以看出源域与目标域的数据相关程度越高,可以用来迁移的层数就越高;即使源域与目标域的数据相关度比较低,但是前一层同样是可以直接copy的,因为前面提取的特征比较底层。

3. Multitask Learning(多任务学习)

  Multitask Learning 与 Fine-tuning 类似,但是 Fine-tuning 只关心目标域中模型的表现情况,而不关心源域中模型的表现情况;但是 Multitask Learning 同时关心源域与目标域中模型的表现情况。

  多层结构使得神经网络特别适合于多任务学习。常见的两种多任务学习模型如图5 所示

19.迁移学习

图5. 常见的两种多任务学习模型

图5 中的左图表示两个任务之间虽然是不同的,但是在底层使用相同的特征,所以可以公用下面的这些层,另一方面两个任务的数据集会使得公用层的特征提取的更好。另一种是如图 5 所示的模型,虽然两个任务之间在底层特征之间不存在相同的特征,但是可将将它们变换到同一个域中在学习相同的特征,然后再进行两个任务分别的学习。所以在多任务学习中关键点在于两个任务之间是否具有共同性,共同性存在与哪些层之中。

  多任务学习最好的例子就是多语言的语音识别

19.迁移学习

图6. 多语言的语音识别

对比实验结果如下图所示

19.迁移学习

图7. 对比实验结果

如图7 所示,蓝色的线是使用普通话(Mandarin)进行训练的结果,而橘黄色的线是加入了欧洲语言进行多任务学习之后实验结果,从实验结果我们可以看到,当使用数据的时长(可以理解为数据量)相同时,多任务学习的准确率更高,当识别的准确率相当的时候,多任务学习需要的数据量更小。

  多任务学习的优势主要在于三点,首先相当于互帮互助,加大了用于训练模型的数据量,从而在很大程度上抑制了过拟合;另一方面,通过多任务学习可以提高模型的正确率;最后可以降低模型对于数据量的要求(如图只需要原来数据的一半就可以获得相当的效果)。

4. Progressive Neural Networks(渐进式神经网络)

  Progressive Neural Networks(渐进式神经网络)的结构如图8 所示,这种方式主要是不想考虑任务之间的相似性

19.迁移学习

图8. 渐进式神经网络的结构

如图首先训练task1,训练好了固定不变;然后训练task1,同时使用task1的知识,这样不会改变task1又可以帮助task2。但是这个模型怪怪的,只要加一个任务,就要重新训练一次,并且感觉task1可能使训练最不好的吧,因为用于训练的数据相当于是最少的。

5. Domain-adversarial training(域的对抗训练)

  这种方法处理的任务主要是源域数据有标签,而目标域数据中没有标签的情况,如下图所示

19.迁移学习

图9. 域的对抗训练所处理的问题类型中的某一个例子

  在上述的任务中,MNIST-M 是在 MNIST 中填充背景,并且修改数字颜色得到的数据集。如果直接将在 MNIST 上学习到的 Model transfer 到 MNIST-M 上,那么取中间特征层观察效果如下

19.迁移学习

图10. 中间特征层经过 t-sne 降维后的分布图

图10 中,神经网络绿色部分是对输入图片进行特征提取的过程,而蓝紫色的部分是分类器。取其中特征的输出进行 t-sne 降维后可以看到,神经网络可以比较好的提取出 MNIST 的特征,如图10 中将它们分为几个区别加大的块,但是这个特征却没有办法区分 MNIST -M 的数字。也就是说源域数据的特征与目标域数据的特征具有较大的区别,而如果要能够教较好的训练这个模型,应该是使得源域及目标域数据经过网络提取出的特征分布相似,如图 11 所示

19.迁移学习

图11. 网络变形

从图11 可以看出,为了达到这个目的,在神经网络上又接了一个域分类器,用来对数据来自于那来源进行分类,接下的训练过程如图 12 所示

19.迁移学习

图12. 域的对抗训练过程

整个训练过程要达到这样的目的,要成功的欺骗 Domain classifier,使得不同域图像所提取出的特征分布大致相同;并且还要是上面对于数字的正确分类能够正确进行。所以训练过程如图 12 所示,与多任务学习很像,但是不仅仅需要训练一个正确的数字分类器,还需要欺骗域分类器,所以在下面的分类器在反向传播的过程中返回的就是梯度的相反数。这个网络与GAN很像,所以训练起来也比较难训练,因为域分类器已知在挣扎。如果域分类器太弱,那么数字分类器一开始就放弃了,就根本没有办法逼的 feature extractor 达到最好的效果再死去,完美的取出 domain 的特征信息。

5. Zero-shot learning(零拍学习)

  第四小节所讲域的对抗训练,实际上目标域中的数据在源域中多少以某一种方式出现过(比如说都是手写数字),通过欺骗域分类器的方式使得两者映射到同一个特征空间且分布相似,同时进行了分类。但是 Zero-shot learning所解决的问题就是目标域中的数据在源域中从来没有出现过,比如说源域的样本是猫猫狗狗,但是目标域的是羊驼的分类问题,这个时候就需要 Zero-shot learning 。

  这个时候往往通过下面的方法进行学习,用自己的属性代表所属于的类,如图13所示

19.迁移学习

图13. 零拍学习训练过程

如图13 所示,右面的表格是每一个类别对应的属性,而左边的神经网络也是根据表格的属性对图像进行分类,所以这就要求属性要足够丰富,就是说不可以存在一种属性覆盖两个例子的情况。测试的时候就输出例子的属性,然后对照查表即可。

  当所涉及的属性特别多的时候,可以使用 Attribute embedding 的方法,这种方法的核心是是将图片与数据都变换为向量,这样就可以根据计算距离(如cos)来判断两者是否来自于同一个类,具体的过程图14 所示

19.迁移学习

图14. 使用 Attribute embedding 的方法进行 0 拍学习

这种方法实际上就是找到一个神经网络 f 使得 x1 变为 f(x1),在找到一个神经网络 g 使得 y1 变为 g(y1),这两个向量现在都是 embedding 空间中的一个点,也就说都投影到了同一个空间内,这个时候训练的目标就是使得来自于同一个类别的例子,它们在 embedding 空间中最相似。所以训练的目标就是使得 f(xn)g(yn) 最相似。

  如果说现在没有一个关于属性的表格的话,实际上可以通过对应的词来替代,比如说狗的图片就用单词(dog)来作为这类图片的属性,然后再坐上面所说的训练。

  那如何来训练这样的一个网络,就是如何来得到 f 和 g 呢? 如图 15 所示

19.迁移学习

如果使用第一个作为目标函数的话,那么是会出现问题的,因为这样的目标函数会将不同的类别都映射到空间的同一个点就满足了要求,并没有考虑不同类别之间的距离应该是最大的。而第二个目标函数考虑到了这种情况,其中的 Zero loss 表示的是相同类别的 fg 的乘积要比不同类别之间的乘至少以大 k 。

  “0 拍学习”还有一种方法是 Convex Combination of Semantic Embedding,这种方法如图16 所示,

19.迁移学习

图16. Convex Combination of Semantic Embedding的示意图

在网上随便 down 一个image 的 NN 和一个 word vector 的 NN ,然后图像网络可能输出了这张图像是虎的概率为 0.5,是狮子的概率是 0.5 ,然后直接将概率与对应的 word vector 相乘的到word vector1,再在 全体的word vector中找到与word vector1最相近的单词,就是最后得到的结果。

  通过实验可以发现,实际上 Convex Combination of Semantic Embedding 要好于将word vector 投影到同一个 embedding space的方法

  一个实例就是多语言的翻译。

19.迁移学习

它做到一些语言的翻译,比如说英语到日语、英语到韩语、日语到韩语等等,但是没有做过韩语到日语的翻译。但是通过之前训练好的网络也可以进行翻译,因为上面的网络实际上是将某一种具体的语言投影到与语言本身无关的空间中,相当于先编码到这个空间,再解码成要翻译的语言。

6. Self-taught learning

  这个看起来和半监督的方法比较像,但是半监督中认为有标签和没有标签的数据之间是比较像的,但是在 Self-taught learning 认为数据是相距比较远的,这个时候常常用没有标记的源域数据做自编码,然后利用编码层提取目标域图像的特征,再进行分类。或者也可以用稀疏编码的方式,总之就是利用编码和解码的方式。