迁移学习笔记

为了学习Zero-shot Learning方面的知识,先对迁移学习做了一个基本了解。迁移学习是指data和所要做的任务不直接相关。比如给的数据是猫狗的照片和label,迁移学习有两种情况:第一,similar domain, different tasks,给的大象和老虎的照片(风格和猫狗照片类似),任务是分类大象和老虎;第二,different domains, same task,给的是高飞狗和招财猫的图片,任务要求分类猫狗。迁移学习和半监督、非监督学习的差别还是蛮大的,主要是因为迁移学习的测试集和训练集相差很远。

Overview

迁移学习有不同分类,主要看source data和target data有没有标签:

  
Overview
  

Model Fine-tuning

既有target data又有source data,都有label,但是target data非常少。One-shot learning就是指only a few examples in target domain的情况。例子:(监督学习)说话人辨识中,说话人的语音材料可能很少,但是其他人的语音材料可以成批获得。用source data来训练一个模型,再用target data来fine-tune这个模型。(fine-tune就是说把source data的模型当成初始模型,再用target data继续训练下去)但是要注意到target data太少了,要小心过拟合。

这里fine-tuning可以用Conservative training的方法,即加一个constraint,让用target data新训练的模型和原来的模型不要差太多(新旧模型在看到同一笔输入的时候,输出相差不要太大,或者新旧模型的参数的l2范式相差不要太大)。

也可以用Layer transfer的方法,即copy原模型中的几个layer到新模型中去,只训练剩下的几个没有copy的layer,这样就可以防止改动过大(过拟合)。最后如果数据量充足的话,也可以再用target data来fine-tune整个新模型。

关于layer transfer,有几个问题:
有哪些模型可以被transfer(copy)呢?在语音辨识时,通常copy最后几层,因为前几层主要是来提取各个说话人的发音方式,后面几层是得到发音方式后得到说话内容,后几层是普适的;而在图像辨识时,通常copy前几层,因为cnn的前几层都是为了提取最简单的特征,可以普适,而后面提取的特征更特殊。

Muti-task Learning

不像fine tuning只关注target domain,muti-task learning会关注两个domain。比如神经网络中两个任务共用前面几层,或者是共用中间几层。应用在多语言辨识上,前几层将声音特征做提取,可以共用网络,后面几层再分语种。

如果两个任务不相关的话,很容易影响迁移学习的效率。所以提出了progressive neural network的方法。先以task1为目的训练一个模型,在做下一个task的时候,每一层的参数会参考到之前的所有模型的上一层。这是一个idea,有待发掘。

  
Progressive Neural Network
  

Domain-adversarial Training

对应source有label但是target没有label的情况。可以理解为Training data和testing data非常mismatch。希望神经网络在前几层做完特征提取之后,target和source的domain不要区分的太明显,即把domain的特性取消掉。

  
让FE学会从target data中提取特征
  

  
Domain-adversarial Training结构
  

Domain classifier要做的就是识别提取出来的特征是source还是target,而训练时特征提取层会尽量从target data中提取出类似于source data的特征来“骗过”(满足)domain classifier。同时要欺骗也很简单,所以为了又向source特征看齐、又保证提取的完整完备,在后面又接了一个label predictor,给提取出来的特征做分类。

  
Domain-adversarial Training训练过程
  

Zero-shot Learning

也是source data有标签但是target data没有标签,但是对task的定义更严格,要求source和target做的是different tasks。在语音辨识中就有这样的例子,source(training)语料中不可能有全部可能出现的词汇,于是我们不去训练一个发音怎么识别成单词,而是训练一个发音怎么识别成一个音标,建一个文字对应音标的词典,然后从音标映射过去就好了。

在图像识别中,我们用attributes来表示每个类,建立一个database来存放每个类的特征情况。训练的时候从图片读取特征情况。

  
ZSL数据库存放特征
  

那么应用到测试集的时候,只需要读取输入的特征情况,然后去找和数据库中特征情况最接近的那一类即可。于是可以得出ZSL的问题定义:利用训练集数据训练模型,使得模型能够对测试集的对象进行分类,但是训练集类别和测试集类别之间没有交集;期间需要借助类别的描述,来建立训练集和测试集之间的联系,从而使得模型有效。

  
Attributes embedding
  

图像和attributes都可以描述成vector(通过embedding)。把图像x和特征y都做降维,通过embedding function f和g把这些向量都降到同样的dimension。训练时的目标是让同一个物体的x和y做了embedding后尽量接近。

如果没有database怎么办呢?可以借用word embedding,把attributes映射后的向量变成word vector:

  
Attributes embedding + Word embedding
  

Loss function的设计也有讲究,不仅要让同种的f和g接近,还要让不同种的向量彼此远离。即在种外找一个最接近的,然后保证即使是这个最近的做内积,也还要比种内做内积的小一个k。

  
损失函数设计
  

关于zero-shot learning,还有一个Convex Combination of Semantic Embedding的方法。这个方法只需要off-the-shelf NN for ImageNet and word vector。比如输入一个狮虎兽,输出显示0.5概率是狮子,0.5概率是老虎,那么在词向量上取狮子和老虎的向量的中点,然后找离这个中点最接近的vector,发现是狮虎兽。

再举一个语音识别的zero-shot learning例子。机器翻译时,学会将不同语言的句子先翻译成语义(对应vector),而不是直接从语言到语言,这样没有训练过的语言对也可以进行翻译了。

ZSL的相关论文:

  
ZSL论文
  

Self-taught Learning

有大量的没有标签的source data,可以用这些数据去训练一个好的特征提取器,然后再用这个feature extractor去从target data中提取特征。略。