凛冬将至

从简单的例子开始

0%

迁移学习简介

本篇为学习迁移学习笔记,主要是学习李宏毅老师的课程的笔记,主要图片也都选自其课件。内容是迁移学习的简单介绍,了解一下框架。

整体框架

迁移学习(Transfer Learning)专注于存储已有问题的解决模型,并将其利用在其他不同但相关问题上$^{[1]}$,具体包括了哪些范围,这种概念一向没有精确的范畴,因此就不纠结了。

按照source data和target data是否有标签,分为4个类型:

S labeled & T labeled

都有label了,还需要transfer Learning,一般是source data多,target data少。比如source data是各个人的语音和对应文本,target data是一个特定的人的语音和对应文本。

那如果目标域的数据足够,Transfer Learning还有增益吗?后面有两个案例可以说明还是可能有增益的。

Model Fine-tuning

Idea:training a model by source data, then finetune the model by target data

Challenge: only limited target data, so be careful about overfitting

Conservative Training

就是让模型在fine-tuning阶段,保守地学习,让模型不会和pre-train的模型差太多。比如增加regularization,使fine-tune和pre-train的模型对相同数据的预测结果接近,或者是fine-tune和pre-train的模型的参数加上l2正则,使其接近。这个有点像终身学习中的做。

Layer Transfer

做法:将source data上pre-train的模型的大部分层freeze,用target data只fine-tuning模型的其余几层。

这里有一个比较有意思的点,就是不同的任务,可迁移的层(即可以copy的层)不同。

  • Speech: usually copy the last few layers(前几层是发音方式→说的内容,后几层是说的内容→任务结果)

  • Image: usually copy the first few layers(前几层是基本的线条特征,后几层是和任务比较相关的)

下面这个实验(How transferable are features in deep neural networks)可以说明Image中前几个层可以transfer,后几个层不行。这个实验很有意思,需要详细介绍一下。

这个实验以ImageNet的数据测试,500类做源域(60万),500类做目标域(60万),数据量都很充足。图中横坐标表示transfer了前N层,纵坐标是准确率,越高越好,黑色的水平虚线表示直接用target data训练的效果。第5条线:transfer之后fine-tuning整个模型,能看出来即使target data充足,加上预训练之后也还是有提升效果的。第4条线:transfer前几层,只训练后面几层时,只copy前一两层时,效果还有点提升,copy太多了,效果就不行了。第2条线也很有意思,把target data作为预训练,然后transfer前几层,并freeze,只fine-tuning其余层,结果也是copy多了效果反而不好,所以说模型需要前后层相配合才能学习好,但这个结果还是有点诡异,难以解释。

如果source data和target data差异很大,前几个层还是可以transfer,后面的层不能transfer。黄色的线表示,如果前面几层random并且freeze,则后面几层怎么train效果也很差

Multitask Learning

多任务学习也可以实现迁移学习,如果source data和target data的特征同构,但任务不同,则可以用下图左边的结构,可以用更多的数据学习浅层。如果source data和target data的特征也不同构,任务也不同,但认为其中间层是可以通用的,则可以用右边的结构。

比如在多语言语音识别中,可用浅层提取语义信息,然后用多任务,翻译成各个语言。

实验中发现,加入其他语言的多任务还是有利于目标语言的预测的。将语言同时输出为欧洲语言也会有助于我们识别普通话的准确率,模型的收敛速度会快一倍。

Huang, Jui-Ting, et al. “Cross-language knowledge transfer using multilingual deep neural network with shared hidden layers.” ICASSP, 2013

Progressive Neural Networks

上面的多任务学习需要各个任务只有相关,否则有可能起到副作用。这点不是很好把握,所以有作者提出逐步增加任务(PNN),将前序任务的模型中间层也输入至后序任务的模型,这样最差前面任务对后面任务没有增益,则transfer的中间层参数为0,也不会起到什么负作用。

感觉这个模型不如MMOE更加合理,后者在任务不相关时,也不会起到副作用。

S labeled & T unlabeled

source data有标签,但target data无标签也可以分为几种情况。

  • 两者的任务相同,输入不匹配,可使用Domain-adversarial training
  • 两者的任务不同,输入同类型,可使用Zero-shot Learning

