0%

DL笔记(16)Transfer Learning

1. Introduction

Transfer learning(迁移学习),是属于机器学习的一种研究领域,它专注于存储已有问题的解决模型,并将其利用在其他不同但相关问题上,正如人类可以将一个领域学习到的知识和经验,应用到其他相似的领域中去一样,机器同样也能做到。

传统的机器学习/数据挖掘只有在训练集数据和测试集数据都来自同一个feature space(特征空间)和统一分布的时候才运行的比较好,这意味着每一次换了数据都要重新训练模型,太麻烦了。比如:

(1)从数据类型/内容上看,对于新的数据集,获取新的训练数据很贵也很难。

(2)从时间维度上看,有些数据集很容易过期,即不同时期的数据分布也会不同。

Transfer learning的概念参考了这篇博客迁移学习

not directly related

以猫狗识别为例,解释“不直接相关”的含义:

  • input domain(域)是类似的,但task是无关的,比如输入都是动物的图像,但这些data是属于另一组有关大象和老虎识别的task;

  • input domain是不同的,但task是一样的,比如task同样是做猫狗识别,但输入的是卡通类型的图像。

domain:包括两部分:1.feature space(特征空间);2.probability(概率)。所以当我们说domain不同的时候,就得分两种情况。可能是feature space不同,也可能是feature space一样但probability不同。这里指的是前者,即feature space不同。

overview

迁移学习是很多方法的集合,这里介绍一些概念:

  • Target Data:和task直接相关的data;
  • Source Data:和task没有直接关系的data。

source是用于训练模型的域/任务,target是要用前者的模型对自己的数据进行预测/分类/聚类等机器学习任务的域/任务。

按照labeled data和unlabeled data又可以划分为四种:

2. labelled source data & labeled target data

这里target data和source data都是带有标签的:

  • target data:$(x^t,y^t)$,作为有效数据,通常量是很少的。如果target data量非常少,则被称为one-shot learning;

  • source data:$(x^s, y^s)$,作为不直接相关数据,通常量是很多的。

2.1. Model Fine-tuning

Model Fine-tuning(模型微调)的基本思想:用source data去训练一个model,再用target data对model进行fine-tune(微调)。“微调”类似于pre-training,就是把用source data训练出的model参数当做是参数的初始值,再用target data继续训练下去即可,但当直接相关的数据量非常少时,这种方法很容易会出问题。所以训练的时候要小心,有许多技巧值得注意。

Conservation Training

如果现在有大量的source data,比如在语音识别中有大量不同人的声音数据,可以拿它去训练一个语音识别的神经网络,而现在你拥有的target data,即特定某个人的语音数据,可能只有十几条左右,如果直接拿这些数据去再训练,肯定得不到好的结果

此时我们就需要在训练的时候加一些限制,让用target data训练前后的model不要相差太多:

  • 可以让新旧两个model在看到同一笔data的时候,output越接近越好;
  • 或者让新旧两个model的L2 norm越小越好,参数尽可能接近;
  • 总之让两个model不要相差太多,防止由于target data的训练导致过拟合。

这里的限制就类似于做regularization。

Layer Transfer

现在我们已经有一个用source data训练好的model,此时把该model的某几个layer拿出来复制到同样大小的新model里,接下来用target data去训练余下的没有被复制到的layer。这样做的好处是target data只需要考虑model中非常少的参数,这样就可以避免过拟合。

这个对部分layer进行迁移的过程,就体现了迁移学习的思想,那么哪些layer需要被复制迁移,哪些不需要呢?

值得注意的是,在不同的task上,需要被复制迁移的layer往往是不一样的

  • 在语音识别中,往往迁移的是最后几层layer,再重新训练与输入端相邻的那几层。

    由于人口腔结构不同,同样的发音方式得到的发音是不一样的,NN的前几层会从声音信号里提取出发音方式,再用后几层判断对应的词汇,从这个角度看,NN的后几层是跟特定的人没有关系的,因此可做迁移。

  • 在图像处理中,往往迁移的是前面几层layer,再重新训练后面的layer。

    CNN在前几层通常是做最简单的识别,比如识别是否有直线斜线、是否有简单的几何图形等,这些layer的功能是可以被迁移到其它task上通用的。

  • 主要还是具体问题具体分析。

2.2. Multitask Learning

Fine-tune仅考虑在target data上的表现,而Multitask Learning(多任务学习),则是同时考虑model在source data和target data上的表现。

如果两个task的输入特征类似,则可以用同一个神经网络的前几层layer做相同的工作,到后几层再分方向到不同的task上,这样做的好处是前几层得到的data比较多,可以被训练得更充分。有时候task A和task B的输入输出都不相同,但中间可能会做一些类似的处理,则可以让两个神经网络共享中间的几层layer,也可以达到类似的效果。

