5

迁移学习笔记

 2 years ago
source link: https://alanxiuxiu.github.io/2018/09/19/Transfer-learning/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

Overview

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

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,有待发掘。

Domain-adversarial Training

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

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

Zero-shot Learning

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

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

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

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

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

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的相关论文:

Self-taught Learning

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK