算法迭代:停止在小数据集上调参

Thoughts0 views

在日常迭代算法时,发现一个经常出现的问题。由于资源是有限的,因此我们通常是先在小型数据集上实验我们的feature从而迭代模型,在小数据集上验证完成后,再在全量数据集上跑一把拿最终的结论和指标。在这样的迭代流程中,通常会出现2种情况:

  • 小数据集验证有效的feature在全量数据集上同样有效;
  • 小数据集验证有效的feature出于不知道什么原因,在全量数据集上失效了;

这里想讨论一下对于第二种情况的一些思考和应对手段。

首先,我认为我们不可能做到完全不出现第二种情况,我们能做的事情是尽可能减少第二种情况出现的次数。

举个我最近遇到的实际例子,我在实现一个multi task模型时,为了保证融合后的模型比单个task模型的指标都要高,我在小数据集上先对这个multi task模型进行调参,在调整了loss weight和learning rate以后,我成功地在小数据集上让multi task模型的各个task的指标都达到了单个task model的指标。于是我启动了全量数据集的训练。最后的结果是在全量数据集上multi task模型的表现还是比单task model要稍微差一点,也就是说我遇到了第二种情况:小数据集上验证有效的feature在全量数据训练时失效了。

我认为这个例子中我失败的原因是因为我尝试在小数据集上调整dataset-dependent feature,也就是超参,包括batch size、学习率、loss weight等等,调整这类feature的结果更像是寻找一套配置,一套能在这个小数据集上表现很不错的配置,这就是dataset-dependent feature;这类feature和数据集强耦合,对全量训练的指导意义不大。

那么为什么我会优先去调整这类feature呢?当然是因为成本低,不需要过多思考。调参多简单啊,但代价就是调出来的参在全量训练很可能失效,很可能你得再在全量训练时再来一遍。因此,这个做法是不被鼓励的,是低效的。

和dataset-dependent feature相反的另一类feature,我称之为dataset-independent feature,这类feature包括loss设计、网络结构设计等等,这类feature本质上是在调整模型的归纳偏置(inductive bias)或者假设。机理有效的、假设正确的feature往往不会因为数据集变大或变小而突然从正确变得错误。

所以结论是:除非这就是你的目标数据集,否则请仅在这个数据集上面验证feature的机理有效性、假设有效性,而不是精调参数

但在实际操作中,需要额外注意的一点是:归纳偏置的验证有时候需要调参来辅佐才能看到正确的结论,例如加了一个loss但其magnitude特别低,很可能它是不起作用的,那么这时候可能就需要调大一点它的loss weight让它和其他loss的幅值差不多,再得到结论这个feature是有效/无效。否则也可能得到错误结论。这里的调参则不是精调,不需要网格搜索,只需要进行rough tuning,调参的目的也不是为了定死这个参数从而复用,而是为了公平比较,正确验证。

综上:小数据实验是用来筛选“逻辑”的(Logic-Driven),大数据实验是用来打磨“参数”的(Data-Driven)。请把在小数据集上调参的时间用于思考假设和验证假设上。