【Day 26】迁移学习(Transfer Learning)(上)

Transfer Learning的意思是,假设你现在有一些跟你的task没有直接相关的data,那你能不能用这些没有直接相关的data来帮助我们做什麽事。

举例来说,你现在要做的是猫跟狗的classifier,而没有直接相关的data可能是输入的distribution是类似的,例如一样是动物的图片,但是task里的label是没有相关的,还有另一个可能是你的input domain不一样,但是task一样。

Why?

为什麽我们要用Transfer Learning?举例来说,我们要做一个台语的语音辨识,但是台语的data是很少的,但其实语音的data是很容易蒐集的,那我们能不能够用其他语言的data,来improve台语的语音辨识这件事情。

Transfer Learning - Overview

假设现在我们有一个想要做的task,有一些跟我们task有关的data我们称为Target data,有一些跟我们task无关的data我们称为Source data,这两笔data都有可能有label,也有可能没有label,所以我们就可以分成四种可能来讨论。

今天会先讲Target data和Source data都有label的情况。

Model Fine-tuning

首先是我们的Target data和Source data同时都有label的情况,最常见也最简单的方法是fine-tune你的model,通常我们会假设Target data的量是非常少的,source data是很多的,而如果今天Target data的量少到只有几个example,我们称之为One-shot Learning

语音上最典型的例子是speaker adaptation,就是说我现在的Target data是某一个人的声音,这个人的声音你不可能有太多的label data,但是Source data你有一大堆来自於不同人的audio data。所以你可以直接拿你的Source data去训练一个model,接下来你就用你的Target data来去fine-tune你的model,就等於是你把Source data上训练出来的model当作是训练的初始值,然後再用Target data去训练,那接下来我就介绍一些方法来做这件事。

Conservative Training

Conservative Training是你现在有大量的Source data,里面有很多不同speaker的声音,你就可以训练一个拿来做语音辨识的Neural Network,接下来你有Target data是某个speaker的声音,但可能只有几句而已。这时候你可以在训练的时候加上一些限制,让训练完新的模型跟旧的模型不要差太多,这个限制其实就是Regularization,我们会希望新的模型跟旧的模型的输出在看到同一笔data的时候,它们的输出越接近越好,或是它们的L2 norm差距越小越好。

Layer Transfer

另一个方法是Layer Transfer,假设现在有用Source data训练好一个模型,然後把这个模型里面的一些layer拿出来直接复制到新的模型里,接下来你用Target data只去训练没有复制的layer,这样的好处就是你的Target data只需要考虑非常少的参数,

但是哪些layer应该被Transfer呢?其实在不同task上面需要被Transfer的layer是不一样的。

举例来说,在语音辨识方面,我们通常是复制最後几层,然後重新训练输入那一层,你可以想成是每一个人用同样的发音方式,但因为口腔结构有差异,所以得到的声音不同,那Neural Network前几层是从声音讯号里面得知说话的人的发音方式,再根据发音方式得到现在说的是哪一个词汇。从这个角度来看,Neural Network的後面几层是跟说话的人没有关系的,所以可以被复制。

而在影像辨识方面,通常是复制前面几层,只训练最後几层,因为当你在Source data上训练了一个Network,通常前几层就是detect最简单的pattern,比如说有没有直线、横线或是有没有简单的几何图形,所以前几层是可以被Transfer到其他task上面的。

Multitask Learning

Multitask Learning跟Fine-tune不同的地方是,在Fine-tune里面,我们在意的是Target domain做得好不好,而在Multitask Learning里面,是会同时在意Target domain跟Source domain做得好不好。

如果是用基於Deep Learning的方法,就特别适合用Multitask Laerning。假设有两个不同的task,它们用的是一样的feature,例如说都是做影像辨识,只是影像辨识的class不一样,我就可以训练一个Neural Network,输入就是两个不同的task,同样的feature,但是中间会分叉出来,一部分的Network它的输出是Task A的答案,一部分的Network它的输出是Task B的答案。这样做的好处是,Task A和Task B在前几个layer会是共用的,就代表前面几个layer是用比较多的data去训练的,所以可能有比较好的表现,但是你要确定这两个task有没有共通性,是不是可以共用前面几个Layer。

另一个是连输入都没有办法共用的,所以两种不同的task都用不同的Neural Network把它Transform到同一个domain上,在同一个domain上,再apply不同的Neural Network,一个去做Task A,一个去做Task B,而中间可能有几个layer是共用的。

Multitask Learning有一个很成功的例子是,多语言的语音辨识。假设现在有一堆不同语言的data,你可以训练一个model同时可以辨识这五种不同的语言,而这个model的前几个layer它们会共用参数,後面几个layer,每一个语言可能会有自己的参数。

其实在Translation也可以用同样的事情,假设你要做中翻英、中翻日,那可以把两个模型一起训练,反正都要先把中文的data做处理,那一部分的Neural Network就可以是两种不同语言的data共同使用。

Progressive Neural Network

这个方法可以帮助我们不用花太多时间在想两个task能不能Transfer。Progressive Neural Network是在说,先训练一个Task 1的Neural Network,训练好之後它的参数就fix住了,而现在我们要做Task 2,一样有一个Neural Network,但是Task 2的每一个hidden layer都会去接Task 1某一个hidden layer的输出。所以在训练的时候,首先Task 2的data不会去动到Task 1的model,所以Task 1不会比原来更差,再来Task 2去借用Task 1的参数,但是它可以把这些参数直接设成0,这样也不会影响到Task 2的表现。如果有Task 3也是做一样的事情,它会同时从Task 1和Task 2的hidden layer得到information。


参考资料

李宏毅老师 - ML Lecture 19


<<:  Day 25 埠映射与记忆体映射

>>:  【在厨房想30天的演算法】Day 24 资讯安全与演算法 : 共用金钥密码系统

DAY9:元件与监听事件简介及实作

我们要来介绍到元件与监听事件,首先,先从取得画面元件说起,简单来说,Android主程序码跟画面的x...

[火锅吃到饱-12] 温野菜日本涮涮锅专门店 Taiwan On-Yasai @秀泰-台中站前店

我在这一区出生的(小时候也住在这里),拍这集的时候,不自觉的会想要多介绍一些周遭的环境。 阿公家在这...

【Day03】Git 版本控制 - 什麽是 Git

有些工程师的至理名言是:「人生不能重来,但是 Git 可以。」 所以,什麽是 Git? 维基百科说:...

【Day01】数据输入元件 - Button

参赛前言 第一次参赛是 2019铁人赛(连结),也是刚接触 React 不久,透过那次真的觉得收获良...

Material UI in React [ Day 30 ] 总结

今天是参赛的最後一天,至此已经讲解完侧边栏位的内容了,之後会再整理每一章节的范例在 code sen...