迁移学习 原创

1138-魏同学

发表文章数:75

首页 » 算法 » 正文

迁移学习

迁移学习,transfer learning,旨在利用一些不直接相关的数据对完成目标任务做出贡献。
不直接相关指的是:领域相同,任务不同/任务相同,领域不同
迁移学习
                    原创
迁移学习是很多方法的集合:
Target Data:和task直接相关的数据
Source Data:和task没有直接关系的数据
按照有标签数据和无标签数据又可以划分为四种:
迁移学习
                    原创

1、target data和source data都带标签的情况:

target data:

(

x

t

,

y

t

)

/left ( x^{t},y^{t} /right )

(xt,yt),作为有效数据,通常数目比较少。
如果target data量非常少,则被称为:one-shot learning
source data:

(

x

s

,

y

s

)

/left ( x^{s},y^{s} /right )

(xs,ys),作为不直接相关数据,通常量是很多的。

模型微调

简介
模型微调的基本思想:用source data去训练一个模型,再用target data对模型进行微调(fine tune).微调就是把用source data训练出的模型参数当作是参数的初始值,再用target data继续训练下去即可,但当直接相关的数据量非常少时,这种方法很容易出现问题。
保守训练
如果拥有的target data数量不多,直接拿这些数据再训练,得不到好的结果。
迁移学习
                    原创
此时可以在训练的时候加一些限制,让用target data训练前后的模型相差不太大。这里的限制,类似于(regularization)。
可以让新旧两个模型在得到同一笔数据的时候,输出越接近越好。
或者让新旧两个模型的L2正则越小越好,参数尽可能接近。
让两个模型不要相差太大,防止由于target data训练导致过拟合。
层迁移
有source data训练好的模型,把模型的某几个层拿来复制到同样大小的模型中,接下来用target data去训练余下的没有被复制到的层。
这样,target data只需要考虑模型中非常少的参数,可以避免过拟合。
迁移学习
                    原创
哪些层需要复制迁移:
不同任务,需要被复制迁移的层是不一样的:
语音识别:往往迁移最后几层,再重新训练与输入端相邻的几层。
由于口腔结构不同,同样的发音方式得到的发音是不一样的,NN的前几层会从声音信号里提取出发音方式,再用后几层判断对应的词汇,从这个角度看,NN的后几层是跟特定的人没有关系的,因此可做迁移

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

迁移学习
                    原创

多任务学习

微调仅考虑在target data上的表现,而多任务学习,则是同时考虑模型在source data和target data上的表现

如果两个任务的输入特征类似,则可以用同一个神经网络的前几层做相同的工作,到后几层再分不同的方向到不同的任务上,这样的好处是前几层得到的数据比较多,可以被训练的更充分。

有时候task A和task B的输入输出都不相同,但中间可能会做一些类似的处理,则可以让两个神经网络共享中间的几层layer,也可以达到类似的效果

迁移学习
                    原创
以上方法需要不同任务之间要有一定的共性,这样才能共用一部分层。
多语种语音识别
多任务学习在语音识别上比较有用,可以同时对法语、德语、西班牙语、意大利语训练一个model,它们在前几层layer上共享参数,而在后几层layer上拥有自己的参数

在机器翻译上也可以使用同样的思想,比如训练一个同时可以中翻英和中翻日的model
迁移学习
                    原创
注意到,属于同一个语系的语言翻译,比如欧洲国家的语言,几乎都是可以做迁移学习的;而语音方面则可迁移的范围更广

下图展示了只用普通话的语音数据和加了欧洲话的语音数据之后得到的错误率对比,其中横轴为使用的普通话数据量,纵轴为错误率,可以看出使用了迁移学习后,只需要原先一半的普通话语音数据就可以得到几乎一样的准确率
渐进式神经学习
如果两个task完全不相关,硬是把它们拿来一起训练反而会起到负面效果。
在渐进式神经学习中,每一个任务对应模型的隐藏层的输出都会被接到后续模型的隐藏层的输入上,这样做的好处是:
任务2的数据并不会影响到任务1的模型,因此任务1一定不会比之前的差。
任务2虽然可以借用任务1的参数,但可以将之直接设为0,最差的情况下就等于没有这些参数,也不会对本身的表现产生影响。
任务3也做一样的事情,同时从任务1和任务2的隐藏层中得到信息。
迁移学习
                    原创

2、target data不带标签,source data带标签的情况:

target data:

(

x

t

)

/left ( x^{t} /right )

(xt)
source data:

(

x

s

,

y

s

)

/left ( x^{s},y^{s} /right )

(xs,ys)
领域对抗训练
对于target data不带标签,source data带标签的情况,比如source data是labeled MNIST数字集,而target data则是加了颜色和背景的unlabeled数字集,虽然都是做数字识别,但两者的情况是非常不匹配的
迁移学习
                    原创
这个时候一般会把source data当做训练集,而target data当做测试集,如果不管训练集和测试集之间的差异,直接训练一个普通的model,得到的结果准确率会相当低。

实际上,神经网络的前几层可以被看作是在抽取feature,后几层则是在做classification,如果把用MNIST训练好的model所提取出的feature做t-SNSE降维后的可视化,可以发现MNIST的数据特征明显分为紫色的十团,分别代表10个数字,而作为测试集的数据却是挤成一团的红色点,因此它们的特征提取方式根本不匹配。
迁移学习
                    原创
所以我们希望前面的特征提取器(feature extractor)可以把domain的特性去除掉,不再使红点与蓝点分成两群,而是让它们都混在一起

这里采取的做法是,在特征提取器(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即可,当NN做backward的时候,两者的参数更新往相反的方向走
迁移学习
                    原创注意到,Domain classifier只能接受到Feature extractor给到的特征信息,而无法直接看到图像的样子,因此它最后一定会鉴别失败,所以如何提高Domain classifier的能力,让它经过一番奋力挣扎之后才牺牲是很重要的,如果它一直很弱,就无法把Feature extractor的潜能激发到极限。

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

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

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

有时候属性的维数也很大,以至于我们对属性要做embedding的降维映射,同样的,还要把训练集中的每张图像都通过某种转换投影到embedding space(嵌入空间)上的某个点,并且要保证属性投影

g

(

y

i

)

g(y^{i})

g(yi)的和对应图像投影的

f

(

x

i

)

f(x^{i})

f(xi)越接近越好,这里的

g

(

y

i

)

g(y^{i})

g(yi)

f

(

x

i

)

f(x^{i})

f(xi)可以是两个神经网络

当遇到新的图像时,只需要将其投影到相同的空间,即可判断它与哪个属性对应的类别更接近
迁移学习
                    原创
如果无法找出每个动物的属性

y

i

y^{i}

yi是什么,可以使用词向量,比如直接从维基百科上爬取图像对应的文字描述,再用word vector降维提取特征,映射到同样的空间即可

未经允许不得转载:作者:1138-魏同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《迁移学习 原创》 发布于2020-11-25

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录