模型的预训练/迁移学习

       大多数情况下,我们能够用于训练模型的算力和数据都很有限,要完成一个大型神经网络的训练非常困难,因此我们希望能够尽量重复利用已经训练好的神经网络以节约训练和数据资源。如果我们在执行预测任务时,能够找到一个曾经执行过相似任务、并被训练得很好的大型架构,那我们就可以使用这个大 型架构中位置较浅的那些层来帮助我们构筑自己的网络。借用已经训练好的模型来构筑新架构的技术就叫做“迁移学习”(transfer learning),也叫做预训练(pre-train)。预训练是我们训练大型模型时、用于降低数据需求以及加快训练速度的关键技术之一。

如何借用已经训练好的模型架构呢?

       答案是借用训练好的模型上的权重。在迁移学习中,我们要复用的是一个已经训练好的架构,包括它的架构本身以及每层上的权重。例如我们沿用某现存架构上的前三个隐藏层以及它们的权重,并在这三个隐藏层后再加入两个我们自定义的层,来构筑新的架构。训练时有两种选择:

1)将迁移层上的权重作为初始化工具(Initialization tool):将迁移层的权重作为新架构的初始化权重,在此基础上对所有层进行训练,给模型指一条“明路”。在最严谨的文献中,借用原始架构权重,并对所有层进行再训练的流程被称为“预训练”。

2)将迁移层作为固定的特征提取工具(fixed feature extractor):我们将迁移过来的层上的权重“固定”起来,不让这些权重受到反向传播等过程的影响,而让它们作为架构中的“固定知识”被一直使用。相对的,我们自己添加的、或我们自己选择的层则可以像普通的网络架构一样初始化参数并参与训练,并在每一次迭代中逐渐找到适合自己的权重。在最严谨的文献中,这个流程被称为“迁移学习”。

       这样做有什么意义呢?对神经网络来说,它所学到的知识和能够做出的判断都被储存在权重当中(我们保存模型,也是在保存模型的权重),因此保留权重,就是保留了之前的架构已经学会的东西。

迁移学习的使用条件不容忽视,使用迁移学习必须注意以下三点:

1)以前执行的任务A与现在需要执行的任务B有相似之处、有相互可借鉴之处。新任务如果是基于表格数据、或独特的实验室数据来执行的,迁移学习很少能有用。相反,两个任务越相似, 你可以迁移的层数就越多,当任务高度相似时,甚至可以只改变原始任务的输出层,来完成新架构。

2)任务A与任务B的输入图像尺寸、通道数尽量要相同。迁移学习中我们99%的情况都会保留现存架构的输入层,因为输入层上存在的参数可能是最基础、最浅层的通识,保留输入层将有助于模型的学习, 因此模型输入的图像与显存架构的输入图像必须完全一致(除非我们放弃输入层)。相似的,在迁移学习中,我们很少会混用架构。在任务属性相似、但图像数据各方面差异很大、无法共享输入层的情况下,迁移学习也不一定能有很好的效果。

3)迁移过来的层不一定是要完全锁死的。在刚将层迁移过来时,我们一般会锁死全部的迁移层,并且先训练模型看看整个模型如何表现。然后我们会试着解锁一两个靠近输出层的迁移层,再次训练来看看模型的表现是否提升,但这种情况下我们会使用很小的学习率,避免在训练中将迁移层上的权重迭代得面目全非。我们拥有的训练数据越多,我们可以解锁的层就越多,拥有的训练数据越少,我们可以在迁移层上增加的新层就越少。

       下面看看PyTorch中如何实现预训练。首先,在导入经典模型时,我们可以使用模型中已经存在的参数“pretrain”来帮助我们加载预训练模型上带的权重。PyTorch中所有模型的预训练都基于ImageNet数据集来完成,这个与训练参数在大多数实际照片上都可以有所帮助,但对表格数据和MNIST这类的数据集帮助不是很大。来看下面的代码:

        新生成的层默认requires_grad=True,因此在锁定模型中的参数后,只要覆盖掉原来的层,或者在原来的层之后加上新的层,新的层默认就是可以训练的。但是新的层会覆盖掉原来层已经训练好的参数,所以我们一般不对conv1进行覆盖。

       在代码上实现迁移学习并不困难,但我们学习的只是迁移学习最浅层的知识。除了pytorch提 供的各个可以迁移的架构外,我们还可以在github上找到大量其他可以供我们迁移的模型,这些模型的权重可能储存在github上的url中,也可能我们可以直接从github下载模型本身。对任意pytorch可以调用的模型来说,训练好的权重都储存在参数state_dict中。我们可以直接从url获取权重,也可以从现有模型中调出权重来迁移使用。

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L_bloomer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值