以上方法要求不同的task之间要有一定的“共性”,这样才有共用一部分layer的可能性。

Multilingual Speech Recognition

多任务学习可以应用在语音识别上,比如可以同时对法语、德语、西班牙语、意大利语训练一个model,它们在前几层layer上共享参数,而在后几层layer上拥有自己各自的参数。在机器翻译上也可以使用同样的思想,比如训练一个同时可以中翻英和中翻日的model。

注属于同一个语系的语言翻译,比如欧洲国家的语言,几乎都是可以做迁移学习的;而语音方面则可迁移的范围更广。下图展示了只用普通话的语音数据和加了欧洲语言后的语音数后得到的错误率对比,其中横轴为使用的普通话数据量,纵轴为错误率,可以看出使用了迁移学习后,只需要原先一半的普通话语音数据就可以得到几乎一样的准确率

2.3. Progressive Neural Network

如果两个task完全不相关,硬是把它们拿来一起训练反而会起到负面效果。而在Progressive Neural Network(渐进式神经网络)中,每个task对应model的hidden layer的输出都会被接到后续model的hidden layer的输入上,这样做的好处是:

  • task 2的data并不会影响到task 1的model,因此task 1一定不会比原来更差;
  • task 2虽然可以借用task 1的参数,但可以将之直接设为0,最糟的情况下就等于没有这些参数,也不会对本身的表现产生影响;

  • task 3也做一样的事情,同时从task 1和task 2的hidden layer中得到信息。

论文arxiv.org/pdf/1606.04671.pdf)

关于Progressive Neural Network可以参考:论文笔记之:Progressive Neural Network Google DeepMindProgressive Neural Network

3. labelled source data & unlabeled target data

下面介绍target data不带标签,而source data带标签的情况:

  • target data:$(x^t)$

  • source data:$(x^s, y^s)$

3.1. Domain-adversarial Training

如果source data是有label的,而target data是没有label的,该怎么处理呢?比如source data是labeled MNIST数字集,而target data则是加了颜色和背景的unlabeled数字集,虽然都是做数字识别,但两者的情况是非常不匹配的。

这个时候一般会把source data当做训练集,而target data当做测试集,如果不管训练集和测试集之间的差异,直接训练一个普通的model,得到的结果准确率会相当低。实际上,神经网络的前几层可以被看作是在抽取feature,后几层则是在做classification。如果把用MNIST训练好的model所提取出的feature做t-SNSE降维后的可视化,可以发现MNIST的数据特征明显分为紫色的十团,分别代表10个数字,而作为测试集的数据却是挤成一团的红色点,因此它们的特征提取方式根本不匹配。

所以我们希望前面的特征提取器(feature extractor)可以把domain的特性去除掉,不再使红点与蓝点分成两群,而是让它们都混在一起。这样我们就可以将用黑白MNIST训练好的model用在彩色MNIST数据上。

这里采取的做法是,在特征提取器(feature extractor)之后接一个域分类器(domain classifier),以便分类出这些提取到的feature是来自于MNIST的数据集还是来自于MNIST-M的数据集,这个生成+辨别的架构与GAN非常类似。

只不过在这里,feature extractor可以通过把feature全部设为0,很轻易地骗过domain classifier,因此还需要给feature classifier增加任务的难度,它不只要骗过domain classifier,还要同时满足label predictor的需求。

此时通过特征提取器得到的feature不仅可以消除不同domain的特性,还要保留原先digit的特性,既可以区分不同类别的数字集,又可以正确地识别出不同的数字。

通常神经网络的参数都是朝着最小化loss的目标共同前进的,但在这个神经网络里,三个组成部分的参数“各怀鬼胎”:

  • 对Label predictor,要把不同数字的分类准确率做的越高越好;
  • 对Domain classifier,要正确地区分某张image是属于哪个domain;
  • 对Feature extractor,要提高Label predictor的准确率,但要降低Domain classifier的准确率。

这里可以看出,Feature extractor和Domain classifier的目标是相反的,要做到这一点,只需要在两者之间加一层梯度反转的layer即可(给domain classifier的梯度乘一个$-\lambda$),当NN做backward的时候,两者的参数更新往相反的方向走。

注意到,Domain classifier只能接受到Feature extractor给到的特征信息,而无法直接看到图像的样子,因此它最后一定会鉴别失败,所以如何提高Domain classifier的能力,让它经过一番“奋力挣扎”之后才牺牲是很重要的,如果它一直很弱,就无法把Feature extractor的潜能激发到极限。

3.2. Zero-shot Learning

同样是source data有label,target data没有label的情况,但在Zero-shot Learning中的定义更严格一些,它假设source和target是两个完全不同的task,数据完全不相关。

