为什么我需要在迁移学习中预训练权重

Why I need pre-trained weight in transfer learning

我正在使用一些预训练模型(vgg16、vgg19 等)学习迁移学习,我想知道为什么我需要加载预训练权重来训练我自己的数据集。

我可以理解我的数据集中的 类 是否包含在预训练模型训练的数据集中。比如VGG模型是在Imagenet数据集中用1000类训练的,而我的模型是分类cat-dog,也是在Imagenet数据集中。但是这里我的数据集中的 类 不在这个数据集中。那么预训练权重有何帮助?

您不必使用预训练网络来为您的任务训练模型。然而,在实践中,使用预训练网络并将其重新训练到您的 task/dataset 通常 更快 并且通常您最终会得到更好的模型,从而产生 更高的准确性 .如果您没有大量训练数据,情况尤其如此。

为什么更快?

事实证明,(相对)独立于数据集和目标 类,前几层收敛到相似的结果。这是因为低层通常充当边缘、角和其他简单结构的检测器。 Check out this example 将不同层 "react" 过滤到的结构可视化。已经训练了较低层,使较高层适应您的用例要快得多。

为什么更准确?

这个问题比较难回答。恕我直言,这是因为您用作迁移学习基础的预训练模型是在海量数据集上训练的。这意味着获得的知识会流入您重新训练的网络,并将帮助您找到更好的损失函数的局部最小值。

如果您处于拥有大量训练数据的舒适情况下,您可能应该从头开始训练模型,因为预保留模型可能 "point you in the wrong direction"。 在 this master thesis 中,您可以找到一堆任务(小数据集、中等数据集、小语义差距、大语义差距),其中比较了 3 种方法:微调、特征提取 + SVM,从头开始。微调在 Imagenet 上预训练的模型几乎总是更好的选择。