迁移学习(Tranfer Learning)

来源:Coursera吴恩达深度学习课程

计算机视觉的研究社区(computer vision research community)非常喜欢把许多数据集上传到网上,比如ImageNetMS COCOPascal类型的数据集,它们都是由大家上传到网络的,并且有大量的计算机视觉研究者已经用这些数据集训练过他们的算法了。有时候这些训练过程需要花费好几周,并且需要很多的GPU,其它人已经做过了,并且经历了非常痛苦的找最优过程(high performance search process),这就意味着你可以下载花费了别人好几周甚至几个月而做出来的开源的权重参数,把它当作一个很好的初始化用在你自己的神经网络上。用迁移学习(transfer learning)把公共的数据集的知识迁移到你自己的问题上,让我们看一下怎么做。

如上图,举个例子,假如你要建立一个猫咪检测器(cat detection),用来检测你自己的宠物猫(pet cat)。假如你的两只猫叫Tigger和Misty,还有一种情况是,两者都不是。所以是一个三分类问题,我们忽略两只猫同时出现在一张图片里的情况。现在你可能没有Tigger或者Misty的大量的图片,所以你的训练集会很小,你该怎么办呢?

Andrew建议先从网上下载一些神经网络开源的实现,把代码和权重都下载下来。例如,ImageNet数据集,它有1000个不同的类别,因此这个网络会有一个Softmax单元,它可以输出1000个可能类别之一。你可以去掉这个Softmax层,创建自己的Softmax单元,用来输出Tigger、Misty和neither三个类别。就网络而言,Andrew建议把所有的层看作是冻结的,冻结网络中所有层的参数,只需要训练和你的Softmax层有关的参数。幸运的是,大多数深度学习框架都支持这种操作。它也许会有trainableParameter = 0这样的参数,有时也会有freeze  = 1这样的参数。不同的深度学习编程框架有不同的方式,允许你指定是否训练特定层的权重。

(1)还有一个技巧(trick),也许对一些很小的数据集有用(上图第一行紫色部分),由于前面的层都冻结了,相当于一个固定的函数,不需要改变。输入图像,直接把它映射到这层(softmax的前一层)的激活函数。所以这个能加速训练的技巧就是,如果我们先计算这一层(紫色箭头标记),计算特征或者激活值,然后把它们存到硬盘里。你所做的就是用这个固定的函数,在这个神经网络的前半部分(softmax层之前的所有层视为一个固定映射),取任意输入图像,然后计算它的某个特征向量(feature vector),这样你训练的就是一个很浅的softmax模型,用这个特征向量来做预测(make a prediction)。对你的计算有用的一步就是对你的训练集中所有样本的这一层的激活值进行预计算,然后存储到硬盘里,然后在此之上训练softmax分类器。所以,存储到硬盘或者说预计算方法的优点就是,你不需要每次遍历训练集再重新计算这个激活值了。

(2)对于很小的数据集,你可以这样做。(上图第二行)根据经验,如果你有一个更大的标定的数据集,也许你有大量的Tigger和Misty以及两者都不是的照片,你应该冻结更少的层,比如只把这些层冻结(括号中的层),然后训练后面的层。如果你的输出层的类别不同,那么你需要构建自己的输出单元,Tigger、Misty或者两者都不是三个类别。有很多方式可以实现,你可以取后面几层的权重,用作初始化,然后从这里开始梯度下降。或者也可以直接去掉后面这几层,换成你自己的隐藏单元和你自己的softmax输出层,这些方法值得一试。注意有一个规律(pattern),如果你有越来越多的数据,你需要冻结的层数越少,能够训练的层数就越多。

(3)如果你有大量数据(上图第三行)你应该做的就是用开源的网络和它的权重,把所有的权重当作初始化,然后训练整个网络。如果这是一个1000节点的softmax,而你只有三个输出,你需要你自己的softmax输出层来输出你要的标签。如果你有越多的标定的数据,你可以训练越多的层。极端情况下,你可以用下载的权重只作为初始化,用它们来代替随机初始化,接着你可以用梯度下降训练,更新网络所有层的所有权重。

以上这就是卷积网络训练中的迁移学习,事实上,网上的公开数据集非常庞大,并且你下载的其他人已经训练好几周的权重,已经从数据中学习了很多了。对于很多计算机视觉的应用,如果你下载其他人的开源的权重来初始化,你会做的更好。在所有不同学科中(in all the different disciplines),以及所有深度学习不同的应用中,Andrew认为计算机视觉(computer vision)是一个你经常用到迁移学习的领域,除非你有非常非常大的数据集,可以从头开始训练所有的东西。总之,迁移学习是非常值得你考虑的,除非你有一个极其大的数据集(have an exceptionally large data set)和非常大的计算量预算(a very large computational budget)来从头训练你的网络。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值