迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。
迁移学习的四种类型
Fine-tuning(微调)
Fine-tuning 是源数据域与目标数据域的数据都具有标签,并且源域的数据量很大,而目标域的数据量很小,当目标数据域的数量特别小的时候就将称为“One-shot learning”。其主要想法是使用源域数据训练模型,使用目标域数据进行Fine-tuning(微调)。Fine-tuning 的主要难度在于目标域中只有有限的数据的时候,要小心模型会发生过拟合。防止模型过拟合的几种方法
1、Conservative Training(保守训练)
在对通过源域数据得到模型上进行 Fine-tuning 的过程中加入了关于参数
2、Layer Transfer(层迁移)
将通过源域数据得到模型中的某些层保持不变,只将剩余的一层用目标域数据进行训练,大大减少了过拟合的风险。当然,当你的目标域数据量很大的时候,可以将整个网络进行 Fine-tuning ,而不是仅仅将其中的某一层进行 Fine-tuning。
对于语音信号来讲,常常使用最后几层进行迁移学习。这是因为 speech 的底层特征得到的这段语音的发音方式,但是对于同样一段话每个人的发音方式是不同的,由于口腔的构造是不同,所以常常采用后面几层进行迁移学习。
对于图像信号来讲,常常使用前几层进行迁移学习。这是因为图像的底层特征在检查图像中是否具有某些直线或者曲线,是否具有某些特殊的图案
下面是一篇论文中关于图像层迁移的一些实验,体现了保持不变的层数与模型表现的关系
其中横坐标代表网络在第 n 层被切开并进行重新训练,实际上就是从第一层开始有几个层保持不变。最开始是 0 层,也就是相当于整个网络没有迁移学习,而是通过正常的训练得到的。其中需要注意的是,在这里目标域中的数据与源域中的数据量是相当的,所以当然可以直接进行训练而不会发生严重的过拟合。纵坐标是 top-1 正确率(越高越好)。
4号线表示的是只训练剩余部分的网络。其中我们可以看到,保持不变的层数越大,网络的表现就下降的越多,这主要是因为越往后的层越是针对某一种特殊的特征表示,并且后面这些层在进行 fine tune 的过程中实际上是要与前面的层进行沟通,没有办法沟通当然效果的就会变差,这也证明了网络的前几层往往提取的是一些通用特征,可迁移性更高。
5 号线表示的是同样是选取前面几个层,让前面几个层保持在源域得到的参数,而后面的层参数初始值不是源域训练得到的, 最后对整个网络进行fine-tune the whole network,可以看出这种效果是最好的。
Multitask Learning(多任务学习)
Multitask Learning 与 Fine-tuning 类似,但是 Fine-tuning 只关心目标域中模型的表现情况,而不关心源域中模型的表现情况;但是 Multitask Learning 同时关心源域与目标域中模型的表现情况。
多层结构使得神经网络特别适合于多任务学习。常见的两种多任务学习模型如下图:
左上图表示两个任务之间虽然是不同的,但是在底层使用相同的特征,所以可以公用下面的这些层,另一方面两个任务的数据集会使得公用层的特征提取的更好。另一种是右上图所示的模型,虽然两个任务之间在底层特征之间不存在相同的特征,但是可将将它们变换到同一个域中在学习相同的特征,然后再进行两个任务分别的学习。所以在多任务学习中关键点在于两个任务之间是否具有共同性,共同性存在与哪些层之中。多任务学习最好的例子就是多语言的语音识别:
对比实验结果如下图所示
蓝色的线是使用普通话(Mandarin)进行训练的结果,而橘黄色的线是加入了欧洲语言进行多任务学习之后实验结果,从实验结果我们可以看到,当使用数据的时长(可以理解为数据量)相同时,多任务学习的准确率更高,当识别的准确率相当的时候,多任务学习需要的数据量更小。
多任务学习的优势主要在于三点,首先相当于互帮互助,加大了用于训练模型的数据量,从而在很大程度上抑制了过拟合;另一方面,通过多任务学习可以提高模型的正确率;最后可以降低模型对于数据量的要求(如图只需要原来数据的一半就可以获得相当的效果)。
Progressive Neural Networks(渐进式神经网络)
先对task 1进行学习,然后再对task 2进行学习,两者的网络不相交。task 2会task 1网络中的参数加入到task 1中,但是并不会对task 1中的参数进行调整。这种方式主要是不想考虑任务之间的相似性。
Domain-adversarial training(域的对抗训练)
这种方法处理的任务主要是源域数据有标签,而目标域数据中没有标签的情况
在上述的任务中,MNIST-M 是在 MNIST 中填充背景,并且修改数字颜色得到的数据集。如果直接将在 MNIST 上学习到的 Model transfer 到 MNIST-M 上,那么取中间特征层观察效果如下
上图中,神经网络绿色部分是对输入图片进行特征提取的过程,而蓝紫色的部分是分类器。取其中特征的输出进行 t-sne 降维后可以看到,神经网络可以比较好的提取出 MNIST 的特征, 图中将它们分为几个区别加大的块,但是这个特征却没有办法区分 MNIST -M 的数字。也就是说源域数据的特征与目标域数据的特征具有较大的区别,而如果要能够教较好的训练这个模型,应该是使得源域及目标域数据经过网络提取出的特征分布相似,如下图所示:
从上图可以看出,为了达到这个目的,在神经网络上又接了一个域分类器,用来对数据来自于那来源进行分类,接下的训练过程如下图(域的对抗训练过程)所示:
整个训练过程要达到这样的目的,要成功的欺骗域分类器,使得不同域图像所提取出的特征分布大致相同;并且还要是上面对于数字的正确分类能够正确进行。所以训练过程如上所示,与多任务学习很像,但是不仅仅需要训练一个正确的数字分类器,还需要欺骗域分类器,所以在下面的分类器在反向传播的过程中返回的就是梯度的相反数。这个网络与GAN很像,所以训练起来也比较难训练,因为域分类器已知在挣扎。如果域分类器太弱,那么数字分类器一开始就放弃了,就根本没有办法逼的 feature extractor 达到最好的效果再死去,完美的取出域的特征信息。
Zero-shot learning(零拍学习)
Zero-shot learning所解决的问题就是目标域中的数据在源域中从来没有出现过,比如说源域的样本是猫猫狗狗,但是目标域的是羊驼的分类问题,这个时候就需要 Zero-shot learning 。
这个时候往往通过下面的方法进行学习,用自己的属性代表所属于的类
上图中,右面的表格是每一个类别对应的属性,而左边的神经网络也是根据表格的属性对图像进行分类,所以这就要求属性要足够丰富,就是说不可以存在一种属性覆盖两个例子的情况。测试的时候就输出例子的属性,然后对照查表即可。当所涉及的属性特别多的时候,可以使用 Attribute embedding 的方法,这种方法的核心是是将图片与数据都变换为向量,这样就可以根据计算距离(如cos)来判断两者是否来自于同一个类,具体的过程如下图:
这种方法实际上就是找到一个神经网络 使得 变为 ,在找到一个神经网络 使得 变为 ,这两个向量现在都是 embedding 空间中的一个点,也就说都投影到了同一个空间内,这个时候训练的目标就是使得来自于同一个类别的例子,它们在 embedding 空间中最相似。所以训练的目标就是使得 和
如果说现在没有一个关于属性的表格的话,实际上可以通过对应的词来替代,比如说狗的图片就用单词(dog)来作为这类图片的属性,然后再进行上面所说的训练。
网络的训练方法如下图所示:
如果使用第一个作为目标函数的话,那么是会出现问题的,因为这样的目标函数会将不同的类别都映射到空间的同一个点就满足了要求,并没有考虑不同类别之间的距离应该是最大的。而第二个目标函数考虑到了这种情况,其中的 Zero loss 表示的是相同类别的 fg 的乘积要比不同类别之间的乘至少以大 k 。“0 拍学习”还有一种方法是 Convex Combination of Semantic Embedding,这种方法如下所示:
图像网络可能输出了这张图像是虎的概率为 0.5,是狮子的概率是 0.5 ,然后直接将概率与对应的 word vector 相乘的到word vector1,再在 全体的word vector中找到与word vector1最相近的单词,就是最后得到的结果。
Self-taught learning
这个看起来和半监督的方法比较像,但是半监督中认为有标签和没有标签的数据之间是比较像的,但是在 Self-taught learning 认为数据是相距比较远的,这个时候常常用没有标记的源域数据做自编码,然后利用编码层提取目标域图像的特征,再进行分类。或者也可以用稀疏编码的方式,总之就是利用编码和解码的方式。