将机器学习任务理解为$f(\boldsymbol X)→y$ 的过程,则本场景下就是要建立起$f(\boldsymbol X_{source})→y_{source}$与$f(\boldsymbol X_{target})→y_{target}$之间的联系。任务相同时,建立特征之间的联系即可,即找到一个表示,使$g(\boldsymbol X_{source})=g(\boldsymbol X_{target})$,后面的任务部分就可以共享了,这是Domain-adversarial training的基本思路。

如果任务不同,输入类型相同,则需要建立起$y_{source}$和$y_{target}$之间的联系。在Zero-shot Learning中,$g(y_{source})$中不同动物之间的空间关系同样适用于$g(y_{target})$,这往往需要提供y之间关系的信息,比如Attribute和class之间的关系表,或者对y做word embedding所需的文本。

Domain-adversarial training

source data有标签,但target data无标签的一个典型例子就是黑白的MNIST数据有标签,彩色的MNIST数据无标签。两者的任务相同,但输入是不同类型。

Domain-adversarial training的方法非常经典,在各个领域都经常看到。通过让source data和target data学到的表示层分布相同,并且最大限度地保留用来预测y的信息,从而实现迁移学习。

所谓adversarial,指的是domain label分类任务中,表示层(绿色)和判别层(粉色)之间的对抗。在这部分的梯度下降中,梯度传至特征提取层(绿色)时,会反转梯度,变为梯度上升。

参考文章:

Yaroslav Ganin, Victor Lempitsky, Unsupervised Domain Adaptation by Backpropagation, ICML, 2015

Hana Ajakan, Pascal Germain, Hugo Larochelle, François Laviolette, Mario Marchand, Domain-Adversarial Training of Neural Networks, JMLR, 2016

Zero-shot Learning

完全没有想要预测的任务的标签时,还可以用Zero-shot Learning!比如说下面这个任务,source data是猫和狗的图片,以及其对应的标签是猫和狗。target data是草泥马的图片,怎么才能预测出这是草泥马呢?

如果我们能拿到一个database,里面有每种动物对于的属性,且属性的维度多到能够和动物class一一对应。那做法就是,先训练模型预测图片的是否具有各个属性。

得到动物的class。

Attribute embedding

如果Attribute比较复杂,可以做Attribute的embedding,用有标签的数据训练,让$f(图片)$接近于其对应动物的$g(Attribute)$(每个动物有一个$g(Attribute)$)。然后预测时,计算无标签图片的embedding:$f(草泥马图片)$,去匹配和所有动物的$g(Attribute)$,和其最近的$g(Attribute)$对应的动物就是其预测结果。

Attribute embedding + word embedding

上面这种方法需要有Attribute和class之间的关系表,如果没有这个表,可以通过word embedding来对动物embedding。但感觉这个方法精度非常有限,不过也是更人工智能的要求。

这个方法中的loss挺有意思,可以学习一下。如果直接让$f(\boldsymbol x_i)$和$g(\boldsymbol y_i)$之间的距离最小:

则会导致模型将所有$i$的$f(\boldsymbol x_i)$和$g(\boldsymbol y_i)$都预测成一样的向量就可以了,所以需要增加一个类间距的约束,此处用内积来度量距离:

这个公式的含义是$f(\boldsymbol x_i)·g(\boldsymbol y_i)
-\underset {j\neq i}{max}f(\boldsymbol x_i)·g(\boldsymbol y_j)=\underset {j\neq i}{min}[-f(\boldsymbol x_i)·g(\boldsymbol y_j)]-(-f(\boldsymbol x_i)·g(\boldsymbol y_i))>k$ 时,即最小的类间距要比类内距大$k$,此时loss为0。否则就加大这个类间距-类内距。

Convex Combination of Semantic Embedding

也可以连模型都不用训练,找个现成的分类模型,用其在各个类别上的预测结果作为Embedding,然后去和其最近的动物的embedding对应的动物类别(此处已经有了每个动物的embedding)。下图的意思是,对一个输入的图片,预测其属于lion和tiger的概率都是0.5,然后去动物embedding空间中,看离lion和tiger中点最近的embedding对应的动物是什么。这个方法对embedding空间有一定的假设。

S unlabeled

当source data没有label时,可以通过source data学习怎么更好地提取特征,也可以帮助我们的模型。但此时需要用无监督的方式,比如自编码等等。


注:

[1]. 维基百科