我想训练一个神经网络(NN),其中输出类不是(全部)从一开始就定义的。以后会根据传入的数据介绍越来越多的类。这意味着,每次我引入一个新类时,我都需要重新训练 NN。
如何逐步训练 NN,也就是说,在之前的训练阶段不会忘记之前获得的信息?
我想训练一个神经网络(NN),其中输出类不是(全部)从一开始就定义的。以后会根据传入的数据介绍越来越多的类。这意味着,每次我引入一个新类时,我都需要重新训练 NN。
如何逐步训练 NN,也就是说,在之前的训练阶段不会忘记之前获得的信息?
我想补充一下已经说过的内容,您的问题涉及机器学习中的一个重要概念,称为迁移学习。在实践中,很少有人从头开始训练整个卷积网络(使用随机初始化),因为拥有足够大小的数据集非常耗时且相对罕见。
现代 ConvNet 需要 2-3 周才能在 ImageNet 上跨多个 GPU 进行训练。因此,通常会看到人们发布他们最终的 ConvNet 检查点,以帮助其他可以使用网络进行微调的人。例如,Caffe 库有一个模型动物园,人们可以在其中分享他们的网络权重。
当您需要 ConvNet 进行图像识别时,无论您的应用领域是什么,您都应该考虑采用现有网络,例如VGGNet是一种常见的选择。
进行迁移学习时需要记住以下几点:
来自预训练模型的约束。请注意,如果您希望使用预训练网络,您可能会在可用于新数据集的架构方面受到轻微限制。例如,不能随意从预训练的网络中取出 Conv 层。然而,一些变化是直截了当的:由于参数共享,您可以轻松地在不同空间大小的图像上运行预训练网络。这在 Conv/Pool 层的情况下很明显,因为它们的前向函数与输入体积空间大小无关(只要步幅“适合”)。
学习率。与计算新数据集的类别分数的新线性分类器的(随机初始化)权重相比,对正在微调的 ConvNet 权重使用较小的学习率是很常见的。这是因为我们期望 ConvNet 的权重相对较好,因此我们不希望过快和过多地扭曲它们(尤其是当它们上面的新线性分类器正在从随机初始化中训练时)。
如果您对此主题感兴趣,请提供额外参考:深度神经网络中的特征有多可迁移?
这是您可以做到这一点的一种方法。
训练网络后,您可以将其权重保存到磁盘。这使您可以在新数据可用时加载此权重,并从上次训练停止的地方继续训练。但是,由于这些新数据可能带有其他类,因此您现在使用之前保存的权重对网络进行预训练或微调。在这一点上,你唯一需要做的就是让最后一层适应随着新数据集的到来而引入的新类,最重要的是包括额外的类(例如,如果你的最后一层最初有 10 个类,现在您又找到了 2 个类,作为预训练/微调的一部分,您将其替换为 12 个类)。简而言之,重复这个循环:
您可以使用迁移学习(即使用预训练模型,然后更改其最后一层以适应新类,并重新训练这个稍微修改过的模型,可能使用较低的学习率)来实现这一点,但迁移学习不会必须尝试保留任何先前获得的信息(特别是如果你不使用非常小的学习率,你会继续训练并且你不会冻结卷积层的权重),但只是为了加快训练或当你的新数据集不够大,从一个已经学习了一般特征的模型开始,这些特征应该与您的特定任务所需的特征相似。还有相关的领域适应问题。
有更合适的方法来执行增量类学习(这正是您所要求的!),它们直接解决了灾难性的遗忘问题。例如,您可以查看这篇论文Class-incremental Learning via Deep Model Consolidation,它提出了深度模型整合 (DMC)方法。还有其他持续/增量学习方法,其中许多在此处进行了描述或在此处进行了更详细的描述。