是否可以逐步训练神经网络?


23

我想训练一个神经网络,其中从一开始就没有(全部)定义输出类。稍后将基于传入数据引入越来越多的类。这意味着,每次引入新课程时,我都需要重新训练NN。

如何逐步训练NN,即在先前的训练阶段中不会忘记先前获取的信息?

Answers:


10

我想补充一下已经提到的问题,您的问题涉及到机器学习中一个重要的概念,即转移学习。在实践中,很少有人从头开始训练整个卷积网络(使用随机初始化),因为它既耗时又很少有足够大小的数据集。

现代ConvNets需要2-3周的时间来在ImageNet上跨多个GPU进行训练。因此,常见的是看到人们发布最终的ConvNet检查点是为了让其他人可以使用网络进行微调。例如,Caffe库有一个模型动物园,人们可以在其中共享网络权重。

当您需要ConvNet进行图像识别时,无论您的应用程序域是什么,都应考虑采用现有网络,例如VGGNet是常见选择。

进行迁移学习时,需要牢记以下几点:

  • 来自预训练模型的约束。请注意,如果您希望使用预训练的网络,则在可用于新数据集的体系结构方面可能会受到一些限制。例如,您不能从预先训练的网络中任意提取Conv图层。但是,有些更改很简单:由于参数共享,您可以轻松地在不同空间大小的图像上运行经过预训练的网络。这在Conv / Pool层的情况下很明显,因为它们的前向功能与输入体积的空间大小无关(只要跨度“合适”即可)。

  • 学习率。与计算新数据集的类分数的新线性分类器的(随机初始化)权重相比,对要微调的ConvNet权重使用较小的学习率是很常见的。这是因为我们期望ConvNet权重相对较好,所以我们不希望它们过快或过大地失真(尤其是当它们上方的新线性分类器通过随机初始化训练时)。

如果您对此主题感兴趣,请参阅其他参考:深度神经网络中的要素如何可传递?


迁移学习不是执行增量学习的唯一方法。
nbro

7

这是您可以执行此操作的一种方法。

训练网络后,可以将其权重保存到磁盘。这样,您可以在有新数据可用时加载此权重,并从上次停止训练的地方继续进行大量训练。但是,由于此新数据可能附带其他类别,因此您现在可以使用以前保存的权重在网络上进行预训练或微调。此时,您唯一要做的就是使最后一层适应新数据集的到来而引入的新类,最重要的是包括额外的类(例如,如果最后一层最初有10个班级,现在又发现了2个班级,作为预训练/微调的一部分,您将其替换为12个班级。简而言之,重复此圈子:

重复


如果仅在最后一层容纳新的类(训练类+新类),则该模型不适合,因为我们希望仅训练新的类,并且模型期望数组为(training + new类)。
Joel Carneiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.