假设我们要检测 4 种狗(金毛猎犬、黑色拉布拉多犬、可卡犬和比特斗牛犬)。训练数据由一组狗的 png 图像及其注释组成。我们想使用 YOLOv3 训练一个模型。
优化器的选择在训练模型方面真的很重要吗?Adam 优化器会比 Adadelta 优化器更好吗?还是它们基本上都一样?
一些优化器会更好,因为它们允许大多数权重达到其“全局”最小值吗?
假设我们要检测 4 种狗(金毛猎犬、黑色拉布拉多犬、可卡犬和比特斗牛犬)。训练数据由一组狗的 png 图像及其注释组成。我们想使用 YOLOv3 训练一个模型。
优化器的选择在训练模型方面真的很重要吗?Adam 优化器会比 Adadelta 优化器更好吗?还是它们基本上都一样?
一些优化器会更好,因为它们允许大多数权重达到其“全局”最小值吗?
我已经对此进行了小范围的实验,并没有注意到太大的影响。
迄今为止,Adam 似乎在各种图像数据集上给出了最好的结果。我发现在训练过程中“调整”学习率是提高模型性能的有效手段,比优化器的选择影响更大。
Keras 有两个用于此目的的回调。文档位于https://keras.io/callbacks/。ModelCheckpoint回调使您能够保存完整模型或仅保存基于监控指标的模型权重。通常,您监控验证损失并设置参数save_best_only=True以保存最低验证损失的结果。另一个有用的回调是ReduceLROnPlateau,它允许您根据监控指标调整学习率。同样,通常监控的指标是验证损失。如果在用户设置的 epoch 数(参数耐心)后损失没有减少,则学习率将通过用户设置的因子(参数因子)进行调整。你可以把训练过程想象成沿着山谷旅行。当你接近谷底时,它变得越来越窄。如果您的学习率不适应“狭窄”,那么您将无法到达谷底。
您还可以编写自定义回调来调整学习率。我已经做到了这一点,并创建了一个首先根据监控训练损失调整学习率,直到训练准确度达到 95%。然后它切换到基于对验证损失的监控来调整学习率。它保存模型权重以获得最低的验证损失,并使用这些权重加载模型以进行预测。我发现这种方法可以加快训练速度和提高准确性。
事实是您无法判断您的模型是收敛到全局最小值还是局部最小值。事实证明,除非您特别努力抑制随机化,否则每次运行模型时都会得到不同的结果。损失可以设想为一个表面空间,在哪里是可训练参数的数量。上帝知道那个表面是什么样的,你的初始参数权重把你放在那个表面上的什么地方,以及其他随机过程如何导致你穿过那个表面。
例如,我运行一个模型至少 20 次,得到的损失非常接近每个模型。然后我再次运行它,对于完全相同的数据得到了更好的结果。
优化器的选择在训练模型方面真的很重要吗?
是的。
Adam 优化器会比 Adadelta 优化器更好吗?
是的。(但有时,adadelta 会给出更好的结果。取决于数据集和微调机制)
它们基本上都一样吗?
不,这里是解释
一些优化器会更好,因为它们允许大多数权重达到其“全局”最小值吗?
实际上无法检查模型是否达到了全局最小值。
我们可以通过使用训练和验证集的过拟合或欠拟合来评估模型,以及使用测试集对模型进行泛化。