在语音识别中,经常会遇到这个问题,毕竟词汇千千万万,总有一些词汇是训练时不曾遇到过的,它的处理方法是不要直接将识别的目标定成word,而是定成phoneme(音素),再建立文字与phoneme之间的映射表即可。

在图像处理中,我们可以把每个类别都用其属性(attribute)表示,并且要具备独一无二的属性,在数据集中把每种动物按照特性划分,比如是否毛茸茸、有几只脚等,在训练的时候我们不直接去判断类别,而是去判断该图像的属性,再根据这些属性去找到最契合的类别即可。

有时候属性的维数也很大,以至于我们对属性要做embedding的降维映射,同样的,还要把训练集中的每张图像都通过某种转换投影到embedding space上的某个点,并且要保证属性投影的$g(y^i)$和对应图像投影的$f(x^i)$越接近越好,这里的$f()$和$g()$可以是两个神经网络。当遇到新的图像时,只需要将其投影到相同的embedding space,即可判断它与哪个属性对应的类别更接近。

但如果我们根本就无法找出每个动物的属性$y^i$是什么,那该怎么办?可以使用word vector,比如直接从维基百科上爬取图像对应的文字描述,再用word vector降维提取特征,映射到同样的空间即可。

以下这个loss function存在些问题,它会让model把所有不同的x和y都投影到同一个点上:

类似用t-SNE的思想,我们既要考虑同一对$x^n$和$y^n$距离要接近,又要考虑不属于同一对的$x^n$与$y^m$距离要拉大(这是前面的式子没有考虑到的),于是有:

其中$\max()$项的最小值是0,当:

即:

就表明此时$f(x^n)$和$g(y^n)$的inner product很大,即两者很接近,而$f(x^n)$和其他的$g(y^m)$即差的很远,它们的inner product很小。

convex combination of semantic embedding

还有另外一个简单的Zero-Shot learning的方法叫做convex combination of semantic embedding。假设我们现在有一个语音辨识系统,有一个word vector,这两个是从网络上下载下来的,就可以做这件事情。

我把一张图丢到neural network里面去,它的output没有办法决定是哪一个class,但它觉得有0.5的几率是lion,有0.5的几率是tiger。接下来你在去找lion跟tiger的word vector,然后把lion跟tiger的word vector得到新的vector(用1:1的比例混合,0.5V(tiger)+0.5V(lion)),那你再看哪一个word的vector跟这个混合之后的结果最接近。假设是liger最接近,那这个东西就是liger(狮虎)。这样就省去了Training。

Zero-shot Learning in Machine Translation

下面是一个机器翻译的例子,Google Neural Machine Translation。在training的时候,machine看过如何把英文翻译成韩文,知道怎么把韩文翻译为英文,知道怎么把英文翻译为日文,知道怎么把日文翻译为英文。但是它从来没有看过日文翻译韩文的data,但是可以翻,但是它从来没有看过韩文翻译日文的data,但是可以翻。

为什么zero-shot在这个task上是可行的呢?如果你今天用同一个model做了不同语言之间的translation以后,machine可以学到的事情是:对不同语言的input 句子都可以project(投影)到同一个space上面。句子在这个space上的位置只跟句子的semantic有关。

比如现在根据learn好的translation,那个translation有一个encoder,它会把input的句子变成vector,decoder根据这个vector解回一个句子,就是翻译的结果。那把不同语言都丢到这个encoder里面让它变成vector的话,那这些不同语言的不同句子在这个space上面有什么不一样的关系呢?

它发现有日文、英文、韩文这三个句子,这三个句子讲的是同一件事情,通过encoder embedding之后,它们在space上面是差不多的位置。machine做的是发现一个sequence language,每一种不同的语言都先要先转成它知道的sequence language,在用这个sequence language转为另外一种语言。所以对某一个翻译task ,你的input语言和output语言machine没有看过,它也可以透过这种自己学出来的sequence language来做translation。

——————

最后简单介绍下Transfer Learning的另外两种情况:

  • Target data有label,source data没有label: Self-taught learning。它的基本思想是:

    • Learning to extract better representation from the source data(unsupervised approach)
    • Extracting better representation for target data

    Self-taught learning和semi-supervised learning有些不一样的地方,semi-supervised learning在learning的时候会有一些labelled data和unlabeled data,可以说source data是unlabeled data,target data是label data,所以Self-taught learning也是一种semi-supervised learning。但它和一般的semi-supervised learning有些不一样,一般的semi-supervised learning会假设unlabeled data至少和labelled data是有关系的,但在Self-taught learning中,source data和target data的关系是比较远的。

  • Target label没有label,source data也没有label: Self-taught clustering

论文:Self-taught learningSelf-taught clustering