【深度学习中模型训练、调参基础知识整理(持续更新...)】

深度学习中模型训练、调参基础知识整理(持续更新…)

1、SOTA

阅读paper时,常会遇到模型SOTA、SOTA的效果等表述方式,还以为是新的模型。

  • SOTA model:State-Of-The-Art model,是指在该领域的任务中,相对于比该领域的其他模型,这个是目前效果做好的模型。(效果最好,包含但不限于,速度最快、模型计算量最小、准确率最高、误差最小等)

  • SOTA result:State-Of-The-Art result,通常是指在该领域的研究任务中,此paper的结果对比已经存在的模型及实现结果,此Paper的模型具有最好的结果。

2、训练集train、验证集val、测试集test

  • 训练集

    使用训练集的数据来训练模型

  • 测试集

  • 将训练好的模型在测试集上计算误差,便可验证模型的最终效果。

  • 通常将数据集的80%作为训练集,20%作为测试集;

  • 通常需要在开始构建模型之前把数据集进行划分,防止数据窥探偏误,也就是说避免了解太多关于测试集中的样本特点,防止我们认为的挑选有助于测试集数据的模型,这样的结果会过于乐观,但是实际上并没有预期的那样优秀;

  • 通常在构建模型的时候需要将数据进行处理,包括一些数据的清洗,数据的特征缩放(标准化或者归一化),此时我们只需要在训练集上进行这些操作,然后将其在训练集上得到的参数应用到测试集中;

  • 由于测试集作为对泛化误差的近似,所以训练好模型,最后在测试集上近似估计模型的泛化能力;

  • 验证集val (validation)

  • 模型训练前,将数据集划分为训练集和测试集,我们让模型在训练集上进行训练,然后在测试集上来近似模型的泛化能力。

  • training dataset 和 validation dataset都是在训练的时候起作⽤。

  • ⽽因为validation的数据集和training没有交集,所以这部分数据对最终训练出的模型没有贡献。

  • validation的主要作⽤是来验证是否过拟合、以及⽤来调节训练参数等。⽬标检测中val其实就是⽤来监测训练过程的,超参确定后,监测过程可有可⽆。

  • ⽐如你训练0-10000次迭代过程中,train和validation的loss都是不断降低,
    但是从10000-20000过程中train loss不断降低, validation的loss不降反升。
    那么就证明继续训练下去,模型只是对training dataset这部分拟合的特别好,但是泛化能⼒很差。所以与其选取20000次的结果,不如选择10000次的结果。
    这个过程的名字叫做 Early Stop, validation数据在此过程中必不可少。
    如果你去跑caffe⾃带的训练demo,你会⽤到train_val.prototxt,这⾥⾯的val其实就是validation。⽽⽹络输⼊的TEST层,其实就是validation,⽽不是test。你可以通过观察validation的loss和train的loss定下你需要的模型。

  • 现在很多都不⽤validation ?

    • 原因在于模型中防⽌过拟合的机制已经⽐较完善,Dropout或者BN等做的很好了。通常情况下都是对现有模型直接进⾏finetune,相较于重头开始train,这样的方式也很难过拟合。
      
  • 我们想要挑选yolo系列和SSD系列模型做目标检测任务,可以让两个模型分别在训练集上训练,然后将两个训练好的模型分别在测试集上进行测试,最后我们可以选择在测试集上误差小的模型(yolo系列 or SSD系列)作为最终我们要选择的泛化能力强的模型。

  • 除此之外,我们要做的不仅是不同的模型与模型之间的对比,很多时候我们需要对模型本身进行选择,通过测试集误差最后我们选择yolo系列进行目标检测任务,但是darknet神经网络中还有很多的需要人工进行选择的参数,比如神经网络的层数和每层神经网络的神经元个数以及正则化的一些参数等等,我们将这些参数称为超参数。这些参数不同选择对模型最终的效果很重要,总是需要调节这些超参数。

  • 信息泄漏

    • 调节超参数来增强模型泛化能力。当我们直接使用测试集来作为泛化误差估计,而我们最终的目的就是选择泛化能力强的模型,当我们可以直接通过模型在测试集上的误差来调节这些参数时,可能模型在测试集上的误差为0,但是你拿着这样的模型去部署到真实场景中去使用的话,效果可能会非常差。这一现象便是信息泄漏。
    • 我们使用测试集作为泛化误差的近似,所以不能将测试集的信息泄漏出去。我们平时做的题相当于训练集,测试集相当于最终的考试,我们通过最终的考试来检验我们最终的学习能力,将测试集信息泄露出去,相当于学生提前知道了考试题目,那最后再考这些提前知道的考试题目,即使取得很高的分数,也不能代表学生学习能力强。
    • 综上所述,我们在学习的时候,老师会准备一些课堂例子、习题来帮助我们查缺补漏,这些小样例、习题便可称为验证集。我们通过验证集来作为调整模型的依据,这样也会保护测试集中的数据信息。
  • 在训练集上训练模型,在验证集上评估模型,一旦找到的最佳的超参数,就在测试集上最后测试一次,测试集上的误差作为泛化误差的近似,即为模型的最后效果。

  • 三者如何划分

  • 数据量不是很大的时候(万级别以下)的时候将训练集、验证集、测试集按照7:2:1的比例或者6:2:2;

  • 数据量足够大,训练集、验证集、测试集比例调整为98:1:1

猜你喜欢

转载自blog.csdn.net/crist_meng/article/details/123991181