微调与迁移学习与从头开始学习

机器算法验证 深度学习 计算机视觉 物体检测 迁移学习
2022-03-07 02:46:29

在我的硕士论文中,我正在研究一个特定用例的迁移学习,这是一个交通标志检测器,实现为具有 VGG16 基础网络的单次检测器进行分类。该研究的重点是拥有一个训练有素的检测器并干扰它所训练的交通标志数据集(我采用比利时交通标志检测数据集)但是当它在另一个国家(德国,奥地利)使用检测器时,意大利,西班牙,...)交通标志看起来或多或少不同,这会导致一定的不必要的损失。有关此主题的概述,我会推荐维基百科文章

~~~下一节是关于我的研究问题~~~

所以在新国家有几个交通标志的例子,是不是更好

  • 微调网络
  • 迁移学习网络并冻结一些卷积层
  • (作为比较)从零开始学习新的国家

即使是第一个检测器(在综合比利时数据集上从头开始训练的检测器),它是否有任何优势,从已发布的模型 Zoos(例如 VGG16/COCO)加载预训练的权重,然后基于此进行微调/迁移学习?

现在我在这里问什么: 我不是自己实现了我的检测器,而是基于到 Keras/Tensorflow 的原始 SSD 端口(从这里)并且已经用不同的变体训练了它(比利时从头开始,用 MS COCO 预训练,转移到德国,卷积冻结,微调到德国),经过数周的训练,现在我可以说,比利时从头开始具有随机权重的收敛速度最快(仅 40 epochs/2 天后,我的自定义 SSD 损失函数下降到一个值3)虽然所有其他变化都需要更多时间,但更多的时期和损失永远不会低于 9 的值。

我还发现了使用 VGG16 进行交通标志分类的预训练权重,我认为这应该是关于这个主题的迁移学习的理想基础,但是这个检测器是迄今为止表现最差的(损失停滞在 11,即使学习率发生变化并且在 100 之后时代它过度拟合)。

看来,这些检测器的迁移学习或微调根本没有任何优势。很可能我做错了什么,或者我错误地理解了迁移学习的目的(我认为它应该加快学习速度,因为大多数层都是不可训练的,因此没有进行计算)

我不知道这是否是讨论这个话题的合适平台,也许你知道这属于一个 slack 或 gitter 频道。我只是不知道我是否被卡住了,或者我只是在做一些可怕的错误。

1个回答

迁移学习是指为一项任务开发的模型被重用于第二项任务。微调是迁移学习的一种方法,您可以更改模型输出以适应新任务并仅训练输出模型。

迁移学习或领域适应中,我们使用数据集训练模型。然后,我们用另一个具有不同类分布的数据集训练相同的模型,甚至使用与第一个训练数据集不同的其他类)。

微调(一种迁移学习的方法)中,我们有一个数据集,并且我们在训练中使用了 90% 的数据集。然后,我们用剩下的 10% 训练相同的模型。通常,我们将学习率更改为较小的,因此它不会对已经调整的权重产生重大影响。您还可以让一个基本模型用于类似的任务,然后在使用新数据执行新的训练会话时冻结一些层以保留旧知识。输出层也可以不同,并且在训练中冻结其中的一些。

根据我的经验,从头开始学习会带来更好的结果,但它比其他方法成本高得多,尤其是在时间和资源消耗方面。

使用迁移学习,您应该冻结一些层,主要是预训练的层,只在添加的层中进行训练,并降低学习率以调整权重,而不会混淆它们对网络的意义。如果你加快学习速度,你通常会因为梯度下降优化中的大步骤而面临糟糕的结果。这可能导致神经网络无法找到全局最小值而只能找到局部最小值的状态。

在类似的任务中使用预训练模型,当我们使用 Fine-tuning 时通常会有很好的结果但是,如果您在新数据集中没有足够的数据,或者您的超参数不是最好的,您可能会得到不满意的结果机器学习总是依赖于它的数据集和网络的参数。在这种情况下,您应该只使用“标准”迁移学习

因此,我们需要以我们期望的准确性评估资源和时间消耗之间的权衡,以选择最佳方法。